Это копия, сохраненная 22 апреля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
В нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1552970 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467
Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
С чего начать
У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка 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
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны 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? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: 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 вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2 (рус.): https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
https://github.com/Vladrigos/StudentList/
Если вдруг я кому-то не ответил в прошлом треде, можете напомнить о себе тут.
Могу, кстати, сразу несколько советов дать по поводу https://github.com/Vladrigos/StudentList/
- сделай папку public, как описано в задаче, чтобы из браузера не были доступны все файлы проекта
- почитай урок про SQL инъекции и используй плейсхолдеры при подстановке переменных в запрос: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
- почитай урок по DI и явно передавай объект PDO в StudentGateway вместо использования синглтонов: https://github.com/codedokode/pasta/blob/master/arch/di.md
Осталось это же через ООП запилить
он отсылает меня в шаблон, который парсит в нужной мне разметке уже то, что пришло с контроллера. проблема только в том что сам js код проблем не вызывает и ajax не ловит .fail
вместо этого при переходи на любую из страниц пыха мне выдает что undefined variable т.к. видимо из за того, что с контроллера нихуя не прилетает. так вот с чем связано то что ничего не приходит?
У тебя контроллер наследуется от БД, че за пиздец, во всю используются глобальные переменные. Нет тестов.
Пиздец!
Давайте вместе порадуемся этому.
Тащемта если отбросить обсер с видимостью переменных в функциях, я ломал голову над знаками, которые должны быть в запросе sql. Стаоался там кавычки поставить, запятые как отдельные символы ставить. Но это оказало проще.
>У тебя контроллер наследуется от БД
Теперь не наследуется
>во всю используются глобальные переменные
Ты про статические методы?
>Пиздец!
Понимаю! =)
Тесты заебись писать когда ты сидишь на работе и тебе за это платят, а не с голодухи в поисках вката, или заказа, или обучения.
Т.е. только тогда когда это хоть кому-то нужно.
Глобальные переменные вроде $_SESSION. Не используй их, потому что тесты потом не сможешь написать. Есть всякие библиотеки, которые позволяют работать с сессиями и куки как с объектами, гугли.
>Есть всякие библиотеки, которые позволяют работать с сессиями и куки как с объектами, гугли.
Да ему одного объекта хватит, куда это всё убрать можно. Зачем библиотеки?
Чтобы по psr все было.
Пишу бота, как лучше организовать хранения справочника типов ответа?
Есть родительский класс Response,
есть подклассы ResponseImage, ResponseText
Есть таблица в бд response - история ответов.
Как оргранизовать справочник типов Response, чтобы в дальнейшем, знать как правильно обрабатывать историю ответов из бд.
1. Хранить в отдельной таблице response_type(id, class_name), и получать type_id в дочернем классе каждый раз запросом к этому справочнику (поиск по имени класса)? Это увеличит кол-во запросов к бд, на сколько это существенно?
2. Или прописать типы в родительском классе? Тогда каждый раз создавая новый класс-ResponseNew нужно будет изменять родительский класс.
3. Создать справочник в бд по всем типам, а в дочернем классе прописать только его type_id?
Два последних варианта - это вероятность возникновения коллизий в будущем при поддержке нескольких ботов.
Это случайно получилось, вроде code cleanup в phpstorme
забей, нахуй не надо. если есть потребность в тестах на питоне - изучай сам.
будет быстрее, эффективней, дешевле.
так что дрочи пых и пытайся щас уже галеру найти где будешь грести, ибо летом после выпуска будет огромная волна студентов, а осенью еще больше. в связи с этим будет как бы проблематично искать будет. алсо, летом все в отпусках и особо вакансий на рынок не выкидывают
Курсы бесплатные если что, от мэйла. Спасибо за совет, анон.
бампец
Во многих ваках спрашивают за тесты с порога.
Если конечно не хочешь пойти в говноконтору, где нет тестов и всё тестируют вручную
Если что это переделанная.
Дается массив с числами например
[01,0,1,02,2,5,04,4]
Как убрать из него восьмеричные числа типа 01,02,04.
Ребят скажите плиз, как в php фриланс вкатится? Если я уже все основы веба знаю, только опыта нет. Можно где-то беслпатно поработать? Заказики повыполнять, постажироваться
Если ты правда знаешь как верстать, PHP и т.д То ты никогда не согласишься делать что-то забесплатно.
Так у меня практики нету, я не знаю как монетизировать свои умения. Если я не получу денег но получу опыт, который потом смогу монетизировать, это уже хорошо.
Но да, конечно забесплатно делать это крайний вариант
Сменил три работы - нигде тестов не писали. Что-то где-то про это говорилось на начале проекта, но потом всегда хуй забивали. Да, это плохо, но далеко не везде их пишут.
Сейм на двух работах сидел и сижу без тестов и это хуево. Сам для себя пишу тесты в изолированных кусках кода
Проверить бизнес логику
Чтоб тебе на продакшене ни одного теста не было, пидор
>Зарплата от 200 000 до 300 000 рублей в месяц. Зависит от количества допускаемых вами ошибок (объективно).
>ошибок
Че за нахер?
Это уже к веб серверу. Погугли https имя твоего веб сервера. https apache2 Там уже есть инструкции.
Ну очевидно, что заносчивые люди будут при любом найденном проблемном или спорном моменте качать права и предлагать снизить зп
Компания еще и полулегальная небось, так как продает акки
Первый раз с этим сталкиваюсь. В Си такого не было. Хотя с поддержкой сайтов про регулярки не так уж и сложно, но подумать всё равно надо.
Я думаю через try catch и typeException, или какие там есть исключения, выдать 404 страницу
дополню в бородатые времена была программа элиза она хоть и на лиспе но прочитав код поймешь принцип, работала как чатбот.
https://www.youtube.com/watch?v=ixfsmWVAD_0
Я просто своего друга учу и делаю ему видео. Если вас тут покажется полезным, могу улучшить звук и закидывать. А так, это не реклама, я просто напился и решил, чобы не поделиться.
инфа для нубов от этого не становится менее ценной
>Проще сделать папку, в ней хранить файлы с именами, соответствующим логинам или id пользователей, а не пытаться это засунуть в конфиг. Если пользователей всего несколько, можно и в конфиг, благо YAML позволяет многострочные тексты. От 150 строк ничего страшного не будет, и при желании можно это вынести в отдельный файл и инклудить его.
Да, пользователей всего несколько - 3-ое (Alice, Bob, Tester). Правило ли будет поместить в services.yaml в поле parameters следующие поля: alice_public_key, alice_private_key и т.д, и поместить в них многострочный текст? Как потом получить доступ к этим параметрам Symfony Console?
Ключи хранятся в отдельной папке. Папка исключена (так как ключи приватные) из систем контроля версий. Ключи берешь через file_get_contents или что-то подобное (к примеру криптобиблиотеки могут принимать файл ключа как параметер). Файлы или именуешь по айдишникам пользователей (как анон выше говорил) или добавляешь в таблицу юзеров поле с именем файла ключа.
Что-то типа такого. Три нижних таблицы это если тебе нужно сохранять ответы пользователей (причем каждый пользователь может пройти несколько тестов) для самого теста они не нужны.
Сорре, протрезвел, грохнул этот видос, стыдобра, лучше потом сделаю нормально и трезвым.
нормально
Аноны, как лучше обрабатывать тяжёлые POST-запросы, многомегабайтные, с BigData в виде JSON'a?
Сходу вижу два варианта.
Первый - это читать JSON из TCP-потока, и сразу обрабатывать,
второй вариант - это писать его в файл,
пока соединение не оборвалось, а потом обрабатывать,
и если оборвётся то есть время и место - обработать запрос частично - пусть позже, но из кэша.
Что посоветуете?
Хочу родительский дженерик-метод, который использует имя класса, но self::class и __CLASS__ возвращают класс-родитель.
php://input
Репозиторий это абстракция от хранилища. Это нужно чтобы код модели не зависел от конкретного способа сохранения данных.
Профиты будут, соответственно, если хранилище данных придется менять. Некоторые долбоебы думают что это типа переезда с mysql на postgres, но это относится и к переезду на новую версию базы или кешированию.
Так что я рекомендую репозитории использовать всегда. Если проект маленький, то и времени ты на них потратишь немного, а если большой, ну ты понел. Кашу маслом не испортишь.
Просто кастишь значение к числу (int)$veryBigInt и получаешь максимально возможный int https://3v4l.org/3F9GN
Не могу понять, что имеется в виду. Если исключение предусмотрено разработчиками в описании определенной функции, то оно сработает при любом вызове этой функции, если в ходе ее выполнения условия для выброса исключения будут удовлетворены. Другими словами, если выражение внутри скобок после if будет равно true (1) в if (expression) { throw new Exception("Yada yada yada"); }, то скрипт будет прерван.
Однако то же самое произойдет в случае с явным возвратом ошибок:
if (expression) { die("Yada yada yada"); }
Помогите понять мысль ОПа.
Явный возврат ошибок это возврат через return.
if (expression) {
return E_NOT_FOUND; // или return new Error('....');
}
Вариант с die() никаких достоинств не имеет и вообще не рассматривается.
Отличия между явным возвратом и исключениями проявляются, когда у нас несколько функций вызвыают друг друга:
function a() { b() ; }
function b() { c(); }
function c() { throw new Exception(".."); }
Глядя на код функции a(), неочевидно, что она может выкинуть исключение. В случае с явным возвратом ошибок в каждой функции стоял бы if + return и это было бы очевиднее.
Угу, позднее статическое связывание.
>>603634
Тут все намного сложнее. Выбрасываемые исключения можно прописать в комменте, тот же phpstorm явно просит тебя это сделать.
А дело все в том что исключения используются как продвинутый goto. Сам goto в пхп ничего криминального из себя не представляет, и ничего действительно запутанного сделать не даст. Вот пример, где мы пытаемся из контекста функции перескочить в другое место https://3v4l.org/f2WLK. Как видишь это нихуя не работает.
А вот пример типичного использования исключений https://3v4l.org/X8QGJ. Как видишь, то чего не смог goto вполне себе могут исключения. Как я уже сказал - этот код ТИПИЧНЫЙ и ты будешь писать точно так же.
Причиной, как мне кажется, является отсутствие возможности нормально вернуть несколько значений, т.к. массивы не типизированы и туплов нет. А так же отсутствие промисов или монады maybe из коробки.
>Готового решения, наверно, нету.
"Жадный" алгоритм достаточно прост. Мы сначала вычисляем число купюр большого достоинства, потом кол-во купюр чуть меньшего достоинства, и так до самых мелких. "Жадный" алгоритм работает хорошо, когда каждая купюра в N раз больше другой (где N - целое) и когда нет нехватки купюр.
Например: у нас есть 1x5000 и 3x2000, нам надо выдать 6000. "Жадный" алгоритм выдаст 1x5000 и застопорится. Он тут не применим, так как мы не можем заменить 5000-ю купюру несколькими 2000-ми.
Там, где неприменим "жадный" алгоритм, мы вынуждены перейти к полному перебору всех возможных комбинаций купюр. В общем виде алгоритм выглядит так. Обозначим S - сумма, которую надо выдать, k - количество номиналов купюр, N[1] ... N[k] - количество купюры каждого номинала, A[1] .. A[k] - запас купюр каждого номинала:
- берем все возможные комбинации N[1] .. N[k], где N может быть от 0 до A (то есть, учитываем имеющийся запас купюр и не пытаемся брать больше, чем есть)
- для каждой комбинации проверяем:
- если она в сумме дает S, то сумму можно выдать этой комбинацией
Например, если у нас есть 1x5000 и 3x2000, то мы должны перебрать такие комбинации:
- 0x5000 + 0x2000 (я буду писать эту комбинацию сокращенно как (0, 0))
- 0x5000 + 1x2000 (или (0, 1))
- (0, 2)
- (0, 3)
- (1, 0)
- (1, 1)
- (1, 2)
- (1, 3)
То есть, для каждого номинала мы перебираем значения от 0 до запаса этой купюры. Мы фиксируем значение 0x5000 и перебираем все возможные количества более младших купюр, затем фиксируем значение 1x5000 и перебираем более мелкие купюры снова.
Генерацию комбинаций можно реализовать с помощью рекурсии (функции, вызывающей саму себя). Сделаем функцию такого вида:
generateCombinations(array $A, array $N): array
Где $A - массив запасов купюр (A[1] .. A[k]), например, [1 => 1, 2 => 3] для 1x5000, 3x5000, $N - зафиксированные количества старших купюр. Функция вернет массив всех возможных комбинаций, которые начинаются с комбинации в $N.
Поскольку массив комбинаций может получиться огромным, можно вместо его возврата сделать функцию-генератор, которая выдает комбинации с помощью команды yield, не тратя память на хранение огромных массивов.
Количество таких возможных комбинаций легко посчитать: оно равно произведению запасов купюр, то есть (1 + A[1]) x (1 + A[2]) x ... x (1 + A[k]). Я добавил 1, чтобы учесть вариант, когда мы берем 0 купюр данного номинала.
Такие комбинации похожи на "размещения" из комбинаторики ( https://ru.wikipedia.org/wiki/Размещение ). Есть готовые "алгоритмы для генерации размещений". У нас не совсем размещение, но очень близкая к нему вещь, можно погуглить эти алгоритмы.
Дальше алгоритм можно оптимизировать. Например, не перебирать комбинации, которые заведомо превышают искомую сумму (вроде комбинации 2x5000, когда надо выдать 6000). Перебирать комбинации не от (0, 0) к (1, 3), а начиная с наиболее близких к искомой сумме.
В любом случае, тут нужна рекурсивная функция. Либо стек.
Для начала, можешь попробовать написать код, который просто выведет все возможные комбинации купюр на экран. А потом уже добавлять проверку, дает комбинация нужную сумму или нет
Я попробовал написать код, который просто выведет все возможные комбинации , рекурсивно не получилось , получилось со вложенными циклами , но если количество номиналов купюр будет от 3 и более , то вложенные циклы никуда не годятся, получается плохой код. Порывшись в гугле нашел , вот такой рекурсивный цикл https://ideone.com/TRasJW , его чуть чуть поменять , и он уже будет выдавать наши комбинации купюр, в самом этом коде я разобрался, но кажется мне , можно сделать рекурсивный цикл намного проще и понятнее, но самостоятельно написать у меня не получилось, поэтому ищу опять совета здесь
>Готового решения, наверно, нету.
"Жадный" алгоритм достаточно прост. Мы сначала вычисляем число купюр большого достоинства, потом кол-во купюр чуть меньшего достоинства, и так до самых мелких. "Жадный" алгоритм работает хорошо, когда каждая купюра в N раз больше другой (где N - целое) и когда нет нехватки купюр.
Например: у нас есть 1x5000 и 3x2000, нам надо выдать 6000. "Жадный" алгоритм выдаст 1x5000 и застопорится. Он тут не применим, так как мы не можем заменить 5000-ю купюру несколькими 2000-ми.
Там, где неприменим "жадный" алгоритм, мы вынуждены перейти к полному перебору всех возможных комбинаций купюр. В общем виде алгоритм выглядит так. Обозначим S - сумма, которую надо выдать, k - количество номиналов купюр, N[1] ... N[k] - количество купюры каждого номинала, A[1] .. A[k] - запас купюр каждого номинала:
- берем все возможные комбинации N[1] .. N[k], где N может быть от 0 до A (то есть, учитываем имеющийся запас купюр и не пытаемся брать больше, чем есть)
- для каждой комбинации проверяем:
- если она в сумме дает S, то сумму можно выдать этой комбинацией
Например, если у нас есть 1x5000 и 3x2000, то мы должны перебрать такие комбинации:
- 0x5000 + 0x2000 (я буду писать эту комбинацию сокращенно как (0, 0))
- 0x5000 + 1x2000 (или (0, 1))
- (0, 2)
- (0, 3)
- (1, 0)
- (1, 1)
- (1, 2)
- (1, 3)
То есть, для каждого номинала мы перебираем значения от 0 до запаса этой купюры. Мы фиксируем значение 0x5000 и перебираем все возможные количества более младших купюр, затем фиксируем значение 1x5000 и перебираем более мелкие купюры снова.
Генерацию комбинаций можно реализовать с помощью рекурсии (функции, вызывающей саму себя). Сделаем функцию такого вида:
generateCombinations(array $A, array $N): array
Где $A - массив запасов купюр (A[1] .. A[k]), например, [1 => 1, 2 => 3] для 1x5000, 3x5000, $N - зафиксированные количества старших купюр. Функция вернет массив всех возможных комбинаций, которые начинаются с комбинации в $N.
Поскольку массив комбинаций может получиться огромным, можно вместо его возврата сделать функцию-генератор, которая выдает комбинации с помощью команды yield, не тратя память на хранение огромных массивов.
Количество таких возможных комбинаций легко посчитать: оно равно произведению запасов купюр, то есть (1 + A[1]) x (1 + A[2]) x ... x (1 + A[k]). Я добавил 1, чтобы учесть вариант, когда мы берем 0 купюр данного номинала.
Такие комбинации похожи на "размещения" из комбинаторики ( https://ru.wikipedia.org/wiki/Размещение ). Есть готовые "алгоритмы для генерации размещений". У нас не совсем размещение, но очень близкая к нему вещь, можно погуглить эти алгоритмы.
Дальше алгоритм можно оптимизировать. Например, не перебирать комбинации, которые заведомо превышают искомую сумму (вроде комбинации 2x5000, когда надо выдать 6000). Перебирать комбинации не от (0, 0) к (1, 3), а начиная с наиболее близких к искомой сумме.
В любом случае, тут нужна рекурсивная функция. Либо стек.
Для начала, можешь попробовать написать код, который просто выведет все возможные комбинации купюр на экран. А потом уже добавлять проверку, дает комбинация нужную сумму или нет
Я попробовал написать код, который просто выведет все возможные комбинации , рекурсивно не получилось , получилось со вложенными циклами , но если количество номиналов купюр будет от 3 и более , то вложенные циклы никуда не годятся, получается плохой код. Порывшись в гугле нашел , вот такой рекурсивный цикл https://ideone.com/TRasJW , его чуть чуть поменять , и он уже будет выдавать наши комбинации купюр, в самом этом коде я разобрался, но кажется мне , можно сделать рекурсивный цикл намного проще и понятнее, но самостоятельно написать у меня не получилось, поэтому ищу опять совета здесь
Давай попробуем еще упростить задачу. Допустим, у нас есть N кубиков. Напиши функцию, которая выведет все возможные комбинации чисел, которые на них могут выпасть.
Начнем с ситуации с одним кубиком. Тут все просто: функция должна вывести числа от 1 до 6.
Теперь, пусть кубиков два. Тогда функция должна вывести все комбинации, начинающиеся с 1 (1 1, 1 2 ... 1 6), потом, начиная с 2, и так до 6.
Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с зафиксированными значениями на кубиках слева. В этом массиве может быть от 0 до N значений. И функция должна перебрать все оставшиеся значения кубиков справа и вывести комбинации.
Если ей переданы значения на всех N кубиках, то перебирать нечего - остается только вывести комбинацию.
Если ей передан массив с меньше чем N значениями, кроме последнего, то она просто перебирает числа от 1 до 6, добавляет их по очереди к массиву (так, что получается массив на 1 длиннее, чем был передан) и вызвает себя 6 раз с этим новым массивом.
Вот примерный вид функции:
function generateCombinations(int $n, array $values) { ... }
И вот, как она вызывается (для 3 кубиков):
generateCombinations(3, []);
Этот вызов должен сделать такие вызовы самой себя:
- generateCombinations(3, [1])
- этот вызов сделает такие вызовы:
- generateCombinations(3, [1, 1])
- generateCombinations(3, [1, 2])
- ...
- generateCombinations(3, [1, 6])
Далее будут вызываться:
- generateCombinations(3, [2])
- ...
- generateCombinations(3, [6])
Попробуй написать такую функцию, или напиши, если что-то непонятно.
Есть еще другой способ вывести все комбинации без рекурсии. Он проще, но будет менее удобен для решения задачи про банкомат. Делаем массив, состоящий из всех единиц ([1, 1, 1, 1]). Вывыодим его. Увеличиваем последнюю единицу на 1: [1, 1, 1, 2]. Выводим. Если где-то получается 7 - мы сбрасываем ее на 1 и увеличиваем цифру перед ней.
Этот способ тоже можно попробовать.
Давай попробуем еще упростить задачу. Допустим, у нас есть N кубиков. Напиши функцию, которая выведет все возможные комбинации чисел, которые на них могут выпасть.
Начнем с ситуации с одним кубиком. Тут все просто: функция должна вывести числа от 1 до 6.
Теперь, пусть кубиков два. Тогда функция должна вывести все комбинации, начинающиеся с 1 (1 1, 1 2 ... 1 6), потом, начиная с 2, и так до 6.
Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с зафиксированными значениями на кубиках слева. В этом массиве может быть от 0 до N значений. И функция должна перебрать все оставшиеся значения кубиков справа и вывести комбинации.
Если ей переданы значения на всех N кубиках, то перебирать нечего - остается только вывести комбинацию.
Если ей передан массив с меньше чем N значениями, кроме последнего, то она просто перебирает числа от 1 до 6, добавляет их по очереди к массиву (так, что получается массив на 1 длиннее, чем был передан) и вызвает себя 6 раз с этим новым массивом.
Вот примерный вид функции:
function generateCombinations(int $n, array $values) { ... }
И вот, как она вызывается (для 3 кубиков):
generateCombinations(3, []);
Этот вызов должен сделать такие вызовы самой себя:
- generateCombinations(3, [1])
- этот вызов сделает такие вызовы:
- generateCombinations(3, [1, 1])
- generateCombinations(3, [1, 2])
- ...
- generateCombinations(3, [1, 6])
Далее будут вызываться:
- generateCombinations(3, [2])
- ...
- generateCombinations(3, [6])
Попробуй написать такую функцию, или напиши, если что-то непонятно.
Есть еще другой способ вывести все комбинации без рекурсии. Он проще, но будет менее удобен для решения задачи про банкомат. Делаем массив, состоящий из всех единиц ([1, 1, 1, 1]). Вывыодим его. Увеличиваем последнюю единицу на 1: [1, 1, 1, 2]. Выводим. Если где-то получается 7 - мы сбрасываем ее на 1 и увеличиваем цифру перед ней.
Этот способ тоже можно попробовать.
Благодарю , буду разбираться !
А как сделоть?
> - Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
Это вместе с
> SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery.
?
А если я знаю html, css, js, jquery и git - сколько пхп займёт? Просто в городе пхп требуют в каждой второй вакансии, думаю стоит выучить.
Я уже переделал в foreach.
В первый раз не смог додуматься как оформить прост, поэтому сделал через echo.
Ну тебе осталось выучить SQL, PHP + его ООП, паттерны, хттп\s-протокол, ну и хотя бы один современный фреймворк.
Полгода минимум.
У тебя фактически только фронтенд и бэкенда вообще нет.
Звучит долго. Это время нужно для хорошего уровня или для начального устройства на работу? Просто я видел вакансии в стиле "вы немного знаете пхп и отличаете бэк от фронта? Го к нам на 20к стажёром". Старт меня и такой устроит.
>Звучит долго.
Это только до уровня вкатывальщика-джуна на нормальный современный стек. Потом ещё доучиваться надо на работе.
Времена когда в пыху вкатывались за 2 месяца давным-давно прошли. Сегодня так в js вкатываются.
>Просто я видел вакансии в стиле "вы немного знаете пхп и отличаете бэк от фронта? Го к нам на 20к стажёром".
Не видел таких. Это либо на вротпресс, либо кидалово.
В обоих случаях дно.
>Сегодня так в js вкатываются.
жс только кажется легко там такой ебаный зоопарк с колбеками шо пыха не самое худшее в жизни
Со всяким поработал, да и работаю. В целом в клиент вкатиться проще, может даже за 2 месяца, если не тупишь. Бекенд (не только на пхп, а любой, в жс тоже) гораздо более широкая тема. Работаю лет 10 уже и только интереснее и интереснее становится расти, а конца и края не видно. Сейчас даже сложно представить, какой объем инфы надо освоить в 2020, чтобы уверенно в бекенд залететь.
>жс только кажется легко
Он и есть - легко. То же самое, что и Луа, который вообще для мимокроков в индустрии сделан. Собственно поэтому в js такой ажиотаж и много молодых макак.
>там такой ебаный зоопарк с колбеками
Какой зоопарк? Промисы давно завезли. И в чём сложность этих коллбеков?
Там если только с асинком могут быть проблемы, и то только поначалу на ноде той же.
>>604325
>только интереснее и интереснее становится
Есть такое дело. Чем больше изучаю - тем дальше горизонт.
>жс
>хоть и говно но общего назначения
>Луа
>встраиваемый
температуры нет? спал хорошо? прими таблеточку
>общего назначения
>встраиваемый
Вообще не в ту степь полез.
Оба языка позволяют шлёпать код не заморачиваясь с нормальным ООП. Юным вайтишникам он не понятен и сложен.
>нормальным ООП
ооп как явление костыль фабрики фабрик
>Оба языка позволяют шлёпать код не заморачиваясь
и давно у нас чистые луа вакансии появились?
стек жопаскрипта за последние годы растолстел что скоро больше жабы со спрингом станет, а учитывая вагоны джунов которые повелись на легкость вкота, требования там растут как на дрожжах, это не учитывая подводные айсберги самого языка со слабой типизацией.
Бампирую вопрос.
Есть смысл базовую аутентификацию на админку ставить на https? Мне по-простому чтоб.
Сообщи если тебя возьмут на работу, потому-что если это случится, то я перестану переживать на счёт себя.
Без https пароли передаются простым текстом. Любой кто снифает твой трафик может его прочиать.
Все равно не могу понять зачем нужно это храниоище. В той же Ларе есть орм и свои коллекции. Зачем мне еще 1 слой делать, если и так уде все сделано
Ну ведь тебе свои запросы через орм нужно где-то записать.
А потом изменить,
а потом добавить кеширование,
а потом добавить сброс кеша,
а потом добавить добавление в кеш сразу с добавлением в базу
Если у тебя есть репозиторий, то в десяти местах, где ты получаешь свою сущность будет написано просто $item = $items->getById($id), а вся техническая часть будет скрыта под капотом. Я уже не говорю про то, что если его не делать, то у тебя будет жесткая зависимость от ларавелевской орм.
у нюфага есть пару вопросов к вам сразу говорю-гугл не помог
$result = array_filter($a, function($number) {
return decoct(octdec($number)) == $number;
});
Да делай все на чистом сикуле, зачем все эти ормы и абтстракции?
Я смотрю, вы из индии
Переменные платные.
1 переменная - доллар
Массив - размер массива долларов
Объект - сумма полей и массивов в долларах
Я тоже начал рассматривать битрикс, как что-то, что даст старт. Какие подводные? Я конечно пока что на другие вакансии откликаться буду, но что-то везде опыт нужен но я не теряя надежды буду откликаться на вакансии с опытом от года, если в самом описании осознанно не написано о том, что опыт обязателен, а с битриксом не обязательно.
То есть я уже где-то 30 долларов торчу, за использование языка? У меня нет столько денег.
Почитал статьи. Репозиторий - слой для получения данных с бд, а сервис - слой для занесения данных в бд. Я правильно понял?
Подводные в том, работа с битриксом - не разработка, максимум - веб мастер. Путь к работе на основе фреймворков или кастомных решений закрыт.
Это не говоря про низкую зп и скотские условия работы
> вордпресс
А он лучше? Я думал, что это дно дна, почему-то. Вакансий нет, в любом случае - на удалёнку поди без опыта не возьмут. Мой удел - битрикс газонюх.
>>605109
> битриксом - не разработка
Пишут "разработка сайтов на платформе 1с-битрикс и доработка crm битрикс24". Врут? Ну и если это не разработка - получается мне это не поможет в дальнейшем устроиться в разработку и лучше дальше искать?
Лучше сразу искать Symfony/Laravel/Yii(крайний случай).
В битриксе уровень кода лаба1.php, только этого кода десятки тысяч строк
Так я только начал изучать пхп и как бы он ни был похож на js, надо вникать во всякие тонкости, mysql изучить, до выбора php фреймворка я пока не дошёл. Есть вакансии с пхп, но для них мне ещё пару месяцев бы дома посидеть, а я не хочу.
А тут попадается вакансия, где вроде как я научусь по крайней мере мне так кажется всему, что нужно для поиска нормальной работы, так ещё и платят какие-никакие никакие деньги - 3к стипендия за обучение, если пройду если нет, то наверное можно сразу выпиливаться, потом за 10к 3 месяца, потом я уже старший газонюх за 18к и может быть, когда-нибудь я дорасту до 30к и к этому моменту свалю от них. Хотя вроде там кому-то до 80к платят.
Суть в том, что на эту вакансию я с чистой совестью подхожу.
Ты спокойно найдешь местную конторку, где тебя возьмут стажером на yii, научат пилить круд (львиная доля работы пхп макаки), а там уже рост пойдет, через пару лет на удаленку выйдешь и будешь спокойно пописывать
пиздец это че за рабские условия труда такие
ни за что к ним не иди, анон.
или проси чтобы платили как норм стажеру 20-35к на первые три месяца
>что-то прям очень похоже на js
Да вообще не похоже. Это ты, скорее всего, пишешь на пхп как на js он позволяет так делать до первого серьёзного проекта.
Меня посадили в первый месяц фуллстек проект делать. lara/vue spa. Все делаю сам, общаюсь с заказчиком и серв настраиваю тоже. за 20. Благо проект не тяжелый и заказчик не ебет.
Кмк, если кушать есть что - за копейки первое время работаь не должно быть проблемой. Хотя 3м за 10к как то мало. 15 хоть
> Хотя 3м за 10к как то мало. 15 хоть
Ну там не факт, что 10 будет. Там от 10, потом от 18, потом от 35. Думаю 15 можно получать на старте.
>>605289
> Ты спокойно найдешь местную конторку, где тебя возьмут стажером на yii
Так что-то не вижу таких вакансий на основных сайтах с раьотой. Вообще мало стажировок, но куча вакансий с требованием года опыта - на них конечно можно и без опыта попасть, но обычно много всего знать надо, больше чем я знаю в данный момент.
Ясно, понятно.
Можешь забить хуй на 90% требований в вакансиях.
Кадровый голод такой, что многие фирмы, где пишут 1-3 года опыта могут взять стажера на вырост.
Помимо вак стучи в сами фирмы, пиши на почту, звони, расслылай резюме везде, куда сможешь.
Опыт разный бывает. Можешь считать что у тебя он есть, просто это не "опыт коммерческой разработки"
> Помимо вак стучи в сами фирмы, пиши на почту, звони, расслылай резюме везде, куда сможешь.
Надо бы. Просто я хекка-социофоб, таблетки уже давно не принимаю они уже не нужны, но с ними всё было легче и начать что-то социально активное сложно. Причём на собесе могу легко и непринуждённо общаться, а позвонить/написать - невольно откладываю это. Сегодня создал резюме на втором по популярности работном сайте в городе - там есть потенциально подходящие вакансии, буду им писать.
> Кадровый голод такой, что многие фирмы, где пишут 1-3 года опыта могут взять стажера на вырост.
Вот им бы стоило вакансии стажёров создавать. А то слабо ощущается этот голод - в конторе, где я недавно был на собеседовании, сказали что один из 15 человек дальше первого, ознакомительного собеса проходит, а чтобы туда попасть, надо уже некоторые задания решить, которые показывают, что кандидат не случайно откликнулся. То есть навыки то могут быть нужные, но стиль работы не тот и они не дойдут до технического собеса а их 2-3 минимум и тз не получат.
>>605483
Да, я его указываю, со ссылками и кратким описанием. Но не думаю, что кто-то читает.
>То есть навыки то могут быть нужные
С чего ты это решил? Качество решения любых задач, в том числе стажерских, можешь по этому треду заценить. Разброс очень большой. Очень даже может быть здравым решением пропускать только 1 из 15 решивших, если только он справился хотя бы на четверочку.
Не, сначала дают задания после отклика, их 10-15 и они проверяют знание стека, используемого конторой, умение решать задачи несколькими способами и оптимально, понимание прочих важных для них штук. Вот из 15 тех, кто выполнил все эти задачи, 14 бракуют до технических собеседований и полноценного тз. У них специфический рабочий процесс и если они считают, что кандидат не подходит, он может хоть сколько лет опыта иметь.
На один из них га сайте пхп.нет ответе не написано.
1.
printf ();
как использовать к многобайтовым русским символам?
если (никак) ? "Какие аналоги есть?" : "Анон, молю, подскажи";
2.
Как можно из пхп открыть другой файл?
К примеру, в хтмл можно параметр action="file.php" написать и это сработает.
А чот в пхп я пробовал fopen("page.html") и никак.
Проверь отладчиком в браузере (F12 на вкладке Script или Debugger), что там формируется и передается в переменной obj
>>599535
У тебя SQL-инъекция в коде. Используй плейсхолдеры.
>>599739
Вообще, тесты удобно изучать на примере простого проекта ведь.
>>599963
Можешь попробовать для начала прочесть туториал в мануале: https://www.php.net/manual/ru/index.php
Но дальше тебе надо еще изучить ООП и фреймворки, язык SQL.
>>600041
Если у тебя есть классы, которые наследуются и ты хочешь их хранить в БД, то есть три паттерна: Class Table Inheritance, Concrete Table Inheritance и Single Table Inheritance.
Они описаны, например, тут http://design-pattern.ru/index.html
Самый простой, наверно, это STI.
1) Если ты понял, что перед тобой не палиндром, то можно выходить из цикла по break
2) Ставь фигурные скобки после if/else, чтобы не было разночтений, где там начинается и заканчивается блок
>>600320
Восьмеричные числа никак не отличить от обычных, так как в процессе создания массива они все становятся просто числами, без системы счисления. Если у тебя строки ['06', '7'] - то отличить можно, а если просто числа, то никак. Массив содержит просто числа, без указания системы счисления.
>>600434
> for ($sumOfCredit += ($sumOfCredit * $percentage); $sumOfCredit > 0
тут слишком много действий, и тяжело читать заголовок цикла. Стоит вынести эти действия из скобок в for() и сделать обычными действиями.
"} else {" пишется в одну строчку.
А так, решено хорошо.
Рад за тебя, анон.
Ощущение, что ты тупой, обязательно пройдет.
Просто подумай, что раньше некоторых вещей ты вовсе не понимал, а теперь на хую вертишь играючи и не глядя.
И с каждой строчкой будешь все меньше париться, так как будешь получать опыт.
Не боись ошибаться, учись на этом.
1) printf выводит русские буквы, но не умеет корректно их выравнивать и считать ширину текста (он считает что 1 символ = 1 байт, а русская буква занимает 2 байта в utf-8). придется писать свою функцию для выравнивания.
2) include/require. Они выполняют код из другого файла, как будто ты вызвал функцию.
В HTML с помощью action=... ты не "подключаешь" файл, а указываешь, на какой URL браузер должен отправить запрос с данными формы (и откуда он должен брать новую страницу для показа), когда пользователь нажмет кнопку отправки.
fopen "открывает" (подготавливает) файл для чтения или записи в него с помощью fwrite/fread. Он не будет выполнять код из файла.
Значит, выравнивать текст придется не через printf, а через div'ы на странице.
> include/require
Сработает, если я вызываю не пхп, а чистый хтмл?
Алсо. На счет include/require.
Можно ли их использовать на каждой странице для подтверждения авторизации?
Типа, в одном файле авторизовался, перешел на вторую страницу, которая доступна только есть твой $pass == 'password'из БД.
Но я работаю на работе и мне платят за это деньги. Постоянное ощущение, что мне скажут: ты слишком долго и хуево делаешь х, ты нам не подходишь
Не изобретай велосипед, авторизация делается либо сессиями в случае твоего встроенного в шаблоны говнокода, либо всякими токенами в случае стейтлесс апи
Инклюд подключает кампелированный код, require - в процессе исполнения.
Я вообще все шаблоны подключаю через инклюд
Вообще да, Антон прав. Используй сессии. Можешь ещё в куке хранить хэш пароля
1. Грамотный ли это подход, данные из формы сначала отправлять в валидатор, и если данные проходят валидацию тогда уже создавать объект студента и сразу же его отправлять в бд? ОП написал, что мы создаем объект со студентом, а потом уже его отправляем на валидацию, но зачем создавать объект если он не прошёл валидацию?
2. Как сделать флеш сообщение об успешной регистрации(редактировании) если у меня в роутах только 2 страницы(сам список и регистрация) отправлять мне нужно же на новую, а фронт контроллер о ней ничего не знает.
3. Грамотно ли в контроллере при успешной регистрация ставить сессии и куки через глобальную переменную? Читал, что лучше вообще не пользоваться глобальными переменными. Но как тогда сделать?
4. Создавать отдельно хейдер и футер, и затем его подключать в контроллере через инклюд нормальный подход?
В общем я чувствую пробелы в понимании работы MVC, но не знаю, где восполнить эти пробелы.
Разве в пыхе уже не давно ютф8 нативный везде?
Не пытайся искать логику в этой хуйне, ее нет, пых писал какой-то упоротый жирдяй для своей домашней странички, вангую с тех времен доллары и пошли, а были они там, потому что васянскому интерпритатору было так легче переменные находить
На хабре читал что от нее прирост в производительности только в теории есть. А на практике чуть ли не в минус идет. Но говорят в 8 версии запилят
>только в теории есть
ага у пыхи же уже производительность как у жабы нечего выжимать(сарказм).
многопоток это отдельное бдсм в текущем виде
«Чистый код» почитай, хотя бы половину, больше не надо.
Еще не решил первую задачу в повторениях, объясните я даун или так можно решить? Меня пока что смущает цикл который я сделал, implode не работает почему-то, не могу этого понять. Плюс нет функций для того чтоб сделать первую букву в предложений заглавной, нашел вариант на сайте пыхи.
Сейчас осталось добавить пробелы и вроде решил.
Вот жеж долбоёбы на ларавеле даже dd ввели для принта.
Таблетки прими, шиз. Тесты не везде нужны.
Таблетки забыл принять.
Сам ~5 лет назад начинал проходить эти ваши задачи про вектор и прочее, потом работа начала появляться на которой не особо нужен был компьютер саенс, паттерны и алгоритмы (небольшие проекты на codeigniter). В общем не особо что-то прям развивающее, а чисто ебашилово молотком и долотоом так сказать.
Последние полтора года ебашу аутсорсером на легаси проекте, чувствую что опять болото. Да и платят наверное ниже рынка по большому счету. Периодически заглядываю в тред, но отвечать по большому счету некому, либо слишком простые вопросы, либо не моя компетенция или стену текста адовую нужно писать - просто тупо лень.
>Олды есть которые заглядывают сюда?
видимо нет. здесь 90% вопросов моих почему то в игнор улетают ))). судя по всему все олды разбежались по другим тредам и языкам
>Периодически заглядываю в тред, но отвечать по большому счету некому, либо слишком простые вопросы, либо не моя компетенция или стену текста адовую нужно писать - просто тупо лень.
Такая же проблема
Пару месяцев гребу, ничего тяжелого пока. Хочется паттерны там учить и т.д. Хз че делать
> Че ребят как у кого успехи?
Ищу работу, пока не очень успешно. Сегодня написала контора, мол приходи, оценишь свой уровень - я не откликался на их вакансии, но поглядывал. Но говорят, что это не очень хорошая контора и там надо будет ебашить как черт. Вакансии у них вечно висят текучка?, так что сначала другие проверю, потом к ним схожу. У них там верстальщик требуется - думаю на него то точно подойду.
> потом работа начала появляться
Через какое время?
Типичная PHP-разработка. Хорошие конторы, наверное, где-то есть (должны же быть), но я не встречал ни разу.
php:
image: php:7.2-fpm
ports:
- 9000:9000
volumes:
- ./app:/app
Так вот, хлопцы, а если я хочу имидж не php:7.2-fpm, а со своего докерфайла Docker-php, который базируется на
php:7.2-fpm
Мне надо скачать mcrypt.
Как мне это сделать?
Помогите дополнить, пожалуйста. Редактирование по ссылке не открываю, чтобы не испортили, пишите ответами тут.
Сразу говорю: понятно, что есть вакансии, где на джуна спрашивают как написать модуль для PHP на Си, как настроить кеширование в nginx по памяти или как бы ты оптимизировал sql-запросы, это понятно. Всё, что я сделал - это достаточно приблизительно, исходя из того, что я бы сам ждал от того или иного уровня.
https://docs.google.com/spreadsheets/d/1FvHiZp9xZRXMvPM4XKUuyrdR9v5vBEVccFx-mEWhnds/edit#gid=0
>Через какое время?
Я уже не помню, я мб учил дома и месяцами весь этот начальный учебник опа, но по факту играл в игры, а занимался чем-то полезным по 4 часа в неделю.
Хз, сначала пришел в контору в которой была адовая текучка, куча макак делает какие-то там мобильные игры, все это сдабривалось скрытой рекламой для заработка (потом еще вроде как адовый скандал был в отрасли), а пхп отдел из 5 челов должен был лепить под все это дело мелкосайты и дендосы вроде как, ну и внутреконторные админки и всякие отчеты со статистикой. Когда спросили че умеешь - я ответил честно что вообще нихуя и меня взяли. Самым топовым программистом на пхп, помимо тимлида, там без шуток был школьник с 1.5 годом опыта. С одной стороны рили криндж, с другой я мог сидеть и без особых проблем разбираться в любой хуйне. Все понимали что с меня ничего не взять. Правда выдержал я там 2-3 недели всего, потому что ездить было далековато и на общественном транспорте. Кароче ебанули морозы, и я послал стояние на остановке в лесу -35 нахуй.
Потом была работа куда уже пришел через несколько месяцев, и там чел в соло делал какие-то проекты и ему нужна была помощь. В целом собеседовал он меня по php, html и css, нарешал я что-то только на php, сам потом перезвонил ему узнать о его решении (именно по этому он меня и взял в итоге, лол). Там уже началось рубилово на codeigniter.
Некст работа уже сама меня нашла. Стоило ради прикола запостить резюме с одной тоолько строчкой, что у меня опыт работы на codeigniter, и все - меня самого уже начали вызванивать раз в месяц. Это не тот скилл который нужно учить сейчас нубу офк. Просто как оп советует, берешь какой-нибудь актуальный фреймворк, делаешь на нем маломальский проект, понимаешь как в нем гонять туда-сюда строчки и вуаля, ты более менее можешь искать что-то.
В целом по началу всегда ад и конфуз на первых работах как я понимаю у большинства был. Не знаю сейчас понавыпускали уже универы волну специально подготовленных макак или нет и есть ли на рынке джунов огромная конкуренция из-за говнокурсов которые бесконечно форсятся как раз последние 5 лет из каждого утюга. Мб все уже совсем по другому.
>Сегодня написала контора, мол приходи, оценишь свой уровень
Просто иди и попробуй без сомнений особых. Опять же пока ты не можешь самостоятельно решать бизнес-задачи, то ты сам должен проситься работать за еду. Если тебе скажут что можешь посидеть тут недельку поделать тестовое за бесплатно и позаебывать всех вопросами - соглашайся.
>Через какое время?
Я уже не помню, я мб учил дома и месяцами весь этот начальный учебник опа, но по факту играл в игры, а занимался чем-то полезным по 4 часа в неделю.
Хз, сначала пришел в контору в которой была адовая текучка, куча макак делает какие-то там мобильные игры, все это сдабривалось скрытой рекламой для заработка (потом еще вроде как адовый скандал был в отрасли), а пхп отдел из 5 челов должен был лепить под все это дело мелкосайты и дендосы вроде как, ну и внутреконторные админки и всякие отчеты со статистикой. Когда спросили че умеешь - я ответил честно что вообще нихуя и меня взяли. Самым топовым программистом на пхп, помимо тимлида, там без шуток был школьник с 1.5 годом опыта. С одной стороны рили криндж, с другой я мог сидеть и без особых проблем разбираться в любой хуйне. Все понимали что с меня ничего не взять. Правда выдержал я там 2-3 недели всего, потому что ездить было далековато и на общественном транспорте. Кароче ебанули морозы, и я послал стояние на остановке в лесу -35 нахуй.
Потом была работа куда уже пришел через несколько месяцев, и там чел в соло делал какие-то проекты и ему нужна была помощь. В целом собеседовал он меня по php, html и css, нарешал я что-то только на php, сам потом перезвонил ему узнать о его решении (именно по этому он меня и взял в итоге, лол). Там уже началось рубилово на codeigniter.
Некст работа уже сама меня нашла. Стоило ради прикола запостить резюме с одной тоолько строчкой, что у меня опыт работы на codeigniter, и все - меня самого уже начали вызванивать раз в месяц. Это не тот скилл который нужно учить сейчас нубу офк. Просто как оп советует, берешь какой-нибудь актуальный фреймворк, делаешь на нем маломальский проект, понимаешь как в нем гонять туда-сюда строчки и вуаля, ты более менее можешь искать что-то.
В целом по началу всегда ад и конфуз на первых работах как я понимаю у большинства был. Не знаю сейчас понавыпускали уже универы волну специально подготовленных макак или нет и есть ли на рынке джунов огромная конкуренция из-за говнокурсов которые бесконечно форсятся как раз последние 5 лет из каждого утюга. Мб все уже совсем по другому.
>Сегодня написала контора, мол приходи, оценишь свой уровень
Просто иди и попробуй без сомнений особых. Опять же пока ты не можешь самостоятельно решать бизнес-задачи, то ты сам должен проситься работать за еду. Если тебе скажут что можешь посидеть тут недельку поделать тестовое за бесплатно и позаебывать всех вопросами - соглашайся.
Да похуй как это выглядит, главное - суть. Таблица или схема - это дело 15 минут. А изучение - это дело лет.
Глянул одним глазом на таблицу - хуета какая-то.
У тебя в голове каша. Условный Вордпресс и Ларавел, а так же разные субд - это не звенья одной цепи по которой ты идешь. Это как разные профы в линейке, лол. Можно быть суперспециалистом, который никогда не окунался в modx-парашу, и работать за 300кк в секунду в серьезных проектах, а можно быть "мастер на все руки в каждой cms" и работать за дошик в веб-студии "лидере отрасли", где тебя по факту просто перепродают решать проблемы челиков которые не понимают нихуя в разработке.
Лучше бы ты дал ему учебник опа и помогал решать задачу за задачей, повышая уровень сложности, если ты сам конечно чет понимаешь (судя по таблице такой же нубас с кашей в голове, который только через вакансии может примерно представить что там в реальности как устроено)
Спасибо за мнение, но у меня все окей с головой. Если ты изучаешь с нуля, то: ты пишешь сначала PHP-код, потом подрубаешь веб-сервер и делаешь сайт на чистом PHP, потом ты берешь CMS, т.к. она ничего кроме этого не требует, а потом ты берешь фреймворк и оказывается, что там нужны паттерны, ORM, GIT и прочее блядство. Это по возрастающей.
Ты можешь, конечно, сразу взять фреймворк. И в душе не ебать, как веб-сервер переваривает твой URL, и сразу начать хуярить роутинг. Это полезно, как ты думаешь? Ну, чтобы специалист, насколько про PHP это можно сказать вообще, был всесторонне развит?
Кроме того, я не уверен, что есть вакансии а-ля WordPress Senior.
В общем, я не спорить сюда пришел. И не принес свою таблицу а-ля "смотрите, это лучшее, что есть в мире!". Я попросил помощи дополнить ее, не более того.
Блок-схема удобней, позволяя как создавать связи, так и выделяя области: например выделяя из "разработки сайта" области "фронтэнд", "бэкэнд", которые в свою очередь можно разбить на ещё меньшие части, например "Server Page" и "база данных, в которых будут как параллельные,так и альтернативные пути.
Я сам охуел, но я это видел в вакансиях на сеньера. С микросервисами еще понятно, но многопоток - это пушка. У самого большой стаж работы, но я собираюсь на днях пойти и почитать, что это за зверь. Видимо, имеется ввиду, когда тебе надо написать демона на PHP. Что на мой взгляд, уже пиздец.
Да, согласен с тобой. Если сделаешь, будет годно. Мне лично лень. Мне надо просто примерно обозначить дорогу для нового джуна и всё.
Не то что бы олд, но опыт есть.
Сижу на поддержке продукта болото с пыхой и жиквери, разработка идет со скоростью улитки.
Между тасками почитываю Чистый код и Чистую архитектуру, пилю пет на современном стеке, прохожу собесы.
Чем тебе помочь?
Открываешь доку сдека и ебашишь.
По всем вопросам пишешь им в техподдержку, подробно описывая проблему.
особенность пыхи, хуевая, что каждый скрипт выполняется в отдельном потоке, в той же жабе и тд в памяти поднимаются объекты, висят в ней, треды там чето делают, в пыхе не так, что то распараллелить это костылизм
если языки которые специально сделанные для многопотока или изоморфных приложений которые можно писать не садясь на раскаленный лом, но пыха это хуяк хуяк и в продакшен.
Я даже спорить не берусь, я про многопоток в пыхе слышу первый раз в вакансии. Я про это что-то когда-то читал, но это было давно и там прямо писали - НЕ используете пыху для этого и НЕ используйте пыху для написания демонов, ибо она течет и вылетает без повода.
С джавой знаком, есть пара проектов на спринге, там вопросов нет, все эти атомики, валотайлы и синки, окей. Но, если хотя бы в одной вакансии встретилось требование многопотока в пыхе, надо это посмотреть, как минимум. В конце-концов, в пыхе, похоже, через пару лет будет строгая типизация (с кривой обратной совместимостью), так что почему бы и нет. Мы же тут не ленивые, да?.. :) Почитать никто не мешает, а на собесе можно и блеснуть знаниями, особенно на джуна.
Пс, не хотел показаться уебком. Просто по факту за каждым вторым пунктом этой таблицы стоит огромное количество человеко часов, которые нужно потратить на изучение, и которые выльются ни во что. С таким планом я бы бросил изучение уже на третий день. Нужно принципы учить и подходы, а инструменты конкретные уже следом под конкретные задачи. Я понимаю хочется как-то систематизировать, что бы облегчить себе понимание опять же происходящего. Но пытаться охватить все - огромная ошибка.
Опять же призноки каши в голове: каким образом Codeigniter - это синьер скилл, если это во первых достаточно простой фреймворк, а во вторых устаревший на 5-10 лет инструмент? На нем сейчас вакансии будут либо только на поддержку, либо клепать по отработанной схеме инет-магазины какие-нибудь конвеерно.
Как у тебя установка пхп на линукс - это мидл-скилл, если это делается еще до начала работы? Ты либо ставишь себе линукс сразу и начинаешь на нем ковыряться и ставишь в первый же день LAMP стек по гайду и уже дальше начинаешь в этом разбираться и пердолиться до бесконечности, либо совсем не паришься и накатываешь себе на винду OpenServer и можешь хоть чередовать обучение/разработку со своей любимой докой-2.
Ты либо ныряешь в вордплесс/modx/joomla если это от тебя требуют по работе и остаешься там до того момента пока не одумаешься (навсегда, лол), либо сразу скипаешь это и учишь более интересные и продуманные вещи.
Битрикс - вообще либо ныряешь навсегда, либо не трогай - она_тебя_сожрет.webm
Ты либо работаешь полноценно на каком-нибудь фреймворке каждый день, и даже при этом и за год не запомнишь все его возможности, и будешь энивей постоянно гуглить документацию, либо не работаешь. Или в чем смысл этого всего вообще? Посмотреть часовой видосик по каждому пункту на ютубе?
>потом ты берешь CMS
Этот этап спокойно пропускаешь, т.к. там нечему учиться в плане разработки.
>я не уверен, что есть вакансии а-ля WordPress Senior
Как же ты ошибаешься. Есть такие макаки, ебашут сайтики на вп со скоростью конвейера. Натянул верстку, накидал плагинов, настроил и готово.
Ничего общего с разработкой на основе фреймворка не имеет.
Есть гораздо более адекватный роадмап по бекенду на английском, легко гуглится
Я сразу тебе еще раз напомню цель: устроиться куда-то, а не стать йоба-программистом. Чем меньше тир в таблице, тем меньше он требует времени на изучение. Я зря там подписал про джуна-мидла, ибо это не совсем правильно, скорее это тир фирмы, куда ты устроишься.
> Нужно принципы учить и подходы, а инструменты конкретные уже следом под конкретные задачи.
Понимаешь, я как бы с тобой согласен, а как бы и нет. Представь ситуацию: человек работает грузчиком в пятерочке, его заебало и он готов куда угодно, но только не так. И тут я такой на белом коне. Что ему посоветовать учить? Если я ему сразу дам фреймворки, он нихуя не поймет, обделается и забьет.
Я скорее пытаюсь исходить не из "как хорошо было бы, если бы ты сначала разобрался вот в этом", а хочу, чтобы человек быстрее пошел на первую работу с пробелами в знаниях.
> каким образом Codeigniter
> Как у тебя установка пхп на линукс - это мидл-скилл
Всё это довольно условно. Я писал с мыслью "пусть сначала попробует то, что нужно, а когда дорастет до сеньера, будет время попробовать то, что можно".
> Ты либо ставишь себе линукс сразу
Ты не поверишь, в студиях до сих пор заливают сайты на хостинг через веб-морду ("файловый менеджер") этого же хостинга. То есть для реальной работы не нужен ни xamp/openserver, ни линукс, достаточно мышкой тыкать.
> Битрикс - вообще либо ныряешь навсегда, либо не трогай - она_тебя_сожрет.webm
Подписываюсь. Но вернись в реальность! Если берут только туда, где битрикс, неплохо бы его хоть немного знать.
> Или в чем смысл этого всего вообще? Посмотреть часовой видосик по каждому пункту на ютубе?
Отчасти хотя бы так. Смысл - не знать все на 146%, а пройти собес, показаться уверенным или хотя бы смышленым.
> Этот этап спокойно пропускаешь, т.к. там нечему учиться в плане разработки.
Да, только вакансий - дохуя.
> Натянул верстку, накидал плагинов, настроил и готово.
Базару нет, только это не делает тебя хоть где-то сеньером.
> Есть гораздо более адекватный роадмап по бекенду на английском, легко гуглится
Слушай, не в службу, а в дружбу, принеси пожалуйста, я уже уехал и с телефона пишу.
если
>цель: устроиться куда-то
То пилишь круд на yii/laravel/symfony и устраиваешься
>человек работает грузчиком в пятерочке, его заебало и он готов куда угодно, но только не так. И тут я такой на белом коне. Что ему посоветовать учить?
Кидаешь ему курсец того же елисеева, где с нуля пишут веб приложухи на фреймворке. Пока не повторит весь куд из курса продолжать нет смысла.
>Ты не поверишь, в студиях до сих пор заливают сайты на хостинг через веб-морду ("файловый менеджер") этого же хостинга
От таких товарищей держаться максимально далеко.
Должен быть настроен автодеплой, а залив фич через гит флоу.
>Если берут только туда, где битрикс, неплохо бы его хоть немного знать
А может не надо туда идти?
>Смысл - не знать все на 146%, а пройти собес, показаться уверенным или хотя бы смышленым
Для этого достаточно написать круд
Бро, извини, я не буду больше с тобой спорить, мы смотрим с разных точек зрения.
> То пилишь круд на yii/laravel/symfony и устраиваешься
Это смотря куда. У меня были собесы, где я проходил сразу, а были, где меня внезапно ебали о том, как внутри устроен ассоциативный массив.
> От таких товарищей держаться максимально далеко.
Не согласен. Для первой работы - это опыт. И еще деньги.
В общем, если смена работы с грузчика на пхпшника это для тебя "не надо туда идти", то ты не забыл, насколько приятнее работать хотя бы за 30-40к в офисе, чем грузить говно в пятерке :)
*то ты не забыл = то ты забыл
>Да, только вакансий - дохуя
А вакансий кассиром еще больше. Но мы же хотим идти код писать и большой рубль получать?
>Базару нет, только это не делает тебя хоть где-то сеньером
Сеньером тебя делает способность в адекватные сроки запилить проект с нуля, по возможности удовлетворив все бизнес требования клиента.
роадмап прикрепил
Так это не роадмап, это просто вилки, откуда и чего начинается. Приоритетов-то нет.
> А вакансий кассиром еще больше. Но мы же хотим идти код писать и большой рубль получать?
Опять же, если речь про первую работу, мое личное мнение - похуй чего и как они там делают. Нужна: а) зарплата, б) хоть какой-то продакшн опыт. Никто не мешает получить его и через полгода перейти куда-то еще.
Заорал. Мне про Java понравилось. Там технологий больше, чем на всей этой картинке. Хуевая роадмапа, короче.
>Это смотря куда. У меня были собесы, где я проходил сразу, а были, где меня внезапно ебали о том, как внутри устроен ассоциативный массив.
Нормальная ситуация. Особенно по началу много отказов, много непонятных вопросов - вот их и нужно прорабатывать, если они встречаются больше чем в одном месте.
>Для первой работы - это опыт. И еще деньги
Опыт - возможно. Деньги - не такие большие для айти.
>в адекватные сроки запилить проект с нуля
сеньором тебя делает возможность из туманных хотелок заказчика высрать решение его проблем, а на крупный продукт с нуля попасть это еще ой как повезти должно
Повторюсь и пойду по своим делам уже наконец. Вопрос в получении первой работы. Любой. Для человека, который не знает вообще нихуя. Я всё еще считаю, что выучить WP проще, чем фреймворк, т.к. последний тянет за собой другие знания, на WP занимаются добавлением плагинов в wp-plugins. И это точно проще.
Демагогия. Хорошего дня.
Я вот после этой картинки и задумался, почему бы здесь не запилить что-то аналогичное для обучения.. Но она довольно кривая, как мне кажется.
>Представь ситуацию: человек работает грузчиком в пятерочке, его заебало и он готов куда угодно, но только не так. И тут я такой на белом коне. Что ему посоветовать учить?
О, такие стори есть у меня. раз в полгода-год условный знакомый из 5-очки выходит на связь, спрашивает как растет моя карьера, спрашивает что нужно что бы вкатиться и сколько это займет. Говорю ему что усердных занятий в пару месяцев хватит что бы начать ходить по собеседованиям. Скидываю ему учебник ОП-а этоого треда. И говорю что бы решил для начала самую первую страницу (это 10-20минут) и потом подходил с вопросами дальше. И это не какая-то абстрактная таблица с неведомой хуетой, вот тебе френдли учебник для нуба, сриусли. Просто не ленись и прочитай 1 страницу и открой ideone мать твою!
...
Через пол года знакомый снова выходит на связь, снова рассказывает как его все заебало в его пятерочке и что готов на что угодно, спрашивает как растет моя карьера, спрашивает что нужно что бы вкатиться и сколько это займет...
>Что ему посоветовать учить? Если я ему сразу дам фреймворки, он нихуя не поймет, обделается и забьет.
Учебник ОП-а для начала, сириусли, это все равно лишь примитивы и без этого никуда. Это норм старт в любой ситуакции, хоть он у тебя попадет на разработку в яндекс, хоть станет modx-sinior. Это не требует наката линукса и все задачи включая Вектор можно сделать на ideone и подобных ресурсах между делом хоть с телефона - было бы желание. (я сам так делал 5 лет назад, что уж).
Зачем ты ебешь себе и другим мозг таблицей, которая не имеет никакого отношения к реальности?
> Через пол года знакомый снова выходит на связь, снова рассказывает как его все заебало в его пятерочке и что готов на что угодно, спрашивает как растет моя карьера, спрашивает что нужно что бы вкатиться и сколько это займет...
Как. Блядь. Знакомо. И этот, возможно, из этих. Я его учу уже не первый раз, к слову. Прошло уже полгода с начала "занятий", но он еще не написал свой первый тестовый класс. Я составил эту таблицу, отчасти, уже в отчаянии. Мол, вот, держи, учи вот это, сам, без меня, я сделал, что мог.
> Учебник ОП-а для начала, сириусли, это все равно лишь примитивы и без этого никуда.
Я просто не ебу, что за учебник ОПа, я в этом треде в первый раз и последний год изучал Java вообще, а в PHP работаю лет 10, поэтому мне этот тред нахуй не нужен был и я тут пробегом. Ознакомлюсь, спасибо.
> Зачем ты ебешь себе и другим мозг таблицей, которая не имеет никакого отношения к реальности?
Ну опять же, на мой взгляд имеет, еще и какой. Я не хотел бы столкнуться с мидлом, которые пишет на фреймворке и не знает, что такое mod_rewrite.
>сеньором тебя делает возможность из туманных хотелок заказчика высрать решение его проблем
По нормальному этим лид или пм занимаются. Именно разработчику такой скилл только как бонусный идет.
>>606315
>Сеньером тебя делает способность в адекватные сроки запилить проект с нуля
Тоже нет. Хотя бы потому что адекватных сроков никто в сущности никогда не может заранее назвать. Кроме того условный эникей на вп может в еще более адекватные сроки вложиться. Будет ли он за счет этого хотя бы на уровне условного сеньора на симфе? Нет.
Помидор в первую очередь пишет качественный код в проект, который будет жить, процветать, легко улучшаться (другими сеньорами в идеале, но если мидлы и джунами изи справятся - ваще молодец) и этот код не будет обузой и кандидатом на выпиливание. Конечно так можно и целый проект с нуля запилить, но это будет частный случай. Все, кроме этого - бонусы, которые повышают ценность сеньора, но не являются основополагающими.
Ок, спасибо, прикольно. Никогда этой хуйни не видел. Скину ему, спасибо.
>легко улучшаться (другими сеньорами в идеале
если твой код может быть понятен только сеньорам, то это хуевый код, идеальный код такой что даже тетя зина прочитав учебник до половины могла его прочитать
>Я не хотел бы столкнуться с мидлом, которые пишет на фреймворке и не знает, что такое mod_rewrite.
Ну столкнулся и че? У него мб не стояла за пару лет задача которая бы его в это окунула. Повезло пацану что он не пердолился с настройками htaccess и прочей хуетой которая как бы все равно лежит на уровень ниже пхп-программирования.
И что - все, зошквар сразу в твоих глазах? Хз вот по мне это все такие маня-стереотипы и подходы, что бы пытаться других людей хоть как-то классифицировать для себя.
Зато вот возник прецедент и в этот момент он столкнулся - все, вопрос исчерпан и зошквар снят?
> И что - все, зошквар сразу в твоих глазах? Хз вот по мне это все такие маня-стереотипы и подходы, что бы пытаться других людей хоть как-то классифицировать для себя.
Ну, кстати, может ты и прав, я утка и не понимаю этого.
Пилю ща некий конструктор апи, стараюсь сделать так, что когда меня уволят, то новое апи будет легко собрать даже джуну на которого это скинут. Все больше прохавываюсь в ООП, абстракциях и прочих тайпхинтах, загоняя потенциального дописывателя в такие рамки, что ему просто не в чем будет ошибиться.
Хуйнул не то не в том месте? Лови исключение с описанием того что ты сделал не так и где надо сделать. Доставляет этот процесс прям. Некая крупица творчества есть что ли в отличие от повседневных тасков даже.
>>606368
Проблема в том что есть огромный масив инфы, который невозможно освоить, и нормально все даже в своем повседневном стеке знать. Типа не нужно зацикливаться на шаблонных понятиях как по мне. Доучить пробелы или нужный под конкретную задачу инструмент - почти всегда довольно легко.
Таблицы мифические городить для нубов тоже имхо ошибка.
>>606253
>Если тебе скажут что можешь посидеть тут недельку поделать тестовое за бесплатно и позаебывать всех вопросами - соглашайся.
А если не скажут, то сам попросись обязательно. Откажут - ну ладно. Но если разрешат, то считай повезло. Главное не слейся, даже если нихуя не понимаешь, спрашивай и гугли. Затупил и нихуя не понятно - попроси совета. Даже если оче стыдно - главное не сливайся так что походил пару дней и исчез (с мыслью о том что недостоин и нужно еще подучить). Глядишь сойдешь за того самого мифического "с огнем в глазах" сотрудника, которого все мечтают к себе нанять на работу.
>но при этом понимание как работают сервлеты и томкат на собесах все равно просят. Зависит от собеса.
Ребята, которые не понимают что нужно конкретно спросить для понимания, справится ли человек с конкретной текущей работой, спрашивают все что знают сами, что бы не нанять ни в коем случае спеца который будет сильно ниже навыком, ну или стандартную типовую хрень что бы вообще не париться? Ну что поделать. Мы люди - хули с нас взять.
Ну, не совсем, это собес в одну крупную галеру, название которой я не скажу по понятным соображениям. Спрашивают это всех. Спрашивают еще и за софт-скиллы тоже.
Ты похоже давно не видел ждунов и мидлов. Немыслимо тупят на всем, что сложнее решения в лоб. Из 10 только 1 сможет вообще вникнуть в любую абстракцию сложнее метода в классе, остальные 9 будут заниматься копипастом и даже пытаться вникать не станут. Это на словах и в резюме все красивые с кейвордами в плащах стоят, а на работе оказывается, что код то писать сучары не умеют. Даже когда от а до я решение расписываешь псевдокодом - типа опытные мидлы не могут это в код перенести. Пару раз так и на выход. Вот сегодня какой-то дед травил историю, что почти все пришедшие на собес мидла ларки не знают, как использовать форич. И это уровень макак с популярно фрейма, в целом по больнице получается даже хуже. Вся эта досеньорская толпа вайтишников - обсуживающий мусор, которым скидывается неинтересная и несложная работа. Щас бы ориентироваться на эти хилые умишки, чтоб они не обиделись. Когда кто-то из них начинает качественно расти - его вытягивают и получается еще один помидор, однако это очень редко.
А еще я написал про способность улучшить, а не просто прочитать. Могут даже не читать поидее, для пользователей моего кода всегда есть апихи. Те же, кто захочет развивать должны иметь для этого знания, а не только рабочее место.
>даже тетя зина прочитав учебник до половины могла его прочитать
Так ты и есть тетя зина, которая хочется чтобы сеньоры писали понятный ей код, потому что вторую половину какой-то брошюрки, названной учебником, осилить не можешь. О каких вообще может быть речь? Никакой книжонки, которая сделает из тебя даже джуна по прочтению не существует.
Спасибо, анон. Думаю вместо или сделать и.
>потом ты берешь CMS, т.к. она ничего кроме этого не требует,
Это пиздец какое сильное заблуждение. Любая CMS обладает собственной логикой (часто очень порочной), собственной структурой (часто неудачной) и собственными подходами к разработке (часто плохими). Для того, что бы успешно работать в рамках CMS нужно хорошо её знать.
Дихотомия CMS для нубов, а фреймворк для гуру ложная насквозь. Любой подход требует знаний и опыта. Проблема с CMS в том, что они дают слишком узкоспециализированный опыт, не применимый нигде кроме работы в них же. И именно поэтому тут советуют их избегать.
Сам я считаю себя достаточно продвинутым специалистом в не к ночи будет помянут Битриксе. Только в последние 2 года удалось с него немножко слезть. Так вот, для того, что бы совладать с этим говном мне потребовалась херова туча знаний и размышлений. И половина постов о хейте Битры в этом треде - моя. В отличие от хабрапидоров, которые не уважают его в стиле стереотипов, я ненавижу его потому что я с ним работал. Я не могу сказать, что 3 года битры были временем, спущенным в унитаз, но я определенно мог бы их потратить более продуктивно.
> Дихотомия CMS для нубов, а фреймворк для гуру ложная насквозь. Любой подход требует знаний и опыта. Проблема с CMS в том, что они дают слишком узкоспециализированный опыт, не применимый нигде кроме работы в них же. И именно поэтому тут советуют их избегать.
На первыйз вгляд все верно. Но оказывается, что CMS все же проще и устроиться на работу с ней проще тоже, в отличие от.
Читал что это норма. Когда на галере под видом мидлов работают джуны, а под видом синьоров - едва ли мидлы. Тут уже продажники пытаются наебать клиента, пытаясь впарить спеца классом ниже за больше бабок. Не нужно людей за это ненавидеть. Они то и рады что их взяли куда-то "синьорами-помидорами", лол.
>Читал что это норма. Когда на галере под видом мидлов работают джуны, а под видом синьоров - едва ли мидлы
да так и есть, на сеньорах маржа выше, отсюда и берутся 21 летние тимлиды-сеньоры.
хотя по факту то они откровенно не тянут.
Это не имеет отношения к набору, дружище. Не важно, что говорят заказчику, набирать могут по совсем другим принципам и из сеньеров делать pm'ов, например. Короче, мимо.
Да, взял устаревший, т.к. в новых какая-то обобщенная несуразица
>из сеньеров делать pm'ов
разработка и менеджмент вещи разные, многие с возрастом просто туда уходят, ибо заебало писать код, нельзя делать пма из человека с херовыми софт скилами.
ты так сказал как будто пм следующая ступень сеньора, как мидл джуна, это вообще другая ветка.
Все просто!
Помидор ходит по офису с кружкой кофе/стаканом смузи, флиртует с хрюшами, скидывает задачи на паровозов в ИТ компаниях(мидлов).
Мидл хуярит сутками по клавишам, метается между желанием сдохнуть и посрать.
Ждун просто как маленький щенок бегает по офису и гавкает "ООП хуйня, давайте писать в функциональщине" за что получает леща и идет на свое место до нового прихода гениальных идей в его голову, опционально пишет Хелло ворлд, забирает остатки пиццы с обеда домой.
Да, там синтаксис разный. Но суть то одна. Как по мне, пыха ближе к си, визуально. Питон позиционируют проще, хз. Ну нарпимер, на питоне можно написать генератор сайта, или что-то подобное. Ну типо доргена в народе.
для того чтобы сайтики на питоне писать тебе надо сначала его освоить, а затем уже фреймворке
пыха же была спроектирована таким образом чтобы сразу сайтики писать
тебе решать
>Любая CMS обладает собственной логикой (часто очень порочной), собственной структурой (часто неудачной) и собственными подходами к разработке (часто плохими)
двачую адеквата. сам щас работаю со всякими cms и понимаю что если ты джун и многих вещей не знаешь - то эта хуйня привьет тебе неправильные практики. например логику в модели прописывать, как это в опенкарте сделано)))
Там три теста на 120 вопросов. Первый прошел, он показал, что я забитый омеган. Мне как-то стыдно это эйчарке слать, она же результаты попросила.
> Спросила про семейное положение,
Потому что если семья и дети есть - ты не дропнешь работу, как свободный человек.
Если тебя спросят, кем ты видишь себя через 5 лет - помни, крайне важно видеть себя в той же самой конторе, просто на должности повыше.
>Если тебя спросят, кем ты видишь себя через 5 лет
А она спросила) Я ответил, что съебу в машоб из этого вашего веба, как только наберу достаточно знаний))
> Первый прошел, он показал, что я забитый омеган
Интересно насколько это распространено среди айтишников.
> Мне как-то стыдно это эйчарке слать, она же результаты попросила.
Ты ведь в итоге можешь получить работу - отправляй. Может она команду омеганов наберёт и будет комфортно работать с ними, в отличие от нормисов.
Ууу, всё. Не перезвонят. Я так с собеса вылетел.
пиздец эти хрюши совсем поехали. а случайно аккаунты на все свои соц сеточки не попросили скинуть? ну чтобы проверить насколько ты адекват. заходят - а там в подписках раковники, на стене пасты про говно, и вот это на аватарке. многие ебнутые галеры так делают, только без твоего ведома
а если закроешь профиль - то сразу все пок пок закрытый человек нам такой нинужон
дата сатанист ты думаешь там ии, хуй там ночевал будешь улучшать таргетированную рекламу.
Она сама вроде адекватной женщиной показалась, а тесты - приказ начальства, якобы.
А уж если профиль открытый, но пустой...
Первый тест
https://onlinetestpad.com/ru/testview/801-mnogofaktornyj-lichnostnyj-oprosnik-fpi
Вторые два в виде экзешников для винды, а у меня линух стоит. Придется виртуалку накатывать ептыть.
У меня знакомый работает в стартапе. Они там привлекали сатаниста за 200к в месяц на три месяца работы, и то этот хуй еще и совмещал (на основной работе у него примерно такой же ценник был).
в очо епт, натягивать вротпресс и машобить это дохера разные вещи
меня сам факт их наличия смущает, и что это приказ начальства. То есть есть некоторые сомнения в адекватности этих людей.
>Кароч. питон или пыха все таки. А в чем суть реквеста еще. На пыхе делают генераторы сайтов, те можно создавать кучу сайтов по шаблонам. Можно что-то делать подобное на питоне. Или лучше делать на пыхе все таки? Ну и попутно, да, что задрачивать лучше.
Чем тебе Django не подходит?
Хуета какая то бро
Получается пхп программист должен включать в себя фронтендера? Вроде есть вакансии, где чисто фронтенд требуют и пхп не нужно.
может, а может нет
>вы немного знаете пхп и отличаете бэк от фронта? Го к нам на 20к стажёром
Очевидно же что наебочка и тебе вообще не заплатят, а под "немного знаете" подразумеваются вполне себе знания вкатывальщика
писал на жабе больше года, за три дня вкатился в пыху(тип мог накидать сайт и тд), нормально-читабельный код писать начал через 3-4 недели
Все языки похожи(тип паттерны, алгоритмы, ООП, многопоточку ты не изменишь), просто на чем то проще писать под какую то задачу
Чем тот же пхп отличается от питона или руби? Или в этой нише как таковой больше востребованы фуллстеки?
Да фулстек - это всегда плюс. Но пхп-то изначально был заменой перла, чтобы делать сайтики быстрее. Ключевое слово - сайтики. Там html/css по дефолту знать нужно было. А в наше время это react/vue. Ну и один хер, дешевле нанять макаку, которая и то и то может за +40% к зарплате, чем двух чуваков на x2 денег.
>Все языки похожи
если похожа парадигма и синтаксис, дай тебе лисп или эрланг и ты утонешь в нем
Нахуй ты из жабы вкатился в пыху, ебанутый? Я пытаюсь наоборот выкатиться нахуй из пыхи, она просто днище.
Лоооол, сидишь-пердишь в универе на парах, ждешь чтобы заказчик кость бросил(я помнб тогда вообще за любые деньги работал, тип кому нужна жаба на фрилансе), все друзья писали на пыхе, тип заказов жопой жуй, ща вот второй год сижу на пыхе, с работой вообще проблем нет
кст, мой путь был скорее похож на деградацию
C + asm вставки для AVR8
Потом с++(qt)
Java => android
Пыхы + js
Ставлю свой носок, что ты ничего из этого глубоко не выучил, ни на одной серьезной должности с этим не работал, поэтому и жалеть не о чем.
Примерно так же было. Только андроид после пхп на годик поработал, а до пыхи на шарпе. Плюс питон и го недавно добавились.
с асм и микроконтроллерами просто поигрался
с++ чисто чтобы комп и контроллер связать
жаба для работы(пару заказов), но язык я старался понять как можно глубже, а не просто кодить
пыха - здесь дольше всего
так что, на нормальном уровне только пыха и малеха жаба, но все равно полезный опыт, тип понимание во что превращается код и как он выглядит после компиляции(asm), тип жаба дала основательное понимание ооп, а на пыхе патерны и уже нормальная разработка
Ну нормич, в принципе. У меня, на самом деле такой же путь примерно, от C++ в школе до PHP сейчас плачет
Другое дело, что пхп, вроде как, "глубоко" и невозможно знать. Вот, например, джавку - можно. Люди кодят на джавке и не знают, чем аррейлист отличается от линкедлист и почему, а в пыхе просто берешь и хуяришь.
Особенный разрыв у меня вызывают паттерны в php. Вот нахуя они там, если пхп выполнился и умер? Я на нем давным давно пишу и до сих пор не понимаю, нахуя их знать? СИНГЛТОН в пыхе, блядь, ну серьезно? Какая разница? Если бы это было c/java/c# приложение, которое висит в памяти, то там и правда нужен синглтон. А тут синглтон получается из любого класса просто потому, что пхп завершается после выполнения задачи.
Короче, ладно, чото меня понесло на ночь глядя, пойду спать.
НУ смари, чисто что сейчас смог вспомнить
Всегда использую фабрику в API, всегда юзаю команду для js(если в целом о веб), и вот не знаю можно ли назвать реализацию одного статик метода синголтоном
Не видел, искать не стану.
Не обязательно пыхеру, вообще бекендеру пригодится. Микросервисами на нем можно с легкостью закрывать узкие места, требовательные к производительности. Если микросервис простой планируется, то можно даже не выбирать особо, а сразу писать на го сейчас, не прогадаешь.
Заметная вещь для пхп - roadrunner. Возможная замена php-fpm, хотя на данном этапе многим пхпшникам работать с ним тяжело и непривычно(но многие пытаются), как дело с ним дальше пойдет посмотрим.
Я и роадраннер юзаю и микросервисы на го попиливаю.
Далее лирика.
Некоторые компании сейчас решаются полностью переходить с пхп на го. Правда как по мне это преждевременный шаг, но мир мое мнение не изменит. Перекат опытного пхпшника на го происходит прямо с места, язык очень прост, поэтому это вероятный вариант, куда тебя жизнь и мода заведет в дальнейшем по беку. Даже сейчас в го каждый третий наверное перекатился с пхп.
Оке, спасибо, опять двач выручает
> Всегда использую фабрику в API
> всегда юзаю команду для js(если в целом о веб)
Чего?
> и вот не знаю можно ли назвать реализацию одного статик метода синголтоном
При чем тут вообще один статик метод и синглтон? Что за шизу ты написал?)))000
> команду
А, блядь, я наркоман, я сначала подумал, что ты про какую-то консольную команду (npm start, блядь, какой-нибудь). Но при чем тут АПИ и фабрика - так и осталось загадкой.
Последнее это попытка пошутить, сори(
-------------
Про команду, это тип когда ты навешиваешь он-действие и потом разбираешь с чего оно прошло(самый банальный пример)
Команда — это поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
-------------
Фабрика в апи, тип пришло что то на вход, ты определил что и создал тот или иной класс, а методы одни и тежи вызываешь ти
Фабричный метод — это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
ахахха, в такой голос с npm start
он тебе рассказывает что любая операция в пыхе идет как отдельный тред и падает а ты ему про апи
А, я понял о чем ты, окей, сорри. Уже пол второго, в глаза ебусь. А нахуй тебе создавать тот или иной класс в зависимости от того, что пришло из апи?
мб я что то не оч понимаю, то просьба пояснить, но когда у тебя идешь лапша из вызовов классов, то патерны нужны для больше читаемости, я так предпологал
Этот прав. Хотя хуй с ним уже, под утро я уже сам теряю нить своего же разговора.
Ну что-то вроде того, мои стенания были скорее о том, нахуя некоторые паттерны именно в пхп. Они там (для меня) выглядят как кобыле пятая нога.
ну тип я помню делал такие конструкции,пришел запрос в гет параметре у тебя название метода(тип спарсить что то или еще что), ты вызвал класс который нужно(исходя из гет запроса, например через switch вызвал нужный класс), а потом с ним идут операции типовые
это особенность рантайма пыхи, там нет тредов выполнения как в жабе, скрипт выполнился и умер, потом встал новый и умер и дальше, потому нет и многопотока толком.
Это какая-то конкретная задача, видимо, может там так и удобнее, не знаю, короче. У меня ощущение, что мы не про фабрику, а про банальный полиморфизм.
свитч (getParm )
case getParam:
$a = new Что-то
case getParam:
$a = new Что-то
case getParam:
$a = new Что-то
$a->getName();
$a->getAge();
echo все говно
Если очень приземлено или мб я даун и назвал это фабрикой
НУ понятно классы разные
Хах, надо чаще на двач заходить, сразу пропадает ощущение что ты что-то знаешь в проге
Эээ, нет, это не фабрика, ты просто свичем создаешь. Мог бы и ифами, мог бы и иначе, это не делает такой код фабрикой.
Я скоро свалю из треда и опять будете разбираться какой фреймворк лучше и как запустить PHP, не переживай, хахаха
Дополню >>607295
Вот тебе пример фабрики на пыхе, найди пять отличий, как говорится )
<?php
interface Product{
public function GetName();
}
class ConcreteProductA implements Product{
public function GetName() { return "ProductA"; }
}
class ConcreteProductB implements Product{
public function GetName() { return "ProductB"; }
}
interface Creator{
public function FactoryMethod();
}
class ConcreteCreatorA implements Creator{
public function FactoryMethod() { return new ConcreteProductA(); }
}
class ConcreteCreatorB implements Creator{
public function FactoryMethod() { return new ConcreteProductB(); }
}
// An array of creators
$creators = array( new ConcreteCreatorA(), new ConcreteCreatorB() );
// Iterate over creators and create products
foreach ($creators as $creator) {
$products[] = $creator->FactoryMethod()->getName();
}
header("content-type:text/plain");
echo var_export($products);
Дополню >>607295
Вот тебе пример фабрики на пыхе, найди пять отличий, как говорится )
<?php
interface Product{
public function GetName();
}
class ConcreteProductA implements Product{
public function GetName() { return "ProductA"; }
}
class ConcreteProductB implements Product{
public function GetName() { return "ProductB"; }
}
interface Creator{
public function FactoryMethod();
}
class ConcreteCreatorA implements Creator{
public function FactoryMethod() { return new ConcreteProductA(); }
}
class ConcreteCreatorB implements Creator{
public function FactoryMethod() { return new ConcreteProductB(); }
}
// An array of creators
$creators = array( new ConcreteCreatorA(), new ConcreteCreatorB() );
// Iterate over creators and create products
foreach ($creators as $creator) {
$products[] = $creator->FactoryMethod()->getName();
}
header("content-type:text/plain");
echo var_export($products);
Ну и за методы с заглавной буквы и не отвечающие требованию "это должен быть глагол", надо убивать нахуй, конечно. Как этот код пролез в Вики, блядь, вообще...
Ваще похуй, как по мне, всё говно.
Ты еще почитай, например, когда лучше применять билдер, а не конструктор. Ну, в общем, тебя ждет большой удивительный мир, и это хорошо )
есть такое easy to learn hard to master сам столкнулся с ним когда начинал жабу, базовый язык простой как три копейки, но из-за огромного стека фреймворков багаж необходимого пухнет как баул на рынке в 90х, так и с обратным принципом когда начал жевать кложуру, ебать как это так код в виде аст дерева, как писать код и не писать мегатонну хуеты к нему, почему обход одной функцией, это дробило мне мозг а потом пришло просветление.
Здесь - никому, а на собесах нужны :) Да и вообще, чем больше знаешь, тем лучше ты можешь писать код, независимо от языка. Я когда про паттерны лихо заявил а-ля "нинужна!", я только синглтон имел ввиду. Я бы еще несколько разных туда же в "нинужна!" приписал (обсервер, например, в пыхе он смотрится СТРАННОВАТО), но в целом паттерны - это хорошо.
а вот честно, я так что задумываюсь о последних проектах, чистоте кода, патернах, чаще всего я вижу это тяп ляп и в продакшн(тип во многих компаниях), один чувак сказал, что пока ты тут будешь правильную архитектуру мутить, конкурент уже приложение состряпает и поэтому все пишут говнокод, так что у меня двоякое чувство про изчение этого всего, может только если для души...
Да там и саму джавку можно учить годами, похоже. Я хотел пройти тесты OCA/OCP (оракловские сертификаты на знание джавы). От функциональщины у меня мозг просто сломался и вытек. Я ее дрочил-дрочил, все эти би-консьюмеры, сапплаеры, стримы и прочее дерьмо. А когда решил пройти демо-тест (не настоящий даже!), то я чуть не заплакал - я просто _не могу_ понять, что будет в результате выполнения запутанного функционального кода, просто, сука, НЕ МОГУ.
Угу. А когда твой конкурент через год сделает продукт лучше и работающий правильнее, то ты будешь локти кусать, т.к. ты свой говно-код уже поправить не сможешь никак, не начав писать с нуля. Почитай про проекты, которые от этого загнулись. ВНЕЗАПНО, например, официальный клиент ICQ. И у меня есть серьезные подозрения, что многие проекты мелко-мягких испытывают эти проблемы прямо сейчас, например.
дело даже не чистоте, дело в костылях, многословности, я накладываю эти слои абстракции, а потом я увидел что есть что то где нет этих фабрик которые делают фабрики, писать приятно.
>>607309
это даже не функциональщина, это огрызки
многопоток в мутабельном языке это боль, изоморфное приложение это как сесть на раскаленный лом.
У меня есть просто охуенная история по этому поводу, кстати. Прямо вот из первых рук. Напишу и пойду спать все-таки.
Короче, года два назад устроился в одну контору. Они там мутили супер-мега-saas-приложение на пыхе в стиле "нам надо сделать это очень быстро и в продакшн", не буду раскрывать подробностей, травлядианон. Так вот. Мне дали двух джунов, задачи и сроки, сказали - ебош.
Смысл был в том, что у юзера очень много всяких настроек, он может и такие галочки поставить и сякие, они все перекрывают друг друга по бизнес логике, от каждой из них меняется что-то в рассчетах денег и так далее. Короче, очень запутанно.
Когда я понял, что нам медленно приходит пиздец, т.к. изменения в одном месте влияют на какой-то вообще десятое место и человеческим мозгом уже разобраться не получается, как это так выходит, я начал бить тревогу и требовать ввести хотя бы регрессионное юнит-тестирование, иначе мы просто не сможем даже узнать, что новые правки что-то сломали.
Мне сказали, что это долго-дорого, а значит нинужно. И вместо этого выкатили еще кучу всяких новых фич в разработку.
Через полгода проект дошел до такого состояния, что внести правки было просто невозможно. Чинишь тут, ломается там. Чинишь там, ломается где-то еще. Вносить новую функциональность стало никак.
Мы еще 2 месяца ебались и пытались все исправить (тесты нам писать так и не дали), после чего я просто дропнул эту контору.
Запомнился один момент, когда мы под какого-то клиента срочно-срочно перепиливали кусок до глубокой ночи. На утро состояние проекта было такое: старое сломалось, новое работает через жопу, что делать, непонятно, сроки - вчера.
Ну и отдельным пиздецом шло то, что мне приходилось день и ночь ревьювить код джунов, ибо этот код - это был пиздец. И они относились к работе на отъебись, а я не мог их даже премии лишить в качестве поощрительных мер, не то, что уволить. В общем, это был какой-то ад, блядь. И проект в итоге сдох, конечно.
Наверняка, я как тимлид тоже накосячил много, но я хотя бы понимал, к чему все идет. Но позиция руководства а-ля "это же всего лишь ПХП, вы ПРОСТО пишите код и ПРОСТО добавляйте еще тонну функционала со сроками позавчера" меня убила, никогда такого не видел.
У меня есть просто охуенная история по этому поводу, кстати. Прямо вот из первых рук. Напишу и пойду спать все-таки.
Короче, года два назад устроился в одну контору. Они там мутили супер-мега-saas-приложение на пыхе в стиле "нам надо сделать это очень быстро и в продакшн", не буду раскрывать подробностей, травлядианон. Так вот. Мне дали двух джунов, задачи и сроки, сказали - ебош.
Смысл был в том, что у юзера очень много всяких настроек, он может и такие галочки поставить и сякие, они все перекрывают друг друга по бизнес логике, от каждой из них меняется что-то в рассчетах денег и так далее. Короче, очень запутанно.
Когда я понял, что нам медленно приходит пиздец, т.к. изменения в одном месте влияют на какой-то вообще десятое место и человеческим мозгом уже разобраться не получается, как это так выходит, я начал бить тревогу и требовать ввести хотя бы регрессионное юнит-тестирование, иначе мы просто не сможем даже узнать, что новые правки что-то сломали.
Мне сказали, что это долго-дорого, а значит нинужно. И вместо этого выкатили еще кучу всяких новых фич в разработку.
Через полгода проект дошел до такого состояния, что внести правки было просто невозможно. Чинишь тут, ломается там. Чинишь там, ломается где-то еще. Вносить новую функциональность стало никак.
Мы еще 2 месяца ебались и пытались все исправить (тесты нам писать так и не дали), после чего я просто дропнул эту контору.
Запомнился один момент, когда мы под какого-то клиента срочно-срочно перепиливали кусок до глубокой ночи. На утро состояние проекта было такое: старое сломалось, новое работает через жопу, что делать, непонятно, сроки - вчера.
Ну и отдельным пиздецом шло то, что мне приходилось день и ночь ревьювить код джунов, ибо этот код - это был пиздец. И они относились к работе на отъебись, а я не мог их даже премии лишить в качестве поощрительных мер, не то, что уволить. В общем, это был какой-то ад, блядь. И проект в итоге сдох, конечно.
Наверняка, я как тимлид тоже накосячил много, но я хотя бы понимал, к чему все идет. Но позиция руководства а-ля "это же всего лишь ПХП, вы ПРОСТО пишите код и ПРОСТО добавляйте еще тонну функционала со сроками позавчера" меня убила, никогда такого не видел.
> это даже не функциональщина, это огрызки
Ну я кроме джавы и пыхи ничего толком не знаю, на си - только баловался. Функциональщину в джаву подвезли по принципу "чтоб было как у всех", насколько я помню.
> изоморфное приложение
Я сейчас загуглил, пишут, что это приложение, когда сервер может рендерить фронт. Чо? Пояснишь?
>Запомнился один момент, когда мы под какого-то клиента срочно-срочно перепиливали кусок до глубокой ночи. На утро состояние проекта было такое: старое сломалось, новое работает через жопу, что делать, непонятно, сроки - вчера.
ХАХХАХА, такая жиза
> мутабельном языке
И вот это поясни, пожалуйста. Я понимаю, что такое мутабельный-иммутабельный объект, например, в концепциях того же String/StringBuilder в джавке, но что такое ЯЗЫК?
>Чо? Пояснишь?
просто пример есть некий тяжелый сервис, скриптов много и ты видишь какую нибудь крутилку при загрузке, изоморфное при первом запуске делает это на сервере и отсылает браузеру, который в это время фоново поднимает скрипты и нет лага при запуске, когда страница открылась а скрипты нет.
То есть мы говорим про обычный Server Side Rendering? А почему это называется таким умным словом "изоморфное"?
>>607321
Выдержка с хабра
В 2011 году Чарли Роббинс сформулировал это так, что под изоморфным мы подразумеваем тот код, в котором каждая взятая строка может исполнятся как на сервере, так и на клиенте. С небольшими исключениями.
Выглядит это все так, что у нас есть браузер, есть фронтенд-сервер (выделяется отдельно), и есть старый привычный бэкенд-сервер. Это может быть даже база данных без какого-то сервера. Браузер обращается к фронтенд-серверу, тот может обратиться за данными куда-то к старому серверу либо к базе данных, получить данные.
Далее он может сформировать полный HTML, отдать какой-то критичный CSS, который необходим только для рендеринга этой страницы, а не, как в случае с SPA, для рендеринга всего приложения, которое может вполне вам понадобиться.
И в конце отдать JS bundle. В этот момент у нас будет собран на клиентской части и поднят фронтенд-клиент, который в свою очередь дальнейшую коммуникацию может осуществлять с бэкенд-сервером предыдущим, допустим, через RESTful API.
create read update delete
Я может совсем отупел, но
> котором каждая взятая строка может исполнятся как на сервере, так и на клиенте.
Что это за хуйня. Если буквально, то весь код должен быть написан на JS и бекенд на ноде, блядь? Или я отупел все таки.
> я создал список 1 2 3 добавил к нему 4, список не изменился, а функция конж вернула новый список, не меняя старый.
Ты хочешь сказать, что есть языки, где все объекты иммутабельные или что?.. Я ничего кроме пыхи и джавки не знаю, там ты можешь кодить как хочешь в этом отношении.
тут с картинками https://habr.com/ru/company/oleg-bunin/blog/319038/
Слухайте, мб кто шарит, а какие есть еще подходы для HighLoad?
Ща просто проект взяли, обещают до 10к запросов в день, тип как сделать так чтобы сервак не лег и при этом сбалансировать все(время/производительность), мб статью на хабре или еще что, а то не знаю куда сунуться
Есть пара мыслей про очереди или Round robin DNS(тима зеленая так что накидывайте даже что то очевидное, мб мы этого не знаем)
Ну я, может быть, по дефолту беру в качестве клиента - браузер. Мы же в пхп треде. В чем подвох, объясняй давай, я спать хочу )))000
>10к запросов в день.
Это очень мало. Даже в минуту это не много. Разве что у вас на каждый запрос выполняется какой-то тяжелейший пиздец.
да все объекты иммутабельны, они не меняются, если х = 5 то оно и будет 5, а если ты ниже напишешь что х = 6 то оно просто затрёт предыдущее а не поменяет.
Забавно. Надо посмотреть это будет. А нахуй они так сделали, им память не жалко или что?
по запросу идет поиск по карте, довольно тяжелый, около секунды ответа
то есть, забить, и написать обычный код особо не парясь(сказать купите сервера по мощнее)?
> для серваков за 160р это хайлоад
В смысле, блядь? Хайлоад - это хайлоад. Говно-сервер - это говно-сервер.
не особо шарю, думал что highLoad это просто высокая нагрузка на сервер
на сайтах обычно написано что-то вроде
Если Ваш сайт не справляется с нагрузкой — все, теперь Вы в клубе highload.
Нууу... Слушай, ну да, хайлоад - это высокая нагрузка. Только обычно это что-то в духе "100 миллионов обращений в сутки", а не 10к. И речь там идет о том обычно, когда просто добавляя железо (нормальные сервера, а не говно-виртуалки) ты не можешь решить проблему какого-нибудь "узкого места" в своем говнокоде.
Я не понимаю что ты пишешь, постоянно приходится переспрашивать.
Да, блядь, даже сказать нечего. Что такое нахуй "перемалывало" данные? В мясорубке или что? Ты наркоман, дружище, или пьян или чего?
слухай, а можешь просто терминов накидать из области распределения нагрузок(или статью или просто наводочку какую-то), ну тип у меня есть 5 дедиков, как между ними распределить нагрузку например?
Извини, я в этом не разбираюсь. Самый сильный проект, над которым довелось работать, это новостной сайт с 2 миллионами посещений в сутки. И там он спокойно работал на одном (но производительном) физическом сервере вместе с базой данных даже, просто всякие кеширования в nginx были настроены правильно и всё. Мне даже рассказать нечего особо про этот проект, сложных запросов даже не было (select where, update where, пара джоинов, нечего оптимизировать, короче).
Алсо, сейчас работаю над проектом, где как раз около 10к посещений в сутки, он вообще на виртуалке крутится и не пердит, всё окей, хотя накручено там будь здоров (и должно бы уже тужиться, но нет). Так что я хуй знает. Если что найдешь - кидай в тредю.
пишешь ты дурачек распаралливание и тебе нужно колдовать с приоритетом, потоки нужно синхронизировать, данные надо копировать, какие волатилы какие нет, в мутабельности если наебешься они начнут давать кашу и ты будет копать как джамшут ища где ты объебался.
в иммутабельности у тебя вообще нет эти проблем, ни одной блядь, ты просто настраиваешь ссылочные типы, для больших систем или атомы если много не надо и все блядь, и не парится что какой то поток изменит переменную не так или не вовремя и все остальные потоки получат хуйню.
Я стараюсь что то читать, смотерть по этой теме, но реально не работал пока, вот что слышал
Round robin DNS - тип разные выдавать ip адреса
Совать в очередь и оттуда забирать как только обработал и так контролить потоки
Еще про БД - про ноды и репликации
Просто тема интересная и я уверен пригодится, я так то зеленый, тупо третий год на фрилансе сижу какие то конченные проекты выполняю
А, ну примерно понял, ок.
Мы может о разном...
> Round robin DNS - тип разные выдавать ip адреса
А при чем тут хайлоад? Это ж обычный cdn, если я правильно понял.
> Совать в очередь и оттуда забирать как только обработал и так контролить потоки
И какая разница, если у тебя эта очередь под нагрузкой забьется и последний вставший будет ждать 10 лет?
А так да, тема хорошая, изучай.
хых, материала и направления бы кто подкинул
>А так да, тема хорошая, изучай.
Round robin DNS - я так понял, у тебя 3 дедика, а с dns сервера ты просто выдаешь их последовательно, тем самым распределяю нагрузку
CDN просто статику выплевывает по примеру какой нить jquery библиотеки
> Round robin DNS - я так понял, у тебя 3 дедика, а с dns сервера ты просто выдаешь их последовательно, тем самым распределяю нагрузку
А, ок. Мне это известно как "балансирующий сервер" или балансер или типа того. Теперь понял, о чем ты. Да, это хайлоад, базару нет.
В общем, чтобы ты совсем обиженный не ушел, загуглил за тебя. Попробуй поискать лекции с этих конф: https://www.highload.ru/
>>607362
> а с dns сервера
Разница между нами, кстати, в том, что я читал о другой схеме: днс всегда указывает на один сервер, твой. Но уже он следит за нагрузкой и вызывает самый менее нагруженный дедик, где уже реально находится бекенд. Что-то вроде прокси-который-следит-за-нагрузкой. Как организовать - в душе не ебу, только читал.
хах, так это я оттуда это и услышал, там чуваки могут 2 часа тереть что сфинкс лучше эластика, или лекция по снижению нагрузки где чувак очевидные вещи час затирает(по типу не пиши 2 вложенных цикла без необходимости), так что это тоже не панацея от незнания в области хайлоад
а ты не больше времени потеряешь на доставку пакетов, вики вот что говорит:
В простейшем случае Round robin DNS работает, отвечая на запросы не только одним IP-адресом, а списком из нескольких адресов серверов, предоставляющих идентичный сервис. Порядок, в котором возвращаются IP-адреса из списка, основан на алгоритме round-robin. С каждым ответом последовательность ip-адресов меняется. Как правило, простые клиенты пытаются устанавливать соединения с первым адресом из списка, таким образом разным клиентам будут выданы адреса разных серверов, что распределит общую нагрузку между серверами.
Луль. Я вообще лекции не люблю, одна вода обычно и нихуя непонятно и конкретики нет. Я попробовал книги на амазоне глянуть, нихуя нет тоже. В общем, я тоже по этой же причине в свое время забил на хайлоад - слово громкое, а конкретики как-то и не найти.
Исправить текст и предложения (Сделать первые буквы в предложений заглавными) и расставить пробелы после знаков препинания.
Не, просто скидываю ОПу чтобы проверил.
Какой-то дроч ради дроча. Скорее всего ты все это может сделать одной-двумя регулярками.
Что за допрос внезапный? Ну насколько я знаю ООП это исплользование объектов, в которых заключена информация для использования на протяжений всей программы. То есть мы берем объект, в нем вся нужная нам информация которой можно манипулировать.
ООП не знаю. Вот собираюсь изучить.
А, окей. Я уж хотел тебя подловить, но ты вообще дно. Вопрос был наводящий, который должен тебя заставить задуматься, что лучше - дрочить рандомные задачи, которые никому нахуй не нужны или изучать то, что спросят на собеседовании. Удачи.
Тут спорить нет смысла. Решать задачи обязательно, плевать какие. Они помогают закрепить материал и развивают мышление в этом направлений. Без разницы какие задачи. А если спросят на собеседований о какой то теме я её уже буду знать на автомате.
Мне не нужно получить крутую работу, мне нравится то что я делаю.
ухххх, подловил, ну если придраться, то это тоже CLI.
Я про то что я свою жизнь без ООП уже не представляю и если чувак вкатывается в прогу, то надо первом на эти вещи смотреть
мемас на эту тему, с которого я долго орал https://github.com/torvalds/linux/pull/335
Ты меня никак не переубедишь. Понимаешь, я настолько конченный, что решаю это всё в Виме, на который я устанавливал плагины и вручную устанавливал зависимости.
Я занимался этой хуйней, когда мне было 20. Сейчас я использую то, что действительно удобно и не занимаюсь хуйней. Короче, ты не про работу, ты так, дроч для себя, пока родители кормят, я понимаю. Тогда уж лучше учи нормальный язык, а не пхп.
Ну я тебя понял, нужно как то стремиться монетизировать изучая то что используется на рынке, так?
Ты какой то ебаный ноунейм который несет хуйню. Не ебу чего ты добился, но явно не результатов с таким мышлением. Ты наверно один из вкатывальщиков? Что хуево да?
Ну понятно всё с тобой, обыкновенный додик. Заебись вкатился? Как в конторе? Ебут нормально? Как полёт? Сколько таким говнокодерам как ты башляют? Ммм.
Да все хорошо, спасибо, что спросил. А по поводу вима, был у нас один фронтендер в команде, который работал через вим и считал себя очень крутым, когда на ретро обсуждали вопрос, что неплохо бы иметь единый кодстайл и решили попробовать сделать это через плагины к IDE, всем было смешно и забавно, ему особенно.
>>607407
Да конечно не могу, расслабься уже, шизик ебаный.
Орнул. Найс аргументы :) Удачи тебе, шизик, в жизни будет не легко, когда вырастешь.
Почитай про области видимости
Переменная $paymentTotal объявлена в цикле for и видно её только там. При выходе из цикла переменная пропадает. Тебе нужно объявить её в теле цикла.
В функций у тебя так же идёт возврат двух значений, после того как выполняется выражение $paymentTotal, следующее за ним выражение return $month пропадает, потому-что за ним успевает первое, которое завершает функцию.
Тебе нужно объявить $paymentTotal в теле функций, либо $paymentTotal = null, либо $paymentTotal = 0.
Почитай как тебе уже сказал анон про области видимости и очередность исполнения. А так же немного про функций.
https://www.php.net/manual/ru/language.variables.scope.php
https://www.php.net/manual/ru/functions.returning-values.php
лол, 15 задач в месяц можно абсолютно бесплатно скидывать на джунов )
А то у меня база данных из 5 таблиц, сохранил в файл экспорта SQL - всего 50к строк.
База примитивна - там даже связей нет.
И не могу нормально залить - на хостинге phpMyAdmin - нажимаю экспорт загружаю файл. и через какое-то время проблемы (в основном почему-то MySQL ломается). и дело не хостере - делаю тоже самое в WAMP - так один раз вообще вынесло весь MySQL пришлос переставлять.
Вот сейчас на хостинге при открытии любой базы или таблицы (не только залитой а вообще в том числе старых) пишет ошибки про
Undefined index: HMAC_secret
вот примерно так:
https://pastebin.com/CKbgp94v
Я не понимаю что не так и как теперь исправлять (это на рабочем хостинге - неужели тоже похерило)
часть функционала с пыхи переводят зачастую сейчас на го. связано это с тем что дает возможности которых нет в пхп, а все заново собирать с нуля это не варик
Вот у меня есть ламповая тудушечкавнутри она с mysql работает, и я хочу проверить как оно вообще будет работать при 1000/10000 запросах, сервак xampp на шиндоус.
Пока я только додумался на жс тестик написать чтоб оно само формочки заполняло и кнопочки нажимало.
Скорее всего проблемы с конфигурацией БД у тебя на локальной версии и в проде, надо внимательно проверить версии, настройки, доступы. И еще лучше работать через консольные команды: mysql -u username -p database_name < file.sql
Похоже на баг в PhpMyAdmin, попробуй другую версию или другую программу вроде adminer. Или заливать дамп из консоли (если умеешь):
cat /tmp/dump.sql | mysql -hhost -uuser -p database_name
Если дамп сжат gzip:
cat /tmp/dump.sql.gz | gunzip | mysql -hhost -uuser -p database_name
mysqldump -uuser -ppassword db_name > file.sql
mysql -uuser -ppassword db_name < file.sql
Чего ты мучаешься, блядь.
https://ideone.com/SY7llL вот мое решение, у которого возникли проблемы
Игнорите...
jmeter
apache benchmark (просто долбит запросы в одну страницу, совсем простая штука)
siege (делает запросы по списку)
Yandex Tank (навороченная штука с админкой): https://yandex.ru/dev/tank/
Должен предупредить, что логично тестировать нагрузку не на windows, а на линукс (обычно сервера на нем работают). Логично тестировать не примитивное приложение, а что-то посложнее и ближе к реальности.
В идеале запросы надо запускать с другой машины, и обеспечить между ними достаточный канал связи.
Но в общем-то, стоит попробовать, хотя бы чтобы научиться.
<?php
error_reporting(-1);
header('content-type: text/plain; charset=utf-8');
$text = 'А роза упала на лапу Азора';
$result = '';
$text = mb_strtolower($text);
$text = str_replace(' ', '', $text);
$lenght = round((mb_strlen($text)/2), 0, PHP_ROUND_HALF_EVEN);
for($i = 1; $i <= $lenght; $i++) {
if(mb_substr($text, $i-1, 1) != mb_substr($text, -$i, 1)) {
echo 'это не палиндром... :c';
break;
} else if($i == 10) {
echo 'это палиндром!!1';
}
}
?>
ну или вот https://ideone.com/xrUXeG
Короче.
Есть несколько файлов:
1. логин/регистрация
2. список сообщений
3. Страница с формой добавления сообщения.
Все работает, как и должно на стороне php. Но есть один нюанс (как в анекдоте).
Хтмл-формы стакаются, блять, при переходе от файла к файлу.
Залогинился -> форма с логином пропала, показались посты через инклюд ("посты пхп"). Ок.
Но потом, при отправке поста у меня остается форма добавления текста и список постов.
Мне надо, чтоб форма ввода убиралась и показывались только файл с постами.
Как сделать?
Ковариантность и контрвариантность 600 лет ждал блядь. Сколько я граблей об это говно сломал.
Типизированные члены тоже пушка. Правда не понятно почему callable нельзя.
Расширения на сиське тоже охуенно.
Предзагрузка тоже пушка.
Блядь, да пых становится прям охуенным языком
Нет бы знак доллара убрать при объявлении переменной.
> стрелочные функции
Как в жс? Делали бы сразу синтаксис в точности как у жс, было б удобнее.
Дай ссылку
> Очевидно же что наебочка и тебе вообще не заплатят
Почему не заплатят? Особенно если
> под "немного знаете" подразумеваются вполне себе знания вкатывальщика
Если что, под стажёром я не имел ввиду работу без оформления, а минимум зп 15к - нельзя разве себе выбрать вкатыша и обучить его за эти деньги? Особенно учитывая, что откликнутся многие, а выберут того, кто уже более менее разбирается.
Там оно хранит ссылку на родителя, прототипное называется
Есть объект, в нем ссылка на радотилея, цепочка может быть длиной .
И когда ты какой-нибудь туСтринг вызваешь он проходится как по списку, до того как не найдёт
Yii2-аноны есть итт? Аноны, есть ли либы/софт для того чтобы все таблицы+связи из дампа постгрис базы превратить в миграции?
Есть какая-то ХзХуйня но я ее не пользовался, так что хуй знает
https://github.com/Hzhihua/yii2-dump
Это находил, но пока что не юзал, последний комит пару лет назад и их количество вызывает опасение, может есть какой-то общепринятый инструмент для таких задач? В любом случае - спасибо за ответ, анон.
Спасибо. Помогло отчасти, но завтра узнаю, в чем были причины.
Так же спасибо анонам, которые рассказали про сессию и печенье.
Всё ок.
Не понимаю как сделать транзакцию.
Без ларавел фасад DB чет не работает. Как сделать транзакцию мож кто знает?
П.С.
Мне нужна банальная вещь - одним запросом добавить строки сразу в несоколько таблиц. Что бы или все таблы обновились, или откат.
Используя PDO я использовал транзакции.
В Eloquent транзакции по документации доступны из фасада DB ларавел. Я же использую Eloquent отдельно в slim.
И я забуксовал.
Если ты пишешь print_r();exit(); и у тебя не белый экран - значит ты не в том месте пишешь это.
Сначала напиши в начале файла, сразу после <?php что бы узнать инклудится он вообще или нет
Далее погружаешься вниз, пишешь в конструкторе, что бы узнать создается ли вообще данный класс, потом в предполагаемом методе и так далее. Вплоть до нужного тебе if() или строчки.
var_dump(get_included_files());
Запости решение, мб кому будет интересно.
Предлагали ваку в ТОРе с фалконом?
>обновлять инфу, не перезагружая страницу
Нет. Только если по Ajax подтягивать обновлённую инфу.
Пхп это серверный блять язык. Что за хуйню ты несёшь? А к базе данных из браузера через джаваскрипт подключаться не хочешь?
> А к базе данных из браузера через джаваскрипт подключаться не хочешь?
Хипстеры уже додумались до такого в своём Firebase.
мимо
это просто сервер в облаке, к базе данных подключается сервер по запросу
Иди нахуй отсюда, даун.
Работать с командной строкой надо уметь, так как порой возникает необходимость в конфигурировании веб-серверов, большая часть которых работает на ОС Linux. Если у тебя стоит винда, можешь 2 ОС поставить себе Kubuntu, и учиться писать код пхп в ней.
Есть API, которое выдает товарные фиды в виде XML и JSON. Необходимо брать эти данные, нормализовывать, и потом ложить в базу. Как лучше такое выполнять, что использовать? Ни разу с таким не сталкивался. Еще проблема в том, что данных очень много. Нужно как то фильтровать. Или пилить админку, чтобы можно было выбирать какую часть фида загружать. Как вообще в PHP работать с XML и JSON?
Дебажишь прямо на продакшене?
Json делается так:
1. Через курл или файл гет контент грузишь контент.
2. Затем jsondecode и работаешь как с объектом
такая же проблема, анон. только вот мне наоборот со сторого api который работает через xml как раз надо перевести на новый, который как раз на json. легче было бы с нуля написать, но нет же, заказчику нада чтобы старый перелопачивали
в итоге сижу целую неделю ниче не написал и толком не выяснил как эта залупа работает. хуй знает че делать и как ловить. все раскидано по файлам и что то идет с пхп файлов, что то с js, что то блять вообще с <script type=text/html>
я отчаился, анонсы
Не знаю. Пока только вникаю что к чему. Спасибо, гляну.
А как это сделать? Скачать архив с фреймворком и просто залить на хостинг через файловый менеджер я правильно понимаю?
??? Acmp удобен тем, что там есть проверяющая система, есть рейтинг. Просто в стол писать не интересно.
>codewars?
Не нравится. Интерфейс неудобный, русского языка нет, задачи не совсем олимпиадные.
Всегда что-то идет не так. То фирма теряет бабки и предлагает урезать ЗП, то меняется начальство на неадекватов, то ищется работа получше, а то меня заебывает работать в офисе.
>русского языка нет
Сударь, вы зажрались
>задачи не совсем олимпиадные
Причем тут php? Олимпиадники на питоне пишут
Меня вот эйчарка обоссала за то, что я до 30 лет ни разу официально не работал, а потом тимлид засмеял, когда я не смог быстро на бумажке написать обход дерева в ширину с выводом вершин по уровням. Уже потом, идя домой обоссаный и осмеянный, понял, что задача для 3-го класса.
да нахуй ты себя так приложил
В общем какая лучшая паралель jquery есть на php? Для написая простых задач и скриптов, а не ебли с сложными сайтами с нуля, чисто чтобы баловаться приятными ништяками для себя и надрачивать как ты удобно сделал считая себя сверхразумом являясь дауном учитывая что такие задачи у остальных не занимают даже 1% напряга мозга
Смотри сам не обосрись, умник.
>Посоны, вот в JavaScript есть такая охуенная вещь облегчающая написание скриптов как JQuery, а какая на этом же уровне альтернатива идёт для написая кода в PHP?
JQuery создавался для того, что один код работал в разных браузерах. В то время код для разных браузеров отличался.
>Чтобы так же удобно и покайфу обращаться к формам, DB и вообще к всяким готовым ништякам тупа так же в 1 строчку решая большинство задач
Но ведь это и есть Laravel, чем не понравился тебе?
Если хочешь писать как на ванильной пыхе, то попробуй CodeIgniter, очень тупой и прямолинейный фреймворк
В общем да. Плюс база, сервисы (если используешь, типа редис, еластик) и подобное.
Ну терминал
>>611111
Но ведь как он охуенно сокращал код, и синтаксис понятный и приятный
>>611216
>>611315
Я мягко сказать был в шоке, почему просто нельзя скачать директорию с модулями и подключать нужные, почему нужно качать тонну говна которая скачает ларавел с ещё большей тонной говна и потом в этой тонне говна бегать по тонне файлов и что-то там создавать, то что они называют конструкторами, блять, сука, даже чтобы просто страницу создать, нужно для неё прописать url и шаблон в разных и отдельных файлах, что это бля вообще за хуйня, в общем нужно что-то простое для написания типа парсеров, ништяков для сайта, а не ебучего комбайна из тонн костылей с ужаснейший вырвиглазным синтаксисом, без всех этих еблей с кучей дерикторий и непонятных тонн файлов
Я правильно понимаю, сейчас всё пришло к тому что вся работа возложена на браузер пользователя? Сервер отдаёт только каркас страницы и джейсон с данными, а уже браузер тонной библиотек парсит его и вставляет в по сути пустую страницу, типа сняли нагрузку с серверов, отдав им только работу с бд, и то этйо бд управляет ещё тонны говна с костылями которые они называют вмс и хвалят за скорость написания, по сути просто накладывая на чистые js и php тонны уродского синтаксиса их фреймворков чтобы быстрее высрать говно, спихнуть это под видом технологий лошку клиенту и съебаться в туман насрав что это куча костылей и говна которые неоптимизированы от слова совсем, пример сейчас это ютуб и твич, где у тебя грузится просто фон и уже куча скриптов на скрипте начинают верстать страничку и всё это дерьмо логает если у тебя не компьютер хотя бы старее 2017 года
>сняли нагрузку с серверов
Нет, дело в том, что браузерный клиент давно перестал быть единственным. Чистые апишки пилятся для взаимодействия с любым клиентом. При этом сср нужен самим фронтам, хоть и костыльно выглядит на первый взгляд (и на второй тоже). Причины, правда, не то чтобы критичные были, но уж пусть так. Кроме того это дело все кешируется насколько может. Нагрузка на бек важна конечно, но сср там малую роль играет.
Из всего тобой сказанного - тебе нужен вротпресс.
>вротпресс
Это понятно, но хочется для себя для удовольствия пописать всякие ништяки не находясь на вордпрессе, да даже просто на локальном сервере например парсер написать, на чистом php не то, слишком выгвиглазно, а увидев все эти структуры и взаимодействия этих костылей на том же ларавеле просто блевать хочется а не писать, по этому и захотелось найти что-то типа jquery на js, но только для php, чтобы так же логично, красиво, просто и удобно
Тебе зря так кажется.
Если хочешь либу для парсинга/работы с DOM на пхп, то SimpleDOM может подойти. Древний он правда.
https://github.com/ziadoz/awesome-php#scraping
В этой секции еще можешь глянуть.
>так же логично, красиво, просто и удобно
Жиквери не является образцом логики, простоты и удобства. Недаром сейчас предпочитают при прочих равных писать просто на ваниле. Сейчас жиквери - рудимент.
>логично
Логики там не нужно. Это же библиотека, она ни на что такое не претендует. В давнее время упрощалась работа, но сейчас это уже лишнее. ты даже не представляешь насколько.
>красиво
Красоты тоже нет никакой. В самом лучшем случае становится чуть меньше кода, чем на ваниле, но он красивым от этого не становится.
>простоты
Вот это мб. Совсем не умея в ванилу вкатывались ведь предки нынешних фронтов в живквери. Значит простая.
Тогда slim посмотри. Из коробки тупо роутер, все нужное тебе подключаешь сам.
Слим наоборот для тех, кто понимает что делает и как это готовить.
>>611416
Спасибо за ссылки, уже что-то, поизучаю.
>>611387
>Жиквери не является образцом логики, простоты и удобства
Ну почему же, $("#2ch").click(function()) логичнее, красивее и удобнее же чем document.querySelector("#2ch").onclick = function()
Или $.getJSON("2ch.json", function()) чем ебаться с громадным XMLHttpRequest, не буду даже его рассписывать
Вот и хочется нечто подобное охуенное для сокращения и PHP
>чем ебаться с громадным XMLHttpRequest
fetch погляди.
>$("#2ch").click(function()) логичнее, красивее и удобнее же чем document.querySelector("#2ch").onclick = function()
Чуть короче и что еще?
На fetch пока не смотрел бы, так как многие до сих пор деревянными браузерами пользуются
Это ленивые премеры были, попробуй например сделать на ваниле скрипт вкладок и на jq, он будет в разы приятнее и короче на jq, не суть, я просто ищу что-то подобное для php, или ты намекаешь что проще писать на чистом php, так как текущие фреймворки все вырвиглазное дерьмо с помойнейшим синтаксисом для макак пушечного мяса
>проще писать на чистом php, так как текущие фреймворки все вырвиглазное дерьмо с помойнейшим синтаксисом для макак пушечного мяса
В некотором смысле да, но тебе я не это пытаюсь сказать точно. Странно, что ты реально простым фреймам так противишься, где очень многое уже сделано за тебя.
>На fetch пока не смотрел бы, так как многие до сих пор деревянными браузерами пользуются
Полифилы решают. Ну и если уж прямо говорить - ты зачем к жиквери в 2020 прилип? В наше время цветут вью, реакт и ангуляры всякие. Они гораздо мощнее, проще и выразительнее будут, чем либа с декораторами над ванилой.
Аналогия жиквери и чистого пхп даже ближе, чем ты думаешь.
ASP.NET MVC Framework с Entity Framework
>простым фреймам так противишься
Я просто ужаснулся увидев то как делают сайт на ларавеле, это просто бездушно, никакой ламповости, в общем после всего увиденного сложить ощущение что все просто хотят всё свалить друг на друга, фрот на бек, без на фронт, и в итоге этого перекладывания ответственности получается просто дерьмище, доходит просто до какаго-то маразма и уродования языкаи без того уродливого
Все эти вью, реакт и ангуляр как минимум просто противоречат и не дружат с SEO как минимум, вся твоя страница превращается просто в фейк, а весь сайт в одностраничник, где всю работу переложили на фронт и железо пользователя, грузя данные и верстая всё находу, в что-то мерзкое и лагучее
>не дружат с SEO как минимум
Как раз для этого есть специально придуманный сср спа приложений.
В остальном минусов нет, кроме большей сложности разработки, но это мало кого уже волнует.
>делают сайт на ларавеле
На фреймах писать можно вообще по разному. Хотя это не слишком очевидно из концепции, но так оно и есть. Я вот видел сайты на ларке, где в каждом эндпоинте die юзался и прочая мимофреймовая херня. Ну красота, чо. Зато на ларочке няшечке. И такого полно везде.
>Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с >зафиксированными значениями на кубиках слева.
Но в примере твоей функции, она получала на вход пустой массив
>Если ей переданы значения на всех N кубиках, то перебирать нечего - остается только вывести комбинацию.
Не совсем понял это.
>Если ей передан массив с меньше чем N значениями, кроме последнего,
Тоже не понял этого предложения , массив меньше с N значениями , это пустой массив ?. И что значит , кроме последнего
Почему функцию , которые ты описал работает с 2 значениями в массиве, мы же рассматриваем 3 кубика
>Попробуй написать такую функцию, или напиши, если что-то непонятно.
Ну вообщем , при моих оставшихся вопросах получилось как-то так https://ideone.com/JPEs7m , нормально ли ? Тут есть проблема , в том , что по завершении вызовов функции с массивом одного и двух значений при 3 кубиках, допустим:
generateCombinations(3, [1]) и generateCombinations(3, [1,1]), эти массивы тоже у меня бы выводились , если бы я не написал условие if (count($values) == $n) . Коментарии, которые с 21 по 33 строчку это я оставил для себя
>Есть еще другой способ вывести все комбинации без рекурсии.
Решил вот так https://ideone.com/AyUsGV , нормально ? Программа сама заканчивается по завершению циклу , но у меня возник вопрос, а если бы я захотел остановить цикл при значениях [5, 5, 5,] , при этом перебор остается осуществляться до [6,6,6], но я его как-бы останавливаю на других значениях , как лучше это было бы сделать, я в комментариях оставил свой вариант через array_filter и функцию stop , и просто с помощью цикла
Я подключаюсь к БД с помощью eloquent и capsule.
В пхп после выполнения скрипта соединение обрывается? Или каждый раз при обращению к базе создается подключение, которое если явно не закрыть - повисает?
Поясните пожалуйста за соединения с БД
И тут короче мне дают тестовое найдите ошибки в 27 строчках, а там ошибки типа ';' вместо ',' написано и прочее, для даунов на 15 минут. Сделал я его, пригласили на собес, иду весь трясусь нервничаю, захожу зажусь, а hr мне после пары вопросов про мою общительность и дальность от дома говорит: "ЭЭЭ, ну вообщем, приходи во вторник, зарплата 40к, официально. " И я просто охерел тогда, сидел не знал что сказать. Просто без собеса без ничего. Одно тестовое на 15 минут. А в других конторах ебали только так и не взяли.
Теперь получается моя жизнь спасена, я успешно вкатился, бабки не проблема, думаю теперь о будущем.
<фрейм>
<? некоторый кот ?>
</фрейм>
К примеру, там будут данные из БД и их надо время от времени проверять.
И сделаю кнопку для перезапроса инфы к коду внутри фрейма, то она будет обновлять данные в рамке, или все равно придется обновлять всю страницу?
Мне уже тут говорили за ajax, но у меня свой путь шиноби возник интерес именно к такому способу. Сработает ли?
п.с. рад за тебя. Сам некоторое время назад интереса ради откликнулся в одну конторуна реакт + нода. Сходил пообщался , дали тестовое,сделал как смог. В ответ на почту скинули что тестовое принято. И запланируют встречу с гендиром. Через пару недель пригласили, пообщался с их гендиром. Он приятное впечатление оставил. По итогу предложили месяц оплачиваемой стажировки, и если продолжим - то 70к зп. А я в основном на пхп пишу, и не пипец опытный. Да и на вакансию откликнулся потому что нода интересна, и я с ней немного пердолюсь. А так у меня и сейчас есть работа, которая оч уютная и хорошая.
Тестовое - что то типа фуллстак тудухи - морда реакт, бек на ноде.
А то что нужно ходить на собесы, делать тестовые , и подскакивать кабанчиком.
Что тот аноны если он не ты совершенно правильно и делал.
Я может тоже потом перекачусь во фронт/фуллстек. А то что-то php-шникам намного меньше платят.
Нет, регион, ближе к югам.
Скорее просто ниша для начинающих не самая денежная. Небольшие сайтописательские конторы.
php сеньеры получают в среднем на 20к меньше java и javascript синьоров
Поздравляю. Как-то так оно и случается.
Во фрейме у тебя находится отдельная страница.
Написал часть кода с шифрованием и использованием библиотеки openpgp.js. Приложение получилось нагруженным, и на дешифровку нескольких сообщений сразу (например при подхвате связки из 20 сообщений с бэкенда) уходит от 4 до 8 секунд. Это не очень userfriendly, и я принимаю решение создать секретные чаты, как в телеграме — только в них сообщения будут шифроваться, и они будут создаваться по запросу пользователя.
Изначально я хотел шифровать приватный ключ хэшом (SHA-512) от пароля и сохранять его в локальном хранилище под ключом shadow, и затем дешифровать им приватный ключ каждый раз при инициализации приложения, а ключ сохранять в памяти. Но выяснилось, что дешифрованый ключ переведённый в ASCII-armor имеет другую структуру/контент в отличие от зашифрованного. Поэтому, я принял решение шифровать ключ простым паролем и просто сохранить дешифрованный ключ в IndexedDB при залогинивании.
Код проверять не нужно, так как обо всех ошибках я, скорее всего, знаю, и я собираюсь отрефкторить фронтенд код. Но то что мне хотелось бы знать, и мы хотели оставить это на последнее, это оптимизация.
Я никогда с этим не сталкивался и это будет для меня совершенно новый опыт. Поэтому, я снова опишу схему БД, со всеми комментариями и мыслями, чтобы проще было сориентироваться.
User:
uuid,
email,
name,
hash,
private_key,
public_key,
revocation_certificate,
last_seen
// Нужно добавить ещё urlname, которое будет уникальным идентификатором пользователя по URL запросу (прим. @alice).
// Может быть ещё нужно добавить поле online: BOOLEAN
Conference:
uuid,
updated, // время когда конференция последний раз обновилась (появилось новое сообщение)
// Нужно добавить поле type: ENUM('private', 'public', 'secret')
// Нужно добавить поле last_message, чтобы в интерфейсе можно было вывести его, а так же чтобы можно было отсортировать их по последнему сообщению, а не по колонке update. Колонку update можно будет удалить.
// Содержит в себе ссылки на конференции для каждого пользователя.
// Она нужна чтобы у каждого пользователя была своя "копия" конференции. Или можно сказать своё представление конференции, т.к. она содержит специфичную для каждого пользователя информацию (такую как количество непрочитанных сообщений или количество сообщений в общем конкретно для этого пользователя)
// Изначально идея создания этой таблицы была, то что пользователь может удалить отдельно для себя эту конференцию, а у его собеседника она останется. (В популярных мессенджерах это так и работает — можно удалить конференцию либо только для себя, либо и для собеседника тоже, т.е. конференция и все сообщения в ней удаляться вообще.)
Conference_Reference:
uuid,
user,
conference,
participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым. Нужна чтобы получить конференцию по собеседнику за 1 запрос и является денормализацией (см. ниже таблицу Participants)
unread // Количество непрочитанных сообщений у данного пользователя
count // Количество сообщений в общем для данного пользователя. (Ведь сообщения, так же как и конференции, можно удалять как и только для себя, так и вообще)
// Таблица всех получателей для определённой конференции. Изначально создавалась для публичных конференций где количество получателей больше 2-ух, а для приватных, она осталась как представление конференции из всего лишь 2-ух собеседников. Для приватных конференций можно опустить.
Participant:
uuid,
conference,
user
Message:
uuid,
author,
readed
date,
type: ENUM('text/plain', 'audio/ogg', 'video/mp4') // Либо текстовое, либо голосовое, либо видео сообщение
content: TEXT // Содержит либо простой текст для текстового сообщения, либо URL на медиа-файл для голосового/видео сообщения
consumed: BOOLEAN // Определяет было ли прослушано/просмотрено аудио/видео сообщение
edited: BOOLEAN // Было ли отредактировано сообщение
readed_at: TIMESTAMP WITH TIMEZONE // Определяет когда сообщение было прочитано и нужно чтобы получить все прочитанные сообщения в момент когда клиент был в офлайне, чтобы обновить их локальном хранилище
// Нужно добавить поле edited_at
// Тоже самое что Conference_Reference (т.е. имеет ту же идею под собой)
Message_Reference:
uuid,
conference, // Нужно перенести в таблицу Message
user,
message
Message_Attachment:
uuid,
type: ENUM('image', 'audio', 'video', 'file', 'forwarding', 'reply'), // Либо изображение, аудио, видео, файл, пересылка сообщения, либо ответ на сообщение
message,
src // Содержит либо URL на файл для изображений/аудио/видео/файлов, либо uuid сообщения для пересылки/ответа
Какие запросы нужно выполнить:
1. Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
SELECT
conference.uuid,
conference.updated
conference_reference.unread,
conference_reference.count,
participant.uuid AS participant_uuid,
participant.name AS participant_name,
participant.urlname AS participant_urlname,
participant.public_key AS participant_public_key,
participant.last_seen AS participant_last_seen,
m.uuid AS last_message_uuid,
m.author AS last_message_author,
m.readed AS last_message_readed,
m.date AS last_message_date,
m.type AS last_message_type,
m.content AS last_message_content,
m.consumed AS last_message_consumed,
m.edited AS last_message_edited,
m.readed_at AS last_message_readed_at,
m.updated_at AS last_message_updated_at,
ps.uuid AS participants_uuid,
ps.name AS participants_name,
ps.urlname AS participants_urlname,
ps_public_key AS participants_public_key
ps.last_seen AS participants_last_seen
FROM conference
INNER JOIN conference_reference ON conference.uuid = conference_reference.conference
INNER JOIN user AS participant ON conference_reference.participant = participant.uuid
INNER JOIN message AS m ON conference.last_message = m.uuid
INNER JOIN participant AS pu ON pu.conference = conference.uuid
INNER JOIN user AS ps ON pu.user = ps.uuid
WHERE conference_reference.user = :uuid
ORDER BY conference.updated DESC;
Такой запрос вернёт количество строк равный количеству Конференций помноженных на количество Получателей. pic-1. Как сделать лимит на первые 20 конференций, а не на первые 20 строк (при условии что используется Doctrine)?
2. Получить Конференцию по Получателю, вместе с получателем.
Примерно такой же запрос, только выборка будет WHERE conference_reference.participant = :uuid.
3. Получить последнее 20 Сообщений для определённой конференции для конкретного пользователя, вместе с конференцией и автором.
Doctrine и DQL конечно же упрощают написание таких больших запросов как я написал выше, поэтому я напишу его:
SELECT m
FROM Crypter\Entity\Message m
INNER JOIN Crypter\Entity\MessageReference mr WITH m.uuid = mr.message
WHERE m.conference = :conference AND mr.user = :user
ORDER BY m.date DESC
4. Получить первые 20 непрочитанных Сообщений для определённой конференции для конкретного пользователя, вместе с конференцией и автором.
Примерно такой же запрос, только выборка будет помимо прочего ещё и по полю readed и author:
...AND m.readed = FALSE AND m.author != :user.
5. Получить первые 20 Сообщений начиная с данного таймстампа (получить новые сообщения), для определённой конференции для конкретного пользователя вместе с конференцией и автором
Примерно такой же запрос как и в 3-ем запросе только добавляется ещё и выборка по дате: ...AND m.date > :date
6. Получить последние 20 Сообщений начиная с данного таймстампа (получить старые сообщения)... -//-
Такой же запрос только наоборот: AND m.date < :date
7. Получить все прочитанные Сообщения с определённого момента.
Такой запрос нужно чтобы обновить локально сохранённые сообщения (в IndexedDB), которые были прочитаны пока клиент был в офлайне.
SELECT m
FROM Crypter\Entity\Message m
JOIN Crypter\Entity\MessageReference mr WITH m.uuid = mr.message
WHERE mr.user = :user AND readedAt > :date
ORDER BY m.date DESC
Думаю, что нормализованная структура определена и осталось её оптимизировать. Пожалуйста, научите меня этому.
Написал часть кода с шифрованием и использованием библиотеки openpgp.js. Приложение получилось нагруженным, и на дешифровку нескольких сообщений сразу (например при подхвате связки из 20 сообщений с бэкенда) уходит от 4 до 8 секунд. Это не очень userfriendly, и я принимаю решение создать секретные чаты, как в телеграме — только в них сообщения будут шифроваться, и они будут создаваться по запросу пользователя.
Изначально я хотел шифровать приватный ключ хэшом (SHA-512) от пароля и сохранять его в локальном хранилище под ключом shadow, и затем дешифровать им приватный ключ каждый раз при инициализации приложения, а ключ сохранять в памяти. Но выяснилось, что дешифрованый ключ переведённый в ASCII-armor имеет другую структуру/контент в отличие от зашифрованного. Поэтому, я принял решение шифровать ключ простым паролем и просто сохранить дешифрованный ключ в IndexedDB при залогинивании.
Код проверять не нужно, так как обо всех ошибках я, скорее всего, знаю, и я собираюсь отрефкторить фронтенд код. Но то что мне хотелось бы знать, и мы хотели оставить это на последнее, это оптимизация.
Я никогда с этим не сталкивался и это будет для меня совершенно новый опыт. Поэтому, я снова опишу схему БД, со всеми комментариями и мыслями, чтобы проще было сориентироваться.
User:
uuid,
email,
name,
hash,
private_key,
public_key,
revocation_certificate,
last_seen
// Нужно добавить ещё urlname, которое будет уникальным идентификатором пользователя по URL запросу (прим. @alice).
// Может быть ещё нужно добавить поле online: BOOLEAN
Conference:
uuid,
updated, // время когда конференция последний раз обновилась (появилось новое сообщение)
// Нужно добавить поле type: ENUM('private', 'public', 'secret')
// Нужно добавить поле last_message, чтобы в интерфейсе можно было вывести его, а так же чтобы можно было отсортировать их по последнему сообщению, а не по колонке update. Колонку update можно будет удалить.
// Содержит в себе ссылки на конференции для каждого пользователя.
// Она нужна чтобы у каждого пользователя была своя "копия" конференции. Или можно сказать своё представление конференции, т.к. она содержит специфичную для каждого пользователя информацию (такую как количество непрочитанных сообщений или количество сообщений в общем конкретно для этого пользователя)
// Изначально идея создания этой таблицы была, то что пользователь может удалить отдельно для себя эту конференцию, а у его собеседника она останется. (В популярных мессенджерах это так и работает — можно удалить конференцию либо только для себя, либо и для собеседника тоже, т.е. конференция и все сообщения в ней удаляться вообще.)
Conference_Reference:
uuid,
user,
conference,
participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым. Нужна чтобы получить конференцию по собеседнику за 1 запрос и является денормализацией (см. ниже таблицу Participants)
unread // Количество непрочитанных сообщений у данного пользователя
count // Количество сообщений в общем для данного пользователя. (Ведь сообщения, так же как и конференции, можно удалять как и только для себя, так и вообще)
// Таблица всех получателей для определённой конференции. Изначально создавалась для публичных конференций где количество получателей больше 2-ух, а для приватных, она осталась как представление конференции из всего лишь 2-ух собеседников. Для приватных конференций можно опустить.
Participant:
uuid,
conference,
user
Message:
uuid,
author,
readed
date,
type: ENUM('text/plain', 'audio/ogg', 'video/mp4') // Либо текстовое, либо голосовое, либо видео сообщение
content: TEXT // Содержит либо простой текст для текстового сообщения, либо URL на медиа-файл для голосового/видео сообщения
consumed: BOOLEAN // Определяет было ли прослушано/просмотрено аудио/видео сообщение
edited: BOOLEAN // Было ли отредактировано сообщение
readed_at: TIMESTAMP WITH TIMEZONE // Определяет когда сообщение было прочитано и нужно чтобы получить все прочитанные сообщения в момент когда клиент был в офлайне, чтобы обновить их локальном хранилище
// Нужно добавить поле edited_at
// Тоже самое что Conference_Reference (т.е. имеет ту же идею под собой)
Message_Reference:
uuid,
conference, // Нужно перенести в таблицу Message
user,
message
Message_Attachment:
uuid,
type: ENUM('image', 'audio', 'video', 'file', 'forwarding', 'reply'), // Либо изображение, аудио, видео, файл, пересылка сообщения, либо ответ на сообщение
message,
src // Содержит либо URL на файл для изображений/аудио/видео/файлов, либо uuid сообщения для пересылки/ответа
Какие запросы нужно выполнить:
1. Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
SELECT
conference.uuid,
conference.updated
conference_reference.unread,
conference_reference.count,
participant.uuid AS participant_uuid,
participant.name AS participant_name,
participant.urlname AS participant_urlname,
participant.public_key AS participant_public_key,
participant.last_seen AS participant_last_seen,
m.uuid AS last_message_uuid,
m.author AS last_message_author,
m.readed AS last_message_readed,
m.date AS last_message_date,
m.type AS last_message_type,
m.content AS last_message_content,
m.consumed AS last_message_consumed,
m.edited AS last_message_edited,
m.readed_at AS last_message_readed_at,
m.updated_at AS last_message_updated_at,
ps.uuid AS participants_uuid,
ps.name AS participants_name,
ps.urlname AS participants_urlname,
ps_public_key AS participants_public_key
ps.last_seen AS participants_last_seen
FROM conference
INNER JOIN conference_reference ON conference.uuid = conference_reference.conference
INNER JOIN user AS participant ON conference_reference.participant = participant.uuid
INNER JOIN message AS m ON conference.last_message = m.uuid
INNER JOIN participant AS pu ON pu.conference = conference.uuid
INNER JOIN user AS ps ON pu.user = ps.uuid
WHERE conference_reference.user = :uuid
ORDER BY conference.updated DESC;
Такой запрос вернёт количество строк равный количеству Конференций помноженных на количество Получателей. pic-1. Как сделать лимит на первые 20 конференций, а не на первые 20 строк (при условии что используется Doctrine)?
2. Получить Конференцию по Получателю, вместе с получателем.
Примерно такой же запрос, только выборка будет WHERE conference_reference.participant = :uuid.
3. Получить последнее 20 Сообщений для определённой конференции для конкретного пользователя, вместе с конференцией и автором.
Doctrine и DQL конечно же упрощают написание таких больших запросов как я написал выше, поэтому я напишу его:
SELECT m
FROM Crypter\Entity\Message m
INNER JOIN Crypter\Entity\MessageReference mr WITH m.uuid = mr.message
WHERE m.conference = :conference AND mr.user = :user
ORDER BY m.date DESC
4. Получить первые 20 непрочитанных Сообщений для определённой конференции для конкретного пользователя, вместе с конференцией и автором.
Примерно такой же запрос, только выборка будет помимо прочего ещё и по полю readed и author:
...AND m.readed = FALSE AND m.author != :user.
5. Получить первые 20 Сообщений начиная с данного таймстампа (получить новые сообщения), для определённой конференции для конкретного пользователя вместе с конференцией и автором
Примерно такой же запрос как и в 3-ем запросе только добавляется ещё и выборка по дате: ...AND m.date > :date
6. Получить последние 20 Сообщений начиная с данного таймстампа (получить старые сообщения)... -//-
Такой же запрос только наоборот: AND m.date < :date
7. Получить все прочитанные Сообщения с определённого момента.
Такой запрос нужно чтобы обновить локально сохранённые сообщения (в IndexedDB), которые были прочитаны пока клиент был в офлайне.
SELECT m
FROM Crypter\Entity\Message m
JOIN Crypter\Entity\MessageReference mr WITH m.uuid = mr.message
WHERE mr.user = :user AND readedAt > :date
ORDER BY m.date DESC
Думаю, что нормализованная структура определена и осталось её оптимизировать. Пожалуйста, научите меня этому.
Я вижу, появилась папка public. Это хорошо. Если это еще не сделано, то стоит сделать ее корневой папкой веб-сервера (чтобы DocumentRoot указывал на нее), чтобы из браузера в принципе нельзя было обращаться к файлам за ее пределами. Стоит также это упомянуть в README, можно даже вставить туда нужный кусочек конфига сервера. И перенести в папку файл htaccess.
> `studentLocal` enum('l','n') NOT NULL COMMENT 'l - local, n - not local
Можно было использовать строки local/nonlocal вместо букв ради читабельности. Они будут занимать в базе ровно столько же, так как ENUM хранит в таблице номер выбранного варианта, а не сам текст.
Для email, возможно, стоит добавить уникальный индекс в базе, чтобы нельзя было вставить одинаковый.
> studentName
Обычно не стоит добавлять в поле название таблицы. Вот, если что, SQL guide, где даются рекомендации по названиям: https://www.sqlstyle.guide/ru/
> ini_set('display_errors', 1);
Это лучше убрать, так как на продакшене требуется отключать вывод на экран. Лучше перенести настройку в php.ini или в конфиг веб-сервера.
> require_once(ROOT.'/app/components/Router.php');
> require_once(ROOT.'/app/components/autoload.php');
Логичнее сначала подключать autoload - вдруг он понадобится при подключении роутера.
> https://github.com/Vladrigos/StudentList/blob/master/app/components/autoload.php
здесь можно сделать одну функцию, которая будет в цикле перебирать варианты префиксов. Также, можно добавить эти пути в include_path и использовать встроенный в PHP автозагрузчик (spl_autoload).
> $uri = explode("?", $_SERVER["REQUEST_URI"])[0];
Можно просто с помощью parse_url взять компонент PHP_URL_PATH.
> //удаляем первый элемент массива и добавляем Controller
> $controllerName = array_shift($segments).'Controller';
Лучше сразу писать имя контроллера в routes.php, тогда можно будет переходить к нему по клику в IDE и искать роут поиском по имени класса. Не стоит писать в коде кусочки от имен классов/функций вместо полного имени. Так как в этом случае поиском по полному имени нельзя найти все места, где используется класс.
> 'main$'
Тут не должно быть ^main$ ?
> $isRegister = isset($_COOKIE['student']);
Стоит сделать отдельную функцию/метод для определения залогиненности, и собрать все, что связано с авторизацией, в один класс, а не размазывать эту логику кусочками по коду.
> StudentGateway::getStudents
> StudentGateway::getSearchStudents
Скорее всего, выборку с поиском и без поиска можно объединить в одну функцию. Ведь и там, и там понадобится сортировка и пагинация. Проще сделать поиск дополнительной опцией.
Также, стоит отказаться от статических вызовов и почитать урок про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md
> return 1;
Если это признак, что страница существует, то может, стоит сделать тут константу вроде PAGE_EXISTS или хотя бы использовать true (истина). Так как цифра 1 обозначает количество, и непонятно, чего тут одна штука.
> return $_GET['page'] * $this->limit
Стоит использовать intval() для принудительного преобразования в число. Неизвестно что может придти от пользователя.
> if(isset($_POST['submitInput']))
Можно проверять $_SERVER['REQUEST_METHOD'] https://www.php.net/manual/ru/reserved.variables.server.php
> $student = new Student($_POST['name'], $_POST['surName'],
Значения в $_POST могут отсутствовать или быть не строкой. Стоит писать хотя бы strval($_POST['x'] ?? '') или сделать функцию для их безопасного получения.
> Validator::formatStudent($student); //trim, firstToUpper имя/фамилию
Это, строго говоря, не задача валидатора. trim() удобнее делать в функции получения данных из _POST. Или можно сделать функцию-помощник, которая сделает нужные преобразования.
> //генерируем куки
> $cookie = md5(rand(0, 10000)) . md5(rand(0, 10000));
Это надо выносить в отдельную функцию с понятными названием, и комментарий не понадобится. Также, md5 тут бессмысленнен. У тебя возможны всего 10000 x 10000 вариантов значений, и md5 не увеличивает их количество, а лишь удлиняет код, но там все равно будет лишь 10000 вариантов. То есть ты только удлиняешь код, не повышая число вариантов. Для безопасности надо, чтобы каждый символ в коде выбирался случайно и независимо от других.
Также, в RegistrationController есть 2 больших куска почти одинакового кода, которые стоит объединить.
Для пола и local/nonlocal стоит сделать константы в Student, а не Validator. Это же свойства студента, а не особенности валидации. То есть, эти константы имеют смысл только для валидации, или они могут пригодиться и в других случаях? Да, могут. Значит, им место не в валидаторе.
> (int $limit, int $offset, $order = NULL, $as = NULL)
Тип стоит поставить для всех аргументов и для возвращаемого значения.
> $query = $query . "ORDER BY $order ";
Здесь SQL-инъекция. Почитай урок по ним и сделай проверку по белому списку разрешенных значений.
> //как то переделать что бы каунт получать
Как вариант, можно сделать аргумент, в который передается, что вернуть: либо RETURN_COUNT, либо RETURN_ROWS. Либо же использовать 2 отдельных функции.
> INSERT INTO student VALUES(DEFAULT,:name, :surname,
Надо явно указать названия полей после student, а то у тебя нет гарантии, что ты их вставляешь в правильном порядке.
> return new Student($stmt['studentName'], $stmt['studentSurname'],
...
> else
> {
> return 0;
> }
Есть значение null для обозначения отсутствующего объекта. А 0 - это число, оно обозначает количество.
> $stmt->fetch(PDO::FETCH_ASSOC)['COUNT()'];
Есть fetchColumn(), и другие функции, изучи.
> $db->query("UPDATE student SET studentName = '{$student->getName()}',
SQL инъекция тут.
> (':studentName' => $student->getName(),
> так почему то не работает
Надо разобраться, какая ошибка выводится и почему.
> catch (PDOException $e)
> print "ERROR: Нет соединения с базой данных";
Неправильная работа с исключениями. Ты не пишешь в лог ошибок информацию о сути проблемы, которая хранится в $e, и теряешь эту информацию. Разработчик и не узнает, что на сайте была проблема.
Также, для PDO надо включить режим ERRMODE_EXCEPTION, иначе он не сообщает об ошибках.
https://github.com/Vladrigos/StudentList/blob/master/app/components/Uri.php
Тут плохо то, что класс использует $_GET, он должен быть независим от этой переменной и получать параметры явно. А так, ты смешиваешь в кучу логику получения данных от пользователя и логику обработки этих данных. Это две независимых логики.
У тебя нет объекта и состояния. По идее, ты должен создавать объект, в нем хранятся данные и ты с этим объектом работаешь, так:
$uri = new Uri(.....данные....);
echo $uri->getPage();
Что-то у тебя пока слабовато с ООП, может тебе задачки про ООП-гостиницу или ООО Вектор надо порешать?
> public static function checkGetHave($key, $value)
Можно назвать hasElement/findElement.
> //очень похоже на костыль, не придумал как лучше
> //Если в массиве есть хоть 1 ошибка
> foreach($errors as $error)
Удали из массива пустые значения с помощью array_filter или цикла и проверь, пуст ли результирующий массив.
> return $errors;
> return 0;
Логичнее возвращать значения одного типа, например, пустой массив, так как проще работать, когда ты знаешь, что вернется только массив и ничего больше.
> if(strlen($name) > 25
Надо использовать mb_strlen, strlen считает байты, а не символы. Протестируй.
> return "Ошибка, поле содержит недопустимые символы!";
Нужно больше информации, например, какие символы допустимы или недопустимы. А то непонятно.
Также, ты должен сам протестировать все ограничения. То есть пройтись по каждому полю и попробовать вбить правильные и неправильные значения и убедиться, что все сообщения показываются правильно. Это немного муторно, но поможет тебе выдавать качественный результат, когда ты будешь работать. Никто не любит, когда программист сдает непротестированную работу. Это помогло бы обнаружить баг с strlen().
> https://github.com/Vladrigos/StudentList/blob/master/app/views/404.html
А ты выдаешь код статуса (состояния) HTTP 404 для этой страницы? Ведь число 404 важно не показать на экране (людям-то оно не нужно), а отдать роботам в нужном поле ответа.
> href="<?php Uri::setPageUri($i);?>
Здесь по идее тоже надо использовать htmlspecialchars, символ & например надо экранировать как & amp ; .
> ?php if($currentStudent && $currentStudent->getGender() == VALIDATOR::GENDER_FEMALE) { echo 'checked'; } ?>
Лучше использовать <?= и тернарный оператор. Не нужно использовать echo в шаблонах вообще.
> maxlength="25"
Здесь есть небольшой недостаток: длина поля (25) дублируется в нескольких местах кода, в валидаторе и тут. Хорошо бы это исправить.
Так, пока для начинающего неплохо, но надо исправить замечания, чтобы второй раз на те же грабли не наступать.
Я вижу, появилась папка public. Это хорошо. Если это еще не сделано, то стоит сделать ее корневой папкой веб-сервера (чтобы DocumentRoot указывал на нее), чтобы из браузера в принципе нельзя было обращаться к файлам за ее пределами. Стоит также это упомянуть в README, можно даже вставить туда нужный кусочек конфига сервера. И перенести в папку файл htaccess.
> `studentLocal` enum('l','n') NOT NULL COMMENT 'l - local, n - not local
Можно было использовать строки local/nonlocal вместо букв ради читабельности. Они будут занимать в базе ровно столько же, так как ENUM хранит в таблице номер выбранного варианта, а не сам текст.
Для email, возможно, стоит добавить уникальный индекс в базе, чтобы нельзя было вставить одинаковый.
> studentName
Обычно не стоит добавлять в поле название таблицы. Вот, если что, SQL guide, где даются рекомендации по названиям: https://www.sqlstyle.guide/ru/
> ini_set('display_errors', 1);
Это лучше убрать, так как на продакшене требуется отключать вывод на экран. Лучше перенести настройку в php.ini или в конфиг веб-сервера.
> require_once(ROOT.'/app/components/Router.php');
> require_once(ROOT.'/app/components/autoload.php');
Логичнее сначала подключать autoload - вдруг он понадобится при подключении роутера.
> https://github.com/Vladrigos/StudentList/blob/master/app/components/autoload.php
здесь можно сделать одну функцию, которая будет в цикле перебирать варианты префиксов. Также, можно добавить эти пути в include_path и использовать встроенный в PHP автозагрузчик (spl_autoload).
> $uri = explode("?", $_SERVER["REQUEST_URI"])[0];
Можно просто с помощью parse_url взять компонент PHP_URL_PATH.
> //удаляем первый элемент массива и добавляем Controller
> $controllerName = array_shift($segments).'Controller';
Лучше сразу писать имя контроллера в routes.php, тогда можно будет переходить к нему по клику в IDE и искать роут поиском по имени класса. Не стоит писать в коде кусочки от имен классов/функций вместо полного имени. Так как в этом случае поиском по полному имени нельзя найти все места, где используется класс.
> 'main$'
Тут не должно быть ^main$ ?
> $isRegister = isset($_COOKIE['student']);
Стоит сделать отдельную функцию/метод для определения залогиненности, и собрать все, что связано с авторизацией, в один класс, а не размазывать эту логику кусочками по коду.
> StudentGateway::getStudents
> StudentGateway::getSearchStudents
Скорее всего, выборку с поиском и без поиска можно объединить в одну функцию. Ведь и там, и там понадобится сортировка и пагинация. Проще сделать поиск дополнительной опцией.
Также, стоит отказаться от статических вызовов и почитать урок про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md
> return 1;
Если это признак, что страница существует, то может, стоит сделать тут константу вроде PAGE_EXISTS или хотя бы использовать true (истина). Так как цифра 1 обозначает количество, и непонятно, чего тут одна штука.
> return $_GET['page'] * $this->limit
Стоит использовать intval() для принудительного преобразования в число. Неизвестно что может придти от пользователя.
> if(isset($_POST['submitInput']))
Можно проверять $_SERVER['REQUEST_METHOD'] https://www.php.net/manual/ru/reserved.variables.server.php
> $student = new Student($_POST['name'], $_POST['surName'],
Значения в $_POST могут отсутствовать или быть не строкой. Стоит писать хотя бы strval($_POST['x'] ?? '') или сделать функцию для их безопасного получения.
> Validator::formatStudent($student); //trim, firstToUpper имя/фамилию
Это, строго говоря, не задача валидатора. trim() удобнее делать в функции получения данных из _POST. Или можно сделать функцию-помощник, которая сделает нужные преобразования.
> //генерируем куки
> $cookie = md5(rand(0, 10000)) . md5(rand(0, 10000));
Это надо выносить в отдельную функцию с понятными названием, и комментарий не понадобится. Также, md5 тут бессмысленнен. У тебя возможны всего 10000 x 10000 вариантов значений, и md5 не увеличивает их количество, а лишь удлиняет код, но там все равно будет лишь 10000 вариантов. То есть ты только удлиняешь код, не повышая число вариантов. Для безопасности надо, чтобы каждый символ в коде выбирался случайно и независимо от других.
Также, в RegistrationController есть 2 больших куска почти одинакового кода, которые стоит объединить.
Для пола и local/nonlocal стоит сделать константы в Student, а не Validator. Это же свойства студента, а не особенности валидации. То есть, эти константы имеют смысл только для валидации, или они могут пригодиться и в других случаях? Да, могут. Значит, им место не в валидаторе.
> (int $limit, int $offset, $order = NULL, $as = NULL)
Тип стоит поставить для всех аргументов и для возвращаемого значения.
> $query = $query . "ORDER BY $order ";
Здесь SQL-инъекция. Почитай урок по ним и сделай проверку по белому списку разрешенных значений.
> //как то переделать что бы каунт получать
Как вариант, можно сделать аргумент, в который передается, что вернуть: либо RETURN_COUNT, либо RETURN_ROWS. Либо же использовать 2 отдельных функции.
> INSERT INTO student VALUES(DEFAULT,:name, :surname,
Надо явно указать названия полей после student, а то у тебя нет гарантии, что ты их вставляешь в правильном порядке.
> return new Student($stmt['studentName'], $stmt['studentSurname'],
...
> else
> {
> return 0;
> }
Есть значение null для обозначения отсутствующего объекта. А 0 - это число, оно обозначает количество.
> $stmt->fetch(PDO::FETCH_ASSOC)['COUNT()'];
Есть fetchColumn(), и другие функции, изучи.
> $db->query("UPDATE student SET studentName = '{$student->getName()}',
SQL инъекция тут.
> (':studentName' => $student->getName(),
> так почему то не работает
Надо разобраться, какая ошибка выводится и почему.
> catch (PDOException $e)
> print "ERROR: Нет соединения с базой данных";
Неправильная работа с исключениями. Ты не пишешь в лог ошибок информацию о сути проблемы, которая хранится в $e, и теряешь эту информацию. Разработчик и не узнает, что на сайте была проблема.
Также, для PDO надо включить режим ERRMODE_EXCEPTION, иначе он не сообщает об ошибках.
https://github.com/Vladrigos/StudentList/blob/master/app/components/Uri.php
Тут плохо то, что класс использует $_GET, он должен быть независим от этой переменной и получать параметры явно. А так, ты смешиваешь в кучу логику получения данных от пользователя и логику обработки этих данных. Это две независимых логики.
У тебя нет объекта и состояния. По идее, ты должен создавать объект, в нем хранятся данные и ты с этим объектом работаешь, так:
$uri = new Uri(.....данные....);
echo $uri->getPage();
Что-то у тебя пока слабовато с ООП, может тебе задачки про ООП-гостиницу или ООО Вектор надо порешать?
> public static function checkGetHave($key, $value)
Можно назвать hasElement/findElement.
> //очень похоже на костыль, не придумал как лучше
> //Если в массиве есть хоть 1 ошибка
> foreach($errors as $error)
Удали из массива пустые значения с помощью array_filter или цикла и проверь, пуст ли результирующий массив.
> return $errors;
> return 0;
Логичнее возвращать значения одного типа, например, пустой массив, так как проще работать, когда ты знаешь, что вернется только массив и ничего больше.
> if(strlen($name) > 25
Надо использовать mb_strlen, strlen считает байты, а не символы. Протестируй.
> return "Ошибка, поле содержит недопустимые символы!";
Нужно больше информации, например, какие символы допустимы или недопустимы. А то непонятно.
Также, ты должен сам протестировать все ограничения. То есть пройтись по каждому полю и попробовать вбить правильные и неправильные значения и убедиться, что все сообщения показываются правильно. Это немного муторно, но поможет тебе выдавать качественный результат, когда ты будешь работать. Никто не любит, когда программист сдает непротестированную работу. Это помогло бы обнаружить баг с strlen().
> https://github.com/Vladrigos/StudentList/blob/master/app/views/404.html
А ты выдаешь код статуса (состояния) HTTP 404 для этой страницы? Ведь число 404 важно не показать на экране (людям-то оно не нужно), а отдать роботам в нужном поле ответа.
> href="<?php Uri::setPageUri($i);?>
Здесь по идее тоже надо использовать htmlspecialchars, символ & например надо экранировать как & amp ; .
> ?php if($currentStudent && $currentStudent->getGender() == VALIDATOR::GENDER_FEMALE) { echo 'checked'; } ?>
Лучше использовать <?= и тернарный оператор. Не нужно использовать echo в шаблонах вообще.
> maxlength="25"
Здесь есть небольшой недостаток: длина поля (25) дублируется в нескольких местах кода, в валидаторе и тут. Хорошо бы это исправить.
Так, пока для начинающего неплохо, но надо исправить замечания, чтобы второй раз на те же грабли не наступать.
Фрейм это как отдельная вкладка и он может загружаться независимо от основной страницы.
>>611731
Да. Все соединения закрываются, открытые файлы закрываются при завершении скрипта автоматически.
Обрати внимание, что во многих БД вроде MySQL/MariaDB, долгий запрос не завершается при отсоединении. Если ты запустишь запрос, который выполняется 24 часа, он продолжит выполняться, хотя ответ на него отдавать уже некуда. Используй настройку таймаута в БД для борьбы с этим.
>>611704
>>Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с >зафиксированными значениями на кубиках слева.
> Но в примере твоей функции, она получала на вход пустой массив
Это значит, что пока ни одно значение не зафиксировано и все кубики надо перебирать.
>>Если ей переданы значения на всех N кубиках, то перебирать нечего - остается только вывести комбинацию.
> Не совсем понял это.
Если у нас 3 кубика, а в функцию пришел массив [1, 4, 2] то перебирать ничего не надо - надо просто вывести комбинацию 1, 4, 2 так как все значения на 3 кубиках зафиксированы. А если бы пришло [1, 4] то это значит что на первых 2 кубиках значения зафиксированы (1 и 4), а третий нам надо перебирать. А если пришло [] то надо перебирать значения всех трех кубиков.
Функция перебирает значения за раз только на одном кубике. И вызвыает себя для перебора остальных значений. Допустим, у нас 3 кубика и пришел массив [1] (зафиксированное значение для первого кубика). Тогда функция перебирает значения второго кубика, фиксирует их, вызывая саму себя с такими массивами:
- [1, 1]
- [1, 2]
- [1, 3]
...
- [1, 6]
> Ну вообщем , при моих оставшихся вопросах получилось как-то так https://ideone.com/JPEs7m , нормально ли ?
Ты правильно сделал функцию. Как раз, как я описал. Только один цикл тут лишний:
> for ($z = 0; $z < $n; $z++) {
> if (count($values) == $z) {
Если присмотреться, то понятно, что этот if срабатывает только один раз, а переменная $z нигде не используется и цикл по $z ничего не делает, и его можно убрать. Цикл - это повторение несколько раз, у тебя же код внутри if выполняется всегда ровно один раз и цикл не нужен.
> Тут есть проблема , в том , что по завершении вызовов функции с массивом одного и двух значений при 3 кубиках, допустим: generateCombinations(3, [1]) и generateCombinations(3, [1,1]), эти массивы тоже у меня бы выводились
Ты правильно добавил условие, мы выводим комбинацию только если у нас есть значения на всех кубиках, а не на части из них. Если на части - то мы перебираем значения на оставшихся, рекурсивно вызывая сами себя.
Мне, наверно, стоит найти время и сделать урок про рекурсию. Я и сам-то плохо читаю рекурсивные функции, а начинающему это вообще ад.
> Решил вот так https://ideone.com/AyUsGV , нормально ?
Да.
> у меня возник вопрос, а если бы я захотел остановить цикл при значениях [5, 5, 5,] , при этом перебор остается осуществляться до [6,6,6], но я его как-бы останавливаю на других значениях , как лучше это было бы сделать,
Проще всего сравнением массива, то есть if ($combination === [5, 5, 5]) (мануал https://www.php.net/manual/ru/language.operators.array.php ). Или if ($combination[0] >= 5 && $combination[1] >= 5 ....).
Если ты смог генерировать комбинации кубиков, то ты можешь попробовать теперь сделать функцию-генератор, выдающую комбинации кубиков, а затем и купюр, с помощью yield. Погугли "генераторы в PHP". Можно и без генераторов, но тогда ты будешь писать все в одной огромной запутанной функции, а так у тебя одна функция будет генерировать комбинации купюр, а другая их проверять - код будет чище.
После этого стоит добавить оптимизацию: перебирать число купюр не подряд от 0 до максимума, а с умом:
- не перебирать число, которое заведомо превышает требуемую сумму. Например, если надо выдать 2300, то нет смысла пробовать комбинации вида 5x500, 6x500 итд (и перебирать комбинации более мелких купюр при 5x500 тоже нет смысла). Или, если мы уже зафиксировали комбинацию 4x500 и перебираем 100-е купюры, то не брать более 3-х купюр.
То есть, мы берем требуемую сумму, вычитаем из нее сумму, которую дают "зафиксированные" старшие купюры, и используем остаток для ограничения максимального числа перебираемых купюр.
- начинать перебор с ближайшего к сумме значения. Например, если нам надо выдать 2400, то мы начинаем с 4x500, потом пробуем 3x500, 2x500 .. 0x500. В таком случае, первая полученная комбинация будет соответствовать тому, что дает "жадный" алгоритм. А если она не подошла, то мы начинаем менять количества купюр и пробовать другие варианты.
Фрейм это как отдельная вкладка и он может загружаться независимо от основной страницы.
>>611731
Да. Все соединения закрываются, открытые файлы закрываются при завершении скрипта автоматически.
Обрати внимание, что во многих БД вроде MySQL/MariaDB, долгий запрос не завершается при отсоединении. Если ты запустишь запрос, который выполняется 24 часа, он продолжит выполняться, хотя ответ на него отдавать уже некуда. Используй настройку таймаута в БД для борьбы с этим.
>>611704
>>Если попробовать обобщить это, то можно придумать такую функцию: пусть она получает на вход массив с >зафиксированными значениями на кубиках слева.
> Но в примере твоей функции, она получала на вход пустой массив
Это значит, что пока ни одно значение не зафиксировано и все кубики надо перебирать.
>>Если ей переданы значения на всех N кубиках, то перебирать нечего - остается только вывести комбинацию.
> Не совсем понял это.
Если у нас 3 кубика, а в функцию пришел массив [1, 4, 2] то перебирать ничего не надо - надо просто вывести комбинацию 1, 4, 2 так как все значения на 3 кубиках зафиксированы. А если бы пришло [1, 4] то это значит что на первых 2 кубиках значения зафиксированы (1 и 4), а третий нам надо перебирать. А если пришло [] то надо перебирать значения всех трех кубиков.
Функция перебирает значения за раз только на одном кубике. И вызвыает себя для перебора остальных значений. Допустим, у нас 3 кубика и пришел массив [1] (зафиксированное значение для первого кубика). Тогда функция перебирает значения второго кубика, фиксирует их, вызывая саму себя с такими массивами:
- [1, 1]
- [1, 2]
- [1, 3]
...
- [1, 6]
> Ну вообщем , при моих оставшихся вопросах получилось как-то так https://ideone.com/JPEs7m , нормально ли ?
Ты правильно сделал функцию. Как раз, как я описал. Только один цикл тут лишний:
> for ($z = 0; $z < $n; $z++) {
> if (count($values) == $z) {
Если присмотреться, то понятно, что этот if срабатывает только один раз, а переменная $z нигде не используется и цикл по $z ничего не делает, и его можно убрать. Цикл - это повторение несколько раз, у тебя же код внутри if выполняется всегда ровно один раз и цикл не нужен.
> Тут есть проблема , в том , что по завершении вызовов функции с массивом одного и двух значений при 3 кубиках, допустим: generateCombinations(3, [1]) и generateCombinations(3, [1,1]), эти массивы тоже у меня бы выводились
Ты правильно добавил условие, мы выводим комбинацию только если у нас есть значения на всех кубиках, а не на части из них. Если на части - то мы перебираем значения на оставшихся, рекурсивно вызывая сами себя.
Мне, наверно, стоит найти время и сделать урок про рекурсию. Я и сам-то плохо читаю рекурсивные функции, а начинающему это вообще ад.
> Решил вот так https://ideone.com/AyUsGV , нормально ?
Да.
> у меня возник вопрос, а если бы я захотел остановить цикл при значениях [5, 5, 5,] , при этом перебор остается осуществляться до [6,6,6], но я его как-бы останавливаю на других значениях , как лучше это было бы сделать,
Проще всего сравнением массива, то есть if ($combination === [5, 5, 5]) (мануал https://www.php.net/manual/ru/language.operators.array.php ). Или if ($combination[0] >= 5 && $combination[1] >= 5 ....).
Если ты смог генерировать комбинации кубиков, то ты можешь попробовать теперь сделать функцию-генератор, выдающую комбинации кубиков, а затем и купюр, с помощью yield. Погугли "генераторы в PHP". Можно и без генераторов, но тогда ты будешь писать все в одной огромной запутанной функции, а так у тебя одна функция будет генерировать комбинации купюр, а другая их проверять - код будет чище.
После этого стоит добавить оптимизацию: перебирать число купюр не подряд от 0 до максимума, а с умом:
- не перебирать число, которое заведомо превышает требуемую сумму. Например, если надо выдать 2300, то нет смысла пробовать комбинации вида 5x500, 6x500 итд (и перебирать комбинации более мелких купюр при 5x500 тоже нет смысла). Или, если мы уже зафиксировали комбинацию 4x500 и перебираем 100-е купюры, то не брать более 3-х купюр.
То есть, мы берем требуемую сумму, вычитаем из нее сумму, которую дают "зафиксированные" старшие купюры, и используем остаток для ограничения максимального числа перебираемых купюр.
- начинать перебор с ближайшего к сумме значения. Например, если нам надо выдать 2400, то мы начинаем с 4x500, потом пробуем 3x500, 2x500 .. 0x500. В таком случае, первая полученная комбинация будет соответствовать тому, что дает "жадный" алгоритм. А если она не подошла, то мы начинаем менять количества купюр и пробовать другие варианты.
Не нравятся большие фреймворки - используй микрофреймворки вроде Slim или собери свой фреймворк из компонентов Симфони.
>>610930
Ну так попробуй извлечь из этого опыта что-то полезное. Например, подучи деревья и добейся того, чтобы без запинки писать любой популярный алгоритм для них. Тогда это собеседование будет не потерянным временем, а еще одним шагом вверх.
>>610524
Есть codeforces от Дурова: https://codeforces.com/blog/entry/79
Можно решать на PHP и даже соревноваться с другими. Задачи от примитивнейших до мозголомных. Как тебе?
Для мессенджера советую в README добавить скриншоты/гифки, описание основных фич (что тут есть сложного и крутого), будет хорошее демо для собеседований. Перечислить использованные технологии и библиотеки. И подключенных ботов. README сухой и краткий и не очевидно, что за ним сложный интересный проект. А может получиться хорошая реклама твоих навыков, которая выделяет тебя среди других разработчиков.
> Приложение получилось нагруженным, и на дешифровку нескольких сообщений сразу (например при подхвате связки из 20 сообщений с бэкенда) уходит от 4 до 8 секунд.
Это можно пофиксить на уровне UI:
- показываем сначала блоки-плейсхолдеры вместо сообщений
- по мере расшифровки заменяем их на текст. Создается ощущение, что все надежно зашифровано и ничего не тормозит.
- в первую очередь расшифровываем сообщения, видимые на экране, снизу вверх. Не расшифровываем то, что далеко от видимой области.
- можно кешировать в оперативной памяти последние N (например, 5000) расшифрованных сообщений для быстрого показа, когда пользователь переключается между несколькими контактами
Наконец, можно рассмотреть вариант переписать/подключить декодер на WebAssembly (заодно освоишь эту технологию), или asm.js (фаерфоксовая старая версия для выполнения машинного кода). NaCl не буду рекомендовать, так как он x86-only. Должно ускориться.
Имхо, компромисс, выбранный Телеграм - неудачный. Шифровать надо 100% сообщений. Но, конечно, это тебе решать.
> Нужно добавить ещё urlname
Это можно назвать login или slug.
> Может быть ещё нужно добавить поле online: BOOLEAN
А можно сделать отдельную таблицу online_users (uuid, last_seen). Плюс: при обновлении статуса пользователя (пришел/ушел) мы не трогаем тяжелую таблицу users, а только эту. Она будет меньше users, так как обычно онлайн только часть пользователей и так как тут мало колонок. Кто знает, может она целиком в RAM поместится. Просто даю как идею, не гарантирую, что это будет лучше.
> updated, // время когда конференция последний раз обновилась (появилось новое сообщение)
Может, last_event_time? Хотя, updated тоже норм.
> participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым.
Не лучше ли назвать partner/other_party?
> date,
Может, лучше писать send_time?
И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
> 1. Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть
5 джойнов выглядит чуть страшновато. Это, наверно, кандидат на кеширование, хотя без нагрузочного теста я не скажу, быстро или медленно оно будет работать.
> Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
Не очень понятно, зачем тут выбирать Получателей? Мы же выбираем только сообщения, адресованные данному пользователю? Я предполагаю, что если пользователь - участник конференции, то все сообщения в ней (не написанные им) адресованы ему. Или это на случай, если пользователь состоит в чате, но как-то забанен в нем? На случай игнора отправителя?
> Такой запрос вернёт количество строк равный количеству Конференций помноженных на количество Получателей. pic-1. Как сделать лимит на первые 20 конференций, а не на первые 20 строк (при условии что используется Doctrine)?
По моему, в Доктрине это есть. Там LIMIT применяется к основной сущности запроса, но это делается за счет оборачивания запроса в какую-то сложную конструкцию. Попробуй проверить, вроде:
$qb->select('a', 'b')->from('a')->leftJoin('a.b', 'b')->setMaxResults(10);
И посмотреть, какой запрос он сформирует. Это по идее должно вернуть 10 сущностей a независимо от числа приджойненных b.
Так, по идее - группировка нужна, наверно. Либо выборка в 2 запроса: сначала список конференций, потом список последних сообщений в них.
Увы, Доктрина - не самый быстрый способ делать запросы.
> Думаю, что нормализованная структура определена и осталось её оптимизировать. Пожалуйста, научите меня этому.
- нужно освоить команду EXPLAIN и прочитать мануал по тому, как понимать ее результаты (слова для поиска: postgres analyze query plan)
- прогнать запросы через эту команду и понять, эффективно они работают или нет (я смогу подсказать что-то). В идеале мы хотим: выборка из одной таблицы с LIMIT по индексу, который оптимизирует WHERE и ORDER.
- для тестирования было бы здорово сделать генератор, который нагенерирует произвольное число пользователей, конференций, сообщений. По ним прогонять запросы по одному и параллельно для измерения реальной производительности. Для Доктрины такой генератор делается, например, на основе Faker и https://github.com/thephpleague/factory-muffin. Хорошо оптимизированный запрос выполняется тысячами в секунду.
На тестах может выясниться что-то интересное, например, могут всплыть какие-то блокировки, мешающие параллельному выполнению запросов. Так их предсказать трудно, я не смогу.
- БД работает хорошо только пока индексы помещаются в память. Размер индексов можно как-то увидеть, не помню как. А если таблица помещается в память - то вообще все чудесно. Хайлоад обычно предполагает, что все влезает в память, кроме может быть редко используемых данных. Помещаются данные в память или нет - очень важный фактор, влияющий на производительность.
- скорее всего, может понадобиться больше денормализации. Денормализовать удобнее всего то, что никогда не меняется (вроде uuid получателя сообщения). Так как иначе надо будет думать об обновлении денормализованных полей.
- может понадобиться кеширование, если денормализация и индексы не помогут. Смотри на это как на последнюю надежду, так как при кешировании появляется проблема сброса/обновления кеша и она очень сложна.
- возможно, вместо запросов с джойнами быстрее будет сделать несколько отдельных запросов.
Индексы для начинающих: https://ruhighload.com/Индексы+в+mysql
Если есть конкретные вопросы, уточняй.
Для мессенджера советую в README добавить скриншоты/гифки, описание основных фич (что тут есть сложного и крутого), будет хорошее демо для собеседований. Перечислить использованные технологии и библиотеки. И подключенных ботов. README сухой и краткий и не очевидно, что за ним сложный интересный проект. А может получиться хорошая реклама твоих навыков, которая выделяет тебя среди других разработчиков.
> Приложение получилось нагруженным, и на дешифровку нескольких сообщений сразу (например при подхвате связки из 20 сообщений с бэкенда) уходит от 4 до 8 секунд.
Это можно пофиксить на уровне UI:
- показываем сначала блоки-плейсхолдеры вместо сообщений
- по мере расшифровки заменяем их на текст. Создается ощущение, что все надежно зашифровано и ничего не тормозит.
- в первую очередь расшифровываем сообщения, видимые на экране, снизу вверх. Не расшифровываем то, что далеко от видимой области.
- можно кешировать в оперативной памяти последние N (например, 5000) расшифрованных сообщений для быстрого показа, когда пользователь переключается между несколькими контактами
Наконец, можно рассмотреть вариант переписать/подключить декодер на WebAssembly (заодно освоишь эту технологию), или asm.js (фаерфоксовая старая версия для выполнения машинного кода). NaCl не буду рекомендовать, так как он x86-only. Должно ускориться.
Имхо, компромисс, выбранный Телеграм - неудачный. Шифровать надо 100% сообщений. Но, конечно, это тебе решать.
> Нужно добавить ещё urlname
Это можно назвать login или slug.
> Может быть ещё нужно добавить поле online: BOOLEAN
А можно сделать отдельную таблицу online_users (uuid, last_seen). Плюс: при обновлении статуса пользователя (пришел/ушел) мы не трогаем тяжелую таблицу users, а только эту. Она будет меньше users, так как обычно онлайн только часть пользователей и так как тут мало колонок. Кто знает, может она целиком в RAM поместится. Просто даю как идею, не гарантирую, что это будет лучше.
> updated, // время когда конференция последний раз обновилась (появилось новое сообщение)
Может, last_event_time? Хотя, updated тоже норм.
> participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым.
Не лучше ли назвать partner/other_party?
> date,
Может, лучше писать send_time?
И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
> 1. Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть
5 джойнов выглядит чуть страшновато. Это, наверно, кандидат на кеширование, хотя без нагрузочного теста я не скажу, быстро или медленно оно будет работать.
> Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
Не очень понятно, зачем тут выбирать Получателей? Мы же выбираем только сообщения, адресованные данному пользователю? Я предполагаю, что если пользователь - участник конференции, то все сообщения в ней (не написанные им) адресованы ему. Или это на случай, если пользователь состоит в чате, но как-то забанен в нем? На случай игнора отправителя?
> Такой запрос вернёт количество строк равный количеству Конференций помноженных на количество Получателей. pic-1. Как сделать лимит на первые 20 конференций, а не на первые 20 строк (при условии что используется Doctrine)?
По моему, в Доктрине это есть. Там LIMIT применяется к основной сущности запроса, но это делается за счет оборачивания запроса в какую-то сложную конструкцию. Попробуй проверить, вроде:
$qb->select('a', 'b')->from('a')->leftJoin('a.b', 'b')->setMaxResults(10);
И посмотреть, какой запрос он сформирует. Это по идее должно вернуть 10 сущностей a независимо от числа приджойненных b.
Так, по идее - группировка нужна, наверно. Либо выборка в 2 запроса: сначала список конференций, потом список последних сообщений в них.
Увы, Доктрина - не самый быстрый способ делать запросы.
> Думаю, что нормализованная структура определена и осталось её оптимизировать. Пожалуйста, научите меня этому.
- нужно освоить команду EXPLAIN и прочитать мануал по тому, как понимать ее результаты (слова для поиска: postgres analyze query plan)
- прогнать запросы через эту команду и понять, эффективно они работают или нет (я смогу подсказать что-то). В идеале мы хотим: выборка из одной таблицы с LIMIT по индексу, который оптимизирует WHERE и ORDER.
- для тестирования было бы здорово сделать генератор, который нагенерирует произвольное число пользователей, конференций, сообщений. По ним прогонять запросы по одному и параллельно для измерения реальной производительности. Для Доктрины такой генератор делается, например, на основе Faker и https://github.com/thephpleague/factory-muffin. Хорошо оптимизированный запрос выполняется тысячами в секунду.
На тестах может выясниться что-то интересное, например, могут всплыть какие-то блокировки, мешающие параллельному выполнению запросов. Так их предсказать трудно, я не смогу.
- БД работает хорошо только пока индексы помещаются в память. Размер индексов можно как-то увидеть, не помню как. А если таблица помещается в память - то вообще все чудесно. Хайлоад обычно предполагает, что все влезает в память, кроме может быть редко используемых данных. Помещаются данные в память или нет - очень важный фактор, влияющий на производительность.
- скорее всего, может понадобиться больше денормализации. Денормализовать удобнее всего то, что никогда не меняется (вроде uuid получателя сообщения). Так как иначе надо будет думать об обновлении денормализованных полей.
- может понадобиться кеширование, если денормализация и индексы не помогут. Смотри на это как на последнюю надежду, так как при кешировании появляется проблема сброса/обновления кеша и она очень сложна.
- возможно, вместо запросов с джойнами быстрее будет сделать несколько отдельных запросов.
Индексы для начинающих: https://ruhighload.com/Индексы+в+mysql
Если есть конкретные вопросы, уточняй.
Раньше пользовался правкой файлов по ftp через notepad++, на линуксах же в правки по sftp имеют 2.5 приложения, да и те осваивать месяц
Да, двачую анон, складывается такое впечатление, что это какой-то рынок для гиков, нердов, но им вместо чего-то обычного впаривают реакты, вью, свелт или еще что-то, это все обрастает конференциями, курсами. Целая кампания какая-то. А ведь нужно то отобразить страницу с текстом или сделать удобную форму.
>Для мессенджера советую в README добавить скриншоты/гифки, описание основных фич (что тут есть сложного и крутого), будет хорошее демо для собеседований. Перечислить использованные технологии и библиотеки. И подключенных ботов. README сухой и краткий и не очевидно, что за ним сложный интересный проект. А может получиться хорошая реклама твоих навыков, которая выделяет тебя среди других разработчиков.
Я хочу свой стартап закончить. Если не получиться, то оформлю README, в качестве запасного плана.
Спасибо за эти слова, я часто сомневаюсь что моих навыки выделяются среди других разработчиков. Очень важно было это услышать.
>Имхо, компромисс, выбранный Телеграм - неудачный. Шифровать надо 100% сообщений. Но, конечно, это тебе решать.
Мне нужно подумать об этом.
Приведите пожалуйста аргументы почему нужно шифровать 100% сообщений?
В противовес, здесь есть недостаток - нельзя сделать поиск по сообщениям.
Это касается и метаданных, о которых вы сделали замечание ниже. Если зашифровать дату отправки сообщения, то нельзя будет отсортировать последние или первые 20 сообщений.
И поделюсь сырыми мыслями которые крутятся у меня сейчас на этот счет:
Может быть Телеграм как шифровальный мессенджер неудачен, с этим я согласен, но как мессенджер сам по себе, нужно признать, чрезвычайно удобен. Им пользуются все, и такая популярность достигнута благодаря тому, что его юзабилити привычны пользователю. Что-то не знакомое отталкивает. Нужно повторить подобный трюк и сделать это лучше - вместо самопальных алгоритмов шифрования, который использует телеграм, я уже использую проверенный OpenPGP. Осталось только повторить интерфейс.
Я вижу как предложенный вами способ может сработать. Действительно, на расшифровку одного единственного сообщения, в независимости от его размера, уходят доли секунды. Проблемы начинаются когда сообщений несколько, и их дешифровать одновременно - начинаются перегрузы в памяти и приложение начинает работать медленней (и даже фризить если не использовать Web Worker). И расшифровка сообщений по одному может решить проблему. К тому же, вы предложили как можно вывести сообщения плавно и это может выглядеть симпатично. Я проведу тесты. Но если дешифровка будет проходить всё равно медленно или это будет выглядеть некрасиво, или будут технические проблемы в реализации, придётся отказаться от этого решения.
Пока вопрос:
>- показываем сначала блоки-плейсхолдеры вместо сообщений
Как рассчитать размер плейсхолдера? Сообщения могут быть разного размера, и после дешифровки, если размер плейсхолдера статичный, то будет выглядеть немного "дёргано".
Критический, всё же, момент то что нельзя сделать поиск по сообщениям.
>> Нужно добавить ещё urlname
>
>Это можно назвать login или slug.
Или username. Я только что посмотрел в api телеграма, и это называется так https://core.telegram.org/bots/api#user
>> participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым.
>
>Не лучше ли назвать partner/other_party?
А можно назвать ещё проще и лаконичней - party? Это может подразумевать под собой как раз другую сторону:
https://translate.google.com/?source=osdd#auto/ru/party
>Noun
>③ a person or people forming one side in an agreement or dispute.
>соучастник partner, accomplice, accessory, accessary, party, associate
>участник party, participant, member, partner, participator, partaker
>сторона side, party, hand, part, way, aspect
>> date,
>
>Может, лучше писать send_time?
>
>И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
>Может, лучше писать send_time?
А почему нельзя назвать просто и лаконично date? Разве на очевидно что это дата сообщения?
>И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
Какие метаданные, помимо даты, вы хотели бы чтобы шифровались?
Что касается даты, как я писал выше, если её зашифровать, то нельзя будет сделать выборку по первым или последним сообщениям.
>> Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
>
>Не очень понятно, зачем тут выбирать Получателей? Мы же выбираем только сообщения, адресованные данному пользователю? Я предполагаю, что если пользователь - участник конференции, то все сообщения в ней (не написанные им) адресованы ему. Или это на случай, если пользователь состоит в чате, но как-то забанен в нем? На случай игнора отправителя?
Да, я как раз думал об этом, что получателей не обязательно получать, потому что единственный случай, когда нужно получить их, это когда пользователь сам захочешь посмотреть кто состоит в беседе (публичной конференции).
Это как раз решает проблему с кешированием выше и проблему с сортировкой ниже.
По поводу оптимизации:
Спасибо, что указали в каком направлении нужно двигаться, думаю я понял что нужно делать.
Задавать какие-то конкретные вопросы тяжело, и я буду задавать их и делать отчеты по мере прогресса.
Сейчас у меня есть такие вопросы:
Как тестируются параллельное выполнение запросов?
Если написать скрипт, например на PHP, который будет обращаться к БД, он будет выполнять одну команду за другой, императивно. Нужно что-то, что будет выполнять запросы параллельно. Как это сделать?
>- БД работает хорошо только пока индексы помещаются в память. Размер индексов можно как-то увидеть, не помню как. А если таблица помещается в память - то вообще все чудесно. Хайлоад обычно предполагает, что все влезает в память, кроме может быть редко используемых данных. Помещаются данные в память или нет - очень важный фактор, влияющий на производительность.
Тяжело представить что таблица сообщений или конференций поместиться в память, потому что количество записей, в теории, будет катастрофически велико. Как с этим выйдет на практике?
И ещё я сейчас поймал себя на мысли, что ничего не знаю о том когда данные хранятся в RAM, я всегда думал что записи хранятся на диске. Я погуглил этот вопрос, и создаётся впечатление что PostgreSQL решает автоматически когда хранить данные в RAM а когда на диске, и предпочтительнее в RAM. Это верно?
>- для тестирования было бы здорово сделать генератор, который нагенерирует произвольное число пользователей, конференций, сообщений. По ним прогонять запросы по одному и параллельно для измерения реальной производительности.
А у меня есть подобный генератор, который заполняет базу тремя пользователями (Alice, Bob и Tester) и заполняет по сотне сообщений между ними: (☣ Warning! Code with a smell! ☣) https://github.com/someApprentice/Crypter/blob/master/api/src/Command/PopulateCommand.php
Следовало бы увеличить количество пользователей до сотен и количество сообщений до тысяч?
Будет ли лучше если я вместо выполнения HTTP-запросов создам объекты с помощью Faker и factory-muffin, и выполню все запросы к БД напрямую?
>Для мессенджера советую в README добавить скриншоты/гифки, описание основных фич (что тут есть сложного и крутого), будет хорошее демо для собеседований. Перечислить использованные технологии и библиотеки. И подключенных ботов. README сухой и краткий и не очевидно, что за ним сложный интересный проект. А может получиться хорошая реклама твоих навыков, которая выделяет тебя среди других разработчиков.
Я хочу свой стартап закончить. Если не получиться, то оформлю README, в качестве запасного плана.
Спасибо за эти слова, я часто сомневаюсь что моих навыки выделяются среди других разработчиков. Очень важно было это услышать.
>Имхо, компромисс, выбранный Телеграм - неудачный. Шифровать надо 100% сообщений. Но, конечно, это тебе решать.
Мне нужно подумать об этом.
Приведите пожалуйста аргументы почему нужно шифровать 100% сообщений?
В противовес, здесь есть недостаток - нельзя сделать поиск по сообщениям.
Это касается и метаданных, о которых вы сделали замечание ниже. Если зашифровать дату отправки сообщения, то нельзя будет отсортировать последние или первые 20 сообщений.
И поделюсь сырыми мыслями которые крутятся у меня сейчас на этот счет:
Может быть Телеграм как шифровальный мессенджер неудачен, с этим я согласен, но как мессенджер сам по себе, нужно признать, чрезвычайно удобен. Им пользуются все, и такая популярность достигнута благодаря тому, что его юзабилити привычны пользователю. Что-то не знакомое отталкивает. Нужно повторить подобный трюк и сделать это лучше - вместо самопальных алгоритмов шифрования, который использует телеграм, я уже использую проверенный OpenPGP. Осталось только повторить интерфейс.
Я вижу как предложенный вами способ может сработать. Действительно, на расшифровку одного единственного сообщения, в независимости от его размера, уходят доли секунды. Проблемы начинаются когда сообщений несколько, и их дешифровать одновременно - начинаются перегрузы в памяти и приложение начинает работать медленней (и даже фризить если не использовать Web Worker). И расшифровка сообщений по одному может решить проблему. К тому же, вы предложили как можно вывести сообщения плавно и это может выглядеть симпатично. Я проведу тесты. Но если дешифровка будет проходить всё равно медленно или это будет выглядеть некрасиво, или будут технические проблемы в реализации, придётся отказаться от этого решения.
Пока вопрос:
>- показываем сначала блоки-плейсхолдеры вместо сообщений
Как рассчитать размер плейсхолдера? Сообщения могут быть разного размера, и после дешифровки, если размер плейсхолдера статичный, то будет выглядеть немного "дёргано".
Критический, всё же, момент то что нельзя сделать поиск по сообщениям.
>> Нужно добавить ещё urlname
>
>Это можно назвать login или slug.
Или username. Я только что посмотрел в api телеграма, и это называется так https://core.telegram.org/bots/api#user
>> participant, // Ссылка на собеседника, в случае приватной конференции, для публичных это поле остаётся пустым.
>
>Не лучше ли назвать partner/other_party?
А можно назвать ещё проще и лаконичней - party? Это может подразумевать под собой как раз другую сторону:
https://translate.google.com/?source=osdd#auto/ru/party
>Noun
>③ a person or people forming one side in an agreement or dispute.
>соучастник partner, accomplice, accessory, accessary, party, associate
>участник party, participant, member, partner, participator, partaker
>сторона side, party, hand, part, way, aspect
>> date,
>
>Может, лучше писать send_time?
>
>И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
>Может, лучше писать send_time?
А почему нельзя назвать просто и лаконично date? Разве на очевидно что это дата сообщения?
>И еще по схеме БД - а не слишком ли много метаданных в открытом виде? Может, есть смысл хранить метаданные сообщения как JSON и шифровать, и хранить шифротекст в единственной колонке metadata ?
Какие метаданные, помимо даты, вы хотели бы чтобы шифровались?
Что касается даты, как я писал выше, если её зашифровать, то нельзя будет сделать выборку по первым или последним сообщениям.
>> Получить последние 20 Конференций для конкретного пользователя, вместе с последним Сообщением и вместе с Получателем если есть (в случае приватной конференции), и вместе с Получателями в случае с публичной конференции:
>
>Не очень понятно, зачем тут выбирать Получателей? Мы же выбираем только сообщения, адресованные данному пользователю? Я предполагаю, что если пользователь - участник конференции, то все сообщения в ней (не написанные им) адресованы ему. Или это на случай, если пользователь состоит в чате, но как-то забанен в нем? На случай игнора отправителя?
Да, я как раз думал об этом, что получателей не обязательно получать, потому что единственный случай, когда нужно получить их, это когда пользователь сам захочешь посмотреть кто состоит в беседе (публичной конференции).
Это как раз решает проблему с кешированием выше и проблему с сортировкой ниже.
По поводу оптимизации:
Спасибо, что указали в каком направлении нужно двигаться, думаю я понял что нужно делать.
Задавать какие-то конкретные вопросы тяжело, и я буду задавать их и делать отчеты по мере прогресса.
Сейчас у меня есть такие вопросы:
Как тестируются параллельное выполнение запросов?
Если написать скрипт, например на PHP, который будет обращаться к БД, он будет выполнять одну команду за другой, императивно. Нужно что-то, что будет выполнять запросы параллельно. Как это сделать?
>- БД работает хорошо только пока индексы помещаются в память. Размер индексов можно как-то увидеть, не помню как. А если таблица помещается в память - то вообще все чудесно. Хайлоад обычно предполагает, что все влезает в память, кроме может быть редко используемых данных. Помещаются данные в память или нет - очень важный фактор, влияющий на производительность.
Тяжело представить что таблица сообщений или конференций поместиться в память, потому что количество записей, в теории, будет катастрофически велико. Как с этим выйдет на практике?
И ещё я сейчас поймал себя на мысли, что ничего не знаю о том когда данные хранятся в RAM, я всегда думал что записи хранятся на диске. Я погуглил этот вопрос, и создаётся впечатление что PostgreSQL решает автоматически когда хранить данные в RAM а когда на диске, и предпочтительнее в RAM. Это верно?
>- для тестирования было бы здорово сделать генератор, который нагенерирует произвольное число пользователей, конференций, сообщений. По ним прогонять запросы по одному и параллельно для измерения реальной производительности.
А у меня есть подобный генератор, который заполняет базу тремя пользователями (Alice, Bob и Tester) и заполняет по сотне сообщений между ними: (☣ Warning! Code with a smell! ☣) https://github.com/someApprentice/Crypter/blob/master/api/src/Command/PopulateCommand.php
Следовало бы увеличить количество пользователей до сотен и количество сообщений до тысяч?
Будет ли лучше если я вместо выполнения HTTP-запросов создам объекты с помощью Faker и factory-muffin, и выполню все запросы к БД напрямую?
Нет никакой кампании, лол. Это просто обычные попытки стандартизировать используемые подходы. На фронте у PHP щас только ДВА фреймворка осталось - Symfony для корпората и Laravel для стартапов - выбирай, где хочешь больше работать, и учи. Оба они показывают, как надо писать на этом языке - это PHP в его лучшем виде. Если тебе по-прежнему кажется, что они сделаны плохо и лучше писать самому, то либо ты очень крутой спец, который может одной левой на Slim построить крутую систему под конкретные задачи, либо школьник.
>Есть codeforces от Дурова
От Дурова? Интерфейс конечно ужасный. Непонятно где задачи и как вообще пользоваться сайтом.
аноны, прошу совета.
мне почти 30.
образование 9 классов. да и то формально.
работаю на дно-работе. зарабатываю копейки. и всё меня устраивало.
но сейчас возникли проблемы со здоровьем, решение которых требует больших финансовых затрат.
и я рассматриваю как вариант вкат в php-программинг.
но у меня реально крайне хуёво с образованием ( в т.ч. с физ-мат науками ).
тем не менее вот эту задачу ( с которой тут, я сморю, многие ебутся ) я решил за 20 минут на онлайн-интерпретаторе.
имея из опыта в этой области только 1 прочитанную в детстве ( пролистанную ) книженцию по языку си для школьников.
<Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?
что посоветуете?
>что посоветуете?
Ебашь, что сказать, сперва погромирование, затем догоняй математику, по типу пикрелейтед книги почитай, если есть где-то жесткие пробелы в знаниях, то заделывай их.
Я пришёл к такому выводу, что сейчас всё пришло к тому, чтобы отделить взаимодействие разработчиков фронта и бека, каждый делает по своему и как может, а если не может, то его просто заменяет другой, главная их цель это использование стандарта между собой, который в основном сейчас это JSON, то есть задача бека вывести данные из БД в формате JSON, а фронта принять их, спарсить и вывести на экран тонной фреймворков, вся нагрузка на железо теперь распределилась на сторону клиента, а взаимодействие бека и фронта на реализации создании джейсона и его вывода на страницу, я всё правильно понял?
Посмотрев ютуб, понравилась концепция создания интернет магазина, где вся суть в том чтобы получив данные из GET/POST запроса сконвертировать нужные данные в JSON и получив их вывести на экран, весь магазин в итоге сводится к 3-х страничнику, главная/корзина/страница товара, но всё это конечно заебись если ты не собираешься индексироваться в коисковиках, иначе над беком придётся сильно ебаться чтобы он ещё и страницы генерировал, хотя бы при 1 запросе
>>611042-хуй
С выбором фреймворка пока не определился, смотрел ютуб, но все предложения сохранил в закладки, пока для себя определился что первым делом нужно будет попробовать Slim, то есть я так понял нужно просто найти фреймворк который превратил основной функционал в функции, файл которых нужно будет просто подключить и уже пользуясь ими писать короткий код
Со Spring вполне может. Но Java - это не только Spring, экосистема Java вполне может покрывать все нужды энтерпрайза и даже больше, в то время как PHP нет.
Имеется в виду, что Java - это BigData, ML, concurrency, highload и куча всего еще, что может быть в составе крупного энтерпрайза. А PHP - это только веб.
>первым делом нужно будет попробовать Slim
Плохой выбор. Для новичка нужно брать что-то готовое, созданное по лучшим практикам, и разбираться, как все устроено внутри - Laravel, Symfony, все остальное сейчас - легаси.
>чтобы отделить взаимодействие разработчиков фронта и бека, каждый делает по своему и как может
Не "как может", а по вполне определенным подходам, которые еще и могут пересекаться между фронтом и бэком, т.е. опыт частично можно переносить.
>вся нагрузка на железо теперь распределилась на сторону клиента
Нет, сложная бизнес-логика по-прежнему на сервере.
>понравилась концепция создания интернет магазина
Это одна из дефолтных сфер, где доминирует PHP - e-commerce (мелкий/средний бизнес).
Значит ли это, что при необходимости можно относительно безболезненно перекатиться с PHP на Джаву? (в контексте веба)
Да, можно. Причем, может быть так, что Java после PHP не понравится, но примеры таких перекатов среди моих знакомых есть - один из них щас в СберТехе 200к получает, перекатился 2 года назад где-то.
Это же охуенно, анон. Когда с пыхи будешь слезать, то даже ide не придётся менять.
Emacs
С Идеей будет то же самое, если до этого писал на PHPStorm.
Ну а в остальном я правильно понял? Бекенду нужно высрать джейсон из базы, а фронту пропарсить его и отрисовать?
Да
Подскажите, я на laravel могу красиво крудошлепить используя его инструменты(всякие курсы-хуюрсы качаю и смотрю, как строят приложения) и композерем тащить нужные зависимости , но когда нужно создать какой-нибудь модуль - я обсираюсь и пизжю решение из инета. Так вот, собственно, вопрос: как научится (мыслить логически, хз) создавать модули? Как прокачать этот скил? Логические задачки решать или что? Или это нормально в начале и все дальше все поедет? Чувствую себя идиотом.
Декомпозируешь функционал и пилишь потихонечку. В конце концов любая таска сводится к множеству атомарных тасок типа "сделать запрос в бд" или "обрезать строку".
Во фронтенде та же херня. Дают тебе таску на человеко-день и ебись с ней как хочешь
Ребята, а есть кто работает дома? На каких сайтах ищите работу? Что обычно делаете по работе (сайты или что?).
Изучив Php, реально ли работать дома? Или будешь мало получать, и придется работать на дядю-контору каждый день в офисе?
Да. В веб-разработке каждый второй такой лол
>Почему лучше в офисе?
А сам как думаешь, есть мысли? Научишься взаимодействовать с разработчиками и вообще с людьми, если сычуешь.
Зачем взаимодействовать с разработчиками какими-то с офиса, если во фрилансе ты сам на себя работаешь?
Не сычую
В будущем захочешь стать сеньором 300к/наносек - навыки и знания из "внутренней кухни" пригодятся.
то есть ситуация такая: сидишь-пердишь в офисе пару лет, потом домашний фрилансер и опять работа в офисе, но уже покрупнее и посолиднее?
>есть кто работает дома?
Есть
>На каких сайтах ищите работу?
хх, мойкруг, линкедин, телеграм чаты с работой php_jobs
>Что обычно делаете по работе (сайты или что?)
Поддерживаю продукт, что-то допиливаю, фикшу.
В начале пару лет пердишь в офисе. Потом думаешь, что больше хочется - офис/релокейт/удаленка/фриланс
REST API это называется, и это целый архитектурный паттерн поверх HTTP со своими правилами и особенностями, а не просто "высрать джейсон из базы". Если ты собрался срать джейсонами, то пожалуйста, не иди в веб или как минимум в PHP. Иди лучше в JS - там щас наибольшая концентрация всяких сирунов разной мастистости - они тебя встретят как родного и научат филигранно высирать каждый месяц очередной ShitJS, с которым ты будешь носиться по местным общественным туалетам (по ошибке называемым митапами и конфами), где будешь доказывать, что твое говно самое красивое и наименее вонючее, и что все должны кушать именно его. Короче, съеби.
Не на себя работаешь, а на заказчика. И с ним порой труднее взаимодействовать, чем с коллегой-программистом.
Не, это вряд ли. Просто заказчики обычно не шарят в программировании, поэтому трудно договориться.
анонсы, подскажите что это значит?
ну это понятно. а что значит то что идет в правой части? отдебажить ипонять что за че отвечает нихуя не смогу тк этого прилетает с устаревшего api
>var_dump(); die;
бля, недавно в довольно крупном гос проекте такое встретил в продакт-коде, аж сердце прихватило.
Верстка страницы про регулярные выражения пиздецовая конечно - очень много инфы и картинок, нет какого-то порядка, скроллить просто мучение и сразу 8 задачек
да так и делал, только он мне фаталы выбрасывает и говорит шобi я шел нахуй с неправильными оффсетами. в гугле для многомерных массивов я инфы не нашел
Откопал историю про маскот пыхи - elePHPant, https://7php.com/elephpant. Мб кому интересно будет.
если хотите, могу за чонить пояснить в ближайшие пару часов, пока вискарь меня совсем не забрал
а может я забуду про тред и пойду дальше пьянствовать, сорри
Многомерный массив - это массив, в котором значением элемента является другой массив. Например:
// обычный массив
$a = [1 => 'test'];
// 2-мерный массив
$b = [777 => $a];
// то же самое, что
$b = [777 => [1 => 'test']];
>>615724
Справедливое замечание. Если будет время, постараюсь поправить.
>>614057
Общая идея, да, в разделении работы между бекендщиками и фронтендщиками. Но вот только это вряд ли проще и быстрее, чем монолитное приложение. Ведь теперь у нас не одно, а два приложения (фронт и бек), нужно их делать, документировать, синхронизировать разработку. А каково отлаживать баг, для которого надо разобраться в работе обоих частей?
С точки зрения простоты как раз сгенерировать на сервере страничку из имеющихся данных будет проще. Однако, если команда большая, то разделение работы между двумя командами может упростить жизнь.
Вопрос снят, разобрался
>Однако, если команда большая, то разделение работы между двумя командами может упростить жизнь.
Да и снять часть работы с сервера, думаю. Всё таки просто отдать данные клиенту, а тот пускай сам их рисует - вполне здравая идея.
Только эффект от этого будет на действительно хайлоад приложениях с тысячами пользователей.
Поправьте если ошибаюсь.
Вот ещё вопрос насчет задачи - "На вход скрипта дан введенный пользователем номер телефона..." Это надо делать отдельный хтмл с полем ввода?
Но ведь я не веб макака раб, я просто вебмастер и учу php и js для своих целей, для обслуживания и накручивания ништяков для своего сайта, но с тобой согласен, ебучие хохлядские макаки навысирали фрейворков как их навысирали их матери шлюхи за сало
Александр Лущенко
Дошёл до такого момента как - как сделать ЧПУ, я правильно понимаю что это называется роутинг?
Бля, неужели ЧПУ приходит к тому, что создаётся файл в котором каждую страницу прописывают вручную и указывают содержимое какого php файла выводить в контент по нужному url?
Или вручную это делается только на мелких проектах, а на крупных в автоматическом ражиме это происходит с помощью хранения названий всех ЧПУ в БД? И уже какой-то файл асоциируя контент всё в тот же файл подставляет нужный нам ЧПУ и вызывает нужный для него контент?
Бля, надеюсь понятно объяснил, в общем вопрос в том в чём заключается суть и концепция создания нужного мне урл для каждой страницы, это создание файла в котором всё это прописывается, или файла который хранит все эти урл в бд и с помощью хитровыебанного кода решает какой контент выводить?
А так по сути получается с монго дб можно работать и прямо из JS скрипта? Проблема в том что там будет палиться инвормация для связи с БД и для этого и используют Node JS?
https://github.com/deadj/student-list
http://f914421i.beget.tech/
>неужели ЧПУ приходит к тому, что создаётся файл в котором каждую страницу прописывают вручную и указывают содержимое какого php файла выводить в контент по нужному url?
Гугли MVC.
> почитал про mysql на w3scool и запутался, какой способ подключения лучше использовать и в чём их отличия, нахуй их столько наштамповали?
Хуёво же ты прочитал, если у тебя вопросы остались. Иди читай по новой.
>понравился по виду объектно ориентированный
>PDO это пиздец что за хуйня вообще, вырвиглаз
мда...
Ну вот что тут можно понять https://schoolsw3.com/php/php_mysql_connect.php на инглиш версии я не осилил
И сразу в первых предложениях.
>Если вам нужен короткий ответ, выбирайте "Что вам нравится".
ты пиздец.
Говнокодер порвался.
Мне просто сдаётся что если выбирать то что нравится, вы изведётесь говном, хая какое небезопасное говно я выбрал, что так подключаются к БД только мудаки, значит отличие не в безопасности? Сейчас дошло что PDO ещё и через страйкер работает, вообще пиздец какой-то, нахуй его выслали, и прочитать нормальными русскими словами негде, теоретики с Ютуба сами не могут объяснить
Спасибо я не знал
>Что блять за композеры
Руками собрался либы менеджерить? Или свои велосипедить?
>тонны блять мегатонны говна и папок фреймворков
Проекты растут, нужен инструментарий, базовый каркасс веб приложения. Ты всё еще волен писать на ваниле, но по темпу разработки не поспеешь за васяном с фреймворком
>я ещё должен тонный говна установить на пк и ебаться блять пердолиться как красноглазик в консоль
Ставишь пхп, композер, установщик фреймворка, пишешь 1 команду в консоль - проект готов. Сложно?
>Руками собрался либы менеджерить?
Вот тут вот не понял, я имею ввиду почему просто нельзя скачать архив
Это блять что получается, после написания на этих хуеворках, всё это говно из статысяч папок ещё и на сервер надо грузить? Пиздец, ещё и хостинг говном забивать, пиздец даунизм
Щас бы слушать довенов которые критикуют СТАНДАРТНЫЕ приёмы работы с БД...
Суть в том, что ты выбираешь не технологию, а стиль кода. Любишь ООП - бери одно, любишь процедурный стиль - другое. Я вот процедурный люблю, потому-что PDO - яебал ручками прописывать. Но например в YII PDO наоборот быстрее получается. Потому-что 90% работы фрэймворк на себя берёт.
И да, если ты умеешь в ООП PHP, ты уже на кровне где нужно формировать своё мнение исходя из опыта использования.
Спасибо, просто хотел понять в чём различия, говноютуберы посеяли сомнения своими домыслами как лучше, мне тоже больше нравится процедурный даже, никаких ебучих стрелочек, так то я пришёл с яваскрипта в пхп, по этому мне это роднее
1.У тебя там XSS как минимум
2. При выборе страницы в списке передается параметр search если туда ввести например admin, он выдаст таблицу без значений(скуля скорее всего)
3. первый и второй текстбокс при реге называются имя и валидатор выдает одно и то же сообщение
Нашел причину вставки XSS, в валидаторе исправь, у тебя не строгая регулярка идет
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
>>617640
А как же миф типа если его не закрыть, то оно останется открытым в ожидании пользователя? Или это уже давно пофикшено? То есть можно забить на закрытие?
Спасибо, анончик
Объясни, пожалуйста, на счёт XSS. Прочитал урок ОП, как я понял XSS можно решить, используя htmlspecialchars(). Разве нет?
Бля, беать он душный, вроде бы рофельный видос но больше пяти минут не осилил
Возможность добавления появляется, потому что ты криво регулярку сделал и она у тебя англ символы пропускает и <>, а возможность вывода из-за htmlspecialchars() эта функция должна работать при выводе значений в таблице(в данном случаи), короче открой свой сайт, открой список через Ctrl+U и посмотри, что необычного есть у студента "Василий Вася", а потом глянь как он у тебя записан в бд.
Тебе про XSS ещё в тот раз писали, помню как ты скидывал список, хз чё ты не исправил
>почему просто нельзя скачать архив
Сейчас бы со скачкой ебаться, с архивом. Когда можно одной строкой поставить.
>так то я пришёл с яваскрипта
Постоянно от яваскриптеров слышу - какой бэк простой.
Поздравляю - у тебя глазки раскрылись на всю эту парашу.
Понял. Спасибо, что объяснил
У меня очень зловонный пердеж, и я не знаю как сидеть с этим на работе - постоянно бегать в туалет только чтобы пердануть? А если не успею, или мне расхочется по пути, а это вредно сдерживать газы, что посоветуешь по этому поводу кроме очевидной удаленки?
Выглядит как жаваскрипт.
>Вот тут вот не понял, я имею ввиду почему просто нельзя скачать архив
Какой архив?
Под новый проект будешь каждый раз качать пару десятков архивов?
Потом будешь разгребать совместимость версий либ, чтобы всё со всем работало.
Нет бы взять композер, который берет эту задачу на себя
> всё это говно из статысяч папок ещё и на сервер надо грузить
Ты грузишь только код своего проекта. Либы ставятся на сервере одной командой: composer install
Но как концептуально это должно выглядеть?
Нода-сервер принимает запрос, и отправляет этот запрос на api пхп сервера? ПХП делает какое то оче-долгое математическое вычисление фибоначи до миллиарда считает ( которое в ноде бы заблокировало бы цикл libuv ), пхп завершает вычисления, нода резолвит этот запрос и возвращает клиенту данные.
Как то так это выглядит? Я понимаю что пхп для математических вычислений это наркомания.
А воообще ирл какой кейс пхп + нода может быть?
Чего там охуенного, что работа с фронтом в бэк уезжает? Очередной васянский лисопед.
Давай ещё вставки js генерить на пхп? Вообще охуеешь при отладке.
Не работал с ним. Говорят - параша.
Чисто на вскидку - там нехороший мужчина впиливает обработку событий в шаблонизатор. И к этому говну, как я понял, ещё и жс прилагается. Получается, что под соусом наглядности нам фуфло двигают: работы - больше, код - запутаннее, зато очередной васян звёздочек отхватит от наивных дурачков вроде этого >>618019
Я это всё учу просто для себя, идти с этим на работу я как минимум ссу, потому что засмеют да и спецов пиздюков там уже наверняка тонны которые щёлкают это как семечки и будут смотреь на меня как на дебила
Я к чему пришёл, я уже знаю js и php, мне показлось если сейчас изучить vue, а потом angular я смогу понять принцип всего этого взаимодействия и того в чём задумка разработчиков фреймворком для php?
>Говорят - параша
Всё так. В 3 версии yii хотят уйти от этого, но уже поздно, yii никому нахер не нужен
Теперь я запутался ещё больше, что за совместимости ещё там нужны? Почему нет просто архива с исходниками, те же папки с файлами но в архиве
Тебе нужно поставить 2 либы. У одной версия X, у второй Y. Версия X требует версии YY у второго.
А теперь помножь это на сотню либ
>Я это всё учу просто для себя, идти с этим на работу я как минимум ссу, потому что засмеют
Тебя даже на собес не позовут без указания знания пары MVC фреймворков
>если сейчас изучить vue, а потом angular я смогу понять принцип всего этого взаимодействия
Нет, ты так же обосрешься на изучении, т.к. ангуляр следует примерно той же архитектуре.
Совет как изучить MVC - берешь курсец laracasts или елисеева и пилишь паралеллельно видео проект из курса. Потом поймешь, зачем нужно разделять к примеру логику представления от моделей
Это всё из-з этого ебучие подхода с git? Где каждый файл блять каждую минуту меняется, что сука нельзя просто скачать ебучий архим, блять ну нахуй так жить, мудаки сука напридумывали говна и рады
Добро пожаловать в интернет.
Еще скажи, что гитом не умеешь пользоваться - любая контора тут же нахер пошлет
>т.к. ангуляр следует примерно той же архитектуре
По этому и придумал дял себя такой лайт вариант, сперва вью, чтобы вообще понять зачем ебанаты ушли от ванилы, потому ангулар, чтобы понять зачем ебанаты всё эторазделили на миллион папок и библиотек и потом уже ларавел, просто js я пока понимаю больше
Не умею, из работы работал пару месяцев в местном провайдере, всё остальное время занимался пиратскими сайтами, а сейчас хочется для себя понять принципы и куда всё движется, не всю же жизнь ставочки и казино рекламировать
>зачем ебанаты ушли от ванилы
Затем же, зачем придумали ООП.
Чтобы пилить более сложные проекты. В реальной работе не будет laba1.cpp на 10 строк. Это будут ебы на несколько десятков или даже сотен тысяч строк
Да я смотрю пыха вообще в жаву превращается. В какой-нить 10 версии уже можно будет пыхарями жавистов заменять. Все охуеют от такого поворота.
Если асинхронный io подвезут, то еще и go сдохнет
Вот все на ютуб еговорят сложные проекты, а что блять такое сложные проекты? Вывести список товаров на алике - это блять сложно? И по этому надо так голову ломать ради их видения того как всё должно работать?
>Вывести список товаров на алике - это блять сложно
Да, сложно. Там может быть с десяток таблиц для хранения данных по товарам + склады + акции + еще хуета какая. И нужно умудриться сделать так, чтобы это отрабатывало за адекватное время.
Не обедать на работе и не жрать всякое говно. Не пердеть, короче. У меня одно время была проблема вонючих ног, лол, решил всякими средствами, но некоторое время было неловко.
>Вывести список товаров на алике - это блять сложно
Да, блять, это сложно, надо учесть твои индивидуальные предпочтения и сезонные изменения с помощью нейронки и только потом вывести. Все это на 100500 серверах с автодеплоем.
Сложные проекты - это про дружбу говна с мочой, спермой и слизью, чтобы все это вместе работало.
На самом деле действительно сложные проекты сложные уже настолько, что какой-то единой инфраструктуры у них вообще нет, кругом микросервисы, которые общаются между собой по заданным протоколам, каждый сервис разрабатывают отдельные разрабы на своем стеке и как работает какой-то другой в душе не ебут даже, чисто по той причине, что невозможно синхронизировать такую разработку.
Ты сразу в двух тредах рвёшься что ли? Эка у тебя пердак разметало от собственной необучаемости.
>деградровали и убили веб разработку
А десктоп-разработку кто убил?
Кто в андроид-апи насрал, почему оно состоит из костылей абсолютно полностью?
Кто в C++ насрал, почему эта говнина такая кривая и немощная, что на ней невозможно разрабатывать сложный надежный софт?
>C++
И не надо тут пиздеть, мол, давно делали, в ту пору можно было говно лепить.
Тот же пых уже несколько мажорных версий поменял и PHP7 - это совсем не то самое, что PHP4.
А кресты как были кривой парашей, так и остались
Вот вы аноны тут сидите такие невьебенные бекендеры, а чем вы вообще занимаетесь-то? Вот вы говорите устроился в фирму, ну и что вы там делаете? Ну написали вы сайт для неё, вывели товары и что потом? На это максимум месяц уйдёт, ну а дальше нахуй вы там нужны? Вас же рано или поздно просто пидорнут за ненадобностью, потому что просто добавлять контент может и секретарша скачащая на хую директора, что там блять можно сутками с утра до вечера несколько лет каждый день писать на своему злоебучем ларавеле и прочей нечести?
Где вообще все эти блять невьебенные бекендеры и фронтендеры работают? Я вот чёто нихуя ни 1 не вижу и не слышу, почитав интернет и посмотрев ютуб куда не плюнь везде невьебенный программист, НО ГДЕ БЛЯТЬ ОНИ ВСЕ, мне вот нарример просто интересно посмотреть на такую контору, что эти распиздяи за 200к там такого невьебатого делают что имеют такое невьебенное чсв и считают что жизнь удалась, по мне так это ленивые создающие вид работы черви, ну не видел я ни одного за работой, не верю я что там пиздец так всё сложно что прям пизда
тебе в руби тред
Нет же, я хочу понять чем я буду заниматься, если решу окунуться в это говно из костылей и мочи с головой
Фичи всякие добавляют, ящитаю. Вот год назад мой банк не умел в статистику, обмен валют на сайте и много других операций, сейчас все это прикрутили, стало заебись.
>Фичи всякие добавляют
Всё верно. Фичи, дебаг, документация, прочая поддержка. Запил сервиса это только начало и никто на этом не останавливается. Зачастую сервис начинает работать и приносить прибыль будучи даже не дописанным до полного функционала. Ну а потом программист сидит как минимум для того, чтобы было кому разбираться в этом говне если что-то упадёт.
Таблетки попей что ли - у тебя галлюцинации.
Допиливать какой-нить проект на mvc фреймворке на ~100к строк
>>1618267
>создав сайт с говном можно иметь в 2 раза больше с рекламы
Если б я хотел бы говно рекламировать - не лез бы в программирование. Ты совсем даун?
Я фулстек, знаю laravel, vue, angular и немножко ноды. Но проект хочу делать на похыче
Чё сделать заебатого? Идей вообще нет. Желательно что-то такое, что можно рили хостануть и чтоб польза была.
Единственное что в голову лезет - это приложение по генерации тестов и опросов, но это же такая лажа...
shadowcloud
Название переменной неудачное. Оно должно говорить о содержимом, а не быть каким-то невнятным глаголом.
>документация
А как это делается, где можно почитать или посмотреть образец составления документации?
Они ж ролики по пхп делают - старательно пересказывают мануалы, разбавляя рекламой каждые 10 минут.
В копмостер.жсон как раз и написано какое говно ему надо скачать чтобы это говно наполнилось говном и мясом и перестало быть просто высушенным скелетом?
На пике я так понимаю это типа как в нормальных языках подключение библиотек происходит? В данном случаи других каталогов фреймворка с прочим говном?
Тред вроде бы утонул, почему не пересоздают?
Наверно потому что весь код цмс в открытом доступе и все кулцхацкеры их уже изъебали и прошурстрили от и до и знают с какой стороны к ним подойти чтобы присунуть админу в жопу и в рот
>А почему люди на cms гонят?
Потому что там практически нет написания кода. По сути конфигурируешь готовую систему. Т.е. к разработке относится опосредованно.
Композер ставит только php библиотеки, с жс он не работает.
>В копмостер.жсон как раз и написано какое говно ему надо скачать чтобы это говно наполнилось говном и мясом и перестало быть просто высушенным скелетом?
Да. Причем в каждой либе свой композер.жсон лежит. Композер собирает эти зависимости в кучу и разруливает. На выходе получаешь папку вендор, в которой лежат все необходимые либы для твоего проекта.
>На пике я так понимаю это типа как в нормальных языках подключение библиотек происходит?
Вроде того. Далее либо создаешь нужный объект, либо через DI тащишь что нужно.
Да, композер скачивает (в папку vendor), устанавливает и обеспечивает автозагрузку библиотек, прописанных в composer.json.
Ты можешь найти любую библиотеку, зайдя на https://packagist.org/ и вбив ее имя из composer.json. Там будет выдана ссылка на гитхаб, на котором ты можешь скачать библиотеку архивом и вручную установить в папку vendor, если у тебя много свободного времени, чтобы делать вручную то, что может сделать программа.
Композер также настраивает автозагрузку для кода и всех сторонних библиотек. Почитать про автозагрузку можно тут https://github.com/codedokode/pasta/blob/master/php/autoload.md Про композер можно почитать в документации к нему на англ.
Если ты хочешь разбираться в фреймворках, тебе надо понимать ООП и некоторые паттерны. Про ООП ты можешь почитать, открыв главу "ООП" из учебника в шапке, или в любом другом учебнике. Куча полезной информации, например, про паттерны работы с БД в фрйемворках или шаблонизацию, есть тут https://github.com/codedokode/pasta/
>>618775
Ну так она и называется - система управления контентом, а не система написания кода.
На картинке не подключение библиотек, а указывается, какому полному имени класса соответствует короткий синоним в коде. Например, там указано полное имя классов Exists, In, NotIn, которые в коде пишутся просто одним словом без длинного неймспейса.
Тред пересоздадим на 800-900 посте, или позже, если у меня будет мало времени.
>>618632
Документации бывают разные. Есть документация по коду - phpDoc - погугли сам - это специальные комментарии в коде. Из них можно сгененировать что-то такое: https://devdocs.io/symfony~3.4/symfony/component/httpfoundation/cookie
А бывает документация к API, например:
- https://tech.yandex.ru/maps/jsapi/doc/2.1/ref/reference/Clusterer-docpage/
- https://api.apiship.ru/doc/
Делать нехуй
Если ты хороший специалист, то даже если тебя уволят, у тебя будет несколько новых предложений о работе.
Платить 200к не проблема, если человек приносит компании больше прибыли. Ну, например, автоматизирует работу, которую бы делали несколько других человек. Или делает продукт, который продается намного дороже/приносит прибыль.
То, что ты не видел, не значит, что этого нет.
>>618164
Ты когда-нибудь видел магазин изнутри? "просто список товаров" - это не просто список товаров, а список от разных продавцов, с проверкой наличия, с импортом, с расчетом скидок и предложений, с хитрой сортировкой, дающей максимальную прибыль, с всякими заманивающими надписями (осталось полчаса до конца скидки).
По твоей логике, дом построить - тоже просто кирпичи друг на друга положить. Зачем проектировать, делать расчеты, производственные графики, оптимизацию снабжения итд.
Я тебе облегчу путь. "Ушли от ванилы", так как в каких-то сложных экранных формах, где больше десятка элементов, код на "ваниле" превращается в копирование данных туда-сюда. Например: покупатель поменял тип доставки, надо рассчитать и обновить: стоимость доставки, срок доставки, цену заказа, скидку. Покупатель добавил одну единицу товара, надо все пересчитать, плюс у него включилась бесплатная доставка, опять же, надо все пересчитать.
В итоге большая часть кода состоит из этих "обновлений" информации, и очень легко что-то пропустить, запутаться и забыть обновить (например: забыть показать плашку бесплатной доставки после увеличения кол-ва товара). Потому и появляются новые техники:
- дата-байндинг - автоматическое копирование данных из переменных на экран и назад
- реактивное программирование - автоматический пересчет выражения (например: сумма заказа) при изменении любых компонентов формулы (кол-во товара, тип доставки итд)
- реактивные шаблоны - шаблоны, которые автоматически обновляются и обновляют содержимое экрана при изменении величин (переменных), которые использовались при их рендеринге.
Я тебе советую: попробуй сделать какую-то экранную форму с зависимостями сначала на чистом JS, а потом на фреймворке. Например: форма заказа в магазине, форма выдачи кредита (с кучей условий, проверок, зависимых друг от друга полей). Или еще лучше: сделай ленту новостей. Просто есть новости, в виде бесконечной ленты, которая подтягивается с сервера. Новости можно читать, можно лайкать и комментировать. Есть также категории можно смотреть новости только в категории. Еще круче, если твое приложение сможет кешировать данные и работать даже при временном пропадании интернета (например: ты ставишь лайк, и при появлении интернета он отправляется на сервер и фиксируется окончательно). В ходе разработки такого приложения тебе придется и промисы изучать, и реактивное программирование, и может rx.js
Всмысле бля, а зачем этот тред нужен? Прочитай название "Клуб изучающих PHP". Или ты чсв анимешник который считает себя тру прогером и всех кто только начинает ненавидит потому что знает больше них и выше них и считает их нелью?Анимешники нелюдь и есть кста
>>618787
>>618792
>>618800
Спасибо за развёрнутые ответы аноны, не понял только что за библиотеки качает например ларавел, в нём же вроде как уже всё должно быть, или у них такая задумка изначально, не писать ещё одини велосипеды, а написать код связующий кучи всеми использующихся библиотек и он получается в момент скачивает качает последнюю их версию которую разрабы ларавела посчитали совместимой с их кодом и прописали в композер файлах
Интересно а может разраб одной из либ зная что его либу качает композер - изменить её тем самым изначально заделать в коде дыру, или такая западна возможна только у снгхохло разработчиков
Ну и по жс либам, неужели он не качает какой-нибудь бутстрап или ангуляры с вьювами
С гитхаба можно скачать zip-архив любой версии кода. Разве плохо? Также, у библиотек часто есть страница "релизы", где есть архивы с кодом определенных, протестированных версий.
Ты лишь демонстрируешь свою неграмотность. Почему бы тебе нормально не спросить то, что непонятно, и не узнать ответ.
>>618138
Архив есть, но тебе надо скачать отдельно основную программу и отдельно каждую библиотеку, которая ей нужна. И да, любая версия не подойдет, а только та, которая указана в composer.json.
>>618135
Для начала, почему бы тебе не почитать про MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
Фреймворк - "каркас" - это такой набор кода, который не заточен под конкретное приложение, а может пригодиться в любом. Люди, которые делали много сайтов, знают, что есть какие-то повторяющиеся куски кода, вот если их сделать универсальными, то и получаетс яфреймворк.
Сложный он, так как ты видимо не изучил ООП, MVC, паттерны, а берешься сразу за код и ничего не понимаешь. Изучай последовательно, когда видишь что-то незнакомое, какой-то паттерн, разберись в нем сначала.
Я видел код без фреймворков, почти всегда это нечитаемая, неудобная лапша. Ну например: люди берут, на каждый раздел делают свой файл вроде index,php, news.php, forum.php. В итоге код получается не повторно используемый - код взятия последних новостей жестко зашит в news.php и его нельзя вызвать из forum.php, чтобы отобразить блок с новостями в сайдбаре. И это, по твоему, лучше, чем фреймворк?
Или другой пример: в "ванильном" коде часто работа с БД ведется без ООП, просто пишутся SQL-запросы (часто опасные, с уязвимостями, без плейсхолдеров), получаются данные в виде массивов и где-то 1000 строчек нижу эти массивы выводятся на странице. И чтобы понять, что может быть в массиве, какие поля , каких типов тебе надо мучительно прокручивать весь код и вручную разбирать, какие действия делаются с массивом. А в той же Симфони есть Доктрина, сущности (новость, пост на форуме, пользователь) представлены в виде объектов, с полями, методами и комментариями. Все понятно: какие есть свойства, что с ними можно делать. Если используешь IDE, то она тебе дополняет код и чуть ли не за тебя его пишет. А ты предлагаешь от этого отказаться и вернуться к лапше?
Также, фреймворк содержит готовые классы для организации форм. Вот тебе надо ввести адрес, проверить и сохранить в базу его идентификатор из КЛАДР. На лапше ты все это делаешь вручную, это нельзя никак повторно использовать. А на фреймворке ты делаешь специальное поле или под-форму и можешь их вставлять в любую форму. И ты от этого предлагаешь отказаться?
Также, фреймворк содержит средства для перевода сайта на другие языки. Организации "красивых" URL. Шаблонизатор. Защита от SQL inj, XSS, XSRF. В твоем самописном коде это есть? Или ты предлагаешь тратить рабочее время и пытаться сделать то, что уже сделано другими?
С гитхаба можно скачать zip-архив любой версии кода. Разве плохо? Также, у библиотек часто есть страница "релизы", где есть архивы с кодом определенных, протестированных версий.
Ты лишь демонстрируешь свою неграмотность. Почему бы тебе нормально не спросить то, что непонятно, и не узнать ответ.
>>618138
Архив есть, но тебе надо скачать отдельно основную программу и отдельно каждую библиотеку, которая ей нужна. И да, любая версия не подойдет, а только та, которая указана в composer.json.
>>618135
Для начала, почему бы тебе не почитать про MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
Фреймворк - "каркас" - это такой набор кода, который не заточен под конкретное приложение, а может пригодиться в любом. Люди, которые делали много сайтов, знают, что есть какие-то повторяющиеся куски кода, вот если их сделать универсальными, то и получаетс яфреймворк.
Сложный он, так как ты видимо не изучил ООП, MVC, паттерны, а берешься сразу за код и ничего не понимаешь. Изучай последовательно, когда видишь что-то незнакомое, какой-то паттерн, разберись в нем сначала.
Я видел код без фреймворков, почти всегда это нечитаемая, неудобная лапша. Ну например: люди берут, на каждый раздел делают свой файл вроде index,php, news.php, forum.php. В итоге код получается не повторно используемый - код взятия последних новостей жестко зашит в news.php и его нельзя вызвать из forum.php, чтобы отобразить блок с новостями в сайдбаре. И это, по твоему, лучше, чем фреймворк?
Или другой пример: в "ванильном" коде часто работа с БД ведется без ООП, просто пишутся SQL-запросы (часто опасные, с уязвимостями, без плейсхолдеров), получаются данные в виде массивов и где-то 1000 строчек нижу эти массивы выводятся на странице. И чтобы понять, что может быть в массиве, какие поля , каких типов тебе надо мучительно прокручивать весь код и вручную разбирать, какие действия делаются с массивом. А в той же Симфони есть Доктрина, сущности (новость, пост на форуме, пользователь) представлены в виде объектов, с полями, методами и комментариями. Все понятно: какие есть свойства, что с ними можно делать. Если используешь IDE, то она тебе дополняет код и чуть ли не за тебя его пишет. А ты предлагаешь от этого отказаться и вернуться к лапше?
Также, фреймворк содержит готовые классы для организации форм. Вот тебе надо ввести адрес, проверить и сохранить в базу его идентификатор из КЛАДР. На лапше ты все это делаешь вручную, это нельзя никак повторно использовать. А на фреймворке ты делаешь специальное поле или под-форму и можешь их вставлять в любую форму. И ты от этого предлагаешь отказаться?
Также, фреймворк содержит средства для перевода сайта на другие языки. Организации "красивых" URL. Шаблонизатор. Защита от SQL inj, XSS, XSRF. В твоем самописном коде это есть? Или ты предлагаешь тратить рабочее время и пытаться сделать то, что уже сделано другими?
Я чсв? Да ты чего, я обычный мамкин херой
Также, не берись за Симфони сразу, начни со Slim. И прочти документацию или перевод или уроки по нему, а параллельно изучай код. Слим маленький, там по сути только роутер + request/response + DI (про DI тебе тоже надо почитать отдельно).
>>618108
Это извращение, по моему. Ну например: у тебя нет ограничений и при большом числе запросов запустится куча процессов PHP и все зависнет намертво. То есть твое решение работает "на авось". Это плохое решение.
Тебе нужна очередь задач. Код веб-скрипта создает задачу, и кладет в очередь. Рабочие-воркеры, запущенные из CLI, следят за очередью и берут из нее задачи, выполняют, кладут результат в другую очередь или в БД. Ты определяешь число воркеров и твой сервер никогда не перегружается, разве что задачи начинают обрабатываться с большей задержкой. Для этого не нужен PHP.
>>617931
Сходи к врачу для начала и подбери диету. Только вот зачем этот оффтопик писать в наш тред про программирование?
А битрикс например в открытом доступе разве? Может ли быть дело только в безопасности? - разработчики cms могут ведь просто закрыть все дыры, а хейт останется.
>>618775
> По сути конфигурируешь готовую систему.
> Т.е. к разработке относится опосредованно.
Не вижу связи. И там ведь готова только админка - надо её как-то связать с фронтом, фронт надо написать или нет?, вроде бы компоненты cms можно редактировать, писать свои.
>хейт останется.
Ты ведь наверняка знаешь ответ на свой вопрос. Это ужасный код, но он подходит бизнесу и потому живет. Разработчикам не нравится работать с говнокодом, поэтому мы хейтим. И по сути мало кто с этим работает из тех, у кого голова на плечах. Обычно на долю цмсок приходятся эникеи всякие.
Ты скорее всего подумаешь, что определение говнокода субъективно. В мелочах да, но в общем случае код всяких битриксов никакой здравомыслящий разраб не назовет нормальным.
Алсо, именно эта вот срань сделала плохую репутацию пхп.
Молодец. Ты рассуждаешь правильно, а в уроке тебя учат фигне. Подумай: что на самом деле надо делать при возникновении ошибки в веб-скрипте? Зачем пользователю текст ошибки? Надо логгировать ошибку в стандартный лог (журнал) ошибок PHP, отдавать HTTP-код состояния 5xx, а пользователю показывать красивую заглушку, чтобы он понял, что на сайте временная проблема и админы в курсе. Некоторые еще в реальном/почти реальном времени эту ошибку постят в какой-нибудь чат. Теперь можешь попробовать это реализовать и запостить код на проверку
Урок про исключения, может он тебе пригодится: https://github.com/codedokode/pasta/blob/master/php/exceptions.md
> А как же миф типа если его не закрыть, то оно останется открытым в ожидании пользователя?
Чушь. Или приведи какие-то технические аргументы, как это должно сработать, желательно со ссылкой на доки.
>>617633
mysqli_close имеет тот плюс, что позволяет тебе увидеть какую-то ошибку (например: не все данные получены). Или понять, что соединение успешно закрыто. При автоматическом закрытии ошибки скорее всего не логгируются.
>>617621
Можно скачать руками. Можно не использовать библиотеки и все писать с нуля самому.
>>617603
PDO поддерживает исключения по желанию. try/catch писать не требуется, изучи исключения для начала: https://github.com/codedokode/pasta/blob/master/php/exceptions.md
Почему бы тебе самому не ответить на свой вопрос. Возьми главный репозиторий Laravel, https://github.com/laravel/laravel нажми на composer.json в нем, найди там список зависимостей (библиотек) в разделах require и require-dev и каждую вбей в поиске на packagist.org. Прочти описание каждой и нам тут отпишись кратким списком: используется N библиотек для того-то, M библиотек для того-то.
У каждой библиотеки есть свой composer.json, проверь и его также, чтобы увидеть зависимости этой библиотеки.
Можешь даже схему зависимостей со стрелочками нарисовать. А, хотя, есть готовый инструмент для этого: https://github.com/clue/graph-composer
> Интересно а может разраб одной из либ зная что его либу качает композер - изменить её
Может. Потому надо указывать конкретные версии, а не "любая старше X", проверять библиотеку перед подключением, а репозиторий вроде packagist должен на своей стороне сохранять релизы библиотек (что он не делает).
> Ну и по жс либам, неужели он не качает какой-нибудь бутстрап или ангуляры с вьювами
Проверь. Там есть package.json - это фронтенд-зависимости, скорее всего это конфиг менеджера пакетов npm или yarn. У них есть свой сайт-репозиторий, где можно искать пакеты по названию.
Неужели эту задачу можно делать годами целым блять отделом дормоедов, я не верю, стройку и то за пол года делают
Ванилу давно заменил jquery, потому что сам понял что это куча лишних повторений, хочешь сказать что тут и jquery неосиляет такие задачи что ты описал, по этому и хочу сперва внянуться в вью, на вервый взгляд его синктакси понравился больше, ну а потом постепенно и в бекенд втянуться
Аноны, в каком возрасте уже поздно втягиваться в веб дев? Ведь в выборе межуд тобой стоит куча вариантов с пездюками
Если например в 30 начать окунаться в веб дев, мне кажется так можно и 40 летним девственником остаться в полнмо одиночестве
В общем после твоего описания могу сказать что не стоит смотреть пидоров самоучек с ютуба, это они так засрали голову что сложно понять то что ты описал без практики, а какая может быть практика у начинающего, спасибо за инфу попробую её усвоить
>jquery
Это кучка оберток и другой интерфейс. Где-то в треде проскакивало, что влезетело это все на фоне недостаточной реализации ванилы, а сейчас уже и ни к чему получается. Не знаю, насколько это правда. Но вообще уже давно за собой заметил, что по jquery даже не задумываюсь гуглить, т.к. проще на ванилке сделать.
>хочешь сказать что тут и jquery неосиляет такие задачи что ты описал
Осиляет не лучше, чем ванила. Jquery, как ты мог бы уже заметить, вообще о другом. Она не дает каких-то новых фич для разработки, просто немного код меняет. Раньше считалось, что в сторону упрощения и лаконичности, сейчас уже практически никем не считается.
Ещё раз спасибо, как будто говно из головы выгрузил и начал понимать что к чему
Ну почему же, если добавить к нему ещё плагины https://plugins.jquery.com/ очень даже чего много нового он можеи предложить, вью пока ещё сильно не изучал, но думаю там не особо много нового будет с чем бы джейквери не справился, посмотрим
>не стоит смотреть пидоров самоучек с ютуба
С этого и стоило начать. В ру сегменте можно максимум 1-2 чела назвать, материалы которых будут полезны. Остальное - инфомусор.
>разработчики cms могут ведь просто закрыть все дыры
Возьмем битрикс. В нем огромная кодовая база отвратительно написанная. Чтобы это привести в человеческий вид, понадобиться минимум х3 времени от разработки битрикса, соответственно бюджеты разработки улетят в небеса.
Бизнесу деньги нужно зарабатывать, а не терять как выше описано. Никто не будет закрывать косяки платформы, пока она продается. А чтобы она продавалась, вбухивают деньги в маркетинг.
Как-то так и приходим к тому, что есть. Отвратительная кодовая база платформы, популярность которой обеспечена маркетингом.
>Неужели эту задачу можно делать годами целым блять отделом дормоедов
Да, вполне можно годами делать гигантов уровня алика.
Какой-нибудь средней величины продукт вполне может потребовать на разработку пару человеколет.
Раньше софт писали десятилетиями в прошлом веке.
Судя по алику, делают его по 1 строчке кода в сутки, как вспомню его вырвиглазные описания когда он только стал на русском языке и охуеваю, что-то уровня веб сайтов 90-х годов с таблицами и розовыми рамками и прочим, неужели этим обмуткам так сложно сделать нормальный редактор для продавцов, чтобы они делали вменяемое описание, а с этих их опечаток и строк с маленькой буквы и кучей пробелов и знаков препинания, как блять иглами по глазам
анчоусы, есть ноутбук на вин10. устанавливал опенсервер, попросил перезагрузиться после становки чтобы заработал серак mysql. в итоге после перезагрузки отвалился вай фай. в устройствах вот че показывает. перезагрузился в xubuntu - там все пашет как часы. в чем может быть трабла?
echo "Снова вопрос от нуба:\n";
№1) http://codepad.org/MdeA8uM6
№2) http://codepad.org/TB3jendg
Операция "$teaBags + 1;" в переменной $teaBagsAfter работает, но если написать форму операции попроще "$teaBags ++" (№2) то получается пи*дец.
Собственно, что я не так написал?
?>
Поясняю. Оператор "++", ещё называется постинкрементом. То есть вначале происходит присвоение значения, после чего идёт увеличение на +1.
https://ideone.com/34kOLI
Так что я в ПЯТОЙ строчке неправильно написал то?
Блин, ощущение что я зря просто ради эксперимента накалякал текст, вдруг там вообще операций ещё не хватает, которые ещё не начал изучать...
Объясняю:
$teaBags = 25;
Тут всё логично, $teaBags ровен 25
$teaBagsAfter = $teaBags ++;
А вот тут идут хитрости: $teaBagsAfter равен $teaBags,то есть 25, после чего происходит инкремент $teaBags на единичку и он становится 26.
АНОН, не хочу утомлять конечно Я БЛ#ЯТЬ НЕ ТУ ССЫЛКУ КИНУЛ! ТАМ ВСЁ ВЕРНО!
У меня вопрос по скриншотам был.
$teaBangsAfter = $teaBangs ++; -вот в этом варианте получается нелогичная ситуация см 2 скрин. - ПОЧЕМУ?
Пожалуйста, вчитайся во-второй скрин
пробую еще раз запилить нормальную ссылку https://ideone.com/Mt0r0V
Постфиксный инкремент сначала возвращает старое значение, а потом меняет существующее. По этому у тебя так и выходит.
Кроме того раз уж ты делаешь с двумя переменными, то тебе не нужно старое значение менять, а инкременты и декременты это делают. На твоем коде лучше подойдет просто $teaBags + 1.
А еще можешь вообще без второй переменной обойтись.
Ну или перди. А чего ты хотел? Обожраться своим смуззи и не пердеть вонюче?
> сосноль
> компостер
> и прочую хуйню
> этот гондон штопаный
> какое говно ему надо
> чтобы это говно наполнилось говном
> типа как в нормальных языках
> с прочим говном
С таким отношением ты даже в PHP не разберешься.
Скажи честно, что Bitrix24 - это CRM система, за которую надо платить каждый год тысячи рублей.
Похер на компанию, для себя живешь, а не для дяди.
Ливай сразу как только завезут битрикс. А лучше превентивными мерами: начать искать другую галеру + обозначить, что с этим говном работать не будешь.
Спасибо, адекватный анон! впредь не буду выдумывать задания себе если надо будет, то поищу в нете, также смотреть о целесообразности как в данном случае.
Моя тян также на работе держит газок. Терпит до прихода домой 12ч, а как придёт - пердит на два этажа вверх-вниз.
У меня походу все виды остеохандроза. Да и думаю у многих тут, просто не все проверяются.
Как-то терплю, но иногда очень бесит, особенно шейный. Иногда вспоминаю и делаю зарядку, но толку от нее ноль.
100% ты делаешь неправильную зарядку, я так один раз в больницу слёг на 2-3 недели (неправильно и не то делал, аж перекосило подбородком к груди).
Советую записаться к ...не массажисту, а покруче, я не помню как у них профессия называется, но некоторые из них обучают всяких ссаненьких массажистов (которые не шарят за работу мышц, костей и т.д.). Короче этот специалист сделает массаж за 1-2к и покажет упражнения которые именно тебе подойдут, то есть индивидуально - А там уже от тебя зависит, я например делаю когда только заболит, хотя надо каждый день делать.
>Две маркетолухички
Можно попытаться намекнуть этому директору, что тебе как программисту виднее.
Тогда без вариантов - меняй контору.
Скорее всего опенсервер не при чем.
>>613334
> Приведите пожалуйста аргументы почему нужно шифровать 100% сообщений?
- в Телеграме те, кто использует секретные чаты, выделяются из толпы и привлекают внимание
- проще шифровать все по умолчанию, чем отправить что-то не то, а потом вспомнить, что шифрование выключено
Если делать шифрование отключаемым, может делать по дефолту его включенным, а далее отключать по желанию?
Насчет поиска и сортировки - интересный аргумент. Ну вот тебе и задачка на проектирование, подумай, реально ли реализовать 1) сортировку 2) поиск при полном шифровании сообщений? Что касается сортировки, то тут точно можно присваивать сообщениям какие-то номера вместо времени. Поиск обычно (без шифрования) делается построением индекса, такого вида:
{ слово -> [список id всех сообщений, где оно есть и позиция в сообщениях ] }
Как минимум реально сделать поиск, если у нас приложение поддерживает локальную БД со всеми сообщениями.
> но как мессенджер сам по себе, нужно признать, чрезвычайно удобен
Значит, у него хорошо продуманный интерфейс и процессы взаимодействия с пользователями.
> Осталось только повторить интерфейс.
Хорошая идея, взять за основу продуманный интерфейс.
> Как рассчитать размер плейсхолдера?
Никак, на то оно и шифрование. Но если мы будет заменять блоки снизу вверх, фиксируя позицию самого нижнего блока, то ничего дергаться не будет (кроме плейсхолдеров, которые никто не читает). Неудобно, когда дергается то, на что человек смотрит.
Можно попробовать другой вариант: внизу уже расшифрованные сообщения, а сверху над ними один плейсхолдер, который поднимается вверх по мере расшифровки. Можно расшифровывать сообщения и заменять плейсхолдеры пачками, используя кеш расшифрованных сообщений.
> А можно назвать ещё проще и лаконичней - party?
Можно, хотя мне показалось, что partner наиболее очевидный вариант.
> А почему нельзя назвать просто и лаконично date? Разве на очевидно что это дата сообщения?
Можно и так, мне показалось, что может быть, со словом send будет еще более очевидно.
> Какие метаданные, помимо даты, вы хотели бы чтобы шифровались?
В идеале - все, что можно.
> Как тестируются параллельное выполнение запросов?
Проще всего сделать скрипт, который шлет запросы без перерыва, и запустить через bash-скрипт несколько его копий. До штук 50-100 скриптов эта схема будет работать, потом могут быть большие накладные расходы на постоянные переключения контекста.
> Тяжело представить что таблица сообщений или конференций поместиться в память, потому что количество записей, в теории, будет катастрофически велико. Как с этим выйдет на практике?
Надо, чтобы хотя бы индексы влезали, а лучше вся таблица. Иначе будет возникать нагрузка на дисковую подсистему, хотя тут SSD и выручает, но он не сравнится по скорости с памятью. Либо писать какие-то свои решения на Си/Раст/Го, которые будут более тесно хранить данные в памяти, но это очень сложно. Если речь о бизнесе, то купить память будет дешевле.
> Я погуглил этот вопрос, и создаётся впечатление что PostgreSQL решает автоматически когда хранить данные в RAM а когда на диске, и предпочтительнее в RAM. Это верно?
В MySQL это просто задается опциями в конфиге. Там есть "пул" (InnoDB Pool) в памяти, в котором кешируются "страницы" - куски таблиц и индексов. Администратор задает размер пула. В Postgres - не знаю, возможно, что она полагается на системный кеш страниц (все современные ОС используют невыделенную память как кеш страниц с диска, то есть при чтении кладут туда страницы и при повторном обращении оттуда же берут: https://habr.com/ru/company/smart_soft/blog/228937/ ). В этом случае объем кеша определяется количеством свободной памяти.
> Следовало бы увеличить количество пользователей до сотен и количество сообщений до тысяч?
Было бы хорошо, так как на сотнях тысяч и миллионах записей могут выскочить какие-то эффекты, которых не было на маленьком кол-ве.
> Будет ли лучше если я вместо выполнения HTTP-запросов создам объекты с помощью Faker и factory-muffin, и выполню все запросы к БД напрямую?
Не знаю, надо попробовать. Быстрее всего будет делать большие INSERT напрямую, но может, и через Доктрину будет приемлемая скорость.
Скорее всего опенсервер не при чем.
>>613334
> Приведите пожалуйста аргументы почему нужно шифровать 100% сообщений?
- в Телеграме те, кто использует секретные чаты, выделяются из толпы и привлекают внимание
- проще шифровать все по умолчанию, чем отправить что-то не то, а потом вспомнить, что шифрование выключено
Если делать шифрование отключаемым, может делать по дефолту его включенным, а далее отключать по желанию?
Насчет поиска и сортировки - интересный аргумент. Ну вот тебе и задачка на проектирование, подумай, реально ли реализовать 1) сортировку 2) поиск при полном шифровании сообщений? Что касается сортировки, то тут точно можно присваивать сообщениям какие-то номера вместо времени. Поиск обычно (без шифрования) делается построением индекса, такого вида:
{ слово -> [список id всех сообщений, где оно есть и позиция в сообщениях ] }
Как минимум реально сделать поиск, если у нас приложение поддерживает локальную БД со всеми сообщениями.
> но как мессенджер сам по себе, нужно признать, чрезвычайно удобен
Значит, у него хорошо продуманный интерфейс и процессы взаимодействия с пользователями.
> Осталось только повторить интерфейс.
Хорошая идея, взять за основу продуманный интерфейс.
> Как рассчитать размер плейсхолдера?
Никак, на то оно и шифрование. Но если мы будет заменять блоки снизу вверх, фиксируя позицию самого нижнего блока, то ничего дергаться не будет (кроме плейсхолдеров, которые никто не читает). Неудобно, когда дергается то, на что человек смотрит.
Можно попробовать другой вариант: внизу уже расшифрованные сообщения, а сверху над ними один плейсхолдер, который поднимается вверх по мере расшифровки. Можно расшифровывать сообщения и заменять плейсхолдеры пачками, используя кеш расшифрованных сообщений.
> А можно назвать ещё проще и лаконичней - party?
Можно, хотя мне показалось, что partner наиболее очевидный вариант.
> А почему нельзя назвать просто и лаконично date? Разве на очевидно что это дата сообщения?
Можно и так, мне показалось, что может быть, со словом send будет еще более очевидно.
> Какие метаданные, помимо даты, вы хотели бы чтобы шифровались?
В идеале - все, что можно.
> Как тестируются параллельное выполнение запросов?
Проще всего сделать скрипт, который шлет запросы без перерыва, и запустить через bash-скрипт несколько его копий. До штук 50-100 скриптов эта схема будет работать, потом могут быть большие накладные расходы на постоянные переключения контекста.
> Тяжело представить что таблица сообщений или конференций поместиться в память, потому что количество записей, в теории, будет катастрофически велико. Как с этим выйдет на практике?
Надо, чтобы хотя бы индексы влезали, а лучше вся таблица. Иначе будет возникать нагрузка на дисковую подсистему, хотя тут SSD и выручает, но он не сравнится по скорости с памятью. Либо писать какие-то свои решения на Си/Раст/Го, которые будут более тесно хранить данные в памяти, но это очень сложно. Если речь о бизнесе, то купить память будет дешевле.
> Я погуглил этот вопрос, и создаётся впечатление что PostgreSQL решает автоматически когда хранить данные в RAM а когда на диске, и предпочтительнее в RAM. Это верно?
В MySQL это просто задается опциями в конфиге. Там есть "пул" (InnoDB Pool) в памяти, в котором кешируются "страницы" - куски таблиц и индексов. Администратор задает размер пула. В Postgres - не знаю, возможно, что она полагается на системный кеш страниц (все современные ОС используют невыделенную память как кеш страниц с диска, то есть при чтении кладут туда страницы и при повторном обращении оттуда же берут: https://habr.com/ru/company/smart_soft/blog/228937/ ). В этом случае объем кеша определяется количеством свободной памяти.
> Следовало бы увеличить количество пользователей до сотен и количество сообщений до тысяч?
Было бы хорошо, так как на сотнях тысяч и миллионах записей могут выскочить какие-то эффекты, которых не было на маленьком кол-ве.
> Будет ли лучше если я вместо выполнения HTTP-запросов создам объекты с помощью Faker и factory-muffin, и выполню все запросы к БД напрямую?
Не знаю, надо попробовать. Быстрее всего будет делать большие INSERT напрямую, но может, и через Доктрину будет приемлемая скорость.
Лучше все-таки с мануальным терапевтом, который тебя помассажирует и ну ты понял составит упражнения
>>619896
По поводу остеохондроза могу одну неочевидную вещь посоветовать - если боли хронические и длятся более трех месяцев, начинайте пить антидепрессанты. Остеохондроз это просто дегенеративные изменения - это не должно болеть, если у вас 1-2 степень. У меня вот 2 степень грудного остеохондроза - были лютейшие боли до антидепрессантов, теперь иногда есть дискомфорт, но в целом болей нет. У друга ему врач в итоге тоже антидепрессанты назначил сначала фенибут правда есть шейный остеохондроз - как я понял, шейный это пиздос, но тоже можно загнать в ремиссию, а болей быть по-хорошему не должно.
Я понял что мне надо найти +7|8 после чего должны быть 10 чисел и между ними могут быть скобки, пробелы или -
И если 10 чисел найти можно просто вписав [0-9]{10} то как сделать так чтобы между ними еще и эти символы находило?
Все что пока что смог сделать это ^(\+ ?7| ?8)([0-9]{10}[- ()]?+)$ , но оно не работает
А лучше скажите как выбрать нормальное кресло для долгого сидения, НУ ЖЕ АНОНЫ
Вообще актуальная тема. Надо в медаче тред поискать для ИТшников. Набор болячек-то у всех одинаковый почти.
Если писать [0-9]{10} то между цифрами не может быть других символов. Но ты можешь использовать здесь круглые скобки, чтобы написать:
(ровно 1 цифра + любые символы){10}
И тогда повторяться 10 раз будет все выражение в круглых скобках.
Спинотред есть, только толку от него мало. Не те подходы к лечению там исповедуют. Глазотред - основной посыл в том, что ко врачу надо идти. Остальные проблемы опциональные.
Почитав и посмотрел эти ваши ютубчики, я понял что писать велосипед заново - это признак дурачка, и что на этих ваших гитхабах уже всё написано и отшлифовано тоннами програмистов, вот и прошу поделиться хорошим движком/модулем на php по сбору статистики + возможность передавать в него свои get данные и всё это через ajax, в моём случае айди пользователя, ну или как подобное искать в гитхабе
Если тебя устраивает стороннее решение, что это Гугл Аналитика или Яндекс Метрика. Ты удивишься от того, сколько там возможностей и какие красивые графики там строятся.
Если не хочется отдавать данные, то установи Piwik к себе.
У тебя задача без конкретики. Не понятно, откуда ты собрался собирать данные, в каком формате хранить.
>передавать в него свои get данные и всё это через ajax
Чё сказал? Какие данные передавать?
Не лезь.
^(\+ ?7| ?8)([0-9]-? ?\(?\)?){10}$
Если попробовать написать в () то оно искать будет ровно 10 символов. То есть если будет номер 8(1)234567890 то регулярка его пропустит из за того что там 12 знаков а не 10. Как сделать чтобы регулярка находила ровно 10 цифр между которыми может быть любое кол-во знаков?
Поясните кто мб сталкивался с интеграцией капчи, не совсем понимаю что должно быть внутри метода вместо '...'
Сап всем, помогите новичку пожалуйста. Написал по обучающему видосику калькулятор на пыхе, но возникает такая ошибка, собственно эта скобочка там должна быть. Может ошибка в построении самих условий, подскажите пожалуйста. Сорри что выкинул код так гит еще не освоил. Номер строки отметил. (с фигурными скобочками так же если что).
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Калькулятор</title>
</head>
<body>
<?php
if($_POST['submit'] )
{
$a = (int)$_POST['first_textbox'];
$b = (int)$_POST['second_textbox'];
$p = $_POST['operation'];
$c = '';
if($p == +) //15
$c = $a + $b;
else if($p == -)
$c = $a - $b;
else if($p == )
$c = $a $b;
else if($p == /)
{
if($b == 0)
echo "You can not divide by zero";
else
$c = $a / $b;
}
else
$c = pow($a , $b);
}
?>
<form action="" method="post">
<input type="textarea" name="first_textbox" required />
<select name="operation" required>
<option value="+">+</option>
<option value="-">-</option>
<option value=""></option>
<option value="/">/</option>
<option value="^">^</option>
</select>
<input type="textarea" name="second_textbox" required />
<br>
<input type="submit" name="submit" />
</form>
<?php
if($c){
echo $c;
}
?>
</body>
<footer>
</footer>
</html>
Сап всем, помогите новичку пожалуйста. Написал по обучающему видосику калькулятор на пыхе, но возникает такая ошибка, собственно эта скобочка там должна быть. Может ошибка в построении самих условий, подскажите пожалуйста. Сорри что выкинул код так гит еще не освоил. Номер строки отметил. (с фигурными скобочками так же если что).
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Калькулятор</title>
</head>
<body>
<?php
if($_POST['submit'] )
{
$a = (int)$_POST['first_textbox'];
$b = (int)$_POST['second_textbox'];
$p = $_POST['operation'];
$c = '';
if($p == +) //15
$c = $a + $b;
else if($p == -)
$c = $a - $b;
else if($p == )
$c = $a $b;
else if($p == /)
{
if($b == 0)
echo "You can not divide by zero";
else
$c = $a / $b;
}
else
$c = pow($a , $b);
}
?>
<form action="" method="post">
<input type="textarea" name="first_textbox" required />
<select name="operation" required>
<option value="+">+</option>
<option value="-">-</option>
<option value=""></option>
<option value="/">/</option>
<option value="^">^</option>
</select>
<input type="textarea" name="second_textbox" required />
<br>
<input type="submit" name="submit" />
</form>
<?php
if($c){
echo $c;
}
?>
</body>
<footer>
</footer>
</html>
Так лучше
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Калькулятор</title>
</head>
<body>
<?php
if($_POST['submit'] )
{
$a = (int)$_POST['first_textbox'];
$b = (int)$_POST['second_textbox'];
$p = $_POST['operation'];
$c = '';
if($p == +)
$c = $a + $b;
else if($p == -)
$c = $a - $b;
else if($p == )
$c = $a $b;
else if($p == /)
{
if($b == 0)
echo "You can not divide by zero";
else
$c = $a / $b;
}
else
$c = pow($a , $b);
}
?>
<form action="" method="post">
<input type="textarea" name="first_textbox" required />
<select name="operation" required>
<option value="+">+</option>
<option value="-">-</option>
<option value=""></option>
<option value="/">/</option>
<option value="^">^</option>
</select>
<input type="textarea" name="second_textbox" required />
<br>
<input type="submit" name="submit" />
</form>
<?php
if($c){
echo $c;
}
?>
</body>
<footer>
</footer>
</html>
Так лучше
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Калькулятор</title>
</head>
<body>
<?php
if($_POST['submit'] )
{
$a = (int)$_POST['first_textbox'];
$b = (int)$_POST['second_textbox'];
$p = $_POST['operation'];
$c = '';
if($p == +)
$c = $a + $b;
else if($p == -)
$c = $a - $b;
else if($p == )
$c = $a $b;
else if($p == /)
{
if($b == 0)
echo "You can not divide by zero";
else
$c = $a / $b;
}
else
$c = pow($a , $b);
}
?>
<form action="" method="post">
<input type="textarea" name="first_textbox" required />
<select name="operation" required>
<option value="+">+</option>
<option value="-">-</option>
<option value=""></option>
<option value="/">/</option>
<option value="^">^</option>
</select>
<input type="textarea" name="second_textbox" required />
<br>
<input type="submit" name="submit" />
</form>
<?php
if($c){
echo $c;
}
?>
</body>
<footer>
</footer>
</html>
>В следующий раз используй Switch
switch ($p)
case '+':
$c=$a+$b;
case '-':
$c=$a==0 or $b==0 ? $a-$b: error;
case '/':
$c=$a/$b
case '':
$c=$a$b
Два чая этому сеньору! Реально, спасибо большое, весь вечер ебался думал что не так, а свитч пока не знаю конструкции думаю буду сейчас разбираться.
Поставлю, спасибо за советы, они мне сейчас бесценные просто,чувствую себя слепым щенком просто
>>620941
Ну смотрите, пользователь заходит на страницу, нажимает кнопочки, а в это время повешанные на них события запускают ajax на url нашего php скрипта и подцепляют к нему уникальные айди, например mysite.ru/stat.php?iduser=2281488, а этот скрипт сохраняет в бд его айкпи, страницу с которой был запрос, его айди и ещё чего небудь, а потом я пишу админку или она может быть со скриптом, где я удобно смогу с какого url было больше всего запросов, какой пользователь какие урл посмотрел и сколько раз нажал заскриптованную кнопку, ну и с каких айпи на какие url были запросы, плюс можно сохранить их юзерагент чтобы отловить ботов и забанить их нахуй и в пизду по айпи, можно самому написать, но мне кажется это уже 100500 написали и отшлифовали на гитхабе, а всякие метрики и гугланалитики это для пидорасов и хипстеров с магбуком
Ну да, похоже на гугл/яндекс аналитику. Ими и пользуются для подобных задач.
>всякие метрики и гугланалитики это для пидорасов и хипстеров с магбуком
Тыскозал?
Возня с мокрописьками - недойстойное занятие. Да и нех привыкать вообще.
Проще тот же NetBeans поставить, благо он бесплатный и есть поддержка пхп, да и вообще веба.
https://laravel-news.com/laravel7
А я 6 версию только учу. Что делоть теперь? Доучивать шестую или сразу на седьмую?
Пасиб за совет.
говно - фичи, которые ты скорее всего не будешь использовать
Да бля анон нуне тупи, мне нужно просто чтобы при нажатии на нужную кнопку на скрипт отсылало уникальное айди и сам скрипт вдобавок записывал айпи с которого был запрос, то есть нажата кнопка и вносило в базу данных айпи, айдишник отосланный скрипту и ещё что-нибудь полезное заодно, например браузер и операционку, причём блять тут анальная метрика и аналитика? Мне это нужно для отлова багов и чтобы знать с какого устройства был юзер и с какйо страны, чтобы повторить баг, ну ёптвоюмать, или подскажи подобный скрипт или если знаешь скажи что таких готовых на гите нет и всё равно придётся писать свой
Сам пиши.
Сам пиши всё - и скрипты для этого, и админку не забудь, и базу задеплой под это дело. Ты ж знатный велосипедист, как я посмотрю.
Да ты гонишь, зачем мне для этих целей метрика и аналитика, я хочу статистику для выяления багов собрать, а не сливать своих юзеров в анальное рабство яндексу и гуглу, на вот вкуси немного своих корпораций добра https://www.youtube.com/watch?v=S8GlJk-wHSU
>пачаны, дайте мне плагин для сбора статистики
>вот тебе от гугла и яндекса - удобная админка, пользуются даж домохозяйки
>не хочу, дайте другое
Ищи сам.
Товарищ майор, идите нахуй, я не вас спрашивал, а анонов.
Я писал выше, есть piwik - это как гугл аналитика, но без гугла, на своем собственном сервере, open source.
Спасибо анон, но как-то слишком элитно, я думал о чём-то более крестьянском и простом, в админке тупо табличка где от самых кликабельных страниц с моим уникальным айди для каждой страницы к менее кликабельным и как доп информация это айпи/страна, браузер и система, мне хватит и этого, ладно я так понимаю аноны не подскажут, придётся писать самому, изобретать очереднйо велосипед, но я всё равно уверен что кто-то уже писал подобное
Поддвачну вопрос. Какая-то контора whatshelp искала к себе асинхронщика на пхп, что поставило меня в ступор. Ессесна мне перезвонили.
Ну так говорят те кто настраивают бэк уровня амазона, где тебе на халяву дали БД с 10 таблицами и коннекты прописали. Считай аникеи среди JS. Те у кого опыт год и более уже так не говорят. Хотя конечно ебанаты находятся и среди них, но это уже клиника.
У него там Ларавель везде, а я сейчас его только изучаю сделал углублённый квикстарт с одного сайта, повозившись с совместимостью версий немного, немного копался с CodeIgniter оче простой оказался. Делал студентов и хостинг на Слиме.
Есть смысл ломиться на вакансию, как думаете? Не уверен, что там старший программист будет.
мне теперь кажется что ты работал сам в 1с и в частности над движком битрикса раз знаешь как там вся кухня устроена
Ребят а сегодня я вам покажу как рейджнуть всего за четрые строки. А сделаем мы это на моем любимом языке пайтон
>Senior PHP Developer (Yii2)
>Зарплата
От 2>40 000 до 290 000 ₽
https://career.habr.com/vacancies/1000051562
Не устаешь часами сидеть-пердеть над кодом?
Есть такие кто устает? - Как борешься с усталостью? Может энергетический напиток пьешь или кофе?
Он уже умер. Это на легаси разраба хотят.
Вот и я не хочу один сидеть без советов мудрых, но местные галеры не выкидывают вакансии для джунов.
Посижу с неделю - мож появится чего нормальное. К тому же приболел горлом кажись, может и к добру.
Бля, прочитал это его ебаным голосом
>сколько часов в день работаешь?
14
>Сколько выходных выпадает?
Сколько захочу.
>Не устаешь часами сидеть-пердеть над кодом?
Нет.
>Может энергетический напиток пьешь или кофе?
Если не укладываюсь в 12 часов завершить задачу - пью бёрн, даёт ещё 8 часов.
Пришёл спросить как искать готовые скрипты статистики на гитхабе или совета хорошего простого скрипта, что не так? Для этого же тред и создан
Ну кинь эксепшен, если вводные зайдут за допустимые границы
руби
Есть работа. Пишите в tg: snekl
Напилили. Там уже и строгая типизация и DI/CI, статический анализ, трейты, нормальное ООП (js нервно курит, кстати), нормальные вменяемые фреймворки, а не cms-поделия, git workflow можно организовать по-человечески и т.п. Он вообще очень стал похож на Java. Так что ты считаешь его богомерзким просто потому, что нихуя о нем толком не знаешь, видимо.
Дан массив целых чисел. Вернуть индексы двух чисел, таких, что их сумма равна target.
Можете считать, что существует только одно решение. Нельзя использовать один и тот же элемент несколько раз (то есть решить без вложенных for'ов).
Пример:
Дано nums = [2, 7, 11, 15], target = 9,
Так как nums[0] + nums[1] = 2 + 7 = 9,
То return [0, 1].
Заготовочка для кода:
class Solution {
/
@param Integer[] $nums
@param Integer $target
@return Integer[]
/
function twoSum($nums, $target) {
}
}
Оригинал текста, если нужен, это мой вольный перевод:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
Дан массив целых чисел. Вернуть индексы двух чисел, таких, что их сумма равна target.
Можете считать, что существует только одно решение. Нельзя использовать один и тот же элемент несколько раз (то есть решить без вложенных for'ов).
Пример:
Дано nums = [2, 7, 11, 15], target = 9,
Так как nums[0] + nums[1] = 2 + 7 = 9,
То return [0, 1].
Заготовочка для кода:
class Solution {
/
@param Integer[] $nums
@param Integer $target
@return Integer[]
/
function twoSum($nums, $target) {
}
}
Оригинал текста, если нужен, это мой вольный перевод:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
А нахрена ты сюда это несёшь, небаран? Тебя просили об этом или ты думаешь, что народ задачки по пхп найти в интернете не может?
Сейчас бы порешать задачки с литкода вместо пета и тестовых. Это же полезнее в разы.
В тред вкатывается NodeJS-макака с 2 годами опыта, хочу стать мультиязычным, да и скоро переведут на проект с PHP + Laravel.
Подкиньте каких-то видео-курсов по ларке, по которым можно будет быстренько начать круды хреначить с рестами, готов даже на платные курсы, лишь бы прок был.
Да хуй знает нужна или нет, просто клиент тот же, но у него помимо приложух на ноде оказалась где-то пыха, которую саппортит один чувак, и вот меня ему в довесок накинули.
Я просто упомянул, что в 2017 писал на пыхе модуль для вордпресса и завертелось
>Я просто упомянул, что в 2017 писал на пыхе модуль для вордпресса и завертелось
Сам себе могилу вырыл. Сидел бы на ноде.
Я б уже подыскивал другую работу, если б мне дали неинтересующий меня стек.
Да я не говорил, что не интересующий, потому и мануалы ищу, говорю ж, хочу мультиязычным быть. Полгода так писал на джаве
Я вообще NodeJS бэкенд-макака, чистого опыта на нем - 2+ года. Но в остальном иногда прыгаю по другим проектам с другими стеками, ибо мне это интересно, так полгода писал на джаве, где-то три месяца на питоне, вот скоро на пыху прыгнуть хочу
Если интересно, то збс.
Просто странно из одной динамики прыгать в другую, тем более в пыху (с её то зп)
Где быстрее вставка элемента - в аррейлисте или линкедлисте? Если сходу не ответил, рекомендую вкатиться хоть в один стек глубоко. Если ответил, окей, прыгай, если нравится.
Пушка, спасибо, анончик
Советую выкатываться из пхп нахуй и катиться обратно в джаву. Нехуй тут делать, уж поверь.
И там жизнь довольно примитивная, учитывая, как (не) много можно сделать по сравнению с Java, или, не дай бог, C++.
Для задач веба и небольшого тырпрайза хватит
Так мне не надо много или нет, мне надо задачи на конкретном проекте решать
Тогда сам и решай.
Нехватало чтобы какие-то васяны нам тут с умным видом чужие задачки несли.
Moжнo ли aвтoмaтичecки измeнять вид блoкa, ecли oн cмecтилcя вниз? Дoпуcтим, ecть 4 дивa, нa бoльшoм экpaнe oни pacпoлoжeны пo гopизoнтaли. Пpи умeньшeнии экpaнa пocлeдний див cпoлзaeт вниз. Boт мoжнo ли кaк-тo oтcлeдить этoт мoмeнт и измeнить вид cпoлзшeгo элeмeнтa? Дoбaвить бopдep-тoп, нaпpимep.
В CSS можно, узнав размер экрана. Через JS можно, узнав координаты (это хуевый способ, не делай так).
Да, я вижу, что ты несколько раз постил, а я не проверил. У меня просто иногда не хватает времени, и я не успеваю все проверить.
Если есть возможность, то корнем (DocumentRoot) веб-сервера стоило бы сделать папку public - тогда будут не нужны всякие RewriteBase, из-за которых твой проект надо располагать в папке с определенным названием. А также, в этом случае файл конфига будет за пределами корневой папки. Сейчас он защищен в htaccess, но надежнее, когда он в принципе не доступен снаружи.
> DEFAULT CHARSET=utf8;
Стоит переходить на utf8mb4, погугли про отличия от utf8.
> https://github.com/deadj/student-list/blob/master/src/autoloader.php
тут можно сделать один автозагрузчик, перебирающий папки в цикле.
В роутере стоит извлечь из URL только путь (PATH), например, функцией parse_url() - и тогда не надо будет беспокоиться о параметрах после знака вопроса и добавлять их в регулярку.
> $segments = explode('/', preg_replace("~$urlPattern~", $path, $uri));
Не лучше ли тут просто разбивать на части $path без вызова preg_replace?
> $firstStudent = $this->getFirstStudent();
Тут было бы логично передать внутрь $page, чтобы не получать эту переменную дважды в разных местах контроллера.
exit() лучше бы не ставить в контроллере - а вдруг в роутере ты захочешь что-то сделать после выполнения контроллера (например, померять и сохранить время генерации страницы).
> private function highlightWord(string $search, string $cellValue): string
> $pattern = '/' . $value . '/ui';
Есть ли тут гарантия, что в value нет спецсимволов (звездочек, бекслешей, скобок)? Если гарантии нет, то при подстановке переменной в регулярку надо экранировать специмволы с помощью preg_quote(). Она экранирует символы так:
Было: hello[world]+\b
Стало: hello\[world\]\+\\b
После нее все символы теряют специальное значение и соответствуют просто символам. Если ты наблюдателен, то заметил, что экранирование при подстановке переменных делается почти в любой ситуации (при вставке в HTML, в SQL запрос, в параметр URL), просто каждый раз используются разные функции.
Функции вроде highlightWord() имеет смысл выносить в класс-помощник, сделанный по паттерну Utility Class, чтобы этот код можно было вызывать из других мест программы.
В highlightWord есть недостаток: тут возможна ситуация, когда мы на первом шаге цикла вставляем тег mark, а на втором заменяем его кусок на что-то. Также возможно двойное экранирование: на первом шаге мы что-то экранируем, а на втором шаге делаем замену и экранируем еще раз. Также, часть строки, которая не соответствует регулярке, не экранируется.
Попробуй протестировать свою функцию, давая ей на вход куски строк со спецсимволами вроде < и > и проверяя, экранируются ли они на выходе или нет. А также, давая слова вроде mark или lt и проверяя, не происходит ли некорректных замен кусков тегов.
То есть, экранирование делается непредсказуемо. Вот, что можно сделать:
1) попробовать разбить строку на куски, состоящие из искомых слов и кусков между ними (например, функцией preg_split с выражением вида /слово1|слово2|слово3/). Затем каждый кусок экранировать и склеить, вставив между ними теги mark.
То есть, дана фраза "Иванов Иван" и поисковое слово "ива" -> получаются куски "Ива", "нов ", "Ива", "н".
2) сначала заэкранировать всю строку, а потом делать вставку тегов mark уже в экранированную строку.
3) заэкранировать строку. Подготовить массив замен (тоже с экранированными словами) вида [экр. слово => <mark>экр. слово</mark>] и одним действием сделать замену функцией вроде strtr(). Этим мы защищаемся от ситуации, когда мы пытаемся сделать замену в самом теге mark.
Если у тебя есть идеи, как сделать проще, предлагай. Тут, конечно, лучше всего подошло бы простое решение, где было бы очевидно, что замены делаются всегда корректно.
> if (isset($_COOKIE['id']) && $studentTable->checkId($_COOKIE['id']) == 1) {
Функции, связанные с авторизацией (проверка авторизации, установка авторизации, очистка) - надо выносить в отдельный класс в виде функций, а не размазывать по коду.
Вместо кучи функций вида getLastName(string $id), getGender(string $id), ... лучше сделать одну функцию, которая загружает одну строчку со всеми полями из БД и заполняет из нее объект студента. И одну для сохранения студента обратно в БД.
> $id = md5(rand(0, 1000000) rand(0, 100000));
Здесь md5 никакой пользы не несет. У тебя источник случайности - два числа, и оттого что ты возьмешь md5, число вариантов не увеличится, просто идентификатор удлинится и все. То есть md5 тут бесполезен. Чтобы получить полностью случайный идентификатор, надо каждый символ в нем генерировать случайно.
> header("Location: /student-list/register?notify=$done");
В ссылках не может быть пробелов, спецсимволы надо экранировать через urlencode() перед подстановкой. Плюс, тут есть уязвимость, что злоумышленник может сформировать ссылку, которая покажет любой текст, и тем самым ввести пользователя в заблуждение. Лучше передавать код сообщения вроде 'registered', и брать сообщение из массива по этому коду.
Ты в RegisterController представляешь студента то в виде объекта, то в виде массива (getEmptyStudentInformation()). Удобнее использовать везде одно представление - в виде объекта.
> checkStudentData($student, "add")
В таких случаях надо использовать константы вместо строк (Validator::ACTION_ADD).
> return $result->fetch_assoc()['COUNT()'];
Проще использовать fetch_row с индексом 0.
> public function checkId(string $id): int
Тут логичнее возвращать тип bool (true/false), а функцию назвать более явно: doesIdExist() или isValidId().
> addStudentsToObjectsArray(object $students)
Здесь в качестве типа можно указать класс mysqli_result, а не просто object.
> if ($accommodation != "local"
Здесь стоило бы сделать константу вроде Student::ACCOMODATION_LOCAL. Константы лучше "магических" строк тем, что защищают от опечаток (PHP выдаст ошибку в этом случае), а также по коду видно, какие константы доступны.
> [а-яё]|[ ]|[-]
Это можно объединить: [а-яё \-]
> mb_strlen($groupNumber < 2
Скобку забыл поставить.
> !preg_match('/\\d+/ui'
Без ^$ это выражение просто проверяет наличие цифр, но не отсутствие других символов.
> <?php if (isset($errors['firstName'])): ?>
> <?php else: ?>
Здесь плохо, что input с кучей атрибутов копипастится два раза. Это неудобно, так как при правках тебе придется делать в два раза больше работы. Нужно избегать копипасты тут.
Да, я вижу, что ты несколько раз постил, а я не проверил. У меня просто иногда не хватает времени, и я не успеваю все проверить.
Если есть возможность, то корнем (DocumentRoot) веб-сервера стоило бы сделать папку public - тогда будут не нужны всякие RewriteBase, из-за которых твой проект надо располагать в папке с определенным названием. А также, в этом случае файл конфига будет за пределами корневой папки. Сейчас он защищен в htaccess, но надежнее, когда он в принципе не доступен снаружи.
> DEFAULT CHARSET=utf8;
Стоит переходить на utf8mb4, погугли про отличия от utf8.
> https://github.com/deadj/student-list/blob/master/src/autoloader.php
тут можно сделать один автозагрузчик, перебирающий папки в цикле.
В роутере стоит извлечь из URL только путь (PATH), например, функцией parse_url() - и тогда не надо будет беспокоиться о параметрах после знака вопроса и добавлять их в регулярку.
> $segments = explode('/', preg_replace("~$urlPattern~", $path, $uri));
Не лучше ли тут просто разбивать на части $path без вызова preg_replace?
> $firstStudent = $this->getFirstStudent();
Тут было бы логично передать внутрь $page, чтобы не получать эту переменную дважды в разных местах контроллера.
exit() лучше бы не ставить в контроллере - а вдруг в роутере ты захочешь что-то сделать после выполнения контроллера (например, померять и сохранить время генерации страницы).
> private function highlightWord(string $search, string $cellValue): string
> $pattern = '/' . $value . '/ui';
Есть ли тут гарантия, что в value нет спецсимволов (звездочек, бекслешей, скобок)? Если гарантии нет, то при подстановке переменной в регулярку надо экранировать специмволы с помощью preg_quote(). Она экранирует символы так:
Было: hello[world]+\b
Стало: hello\[world\]\+\\b
После нее все символы теряют специальное значение и соответствуют просто символам. Если ты наблюдателен, то заметил, что экранирование при подстановке переменных делается почти в любой ситуации (при вставке в HTML, в SQL запрос, в параметр URL), просто каждый раз используются разные функции.
Функции вроде highlightWord() имеет смысл выносить в класс-помощник, сделанный по паттерну Utility Class, чтобы этот код можно было вызывать из других мест программы.
В highlightWord есть недостаток: тут возможна ситуация, когда мы на первом шаге цикла вставляем тег mark, а на втором заменяем его кусок на что-то. Также возможно двойное экранирование: на первом шаге мы что-то экранируем, а на втором шаге делаем замену и экранируем еще раз. Также, часть строки, которая не соответствует регулярке, не экранируется.
Попробуй протестировать свою функцию, давая ей на вход куски строк со спецсимволами вроде < и > и проверяя, экранируются ли они на выходе или нет. А также, давая слова вроде mark или lt и проверяя, не происходит ли некорректных замен кусков тегов.
То есть, экранирование делается непредсказуемо. Вот, что можно сделать:
1) попробовать разбить строку на куски, состоящие из искомых слов и кусков между ними (например, функцией preg_split с выражением вида /слово1|слово2|слово3/). Затем каждый кусок экранировать и склеить, вставив между ними теги mark.
То есть, дана фраза "Иванов Иван" и поисковое слово "ива" -> получаются куски "Ива", "нов ", "Ива", "н".
2) сначала заэкранировать всю строку, а потом делать вставку тегов mark уже в экранированную строку.
3) заэкранировать строку. Подготовить массив замен (тоже с экранированными словами) вида [экр. слово => <mark>экр. слово</mark>] и одним действием сделать замену функцией вроде strtr(). Этим мы защищаемся от ситуации, когда мы пытаемся сделать замену в самом теге mark.
Если у тебя есть идеи, как сделать проще, предлагай. Тут, конечно, лучше всего подошло бы простое решение, где было бы очевидно, что замены делаются всегда корректно.
> if (isset($_COOKIE['id']) && $studentTable->checkId($_COOKIE['id']) == 1) {
Функции, связанные с авторизацией (проверка авторизации, установка авторизации, очистка) - надо выносить в отдельный класс в виде функций, а не размазывать по коду.
Вместо кучи функций вида getLastName(string $id), getGender(string $id), ... лучше сделать одну функцию, которая загружает одну строчку со всеми полями из БД и заполняет из нее объект студента. И одну для сохранения студента обратно в БД.
> $id = md5(rand(0, 1000000) rand(0, 100000));
Здесь md5 никакой пользы не несет. У тебя источник случайности - два числа, и оттого что ты возьмешь md5, число вариантов не увеличится, просто идентификатор удлинится и все. То есть md5 тут бесполезен. Чтобы получить полностью случайный идентификатор, надо каждый символ в нем генерировать случайно.
> header("Location: /student-list/register?notify=$done");
В ссылках не может быть пробелов, спецсимволы надо экранировать через urlencode() перед подстановкой. Плюс, тут есть уязвимость, что злоумышленник может сформировать ссылку, которая покажет любой текст, и тем самым ввести пользователя в заблуждение. Лучше передавать код сообщения вроде 'registered', и брать сообщение из массива по этому коду.
Ты в RegisterController представляешь студента то в виде объекта, то в виде массива (getEmptyStudentInformation()). Удобнее использовать везде одно представление - в виде объекта.
> checkStudentData($student, "add")
В таких случаях надо использовать константы вместо строк (Validator::ACTION_ADD).
> return $result->fetch_assoc()['COUNT()'];
Проще использовать fetch_row с индексом 0.
> public function checkId(string $id): int
Тут логичнее возвращать тип bool (true/false), а функцию назвать более явно: doesIdExist() или isValidId().
> addStudentsToObjectsArray(object $students)
Здесь в качестве типа можно указать класс mysqli_result, а не просто object.
> if ($accommodation != "local"
Здесь стоило бы сделать константу вроде Student::ACCOMODATION_LOCAL. Константы лучше "магических" строк тем, что защищают от опечаток (PHP выдаст ошибку в этом случае), а также по коду видно, какие константы доступны.
> [а-яё]|[ ]|[-]
Это можно объединить: [а-яё \-]
> mb_strlen($groupNumber < 2
Скобку забыл поставить.
> !preg_match('/\\d+/ui'
Без ^$ это выражение просто проверяет наличие цифр, но не отсутствие других символов.
> <?php if (isset($errors['firstName'])): ?>
> <?php else: ?>
Здесь плохо, что input с кучей атрибутов копипастится два раза. Это неудобно, так как при правках тебе придется делать в два раза больше работы. Нужно избегать копипасты тут.
И еще, у тебя при переходе с 1 на 2 страницу меняется направление сортировки с desc на asc почему-то.
Flex или Grid
Мой ход суждений выглядит следующим образом. Функцию может вызывать либо тот, кто имеет к ней доступ, т. е. программист, либо пользователь приложения. Программист может изменить сообщение об ошибке в исходном коде, а пользователю менять сообщение, как правило, вообще незачем.
Также я вижу только один возможный вариант, когда файл может быть не найден - когда путь к файлу прописывается вручную. Пользователь кидает все через <input>, а если речь идет о программисте, то ему опять же проще поправить путь в исходнике.
Подскажите, пожалуйста, что я упустил из виду.
Также какое преимущество имеет разделение ответственности, если при ошибке (отсутствие файла) результат все равно тот же - мы завершаем скрипт через тот же die() и пользователь функции все так же не имеет никакого выбора?
>Функцию может вызывать либо тот, кто имеет к ней доступ, т. е. программист, либо пользователь приложения.
Когда говорят о пользователях куска кода - имеют ввиду других разработчиков, а не пользователей приложения на том конце.
>результат все равно тот же - мы завершаем скрипт через тот же die() и пользователь функции все так же не имеет никакого выбора?
Это как раз сейчас так.
Если же возвращать результат (да даже выбрасывать исключение) - то уже пользователь решает как поступить дальше. Может вообще наплевать на это и какие-нибудь моки подсунуть например. Или же это вообще валидная ситуация, так сказать "а юзеров то пока что и нет". Вариантов сколько хочешь, даже вон на картинке пара штук приведена, а не только собственно die.
Алсо, die это вообще хуйский способ завершения выполнения скрипта, т.к. во многих прилогах есть такая штука, как жизненный цикл, который даже в случае ошибки по хорошему должен отрабатывать. die же просто рубит с плеча, грязное завершение, аналогичное падению. А допустим это вообще совсем чужая библиотека, которая по каким-то причинам валит весь твой код, потому что кто-то когда-то не захотел разделить овтетственность. Ты бы сам захотел, чтобы нечто левое решало, когда умирать всему твоему приложению? А ведь ты всего-лишь пытался массив юзеров или чего-то еще подтянуть.
В конце концов функция попросту делает не то, что обещает из названия, тем самым порождая неожиданный сайд эффект. Можешь сделать loadUsersFromFileOrDie например функцию, в противовес этой, но врядли ей реально кто-то станет тогда пользоваться.
Хочешь начать писать под платформу - начни писать под неё. По ходу разберёшься.
Спасибо за внимание, анон! Я делаю вывод, что любая (custom) function должна по-хорошему что-то возвращать.
Другой вопрос. Тут при наследовании от встроенного класса Exception указывается backslash - \Exception. Тут есть какая-то особая мотивация? Спрашиваю, потому что без слеша все также работает.
>любая (custom) function должна по-хорошему что-то возвращать
Не обязательно. Только если там есть, что обработать. В прошлом примере это либо список юзеров, либо наличие ошибки или типа того. Полно функций, которые не возвращают вообще ничего. Например какая-ниюудь функция логирования, которая допустим тебе в файл пишет что-то. Ты ее просто вызываешь и дальше идешь, как ни в чем не бывало.
>Тут при наследовании от встроенного класса Exception указывается backslash - \Exception. Тут есть какая-то особая мотивация?
Да, есть. \Exception - это явное указание на класс Exception из корневого неймспейса. А просто Exception это либо из корневого, либо из текущего неймспейса. Если в текущем неймспейсе будет объявлен Exception собственный (именно с таким именем), то без слеша подцепит именно его, а не корневой. Корневой в данном случае это базовый из пхп.
>либо из корневого, либо из текущего неймспейса
Забыл добавить, что так же может быть не из текущего, а из юзингов.
К примеру:
use app\Exception;
или
use app\CustomException as Exception;
В этом случае так же явное указание корневого неймспейса через \Exception так же помогает. Имя одно может быть, а получить ты хочешь что-то конкретное, и поэтому так конкретизируешь. В корневом неймспейсе еще куча всего лежит, не только исключения.
Если б пхп умел получать элементы дом-дерева и накидывать стили, он же не умеет? то жс не нужен был бы. Хотя у него синтаксис приятнее.
Да, ты можешь поменять условия задачи, если тебе так удобнее. Главная идея там - научиться работать с большими проектами, где много таблиц, сущностей, форм, правил валидации.
Советую вначале продумать функционал и написать требования, а только потом их реализовывать. Ну и не строить поначалу наполеоновских планов, а начинать с минимального функционала.
>>628506
Языки разные, так как придуманы разными людьми. Много языков - это хорошо, так как в результате конкуренции и отбора остаются наиболее подходящие для своих целей, появляются какие-то новые идеи.
>>628584
Не понял вопрос. Значение false нельзя вывести с помощью echo (к тому же, preg_match возвращает числа 0 или 1 - количество найденных совпадений, а не true/false). Можно разве что вывести строчку echo "false"; если тебе это зачем-то нужно.
Если ты хочешь выводить, что именно в номере не так - то надо как-то отдельно это определять. Например, считать число цифр и предупреждать, если их не 11. Или отдельными регулярками проверять другие части номера. То есть надо вместо одного сопоставления с регуляркой делать N проверок (что нет лишних символов, что цифр 11, что в начале +7 или 8 итд) и при неудаче проверки -
выводить сообщение.
Подскажите нубу.Cтавлю отрицание в условии выводит "hui", убираю отрицание тоже выводит "hui". Если поменяешь $a с 2 на 3 то все работает как надо.Почему так? Сам допереть не могу)
<?php
$a=2;
if(!$a % 2 == 0){
echo "hui";
}
Ты точно правильно написал условие?
У тебя сейчас оно читается так: НЕ-$a (а == 2, значит не-а равно false с приведением к 0 делить с остатком на 2 == 2)
Тоесть у тебя вообще всегда там будет true в условии, вне зависимости от переменной а. Перенеси отрицание к !==
Проебался с пояснением че там в ифе, короче, надеюсь, ты поймешь
Боль в каждом предложении.
Нихуя не понял, разве что нужно отрицание к знаку неравенства поставить.
Хочу сделать проверку числа на четное нечетное, мне надо найди нечетное. Хотел одним условием обойтись(чтобы не писать else), поэтому поставил отрицание.
Вот так собственно работает.
$a=2;
if ($a%2 !== 0)
echo 'чётное';
>>629099
>Не равен вернее.
Да
Проебался заместо echo будет return, и он мне вернет нечетное число.
Надо писать if (!($a % 2 == 0)) так как иначе из-за приоритетов операторов это воспринимается как
if ((!$a) % 2 == 0)
Почитать про приоритеты: https://www.php.net/manual/ru/language.operators.precedence.php
Если не договаривались о дедлайне проверки, то хоть каждый день пиши им/звони
Привет, подскажите начинающему:
Сильно страшно, если я двойные скобки пишу и && вместо просто and?
В гайде рекомендуют писать так, например: ((условие) == (условие)), ((условие) && (условие)) и т.д.
Ещё кстати не знал о ">=" и "<=" ( в гайде пока не наблюдается)
Так что за это тапками не кидать!
На этом уровне может быть и да. Но в целом - нет. exit(die) это вообще моветон. Буквально в следующих уроках ты узнаешь о функциях и вопрос отпадет. А потом и о классах. После этого у тебя возникнут другие вопросы наверняка. Просто сначала дочитай до конца.
Понял, спасибо отписавшимся.
Кстати в пхп методы класса можно вызывать только через стрелочку? ->
Почему вообще ушли от процедурного метода? Это же приятнее, чем тонна папок с контроллерами и виверами
>> Приведите пожалуйста аргументы почему нужно шифровать 100% сообщений?
>
>- в Телеграме те, кто использует секретные чаты, выделяются из толпы и привлекают внимание
>- проще шифровать все по умолчанию, чем отправить что-то не то, а потом вспомнить, что шифрование выключено
>
>Если делать шифрование отключаемым, может делать по дефолту его включенным, а далее отключать по желанию?
>
>Насчет поиска и сортировки - интересный аргумент.
У меня не будет шанса объяснить пользователям что это не приложение тормозит, а происходит дешифровка.
Он мёртвый русский, это была агония
Перекатываемся, тред скоро удалится:
https://2ch.hk/pr/res/1630065.html (М)
https://2ch.hk/pr/res/1630065.html (М)
https://2ch.hk/pr/res/1630065.html (М)
>>631944
Это делается директивой DocumentRoot. Если открыть ее описание, то видно, где ее можно размещать: https://httpd.apache.org/docs/2.4/mod/core.html
> Context:server config
(щелкнув по ссылке)
> server config
> This means that the directive may be used in the server configuration files (e.g., httpd.conf), but not within any <VirtualHost> or <Directory> containers. It is not allowed in .htaccess files at all.
То есть нужно править конфиг сервера, на хостинге это делается как-то через панель управления. Если ты поднял Апач у себя, то просто редактируется файл в /etc/apache2/ (иногда на каждый хост делается отдельный файл) из-под админа.
>>629813
> У меня не будет шанса объяснить пользователям что это не приложение тормозит, а происходит дешифровка.
Ну ок. Вообще, есть еще вариант попробовать поменять алгоритмы шифрования. Асимметричное шифрование медленное. Потому часто (например, в SSL (и в HTTPS)) с помощью асимметричного шифрования шифруют только ключ, который используется в быстром алгоритме симметричного шифрования. А сообщения уже шифруют симметричным ключом.
То есть, можно сделать так:
1) создатель беседы генерирует для нее ключ
2) шифрует его публичными ключами собеседников (включая свой публичный ключ) и сохраняет полученные копии на сервер
3) шифрует сообщения в беседе симметричным шифрованием с этим ключом
4) все собеседники скачивают с сервера свою копию зашифрованного ключа и расшифровывают эту копию своим приватным, после чего расшифровывают сообщения
В такой схеме не нужно генерировать отдельную копию сообщения каждому собеседнику. Возможно, тут есть какие-то слабости, и стоит внимательно все продумать. Можно для надежности раз в N часов/дней генерировать новый ключ беседы.
Можно почитать по этой теме про протокол Диффи-Хеллмана - там похожая ситуация.
Если тебе интересно поломать над этим голову, можешь попробовать сделать. Если нет - можно, как ты предлагаешь, просто сделать шифрование включаемым по желанию.
>>631944
Это делается директивой DocumentRoot. Если открыть ее описание, то видно, где ее можно размещать: https://httpd.apache.org/docs/2.4/mod/core.html
> Context:server config
(щелкнув по ссылке)
> server config
> This means that the directive may be used in the server configuration files (e.g., httpd.conf), but not within any <VirtualHost> or <Directory> containers. It is not allowed in .htaccess files at all.
То есть нужно править конфиг сервера, на хостинге это делается как-то через панель управления. Если ты поднял Апач у себя, то просто редактируется файл в /etc/apache2/ (иногда на каждый хост делается отдельный файл) из-под админа.
>>629813
> У меня не будет шанса объяснить пользователям что это не приложение тормозит, а происходит дешифровка.
Ну ок. Вообще, есть еще вариант попробовать поменять алгоритмы шифрования. Асимметричное шифрование медленное. Потому часто (например, в SSL (и в HTTPS)) с помощью асимметричного шифрования шифруют только ключ, который используется в быстром алгоритме симметричного шифрования. А сообщения уже шифруют симметричным ключом.
То есть, можно сделать так:
1) создатель беседы генерирует для нее ключ
2) шифрует его публичными ключами собеседников (включая свой публичный ключ) и сохраняет полученные копии на сервер
3) шифрует сообщения в беседе симметричным шифрованием с этим ключом
4) все собеседники скачивают с сервера свою копию зашифрованного ключа и расшифровывают эту копию своим приватным, после чего расшифровывают сообщения
В такой схеме не нужно генерировать отдельную копию сообщения каждому собеседнику. Возможно, тут есть какие-то слабости, и стоит внимательно все продумать. Можно для надежности раз в N часов/дней генерировать новый ключ беседы.
Можно почитать по этой теме про протокол Диффи-Хеллмана - там похожая ситуация.
Если тебе интересно поломать над этим голову, можешь попробовать сделать. Если нет - можно, как ты предлагаешь, просто сделать шифрование включаемым по желанию.
Объект - это данные (поля, переменные) и набор методов (функций) для работы с ними. Класс - это описание объекта: какие поля, какие методы в нем есть. Все объекты одного класса имеют одинаковый набор и названия полей, но значения в них могут быть разные.
В ОП-посте есть учебник, в нем есть глава про ООП, там все объясняется с нуля, советую прочитать и решить задачи оттуда.
>>629727
Конфиг стоит добавить в проект, хотя бы чтобы другие разработчики могли на него посмотреть.
> если есть какие-то наносервисы на ноде, например для ресайза и оптимизации картинок, как это дело лучше версионировать в связке с остальным приложением?
Есть два подхода: все в одном большом репозитории или отдельные репозитории на каждый сервис. С конфигами - не знаю. По идее, для них можно завести отдельный репозиторий, так как с микросервисами конфигов может быть много, и из репозитория разливать их куда требуется. Но я такое не проверял на практике.
Если не хочется использовать Докер, можно написать bash-скрипт, который запустит нужные сервера вроде такого:
php -S 127.0.0.1:9001 .... &
# сохраняем PID процесса
PHP_PID=$?
npm start-server .... &
NODE_PID=$?
При завершении скрипта можно сделать прибивание запущенных в фоне сервисов командой kill.
var_dump() все подсвечивает, если установить расширение xdebug.
>>629536
Если ты можешь сделать без exit(), то код будет красивее.
>>629514
Сейчас есть более простой способ, не требующий правки hosts. Назови свой хост вроде xxx.localhost и он автоматически будет резолвиться в адрес твоего компьютера (127.0.0.1). Тогда содержимое hosts можно восстановить в исходное значение и не трогать.
Гайд относительно актуален, хотя сейчас можно использовать встроенный в PHP веб-сервер и обойтись без Апача вообще.
>>629494
Скобки помогают явно указать порядок выполнения действий и в этом смысле полезны. Можно писать and, но учти, что у него другой приоритет в отличие от &&.
А неперекрывающиеся условия не помогают? Ну когда выполняется одно - другие точно возвращают ложь.
Пытаюсь ui в лару, выдает вот такую хуйню. Я может дебил конченный, уже 2 часа гуглю, но проблема не проходит:
composer require laravel/ui --dev
Using version ^2.0 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Conclusion: remove laravel/framework v6.18.3
- Conclusion: don't install laravel/framework v6.18.3
- laravel/ui 2.x-dev requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2
.1, v7.2.2, v7.3.0].
- laravel/ui v2.0.0 requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2.
1, v7.2.2, v7.3.0].
- laravel/ui v2.0.1 requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2.
1, v7.2.2, v7.3.0].
- don't install illuminate/console 7.x-dev|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.3|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.4|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.5|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.6|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.7|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.8|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.3|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.3.0|don't install laravel/framework v6.18.3
- Installation request for laravel/framework (locked at v6.18.3, required as ^6.2) -> satisfiable by laravel/framework[v6.18.3].
- Installation request for laravel/ui ^2.0 -> satisfiable by laravel/ui[2.x-dev, v2.0.0, v2.0.1].
Installation failed, reverting ./composer.json to its original content.
Пытаюсь ui в лару, выдает вот такую хуйню. Я может дебил конченный, уже 2 часа гуглю, но проблема не проходит:
composer require laravel/ui --dev
Using version ^2.0 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Conclusion: remove laravel/framework v6.18.3
- Conclusion: don't install laravel/framework v6.18.3
- laravel/ui 2.x-dev requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2
.1, v7.2.2, v7.3.0].
- laravel/ui v2.0.0 requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2.
1, v7.2.2, v7.3.0].
- laravel/ui v2.0.1 requires illuminate/console ^7.0 -> satisfiable by illuminate/console[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2.
1, v7.2.2, v7.3.0].
- don't install illuminate/console 7.x-dev|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.3|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.4|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.5|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.6|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.7|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.0.8|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.1.3|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.0|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.1|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.2.2|don't install laravel/framework v6.18.3
- don't install illuminate/console v7.3.0|don't install laravel/framework v6.18.3
- Installation request for laravel/framework (locked at v6.18.3, required as ^6.2) -> satisfiable by laravel/framework[v6.18.3].
- Installation request for laravel/ui ^2.0 -> satisfiable by laravel/ui[2.x-dev, v2.0.0, v2.0.1].
Installation failed, reverting ./composer.json to its original content.
Кароче в пизду я просто перенесу всё в новый проект, там всё работает. Надо было сразу так сделать =)
Это копия, сохраненная 22 апреля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.