«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP и webdev #96 Аноним 2017/11/25 00:30:07  №1097438 1
15115590075310.png (33, 500x500)
500x500
15115590075311.jpg (157, 1024x683)
683x1024
15115590075322.jpg (194, 1024x768)
768x1024
15115590075343.png (792, 843x1200)
1200x843
Добро пожаловать. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет сделать себе блог, кто-то приобрести новую профессию, кому-то просто нечего делать.

Пожалуйста, пишите один большой пост вместо нескольких маленьких и не флудите не по теме.

Это тред для начинающих. Не написал за свою жизнь ни одной программы и имеешь тройку по математике? Ты наш человек.

Предыдущий тред был тут: >>1082507 (OP). Еще предыдущие треды ищутся в гугле по словам "клуб изучающих php" или в архиваче.

Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467

Что самое главное для программиста? Умение аккуратно оформлять код (как, написано во втором посте).

Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.

С чего начать

У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде 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

Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания 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

Оформляй код аккуратно!!! — например пропусти через 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? — Да, однозначно. Посмотри любую вакансию.
Напомню Аноним 2017/11/25 00:31:03  №1097441 2
15115590636450.png (56, 500x644)
644x500
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

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
Аноним 2017/11/25 01:52:45  №1097471 3
Аноним 2017/11/25 02:53:45  №1097492 4
Привет. Нужен хелп. Скачал шаблон с расширением .psd, открыл его фотошопом, а там куча горизонтальных и вертикальных линий зеленовато-белого цвета. Как эту хуйню убрать? Чтоб линий не было.Программирую 2 дня.
Аноним 2017/11/25 02:54:03  №1097493 5
Привет. Нужен хелп. Скачал шаблон с расширением .psd, открыл его фотошопом, а там куча горизонтальных и вертикальных линий зеленовато-белого цвета. Как эту хуйню убрать? Чтоб линий не было.Программирую 2 дня.
Аноним 2017/11/25 02:54:49  №1097494 6
Привет. Нужен хелп. Скачал шаблон с расширением .psd, открыл его фотошопом, а там куча горизонтальных и вертикальных линий зеленовато-белого цвета. Как эту хуйню убрать? Чтоб линий не было.Программирую 2 дня.
Ответы: >>1097532
Аноним 2017/11/25 02:55:42  №1097496 7
Извините, хз как 3 раза отправилось
Аноним 2017/11/25 10:56:47  №1097532 8
>>1097494

Это направляющие (guides). Погугли по словам "photoshop guides", есть кнопки и пункт меню для их отключения.
Аноним 2017/11/25 12:09:04  №1097541 9
Аноним 2017/11/25 14:17:45  №1097568 10
TL;DR: ОТКЛЮЧАЙТЕ ZEND OPCACHE В PHP 7.1, КОТОРЫЙ ИДЕТ ВМЕСТЕ С ПАКЕТОМ PHP71-EXTENSIONS. РАЗРАБОТЧИКИ ИГРАЛИ С ПАМЯТЬЮ И ПРОИГРАЛИ

Есть у меня на обслуживании проект, полностью написанный в стиле php4. Даже html кое-где вперемешку с кодом.
Позавчера вздумалось мне переставить на сервере с этим проектом php, с 5.6 прыгнуть на 7.1. Прочитал все статьи про миграцию с 5.6 на 7.0 и с 7.0 на 7.1 на php.net, убедился, что ничего не сломается, обновил php.
Проверил логи - ничего не сыпется. Потыкал сайт, все работает, красота. Хотя ой. Почему-то пара запросов оборвались - сервер рвет соединение, будто php падает. В логах пусто. Рестарт апача еще раз, потыкал-потыкал, вроде норм. Забегая вперед: не норм, просто код не уходил на ветку, где все падало.

Вчерашний вечер, собираюсь идти домой. Проверяю рабочую почту. А там куча репортов от юзеров, что одна из функций сайта не работает. Ну ебать. И меня ждал удивительный вечер в обнимку с var_dump().
Смотрю, код при заходе на определенную ветку действительно всегда безмолвно падает. В логах пусто совсем. Даже в php.ini прописал директиву error_log со ссылкой на лог апача, но ничего. Ветка длинная, пытаюсь отловить сломанное место с помощью die(), лучшего отладчика легаси кода.
Тут мне на глаза попадается еще один баг, одна из функций стала работать просто некорректно - уходит на ветку else, вместо того, чтобы зайти в один из elseif. Тут хотя бы ничего не падает. Лезу туда. И постепенно глаза лезут на лоб.
В начале скрипта $code это string(3) "304". А около ветки с if - уже string(2) "10". Я в шоке, эту переменную трогать не должен никто. Расставляю var_dump() повсюду. В итоге нахожу зловредное место.
var_dump($code); // string(3) "304"
$someData = file_get_contents('some_config.conf');
var_dump($code); // string(2) "10"

Чего блядь?! Лезу в мануал, fgc завезли сайд-эффект? Да нет, у разработчиков пхп мозги еще на месте.
Копирую $code в $code2, $another_random_var - после вызова file_get_contents все они превращаются в string(2) "10"!!!
Комментирую вызов fgc. Скрипт падает.
У меня опускаются руки, я заказываю платную поддержку у хостера и описываю ситуацию. Утром мне отписываются "закомментировали zend_extension=opcache.so, все заработало".
И правда, всё заработало как раньше, ничего нигде не падает.

Всё это выглядит как переполнение буфера у OpCache, либо какая-то борода с указателями, в общем проблемы с памятью, что серьезный баг.
Слава богу, что это не интернет-магазин, было бы охуенно выставить счет на 304 тысячи, а продать за 10 тысяч, например.
Я не знаю, как зарепортить подобное разработчикам, да и как это воспроизвести - понятия не имею. Могу только включить opcache обратно и дать доступ к серверу.
Такие дела.
Аноним 2017/11/25 14:21:16  №1097569 11
>>1097568
Вдогонку: Zend OpCache стоял и до этого, расширением к php5.6. Что-то поломано именно сейчас.
Аноним 2017/11/25 14:22:08  №1097571 12
>>1097568
Это теперь всегда так будет, Анон.

У меня при обработке текстовых файлов время от времени выскакивает «Unable to allocate 74255 petabytes of memory» и уже довольно давно. Все настройки в пыхопэини крутил, гуглил, да всё без толку. Когда работает, а когда нет.
Ответы: >>1097576 >>1097577 >>1097580
Аноним 2017/11/25 14:32:44  №1097576 13
>>1097571
У тебя тоже opcache? А если его выключить и перезапустить апач?
Аноним 2017/11/25 14:34:13  №1097577 14
>>1097571
Да и к тому же, у меня вообще ничего не выскакивало. display_errors=Off, конечно, но до записи в лог эти краши точно не доходят.
Аноним 2017/11/25 14:40:11  №1097580 15
>>1097568

Проблемы с оп-кешем на старых проектах (на Zend) я видел еще лет 5 назад во времена PHP5. Все аналогично. Просто какой-то баг.

> В логах пусто совсем.
Ну так если PHP падает, он уже в лог ничего записать не может. Надо смотреть лог Апача, где будет что-то вроде Child xxx unexpectedly terminated.

По-хорошему, если хочется разобраться в проблеме, надо сделать коредамп упавшего процесса и отладчиком (gdb) смотреть, в каком месте он падает. В идеале выделить еще проблемный кусок PHP кода.

>>1097571

> У меня при обработке текстовых файлов время от времени выскакивает «Unable to allocate 74255 petabytes of memory» и уже довольно давно.
Тут тоже хорошо бы сделать минимальный скрипт, который вызывает эту ошибку и зарепортить.

Ответы: >>1097582
Аноним 2017/11/25 14:47:27  №1097582 16
>>1097580
>Надо смотреть лог Апача
Ой, я не знал, что у апача еще свой лог имеется. Да, там килотонны
[Sat Nov 25 10:27:42.445985 2017] [mpm_itk:error] [pid 63118] child died with signal 11
[Sat Nov 25 10:27:44.163616 2017] [mpm_itk:error] [pid 63126] child died with signal 11
[Sat Nov 25 10:27:46.207923 2017] [mpm_itk:error] [pid 63128] child died with signal 11

>надо сделать коредамп упавшего процесса и отладчиком (gdb) смотреть
Не умею ничего из перечисленного, я простая веб-макака.
Ответы: >>1097588
Аноним 2017/11/25 14:56:39  №1097588 17
>>1097582

По такому описанию разработчики PHP баг найти просто не смогут. Если бы у меня было время, я бы попробовал поставить такие же версии софта, как у тебя, нагенерировал бы огромных PHP файлов и пробовал бы их запускать, чтобы поймать ошибку - а потом можно отладчиком найти место падения и от него искать истоки ошибки. Но времени у меня, увы, на это нет.
Ответы: >>1097590
Аноним 2017/11/25 15:07:24  №1097590 18
>>1097588
Если скажешь, как сделать дамп, могу сделать и выслать.
Ответы: >>1097593 >>1097948 >>1097949
Аноним 2017/11/25 15:23:59  №1097593 19
>>1097590
>было бы охуенно выставить счет на 304 тысячи, а продать за 10 тысяч, например.
У вас что, транзакций в MySQL нет?..
Ничего там не сломается, не переживай.
Аноним 2017/11/25 15:52:46  №1097603 20
15116143670960.jpg (22, 1343x236)
236x1343
Сап, программач. В жс треде никто не помог. Помогите, прошу, необходима ваша помощь

У ВК некоторое время назад сменилось шифрование прямой ссылки на аудиозапись. Нашел на этом форуме новый дешифратор прямой ссылки. Но если брать ссылку из ВК, то он возвращает ее же без дешифровкистарый дешифратор теперь возвращает полную хуйню. набор символов, а не ссылку

вот его код: https://pastebin.com/vvmpKjdw

С ссылками, которые приводились в пример к другим дешифраторам и которые я нашел в интернете он справляется хорошо. Возвращает ссылку типа https://...mp3, но если я сам возьму из HTML кода (или даже через пост запрос к al_audio.php) зашифрованную ссылку типа audio_api_unavailable, то он возвращает ее же.

скриншот консоли пикрелейтед

первый вариант - с той ссылкой, которую я сам взял из HTML разметки ВК
https://vk.com/mp3/audio_api_unavailable.mp3?extra=Adu4mwuXyuPJwfLOqL0WrtfLEdKYBK8XsOfjs10WCgeZy10Ol2eOChz4AOiYvxnIwsOTBI8OnKnbp2qZounYDs44 qNDplxfTDM5Rq2O5lJvLrJGOl3KXDeXOq3bUEM5iuJPyB2q5s1a4BvDYow9jAee1zeG1vJfhA3bJlvvnyLCYAuzZsMjeog1KnKqXthzXwveTyNbwDgD5ovDN x3GOudnJr29on3LSlufSrvzpBxnum2mOnejpq2uOwNPjwdyTl249BMuUEtC#AqS1nZC
второй вариант - с той ссылкой, которую приводили как пример для других дешифраторов
https:\/\/vk.com\/mp3\/audio_api_unavailable.mp3?extra=jtK5pt53yMiUpN5GFJT5yZSMyc4Pi2mJkdLIpxX8yN51Ex98FhH5Dh1OFhL8yYa9FNi0ntK\/lhaInY0CFdL5hcGVpdK3obWxFY9\/lJX1oZOjkX85bYrGgHG+FN54jquPlGn1hbuElcCddJ0gptCbDbqDFrizkH0mixuioYT6jW4FiZT4pauiybKViJW7E3W\/hxGSEYb\/isyEiNGKEZP+nZqzgYW5FIiogGumldCunXS7kX0hhZWvd2aPlaiFaqjG#DGL4cOOjDG
Ответы: >>1099926 >>1100227
Аноним 2017/11/25 17:17:58  №1097643 21
Ребята, есть у кого опыт переезда из мухосранска в ДС на работу джуниором?
Ответы: >>1099927 >>1100037 >>1100040
Аноним 2017/11/25 18:19:45  №1097658 22
Есть массив внутри которого массивы. Вопрос: как можно добавлять переменные в нужный мне масив?

https://ideone.com/Y2yRSp
Ответы: >>1097660
Аноним 2017/11/25 18:24:26  №1097660 23
Ответы: >>1097661
Аноним 2017/11/25 18:26:41  №1097661 24
Аноним 2017/11/25 21:06:15  №1097744 25
А двойные кавычки это одно и то же, что и две одинарных, которые сразу друг за дружкой идут?
Ответы: >>1097746 >>1097748
Аноним 2017/11/25 21:07:57  №1097746 26
>>1097744
Нет, это отдельный символ. Две одинарных кавычки - пустая строка.
Аноним 2017/11/25 21:15:14  №1097748 27
>>1097744

У меня двойные кавычки (") в русской раскладке пишутся как Shift + 2, а в латинской - есть отдельная кнопка с одиночными (') и двойными (") кавычками около Enter. Проверь свою клавиатуру.

