Это копия, сохраненная 6 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1958281 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, можно искать решения и обсуждения задач).
С чего начать
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование. У нас есть задачи для изучения этого:
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony или Laravel
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/
Оформляй код аккуратно!!! — например пропусти через 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? — Да, однозначно. Посмотри любую вакансию.
Для этого достаточно вставить код на http://beta.phpformatter.com/ и нажать «format». Робот оформит все как надо. Если ты используешь IDE, то там есть горячая клавиша для этого. Список клавиш для IDE: https://gist.github.com/codedokode/8759492
Вообще, в 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, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://svyatoslav.biz/misc/psr_translation/#_PSR-1
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
Какой старый вариант? Тебе сложно вместо md5() вызвать password_hash()?
Если использовать нормальную соль то md5 сложно взломать злоумышленику с ресурсами меньшими государственных. Но нет смысла ебаться с md5 когда у тебя из каропки password_hash и password_verify тупо всю хуйню делают за тебя.
Скорее всего ты чего-то недогнал в процессе обучения. Тут не работает как в школе\шараге и надо честно позадрачивать с недельку.
На чём всрался?
Ты можешь запостить свой код, и написать, что именно непонятно. Также, можно попробовать поискать решение задачи в гугле.
>>1999079
Да че я не догнал... Все задачи решил предыдущие, но если попросить здесь помощи по бонусным мне в сотый раз льют в уши кучу помоев, которые никак не помогают решить задачу.
https://ideone.com/kzN6Eh
Вот тут например, спросил как пофиксить задачу, сказали вместо ничего выводить пробел)0 Да я как бы и так знаю в чем проблема, а как это сделать нахуй?))) Очень информативно.
Про банкомат задачу тоже как не знал как решать, так и не знаю. Высрали про какой-то последовательный перебор, но я отказываюсь понимать это.
Я в центре на пикрелейтеде, inb4 я долбоеб неблагодарный и не ценю помощь, нахуй из треда
urldecode
Господи, куда смотрели W3C, когда вводились интернационализованные домены? Это же рак, убивающий интернеты.
Смотрели на шекели.
Долбоебы скупили свою местечковую хуиту, а теперь она никому не нужна и не используется.
$this->classProps = SomthClass::class;
для того что бы потом где то в методе объект этого класса получить - это лютый говнокод, или норм вариант?
А как правильно? Мне нужно в методах создавать экземпляр этого условного класса каждый раз. Сделать фабрику этого класса?
Экземпляр класса до объявления методов нельзя сделать? И кидать его потом в качестве параметра методам?
Передай извне фабрику. Практически любой современный контейнер инверсии зависимостей умеет это делать.
Хотя это зависит от контекста конечно - иногда проще напрямую делать. Так же лучше не городить лишнего в небольших скриптах.
Есть ряд вопросов. Очень хочу вкатиться в пыху, потому что нацелен развиваться в бэке (пока для себя, а дальше как будет).
Так вот:
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 быть не может).
То есть, функция получает информацию о запасе купюр и одну комбинацию, и должна вернуть следующую за ней комбинацию (которая дает чуть-чуть большую сумму).
Уточняй, если что непонятно.
В пхп вроде самый высокий средний возраст разраба после крестов и совсем дедовской хуйни типо кобола.
Где-то 33, как Иисусу.
> 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 подзагнулся, а остальные явно недотягивают до промышленной разработки.
хочу дописать
5. Вечный вопрос (ТМ) человека, который ежедневно работает с языком:
Почему мы продолжаем любить и использовать РНР, если его свобода с одной стороны обходится так дорого (по быстродействию), а с другой, самые продвинутые фреймворки -- это бесконечные попытки зарегулировать эту самую свободу, ведущую к бесконечным ошибкам?
И ради чего мы должны мериться с backend-only языком программирования, в котором нет асинхронности "из коробки" (это не реверанс в сторону JS, там тоже куча проблем), у которого большие проблемы с маркетингом, у которого самая чудовищная степень прощения любых человеческих ошибок?
Раньше я уверенно декларировал ответ: "скорость разработки, быстрый и дешёвый старт любого проекта, невозможность "зависания"". Но сейчас, глядя на достаточно сложные в освоении и запуске Symfony-приложения, состоящие из многих пакетов и зависимостей, я начинаю сомневаться: до сих пор ли это так?
>ради чего мы должны мериться
Я неебу ради чего ты должен мериться. Я вот нихуя не должен - пилю приложухи и не несу пафосной хуиты. Надо будет го - подтяну го, надо ноду - подтяну ноду.
Это просто работа.
Язык говно. Профитов никаких. Используй "быстрые" языки. /дисказ
640x360, 5:10
Ну не мирись тогда. Мирись-мирись и больше не дерись.
По моему опыту бекенд это дай-то бох 50% - язык программирование, который не суть щас бы крудошлёпство великим делом считать. Остальное - смежные технологии и знание как делать хайлоад не всрав разработку.
>>1999716
Почему мы дальше работаем с Симфони? Отвечу за себя, может спасу жизнь какого-то ньюфага, который решил вкатиться в пых.
Потому что это болото уже засосало. Можно, конечно, пойти пол годика работать каким-то охранником, учить параллельно джаву и вкатиться на позицию джуна, но зачем?
Сидишь себе не рыпаешься, деньги получаешь. Да, меньшие чем джависты за ту же работу. Да, неприятно, но что поделать? Только по этой причине на симфони остается работа, разве нет?
Еще есть надежда что по работе когда-то придется столкнуться с го/нодой. А там уже имея коммерческий опыт сделать перекат будет намного проще.
Хотя языки эти и их подходы мне не нравятся, с php общего там очень мало, но это единственный вариант быстрого переката для пыхера.
Зачем? Да, пока что корабль еще не тонет, но крысы уже всё чувствуют и понимают.
То да, я не спорю с твоим логичным определением бекенд-разработки, но мы же в треде именно про язык, вот его и обсуждаем.
Подумой: это же определённые люди, это получившиеся в итоге приложения и зависимости, это расход ресурсов при том самом хайлоаде.
Ну, для фуллстек-приложений на Symfony уже характерно наличие ноды (encore / webpack). Только вот нода не сильно лучше на этом фоне и больше, чем за пых, за неё особо не платят.
Ну и почему охранником? После Symfony сложность Java не должна так уж испугать.
> го/нодой
> единственный вариант быстрого переката
чому единственный?
Не драматизируй.
Синтаксис РНР весьма похож на С++ (только вот столько мозгов по управлению памяти не требует). Symfony по сложности уже сравнима с Java, а там близко C#.
Ну и сколько симфонисты нынче получают?
У меня в компании бывшей был интернет-магазин. Крупный. Прямой конкурент эльдорадо, днс. Выручка лярд за год. Так вот там битрикс, вью и чистый пхп. Пыхеры получали там 180к+. 60% задач были такие: редиректы настроить, подключить апишку банка. Лютая хуета, я не знаю, нахуй вам эти ларавели, симфони и др.
Ну вашей конторе повезло с бизнес-процессами || программистами битрикс || распределением данных между системами, раз оно пока хорошо работает.
Регулярно появляются вакансии, где тот же битрикс в больших екоммерс-компаниях выпиливают в пользу симфони целыми командами, с зарплатами 200-250 тысяч рублей в РФ.
в европке за Симфони дают до $6000/мес.
>я не знаю, нахуй вам эти ларавели, симфони и др.
Потому, что код лучше чем на битрикс, быстродействие, масштабируемость и качество самих программистов в средем выше именно на современных фреймворках, чем у мартышек на битриксе. А на чистом пхп пишут сегодня разве что только вкатывальщики.
>>1999767
Тут не в сложности джавы дело, вы чего. Просто нужно освоить много информации, для этого нужно много времени. И, как никак, ты в джаву закатываешься как бы с нуля.
Изучать всё это будешь после работы. Когда наступит черед идти к работодателю, ему почти что всё равно будет на твой опыт разработки на пхп.
Слово "Symfony" там тоже никому ничего не скажет, все уверенны что это очередная CMS, а в PHP еще неймспейсы не завезли и пыхеры всё еще называют классы App_Http_Controllers_IndexController.
Читаю на днях требования к джуну на джаве. "Опыт с Java не менее двух лет. Опыт в разработке больших веб-приложений от трех лет очень желателен. Если это Java - отлично. Если это Python, C#, Ruby - хорошо. Если это PHP, все равно будет плюсом"
А с го/нодой можно начинать практиковаться прямо на пыхоработе, а из требований к джуну на go я даже часто встречал знание синтаксиса и годик-два опыта на пыхе.
Лол, я ещё помню клавиатуры на полноразмерных дин разъемах как в совковых магнитофонах.
На хуй отправляешься.
>требования к джуну
>Опыт в разработке больших веб-приложений от трех лет
Не, ну зачем явных долбоёбов-то в пример приводить?
>нода не сильно лучше на этом фоне и больше, чем за пых, за неё особо не платят.
Во тут совсем мимо, открой хотя бы hh. Весь смысл переката как раз в том, что за ноду, в часности нест сейчас готовы платить, иногда даже больше, чем за нормальные языки.
По крайней мере в ДС так.
Как известно, уже 8-ая версия пхп вышла. Как мне учить этот язык? Если начну изучать php 7 от Котерова, нормально вкачусь в изучение или нет? Может, есть что-то лучше? И выучу если с 7 версии, как на 8 перекатываться?
ПХП 8 это ПХП 7 + несколько фич. Учи тот, на который у тебя учебные материалы есть.
А с чего тогда начать?
Решил запилить скриптик типа гостевая книга, ну а хули нет, разумеется для этого мне понадобился ORM я же не в 2004 чтоб просто данные выбирать и парсить, прочитал что doctrine популярен, ну стал читать, вроде все понятно, но! там предлагают в определении класса явно задавать геттеры и сеттеры. Че реально? Для каждого свойства. И разумеется если в модели что-то поменяется надо будет их добавлять/удалять. Они конечно все одинаковые абсолютно. Это как в джаве до какой-то 8 версии.
И почему-то ваши __get() и __set() не работают: определяю их, все по сигнатуре, а пых говорит call to undefined method при попытке вызова.
Нельзя было дефолтные методы что ли сделать?
лучше иши php7 zend Certification guide(но она на англ)
каждую тему обязательно гугли дополнительно для лучшего понимания.
php.net чтобы быть в курсе всех возможностей.К примеру тема строки и все функции для него
я имел ввиду саму БД и драйвер
Надо было симфони брать php https://symfony.com/doc/current/doctrine/reverse_engineering.html#generating-the-getters-setters-or-php-classes
bin/console make:entity --regenerate App\\Entity\\Country
С хуя ли, норкоман?
$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? Только через цикл копируя в новый массив или есть какая-то готовая функция?
Есть, но выглядит уёбищно, лучше уж через цикл.
Есть array_filter, но положняк таков, что он сохраняет ключи, в итоге по твоему примеру у тебя останется дырявый массив с ключаемя 0 и 2. Чтобы переиндексировать его, нужно обернуть в array_values. В пхп 7.4 можно использовать стрелочные функции и спред, в итоге получится что-то вроде [...array_filter($arr, fn($item) => $item['ip'] === '1')]; но я бы так не стал писать
Вроде как в постгресе нативный джсон декоде есть, в мускул нет.
Сперва всегда данные подготавливаются и только потом выводятся.
В крайнем случае можно так:
<?php
$pizdapidor = $db->select('WHERE blablabla ');
?>
<html>
<head>
...
</head>
<body>
<p><?= $pizdapidor ?></p>
</body>
</html>
Ничего, через пять лет никич возможно свойства добавит, вот тогда-то заживем!
А вообще, в пыхошторме в три кнопки создаются все отсутствующие геттеры и сеттеры. Сначала alt+Insert, дальше сам.
>Ты ничего не переспросил в ответ на совет выводить пробел, вот тебе ничего больше и не посоветовали.
У меня взорвалось очко от того что на более сложные задачи мне дают такие неинформативные ответы. Наверное, я не прав, что так грубо выражаюсь, спасибо за помощь.
Как его отсортировать по человеческой сортировке где сперва будет 37, а потом 107? Вчера ещё натыкался на это но теперь не могу найти, всё это берётся из многомерного массива, так что сортировка просто по ключу или значению не вариант
По традиции, отвечаю сам себе strnatcmp
На сколько я понимаю он сортирует по первому символу строки.
Единственное, что могу посоветовать заюзать ip2long
1. Вкатился в 24. Вполне норм. Коллеги в среднем 30+
Для школоты пхп нимодна, они больше по жаваскриптам, да петухонам
2. Как первый - да, лучше взять что-то более строгое, классическое
3. Начинал тупо пролистав php.net и по ларакастам
4. 7ую бери, она сейчас везде на проде. Пока можешь xampp/openserver
5. Larave/Symphony - норм начало
Yii2 - устаревший кал
Zend - монструозный устаревший кал
Приучаем к хуевым практикам, а потом удивляемся, почему у пхп такая репутация
Как будто тебя кто-то заставляет пользоваться этой легаси-хуйней из 90-х. Пхп конечно набит таким детским говном под завязку, но умные люди приводят к каким-то стандартам, развивают фреймворки.
Примерно то же происходит с жс, но намного быстрее в силу важности языка.
А как такое самому , ручками навелосипедить? Есть статьи какие нибудь?
Чисто из любопытства.
Загляни в исходники тех самых либ, всё узнаешь
Блядь, он элементарные вещи спрашивает, а ты про фреймворки пердеть начал. Убейся что ли.
>происходит с жс, но намного быстрее в силу важности языка
ЖС твой умирает как язык - сейчас почти везде тайпскрипт просят.
В глаза ебешься? Какие фреймворки?
Ты запостил код обращения к бд и хтмл рядом. Нуфаг прямо так скопирует и вот мы имеем +1 бед практис
>бед практис
Поясняй давай - где тут бед. И почему если <?php секцию сунуть в отдельный файл, то что-то должно поменяться?
>ЖС твой умирает как язык - сейчас почти везде тайпскрипт просят.
Лол блядь, ты вообще в курсе что ts это сахар над js?
Как минимум средней руки разраб не ожидает, чтоб шаблон будет общаться с бд. Задача шаблона отобразить данные, а не искать их.
xlsx это xml обычный и стили всякие в зип архиве, там ничего сложного. А старый xls это бинарная дрисня, его долго и нудно реверсили.
Но вообще технически код отделен от разметки. От того что ты вынесешь шаблон в отдельный файл - не дохуя изменится. Архитектурно ниче не поменяется.
А вот то что логика представления у него не отделена от условной бизнес логики - это есть.
Но конечно ты прав - ньюфагу нужно сказать что так в один файл все пилить - очень не стоит, потому что что то большее чем хеловорд будет на вкус как земля.
мимо
Лол блядь, ты вообще в курсе что js это сахар над C/С++ (V8, Nitro и т.д.)? Пиздец, с кем я в одном треде сижу...
>>2001412
Тут не средней руки разраб, а начинающий - пускай хотя бы так запилит, подготовив данные для вывода, а не прямо в шаблоне свои функции пердолит, как народ часто делает. Потом уже научится разделять шаблон и код на базе моего примера.
>Тут не средней руки разраб, а начинающий - пускай хотя бы так запилит, подготовив данные для вывода, а не прямо в шаблоне свои функции пердолит, как народ часто делает. Потом уже научится разделять шаблон и код на базе моего примера.
Многие как запомнили начальные примеры, так потом и на продакшене срут. А там, не факт, что сидят люди умнее их или готовые это всё править. Так и остается нуфаг с бед практисом.
Отсюда и пошли все эти толстые контроллеры, потому что в документации так пишут.
Ну и мы пишем код в первую очередь для людей, для текущих и будущих коллег и для завтрашнего себя. Никому не хочется копаться в велосипедах, особенно в чужих
>Многие как запомнили начальные примеры, так потом и на продакшене срут.
Если у вас такие на проде работают, то соболезную. Может повыкидывать этих трейни на мороз, а? Сейчас от джуна знание хотя бы одного фреймворка требуют.
>Отсюда и пошли все эти толстые контроллеры, потому что в документации так пишут.
Всему не научишь в рамках туториала или поста на дваче.
>Никому не хочется копаться в велосипедах, особенно в чужих
Это не совсем велосипед - это старый стиль разработки на пхп, когда веб был проще. Хуёво, что ты такого не знаешь и считаешь велосипедом.
А C это сахар над ассемблером.
Сказать то что хотел?
Существует стандарт ES, который поддерживают браузеры. TS полностью зависит от этого стандарта. Завтра откатят ES к 2010 году и привет твоему тайпскрипту.
А у тебя проблемы с тем, что ты себя считаешь молотком, а остальных гвоздями. Даже тут единицы тех кто будет с тобою вести праздный полудиалог-полусрач. Всем похуй на твои попытки самоутвердиться.
Арибидерчи:3
>Если у вас такие на проде работают, то соболезную. Может повыкидывать этих трейни на мороз, а?
Таким грешат даже синьоры. В любом проекте, где был, контроллеры были засраны.
Ну и других откуда наберешь легаси поддерживать?
>Это не совсем велосипед - это старый стиль разработки на пхп, когда веб был проще. Хуёво, что ты такого не знаешь и считаешь велосипедом.
Деды так делали и нам велели. Только сейчас за такое по рукам надают. Ну а если не надают, то лучше сменить место работы
>Деды так делали и нам велели.
Я ж говорю - сразу на фреймворки ни у кого не получится. В любом случае придётся проходить эволюционный путь самого языка, в том или ином виде, чтобы понимать что как и зачем было придумано. А не как местные мартышки - вызубрили "бест практис", а зачем он нужен понятия не имеют.
Изучил ли ты ООП? Если нет, в шапке есть учебник, в нем глава про ООП, начни с нее.
Если ты изучил ООП, то почитай про MVC - там есть и пример кода: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
Если хочется изучать дальше, разбери код какого-нибудь фреймворка, можно начать с относительно простого Slim.
Есть официальная спецификация и для XLS (бинарный формат), и для XLSX (это zip-архив с XML-файлами). Ты можешь нагуглить их и попробовать сделать свой читатель/писатель этих файлов. Но должен предупредить, спецификация там в сотни страниц.
>Ну, для фуллстек-приложений на Symfony уже характерно наличие ноды (encore / webpack).
Хмм, может я чего-то не знаю, но каким образом сборка фронтенда связана с работой на ноде? Тем более, там же вроде нода лишь под капотом.
А я поясню, почему 107 меньше, чем 37. Дело в том, что тут сравниваются не числа 107 и 37, а строки "107" и "37". Строки сравниваются так:
- берутся первые символы и сравнивается, у какого символа код (например, по таблице Юникода) больше.
- если они равны, то сравниваются вторые символы
- и так далее
Символ "3" считается "больше", чем символ "1", потому строка "37" больше чем "107".
>но каким образом сборка фронтенда связана с работой на ноде?
Чем фронтенд на проде собирать изволите? Ручками?
Ну да, натуральная сортировка называется или как-то так
>Как писать сайты в ООП стиле?
Зачем тебе ооп стиль? Все зависит от задачи. Если твоя задача сделать только три статические странички - нет смысла ставить туда симфони. А тому мудаку, который оскорбил уи я скажу - иди ты нахуй мудак оскорбивший уи
Да откуда вы все блядь повылезали в последнее время? То у вас запросы к БД в шаблонах нормальная практика, то йии и процедурщину защищаете, то CMSки и прочее. Вас действительно много по весне оттаяло или ты один человек?
Да, никто не спорит, для всего есть своя ниша. Но у нас тут тред разработчиков, а не макакенов. Макакены вроде как в /wrk/ сидят, по крайней мере года два назад сидели.
А эта доска называется "Программирование", если кто-то не обратил внимания. Где в ваших Yii и CMSках программирование, скажите?
Какое отношение
>сделать только три статические странички
имеет к программированию? Съебались нахуй отсюда, Господа.
>Где в ваших Yii и CMSках программирование, скажите?
Мартыха, ты понятия не имеешь - что такое программирование, если написал такое.
Сиди лучше молча.
> То у вас запросы к БД в шаблонах нормальная практика, то йии и процедурщину защищаете, то CMSки и прочее.
Запросы в шаблонах охуенно же. Можно намакакать пять страничек, пока господин программист пишет контроллер для одной.
Senior Wordpress Developer в треде, количество шизофазии в треде увеличено втрое.
>Функция должна вернуть следующую за данной комбинацию (в виде массива). Если ей дали 2x500 + 1x100, она должна вернуть 2x500 + 2x100 (то есть массив [2, 2]). Если ей дали 2x500 + 2x100, она должна вернуть 3x500 + 0x100 (так как 3 купюры по 100 быть не может).
https://ideone.com/KWu2kP
Смотрю на ваши задачки и тоже хочется что-то мелкое попилить.
А приходится шатать легаси на пол ляма строк...
Начиная с PHP5.4, можно вместо array() писать [], это компактней.
Еще, вместо сравнения массивов по одному элементу, можно сравнивать массивы целиком с помощью == или ===, подробности (не очень подробные) в мануале: https://www.php.net/manual/ru/language.operators.array.php
Хорошо, для 2 номиналов задача решена. Теперь надо переделать функцию, чтобы она работала не с 2 номиналами, а с произвольным количеством номиналов. То есть, массивы могут быть произвольного размера.
Так как количество номиналов неизвестно заранее, мы не можем просто вписать нужное количество блоков if. Нам придется сделать цикл, в котором мы идем от конца массива (самой маленькой купюры) к началу (самой большой купюре). На каждом шаге мы увеличиваем текущий элемент на 1. Если он получился меньше, чем запас данной купюры, то цикл заканчивается. Иначе, мы обнуляем текущий элемент и продолжаем цикл.
Уточняй, если что непонятно.
Похвалите меня, я с очень большим трудом понял прочитанное по темам Синглон и Абстрактная фабрика. Дальше читаю шаблон Прототип
Понял как строки кода из примеров работают. То есть понял, что написано в строках кода, что они делают.
Свои не напишу.
В моём понимании так - мы берём количество записей, делим на 100 и получаем количество страниц, пагинацию пока опустим, далее мы берём номер страницы из гет запроса и делаем следующее - умножаем номер страницы на 100 и вычитаем 100, так мы получаем начальный индекс с которого нужно вырезать массив, например 3 страница, $cut = 3 100 - 100 или $cut = (3-1) 100 получаем array_slice($arr, $cut, 100)? Или как ещё по номеру страницы из гета определить с какого ключа и по какой нужно вырезать 100 записей?
Ну а концепция пагинации такая что если 1 страница, то выводим ссылки на 2 страницу, предпоследнюю и последнюю, а если допустим 100 страниц и мы на 10, то выводим 1, 2 страницы, предпоследнюю, последнюю и две влево и вправо от текущей страницы, то есть 8, 9 и 11, 12?
>@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?
Да, ты верно описал, формула для расчета offset будет (page - 1) x 100.
>>2002872
Это уже ты выбираешь, сколько страниц выводить. То, что ты описал, вполне подойдет.
>>2003091
Здесь у тебя цикл по сути не используется. Так как у тебя в 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, хотя это значит, что данные в таблице не найдены. Это не ошибка базы данных, если например, логин введен неправильно.
>>2003169
Здесь плохо то, что весь код написан внутри одной функции. Лучше разделить код на несколько функций:
- одна функция генерирует следующую комбинацию (и ничем другим не занимается)
- другая считает сумму купюр в комбинации
И наконец, отдельно можно написать код, который в цикле перебирает комбинации:
- сначала берем комбинацию из всех нулей
- далее делаем цикл
- если теущая комбинация дает нужную сумму, то решение найдено, выходим из цикла
- иначе, берем следующую комбинацию (вызывая функцию nextCombination)
- продолжаем цикл
После этой задачи, если ты ее сделаешь, я советую попросить у меня дополнительные задачи на массивы и рекурсию.
> проихсодит такая фигня что временный файл не удаляется,
Значит, скрипт падает между моментом, когда он создает файл и моментом, когда файл переименовывается. Возможно из-за ошибки в самом скрипте, возможно из-за превышения времени выполнения или ограничения на объем памяти или по каким-то другим причинам. Я не знаю, какие там ограничения на хостинге.
Смотри логи (на время, совпадающее со временем создания файла).
> почему это может быть что временный до переименования файл не удаляется и остаётся?
Такого не может быть. Проблема в падении твоего скрипта.
> потому что у них стоят права -600
Для удаления файла не надо иметь доступ к нему, надо иметь доступ на запись к директории, в которой он находится.
>возможно из-за превышения времени выполнения или ограничения на объем памяти
Точно, скорее всего проблема в ограничении памяти, то сть на сайт заходит много человек и идёт превышение памяти от чего скрипт просто дропается, ошибки быть не может так как запись идёт в самом конце файла, логи к сожалению посмотреть не могу, хостинг не даёт, но скорее всего из-за перегруза оперативки, на деректории стоят права -755, но я всё равно не могу руками удалить эти временные файлы -600, только скриптом явно указав их имена
Анончики, вопрос от залетного нуба: понятное, что в дс и в рф джуну вкатиться сложно (почти невозможно), а есть ли у кого-то опыт или знания ситуации вката в Европе?
Сам живу и работаю в Чехии, но на должности бизнес-аналитика (но сам из дс).
Хотел бы вкатиться, вакансии вроде бы есть, но нет знакомых и пруфов, реально ли вкатиться.
Не обязательно Чехия, просто ситуация в Гейропке
Спасибо
Пиздец, сел за одну легаси-часть проекта которая была написана на похапэ, раньше к ней не притрагивался, сразу же ахуел
Там как-то эти сраные темплейты рендерятся пыхой через хуй-пизду, прямиком в темплейтах сидит жс (жкьюри) код, чтобы сделать элементарную операцию вроде захода посетителя на новую страницу проходит несколько php-запросов, которые высирают эти ебучие tpl... И вот это считалось считается нормой. Просто пиздец. Нахуя вы это делаете?
>Нахуя вы это делаете?
За поддержку этого говна платят.
А так на пыхе особо выбора нет. Либо легаси поддерживать, либо в cms окунаться
Прошу: покажите пожалуйста пример выполнения этой задачи, оформленный в виде правильного кода с правильным синтаксисом. Вся беда заключается в том, что по какой-то причине в методичке, по которой я учусь - не было разбора создания двумерного массива через цикл, а в интернете, что забавно - нет инфы по этой теме. В общем - у меня сейчас неиллюзорно начинает гореть срака. Редко обращаюсь за помощью, но сейчас она мне нужна.
Просто напишите с правильным синтаксисом решение этой задачи. Буду благодарен.
Просто открыл документацию и взял пример
/ Пример 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";
}
}
> вордпрессу
Индусское говно. Работа с сИэМэС это неблагодарный ад.
> Дмитрия Полоса
Хз чо за хуй.
Мб стоит учить фреймворк?
https://pastebin.com/rfjtfeGt
Это не решение, а намёк, решать давай сам уже, там почти всё готово
Так, а зачем проверка на false если в data - null, значит проблема в бд или в логине, но я вроде не совсем аутист, в бд есть записи, и логин передается
Ты проверяешь через == или через ===? Потому что при использовании == (нестрогое сравнение) null будет равен false. Надо использовать ===.
Если функция вернула false, то будет указана причина ошибки. Если функция вернула null, то естественно ошибки нету.
Да, все работает
вопрос тупой очень мда но я спрошу
я ваще конкретный чайник пока в этой сфере и мне хотелось бы узнать
как мне сделать так чтоб я мог дать тегу <img> например собственное имя и в CSS управлять условными <img1> и <img2> по отдельности надеюсб ясно изъяснил
> собственное имя и в CSS управлять условными <img1> и <img2> по отдельност
классы им задать
>И наконец, отдельно можно написать код, который в цикле перебирает комбинации:
Не понял, что имеется ввиду.
https://ideone.com/tSOxlD
Вот так пока сделал.
<img class="img1"> а вообще погугли про элементы и атрибуты на MDN, ну че ты как этот
Да я знаю что как этот. Просто я нубик еще вкатился чисто чтоб сайт своей "муз.группе" сварганить ,могу скинуть в зацените)
Разобрался сам, огромное спасибо тебе, аноний. И доброго вечера.
Mozilla/5.0 (Linux; Android 10; COL-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.82 Mobile Safari/537.36
Я думал что по последнему названию, то есть здесь это Safari, но нихуя, это Chrome
> на деректории стоят права -755,
Ну так если ты не владелец директории, то для тебя права будут 5, то есть r-x, без права на запись (и удаление файлов).
>>2003640
Значит, твой запрос не находит данные. Ты можешь попробовать вместо выполнения SQL-запроса сдампить его и посмотреть, что там получится.
>>2003367
Непонятно, в чем претензия? Шаблоны использовать плохо? Использовать JS код в шаблонах плохо?
Ну в том же реакте, например, в одном файле пишут и JS-код и похожую на HTML разметку. А вместо одного удобного шаблона там куча мелких компонентов - сиди разбирайся.
>Бля засирать код чужими костылями
Лучше засрать своими, от этого ничего не загнется.
Ну вон юзай встроенную функцию. Вряд ли что-то шустрее найдешь
Ну и необязательно сразу все строчки разбирать. Разбей по чанкам, сохраняй промежуточный результаты. Мб очередь прикрутить, хорошо подходит под эту задачу
Я имел в виду, что мы можем сделать несколько функций, и основной код (либо вне функции, либо в отдельной функции), который их вызывает.
Сейчас у тебя функция 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, то установить их не получится.
Если захочется погуглить, то это называется задача топологической сортировки.
Я имел в виду, что мы можем сделать несколько функций, и основной код (либо вне функции, либо в отдельной функции), который их вызывает.
Сейчас у тебя функция 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, то установить их не получится.
Если захочется погуглить, то это называется задача топологической сортировки.
И что скажешь? Норм курс?
А то я скачал и не могу нормально начать его проходить - постоянно в сон клонит от его голоса
Что вообще делать с пользовательским юзер-агентом?
Какие-то тонкие настройки браузер специфик цссов?
Для статистики я бы пихнул третьи метрик сервисы
Я поставил скорость 150%. На безрыбье и Дмитрий Полос гуру инфоцыганства
>А затем написать основной код (либо вне функций, либо в еще одной функции), который и решает задачу, вызывая первые две функции.
Что-то типа этого?
https://ideone.com/tSOxlD
Задачки решу и скину, спасибо.
А ты уверен, что тебе нужен вордпресс? В шапке советуют фреймворки учить, а не цмс.
Я вот опустившийся человек, я знаю на что иду, поэтому целенаправленно иду на вордпресс
Да, теперь гораздо лучше.
Вот еще некоторые улучшения, которые можно сделать:
> 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:
Пока (мы не дошли до конца) {
проверить текущую комбинацию;
взять следующую комбинацию;
}
Так будет чуть нагляднее.
Да, теперь гораздо лучше.
Вот еще некоторые улучшения, которые можно сделать:
> 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 вроде или как-то так)
Вротпресс тоже долго учить. В гло академии в марте стрим был - там челик спросил у Артема Исламова - можно ли до начала лета успеть вротпресс освоить, если каждый день дрочиься не вылезая из компа. А Исламов сказал, что очко ставит, что нельзя вротпресс с марта до лета задрочить
>Хочу вротпресс
>чтобы потом ларавель
тоже самое, что
>хочу налево
>чтобы потом направо
Начинай с ларакастов сразу херачить крудик. Тебе знания вротпресса только мешать будут
>А вместо одного удобного шаблона
Сваленная в кучу верстка, стили, жс на несколько тысяч строк - удобный шаблон?
В таком шаблоне невозможно понять, где заканчивается один компонент и начинается другой.
Можно с тем же успехом код не разбивать по файлам
>>2004453
Ладно, раз такая пьянка, продолжу тему вкатывания.
Как думаете есть шанс вкатиться стажером с одним выполненным проектом? Я пилю CRUD с регистрацией/авторизацией используя MVC подход. Подключение к базе сделал при помощи PDO, сейчас пытаюсь вкурить ActiveRecord, чтобы и его еще внедрить. + планирую добавить пагинацию с AJAX.
Есть еще куча сверстанных оригинальных макетов, но врядли они в этом случае что-то значат.
Стажеры не нужны
С находом данных разобрался, как у меня обычно бывает это была синтаксическая ошибка
>Использовать JS код в шаблонах плохо?
>Ну в том же реакте, например, в одном файле пишут и JS-код и похожую на HTML разметку. А вместо одного удобного шаблона там куча мелких компонентов - сиди разбирайся.
Ну ты ебанутый...
Двачую этого
На стаковерфлоу нагуглил какие-то полтора наркоманских совета, которые на практике не работают. Не верю что в таком продуманном большом фреймворке могут быть настолько анальные ограничения.
MVC сейчас уже почти нигде не нужен, по крайней мере, где платят жирно, лучше осваивай DDD, событийную модель и бэкендовый бэкграунд. Шансов вкатится в нормальную контору будет поболе.
Неа, но в реальном мире у тебя V отваливается как минимум, а как дефолт ты начинаешь мыслить другими критериями и вопрос отделения контроллера от модели уже не встает.
Блять middle-php, а не сколько ты за 6-1 по 12 часов грузчиком у себя в пятерочке получаешь.
И 2 вопрос как вот это сократить? Как проверить наличие запроса в гет сразу нескольких переменных? Или только так как на скрине?
Найс подрыв)
Интересно что же ты понимаешь под похапэ мидлом?) Он умеет что? У него опыт в крудошлепстве какой? Что кроме пыха умеет? Как у него с фронтом? Как с nosql? Как с очередями? как с кешированием? Как с написанием микросервисров?
Мидл в конторе на одном конце дс = некомпетентное чмо для конторы на другом. И у каждой блядской конторы свои требования и свои понятия лол кто пхп мидл, а кто черт ебаный. И зп у так называемого мидла могут быть 30/60/100/150 к.
Пиздуй смотреть ххашечку / гикжопы / хаброкарьеру
Я к чему вообще спросил, у меня знакомый один, он устроился на мясокомбинат, вообще нихуя не нужно было для этого, никаких знаний, корок. Зп 40-45. И также в моем мухосранске на хх висят объявы "пхп-разработчик", требования, на мой взгляд, там выше чем к джуну. Зарплата написана 45-60. Это что означает, те кто разместил эти объявы пидарасы которые хотят изъебнуться и найти за лоу прайс дурачков? Нахуй вообще нужно дрочиться и че-то изучать и практиковать годами, если ты можешь просто пойти хуярить быдлорабочим на производстве. Мое мнение, у чела с опытом в несколько лет на пыхе должна быть зп 75к в провинциальном городе.
>И также в моем мухосранске на хх висят объявы "пхп-разработчик", требования, на мой взгляд, там выше чем к джуну. Зарплата написана 45-60.
К сожалению не самый плохой варик для мухосрани
>те кто разместил эти объявы пидарасы которые хотят изъебнуться и найти за лоу прайс дурачков
да, провинциальная разработка как она есть
>Нахуй вообще нужно дрочиться и че-то изучать и практиковать годами,
Перспективы и то, что жопа в теплом офисе/в квартире. Если человек немного способен в программирование, у него есть усердие, сила воли и интерес, то можно вполне себе зарабатывать нормальные деньги и даже на пхп и не надрывать жопу.
>если ты можешь просто пойти хуярить быдлорабочим на производстве
Ну, если для тебя в ойти больше гемороя, чем на быдлоработе, то думаю тогда лучше выбрать второе.
>Перспективы и то, что жопа в теплом офисе/в квартире. Если человек немного способен в программирование, у него есть усердие, сила воли и интерес, то можно вполне себе зарабатывать нормальные деньги и даже на пхп и не надрывать жопу.
>Ну, если для тебя в ойти больше гемороя, чем на быдлоработе, то думаю тогда лучше выбрать второе.
Для профессий с высоким порого вхождения должна быть на голову более высокая оплата, а не просто "офис, тепло, не надо махать киркой".
Два чая. В совсем уж мухосрани только развиваться собственными силами, потом релокейт/удаленка, хотя бы в крупный миллионник. Там уже можно найти +- адекватные конторы, готовые платить адекватную зп (100-150) именно за мидловый бэкенд на пыхе. Но, как анон выше писал - с одним знанием php и какой нибудь лары ты там нахуй не нужен, так что придется запотеть.
>крупный миллионник
>готовые платить адекватную зп (100-150) именно за мидловый бэкенд на пыхе
Хочешь сказать в Новосибе будут столько платить?
>Мое мнение, у чела с опытом в несколько лет на пыхе должна быть зп 75к в провинциальном городе.
Рынку на твоё мнение глубоко поебать. Если в провинции пхп макаке платят 40к, значит на это соглашаются и этого хватает для жизни.
Хочешь норм зп - не работай на регионы. Благо есть удаленка.
В моем миллионнике есть несколько контор с приличными зп, но за ними стоят достаточно крупные неместные (дсы/запад) клиенты.
На одну из таких работаю
>должна быть
Во первых никто тебе ничего не должен кроме тебя самого
>с высоким порого вхождения
в пхп до безобразия низкий порог вхождения. даже в тот же голенг сложнее вкатиться, несмотря на то, что его позиционируют как язык для пупсиков. Поэтому зарплаты ниже в целом по вебу. если больше 60к получать на адекватной удаленке, живя в мухосрани, да еще и с гибким графиком, то считай хорошо устроился
Сколько смотрел не войти професесии доступные большенству по своей мухосрани - зп средние 30к если не гос и не газпромы. А многие из этих вакансий адовые шо пизда.
Так что твои претензии выглядят смешно
линупсовый du через system, например.
https://ideone.com/vlcrnL - Кубик
https://ideone.com/qFCSYi - Два кубика
https://ideone.com/MAS5To - Вклад
https://ideone.com/KKnrn3 - Айфон в кредит
https://ideone.com/DlLhnO - Массивы №1
https://ideone.com/NJhG79 - Массивы №2
https://ideone.com/ktItyH - Массивы №3
https://ideone.com/pIWh56 - Генератор имен
ОП здесь? Может проверить? Завтра буду делать задачи на строки.
Спасибо, весь день пока проходил решал потихонечку.
За Новосиб не скажу, но +- думаю да, В Казани, Екате, Краснодаре и Нижнем - определенно да, при этом житзнь сильно дешевле чем в дсах.
if ( stristr( $array[$key]['title'], $_GET['search'] ) )
Условие проверяет есть ли то что написано в GET в значении в многомерном массиве, если я ввожу слово с большой буквы - то всё находит, но если с маленькой, то блять пиздец 0 совпадений, ну как нахуй так а? Я же использую stristr(), а она регистронезависимая, у меня уже мозг взрывает нахуй
Я уже и пытался привести всё в нижний регистр через mb_strtolower(), и удалить лишние символы с помощью trim(), и использовать stripos(), и preg_match(), нихуя, этот пидорас находит только те слова что совпадают с написанием в массиве, а если я меняю регистр одной из букв - то уже 0 совпадений нахуй, я блять уже горю нахуй что этому пидорасу от меня нужно, какого хуя, простоphp5.2
Однако, если банкнот много, перебор будет очень долгим. Например, если у нас 1000 банкнот 4 видов, и надо выдать очень большую сумму, то придется перебирать 1000 x 1000 x 1000 x 1000 = 10004 = 1 триллион комбинаций. Даже на современном компьютере это долго. Как же тогда банкоматы справляются с проблемой?
Я даже думал, не поменять ли условия задачи, а то, может быть, я даю нерешаемую задачу людям. А в интернете находятся задачи про банкомат с неограниченным количеством купюр. Однако сегодня, я прочел, что такая задача сводится к задаче о рюкзаке и решаема за более быстрое время за счет динамического программирования.
Кажется, я нашел способ решить задачу быстрее. Например, в примере выше нам потребуется лишь 40002 = 16 миллионов шагов.
А stristr разве поддерживает Юникод и UTF-8? Прочитай-ка урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Если купюры конкретные, естественных номиналов, то задача конечно простая.
Это когда тебе надо работать с заранее неизвестными купюрами, например в 16, 17, 983 и 3751 рубль (заранее неизвестными), вот тогда уже сложно становится.
Я могу ошибаться, но простой "жадный" алгоритм работает только при таких наборах купюр, когда любую большую купюру можно заменить целым числом более мелких.
Например, 1000, 500, 100: 1000 = 2x500, 500 = 5x100, потому алгоритм работает.
Если же взять купюры 500, 200 и 100 то 500 нельзя набрать купюрами по 200 и алгоритм не сработает.
Вот пример, где "жадный" алгоритм не работает.
Есть купюры: 5x500, 3x200, 0x100. Надо выдать 600.
Тут "жадный" алгоритм возьмет 1 купюру по 500, останется 100 в остатке, но их он выдать не сможет.
То есть весь этот пиздец потому что я ищу русское слово? То есть stristr не может правильно привести слово из массива в нижний регистр чтобы сравнить?
Выход это прописать mb_internal_encoding('utf-8') и использовать mb_stristr?
Грабитель проник в банк и нашел там N золотых слитков весом w1, w2 .. WN. В его рюкзак может поместиться не более K килограмм. Какие слитки он должен выбрать, чтобы унести как можно больше золота.
---
Если заменить "золотой слиток весом x" на "1 купюра номиналом X", то получается задача про банкомат.
Всё верно, но всё равно алгоритм элементарно "хардкодится".
Тебе надо только отдельно рассматривать случаи набора некоторых сумм.
Для варианта в 100, 200 и 500 рублей вполне подойдёт обычная жадная схема
500 = 500
600 = 500+100 (проще, чем 200+200+200)
700 = 500+200
Если бы была схема, где купюры 50, 300, 500 рублей, то чуть хитрее было бы, скажем
600 = 300+300, что лучше, чем 500+50+50
Но обычно можно придумать решение частное, прописав некоторые исключения.
Когда рандомные номиналы, вот тогда уже надо ДП подключать.
А, понял о чём ты.
К слову не уверен, что реальные банкоматы такую задачу умеют решать, скорее они могут тупо заменить большой номинал на мелкие. Скорее всего реальный банкомат просто скажет, что выдать сумму не может. Хотя на самом деле может.
В любом случае под конкретные купюры задача сильно упрощается, даже с перебором, перебор будет проще.
>Если заменить "золотой слиток весом x" на "1 купюра номиналом X", то получается задача про банкомат.
Очевидно нет. Банкомат должен конкретную сумму выдать, а грабитель должен взять сумму не больше K. Но можно чуть меньше.
Пиздец анон спасибо, а то я уже с ума чуть не сошёл нахуй, не до конца тогда понимаю почему с большой буквы он всё таки находил, типа потому что при приведении строк в 1 битовые буквы в нижнем регистре они тупо просто совпадали я так понимаю, или даже потому что большая и маленькая буква имеют разные биты, точно
Нет, жадный алгоритм тут не сработает. Посмотри внимательно на ситуацию в >>2006112 . Там нет 100-рублевых купюр и жадный алгоритм не сможет выдать 600 рублей.
>>2006130
Грабитель пытается взять как можно больше (но не более K). Мы можем запустить алгоритм грабителя, а в конце просто посмотреть, сколько он набрал. Если это число меньше, чем требуемая сумма K, то выдать ее невозможно (иначе бы грабитель смог её собрать). Если набранное количество золота равно требуемой сумме K, то возможно.
>>2006120
Никакое количество проклятий не заставит stristr работать с utf-8. Надо переписывать на использование mb-функций.
$str = $_GET['a'].$_GET['b'].$_GET['c'].$_GET['d'].$_GET['e']
И типа тот который прилетит и запишется в переменную, а остальные просто дадут пустоту? Как правильно сделать? Этот способ работает, но мне кажется есть более правильный и такой же короткий
Я сижу в других тредах, где к программированию на PHP принято относиться поплёвывая свысока.
Посмотрел, что за задачка здесь обсуждается. Там конкретные купюры:
есть банкомат, в нём фиксированный набор купюр в 100, 500, 1000, 5000 рублей. Нужно проверить, можно ли выдать нужную сумму, и если можно, то выдать её наименьшим количеством купюр.
Это, всё-таки, другая задача, чем задача о сборке рюкзака. И в данном частном случае сильно более простая, потому что любую купюру старшего номинала можно выдать купюрами меньших номиналов. Нет даже истории о купюрах в 200 и 500 рублей. Тут ДП даже и не нужно.
Задача о рюкзаке намного сложнее.
> где к программированию на PHP принято относиться поплёвывая свысока
ванильный жс хуже если тебя утешит
>Это же бред для каждого подключения грузить файл с диска, а потом еще и если сохранять могут проблемы возникнуть при параллельном чтении/запси
Почитай книжки о технологиях баз данных. Как они эти вопросы решают. Потом сам напишешь свою собственную СУБД.
Почему бы тебе просто не создать таблицу для маков в БД не спрашиваю. Видимо нельзя по ТЗ, иначе бы ты сам догадался.
Каким образом твой скрип узнает мак адрес подключённого устройства я тоже не спрашиваю. Хотя узнать нельзя, по tcp/ip вне сегмента локальной сети эта информация не высылается, на уровне JS получить мак адрес тоже нельзя.
https://ideone.com/RJN4F2 - 9| '/ |\/|4|\/|bI ><4|<[-|>
https://ideone.com/A2QEmU - На словах ты Лев Толстой
https://ideone.com/R8YiQI - Маяковский попытка
https://ideone.com/CvSBIm - Палиндром
https://ideone.com/4RPmjR - Айпад
ОП или кто нибудь можете проверить? Вдруг неправильно? Завтра регулярные буду изучать.
Блин а чё нет варианта типа isset($_GET['a'], $_GET['b'], $_GET['c'], $_GET['d'], $_GET['e'])? Цикл не всегда вариант вставлять
> Почему бы тебе просто не создать таблицу для маков в БД не спрашиваю. Видимо нельзя по ТЗ, иначе бы ты сам догадался.
Ну если средствами mysql это сделать быстрее и проще, то ок. Я думал на php такое быстрее написать.
> Каким образом твой скрип узнает мак адрес подключённого устройства я тоже не спрашиваю. Хотя узнать нельзя, по tcp/ip вне сегмента локальной сети эта информация не высылается, на уровне JS получить мак адрес тоже нельзя.
Клиент не через браузер подключается. Собственная c++ прога, которая мак узнает
На серваке пхп 5 версии, не вариант, кстати вот такой вариант тоже работает
if ($_GET['a'].$_GET['b'].$_GET['c'].$_GET['d'].$_GET['e']) как только одно из значений есть то условие срабатывает, но всё равно хочется что-то более правильное и без циклов
echo "<a href=/hui.php?id=$id".(($page!=1)?:'&page=$page').">Хуй</a>";
Как правильно делать вывод условия в конкатенации?
Вот, есть такой код
<?php
error_reporting(-1);
$x = $x + 10;
Должно ли вывести после сложения какой-либо результат? У меня ничего нет.
Привет, анонас. На мой взгляд не нужно. При найме людей там где я работал никогда не было обязательно, если что-то есть на гитхабе, то хорошо что можно посмотреть стиль, как человек пишет, нет, да и хуй с ним, так пообщаемся. У меня своих проектов вообще никогда не было.
>чувствуешь, что можешь на мидла
Связанный список напишешь? Сложность алгоритма посредством математической индукции сможешь доказать? Нет == не миддл.
Ах, какбы я хотел, чтобы это так и работало. К сожалению сегодня средний мидл на бэке - это прост чувак который знает стек и просто умеет в ооп и смежную инфраструктуру.
Ебал бы каждого за алгоритмы на собесах, если бы решал я.
Посмотри в CLRS
Я описал там 3 варианта решения этой задачи.
Гляньте, если интересно, и пишите, если что-то непонятно рассказано.
> Переменные
> Кубик
Ок
> Два кубика
Здесь можно было использовать переменную $anonSum и было бы короче: ($anonDice1 + $anonDice2) > ($compDice1 + $compDice2)
> Вклад
Верно
> Айфон в кредит
В общем, верно, но коряво сделан вывод:
> 13 месяц спустя: долг = -3729.8132554793 руб, выплачено всего 61270.186744521 руб.
Как долг может быть отрицательным?
> Массивы №1
> Массивы №2
> Массивы №3
Все верно
> Генератор имен
Правильно.
Да пожалуйста.
a-12675 Исправить ошибку авторизации (при редиректе с oauth сервера), при отправке формы в задаче a-12579
a-12789 В очереди загрузки файлов из кабинета платильшиков накапливаются невыполненные задания
Бамп вопросу, еще актуален. Или серьезно никто в мире не знает, как обойти такое идиотское ограничение?
В смысле если ты с ними решишь на фронтенде что-то делать, это будут сплошные костыли и боль. No way
хотя если тебя не смущают костыли и лапша которую трудно разобрать как она отрабатывает и готов дебажить сутками то смотри в сторону https://symfony.com/doc/current/form/events.html
ChoiceType - это не внешнее представление (селект). Это виджет, в котором есть выбор из набора разрешенных вариантов и другой передать нельзя. (хотя, конечно ты можешь создать свой виджет наследованием от него и там отменить это ограничение, но это будет неправильно).
То, что тебе нужно - это TextType - виджет, который принимает любой текст. Просто при выводе надо выводить его не в виде инпута, а в виде селекта. Для этого ты наследуешься от него (в серверной логике менять ничего не надо) и делаешь свой тип ComboboxType. Для него делаешь свой twig шаблон, в котором делаешь вывод селекта + возможность ввести произвольное значение с помощью скрипта.
Так ты получишь виджет, который можно потом добавить в любую форму.
Может быть, ты просто не разобрался как следует? По идее ты можешь создавать любые кастомные виджеты, а также менять представление для любых встроенных виджетов. Формы Симфони очень кастомизируемы.
Спасибо огромное, ты лучший. Подозревал что-то такое, но даже примерно не понимал как это реализовать.
На сколько я помню у меня всегда были трудности сделать динамическое поведение. В этих шаблонах макросы пишешь, как этот блок спрятать, как тот блок после редиректа показать. То бля блоки жаваскриптом прячешь, то шаблонах условия прописываешь. И все это еще в контроллер просачивается, разные флаги, чтобы управлять поведением формы. Все время дебажишь какая фигня из формы прилетела в листенеры. Коллекции колекций в коллекциях. Сами формы отвечают за все. За валидацию, за рендеринг шаблонов, за заполнение из запроса модели со всеми связями. По разумному там что-то совсем простое можно сделать.
Убежал в разделение на фронтенд и 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к, заказал жратвы из топ - рестика и сижу сейчас пишу это вам, хз зачем даже.
Главное, хочу сказать спасибо опу, чьи уроки мне очень помогли вкатываться в пых. Я желаю тебе всего самого хорошего, чел - ты красавчик, спасибо за твои уроки, они делают чью то жизнь лучше.
Собственно стори.
Года три назад я дропнул универ по юриспруденции на четвертом курсе, потом после года нихуянеделания, работал слесарем на стройке, вместе со знакомыми парнями. Мы неплохо подучали (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к, заказал жратвы из топ - рестика и сижу сейчас пишу это вам, хз зачем даже.
Главное, хочу сказать спасибо опу, чьи уроки мне очень помогли вкатываться в пых. Я желаю тебе всего самого хорошего, чел - ты красавчик, спасибо за твои уроки, они делают чью то жизнь лучше.
Поздравляю, аноний. Правда зп твоя все еще в два раза меньше, чем у посудомойщицы в любой нормальной стране, но по нашим меркам ты почти как сын депутата
> Там уже были микросервисы, симфони, нормальное кодревью и оче крепкий воркфлоу. Я бысто понял, что раньше я творил просто лютую хуйню, здесь я обучился нормальному чистому коду, архитектуре и всякому нужному в скоупе бэкенда (особенно по работе с бд и контейнерами)
Эх, сколько уже времени пытаюсь миновать твои первые два этапа и сразу вкатиться сюда. А вакух то нет)
Поздравляю тоже. Ты молодец. Мне немношко завидно и грустно
У меня есть как раз то, что тебе нужно.
https://ideone.com/oktwDf - Телефоны
https://ideone.com/sryKy6 - Телефоны с исправлениями
Пока эти три сделал, долго думал над ними проверьте пожалуйста!
Там в некоторых местах будут пропущены \\ я знаю что это ошибка, просто не исправил во время и оно не дает мне исправить уже.
За 3 месяца реально задрочить php, ларку и уже идти искать работу?
>За 3 месяца реально задрочить php, ларку и уже идти искать работу?
Если не тупой и задротишь часов по 40 в неделю, то вполне
Самый быстрый вкат, который я видел - 7 месяцев. Весьма одаренный малый был. За три месяца с нуля - яхз какая компания на лару возьмет такого джуна.
> Шифровка
> 9| '/ |\/|4|\/|bI ><4|<[-|>
> 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. Также, если мы обнаружили различие в буквах, то можно выйти из цикла, а не продолжать сравнение.
> Айпад
> $loan += ($initDeposit == 0) ? ($loan $percent) + $comission : ($loan $percent);
Здесь можно было не писать два варианта выражения, ведь в банке с начальным депозитом комиссия равна нулю и от ее прибавления ничего не изменится.
> $loan - $payment < 0
Это можно написать читабельнее: $loan < $payment. И еще читабельнее, если заменить это выражение на функцию min или max.
В остальном все верно.
> Шифровка
> 9| '/ |\/|4|\/|bI ><4|<[-|>
> 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. Также, если мы обнаружили различие в буквах, то можно выйти из цикла, а не продолжать сравнение.
> Айпад
> $loan += ($initDeposit == 0) ? ($loan $percent) + $comission : ($loan $percent);
Здесь можно было не писать два варианта выражения, ведь в банке с начальным депозитом комиссия равна нулю и от ее прибавления ничего не изменится.
> $loan - $payment < 0
Это можно написать читабельнее: $loan < $payment. И еще читабельнее, если заменить это выражение на функцию min или max.
В остальном все верно.
> Номера машин
> [А,В,Е,К,М,Н,О,Р,С,Т,У,Х]
В символьных классах буквы не надо разделять запятой, надо писать просто [АВЕКМН....]. А то твоя регулярка принимает и буквы, и символ запятой.
> Телефоны
В общем-то верно, но вместо \\W лучше было бы явно перечислить конкретные символы: пробелы, скобки, минус. А то \\W принимает и запятые, и двоеточия, и еще кучу других символов.
> Телефоны с исправлениями
То же замечание, что и в предыдущей задаче, в остальном верно.
За 3 месяца можно многое успеть, особенно если ты в месяц занимаешься этим 300+ часов (10 часов в день уделяешь работе). Как вот этот чел - https://www.youtube.com/watch?v=uGrBHohIgQY&ab_channel=WilliamLin - он каждый день вставал, мылся и садился решать задачи, с перерывом на обед.
Если спросишь про меня, то я смотрю на вакансии и что они требуют в основных навыках, пока я это не знаю - не пойду, ибо не примут. Соответственно смотри по своим предпочтениям обязательно, ибо если неинтересно то зачем тебе тратить на это время, ведь потом это будет казуальным мучением.
А еще - если ты куда то торопишься, забей. Твои ресурсы тебе же не позволят ничего быстро сделать, ну к примеру адаптировать новые знания, тебе нужно отдыхать, мозг это тоже орган и он должен отдыхать, закреплять нейронные связи (Или как то так я не нейробиолог). Надеюсь помог, просто сталкивался с этой проблемой времени когда изучал свой первый язык программирования, если что еще спрашивай может я что-то знаю полезное для тебя.
>>2010059
Спасибо ОПчик! После регулярок я уже пикрил, буду повторять.
Я вот еще решил:
https://ideone.com/PfG2bB - Дураки человеки
https://ideone.com/LoKWGR - Гацисты (Пока без исправлений)
Почту и гацистов доделаю после того как пройду PCRE в мануале, а еще нужно попрактиковать функции с массивами с строками.
А может ты?
Списком перечисли, что успел сделать, что предстоит сделать, что в прогрессе и примерное время потраченное на сделанное и в прогрессе
Двачую тоже интересно.
>За 3 месяца можно многое успеть, особенно если ты в месяц занимаешься этим 300+ часов (10 часов в день уделяешь работе).
Такими темпами только в гроб/дурку.
Лайтовый вариант вката часов 20-30 в неделю. Хардкорный 40-50.
Дальше идут адовые переработки и выгорание
Зачем? Чтобы ты мне потом высрал что я даун и не справился с простейшими задачами за то же время что и ты?
>я даун и не справился с простейшими задачами
Это и так очевидно
Интересно, на чем новички запинаются в процессе вката
>Интересно, на чем новички запинаются в процессе вката
Интересуйся дальше, может быть подскажет кто-нибудь.
Я в пример взял вот этого чела - https://www.youtube.com/watch?v=DPxnJn3W2Es&ab_channel=AnasNuurAli - Вдохновляет.
Честно я так не могу, сидеть и решать задачи весь день. Один раз попробовал написать в TIS-100 одну задачу где нужно было угадывать последовательность цифр, типа если 3 раза прошло одно и то же число то посылаешь TRUE. И я выгорел на неделю после этого, не стоило того.
>>2010083
Почему ты так боишься показать на чем ты остановился? В этом нет ничего постыдного, все мы дауны, просто мало кто это признает (А зря).
Сам запинался и запинаюсь на многих вещах в разработке.
Только если в начале это были проблемы уровня 10 строк кода, то сейчас проблемы помасштабнее вроде "как уложиться в срок", "какую архитектуру тут использовать", "как обуздать этот ебучий легаси", "что из готового функционала взять, а что лучше с нуля написать"
>Почему ты так боишься показать на чем ты остановился? В этом нет ничего постыдного, все мы дауны, просто мало кто это признает (А зря).
Не люблю хамов, мне неприятно с тобой разговаривать.
Я мимокрок, ну ок
Есть подход, когда PHP-код не помещается в докер-образ, а просто из образа монтируется папка с ним. То есть, в докер-образе будет PHP с расширениями, а PHP-кода в нем нету.
То есть, в Dockerfile ты пишешь только команды установки PHP и нужных расширений, и команду монтирования папки с кодом.
Привет, ребята. За сколько по времени примерно учится PHP, если уже знаешь JS (фронт и совсем чуть-чуть ноду)? Здесь есть вкатуны из JS?
>За сколько по времени примерно учится PHP, если уже знаешь JS
За столько же, за сколько и без жс
Читай шапку.
С чего ты взял, что будет быстрее?
Если ты основательно выучил JS (и особенно TS), шаришь в алгоритмах и структурах данных, знаком с паттернами проектирования, то ты в принципе ты уже знаешь PHP. Ознакомься с бэкендом, поковыряй фреймворки и уже получишь представление об этом всем. JS в том виде, в котором он существует и требуется сейчас гораздо сложнее PHP.
>Если ты основательно выучил JS (и особенно TS), шаришь в алгоритмах и структурах данных, знаком с паттернами проектирования, то ты в принципе ты уже знаешь PHP
Если б так было, он бы уже работал мидлом.
По ощущениям - вкатун, который написал тудушку на жсе и возомнил себя кодером
Ну он написал, что знает. Под "знать JS" уже давно подразумевается не только тудушка.
> годик
ну пиздец, мидл уровня /b/
чому в РФ так любят называть вещи не своими именами?
помните раньше каждого полотёра "менеджером" величали?
Nnn
Кто-то должен тебе сказать это? Или ты должен пройти какой то тест или проверку?
>Как будешь использовать транспилятор при добавлении жс-кода в шаблоны?
>Транспи... что?
>Ясно. Мы вам перезвоним
Требования: чтоб умел помимо мгновенного сохранения на сервер, также переименовывать, создавать, удалять папки и файлы, как в нотепад++, в 2 клика
>1) Дан массив, состоящий из чисел или строк, например: [1, 2, 3]. Сгенерируй и выведи все возможные перестановки значений этого массива. То есть, все возможные способы расставить эти числа или строки без повторов. Для массива выше будет 6 перестановок:
Че-то тяжко, осилил (если вообще осилил) только на 3 элемента:
https://ideone.com/11ZXON
Это если не гуглить и не смотреть чужие алгоритмы.
Заходишь в офис, выбираешь самого слабого с виду мидла и атакуешь его. Если не уверен в себе, то можно напасть со спины, но это не приветствуется
говорят у фронтов нужно еще съесть печень
Ааа всё понял, спасибо! Буду знать.
Нахуя?)
Если чувствуешь, что можешь на мидла, у тебя и зарплата ужэе должна быть мидлорвая очевидно. Проекты - это неплохо, особенно если в них есть что нибудь примечательное для конторы, но в результате все покажет собес+испытательный. И да, год опыта на мидла - это в 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 элемента".
Если все понятно, попробуй написать код, если нет, то уточняй.
Далее я опишу решение к сложному варианту задачи.
У этой задачи есть еще второй, более сложный вариант:
---
Есть массив из 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? (подсказка: попробуй сравнивать цифры, идя справа налево)
- после того, как мы поставили черту, по какому принципу меняется цифра справа от черты?
- по какому принципу ставятся цифры справа от черты, кроме первой?
Это наверно сложно, но ты попробуй подумать, а если что, попроси подсказку.
-----
Кстати, по задаче с банкоматом я сделал отдельный разбор, можешь почитать, если любопытно: https://github.com/codedokode/pasta/blob/master/algorithm/atm.md
Теперь мы можем перейти к более сложной задаче: как, имея перестановку, получить следующую за ней в словарном порядке?
Чтобы это понять, мне пришлось выписать несколько примеров перестановок и внимательно их изучить. Рассмотрим пары соседних перестановок, я запишу их вертикально для удобства сравнения:
12345
12354
12354
12435
13542
14235
15243
15324
25431
31245
Если сложно рассматривать примеры из 5 цифр, ты можешь выписать в список по возрастанию все перестановки из 4 цифр - их немного.
Что общего мы видим в этих примерах? Во всех (кроме последнего примера) цифры можно разделить на 2 части: левую часть, которая не меняется, и правая, которая меняется:
123|45
123|54
15|243
15|324
В последнем примере мы поставим черту перед числом, так как там поменялись все цифры:
|25431
|31245
Попробуй подумать над такими вопросами:
- по какому принципу определяется, где поставить черту? Например, где будет черта в комбинации 31542? (подсказка: попробуй сравнивать цифры, идя справа налево)
- после того, как мы поставили черту, по какому принципу меняется цифра справа от черты?
- по какому принципу ставятся цифры справа от черты, кроме первой?
Это наверно сложно, но ты попробуй подумать, а если что, попроси подсказку.
-----
Кстати, по задаче с банкоматом я сделал отдельный разбор, можешь почитать, если любопытно: https://github.com/codedokode/pasta/blob/master/algorithm/atm.md
у всех разрабов вакансии с вилкой 300-400к + всякие бонусы, на собесе говорят что будет работа в каких то своих проектах. вопросы на тех собесе были обычные мидловские. зазывают очень усердно и настойчиво. из требований которые я выяснил на собесе: не пить не курить,отсутствие татуировок, не носить длинную бороду, не носить длинные волосы. сам про контору накопал что занимается типо white hat хакингом, но типо не на заказ, а делает контент на основе этого статьи на хабре, тик токи, видосы в инсте + то что там большая текучка и мало кто долго прорабатывает т.е. не больше года-полтора. из за чего становится непонятно откуда у них бабки чтобы платить разрабам такие бабосы. аноны, вы что нибудь знаете о ней, стоит ли туда соваться ?
Собесился с ними.
Там какие-то поехавшие черти сидят.
Удаленку нельзя. Сидишь в офисе под трекером и тотальной толерастией. Т.е. коллегами будут различного рода муслимы.
>Удаленку нельзя.
Точнее удаленка только на время пандемии, потом в офис.
>что еще можешь рассказать
Да ничего. Общался только с их эйчаром. Сказал ему, что не пойду дальше на тех собес ибо ебал в рот работать с бабахами и под трекером.
если ли блять асинхронность? могу ли я вызывать функции(пользовательские, которые могут включать в себя I/O) асинхронно?
В каком-то виде есть, но надо использовать асинхронное I/O, а не обычное. Смотри ReactPHP, Swoole, RoadRunner.
Допустим, я клонирую репу с каким-нибудь проектом. На компе пхп не установлен, то есть мне нужно все зависимости установить компосером в контейнере и скопировать vendor на хост, чтоб не ругался шторм. composer install в докерфайле отрабатывает без ошибок, но вендор на хосте не появляется. Но если запустить composer install из контейнера вручную через docker exec, то все срабатывает. Вот мои конфиги:
docker-compose.yaml (в корне проекта)
version: '3.3'
services:
php:
build:
context: ./
dockerfile: ./docker/php-fpm/Dockerfile
ports:
- '9002:9000'
volumes:
- ./:/var/www/symfony
nginx:
build: ./docker/nginx
ports:
- '8080:80'
links:
- php
volumes_from:
- php
volumes:
- ./docker/logs/nginx/:/var/log/nginx:cached
и Dockerfile (лежит в project_root/docker/php-fpm)
FROM php:8.0-fpm
RUN apt-get update
RUN apt-get install -y libicu-dev libxml2-dev libzip-dev git unzip \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl \
&& docker-php-ext-install xml \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install ctype \
&& docker-php-ext-install iconv \
&& docker-php-ext-install zip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && chmod +x /usr/local/bin/composer
WORKDIR /var/www/symfony
COPY ./composer.lock .
COPY ./composer.json .
RUN composer install
Допустим, я клонирую репу с каким-нибудь проектом. На компе пхп не установлен, то есть мне нужно все зависимости установить компосером в контейнере и скопировать vendor на хост, чтоб не ругался шторм. composer install в докерфайле отрабатывает без ошибок, но вендор на хосте не появляется. Но если запустить composer install из контейнера вручную через docker exec, то все срабатывает. Вот мои конфиги:
docker-compose.yaml (в корне проекта)
version: '3.3'
services:
php:
build:
context: ./
dockerfile: ./docker/php-fpm/Dockerfile
ports:
- '9002:9000'
volumes:
- ./:/var/www/symfony
nginx:
build: ./docker/nginx
ports:
- '8080:80'
links:
- php
volumes_from:
- php
volumes:
- ./docker/logs/nginx/:/var/log/nginx:cached
и Dockerfile (лежит в project_root/docker/php-fpm)
FROM php:8.0-fpm
RUN apt-get update
RUN apt-get install -y libicu-dev libxml2-dev libzip-dev git unzip \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl \
&& docker-php-ext-install xml \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install ctype \
&& docker-php-ext-install iconv \
&& docker-php-ext-install zip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && chmod +x /usr/local/bin/composer
WORKDIR /var/www/symfony
COPY ./composer.lock .
COPY ./composer.json .
RUN composer install
Помню, ебался с этим кейсом.
Суть в том, что на момент сборки образа вольюмы не монтируются в хост или монтируются, но исчезают, не суть. Т.е. композер зависимости ставит, но ты их на хосте не увидишь.
Тут варианта 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, хотя опять же непонятно, почему бы не использовать для этого папку проекта? Может быть, тут есть кто-то, кто разбирается в этом дьявольском отродье и получше сможет объяснить.
Обычно при использовании Докера внутрь контейнера устанавливают только исполняемые файлы, то есть только 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, хотя опять же непонятно, почему бы не использовать для этого папку проекта? Может быть, тут есть кто-то, кто разбирается в этом дьявольском отродье и получше сможет объяснить.
Эх... бля. Придется всё же использоваться PCNTL в CLI для кеширования, а FPM уже будет отдавать кэшированный результаты. Хотя мб попробую ReactPHP.
Спасибо!
И кстати, умный анон, раз ты тут, поясни, зачем Докер на каждую строчку Dockerfile создает новый образ, а не пишет все в один образ? И почему люди пишут кучу команд через &&, а не пишут RUN несколько раз? Разве это удобно?
- RUN как раз создает каждый раз новый слой. Сделано это на тот случай, если в Dockerfile если команды, которые могут работать по условиям, ну и всякое такое.
Кстати, я почитал справку по Докеру, и там советуют использовать вместо монтирования какие-то "volumes". В чем плюсы, я плохо понял, такое ощущение, что у них только минусы.
- можно пробросить папку с машины в контейнер простым телодвижением. Например берешь docker-compose, пишешь там
volumes:
- /var/www:/opt
и на выходе получаешь в запущенном контейнере в папке /opt/ все файлы, которые хранятся на машине в папке /var/www
Зачем там нужен nginx, если можно просто использовать dev-сервер в PHP? И при этом логи будут идти в консоли, а не неизвестно где.
- версионирование окружения. nginx сам по себе, php сам по себе. и когда тебе внезапно захочется протестировать работу приложение на другой версии php - всего лишь пересобираешь php, а не весь огромный зоопарк
Ох, наверно я плохо вопросы сформулировал.
Нет, я имел в виду эти volumes, которые хранятся где-то в /var: https://docs.docker.com/storage/volumes/
> 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, по моему эти слои какое-то бессмысленное усложнение, можно было писать все в один образ и не париться, и тогда не пришлось бы писать команды через &&.
>Этот докерфайл вообще, по моему, кривой.
Вполне вероятно. Я с докером работаю второй день
>Например, зачем там COPY, который копирует файл composer.json в то же самое место?
Не в то же самое, а из корня проекта в WORKDIR (см. опцию context)
>Зачем там вписана команда composer install? Как тогда там делать composer update и другие команды?
Через docker exec
>Зачем там нужен nginx, если можно просто использовать dev-сервер в PHP? И при этом логи будут идти в консоли, а не неизвестно где. И почему нет базы данных?
Логи и так видны в консоли, если запускать docker-compose up без опции -d. База данных мне пока не нужна. А к nginxу я привык
Короче, я уже заебался по самое не могу. Всегда ненавидел колупание конфигов
https://ideone.com/pxpXCc - Поиск опечаток
https://ideone.com/EK49f2 - Поиск опечаток с исправлением
Убрал composer install из докерфайла и пока сделал установку зависимостей командой docker exec -it $(docker ps -aqf "name=php") /bin/bash -c "composer install"
Наверно, если показать, с каким кодом я работаю, тут большая часть новичков отвалится.
Кому интересно колупать километры легаси 5+ летней выдержки
Вполне норм. Нет смысла пытаться запихать всё в докер.
Подобные вещи обычно пишутся в ci/cd скриптах
Помогите пожалуйста нубу
Как создать эту блядскую схему БД для интернет магазина?
Какие нужны модели, связи?
Пишу на ларке
У меня на работе есть проект на симфони, в директории веб (которая в новых версиях симфы называется паблик) которого живет отдельная ебанина из второй половины нулевых. Вот там просто пиздец из месива пхп, жопаскрипа, верстки и sql
> Не в то же самое, а из корня проекта в WORKDIR (см. опцию context)
Так при запуске docker-compose в /var/www/symfony монтируется папка с проектом:
volumes:
- ./:/var/www/symfony
И он, получается, копирует composer.json в то же самое место.
Я тоже так думал, но без ручного копирования этих файлов composer ругался на отсутствующий composer.json
Пастбин боюсь, что индексироваться будет и мне потом в тык дадут
Ты можешь не выкладывать код, а написать аналогичный с другими именами функций и переменных.
Не выкладывай.
Я новичок, и я срусь со страху вот с этого
https://symfony.com/doc/current/page_creation.html
Норм-то оно норм, а тесты не работают. И зависимости переустанавливал, и dump-autoload делал - ничего не помогает. С хоста все пашет
Вручную обфусцировать 2к строк не хочется...
Чому? Мало ли говна на битриксах, вордпрессах и иже с ними. Будет лендинги хуярить за милую душу
>говна на битриксах, вордпрессах и иже с ними
Там качество кода в разы хуже и файлы не на 2к строк, а на 10к+
>>2014103
https://drive.google .com/file/d/12EkOmz2MIIVNubjuRXw9G9i0LqFqiYF6/view?usp=sharing
пробел уберите
>https://drive.google .com/file/d/12EkOmz2MIIVNubjuRXw9G9i0LqFqiYF6/view?usp=sharing
Сложно. Как в таком коде вообще ориентируешься?
>Как в таком коде вообще ориентируешься?
Буквально голову ломаю. После рабочего дня уже ничего не хочется кроме как спать.
Сильно помогает xdebug. Так же не брезгую читать исходники фреймворка
480x360, 0:09
Увидел хтмл теги и дальше не смотрел. Но на первый взгляд ничего сложного, просто очень громоздко
Yiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
Масло масляное
>Но на первый взгляд ничего сложного, просто очень громоздко
Этого "ничего сложного" пол ляма строк
Хотели жабу - кушайте жабу.
Микросервисы не упрощают код, это миф. Вот допустим, для работы бизнеса нужно 1 000 000 строк кода. Ты можешь поместить их в монолит, можешь поместить в монолит и разбить на модули по 100 000 строк, можешь сделать 10 микросервисов по 100 000 строк. В любом случае это будет миллион строк, и в случае с микросервисами даже больше, так как добавляются расходы на взаимодействие.
Зачем же используют микросервисы? На мой взгляд, тут есть 2 случая: когда они приносят пользу и когда не приносят.
Возьмем, например, Яндекс. У них куча приложений, и бывает такое, что нескольким приложениям нужен одинаковый функционал. Например, и картам, и такси, и лавке нужно уметь строить маршруты по городу. Логично, что можно сделать сервис "построитель маршрутов" и использовать его из нескольких приложений. Это правильное применение микросервисов.
Или возьмем Вконтакте. У них такие нагрузки, что обычные решения не справляются. Потому они пишут свои хранилища на Си: отдельное хранилище для списков друзей, отдельное для сообщений, отдельное для новостей и тд. Это тоже пример правильного применения микросервисов.
Бывает спорный случай, на мой взгляд, ближе к неправильному. Например, когда людей много, их разбивают на команды и каждая пишет свой сервис. На мой взгляд, они бы могли вместо этого писать модули одного большого монолита и это было бы лучше. Удобнее изучать код, удобнее делать поиск по коду.
А бывают совсем неправильные применения. Например, некоторые утверждают, что микросервисы позволяют использовать разные фреймворки или даже языки программирования. Но это как раз глупость: получается, теперь разработчик не может заглянуть в соседний микросервис и поправить что-то в нем, так как не знает используемого там фреймворка и языка. Также, если команда сервиса A написала полезную библиотеку, команда сервиса B не сможет использовать ее, так как они пишут на другом языке, и будет изобретать свою библиотеку.
Мне кажется, эти аргументы - что можно писать на разных языках - это плохие аргументы. Выгоднее, когда в компании используется монокультура и код пишется единообразно.
Или бывают примеры, когда проект небольшой (меньше миллиона строк) и команда небольшая, а зачем-то делают микросервисы. Только зря тратят время, на мой взгляд. И вдобавок приходится использовать поганый Докер, и все это жрет и диски и память.
Если тут есть умный анон, который может описать реальные плюсы от использования микросервисов, было бы интересно почитать.
Микросервисы не упрощают код, это миф. Вот допустим, для работы бизнеса нужно 1 000 000 строк кода. Ты можешь поместить их в монолит, можешь поместить в монолит и разбить на модули по 100 000 строк, можешь сделать 10 микросервисов по 100 000 строк. В любом случае это будет миллион строк, и в случае с микросервисами даже больше, так как добавляются расходы на взаимодействие.
Зачем же используют микросервисы? На мой взгляд, тут есть 2 случая: когда они приносят пользу и когда не приносят.
Возьмем, например, Яндекс. У них куча приложений, и бывает такое, что нескольким приложениям нужен одинаковый функционал. Например, и картам, и такси, и лавке нужно уметь строить маршруты по городу. Логично, что можно сделать сервис "построитель маршрутов" и использовать его из нескольких приложений. Это правильное применение микросервисов.
Или возьмем Вконтакте. У них такие нагрузки, что обычные решения не справляются. Потому они пишут свои хранилища на Си: отдельное хранилище для списков друзей, отдельное для сообщений, отдельное для новостей и тд. Это тоже пример правильного применения микросервисов.
Бывает спорный случай, на мой взгляд, ближе к неправильному. Например, когда людей много, их разбивают на команды и каждая пишет свой сервис. На мой взгляд, они бы могли вместо этого писать модули одного большого монолита и это было бы лучше. Удобнее изучать код, удобнее делать поиск по коду.
А бывают совсем неправильные применения. Например, некоторые утверждают, что микросервисы позволяют использовать разные фреймворки или даже языки программирования. Но это как раз глупость: получается, теперь разработчик не может заглянуть в соседний микросервис и поправить что-то в нем, так как не знает используемого там фреймворка и языка. Также, если команда сервиса A написала полезную библиотеку, команда сервиса B не сможет использовать ее, так как они пишут на другом языке, и будет изобретать свою библиотеку.
Мне кажется, эти аргументы - что можно писать на разных языках - это плохие аргументы. Выгоднее, когда в компании используется монокультура и код пишется единообразно.
Или бывают примеры, когда проект небольшой (меньше миллиона строк) и команда небольшая, а зачем-то делают микросервисы. Только зря тратят время, на мой взгляд. И вдобавок приходится использовать поганый Докер, и все это жрет и диски и память.
Если тут есть умный анон, который может описать реальные плюсы от использования микросервисов, было бы интересно почитать.
В микросервисе мало кода, поэтому о нем легко рассуждать и соответственно добавлять фичи. По крайней мере программистам, у девопсов может быть иное мнение. У микросервисов меньшее зацепление кода. Сервис можно выбростить и переписать с нуля, с монолитом такое не сделаешь. В монолит не пустишь джуна, в монолит даже сеньер будет въезжать долго. Соответственно текучка кадров очень болезненна, старые работники, что писали это монолит становятся незаменимыми.
Ты просто привык писать в одно рыло, поэтому хочешь во всем коде разбираться и править там где тебя не просят? Ну сиди в одной конторе по 10 лет разбирайся.
В плане разработки микросервис ничем не проще обычного модуля или библиотеки.
В микросервисе ты завязываешься на API, и вот хрен ты его изменишь. И в библиотеке ты точно так же завязываешься на API, а как там внутри переделано не важно.
Разница главная в продакшене, что намного легче поднимать что-то. Можно использовать разные платформы, разные языки программирования, разные конфигурации используемых библиотек и модулей и т.п.
>Мне кажется, эти аргументы - что можно писать на разных языках - это плохие аргументы. Выгоднее, когда в компании используется монокультура и код пишется единообразно.
Тебе зря так кажется. Например что-то может быть относительно простым, но требовать большой производительности, и это пишут на каком-нибудь Go. А что-то требует сложной логики обработки данных, и это пишут на других языках, более удобных.
Ты можешь использовать сервисы, которые делают вообще не связанные с твоей компанией люди, что-то из открытого кода. Например сервисы авторизации.
Даже контейнеры с БД, MQ, кешами и другим это самые что ни на есть микросервисы.
Опять ты рассуждаешь с точки зрения, как будто ты в одиночку проект пишешь. Тут у тебя ошибка.
Есть масса монолит проектов, в которых кодовая база в миллионы строк, где работают десятки-сотни человек.
Я хочу сказать, что микросервис в плане разработки ничем не отличается от просто модуля или библиотеки. Вот одна команда может делать какую-нибудь библиотеку, другие команды её пользуются.
У библиотеки есть интерфейс, функции, которые что-то делают. Это поведение задокумендировано и называется API.
Ты точно так же можешь выкинуть библиотеку и заменить её на другую. Главное, чтобы API был таким же.
Здесь работает принцип модульности, большие задачи надо разбивать на маленькие, максимально независимые друг от друга в плане разработки.
А микросервис это лишь технический нюанс реализации. Смысл в то, что так ты общаешься с задачей по сети.
Проблемы тоже общие, нехватка гибкости. Ты завязан на API, и если хочешь его как-то сильно изменить, например перенести часть функционала из одного модуля или микросервиса в другой, то у тебя будут большие проблемы.
И чем сильнее ты дробишь, тем чаще у тебя будут такие проблемы возникать.
Я правильно понимаю что верстальщиком быть-это ахуеть как нужно стараться что бы кодить и рисовать страницы, а разработчику ПХП-только писать скрипты?
Микросервисы ради микросервисов -- просто религия и мода, очевидно же.
Зумеры и вкатывальщики не задумываясь тащат эту идеологию просто потому что им так сказали.
Можно хоть каждую функцию или класс вынести в отдельный сервис и воткнуть в сеть -- но зачем? Это гигантские накладные расходы.
Уже видел примеры, когда компании не подумав выносили функции в сервисы, а потом в ужасе от расходов впиливали их обратно в монолит.
ИМХО, надо действовать от обратного: я, например, выпиливаю из PHP-монолита на Symfony только действительно тормозные куски и переписываю их на более быстром языке (в моём случае Java). Также пишу микросервисы на Java там, где PHP просто не предназначен (в моём случае, конвертация видео, обработка больших данных или некоторые системные процессы).
Такой подход решает проблемы и при этом не создаёт ненужной работы.
>Зумеры и вкатывальщики не задумываясь тащат эту идеологию просто потому что им так сказали.
В последнее время стал натыкаться на статьи о том, что монолиты это заебись, а микросервисы говно.
И ларка и симфони одинаково интересны, но предпочтение симфони отдаю, ибо сложно.
> В микросервисе мало кода, поэтому о нем легко рассуждать и соответственно добавлять фичи.
Допустим, у нас есть монолит, в котором код разбит на модули - папки. В одной папке мало кода, потому о нем легко рассуждать. Чем это хуже?
> В монолит не пустишь джуна, в монолит даже сеньер будет въезжать долго.
Это либо какой-то плохой монолит, либо какой-то плохой сеньор. В той же Симфони все логично, вот контроллеры, вот сервисы, вот сущности. Во что там въезжать? Тебе не требуется изучать весь код, а только ту часть, с которой ты сейчас работаешь.
В монолите все написано в едином стиле. А в микросервисах каждый микросервис может быть написан по-своему.
Да, ты не можешь прочесть весь код монолита, если в нем миллион строк. Но если у тебя 20 микросервисов по 50 000 строк, ты ведь тоже их всех не сможешь прочесть. Да даже один микросервис не прочтешь.
>>2014534
Ты так говоришь, как будто это плохо. Естественно, я хочу во всем разбираться. Чтобы при наличии бага я мог его качественно исправить, и сделать любую доработку.
А что хорошего, когда я не могу разбираться во всем? Надо просить другую команду, а они скажут "извини, у нас в этом 2-недельном спринте времени нет, может быть в следующий спринт добавим задачу, но не обещаем". И исправление простого бага затягивается минимум на 2 недели, а то и дольше, если окажется, что проблема не у них.
Или еще хуже: микросервис, в котором баг, никто не поддерживает вообще (так как у нас 20 микросервисов и всего 5 человек). Что делать?
Я здесь веду речь о более-менее обычных веб-приложениях (например: для автоматизации бизнеса). Я понимаю, что в условном Яндексе действительно во всем, что они понаписали, одному человеку не разобраться (тем более что там используются сложные алгоритмы). Но большинство компаний это не яндексы и у них ничего сложного нет.
> Можно использовать разные платформы, разные языки программирования, разные конфигурации используемых библиотек и модулей и т.п.
Так это же недостаток. Так у тебя получится 20 микросервисов, каждый на своем языке и фреймворке, написанный в своем стиле. А в команде всего 5 человек. Как ты думаешь, удобно им будет их поддерживать?
То ли дело монолит: все написано в едином стиле, на одном языке. Никаких API, все можно поменять. Захотел - перменял любую функцию (только не забудь найти места, где она вызывается).
Это же сплошные плюсы у монолита.
> Разница главная в продакшене, что намного легче поднимать что-то
Админу ничига не легче. Ему удобнее управлять одним сервисом, чем разбираться в куче микросервисов.
Вообще, у меня ощущение, что компании среднего размера и их разработчики просто вообразили себе что они Яндекс и Гугл и им нужны кластеры, балансировка и прочие ужасы. В итоге они просто тратят большое количество денег, которые бы могли сэкономить при использовании монолита.
> Даже контейнеры с БД, MQ, кешами и другим это самые что ни на есть микросервисы.
Нет. В концепции микросервисов у каждого микросервиса свое хранилище данных. То есть БД это не микросервис, а часть какого-то микросервиса.
>>2014542
> Например что-то может быть относительно простым, но требовать большой производительности, и это пишут на каком-нибудь Go.
Это правда для приложений вроде Вконтакте. Там очень высокая нагрузка и делаются сервисы на Си для отдельных задач вроде хранения списков друзей и сообщений (и кстати, они используют бинарные протоколы, а не HTTP с JSON). Но для обычных бизнес-приложений, мне кажется, это неактуально. Там могут быть высокие нагрузки, но на все подряд, а не на отдельные места.
до тех пор пока проект не разрастется и там черт ногу сломает, рефакторить код невозможно, не знаешь че он за собой потянет, менять что то страшно, там все по 10 раз переиспользуется и накидываешь на эту кучу с лопаты сверху
>Чем это хуже?
то что этот кусок кода может переиспользоватся где то там/что то на него ссыдается/результаты где то еще используются и неизвестно что он за собой может потянуть, ты еще не видел некоторого говна.
Главная проблема монолитов - зацепление помноженное на огромную кодовую базу. Разбираться и пытаться распутать этот клубок крайне сложно.
Не так страшны эти вещи по отдельности:
Сильное зацепление, но кодовая база маленькая - можно без сверхусилий разобраться и поправить код. Один из не очень хороших вариантов микросервисов
Слабое зацепление, но большая кодовая база - так же нет особой сложности для внесения изменений
>Да, ты не можешь прочесть весь код монолита, если в нем миллион строк. Но если у тебя 20 микросервисов по 50 000 строк, ты ведь тоже их всех не сможешь прочесть. Да даже один микросервис не прочтешь.
Так их и не надо читать все эти строки кода. Ни один разраб не сможет осилить такую огромную кодовую базу, будь он хоть трижды гением.
Микросервисы при удачном распиле можно отдать разным командам и играть в корпоративный пинг понг
>Надо просить другую команду, а они скажут "извини, у нас в этом 2-недельном спринте времени нет, может быть в следующий спринт добавим задачу, но не обещаем"
Не такой уж плохой исход. Да, крупные системы неповоротливы, но что поделать. Тут хотя бы ясно, какая команда за что отвечает
>Но большинство компаний это не яндексы и у них ничего сложного нет
Помимо яндексов достаточно компаний, где крупная кодовая база, которой не хватает какого-то разбиения
О да, работаю по принципу: видишь вокруг говно - делай говно - лей в прод
Пхп тормозной, а джава нет? Ебать у вас там хайлоад я вижу
Как это вообще заработало? У меня знатно протек чердак от этой задачи. Править потом буду, пока просто скидываю что сделал в пол третьего ночи.
https://ideone.com/SnepM5
Чувствую себя пикрелейтед, ничего не гуглил. На "сложную" задачу теперь страшно смотреть.
Мимо все тот же тупой лягушенок
Да, у приложения должна быть своя локальная БД. Самый сложный тут момент - это синхронизация локальной БД с сервером. Тут есть такие проблемы:
- мы (скорее всего) не можем выкачать всю серверную БД из-за большого объема, значит локальная БД всегда будет не полная и это не должно вызывать ошибок. Самый простой вариант - скачивать локально те рецепты, которые смотрит пользователь
- если мы будем бесконтрольно скачивать все подряд, мы можем превысить какие-нибудь лимиты (они жесткие на моб. устройствах). Как решение, можно удалять старые записи, которые пользователь дольше всего не смотрел.
- хорошо, если записи на сервере иммутабельны (можно добавлять новые, но нельзя редактировать или удалять старые). Тогда все просто. Если же это не так, надо продумывать, как обнаруживать и загружать изменения. Один из вариантов: при заходе на страницу показывать ее из локальной БД и одновременно посылать запрос на проверку актуальности данных на сервер. При этом можно ограничить частоту этих запросов (если мы проверяли минуту назад, то второй раз можно не проверять).
- если пользователь может как-то взаимодействовать со страницей: ставить лайки, писать комменты, то придется делать еще синхронизацию с клиента на сервер. То есть, добавлять лайк в локальную базу и в очередь на выгрузку на сервер. А при отображении страниц мы объединяем информацию о лайках с сервера с локальной.
- еще сложнее, если два пользователя могут редактировать один и тот же контент, будучи в оффлайне. Тогда на сервер придет 2 набора изменений, и какой он должен принять? Чьи-то правки могут потеряться. Это напоминает конфликты в гите и сплошная боль при реализации.
Я могу ошибаться, но готового рецепта тут нет и каждый изобретает свою систему синхронизации.
> Ещё нужно отслеживать offline/online статус и при появлении интернета выгружать все статьи из очереди?
А зачем? Если пользователь зашел в рецепт A, потом в B, потом в C и потом появился интернет, то достаточно скачать C. A и B уже пользователю неинтересны.
> предлагаю все кешировать через service worker
По моему, так это дублирование баз данных. У тебя есть Бд в приложении, и будет еще одна в сервис воркере? А зачем?
Ну и я давно когда-то смотрел описание кеширования через воркеры и мне это показалось очень уродливым концептом.
> Ещё нужно сделать так, чтобы сайт предлагать "установить" его как приложения.
Это элементарно.
Да, у приложения должна быть своя локальная БД. Самый сложный тут момент - это синхронизация локальной БД с сервером. Тут есть такие проблемы:
- мы (скорее всего) не можем выкачать всю серверную БД из-за большого объема, значит локальная БД всегда будет не полная и это не должно вызывать ошибок. Самый простой вариант - скачивать локально те рецепты, которые смотрит пользователь
- если мы будем бесконтрольно скачивать все подряд, мы можем превысить какие-нибудь лимиты (они жесткие на моб. устройствах). Как решение, можно удалять старые записи, которые пользователь дольше всего не смотрел.
- хорошо, если записи на сервере иммутабельны (можно добавлять новые, но нельзя редактировать или удалять старые). Тогда все просто. Если же это не так, надо продумывать, как обнаруживать и загружать изменения. Один из вариантов: при заходе на страницу показывать ее из локальной БД и одновременно посылать запрос на проверку актуальности данных на сервер. При этом можно ограничить частоту этих запросов (если мы проверяли минуту назад, то второй раз можно не проверять).
- если пользователь может как-то взаимодействовать со страницей: ставить лайки, писать комменты, то придется делать еще синхронизацию с клиента на сервер. То есть, добавлять лайк в локальную базу и в очередь на выгрузку на сервер. А при отображении страниц мы объединяем информацию о лайках с сервера с локальной.
- еще сложнее, если два пользователя могут редактировать один и тот же контент, будучи в оффлайне. Тогда на сервер придет 2 набора изменений, и какой он должен принять? Чьи-то правки могут потеряться. Это напоминает конфликты в гите и сплошная боль при реализации.
Я могу ошибаться, но готового рецепта тут нет и каждый изобретает свою систему синхронизации.
> Ещё нужно отслеживать offline/online статус и при появлении интернета выгружать все статьи из очереди?
А зачем? Если пользователь зашел в рецепт A, потом в B, потом в C и потом появился интернет, то достаточно скачать C. A и B уже пользователю неинтересны.
> предлагаю все кешировать через service worker
По моему, так это дублирование баз данных. У тебя есть Бд в приложении, и будет еще одна в сервис воркере? А зачем?
Ну и я давно когда-то смотрел описание кеширования через воркеры и мне это показалось очень уродливым концептом.
> Ещё нужно сделать так, чтобы сайт предлагать "установить" его как приложения.
Это элементарно.
Так, мне кажется, в микросервисах это "зацепление" будет, только в гораздо более тяжелой форме.
Вот у нас есть в монолите функция. Она используется в 20 местах. Мы хотим ее поменять. Да, тяжко, но реально пройти эти 20 мест, поменять, вручную оттестировать (так как тестами это естественно никто не покрыл).
А вот у нас есть метод API в микросервисе. И мы хотим что-то в нем поменять. И это такой объем изменений, что лучше сразу оставить эту идею и оставить кривое, плохо спроектированное твоим предшественником (который и предложил внедрить микросервисы и успешно свалил) API. Разве я не прав?
>>2015389
> Микросервисы при удачном распиле можно отдать разным командам
Это если у тебя неограниченное число разработчиков. А если у тебя 5 человек и 20 микросервисов. И как они будут их всех поддерживать? Никак. А монолит абсолютно реально впятером потихонечку поддерживать и развивать.
То есть, получается, микросервисы требуют больше людей и больше денег. Они невыгодны бизнесу.
Отдельно меня поражают высказывания типа "можно выбросить и переписать заново". То есть ты серьезно предлагаешь бизнесу выбросить работу нескольких человек за месяц? Я бы лучше выбросил на мороз такого "предлагальщика".
Монолит - вот подход здорового человека.
Чтобы помечать место, где строка заканчивается:
$a = <<<END
тут текст
END; // <-- признак конца текста
То есть, текст заключен между END и END.
>>2015634
Неплохо, но тут многое стоит доработать.
Да, программа работает для массива из 4, 3 или 2 элементов. Но она не работает для массива из 5 элементов: она выдает лишь 40, а не 120 комбинаций.
Это из-за того, что ты не используешь рекурсию. Ты можешь в Main() вызывать не getCombinations, а саму же Main(). То есть, тебе пришел массив из 4 элементов, ты вынимаешь один элемент и вызываешь Main() уже с массивом из трех элементов. Только надо чуть доработать функцию Main(). А функция getCombinations тогда будет не нужна вообще.
И еще, я не очень понял принцип работы getCombinations, а именно это место:
> if($iterations <= $halfIterations){
> krsort($combination);
> }
Ты можешь объяснить, почему мы сортируем половину перестановок, а другую половину - не сортируем?
Вот тебе еще идеи по улучшению:
Вывод лучше делать через echo implode(), через пробел, в формате 1 2 3 4. Так читать будет легче.
Ты добавляешь $cutElement в конец массива, и из-за этого у тебя сначала идут все комбинации с 1 на конце, потом с 2 на конце и так далее. Но лучше бы добавлять $cutElement в начало массива.
Цикл foreach внутри getCombinations, как я понял, сдвигает массив (превращая [x, y, z] в [y, z, x]). Этот сдвиг можно было бы сделать через функции array_slice + array_unshift, получилось бы короче и понятнее. Или я что-то не учел?
Чтобы помечать место, где строка заканчивается:
$a = <<<END
тут текст
END; // <-- признак конца текста
То есть, текст заключен между END и END.
>>2015634
Неплохо, но тут многое стоит доработать.
Да, программа работает для массива из 4, 3 или 2 элементов. Но она не работает для массива из 5 элементов: она выдает лишь 40, а не 120 комбинаций.
Это из-за того, что ты не используешь рекурсию. Ты можешь в Main() вызывать не getCombinations, а саму же Main(). То есть, тебе пришел массив из 4 элементов, ты вынимаешь один элемент и вызываешь Main() уже с массивом из трех элементов. Только надо чуть доработать функцию Main(). А функция getCombinations тогда будет не нужна вообще.
И еще, я не очень понял принцип работы getCombinations, а именно это место:
> if($iterations <= $halfIterations){
> krsort($combination);
> }
Ты можешь объяснить, почему мы сортируем половину перестановок, а другую половину - не сортируем?
Вот тебе еще идеи по улучшению:
Вывод лучше делать через echo implode(), через пробел, в формате 1 2 3 4. Так читать будет легче.
Ты добавляешь $cutElement в конец массива, и из-за этого у тебя сначала идут все комбинации с 1 на конце, потом с 2 на конце и так далее. Но лучше бы добавлять $cutElement в начало массива.
Цикл foreach внутри getCombinations, как я понял, сдвигает массив (превращая [x, y, z] в [y, z, x]). Этот сдвиг можно было бы сделать через функции array_slice + array_unshift, получилось бы короче и понятнее. Или я что-то не учел?
>А вот у нас есть метод API в микросервисе. И мы хотим что-то в нем поменять. И это такой объем изменений, что лучше сразу оставить эту идею и оставить кривое, плохо спроектированное твоим предшественником (который и предложил внедрить микросервисы и успешно свалил) API. Разве я не прав?
Ты рассматриваешь будто один человек будет отвечать за пачку микросервисов. Это как раз плохой пример микросервиса, когда накладные расходы растут, а профита нет.
Ок, допустим мы хотим поменять метод микросервиса. Если
апи(контракт) не меняется, то никаких проблем (аналогично в монолите).
Меняется апи(контракт) - выпускаем новую версию апи. Кому нужно - переключатся на новое апи. В случае микросервисов эти изменения выглядят более прозрачно. В монолитах не видел удачного примера версионности апи модулей
>А если у тебя 5 человек и 20 микросервисов
Тут ясен пень, что микросервисы ради микросервисов. С другой стороны можно каждому отдать по 4 штуки
>То есть, получается, микросервисы требуют больше людей и больше денег. Они невыгодны бизнесу.
Это плата за масштаб проекта. Монолитные легаси системы в какой-то момент становится невозможно поддерживать. Фикс 1 бага порождает 3 новых. О вводе фич можно забыть.
>можно выбросить и переписать заново
Это хреновый подход в 99% случаев, т.к. системы во время разработки накапливают в себе знания, которых больше нигде нет.
>То есть ты серьезно предлагаешь бизнесу выбросить работу нескольких человек за месяц?
А это иногда приходится делать, если фича оказалась ненужна или принесла много накладных расходов. На этой неделе занимался выпилом части функционала.
>Монолит - вот подход здорового человека
До тех пор, пока этот монолит способна поддерживать команда из 5-7 разрабов. Дальше только разделять на сервисы.
>До тех пор, пока этот монолит способна поддерживать команда из 5-7 разрабов. Дальше только разделять на сервисы.
Всё-таки не совсем. Разделение не обязательно по сервисам, разделение может идти на разработчиков модулей-библиотек, каких-то частей проекта. Совершенно нормальная история.
Есть огромная масса проектов, не веб, на которых работают многие сотни людей. Там разделение на команды разработчиков, каждая команда делает свою какую-то часть.
Есть универсальный подход в любом сложном проектировании, даже не только в программировании и ИТ, в промышленности та же история. Модульная разработка, каждая команда делает свою какую-то часть по спецификациям интерфейсов. Условно ты занимаешься разработкой тормозов для автомобилей, у тебя есть спецификации, какие параметры у тормозов должны быть, интерфейс управления и датчики, ты эти параметры согласуешь с другими. API выкладываешь ты, но разработку согласуешь с другими.
Как верно оформить регулярку, чтобы шел учет того, что знак препинания может повторяться? И обрезалось уже после последнего. И какая-то шляпа с кодировкой, вроде бы поставил всё как надо, но слетает в makeFirstLetterUppercase первый символ, если кириллица, а значит лажанул. Хелпуйте(
парень ты странный какой то, тебе уже несколько человек сказало, здоровые легаси монолиты тяжело поддерживать, ты чинишь одну функцию, ломается где то еще другая и начинается замкнутый круг ты чинишь баги, порождая новые баги.
Теперь вижу. Серега, помимо мантр про low coupling и high cohesion, обязательно бы задвинул телегу о том, что не нужно использовать ОРМ для чтения.
Вообще, в монолите тоже можно организовать версионность: сделать функции func1, func2, func3 итд. Но это, по моему, плохая идея, когда есть две функции, делающие одно и то же. Так можно делать только временно, на период пока ты меняешь старую функцию на новую.
> Меняется апи(контракт) - выпускаем новую версию апи. Кому нужно - переключатся на новое апи.
Это значит, что будут одновременно две версии АПИ: старая и новая. В то время как в монолите мы поменяли все места, где вызывается функция и старая версия удаляется. То есть, в монолите делать такие обновления проще и удобнее. В микросервисах делать изменения API тяжело и неудобно.
> Монолитные легаси системы в какой-то момент становится невозможно поддерживать. Фикс 1 бага порождает 3 новых.
Ну это какое-то совсем плохое легаси. И, кстати, непонятно, почему при замене на микросервисы должен получиться более качественный код. Если их будут писать такие же разработчики, будет такая же лапша.
В том же монолите можно сделать разделение на модули. И будет как с микросервисами, но без кучи присущих им недостатков.
Вот еще преимущество монолита: у него единая БД. Если тебе надо сделать какой-то сложный запрос руками, ты просто пишешь и все работает. А в микросервисах все данные раскиданы по нескольким БД и выборку получить не удастся.
Мне кажется, микросервисы используют по таким причинам:
- хочется поиграться в большую компанию и посоздавать кластеры (в убыток работодателю)
- слабым программистам легче писать новый код с нуля, чем разобраться в существующем. Писать новый код всегда легче, можно косячить как угодно, на раннем этапе это проблем не вызывает. Потому они и проталкивают эту идею "распилить" монолит. Потому что не осилили.
Есть примеры, где сервисы (не микросервисы, а большие сервисы) нужны - это компании вроде Яндекс (выносить сервисы, которыми могут пользоваться несколько приложений) или Вконтакте (из-за высокой нагрузки приходится писать микросервисы на Си).
Я решил еще поискать в Интернете, в чем плюсы микросервисов. Ужас, что там пишут.
https://vc.ru/services/153410-zachem-krupnym-kompaniyam-mikroservisy-konteynery-i-kubernetes-kak-eti-tri-tehnologii-vyvodyat-it-na-novyy-uroven
> Одно из преимуществ микросервисной архитектуры в том, что части приложения можно разрабатывать и обновлять независимо — например, обновить только один блок, а остальные не менять. В монолите же каждый раз требуется пересборка с решениями возникающих конфликтов, ведь приложение, можно сказать, образует единое целое.
Врут же. Какая еще пересборка? На PHP ничего не требуется пересобирать.
> Adidas — перенесли весь интернет-магазин на Kubernetes за полгода. Время загрузки сайта сократилось вдвое. Обновления стали развертывать 3-4 раза в день вместо раза в 4-6 недель.
Ну и чушь. Во-первых, интернет-магазину не нужны микросервисы, во-вторых, с чего бы время загрузки улучшилось? Микросервисы медленнее монолита из-за накладных расходов на передачу данных. Ну и непонятно, почему они раньше тратили по 6 недель на развертывание. У них там, наверно, ручное тестирование было. А потом просто решили не тестировать. От этого и снизилась задержка. Потому что ручное тестирование не позволяет делать 3-4 развертывания в день.
> Tinder. Из-за большого объема трафика инженерная команда Tinder столкнулась с проблемами увеличения мощностей и стабильности работы. Kubernetes стал выходом из ситуации: на него перенесли 200 сервисов — это 48 000 работающих контейнеров.
Оверинжиниринг во всей красе. Как можно в простом приложении для знакомств сделать 200 сервисов? Они что, на каждый экран по микросервису делают?
Я вообще перестаю видеть логику.
Заебал уже своей философией. Можно нанять одного разработчика который сделает красиво, но трудно нанять десять таких. Проще когда Васе нужно знать всего пару апи, он даже будет способен и зам задачу в жире накатать по хотелкам заказчика. Сейчас текучка во всех проектах. Сервисы это данность на больших проектах
В пхп нет GIL.
Особенно его DB-библиотека. Такой конченой хуйни в жизни не видел, оно состоит из костылей чуть менее, чем полностью.
Вот еще примерчик: ларавель ПРОСТ))0 взял и поменял таймзону на хуй знает какую при конвертации столбца времени в unix timestamp. То есть, умудрился похерить АБСОЛЮТНОЕ значение времени и высрать левый таймстамп.
Разумеется, таймзона на сервере пхп, mysql и в конфиге ларавеля идентична.
А все из-за того, что этот высер в самом своем нутре НЕ ИСПОЛЬЗУЕТ таймстамп блять, а выполняет овердохуя переконвертаций строковых значений времени. Библиотека карборн - вообще высер умалишенного блять
Ну а хули ты хотел то? РНР — personal home page. Писать хоть что-то серьезное на РНР... мягко говоря странный выбор.
zend franework или вызывай сишные функции через COM, ну или system (“date ...”) доя конвертации таймстампа
Там статья не про микросервисную архитектуру, а про кубернетис и контейнеры.
Контернеры и кубернетес радикально упрощают возможности по развёртыванию сайтов и приложений, кубернетес радикально упрощает возможности по добавлению мощностей, частичному обновлению сервисов и т.п.
Без этого очень сложно что-то в работающем проекте изменить.
ахахахааха
Может это все же ты накосячил, а? UNIX_TIMESTAMP это абсолютное время (в UTC), а вот \DateTime - это местное время + таймзона. И если у тебя \DateTime, например, хранит Московское время, то оно сконвертируется в UTC при преобразовании в UNIX_TIMESTAMP. И наоборот, при преобразовании TIMESTAMP в Datetime будет учтена текущая таймзона.
К примеру, твой таймстамп 1619011200 это:
- 21 апреля, 13:20 в UTC
- 21 апреля, 16:20 по Москве
>>2016384
Мы еще не выяснили, в чем причина проблемы, а ты уже бежишь предъявлять претентзии к PHP. Возможно, PHP тут не причем, а также возможно что твой язык в 10 раз хуже, чем PHP.
Так я сам PHP разраб, только топлю за zend.
Не смог в байтоебство на асм/си для микроконтроллеров так и остался в вебдеве
А разве зенд не благополучно скончался? Сколько лет ты спал? Да, я знаю что его переименовали, но всем похуй
>слабым программистам легче писать новый код с нуля, чем разобраться в существующем. Писать новый код всегда легче, можно косячить как угодно, на раннем этапе это проблем не вызывает. Потому они и проталкивают эту идею "распилить" монолит. Потому что не осилили.
Еще не видел, чтобы кто-то так восхищался тем, что занимается легаси говном.
Л Е Г А С И
Е
Г
А
С
И
Во что переименовали? Видимо я правда проспал. Магенто/лава и правда больше пользуется спросом.
> Гацист с исправлением
> ([^,])\\s(а|но)
Здесь регулярка сработает на любое слово, начинающееся с "а" или "но". Также, выражение [^,] срабатывает на любой символ, включая пробел. То есть в этой ситуации регулярка вставит лишнюю запятую:
,(2 пробела)a
> Поиск опечаток
Здесь недостаток в том, что регулярка сработает на любое английское слово с буквами вроде a, o (даже если в нем нет русских букв вообще), а должна срабатывать только на слова из смеси русских и латинских букв.
> Поиск опечаток с исправлением
Здесь та же проблема, программа в английских словах начнет заменять латинские буквы на русские.
Оки исправлю.
В ламинас. Эх, первая работа. Второй зенд и extjs. Сбежал оттуда через два месяца
Зачем она тебе? Она мертва
Почему-то обрезается дробная часть при обмене
Боюсь, что придется отлаживать код. То есть либо отладчиком смотреть, что там происходит, либо натыкать var_dump по коду.
Ну ты что, местного шиза не узнал? У этого месье и более скажем так, тонкие увлечения есть.
Джва часа пытался собрать рабочее приложение, а в результате выяснилось, что мне ещё дописывать всё это дело самому нужно.
ОП, в учебных материалах лучше убери Слим из советов, или огранич 3 версией которая ещё целая потому, что вкатывальщикам ебаться со всем этим не варик вообще. А я укатываюсь на Люмен.
Моя жопа вышла на крейсерскую скорость.
Люмен тоже говно на самом деле, мне кажется что просто symfony/httpfoundation с Доктриной надо ставить, если нужно без комбайна обойтись. Еще может у Laminas API Tools ничего, но не пробовал.
Да понятно, что тоже говно. Мне почему Слим и нравился, что можно самому папочки накидать как удобно, прописать по своему вкусу где что, а у Люмен всё гвоздями прибито. Так и не понял зачем Слимовцы эту ересь начали творить - превращать микрофреймвор в, фактически, обычный маршрутизатор с пачкой внешних зависимостей, которые должен ставить конечный разработчик.
Чего тебе не хватило изкаропки то? это же микрофрэймворк для res/rec по сути. Они просто подогнали под psr по сути свои интерфейсы, как я понял.
<img src="img/banner/photo.jpg">
Ну значит прав не было/в конфиге веб-сервера директория не фигурировала.
В документации написано что при сравнений строки и числа строка конвертируется в число.
https://www.php.net/manual/ru/language.operators.comparison.php
Тут пишут, что был какой-то баг при таком сравнении
https://www.php.net/manual/ru/migration80.incompatible.php
Теперь числа в строки перегоняют, а не строки в числа
рекомендуют явный тайпкаст к числу делать, тогда результат как в 7ой версии
Вообще, это плохо, что такое разрешается: "string" > 1 или "10" > 2. Так как тут непонятно, что хочет пользователь (особенно во втором примере):
- сравнить две строки по алфавиту
- сравнить два числа
Если сравнивать строки по алфавиту, то "10" < "2" так как 1 идет раньше, чем 2. Если сравнивать числа, то 10 > 2.
Такое надо избегать в коде. Явно сделай преобразование в нужный тип.
var_dump(-1 > null); // true
То есть, тут null не превращается в 0, как кажется интуитивно. Лучше бы конечно такая ситуация выдавала ошибку.
Архитектура уровня захуярить дто из реквеста в аргумент резолвере, провалидировать и отдать в контроллер
Шлюха ты дырявая, ебать тебя в рот хуесоса плешивого, пидораса сутулого, опущенца ебанутого. Данному багу миллион лет, один ты особенный солнечный ребенок не в состоянии пофиксить. Пиздец ты скудомыслящий. Как ты ебанько такое нерадивое харкач только нашло? Проблядь ты рождённая от спидозного пидора-транса папаши и зарыганной лошади. Хуета из под кота ты доморощенная.
https://youtrack.jetbrains.com/issue/JBR-2732
Нихуя себе у тебя, падали подзалупной, бомбануло. Пиши еще, киса
Ты еще и глазницы долбишься, петух, или читать не умеешь. Я спрашивал, почему шторм закрывается, а не тормозит. Как ты ебанько такое нерадивое харкач только нашло?
Да это 100% python/javascript «программист»
https://ideone.com/BgBgWC - Исправил исправления, хочу спросить, а правилен ли этот подход с массивами регулярок и заменой? Или можно сделать получше?
https://ideone.com/34fpy7
https://ideone.com/wbKUuC и эти два, вроде работает верно
Я в последних должен в регулярке поставить + чтобы все попадались опечатки. В общем пока читаю мануал по регуляркам и функциям.
Так же и отупеть можно. Потом вообще хер куда устроишься. Я так сидел пару лет и в хуй не дул, ненапряжно крудоебствовал сутками, пока не понял, что реально деградирую
Пытаюсь иногда петик попиливать на говне посвежее, чтобы если выгнали, было куда податься.
С другой стороны этого несвежего говна столько, что без хлеба с икрой не останусь
Можно, но архи сложно
>Ты можешь объяснить, почему мы сортируем половину перестановок, а другую половину - не сортируем?
Комбинации будут повторяться, если не сортировать.
>Это из-за того, что ты не используешь рекурсию. Ты можешь в Main() вызывать не getCombinations, а саму же Main(). То есть, тебе пришел массив из 4 элементов, ты вынимаешь один элемент и вызываешь Main() уже с массивом из трех элементов. Только надо чуть доработать функцию Main(). А функция getCombinations тогда будет не нужна вообще.
Не могу понять принцип работы, запутался окончательно с этим. Мой алгоритм со сдвигом вообще будет работать с более чем тремя элементами? Ведь при рекурсии он просто начнет повторять уже имеющиеся комбинации, или нет?
https://ideone.com/SnepM5
Я исправил вывод и добавление вырезанного элемента, но с остальным не понимаю что делать.
я совсем тупой что подобные задачи неделями не могу сам решить?
Я думаю, сложности из-за того, что я тебе дал непростую задачу. Рекурсию (когда функция вызывает сама себя) вообще довольно трудно представить в голове. Но некоторые задачи с ней решаются гораздо проще, чем без нее, потому желательно уметь ей пользоваться.
Тебе надо решать больше задач на алгоритмы, и тогда ты сможешь привыкнуть и к работе с массивами, и к рекурсии.
> Мой алгоритм со сдвигом вообще будет работать с более чем тремя элементами?
Не будет. Если у нас 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 комбинации будут разные.
Попробуй написать эту функцию в виде кода и можешь убедиться, что она будет работать корректно.
Я думаю, сложности из-за того, что я тебе дал непростую задачу. Рекурсию (когда функция вызывает сама себя) вообще довольно трудно представить в голове. Но некоторые задачи с ней решаются гораздо проще, чем без нее, потому желательно уметь ей пользоваться.
Тебе надо решать больше задач на алгоритмы, и тогда ты сможешь привыкнуть и к работе с массивами, и к рекурсии.
> Мой алгоритм со сдвигом вообще будет работать с более чем тремя элементами?
Не будет. Если у нас 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
Насчет регулярки. Ты использовал утверждение: разрезать строку в том месте, перед которым идет знак препинания. Надо добавить второе условие: разрезать строку в месте, перед которым идет знак препинания и после которого нет знака препинания.
Перекатываться однозначно стоит. На РНР если только формы шлепать. Гостевые/форумы нахуй никому не нужны. А больше и не видно сферы применения. Шучу конечно. CRM и прочие корпоративные порталы всё ещё котируются. Интернет магазины ещё кому-то нужны.
Java/C# вечны. Работы на них существенно больше.
Да хз стоит ли для старта в пых лезть, или сразу в шарпы. Ну и в шарп хуй попадёшь, дожить надо до этого момента
Я сам не разраб вовсе, а сетевой инженер. Так как опыт большой работы в разных компаниях, то повидал я разного. Даже в повседневной работе на виртуалочках у нас крутятся проекты на java/c#. Понятно, что есть zabbix и всякие прочие вещи на php, но это не разрабатываемые с 0 проекты. Это уже поддерживаемые продукты. Взять, например, продукты атлассина jira/confluence — java. Корпоративные порталы битрикс+1с повсеместно, есть какие-то самописные вещи на РНР, но это редкость. Я не говорю, что работы для РНР нет, она есть, но её сфера, как по мне, не стоит потраченного времени. Ява и с# более универсальные, работы в люьой сфере много. Как то так.
>>2021976
# сразу, можешь влиться в ряды QA automation ( selenium webdriver). А там подтянишь скиллы и куда кривая выведет: разрабы, девопсы, мытьё туалетов. Самое главное работа в команде, если будешь постоянно: а вот я думаю, а вот я решил — твое я и твое мнение мало кому нужно. Вот коллективный разум и умение работать в коллективе это 50% успеха.
>Корпоративные порталы битрикс+1с повсеместно, есть какие-то самописные вещи на РНР, но это редкость.
Выборка по пыхе маловата.
Так-то полно всякого продуктового на ларе/симфе
C# неплохой язык, но работа на нем может оказаться связанной с созданием кривых уродливых форм под Windows или придется работать с MS SQL и сервером под виндой.
Про шарпы люто, бешено удваиваю кстати. Поэтому, если конечно не фанат винды - лучше предпочесть джаву, раз уж ооп хочется и всего вот этого. Но там конечно тоже свое дерьмо - легко можно нарваться на мрачнейшее корпоративное легаси и утонуть в нем. Тут вопрос вкуса наверное, из какой бочки хлебать приятнее.
А про пых - вакансий море, да, но 90% - отбитый наглухо пиздец, где нахватаешься таких практик, что потом не отмоешься, да еще и зарплаты на таких мизерные. То же и к js относится вцелом.
Еще есть прекрасный рубио конечно, но он ксожалению сдувается и вакансии - сплошь легаси ебаное.
Ну какая есть. 10-15 лет назад картина была совершенно противоположная.
А не надо ручками дто создавать. В дто очень удобно описывать правила валидации модели, которая из него создается. Сплошные плюсы, код модели чище и она не может быть невалидна, так как создается из няшной валидной дтошки. И это только один пример
Насчёт нахуй никому не нужного мнения согласен. Ну я хз как поступить, не охота изначально обосраться. И минимизировать это, ну и нужно в любом случае куда-то вкатиться. Лютый пиздец...
Никогда таких проблем не было. У меня псалм в связке вот с этой штукой https://github.com/squizlabs/PHP_CodeSniffer
Шарп как-то продуман, ну хз стоит ли вкатываться начинающему изначально в него. Пых не сильно охота, ну по-моему придётся в него входить...
Оптимально, чтобы быстро заработать на хлеб с водой - пых/js/пистон (пистон с натяжкой, на джанге мало работы сейчас), хотя и js на бэке сейчас положнее пыха обычно.
Хочешь как тру бэкендер - любой популярный строгий язык (шарп, жава, го).
Хочешь быть тру погромистом - раст/кресты, но учиться будешь года три, и то если не тупой.
пыха развращает наверное, потом на строгий язык с мучениями переходить, наверное...
а так за ответ спасибо, анон
Может ли симфони сделать вариант с развитием в пхп более перспективным и радужным? Говорят, это почти как джава.
Тебе же не нравится пыха?
Пиши на том, на чем приятнее, работа везде есть, удаленка, новые технологии и легаси...
Не ссы, обсираются все и везде. Боязнь обосраться тебя будет демотивировать всю жизнь. Подумай наоборот. Вот тебе пример: есть тулза с номером билда 1.х.х которую пилили 5-10 лет, а потом хуяк и выкатили билд 2.х.х и в чейнджлоге читаешь: произведён рефакторинг кода. Производительность тулзы увеличена на 50%. Понимаешь? Даже такие матёрые разрабы как Линус Торвальдс пиля своё ядро писали такой код, что потом переписывали десятки других разрабов.
Лично я не вижу проблем с вкатом если: имеешь нормальную алгоритмическую подготовку, дружишь с алгеброй/геометрией/физикой, знаешь хотя бы 1 язык выше среднего. Т.е. для тебя нет проблем в плане самой разработки. Читай код на гитхабе, смотри, что ближе тебе.
Нет. Сфера РНР продукты для веба. Он этим и ограничится. Не взирая на попытки сделать язык более общего назначения. И то всякие ноды и питоны уже существенно наступают на пятки. Даже нахуй никому не нужный раби со своим одним единственным фрэймворком ROR местами имеет заявить.
спасибо смотиваровал... легче стало, а то в депрессий
>Ну я хз как поступить, не охота изначально обосраться
С таким будет тяжело в программировании.
Сам тоже борюсь с этой херней. Никак не приучу себя сначала быстро выдавать едва работающий говнокод, а потом фиксить в узких местах.
Пытаюсь заранее продумать, чтоб хорошо было. В итоге это сжирает кучу ресурсов у мозга, а кода как не было, так и не появилось.
Может, если найдешь нормальную работу, где обмазываются DDD, CQRS и всякими сагами с евент сорсингом. Но тебя туда не возьмут
>Но тебя туда не возьмут
Это самое обидное.
Пробовался пару раз на подобные ваки, на собесе завернули.
Хз как набрать нужный бекграунд, если на текущей работе сплошное говнолегаси
Ну можно попробовать читать Вернона с Эвансом, смотреть чужой код и пилить что-нибудь свое, начав с "тактического" ДДД
Не сказал бы что это можно называть строго. Обычные правила читабельного кода. У меня и psalm и stan вместе лабают, отключена только ересь, вроде комментов в закрывающих конструкциях и phpdoc. И при этом говнокодить на коленке они не особо мешают (например писать какие нибудь разовые скрипты).
Сам съеби, болезный.
Нахуй ты родился?
Все таки не зря похапешников долбоебами считают, если они даже не в состоянии определить основное назначение инструмента. И ты тому лишнее подтверждение. Возможность запилить дженерики и енамы в языке без дженериков и енамов, юнион типы (в старых версиях пхп), описание массивов - это про типы или про читаемость?
Могу предположить что из-за того, что приватный метод вызывается внутри базового класса и под капотом происходит какая-то херь с именами классов.
Если поместить метод newSubclass в другой класс, то должен выбивать ошибку.
В целом очень странный кейс: создать потомка внутри родителя и вызывать от потомка метод родителя
Я взял это из доков но там это поведение не объясняется.
https://www.php.net/manual/ru/language.oop5.visibility.php#language.oop5.visiblity-methods
<div class="hero-quotes mt-5">
<div id="quotes-carousel" class="quotes-carousel carousel slide carousel-fade mb-5" data-ride="carousel" data-interval="8000">
<ol class="carousel-indicators">
<li data-target="#quotes-carousel" data-slide-to="0" class="active"></li>
<li data-target="#quotes-carousel" data-slide-to="1"></li>
<li data-target="#quotes-carousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
@for ($i = 0; $i <= 2; $i++)
<div class="carousel-item active">
<blockquote class="quote p-4 theme-bg-light">
{{$review[$i]->description}}
</blockquote><!--//item-->
<div class="source media flex-column flex-md-row align-items-center">
<img class="source-profile mr-md-3" src="storage/{{$review[$i]->image}}" alt="image" >
<div class="source-info media-body text-center text-md-left">
<div class="source-name">{{$review[$i]->name}}</div>
<div class="soure-title">{{$review[$i]->position}}</div>
</div>
</div><!--//source-->
</div><!--//carousel-item-->
@endfor
</div><!--//carousel-inner-->
</div><!--//quotes-carousel-->
<div class="hero-quotes mt-5">
<div id="quotes-carousel" class="quotes-carousel carousel slide carousel-fade mb-5" data-ride="carousel" data-interval="8000">
<ol class="carousel-indicators">
<li data-target="#quotes-carousel" data-slide-to="0" class="active"></li>
<li data-target="#quotes-carousel" data-slide-to="1"></li>
<li data-target="#quotes-carousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
@for ($i = 0; $i <= 2; $i++)
<div class="carousel-item active">
<blockquote class="quote p-4 theme-bg-light">
{{$review[$i]->description}}
</blockquote><!--//item-->
<div class="source media flex-column flex-md-row align-items-center">
<img class="source-profile mr-md-3" src="storage/{{$review[$i]->image}}" alt="image" >
<div class="source-info media-body text-center text-md-left">
<div class="source-name">{{$review[$i]->name}}</div>
<div class="soure-title">{{$review[$i]->position}}</div>
</div>
</div><!--//source-->
</div><!--//carousel-item-->
@endfor
</div><!--//carousel-inner-->
</div><!--//quotes-carousel-->
А причем тут пхп, если проблема в верстке?
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.
А вот с этого места поподробнее.
>где обмазываются DDD, CQRS и всякими сагами с евент сорсингом
Это какие-то практики, использование которых делает тебя крутым вне зависимости от выбранного языка?
Нас тут много %)
Я поддерживаю: натыкать на на каком-нибудь ларавеле "с нуля" приложение по гайдам с ютуба неизмеримо проще, чем поддерживать софт с многолетней историей. Соответственно, и платят меньше.
зачем же тогда РНР, если нельзя отстрелить себе ноги и жопу
Я понимаю как работает доступ к private. Не понятно только почему подкласс может через -> обращаться к приватному свойству/методу базового класса. Даже если подкласс и в скобках { } базового, он, по моей логике, должен попытаться обратиться к своему свойству field.
>Функция getCombinations(list):
>.... пусть дан массив элементов list
>.... если в list один элемент, то вернем единственную >комбинацию из этого элемента
>.... создаем пустой список комбинаций result
>.... берем по очереди элементы list, выбранный элемент >помещаем в переменную first:
>........ вызываем getCombinations(), передавая ей список list с >вырезанным элементом first. Эта функция вернет нам список >возможных комбинаций.
>........ к каждой из полученных комбинаций в начало >приписываем first и добавляем в result
>.... конец цикла
>.... возвращаем result
Я это понял как:
https://ideone.com/h9J4W5
Ничего не работает. Я посмотрел простой пример работы рекурсии в нахождении факториала, там более-менее понятно, а что происходит здесь, и почему мы вызываем функцию внутри цикла, которая затем возвращает все имеющиеся комбинации (каким образом?) - мне непонятно.
Функция неполная и мне нужно ее как-то переделать или я не могу понять ее принцип?
>делает тебя крутым
Как минимум расширяет кругозор
>вне зависимости от выбранного языка
Да, но если есть выбор, то ебаться со всякими басами лучше на шарпе
А вообще проекты, на которых эти практики применяются, как правило намного интереснее и сложнее стандартного крудоебесия. И лучше оплачиваются. Уот такое мое мнение
> Не понятно только почему подкласс может через -> обращаться к приватному свойству/методу базового класса.
Код в подклассе не может обратиться к приватному методу родителя. Это может сделать только код в родителе.
В случае с 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 он обращается к приватному методу.
> Не понятно только почему подкласс может через -> обращаться к приватному свойству/методу базового класса.
Код в подклассе не может обратиться к приватному методу родителя. Это может сделать только код в родителе.
В случае с 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 особо в нем не разбираюсь, прокомментировать не могу.
У тебя есть ошибки в реализации функции.
Во-первых, проблема тут:
>if(count($list) == 1){
> return current($list);
>}
Мы решили, что функция возвращает список комбинаций. Одна комбинация - это массив: [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
Если все это исправить, программа должна заработать. Пиши, если еще есть какие-то вопросы.
У тебя есть ошибки в реализации функции.
Во-первых, проблема тут:
>if(count($list) == 1){
> return current($list);
>}
Мы решили, что функция возвращает список комбинаций. Одна комбинация - это массив: [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 элементами.
> почему мы вызываем функцию внутри цикла
Мы используем цикл, чтобы по очереди вынуть каждый элемент из списка. Если нам дан список 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 элементами.
А где я утверждал, что эти практики применимы к любому проекту? Если там обычное формошлепство, то естественно там не нужны саги и проч.
>как будто код без CQRS априори плохой. Хотя по факту он проще и читабельнее
А еще проще хуярить всю логику прямо в экшенах контроллеров. По факту оверхед от cqrs и тактического ддд совсем небольшой и он совсем не ухудшает читабельность, а наоборот облегчает в том числе навигацию по проекту и разграничение фич. Пара лишних классов ни на что не влияет
>Шины с событиями это вообще мрак. Код из-за событий становится менее понятным. Одно дело - ты вызываешь функцию x() и переходишь к ней в один клик в IDE. Другое дело - ты отправляешь событие в очередь и неизвестно, что с ним дальше произойдет. А если у тебя в системе 200 событий? А если у тебя 200 микросервисов к этой шине подсоединены? Разобраться в этом очень сложно.
А кто сказал, что будет легко? За рост гибкости нужно платить сложностью. Залогом успешной разработки таких систем является грамотное проектирование
>Если же я отправлю событие с неправильным именем или отсутствием нужных параметром в очередь - все пройдет успешно.
Ну это вообще смешно. У нормальных людей обычно лежит класс с константами, в которых хранятся различные евенты. А скоро енамы в похапе завезут - будет еще лучше
>Ты пишешь, как будто события это такая хорошая вещь, которая улучшает код. Но по факту это плохая вещь, к которой приходится прибегать, потому что по другому не работает.
Я нигде этого не пишу, всему свое место. Бложикам и лендингам действительно эти подходы к разработке и нахер не нужны. Но никогда и никому не завредит познакомиться с этими практиками хотя бы для общего развития. Не стоит замыкаться в мирке тупых толстых контроллеров. Всем денег, посоны!
Я слышал, что можно гуглить ключевые слова и находить статьи и видео по интересующей тематике. Сам не пробовал, так что не могу утверждать, что это сработает
Спасибо, анончик.
Пока эту сделал.
все оки работает и пашет кроме контейнера с нодой - когда смотрю через docker-compose ps у него нет портов и статус постоянно restarting. как фиксить ? нода и нпм нужна для того чтобы ставить какие то зависимости и пересобирать app.js. никакого фреймворка фронтендовского на проекте нет, все на блейдах. в гугле тоже нихуя нет =/
А ты ноду запускаешь только иногда чтобы что-то установить или пересобрать, или же хочешь, чтобы она была постоянно запущена и мониторила файлы?
В первом случае ты вообще не должен добавлять ноду в docker-compose. Зачем ей быть постоянно запущенной, если ты будешь ее запускать вручную.
Во втором случае тебе надо запускать не образ, а конкретную команду. Это та же команда, которую ты до докера запускал в консоли вручную. Она указывается в docker-compose с помощью command: https://docs.docker.com/compose/compose-file/compose-file-v3/#command . Или, может быть, с помощью entrypoint, не знаю.
> у него нет портов
Нода это не сервер, она не слушает порты.
---
Какое же все уродливое в этом Докере. Вот, например, скрипт сборки ноды: https://github.com/nodejs/docker-node/blob/8b68fca7a5089bd8795ae85b55617314e966487b/16/alpine3.11/Dockerfile
Посмотрите, сколько он лишнего мусора добавляет в образ! Там и gcc, и python, и curl, и tar! А если у тебя несколько разных образов, то скорее всего в каждом будут эти лишние зависимости.
А как уродливо смотрятся длинные цепочки команд, написанные через &&! Почему нельзя писать просто команды без &&? А, потому что тогда Докер насоздает тысячу промежуточных образов.
А еще у Докера какие-то свои костыли для организации сети между контейнерами, там по моему у них свой демон написан для этого. Разве не уродливо?
Под виндой Докер запускает виртуальную машину вместо того, чтобы ставить windows-версии php, nodejs и так далее. Разве это не уродливо, тащить целую машину с линуксом, с ядром, с демонами, туда, где это не нужно? Еще наверно и тормозит неслабо.
И все это из-за того, что под линуксом пути хардкодятся в программу при сборке и нет портабельных программ. Или нет системы вроде nix, которая позволяет ставить рядом разные версии программ.
Например, в Линуксе есть такие проблемы, мешающие разработчикам:
- часто нельзя ставить несколько версий программы, например нельзя поставить пакетным менеджером ноду 10 и ноду 11 одновременно
- нельзя поставить программу или библиотеку не глобально, а в папку с проектом (как это умеет делать Композер)
- разные дистрибутивы линукса используют разные пакетные менеджеры. В одном есть нода версии 10, в другом нету. В одном библиотека назввается libx, а в другом liby, причем liby. В одном есть библиотека libz, в другом ее нет, в третьем она есть, но пропатчена и не работает.
- нет какого-то единого формата файла, чтобы дать файл разработчику, он запустил команду и ему поставились все нужные зависимости
Как видно, Линукс плохо ориентирован на разработку в принципе. Это вполне реальные проблемы.
И что делает Докер? Он исправляет пакетные менеджеры? Улучшает линукс? Нет, он берет и создает контейнер с виртуальным Линуксом и внутри ставит нужное приложение и все его зависимости. Причем не просто ставит, а компилирует и собирает. Причем собирает не какой-то единой для всех приложений командой, а каждый раз по-разному, качает какие-то архивы tar.gz откуда-то, а не из универсального репозитория. Костыли на костылях (то есть сборка программ в линукс это костыли и тут мы еще костыль в виде контейнера добавляем).
Или другая проблема. Нельзя как-то универсально описать список зависимостей, чтобы это работало под любым дистрибутивом Линукса, Windows и мака. И что делает Докер? Может быть, он исправляет Windows и MacOS? Нет, он просто запускает тяжелую виртуальную машину с линуксом внутри. Разве это не уродливо?
Ну это же бред. Так мы дойдем до того, что каждую программу будем запускать в своей виртуальной машине с ядром, кучей демонов и эмуляцией аппаратного обеспечения.
А как должно быть? Пишешь в файлике нужные зависимости. Запускаешь команду в любой ОС и они устанавливаются из универсального репозитория.
Вы конечно можете сказать, что Докер вообще-то не для разработчиков написан, и не для того, чтобы улучшать линукс, а он для того, чтобы подсадить богатые компании на использование контейнеров и кластеров, чтобы они платили заоблачные тарифы в "облаках" и покупали дорогие сервисы от Докера. Тут конечно возразить трудно, но от этого он менее уродливым не становится.
Например, в Линуксе есть такие проблемы, мешающие разработчикам:
- часто нельзя ставить несколько версий программы, например нельзя поставить пакетным менеджером ноду 10 и ноду 11 одновременно
- нельзя поставить программу или библиотеку не глобально, а в папку с проектом (как это умеет делать Композер)
- разные дистрибутивы линукса используют разные пакетные менеджеры. В одном есть нода версии 10, в другом нету. В одном библиотека назввается libx, а в другом liby, причем liby. В одном есть библиотека libz, в другом ее нет, в третьем она есть, но пропатчена и не работает.
- нет какого-то единого формата файла, чтобы дать файл разработчику, он запустил команду и ему поставились все нужные зависимости
Как видно, Линукс плохо ориентирован на разработку в принципе. Это вполне реальные проблемы.
И что делает Докер? Он исправляет пакетные менеджеры? Улучшает линукс? Нет, он берет и создает контейнер с виртуальным Линуксом и внутри ставит нужное приложение и все его зависимости. Причем не просто ставит, а компилирует и собирает. Причем собирает не какой-то единой для всех приложений командой, а каждый раз по-разному, качает какие-то архивы tar.gz откуда-то, а не из универсального репозитория. Костыли на костылях (то есть сборка программ в линукс это костыли и тут мы еще костыль в виде контейнера добавляем).
Или другая проблема. Нельзя как-то универсально описать список зависимостей, чтобы это работало под любым дистрибутивом Линукса, Windows и мака. И что делает Докер? Может быть, он исправляет Windows и MacOS? Нет, он просто запускает тяжелую виртуальную машину с линуксом внутри. Разве это не уродливо?
Ну это же бред. Так мы дойдем до того, что каждую программу будем запускать в своей виртуальной машине с ядром, кучей демонов и эмуляцией аппаратного обеспечения.
А как должно быть? Пишешь в файлике нужные зависимости. Запускаешь команду в любой ОС и они устанавливаются из универсального репозитория.
Вы конечно можете сказать, что Докер вообще-то не для разработчиков написан, и не для того, чтобы улучшать линукс, а он для того, чтобы подсадить богатые компании на использование контейнеров и кластеров, чтобы они платили заоблачные тарифы в "облаках" и покупали дорогие сервисы от Докера. Тут конечно возразить трудно, но от этого он менее уродливым не становится.
>часто нельзя ставить несколько версий программы, например нельзя поставить пакетным менеджером ноду 10 и ноду 11 одновременно
Он не знает про переключение между версиями... Жаль.
Это обычно достигается за счет сторонних репозиториев, где на каждую версию создается свой пакет. Соответственно, это работает для PHP, но не будет работать, например, для библиотеки вроде openssl и других программ.
Заработало, спасибо. Теперь буду пытаться вникнуть как она работает (вопросов пока нет).
>только иногда чтобы что-то установить или пересобрать
this
так как мне в итоге только свой докер файл модить чтоли и туда уже тянуть ноду с нпмом ? пытался так, но из за того что делаю с образа php7.4-fpm там нету тупа образа ноды
запускаю из под макоси биг сюр если чо
>с образа php7.4-fpm там нету тупа образа ноды
Нода там и не нужна. Подтяни отдельный контейнер с нодой в докер композ
Проверьте пожалуйста!
окей, а как это тогда сделать ? я же говорю что изначально так пытался сделать, но он постоянно в рестартинг уходит =/
Дефолтный вариант по доке - это установить пакет laravel/ui и развернуть его php artisan ui vue --auth. И лара создасть набор роутов и twig-шаблонов.
Проблема - я хочу запилить на Vue spa. Простенькое spa я могу сделать, api бекенд на ларе - тоже могу.
Не понимаю как должна быть сделана авторизация в данном случае , как вообще spa - авторизируется? Подскажите где почитать ?
Лара предоставляет аж три пакета:
Socialite, Passport, Sanctum - на какой стул мне сесть? И какая между ними разница? Все они используют JWT?
я только начал вкатываться и все, все, блять, поголовно говорят, что пхп учить как первый яп это пиздец хуево блять. Потом все говорят, что выучив пыху, я буду работать только на поддержке старых проектов. Лол, их щас хуева гора. Лет 10 ещё на пыхе точно будет хуева гора работы. Тот же битрикс будет в топе ещё дохуя лет (минимум пять, как по мне). А вордпресс? Там вообще ебанись какое коммьюнити. На битриксе и вордпрессе онли со стороны бэка вполне изично можно получать 120к+. Для меня это большие деньги. А потом можно подучить Laravel и спокойно пиздовать бэкендером в 200к+. При необходимости потом, если нужно будет, можно будет перекатиться в НОВОМОДНЫЙ околоГОУЛЕНГ язык и получать там дохуя бабок.
Можете меня обоссать, но я прав. Пыха будет минимум до 2030 года в топах, а за это время можно дохуища бабла на пыхе заработать.
Нужно окунуться в историю откуда пошла фраза "PHP это мертвый язык". Ты видимо её плохо знаешь, так же как и те кто эту фразу наверняка говорит.
Дело в том, что PHP создавался от безысходности, потому как в те времена не было языка для бэкенда и все пользовались CGI, соответственно код писался на C, а ты понимаешь, что такое писать код на C для сайта, трудное занятие.
Именно из-за этого и создался PHP, другой альтернативы никто даже не предлагал, даже Ruby или Pearl который так критикует PHP.
Создатель PHP создал этот язык как временную панацею от этой проблемы, все говорили, что этот язык не нужен, но в то же время множество компаний спрашивало как им пользоваться, парадокс, правда? Поэтому была создана документация и в неё добавлялся весь нужный функционал, математические функций например, или строковые.
Создатель PHP говорил с выходом новой версий, что когда появится альтернатива, PHP умрёт и даже он им не будет пользоваться. Давал срок в полгода. Но её так и не появилось и таким образом, каждые полгода выходила новая версия. И это продолжается по сей день.
Я когда-то использовал это https://github.com/tymondesigns/jwt-auth
Но это было больше трех лет назад. Не знаю, что сейчас в моде у ларавельщиков
>Почему все говорят, что язык умирает?
Умирает после каждого запроса
>выучив пыху, я буду работать только на поддержке старых проектов
А вот это скорее всего правда. На пыхе очень много легаси, сам на легаси сижу, хотя и в активной стадии разработки
>потом можно подучить Laravel
Лучше начинать с лары или симфони. Оставь битрикс и вордпресс голодным васаянам, которым норм в говне цмс ковыряться
>можно будет перекатиться в НОВОМОДНЫЙ околоГОУЛЕНГ язык
А вот с этим будут проблемы, т.к. там нужны немного другие фундаментальные языка. Пыхакультура не способствует их освоению
>Пыха будет минимум до 2030 года в топах
Не факт, что в топах, но на наш век работы хватит, а может и нашим детям достанется
А по бабкам и возрасту?
Все пишут, что в 25-26 вкатываться уже поздно в пыху.
И джуны начинают с 30к, это правда?
>Все пишут, что в 25-26 вкатываться уже поздно в пыху
Нагло пиздят, я в 24-25 вкатывался и уже давно работаю
>И джуны начинают с 30к, это правда?
Зависит от того, куда пойдешь. В среднем разброс по рф от 500 до 1000 $ за джуна
Говнокодил на Сишечке, 7 классов, вкатываюсь с 21, сейчас 23, мне пизда я даун?
Может ты неправильно вкатывешься? По собеседованиям ходишь? Что знаешь? На чем валишься? Изучить синтаксис не проблема, а вот задрочить всю сопутствующую экосистему может быть сложновато
>>А вот с этим будут проблемы, т.к. там нужны немного другие фундаментальные языка. Пыхакультура не способствует их освоению
Ща пыха культура уже другая, я до того как зндстру прочел - чувстовал себя пидорашкой.
Кстаит в похопе скора выкатят файберы, маня асинхронность.
Дохоронят пхп до того что лет через пять она ноду начнет выгонять из ниши быстрых-асинхронных приложений, лол.
На работе нужен уровень крудоклепателя. Большинство тасок программируется иф елсами, там много ума не надо. Архитектурные таски разбирают синьоры, инфраструктурные - девопсы
>я до того как зндстру прочел - чувстовал себя пидорашкой
Анончик, опиши подробнее, что именно изменилось после.
А теперь еще читани Мартина, банду четырех и Эванса с Верноном - будешь одним своим существованием унижать жопаскрип макак и петухоноблядков
https://github.com/freezemage0/config/
Сотыгу имею
а я в другом городе как раз :р
Пока не ходил на собесы, решаю задачки на всяких сайтах, думаю начать скоро. А так параллельно симфоньку.
Что такое пет?
А если я уже могу круд приложение заебумбенькать, могу ли я рассчитывать на позицию джуна за 40к?
мимодругойанон
Минусы очевидны.
А объективные плюсы:
-- Прощает ошибки и не зависает
-- Можно программировать в любом стиле, на любом уровне абстракции, значит легко учить постепенно
-- 30-40К пока ещё хорошая зарплатка для некоторых регионов
-- Огромное количество обучающих материалов и готового кода
-- До сих пор 80% сайтов на РНР, куча работы
>А если я уже могу круд приложение заебумбенькать
Можешь или забубенькал? Разница существенна
>-- Прощает ошибки и не зависает
Прибавь докер и xdebug и будет зависать, а без них хуй отладишь
>-- 30-40К пока ещё хорошая зарплатка для некоторых регионов
Лет 5 назад с этого начинал, на чипсеки и бургеры хватало
>-- Огромное количество обучающих материалов и готового кода
Много мусора, но есть толковые
Писал раза два уже. Сначала с использованием mysqli, потом с использованием PDO.
Могу синглтон реализовать, правда не до конца понимаю, нахуя он нужен. Фасад могу ебануть (как я понял, он нужен для того, чтобы скрыть как работает система), остальное не помню
Да форум. О кстати! Посоветуй что для портфолио такое можно замутить сложное?
(Я на Си умею в типы данных итд, т.е сложность не имеет значения меня уже изнаСиловали)
Вроде работает, но там я как понимаю все проще можно было сделать.
Пишу калькулятор пока.
> Ну там синглтоны фасады хуемое я нихуя не помню
Ебаный ты козел блять, я бы тебя и за десятку не взял.
Когда я устраивался в первый раз, то показывал два свои проекта - сокращатель ссылок на симфони и парсер новостей на тогда еще живом сайлексе
А зачем? Чем оно отличается, например, от https://github.com/symfony/config ?
Особо не вчитывался, но заметил, что нарушаешь psr 2 (12) и консистентность объявления сигнатур методов, в одних местах возвращаемые типы есть, в других - хер. Рекомендую натравить статический анализатор и охуеть.
> Неконсистентность типизации
А как стипизировать mixed на PHP 7.2?
> Чем отличается?
Key chaining
> Нарушаешь psr 2 (12)
> PHP Standard Recommendations
> натравить анализатор
Травил писали, default reporting level и не охуел.
Конкретно по самой архитектуре будет что сказать?
*Травил псалм
Ок записал.
Спасибо.
Сделай круд на симфе с доктриной, тогда и поговорим
Ларакасты - основы пыхи, ооп и ларавел
Елисеев - практика на yii/laravel/symfony
Отус - более обзорно как в вузе, есть по языку и по фреймворкам ищи на торентах
Форум неплохой проект для пета. Содержит многие фичи крудов. Там можно много всего нахерачить: аутентификация, разграничение прав, менеджмент файлов, поиск, сервисы рассылок, кеш и т.д. на сколько сил хватит.
Тоже писал сокращатель ссылок на симфе. Уже не помню, чье это тестовое. Даже в докер обернул его
>А как стипизировать mixed на PHP 7.2?
Стараться избегать mixed
> Нарушаешь psr 2 (12)
> PHP Standard Recommendations
Если ты пишешь код, которым будет пользоваться кто-то кроме тебя, то псры 1, 2 мастхев
Как избежать mixed, если, например, json_decode() его возвращает?
> пср 1, 2 мастхэв если кто-то будет пользоваться твоим кодом
Пользоваться и дорабатывать - разные вещи. Для использования кода достаточно создать один инстанс, для доработки - перечитать весь существующий код.
>Как избежать mixed, если, например, json_decode() его возвращает?
Ты же знаешь, что хочешь из json_decode получить? Или тупо проксируешь вызов? Так то можно типы проверить в методе, сделав интерфейс твоей либы чище
>Пользоваться и дорабатывать - разные вещи. Для использования кода достаточно создать один инстанс, для доработки - перечитать весь существующий код.
По работе частенько смотрю в кишочки фреймворков и либ. И гораздо проще и быстрее это делать, если код написан в едином стиле от кишочков yii1 плююсь, т.к. их писали до создания пср
>Как избежать mixed, если, например, json_decode() его возвращает?
Ну по хорошему он должен возвращать объект или массив, но какие-то сверхразумы подумали что хорошо бы еще парсить 'true' в true без топ-левел жсон объектов или массивов
> Ты же знаешь, что хочешь из json_decode() получить?
Нет, в этом и суть.
Была идея представить все значения в виде какого-нибудь ConfigValue, который знает о типе, но это тупость какая-то.
Я работал тестером в огромной компании, у которой сайт был на Битриксе. Зп миддла пхп разраба бали 180-220к. ООП как такового не было в принципе. Задачи были простейшие: вывести товары на экран, обработать фильтры и прочая поебистика. Где там нахуй нужен синглтон, м?
Если у меня будет выбор: стать супер-профессионалом в шкодинге или быть быдло-говнокодером и получать 200к, то я выберу 2 и даже, сука, глазом не моргну
>быть быдло-говнокодером и получать 200к, то я выберу 2 и даже, сука, глазом не моргну
И через пару лет охуеешь и пойдешь плотничеством заниматься
Попробуй хотя бы через интерфейс определить возращаемый тип, а то рили хуйня какая-то. Не понятно, что ждать, современными тайпчеками пыхи не обмажешься.
Ладно json_decode, когда он писался у пыхи про типы не думали. Но мы то solid-ные разрабы
Раз таков твой выбор и ты не сгоришь от этого за пару лет, то вай нот. Должен кто-то и легаси на битриксе поддерживать
200125. За 5 лет 12кк, Минус налоги, минус хавка, дорога и прочая дрочь. Лямов 9 точно останется. Мне их хватит до конца жизни.
Спасибо.
Перепиливать типы данных пыхи под классы звучит ну сверх тупостью. Знаю, что у Себастиана Бергмана есть такой пакет, с типами данных который, но чёт даже хз. Имхо, непрактично со стороны пользователя либы.
>Перепиливать типы данных пыхи под классы звучит ну сверх тупостью
Имел в виду либо вернуть 1 тип данных, либо обернуть несколько типов за интерфейсом
В чем проблема возвращать 1 тип данных? Так и разрабу понятнее и ide нормально автокоплитит.
Нет, мы вернем тебе строку, или инт, или аррей, или нахуй иди
> Прибавь докер и xdebug и будет зависать, а без них хуй отладишь
ни разу не видел зависший xDebug;
живу без докера, с другими виртуалками, все живы, на бекенде ничего никогда не висло
Это происходит так.
Есть тормознутый легаси проект.
Ставлю иде в режим дебага, расставляю точки, делаю запрос. Запрос вместо ожидаемых секунд 15 идет больше минуты. Внутри докер контейнера что-то подвисает и приходится перезапускать, чтобы поймать дебагером запрос
Ты бы хоть попытался поискать
https://stackoverflow.com/questions/17362402/why-is-phps-mt-rand-not-cryptographically-secure
Это да, я нагуглил уже, но там идет речь, что в теории можно предсказть. Мне интересно, есть ли готовый эксплоит, который все это делает.
Вот уже прошел год, успел всякое попробовать, выяснил что единственный приемлемый вариант для меня - это Симфони.
С ларавелом уяснил что он мне совсем не нравится, срань типа всяких CMS никогда даже не рассматривал.
Вот только выяснилось, что джуны на Симфони никому не нужны. По крайней мере в моем городе. За этот год вообще таких вакансий не появлялось, хрен знает на что я, дурак, совсем надеялся.
Переезжать по некоторым причинам сейчас никуда не могу. Руки совсем упали, дальше пилить проекты на Симфе кажется лишенным смысла, так вообще вечным ждуном можно стать.
В ларавел не хочу, там сапоги защищать надо. Может по каким-то другим языкам двигаться?
Вообще хочется в golang, но это в будущем. Джуны там не больше нужны чем на симфони.
Куда с моими входными податься? Вроде кандидат я не самый хреновый. Молодой, вышка там, знания широкие по IT в целом, не одним пыхом деланный.
Или может есть какие-то варианты таки в Симфони попасть? Может писать всем компаниям, которые ищут миддлов и сеньйоров, что я такой-то класный-прикольный, готов вылизывать эйчарше ноги и работать за еду?
Поделитесь опытом, короче.
Так откликайся на мыдловакансии, если ты такой не самый хреновый.
>В ларавел не хочу, там сапоги защищать надо
Што
>знания широкие по IT в целом, не одним пыхом деланный
Что-то мне кажется, что здесь попахивает эффектом Даннинга-Крюгера
Ты за пых спрашиваешь или за другие языки?
Если за пых, то стандартные вещи, которые должен уметь джун, ну еще линуксы. Из того, с чем еще не сталкивался: докер, нереляционные БД, всякие кролики, а так же всё что связано с деплоем. Но такое у джунов никто и не требует.
>>2028938
>Так откликайся на мыдловакансии, если ты такой не самый хреновый.
>Что-то мне кажется, что здесь попахивает эффектом Даннинга-Крюгера
Да что ты сразу унижать меня принялся. Я просто с иронией написал что я не совсем вкатывальщик с улицы и с программированием и смежными вещами знаком много лет.
А эти универские "широкие знания" мне разве что на собесе помогут, я это за особое достоинство не считаю, т.к. понимаю что никому на практике широкие знания не нужны, нужны узкие и глубокие.
Так откликайся на мидло ваки. Наври про опыт в резюме. Потрай собесы, собери платину из вопросов, вызубри и по новой. И не брезгуй удаленкой.
За год уже мог бы вкатиться
>я такой-то класный-прикольный, готов вылизывать эйчарше ноги и работать за еду?
В тебе задетектят неуверенного в себе вкатуна и укажут на дверь.
Проси рыночную зп, чтобы сойти за своего
>что я не совсем вкатывальщик с улицы
А производишь иное впечатление
>и с программированием и смежными вещами знаком много лет
А толку то? Работу ведь не нашел
>А эти универские "широкие знания" мне разве что на собесе помогут
Не помогут, там другое спрашивают
>Отсутствие реального коммерческого опыта детектится за минуту
Оно не детектится, если:
1. Ты писал код
2. Ты знаешь ответы на платину
3. Можешь наврать про то, чем занимался на работе и про процессы
Сойдешь за мидла
>Так и нету работы, 3 года коммерческого минимум просят, и знания соответствующие
Тебе же написали, что нужно есть суп ложкой. Положи нож
Потому, что вихрь Мерсенна не является криптографическим генератором случайных чисел.
В википедии есть ссылка, где написано: https://en.wikipedia.org/wiki/Mersenne_Twister#Disadvantages
> 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 прикручен этот генератор, как генерируется сид и заполняется начальное состояние.
Также, гугление выдает такие статьи:
- https://labs.bishopfox.com/tech-blog/2014/08/untwisting-mersenne-twister-killed-prng - Untwister, пытается подобрать сид перебором, имея несколько полученных от генератора чисел
- https://github.com/kmyk/mersenne-twister-predictor - утверждает, что может предсказать состояние генератора по 624 полученным от него подряд числам
- https://www.ambionics.io/blog/php-mt-rand-prediction - тут утверждается, что по 2 значениям (с промежутком в 226 вызовов) восстанавливается состояние генератора.
Советую почитать.
Потому, что вихрь Мерсенна не является криптографическим генератором случайных чисел.
В википедии есть ссылка, где написано: https://en.wikipedia.org/wiki/Mersenne_Twister#Disadvantages
> 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 прикручен этот генератор, как генерируется сид и заполняется начальное состояние.
Также, гугление выдает такие статьи:
- https://labs.bishopfox.com/tech-blog/2014/08/untwisting-mersenne-twister-killed-prng - Untwister, пытается подобрать сид перебором, имея несколько полученных от генератора чисел
- https://github.com/kmyk/mersenne-twister-predictor - утверждает, что может предсказать состояние генератора по 624 полученным от него подряд числам
- https://www.ambionics.io/blog/php-mt-rand-prediction - тут утверждается, что по 2 значениям (с промежутком в 226 вызовов) восстанавливается состояние генератора.
Советую почитать.
Сорян, унижать не собирался. Ты на собесы-то ходил? Во первых, не стесняйся откликаться на вакансии для мидлов. Ты даже не можешь представить, какие чудовищные долбоебы иногда иногда откликаются даже на синьерские вакансии, и они не терзаются сомнениями, а берут и приходят работы, правда, не получают. Во вторых, напизди про коммерческий опыт я так сделал когда-то, брат жив
Приведи конкретный код
Делал одно приложение, куда воткнули ребит.
Парсер выдачи гугла.
Скармливаешь приложению кучу запросов (список строк). Каждый запрос кладешь в очередь. Соответственно достаешь из очереди и делаешь запрос в гугл, результат кладешь в базу (или куда хз).
Цель была в том, чтобы отслежить позиции определенных сайтов в выдаче гугла по запросам.
Не лучше ли тут использовать очередь на основе таблицы в БД? Тогда для каждого запроса можно отслеживать статус, кол-во неудачных попыток. А то в Rabbit закинул задачи и непонятно, на сколько процентов задача выполнена и сколько еще ждать.
>Тогда для каждого запроса можно отслеживать статус, кол-во неудачных попыток. А то в Rabbit закинул задачи и непонятно, на сколько процентов задача выполнена и сколько еще ждать.
В ребите есть средства мониторинга
> вкатываются по связям
в твоём манямирке обиженки
мимо 20 лет опыта, успел поработать по связям и без, первую РАБоту в IT в 2001 году нашёл тупо по собеседованиям
>на Битриксе
>ООП как такового не было
Там его некуда вкорячивать, если только в /local замутить композер и писать классы по psr, но работа с самим битриксом сведёт на нет все старания с ооп, поскольку большинство логики придется писать в шаблонах в файлах result_modifier, либо писать с нуля компоненты и уже можно чуть чуть в ооп
>Где там нахуй нужен синглтон, м?
Там в ядре он повсеместно используется, но где в твоём коде его писать это уже по задачам. Я с этим говном полгода работал и не разу не довелось писать синглтон.
>или быть быдло-говнокодером
Если тебе нравиться колупаться в говне, то почему бы и нет. Работу с ним я сравнил бы работу в автосервисе для тазов, открываешь капот девятки, а там пиздейшн, канистры, шланги, хаотично расположенная проводка, что-то замотано изолентой, хуй до чего доберешься пока полмашины не разберешь и все в слое масла и говна.
Неее, ты чеее.....
Как пример - один человек просит что бы я реализовал ему приложение по аналогии с примерно таким приложением:
авторизация/регистрация, в систему в можно внести клиента, и в календаре (датапикер) с выбором дат можно для этого клиента выбрать пару услуг на какой либо день. Соответственно в самом календаре отмечаются дни в которые назначены услуги.
В общем все довольно просто. Как пример он мне показал подобное приложение написанное для его знакомого. Оно сделано на пхп 5.3, на клиенте джейквери, на сервере никаких фреймворков, роутинга нет (естественно всего остального тоже нет), сделано относительно архаично - url - тупо отражает физические каталоги сервера.
Приложение написано спецом из одной бедной перефирийной республики юга России - и стоило со слов моего знакомого который хочет аналогичное -16 тыс рублей.
Это адекватная цена? Мне кажется реально низкой. Но я территориально в более богатом регионе .
И я естественно так примитивно не хочу его реализовывать - вообще хочу spa на vue и на бэке slim. А то и ларавел (понимаю что избыточно)
И если такое делать spa + slim или laravel - какие адекватные границы стоимости такого приложения?
Чо как маленький
- обязательно объясни и покажи заказчику отличия
- посчитай трудозатраты в часах, и умножь на согласованный с заказчиком рейт
...
- профит
олсо, заказчику как правило чуть более чем похуй
если он не собирается растить их этого поделия какую-то супер-систему, а рассматривает проект как небольшую утилитку, то нафиг эти SPA никому не упёрлись, цена важнее
Я чуть с другой стороны скажу тебе. О том что меня последнее время стало аж глушить.
Мне за 30 децл, ойти-вышка в вузе прогинг был, админил, последние 3 года я обратно-вкатываюсь. Уже чето могу. И вот что скажу - меня последние время аж от самого себя корячит, а именно от инертности и неспособности активно дергаться и суетиться, потому что за годы нихуя не делания эта овощность реально вьелась глубоко в шкуру. Особенно стремно потому что у меня не мало кабанчиков в окружении есть, и я смотрю как они подскакивают с переменным успехом - но они подскакивают, и по итогу в плюс.
От этой овощеватости хочется самому себе по ебалу надавать. Дико бесит. Но выученная беспомощность - это лютое говно говна. Дико сложно себя переделать.
Поэтому оч советую - не скатись в эту парашу. Забей хуй но то что ты чего то не знаешь - активно скачи по интернету, проходи собесы, ищи заказы как угодно, пили как можешь. Короче я понимаю что я со свой стороны деформации говорю - но я искренне считаю что психика - важнее навыка. И что по жизни гораздо лучще быть подскакивающим кабанчиком со средними знаниями, чем овощным , но высокоуровневым спецом
Навык технический он придет, а вот если ты свою психику загонишь в болото "инертного говна" - вылезти будет так тяжело что ты охуеешь. И не факт что сможешь.
>> обязательно объясни и покажи заказчику отличия
Это я сделал.
>посчитай трудозатраты в часах, и умножь на согласованный с заказчиком рейт
Вот тут не понимаю как посчитать трудозатраты
И какой рейт - я вообще не шарю в ценах.
то что я выше описал - стоит 16 тыс? Где инфы взять?
>>2030213
>>если он не собирается растить их этого поделия какую-то супер-систему
потенциально собирается. А если нет - ради опыта я реализую на ларе и вью - за среднюю цену подобного приложения. Вопрос в средней цене.
>не понимаю как посчитать трудозатраты
Берёшь и считаешь количество часов, которое тебе реально понадобится, умножаешь на согласованный с заказчиком рейт, к примеру, 1-2 тыс. рублей за час да, в Рашке программер дешевле шлюхи. Получается цена.
Если у заказчика денег нет -- затягиваешь ремень и отталкиваешься от его бюджета только зачем.
Всем добра.
> деревенской
Тут непонятно, почему "деревенской"?
Время от времени нанимался в галеры, ничего плохого в них не вижу. Вообще, по-умолчанию нет никакого преимущества в статусе "не-галеры".
>Многие сейчас используют таймтрекерв?
Наличие таймтрекера - недоверие к тебе как к специалисту. Норм разраб будет и без таймтрекера таски закрывать, а проебщик найдет как обмануть трекер.
С конторами использующими трекер не сложилось. Работаю без трекера, потраченное время постфактум списываю в жиру
>Если кто то из деревенской галеры успешно перекатился в нормальную контору
Начинал с конторы в миллионнике, затем по удаленкам прыгал
>И в целом про стеки интересно
Что про стеки? Symfony>Laravel>Yii
CMS говно не рассматриваю
> Что про стеки?
Ну например с чем работал на старой работе и на что перекатился на новой галере
>>2030250
> > деревенской
> Тут непонятно, почему "деревенской"?
Если взять какой нить полу-миллионник, то обычно ищут кабанчика на зп 35, который умеет и в девопс и в spa, должен иметь опыт работы со всеми фреймворками, цмс готов работать по 12 часов в сутки без выходных. Ну и пилить в одного проект, на который нужно ещё минимум человека 2-3. Без внятного тз и/или макета, с кучей мелких правок, которые ломают весь написанный код.
Я конечно утрировал, но суть думаю ясна.
>Ну например с чем работал на старой работе и на что перекатился на новой галере
Работал с Yii и Laravel попеременно
>ищут кабанчика на зп 35, который умеет и в девопс и в spa, должен иметь опыт работы со всеми фреймворками, цмс готов работать по 12 часов в сутки без выходных
Ищут обычного разраба на 8 часов. Да, в мелких фирмах придется выходить за специализацию. Например бекендер будет частично заниматься фронтендом и девопсом, но на достаточно примитивном уровне. Т.е. от тебя не будут ждать сверхрезультата, лишь бы работало хоть как-то
>Ну и пилить в одного проект, на который нужно ещё минимум человека 2-3
Откуда ты знаешь, сколько человек нужно на проект? Это решать менеджменту. Если бизнес не устраивает скорость поставки фич, он будет думать, что делать: расширить команду, нанять более опытного разраба или снижать качество работы.
>Без внятного тз и/или макета
Опять же проблема бизнеса. Нет тз - проси тз. Неточное тз - уточняй, задавай вопросы, требуй макет. Без тз - результат хз
>с кучей мелких правок, которые ломают весь написанный код
А это уже твоя прямая компетенция писать код, который несложно менять. Естественно в рамках сроков. Если сроки занижены - код будет крайне хрупкий
>>Ищут обычного разраба на 8 часов.
У меня есть знакомые кабанчики - они все максимально режут углы по ЗП для сотрудников, по офисам - короче экономят по максимуму. Когда речь идет о том что бы бэху новую себе взять - о экономии и слова нет.
Это я к тому что ухо востро нужно держать, а нос по ветру.
ну для меня нет, а ты как хочешь
по моему опыту, точно гораздо лучше работать на аутсорсинговую компанию с выстроенной культурой, чем на мелкие конторки
Ты зелень? Или куколд, который яростно дефает бизнес?
Ты точно пишешь про галеры из мухосраней? Или это галеры из твоего манямирка? В регионах, чем дальше от ДСов, тем больше этот самый бизнес пиздодельный и хочет экономить на всем.
>Ищут обычного разраба на 8 часов
Да, в вакансиях все радужно и с понями и печеньки лол в офисе. Я так пытался перекатиться в другую галеру, в которой и зп побольше и задачи типа поинтересней. А потом узнал что у нас работает чувак который оттуда еле свалил. Да, говорит, задачки там были повеселей, но если ты внезапно решил свалить после 8 часов работы, то на тебя все косятся, а потом тимлид начинает тебя подгонять по срокам и с улыбкой на лице говорить, что мы семья и у нас коллективная ответственность.
Со некоторыми местными конторами я обсобеседовался. В одной даже оффер прислали. Но там работал знакомый пару лет назад он успешно перекатился в дс2. Который рассказал про таймтрекеры / штрафы которые как бы внезапно противозаконны
В третью меня чуть ли не упрашивали пройти собеседование. Вежливо слился ибо контора слишком мутная и зп серая 20/80.
>Нет тз - проси тз. Неточное тз - уточняй, задавай вопросы, требуй макет
Кейс "ты чо тупой тут все понятно и без тз" / "нет времени пока что ответить займись чем нить другим" никогда не встречал? Тогда поздравляю.
>Откуда ты знаешь, сколько человек нужно на проект? Это решать менеджменту
Oh boi. Риторика из разряда "нас ебут а мы крепчаем" / "бизнесу видней"?
>А это уже твоя прямая компетенция писать код, который несложно менять
По твоему код это абстрактная хуета, которую достаточно просто написать по всем паттернам и все? Вот тебе пример: пишешь ты йоба круд по макету, а потом хуякс прилетает задача "Ой у нас там в макете не точности, мы вот это перенесли в другой раздел, вот это убрали а здесь поменяли. Там немного правок, сроки не сдвигаем" и в итоге нужно переделывать базу данных, логику контроллеров, вьюшки, шаблоны.
Хз, где ты такие галеры нашел.
Работал в региональной конторе, уходил отработав 8 часов, никто косо не смотрел. На удаленке с этим еще проще.
>Который рассказал про таймтрекеры / штрафы
Узнаешь про подобную хрень на собесе.
Если херка напиздела "у нас нет трекеров и штрафов", а при выходе на работу тебя просят ставить трекер, увольняешься сразу же. (или откат договора, как получится)
>Кейс "ты чо тупой тут все понятно и без тз"
Очевидные неадекваты, с которыми не стоит работать
>Oh boi. Риторика из разряда "нас ебут а мы крепчаем" / "бизнесу видней"?
Тебе то какая разница, сколько работает над проектом людей? Главное - таски закрывать
>По твоему код это абстрактная хуета, которую достаточно просто написать по всем паттернам и все? Вот тебе пример: пишешь ты йоба круд по макету, а потом хуякс прилетает задача "Ой у нас там в макете не точности, мы вот это перенесли в другой раздел, вот это убрали а здесь поменяли. Там немного правок, сроки не сдвигаем" и в итоге нужно переделывать базу данных, логику контроллеров, вьюшки, шаблоны.
Оформляешь отдельной таской с отдельным эстимейтом.
У исходной таски был свой эстимейт, который завязан на требования, описанные в ней. Меняются требования - меняется эстимейт
В той или иной форме - все кабанчики такие.
Исключения - полусемейные небольшие фирмочки, где народ уже лет 7-8 вместе работает. И где твой "начальник" твой друган с детства, и ты его за кофе можешь нахуй послать.
Кабанчик на которого ты работаешь - отлично понимает что тебя эксплуатирует, и что ты время своей жизни размениваешь на его доход. Степень кривизны этого мышления меняется от личных качеств кабанчика, но присутствует у каждого.
Нельзя быть бойцом - не будучи агресивным, упорным и жестоким. Нельзя быть кабанчиком - и быть человечным к своим сотрудникам. Так или иначе сотрудник - ресурс.
Я видел совершеннейших мразей, которые эксплуатировали своих сотрудников по максимуму, засирая мозги хуитой про "семью", подавляя психологически и взращивая комплекс неполноценности как специалиста - и платил минималку.
При этом личный его доход вылился в двухуровневый пентхаус, и тачку за 6 лямов.
Это не ДС, и не ДС2. Региональная столица.
Так что лучше личную кабанчиковость развивать постоянно.
А кроме шуток, епта? Мне в свое время понравилась валидация через реквесты (теперь и в симфони так делаю) и миддлвари (в симфе по ходу только через евент листенеры можно сделать).
А я без шуток говорю. Зависит от уровня проекта. На самом дне вротпресс и прочие CMSки лучше всего, на не самом дне ларавел. На среднего уровня проектах Симфони, если еще выше - лучше не пхп.
Получил кучу дефолтных роутов аутентификации, по гайдам эти роуты разворачиваются в файле роутов web.php.
Может мне эти роуты аутентификаци развернуть в файле api.php?
И соответственно от spa клиента при логине обрабатывается маршрут login ( register , logout ) из блока web.php - это правильно?
И согласно туториалам все осталдьные запросы от spa уже идут на роуты из блока api - так и должно быть?
Опять же по доке мидлвэйр auth:sanctum - устанавливается в блоке api.
Почему не в web блоке роутов?
Короче чет я нихуя не пойму. Хотя вроде кое как все рабоатет.
И еще вопрос по клиенту - в спа я получаю объект пользователя в момент логина, но если я перегружу страницу - то JS перегружается и все объекты становятся пусты, как фиксисть?
Если юзер авторизован то в каком нибудь событии отправлять запрас на его получение?
Или в браузере должна быть какая то база которая между f5 перезагрузки страницы сохранит данные.
Я недавно погрузился в ларавел и vue+vue router_vuex - и все это в свовокупности не слабо ебет меня в мозг.
>И еще вопрос по клиенту - в спа я получаю объект пользователя в момент логина, но если я перегружу страницу - то JS перегружается и все объекты становятся пусты, как фиксисть?
Обычно делают какой-то рут, который возвращает объект текущего пользователя по токену/куке. То есть при перезагрузке страницы ты пытаешься первым делом получить текущего юзера.
Еще у тебя может быть такая логика, что например если текущий юзер = null, то происходит редирект на страницу логина. При перезагрузке страницы у тебя текущий юзер в любом случае какое-то время будет null, тут можно даже что-то такое попробовать сделать:
authService.tryLoginCurrentUser().then(() => {
new Vue({
//
})
})
Смотри только чтобы из условного tryLoginCurrentUser никакие ошибки не вылетали. Если у тебя не получилось зафетчить текущего юзера, то тут уже наверняка что-то с токеном, можно например смело инитить приложение и редиректить на страницу логина
А еще хорошей идеей будет впечь этого юзера прямо в страницу (например, в тег с типом application/json), чтобы не делать лишних запросов.
> 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();
> }
Более того, у тебя вообще нельзя создать объект конфига без привязки к импорту/экспорту. А было бы красивее, если бы можно было просто создать объект конфига и куда-то передать. На мой взгляд, тут нарушение разделения ответственности (хранение и импорт/экспорт).
- зачем конфиги сделаны иммутабельными? Если мы создаем конфиг и добавляем ключи по одному, это приведет к созданию множества промежуточных объектов. В чем тут выгода от иммутабельности?
- зачем в 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. Не надо усложнять вещи.
Но может, конечно, у тебя есть причина.
>>2026261
> array_push($reversed,
Вместо этого можно просто писать $reversed[] = ....
А так, верно.
Спасибо за проверки, пока написал калькулятор, но хочу со скобками и порядком написать. Как сделаю выложу сразу всё.
ничем
https://docs.google.com/document/d/1y9yN8WWmXRNhZhmt6Ccwukxt49Qq6r_jStbb992kbKo
Это адекватные тестовые задания для стажёра-джуна на 15к? Стоит ли потеть или нахуй надо?
Есть get-запрос на некий пхп-эндпоинт, мне надо с фронта закинуть туда некоторые данные из localStorage чтобы пхп-бэк их обработал. Как это сделать? Только через query-параметры?
Вот про показ страницы ошибки (точнее про возвращение текста с ошибками в виде json) и идет речь. Второй слушатель нужен для перехвата исключений, которые бросает фреймворк, и для преобразовывания их в JsonException
Нормальный ли это подход?
Лара построена на симфони.
>false === $ex instanceof JsonException
Нихуя себе я утром чуть не всрался от такой конструкции
Зачем аплаишься на гроши? Никто в айти не получает такие копейки. Даже приходящая в офис уборщица будет смеяться.
Насчет задачи - задача адекватна для мидла за 100к, но никак не для стажера за 15к
Обычно такое постом делается
В мухосоранске моём вакансий нет, ищу удалёночку с нулём опыта работы. Кидаю дохуя откликов, за пол месяца только эти ответили и 1с.
Не ебу что отвечать когда спрашивают про ДОСТИЖЕНИЯ или просто интересные проекты. У меня интересных проектов 0, обычные магазы, новостные сайты и парсеры
Любую задачу можно приукрасить и подвести к достижениям. Например парсер, мб ты там удачно применил какой-то инструмент (очереди, кеш, что-то еще), увеличив производительность в десятки раз.
Или в новостном сайте прикрутил хитрий алгоритм рекомендаций.
Общий рецепт - ищем в другом проекте классную фичу, думаем, как бы реализовали, на собесе говорим, что реализовали и как.
с Йода познакомиться нужно нотацией тебе
А что не так с той конструкцией? Я всегда так пишу, если не использую предикаты, да и то только если условие проверяется на истинность
if ($person->isGay()) {
$person->suck($nigger->getDick());
}
if (false === $person->isGay()) { ... }
Я залип на скрин пару минут потому что мне показалось что if ((false === $ex) instanceof JsonException), ну ты понял
>if (false === $person->isGay()) { ... }
Тут хуй знает что хуже, использовать такую йобда нотацию, или не использовать простое отрицание. Вроде уже давно все присваивания в ифах подсвечиваются, не пойму к чему это всё
Создаю новый файл, прописываю в него необходимый минимум.
Добавляю в конфигурацию апача
sudo a2ensite my-example
Он пишет что конфигурация изменена, рестартните. Я перезапускаю и получаю хуй.
Полдня дрочусь, заебло.
п.с.
теперь вообще ахуительное поведение:
решил отключить ранее настроенный виртуальный хост, хз когда то сделал и получилось.
Отключил командой sudo a2dissite old-site.conf
И что вы думаете? Браузер при обращени к этому старому сайту перестал его показывать, но блядь теперь он мне просто структуру корневого каталога этого сайта показывает.
Вот мразь
>>А зачем в 2021 году апач?
А есть разница для обычно сайта?
Я уже разобрался - сам себе в ногу выстрелил полгода назад, когда "настраивал" iptables.
А ты пойди прорвись с 0 опыта через толпу вайтишников
В 8.1 возможно завезут файберы https://wiki.php.net/rfc/fibers
Пока - только корутины ручками (можно с промисами от Guzzle, например).
А ну ещё swool есть https://www.swoole.co.uk/
И ReactPHP, который хоронят, но он копротивляется: хз че там
Про амп забыл https://amphp.org/amp/
Да и еще куча всего есть, но я бы при всей своей нелюбви к жопаскрипу использовал ноду
Хотя на практике асинхронность мало где и нужна.
Обычно идеи появляются сами. Например, понадобилось тебе валидировать ИНН, ты погуглил, не нашел ни одной нормальной бибилиотеки и решил написать свою и выложить. Или понадобилась точная работа с дробями, поискал класс Rational, не нашел, сделал свой. Или понадобилось искать в ФИАС введенный в произвольной форме адрес, не нашел, сделал что-то свое.
Можно в теле POST-запроса отправить JSON.
>>2033957
Думаю, что неправильный.
Во-первых, любые исключения нельзя преобразовывать в JSON ответ. Представь, что у тебя ошибка в SQL запросе, из-за этого происходит исключение и ты раскрываешь всем желающим информацию о твоей базе данных. Или ошибка в соединении с базой данных и в ответе отдаются параметры соединения.
Во-вторых, такой способ отлова исключений не очевиден при анализе кода. Когда ты смотришь на место, где выбрасывается исключение, не очевидно, что оно будет преобразовано в JSON-ответ.
Понятнее всего, как мне кажется, будет явная обработка ошибок по типу:
если (сущность не найдена) {
отдать ответ с ошибкой 404;
}
Чуть похуже, но приемлемо будет явно выкидывать JSONException, по его названию понятно, что оно будет преобразовано в JSON ответ:
если (сущность не найдена) {
выкинуть исключение JSONEXception;
}
Да с чего ты взял, что любые? Только некоторые, наподобие 404 итд, они явно прописаны во втором слушателе.
Как изменить цвет блока при удержании мышью?
токсик из жс треда,ты тут?
Да, дружок, ты уже заебал если у меня детектор не сломался, тебе ничего не нужно на твоих древних микропроектах в зассаной галере. Ни асинхронности, ни микросервисов, ни разделения бэка и фронта. Но зачем всем об этом знать?
Думаю файберы будут почти на 100 процентов. Всратая асинхронность из коробки закроет еще какой то определенный диапазон тасков. пихипи собственно так и развивается - разползаясь по чужим нишам потихоньку.
Зависит от задач. Если хочется всего лишь небольшого ускорения, то можно посмотреть в сторону роадраннера
>валидировать форму на сервере
Это обязательно
>через жс на фронте
Это говно легко обходится, только в дополнение к серверной валидации для юзер экспириенса
Тогда амп
Если на фронте и без фреймворков, то да. Можно взять какой-нибудь input mask и описать правила валидации для каждого поля ввода. Там наверняка из коробки будут все типовые случаи и можно будет обойтись без регулярок, чтобы не дать ввести то, что не нужно. Но это все не отменяет необходимости делать валидацию на бэке
Ну можешь уделить час на теорию и пару часов на практику. А так не вижу смысла их ковырять, пока таска по ним не пришла. Достаточно знать, что есть вот такой кроссплатформенный инструмент работы со строками
>но ведь кто-то другой, допустим, начнет брутфорсить и сможет его найти
Не сильно понял что ты имеешь ввиду под брутфорсить, но если жс подключается только для залогиненных пользователей, то никто его не увидит. Другое дело что много ума не нужно написать в урле /assets/admin.js или что-то подобное
>а там по коду фронтенда админки можно лучше понять как работает сайт, что плохо для безопасности
Это заблуждение. Если у тебя не проходной двор на сервере, то ничего не произойдет.
>То есть надо это как-то на уровне апача/нжикса блокировать?
Опять же, если у тебя весь сайт как какой-то вордпресс валяется в публичной папке, то да, нужно денаить папку .git, папки vendor и т.д.
>не нужно написать в урле /assets/admin.js или что-то подобное
Да, я это и подразумевал, что кто-то просто будет перебирать названия файлов по адресу /assets/
Их учить в любом случае надо. Не только чтобы валидировать текст, но и преобразовывать текст, разбирать текст.
>>2035642
У всех прод разный.
>>2035799
Если тебе хочется максимальной безопасности, можно весь раздел админки закрыть HTTP-авторизацией и никакие файлы оттуда не будут выдаваться. Но придется два раза логиниться.
> можно весь раздел админки закрыть HTTP-авторизацией и никакие файлы оттуда не будут выдаваться. Но придется два раза логиниться.
поподробнее
Так и есть, это какой-то программисткий юмор у чела
всё поверхностное -- да
но многое переизобретается,
либо с новыми инновационными технологиями,
либо просто в нужном месте в нужное время
Маппер напиши
Нескурно их отдельно проверять.
Проверяй их вместе(грубо говоря делать запрос в базу на наличие логина с паролем) и выдавай общую ошибку вида "не верный логин или пароль"
а если валидность?
допустим логин,имя или пароль не правильно записаны,там меньше 6 символов или есть ненужные символы?
Сделать убийство скрипта и выбросить сообщение?
Так ты определись для начала, что за форма у тебя: логин или регистрация. Там правила валидации разные
В общем случае для формы задается список правил валидации (встроенные в фреймворк, либо кастомные функции) вида [параметр => правила] или кастомный валидатор. Потом проходимся по этому списку, возникшие ошибки заносим в массив $errors и отдаем (по апи или рендерим в шаблон)
а вот так получилось
интересно,а как обстоят дела с алфавитам где есть точки,круглишки,хвостики?
а если я хочу определенный символ @ добавить в допустимые к буквам и цифрам?Как записать?
Взял бы какую вводную статью по регуляркам, да почитал. Там есть про диапазоны символов
> В случае, если первым символом описания класса является '^', логика работы инвертируется: класс соответствует одиночному символу, который не содержится в наборе, определяемым классом
[^@]-то есть этот символ отвергается как допустимый?
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
Поставь пхпшторм. У тебя опечатка в синтаксисе (название функции). Он бы тебе подсветил
да,исправил
Возвращай из таких функций булевы значения, а не строки
function isLoginValid(string $login): bool
{
return 0 !== preg_match('/^[a-zA-Z\d_]{6,}$/', $login);
}
Это зависит от того, как символы алфавита расположены в таблице Юникода. Выражение вида [a-z] значит "все символы, которые в таблице Юникода расположены между a и z".
Юникод - это такая большая таблица, где есть куча символов разных алфавитов и каждому присвоен уникальный код. Посмотреть на нее можно тут: https://unicode-table.com/ru/
Например, для русского алфавита буквы от а до я идут подряд, а буква ё стоит отдельно. Потому, чтобы указать "любой символ русского алфавита", мы пишем [а-яё].
Или, например, для белорусского алфавита придется добавить символы i, ў к диапазону а-я.
Соответственно, если буквы какого-то алфавита идут вместе, то можно перечислить диапазон от первой буквы до последней. Если нет - то придется указать все символы или все поддиапазоны, в которых они находятся.
Сложнее ситуация с диакритическими знаками. Букву вроде ê можно записать как один символ Юникода, а можно как комбинацию буквы e и специального символа крышечки. Тут придется либо усложнять регулярку, разрешая диакритические символы, либо предварительно нормализовать текст.
Если же тебе надо указать "любая буква из любого алфавита" или "любой знак препинания" - то все намного проще. В регулярках для этого есть специальные коды, которые перечислены тут: https://www.php.net/manual/ru/regexp.reference.unicode.php
Например, \pL значит "любая буква любого языка".
Если логин в принципе неправильный (содержит недопустимые символы), то пишем соответствующее сообщение.
Если же логин соответствует шаблону, но такого логина нет в БД, то тут есть два варианта:
- написать "неправильный логин"
- написать "неправильный логин или пароль"
Во втором случае мы не позволяет атакующему подбирать логины, но доставляем неудобство пользователям, так как при опечатке им непонятно, где она - в логине или пароле.
Первый вариант чуть менее безопасен, но более удобен для пользователей. Так как они сразу видят, где ошибка - в логине или пароле.
Ну и, надеюсь, ты знаешь, что пароли в базе надо солить и хешировать, а не хранить в открытом виде.
Я выше написал, что конструкция try .. catch была бы нагляднее, так как сразу видно, что как обрабатывается. А в случае с твоими обработчиками - как догадаться, что они вообще есть и что они преобразовывают исключения? Это неочевидно.
На практике, конечно, многие не думают об очевидности кода, а просто лепят как проще.
HTTP-авторизация - это когда при попытке открыть сайт (или определенную страницу на нем) выскакивает окно от браузера с запросом логина и пароля. Оно показывается в ответ на код 401 от сервера. Почитай про этот HTTP-код и про HTTP-авторизацию.
Это обычно настраивается не в PHP коде, а на уровне веб-сервера, например, в Апаче или Нгинксе.
Добавлю, данный код сработал на отлично, когда я написал вот так: '#\ba[^ex]a\b#'
Что это значит, объясните пожалуйста подробно.
В твоей регулярке есть недостаток: она ищет последовательности из 3 букв, по краям которых стоят буквы a, а между ними - любой символ, кроме e и x. Но "любой символ" включает и пробел, потому твоя регулярка может найти последовательность вида "a a", то есть кусок между двумя соседними словами.
Возможно, надо исключить пробел из числа разрешенных символов?
>>2038395
\b обозначает границу слова, то есть такое место, где с одной стороны стоит буква, а с другой - не-буква.
Соответственно \ba обозначает "символ a, слева от которого нет буквы".А a\b значит "символ a, справа от которого нет буквы".
При этом \b не соответствует какому-то символу, а соответствует границе между двумя символами.
Во-первых, есть раздел по установке: https://www.php.net/manual/ru/install.php
Например, под Линукс установка сводится к набору команды вроде 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 есть на том же сайте слева.
Установил пыху, потом композер и через него
Так это же вроде версия конкретно инсталлера, не пользовался им. Версию ларки посмотри например в composer.json
> Но "любой символ" включает и пробел, потому твоя регулярка может найти последовательность вида "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 и внеси себе нужные изменения.
https://www.php.net/manual/ru/xsl.installation.php
Поставь виртуалку с линуксом,если конечно у тебя не старое железо
На Винду лучше wsl накатить, правда докер ебется с памятью но шо поделать
Разговоры из разряда "нет хлеба - ешьте пирожные".
Нужно быть достаточно прошаренным чтобы выкупить на собесе что тебе пиздят. И нужно быть достаточно богатым, чтобы тут же на изичах уволиться и сидеть без зарплаты условные пол месяца, пока ищешь другой вариант. Да и в целом, если ты можешь себе позволить выбирать работодателя, то для тебя как минимум весь российский рынок открыт.
Я сам именно потому и съебал в свое время из региона, что даже с охуенным опытом у тебя на выбор пять контор. А там уже как фартанет, может будет норм, а может душка. Любой якорек типа ипотеки или личинуса и ты уже хуй куда денешься оттуда.
Перед поиском работы потыкал ларку около месяца и по ней же начал что-то искать. На поиск работы ушло пару недель от силы, при условии, что я сам не особо охотно откликался на вакансии и живу далеко не в дс1, дс2. В итоге за неделю получил сразу 4 оффера: два на удаленку, два в офис. К собесам никак не готовился. По факту из 4 собесов более-менее неплохой оказался один, хотя вопросы плюс-минус везде были похожие.
Удачи тем, кто пытается вкатиться, если есть вопросы, спрашивайте.
В ноде я понимаю как это делать, а с пхп чет затупил. Хочу разобраться как из потока в файл например, или в другой поток писать - что бы не загружать все тело post запроса сразу в память, а по кускам.
За почти пять лет на убунте только однажды после обновления отвалился звук.
Ни разу с этой херней не сталкивался, но возможно тебе нужно смотреть в сторону php://input
Так он же не написал, что за работа. Может его взяли на пару сотен вордпрессобитриксы колупать
С чего ? Если аноны годами не могут вкатиться - это я уже хз, как надо так стараться. У меня заняло это столько времени, с учетом того, что я прогал 6-7/7 по 8 часов стабильно. Так что этот срок я еще считаю долгим.
>>2040609
Да нет, битрикс никогда в жизни не курил и даже не рассматривал вакансии по нему. Проект на ларке, пару месяцев уже работаю, но думаю в ближайшее время искать что-то другое, ибо скиллы никак не апаются, ничего нового я не узнаю, поэтому смысла торчать в этой кампании кроме как на зп сидеть - нет.
По поводу вилки, то на всех четырех давали 45-55 на руки (позиция джуна). Тут я уже не могу судить, много это или нет для мухосрани, но точно куда выше средней зп по региону.
Не больше 90 км/ч
http://sd.blackball.lv/library/Learn_PHP_8_2nd_Edition_(2020).pdf
Думаю начать изучать PHP с него.
Разговариваешь с троллем.
HTML, CSS изучал по http://htmlbook.ru/ и https://webref.ru/. Иногда некоторые моменты вычитывал еще в https://developer.mozilla.org/
После сверстал пару макетов и забил на html & css.
PHP начинал с курсов от Игоря Борисова там несколько модулей. Очень годные курсы, особенно если начинать с нуля. Все очень понятно и доступно объясняет. Все вещи, которые нужны - там есть. Хоть курсы и довольно старые, но с того времени ничего кардинального в языке не поменялось. Чтобы понять и разобраться в основах - достаточно, к тому же затрагивается ООП. Некоторые моменты просто гуглил, если вдруг хотелось во что-то получше углубиться или что-то было непонятно.
Есть еще годный сайт, если вдруг видео не особо заходят http://code.mu/, но я его особо не курил, ибо после курсов от Борисова, там ничего нового нет, но учебник годный.
Потом почекал учебник от ОПа, но с нуля по нему изучать такая себе идея, имхо. Ничего нового оттуда не вытянул, поэтому просто порешал задачки до главы с бонусными задачками, дальше особо смысла не увидел задрачивать их. После решил задачку про список студентов от того же ОПа, чтобы на практике подтянуть ООП непосредственно.
После списка студентов уже начал курить ларку. У Елисеева есть годный курс по ларе, но они очень долгие и не каждый осилит, но знаний там можно вытянуть достаточно + если смотреть на скорости х1,3-1,4, то вполне неплохо. Без знаний ООП и параллельного курения самой документации лары особого смысла нет смотреть. Параллельно с изучением лары начал читать Зандстру.
Да и все в принципе, git учил по первому сайту гугла, js иногда курил по learn.javascript, но жс просто для общих знаний, практики на нем особо нет. Для основ sql неплохой сайт https://sql-academy.org/ и на метаните вроде видел. Докер почитывал по оф доке.
Из вопросов на собесах ничего необычного. В основном банальные вопросы про ООП. Что такое классы, объекты, принципы ООП, как они работают и т.д. Чем интерфейс от абстрактного класса отличается, чем абстрактный от обычного - это можно тоже отнести к банальным вопросам про ООП. Про http протокол вопросы были, а-ля как он работает, какие методы есть, их отличие, коды ответов и подобная лажа. Вроде были еще вопросы про сами нюансы PHP, как происходит преобразование типов, как этого избежать, можно ли добиться строгой типизации и тому подобное.
Про SOLID спрашивали, в основном просили объяснить как каждый принцип работает и для чего нужен вообще. Про SOLID понравились вопросы только на одном собесе, там прям знатно душили, но как сказал техлид, джунов обычно так не душат с солидом, но я сам попросил, чтобы знания проверить и узнать что-то новое.
По SQL вопросы тоже дефолтные, что такое индексы, составные индексы, внешние ключи, отличие джойнов, про нормализацию еще были вопросы вроде. Но по SQL не так много вопросов, в основном была задачка и нужно было написать запрос.
На одном собесе парочка вопросов про линь было и несколько про гит.
Ну и самые дефолтные вопросы на каждом собесе: чем занимался, что делал, что за прокеты и т.д.
Как-то так.
HTML, CSS изучал по http://htmlbook.ru/ и https://webref.ru/. Иногда некоторые моменты вычитывал еще в https://developer.mozilla.org/
После сверстал пару макетов и забил на html & css.
PHP начинал с курсов от Игоря Борисова там несколько модулей. Очень годные курсы, особенно если начинать с нуля. Все очень понятно и доступно объясняет. Все вещи, которые нужны - там есть. Хоть курсы и довольно старые, но с того времени ничего кардинального в языке не поменялось. Чтобы понять и разобраться в основах - достаточно, к тому же затрагивается ООП. Некоторые моменты просто гуглил, если вдруг хотелось во что-то получше углубиться или что-то было непонятно.
Есть еще годный сайт, если вдруг видео не особо заходят http://code.mu/, но я его особо не курил, ибо после курсов от Борисова, там ничего нового нет, но учебник годный.
Потом почекал учебник от ОПа, но с нуля по нему изучать такая себе идея, имхо. Ничего нового оттуда не вытянул, поэтому просто порешал задачки до главы с бонусными задачками, дальше особо смысла не увидел задрачивать их. После решил задачку про список студентов от того же ОПа, чтобы на практике подтянуть ООП непосредственно.
После списка студентов уже начал курить ларку. У Елисеева есть годный курс по ларе, но они очень долгие и не каждый осилит, но знаний там можно вытянуть достаточно + если смотреть на скорости х1,3-1,4, то вполне неплохо. Без знаний ООП и параллельного курения самой документации лары особого смысла нет смотреть. Параллельно с изучением лары начал читать Зандстру.
Да и все в принципе, git учил по первому сайту гугла, js иногда курил по learn.javascript, но жс просто для общих знаний, практики на нем особо нет. Для основ sql неплохой сайт https://sql-academy.org/ и на метаните вроде видел. Докер почитывал по оф доке.
Из вопросов на собесах ничего необычного. В основном банальные вопросы про ООП. Что такое классы, объекты, принципы ООП, как они работают и т.д. Чем интерфейс от абстрактного класса отличается, чем абстрактный от обычного - это можно тоже отнести к банальным вопросам про ООП. Про http протокол вопросы были, а-ля как он работает, какие методы есть, их отличие, коды ответов и подобная лажа. Вроде были еще вопросы про сами нюансы PHP, как происходит преобразование типов, как этого избежать, можно ли добиться строгой типизации и тому подобное.
Про SOLID спрашивали, в основном просили объяснить как каждый принцип работает и для чего нужен вообще. Про SOLID понравились вопросы только на одном собесе, там прям знатно душили, но как сказал техлид, джунов обычно так не душат с солидом, но я сам попросил, чтобы знания проверить и узнать что-то новое.
По SQL вопросы тоже дефолтные, что такое индексы, составные индексы, внешние ключи, отличие джойнов, про нормализацию еще были вопросы вроде. Но по SQL не так много вопросов, в основном была задачка и нужно было написать запрос.
На одном собесе парочка вопросов про линь было и несколько про гит.
Ну и самые дефолтные вопросы на каждом собесе: чем занимался, что делал, что за прокеты и т.д.
Как-то так.
Забыл добавить, про паттерны были вопросы на двух собесах вроде. На одном простые вопросы, какие виды есть, какие знаешь. На другом, где душили про солид, там уже намного глубже в эту тему углубились, но опять же со слов техлида - джунов у них с этим не дрочат, но я сам попросил х2.
Может тебе еще скрины диалогов из слака, скрины проекта и до кучи фотку договора скинуть ? Или ты думаешь, что мне заняться больше нечем, как доказывать что-то какому-то анону ?
Живи просто дальше в свое мирке, в котором тебя все хотят наебать.
>Вкат занял ~5.5 месяцев практически с нуля
Вполне адекватный срок. Не понимаю, с чего здешние неосиляторы бугуртят. Сидели бы учили фреймворк и код писали, глядишь тоже вкатились бы
Все ясно.
TS это с поддержкой многопоточности. NTS без (но, возможно, чуть быстрее). На винде, если ты будешь использовать Апач или что-то похожее, нужна поддержка многопоточности, потому выбираем TS.
>>2039427
Это инструкция на случай, если ты захочешь сам компилировать PHP из исходников. Если же ты используешь Линукс, то ставишь библиотеку командой вроде apt-get install. Если винду, то скорее всего это расширение идет в архиве вместе с PHP и достаточно разрешить его в php.ini.
>>2039489
Там есть образцы php.ini. Ты можешь создать его, взяв за основу файл php.ini-development и поменяв его в соответствие со своими предпочтениями.
Тоже в недоумении, с чего срок вката такой бугурт вызвал. Ибо я до этого считал, что это даже долго, с учетом того, что я по 8-10 часов практически каждый день сидел.
Мб здешние вкатуны просто бояться по собесам ходить, может у них знаний уже вполне достаточно для вката, но они об этом не знают. По собесам можно и нужно ходить чтобы хотя бы проверить свои знания и получить экспириенс. Не пройдешь собес и что ? Зато будешь знать, что тебе подтянуть, имхо. По крайней мере я проходя собесы не ставил на первое место цель вкатиться.
Давай не будем винить линукс в том, что он не поддерживает не поддерживаемое железо, ок? Если ты хочешь использовать линукс с вай-фай и блютус, то перед покупкой проверь покупаемое на совместимость.
>>2040118
Это создаст лишние неудобства, например надо будет как-то закачивать отредактированные файлы в виртуалку, или подключать сетевой диск (что вызовет проблемы с производительностью). И обо всем этом ты умолчал, не пояснил, как это делать, и пытаешься нас ввести в заблуждение, что это просто и достаточно лишь "поставить виртуалку с линуксом" и все само заработает. Если бы ты действительно хотел помочь, ты бы об этом упомянул и дал бы ссылку, как все настроить.
В то время как в Windows все работает из коробки. Запускаешь встроенный в PHP сервер и не надо ни нгинкс, ни апач настраивать.
>>2040250
Не вводи в заблуждение. Не проще.
В PHP есть php://input, но фактически он будет читать данные из памяти (PHP сначала загружает весь запрос в память, а только после запускает твой скрипт).
Если у тебя гигабайтные запросы и хочется их читать потоком, то тебе надо не использовать встроенный в PHP сервер, а написать свой веб-сервер (например, на ReactPHP, amphp или чем-нибудь подобном) и тогда все будет работать аналогично ноде.
>>2040860
А я против вопросов про паттерны. Джуны выучат какой-нибудь синглтон, который на практике лучше вообще не применять, и какую-нибудь фабрику, притом объяснить, зачем она нужна, не могут. Ну и опять же, на практике скорее всего этот паттерн применять не будут. Или паттерн "стратегия" вспомнит, но не скажет, чем он лучше простого switch (еще хуже: придет и начнет в проекте свитчи на стратегии заменять).
И собеседующий тоже кроме определений этих паттернов сам ничего не знает.
Если уж обсуждать паттерны, давайте обсуждать реально применяемые паттерны и зачем реально они нужны. Как написать синглтон любой дурак может прочесть.
Из какого года капчуешь? Синглтон давно считается антипаттерном наряду с сервис локатором и реестром.
>Мб здешние вкатуны просто бояться по собесам ходить, может у них знаний уже вполне достаточно для вката, но они об этом не знают
По ощущениям здешние вкатуны либо тратят недостаточно времени на вкат, либо прикладывают усилия не туда. Они учатся программировать с самых азов, когда нужно быстро херачить круды на фреймворках. А программировать можно учиться в процессе работы по мере усложнения задач
Благодарю!
Не представляю каким надо быть терминатором чтобы по 8-10 часов сидеть пыхтеть, я уже через полчаса хочу расслабится и посомтреть аниме\чекнуть социалки и т.д.
Хуй знает какогь уровня ты зелень, и семен , но то что нужно подскакивать и по собесам ходить - факт железный.
В PHP есть php://input, но фактически он будет читать данные из памяти (PHP сначала загружает весь запрос в память, а только после запускает твой скрипт).
>>В PHP есть php://input, но фактически он будет читать данные из памяти
>>PHP сначала загружает весь запрос в память, а только после запускает твой скрипт
Точно?
Я не встроенный использую - а апач, но логика такая же? То есть по дефолту я как в ноде не могу читать объект потока по кускам, сразу pipe-ая его в другой какой нибудь поток?
Про php://input и обертки читал. Но вот с файлами к примеру, или вводом/выводом в системные потоки по идее все обстоит обычно, можно открыть два дискриптора потока, и по кускам из файла например пайпить в консольный вывод, как я понимаю. И в response так же есть возможность по кусочкам заливать данные, опять же в psr7 , есть какие то stream интерфейсы.
>>А я против вопросов про паттерны.
Вот двачую, ооп нужно как то прочувствовать что ли, невозмонжо "ага тут коммандный класс, тут абстрактная фабрика", это приходит как то от общего к частному , чтоли.
>>2041241
У того же Зандстры синглтоон превращается в реестр, который со совими статическими методами плавно превращается в сервис локатор.
>>2040573
LДа я больше из интереса, так то на ларе пишу, там это не особо нужно. Но даже в ларе помнится можно потоком отдавать данные.
Тут уже зависит от самих анонов, я думаю. От целей и умения выходить из зоны комфорта. У меня с этим особых проблем нет, да и интересно программирование как таковое. Под конец конечно немного тяжко было, в плане того, что время идет, а кушать что-то надо, поэтому еще решил попробовать походить по собесам.
>>2041667
На счет подфортило или нет - тут я не скажу, ибо было только 4 собеса, с каждого в итоге дали оффер. Как буду перекатываться в другую компанию, там будет видно.
Меня спрашивали
>У того же Зандстры синглтоон превращается в реестр, который со совими статическими методами плавно превращается в сервис локатор.
И что? Если Зандстра использует эти антипаттерны, то они внезапно перестали быть подобием глобальных переменных?
>Не представляю каким надо быть терминатором чтобы по 8-10 часов сидеть пыхтеть
Я пыхтел по 4-6 часов, т.к. на большее не хватало. Соответственно вкатывался подольше.
Ща на работе когда тасок срочных нет, можно знатно поебланить
>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 можно ткое реализовать? Нужно что то типа переменной меняющейся после обновления каждой строки.
Потом такой кайф разгребать трехатажный скл и параметризировать его. Тьфу бля
В Postgres такое изи сделать: сначала рекурсивным запросом формируешь таблицу со сдвигами, потом UPDATE FROM и все. https://dbfiddle.uk/?rdbms=postgres_13&fiddle=3acd482552e339836e82cde1b28a69e9
А вот в MySql до восьмой версии только формировать запрос сразу со значениями. А потом INSERT ... ON DUPLICATE KEY UPDATE
Это проще сделать скриптом на PHP (или, к примеру, на Питоне, если тебе не нравится простой и удобный PHP).
Также, ты можешь вычислить сдвиг. Для начала первой записи он будет 0 минут (было 08:00 - стало 08:00), для второй - минус 5 минут (было 08:20 - стало 08:15), для третьей - минус 10 минут (08:40 -> 08:30) и так далее. То есть 5 минут умножить на номер записи. Номер записи можно вычислить как время начала минус 08:00 поделить на 20 минут.
Тут можно математически по времени начала вычислить номер приема, и посчитать его новое значение.
Читаю про собесы и прям грустно становится. Надо тоже начать откликаться, но понимаю, что завалюсь на первом же вопросе. Хоть и пишу всякие проектики, но не знаю вообще нихуя.
Анон, рад за тебя. Чему посоветуешь уделить внимание вкатышу, чтобы не обосраться на собесах?
Меня не заебывает. Пишу апи для мобильных казуалок и приложений, все достаточно просто и без всякой там верстки. Вот подумываю го выучить и съебывать.
Хорошо если не заебывает. Тоже буду в пых вкатываться наверное, только в него и получается.
Ну так и че боишься? На 90% собесах это и спрашивают + про опыт работы, интересные нет проекты и задачи
>не заебывает ли вас эта работа?
Заебывает легаси ковырять. Но оно везде, это легаси
>Можно ли рассматривать пых как стартовый вариант с последующим переходом на другие смежные технологии, стеки?
Можно, но лучше сразу идти туда, куда хочешь, чтобы лишние года не терять.
>Вообщем каков карьерный путь пхп-разраба?
Как и у любого другого бекендера. Чисто технический джун-мидл-синьор, а дальше можешь в руководство податся: лид, техдир, сто, и т.д.
Не совсем корректно вопрос сформулировал я. Я рассматривал фронтенд, но без опыта сложно пробиться. А вот в пых проще. Думаю с опытом пыха, поболее шансов будет. Или я не прав?
>Как и у любого другого бекендера. Чисто технический джун-мидл-синьор, а дальше можешь в руководство податся: лид, техдир, сто, и т.д.
А по деньгам у пыхача как в сравнении с другими бэкендерами? С питонистами и джавистами к примеру.
Спасибо анон. И всего наилучшего тебе.
Щас на пыхе много легаси. Кабанитые разрабы ливают на модные стеки. А легаси кому-то надо поддерживать, так что активно набирают джуномидлов, пох даже если наврешь об опыте. Всё равно придется разбираться в древнем говне, пока не начнешь таски закрывать
Так наоборот. Из пхп люди укатываются, но работы меньше не становится, т.к. легаси кода полно.
Если легаси не пугает, то велкам
Вкатился в ГОвно в дополнение к похапе весной 19-го года. Не выдержал даже двух месяцев, выкатился и больше этот гной даже близко видеть не могу и никому не советую.
Даже не знаю. Некоторым и го нормально заходит. Лично я продолжаю спокойно пилить всякие црмки на симфе и не думаю никуда выкатываться. Кроме пыхи и го пробовал писать бэкенды на ноде и питоне - не понравилось хотя и бешенства не испытывал, как в случае с го. На досуге пилю пет проект на спринге, но пока без цели переката
В плане синтаксиса очень нравится шарп, но мне кажется, что с количеством вакансий на нем все печально
Ты наверное попал к бывшим пехапешникам, которые большие приложения с кучей бизнес логики на го пытались писать. го не для этого создан, суки
Тоже попал в подобное, поработал немного, разосрался с лидом и ушел обратно на пых
Тоже шарп нравится, но кушать хочется. Поэтому пока, смотрю то что доступно.
Если пошаговая, то можно хоть на голом пхп делать + лонгполлинг для обновлений на клиенте
Ну и брокер сообщений там ни к чему
Нормально лонг поллинг сделай и не будет ддоса
Почему это? Все что можно делать с ним на линухе можно сделать и на винде
Проверьте кто-нибудь задачу про экранирование, заранее спасибо.
лови шизоида
Профессионалы в торговле и складском учёте, в ИТ они достаточно осторожны и, видимо, привыкли к потоку вкатывальщиков. Достаточно простые задачи преподносят как инновации и ждут серьёзного или восторженного отношения к ним.
Вряд ли договоримся, хотя кто знает. На следующем собесе буду посерьёзнее, раз народ этого ждёт. И надо больше рассказывать самому, т.к. они походу не знают, что спрашивать.
Всё-таки, зависит от динамики ходов.
Если это что-то типа "героев", где каждый ходит по 5 минут -- то задержка неважна.
И всё-таки, я бы сразу взял сокеты, потому что они для этого предназначены и обеспечивают плавность/быстродействие, это важно для игр.
Исключение -- если это пет-проект типа клуба любителей настолок 40+, тогда наверн всем пофигу.
Годный пост, форумчанин, спасибо за наводку на учебник, как раз такой искал.
https://www.youtube.com/channel/UCjQ-mFzOpsWRg2zxUJHDkrQ/featured
Этот еблан даже ссылку на гитхаб не дал.
Код с виду хуевый. Подробнее не ознакомиться.
Зачем-то через одну строку пропускает - нет, чтобы в иде настроить междустрочный интервал.
А судя по длинне видосов, он там тугодумит.
Ну и нужно тебе такое? Лучше Елисеева навернуть, он там хоть много кода пишет и по ходу поясняет все решения
А что еще тебя спрашивать? Про солид которого ни в одном проекте нет? Или кишочки фреймворка?
бло я б прост спросил чем человек занимался на проекте конкретно, разрабатывал ли архитектуру, почему такую выбрал и т.д.
Это гонево по справочнику пыха и да, кишков фреймворков ЧТО ТАКОЕ СЕРВИС-КОНТЕЙНЕР? вымораживает, я уже хотел просто всю эту хуйню распечатать и сидеть тупо вычитывать, но слава богу уже нашёл где вкалывать за гроши.
лол,угадал-до 1 минуты ход
Аноны, мне нужно научиться делать простейшие веб-страницы с формами для обновления и редактирования таблиц в БД (либо мускуль, либо какой-нибудь из таймсириес движков), возможно с авторизацией. Для себя, для внутреннего пользования в небольшой конторе.
Посоветуйте актуально руководство для наиболее быстрого вката в это дело. Опыта с пхп не было, но думаю, что это самый подходящий инструмент для написания такой логики.
> желательно не времен палеозоя
Короче,ты должен знать базу-это 100%
Дальше просто гуглишь каждую задачу,можешь здесь уточнять.
А так начни с клепания формочки и отправки запроса к БД,получения ответа.Ну узучи SQL
Потом сделать форму и систему регистрации(с валидацией) и тд
Возьми какой-нибудь вордпресс и клепай свои формочки. Хотя я сильно сомневаюсь, что даже это по силам дегенерату, не умеющему в гугл
>Возьми какой-нибудь вордпресс
1. Это полнейший оверинжениринг для задачи "создать форму для обновления записи в бд". Надеюсь, ты не программист.
2. Требует изучения классов и методов самого WP, что, разумеется, совершенно избыточно и не нужно для моих задач.
Спойлер не открывал, там ничего умного все равно не будет. И пожалуй еще раз, если с первого не дошло: пошел нахуй.
>>2045791
>Короче,ты должен знать базу-это 100%
Это есть
>Дальше просто гуглишь каждую задачу,можешь здесь уточнять.
Вангую, что будет проблема как раз из-за отсутствия общего повествования. Хотя надрать кусков из разных мест это, конечно, классика
Еще раз,сделай формочку для записи в БД.
Mysql,PDO тебя ждут
https://www.php.net/manual/ru/language.variables.external.php
простейший обработчик
В итогу у меня один собес сегодня, 2 на следующей неделе и одно тестовое.
Начал готовиться к собесу, открыл известный многим список "250 вопросов для пхп собеса" и теперь сижу в полном ужасе. Не смог толком ни на что ответить, от паники капец как трясет.
Видимо идея слать резюме была не самой лучшей. Облажаюсь сегодня просто жестко(
do it
>В итогу у меня один собес сегодня, 2 на следующей неделе и одно тестовое.
Для начала неплохо. Главное вопросы с собесов и задачи записывай, потом пройдешь, если офер не дадут
>Начал готовиться к собесу, открыл известный многим список "250 вопросов для пхп собеса" и теперь сижу в полном ужасе. Не смог толком ни на что ответить, от паники капец как трясет.
Да и похуй. Никогда не знаешь, что тебя спросят на собесе. Могут дать то, чего нет в этих 250 вопросах - и что ты будешь делать?
>Видимо идея слать резюме была не самой лучшей. Облажаюсь сегодня просто жестко(
Ты правильно сделал. Нужно ходить на собесы, проваливаться, доучивать и снова на собесы
>Это полнейший оверинжениринг для задачи "создать форму для обновления записи в бд".
Поставь какой-то phpmyadmin, и пусть редактируют базу. Можешь еще разных юзеров создать, дать права на чтение и запись определенных таблиц. Я так понимаю что вам для какого-то внутреннего учёта какого-то говна. В будущем сможешь к бд прилепить какой-то свой интерфейс если захочешь
Смысл спрашивать такое? На каждом собесе по разному.
Самое частое: Солид, паттерны, архитектура, физбаз, сортировка/поиск/другая изи алго задачка, скл запрос, рассказ про опыт
Wordpress примитивнейшая хуйня, сделанная так, чтобы даже такой умственно отсталый как ты, смог начать клепать говно через пару десятков минут после вката. Ты все равно лучше и проще не сделаешь.
Я тебя нахуй не посылал, но раз ты так хочешь, то пошел нахуй.
Что душнила? Я прошел собесов 50 валился на низких софтах
Каждый раз по-разному проходит. Где-то могут по душам поговорить, где-то дрючить по теории. Никогда не угадаешь к кому попадешь на собес
>Wordpress примитивнейшая хуйня, сделанная так, чтобы даже такой умственно отсталый как ты, смог начать клепать говно через пару десятков минут после вката. Ты все равно лучше и проще не сделаешь.
Слишком толсто. У меня несколько сайтов на WP и я прекрасно знаю, как он работает. Чтобы что-то писать с интеграцией в сам WP, надо понимать именно обвязку WP; ну это очевидно любому, кроме тебя с твоим-то двухзначным IQ.
>Я тебя нахуй не посылал
Держи в курсе. А лично я и в третий раз не поленюсь
>>2046292
Это все понятно, но хочется красиво и без лишнего говна, буквально в несколько полей. Так-то и навикатом каким-нибудь подключаться можно.
Ну в общем я понял, почитаю какую-нибудь хуйню с пика или с >>2045782
Судя по содержанию, там раскрыто то, что мне нужно - ААА и связка с базой
>"250 вопросов для пхп собеса"
https://techrocks.ru/2021/04/18/250-php-job-interview-questions/
>Назовите различия между nginx и Apache
Интересно, ответ "nginx я пользовался, а апачи нет" сойдет?
Это достаточно старая книга еще времен php5. Потом придется подтягивать фишечки php7-8
>Причем тут /pr/ - ума не приложу.
Пыхомакака должна быть и девопсом, и фронтом, и бэком, и дизайнером, и нодистом, и гофером, и охуенным кабанчиком. И это всё за зарплату, меньшую в два раза чем у любого из перечисленных.
Про вордпресс лучше не думай, это легаси-движок для блогов/новостных изданий.
CRUD-ы очень быстро делаются на Symfony, только вот потом их модификация требует навыков.
Поэтому, проще сначала разобраться с чистым PHP:
https://www.php.net/manual/ru/reserved.variables.php
https://www.php.net/manual/ru/pdo.query.php
Выйду на пенсию -- запилю учебник.
>А сразу в симфони можно вкатиться или там нужно глубокое понимание ООП™?
Можно.
Насобираешь тонну подводных. Если выживешь - человеком станешь
есть арай, раньше был через обычную базу с SELECT итд, где можно было прописать все нужные критерии до селекта.
но сейчас все идет кучей и джейсоном.
суть. есть арай в котором есть id_name, email, region.
и вот в email есть не уникальные записи, а мне надо вытянуть данные чтобы не было повторов. как сделать?
я пытался пропустить через 2 foreach и in_array, неуникальных становиться меньше, но все равно не 1.
есть какой-то метод в пхп для этого? без js.
выглядит как-то так:
Array (
[1] => Array ( [id] =>23345 [email] =>
[2] => Array ( [id] =>664 [email] =>
[3] => Array ( [id] =>74 [email] =>
[4] => Array ( [id] =>32 [email] =>
[5] => Array ( [id] =>8888 [email] =>
)
Всё это делается православным foreach-ем.
Вопрос в том, что ты понимаешь под уникальностью. Какое поле должно быть уникально.
Как вариант, можешь проиндексировать список по имейл. При добавлении в результирующий список проверять, занят ли такой имейл - если занят, то не добавлять строку.
А какие ещё варианты вкатышу?
Собес много времени занимает? Целый день на него теряешь? В том смысле интересуюсь, отпрашиваться ли со своей работы на собес..
что-то не так с моим православным форечем,
на тестовых, где мало даных, все ок, но как подлючаю сервис, то не работает.
но количество уменьшаеться, в некоторых мейла с 200+ до 30. хотя все 200 одинаковы.
С херкой - минут 15.
Технический 1-1.5 часа
Если ты на удаленке, то даже отпрашиваться не нужно.
Нужно по конкретным кейсам дебажить, почему он дубли оставляет.
Без кода и тестовых данных мы не разберемся
>арай
это что за новояз?
"вытянуть" из БД -- используй либо SELECT DISTINCT,
либо GROUP BY `уникальноеПоле`
вы чо ему советуете
Я офис выбрал. Хоть и удаленка казалась куда ближе в плане своих плюшек и т.д. Со слов других людей - джунам на удаленке намного сложнее, нежели в офисе. Тут скорее уже зависит от того, какие конкретно у тебя приоритеты, анон. В офисе на начальном этапе намного больше плюшек в плане развития. Тут и софт скиллы прокачиваешь и намного проще заебывать людей разными вопросами, узнавать что-то новое от них и прочее.
Думаю, что начиная с миддла уже можно перекатываться спокойно на удаленку, если она ближе. Тут уже дело вкуса, имхо.
Но ведь в этом никакого полета мысли, унылая работать на дядю. Что гречневый на заводе, что мы - суть одинакова. У нас ток кормушка красивее.
Я вдруг понял это как то кристально.
У меня есть навыки, как я могу их применить что бы хоть херня - но лично мне падала? Это не банальное "где заработать денех в интернете", это более емкое - я владею инструментом и навыками, благодаря котором я могу создавать удивительные вещи. Но сдаю это в аренду другим.
Завел себе блокнот, в который мысли какие то пишу.
Пока не написал нихуя толкового, но буду педалировать эту тему жестко.
Кто то в моем ракурсе рассуждает?
>Пока не написал нихуя толкового, но буду педалировать эту тему жестко.
На этом всё обычно и заканчивается.
А создают что-то ушлые манагеры руками других людей
Я со временем буду перекатываться в android/iOS разработку, у меня гораздо больше идей разных приложений, чем бизнеса и сайтов для него.
Ну понятное дело что прогер это такая же работа как сантехник или пожарный с медсестрой, это сейчас из-за хайпа что там "сидишь целый день за кампухтером и получаешь триста тыщ" из них начали делать какую-то отдельную социальную прослойку и элиту.
Блять, что можно спрашивать три часа? Даже час это пиздец как много когда есть гитхабы и можно отправить домой с тестовым.
Встретил интересную задачу в тесте, не могу разобраться, как можно вызвать не именнованный метод класса, если бы просили создать ф-ию, то понятно, но в задании просят сделать класс.
Вот такой код приводит к ошибке "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');
>Блять, что можно спрашивать три часа?
На собесы походи, узнаешь. Зависит от количества спецов, которые тебя собеседуют. Если собес коллективный - то быстрее все проходит, разумеется. + на хрюшу некоторое время тратится
>>На этом всё обычно и заканчивается.
У меня не закончится, я дисциплинированный дохуя. Ща думаю в своем городе как то начать шляться по всяким бизнес тусовкам. Буду отслеживать.
Потому что сидя дома на жопе - явно никаких мыслей не придет в голову никаких. Нужен какой то контекст.
>>делать какую-то отдельную социальную прослойку и элиту.
естественно скилл-бокс как будет продавать свои курсы?
Я у меня есть и комерссы знакомые, и даже из элиты. Между кабанчиком и прогером по личным качествам огромный перевес в сторону кабанчика.
Дарт изучай, сам хочу.
Тут есть ограничение в том, что в константах могут быть значения разных групп. У тебя тут только ивенты. Соотв если добавить другую группу констант, то их придется фильтровать.
А так прикольный способ.
Use the serializer, Luke!
спасибо, не знал про __invoke
https://phpclub.ru/mysql/doc/tutorial.html
Учитывая что тут кто-то за 5 месяцев на ларавел уже на работу вкатился, а я за эти 5 месяцев только до этого дошел, слово мозг можно зачеркивать.
прокрастинировать за компутером
короче за ~5 месяцев погромирования из которых я минимум месяц занимался ничем я решил:
учебник опа без бонусных задач (2 бонусные решил и все);
прочитал про хттп, шаблонизацию на пыхе, решил все задачи, которые нужны для того чтобы можно было решать задачу про список студентов (непонятно как решать по замыслу автора если там требуется ООП), перешёл на подробное изучение sql (около недели потратил на выгеперечисленное);
То есть большую часть времени я просрал на решение неинтересных задач, а ещё нужно начинать вкатываться в ООП, поднатаскать CSS, кучу других трудновыговариваемых вещей и писать пет проекты.
Короче я еблан тупой раз тут некоторые личности за полгода уже работу нашли (это при условии что я путягу закончил по этой специальности).
Я не знаю как тебе помочь, поэтому поделюсь способом приготовления доширака, может быть кому-то понадобится:
1. Распаковать "Доширак", высыпать маленькие пакетики с овощами и суповой основой в контейнер ;
2. Скипятить чайник, затем налить кипяток в контейнер до отметки;
3. Закрыть крышкой и подождать 5 минут.
Приятного аппетита!
Жди экспертов местных, я только щитпостить умею.
>То есть большую часть времени я просрал на решение неинтересных задач
Готов к реальной работе. Километры багов и однообразных формочек ждут тебя
Нет. Голый php может выступать в роли шаблонизатора.
Т.е. ты в одном файле может мешать php, html, css, js но так делать в продакшене не надо, такое только для учебных целей
Учел ваше охуенно важное мнение.
Изучать шаблонизаторы и разбивать на компоненты
А чем ты недоволен-то?
Сделай простейший CRUD для студентов, покрась кнопки -- и уже можешь идти поражать воображение провинциалов ОЙТИ-магией
>>2048425
И что же ты такого понаписал, чтобы УТОНУТЬ в инклюдах на этапе изучения?
Сначала разложи всё по папкам,
потом сделай простой роутинг типа ?page=boo.php ,
потом двигайся в сторону MVC
Тут только ленивый не упоминает что за 5 месяцев уже мидлами за 300 к/наносек работают, а я все до ООП не дошёл.
Так вкатуны время тратят на всякую херь, которая в работе им не поможет на первых порах. Отсюда и замечания про 5 месяцев.
Понятно, что это вкатуны, они не понимают, что от них ждут на галере.
Вкатуны всё какие-то внутрянки пхп дрочат, ооп, мвц изобретают.
А надо круды ебашить +- как старшие коллеги по цеху.
>С таким прогрессом ты вкатишься, когда пхп будет чем-то вроде кобола
Востребованным специалистом будет. Бабок лопатой гребсти будет...
обзмеился с аналогии сука
> за 5 месяцев мидлами
очевидно же, что это нонсенс
>до ООП не дошёл
так дойди, в чём проблема
>за 5 месяцев ... я все до ООП не дошёл.
Хули там доходить-то? Ты овердохуя потратил времени на какую-то хуйню. А если думаешь, что 2-3 часа в день для вката это норм, то это нихуя не норм. И да, веди конспект. Прям как в школе. Только в электронном виде — очень сильно помогает. Не дрочи функции наизусть, для этого справочник есть. Код сниппеты полезная вещь. За 5 месяцев пиздец как реально выучить язык, PSR-* , уверенно плавать в ООП, познавать азы алгоритмов, композер с гитом использовать. Подумай дважды: либо бросай и займись чемто другим, либо заканчивай прокрастинировать.
>Бьют ли ногами за подобное
Если ты имеешь ввиду энтерпрайз разработку, то бьют в кадык с пыра.
>Пока енамы не подвезли
И "енамы" и рефлексия используются очень ограниченно и в строго отведенных для этого местах. Могу подробнее расписать если интересно.
>Если ты имеешь ввиду энтерпрайз разработку, то бьют в кадык с пыра.
За що?
>И "енамы" и рефлексия используются очень ограниченно и в строго отведенных для этого местах.
Интересно, как ты используешь енамы в языке без енамов? Кроме псалма или возни с рефлексией ничего в голову не приходит.
А сам на php работаешь? Мне казалось наоборот, у похапэ более адекватно всё...
Нет. Часто берут пыхача и он ещё и фронт пишет за копейки. А вот если есть отдельный фронтендер, значит что контора не скупится на персонал/зп и все своим делом заняты.
>За що?
Есть технический аспект - слишком медленно работает, слишком запутанный код получается. Читать эту хуйню потом очень тяжело.
Есть семантический - слишком много углов срезается, слишком большие возможности там где минимум ответственности. Код пишется не от пизды, а сос мыслом. Например список констант, в твоем случае, это не список возможных событий.
>Интересно, как ты используешь енамы в языке без енамов?
Я и написал в кавычках. В коде приложения вообще никаких "енамов" и не должно быть. Все это используется в обвязке, чтобы создать объекты с нормальными типами.
>Кроме псалма или возни с рефлексией ничего в голову не приходит.
https://3v4l.org/lOC2h
вот же ты мразь погана. Не проще сделать конфиг? Или уже как нормальные дяди заводи класс под каждое событие
Хз даже. С одной стороны особо выбора не было тогда в городе: либо 1ass, либо верстка, либо битрикс/вордпресс. Кое-как попал туда, где на фреймворках пишут.
Так бы хотел, конечно, на шарпы закатиться бекенд писать
А ты в замкадье... В дефолт-сити поинтереснее вакансий. Ну для вкатунов, не особо весело всё.
Именно для того, чтобы избавиться от этой хуйни (ручного дублирования констант в методе или массиве, возвращающем их список) я и родил свою хуйню. Я еще и дальше пошел и сделал через __callStatic, чтобы можно было вызывать UserEvents::userCreated() лол.
В итоге удалил все к ебени матери и оставил только список констант.
>Например список констант, в твоем случае, это не список возможных событий.
Почему?
На работе лишь однажды пришлось использовать рефлексию, когда было нужно протестировать приватный метод. На мой вопрос, нахуя его тестировать, сказали что так у них заведено
Касательно скорости работы с рефлексией, не думаю, что падение производительности будет заметным даже на фоне рядового чтения из бд
Не в тот тред
А хули ты думал? Будешь как миленький ворочать красно-черные деревья на собесе и урчать
Да я знал все это дерьмо, но извини когда это было! Я матаном уже столько не пользовался
Я перед собесами в обязательно порядке перелистываю "Грокаем алгоритмы" и "Дискретную математику для программистов" Хаггарти.
>ручного дублирования констант в методе или массиве, возвращающем их список
Это не дублирование. Ты не дублируешь определение констант, а определяешь новую со списком возможных вариантов.
В твоем же коде с рефлексией множество констант со значениями перечисления это подмножество всех констант класса. А работаешь ты с какого-то хуя именно со всеми константами класса, а не с конкретным подмножеством. Но это все технические детали твоего конкретного решения.
В целом речь о том зачем тебе вообще использовать список всех возможных вариантов. Я вижу только одну причину: у тебя есть строка с названием события 'user.created' и тебе нужно создать объект UserCreatedEvent. А для этого вообще не нужен концепт перечисления. Создание будет происходить в одном единственном месте. В каком-то условном сервисе CreateUserEvent или UserEventFactory и нет никакой нужды создавать для этого какой-то специальный класс перечисления.
>__callStatic
Та же история что и с рефлексией. Все это метапрограммирование снижает предсказуемость и понятность кода. У такого класса просто нет внятного интерфейса, и пока в него не залезешь хуй поймешь что у него можно вызвать, а что нельзя. Ниче, пару раз порасковыриваешь кал из магических методов или поищешь косяк вызванный рефлексией и сразу перейдешь от "нихуя как могу" к "надо попроще".
>Касательно скорости работы с рефлексией, не думаю, что падение производительности будет заметным даже на фоне рядового чтения из бд
В доктрине, например, для скорости используются прокси, а не рефлексия. А тут https://github.com/myclabs/php-enum используется кэш.
Нахуя? Ты на РНР «программируешь», зачем тебе что-то сложнее основных математических операторов? Когда ты последний раз что-то серьёзнее псевдослучайного генератора писал?
А кто блядь?! 6-8 месяцев это с учетом освоения фреймворков js/php, выполнением учебных заданий.
Чисто язык, ООП, шаблоны, проектирование, git, composer как раз в 5 месяцев уложишься. Потому что погружение в лаву/симфони может занять ещё ровно столько же. Опять же, джун на то и джун, что в начале своего пути и знает что-то из основ.
А есть где нибудь задания практические, типа дана верстка, к ней надо круды написать? Гугл ничего не дает(( Или самому все придумывать и исполнять?
Каким образом?
Например потому, что в тех местах, где я соглашусь работать, вопросы про алгоритмы на собесах встречаются почти всегда. Во вторых, похапе всего лишь один из языков, на которых я пишу. В третьих, тот, кто не умеет посчитать сложность алгоритма, не знаком с наиболее распространенными структурами данных, булевой алгеброй, хотя бы зачатками комбинаторики и теории графов итд., не программист, а макака ебаная.
Если ты не занимался ничем, кроме крудобесия, то не нужно проецировать свой "опыт" на всех остальных.
Тут собрались формошлепы, а ты за теорию графов и булеву алгебру какая сложность ебана в рот, кого ты удивить то решил?, лол.
Вообще, вот его высер надо перекатить в следующий тред, эталонный дебил. Пишешь свою бд в рамках курса университета? Ну пиши далее, про реляционную алгебру не забудь.
>Клуб изучающих PHP
>тот, кто не умеет
>не программист, а макака ебаная
Ты попал по адресу. Милости прошу к нашему шалашу.
Ну вот допустим если отбросить подъебки. Какой алгоритм ты реализовывал, чтобы пришлось считать его сложность? Какие структуры данных создавал и с какой целью? Понятно что на пхп это бред. Но помимо пхп, на любом из тебе известных языков.
>Чисто язык, ООП, шаблоны, проектирование, git, composer как раз в 5 месяцев уложишься
Ну если в твоем супер-режиме когда ты без перерыва 8 часов хуячишь и остаешься сконцентрированным все это время, то может быть.
А что собственно сложного? Ты же 8 часов не думаешь над реализацией , читай как придумывание, ты занимаешься пониманием написаного и повторения изученого.
Упрощают написание своих движков
Ну если ты копипастил с гугла решение для задач из учебника, а не сам решал, то нет проблем.
Ты не занимайся подменой понятий. Я писал про другое. Понятное дело, что решение задач из учебника может занять достаточно времени. Тут уж вовсе индивидуально. Помню несколько тредов назад чувак потратил на решение одной задачи около двух недель. Когда она решалась буквально за 2-3 часа.
И опять же повторю, прочитай мои комментарии выше ещё раз. Я писал не про решение задач, а про изучение основ.
А задача про студентов из ОП-поста чем не CRUD? Только она с кучей комментариев и советов. А еще у нас есть задача про TestHub, там есть админка с кучей страниц, там круда предостаточно.
Абстрактный класс - это класс, предназначенный для наследования от него других классов. например, ты прикручиваешь оплату через разные платежные системы. И можешь, используя абстрактный класс, реализовать основу, а далее уже используя конкретные классы, реализовать взаимодействие с разными платежными системами. И если завтра понадобится подключить еще одну платежную систему, то (при правильном проектировании) достаточно будет лишь дописать еще один класс, и существующий код сможет с ним работать.
Интерфейсы. Допустим, что у тебя есть разные сущности, пользователи могут их создавать, а модератор может просматривать их список и "публиковать" сущности на сайте. Ты можешь сделать общий интерфейс для модерируемых сущностей, и тогда один и тот же код позволит публиковать их, несмотря на то, что каждая сущность представлена своим классом. И опять же, если завтра понадобится добавить еще одну сущность, то достаточно будет сделать, чтобы она реализовывала интерфейс. Из интерфейса будет видно, какие методы необходимо реализовать.
Уточняй, если что непонятно.
Кто-то тут еще подменяет понятия, рассматривая "изучение основ" без решения задач... Сука...
Причем ранее я удачно добавил виртуальный хост на порт 5001
<VirtualHost :5001>
...
</VirtualHost>
сейчас пробую добавить новый сайт на порт 8000
<VirtualHost :8000>
...
</VirtualHost>
команда -
и в браузере получаю тупо "попытка соединения не удалась"
В ufw пишет что порт 8000 открыт.
Если пишу кооманду netstat -tulpn то среде вывод нет моего 8000 порта.
Где косяк можете предположить? Сломался апач? Или я навасянил с настройками iptables.
Я не помню уже, с этой виртуалкой чето делал полгода назад, бляд
И еще - я попробовал отключить по умолчанию установленный вируал хост - сайт перестал работать, но апач2 в браузере начал открывать каталог этого сайта.
Подучить английский, изучить computer science, по сетям почитать теорию. Если использованием техи у вас нет проблем то вообще збс.
Если ты задаешь этот вопрос только на пятый месяц, то у меня для тебя плохие новости - ты скорее всего не будешь делать нихуя полезного остаток времени.
>>2050188
>по сетям почитать теорию
Неактуально и бесполезно.
Первое - потому что сетевики уже нахуй не нужны и их зарплаты неуклонно падают, а для других областей глубоко знать сети не нужно, максимум L2+L3.
Второе - потому что теория без практики ничего не даст и он без лаб уже забудешь все, что прочитал через пару дней. А разумеется, в армии нет нормального сетевого оборудования.
>>2050188
>Подучить английский
Тут соглашусь, норм совет. Только если есть стабильный интернет и возможность заниматься с нейтивами или хотя бы индусами с italki. Если никто не будет тебя проверять - эффект будет стремиться к нулю.
В дс хотя бы эти самые ваки есть. За мкадом их просто нет. А удаленка на тот момент не была особо популярной
Единственное, что могу порекомендовать быть максимально подготовленным (готовься, как в последний раз), и как можно больше денег брать. На своем опыте говорю, неудачно приехал в дс, работаю курьером и теперь крайне сложно вкатиться.
Я уже ни в какие дсы не планирую. Работаю пыхарем на удаленке
>На своем опыте говорю, неудачно приехал в дс, работаю курьером и теперь крайне сложно вкатиться
Соболезную.
У замкадышей не много шансов на нормальный вкат в дс. Только если он гениус, либо родители деньгами подсобят
А ты в какой стек катишься?
Либо в пых, либо во фронтенд. Пока не могу определиться.
Челик, чо ты такой токсичный-то ебана в рот? Ну сиди изучай на практике вывод и форматирование строк, реверсно печатай их и играйся с их регистром. Задачи навроде булевой алгеброй, массивы, циклы действительно стоят внимания ну никак не дольше пары-тройки дней. На что ты так уповаешь я откровенно говоря понять не могу.
ООП действительно сложная тема, но я и написал, что в него за 5 месяцев можно окунуться до уровня понимания основ.
Чет вы нежные какие-то, натуральные жуки-плавунцы. В обучение не можете. Хули вы там резину тяните-то? У вас либо проблема с абстрактным мышлением, а это говорит о хуевой мат подготовке, либо вы прокрастинируете попутно думая нахуй оно это мне надо и хули мне девки не дают.
Документацию не читай
@
Комментарий оставляй
Ты xampp поди юзаешь?
Короче, в httpd.conf добавь строку
Listen номер порта
Номер порта понятное дело такой же как у виртуального хоста. Ясен хуй не забудь проверить что ты там нахуевертил в iptables. Лучше всего очищай сразу все правила в нем.
Перезагрузи демон апача и проверяй.
>сетевики уже нахуй не нужны и их зарплаты неуклонно падают, а для других областей глубоко знать сети не нужно, максимум L2+L3.
Ох лол бля. Если бы ты понимал про что ты пишешь, маня.
мимо
>Помню несколько тредов назад чувак потратил на решение одной задачи около двух недель. Когда она решалась буквально за 2-3 часа.
Лол, меня аж запомнили. Я кстати уже полгода не могу сделать сайт по регистрации студентов
Да как тебя забудешь-то? Впервые таких необучаемых увидел. Я же тебе тогда писал оставь программирование это не твоё. Отучись пока не поздно на электрика или газосварщика. И деньги всегда будут и ума особо не надо.
Напугал...
Но ты то ведь бездарь, который до сих пор не смог вкатиться. Умение работать руками тебе всегда поможет честным трудом заработать на хлеб с молоком.
>Но ты то ведь бездарь, который до сих пор не смог вкатиться.
А ты настолько счастливый вкатун, что серишь в треде на дваче на невкатившихся. Глазки болят наверное, анальник?
Я счастлив, а ты так и не смог стать счастливым разработчиком. Я тебе даю ценные, дельные советы, а ты подобно макаке своими фекалиями в окружающих кидаешься.
двачую додика, так держать
не обращай внимание на шкилу
Я не тот анон который сайт написать не может, я к фреймворкам еще не притрагивался.
Спасибо!
Вот есть у меня сервис на PHP. И допустим, он парсит некий сторонний сайт, берет оттуда данные. Проблема, что тот сайт быстро меня забанит, так как все юзеры моего сайта по сути будут действовать от IP моего сайта.
Как реализовать эту схему таким образом, чтобы юзеры заходили на мой сайт, но далее парсинг стороннего сайта производился бы от имени ихних IP?
если, вообще, это возможно. Мне кажется на JavaScript что ли?
Найди бесплатный проксилист, и через него делай запросы.
Так ты разные user agent используй для своих «юзеров».
576x1024, 0:07
Самое забавное что я итак отучился на сварщика но рвать жопу ради средней по россии тоже не мое
А напрягать голову, овертаймить и выгорать хочешь?
братик ебатик, как ты не поймёшь, что ты сваркой в месяц можешь иметь больше, чем вкатывальщик в офисе. Никто не говорит ебашить на заводе/стройке. Первое время, конечно, стоило бы на заводе ума да опыту набраться, за год повысил бы квалификацию, а далее по авито/хуито раскидываешь объявы частный сварщик. В дачный сезон, с апреля по октябрь, у тебя отбоя не будет от сварки ворот до заборов. И постепенно набиваешь клиентскую базу с помощью визиток. Ах да, если освоишь электромонтаж — ты в среднем 200к/месяц будешь чистыми иметь. Это я про кручение кабанчиком имел ввиду. Нет заказов по сварке ебашишь электриком. А есть ещё сантехника. Ремонт вообще дело такое. Так что анон, оставь программирование и работай на себя. Главное побольше профессий освой. И не бужет нужды унижаться на собеседованиях, учить каждый день 2 новых фреймворка.
Двачую.
Как стал интересоваться, сколько ремонт стоит, знатно прихуел. Моей сотыги не хватит на это всё
Ой да, щас бы с пидорахами иметь дела в плане предложения услуг-их оплаты, уж лучше в офисе работать за опыт, чем с пробитой головой лежать в дачной канаве, потому что отказался принять в качестве оплаты пузырь и перетерть с ним за жизнь на полянке.
блядь пока писал это, возле меня ничер нарисовался, лел
Лол, ты ещё не имел опыта наеба в офисе. Кстати, систему предоплаты и договоры никто не отменял. Ну смотри, ананас, как хочешь. Поверь, вкат не стоит того как ты себе его представляешь.
Как там, классическая схема: сперва найди какую-то проблему, недоработку. Затем придумай как это исправить или улучшить. И наконец - заработай на этом! Справедливости ради, скажу, что еще не придумал, что конкретно буду пилить, но думаю найду в процессе, погружаясь в разные области. Это может быть новый платный плагин, скрипт, или вообще сервис.
Даже, если ничего не выгорит, то максимум чего я лишаюсь это несколько десятков баксов на домены и хостинг. И мое время. Но какая разница куда тратить время, просматривая очередную ненужную ленту какого-нибудь хвастограма, или писать свои формочки с запросиками. Главное, знать меру, не перенапрягаться, отдыхать, чтобы не перегореть. Всем успешного пути!
Очень уныло.
Существенно. У джависта область куда шире, чем у нас. Миддл РНР будет 120 в среднем иметь, часто слышу, что это пиздешь и все получают больше, но пруфов ни у кого нет. 120 это ещё прилично. В основном 100. Джава разраб спокойно 200-250 будет иметь. Особенно те, кто в банках работает. У меня знакомый в оракл работает, пилит какие-то части их базы данных. На руки получает 250. Он как раз мидл. Как по навыкам, так и по знаниям. И рост, с его слов, у него едва ли не безграничный. Опять же с его слов нач их отдела получает 600к, сам он джава разраб со стажем 15 лет, куча сертов, успел поработать на Западе, куча связей, регулярно выступает на конференциях, может в архитектуру с 0 до 100% проект выполнить.
>Миддл РНР будет 120 в среднем иметь,... 120 это ещё прилично
Это значит, что мне еще повезло, что по медиане получаю? А мог бы как тот кадр 6 лет опыта и 90к
Выходит повезло. Опять же, галера галере рознь и может где-то правда платят 150-200 РНР мидлам, но я откровенно говоря сомневаюсь. Вот фулл стэк сеньорам да, тут соглашусь. У этих з/п приличная по меркам РНР разрабов там и 250 как нехуй делать можно иметь в месяц. Чистый бэкэнд если только тимлид/архитектор будет получать прилично. В основном это жалкая 100. Увы, рыночек порешал.
Конечно я понимаю, работал сетевиком, имею устаревший CCNP и актуальный HCIP по облачным ресурсам
Ну, в принципе, если тебе 20 и ты не обрамлён тяготами семейной жизни, то 100 это норм. Сычевать на окраине ДС, в клоповнике за 30к, 20к на пожарть и 50к откладывать на будущее. За год можно скопить 600к, а за 10 лет 6кк. Но потом надо будет что-то думать. Либо перекат в с#/java, либо обратно в деревню с 6кк.
Кому в пидорахе нужны профессионалы облачные? Ты совсе ебобо что ли? Ты ещё azure/aws подтяни, лол. Пиздуй в безопасность, а там из банков будут звать к ним за 200-300к.
Когда мне было 25, получал 30к и жил с мамкой это казалось неплохими деньгами.
Сейчас сотыга воспринимает как обычная рабочая зп, которая должна быть у веб макаки. С голоду не дохнешь, но и не пошикуешь особо
не дс
>Кому в пидорахе нужны профессионалы облачные?
Моей прошлой конторе были нужны, ну тем более, что они сами заплатили за обучение и сертификацию (хуавеевскую). А циску я получал сам, по приколу, много лет назад.
>Ты совсе ебобо что ли?
Где ты оставил аргументы? Вернись и подыми
>Ты ещё azure/aws подтяни, лол.
Если мне оплатят это дело - легко. Но я не занимаюсь ни ажурой, ни aws, так что шансы невысоки.
>Пиздуй в безопасность, а там из банков будут звать к ним за 200-300к.
Неинтересно, спасибо.
Ну и пошёл на хуй, мудак ты чсвшный. Хуй соси губой тряси, терпила в жопу выебанная.
https://ideone.com/i6y0lf
Ты что-нибудь знаешь про алгоритмы, ИИ, теорию графов? Задачу ты хоть и решил, но это пиздец. Посчитай сложность алгоритма, у тебя же код медленно работает пздц.
Грустно это(
Про графы и всякие алгоритмы их обхода в универе учил. Кстати, всегда очень неплохо получалось решать всякие штуки с ними. Поэтому и крайне неприятно удивился себе и тому, сколько трудностей задача вызвала.
>250
>а для РНР это обычная зарплатка сейчас
Ох какой жир. На hh.ru правда есть пара вакансий middle php 300-400к, но я со своим опытом в 10 лет даже не стану туда кидать резюме. А ты дерзай, будешь успешным.
50-70 000 р для Java разработчика, и желательно еще знать C++.
А бывает и такое: https://spb.hh.ru/vacancy/44314799
Ну ты же понимаешь, что приведённые тобою ссылки скорее исключение из правил? Ну, действительно есть конторы, которые платят мало. Тоже самое справедливо и для галер. Сколько раз итт постили вакансии чуть ли не сеньоров, а предлагали за это 50к. И опять же, выше речь шла за ДС, а не за провинцию.
Как раз выше задавали вопрос про абстрактные классы и интерфейсы. Через них это всё реализуется. Наследуешь класс, добавляешь ему поля и радуешься жизни.
а какой долбоёб в классе птицы добавил функцию летать? git blame и нахуй мудилу из профессии
Насколько все хуево? Вкатываюсь ну как, уже работаю администратором пары сайтов в небольшой фирме по продаже всякой промышленной хуйни 3 год.
http://pastie.org/p/78bwFnG64jV0zngJ9YHkEF
>Насколько все хуево?
А ты как-будто бы сам не понимаешь? Твой код выглядит как код из книги 2005 года для PHP 4.
Такой код может быть достаточен для какого-то лендинга или простого многостраничника.
Только вот объем кода, с которым работает средней руки макака раз в 1000 больше для справки текущий мой проект 500к строк, плюс этот код прикручен к фреймворку, плюс там ооп и мвц.
Так что лучше напиши какой-нибудь CRUD из шапки на симфони/ларавел - с этим уже можно на собес идти
Вот что плохо:
- логика получения данных и отображение данных перемешано в одном файле. Правильно было бы разделить получение данных (один файл) и их вывод с помощью шаблона (другой файл). Также, плохая идея выводить HTML с помощью echo. Ты можешь почитать про шаблонизацию, чтобы это исправить: https://github.com/codedokode/pasta/blob/master/php/templates.md .
- делать много запросов (на каждую категорию) в цикле неэффективно. Эффективнее выбрать массив всех категорий одним запросом.
- код написан стеной без разделения на части. Лучше было бы вынести получение данных в отдельные функции с понятными именами вроде getСategoriesList(). эти функции могли бы пригодиться и на других страницах.
Если ты хочешь научиться сделать свой код лучше, я советую посмотреть нашу задачу про студентов (в шапке треда). В ней много полезных советов, и ты бы мог их использовать для улучшения своего кода.
И еще. Пагинатор имеет смысл сделать отдельным независимым шаблоном, чтобы его можно было подключить на любой другой странице сайта.
Я бы со всем примирился, но вот это пиздец
или так не делают?
зависит от того, что ты хочешь с ними сделать
Тебе кто-то запрещал это делать?
ЗЫ: это называется форк и ты как бы должен указать источник откуда спиздошил код.
Так код сам буду писать по заданию, какие форки.
зачем их переделывать?
Папка твой?
Ну хоть что-то.
Это один анон говорит постоянно. Какие мы?
Надежнее наверно в БД, но тогда надо, чтобы кто-то их периодически проверял.
>>2057706
Можно, если ты сам напишешь код.
>>2058650
Чтобы подключить платежную систему, надо заключать с ними договор. Без договора ты можешь только поискать какую-то платежную систему, которая предоставляет демо-доступ к тестовому API.
То есть ты обычно сам не принимаешь платежи, а используешь, например, робокассу, яндекс-кассу, stripe и другие подобные сервисы. С ними идет взаимодействие через API: они отправляют тебе HTTP-запрос в случае успешной или неуспешной оплаты.
Вот пример API от Яндекс-кассы: https://yookassa.ru/developers
А вообще, тестхаб по сложности приближается к реальным приложениям (реальные приложения отличаются от учебных в основном огромным объемом, принципы там те же). Так что если ты хочешь что-то близкое к реальности, то это должно быть что-то сложное с кучей возможностей. Например, в магазине какой-то сложный каталог, система скидок, много способов доставки и оплаты, аналитика по продажам итд.
Это копия, сохраненная 6 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.