Учти, что еще есть апостроф ` - у меня он на клавише с буквой Ё и тильдой ~.

Есть еще разные Юникодные кавычки и символы дюймов, но их нет на клавиатуре.
Аноним 2017/11/25 23:36:33  №1097829 28
Суп. К пхпПИ ЭЙЧ ПИ не прикасался вообще не коим образом, сейчас учу хтмл/ксс.
Короче, есть один хеадер, в нем список расположенный горизонтально, 3 элемента в нем - ссылки, 1, последний - поле для ввода. Сделалхотел сделать, чтобы поле для ввода раскрывалось вправо при выделении, но оно раскрывается в обе стороны и сдвигает другие элементы. Как сделать, чтобы оно раскрывалось только вправо? Паддинг не предлагать, потому что тогда текст идет не до конца.
index.html
https://pastebin.com/5njNSUFM
style.css
https://pastebin.com/CC7jaDk
Аноним 2017/11/26 00:26:07  №1097858 29
>>1097438 (OP)
есть книги по LAMP с новым PHP и Apache. Пытался найти, но всюду пых оброс бородой
Ответы: >>1097943 >>1098638
Аноним 2017/11/26 00:27:12  №1097860 30
Ответы: >>1098554
Аноним 2017/11/26 00:36:18  №1097865 31
>>1097438 (OP)
>2 картинка

Представляю сколько у этих кошатниц глистов
Аноним 2017/11/26 03:11:28  №1097912 32
В задаче про студентов при сортировке списка тоже должны быть ЧПУ? Я пока только с ссылками такого вида запилил: example.com/?field=surname&direction=desc
Ответы: >>1097943
Аноним 2017/11/26 04:29:35  №1097920 33
Нужен хелп. Как в фотошопе в psd-шаблоне скопировать текст? Не вручную же его в html писать? Смотрел видос по верстке, там челик копировал прям из psd текст, однако не объяснил , как это делается.
Ответы: >>1097943
Аноним 2017/11/26 09:13:13  №1097943 34
>>1097920

К фотошопу идет официальный мануал, переведенный в том числе на русский, толстенная книга (в PDF) под 1000 страниц. Если ты по каким-то причинам его потерял, его можно найти в сети в формате PDF. Обрати внимание, что надо искать руководство для нужной версии программы.

Более того, я сейчас погуглил и выяснил, что похоже наступил коммунизм, и Адоб выложила руководство по фотошопу на русском (!) под свободной лицензией:

Версия CC2017: https://helpx.adobe.com/ru/photoshop/user-guide.html
Старые версии: https://helpx.adobe.com/ru/photoshop/archive.html

Раздел про текст: https://helpx.adobe.com/ru/photoshop/user-guide.html

Не ленись, читай. Там есть раздел про редактирование текста, соответственно в этом режиме ты можешь его выделить и скопировать. Учти, что в макете текст может быть вставлен картинкой и тогда это не получится.

>>1097912

Можно без ЧПУ, можно с ЧПУ.

>>1097858

Наверно только официальный мануал на англ https://httpd.apache.org/docs/2.4/ (если есть время, можешь перевести статью-другую, и материал выучишь, и другим людям поможешь).

Со стороны PHP подключение PHP как mod_php (модуль Апача) описано тут http://php.net/manual/ru/install.unix.apache2.php (часть про компиляцию Апача смело пропускаем, важна только часть, где надо добавить директивы в конфиг Апача).
Ответы: >>1098262
Аноним 2017/11/26 09:20:53  №1097944 35
>>1097829

CSS-файл удален. А так, это делается обычно за счет float, меню флоатится влево, поиск флоатится вправо, и на всю шапку ставится clearfix. Таким образом, правый край поля поиска прикреплен к правому краю шапки.

Если ты используешь флоат и поле поиска расширяется так, что перекрывает меню, то по умолчанию оно провалится вниз, так как флоаты не перекрывают друг друга. В этом случае можно использовать либо абсолютное позиционирование для поля, либо задать ему отрицательный нижний маргин так, чтобы занимаемая им "высота" была нулевая.

Также есть другие варианты:

- использовать display: table для создания таблицы с 2 ячейками с выравниванием влево и вправо (не получится реализовать перекрытие меню)
- использовать flexbox (то же самое)

Все основные способы позиционирования перечислены (но не описаны) в уроке тут: https://github.com/codedokode/pasta/blob/master/html/positioning.md


Ответы: >>1098035 >>1098571 >>1098576
Аноним 2017/11/26 09:43:30  №1097948 36
>>1097590

Судя по описанию здесь, надо заморочиться: https://bugs.php.net/bugs-generating-backtrace.php

- нужно скомпилировать отладочную версию PHP (без нее дамп сделать возможно, но в нем не будет имен функций, а только адреса). При большом желании ее можно скомпилировать не имея прав рута, но это конечно займет время. Также, придется компилировать opcache.
- могут понадобиться права рута, чтобы включить в системе core dump (если их нет, можно запустить веб-сервер из-под gdb как описано там, gdb должен быть установлен, при большом желании это можно сделать без прав рута)
- нужно запустить веб-сервер из командной строки (чтобы он запустился с настроенными через ulimit параметрами)

То есть нужно либо включить коредампы (может они даже уже включены, можно проверить через cat /proc/sys/kernel/core_pattern и ulimit -a ) либо запускать сервер из-под gdb (в однопоточном режиме). Второе наверно даже удобнее, но может быть баг в однопоточном режиме не проявится.

core dump - это дамп памяти упавшего процесса, из которого можно получить место, где произошла ошибка. Более того, если у тебя отладочная версия PHP, то ты можешь просматривать значения сишных переменных в дампе и выяснить в каком состоянии был интепретатор, какую PHP команду он выполнял и тд.

При этом надо помнить, что в core dump могут сохраниться куски PHP кода и данных (значения переменных), которые он обрабатывал.

Также, хорошо, если бы ты мог выделить проблемное место и получить маленький скрипт, вызывающий ту же ошибку (замену значения переменной или падение).

Также, я еще кое-что придумал. Ты можешь попробовать запускать код без участия Апача (но с теми же настройками php.ini), используя встроенный в PHP веб-сервер ( http://php.net/manual/ru/features.commandline.webserver.php ). Его можно запустить даже без прав рута, если, есть доступ к командной строке. С помощью него ты можешь проверить: связано ли появление бага с Апачом или нет.

Разумеется, ты можешь также скопилировать отладочную версию PHP у себя на компьютере (если у тебя линукс или виртуальная машина с ним), главное взять ту же самую версию PHP и расширений (версию и параметры, с которыми был собран PHP, можно увидеть в phpinfo()). Это удобнее в том плане, что ты имеешь там все нужные права. Если ты раньше ничего не собирал, то это минимум несколько часов (а может и дней), так как будут возникать ошибки от того, что не хватает какой-то библиотеки или неверно прописан какой-то путь и ты будешь искать их причину.


Аноним 2017/11/26 09:51:37  №1097949 37
>>1097590

Также, что касается поиска багов обращения к памяти, то для этого можно запустить программу под valgrind: http://valgrind.org/ - это не требует сборки какой-то специальной версии PHP (но в неотладочной версии конечно полезной информации будет меньше).

То есть можно запустить встроенный в PHP веб-сервер под valgrind, запустить в нем проблемный скрипт, и если там есть ошибки работы с памятью, valgrind может их обнаружить.
Ответы: >>1097954
Аноним 2017/11/26 09:58:15  №1097951 38
>>1097568

Вот кстати, если бы у тебя были автоматизированные приемочные тесты, которые тестируют разные страницы, ты бы обнаружил этот баг еще в dev-окружении. Пишите тесты, аноны, в Оп-посте есть обзорный урок про тестирование.

Ну и если бы ты мог сделать хотя бы минимальную версию PHP скрипта, которая дает ошибку, под встроенным веб-сервером, этого в принципе могло бы быть достаточно для поиска проблемы без возни с gdb (но возня с gdb сэкономит время разработчикам PHP, а так может ты сразу и причину найдешь и исправление предложишь).

А так да, лет 5 назад я видел такую же проблему на хостинге, тоже с древним приложением, только с другим кешем, вроде бы apc cache или еще какой-то. Замена кеша на другой решила проблему.
Аноним 2017/11/26 10:15:08  №1097954 39
>>1097949
Также, что касается поиска багов обращения к памяти, то для этого можно запустить программу на другом языке программирования: это не требует сборки какой-то специальной версии PHP (но в неотладочной версии конечно полезной информации будет меньше).

То есть можно взять текстовый редактор, написать в нём заново «проблемный скрипт», и если там есть ошибки работы с памятью, в другом языке программирования их не будет.


Аноним 2017/11/26 13:29:24  №1098026 40
Аноны, объясните нуфане, что значит "сайт" на PHP, например вк? Это значит, что его серверная логика реализована на PHP?
Ведь делать разные анимации и всё такое можно только на JS, потому что это единственный язык, которой понимает браузер
Ответы: >>1098099
Аноним 2017/11/26 13:35:54  №1098035 41
Ответы: >>1098251 >>1098557
Аноним 2017/11/26 13:48:10  №1098043 42
Реально ли за 2 месяца вкатиться в верстальщика (параллельно учусь на очном, но кроме как ходить на пары ничего не делаю и поэтому в неделю часов 60-80 свободного времени есть) уровня ~15к в месяц. Альтернатива - обычная работка для студента на 15-18к с графиком 3 полных дня в неделю. Мб кто-то расскажет про свои первые попытки вкатиться.
Ответы: >>1098099 >>1099928
Аноним 2017/11/26 15:23:47  №1098099 43
>>1098026
Это значит, что бэкенд сделан на Php. То есть ты хочешь посмотреть на сайте сообщения за прошлый год, жмешь кнопку, сайт посылает с фронта http-запрос с нужными параметрами, далее php обрабатывает запрос, лезет в базу и выдает нужные данные, а потом на сайте это реализуется с помощью js или html или неважно как. Также на этот самый бэкенд приходят запросы с мобильной версии сайта, с мобильного приложения, с десктопного (если оно у них есть).
>>1098043
вполне реально, правда я в дс не видел особо много контор, где можно работать неполный день. плюс верстальщик - такая специализация, которая ни туда, ни сюда. знать надо дохуя, а перспектив нет. у нас в конторе вообще нет понятия "верстальщик", есть джуниор-фронт.
Ответы: >>1098105
Аноним 2017/11/26 15:30:54  №1098105 44
>>1098099
Ну почему же... перспектив нет. Женитьса на склочной стервозной бабище из хуяр-отдела, очень даже.
https://github.com/kichiweb123/students Аноним 2017/11/26 17:19:31  №1098161 45
>>1097466
>>1097470


Комменатрий лучше добавить не к таблице, а прямо к колонке (например через ALTER TABLE MODIFY password_hash ... COMMENT ....).

https://github.com/kichiweb123/students/blob/master/model/ConnectDb.php
Здесь не очень понятно, зачем этот класс. Если он для того, чтобы хранить объект mysqli, то что мешает его хранить просто в переменной без всяких ConnectDb? Также, непонятно, зачем в нем поля вроде db_address? Где и как они будут использоваться?

То есть в TDG можно написать так:

> function __construct(mysqli $mysqli) ...

Или у тебя в него будет добавляться еще какой-то полезный функционал? То есть, должна быть причина, чтобы создавать новый класс. И причина, чтобы сделать в нем то или иное поле.

>>Лучше использовать DI и убрать с класса TableStudentGateway обязанность соединяться с БД.
> Сделал, но надо проверять
Вроде с DI ты разобрался.


> $err = $this->connect->connect_error;
> $err = mb_convert_encoding($err, 'UTF-8', 'cp1251');
А это зачем? Ошибка соединения с БД возвращается в cp1251? Это конечно плохо, так как под линуксом они будут в utf-8... По-хорошему, это mysqli сама должна преобразовывать информацию об ошибке в заданную в настройках PHP (default_encoding) кодировку, если это не так, то можно собрать подробности, проверить что все верно и зарепортить баг разработчикам PHP (а еще лучше - вместе с исправлением).

> TableStudentsGateway.php
> Класс нужен для соединия с БД,
Для соединения он не нужен, это лучше убрать.

Код оформлен не по PSR. Пропусти код класса через phpformatter.com, и увидишь, как правильно надо его оформлять. Также, смотри второй пост в треде про оформление кода.

> class TableStudentsGateway{
> public $db = null;
Почему поле db сделано public? Как ты выбираешь, что поставить, public или private?

В функции getStudent в SQL запрос вставляется переменная $sort, но нет проверки, что она содержит разрешенное значение, а значит тут может быть SQL инъекция.

> while($row = $result->fetch_array(MYSQLI_ASSOC)){
> $arr[] = $row;
Это можно сделать одной командой вместо цикла.

> for($i = 0; $i<=8; $i++){
Почему не foreach тут? А то придется цифру менять при изменении числа полей.

И еще кое-что. Ты передаешь в функцию refreshStudent массив данных. Но нигде не описано, какие поля могут быть в этом массиве. Не лучше ли передавать сюда объект, который имеет описание (класс), и у которого всегда можно посмотреть набор полей?

Передача массивов вместо объектов имеет тот плюс, что требует чуть меньше кода. Но ее недостаток - это то, что код труднее понять и проще ошибиться. В случае класса известно, каике у него поля, у них могут стоять комментарии. Ну например, у тебя функции в TableDataGateway принимают и возвращают массивы, но нигде формат этих массивов не описан. Экономить строчки тут необходимости нет, не лучше ли передавать объект, представляющий студента?

Вот я например заметил одну вещь: в базе поле называется second_name, а в коде sname - легко перепутать. И неудобно работать: если ты берешь массив из одной функции и передаешь в другую, получается, надо заменять в нем название поля? Было бы проще если бы для представления одного студента использовался объект.

> if(!$data['name'] and !$data['sname'] and $data['class']){
> $class = "class = ?";
> }elseif(($data['name'] or $data['sname']) and $data['class']){
> $class = ", class = ?";
> }
> if(!$data['name'] and !$data['sname'] and !$data['class'] and $data['email']){
> $email = "email = ?";
> }elseif(($data['name'] or $data['sname'] or $data['class']) and $data['email']){
> $email = ", email = ?";
> }

Это тяжело читаемая копипаста. Не нужно писать 5 однотипных блоков кода, нужно использовать цикл.

Запрос проще собирать так. Сделать массив кусочков вида ['name = ?', 'email = ?'] и склеить через implode.

> WHERE login = ?
> AND password_hash = ?
Вообще, по моему проще указывать не логин/пароль, а просто id пользователя, которого надо обновить. id это ведь первичный ключ и он однозначно указывает на пользователя.

Методы findPage и getStudent не дублируют друг друга?

Название таблицы data неудачное. Все, что хранится в базе - это данные, и название по сути ничего не говорит. Нужно называть таблицы словами вроде students.

> function getEmail(){
В этой функции есть нарушение разделения ответственности (принципа, что каждый класс занимается своим делом). Мы вроде бы подразуемваем, что за получение данных из БД отвечает только класс TabsleStudentsGateway, никто другой этим не занимается. Но! Эта функция возвращает объект класса mysqli_result. Не список email, а объект для работы с базой данных. И код, который функцию вызовет, должен получается сам работать с базой данных, а не получить готовый результат.

Приведу простой пример: допустим, мы заменим mysqli на PDO. Если все сделано верно, то нам придется править только класс TableStudentGateway. Но у тебя придется править еще и код, который использует getEmail. То есть то, что должно быть инкапсулировано (спрятано) внутри TableStudentsGateway, "протекает" в этой функции из класса наружу.

Вот еще пример нарушения инкапсуляции:

> Authorisation.php

> function isLogin($login, $pass = false){
> $result = $this->tableStudentGateway->getLoginPass();
> if($login and $pass){
> while($row = $result->fetch_array(MYSQLI_ASSOC)){
Во-первых, здесь есть проблема, что мы вытягиваем из БД все данные, вместо того, чтобы взять данные только по одному студенту. И во-вторых, здесь класс Authorisation почему-то работает с mysqli, хотя это не его зона ответственности.

Должно быть так:

- запрашиваем у TSG данные по студенту с логином login
- если не нашлись, значит логи неправильный
- если такие данные нашлись, сверяем хеш

Также, раз уж мы заговорили про разделение ответственности, хеширование паролей тоже надо поручить какому-то одному классу, чтобы оно было только в нем. Чтобы только он "знал", как их хеширвоать. И если мы захотим поменять алгоритм хеширования, чтобы надо было править только этот один класс. В данном случае, думаю, можно назначить ответственным за это класс Authorisation.

Далее, я вижу в Authorisatin метод isEmailUsed. Какое отношение он имеет к авторизации? Никакого. Этот метод лучше сделать в классе TSG. И сделать его эффективно, чтобы не вытягивались все email из базы, а делался поиск с помощью SQL запроса. Иначе на таблице в миллион пользователей это будет работать очень медленно, а может даже памяти не хватит. То, что база умеет делать сама (поиск одной записи), выгоднее делать в ней.

Ответы: >>1100353
https://github.com/kichiweb123/students Аноним 2017/11/26 17:20:06  №1098164 46
>>1097466
>>1097470

> setcookie("login", "$login", 0x7FFFFFFF,
Время бы лучше указать как-то понятнее, вроде текущее + 10 лет, а то не очень понятно, почему именно 7ffff... и сколько это в привычных нам единицах измерения.

Для удаления кук надо указывать время в прошлом, посмотри мануал.

В валидаторе, при проверке поля score, надо проверять, что оно содержит цифры. А то можно ввести "30 cats". Для года надо проверять что там указан реалистичный год.

> if($this->authorisation->isLogin
Лучше isLoginUsed

Также, нужно подумать, как избавиться от повторяющегося кода в методах validateStudent и validateProfile.

> https://github.com/kichiweb123/students/blob/master/public/cfg.ini
зачем ты конфиг с паролями положил в публично доступную папку? Хочешь со всеми поделиться своими секретами?

> function my_autoloader($class){
Тут ошибка. В моем уроке про автозагрузку ( https://github.com/codedokode/pasta/blob/master/php/autoload.md ) было сказано:

> автозагрузчик не должен выдавать ошибку, если он не может найти файл с классом - может быть, этот класс подгрузит другой автозагрузчик

У тебя нет проверки, что файл ../controller/'.$class.'.php'; существует - следовательно, если написать например код

if (class_exists('TestClass')) {}

То произойдет ошибка при попытке подключить несуществующий файл. Также, из-за этого твой автозагрузчик не сможет работать вместе с другими.

> header('Location: error.php');
Это неправильно. Допустим у тебя в коде произошла ошибка. Сервер должен отдать ответ с кодом 5xx. А ты отдаешь ответ с кодом 302 (редирект), который значит - страница, которую вы ищете, переехала по другому адресу. Не надо никогда редиректить на страницу ошибки, надо ее показывать.

https://github.com/kichiweb123/students/blob/master/public/index.php
Из этого файла надо убрать полностью HTML код и лишние маркеры <?php

Ты попытался сделать обработчик исключений. Но почему-то ты ловишь только исключения при создании нескольких объектов, а остальной код не проверяешь. Логичнее тогда весь код в файле обернуть в один большой try/catch. Или прочитать про обработчик исключений в моем уроке по исключениям.

> $error = $e->getMessage();
Ты берешь только сообщение, но теряешь другую информацию, например, стектрейс. Лучше писать $e->__toString(), которая вернет всю информацию об ошибке. Также, проверь, пишется ли в лог время, когда произошла ошибка, и URL, который пытался открыть пользователь. без этих данных тебе трудно будет понять - где именно ошибка.

Контроллеры Search и Table очень похожи. Их функции можно объединить в один контроллер, ведь поиск - это тоже просмотр списка студентов, только с фильтром по имени.

> Profile.php
> if($_SERVER["REQUEST_METHOD"] == "POST"){
> require_once "../refreshStudent.php";
Зачем из контроллера вынсоить кусок в отдельный файл? Не лучше ли сюда этот код и вписать?

> <form class="form-inline" style="float:right;
Для этого в бутстрапе есть класс pull-right. Также, почитай про сетку в бутстрапе, которая здорово помогает выровнять блоки до заданной ширины. Просто возьми руководство по бутстрапу и пролистай, и обрати внимание, какие в нем возможности есть - это тебе не раз пригодится, я думаю.

https://github.com/kichiweb123/students/blob/master/view/login.phtml
В view не должно быть работы с POST/GET. Оно просто отображает то, что дал контроллер.

> elseif(!$container['Authorisation']->isLogin($login, $pass)){
То же самое, это должно быть в контроллере, это не задача view, проверять логин.

> view/pages.phtml
> echo "<a href='?id=search&search=".$search."&p=".($offset-1).
тебе не кажется, что тут длинная и тяжело читаемая смесь из знаков препинания? Лучше сделать функцию или метод где-нибудь в Util, который будет формировать URL из переданных ему параметров. И не забывай про htmlspecialchars.

> view/search.phtml
> Найдены запросы по слову \"$search\":
Прочитай мой урок по XSS на гитхабе.

Также, в шаблонах не должно быть echo, это неудобно, писать HTML в кавычках. Используй <?= ?>.

Если тебе что-то непонятно, спрашивай. Важно не слепо следовать советам, а понимать, зачем это нужно.



>>1097468

>> Нет, в данном случае, тебя должно залогинить без регистрациии и без наличия кук. Под каким-то существующим аккаунтом.
> Это как?
Взять какой-нибудь аккаунт, например с id=1. Нужно, чтобы ты после захода на специальную страницу был залогинен под этим аккаунтом. То есть залогиниться под чьим-то аккаунтом не вводя логин или пароль (представь, что это нужно администратору например, или тестировщику).

Если у тебя код правильно разделен на части, то это сделать нетрудно.


Ответы: >>1100824
Аноним 2017/11/26 17:56:52  №1098226 47
https://ideone.com/QfGifZ

>ucwords — Преобразует в верхний регистр первый символ каждого слова в строке

Там, где delimiters нужно регулярное выражение? Почему он в верхний регистр отказался преобразовать строку?
Аноним 2017/11/26 18:37:22  №1098251 48
Аноним 2017/11/26 18:54:24  №1098262 49
>>1097943
Спасибо большое по поводу фотошопа
https://github.com/someApprentice/chat/ Аноним 2017/11/26 19:23:54  №1098286 50
>>1087406

Ой, пост пропустил. Потому я обычно и прошу напомнить о себе, потому что в треде на 900 постов можно что-то и упустить.

>>>+offset + +1
>>Немного странное место. Не многовато ли знаков "плюс"?
> Что поделать если js при сложении не преобразует данные в число? Приходиться делать это самому.
Ну это уже вопрос к твоему коду в backend, почему он числа в виде строк возвращает. А так, надо хотя бы скобки ставить для понятности: (+offset) + 1

>>Также, мне кажется, что у тебя в контроллере находится код, относящийся ко view: вызовы jQuery вроде if ($(that.view.moremessages).length) стоило бы перенести во view и писать вместо этого if (that.view.hasMoreMessagesButton()), а еще лучше - if (this.canShowMoreMessages()), так как это довольно коряво, проверять наличие новых сообщений по наличию кнопки на экране. Должно ведь быть наоборот - модель/viewModel сама знает, есть ли новые сообщения.

> Всегда нужно пользоваться только высстананвленными наружу методами, даже если код займет одну строку?
Тут скорее идея в том, что мы изолируем всю работу с DOM в один класс. Это ведь один из принципов ООП - single responsibility. И потому мы должны писать

view.showMessageCount(1);

а не

view.messageCountDiv.text(1);

Видишь разницу между 2 вариантами? Она в наличии/отсутствии инкапсуляции работы с DOM внутри view. Ну и если ты, например, захочешь сделать анимацию при изменении числа, в первом варианте это будет проще. Также, в первом случае код чуть понятнее, на мой взгляд.

Можно конечно не делать инкапсуляцию, но тогда возникает вопрос, а зачем вообще нужен view? Не проще его объединить с контроллером? Такой вариант тоже возможен.

Да, может показаться, что это раздувает код, но это потому, что ты пишешь все руками, не используешь библиотеки для data-binding (knockout, angular, react, vue и тд), которые решают проблему избавления от ручного обновления DOM.

>>Должно ведь быть наоборот - модель/viewModel сама знает, есть ли новые сообщения.
> Должно быть свойство модели/viewModel, например this.canShowMoreMessages = true/false?
Не знаю, зависит от реализации. Но вообще обычно данные хранятся/берутся из модели и передаются во вью для отображения. Ну например, можно возвращать это свойство вместе с результатами запроса к АПИ:

backend.getMessages(offset) -> [messages, hasMoreMessages]

И просто хранить в переменной. Можно хранить в свойстве контроллера. В переменной удобнее тем, что у нее ограничена область видимости.

Также, может быть, у тебя есть модель, представляющая хранилище сообщений. И тогда она может ответить на вопрос, есть ли еще:

var hasMore = messageList.hasMoreMessages(offset);

Но проверять наличие сообщений по наличию кнопки в DOM - это не соответствует MVC. И это имеет недостатки, при изменении этой кнопки придется менять код прокрутки, который, казалось бы, с ней никак не связан. Легко забыть поменять и создать баг. Поверь, тот, кто обнаружит этот баг, будет тебя не лучшими словами вспоминать.

Я там еще увидел, что ты решил пойти дальше и переменные начать хранить в DOM:

> var datawith = $('a', that.view.moreMessages).attr('data-with');

А что мешает хранить это в переменной?

Тот подход, который ты использовал - хранить данные в атрибутах, он вообще допустим. Ну например, мы могли бы сделать такой HTML-код для карточки отеля:

<div class="hotel-card" data-stars="3" data-city="London" data-price="100"></div>

Более того, давно уже ведутся разговоры по возможности добавления кастомных тегов, чтобы писать <hotel-card stars="3" city="London"></hotel-card>. Например, такое есть в Polymer.js, для этого добавили Shadow DOM. Такой синтаксис используют в Реакте. Почему нет? Вполне соответствует идее семантической (смысловой) разметки.

Но в таком случае обычно "карточка отеля" - это отдельный компонент. Где-то есть скрипт, который читает эти атрибуты и обрабатывает их, есть шаблон и тд. А у тебя не так, у тебя ведь кнопка не оформлена как отдельный компонент. Ты просто используешь DOM атрибуты как поля объекта или переменные, и возникает вопрос - а что мешает данные сразу и хранить в полях или переменных?

Из-за этого код сложнее становится - надо разбираться, кто пишет значение в этот атрибут, кто читает, данные передаются каким-то усложненным способом.

>>Из-за того, что ты в контроллере смешиваешь код view, код установки обработчиков, асинхронные вызовы, все это выглядит сложно и запутанно.
> Разве контроллер не должен "дирижировать" всем этим?
Я не помню, что я имел в виду, но думаю, я хотел сказать о 1) разделении ответственности (например, только вью работает с DOM напрямую) и 2) о преобразовании больших функций с кучей колллбеков (callback hell). Может их надо на части разбить, может их надо писать не вложенно, а последовательно.

Про callback hell, это когда пишут так:

$(...).click(function (e) {
$.ajax({
url: ...,
onsuccess: function (result) {
setTimeout(function () {
$(...).click(function () {
...
});
});
}
})
});

То есть создают код с большой глубиной отступов. Я видел, как некоторые даже отступ ставят на 2 пробела, чтобы код не уезжал вправо, но они борются с последствием, а не с причиной. Не надо писать такой сильно вложенный код.

Я вот сейчас открыл твой код - и обнаружил там те самые 2 пробела. Как в воду глядел.

Вот это вот код не для человека:

https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L71

> that.backend.handleError(jqXHR, textStatus);
> }
> );
> }
> }
> }
> }.bind(this));
> };

Я не робот и я не могу в уме посчитать, к чему тут относится bind(this). 8 уровней вложенности! 3-4 хватило бы с лихвой.

Промисы позволяют победить это:

var result = doSmth();
result.catch(...);
result.then(function () {
...
}).then(function () {
...
});

Также, можно выносить код в функции:

$(btn).click(handleClick);
$(btn2).click(this.handleClick.bind(this));

Алсо, кто-то даже сделал сайт по теме http://callbackhell.com/

Или тут: https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L80 - функция на целых 60 строк. Пока я дойду до конца, я забуду, что было в начале.

И еще, ты-то может это знаешь, но я например не понимаю, за что отвечает каждый класс. Вот conversation.js - это контроллер области сообщений? Контроллер, отвечающий за переписку вообще? Стоит взять за правило писать перед классом, за что он отвечает и зачем нужен. Кроме самых очевидных случаев.

Огромные if можно превратить в маленькие, если поменять условие на противоположное.

if (!...) {
return;
}

Вот попробуем упростить это:

https://github.com/someApprentice/chat/blob/master/public/js/conversation.js#L31

> that.backend.getLastMessages(datawith, offset).then(function(data) {
> проверка, что URL не изменился
> отправка сообщений на расшифровку
> обновление DOM

Я бы сделал так. Все, связанное с расшифровкой, просто вынес бы в функцию. Использовал бы промисы для выполнения асинхронных операций последовательно:

var encryptedPromise = that.backend.getLastMessages(datawith, offset);
var decryptedPromise = encryptedPromise.then(this.decryptMessages.bind(this));
decryptedPromise.then(function (decrypted)) {
если (URL изменился) { выйти; }

this.appendMessages(decrypted);
this.showSomeButton(...);
...
};

То есть надо ограничивать глубину вложенности и длину функций. Это ведь тоже показывает твои навыки - можешь ли ты разложить код на составные части или напишешь длинный кусок лапши.

Иногда ситуация бывает сложнее, чем я написал. Ну например, бекенд возвращает 2 значения, { encryptedMessages, haveMore }, и надо как-то передать haveMore в функцию вывода данных, пропустив этап расшифровки. Я не знаю правильного ответа, попробуем например что-нибудь написать:

var resultPr = that.backend.getLastMessages(datawith, offset);
var viewData = resultPr.then(function (lastMessages) {
var decryptedPr = that.decrypt(lastMessages.encryptedMessages);

// Добавляем haveMore в результат расшифровки
var decryptedAndHaveMorePr = decryptedPr.then(function (decrypted) {
return {
haveMore: lastMessages.haveMore,
decrypted: decrypted
};
});
return decryptedAndHaveMorePr;
});

viewData.then(function (decryptedAndHaveMore) {
// вывод сообщений
}, function () {
// вывод ошибок
});

Не знаю, читабельно ли вышло? Может, ты сможешь красивее записать? Асинхронный код, он такой, на await/async ( https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/await ) это бы наверно компактнее получилось:

var result = await that.backend.getLastMessages(datawith, offset);
var decrypted = await decryptMessages(result.encrypted);
view.showMessages(decrypted);
view.showMoreButton(result.haveMore);

>>Также, твой Crypter является по сути оберткой над openpgp, ничего от себя не добавляя. Непонятно, в чем смысл его существовани
> Вы выше делали замечание что нужно делать обёртку. Я запутан.

Не помню, к сожалению, что я имел в виду. Я просто хотел сказать, что если ты пишешь класс-обертку, он должен добавлять какой-то функционал, иначе можно использовать внутренний класс напрямую. Ну не знаю, давай считать тогда, что добавленный функционал - это запуск воркера (initWorker).

Аноним 2017/11/26 19:24:20  №1098288 51
>>1087406

> Нет, локальное хранилище должно быть в любом случае. Я уже подготовился к его написанию.
Тут главное правильно его спроектировать (интерфейс к нему), с учетом асинхронности почти всех операций.

> В омем предстовлении backend занимается только получением данных с API, т.е. с бэкенда сервера. Не будет ли вывод данных нарушением инкапсуляции в таком случае?
Конечно, будет. Если это делает бекенд. А если бекенд генерирует события пропадения/появления связи или события ошибок, а контроллер/вью на них подписывается и отображает на экране, то разделению соблюдается. То есть паттерн "Observer" решает эту проблему.

Вот так:

// в контроллере
this.backend.onError(function (e) {
that.displayError(e);
});

Просто тут ведь есть такие варианты:

1) обрабатывать ошибки после вызова каждой функции отдельно
2) централизованно фиксировать наличие ошибок и где-то в одном месте их ловить и выводить

И какой лучше - зависит от ситуации. Может ты в углу хочешь выводить ошибки, может менять цвет иконки, а может рядом с сообщением или кнопкой отправки.


Аноним 2017/11/26 20:20:31  №1098306 52
Если у кого-то из вас, аноны, нет опыта и вы не работали с большими проектами, и любопытно, а как они выглядят, то почему бы не посмотреть большие проекты на PHP?

Движок от Википедии: https://github.com/wikimedia/mediawiki
Магенто 2, движок для интернет-магазинов: https://github.com/magento/magento2

Вот примерно с таким вы можете столкнуться, если устроитесь на работу.
Ответы: >>1099256
Аноним 2017/11/26 20:31:29  №1098317 53
Ответы: >>1098380
Аноним 2017/11/26 20:40:29  №1098323 54
Проверьте пожалуйста задание на приведение номеров к единому стандарту через регулярки

https://ideone.com/EQhCuF

Репост из предыдущего треда
Ответы: >>1098603
Аноним 2017/11/26 20:46:38  №1098330 55
>>1097438 (OP)
Какой популярный фреймворк "более ооп-шный".
Даже не знаю, может мое недовольство не обоснованно, но вот например пробовал laravel, так там по мануалу полно обращений к статическим методам или сам генератор перечисляет поля из бд в массиве. (например protected $fillable = [ 'name', 'email', 'password', ]; )
Аноним 2017/11/26 21:39:50  №1098380 56
>>1098317

И еще. В дампе ошибка DATETIME(6), в форме регистрации не пропускает логин ivan, из-за кривой регулярки.

В имени нельзя использовать цифры.

При регистрации появляется ошибка, что за 60 секунд ключ не сгенерировало, хотя процесс gpg висит с 0 потреблением CPU все это время. Может конечно, это нехватка энтропии в виртуальной машине виновата.

На c9.io просто появляется надпись generating keys... и ничего не происходит.
Аноним 2017/11/26 22:26:56  №1098414 57
Не могу установить Xdebug через Babun

вводил здесь
https://xdebug.org/wizard.php
аутпут от php -i

Download php_xdebug-2.5.4-7.1-vc14-nts-x86_64.dll
Move the downloaded file to ext
Edit C:\tools\php71\php.ini and add the line
zend_extension = ext\php_xdebug-2.5.4-7.1-vc14-nts-x86_64.dll

Прописал эту строчку сразу после
;;;;;;;;;;;;;;;;;;;
; About php.ini ;
;;;;;;;;;;;;;;;;;;;

таким образом
;zend_extension = ext\php_xdebug-2.5.4-7.1-vc14-nts-x86_64.dll

после этого снова ввел
pact install xdebug
в Бабуне, но ничего всё равно получил
Package xdebug not found or ambiguous name, exiting
Ответы: >>1098487
Аноним 2017/11/26 23:42:34  №1098468 58
Что использовать для разработки на Линуксе?
Скачать Атом ? Или есть достойные альтернативы?
Ответы: >>1098612 >>1099930
Аноним 2017/11/27 00:26:53  №1098487 59
>>1098414

Инструкции на сайте xdebug - они для ручной установки. То есть она пишет, какую dll тебе надо скачать, куда положить и что дописать в php.ini. Ты их выполнял?

Что касается pact, он ведь никак с разработчиками xdebug не связан. Это сборка с cygwin. И pact устанавливает не любые программы, а те, что есть в репозитории cygwin.

Что такое cygwin? Это набор библиотек, имитирующих линуксовое АПИ на Windows. За счет этого можно скомпилировать линуксовые программы под cygwin и запускать их под windows.

Если ты ставил php для windows (не для cygwin), то ты должен для него скачать xdebug с сайта, как он тебе советует.

Если вместо этого ты бы предпочел пользоваться cygwin и pact, то тебе надо установить php через pact, и через него же xdebug. И убедиться, что виндовый PHP находится не в PATH, чтобы не запустить его случайно.

> Package xdebug not found or ambiguous name, exiting
Ты ввел неправильнео имя пакета. Делать надо не так:

- найти пакеты по слову xdebug (pact find xdebug)
- просмотреть список и выбрать нужный тебе
- установить его, указав его правильное имя. Скорее всего он называется как-то вроде php7-xdebug. Поиск подскажет.

pact describe xdebug покажет подробную информацию о пакетах, в названии которых есть это слово.

Я кстати сам cygwin использую, ты можешь с его помощью потихоньку привыкать к линуксовой командной строке.
Ответы: >>1098925
Аноним 2017/11/27 04:23:55  №1098554 60
Ответы: >>1100793
Аноним 2017/11/27 05:06:35  №1098557 61
>>1098035
>>1097829
К спеке вообще прикасался? Зачем тебе везде idшники там? Почему не вписал классы для описания элементов? Почему там JS?
Аноним 2017/11/27 06:12:49  №1098571 62
>>1097829
Короче чот ты много нагородил, мож заработался, у меня такое бывает. Ну в общем:
>text-align: center;
Вот эта штука вроде как выравнивает все посередине, но и заставляет одновременно синхронить свое положение при изменений окна, неважно какого, даже внутри дисплея. Так как теги имеют гены, то естественно детки эту штуку переняли, в общем тегам потомкам передалось это свойство.
> <div id="page-wrapper">
>Внутри него находится твой хаотический список
>Соответственно этот div и является окном
>>1097944
Чот ты нагородил тоже, не проще ли установить его статично и все? Просто в таких случаях лезть во флекс, совет интересный, но не в этом случае смею предположить. Ну ка расскажи где эт флексы так используют, аж интересно стало? Почему так все усложнено?
Смотри што сделал:
https://theknacker.github.io/Test/index.html
Ответы: >>1098594 >>1098595
Аноним 2017/11/27 07:46:03  №1098576 63
>>1097944
>А так, это делается обычно за счет float, меню флоатится влево, поиск флоатится вправо, и на всю шапку ставится clearfix. Таким образом, правый край поля поиска прикреплен к правому краю шапки.
https://theknacker.github.io/Test/index2.html - Поиск здорового человека.
>Если ты используешь флоат и поле поиска расширяется так, что перекрывает меню, то по умолчанию оно провалится вниз, так как флоаты не перекрывают друг друга.
https://theknacker.github.io/Test/index3.html - Поиск курильщика.
Все вспомнил, извини ОП за тупость. Но вот табличный способ если чесна первый раз слышу, интересно как он работает?
Я не автор страницы, я просто взял ее на разбор ради интереса.
Ответы: >>1098607
Аноним 2017/11/27 10:01:18  №1098594 64
>>1098571

Как я понял, у человека была задача сделать меню прижатым слева, а поиск - прижатым вправо. При клике в поле поиска оно расширяется (левый край поля движется влево, правый остается на месте), возможно, наезжая поверх меню (на многих сайтах сейчас так делают). Я и предложил решения. Может я конечно задачу не так понял.

Тут https://theknacker.github.io/Test/index.html сделано что-то другое, поле поиска не прижато вправо.

тут https://theknacker.github.io/Test/index2.html поле не наезжает на меню при расширении, а проваливается вниз. Попробуй сделать, чтобы поле расширялось до 200px, а не 120, и увидишь.

https://theknacker.github.io/Test/index3.html та же проблема.

Я думаю, что нужно, чтобы поле поиска при расширении наезжало поверх меню, а не проваливалось вниз.

При этом в идеале это надо еще сделать адаптивно, чтобы на маленькой ширине экрана это тоже нормально работало.

> Но вот табличный способ если чесна первый раз слышу, интересно как он работает?
display: table/table-row/rable-body/table-cell. Лучше всего про них почитать в спецификации если не боишься, или в какой-нибудь статье. Заставляют элементы позиционироваться как таблицу. Соответственно, можно сделать таблицу из 2 ячеек.

> Чот ты нагородил тоже, не проще ли установить его статично и все?
Что значит статично? position: static? Не вижу логики.

> где эт флексы так используют
Там, где другие способы не годятся. Ты почитай спеку по флексам или хотя бы обзор на MDN. Ну например, если тебе надо сделать интерфейс, который разбивает экран на части и выравнивает их содержимое. Плюс, там можно задавать пропорции между этими частями.

Можно например распределять блоки равномерно вдоль горизонтальной или вертикальной оси, даже если они разных размеров.

HTML все же, если честно, заточен на оформление именно текста. Когда делаешь сложный интерфейс, флекс может быть полезен. Но у них конечно куча подвохов (например, при неудачном использовании он может картинки делать нулевого размера), поддерживается не везде, было 2 спецификации флекса, то есть нужная, но немного проблемная и сырая технология.

Ответы: >>1098607
Аноним 2017/11/27 10:04:26  №1098595 65
>>1098571

Причем, когда поле наезжает на меню, нужно, чтобы пункт меню, уходящий под поле поиска, плавно исчезал на протяжении 10-20 пикс. Не резко врезался в поле поиска, а плавно терял яркость. Надеюсь, ты понял идею.
Ответы: >>1098607
Аноним 2017/11/27 11:12:00  №1098603 66
Аноним 2017/11/27 11:29:56  №1098607 67
>>1098594
Первая ссылка это я автору дал намек на его вопрос, остальные это имплементация слов вот тут написано >>1098576 (Гринтекст - ссылка как работает).
>Я думаю, что нужно, чтобы поле поиска при расширении наезжало поверх меню, а не проваливалось вниз.
При этом в идеале это надо еще сделать адаптивно, чтобы на маленькой ширине экрана это тоже нормально работало.
Ну как вопрос задал, так и ответили, зачем придумывать что-то еще? У него там зачем то JS стоит, айдишники повсюду и ни одного класса, я бы посоветовал спеку пойти читать.
>display: table/table-row/rable-body/table-cell. Лучше всего про них почитать в спецификации если не боишься, или в какой-нибудь статье. Заставляют элементы позиционироваться как таблицу. Соответственно, можно сделать таблицу из 2 ячеек.
Господи да спеку по CSS3 я уже изнасиловал. Я спросил кто этим пользуется и как оно выглядит. А не про поведение display параметра.
>Что значит статично? position: static? Не вижу логики.
Зафиксировать ширину элемента (Шапки например) чтобы поиск отталкивался просто от нее, не трогая другие элементы, я кстати так и сделал тут: https://theknacker.github.io/Test/index2.html
>HTML все же, если честно, заточен на оформление именно текста.
Изначально да, а потом напичкали всякими API и скриптами.
>>1098595
Вот это я пытался сделать, потом займусь. Типо так?
https://tympanus.net/codrops/
Аноним 2017/11/27 12:10:20  №1098612 68
Аноним 2017/11/27 13:25:58  №1098636 69
пацаны, поясните за композер. я хочу в использовать последнюю стабильную версию библиотеки, поебать какой номер версии. соответственно самый распространенный способ записи require "vendor/package": "1.*" мне не подходит. версия станет 2.0 и мне пизда. как правильно? "vendor/package": "@stable"?
Ответы: >>1099242 >>1099254
Аноним 2017/11/27 13:34:32  №1098638 70
>>1097858
>пых оброс бородой
в смысле?
Аноним 2017/11/27 14:46:27  №1098675 71
15117831874740.jpg (5, 471x29)
29x471
>>1097438 (OP)
А зачем в этом примере про регулярные выражения (с этой страницы взято: http://archive-ipq-co.narod.ru/l1/regexp.html ) вначале пишется ([0-9]{3}), а потом ([0-9]{7}) ? Это потому-что система не поймет, если сразу написать ([0-9]{10}) ?
Ответы: >>1098698 >>1098710 >>1098728
Аноним 2017/11/27 14:53:57  №1098680 72
Чем отличаются исключения от if exit() ?
Ответы: >>1098712 >>1098730
Аноним 2017/11/27 15:04:08  №1098684 73
>>1097438 (OP)
Я сделал регулярное выражение для проверки автомобильного номера.

$regexp = '/([а-яё]{1})([0-9]{3})([а-яё]{2})/'

Все верно сделано?
https://regex101.com/ пишет, что да. Я протестил несколько вариантов, но вдруг что-то упусти.
Ответы: >>1098687 >>1098711
Аноним 2017/11/27 15:09:00  №1098687 74
>>1098684
>([а-яё]{1})([0-9]{3})([а-яё]{2})/'

флажки u и i добавь
Ответы: >>1098690
Аноним 2017/11/27 15:10:50  №1098690 75
>>1098687
$regexp = '/([а-яё]{1})([0-9]{3})([а-яё]{2})/ui'

Зачтено?
Ответы: >>1098696
Аноним 2017/11/27 15:18:55  №1098696 76
>>1098690
Я не ОП, но выглядит правильно.
Ответы: >>1098698
Аноним 2017/11/27 15:21:03  №1098698 77
>>1098696
А можешь тогда ещё глянуть на мой вопрос >>1098675 ?
Ответы: >>1098710
Аноним 2017/11/27 15:40:40  №1098709 78
15117864404190.png (5, 455x210)
210x455
15117864404191.png (41, 786x215)
215x786
15117864404202.png (175, 1600x868)
868x1600
Делаю задачу опа про файлообменник на slim и я в некотором отчаянии. В общем, при ajax запросе если в коде fatal error, типа E_PARSE или E_ERROR возвращается пустой ответ без какого либо текста, кода ошибки и прочего, как на первом скриншоте, т.к. в коде синтаксическая ошибка (скрин 2). При этом, c обычным http запросом все нормально, сработает обработчик, выведется 500 ошибка и все ок(скрин 3). И да, я добавил свои кастомные обработчики ошибок отдельно для xhr, отдельно для обычных запросов, но они тут не причем, даже если их отключить ситуация таже.
register_shutdown_function тоже ничего не выводит.
Естественно выставлено:
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set('display_startup_errors', 1);

Алсо, варнинги и нотайсы выводятся нормально. Что мне с этим делать?

Ответы: >>1098719
Аноним 2017/11/27 15:50:48  №1098710 79
>>1098698
Попробую.

>>1098675
Дело в том, что в учебнике автор выделяет часть. Если нам просто нужно было найти номер, то подошло бы и то, что ты написал. Но в данном случае мы проверяем на шаблон и выводим часть. Я возможно пишу плохо, потому что у меня нету навыков преподавания, поэтому попробую сразу примеры дать.

Формат номера такой 8(xxx)(xxxxxxx)

Где первая скобка - это код оператора, вторая - оставшийся номер. Благодаря этим скобкам, в учебнике ОП выводит код оператора. Без разделения на ([0-9]{3}) и ([0-9]{7}) этого бы не получилось.

Пример.
https://ideone.com/BV0u8L


Ответы: >>1098714
Аноним 2017/11/27 15:52:14  №1098711 80
15117871351120.png (48, 434x418)
418x434
Ответы: >>1098714
Аноним 2017/11/27 15:52:42  №1098712 81
>>1098680
много чем. в первую очередь тем, что если ты используешь if exit, тебя нормальный работодатель пошлет нахуй.

а технологически отличие в том, что исключения можно ловить (т.е. обрабатывать) в одном удобном месте (или в разных для разных компонентов системы), логировать, классифицировать по степени критичности. какие-то, например, можно красиво упаковать и показать пользователю, а какие-то слать на имейл админу и пользователю показывать только заглушку "что-то временно не работает".
Ответы: >>1098766
Аноним 2017/11/27 15:54:22  №1098714 82
>>1098710
Кажется я понял. Мой пример подошел бы, если бы все цифры шли сплошняком, а ИРЛ цифры номера телефона перебиваются пробелами/дефисами и нужно сделать уступку для этого.

>>1098711
Оу. Ну, у меня машины никогда не было и я этой тонкости не знал.
Ответы: >>1098732
Аноним 2017/11/27 16:03:06  №1098719 83
>>1098709

А ты случайно content-type: application/json в неправильном ответе не получаешь? Это не может быть баг в инструментах разработчика?

Если ты отправляешь AJAX через GET, попробуй открыть этот URL просто в браузере. Если через POST - поменяй временно PHP код, чтобы он принимал GET. И посмотри, что будет - тоже белая страница или нет?

Ну и ты показал вкладку Response, но я не вижу там ни кода ответа HTTP, ни заголовков. Даже если ты в скрипте сделаешь die(), то все равно будет HTTP ответ, с заголовками. Это может быть просто баг в инструментах разработчика.

Если у тебя есть под рукой другой браузер, например, Хром, посмотри еще в нем.

Также, ты можешь отправить HTTP запрос из командной строки программой curl (нужно ее установить сначала). Примерно так:

curl -v 'http://xxx/page.php?a=1'

В Хроме в отладчике есть удобная опция - там можно любой запрос скопировать как команду curl и вставить в командную строку, и увидеть, что реально приходит в ответ.

Ну и всегда есть радикальный вариант. Ты можешь посмотреть, какой запрос с какими заголовками отправляет аякс на вкладке Headers, и отправить такой же запрос руками через nc или telnet (описано тут в задачах https://github.com/codedokode/pasta/blob/master/soft/web-server.md )
Ответы: >>1099329
Аноним 2017/11/27 16:07:30  №1098728 84
>>1098675

Если бы у меня была задача просто проверить, что номер состоит из 10 цифр, то скобки конечно было бы не нужны. Но у меня другая задача - проверить номер И извлечь из него код города и телефон. Для этого я группирую первые 3 и последние 7 цифр в круглые скобки. После вызова preg_match она положит код города и номер в отдельные элементы массива $m:

if (preg_match($regexp, $string, $m)) {

}

В $m[0] будет номер целиком, то есть все, что совпадает с регуляркой
В $m[1] будет часть исходного текста, которая соответствует первым круглым скобкам, то есть код города
В $m[2] будет то, что соответствует вторым круглым скобкам.

Аноним 2017/11/27 16:10:40  №1098730 85
>>1098680

exit завершает скрипт. То есть, когда ты пишешь в функции exit то она завершает скрипт. У того, кто вызвал функцию, нет возможности на это повлиять и предложить другой способ обработки ошибки.

Если ты выбрасываешь исключение, то по умолчанию оно тоже завершает скрипт. Но тот, кто вызвал функцию, может поймать выброшенное ей исключение и сделать что-то другое - например, записать информацию об ошибке в лог (информация содержится в объекте исключения) и попробовать вызвать какую-то другую функцию.

Подробно про исключения, с самого начала, с нуля: https://github.com/codedokode/pasta/blob/master/php/exceptions.md (нужно знать что такое объекты).

Ответы: >>1098766
Аноним 2017/11/27 16:13:19  №1098732 86
>>1098714

Нет, в моей регулярке из учебника нет "уступки" для других символов. Она написана для номеров только из цифр.

Аноним 2017/11/27 16:22:31  №1098742 87
Делаю задачу с поиском по номерам телефонов.
Два вопроса:

1.Можно ли вместо -?-? ? сделать запись , типа -,(, ,? ?
2.Как вообще запихивать скобки в регулярные выражения?
Аноним 2017/11/27 16:35:49  №1098766 88
Аноним 2017/11/27 18:41:13  №1098925 89
15117972741540.png (14, 453x229)
229x453
15117972741541.png (7, 446x121)
121x446
>>1098487
>Инструкции на сайте xdebug - они для ручной установки. То есть она пишет, какую dll тебе надо скачать, куда положить и что дописать в php.ini. Ты их выполнял?
Да
>cygwin
У меня установлен Babun, который является удобной упакованной версией cygwin
>найти пакеты по слову xdebug (pact find xdebug)
Не знаю, он ничего не находит, совсем
>Я кстати сам cygwin использую, ты можешь с его помощью потихоньку привыкать к линуксовой командной строке.
У меня Минт второй системой установлен
Ответы: >>1098942
Аноним 2017/11/27 19:05:16  №1098942 90
>>1098925

Я поискал тут https://cygwin.com/cgi-bin2/package-grep.cgi?grep=php&arch=x86_64 - действительно, xdebug нет. Нет, ну и ладно. В линуксоподобных системах должен работать pecl, который умеет скачивать любое стандартное расширение к PHP, собирать его и устанавливать. То есть pecl - это внутрненний менеджер пакетов для расширений PHP.

В cygwin он идет в пакете php-PEAR-1.10.1-1

Тебе нужно поставить этот пакет и выполнить команду, я думаю, pecl search xdebug, а затем pecl install имя-пакета.

Возможно, что пеклу понадобится компилятор и еще что-нибудь для сборки, установишь тогда его через pact.

-----

Или же ты можешь пользоваться виндовым PHP, но надо раскомментировать строку в php.ini, у тебя zend_extension закомментирован.



Ответы: >>1098943
Аноним 2017/11/27 19:07:33  №1098943 91
Аноним 2017/11/27 20:15:34  №1099024 92
Аноним 2017/11/27 20:17:10  №1099028 93
>>1097438 (OP)
20лвл-хуй.
Завтра иду в веб студию, вакансия битрикс junior.
Сам битрикс нихуя не знаю, но вообще шарю в пыхапе( знаю такие слова как ООП MVC и даже чутка понимаю что это)
Пилил самопис на php+mysql(pdo) чуть сложнее гостевухи. понимаю jquery. Писал парсеры/грабберы на пхп(подключая либы+импорт в wordpress на кроне) вооот все, нихуя больше... вроде умею гуглить и ваще в пхп вкатился по урокам Попова в 13 лет. + могу настроить LAMP+postfix на вдске.

Требования в вакансии: Требования: Обязательные знания: php5, sql, html, css, js, опыт работы с 1C-Bitrix.
Желательно понимание работы систем контроля версий (если что, научим), опыт работы с Linux-подобными ОС.

Что будут спрашивать на собеседовании? Меня возьмут? Что говорить?
Алсо зп 20к руб хД

Ответы: >>1099032 >>1099119
Аноним 2017/11/27 20:19:04  №1099032 94
>>1099028
Ебать, как же торможу, если 27-ой лвл и я только полгода поработал в саппорте CMS-ки.
Ответы: >>1099042
Аноним 2017/11/27 20:22:09  №1099042 95
>>1099032
Чем занимался в саппорте cms'ки?
Ответы: >>1099047
Аноним 2017/11/27 20:24:11  №1099047 96
>>1099042
Дрочил хуи Пояснял клиентам за функционал, тестил обнаруженные ими баги, правил их (иногда наши) шаблоны + ИНОГДА (!) помогал им разобраться, что за хуйня у них с серваками.
Типа, у одного было столько бэкапов, что они съели все свободное место на VDS, но вначале юзер пенял на нас.
Аноним 2017/11/27 21:11:46  №1099098 97
братики, пишу testHub на ларе и ума не приложу, как структурировать бд для него. буду рад любой помощи и продвижению в этом вопросе. ломал голову, но получалась всякая параша.
https://gist.github.com/codedokode/8733007
Ответы: >>1099141
Аноним 2017/11/27 21:30:13  №1099119 98
>>1099028
>php5
>1C-Bitrix
>jquery
Тебе 20 лет, тебе развиваться надо, а не копаться в CMS параше, тем более в такой отборной как битрикс. Ищи работу за еду, где тебя научат нормально кодить на нормальных фреймворках. С CMS ты никуда не вырастешь, а лишь научишься профессионально месить говно, которое на более сложных проектах вообще не нужно.
Ответы: >>1099149 >>1099151
Аноним 2017/11/27 21:45:46  №1099139 99
Пытаюсь тут понять зачем нужны исключения, есть пару вопросов, напишу их сюда.

1) Перехватывать исключения в теории можно двумя способами: неструктурно и структурно. Неструктурно — это когда мы задаем обработчик исключений в начале программы:

set_exception_handler(function ([Exception $exception) {
// Функция будет вызвана при возникновении исключения
});

То что я выделил жирным - это два тайп хинта?

2)// В try пишется код, в котором мы хотим перехватывать исключения
$users = loadUsersFromFile(...);

Это значит, что в переменную $users будут класться исключения?

3) $e->getMessage() это метод встроенного класса Exception ? И что она выводит?
Ответы: >>1099934 >>1099938
Аноним 2017/11/27 21:46:48  №1099141 100
>>1099098
это я. я тут придумал табличку tests, с графой questions, где json имени вопросов, типа и вариантов ответа. но тогда табличка разрастется до вселенских масштабов, нужно как-то это разрешить.
Ответы: >>1099168
Аноним 2017/11/27 21:58:11  №1099149 101
>>1099119
На сайте у этой же компании есть вакансия
Помощник веб-программиста Python
Требования:

Python, SQL, HTML, CSS, JS
Крайне желательно знакомство с framework Django или неутомимое желание его освоить.
Желательно знание Linux. Приветствуется владение системами контроля версий.

Если я завтра приду и скажу, битрикс НИУМЕЮ НИХАЧУ, можно мне ДЖАНГУ? норм тема?
алсо на питоне только говнопарсеры писал
Ответы: >>1099153 >>1099156
Аноним 2017/11/27 21:59:48  №1099151 102
>>1099119
ваще как вести себя на собеседовании? мне деньги нужны за квартиру платить бляяяяяя
Ответы: >>1099154 >>1099156
Аноним 2017/11/27 22:02:49  №1099153 103
>>1099149
>Если я завтра приду и скажу, битрикс НИУМЕЮ НИХАЧУ, можно мне ДЖАНГУ? норм тема? алсо на питоне только говнопарсеры писал
Ну да.
Аноним 2017/11/27 22:03:09  №1099154 104
>>1099151
Тогда иди в сапорт, лол.
Ответы: >>1099157
Аноним 2017/11/27 22:04:01  №1099156 105
>>1099149
Зачем говорить, что ты не хочешь заниматься чем-то из вакансии А, если ты подал резюме на вакансию Б?
Если хочешь осваивать питон - осваивай, если хочешь пыху - ищи еще вакансии.
>>1099151
А если деньги нужны вот прям щас, то иди на эту работку, если она тебе эти деньги в ближайшее время гарантирует, а самообразованием тогда отдельно занимайся, только сделать это будет напорядок сложнее, т.к. практику выдумать себе придется самому.
Че ты как малой, тебе еще советов накидать как штаны надевать?
Ответы: >>1099160
Аноним 2017/11/27 22:04:11  №1099157 106
>>1099154
нету в моем городе саппорт вакансий
Ответы: >>1099158
Аноним 2017/11/27 22:05:03  №1099158 107
Ответы: >>1099161
Аноним 2017/11/27 22:06:10  №1099160 108
>>1099156
Епта, че у меня завтра спросят? Чем мне выебнуться, чтобы меня взяли джуном? Я просто никогда на собесы не ходил
Ответы: >>1099164 >>1099165 >>1099169
Аноним 2017/11/27 22:06:28  №1099161 109
Аноним 2017/11/27 22:07:55  №1099164 110
>>1099160
двач дай советов мудрых
Аноним 2017/11/27 22:08:49  №1099165 111
>>1099160
Шаблонизаторы знаешь? Как серваки работают?
Ответы: >>1099170
Аноним 2017/11/27 22:10:06  №1099168 112
>>1099141

>тут придумал табличку tests, с графой questions, где json имени вопросов, типа и вариантов ответа.

Зачем хранить JSON в базе? Сделай нормальную реляционную схему. Надо изучать проектирование БД, а не лепить кривые костыли вместо изучения.

Есть тесты, есть вопросы, есть варианты ответов, они все связаны внешними ключами. Как положено.

Полистай этот урок https://github.com/codedokode/pasta/blob/master/db/databases.md#Теория-по-проектированию-БД там среди прочего упомянуты нормализация, разные полезные паттерны и наследование таблиц.

Почитай эти уроки http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

Подумай, какие тут есть сущности, какие у них свойства, как они связаны.

Также, могу предложить попробовать спроектировать базу данных для гостиницы из этой задачки >>1097078 - она проще, чем TestHub и на ней можно потренироваться. Потом базу для продюсерского агенства отсюда >>1094213

Ну то есть я предлагаю тебе позаниматься немного проектированием баз данных, так как у тебя тут явно не хватает опыта, и начать с простых тренировочных задачек.
Ответы: >>1099565
Аноним 2017/11/27 22:10:17  №1099169 113
>>1099160
>Чем мне выебнуться, чтобы меня взяли джуном?
Не советую делать этого в качестве джуна. Просто расскажи прямо и честно, что умеешь и чего хочешь уметь. Ты же на джуна метишь.
Спросят тебя об элементарных вещах. Почитай про протоколы, алгоритмы, подтяни SQL и самое главное закрой двач.
Аноним 2017/11/27 22:10:23  №1099170 114
>>1099165
шаблонизаторы - в первый раз слышу =(
Серваки ну там бля, sudo apt-get instal lamp
POST/GET tcp/ip хуй знает
алсо я накатил тут
Ответы: >>1099174 >>1099189
Аноним 2017/11/27 22:14:45  №1099174 115
>>1099170

Так и быть, ОП даст тебе пасту про шаблонизаторы, выучив которую, ты, я думаю, сможешь поразить собеседующих: https://github.com/codedokode/pasta/blob/master/php/templates.md

Также, посмотри другие уроки в моем гитхабе, там полно ценной инфы, которую иначе надо по крупицам извлекать из разных источников.
Ответы: >>1099176
Аноним 2017/11/27 22:15:50  №1099176 116
>>1099174
:*
ОП-спасибо за тред, ты няша :3
Аноним 2017/11/27 22:53:51  №1099189 117
>>1099170
> я накатил тут
В каком смысле?

А так, тебе может понадобится знать, что такое xslt и tpl.
Аноним 2017/11/27 22:55:43  №1099190 118
Чем отличается интерфейс от абстрактного класса ? У обоих есть методы и свойства.
Ответы: >>1099284
Аноним 2017/11/27 23:16:08  №1099199 119
Ответы: >>1099200
Аноним 2017/11/27 23:21:22  №1099200 120
>>1098742
>>1099199
Первый вопрос не понял, что ты имеешь в виду. Отвечу на второй.

Скобки можно запихивать в регулярные с помощью квадратных скобок "[]"

https://regex101.com/r/TQIKNp/1/
Ответы: >>1099207 >>1103435
Аноним 2017/11/27 23:27:52  №1099207 121
>>1099200
Тогда я не понимаю, почему не работает выражение:
[7-8] ?-?-?[(]?([0-9]{1}) ?-?-?[)]?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1}) ?-?-?([0-9]{1})

Для набора:

'84951234567', '+74951234567', '8-495-1-234-567',
' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67',
'8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567',
'8 ( 999 ) 1234567', '8 999 123 4567'
Ответы: >>1099213
Аноним 2017/11/27 23:39:42  №1099213 122
>>1099207
Зачем тебе знаки вопроса?
Ответы: >>1099217
Аноним 2017/11/27 23:44:54  №1099217 123
>>1099213
Не, знак вопроса я использовал в контексте "это может быть, а может не быть".
Ответы: >>1099220
Аноним 2017/11/27 23:51:49  №1099220 124
>>1099217
У тебя слишком много повторений. Может быть лучше попробовать использовать символ * который может и отсутствовать и повторятся любое количество раз?
Ответы: >>1099221 >>1099222
Аноним 2017/11/27 23:53:51  №1099221 125
>>1099220
Может быть лучше попробовать использовать символ * который позволяет предыдущему символу отсутствовать и повторятся любое количество раз. Я исправил.
Аноним 2017/11/27 23:54:03  №1099222 126
>>1099220
Я хотел максимально расширить регулярное выражение, чтобы в него входили ВСЕ случаи.

Логика была такая:
1)Либо "8", либо "7".
2)Может быть пробел, дефис, минус, скобка, а может и нет.
3)Цифра
4)См. п 2.
5)Повторять до упада.
Ответы: >>1099227
Аноним 2017/11/28 00:01:28  №1099227 127
>>1099222
>1)Либо "8", либо "7".
[78]

>2)Может быть пробел, дефис, минус, скобка, а может и нет.

>3)Цифра

>4)См. п 2.

>5)Повторять до упада.

Можно упростить эту задачу. Смотри. После 8 или 7 идет цифра. Перед ней может быть пробел, дефис, минус, скобка, а может и нет. После нее тоже. И так пока цифры номера не закончатся. То есть получается однообразное действие. Может его повторить через {10}? ( десять - это количество цифр после 7 или 8)
Ответы: >>1099228
Аноним 2017/11/28 00:05:15  №1099228 128
Ответы: >>1099230
Аноним 2017/11/28 00:12:29  №1099230 129
>>1099228
Ты сделал просто поиск номера, а я написал вот что " После 8 или 7 идет цифра. Перед ней может быть пробел, дефис, минус, скобка, а может и нет. После нее тоже. И так пока цифры номера не закончатся. То есть получается однообразное действие. Может его повторить через {10}?"

то есть надо изменить это "([0-9]{10})" чтобы возможно был пробел, дефис, минус, скобка перед цифрой и после нее а возможно и нет.
Ответы: >>1099233
Аноним 2017/11/28 00:17:16  №1099233 130
Ответы: >>1099244
Аноним 2017/11/28 00:23:33  №1099236 131
Аноны, как настроить DOMDocument, чтобы он читал нестандартные(пусть даже заранее известные) теги?
Есть страница с тегами типа <bodyexport>, как её прочесть?

Ошибки типа:
DOMDocument::loadHTML(): Tag noindex invalid in Entity
Ответы: >>1099246 >>1099254
Аноним 2017/11/28 00:30:42  №1099242 132
>>1098636
можно я по композеру бампану вопрос, раз тут все собрались
Аноним 2017/11/28 00:33:59  №1099244 133
>>1099233
Я не могу понять зачем тебе это
?-?-?

Ведь есть символ * . Может попробовать лучше его использовать?
Ответы: >>1099255
Аноним 2017/11/28 00:34:35  №1099245 134
PhpUnit тесты после запуска выдают пустую строку, никакой ошибки в консоли. Если запускать из PhpStorm - 255 ошибка.
Анон, как фиксить?
Ответы: >>1099254
Аноним 2017/11/28 00:36:51  №1099246 135
Ответы: >>1099252
Аноним 2017/11/28 00:49:40  №1099252 136
>>1099246
Ну это статья про создание такого гемороя на JS, а я хочу распарсить его через DOM.
Или я чего-то не увидел?
Аноним 2017/11/28 00:55:47  №1099254 137
>>1098636

Это плохая затея. Почитай про semantic versioning: https://semver.org/lang/ru/

Если библиотека обновит мажорную версию то с близкой к 100% вероятностью код сломается.

Конечно, если ты используешь composer.lock, то там само ничего не обновится, так как версии фиксируются в нем.

Что касается версий, я их наизусть не помню, и могу лишь предложить мануал https://getcomposer.org/doc/articles/versions.md

Или ты его уже прочел?

>>1099236

Ну он пишет, но тег-то создает? Ошибки подавляются с помощью libxml функций http://php.net/manual/ru/ref.libxml.php

>>1099245

255 ошибка значит по моему что программа не найдена.

А так, начинай отлаживать. Например, помести в bootstrap-файл строчку die("here\n"); и проверь, выводится она или нет. Если да - помести ее же в первый тест. ЧТобы понять, где падает.

Проверь, что phpunit вообще работает, выполнив команду вроде phpunit --help, phpunit --list-suites

У меня ощущение, что у тебя там die, либо вылетает фатальная ошибка/исключение, но отображение ошибок отключено.

Ответы: >>1099257 >>1099262 >>1099269
Аноним 2017/11/28 00:56:33  №1099255 138
Ответы: >>1099258 >>1099280
Аноним 2017/11/28 00:57:03  №1099256 139
>>1098306
>Движок от Википедии: https://github.com/wikimedia/mediawiki

>// Set a dummy $wgTitle, because $wgTitle == null breaks various things
>// In a perfect world this wouldn't be necessary
>$wgTitle = Title::makeTitle( NS_SPECIAL, 'Badtitle/dummy title for API calls set in api.php' );

Лол.
Аноним 2017/11/28 01:00:18  №1099257 140
>>1099254
> У меня ощущение, что у тебя там die, либо вылетает фатальная ошибка/исключение, но отображение ошибок отключено.
Отображение ошибок включено В конфиге бутстрапа есть переменная неопределенная, так вот если раскомментить эту строчку - тест выдает нотис и после нее 255.
Если тест запускать без бутстрапа и автолоадинга классов, тогда тест успешно проходит, в консоли вижу текст типа " 1 тест запущен, 1 пройден (ок)"

В бутстрапе происходит создание приложения yii 1, где-то там косяк, но не пойму где.
Ответы: >>1099272 >>1099284
Аноним 2017/11/28 01:00:21  №1099258 141
>>1099255
Две черточки зачем нужны? У тебя символ читает только самую правую квадратную скобку, если хочешь, чтобы читало все - нужно добавить их в круглые скобки (тут должно быть что-то)
Ответы: >>1099261
Аноним 2017/11/28 01:02:52  №1099261 142
>>1099258
Я не совсем понимаю, как это сделать.
И да, в описании статьи говорится только про "предыдущий символ". Т.е. нужно как-то по-особому скормить набор символов злобной звездочке.
Ответы: >>1099264 >>1099265
Аноним 2017/11/28 01:03:39  №1099262 143
>>1099254
>Ну он пишет, но тег-то создает?

И правда, спасибо.
Аноним 2017/11/28 01:06:03  №1099264 144
>>1099261
Тебе нужна рега на телефонные номера? Я тут недавно изъебался, но написал регу для адресов с вариативностью расположения улиц/домов/хуйни, мб могу помочь?
Ответы: >>1099266
Аноним 2017/11/28 01:06:36  №1099265 145
Ответы: >>1099266
Аноним 2017/11/28 01:11:45  №1099266 146
>>1099265
Понятно. А как это скомбинировать с дефисами, минусами и пробелами?

>>1099264
Боюсь, это будет сложновато для меня. Я тут пытаюсь выполнить задание из учебника ОП-а с номерами телефонов.
Ответы: >>1099270
Аноним 2017/11/28 01:16:41  №1099269 147
>>1099254
>
>Это плохая затея. Почитай про semantic versioning: https://semver.org/lang/ru/
о, спасибо огромное. это я хочу выкатить библиотеку и делаю мануал к ней. хотел, чтобы люди всегда ставили самую новую версию, но вместо этого лучше почитаю про то, как правильно придумывать им номера.

да, мануал композера смотрел, там как раз не нашел ответ на вопрос. а в интернетах увидел только варик @stable, что не похоже на best practice.
Аноним 2017/11/28 01:17:30  №1099270 148
>>1099266
>Понятно. А как это скомбинировать с дефисами, минусами и пробелами?

Попробуй добавить их в квадратные скобки. Пробел если что значит \s
https://regex101.com/r/uhZ7xS/1
Ответы: >>1099280
Аноним 2017/11/28 01:27:49  №1099272 149
>>1099257

У phpunit есть опции -vv и --debug ( https://phpunit.de/manual/4.8/en/textui.html#textui.clioptions ) попробуй их добавить.

> создание приложения yii 1, где-то там косяк, но не пойму где.
Идешь в скрипт Юи, ставишь через строчку echo 1, echo 2 и так далее и постепенно ищешь этот exit. Может у тебя, кстати, в конфиге Юи отображение ошибок выключено?
Ответы: >>1099418
Аноним 2017/11/28 01:34:10  №1099276 150
С какого фреймворка стоит начать, если еще не было работы с ними? Что стоит почитать?
Ответы: >>1099281 >>1099284
Аноним 2017/11/28 01:38:47  №1099280 151
>>1099255

У тебя там написано

--[(]

Это значит пробел, за ним идет 2 минуса подряд, за ним открывающая скобка. И далее ][)]* что значит 0 или больше закрывающих скобок.

Квантификаторы вроде зведочки применяются к последнему элементу, в данном случае к закрывающей скобке.

Чтобы применить звездочку к нескольким символам, их берут в круглые скобки:

(abc)*

Это соответствует пустой строке, строке abc, abcabc, abcabcabc и так далее.

Что касается ситуации с 10 цифрами, там надо написать так:

- сначала напиши "ровно 1 скобка, минус или пробел"
- затем напиши "любое число минусов, скобок или пробелов"
- затем напиши "любое число минусов, скобок или пробелов, за ними ровно 1 цифра"
- затем возьми это в скобки и припишеи повторение 10 раз: (....){10}

>>1099270

Если уточнить, то \s - это не только пробел, но и любой другой пробельный символ (символ, который не печатается или выгодит как пустое место), например: перевод строки \n, узкий пробел, неразрывный пробел, и тд. В Юникоде штук 10 разных пробелов есть на все случаи жизни: http://jkorpela.fi/chars/spaces.html и символ \s всем им соответствует.

Ответы: >>1099281 >>1099521
Аноним 2017/11/28 01:41:40  №1099281 152
>>1099276
Читай ООП, выбирай любой фреймворк(всё равно сложно в начале будет), смотри его структуру(MVC чаще всего) и разбирайся. Официальная документация обычно хорошо написана, и гайдики по первому приложению есть.

>>1099280
Господа, я вам настоятельно рекомендую начать экранировать тире и прочие подобные символы, чтобы потом не обосраться где-нибудь. От лишнего бэкслеша ничего не сломается.
Аноним 2017/11/28 01:52:34  №1099284 153
>>1099276

Может с микрофреймворка Slim или Silex ? Микрофреймворк он простой, ты можешь его код целиком прочитать если надо.

Сделать можно (прорекламирую) задачу на студентов из Оп поста. На ее примере ты научишься работать с формами, шаблонами, базой данных и тд. К ней идут подробные комментарии.

Потом можешь брать Юи, Ларавель или Симфони.

>>1099257

Если у тебя есть отладчик (например в IDE) и xdebug, можно попробовать запустить код из-под него и пошагово место завершения, но phpunit, может быть применяет всякие хаки и как бы от них отладчик не сломался.

Но вообще, было бы полезно тебе поучиться пользоваться отладчиком.

>>1099190

Почитай урок про интерфейсы https://github.com/codedokode/pasta/blob/master/php/interfaces.md

Это вообще разные вещи и даже сравнивать их между собой не очень логично.

Алсо, если это задают на собеседовании, и ты видишь, что проваливаешься, спроси, а есть ли у них в проекте интерфейсы и абстрактные классы и как используются. И затем объясни им, что они просто их используют "чтобы были", не думая, нужны ли они на самом деле, и код от этого не становится лучше. И объясни как на самом деле их надо использовать.

Аноним 2017/11/28 01:59:18  №1099286 154
Сейчас разбираю исключения и параллельно думаю над задачей о студентах. Вообщем, я решил запилить обработчик, который будет ловить все типы ошибок и исключений и выводить пользователю страницу с сообщением о технической проблеме. Я в правильном направлении думаю?
Ответы: >>1099289
Аноним 2017/11/28 02:00:16  №1099289 155
>>1099286

Да, и ведь в уроке про исключения по моему про это в конце написано, как раз про эту страницу. Логгировать только ошибку не забывай.
Аноним 2017/11/28 05:07:19  №1099329 156
15118348400730.png (60, 1366x768)
768x1366
>>1098719
Спасибо за ответ.
>А ты случайно content-type: application/json в неправильном ответе не получаешь? Это не может быть баг в инструментах разработчика?
Нет, text/html, на скрине заголовки типичного пустого ответа.

>Если ты отправляешь AJAX через GET, попробуй открыть этот URL просто в браузере. Если через POST - поменяй временно PHP код, чтобы он принимал GET. И посмотри, что будет - тоже белая страница или нет?

Пробовал отправлять форму через расширение для хрома (RESTED) в разных кодировках json, urlencoded, эффект тот же самый, пробовал разные браузеры и разные сборки (на работе XAMPP + win, дома linunx + nginx). Из всех своих потуг, понял что проблема в middleware, то есть если запрос обрабатывается middleware то ошибка не выводится, неважно где допущена сама ошибка внутри middleware или внутри самого приложения, например прямо в контроллере - выведена она не будет. Допустим мы отправляем json с формой логина, а в контроллере допущена синтаксическая ошибка, если контроллер покрыт миддлварс то получаем пустой ответ, либо если было eсho или другой вывод в middleware он будет выведен, но текста ошибки все-равно не будет. Убираем middleware и получаем нормальный синтакс еррор. Шизняк какой-то. Если будет желание разобраться, то
Вот мой файл с роутами: https://github.com/honeydev/fileshare/blob/master/app/Routes.php
Вот контроллер:
https://github.com/honeydev/fileshare/blob/master/app/Controllers/MainPageController.php
Вот миддлварсы:
https://github.com/honeydev/fileshare/tree/master/app/Middlewares
Аноним 2017/11/28 10:42:34  №1099401 157
ОП, делаю testhub на yii2. При помощи чего реализовывать перетаскивание вопросов, есть ли готовое решение, для gridview например? Или велосипедить с jqueryUI?
Аноним 2017/11/28 11:34:22  №1099418 158
>>1099272
> -vv и --debug
Пробую с этими ключами - опять пустая строка
Ответы: >>1099428
Аноним 2017/11/28 11:59:42  №1099424 159
>>1097438 (OP)
Сап, почаны! Помогите вникнуть в логику циклов. Третий урок из начальных. Почему, когда я присваиваю в Условии_1 $x=10000, то программа считает, что на счету через год будет та же сумма (10000) https://ideone.com/hNqkv9 ? Когда я выношу команду echo за пределы тела цикла, оно отображает действительную сумму больше миллиона через 49 лет, вкладчику 65 лет (ответ правильный). Получается, что есть разница, где писать echo: если в теле цикла, то echo выводит на экран результаты вычисления до того момента, когда условие выполняется, но почему echo за телом цикла показывает результат, когда условие цикла уже не выполняется? https://ideone.com/juIFDU
Подскажите, где я делаю ошибку?
Ответы: >>1099427
Аноним 2017/11/28 12:04:26  №1099427 160
>>1099424
А, всё понял: в первый год нужно тоже добавлять процентную ставку, т.е. в Условие_1 тоже нужно прописать $x=$pay*1.1 . Остаётся вопрос про echo. Почему echo после тела цикла выдаёт значение, при котором условие уже не выполняется?
Ответы: >>1099462 >>1099464
Аноним 2017/11/28 12:04:53  №1099428 161
>>1099418
Нашел проблему: у меня все приложение крутится в Докере, там порт для БД 8002 и другой пароль, я же запускал тесты вне докера с другими переменными доступа к БД на 5432 порт. И это фейлилось без ошибок, что странно.

Вообще в Yii много мест, где БД фейлится без ошибок. Уже такое было в системном логгере, когда в одно из полей поступал странный символ в неизвестной кодировке. Просто логгер ничего не логгировал и молчал.
Аноним 2017/11/28 13:02:24  №1099454 162
>>1097438 (OP)
я тут случайно наткнулся на некоего чувака, который заявляет следующее:
1. заканчивать названия объектов на -er - это анти ооп http://www.yegor256.com/2015/03/09/objects-end-with-er.html

2. составные имена типа textLength - это code smell, т.к. скоуп данной переменной слишком большой http://www.yegor256.com/2015/01/12/compound-name-is-code-smell.html

3. пустые строки - это тоже code smell, т.к. они означают, что метод не соблюдает принцип единой обязанности. http://www.yegor256.com/2014/11/03/empty-line-code-smell.html

он там еще много всего заявляет, притом он вроде не из серии "ооп это грех, покайтесь господу", он там какие-то награды раздает за код, вот например им https://github.com/php-ai/php-ml (я так на него и наткнулся)

что ты думаешь об этих идеях? это полная хуйня или он прав?

просто так-то все это звучит логично, но вот например
public function validateEmail($email)
{
if (!StringUtil::isEmail($email)) {
$message = sprintf('"%s" is not a valid login', $email);
throw new InvalidArgumentException($message);
}

return true;
}
чем тут мешает пустая строка? мне наоборот кажется, они улучшают читаемость кода, а упростить его еще дальше тут хз как.

и если он прав, то не слишком ли это высокие материи, чтобы задумываться о них на джун-уровне?
Аноним 2017/11/28 13:06:23  №1099456 163
>>1099454
>и если он прав
Кто-то забыл поставить "else".
Ответы: >>1099465
Аноним 2017/11/28 13:15:01  №1099462 164
>>1099427
И ещё вопрос про программу с айфоном в кредит из того же урока. Нашёл решение задачи, но оно какое-то кривое и мне не нравится (сука, говнокод уже со старта выходит какой-то) https://ideone.com/8BK2Rq

Правильно ли я решил задачу, и можно ли её оптимизировать? Спасибо.
Аноним 2017/11/28 13:16:32  №1099464 165
>>1099427
не до конца понял вопрос. что значит "после echo тело цикла выдает значение"? после echo оно уже ничего не выдает, т.к. цикл не выполняется.

если ты спрашивал "почему значение x больше миллиона, хотя в цикле указано условие чтобы икс был меньше миллиона", то у тебя же идет сначала условие выполнения ЦИКЛА x<1000000, а затем этот x умножается на 1.1. цикл поэтому и не выполняется, а значение увеличивается.

также посмотри, что такое пост-инкремент и используй лучше его, чем +1.
Ответы: >>1099467 >>1099469
Аноним 2017/11/28 13:17:47  №1099465 166
>>1099456
где поставить else? в примере кода?
Ответы: >>1099559
Аноним 2017/11/28 13:22:19  №1099467 167
>>1099464
Немного не в том вопрос. Почему, если echo я вставляю после тела цикла, то программа выполняет его до тех пор, пока на счету не будет больше миллиона и результатом выводит 49 лет, миллион с копейками, а если echo находится внутри цикла, то программа выдаёт 48 лет и сумму, в которой не хватает ещё одного выполнения цикла до выполнения условия х>1000000?
Песдец я криво выражаю мысли
Ответы: >>1099480
Аноним 2017/11/28 13:23:55  №1099469 168
>>1099464
А, и ещё: постинкремент- это "++"?
Почему лучше использовать именно его?
Аноним 2017/11/28 13:46:34  №1099480 169
>>1099467
ты нормально выражаешь мысли, просто я тебе на этот вопрос и ответил. программа выполняет цикл всегда одно и то же количество раз независимо от того, где находится echo. echo просто выводит текущее на данный момент значение переменной, а оно разное 1. до цикла, 2. в каждой новой итерации цикла, 3. после цикла.

цикл выполняется допустим 10 раз. все это время условие цикла верно, и поэтому интерпретатор не выходит из этого цикла дальше по коду (на echo, которое после него). на 11-й условие цикла уже не верно, т.е. x уже больше миллиона. тогда не интерпретатор не выполняет цикл, а идет вниз по коду и видит там echo, и выводит значение x, которое больше миллиона.

если же echo лежит внутри цикла, то там никогда не может быть x больше миллиона. соответственно и год - 48, а не 49. чтобы понять, представь, последовательность, с которой выполняется код. можешь там блок-схему нарисовать.

инкремент лучше хотя бы потому, что $y++ короче, чем $y = $y + 1. и еще потому, что это по сути не арифметическое действие, а счетчик, т.е. семантически это более верно.
Ответы: >>1099494
Аноним 2017/11/28 14:14:04  №1099494 170
>>1099480
Так получается если echo стоит внутри цикла, то цикл выполняется 10 раз, а если за циклом, то 11, но на 11 раз это уже не цикл, а простой код?
Спасибо, няша, добра тебе.
Ответы: >>1099522
Аноним 2017/11/28 14:54:08  №1099521 171
>>1099280
Что касается ситуации с 10 цифрами, там надо написать так:

- сначала напиши "ровно 1 скобка, минус или пробел"
- затем напиши "любое число минусов, скобок или пробелов"
- затем напиши "любое число минусов, скобок или пробелов, за ними ровно 1 цифра"
- затем возьми это в скобки и припишеи повторение 10 раз: (....){10}

Но я не знаю, где может быть, а может и не быть скобка! Подразумевается, что пользователь может быть поехавшим и написать хоть (911) 123 45 67, что (911) (123) (45) (67)!
Ответы: >>1099658
Аноним 2017/11/28 14:57:06  №1099522 172
>>1099494
на 11-й уже не цикл, верно.
Аноним 2017/11/28 16:06:40  №1099559 173
>>1099465
Да, прикинь, возврат из оператора условия из середины функции — это что-то плохое.
Типичный же случай, когда макака начинает учить других макак.
Ответы: >>1099639 >>1100148 >>1100152
Аноним 2017/11/28 16:21:44  №1099565 174
>>1099168
братка, виды отношений знаю, работал.
я рассматривал вариант разделения сущностей на : тесты, вопросы, ответы, прописывая внешние ключи.

по поводу json:
табличка tests,
табличка questions со столбиком questions (json данных по вопросу - тип, варианты ответа).

Ответы: >>1099629
Аноним 2017/11/28 16:40:04  №1099572 175
Тайпхинты вообще везде нужно ставить, где это можно, или лучше их использовать только, когда код немного "запутанный" и лучше перестраховаться от ошибки?
нуб
Аноним 2017/11/28 17:23:25  №1099612 176
>>1099454
Спасибо за чтиво. Там в комментах его называют троллем от ООП. Тоже хочу мнение ОПа на его статьи.

Ебать меня понесло из-за тебя. https://ideone.com/DazJGT
Ответы: >>1108433
Аноним 2017/11/28 17:45:59  №1099629 177
>>1099565
Во-первых, названия таблиц должны быть в единственном числе и мелкими буквами: "test", "question".
Во-вторых, не храни JSON и XML в таблицах, об этом ещё Андрей Орлов писал, в 90-е уже все грабли посчитаны были.
Ответы: >>1099641 >>1099645
Аноним 2017/11/28 18:03:07  №1099639 178
>>1099559
объясни, чем конкретно это плохо
Ответы: >>1099643
Аноним 2017/11/28 18:04:12  №1099641 179
>>1099629
табличка tests,
табличка questions,
табличка answers,
табличка tags,
табличка tests_to_tags

только что набросал, так более менее?
Ответы: >>1099643 >>1099645
Аноним 2017/11/28 18:08:04  №1099643 180
>>1099639
Тем, что это не удастся редактировать.

>>1099641
По стандарту их надо назвать так:
test
question
answer
tag
test_tag

Чтобы потом написать:
SELECT COUNT(*) FROM test LEFT OUTER JOIN question ...
Аноним 2017/11/28 18:09:20  №1099645 181
>>1099629

По поводу названий предлагаю ориентироваться на этот гайд http://www.sqlstyle.guide/ru/

> Используйте собирательные имена или, что менее предпочтительно, форму множественного числа. Например, staff и employees (в порядке убывания предпочтения).

>>1099641

Нормально, но ты не учел, что бывают разные типы вопросов и ответов (числовые, текстовые, с выбором). И получается типичное наследование таблиц.
Ответы: >>1099649
Аноним 2017/11/28 18:18:32  №1099649 182
>>1099645
спасибо, я в sql почти что ноль, все хотел подтянуть, но руки не доходили. благодарю, что направил и мотивировал.

>разные типы вопросов и ответов

думал проскочить, сделав в type_answer
Аноним 2017/11/28 18:26:43  №1099653 183
Читаю про шаблонизатор.
https://github.com/codedokode/pasta/blob/master/php/templates.md

Решил опробовать код и выдает ошибку
Parse error: syntax error, unexpected end of file, expecting elseif (T_ELSEIF) or else (T_ELSE) or endif (T_ENDIF) in C:\Apache24\htdocs\student\template.html on line 13

Почему?

Вот шаблон
https://ideone.com/BhgZOK с расширением .html

Вот логика
https://ideone.com/4giVWT с расширением .php
Ответы: >>1099663
Аноним 2017/11/28 18:48:09  №1099658 184
В дополнение к вопросу >>1099521
Зачем писать [0-9], если можно просто указать \d ?
Ответы: >>1099708
Аноним 2017/11/28 18:56:16  №1099663 185
>>1099653

<?php if ($result): ?>
<?php else: ?>
<?php endif; ?>

короткие теги <? уже не используются и их выключают в настройках php
Ответы: >>1099665
Аноним 2017/11/28 19:00:31  №1099665 186
>>1099663
Спасибо большое, помогло.

Аноним 2017/11/28 19:53:35  №1099695 187
isset($_GET['a']) && is_numeric($_GET['a']) ? $_GET['a'] : 0;

Что означает знак вопроса двоеточие и ноль тут?
Ответы: >>1099721
Аноним 2017/11/28 19:55:24  №1099697 188
https://regex101.com/r/1s0Jab/4

У меня указано 10 итераций по принципу "вначале может быть какой-то символ, а потом число", но получается, что каждый символ съедает один подход.
Как указать, что {10} - это не для вас, молодой человек спец. символов и пробелов, а только для чисел?
Ответы: >>1099708
Аноним 2017/11/28 20:04:58  №1099708 189
И в добавок к постам >>1099697 и >>1099658 , у меня ещё один вопрос:
'+8 234 5678901', / либо 8 либо +7 /
Мне кажется этот пример из учебника неправильным. Ведь можно просто отбрасывать "+" и получать правильный номер.
Ответы: >>1099710
Аноним 2017/11/28 20:07:36  №1099710 190
>>1099708
Если у тебя номеров очень много будет, то ручками придется убирать плюсик, а это очень долго, скучно, нудно, однообразно, верно?
Ответы: >>1099712
Аноним 2017/11/28 20:09:54  №1099712 191
>>1099710
Понятно.
А как указать, чтобы без плюса было?
Ответы: >>1099717
Аноним 2017/11/28 20:14:40  №1099717 192
>>1099712
Можно заменить плюсик на ничего с помощью preg_replace или в регулярку забить +7 или 8 чтобы искало
Ответы: >>1099748
Аноним 2017/11/28 20:20:03  №1099721 193
Ответы: >>1099723
Аноним 2017/11/28 20:24:49  №1099723 194
Аноним 2017/11/28 21:27:38  №1099748 195
>>1099717
>+7
Просто так низя, ибо ОП сделал вариант "+ 7".
Я записал так (8|\+\ *7) , но регулярка срабатывает на +8.
Ответы: >>1099750
Аноним 2017/11/28 21:40:22  №1099750 196
>>1099748
>Просто так низя, ибо ОП сделал вариант "+ 7".

Что мешает искать +,пустое пространство которое возможно много раз или нет, семь или восемь вместо всего этого?
Ответы: >>1099774
Аноним 2017/11/28 22:28:06  №1099774 197
>>1099750
Это я уже решил. Единственная проблема - как заставить систему не тригериться на +8?
Ответы: >>1099784
Аноним 2017/11/28 22:51:29  №1099784 198
>>1099774
накалякал быстро. что-то типо этого. смотри, там идет +,пустое пространство от 0 до бесконечности, 7 ИЛИ 8 вместо всего что было до
https://regex101.com/r/jGHwK6/1
Ответы: >>1099789
Аноним 2017/11/28 22:59:36  №1099789 199
>>1099784
Лол, у тебя не работает, если использовать примеры ОП-а:

'84951234567', '+74951234567', '8-495-1-234-567',
' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67',
'8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567',
'8 ( 999 ) 1234567', '8 999 123 4567'

incorrectNumbers = [
'02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', / неверный код страны /
'+8 234 5678901', / либо 8 либо +7 /
'7 234 5678901' / нет + /
Ответы: >>1099805
Аноним 2017/11/28 23:16:24  №1099805 200
>>1099789
Это понятно, ведь я взял только +7|8
Ответы: >>1099811
Аноним 2017/11/28 23:18:14  №1099811 201
>>1099805
А, подожди. У тебя вообще не было варианта +8.
Ответы: >>1099814
Аноним 2017/11/28 23:20:11  №1099814 202
>>1099811
Конечно, он ведь неправильный.
Ответы: >>1099819
Аноним 2017/11/28 23:22:36  №1099819 203
>>1099814
Хм, может я тогда неправильно выразился.
В общем, мне нужно как-то отсечь вариант +8.
Ответы: >>1099820
Аноним 2017/11/28 23:26:40  №1099820 204
>>1099819
preg_match использовать можно.
Ответы: >>1099822
Аноним 2017/11/28 23:27:29  №1099822 205
>>1099820
Я на сервисе regex101.com пробую. Или это не лучший вариант?
Ответы: >>1099831
Аноним 2017/11/28 23:38:44  №1099831 206
>>1099822
Верный. На нем ты составляешь регулярное выражение. preg_match проверяет, соответствует ли данное значение шаблону, который мы написали и если все окей, то возвращает 1.

С помощью этих знаний, можно попробовать сделать условие, которое будет отрасывать все, что не попадает под регулярное.

https://ideone.com/3pTSSD

Ответы: >>1099867 >>1099994
Аноним 2017/11/29 00:44:23  №1099856 207
У меня css (бутстрап, подключал не через CDN, а через файлы) на локальном сервере грузится где-то одну-две секунды. Это конечно не такая большая пауза, чтобы она меня бесила, но все же. Это нормально?
Аноним 2017/11/29 01:45:58  №1099864 208
Как лучше отправлять данные на сервер через get или post ?
Ответы: >>1099866
Аноним 2017/11/29 01:46:38  №1099866 209
Аноним 2017/11/29 01:47:13  №1099867 210
>>1099831
Хм, т.е. ответ от сервиса релевантный.
Ответы: >>1099877
Аноним 2017/11/29 02:20:37  №1099877 211
Ответы: >>1099882
Аноним 2017/11/29 02:27:44  №1099882 212
>>1099877
Если что я новичок. Сделал задачу про вектор, но ужаснулся студентов и не знаю, что дальше делать
Аноним 2017/11/29 03:53:07  №1099907 213
У меня тут вопрос.

https://ideone.com/7g7sdm

Почему вызов функции работает до объявления функции?
Ответы: >>1099919
Аноним 2017/11/29 05:41:45  №1099919 214
>>1099907
Короткий ответ: Файл не исполняется в лоб построчно. Если функция в этом же файле, PHP ее найдет.
Вот это уже упадет с ошибкой:

<?php
foo();
require_once "file_with_foo.php";
Аноним 2017/11/29 06:00:24  №1099926 215
>>1097603
Тебе никто не отвечает, потому что ты не сформулировал вопрос. Более того, во всём твоём посте даже знака вопроса нет, шизик )))
Ответы: >>1100227
Аноним 2017/11/29 06:00:47  №1099927 216
>>1097643
Есть, у нашего уборщика
Ответы: >>1100012
Аноним 2017/11/29 06:05:03  №1099928 217
>>1098043
За два месяца реально вкатиться только в двухмесячного вкатывальщика, нодискасс.
Аноним 2017/11/29 06:12:44  №1099930 218
>>1098468
Лучше сразу приучить себя к IDE, из бесплатных -- Eclipse, из платных -- phpStorm
Аноним 2017/11/29 06:34:46  №1099934 219
15119264866870.jpg (57, 700x345)
345x700
>>1099139

> 1)
Здесь написано, что параметром функции1 set_exception_handler должно быть имя функции2, в свою очередь принимающей в качестве параметра объект типа 'исключение'

Мануал с примерами: http://php.net/manual/ru/function.set-exception-handler.php

> 2)// В try пишется код, в котором мы хотим перехватывать исключения
> $users = loadUsersFromFile(...);

> Это значит, что в переменную $users будут класться исключения?

Нет. В блоке try { } обычный код твоей программы, который должен выполняться без ошибок. Обработка исключений(ошибок) -- в блоке catch {}

> 3) $e->getMessage() это метод встроенного класса Exception ?
Да

> И что она выводит?
http://php.net/manual/ru/exception.getmessage.php

<?php
try {
    throw new Exception("Какое-нибудь сообщение об ошибке");

} catch(Exception $e) {
    echo $e->getMessage();

}
Ответы: >>1099938
Аноним 2017/11/29 06:38:30  №1099935 220
>>1099454
Выебоны не по делу, важен результат
Аноним 2017/11/29 06:53:59  №1099938 221
15119276399260.jpg (125, 750x927)
927x750
>>1099934
>>1099139
Короче, блэт,

<?php
try {
//Тут код нашей программы
$a = 2*2;

//Который мы проверяем
if ( $a !== 4 )
throw new Exception("Пиздос!");

} catch(Exception $e) {
//А тут обработка ошибок. Можно показать её, записать в лог, отправить себе на имейл и т.д.
echo $e->getMessage();

//в некоторых случаях можно попытаться её исправить
$a = 4;

//или остановить программу
exit(1);

}
Аноним 2017/11/29 09:51:04  №1099976 222
15119382642880.png (6, 371x271)
271x371
Анончики, расскажите глупому почему это не работает?
Ответы: >>1099992
Аноним 2017/11/29 10:42:54  №1099992 223
>>1099976
Тебе нужна функция array_key_exists(). in_array() ищет по значениям, а не по ключу.
Ответы: >>1099993
Аноним 2017/11/29 10:45:45  №1099993 224
>>1099992
Спасибо, добрый анон.
Аноним 2017/11/29 10:47:46  №1099994 225
>>1099831
Понятно.
Так-с, теперь у меня 2 вопроса:

1.Как логически указывается, чтобы пробел/дефис/что-то ещё не считалось за цифру?
2.Как указывать жесткое "или", чтобы не срабатывало на +8?
Ответы: >>1100101 >>1100105 >>1100116
Аноним 2017/11/29 12:10:44  №1100012 226
Ответы: >>1100029 >>1100036
Аноним 2017/11/29 13:25:41  №1100029 227
Аноним 2017/11/29 13:45:33  №1100036 228
>>1100012
Убирается в офисе, что непонятного?
Аноним 2017/11/29 13:46:36  №1100037 229
>>1097643
у меня есть опыт работы джуниором в дс без переезда лол. думаю, имеет смысл сначала прокачаться по максимуму (может, что-то на фрилансе поделать), сделать какое-то портфолио на гитхабе, потом приехать в дс, снять комнатку и уже параллельно искать работу. а получить оффер из дс, находясь в мухосранске, мне кажется, очень сложно. надо быть прямо на голову выше местных дсшных студентиков и перекатившихся.
Ответы: >>1100079
Аноним 2017/11/29 13:50:57  №1100040 230
>>1097643
плюс в дс есть определенные конторы-потогонки, которые набирают студентов работать по 12 часов в день за гроши и типа их "выращивают". они могут заинтересоваться чуваком, который будет полностью от них зависим. я в такой работал, это на любителя, хотя и прокачивает хорошо.
Ответы: >>1100062 >>1100079
Аноним 2017/11/29 14:37:48  №1100062 231
>>1100040
ГОВНОКОДИШЬ ЗА ЕДУ
@
ПО ВЕЧЕРАМ УБЕЖДАЕШЬ СЕБЯ, ЧТО ХОРОШО ПРОКАЧАЛСЯ
Ответы: >>1100074 >>1100075
Аноним 2017/11/29 14:58:19  №1100074 232
>>1100062
Будет что внукам рассказать!
Аноним 2017/11/29 14:58:24  №1100075 233
>>1100062
не то чтобы говнокодишь, там большой проект и нормальный аудит. через год такой работы я пошел на другую за норм бабки
Аноним 2017/11/29 15:19:02  №1100079 234
>>1100037
У меня денег только на первый месяц проживания в ДС. А перекатиться и слить сразу все накопления на хату и при этом ещё и не получить работу будет уж слишком обидно. Но спасибо за ответ.
>>1100040
Я на большее и не рассчитываю.
Ответы: >>1100106 >>1100110
Аноним 2017/11/29 15:46:22  №1100089 235
15119595824680.png (9, 857x142)
142x857
Назвал переменные логично, но они трудночитаемы. Отличаются только единственным/множественным числом, то-есть маленьким и неприметным символом "s". Как можно было бы сделать лучше
Ответы: >>1100091 >>1100092
Аноним 2017/11/29 15:52:51  №1100091 236
>>1100089

Думаю, подойет просто options или names.
Ответы: >>1100173
Аноним 2017/11/29 15:53:43  №1100092 237
>>1100089

Алсо, array_diff/array_intersect.
Ответы: >>1100173
Аноним 2017/11/29 16:22:34  №1100101 238
>>1099994
Ещё один бамп вопросу
Аноним 2017/11/29 16:39:54  №1100105 239
>>1099994
>Как логически указывается, чтобы пробел/дефис/что-то ещё не считалось за цифру
Пробел/дефис/что-то кроме цифры никогда не считается за цифру. Переформулируй вопрос.
>Как указывать жесткое "или", чтобы не срабатывало на +8?
(+7|8)
Андвансед левел, чтобы не засорять бэкрефы - (?:+7|8)
Теперь результат совпадения этой подмаски не будет сохранен в массиве $matches.
Ответы: >>1100110 >>1100322
Аноним 2017/11/29 16:42:45  №1100106 240
>>1100079
ну пойдешь курьером поработаешь месяц, если не получится. а потом работу джуном в дс не так сложно найти, если знания есть.
Аноним 2017/11/29 16:46:35  №1100110 241
15119631953680.jpg (53, 635x322)
322x635
15119631953681.jpg (52, 639x311)
311x639
15119631953682.jpg (51, 625x302)
302x625
>>1100105
>Пробел/дефис/что-то кроме цифры никогда не считается за цифру. Переформулируй вопрос.
Я написал, может быть херовое, но такое выражение:
[- \(-\(\)\d]{10})
Т.е. вначале может быть, а может и не быть знак, а потом идет число.
Система засчитывает любой символ, как одно из 10-ти значений, которые нужно найти.

Вот скрины. +8 проглатывается.

>>1100079
>У меня денег только на первый месяц проживания в ДС
Ну так иди в какой-нить саппорт по-приличнее, чтобы
1)Опыт работы в ДС появился.
2)Бабло было на поиски.
Но да, может случиться "проклятье острова Баунти".
Ответы: >>1100125 >>1100128
Аноним 2017/11/29 16:52:57  №1100116 242
>>1099994
Вдогонку. Чтобы не трахаться с пробелами и дефисами, просто сделай strtr($phoneNumber, [' ' => '', '-' => '', '(' => '', ')' => '']); перед сравнением с регуляркой.
А то я заметил, что + 7 у тебя тоже должно матчится. Да и к тому же, ты не сможешь предугадать, куда твой юзер поставит пробелы, дефисы и даже скобки.

https://ideone.com/uwW1i1
Аноним 2017/11/29 17:05:09  №1100125 243
15119643099190.png (44, 477x652)
652x477
>>1100110
Но если ты хочешь заморочиться и решить все регулярками, то даю подсказку.
Ответы: >>1100313
Аноним 2017/11/29 17:08:23  №1100128 244
15119645035160.png (32, 268x622)
622x268
>>1100110
Кстати, в реальной жизни может быть так и даже так. ОП как-то не подумал.
Ответы: >>1100313
Аноним 2017/11/29 17:48:09  №1100148 245
Аноним 2017/11/29 18:00:06  №1100152 246
>>1099559
прикинь, возврат и завершение скрипта с помощью throw - это разные вещи
Аноним 2017/11/29 18:31:14  №1100164 247
>>1097438 (OP)
За месяц учёбы по учебнику ОПа через день по вечерам, только закончил регулярки. Я совсем глупый или это норм?
Ответы: >>1100182
Аноним 2017/11/29 18:41:58  №1100168 248
Я правильно понимаю, что фреймворки пишутся в стиле ООП?
Аноним 2017/11/29 18:50:20  №1100171 249
15119706204230.png (251, 1940x600)
600x1940
Ответы: >>1100259
Аноним 2017/11/29 18:54:57  №1100173 250
>>1100091
Так не получится, ибо у меня есть еще одни опции - опции из файла. Вот и получается $fileOptions и $optionsInComplectationsName
>>1100092
А вот за это спасибо, че-то не вспомнил про них
Аноним 2017/11/29 19:10:18  №1100182 251
>>1100164
Нормально, просто у тебя нет временных рамок. Если бы ты работал и тебе на работе дали такое же задание с указанием "сделать к вечеру", ты бы скорее всего сделал его к вечеру или к ночи.
Аноним 2017/11/29 19:24:32  №1100188 252
Как сделать задачу я тебя помню на куки? Я прочитал в мануале, но все равно что-то не понимаю
Ответы: >>1100210
Аноним 2017/11/29 20:19:41  №1100210 253
Ответы: >>1100222 >>1100223 >>1100248
Аноним 2017/11/29 21:02:39  №1100222 254
>>1100210
>time() + 6
Твоя кукиса будет жить 6 секунд. А так - правильно.
Ответы: >>1100234
Аноним 2017/11/29 21:04:23  №1100223 255
>>1100210
btw будет совсем правильно поставить флаг httpOnly = true. Будет больно, потому что он в самом конце необязательных параметров.
Ответы: >>1100234
Аноним 2017/11/29 21:10:16  №1100227 256
>>1099926
>>1097603
В чем проблема? Почему из цикла выходит? Должно же быть все нормально
Аноним 2017/11/29 21:21:06  №1100234 257
Ответы: >>1100245
Аноним 2017/11/29 21:43:50  №1100245 258
>>1100234
>Подробнее?
>потому что он в самом конце необязательных параметров
Ответы: >>1100246
Аноним 2017/11/29 21:49:42  №1100246 259
Аноним 2017/11/29 21:55:37  №1100248 260
>>1100210

Изучи, какие параметры есть у кук.

Ты не указал параметр path. Это значит, что для куки он будет выставлен по умолчанию как путь к скрипту - например, /folder/script.php. Когда у тебя один скрипт, это не проблема, но когда их много, кука будет видна не везде.

Лучше сразу привыкать ставить /, чтобы кука была доступна на всем сайте, а не только в одном скрипте.
Ответы: >>1100251
Аноним 2017/11/29 22:04:32  №1100251 261
Аноним 2017/11/29 22:19:20  №1100259 262
>>1100171
а еще завтра все обновляем прод сервер на 7.2
Ответы: >>1100262 >>1100266
Аноним 2017/11/29 22:28:44  №1100262 263
Ответы: >>1100276
Аноним 2017/11/29 22:42:16  №1100266 264
>>1100259
Лол, в треде 7.1 сегфолтится, а вы еще и релиз кандидат накатываете? Храбрые вы парни.
Ответы: >>1100276
Аноним 2017/11/29 23:13:33  №1100274 265
15119864134500.gif (31, 400x300)
300x400
А-а-а-а-а, задача про гостиницу кажется такой простой, но хрен там плавал. Второй вечер решаю, ни одну возможность еще не реализовал, а кода уже на 400 строк.
Ответы: >>1100279 >>1100335
Аноним 2017/11/29 23:18:02  №1100276 266
>>1100266
>>1100262
полёт совершенно нормальный, на кучке из нескольких проектов, как на вирт. хостинге (sprinthost), так и у себя на колокейшнах, нах
Ответы: >>1100281
Аноним 2017/11/29 23:21:47  №1100279 267
>>1100274
Реквестирую задачу про гостиницу
Ответы: >>1100283
Аноним 2017/11/29 23:23:08  №1100280 268
Двач, так вышло, что нужно за 2 недели осилить приложение реализующее функционал домашней бухгалтерии.
Все бы ничего, но php и web в целом до этого не трогал вообще, сейчас сижу и не понимаю за что хвататься-то, как хоть что-то сделать, помогите советом
Ответы: >>1100282
Аноним 2017/11/29 23:23:29  №1100281 269
>>1100276
добавлю: всё писалось изначально на 7,
если на 5 -- может быть, и возможны проблемы, мы не знаем
Аноним 2017/11/29 23:24:06  №1100282 270
>>1100280
а что трогал?
почему теперь именно РНР?
Ответы: >>1100284
Аноним 2017/11/29 23:28:59  №1100283 271
>>1100279
[quote user="codedokode"]
Есть Гостиница, в ней есть Номера. Для каждого Номера известен его номер,

количество Гостей, которое в него влезет, а также цена за сутки. В Гостиницу

приезжают Гости. Нужно сделать ООП-модель Гостиницы с такими возможностями:

- получить список свободных номеров на определенную дату
- получить список свободных номеров, которые будут свободны в определенный

диапазон дат (от A до B)
- дан список Гостей и диапазон дат, в которые они хотели бы заселиться. Необходимо

подобрать им самый дешевый и маленький Номер, который их вместит и который

свободен в это время.
- то же самое, но при отстутствии одного подходящего номера для Гостей разрешается

заселить их в несколько номеров, опять же, начиная с самых дешевых. Например,

приехало 3 Гостя, но все 3-местные номера заняты и мы выделяем 2 2-местных, или 3

1-местных или 1-местный + 2-местный.
- зарегистрировать проживание данных Гостей в данных Номерах на данный период
- получить историю заселения Номера (кто в нем когда жил)
- получить историю заселения Гостя (в каких номерах он жил)
- получить статистику доходов Гостиницы за данный диапазон дат (в день A отдель

заработал X тугриков, в день B - Y тугриков и так далее)


-------------------

Сделать достаточно только ООП-модель, то есть классы (но конечно можно для

проверки дописать код, который проверяет, что все сложные методы работают). Для

представления даты в PHP есть класс DateTimeImmutable (

http://php.net/manual/ru/class.datetimeimmutable.php ), почему я рекомендую его, а

не DateTime, подумай сам.
[/quote]

Правда, я еще реализую код, проверяющий все это - строящий отель, заселяющий гостей, и т.д.
Ответы: >>1100286 >>1108692
Аноним 2017/11/29 23:30:07  №1100284 272
>>1100282
а трогал всякий десктоп, в принципе, подобие того, что просят делал, но на шарпе с wpf-ом.
А PHP потому что пытаюсь податься на стажировку и просят там тестовое именно на PHP
Ответы: >>1100287
someApprentice 2017/11/29 23:33:29  №1100285 273
>>1097368
>Насчет данных с paypal - не знаю, скорее всего нет. Но думаю, они будут доступны для американской разведки.
Скорее для российской. Я сомневаюсь, что в условиях информационной войны, российские спец.службы позволят владеть данными своих граждан. Если конечно, они не было получины задолго до этого.

>Авторское право © PayPal, 1999–2017 гг. Все права сохранены. Общество с ограниченной ответственностью Небанковская кредитная организация «ПэйПал РУ». Юридический адрес: Российская Федерация, 125047, Москва, ул. Бутырский Вал, д. 10. Деятельность осуществляется на основании лицензии Центрального банка России № 3517-К.

Но у российской разведки уже есть мои данные, так что волноваться не о чём.

>> Мне видеться использовать JSON-объект с свойствами каждого вложения.
>Скорее всего что-то такое и было.
Я думаю, вот можно было для какой-нибудь сущности иметь колонку temp с типом JSON и сохранять туда какие-нибудь второстепенные/временные/неважные данные. Можно былоо бы гибче обращаться с записями. Как вам идея?

>- кеширование - кеш снижает нагрузку на чтение из БД, при условии, что запросы повторяются, и что обновление данных происходит реже, чем чтение.
Можете посоветовать какой-нибудь софт/библеотеку для этого?

>> Как можно заранее построить схему, если со временём неизбежно придётся что-то менять, а данных слишком много?
>Вот ты думаешь, что проблема - это слишком много данных, а реальная проблема - это то, что у тебя слишком мало пользователей. Если у тебя будет очень много пользователей, то скорее всего и будет много денег для покупки серверов.
>
>А так, сохранять стоит все, что есть.
Нет, я имел ввиду что структура таблицы может поменяться и старые данные могут не соответствовать этой структуре.
К примеру, что-то не предусмотрели, например, понадобилось в список чатов добавить ещё время добавления пользователя в чат, но уже в созданных чатах есть добавленные пользователи и невозможно получить их время добавления.
Нужно заранее подготавливать "правильную" структуру, но такое было бы возможно если бы прогресс стоял на месте.

Но я только что понял, что такой вопрос нужно решать на стадии миграции.
Аноним 2017/11/29 23:33:34  №1100286 274
>>1100283
Спасибо. Я когда вектор говношлепал тоже вышло много строчек а толкового ничего. Переделывал полностью раза три все с горящим пердаком.
Ответы: >>1100288 >>1100335
Аноним 2017/11/29 23:36:10  №1100287 275
>>1100284
Для специалиста (но не факт, что тебя, как я понял) по шарпу освоить синтаксис PHP -- не такая уж большая проблема, значит -- кури в первую очередь официальный мануал: http://php.net/manual/en/

Тебе понадобятся азы (переменные, приведение типов, функции, строковые функции, ООП),
и, если просят работу с БД, то раздел PDO.
Аноним 2017/11/29 23:36:42  №1100288 276
>>1100286
трудна жизнь вкатывальщика-2018, ничего не поделать
Ответы: >>1100291
Аноним 2017/11/29 23:44:03  №1100291 277
>>1100288
Не поспоришь. Но ничего. Мой максимализм еще никому не удалось победить!
Аноним 2017/11/29 23:58:30  №1100297 278
15119891104970.png (42, 800x517)
517x800
ОП, хочу уточнить.

>дан список Гостей и диапазон дат, в которые они хотели бы заселиться. Необходимо подобрать им самый дешевый и маленький Номер, который их вместит и который свободен в это время.

На данный момент я пренебрегаю ценой, но селю каждую партию гостей в минимально маленький номер.
Допустим, у меня два номер, за 1000 тугриков для двоих, и за 500 для троих. И две группы гостей - двое и трое. Я селю двоих в номер за 1000 и троих за 500. То есть двое могли сэкономить, засели я их в номер для троих, но тогда бы я не смог заселить группу из троих человек.
Я правильно понимаю, что подразумевается, я должен заселить максимальное количество человек, а не экономить им деньги и оставлять кого-то на улице?
Ответы: >>1100303 >>1100347
Аноним 2017/11/30 00:16:13  №1100303 279
>>1100297
думай с позиции мкс. прибыли гостишки
Ответы: >>1100305
Аноним 2017/11/30 00:20:48  №1100305 280
>>1100303
Тогда я все правильно делаю.

Но есть еще вопрос.
Допустим, у меня есть два трехместных номера, один за 300, другой за 500. И две заявки, номер 0 - на троих персон и номер 1 - на одного. Сейчас я обрабатываю их по порядку, и выходит, что три человека заселятся в номер за 300, а один - за 500. Но по факту мне пофиг, кого куда селить в такой ситуации, бабло я получу, а вот бедный одиночка будет платить 500 тугриков, а троица - по сотне с носа.
Должен ли я проявлять человечность и в таком случае селить одиночку в номер за 300?
Ответы: >>1100308 >>1100335 >>1100342
Аноним 2017/11/30 00:21:57  №1100306 281
15119905175470.png (5, 448x357)
357x448
Какие сейчас лучшие сайты по фрилансу? Простой интернет-магазин могу сделать, лендинги и другую хуйню(если пиздить дизайны).
Аноним 2017/11/30 00:29:37  №1100308 282
>>1100305
Накой ты за них вообще решаешь? Выдавай им варианты, пусть сами думают куда им заселяться.
Ответы: >>1100309
Аноним 2017/11/30 00:36:23  №1100309 283
>>1100308
сел писать искусственный интеллект
Ответы: >>1100335
Аноним 2017/11/30 00:50:46  №1100313 284
>>1100128
>>1100125
Никак не могу найти, что означает ":" в твоем примере.
Ответы: >>1100322 >>1100345
Аноним 2017/11/30 00:52:33  №1100314 285
15119923540740.png (8, 1284x661)
661x1284
15119923540741.png (22, 1680x727)
727x1680
15119923540752.png (14, 1615x826)
826x1615
Играюсь тут с браузерами. Написал js скрипт-приветствие в форму, оно работает, лол. Это имеется в виду, когда говорится, что можно так украсть кукисы и прочие данные? Как можно запретить вводить скрипт в эштиэмэль формы?
Ответы: >>1100324 >>1100336
Аноним 2017/11/30 01:02:02  №1100322 286
>>1100313
Я же объяснил в >>1100105.
?: - именно в такой комбинации - не запоминать результат в скобках. Всегда пишется сразу после открывающей скобки. Можешь безболезненно убрать эти символы, тут это лишнее, если тебе нужно просто сравнить строку с регуляркой. У меня просто привычка не засирать массив с результатами, пишу на автомате.
Ответы: >>1100326
Аноним 2017/11/30 01:04:34  №1100324 287
>>1100314
>Это имеется в виду, когда говорится, что можно так украсть кукисы и прочие данные?
Да.
>Как можно запретить вводить скрипт в эштиэмэль формы?
Никак, ты должен применять htmlspecialchars($text) при выводе пользовательских текстов.
Ответы: >>1100325
Аноним 2017/11/30 01:06:46  №1100325 288
>>1100324
Спасибо за ответ.

> ты должен применять htmlspecialchars($text) при выводе пользовательских текстов.


Можно пример пожалуйста?
Ответы: >>1100328
Аноним 2017/11/30 01:08:46  №1100326 289
>>1100322
>бэкрефы
Я честно пытался загуглить, что означает это понятие. Количество итераций?

Ответы: >>1100328
Аноним 2017/11/30 01:16:46  №1100328 290
>>1100325
>Можно пример пожалуйста?
echo htmlspecialchars('<script>alert('hi');</script>');
Результат отобразится как простой текст.

>>1100326
Back references, обратные ссылки. В них по умолчанию сохраняется содержимое скобок. Они же кладутся в массив $matches. В регулярке доступны в виде $цифра либо \цифра. Например, ловим парные html-теги: /<(div|a|b)>.*?</$1>/g.
Если не понял, ни ссы, еще поймешь. С регулярками всегда так.
Ответы: >>1100329 >>1100331 >>1100501
Аноним 2017/11/30 01:18:14  №1100329 291
>>1100328
Фикс примера: echo htmlspecialchars("<script>alert('hi');</script>");
Аноним 2017/11/30 01:21:00  №1100331 292
>>1100328
>htmlspecialchars('<script>alert('hi');</script>');

Спасибо. А как сделать если через форму?

Допустим у меня вывод формы echo $_GET["text"];

он все равно выводит нежданный скрипт
Ответы: >>1100332
Аноним 2017/11/30 01:25:48  №1100332 293
15119943481600.png (3, 340x199)
199x340
>>1100331
Извиняюсь, я понял. Все. Выводит нормально
Аноним 2017/11/30 01:34:37  №1100335 294
>>1100274
>>1100286

Советую обязательно решить. Ваши мучения не пропадут даром. В большинстве учебников, а тем более в видеокурсах на ютубе, вам никто нормально ООП не объяснит. В лучшем случае вас заставят вызубрить дословно 3 определения принципов ООП (инкапсуляция/наследование/полиморфизм, и может быть, SOLID), которые вы не поймете, и расскажут как объявить класс. А на задачах про Гостиницу и про Продюсерское Агенство вы более-менее сможете увидеть реальное применение ООП, как оно облегчает написание кода за счет разбиения на отдельные классы (если думаете, что не облегчает, попробуйте без классов решить). Научитесь проектировать ООП-модель для задачи.

Надеюсь, что в итоге вы будете сильнее тех кандидатов, которые заучили 3 определения. Но это не точно, ведь может оказаться, что собеседующий тоже толком не понимает ООП. Но ООП вам точно пригодится, если захотите разобраться с той же Симфони.

>>1100305

Вообще, у меня в задаче была речь про обработку одной заявки. Если их несколько - обрабатываем в порядке поступления, кто первый подал заявку, тот и получает номер получше.

> Должен ли я проявлять человечность и в таком случае селить одиночку в номер за 300?
Это здравое рассуждение. Одиночка с меньшей вероятностью заплатит 500, чем трое человек - те же 500. Следовательно, замена номеров повышает вероятность, что Гость захочет воспользоваться услугами нашей, а не чужой Гостиницы. Гости ведь тоже не дураки, и про букинг и airbnb в курсе.

Раз ты так хочешь, давай сделаем дополнительно оптимизацию: добавим метод, который принимает N заявок, и пытается распределить их так, чтобы обеспечить максимальную вероятность заселения.

При этом перераспределение должно быть таким, чтобы гостиница не теряла прибыль. То есть после перераспределения общая оплата не должна уменьшиться.

Предлагать надо номер с минимальной ценой, нельзя предложить дорогой номер, если есть более дешевый.

Мы должны так же стараться оставить как можно больше свободных мест. Не предлагать 5-местный номер для 1 гостя, если есть номера меньше за ту же цену.

Это типичная задача на оптимизацию. Любую задачу на оптимизацию можно решить полным перебором. Нужно лишь определить функцию-критерий ( целевую функцию ) оптимизации (которую мы хотим максимизировать/минимизировать), посчитать ее значение для каждого варианта, и выбрать наилучший.

Иногда, конечно, перебор не реализуем, так как факторов очень много, и нужны специальные алгоритмы (гугли: задача коммивояжера), но у нас не тот случай и перебор допустим.

Сделать это можно попробовать так:

- берем K заявок
- для каждой заявки находим все варианты заселения. Ну то есть N номеров, куда можно поселить этих гостей.
- для каждой пары (1 заявка - 1 вариант заселения) вычисляем очки. Формула для вычисления очков подбирается так, чтобы можно было численно измерить, какой вариант "лучше", "выгоднее" для нас:
-- при прочих равных, чем меньше плата с группы за номер, тем больше очков (то есть лучше предложить номер за 300, чем за 500)
-- при прочих равных, чем меньше плата с 1 человека, тем лучше (лучше заселить одиночку в номер за 300, а группу в номер за 500, чем наоборот)
-- при прочих равных, чем меньше остается в номере свободных мест, тем лучше (одиночку лучше всего селить в одноместный номер)

Каждый критерий вносит вклад в общую оценку с определенным весом. Ну например, можно сделать так, что первый критерий всегда перевешивает остальные, и
они принимаются во внимание, только если первый критерий одинаков. А можно выбрать веса как-то еще.

Теперь, мы можем взять распределение (кто конкретно в какие номера заселяется), просуммировать оценки для каждой пары заявка-номер и мы получим численную оценку этого распределения. Вычислив оценку для всех возможных распределений, мы сможем найти оптимальное.

Казалось бы, задача решена.

Но тут, увы, грабли нам подсовывает комбинаторика. https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0

Если у нас K заявок и N номеров, то число возможных распределений (вариантов заселения) - это размещение из N по K : https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5

И так как в формуле использован факториал, то при сотне номеров и десятке заявок числа получаются гигантские (100! / 90! = 100 x 99 x 98 x 97 ... 91 ~ 1 x 10^20).

Потому предлагаю придумать способ попроще. Например, такой:

- берем N заявок
- для каждой заявки находим K подходящих номеров, считаем очки для каждого варианта и получаем отсортированный список, от наилучшего к наихудшему варианту.
- теперь мы имеем N заявок и N отсортированных списков предложений номеров
- берем из каждого списка предложений первый вариант (лучший внутри списка) и ищем среди них лучший по очкам. Находим, заселяем. Убираем эту заявку и список предложений для нее. Удаляем занятый номер из остальных списков (или игнорируем его впредь).
- затем берем из оставшихся первых элементов списков следующий, чуть похуже. Заселяем, удаляем заявку и список.
- и так далее, пока списки не кончатся и все гости не будут заселены (либо пока не закончатся номера и списки предложений не станут пустыми)

Я этот алгоритм написал по интуиции, без доказательств, но думаю, что в твоем случае он бы сработал. Очевидно, что имея N отсортированных списков по K элементов, их обход, пусть даже неоднократный, займет не так много времени.

Что остается сделать тебе:

- понять идею
- выбрать критерии для вычисления очков. На вход функции подается заявка и номер, и она должна оценить эту пару численно.
- сделать тесты, проверяющие, что алгоритм оптимален. То есть сделать набор ситуаций, и проверить, что в каждой алгоритм дает оптимальное решение. Это могут быть тесты вида: проверяем, что при прочих равных выбирается номер подешевле, поменьше и тд. И твоя ситуация, где есть 2 варианта заселения.

Как, справишься? Заодно поучишься оптимизации.

Понятно, что задачи оптимизации очень даже жизненные и встречаются везде, и в науке, и в бизнесе. Потому они хорошо изучены.

Если тебя вдруг заинтересовала эта тема, и хочется знать еще больше - гугл в помощь: https://www.google.ru/search?q=%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B+%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&newwindow=1&dcr=0&gbv=1&sei=JjQfWqvDKoLE6QTwzq-ADw

>>1100309

Тем оптимизации пересекается с машинным обучением, так что ты недалек от истины.
Ответы: >>1100346
Аноним 2017/11/30 01:35:25  №1100336 295
Аноним 2017/11/30 01:55:27  №1100342 296
>>1100305

Тебе наверно сложно сразу понять алгоритм, потому дам аналогию. представим себе таблицу, где по горизонтали идут свободные номера, а по вертикали - заявки на заселение. В каждую клеточку мы записываем оценку данного варианта заселения - чем оно лучше, тем выше оценка. Если заселить нельзя, пишем 0. Также, в уголке клеточки запишем Номер, к которому она относится (это пригодится позже).

Допустим, у нас 10 заявок и 100 номеров.

Наша цель - закрасить 10 клеточек в таблице так, чтобы они дали максимальную сумму.

Если функция оценки произвольная, то нам придется перебирать все возможные варианты заселения.

Но у нас функция не произвольная. Она растет довольно линейно: все хотят номер подешевле и поменьше. Единственное, что в разных заявках разное число человек, разная плата на человека и потому оценка одного номера для разных заявок различается.

За счет этого мы можем вместо полного перебора отсортировать каждую строку таблицы по убыванию (при этом Номер записан в углу ячейки и не теряется) - чтобы в каждой строке сначала шел номер с наибольшей оценкой. После чего мы берем первую колонку таблицы, и ищем в ней наибольшее число. Закрашиваем эту клеточку, удаляем клеточки с таким же номером (так как он уже заселен). Ищем среди оставшихся наибольшее число, закрашиваем. И так, пока не закрасим все 10 клеточек.

Так понятнее, надеюсь?
Ответы: >>1100349
Аноним 2017/11/30 02:08:39  №1100345 297
Аноним 2017/11/30 02:10:54  №1100346 298
>>1100335
Ого, слишком сложно, я все-таки больше ООП хочу выучить.
На данный момент я реализовал:
1. Чтобы всегда заселять максимум народа не дробя группы (дробление еще не сделал).
2. Чтобы мелкие группы получали N-местные номера дешевле, чем N-местные номера для больших групп. То есть двое арендуют трехместный за 300, а трое за 500, и никогда наоборот.

Улучшить алгоритм не напрягаясь можно так: селим сначала каждую группу в самый дешевый вмещающий номер, при этом меньшая по размеру группа получит номер дешевле. Если всех заселили, мы молодцы. Если кто-то остался на улице, применяем старый алгоритм "заселять максимум народа не дробя группы" и заселяем всех заново.

Так и сделаю. На глаз тут будет работать принцип Парето - 20% усилий на разработку алгоритма (от системы с баллами) покроет 80% случаев несправедливости.
Ответы: >>1100348
Аноним 2017/11/30 02:14:07  №1100347 299
>>1100297

Заселить нужно всех. Но я думаю, ситуация малореалистична, скорее номер на 3-х будет стоить 1000. А то мой оптимизированный алгоритм может и не заработать на таких данных.

Алсо, если ты попробуешь нарисовать таблицу с очками, как я написал выше, то выбор будет очевиден.

Я прикинул сейчас с таблицей, все же мой алгоритм сработает верно тут. При условии, что заселение 3 человек в 3-местный номер даст больше очков, чем 2 человек в тот же номер.

Эх, математика бы сюда, разбирающегося в методах оптимизации. .. Эй, аноны-математики из /pr/, смотрите, какая у нас задача интересная получилась.
Аноним 2017/11/30 02:16:29  №1100348 300
>>1100346

У тебя ведь и получается система с баллами, в неявном виде. Ты пишешь "сначала буду заселять туда" - а это эквивалентно присвоению баллов и выборе клеточки с наибольшим числом баллов.

Ты попробуй нарисовать таблицу, как я предложил, на ней твои ситуации очень наглядно выглядят.
Аноним 2017/11/30 02:20:36  №1100349 301
>>1100342
Да, понятно. Я уже сейчас сортирую вместимости + оплате, то есть 1 - 100, 1 - 130, 2 - 90, 2 - 100 и так далее, а группы - по количеству. Но при этом вместимость играет ключевую роль. То есть я отправлю человека в одноместный номер, если он один, даже если он стоит 100500 денег.
Как оценивать в баллах вместимость? Я не представляю.
Тут игра на два фронта. Клиент хочет дешевле, а я хочу вселить больше. Разумеется, я и вселяю как можно больше. Но если я могу вселить всех по минимальному прайсу, не оставив никого на улице, я сделаю так в первую очередь. Вот.
Конечно, может случится ситуация, что я вселил одиночку в четырехместный номер за 100, а на улице осталась группа из четырех человек и одноместный номер за 1000. И в таком случае, хм, можно попробовать заселить того, кто на улице в минимально дешевый занятый номер на 4 персоны, жильцов того номера попробовать заселить в пустой номер, если не выходит, то заселить в минимально дешевый занятый номер, а других переселить в пустой номер, но если не выходит... И так далее, пока не заселю всех! Бинго! Спорю, это самый выгодный алгоритм!
Ответы: >>1100352
Аноним 2017/11/30 02:27:44  №1100352 302
>>1100349

Нет, так тоже не годится. Если у тебя есть свободный номер за 100, а ты предлагаешь номер за 200, то Гость может просто открыть букинг и пойти в другую Гостиницу. Нужно бы, если есть возможность, предлагать самый дешевый из имеющихся вариантов.

> Как оценивать в баллах вместимость? Я не представляю.
Если остается 0 пустых мест в номере = 1000 баллов
Если одно = 500 баллов
Если два = 250 баллов
...

Или использовать отрицательные баллы: -100 x (число незанятых мест в номере).

> если не выходит, то заселить в минимально дешевый занятый номер, а других переселить в пустой номер, но если не выходит... И так далее, пока не заселю всех!
Так (пробуя менять местами) ты в неудачном случае придешь к полному перебору. То есть будешь перебирать все способы закрасить 10 клеток в описанной выше таблице, а таких комбинаций там порядка 10 ^ 20 как я описал выше.

Так как в варианте "пробуем менять местами" я не вижу какой-то защиты от большого числа таких попыток.


Ответы: >>1100356 >>1100357
Аноним 2017/11/30 02:31:07  №1100353 303
>>1098161
>Здесь не очень понятно, зачем этот класс. Если он для того, чтобы хранить объект mysqli, то что мешает его хранить просто в переменной без всяких ConnectDb? Также, непонятно, зачем в нем поля вроде db_address? Где и как они будут использоваться?
Класс для соединения с бд. А где хранить хранить этот объект, как метод в Util? Или как? Как просто переменную, если да то где? Здесь не понятно. db_adress и подобные нужны были для того чтобы держать в них информацию о конфиге, понял, что можно сразу из массива pasre_ini_file пихать в mysqli

>Как ты выбираешь, что поставить, public или private?
Поставил private, паблик для вызова снаружи класса и наследников, приват только для опредленного класса

>Пропусти код класса через phpformatter.com
Сделал

>но нет проверки, что она содержит разрешенное значение, а значит тут может быть SQL инъекция.
Теперь есть

>Это можно сделать одной командой вместо цикла.
Как?

>Почему не foreach тут?
Пофиксил

> у тебя функции в TableDataGateway принимают и возвращают массивы
Теперь объекты по идее

> Не нужно писать 5 однотипных блоков кода, нужно использовать цикл.
Подскажи как тут использовать цикл, я не понял

>Методы findPage и getStudent не дублируют друг друга?
Теперь один метод getStudent

>Далее, я вижу в Authorisatin метод isEmailUsed. Какое отношение он имеет к авторизации? Никакого. Этот метод лучше сделать в классе TSG.
Сделал в TSG isEmailUsed

>- запрашиваем у TSG данные по студенту с логином login
>- если не нашлись, значит логи неправильный
>- если такие данные нашлись, сверяем хеш
Сделал это в TSG метод getLoginPass, как его разделить по частям чтобы вытягивание из БД было в TSG а проверка в Authoristaion ума не приложу, или так нормально?
Ответы: >>1100367 >>1103249
Аноним 2017/11/30 02:48:05  №1100356 304
>>1100352
>Если у тебя есть свободный номер за 100, а ты предлагаешь номер за 200, то Гость может просто открыть букинг и пойти в другую Гостиницу.
Какая разница, если у меня все равно кто-то на улице, а значит, я продам этот номер в любом случае? А так я могу заселить всех, и выгодно для абсолютного большинства. Мало того, у меня 4 довольных клиента вместо одного. Но в то же время, чем больше клиентов, тем больше толкучка у шведского стола.
Упрощаем: представь, что у меня только одноместные номера разной стоимости, в любом случае придется селить кого-то в самый дорогой.

>Если остается 0 пустых мест в номере = 1000 баллов
Хорошо, а деньги как оценивать в баллах? Раз меньше - это лучше?
Вычитать из стоимости самого дорогого номера? Давай предположим, что у нас есть президентский люкс на одного за 100к тугриков, а остальные номера стоят 1000-2000 тугриков. Все номера получают 98000 баллов. Плохо.
Значит, берем медиану, она будет около 1700, вычитаем баллы из нее. Да, будет логично.
Но пускай медиана 10к и разброс от 2000 до 20000. Что будем делать? Тогда 250 баллов будут погрешностью. Надо делать баллы от пустых мест зависимыми от баллов за деньги. А как?

>Так как в варианте "пробуем менять местами" я не вижу какой-то защиты от большого числа таких попыток.
Защита от бесконечного цикла точно есть. Если методом уплотниловки все влезают - задача имеет решение.
Интуитивно мне кажется, что цикл открутится за приемлемое время.
У меня текущая гостиница полностью строится за 2-4 секунды, учитывая, что шанс выбить последнюю комнату 1/640. Просто номер комнаты я даю рандомно, чтобы можно было построить 10 случайных комнат для теста, а не всю гостиницу. В итоге, когда 639 номеров из 640 разобраны, рандому должно хорошо посчастливиться.
Ответы: >>1100362
Аноним 2017/11/30 02:50:45  №1100357 305
>>1100352
Вообще, лол, мы можем написать каждый свой алгоритм и сравнить результаты.
Ответы: >>1100362
Аноним 2017/11/30 03:15:47  №1100362 306
>>1100356

> Какая разница, если у меня все равно кто-то на улице, а значит, я продам этот номер
Такого условия нет. Заявок может быть ограниченное количество за период времени. Гостиницы и другие предприятия сферы обслуживания вообще редко бывают заняты на 100% (если бы так было, они бы расширялись).

Оценивать по стоимости очень просто. Берем заведомо большое число и из него вычитаем по 1000 за каждый тугрик стоимости.

Ну или можно сделать баллы наоборот, чем больше баллов- тем хуже.

Можно разрешить отрицательные баллы, берем в начале 0 и вычитаем по 1000 за каждый тугрик стоимости.

> Все номера получают 98000 баллов. Плохо.
Не плохо. Железяке все равно, что цифры не красивые.

> Тогда 250 баллов будут погрешностью. Надо делать баллы от пустых мест зависимыми от баллов за деньги. А как?
Можно брать маленький вес. Например, за тугрик стоимости вычитаем 1000 баллов. А за незанятое место вычитаем всего 10 баллов. Незанятых мест в 1 номере всяко меньше 100, так что это будет влиять только если цена 2 вариантов одинаковая.

То есть вес стоимости в 1000 раз больше чем вес фактора незанятых мест.

> Интуитивно мне кажется, что цикл открутится за приемлемое время.
А ты посчитать попробуй. Используя комбинаторику. Там почти все формулы с факториалами.

>>1100357

Ой-ой, хочешь заставить ОПа решать учебные задачки для начинающих? Где такое видано? Если Оп пишет задачу, предполагается, что он ее решить может в уме (хотя бы примерно).
Ответы: >>1100375
Аноним 2017/11/30 03:31:53  №1100367 307
>>1100353
>Подскажи как тут использовать цикл, я не понял
Сам справился
Аноним 2017/11/30 04:29:54  №1100375 308
>>1100362
Я наконец-то понял твой принцип!
Можно обойтись без баллов. Сортируем комнаты по возрастанию цены. Сортируем заявки по уменьшению персон. Для каждой заявки пробуем комнаты, первую подходящую заселяем. Всё.

Затем вспоминаем, что у нас еще есть интервал бронирования, и надо бы в некомплектные номера селить тех, кто останавливается на короткий срок. И теряем сознание.
Ответы: >>1100378
Аноним 2017/11/30 04:54:24  №1100378 309
>>1100375
Алгоритм, не дающий захватить одному захватить номер для шести на длительный срок:

Сортируем комнаты по возрастанию цены. Сортируем заявки по уменьшению персон, внутри одинакового кол-ва персон по уменьшению срока брони. Для каждой заявки пробуем комнаты, первую подходящую заселяем, при этом подходящей считаем только ту, где вместимость = количество персон, а не >=. Заселенные заявки удаляем. Проходим цикл с оставшимися заявками, с условием вместимость = количество персон + 1. И так далее до исчезновения заявок, либо количество персон + N > вместимостьМаксимальногоНомера === true для каждой заявки, эти заявки заселить невозможно.

Таким образом, 4 человека, приехавшие на месяц, живут в 4-местном номере, а 4 человека, приехавшие на день, занимают, допустим, единственный 6-местный номер всего на день.
В предыдущей версии алгоритма 4 человека, приехавшие на месяц, могли заблокировать возможность принимать 6 человек на целый месяц, заняв 6-местный номер, при том, что 4-местный номер стоял бы пустым спустя день.
Ответы: >>1100380
Аноним 2017/11/30 05:00:12  №1100380 310
>>1100378
И еще один полезный бонус: не влезают в нашу гостиницу те, кто собрался вписаться на короткий срок, а долгим стабильно платящим клиентам местечко завсегда найдется.
Ответы: >>1100383
Аноним 2017/11/30 06:14:13  №1100383 311
>>1100380
>нашу гостиницу
шлюхи будут?
Аноним 2017/11/30 15:01:38  №1100501 312
>>1100328
У меня вообще появилась идея перешагнуть через регулярки и потом уже вернуться к этому делу.
Так стоит поступать?
Ответы: >>1100519
Аноним 2017/11/30 15:22:33  №1100519 313
>>1100501
Ты уже можешь решить задачу, удалив лишнее через strtr, как я показывал выше. И тогда регулярка будет выглядеть (+7|8)\d{10}. Самое забавное, в свое время я ее вроде так и решил.
Давай добьем загадочное зеленое пятно в скобках. Нам нужно 10 цифр железно, верно? Для начала напишем (\d){10} и вот мы уже матчим первые два примера.
Теперь нам нужно игнорировать пробелы, дефисы и скобки, то есть кушать их и не давиться. Для начала, придумай выражение в квадратных скобках, совпадающее с ними всеми. Затем помести его в скобки перед цифрой и после цифры. Затем поставь нужный квантификатор к квадратным скобкам.
Ответы: >>1100525
Аноним 2017/11/30 15:31:59  №1100525 314
>>1100519
Просто то, что ты мне описываешь, подразумевает наличие двух регулярных выражений, что, как мне кажется, нереализуемо в рамках сайта, если только нет "трубы" для перенаправления результата из одного регулярного выражения в другое.

И вот, что я выяснил за время своих рассуждений:
Я немножко долбаеб.
Я тупо брал и копировал на сайт массив

'84951234567', '+74951234567', '8-495-1-234-567',
' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67',
'8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567',
'8 ( 999 ) 1234567', '8 999 123 4567'

а потом удивлялся, с каких таких хуев у меня не все корректно работает И ТОЛЬКО СУКА СЕЙЧАС Я УВИДЕЛ КАК У ТЕБЯ СДЕЛАНО И КАК ДОЛЖЕН БЫЛ СДЕЛАТЬ Я!11
Именно из-за этого у меня не работала херня с ^
Ответы: >>1100526
Аноним 2017/11/30 15:41:24  №1100526 315
>>1100525
Регулярки можно комбинировать как угодно. В скобках как раз скрывается подвыражение, которое должно стрельнуть 10 раз подряд.
Да, еще выставь модификатор m, чтобы крышечка и доллар были началом и концом строки, а не всего текста.
Аноним 2017/11/30 23:40:31  №1100771 316
Если не ошибаюсь, в прошлом треде кто-то спрашивал про абстракцию для файлов, можно ли сделать абстракцию, чтобы представлять локальные и удаленные файлы. Я по моему тогда ответил, что это сложно, и плохо будет работать.

Но тут случайно наткнулся на проект на JS, из gulp, который этим и занимается. Посмотрите, если еще интересно: https://github.com/gulpjs/vinyl

Ну и есть еще Symfony Filesystem, который абстрагирует файловую систему и который наверно тоже можно как-то тут использовать, наверняка что-то есть.

И есть еще Flysystem https://github.com/thephpleague/flysystem

-----------------

Также, напомню, что в прошлом треде были проверены:

https://github.com/Qevg/Student-list , вот тут >>1091604

Ну и все остальные задачи, что там были запощены, там же и проверены.




Ответы: >>1100946 >>1107148
Аноним 2017/12/01 00:04:54  №1100781 317
15120758945630.png (100, 1164x763)
763x1164
И прошу заметить: ни в каком другом треде, кроме РНР, вам не помогут так подробно и по всему web-стеку.

Спасибо ОПу и компании!
Аноним 2017/12/01 00:37:44  №1100790 318
Если относительный url начинается со знака вопроса, то что это значит?
Ответы: >>1100791 >>1101418
Аноним 2017/12/01 00:42:15  №1100791 319
>>1100790
как '?foo=bar&biz=buz' ?

это значит, что в скрипт по адресу '/'
передаются get-параметры

их можно увидеть так:

<?php

echo '<pre>'.printf( $_GET, true ).'</pre>';
Ответы: >>1100794
Аноним 2017/12/01 00:43:58  №1100793 320
15120782388160.jpg (236, 1120x1600)
1600x1120
>>1098554
Но она же реально охуенная
Аноним 2017/12/01 00:44:04  №1100794 321
Аноним 2017/12/01 00:45:36  №1100795 322
Ответы: >>1100797 >>1100798 >>1100802
Аноним 2017/12/01 00:53:12  №1100797 323
>>1100795
Вижу уже, что где-то мимо, но не написав этого сюда бы не заметил, так что извините


//test.example.com
http://test.example.com

Так вернее?
Аноним 2017/12/01 00:55:47  №1100798 324
>>1100795
Первая неправильно
Ответы: >>1100799
Аноним 2017/12/01 00:56:36  №1100799 325
Ответы: >>1100800
Аноним 2017/12/01 00:57:39  №1100800 326
>>1100799
А нет походу. Ведь написано что если с одного слэша, то порт берется.
Аноним 2017/12/01 01:20:25  №1100801 327
Ответы: >>1100804
Аноним 2017/12/01 01:20:32  №1100802 328
>>1100795

/test полностью замещает path (путь) и все, что дальше. И получается http://example.com:81/test

правило там примерно такое:

Если относительный URL начинается с ....
http://... - замещает все целиком
//... - замещает все, начиная с host и далее
/.. - замещает path и далее
?... - замещает query и далее
#... - замещает hash


xyzxyz... - замещает последний файл в path и далее (самое сложное место)
./xyzxyz.. - примерно то же самое
../xyzxyz - примерно то же самое, но .. значит подъем на 1 папку вверх

Ты в первом варианте ошибся.


Ответы: >>1100810
Аноним 2017/12/01 01:25:51  №1100804 329
>>1100801

Вариант 2) даст при разрещении http://1.txt что явно неправильно.

Вариант 3) даст http://example.com:81/#hash
Ну и с 4) та же проблема.

Смотри правила выше.

Ответы: >>1100810
Аноним 2017/12/01 02:00:51  №1100810 330
>>1100802
>/test полностью замещает path (путь) и все, что дальше. И получается...

Вроде теперь правильно понял.

>>1100804
>Вариант 2) даст при разрещении http://1.txt что явно неправильно.

/1.txt

>Вариант 3) даст http://example.com:81/#hash

#hash
?x1


Так верно? Спасибо большое за ответ.
Ответы: >>1101418
Аноним 2017/12/01 02:27:56  №1100823 331
>Время бы лучше указать как-то понятнее, вроде текущее + 10 лет, а то не очень понятно, почему именно 7ffff... и сколько это в привычных нам единицах измерения.
Пофиксил

>Для удаления кук надо указывать время в прошлом, посмотри мануал.
Пофиксил

>В валидаторе, при проверке поля score, надо проверять, что оно содержит цифры. А то можно ввести "30 cats". Для года надо проверять что там указан реалистичный год.
Пофиксил

>Также, нужно подумать, как избавиться от повторяющегося кода в методах validateStudent и validateProfile.
Сделал

>зачем ты конфиг с паролями положил в публично доступную папку? Хочешь со всеми поделиться своими секретами?
Перелолил в папку cfg

>У тебя нет проверки, что файл ../controller/'.$class.'.php'; существует
Теперь есть

>Не надо никогда редиректить на страницу ошибки, надо ее показывать.
Теперь я её просто подключаю, правильно?

>Но почему-то ты ловишь только исключения при создании нескольких объектов, а остальной код не проверяешь.
Там по всему коду try catch на методах где ловятся исключения, или я что то не понял?

> Лучше писать $e->__toString()
Сделано

>Их функции можно объединить в один контроллер, ведь поиск - это тоже просмотр списка студентов, только с фильтром по имени.
В процессе

>Зачем из контроллера вынсоить кусок в отдельный файл? Не лучше ли сюда этот код и вписать?
Сделал

>В view не должно быть работы с POST/GET. Оно просто отображает то, что дал контроллер.
Убарл по идее

>Лучше сделать функцию или метод где-нибудь в Util, который будет формировать URL из переданных ему параметров. И не забывай про htmlspecialchars.
В процессе

>Взять какой-нибудь аккаунт, например с id=1. Нужно, чтобы ты после захода на специальную страницу был залогинен под этим аккаунтом. То есть залогиниться под чьим-то аккаунтом не вводя логин или пароль (представь, что это нужно администратору например, или тестировщику).
Всё равно не понимаю
Ответы: >>1100824 >>1101310 >>1103249
Аноним 2017/12/01 02:28:37  №1100824 332
Аноним 2017/12/01 08:50:56  №1100849 333
Объясните пожалуйста как это сделать.

Для поиска в одной колонке по части строки в SQL есть оператор LIKE: WHERE x LIKE '%hello%' (% здесь соответствует любым символам). Для поиска по всем колонкам можно применить оператор LIKE к соединенным через пробел значениям столбцов.
Ответы: >>1101418
Аноним 2017/12/01 12:55:18  №1100917 334
Ребятки, нужны уютненькие ребусы как у ОПа на базы данных. По другим мурзилкам учить плохо получается - приходится вникать с ходу перепрыгивая важные писечки, это неприемлимо.
Ответы: >>1101030
Аноним 2017/12/01 13:07:16  №1100926 335
Алсо как проходят базы и погромирование в целом в учебных заведениях?
Ответы: >>1100979 >>1101304 >>1101418
Аноним 2017/12/01 13:35:33  №1100946 336
>>1100771
это я спрашивал. спасибо, посмотрю этот vinyl

ты тогда посоветовал мне задуматься о DI и создании объекта FileSystem. я объект делать не хотел, т.к. он требовал бы в коде библиотеки зависимости от библиотеки виртуальной файловой системы, которая по сути нужна только для тестов (т.е. идет в require-dev). В итоге я так сделал: в классе, который работает с файлами, есть путь по дефолту типа
CONST ROOT_DIR = __DIR__ . '/..';
private $someFilePath = SELF::ROOT_DIR . '/var/file.txt';

и сделал сеттер, который может менять путь для тестов. в тестах подменял ее на путь, который начинается с vfs:// (его генерирует сама либа файловой системы) и все работает ок

единственное, в чем я не разобрался - это как Flysystem работает в плане тестов. поэтому воспользовался вот этой https://github.com/mikey179/vfsStream
она у phpunit указана в документации в кач-ве примера.
Ответы: >>1101417
Аноним 2017/12/01 14:39:05  №1100979 337
>>1100926
максимально хуёво, это же РФ + "образование" в IT
Аноним 2017/12/01 16:05:24  №1101030 338
>>1100979
>это же РФ
Такой себе аргумент. Скинь хоть методичек раз в теме
>>1100917
Бамп!
Ответы: >>1101036
Аноним 2017/12/01 16:14:50  №1101036 339
>>1101030
http://exercism.io/ вот шикарный сайт с хорошими задачами и написанными тестами под них. можно смотреть код других участников

по поводу образования, тут дело не в рф конечно. сама идея "образования" - очень наивная вещь. типа я приду и меня научат. хуй там. в моей бывшей конторе брали студентов, выпускников и перекатившихся 30-летних. и вот студенты с выпускниками все как один с кодом общались как слепые котята. я почему-то наивно ожидал, что люди с профильным образованием смогут быстрее в реальном проекте что-то понять, но оказалось наоборот.

в то же время у меня есть очень прошаренные знакомые с большим опытом и ВО, но они в момент учебы постоянно что-то писали, где-то работали, что-то сами ковыряли и т.д.
Аноним 2017/12/01 16:20:41  №1101042 340
Накатил ospanel, создал домен и индекс файлик привет мир в utf8 кодировке. В браузере отображается криво. В чем может быть проблема?
Ответы: >>1101048 >>1101052
Аноним 2017/12/01 16:24:48  №1101047 341
>>1100979

Есть образовательные проекты, которые вузы проводят с крупными компаниями например:

https://sphere.mail.ru/pages/index/
https://track.mail.ru/pages/about/
https://park.mail.ru/pages/index/

https://academy.yandex.ru/ (там есть список вузов)

В ИТМО (Спб) вроде тоже как IT преподают.

Ну то есть надо хотя бы погуглить.

Если же ты не в одном из таких вузов, то конечно, учить тебя ничему не будут. Препод будет занудно рассказывать на лекциях про GUI на турбопаскале, реляционную алгебру и, если повезет, про PHP4. То есть не те знания, с которыми можно куда-то устроиться.


Ответы: >>1101077
Аноним 2017/12/01 16:24:52  №1101048 342
Аноним 2017/12/01 16:25:46  №1101050 343
Аноним 2017/12/01 16:27:37  №1101052 344
>>1101042
> header('Content-type: text/html; charset=utf-8');
Решил.
Аноним 2017/12/01 17:16:41  №1101077 345
>>1101047
Учебников тонет? Вот чтобы прямо учебник, как в школе
Ответы: >>1101084 >>1101088
Аноним 2017/12/01 17:23:36  №1101084 346
>>1101077

Учебников по какому предмету? По веб-разработке вообще?

Это малореально, как мне кажется, пока учебник напишут, пока одобрят, выйдет 1 новая версия PHP и 10 новых названий для ноды.
Аноним 2017/12/01 17:33:35  №1101088 347
>>1101077
как в школе - это учебник по информатике разве что. то, что ты спрашиваешь - это как просить учебник "как чинить форд фокус".
http://php.net/manual/ru/language.variables.external.php Аноним 2017/12/01 17:49:50  №1101094 348
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Имя: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Пиво: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Отправь меня!" />
</form>


Для чего тут нужен параметр true?
Ответы: >>1101096
Аноним 2017/12/01 17:51:20  №1101096 349
>>1101094
return
Если вы хотите перехватить вывод print_r(), используйте параметр return. Если его значение равно TRUE, то print_r() вернет результат вывода вместо вывода в браузер (который производится по умолчанию).
http://php.net/manual/ru/function.print-r.php
Ответы: >>1101100
Аноним 2017/12/01 18:00:37  №1101099 350
перекатился дома на 7.2, но под него еще нет xdebug и sodium ругается
PHP Warning: Module 'sodium' already loaded in Unknown on line 0
пришлось закомментировать вызов модуля в /etc/php/7.2/mods-available/sodium.ini. warning пропал, а содиум работает ок, т.е. он подгружается еще в каком-то месте помимо конфига, что как-то странно само по себе. зачем тогда было запиливать кривой конфиг по умолчанию
Ответы: >>1101261 >>1101417
Аноним 2017/12/01 18:03:49  №1101100 351
Аноним 2017/12/01 22:30:27  №1101261 352
Ответы: >>1101326 >>1101417
Аноним 2017/12/01 22:52:40  №1101283 353
Прохожу урок по Базе данных перед студентами. Там дана таблица с хэшем и солью, что это?
Ответы: >>1101304 >>1101417
Аноним 2017/12/01 23:33:29  №1101304 354
Ответы: >>1101308
Аноним 2017/12/01 23:40:40  №1101308 355
>>1101304
хех, на одном курсе повышения квалификации встретил препода какого-то "вузика",

который упрашивал меня спиратить мой учебный материал (мы разные курсы проходили), послал его с этой просьбой,

но с высоты своего огромного практического опыта ответил на вопросы и дал советов премудрых например, учить SQL хотя бы на Postgre
Аноним 2017/12/01 23:42:28  №1101310 356
>>1100823
>>Их функции можно объединить в один контроллер, ведь поиск - это тоже просмотр списка студентов, только с фильтром по имени.
Сделал

>>Лучше сделать функцию или метод где-нибудь в Util, который будет формировать URL из переданных ему параметров. И не забывай про htmlspecialchars.
Сделал
Аноним 2017/12/01 23:52:23  №1101317 357
mariadb, mysql, postgresql - все это не имеет значения для вкатывающегося? Дебиан марию предлагает, например
Ответы: >>1101321 >>1101416
Аноним 2017/12/01 23:58:14  №1101321 358
>>1101317
для вкатывальщика-2018 имеет смысл только убить себя как можно быстрее, осознавая свою отсталость;

Тем не менее, mariadb -- это форк mysql, так что это, условно, одно и то же. Практический плюс мускуля в том, что он является самой распространённой СУБД на виртуальных хостингах, то есть, 99% малых и средних проектов. Самая крупная установка мускуля, вроде -- Booking.com

Postgresql круче (больше возможностей, больше объём БД) для больших систем и имеет хорошие перспективы в РФ в рамках импортозамещения как "бесплатный оракл"
Ответы: >>1101324 >>1101416
Аноним 2017/12/02 00:04:03  №1101324 359
>>1101321
>для вкатывальщика-2018 имеет смысл только убить себя как можно быстрее, осознавая свою отсталость;
Мне это не подходит.
Значит похуй че ставить?
Ответы: >>1101325
Аноним 2017/12/02 00:05:30  №1101325 360
>>1101324
Значит, осознание ещё не наступило.

Нет, не похуй, но из форков mysql можешь выбирать любой, в том числе mariadb.
Ответы: >>1101327
Аноним 2017/12/02 00:06:33  №1101326 361
>>1101261
а какой смысл был тогда делать пакет php7.2-sodium?
Ответы: >>1101416
Аноним 2017/12/02 00:07:51  №1101327 362
>>1101325
Как же бесит то а, блять
Ответы: >>1101329
Аноним 2017/12/02 00:08:42  №1101329 363
>>1101327
привыкай, вкатывальщик
Ответы: >>1101331 >>1101416
Аноним 2017/12/02 00:10:45  №1101331 364
>>1101329
Ничего, все ещё охуеют как я могу
Ответы: >>1101332 >>1101334
Аноним 2017/12/02 00:11:30  №1101332 365
Ответы: >>1101334
Аноним 2017/12/02 00:11:48  №1101333 366
15121627084680.jpg (103, 1280x819)
819x1280
Задам неприличный вопрос:

у кого-нибудь есть хороший, годный (со всеми плюшками) bash-скрипт инсталяции php-fpm + nginx для CentOS?
Ответы: >>1101335 >>1101347
Аноним 2017/12/02 00:13:20  №1101334 367
>>1101331
>>1101332
ну зачем ты его обижаешь, чуть-чуть опыта наберётся и лет через 15 всем всё покажет
Аноним 2017/12/02 00:17:39  №1101335 368
>>1101333
а там прям скрипт нужен? на убунте все работает после apt install php7-fpm nginx
Ответы: >>1101337 >>1101416
Аноним 2017/12/02 00:22:58  №1101337 369
>>1101335
Ну как-то работает, да, это не проблема, я имел ввиду прям годную установку с настройкой безопасности, нормально работающих пакетов типа php-fpm-cli, etc.

Олсо, ИМХО бубунты на продакшне точно не должно быть, разве что у тотально выживших из ума хипсторов
Ответы: >>1101344 >>1103063
Аноним 2017/12/02 00:37:31  №1101344 370
>>1101337
ну если тебе нужно отвечать за безопасность, все надо делать самому. вот modsec поставить, например https://geekflare.com/install-modsecurity-on-nginx/

опять же на убунте все пакеты нормально работают из коробки после apt install php7.1*.

ну ок, в дебиане те же команды и тоже все работает из коробки (почти) но я впрочем не предлагаю тебе менять дистр на сервере, а просто выебываюсь
Ответы: >>1101350 >>1101359
Аноним 2017/12/02 00:42:58  №1101347 371
>>1101333
Да это понятно, у нас на текущих серверах всё очень в порядке, просто пытаюсь найти скрипт (не факт, что он есть), который делал бы на новых установках все кайфуши автоматом.
Ответы: >>1101359 >>1101416
Аноним 2017/12/02 01:04:25  №1101350 372
>>1101344
Ну дебиан ещё куда ни шло, сойдёт.

Но так-то все посоны на кошерных дистрибутивах сидят.
Ответы: >>1101351
Аноним 2017/12/02 01:05:42  №1101351 373
Ответы: >>1101352
Аноним 2017/12/02 01:10:57  №1101352 374
>>1101351
RHEL/CentOS, BSD для старообрядцев.

Но Debian, Slackware (раньше) тоже норм.

Олсо, в некоторых отраслях (банки, гос.конторы) в РФ важна сертификация дистрибутива в соответствующих органах.
Аноним 2017/12/02 01:26:50  №1101359 375
Аноним 2017/12/02 02:45:17  №1101390 376
Как правильно настроить при установке MySQL?
Ответы: >>1101394 >>1101399 >>1101415
Аноним 2017/12/02 02:52:58  №1101394 377
>>1101390
для обучения настройка не нужна
Ответы: >>1101399
Аноним 2017/12/02 03:08:15  №1101399 378
>>1101390
>>1101394
в смысле, для просто-установки тебе не нужно ничего настраивать.

Это начинается уже на реальных проектах.

Развлекательное чтиво по теме: http://www.pvsm.ru/mysql/247358
Ответы: >>1101402 >>1101415
Аноним 2017/12/02 03:34:41  №1101402 379
15121748815970.png (109, 972x735)
735x972
>>1101399
А что тут выбирать?
Ответы: >>1101408
Аноним 2017/12/02 03:46:33  №1101404 380
15121755932710.png (128, 1000x726)
726x1000
15121755932721.png (99, 987x725)
725x987
На 1-ом пике все верно? Что значит Current root password на 2 пике?
Ответы: >>1101408 >>1101410
Аноним 2017/12/02 04:07:53  №1101408 381
>>1101402

Там написано: "указанные ниже продукты требуют установить такие-то библиотеки". Но очевидно, что если эти "продукты" ты не будешь ставить, то и библиотеки можно не ставить и не заморачиваться.

>>1101404

А ты английский понимаешь?

Во-первых, там стоит галочка "открыть порт 3306 на фаерволле". Если ты не собираешься подсоединяться к MySQL снаружи, с другого компьютера, то это делать незачем.

На второй картинке требуют придумать пароль администратора. Current root password - это я думаю, должна быть пустая строка.

Ну и ниже можно еще создать обычные аккаунты, хотя я бы советовал учиться их создавать командой CREATE USER в консоли.
Ответы: >>1101411
Аноним 2017/12/02 04:36:08  №1101410 382
15121785685440.png (91, 374x370)
370x374
Аноним 2017/12/02 04:39:26  №1101411 383
>>1101408
Спасибо за ответ. У меня ошибка. Я пытался запустить консоль mysql unicode или как-то так она называлась, она крашилась сразу же.

Я все удалил попробую заново.
................................................
Так. Все установилось. Все открылось. Теперь я могу начать работать с mysql? Спасибо большое за ответ. Он мне очень помог.

Английский плохо знаю, маленький словарный запас.

Ответы: >>1101412
Аноним 2017/12/02 04:40:53  №1101412 384
Аноним 2017/12/02 04:48:54  №1101413 385
тем не менее, несмотря на заслуженный троллинг убогих вкатывальщиков, РНР-тред -- единственное место, где вам помогут и объяснят весб веб-стек
Аноним 2017/12/02 04:55:39  №1101415 386
>>1101399

Человеку, который пока не разобрался с установкой mysql, рановато читать про архитектуру поиска.

Алсо по поводу букинга у меня конечно двоякие ощущения. С одной стороны вроде продвинутый сервис, но с другой стороны - там столько всего понавешано, постоянно всякие надписи выскакивают, они все анимированы, написаны красным цветом, и тд. А на мобильной версии отсутствуют некоторые опции (например: не показывать многоместные номера в хостелах).

Я помню, по моему на хабре читал эту статью и конечно у меня ощущение, что как-то у них все костыльно сделано. Если бы это делали вконтакте, они бы просто на Си написали поисковый демон с хранением данных в RAM и поиском того, что требуется (и это не так сложно, как кажется). Если бы это был я, я бы попробовал в порядке эксперимента сделать то же на Го - может чуть медленнее, но язык приятнее. Не очень понимаю, почему они городят что-то сложное на СУБД общего назначения. На Си пройтись в цикле по 1000 предложений займет меньше миллисекунды, я думаю.

(если кто-то из анонов не верит, давайте сформулируем задание, и вы напишете на Го и померяете).

Они там пишут миллион отелей, но ведь поиск идет в рамках одного города, и отелей там меньше. Там 30000 отелей - максимум был.

Может, конечно, я чего-то не знаю.

>>1101390

Вообще, MySQL настраивается с помощью редактирования файла конфигурации my.ini и перезапуска сервера. В файле конфигурации можно указать много разных опций, я могу дать только ссылку на англ. мануал, так как их очень много: https://dev.mysql.com/doc/refman/5.7/en/server-options.html

Но тебе скорее всего подойдут настройки по умолчанию.
Аноним 2017/12/02 04:56:22  №1101416 387
>>1101347

Можно написать playbook для ansible. Ansible - это штука, которая умеет соединяться с сервером по ssh и настраивать его по описанным в конфиге правилам. Ну например, ты можешь сделать playbook, который устанавливает все нужное для веб-сервера или playbook, который добавляет новый virtual host в Апач. Если ты какую-то настройку делаешь больше 1 раза, ее надо автоматизировать.

Ну например, я хочу себе сделать playbook для быстрой установки openvpn на любой сервер.

Из недостатков ansible - он не поддерживает винду и его сложно ставить на cygwin (то каких-то заголовочных файлов не хватает, то openssl).

>>1101335

Часто еще надо модули ставить, настройки менять.

>>1101329

Не надо тут устраивать чат пожалуйста. Это тред про программирование.

>>1101326

На линуксе часто расширения идут как отдельные пакеты.

>>1101321

Не знаю, крупная или нет, но mysql еще использовался в фейсбуке, используется в википедии и в Uber недавно на него перешли.

>>1101317

Тебе надо учить стандартный SQL. Там есть отличия у разных БД, но на 80-90% они используют стандартный SQL и 10-20% дополнений к нему.
Аноним 2017/12/02 04:56:40  №1101417 388
>>1101283

Хеш и соль описаны в уроке про то, как правильно хранить пароли: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md

Мы храним хеши вместо самих паролей, чтобы их было труднее украсть. Хеш позволяет проверить, правильно ли пользователь ввел свой пароль, но он не позволяет определить этот пароль.

>>1101261

Вообще, у нас тут есть анон, который "пилит" убийцу телеграм, может ему пригодится этот libsodium.

>>1101099

> но под него еще нет xdebug
Через pecl не поставить? Под линуксом вроде не проблема.

> зачем тогда было запиливать кривой конфиг по умолчанию
Скорее всего это твой старый конфиг. Обычно при обновлении пакета конфиги не заменяют, так как в них могут быть твои правки.

>>1100946

Я думаю, что для тестов там предназначен Memory Adapter: https://github.com/thephpleague/flysystem-memory

> ты тогда посоветовал мне задуматься о DI и создании объекта FileSystem. я объект делать не хотел, т.к. он требовал бы в коде библиотеки зависимости от библиотеки виртуальной файловой системы, которая по сути нужна только для тестов
Это да.

> поэтому воспользовался вот этой https://github.com/mikey179/vfsStream
Тоже вариант.
Ответы: >>1101477
Аноним 2017/12/02 04:57:04  №1101418 389
>>1100926

На лекциях препод занудно рассказвыает про реляционную алгебру (сама по себе эта тема важная, но объясняют так, что ты все равно ничего не поймешь), потом немного рассказывает про SQL.

На практике наверно потребуют сделать какие-то SQL запросы.

Учебник по SQL будет прочитать куда как полезнее.

У нас в ОП посте кстати есть простые задачки по SQL.

Кстати, кто разбирается в стандартном SQL - они там LIMIT завезли уже?

>>1100849

Соединяем значения столбцов: CONCAT(name, ' ', surname, ' ', email,....)
Добавляем LIKE: WHERE CONCAT(...) LIKE '...'
Дописываем оставшуюся часть запроса (SELECT .. FROM ... ORDER ... LIMIT)

>>1100810

По прежнему неверно. Ссылка /1.txt разрешится в http://example.com:81/1.txt , а надо http://test.example.com/1.txt

> 3) #hash
Там должно быть page2.html, а у тебя будет page.html

> ?x1
Знак равно забыл.

>>1100790

Он замещает в базовом URL query и все, что дальше.

Базовый URL http://x.com/123?aaa
Относительный ?bbb
Результат http://x.com/123?bbb
Аноним 2017/12/02 05:10:13  №1101420 390
ОП, сегодня попытался обновить symfony 3.4 -> 4.0 в проекте. Поменял версию в composer.json, запустил команду и тут начались пляски: https://pastebin.com/GCSaapBc
Если я пропишу в composer.json "symfony/framework-bundle": "3.0" , то эта проблема уйдёт и появится подобная с другой библой уже. Что-то мне подсказывает, что заполнять это руками неразумно. Я вообще не могу понять (и нагуглить) сути проблемы. Вот содержимое composer.json https://pastebin.com/udYZyZim
Ответы: >>1101475 >>1103062 >>1103259
Аноним 2017/12/02 10:00:00  №1101449 391
Оп проверь студентов плз.
Я не понял когда нужно трай/кетч сувать. На каждый чих что ли?
Еще пытался фронконтролер сделать и получилась какая та хуйня.
Так же не делал валидацию очень серьезную.
А еще все это без ксс. Деревянное все.

https://github.com/dsgaljkeguhodgiosetuhsegjposguh/studlist
Ответы: >>1101503 >>1103061
Аноним 2017/12/02 12:30:37  №1101475 392
Ответы: >>1101487
Аноним 2017/12/02 12:42:56  №1101477 393
>>1101417
>Через pecl не поставить? Под линуксом вроде не проблема.
пока проблема :(

checking Check for supported PHP versions... configure: error: not supported. Need a PHP version >= 5.5.0 and < 7.2.0 (found 7.2.0-1+ubuntu16.04.1+deb.sury.org+1)

но шторм понимает несколько интерпретаторов, поэтому пока пользуюсь 7.1 для хдебага
>Я думаю, что для тестов там предназначен Memory Adapter: https://github.com/thephpleague/flysystem-memory
о, спасибо
Аноним 2017/12/02 12:56:51  №1101487 394
>>1101475
Так по этой же инструкции я и пытаюсь обновиться
Ответы: >>1101492
Аноним 2017/12/02 13:26:21  №1101492 395
>>1101487
Просто
composer update symfony/symfony
делал?
Ответы: >>1101524
Аноним 2017/12/02 13:50:38  №1101503 396
Аноним 2017/12/02 14:14:20  №1101517 397
15122132609640.jpg (57, 916x515)
515x916
Опчик, начинаю в качестве дальнейшей тренировки приложение на js карточная игра. Правила придумал. Вдохновляюсь квестами из КР.

План:

1) простейшая реализация правил с выводом в консоль, играешь с рандомом.

2) простейшая графическая часть

3) искусственный интеллект (вот тут хотелось бы твоих советов, хочется сделать его обучающимся в процессе)

Основной смысл: хочу писать маленькие объекты, и сразу покрывать все тестами. Когда по тестам все будет работать как часы, пройдусь пару игр против генератора случайных чисел, если все работает, можно делать AI (самая интересная часть, так как вообще не представляю как тут что делается).

Вопросы:

1) js(знаю) или typescript(не пробовал) или фреймворки(работал с angular)?

2) хороший тестировщик для js(/typescript)?
Аноним 2017/12/02 14:21:14  №1101524 398
>>1101492
Делал, ситуация такая же что и при composer update symfony/symfony --with-dependencies
и при composer update
Аноним 2017/12/02 15:57:31  №1101561 399
Опчик почему у тебя нет ничего про ссылки на переменные &$variable оно вообще надо? Часто используется в разработке?
Ответы: >>1101614 >>1101619
Аноним 2017/12/02 17:26:32  №1101614 400
>>1101561
В очень редких случая используется при работе с массивами использую его. Работает не со всеми типами, иногда PHP иногда PHP его игнорирует.
Аноним 2017/12/02 17:31:21  №1101619 401
>>1101561
я не ОП и не знаю, надо ли оно, но часто вижу в коде что-то типа
foreach ($array as &$item) {
$item = ...
}

в том же симфони такого много:
foreach ($namespacedCommands as &$commandsSet) {
ksort($commandsSet);
}

foreach ($namespacedCommands as &$commandsSet) {
ksort($commandsSet);
}

$fileRecorder = function ($extension, $path) use (&$files) {
$files['yaml' === $extension ? 'yml' : $extension][] = $path;
};

и т.д.
Ответы: >>1101777
Аноним 2017/12/02 18:37:09  №1101657 402
<?php

$rnd = mt_rand(1, 6)

if ( $rnd == 1) {
echo "Значение1";
} elseif ( $rnd == 2 ) {
echo "Значение2";
} elseif ( $rnd == 3 ) {
echo "Значение3";
} elseif ( $rnd == 4 ) {
echo "Значение4";
} elseif ( $rnd == 5 ) {
echo "Значение5";
} elseif ( $rnd == 6 ) {
echo "Значение6";
}

?>

> Parse error: syntax error, unexpected 'if' (T_IF)

Я перед этим говнокодил на питоне и теперь не могу понять чего оно от меня хочет? Что с if не так?
Ответы: >>1101663 >>1101665 >>1101682
Аноним 2017/12/02 18:52:52  №1101663 403
Ответы: >>1101675
Аноним 2017/12/02 18:53:58  №1101665 404
>>1101657
Алсо поставь нетбинс какойнибудь, чтобы в дальнейшем избежать подобных заёбов
Ответы: >>1101677
Аноним 2017/12/02 19:03:45  №1101675 405
>>1101663
Спасибо, никак не привыкну. Юзаю саблайм, странно что никак не подсветил код.
Ответы: >>1101677
Аноним 2017/12/02 19:07:32  №1101677 406
>>1101665
>нетбинс
Иди помойся.
>>1101675
Ставь PhpStorm с торентов.
Или VSCode + php-плагин, если хочешь что полегче.


Ответы: >>1101678 >>1101682 >>1101685
Аноним 2017/12/02 19:09:44  №1101678 407
>>1101677
Не очень люблю идешки, очень тормозят. Кстати, pycharm для пхп годится?
Ответы: >>1101681 >>1101689
Аноним 2017/12/02 19:11:16  №1101681 408
>>1101678
Тогда VSCode или Atom, мне больше первый нравится.

>pycharm
А теперь подумай над своим вопросом и осознай насколько он тупой.
Ответы: >>1101696
Аноним 2017/12/02 19:11:21  №1101682 409
>>1101677
>Иди помойся.

>Или VSCode + php-плагин
ага

>>1101657
+ в подобных случаях (много когда elseif) лучше заменять всю конструкцию на switch case
Ответы: >>1101696 >>1101737
Аноним 2017/12/02 19:13:02  №1101685 410
>>1101677
>VSCode
Как на i386 ставить?
>Ставь PhpStorm с торентов.
кек
Аноним 2017/12/02 19:14:12  №1101686 411
Ну так что, какую IDE ставить?
Ответы: >>1101687 >>1101698 >>1101699
Аноним 2017/12/02 19:14:44  №1101687 412
Ответы: >>1101689
Аноним 2017/12/02 19:17:21  №1101689 413
Ответы: >>1101696
Аноним 2017/12/02 19:40:28  №1101696 414
Аноним 2017/12/02 19:42:23  №1101698 415
>>1101686
если у тебя что-то там лагает, то хоть в блокноте пиши. все, кто профессионально пишут код или стремятся к этому, пользуются штормом. это промышленный стандарт. ты придешь в контору работать и тебя там с твоим атомом, нетбинсом и прочим говном пошлют нахуй также, как анон выше.
Ответы: >>1101700
Аноним 2017/12/02 19:44:03  №1101699 416
>>1101686
а шторм достаточно долго осваивать со всеми его фишечками, поэтому лучше начинать уже сейчас
Ответы: >>1101700 >>1101703
Аноним 2017/12/02 19:44:51  №1101700 417
>>1101698
Я вкатываюсь чтобы одноклассники охуели, зарабатывать этим всем не собираюсь
>>1101699
Хотя посмотреть всетаки стоит
Аноним 2017/12/02 19:51:18  №1101703 418
>>1101699
>а шторм достаточно долго осваивать со всеми его фишечками
Никогда не пользовался этими комбайнами, можно в двух словах о его преимуществах по сравнения с редакторами которые просто подсвечивают синтаксис?
Ответы: >>1101711
Аноним 2017/12/02 20:15:53  №1101711 419
>>1101703
я перечислю то, чем сам пользуюсь постоянно:
тесты - запуск и покрытие (смотреть, что не покрыто)
переход по методу или свойству класса
иерархия классов
контроль версий - порешать конфликты, сравнить файл с какой-то конкретной версией, посмотреть чьи правки
автозаполнение по аннотациям
инспекция кода
рест апи клиент для тестирования запросов
композер - автоапдейт, автоинсталл
консолью из шторма пользуюсь
автодеплой
ну просто запустить файл в кли из интерфейса шторма удобно
икс дебаг конечно же (который в 7.2 еще не завезли)
рефакторинг - это наверное самое ценное, что он умеет

плюс он умеет в автоформат по пср или по кодстайлу твоей конторы, авто неймспейсы по пср0 и 4, авто use, авто аннотации

сложно все вспомнить, может что-то забыл. еще он умеет работать с БД, но я пользуюсь воркбенчем, и всякие штуки с фронтом и версткой (в чем я не шарю).
Ответы: >>1101717 >>1101730 >>1107723
Аноним 2017/12/02 20:25:47  №1101717 420
>>1101711
Нихуйственно. Спасибо за инфу.
Аноним 2017/12/02 20:39:32  №1101730 421
>>1101711
что такое рефакторинг? Он типа сам переписывает говнокод по красоте или как?
Ответы: >>1101756
Аноним 2017/12/02 20:47:22  №1101737 422
>>1101682
> switch case
Можно ли под case напихать не много своего говнокода? Скобки "}{" нужны?
Ответы: >>1101756
Аноним 2017/12/02 21:09:45  №1101755 423
добрый день. пишу тестхаб и мучаюсь над /new. то есть реализовать переход вопроса из редактируемого в обычное состояние можно за счет средств css, убирая бордеры инпутам и прописывая элементам display: none, потом все отправить формой. вопрос в том, как прописывать name'ы. можно давать question1[например, text](для ответов question1[answers]) , а для каждого раскрываемого вопроса увеличивать номер. также при перезагрузке весь прогресс сбросится. я думал добавлять вопрос в сессии при переходе его в обычное состояние, но тогда нет необходимости в форме. помогите, друзья.
Аноним 2017/12/02 21:10:32  №1101756 424
>>1101730
почти так. допустим, поменять название метода, чтобы он поменялся во всем проекте, вынести код в другой класс и т.д., захуярить автоматически интрерфейс на основе класса - это все рефакторинг.

>>1101737
можно. по поводу скобок, они там есть, но только в одном месте. лучше посмотри пример http://php.net/manual/ru/control-structures.switch.php
Аноним 2017/12/02 21:33:00  №1101777 425
>>1101619
не знаю, кстати, как в 7 (кто-нибудт знает?), а раньше это экономило память (при передачи по ссылке значение переменной не копируется)
Ответы: >>1101782
Аноним 2017/12/02 21:38:37  №1101782 426
Аноним 2017/12/02 23:16:37  №1101853 427
Посоветуйте хорошую книгу по верстке, где есть все (адаптивность, флексбоксы, препроцессоры и т. д.).
Ответы: >>1101887
Аноним 2017/12/03 01:04:04  №1101887 428
>>1101853
«Web Design for Developers» (Brian Hogan),
«Design Accessible Web Sites» (Jeremy Sydik).
Аноним 2017/12/03 01:11:01  №1101890 429
у меня вопрос по тестам.

как я понимаю, мы тестируем не весь код втупую, а логику работы приложения, т.е. не тестируем непубличные методы, а тестируем публичные, которые их используют. это вроде логично.
а вот если у нас есть композиция классов (или как тут верно сказать), т.е. допустим есть класс FormHandler и у него в конструкторе создается объект класса FormValidator, который вне этого хендлера больше нигде не будет использоваться, нам его как тестировать? через FormHandlerTest или напрямую через FormValidatorTest? Я сам склоняюсь к первому варианту, но смущает то, что в валидаторе может быть какая-то хитрая логика, которую в таком случае лучше тестить напрямую.
Ответы: >>1101898 >>1102148 >>1103061
Аноним 2017/12/03 01:14:57  №1101898 430
15122528971940.jpg (49, 600x450)
450x600
>>1101890
>у него в конструкторе создается объект класса FormValidator
Нет же.
Ему в конструктор передаётся, а тестировать их — отдельно.
Ответы: >>1102021 >>1103063
Аноним 2017/12/03 13:32:31  №1102021 431
>>1101898
если бы передавался, то понятно, но не передается, а именно создается:

class FormHandler
{
private $formValidator;

public function __construct()
{
$this->formValidator = new FormValidator();
}

}
Ответы: >>1102027 >>1102148
Аноним 2017/12/03 13:42:42  №1102027 432
>>1102021
Сделай, чтобы передавался. Создавать внутри — нельзя.
Ответы: >>1102057
Аноним 2017/12/03 14:35:41  №1102057 433
>>1102027
согласно мнению ОПа, в данном случае как раз можно: >>1085287 (смотри по слову "композиция")
Ответы: >>1102132 >>1102148
Аноним 2017/12/03 16:22:12  №1102107 434
Аноны, помогайте
Есть задача: написать интернет магазин (фейковый).
Что там должно быть?
Админпанель (разные варианты для админа, продавца, покупателя?).
Корзина (ХЗ как её реализовать).
Главная страница.
Меню с видами продуктов.
Меню с опциями для сортировки продуктов внутри вида (по производителю, цене, ?,?,?).
Страница продукта.
Пагинация страниц результатов (или этот модный скроллинг, но я ХЗ как его реализовать).
?.
?.
?.

Знаю, что надо использовать MVC, но на деле с ним знаком плохо. Почитать бы чего, или посмотреть как сделано.
Еще знаю, что надо использовать подготовленные запросы при обращениях к БД, чтоб избежать иньекции.

Еще подводные?
Ответы: >>1102136 >>1103061
Аноним 2017/12/03 16:45:56  №1102132 435
>>1102057
>объект API содержит в себе под-объекты, которые независимо от него не используются. Логично потому их создавать в конструкторе.
А пол-года спустя уже используются. Логично потому их не создавать в конструкторе. Ибо нехер плодить зависимости на пустом месте.
Ответы: >>1102148 >>1102188 >>1103063
Аноним 2017/12/03 16:46:58  №1102136 436
>>1102107
>Еще подводные?
Не делай тестовые задания, вот в чём подводные.
Ответы: >>1102206
Аноним 2017/12/03 16:56:43  №1102148 437
>>1101890
>>1102021
>>1102057
>>1102132

Если что-то можно создать в конструкторе, значит можно это безболезненно поместить в текущий класс. Или боишься файла на 600 строк вместо 300? Так и думать про
>через FormHandlerTest или напрямую через FormValidatorTest?
не придется.

Если хоть мысль пролетит
>А пол-года спустя уже используются.
делай DI.
Ответы: >>1102208
Аноним 2017/12/03 17:16:57  №1102188 438
>>1102132
>А пол-года спустя уже используются.

это надо в каждом конкретном случае смотреть. в общем случае это получается беспредметный спор. я могу возразить, что попытка загадать, что там будет через полгода, может привести к написанию лишнего на данный момент кода, а это вредно, т.к. через полгода понадобится не та реализация, которую ты представляешь сейчас. это помимо траты времени на ненужный код.

плюс, предполагаю, что ты говоришь про mvc, где можно 20 зависимостей передать через контейнер.
Ответы: >>1102214
Аноним 2017/12/03 17:33:29  №1102206 439
>>1102136
Это ты к чему вообще высрал?
Не знаешь, что сказать по сабжу - пройди мимо.
Ответы: >>1102214
Аноним 2017/12/03 17:37:01  №1102208 440
>>1102148
>Или боишься файла на 600 строк вместо 300?
честно говоря, да. немного побаиваюсь god object

>Если хоть мысль пролетит
>>А пол-года спустя уже используются.
>делай DI.
тут соглашусь
Аноним 2017/12/03 17:42:51  №1102214 441
>>1102206
Какой вопрос, такой и ответ. Платина.

>>1102188
Я не понимаю, почему если он нигде не используется, он вынесен в отдельный класс??

И MVC тут вообще ни при чем.
Ответы: >>1102307
Аноним 2017/12/03 18:28:10  №1102250 442
15123148902700.jpg (3, 252x200)
200x252
Господи какой же абсурд Зачем придумывать велосипеды, когда уже есть CSS с ну очень простым синтаксисом?
https://www.youtube.com/watch?v=w4_1SagLY94
Ответы: >>1102393
Аноним 2017/12/03 18:43:04  №1102262 443
Я конечно знаю, что тупой, но...
Как сделать эту задачу?
Просто жопой чую, что можно пройти через дверь, а не лезть через забор
https://ideone.com/dEcffB


Доделай шифрование до нормального уровня
Доделай расшифровку зашифрованного текста. Посказка для глупеньких: тебе поможет array_flip()

Ответы: >>1103061
Аноним 2017/12/03 19:24:31  №1102307 444
>>1102214
я не ОП и хочется услышать его мнение. мое мнение: чтобы не нарушать принцип единой ответственности и чтобы не было классов по 1000 строк.
Ответы: >>1102393
Аноним 2017/12/03 20:01:21  №1102354 445
Насколько сильно различаются mysql и mysqli?
Ответы: >>1102362 >>1103060
Аноним 2017/12/03 20:10:14  №1102362 446
>>1102354
Настолько, что все давно перешли на PDO.
Ответы: >>1102424
Аноним 2017/12/03 20:41:22  №1102393 447
>>1102307
Ждем-с тогда.

Мое мнение: если класс создает в конструкторе зависимости, он уже вышел за пределы своей ответственности.

>>1102250
Очередной язык, не хочешь — не бери.

>https://guide.elm-lang.org/error_handling/maybe.html

Ну это так-то гениально!
Аноним 2017/12/03 21:32:34  №1102424 448
>>1102362
>PDO
А все эти мускли и прочее трудно освоить?
Ответы: >>1102455
Аноним 2017/12/03 22:47:40  №1102455 449
>>1102424
mysql - это устаревшая библиотека, ее нельзя использовать. mysqli можно, но нормальные люди пользуются pdo. осваивать одинаково, если ты хоть как-то знаешь ооп, если не знаешь - mysqli будет попроще. но пользоваться им нельзя, также как сейчас нельзя писать процедурный код, поэтому лучше сразу учи pdo.
Ответы: >>1102535 >>1102585 >>1102585
Аноним 2017/12/04 01:08:50  №1102535 450
>>1102455
Поцце-дурный код как раз можно. Эх как создам, бывало, просранства имён и в них функций каак насру...
Аноним 2017/12/04 01:57:54  №1102565 451
Аноны,надеюсь вы не спите.
В задаче про массивы и генерацию имени для питомца
С задачей я справился так:
https://ideone.com/BKUeFG
и вот так:
https://ideone.com/Jt8nm5
Так вот у меня такой вопрос:
$petName = implode(array_rand($letters,4));
echo $petName;
Печатаются ключи ,которые получились при рандоме,а как получить доступ к значениям?

Ответы: >>1103060
Аноним 2017/12/04 06:14:57  №1102585 452
>>1102455
>>1102455
>mysqli будет попроще. но пользоваться им нельзя.
Почему нельзя? Религия не позволяет?

Ответы: >>1103060
Аноним 2017/12/04 09:17:22  №1102620 453
Народ, как создается страница, ну скажем с товаром. У меня есть корзина, я добавляю туда товар, я правильно понимаю:
На сервак поступает запрос с требованием создать HTML элемент в корзине с данными, формами и т.д в свою очередь в хранилище есть готовый CSS файл со стилем для этих элементов, так?
Т.е запрос создать в HTML доп. элементы с уже готовым стилем в CSS файле который содержит инфу об отступах от первого элемента в корзине, от второго и до бесконечности > выноска с HTML кодом добавляется в пользовательский HTML файл и инфа со стилем не меняется, а остается нетронутой. Правильно?
Ответы: >>1102638 >>1103060
Аноним 2017/12/04 09:47:24  №1102638 454
>>1102620
Да, всё правильно. Впрочем при необходимости на php можно генерировать даже CSS файлы.
Ответы: >>1102651
Аноним 2017/12/04 10:28:04  №1102651 455
Аноним 2017/12/04 13:49:08  №1102727 456
15123845487080.jpg (32, 604x492)
492x604
>>1097438 (OP)
https://ideone.com/cPiQC3
Делаю задачу с опечатками.

Не могу понять в чём проблема. Почему у меня выдаёт только часть слова с ошибкой? Когда я прописываю просто одно слово с ошибкой в виде переменной ($text = "Постaвка";), то всё определяется нормально и выводится как и должно, а после разбивки строки на массив и прохождения по нему циклом выдаёт только кусок слова. Хелп ми.
Ответы: >>1103056
Аноним 2017/12/04 13:51:54  №1102730 457
кто шарит, объясните, в чем разница между
$this::staticMethod() и
self::staticMethod()
Аноним 2017/12/04 13:57:13  №1102736 458
>>1102730
В первом обращение к статичному методу объекта, во втором обращение к классу объекта.
Ответы: >>1102756
Аноним 2017/12/04 14:14:55  №1102747 459
Сходил недавно на собеседование, вакансия стажера, дали тестовое задание на верстку макета из psd, уже три дня сижу как еблан и не могу разобраться, 70% того что я запомнил вылетает из головы на следующий день, ну как так блять, неужели я настолько тупой что даже это не могу освоить.
Ответы: >>1102757
Аноним 2017/12/04 14:40:08  №1102756 460
>>1102736
в первом обращение к объекту, а во втором к классу, да. но в случае со статическим методом там не может быть состояния, которое привносит созданный объект. то есть, по сути это всегда обращение к классу. так получается, что разницы нет?
Ответы: >>1102819
Аноним 2017/12/04 14:42:05  №1102757 461
>>1102747
вакансия стажера-верстальщика?

не парься, первое время все тупые. через полгода будет лучше.
Аноним 2017/12/04 15:00:32  №1102767 462
Ответы: >>1102795 >>1102805
Аноним 2017/12/04 15:46:32  №1102795 463
>>1102767
в случае с
public static function durr() {
$this::staticMethod();
}

идет обращение к $this в контексте статического метода, что нельзя делать, поэтому фатал. это понятно

я спрашивал про
public function yarr() {
$this::staticMethod();
}
и
public function hurr() {
self::staticMethod();
}

которые выводят одинаковый результат. то есть в данном случае разницы нет. так?
Ответы: >>1102821
Аноним 2017/12/04 16:15:42  №1102805 464
>>1102767
я понимаю, что так $this::staticMethod() делать не надо, т.к. это идиотская конструкция. но мне непонятно, зачем в языке до сих пор присутствует эта возможность. насколько я понимаю, она там с 5.3. просто руки не дошли выпилить?
Ответы: >>1102820 >>1102821 >>1103056
Аноним 2017/12/04 16:54:41  №1102819 465
>>1102756
Порой такая штука удобна, например когда надо вызвать динамичный метод, причем не важно статик он или нет
$this->{$methodName}($arg)

Кстати $this::method() алиас static::method(), а не self::method()
Ответы: >>1102820 >>1103056
Аноним 2017/12/04 16:55:40  №1102820 466
Аноним 2017/12/04 16:55:56  №1102821 467
Ответы: >>1102832
Аноним 2017/12/04 17:12:59  №1102832 468
>>1102821
благодарю. про отличие static от self знаю, а про то, что с помощью $this->{$methodName}($arg) можно вызывать в т.ч. статический метод, не знал.
Аноним 2017/12/04 18:45:45  №1102890 469
>>1102730
self::staticMethod() так правильно,
$this::staticMethod() так не правильно, но все равно работает.
Аноним 2017/12/04 18:51:52  №1102895 470
Тест
Аноним 2017/12/04 18:55:45  №1102897 471
А кстати раз такая тема пошла, то спрошу, бывают ли в php статические абстрактные методы?
Ответы: >>1103002 >>1103047
Аноним 2017/12/04 20:55:41  №1103002 472
>>1102897
abstract class cA
{
static function A()
{
static::B();
}

abstract static function B();
}

class cB extends cA
{
static function B()
{
echo "ok\n";
}
}

cB::A();
cB::B();

этот код у меня выполняется на 7.1 с error_reporting e_all без ошибок, то есть бывают. но история темная, тут она описана https://stackoverflow.com/questions/999066/why-does-php-5-2-disallow-abstract-static-class-methods/31235907#31235907

получается, что в версии <7 такой код вызывал бы нотис уровня strict, а в 7 все ок.
Аноним 2017/12/04 21:02:26  №1103013 473
а вот у меня еще один вопрос по тестам.

у нас есть абстрактный класс, как его тестировать?
вижу такие варианты:
1. через существующих наследников
2. через анонимный класс-потомок (начиная с 7)
3. через getMockBuilder в PHPUnit
4. через getMockForAbstractClass в юните же

притом вариантов 1 и 4 сам нигде не нашел (кроме как 4 в мануале). также сам не смог протестировать через getMockForAbstractClass - код в шторме не покрывается. а через getMockBuilder тоже нихуя непонятно - он же подменяет методы класса, почему они тогда отрабатываются.

интересно кто что думает.
Ответы: >>1103053
Аноним 2017/12/04 21:32:11  №1103047 474
>>1102897

А где это может понадобиться? По идее, абстрактные нестатические методы используются в ситуации с наследованием: есть базовый класс Base с абстр. методом doSmth() и его наследники X, Y, Z. В коде ниже мы не знаем, объект какого именно класса перед нами, но знаем, что в нем есть метод doSmth (для таких ситуаций и придуманы абстрактные методы):

function test(Base $b)
{
$b->doSmth();
}

Но статические методы вызываются, как правило, с указанием имени класса:

X::doSmth();

Так как мы знаем имя класса, мы можем проверить, какие в нем методы есть, и задавать абстрактный метод в предке (Base) не обязательно. Потому в той же Яве абстрактных статических методов нет.

Тут я нашел такое объяснение: https://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java

> Because "abstract" means: "Implements no functionality", and "static" means: "There is functionality even if you don't have an object instance". And that's a logical contradiction.

Но в PHP все "не так однозначно". Там можно вызывать статические методы через self:: и static::, и в случае со static, вызывается метод, который объявлен в наследнике. То есть при использовании static:: получается что-то похожее на обычные методы ("позднее связывание", "позднее" тут значит, что определение, какой именно метод будет вызван ("связывание"), делается во время выполнения кода, а не во время его компиляции. В случае с self получается "раннее связывание"). Вообще, мне эта фича не нравится: для этого были придуманы обычные методы. Но раз уж такая фича есть, то получается, что логично добавить абстрактные статические методы, чтобы мы могли писать

static::doSmth()

в классе Base, когда метод doSmth абстрактный.

https://stackoverflow.com/questions/999066/why-does-php-5-2-disallow-abstract-static-class-methods

Тут пишут, что абстрактных статических методов в PHP нет (выше анон опровергает, эти разработчики там совсем двинулись уже). Напомню еще раз, что мне сама идея с переопределением статических методов и использованием static не очень нравится.

А в какой ситуации они тебе нужны?
Аноним 2017/12/04 21:34:28  №1103053 475
>>1103013

Для чего нужен абстрактный класс? Как заготовка для создания наследников.

Можно создать тестового наследника и тестировать его. То есть пишешь class TestChild extends Parent { ... }.

Либо можно тестировать только наследников этого класса, если создание дополнительных наследников не планируется.

> через анонимный класс-потомок (начиная с 7)
Можно и так.

Моки, мне кажется, не для этого. Они для подмены существующий конкретных классов.
Аноним 2017/12/04 21:35:47  №1103056 476
>>1102819

Вообще, это неправильно, вызывать статические методы через $this, на мой взгляд. Статические методы вызваются на классе (у класса), а не на объекте (не у объекта).

Если нужен динамический вызов, имхо, лучше будет написать self::$method(), call_user_func("self::$method") или call_user_func(['self', $method]).

>>1102805

В PHP вообще с ООП много проблем, так как часть разработчиков (по моим ощущениям) сишники и ООП вообще толком не понимают. Ну например, раньше там была такая "фича", что при вызыве из одного класса статического метода другого класса передавалось значение $this:

class A
{
public function a()
{
B::b();
}
}

class B
{
public static function b()
{
// $this указывает на объект класса $a
}
}

$a = new A;
$a->a();

Так что да, делать так ни в коем случае не надо.

>>1102730

Первый вариант мне не нравится. Статические методы вызывают на классе, а не на объекте.

>>1102727

Скорее всего, в слове больше одной латинской буквы. И твое выражение не захватывает все слово из-за этого. Например: П(о)(с)т(а)вка. Видишь, как хорошо зашифровано, даже твоя программа его не может справиться.

> foreach($piece as $error) {
лучше foreach ($words as $word)
Ответы: >>1104085
Аноним 2017/12/04 21:36:15  №1103060 477
>>1102620

Я не очень понимаю суть вопроса, но постараюсь прокомментировать.

> Т.е запрос создать в HTML доп. элементы с уже готовым стилем в CSS файле который содержит инфу об отступах от первого элемента в корзине, от второго и до бесконечности

Зачем эта "инфа" об отступах? В HTML/CSS тебе не надо указывать расположение каждого элемента на экране. Ты просто указываешь, что они должны идти, например, вертикально, и задаешь расстояние между ними. Или я тебя не понял, или тебе стоит подучить CSS. То есть ты пишешь что-то вроде "все товары в корзине расположены вертикально c отступом в 10px, текст в них написан черным цветом на белом фоне".

CSS файлы пишет разработчик и в них ничего программно обычно не добавляется.

Ну и не понял, при чем тут HTML файлы. В динамических сайтах HTML файлы не генерируются. Почитай-ка мой урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md#Статические-и-динамические-страницы

>>1102565

Оба варианта правильные. Только переменная названа не очень удачно, не $index, а например $syllable (слог) лучше было назвать.

>>1102585

Неудобно же, исключения не поддерживает, надо вручную результат вызова проверять.

>>1102354

Библиотека mysql удалена в PHP7. Объяснение, почему, на английском https://wiki.php.net/rfc/mysql_deprecation#why
Аноним 2017/12/04 21:36:37  №1103061 478
>>1102262

Вроде у тебя все правильно сделано. Но, конечно, помни, что это лишь задача и метод шифрования тут вскрывается элементарно, полным перебором либо статическим анализом.

>>1102107

Может, надо писать не с нуля, а взять готовую CMS? Много работы же получается.

>>1101890

> как я понимаю, мы тестируем не весь код втупую, а логику работы приложения, т.е. не тестируем непубличные методы, а тестируем публичные,
Да. Тогда тесты не будут ломаться при внутренних изменениях в классе.

> т.е. допустим есть класс FormHandler и у него в конструкторе создается объект класса FormValidator, который вне этого хендлера больше нигде не будет использоваться, нам его как тестировать?
> через FormHandlerTest или напрямую через FormValidatorTest? Я сам склоняюсь к первому варианту, но смущает то, что в валидаторе может быть какая-то хитрая логика, которую в таком случае лучше тестить напрямую.

В Яве есть такая штука, как "приватные" классы, то есть вспомогательные классы, объявленные внутри другого класса и недоступные/невидимые снаружи этого класса. Их, конечно, можно не тестировать.

Если твой класс FormValidator по смыслу такой же "вспомогательный", то ты можешь тестирвать только FormHandler. Но на практике, скорее всего, у тебя как-то распределены обязанности между этими 2 классами. И удобнее тестировать их по отдельности.

То есть FormValidator тестирвоать на то, что он обнаруживает все виды ошибок. А FormHandler тогда можно уже не тестировать на все виды ошибок, а только на одну, что он правильно обрабатывает такую ситуацию.

>>1101449

Про исключения почитай урок https://github.com/codedokode/pasta/blob/master/php/exceptions.md

Если ты хочешь как-то специально обработать конкретное исключение, ты пишешь try/catch. Ну например, ты скачиваешь файл, а при ошибке - берешь его с диска:

try {
$file = downloadFile();
} catch (DownloadException $e) {
log("Error downloading file: $e->getMessage()");
$file = loadFromDisk();
}

Если же ты не хочешь как-то специально обрабатывать исключение, а просто показать страницу ошибки, то нужно использовать обработчик исключений по умолчанию либо один большой try/catch на самом верхнем уровне программы.

Код на гитхабе недоступен.
Ответы: >>1103252 >>1104455
Аноним 2017/12/04 21:36:59  №1103062 479
>>1101420

Насчет симфони. Мне кажется, проблема в том, что ты используешь несовместимые с симфони 4 пакеты.

Вот смотри, что пишет композер:

> Problem 1
> - stof/doctrine-extensions-bundle v1.2.2 requires symfony/framework-bundle ~2.1|~3.0

Это сторонняя библиотека, не часть Симфони. Открываем эту библиотеку на гитхабе: https://github.com/stof/StofDoctrineExtensionsBundle/blob/master/composer.json

> "require": {
> "symfony/framework-bundle": "~2.1|~3.0",

То есть она не совместима с Symfony 4. Что можно сделать:

- отказаться от нее
- попросить авторов сделать поддержку Symfony 4 (уже: https://github.com/stof/StofDoctrineExtensionsBundle/issues/354 )
- сделать поддержку самому и запушить пулл реквест, а пока он не принят, использовать версию из своего гитхаба (уже сделали: https://github.com/stof/StofDoctrineExtensionsBundle/pull/358 и ты можешь подключить версию из того гитхаба)

То есть композер тебе все правильно написал, он перебрал все версии библиотек и не нашел совместимых. Как удобно. А представь, без композера, руками обновлять такую кучу библиотек и только потом обнаружить, что они не совместимы?

> Что-то мне подсказывает, что заполнять это руками неразумно. Я вообще не могу понять (и нагуглить) сути проблемы.
Тут сложность в том, что Симфони состоит не из одного, а из множества пакетов. И обновлять их надо синхронно. Проще всего взять стандартное приложение на Симфони и список версий оттуда https://github.com/symfony/symfony-standard

Затем ты пробуешь обновиться и смотришь, что напишет композер. И разбираешься с проблемными библиотеками.

> , то эта проблема уйдёт и появится подобная с другой библой уже.
Без подробностей помочь не могу.
Ответы: >>1104046
Аноним 2017/12/04 21:37:23  №1103063 480
>>1101337

Ubuntu server (не desktop) вполне адекватная вроде. Разве что у меня в виртуалке логин притормаживает в сравнении с дебианом. А что тебе-то не нравится?

>>1101898

Можно и создавать. Зависит от ситуации. Ну например, если не может быть причин заменять класс на что-то другое, то можно его там же и создать. Ну например, если у нас форма редактирования студента, то валидатор для этой формы вряд ли понадобится менять на другой и можно его там и создать.

Также, если внутренний класс представляет собой не сервис, а сущность, и они иногда должны создаваться, тоже проще обойтись без DI.

DI должен использоваться там, где это уместно, где это решает какую-то проблему, а не вообще для любых классов. Использование DI подразумевает, что мы можем передать другую реализацию зависимости. Но тут ведь это явно не так. Нам нужен один конкретный валидатор и нельзя сюда передать какой-то модифицированный валидатор.

На практике, может показаться, что DI тут использовать удобнее. Ведь скорее всего, у FormValidator есть тоже какие-то зависимости, например, доступ к БД. Его надо как-то передать туда, и получается, что удобнее тут использовать DI и передать ответственность за получение зависимостей DI контейнеру.

Если зависимостей у FormValidator нет, можно не использовать DI.

Есть еще вариант передавать зависимости в FormHandler:

class FormHandler
{
public function __construct($dep1, $dep2, $dep3)
{
$validator = new FormValidator($dep1, $dep2, $dep3);
}

Но тут видна нелогичность: не проще ли передавать сразу $validator вместо 3 зависимостей? Но если мы сделаем DI (будет принимать $validator снаружи), то получается, что мы готовы работать с несколькими вариантами валидатора. Что тоже нелогично. Это говорит о том, что мы не очень удачно сделали разделение ответственности между классами.

Потому что у нас и FormHandler заточен на работу только с одной конкретной формой, и FormValidator - тоже. Может есть смысл как-то перераспределить код так, чтобы был отдельно универсальный валидатор или класс для работы с любыми формами, а отдельно - класс, хранящий информацию (правила валидации) для какой-то конкретной формы. Или объелдинить оба класса в один.

Понятно ли я объяснил? Увы, без примеров кода объяснения получаются абстрактными.

Когда ты посмотришь примеры разных ООП-фреймворков, у тебя со временем появится интуитивное понимание, где что лучше использовать.

>>1102132

Ну когда будут использоваться, тогда можно код переделать. Почитай-ка статью и узнай про YAGNI: https://habrahabr.ru/post/153225/

Напомню всем любителям поломать голову над ООП, что в этом треде есть задача про Гостиницу и Продюсерское Агенство (ищите поиском), и я пока что-то ни одного решения не видел, только обсуждения.
Аноним 2017/12/04 22:05:34  №1103103 481
Ответы: >>1103111 >>1103114
Аноним 2017/12/04 22:08:04  №1103106 482
15124144842290.png (59, 1167x472)
472x1167
Че не так то?
Ответы: >>1103147
Аноним 2017/12/04 22:10:52  №1103111 483
>>1103103
Может быть дело в "++"?
Аноним 2017/12/04 22:12:58  №1103114 484
Ответы: >>1103117 >>1103136
Аноним 2017/12/04 22:15:05  №1103117 485
Ответы: >>1103122 >>1103124
Аноним 2017/12/04 22:16:58  №1103122 486
>>1103117
Ну да. Ты прав. Сдаюсь.

Красиво.
Ответы: >>1103124 >>1103137
Аноним 2017/12/04 22:17:35  №1103124 487
>>1103117
>>1103122

только что это
1 1 = 1
2
2 = 1
3 3 = 1
4
4 = 1
5 5 = 1
6
6 = 1
7 7 = 1
8
8 = 1
9 * 9 = 1
Аноним 2017/12/04 22:20:26  №1103127 488
15124152271950.jpg (10, 480x360)
360x480
Безумие - это точное повторение одного и того же действия, раз за разом, в надежде на изменение. Это есть безумие.


https://ideone.com/KUFAQ8

Ответы: >>1103139 >>1103152 >>1103154
Аноним 2017/12/04 22:22:50  №1103136 489
Аноним 2017/12/04 22:23:34  №1103137 490
Аноним 2017/12/04 22:24:20  №1103139 491
Аноним 2017/12/04 22:43:02  №1103147 492
>>1103106
Вот я хлебушек, разобрался.
Аноним 2017/12/04 22:45:28  №1103152 493
>>1103127

$a < 10, $b < 10

тут ошибка. Учитываться будет только последнее условие. Надо писать с использованием оператора "И", то есть &&:

$a < 10 && $b < 10

Потому что в первой и третьей части ты просто указываешь действия. А в средней части - условие проверки, и тут запятую использовать нельзя.
Аноним 2017/12/04 22:48:02  №1103154 494
>>1103127

Прокомментирую, почему так: запятая - это оператор, который отбрасывает значение выражения слева, и возвращает значение выражения справа. Этот оператор можно использовать только в заголовке for.

То есть $x, $y даст тот же результат что и $y (если $x не выполняет никаких действий, а только что-то проверяет).

Аноним 2017/12/05 01:52:31  №1103249 495
Аноним 2017/12/05 02:13:27  №1103252 496
>>1103061
>Много работы же получается
Ну так дипломная же.
Аноним 2017/12/05 03:03:36  №1103257 497
15124322164660.png (235, 700x700)
700x700
вкатываюсь к вам, слоники
ну вот скачал я ваш netbeans php
настроил всё, не самодельничал
и не могу подключиться к локалхосту
Ответы: >>1103367 >>1103444
Аноним 2017/12/05 03:25:11  №1103259 498
>>1101420

Алсо, может тебе помогут такие команды композера:

> prohibits Shows which packages prevent the given package from being installed.
> why Shows which packages cause the given package to be installed.
> why-not Shows which packages prevent the given package from being installed.

Аноним 2017/12/05 04:20:38  №1103265 499
А что можно простое сделать на js типа задачи на студентов?
Ответы: >>1103278 >>1103279
Аноним 2017/12/05 05:14:08  №1103278 500
>>1103265

Игру сапер или другие задания отсюда: https://gist.github.com/codedokode/ce30e7a036f18f416ae0#3-Сапер (прокрути до сапера, там вначале идут простые задачи, а потом поинтереснее)

Слишком просто? Есть игра поинтереснее, Арканоид: https://gist.github.com/codedokode/9933897

Хочется что-то более реалистичное? Сделай сайт-приложение (SPA), где можно просматривать ленту картинок, разбитых по категориям, можно ставить лайки и сохранять в избранное. Разумеется, SPA должен частично сохранять работоспособность даже при пропадании связи с интернетом.

Еще сложнее? Сделай простой мессенджер.

Слишком просто??? Ну ладно, так и быть, держи задание уровня nightmare (его решило 0 человек): https://github.com/codedokode/pasta/blob/master/js/spa.md Молодец, что ты не ищешь легких путей, и просишь задачи посложнее, это тебе наверняка поможет в будущем.
Аноним 2017/12/05 05:14:46  №1103279 501
>>1103265

Можешь еще сделать студентов в виде SPA на knockout/react/angular.
Аноним 2017/12/05 05:32:08  №1103281 502
Хейтера потерли, уря.
Аноним 2017/12/05 08:14:21  №1103304 503
Сап, обьясните слоупоку профиты от Nosql баз данных? Как так получилось что всех всё устраивало, всё работало идеально, а потом в 2012 все резко поняли что реляционные базы - говно и надо с них срочно мигрировать на NoSql.
Ответы: >>1103353
Аноним 2017/12/05 10:46:47  №1103339 504
Сап как сделать мультиплеерную рисовалку ?
Аноним 2017/12/05 11:32:18  №1103353 505
>>1103304
Если совсем вкратце, то в большом количестве nosql бд, ты жертвуешь фичами и гарантиями современных реляционных бд ради красивых цифр в бенчмарках.
То есть некоторые специализированные nosql вполне ничего, но,например, какую-нибудь монгу не очень понятно зачем вообще использовать в среднем проекте.
Аноним 2017/12/05 12:35:21  №1103367 506
>>1103257
бывает, чо.

алсо, нетбинс тут не любят.

если ты на винде, ставь openserver - там все сразу работает из коробки. также в шторме есть простой способ запускать вебсервер, который дает пхп. также в пхп есть встроенный вебсервер по php -S, кажется.
Ответы: >>1103793
someApprentice 2017/12/05 14:29:42  №1103412 507
http://phpclub.tech/

Я не совсем уверен, что сказал @kubk по поводу старых тредов, но они скоро появиться
Ответы: >>1103572
Аноним 2017/12/05 15:10:40  №1103429 508
Оп, можешь дать подсказку по реализации прохождения тестов? В задании подразумевается, что на каждый вопрос нужна отдельная страница (/question/1, /question/2 и т.д.), но как тогда в таком случае быть с формами? Каждый ответ на вопрос отправлять на сервер? И куда их потом? В таблицу тестов пользователя?
Ответы: >>1103888
someApprentice 2017/12/05 15:13:53  №1103435 509
Аноним 2017/12/05 15:21:21  №1103441 510
Посоветуйте учебник или обзор языка пхп для фронтендера, сам пишу на жс, работаю в связке с бэкендером, инб почему у него не спросишь, не спрошу тк ему под 40 уже и он не в курсе актуальных учебников. Нужно просто составить представление о языке и основных операторах.
Ответы: >>1103450 >>1103588
someApprentice 2017/12/05 15:22:45  №1103444 511
Ответы: >>1103793
Аноним 2017/12/05 15:26:28  №1103450 512
>>1103441
Если тебе просто пробежаться по синтаксису можешь попробовать какие нибудь ущербные курсы вроде codeacademy пролистать, если серьезно вникать то по php, наверное один нормальный учебник это http://www.phptherightway.com/
Аноним 2017/12/05 15:44:38  №1103469 513
Анончики, подскажите пожалуйста, почему функция не работает?
https://ideone.com/9fjsix
Ответы: >>1103478
Аноним 2017/12/05 15:55:58  №1103478 514
>>1103469
У тебя скобка после return не закрыта, функцию вызываешь уже после вывода, если хочешь вывести переменную в строке используй обратные ковычки `{$var}`.
Ответы: >>1103482
Аноним 2017/12/05 16:03:38  №1103482 515
>>1103478
Спасибо большущее, разобрался
Аноним 2017/12/05 19:13:49  №1103564 516
Посоны, все тот же вкатывальщик в фронтенд. Где нибудь есть хорошие мануалы по верстке сайта по psd шаблону?
Дали тестовое задание, не могу разобраться с позиционированием и актуальными инструментами для верстки, тут фреймворк, там reset.css, тут хуй рассказывает как верстать через костыли актуальные в 2008.
Ответы: >>1103588 >>1103598
Аноним 2017/12/05 19:32:58  №1103572 517
>>1103412

Ссылка на /chain/ стоит на значке № и хрен догадаешься, что она там есть. Лучше сделать ее более заметной, например, сделав надпись "цепочка сообщений" или как-то еще.

Также, можно убрать прокрутку у длинных постов - это ведь по идее защита от постеров-шутников, которых в архиве скорее всего нету.
Ответы: >>1103594
Аноним 2017/12/05 20:19:24  №1103588 518
>>1103564
я сам не фронт и даже в верстку не умею, но фронты говорили, что самые пиздатые курсы по этой херне у htmlacademy.

>>1103441
ну учебник ОПа по азам - самое то. что тебе еще-то надо?
someApprentice 2017/12/05 20:29:12  №1103594 519
>>1103572
>Ссылка на /chain/ стоит на значке № и хрен догадаешься, что она там есть. Лучше сделать ее более заметной, например, сделав надпись "цепочка сообщений" или как-то еще.
Я вообще хочу убрать эту функцию. Я когда проектировал, хотел чтобы обсуждения, которые растягиваются на несколько тредов, вывелись по одному клику. Но вместо этого, если в цепочку попадает ОП-пост или ещё какой-нибудь пост с кучей ответов, то всё превращается в кучу молу.
За место этого, я хочу сделать, чтобы пользователи сами добавляли нужные им посты в "Избранное". Всё равно я планирую прикрутить чатик, поэтому регистрация в любом случае понадобиться.
Нужно обсудить это ещё с моей командой.

>Также, можно убрать прокрутку у длинных постов - это ведь по идее защита от постеров-шутников, которых в архиве скорее всего нету.
Что за защита? Если что будет в посте, то это тоже спарситься из активных тредов.
Ответы: >>1103597
Аноним 2017/12/05 20:40:32  №1103597 520
>>1103594

Я имею в виду, здесь стоит ограничение на высоту поста для защиты от вайперов, которые могут постить посты на 5000 строк из 1 символа. В архиве в этом нет необходимости и прокрутка только мешает читать сообщение.
Ответы: >>1103601
someApprentice 2017/12/05 20:42:59  №1103598 521
>>1103564
Если тебе тяжело решить тестовое задание, то представь как тяжело будет решить боевое. Лучше подтянуть свои знания. У нас, кстати, есть задача на вёрстку лэндинга(?) из .psd макета https://github.com/codedokode/pasta/blob/master/html/html.md#Главное-задание-на-верстку-макета
И ещё относительно простые задачки по html/css, которые научат тебя базовым трюкам https://github.com/codedokode/pasta/blob/master/html/html.md#Задания
Ответы: >>1103619
someApprentice 2017/12/05 20:44:40  №1103601 522
>>1103597
Ок, я уже добавил это к себе в задачи. Мне тоже не удобно читать посты с прокруткой.
Аноним 2017/12/05 20:57:16  №1103612 523
Хорошая статья, разработчики виртуальной клавиатуры для айфона случайно открыли доступ к своей монге в Интернет и исследователи выяснили, какие данные с телефона собирало и накапливало приложение (все, до чего смогло дотянуться).
Ответы: >>1103613
Аноним 2017/12/05 20:58:04  №1103613 524
Аноним 2017/12/05 21:07:50  №1103619 525
>>1103598
Большое спасибо, попробую разобраться. Проблема в том, что я смотрю в psd шаблон и понимаю как все должно выглядеть и какие должны быть параметры/отступы, в каких блоках какие типы элементов должны распологаться, но когда доходит до верски - то все идет по пизде и я понимаю что все свои мысли для решения не могу перенести в html/css код, буду учиться, еще раз благодарю.
Ответы: >>1103625
Аноним 2017/12/05 21:16:04  №1103625 526
>>1103619

Тебе надо изучать позиционирование. У меня есть такой недописанный урок, и в нем картинка со всеми имеющимися видами позиционирования элементов: https://github.com/codedokode/pasta/blob/master/html/positioning.md#Виды-позиционирования

Тебе надо знать их все. И тогда ты, глядя на макет, просто в уме представляешь как это реализовать.

То есть ты просто пока плоховато знаешь CSS или учил его по урокам, которые не рассказывают подробно про позиционирование, как мне кажется.

Я например в большинстве случаев могу написать CSS код не проверяя его в браузере, затем открыть страницу и она, скорее всего, отобразится как задумано с небольшими косяками, которые я исправляю. Я также стараюсь заранее продумать такие вещи, что например, текст может быть короче или длиннее, пунктов в меню может быть больше итд.

А вот те, кто делают верстку "опытным" путем, постоянно правя что-то и смотря результат в браузере - у них конечно все это идет медленно и неэффективно.

Вообще, в большинстве случаев там все просто - обычно сайт собран из вертикально расположенных блоки, которые иногда деляnся на несколько частей или колонок.
Аноним 2017/12/05 22:24:03  №1103653 527
Что нужно знать по базам данных, чтобы решить студентов ?

Ответы: >>1103659
someApprentice 2017/12/05 22:37:43  №1103659 528
>>1103653
CREATE DATABASE ...
CREATE TABLE ...
INSERT ...
UPDATE ...
SELECT ... ORDER BY/OFFSET/LIMIT
DELETE ...

Но в боевых задачах, практически, всегда нужно будет работать с БД. Поэтому, запросы нужно знать хорошо.
Есть урок и задачи по SQL https://github.com/codedokode/pasta/blob/master/db/databases.md
Ответы: >>1103676
Аноним 2017/12/05 23:22:34  №1103676 529
>>1103659
Спасибо.
Я тут еще один вопрос задам. Возможно глупый.
Чтобы подключить базу данных к PHP нужно PDO изучить, да?
Ответы: >>1103836
Аноним 2017/12/06 00:01:37  №1103688 530
Вечер добрый, на чем лучше написать чат? Node + socket, php +.socket, RabbitMQ + php? Для меня нет проблемы написать на всех трех, по отдельности я с ними работал либо читал документацию но вот не знаю, на чем остановиться так как скорее всего надо чтобы проект был масштабируемым
Ответы: >>1103725 >>1103823
Аноним 2017/12/06 01:48:23  №1103725 531
Анончики. Те из вас, кто проходил мой учебник или изучал регулярки где-то еще, знаком наверно с сайтом https://regex101.com/ где можно вдоволь тестировать регулярку.

Увы, этот сайт недоступен на русском языке. Что, конечно, создает проблемы. Но! Ты, анон, да-да вот именно ты, можешь это изменить.

Они запилили поддержку переводов https://github.com/firasdib/regex101-translations/

Чтобы на сайте появился русский или другой близкий и понятный тебе язык, нужно взять файл вроде https://github.com/firasdib/regex101-translations/blob/master/english.json , и в каждой паре слов справа заменить английские слова на переведенные.

В файле есть специальные конструкции вроде {0}, они обозначают места, куда будет вставлен какой-то дополнительный текст, их надо оставить.

Я бы также советовал параллельно читать мануал http://php.net/manual/ru/pcre.pattern.php и делать перевод, используя одинаковые термины, чтобы не сбить читателя с толку.

Более того, чтобы не делать это руками, запилен сайт для переводов https:// r101 cf / projects/regex101/ (русского там нет). Если перевод уже есть - не беда, можно его проверить и одобрить/предложить исправление.

Если у тебя, анон, есть время, и если ты сейчас изучаешь регулярки, почему бы не поучастовать? Ты лучше будешь знать английский язык, выучишь полезные термины.

Если ты, анон, уже чем-то занят и делаешь сложный проект, то эта задача наверно не для тебя.

>>1103688

Если будешь делать бекенд на PHP, то больше сможешь изучить (reactphp например).
Аноним 2017/12/06 02:53:58  №1103731 532
Можно ли, и если да, то как, работать в php с массивами байтов напрямую, в виде байтов, т.е. читать их, писать в виде hexString, менять отдельные байты как числа и т.д.?
Ответы: >>1103743 >>1103745
Аноним 2017/12/06 04:45:30  №1103743 533
>>1103731
Можно. Так же как и с массивам не в виде байтов.
Аноним 2017/12/06 04:58:28  №1103745 534
>>1103731

Да. Строка в PHP это и есть массив байтов (не символов).

$s = '12345';
// запись байта в массив
$s[0] = ord(0x35);
// или
$s[0] = "\x35";
// чтение
echo chr($s[1]);
// размер массива
echo strlen($s);
Аноним 2017/12/06 08:58:24  №1103793 535
Аноним 2017/12/06 10:34:18  №1103823 536
>>1103688
Для масштабируемых чатов, я бы волшебный обратил внимание на akka и java/scala или вообще какой-нибудь erlang. Акторная модель многопоточности, которая там и там используется, очень хорошо подходит для чатов
Ответы: >>1103825 >>1103849
Аноним 2017/12/06 10:35:17  №1103825 537
>>1103823
>волшебный
вообще*

быстро-фикс
someApprentice 2017/12/06 10:46:33  №1103836 538
Аноним 2017/12/06 11:18:32  №1103849 539
>>1103823
>волшебный
Надо было и не фиксить, мне приятно.
Знаю только JS/php/sql и начал изучать Golang читаю доки в свободнее от работы и чтения других доков время
Не могу же заказчику заявить, мол я буду делать на незнакомом мне языке чат, поэтому это займет в 3 раза больше времени чем нужно.
Ответы: >>1103852
Аноним 2017/12/06 11:30:39  №1103852 540
>>1103849
Кстати, го тоже неплохо пойдет под задачу.

А так я думал, что это для себя пишется. Если для заказчика, то да, надо брать знакомое и проверенное.
Аноним 2017/12/06 13:02:39  №1103888 541
>>1103429
Оп, ну хоть намекнуть можешь?
Аноним 2017/12/06 14:11:48  №1103926 542
15125587088470.png (4, 502x152)
152x502
15125587088471.png (7, 431x350)
350x431
???
Ответы: >>1103927 >>1103966 >>1104129
Аноним 2017/12/06 14:14:38  №1103927 543
>>1103926
Это такой троллинг солнышко ммм?
Ответы: >>1103930 >>1104129
Аноним 2017/12/06 14:18:33  №1103930 544
Ответы: >>1103934
Аноним 2017/12/06 14:23:05  №1103934 545
Ответы: >>1103936
Аноним 2017/12/06 14:28:49  №1103936 546