[Ответить в тред] Ответить в тред

Check this out!


<<
Назад | Вниз | Каталог | Обновить тред | Автообновление
542 | 74 | 164

Клуб изучающих PHP #104 /php/ Аноним 23/09/18 Вск 12:41:26  1268753  
php-noob-2.png (33Кб, 500x500)
cats.jpg (157Кб, 1024x683)
cat2.jpg (194Кб, 1024x768)
пхпкурсыкошкоде[...].jpg (289Кб, 700x840)
Добро пожаловать в клуб востребованных и незаменимых людей.
Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки, печем печенье и даже делаем простые сайты! Зачем? Кто-то хочет изменить мир, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1232710 (OP) (OP) . Остальные треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

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

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

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

С чего начать

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

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).

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

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

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

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

Платиновые вопросы

- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Аноним 23/09/18 Вск 12:43:32  1268755
15322355820600.jpg (156Кб, 787x830)
15322355820621.png (56Кб, 500x644)
В прошлом треде >>1232710 (OP) (OP) все проверено - зайдите и найдите свой пост и скорее всего на него есть ответ. Если я кого-то пропустил, напомните о себе тут.

---

Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на 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
Аноним 23/09/18 Вск 12:50:32  1268762
Ребзя, а чому вы не юзаете форматированный вывод строк при помощи printf? Глаз упал на

> I am $age years old

Чому переменную не обрамляете фигурными скобками? Раньше это было чуть ли не стандартом: ${var} или {$var} в строке.
Аноним 23/09/18 Вск 12:52:35  1268763
ДЛЯ СЛЕДУЮЩЕГО ПЕРЕКАТА
Аноним 23/09/18 Вск 12:55:25  1268765
>>1268762
>printf
Актуально для консольных утилит.
ECHO проще, у него даже злоебучих круглых скобок нет.

>>1268762
>${var}
Лишние знаки, нахуй они нужны?
Аноним 23/09/18 Вск 13:00:55  1268773
>>1268762
Пишу переменные в фигурных скобках в тексте. Учился по какой то олдовой книге, с тех пор так и пишу.
Аноним 23/09/18 Вск 13:02:55  1268780
>>1268773
Держи вкурсе
Аноним 23/09/18 Вск 13:04:19  1268782
>>1268765
Вот этот >>1268773 пишет походу про ту же книгу, которую я когда-то читал. Возможно, это было у котерова в рнр5. Пока писал на рнр, уже 8 лет ни строчки не написал, считалось хорошим тоном в строках писать переменную в curly braces.
Аноним 23/09/18 Вск 13:54:14  1268857
bapkong.jpg (248Кб, 1372x1952)
Bapkong has entered the arena.
И начал очень медленно писать студентов.
Аноним 23/09/18 Вск 13:57:44  1268861
oshibka.png (4Кб, 836x70)
kod.png (11Кб, 469x174)
Анон, пытаюсь сделать задачку на палиндром, пока на этапе удаления пробелов и перевода строки в нижний регистр. Командная строка говорит, что в строчке перевода что-то не так, но я не понимаю...подскажите пожалуйста! И если не сложно посмотрите на следующую где я хочу удалить пробелы, пойдет ли такой вариант?
Аноним 23/09/18 Вск 14:02:02  1268864
>>1268861
ideone не работает с mb функциями. Если тебе принципиально решение на идеоне, сделай проверку тождества через регексп с флагом игноркейсом.
Аноним 23/09/18 Вск 14:47:42  1268917
26.jpg (271Кб, 960x1280)
>- дан список слов в массиве, например: $words = ['кошка', 'кит', 'собака']. Список слов может быть любым, не только как в примере.
>- надо сгруппировать эти слова по первой букве и вывести (в первой строчке все слова на одну букву, во второй на другую, итд). Сортировать по алфавиту не требуется, выводить можно в любом порядке. Например, для слов выше программа должна вывести:

>К: кошка, кит
>С: собака

Код: jdoodle.com/a/G3e

Тащемта для всего алфавита нужен один if, 32 else if и else если в массиве первая буква не кириллический символ, а что-то другое.
Аноним 23/09/18 Вск 14:51:30  1268922
>>1268857
Буду болеть за тебя, аниме-ребенок!
Аноним 23/09/18 Вск 14:52:10  1268923
>>1268917
>26.jpg
Рязань
Аноним 23/09/18 Вск 14:55:58  1268926
Спасибо. Может, сегодня успею всю основную структуру фронт контроллера написать.
Аноним 23/09/18 Вск 14:56:25  1268927
>>1268926
Ссылку забыл >>1268922
Аноним 23/09/18 Вск 15:17:45  1268947
image.png (476Кб, 714x644)
>>1268890
>> Откуда такая любовь к laravel?
> Компонент-бейзед

Это на словах, а по факту ты получаешь сильно связанные компоненты, которые в отрыве от фреймворка работать не будут. Компоненты Symfony гораздо более независимые и реюзабельные. Например Symfony Validator требует только общий пакет для интерфейсов (symfony/contracts) и опциональные полифиллы для PHP расширений mbstring и ctype (если в 2018-м у тебя по какой-то причине нет возможности установить их в PHP): https://github.com/symfony/validator/blob/master/composer.json

А вот валидатор Laravel: https://github.com/laravel/framework/blob/5.6/src/Illuminate/Validation/composer.json
Он требует наличия DI-контейнера Laravel (!), пакет переводов Laravel, непонятно зачем слой для работы с HTTP запросами/ответами (symfony/http-foundation), illuminate/support (ненужный мусорник: http://mattallan.org/posts/dont-use-illuminate-support/)

> современные паттерны

Monkey-patch, магические и статические методы повсюду + трейты это паттерны фанбоев, бросающихся на цветные фантики: https://blog.ircmaxell.com/2011/07/are-traits-new-eval.html
Всё это делает исходники фреймворка месивом из переплетающихся трейтов и магических методов, где IDE без костылей не может статически понимать код: https://github.com/barryvdh/laravel-ide-helper
Я даже боюсь статические анализаторы кода вроде Psalm и Phan подрубать к Laravel, они ведь обезумеют от увиденного.

> адекватный порог вхождения

Адекватный для кого, для совсем нулячих в PHP? Потом они из-за отсутствия фундаметальных знаний лезут на форумы / в чаты с тупыми вопросами, которые относятся не к фреймворку, а как базовым знаниям PHP и БД.
Аноним 23/09/18 Вск 15:25:11  1268949
>>1268947
Я не тот анон, но спасибо что ответил.
Аноним 23/09/18 Вск 15:51:41  1268958
https://ideone.com/yC58nJ
Как в задаче про банкомат проверить, достаточно ли купюр для выдачи?
Аноним 23/09/18 Вск 16:44:46  1268987
maxresd.jpg (156Кб, 1280x720)
Дублирую из предыдущего треда.
Сделал граммар нази и опечаточники. Итак.
1) Граммар нази. Тут у меня есть ощущение, что я как-то не аутентично использую функции для работы с регулярками + там же надо делать исправление больших букв и я его добавил отдельным правилом т.е. не оче умно. Но т.к. я уже долго в этом вожусь - оставил как есть.
Задача: https://ideone.com/OW5uJV
2) Опечаточники. Тут ты, ОП, в спойлере у задачки оставил примеры текстов - которые добавляют дополнительные условия, т.е. в слове может быть несколько опечаток, или англ.символы могут идти подряд, что заставляет переписывать регулярки и код. Кароче пока тоже оставил как есть.
Задача: https://ideone.com/KmRlPx
P.S. В общем мне нужен пример решения, хочется двигаться дальше. ОП'чик скинь мне на мыло vovchenkoal@yandex.ru или телегу @y0urbe3tfr1end
Аноним # OP  23/09/18 Вск 17:14:30  1268996
>>1268987
Скинул, тебе за щеку.
ОП-треда, который проверяет задачки, потерялся.
Просто загугли задачки и посмотри как у других.
Аноним 23/09/18 Вск 18:27:49  1269041
Помогите, не могу подключиться к mysql
Warning: mysqli_connect(): PHP was built without openssl extension, can't send password encrypted in C:\Apache24\htdocs\lab4.php on line 2
Аноним 23/09/18 Вск 18:29:02  1269042
>>1269041
mysql работает, в php.ini extension=openssl раскомменчено
Аноним 23/09/18 Вск 18:32:53  1269044
>>1269041
> PHP was built without openssl extension

>>1269042

То есть тебе эта строчка ни о чем не говорит? РНР собран без поддержки openssl. Собирай ручками, довен.
Аноним 23/09/18 Вск 18:36:35  1269046
>>1268958
"Лиличка" - https://3v4l.org/9nNiF
Приступил к следующей задачке, и обосрался еще раз.
Как вывести столбцы рядом друг с другом, а не все в один большой столбец?
Аноним 23/09/18 Вск 18:40:42  1269047
>>1269044
а хуль у них на официальном сайте такое гамно лежит без поддержки openssl?
https://windows.php.net/download/ скачивал VC15 x64 Thread Safe 7.2.10
да я и не умею собирать
Аноним 23/09/18 Вск 19:21:47  1269066
>>1269047
Я ебу чому они без опенссл выкладывают сборки? Я на прыщах всегда сам собирал рнр с нужными мне модулями. Вот читай как выйти из твоего положения http://php.net/manual/ru/openssl.installation.php
Аноним 23/09/18 Вск 19:22:38  1269067
69252480p0maste[...].jpg (285Кб, 600x814)
Пришлось потратить всего-то 7 часов на то, чтобы заставить фронт контроллер вывести дефолтную страницу для списка студентов.
Аноним 23/09/18 Вск 19:51:16  1269088
>>1268753 (OP)
Привет, анон. Сдавал задание на галеру одну и мне сказали что хуйня, можешь глянуть краем глаза что не так? Они не отвечают
Аноним # OP  23/09/18 Вск 19:53:16  1269090
>>1269088
Глянул
Аноним 23/09/18 Вск 20:03:01  1269096
>>1269090
>>1269090
https://yadi.sk/d/K6zm89H5RhNL3Q
Аноним 23/09/18 Вск 20:09:12  1269109
>>1269096
>2002+16
>процедурное программирование
Аноним 23/09/18 Вск 20:09:42  1269110
>>1269109
А как надо?
Аноним # OP  23/09/18 Вск 20:43:52  1269135
>>1269096
Ебанутый
Аноним 23/09/18 Вск 20:49:13  1269138
>>1269135
Бле, скажи че исправить надо?
Аноним # OP  23/09/18 Вск 20:54:00  1269140
>>1269138
Для начала залей с вой код на гитхаб или идеон
Аноним 23/09/18 Вск 21:43:37  1269162
>>1268762
скобки не нужны ровно до тех пор пока не понадобится вплотную написать текст к значению переменной и подобное

printf следует использовать для _форматированного_ вывода только когда нужен _форматированный_ вывод, как бы нелогично не звучало
Аноним 23/09/18 Вск 23:08:39  1269212
>>1269162
Твои слова расходятся с написанным в шапке.

Чем форматированная строка хуже echo? Как по мне, проще самому управлять выводом. Особенно, когда используешь строгую типизацию. Приучает к дисциплине и ещё больше походит на божественный Си.
Аноним 23/09/18 Вск 23:18:57  1269221
>>1269212
>строгую типизацию
Сынок, потише в этом треде с умными словами, особенно когда не знаешь значений
У твоей "божественной" Си слабая типизация как и у ПХП
Аноним 23/09/18 Вск 23:29:49  1269235
>>1269221
В смысле?

int i = 2; это разве не строгая типизация?! Или когда в аргументах функции пишешь что-то навроде float d = 5.
Аноним 23/09/18 Вск 23:43:01  1269242
>>1269212
Она не хуже - она другая. Безопасность типов она между тем не обеспечивает.
Подумой, как говорится.
Аноним 23/09/18 Вск 23:50:27  1269245
YODA SPEAK
https://pastebin.com/9EUE9heZ
Аноним 24/09/18 Пнд 00:01:56  1269250
>>1269242
declare(strict_type=1)
string $username = “Pinnacle”;
printf(“Hello %s!”, $username);

Разве это не максимально безопасный код? Типа в ручную управляешь типом данных, чуть что интерпритатор сразу дропает выполнение кода с ошибкой.
Аноним 24/09/18 Пнд 00:06:05  1269252
А есть в среде PHP признанный классик, как Лутц в Python?
Аноним 24/09/18 Пнд 01:48:50  1269282
>>1269252
Да, Reference Manual скомпиленный в CHM с комментариями.
Аноним 24/09/18 Пнд 05:40:16  1269315
>>1269235
>int i = 2; это разве не строгая типизация?
Нет. Это статическая.
Просвещайся.
https://habr.com/post/161205/
Аноним 24/09/18 Пнд 11:56:57  1269393
Надеюсь оп скоро выздоровеет.
Аноним 24/09/18 Пнд 13:49:49  1269433
Давно я таких анальных ошибок не видел: не могу создать таблицу с колонкой group. Подставляю вместо group абсолютно любое слово - создается.
Аноним 24/09/18 Пнд 13:50:22  1269434
>>1269433
Речь идет об mysql, если что.
Аноним 24/09/18 Пнд 13:58:38  1269438
>>1269433
`group`
Аноним 24/09/18 Пнд 13:58:58  1269439
>>1269433
Да, так бесит эта MySQL, был баг, что одним запросом формы, создавалось 2 записи в таблице, 10 раз перепроверил метод который создаёт запись в таблице, ничего не нашел.
Потом психанул написал запрос на этой же странице, и все стало нормально создавать. Или когда уже уставший пишешь запрос и где-то проебал запятую в SQL запросе, то это пиздец, потом в куче текста эту запятую хуй найдёшь.
Аноним 24/09/18 Пнд 14:33:44  1269453
>>1269438
Да, в этом проблема была. Начинал ставить одинарные кавычки, оказалось, что надо `.
Аноним 24/09/18 Пнд 15:34:08  1269491
Ну что аноны, жив еще php, стоит вкатываться?
Аноним 24/09/18 Пнд 15:50:31  1269500
Аноны у меня встал вопрос.
Мне надо вывести определённое количество новостей на странице, я вывожу их таким способом
while($row = $result->fetch_array(MYSQLI_ASSOC)
....код
}
Но как ограничить вывод допустим 3 штуками на страницу?
Аноним 24/09/18 Пнд 16:11:06  1269516
>>1269235
Строгая это:
int a = 1;
float b = 2;
float c = b + (float)a;
Аноним 24/09/18 Пнд 16:21:39  1269522
https://ideone.com/97hAvs
В чем дело, почему программа возвращает ложное значение?
10 же больше чем 6.
Аноним 24/09/18 Пнд 16:33:45  1269530
>>1269522
>https://ideone.com/97hAvs
>echo "У анона выпало ($anonDice1) и ($anonDice1)\nУ компьютера ($compDice1) и ($compDice2)\n";
Аноним 24/09/18 Пнд 16:35:01  1269532
1492378203437.gif (1755Кб, 500x281)
>>1269500
Ограничивай количество запрашиваемых элементов из БД.
Аноним 24/09/18 Пнд 16:36:37  1269533
>>1269530
Блин так и знал что в галза долблюсь. Я даже не заметил что всегда даблы выпадают.
Аноним 24/09/18 Пнд 17:08:35  1269548
>>1269532
Блин, точно. Забыл за LIMIT спасибо.
Аноним 24/09/18 Пнд 17:26:44  1269565
13.png (17Кб, 783x539)
Я не осознаю своих действий. Ебаная депрессия не дает мне нормально соображать
Аноним 24/09/18 Пнд 17:36:38  1269576
Безымянный.jpg (69Кб, 643x542)
>>1269565
Ничего страшного, годик попревозмогаешь и вкатишься в Питере за 7к в месяц и обеды соленым немытым хуем лошка, вкатившегося годом ранее тебя и носящим лычку миддла.

Через пару лет мб дослужишься до компенсации проезда на маршрутке. А там глядишь и в дойче банк позовут. И все у тебя будет хорошо. Нет, конечно, ты умрешь бомжом в Гатчине на кухне съемной однокомнатной халабуды от передоза героином
Аноним 24/09/18 Пнд 17:40:40  1269581
>>1269576
Какой ты токсичный, анон. Плохо быть тобою, плохо.
Аноним 24/09/18 Пнд 17:41:33  1269584
>>1269576
Тащемта я и так в дойче банке работаю. Мне php для себя нужно.
Аноним 24/09/18 Пнд 17:56:09  1269596
69331974p0.jpg (508Кб, 860x1200)
>Uncaught TypeError: Return value of StudentMapper::searchEmail() must be an instance of boolean, boolean returned
Аноним 24/09/18 Пнд 17:59:40  1269601
>>1269584
Почему тут все обмазываются дойче банком? Зарплата на пикриле нищенская по немецким меркам.
Аноним 24/09/18 Пнд 18:02:35  1269606
>>1269601
В Германии столько дворники получают.
Аноним 24/09/18 Пнд 18:03:12  1269608
>>1269601
Потому что кое кто живет слухами. Работники дойч банков экономят каждую копейку. У меня каждый месяц получается откладывать всего 100-200 евро. Отдел програмистов в банке не намного лучше живет, зарплата всего 300- 400 евро больше.
Аноним 24/09/18 Пнд 18:05:43  1269612
>>1269596
мust be an instance of boolean
мust
be
boolean
Аноним 24/09/18 Пнд 18:33:44  1269629
>>1269596

В PHP5 нельзя в тайп-хинтах использовать примитивные типы вроде int, он их понимает как имена классов. Советую обновиться до PHP7.
Аноним 24/09/18 Пнд 18:35:26  1269635
>>1269584
Пиздец
Аноним 24/09/18 Пнд 18:37:43  1269639
1535774337789.jpg (492Кб, 966x1300)
>>1269612
>>1269629
Вообще-то дело в том, что надо указывать bool, а не boolean.
Аноним 24/09/18 Пнд 18:39:32  1269640
>>1269516
Выше говорят, что это статическая типизация. Правда я так особо и не вкурил в чём радикальное отличие статической/слабой типизации от сильной/строгой. Что-то пишут овердохуя про ООП, но я ниасилил. Может в ООП это и есть слабая типизация, а на уровне объявления переменных не является таковой.
Аноним 24/09/18 Пнд 18:54:08  1269647
Какой же нереальный пиздец этот фулл-текст серч в mysql.
Аноним 24/09/18 Пнд 20:43:32  1269703
>>1268753 (OP)
>клуб востребованных и незаменимых людей
А вакансий жуниоров нихуя.
Аноним 24/09/18 Пнд 20:52:46  1269706
>>1269703
*В твоём Усть-Залупинске
Аноним 24/09/18 Пнд 20:56:19  1269709
>>1269706
В любом кроме двух ДС.
Аноним 24/09/18 Пнд 21:00:14  1269712
error.png (6Кб, 1173x86)
Как отправлять сообщения в телегу? Не пойму в чем ошибка.
Допустим я хочу чтобы бот оправил сообщение в конфу.
$send = fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}
&parse_mode=html&text={$txt}","r");
Выдает ошибку. Хелпаните ньюфагу.
Аноним 24/09/18 Пнд 22:22:19  1269730
Где ОП?

Аноним 24/09/18 Пнд 22:28:05  1269731
В одном из последних постов опа он писал, что времени у него мало, так что занят скорее всего. Ну или от каждодневной платины выпилился.
Аноним 24/09/18 Пнд 22:35:44  1269735
Как же заёбывает постоянно перед каждым вызовом переменной ставить сраный $, почему нельзя было сделать как в C раз объявил int a = 1 int b = 1 a + b и всё , обращайся к ней без ебучих лишний символов.
Аноним 24/09/18 Пнд 22:41:02  1269736
15039281774410.jpg (270Кб, 1400x1128)
Похепаны, кто понимает в MySQL, помогите оптимизировать запрос в базотреде позязя
>>1269732
Аноним 24/09/18 Пнд 22:52:50  1269741
x80db7aea.png (157Кб, 1861x2008)
ОП (няша которая проверяет задачки), за что ты оставил нас?
Аноним 25/09/18 Втр 00:55:37  1269777
Опушка, а таки накалякал TDG, посмотри пожалуйста, как будет время https://github.com/wheelafterwheel/TDG. Доумо аригато.
Аноним 25/09/18 Втр 00:57:05  1269778
Во имя трипла и прицепившейся сажи!
Аноним 25/09/18 Втр 00:59:39  1269780
>>1269140
Но блин там же много файлов, и не хочется весь этот позор на гит выкладывать
Аноним 25/09/18 Втр 01:04:00  1269785
>>1269777
По какому гайду учишься?
Аноним 25/09/18 Втр 01:17:02  1269789
>>1269785
По гуглу и официальным документациям. Что интересно - в то и ныряю. К сожалению, за ручку как ОП никто не водит.
Аноним 25/09/18 Втр 01:25:46  1269792
>>1269789
Давно занимаешься?
Аноним 25/09/18 Втр 01:32:09  1269797
>>1269792
Урывками оооочень давно, иногда забивается на по полгода. Это интересное хобби. Жаль разделить не с кем.
Аноним 25/09/18 Втр 01:36:16  1269799
>>1269797
>Жаль разделить не с кем
Можно попробовать
Аноним 25/09/18 Втр 01:41:42  1269800
>>1269799
Каким образом?
Аноним 25/09/18 Втр 02:04:21  1269801
>>1269799
фвй
Аноним 25/09/18 Втр 02:17:19  1269803
В старом треде проверил посты с 20 сент. по сегодня: >>1269790 - зайдите и посмотрите, наверняка ваша задачка проверена.

Кстати, любопытная ссылка: правила выбора формы слова в зависимости от числа (1 человек, 2 человека, 5 человек) в разных языках: http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html

Анон с TDG, интересная штука, попоробую посмотреть позже.
Аноним 25/09/18 Втр 03:34:30  1269806
ЧИСЛА ПРОПИСЬЮ
https://pastebin.com/bZ8iHwsK

Горжусь тем, что впендюрил рекурсию (никогда не понимал, что это за херь вообще, а после того, как нафармил 4кю на кодеварсах более-менее вкурил, и поди ж ты, уже в задачках использую как щеголь!)

Не горжусь уебищными тернарниками для решения вопросов пола. Надо было на стадии, когда с числами работал внутри рексурсии, как автор советовал, решать, т.к. потом после обработки массива с числительными у меня уже не числа, а строки, пришлось матчить регекспом.
Аноним 25/09/18 Втр 03:43:47  1269808
>>1269803

>Плюс, ты делаешь ошибку, $i[0] возвращает первый байт строки, а не первый символ, и многие символы в utf-8 занимают больше одного байта, так что ты можешь получить огрызок вместо символа. Лучше использовать mb_substr().

Да, я пропалил этот момент на примере с кавычкой, почему и сделал каличный подгон ^"?\w вместо просто ^\w, более тщательно можно было бы ^(\W+)?\w чтобы не только кавычки учесть.

А как через сабстр? Все равно же нужно знать порядковый номер, а он у первой буквы может быть рандомным, если там десяток точек или кавычек предшествует?
Аноним 25/09/18 Втр 03:48:17  1269809
>>1269803
>Ну или сделать регулярку, ищущую слова из букв разных алфавитов.

Ты имеешь в виду ограничиться флагом /u или делать полноценные [aá] и т.д.?
Аноним 25/09/18 Втр 03:51:19  1269810
>>1269803
https://ideone.com/Grtrs6
В который раз переделал задачу с текстовыми/числовыми вопросами. Проверьте, плз.

У меня возникли глупенькие вопросы.

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

2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа? Заменить тайп-хинт на проверку внутри функции, которая будет выбрасывать исключение?

3. Решаю сейчас ООП-будильник, потом нужно будет решать Вектор или эти задачки взаимозаменяемые?
Аноним 25/09/18 Втр 08:56:19  1269834
1462628935735.png (781Кб, 857x746)
Как же не хочется жаваскрипт учить.
Аноним 25/09/18 Втр 09:11:11  1269837
>>1269834
Да уш, тяжело смотреть на него после php. Но он достоин любви.
Аноним 25/09/18 Втр 09:37:37  1269849
А почему пэха сдохла? Норм же язык был.
Аноним 25/09/18 Втр 10:29:35  1269859
>>1269849
>104 тред на дваче
>пэха сдохла
Молодой человек, этот тред не для вас написан

Аноним 25/09/18 Втр 10:30:17  1269861
>>1269793
>>1269803
>Идея хранить содержимое теста в виде JSON мне не очень нравится, так как не будут работать внешние ключи (например, на выбранный вариант ответа) и не контролируется структура содержимого - а это значит, там быстро начнут накапливаться ошибки
Сами вопросы хранить в отдельной таблице( один(Тест) ко многому) и варианты ответа то же в отдельной таблице(один(Вопрос) ко многому)
Так что ли?
Аноним 25/09/18 Втр 10:35:02  1269863
>>1269810
>1. Тайп-хинты на вход и выход, нужно стараться использовать везде где есть функции?
Да.
>2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа? Заменить тайп-хинт на проверку внутри функции, которая будет выбрасывать исключение?
>проверку внутри функции
Довен, тайпхинты как раз существуют, чтобы эти проверки РУКАМИ не делать?
Сделаешь , ты условие if(!is_bool){ throw new \RuntimeException("Не верный тип");, и чем это будет отличаться от ошибок которые выдает тебе интрепретатор?
Если типы не совпадают, то их нужно как-то приводить к нужному типу перед передачей в функцию.
Еще тайпхинты дают ахуенную подсказку при работе с IDE.


Аноним 25/09/18 Втр 10:38:34  1269864
>>1269861
Можешь и в одной, если количество вариантов ответов везде одинаково. Id вопроса, вопрос, правильный ответ, неправильный ответ №1, неправильный ответ №2, неправильный ответ №3. А при выводе ответы перемешивать.
Аноним 25/09/18 Втр 10:58:33  1269872
Безымянный.jpg (64Кб, 1179x600)
>>1269859
врёти
Аноним 25/09/18 Втр 11:07:25  1269878
тыдебил.jpg (70Кб, 1159x623)
тыдебил2.jpg (66Кб, 1213x625)
>>1269872
Как блять поисковые связаны с тем что язык жив или нет?
Аноним 25/09/18 Втр 11:34:07  1269893
>>1269834
У него блядский вырвиглазный синтаксис, как на нём вообще можно писать скрипты, код невозможно читать.
Аноним 25/09/18 Втр 12:11:46  1269912
1498547394680.jpg (91Кб, 319x436)
Как же я ненавижу ебаться с CSS. Надо было следовать советам Опа и делать студентов с бутстрапом, но слишком уж хотелось все с нуля писатькроме автолодера.
Аноним 25/09/18 Втр 12:18:12  1269916
>>1269912
Ты целыми днями решаешь эту задачу, откуда у тебя столько свободного времени?
Аноним 25/09/18 Втр 12:20:30  1269917
>>1269834
Ага, всякие очевидные вещи перечитывать и только потому что синтаксис отличается
Аноним 25/09/18 Втр 12:29:36  1269922
>>1269916
Безработица.
Аноним 25/09/18 Втр 12:39:46  1269926
уныние.jpg (74Кб, 1895x1048)
Мне надо сайты для бюро ритуальнных услуг делать.
Аноним 25/09/18 Втр 13:04:50  1269940
Котаны, помогите разобраться в ошибке применительно к этому сниппету:
https://ideone.com/NhFrF5

Ошибка:
>PHP Fatal error: Constant expression contains invalid operations in /home/Gc2l35/prog.php on line 4
Аноним 25/09/18 Втр 13:10:51  1269942
>>1269940
Значение по умолчанию должно быть константой. Вызовы функций не допускаются.
Аноним 25/09/18 Втр 13:20:43  1269950
>>1269799
>>1269797
Пробовал, жалко не получалось. Можем втроека
Аноним 25/09/18 Втр 13:47:13  1269957
>>1269950
Ну мне трудно представить, как это все выглядит.
Аноним 25/09/18 Втр 13:56:06  1269961
>>1269942
Нихуя себе
Аноним 25/09/18 Втр 14:08:11  1269962
>>1269712
Из-за ркн мой бот не хочет работать, как сделать так, чтобы бот отправлял сообщения через прокси?
Аноним 25/09/18 Втр 14:16:26  1269968
>>1269926
Просто добавь https://purecss.io/
Аноним 25/09/18 Втр 15:09:19  1269987
14196229031860.jpg (28Кб, 604x464)
Есть у кого нормальный халявный PhpStorm?
Заебался уже копаться в этом говне и активаторах, ни один из которых не работает.
Аноним 25/09/18 Втр 15:38:40  1269999
>>1269987
Зачем там активатор? Есть куча левых license server. Да и просто код можно найти и добавить их сервер в хостс чтоб он не проверялся и шторм считал что он лицензионный.
Аноним 25/09/18 Втр 16:09:08  1270026
>>1269999
Все эти сервера нихуя не работают.
Шторм палит, что они левые
Аноним 25/09/18 Втр 16:14:08  1270029
70805374p0maste[...].jpg (380Кб, 850x1200)
>>1269968
Вот следующие задание буду с чужими СSS делать, а студентов закончу со своими.
Аноним 25/09/18 Втр 16:46:17  1270046
уныние.jpg (122Кб, 1891x1044)
Постраничную навигацию по таблице было интересно делать. А вот сортировку без жаваскрипа делать не охота.
Аноним 25/09/18 Втр 16:47:37  1270049
>>1269999
50 бачей за три года же всего
Аноним 25/09/18 Втр 16:53:53  1270061
>>1270049
Не за 3 года а за 3-ий год. За 3 90 + 70 + 50 = 210
Аноним 25/09/18 Втр 17:03:21  1270069
>>1270061
тогда не нужно, пусть эти жиды сами им пользуются
Аноним 25/09/18 Втр 17:06:47  1270070
>>1270049
90 за 1 год
Аноним 25/09/18 Втр 17:27:36  1270081
>>1270046

Сортировка легко делается без JS: делаем заголовки колонок ссылками вида ...&sort=-name
Аноним 25/09/18 Втр 17:29:52  1270085
567.png (7Кб, 789x166)
Ребят, а есть команда в PHP, например что бы в цикле for, в случае отрицательного баланса на счету, пропускалась часть тела ( не выполнялась), а выполнялась другая часть цикла, состоящая из функции if ?
Аноним 25/09/18 Втр 17:34:09  1270091
1537886046910.jpg (223Кб, 960x960)
>>1270085
if
Аноним 25/09/18 Втр 17:36:35  1270092
>>1270081
Да это понятно, проблемы начинаются, когда при повторных нажатиях надо менять тип сортировки.
Аноним 25/09/18 Втр 17:37:57  1270093
>>1270091
Чет с if магия непонятная начинает происходить в проге, а можно цикл в цикле?
Аноним 25/09/18 Втр 17:39:44  1270095
>>1270085
Внутри условия поставь условие на отрицательный баланс.
Аноним 25/09/18 Втр 17:40:07  1270096
>>1270093
Можно.
Аноним 25/09/18 Втр 17:42:53  1270098
>>1269926
Довольно неплохо!
Аноним 25/09/18 Втр 17:52:52  1270107
цукцук.png (58Кб, 1557x881)
>>1270095
Внутри какого условия, условия цикла, или имелось в виду что то другое? Если условие if, то оно уже есть.
Аноним 25/09/18 Втр 18:04:05  1270110
>>1270085
Тебе нужно другое условие. Если долг + проценты меньше ежемесячного платежа, то выплатить оставшееся, вывести свое ехо и кинуть break;
Аноним 25/09/18 Втр 18:08:55  1270114
>>1270085
goto называется.
Аноним 25/09/18 Втр 18:22:17  1270126
>>1270107
Возможно тебе поможет continue
А вообще ну ты пиздец дупло, конечно
Аноним 25/09/18 Втр 18:31:37  1270132
>>1270110
Ща отдохну и попробую, а то уже 4 часа пытаюсь и голова заболела.
Аноним 25/09/18 Втр 18:32:04  1270133
>>1270092

Нужно выводить ссылку с учетом текущего типа сортировки. То есть если выбрана сортировка -name, то надо выводить в заголовке +name вместо -name.
Аноним 25/09/18 Втр 18:32:59  1270134
>>1270085

Для этого есть if

if (условие) {
одни действия;
} else {
другие действия;
}
Аноним 25/09/18 Втр 18:36:18  1270137
>>1269987

Не проще поставить и настроить netbeans for PHP или Eclipse for PHP? Лицензионно и бесплатно.
Аноним 25/09/18 Втр 18:38:27  1270141
>>1270137
Я итак на нетбинсе, но шторм вне конкуренции, он слишком охуененн.
Аноним 25/09/18 Втр 18:42:43  1270146
1468592852006.jpg (101Кб, 1280x720)
>>1270133
Слишком уж большой костыль выходит для такой мелочи.
Аноним 25/09/18 Втр 19:45:37  1270178
>>1269987
DON'T USE A LICENSE SERVER
add 0.0.0.0 account.jetbrains.com to your host file
and get a key from http://idea.lanyus.com/getkey
DISSCONNECT FROM INTERNET
Run jetbrain product, Paste the key into license section
then activate product
Connect to internet Again
Welcome to 2018.2
Аноним 25/09/18 Втр 21:03:15  1270225
>>1270146
>test
Аноним 25/09/18 Втр 23:46:18  1270324
Я У МАМЫ КАЛЬКУЛЯТОР
https://pastebin.com/EsM3d1e8
Аноним 26/09/18 Срд 02:01:08  1270371
>>1270046
>gender
Non-binary
Rather not to say
Аноним 26/09/18 Срд 04:35:22  1270391
>>1270324

> https://pastebin.com/EsM3d1e8

> return $op==='+'?$result+$number:($op==='-'?$result-$number:$result*$number);

Здесь лучше использовать блок if/elseif, так как длинное выражение трудно читать.

А так, хорошо, что ты вынес вычисление в функцию. Сделано верно.

>>1270146

Тыж программист, подумай, как это аккуратно сделать.

>>1269962

Если ты используешь fopen (довольно странный выбор), то почитай про контексты потоков: http://php.net/manual/ru/stream.contexts.php

>>1269940

Можно указать значение по умолч. null и в функции сделать проверку:

function t($x = null)
{
if ($x === null) {
$x = ....;
}

...
}
Аноним 26/09/18 Срд 04:35:54  1270393
>>1269926

Хороший повод получше освоить CSS. Формы можно делать так:

<div class="f-row">
<div class="f-label">...</div>
<div class="f-widget">...</div>
</div>

Выровнять f-label/f-widget горизонтально можно с помощью display: inline-block, float, display: table, flexbox, и наверно как-то еще. Не забудь предусмотреть область для показа ошибок.

>>1269861

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

>>1269810

> https://ideone.com/Grtrs6

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

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

> 2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа?

Вообще, при неправильном типе поведение зависит от версии PHP. Дело в том, что в PHP, кроме исключений, есть еще "ошибки": notice, warning, fatal error, которые не являются исключениями и не ловятся try/catch (но ловятся при желании специальным обработчиком ошибок). Они по умолчанию пишутся в лог, могут выводиться на экран, и могут завершать или не завершать скрипт (в зависимости от уровня ошибки). Информацию можно поискать тут: http://php.net/manual/ru/book.errorfunc.php

Немного про них написано тут: http://anton.shevchuk.name/php/php-for-beginners-error-handling/

Некоторые фреймворки просто преобразовывают их в исключения, как описано тут: http://php.net/manual/ru/class.errorexception.php

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

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

> 3. Решаю сейчас ООП-будильник, потом нужно будет решать Вектор или эти задачки взаимозаменяемые?

Решай в любом порядке, но лучше решить обе. Вектор посложнее.
Аноним 26/09/18 Срд 04:36:21  1270394
>>1269809

Я имею в виду, искать слова, где есть буквы и латинницы, и кириллицы одновременно. Флаг u нужен в любом случае, он лишь говорит о работе с кодировкой utf-8 и нужен по сути всегда.

>>1269808

Я имел в виду вместо $i[0] использовать mb_substr($i, 0, 1) - это корректный код, так как он берет первый символ, а не первый байт. $i[0] это некорректно и описанную тобой проблему (символы в начале строки) никак не решает.

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

>>1269806

> define('AMOUNT','(' . $number . ')');

Это плохая идея. Константу можно определить только один раз и при втором вызове функции произойдет ошибка. Также, в PHP7 используется слово const для определения константы. Тем более у тебя это не константа вообще - так как ее значение не постоянно, а зависит от переданного числа. Константы это неизменные значения. А в твоем случае нужна обычная переменная.

В общем:

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

> if ($opNumber/100>=0) {
В чем смысл этого условия? Оно равносильно $opNumber >= 0.

> $firstDigit=floor($opNumber/100); $opNumber-=$firstDigit100; $firstDigit=$spelling[$firstDigit100];
Не пиши несколько команд в 1 строку, тяжело читать.

> $firstDigit=$spelling[$firstDigit*100];
Не надо использовать одну переменную для 2 разных типов значений (для числа и для строки) - это лишь усиливает путаницу.

> $x=($firstDigit&&$firstDigit!='ноль'?"$firstDigit ":'') . ($secondDigit&&$secondDigit!='ноль'?"$secondDigit ":'') . ($lastDigit&&$lastDigit!='ноль'?"$lastDigit":'');

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

> function numberToText($number,$arr=[]) {
Непонятно, зачем передавать сюда $arr. И название выбрано плохое - arr ничего не значит.

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

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

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

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

> $preString=preg_replace('/два тысячи/u','две тысячи',$preString);
Это кривые костыли, затрудняющие понимание кода. Ну представь, человек начнет разбирать твой код, увидит, что он генерирует строку "два тысячи", подумает, что в нем ошибка. И только потом, может, увидит, что в конце эта ошибка костылем испрвляется. Но почему нельзя сделать, чтобы там сразу бралось правильное слово? Зачем усложнять все и запутывать читателя? Так не годится.

> $preString="" . ($arr[2]?
preg_match('/(два|три|четыре)$/u',$arr[2])?"{$arr[2]} миллиона":(preg_match('/(один)$/u',$arr[2])?"{$arr[2]} миллион":"{$arr[2]} миллионов")

Это невозможно читать. Слишком запутанно. Необходимо переписать.

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

Если ты не знаешь, как разбить код на части, могу предложить один вариант (другие варианты тоже допустимы):

- делаем функцию выбора формы слова (тысяча, тысяч) в зависимости от числа
- делаем функцию, которая преобразует число от 0 до 999 в строку
- делаем функцию, которая разбивает большое число на части и записывает его, вызывая функции выше

У каждой функции должна быть своя задача, и логичный, простой набор аргументов и возвращаемых значений.
Аноним 26/09/18 Срд 04:36:49  1270395
>>1269777

> https://github.com/wheelafterwheel/TDG/blob/master/sqlite3/transaction.ts

Здесь проблемы с читаемостью. Мне кажется, надо было не создавать объект to внутри функции, а сделать отдельным классом. Так как получилась тяжело читаемая функция-монстр.

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

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

В строке 47 глубина отступов составляет 7 - по моему, это перебор.

Возможно, стоило сделать промисифицированную обертку над db отдельным классом - так как многочисленные if ... reject только ухудшают читаемость. То есть сделать PromisifiedDb и уже с ним тут работать:

await pdb.beginTransaction();
to = new DbExecutor(pdb);
await sequence(to);
await pdb.commit();

Может быть, даже DbExecutor и не нужен будет, можно будет передавать в sequence этот PromisifiedDb.

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

Также, я не думаю, что надо было в классе делать db.open/close(). Логичнее передавать уже открытый объект db. Как я понимаю, при коммите изменения гарантированно сохраняются и без close(). Заодно мы могли бы поставить тайп-хинт в конструкторе TDG, а не принимать тип any.

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

transaction(function (to) {
setTimeout(function () {
to.execute(...);
}, 1000);

await to.execute(...)
});

Можно защититься от этого добавлением флага в to, который показывает доступность объекта, включается после выполнения BEGIN и выключается перед COMMIT.

То, что rollback реджектится не очень логично - наверно, все же логично при успехе отката резолвить его в null или true.

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

> if (
> statement.match(/^\s*SELECT/)
Это плохая идея, есть например SHOW и может еще какие-то команды. Лучше не определять их автоматически.

> async slice(limit: number = 30, offset: number = 0):
Это довольно ограниченный метод, он не поддерживает ни условия, ни порядок сортировки.

Не уверен, что нужны методы create/drop. Обычно таблицы создаются и изменяются через миграции.

> export class Staff extends TDG {
> constructor(
> name: string = 'staff'
Непонятно, зачем нужна возможность задать другое имя.

> (\`password_hash\` = ? OR \`password_hash\` IS NULL)
Это немного странно, а не приведет ли это к авторизации с пустым паролем?

> return (result["0"]["0"] !== undefined)
Надо было сделать методы, возвращающие одну строку и одну колонку.

Я вижу, что у тебя есть тест для Staff, а что насчет тестов для остального кода?

В тесте для ожидания исключения есть вроде бы конструкции expect().to.throw(...), а у тебя, если исключение не произойдет, то ошибки не будет.

Тест не очень хороший. У тебя просто один гигантский сценарий. Но тесты (по моему) должны тестировать фичи:

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

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

Это дает такие преимущества:

- отдельные тесты получаются меньше и проще, и тестируют ровно 1 фичу
- если что-то сломается, то видно будет, какие фичи сломаны

И мне кажется, сама архитектура mocha к этому подталкивает: там есть describe() для описания тестируемого объекта и it() для описания фич. Ты же используешь it() для описания шагов гигантского теста. А должно быть:

describe('Staff', function () {
it('Can insert employee', ...);
it('Can delete employee', ...);
....
});

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

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

Главная проблема - нечитаемость кода в transaction.ts.

Если хочешь поломать голову, не хочешь ли попробовать сделать ORM на основе DataMapper, вроде Доктрины в PHP? То есть сделать так, чтобы не надо было вручную писать методы вроде register(), а они бы как-то сами умели определять структуру объекта и формировать SQL код:

var repo = Repository.getFor(Employee);
var e1 = repo.findOneBy({'tableNumber': 123});
e1.name = 'New name';
repo.flush(); // сохраняет изменения в БД

Далее, реализовать паттерны Identity Map, Unit Of Work. Далее, связи между сущностями и ленивую загрузку. Задача интересная, хоть и сложная.
Аноним 26/09/18 Срд 04:37:16  1270396
>>1269640

Статическая типизация - типы переменных известны в момент написания программы (обычно это значит что они явно указаны в коде), например:

int a = 1;

Соответственно, компилятор может проверить корректность типов до выполнения кода.

Динамическая - типы не известны до выполнения программы:

$a = calc();

function calc() {
....
}

Сильная/слабая - при слабой типизации язык может преобразовывать типы (например, в выражении "2" + 2 язык может автоматичеки преобразовать строку "2" в число), при сильной это надо делать явно, иначе будет ошибка.

https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B8_%D1%81%D0%BB%D0%B0%D0%B1%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

>>1269439

Это что-то с твоим кодом. Если что, есть паттерн Post/Redirect/Get для защиты от повторной отправки формы.
Аноним 26/09/18 Срд 05:29:49  1270404
>>1270396
>(например, в выражении "2" + 2 язык может автоматичеки преобразовать строку "2" в число)
Нет, это не слабая типизация. Это неявное преобразование типов.

Смотри на Си. ты не можешь там сделать "2" + 2, так чтобы он на лету преобразовал строку "2" в число 2. При этом у Си - слабая типизация.
Аноним 26/09/18 Срд 07:53:26  1270420
>>1270404
Ну все правильно он сказал
Ты не можешь "2" + 2 в С сделать, но
void *ptr можешь кастовать хоть во что
или enum с целыми неявно смешивать
именно поэтому слабая
Аноним 26/09/18 Срд 07:55:27  1270422
>>1270391
>как это аккуратно сделать
Яваскриптом.
>>1270393
>Не забудь предусмотреть область для показа ошибок
Ошибки во всплывающем окошке выводятся.
Аноним 26/09/18 Срд 08:04:31  1270427
>>1270420
Хотя даже тут ты наврал и меня запутал
>> "2" + 2
для С норм, потому что "2" указатель на константную строку
Аноним 26/09/18 Срд 08:28:03  1270431
>>1270427
И сколько у тебя получится?

Читай внимательно
>ты не можешь там сделать "2" + 2, так чтобы он на лету преобразовал строку "2" в число 2
Аноним 26/09/18 Срд 08:29:52  1270433
>>1270420

>язык может автоматичеки преобразовать
>кастовать
Аноним 26/09/18 Срд 10:09:10  1270453
Снимок.PNG (1553Кб, 1620x947)
>>1268753 (OP)
Анон, допомоги понять одну хероту.
Есть сает http://dzzb.ru
Запилил там "окна консоли" в некоторых статьях через css. Примеры:
http://dzzb.ru/blog/MScen
http://dzzb.ru/blog/StartGen
http://dzzb.ru/blog/Punch!
И вот в FurryFox и даже в IE эти "окна" отображаются нормально - с заголовком, который берется из картинки, а хром не воспринимает этот параметр CSS ниразу. Допиливал и "webkit" ко всем параметрам и бочку делал - нихуя. Насоветуй как хром полечить.
Аноним 26/09/18 Срд 10:45:20  1270459
>>1270453
https://stackoverflow.com/questions/25479713/css-border-image-not-working-in-chrome
Аноним 26/09/18 Срд 18:08:57  1270593
>>1270395
Слава слонику, ты тут многие замечания описал, которые мне тоже не нравятся (ура!). Ремарочка, как появился transaction.ts: я замучался с дефолтной реализацией драйвера sqlite3, и решил обыграть все спорные моменты одной функцией (написал и забыл, работает же!). Однако этот франкенштейн не так гибок как хотелось бы (появились ненужные флаги и прочий мусор), ты прав, лучше переписать ее или вообще убрать. (Но повторюсь, от дефолтного апи меня аж трисет, вот оно https://github.com/mapbox/node-sqlite3/wiki/API , если подскажешь, как это превратить в promisified, буду очень благодарен). Вообще у меня идея появилась сейчас абстрагироваться от баз данных вообще ииии да, именно
>сделать так, чтобы не надо было вручную писать методы вроде register(), а они бы как-то сами умели определять структуру объекта и формировать SQL код
На вскидку это довольно сложно, но я попробую, обучение же! (Но в реальном проекте лучше не велосипедить и взять https://github.com/typeorm/typeorm)

По поводу отступов:
>отступы в 4 пробела ухудшают мне читаемость, может конечно я просто к ним не привык, но они же слишком длинные
ну ты понял, алсо https://github.com/basarat/typescript-book/blob/master/docs/styleguide/styleguide.md#spaces
Я думаю, два, четыре пробела или таб не делают программиста.

>глубина отступов составляет 7 - по моему, это перебор
ну да, чет многовато (даже для такой трешовой функции)

Главное:

>Как я понимаю, при коммите изменения гарантированно сохраняются и без close()
из документации вообще не понятно, нужно ли, и когда нужно закрывать подключение (может быть принудительное закрывание помогает избежать утечек памяти или предотвращать коррупцию файла, хз), поэтому я на всякий случай закрываю. Однозначно нужно избавляться от всех any потому что это херня а не тип.

>То, что rollback реджектится не очень логично - наверно, все же логично при успехе отката резолвить его в null или true.
ты имеешь в виду to.rollback() ? это мануальный откат, который мы сами вызовем при определенных условиях в своем коде, указывая причину, которую (та-даа!) можно отловить (потому-что даже мануальный откат это исключительная ситуация). При reject мы выходим из sequence и идем ловить ошибку, а вот при resolve(true) мы как бы уже откатились, но команды далее по коду будут как ниндзи выполняться на уже закрытую транзакцию, как будто все нормально. (Собственно, это проблема архитектуры функции)

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


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

Остальные замечания: все постараюсь исправить. Нужны комментарии на вопросы выше.
Аноним 27/09/18 Чтв 02:05:43  1270770
Безымянный.jpg (103Кб, 600x423)
>>1270394

ЧИСЛА ПРОПИСЬЮ
(реран с учетом замечаний)
https://ideone.com/Q3KtKC
0/200 day 1 Аноним 27/09/18 Чтв 03:03:10  1270776
Врываюсь в тред со второй попытки. Объявляю сам себе челендж: отучится 200 часов за 60 дней. Ща посплю и понеслась.
Аноним 27/09/18 Чтв 08:50:02  1270820
>>1270770
Ебать ты англичанин.
Аноним 27/09/18 Чтв 09:42:26  1270833
>>1270776
Надеюсь не недоязык пехопе учить будешь, сверхчеловек?
Аноним 27/09/18 Чтв 14:23:58  1270977
>>1269926
Или для записи в поликлинику
Аноним 27/09/18 Чтв 14:37:50  1270987
>>1269926
А мне нравится дизайн. Чуть чуть выровнять только. А то сейчас что не сайт - битва космических истребителей от лукасфилм.
Аноним 27/09/18 Чтв 16:33:03  1271044
ОП, посмотри, пожалуйста, 13 задача по HTML/CSS

https://github.com/deadj/deadj.github.io
deadj.github.io
Аноним 28/09/18 Птн 03:43:48  1271238
>>1271044
>>1266710

Самое главное, что бросается в глаза: не подключен шрифт. У тебя указан шрифт Lato, но если его не установлено на компьютере, то текст отобразится другим шрифтом (sans-serif). Для подключения файла шрифта есть специальное CSS-правило @font-face. Я советую внимательно его изучить. Обрати внимание, что существуют разные форматы шрифтов, и разные браузеры поддерживают разные форматы:

- https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face (в конце есть таблица)
- https://css-tricks.com/snippets/css/using-font-face/ (англ)
- https://caniuse.com/#feat=woff
- https://caniuse.com/#feat=woff2
- https://caniuse.com/#feat=ttf
- https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/webfont-optimization?hl=ru (статья на русском)

Сконвертировать шрифты можно конвертором: https://www.fontsquirrel.com/tools/webfont-generator

Обрати внимание, что пока шрифт не загрузится, браузер не показывает текст. Повлиять на это поведение можно новым свойством font-display: https://css-tricks.com/font-display-masses/

Проверить, как шрифты отображаются в разных браузерах, можно напрмер, тут: https://developer.microsoft.com/en-us/microsoft-edge/tools/screenshots/

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

Скриншоты можно сделать еще на http://browsershots.org/, но там нет ИЕ и мобильных браузеров.

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

Телефон хорошо бы сделать кликабельным, ссылкой с префиксом tel: https://css-tricks.com/the-current-state-of-telephone-links/

Также, было бы хорошо сделать версию для маленьких экранов. У тебя сделана какая-то минимальная адаптивность, но ее явно недостаточно. Сейчас при уменьшении ширины шапка остается гигантской и смотрится нелогично. Вот список размеров экранов разных устройств: http://viewportsizes.com/ - можно выбрать, например такие значения ширины для проверки:

- 320 (или 360), 640, 960

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

Просто выстроить все блоки вертикально - это очень механически, и этого недостаточно для адаптивности.

> body, html {
> box-sizing: border-box;
Непонятно, зачем тут box-sizing, если для html/body ширина или высота все равно не задана.

> .headerBack {
> width: 100%;
> display: inline-block;
Непонятно, зачем тут inline-block

> .logo {
> display: inline-block;
> float: left;
float подразуемвает display: block

В блоке с Consectetur надо настроить line-height в абзацах как на макете.

Вместо тегов b/i сейчас используют strong/em, с немного другим смыслом (они задают не внешний вид текста, а смысловое выделение).

> <div class="serveicesBlock">
> <div class="img"></div>
Можно использовать псевдоэлемент вместо дива .img

> <input type="radio" id="tabLabel2" name="radiobutton"/>
В указании слеша в конце /> в HTML5 нет необходимости. Это из XHTML.

Надо чтобы при выборе категорий (all/graphic/illustration) часть работ скрывалась, а часть оставалась. Присвоить категории можно через data-атрибуты или CSS классы.

> <div></div>
> <div></div>
Непонятно, зачем пустые дивы.

> .serveicesBlock > p {
> font-size: 14px;
Это плохая идея, вешать стили на p, так как текст может быть и в других тегах (например: ul/li, figure). Лучше просто было задать шрифт на servicesBlock.

> .footerLink > a:nth-child(2) {
> background-position: -42px -11px;
Здесь вместо номеров лучше использовать классы (link-fb, link-tw). Так как с номерами неудобно вставлять или убирать элементы: надо менять все номера. Или нельзя просто переставить 2 ссылки местами. Тут лучше явно указать тип ссылки в HTML.
Аноним 28/09/18 Птн 06:03:46  1271247
Аноны, предыдущий тред утонул, но он остается в архивах:

- https://phpclub.tech/pr/res/1232710.html
- https://2ch.hk/pr/arch/2018-09-27/res/1232710.html

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

Как я помню, вопросы с 20 сентября отвечены в старом треде, ответы вопросы с 1 сентября по сегодня - ниже:

>>1270298

Нужно установить интерпретатор PHP, это программа для командной строки: https://github.com/codedokode/pasta/blob/master/soft/php-install.md

Если тебе не нравится командная строка, то можно взять IDE или редактор (Netbeans PHP, Eclipse for PHP, PhpStorm, Sublime Text) и настроить запуск PHP из них. В каждом редакторе это делается по-своему.

>>1270158

У тебя помоему $time на 1 меньше, чем надо. То есть если бы миллион получился после 1 года (например, если начальная сумма равна 999 000), то твоя программа напишет что миллион накопился в 16 лет, а не в 17.

>>1266701

Алсо задачка на поиск емейл в тексте. https://ideone.com/bOB8LV

В именах пользователя и домене могут быть минусы: ivan-petrov@sidor-sidorov.ru

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

Но сама идея решения верная.
Аноним 28/09/18 Птн 06:04:33  1271248
>>1266631

> Мне нужно заменить все значения true, на false.
> А что если просто сериализовать массив в строку, и пройтись регулярко, ну и потом обратно собрать?
Это очень костыльно, и ты взяд ли сможешь сделать это корректно. Формат сериализации не документирован и может в любой момент поменяться. Ну например, может там в строке есть слово true, а ты его заменишь.

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

>>1265236

> Почитал урок про MVC, с моделью и вью все понятно, а вот есть подробные инструкции по написанию контроллеров?

Контроллер анализрует запрос пользователя, берет нужные данные из модели и отображает их с помощью view.

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

Описание паттерна кратко: http://design-pattern.ru/patterns/page-controller.html

В некоторых фреймворках контроллер - это функция, которая принимает на вход объект Request и возвращает объект Response.

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

Также, есть паттерн Front Controller - когда все запросы идут в главный контроллер, он делает какие-то подготовительные действия и вызывает уже отвечающий за данный запрос контроллер. Описание кратко: http://design-pattern.ru/patterns/front-controller.html

>>1265663

> Задача на автозамену скобочек в тел. номерах
> https://ideone.com/7Dd3h8

Не надо экономить строчки. Фигурные скобки ставятся так:

if (условие) {
действия;
}

Варнинги надо исправить:

> PHP Warning: array_push() expects parameter 1 to be array, string given in /home/A2VmLC/prog.php on line 19

> echo "Only these passed negative tests {$mistakes}\n";
Локальная переменная, созданная в функции, не доступна снаружи.
Аноним 28/09/18 Птн 06:05:02  1271249
>>1265163

> Задача на проверку телефонов.
> https://ideone.com/5GYxQY
То же замечание - форматируй код, так как его невозможно читать.

Идея решения правильная, но код нечитаемый.

>>1264529

> Цель: написать клон Героев 3 только лишь на пхп.

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

Конечно, PHP можно заставить работать в долгоживущем режиме, но это будет тяжело, и он не предназначен для создания десктопных игр. Я предлагаю взять другую платформу, а именно что-то из этого:

- HTML5 + JS. В браузер загружается страница, на этой странице загружается JS-программа и выполняется в браузере. Она рисует изображение для игры и реагирует на действия пользователя. В теории, будет работать и на планшетах, но медленнее.
- Electron + HTML5 + JS. То же самое, только HTML-страница, JS-код и браузер упакованы в приложение. Пользователь запускает приложение, внутри него запускается встроенный браузер, отображает страницу, но для пользователя это выглядит как "настоящее" приложение.
- Pygame. Приложение-игра на Питоне, в помощь тебе дается библиотека для работы с графикой. Вроде как поддерживает десктопные ОС и Андроид.

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

Если ты не знаешь ни JS, ни Питона, то у меня есть 2 новости. Хорошая: в обоих этих языках есть многое из того, что есть в PHP - массивы, переменные, циклы, классы. Со знанием PHP учить их будет проще. Плохая: у них все же другой синтаксис и есть свои особенности.

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

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

>>1264400

> $arr1=explode('',$text);
Это неразбивает текст на буквы, а разбивает на байты. То есть, в случае кириллицы, на половинки букв.

Замену пробелов проще сделать через str_replace или strtr и без цикла.

> if ($arr1[$i]!=$arr2[$j]){
Та же проблема, ты берешь не буквы, а байты. Прочитай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

> echo "" . $result;
Тут "" не нужно.

В общем, сейчас программа не работает нормально, так как сравнвает байты, а не буквы. Надо это исправить.
Аноним 28/09/18 Птн 06:05:33  1271250
>>1264400

> $arr1=explode('',$text);
Это неразбивает текст на буквы, а разбивает на байты. То есть, в случае кириллицы, на половинки букв.

Замену пробелов проще сделать через str_replace или strtr и без цикла.

> if ($arr1[$i]!=$arr2[$j]){
Та же проблема, ты берешь не буквы, а байты. Прочитай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

> echo "" . $result;
Тут "" не нужно.

В общем, сейчас программа не работает нормально, так как сравнвает байты, а не буквы. Надо это исправить.

>>1264380

> Задачка про банкомат - https://ideone.com/SfcMLz

> $bills = array_reverse($bills);
Сортровать по убыванию лучше функцией вроде krsort, смотри мануал http://php.net/manual/ru/array.sorting.php

Функция array_reverse перепроставляет значения ключей (меняет их на 0, 1, 2 ...) и номиналы теряются. Это описано в мануале.

> if($amount >= $nominal and $countBanknote < $value) {
Ты берешь банкноты только если их достаточно. Но можно брать и если их не хватает. Например, сумма 3100, в наличии 5 банкнот по 500 и 7 банкнот по 100. Берем 5x500 + 6x100. Твоя же программа в этом случае не сможет набрать нужную сумму.

Надо исправить эту проблему. У тебя программа вообще пока нерабочая.
Аноним 28/09/18 Птн 06:06:12  1271251
>>1263923

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

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

>>1263752

> Чувствую себя застрявшим. Куда двигаться дальше? Учить паттерны для более сложных алгоритмов или учить фреймворки, дб, хттп, делать пет прожекты?
делай проекты, если достаточно знаний. Начать можно с задачи про студентов в ОП посте.

>>1263794

> с функцией array_rand() jdoodle.com/a/ERc
Ок, верно.

> w5.6 с функцией array_rand() и православной конкатенацией jdoodle.com/a/ERf

> if (4 >= 0) {
> $name = "$conc";
Это условие всегда выполняется и строчка внутри тоже всегда выполняется. Ее надо поставить после цикла, чтобы она выполнялась только один раз. Также, кавычки тут не нужны.

> PHP Notice: Undefined variable: conc in /home/jdoodle.php on line 21
Это предупреждение надо исправить.

>>1263444

SPA это усложнение и нужно для специфичных фич: работа в оффлайне, сложные интерфейсы, высокая интерактивность. Если у тебя этого нет, то не надо усложнять приложение без надобности. Плюс оно тормозить наверно сильнее будет в виде SPA.
Аноним 28/09/18 Птн 06:06:40  1271252
>>1263349

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

Почитай для начала урок про нормализацию: https://github.com/codedokode/pasta/blob/master/db/normalization.md

> Причем если ЭТО нормализовать, мне кажется производительность упадет в нулину.
Сделай тесты, а не гадай.

>>1262263

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

>>1257990

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

Все зависит от используемого сервиса. Если он будет распознавать команды и выдавать результат - то не так и сложно. Но по факту распознавани голоса не такая простая вещь, особенно если надо распознавать разных людей, в зашумленной обстановке итд. Я бы советовал для начала найти такой сервис распознавания и протестировать его, а потом делать выводы.
Аноним 28/09/18 Птн 06:07:02  1271253
>>1257803

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

Вполне нормальный код. Транзакциии еще можно делать через коллбек:

$db->transactional(function ($db) {
$db->execute(...);
});

Там исключение ловит функция transactional.

>>1257907

> Задачка с айпадом: https://ideone.com/mLzoxa
Решение удалено.

>>1257813

> Проверьте, пожалуйста, задачу с палиндромами.
> http://sandbox.onlinephpfunctions.com/code/75e94cacefd198240501dfac4cc93cdca0ac29a3

> if ($a == $b) {
> $result;
Команда $result; ничего не делает и не нужна.

Также, при первом же несовпадении можно выходить из цикла по break.

А в остальном верно.

>>1256983

> Аноны, почему ошибка в 16 строчке? 30 раз смотрел, вроде нету ошибок. Решение https://ideone.com/8sXAP4

Ошибка в 29 строчке, там иногда генерируется индекс 16, которого нет в массиве.
Аноним 28/09/18 Птн 06:07:25  1271254
>>1256748

> Аноны, чекните задание про рост школьников, все правильно?
> https://ideone.com/ZdgItc

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

>>1256224

> ОПушка, проверь функцию для этой задачки: https://ideone.com/bU5gHV

Ок, верно.

>>1256073

> В задачке про массивы с 10ю ключами порядок ключей важен или только их наличие?
Порядок не важен.
Аноним 28/09/18 Птн 06:07:54  1271255
Уф, проверил все с конца до 760 поста. Напомню себе проверить >>1247821

> Оп, глянь студентов: https://github.com/Awesome-Kirill/fukingStudent

Больше месяца прошло, нехорошо.
Аноним 28/09/18 Птн 07:47:34  1271269
ОП, я тоже думал в качестве пет-проекта написать игру небольшую, что-то вроде простого варгейма. Получается, php не пригодится для этого, учить параллельно и js?
Аноним 28/09/18 Птн 08:09:47  1271276
Всем привет!
Недавно начал читать гайд для новичков из ОП. Весьма интересно. Недавно наткнулся на такую фишку как bootstrap, я так понял это библиотека готовых решений. Насколько оправдано пользование этим ресурсом? Или лучше всё писать ручками?
Аноним 28/09/18 Птн 09:22:54  1271302
>>1271276
> Насколько оправдано пользование этим ресурсом?
Ни на сколько. Хреньворк - априори хуйня. Тем более этот страпон.
Аноним 28/09/18 Птн 09:31:38  1271307
>>1268753 (OP)
> полезная задача сделать список студентов
Пошёл нахуй со своими студентами. Лучше делать список гей-шлюх, и то приличнее будет.
Аноним 28/09/18 Птн 09:32:23  1271308
https://ideone.com/B177aS
Сделал игру с кубиками, не совсем понял за кусок:
exit()
его ставить в конце всех условий или?
Аноним 28/09/18 Птн 09:38:50  1271313
>>1271308
Нет, долбоёб, это точка остановки программы. Плюс лишняя точка с запятой в последнем условии.
Аноним 28/09/18 Птн 09:54:08  1271317
>>1271313
Это не тред для самоутверждения людей с комплексами. Это тред для помощи новичкам.
Аноним 28/09/18 Птн 09:58:46  1271319
>>1271313
Ты такой токсичный.
То, что это останавливает программу, я понял. Но где её ставить? По идее если условие выполнено, это повод остановить программу т.е. ставить после каждого условия?
Аноним 28/09/18 Птн 10:34:11  1271327
Объясните простым языком разницу между абстрактным классом и интерфейсом, пожалуйста.
Аноним 28/09/18 Птн 10:41:39  1271333
>>1271327
Я так понял, в интерфейсе все методы это заготовки без реализации, в абстрактном можно прописать не абстрактный метод с реализацией сразу. Вот на практике я Х
хер знает, когда что лучше брать.
Аноним 28/09/18 Птн 10:48:57  1271342
>>1271327
Абстрактный класс имеет как минимум один абстрактный (не определенный) метод. Интерфейс - это тот же абстрактный класс, с той разницей, что в нём не может быть свойств и не определены тела методов. Абстрактный класс наследуется, а интерфейс реализуется: наследовать можно только один класс, а реализовать сколько угодно.

>>1271319
А тебе не приходило в голову, что программа на пыхапе обычно сама останавливается? Рот твой токсичный.
Аноним 28/09/18 Птн 10:49:17  1271343
>>1271319

Обычно ставить не надо нигде. Там в задаче оно ставится, чтобы , если условие в первом блоке if сработало, код ниже бы не выполнялся. Можно (так даже лучше) сделать вообще без exit, если перегруппировать блоки if.
Аноним 28/09/18 Птн 10:50:35  1271346
>>1271327

Давай начнем с более общего вопроса. В чем разница между классом и интерфейсом?

Если что, урок про интерфейсы в помощь: https://github.com/codedokode/pasta/blob/master/php/interfaces.md
Аноним 28/09/18 Птн 11:43:22  1271371
>>1271333
>>1271342
>>1271346
Спасибо, добра вам!
Аноним 28/09/18 Птн 11:45:31  1271373
Сап камрады, есть у кого образ на докер, вагрант(без разницы) со стеком php4?
Аноним 28/09/18 Птн 12:01:44  1271383
Screenshot2018-[...].png (133Кб, 720x1440)
Неожиданно.
Аноним 28/09/18 Птн 12:18:39  1271390
Задача про массивы с рандомным именем
https://ideone.com/sIORAY
Не совсем понимаю, что не так. Вроде создал нулевую таблицу, потом она заполняется где каждый элемент берет номер $i, и значение рандомного слога а на выходе - болты.
Аноним 28/09/18 Птн 12:26:14  1271395
>>1271390
$pieces[$i] без кавычек
Аноним 28/09/18 Птн 12:29:02  1271398
>>1271395
Благодарю. Всё сошлось
Аноним 28/09/18 Птн 12:33:05  1271405
>>1271398
А теперь объясни, почему.
Аноним 28/09/18 Птн 12:41:04  1271409
>>1271405
А это в гайде не могу найти ¯\_(ツ)_/¯
Аноним 28/09/18 Птн 12:50:38  1271414
За двойные кавычки в php надо в жопу ебать без смазки.
Аноним 28/09/18 Птн 13:29:12  1271433
>>1271414
Ты латентный пидор.
Аноним 28/09/18 Птн 13:40:20  1271440
>>1271409
Нет ты объясняй давай, что это ещё за не могу.
Как внутри массива располагаются элементы? Чем ассоциативный массив от простого отличается?
Аноним 28/09/18 Птн 13:46:48  1271443
>>1271440
Каждому имени в массиве относится ключ, ну как в задачке с ростом было. Имя - рост. Где ключ это рост.
В простых массивах идет поиск по индексу, в ассоциативных по ассоциациям, вроде так
Аноним 28/09/18 Птн 13:53:50  1271446
>>1271443
Ещё раз.
Аноним 28/09/18 Птн 13:59:01  1271447
>>1271446
Я даже не знаю что и ответить.
Аноним 28/09/18 Птн 14:19:00  1271454
>>1271447
$assoc = array(
"Index" => "value",
"Index" => "value2",
...
);

$numerable = array(
0 => "value",
1 => "value2",
...
);

Ничего странного не замечаешь?
Аноним 28/09/18 Птн 14:35:28  1271459
Поделитесь уютным чатиком где можно будет обсудить что-то или получить помощь/совет
Аноним 28/09/18 Птн 15:40:58  1271494
>>1271459
а зачем ты нужен уютному чатику
Аноним 28/09/18 Птн 16:29:40  1271508
>>1271494
Если у тебя такой вопрос возникает, значит твой чатик не уютный
Аноним 28/09/18 Птн 17:02:54  1271516
>>1271459
тг WebDevHeroes
Аноним 28/09/18 Птн 21:06:43  1271603
>>1270770
ОООпчик, ты меня проглядел?((( Смотрю, уже ниже спустился по ответам.
Аноним 29/09/18 Суб 15:47:06  1271888
>>1271414
За одинарные может быть? Вроде как доступно больше функций с одинарными кавычками, не? Не срача ради, сугубый интерес.
Аноним 29/09/18 Суб 17:30:18  1271942
>>1271603
Дичайший быдлокод (в плане самого алгоритма), ещё и с английскими комментариями. Фу, бля.
Аноним 29/09/18 Суб 18:18:10  1271970
>>1271454
Извиняюсь, не было возможности заходить на двачи.
У нижнего массива цифры вижу в имени
Аноним 29/09/18 Суб 18:34:02  1271974
>>1271970
Не то. Посмотри еще раз внимательнее.
Аноним 29/09/18 Суб 18:35:06  1271975
>>1271974
"Index" в ковычках двойных, а 0 нет?
Аноним 29/09/18 Суб 18:38:37  1271976
Хотя, тут скорее, что Index'у несколько ключей соответствует
Аноним 29/09/18 Суб 18:43:40  1271980
>>1271975
Там индекс - целое неотрицательное число, а там - строка. Догнал, кусок долбоёба?
Аноним 29/09/18 Суб 18:47:16  1271981
>>1271980
Страшнавыключай
Аноним 29/09/18 Суб 18:51:47  1271986
>>1271980
Не в этом его ошибка.

>>1271976
Тааак! И что произойдет, если под один индекс пихать разные значения? $pieces["$i"]
Аноним 29/09/18 Суб 18:56:15  1271988
>>1271986
Он спрашивал, что такое ассоциативный массив. К чему твой пример с повторяющимся индексом - не совсем понятно.
Аноним 29/09/18 Суб 19:02:50  1271990
>>1271988
Потому что ты не в теме, проходи, не мешай.
Аноним 29/09/18 Суб 20:02:56  1272029
>>1271942
Ну я и есть нубас. В прошлый раз Оп мне на ошибки указал, я их исправляю потихонечку. Сейчас еще укажет надеюсь, я снова переделаю. Так, глядишь, и научусь чему.
Аноним 29/09/18 Суб 20:45:40  1272062
>>1271986

Чёт всёравно не улавливаю суть. Если в ковычках он это считает одним именем, чтоли?
Аноним 29/09/18 Суб 20:55:13  1272066
>>1272029
Всё правильно, так и надо. Только не создавай затруднения уже на начальном этапе. Смотри, как этот код примерно должен выглядеть: https://ideone.com/DyCEJU
Аноним 29/09/18 Суб 22:01:58  1272080
docs.png (47Кб, 1873x575)
>>1272062
Вот этот шкаф представляет собой массив. В нем каждый ящик может хранить только последнее положенное в него (все, что было в ящике перед тем как мы ложим туда - исчезает). Если два ящика назвать одинаково, произойдет коллапс Вселенной (шутка, просто предыдущий исчезнет и шкаф скорее всего развалится).

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

1) Почему некоторые ящики названы в кавычках и все ли из них нужно было в эти кавычки брать. Если не все, то какие и почему?

2) Итак у нас три документа маршируют сохраниться в ящик. Который из них останется в живых если мы откроем ящик после? Который это будет ящик?
Аноним 29/09/18 Суб 22:09:34  1272082
>>1272066
Ох, мне аж чуть плохо не стало, подумал 1С.
Аноним 29/09/18 Суб 22:18:18  1272088
>>1272080
1) Без ковычек числа да? 007 - ковычек не надо
2) Смотря какой порядок, если с права на лево, то выживет левый в папке index
Аноним 29/09/18 Суб 22:57:51  1272100
>>1272088
1) не все языки простят тебе 007 в качестве ключа.

2) ну теперь то ты понял свою ошибку в $pieces["$i"]?
Аноним 30/09/18 Вск 07:51:37  1272225
СДАЧА
https://www.ideone.com/BbkNOo
Аноним 30/09/18 Вск 08:26:36  1272228
RVsOIBYqu7g.jpg (122Кб, 1280x720)
Доделал Опечаточники:
https://www.ideone.com/Enbf5W
Аноним 30/09/18 Вск 09:44:50  1272244
>>1272228
https://pastebin.com/raw/i46MgYum
https://pastebin.com/raw/Tqdys0Yz
Аноним 30/09/18 Вск 10:02:10  1272245
>>1272066
Надо на работе как-нибудь захерачить сразу в продакшен такое. Начальника с инфарктом скорая увезет, наверно...
Аноним 30/09/18 Вск 11:44:49  1272269
142243930111140[...].jpg (44Кб, 600x338)
>>1272228
Да, там опечатка в условии, не заметил.
Перезалил.
Опечаточники: https://www.ideone.com/XKbY9H
Аноним 30/09/18 Вск 12:15:28  1272282
Дианон есть?
Аноним 30/09/18 Вск 12:42:23  1272292
>>1272225
Смотри, вот практически твой же код, только написанный по-человечески, сравни: https://www.ideone.com/kPx9jn
Аноним 30/09/18 Вск 12:45:05  1272293
>>1272228
Фу, блядь, нахуй он ему язык вырвал? И почему он жёлтый?
Аноним 30/09/18 Вск 13:55:39  1272343
>>1272292
>>1272066
Аха, ясненько. Тролобасы подъехали.
Аноним 30/09/18 Вск 14:04:53  1272346
Как на курсы записаться, хочу такую кошечку
Аноним 30/09/18 Вск 14:18:06  1272361
>>1272343
Совсем дебил?
Аноним 30/09/18 Вск 16:07:22  1272408
сделал криво косо плохо задачку про компанию вектор, мб кто-нибудь почекает да подскажет чего-то https://ideone.com/UiCDNk
Аноним 30/09/18 Вск 18:13:33  1272454
ОП, посмотри 13 задание по CSS/HTML, пожалуйста.

https://deadj.github.io/
Аноним 30/09/18 Вск 19:18:33  1272475
Capture.JPG (103Кб, 1366x768)
>>1272361
Че такой дерзкий? Выпускной сертификат от ОП-а показал быстро
Аноним 30/09/18 Вск 19:42:26  1272484
>>1272475
> Выпускной сертификат от ОП-а показал быстро
Твоя опа-хреньворкщица сама сертификат не хочет показать? Или там только справка бакалавра?
Аноним 30/09/18 Вск 20:40:22  1272522
68753574p5maste[...].jpg (534Кб, 955x722)
Таки четыре дня - слишком большой отдых от обучения.
Аноним 01/10/18 Пнд 02:58:02  1272630
Если вы не знаете, аноны, то на Хабре выходит дайджест с новостями из мира PHP (советую читать): https://habr.com/company/zfort/blog/424949/

Мне больше всего нравится новость про то, что в 7.4 добавят типизированные свойства классов: https://wiki.php.net/rfc/typed_properties_v2
Аноним 01/10/18 Пнд 08:35:29  1272657
>>1272630
Осталось еще $ у переменных убрать, и будет Java.
Аноним 01/10/18 Пнд 12:00:35  1272752
>>1272100
Я так понимаю, что пытался всё воткнуть в $i - т.е. это было не число как я задумывал, а именно имя $i ему уже присваивались значения, и высвечивалось последнее?
Аноним 01/10/18 Пнд 12:21:37  1272761
>>1272752
Ура! Ты молодец. Да, ты в цикле обновлял значение у текстового ключа "$i", а не добавлял новые числовые ключи $i. Впредь будь внимательнее, или я тебя заебу вопросами ты понял?
Аноним 01/10/18 Пнд 12:27:24  1272763
>>1272761
Было познавательно, особенно картинка, сам делал?
Аноним 01/10/18 Пнд 13:36:28  1272787
>>1272763
У Фаулера позаимствовал.
Аноним 01/10/18 Пнд 14:58:19  1272824
Туго жаваскрипт идет.
Аноним 01/10/18 Пнд 15:02:43  1272825
>>1272824
let или var ?
Аноним 01/10/18 Пнд 15:03:41  1272828
>>1272825
with
Аноним 01/10/18 Пнд 15:41:11  1272842
>>1272825
let.
Аноним 01/10/18 Пнд 20:08:11  1272935
Помогите срочно! gd не работает на apache. Проверил вардампом gd_info() в самой консоли php - все показывает. Копирую то же самое в файл на серве - ошибка 500. В чем проблема? В php.ini gd2 раскомментирован.
Аноним 01/10/18 Пнд 20:19:12  1272942
>>1272935
Все разрешилось рестартом сервера.
Аноним 02/10/18 Втр 09:01:33  1273133
В шапке советуют html академию, кто-нибудь проходил там курсы? Что скажете за бесплатные/платные уроки и учебу с наставником?
Аноним 02/10/18 Втр 09:41:58  1273166
>>1273133
Рекомендую бесплатные. Темы платных курсов можно будет изучить после, самостоятельно и бесплатно.
Аноним 02/10/18 Втр 10:01:53  1273176
>>1273166
И реально после курса бесплатного можно садиться и делать свои сайты? чувствую обман
Аноним 02/10/18 Втр 10:41:39  1273190
>>1273176

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

А так, в вебе никаких секретов нет и при упорстве все можно освоить бесплатно.
Аноним 02/10/18 Втр 10:43:17  1273191
>>1273176

При этом я не говорю, что платные курсы это плохо. Если это не курсы вида "купить за деньги учебник", а например, курсы подразумевают что препод следит за успеваемостью, помогает в сложных случаях и тд, то это конечно может быть более эффективно чем самостоятельная учеба.
Аноним 02/10/18 Втр 11:12:48  1273208
>>1273190
Получается чтобы делать сайты средней руки надо знать html, php, js, css?
Аноним 02/10/18 Втр 11:22:34  1273218
>>1273208

SQL еще.

Если твоя задача как можно быстрее делать сайты, то можно взять CMS - там вообще программирования не нужно, но сделать можно только то, что заложено в CMS или ее модули.
Аноним 02/10/18 Втр 11:24:40  1273220
>>1273218
Такой еще вопрос от другого анона: насколько в работе (да и вообще на практике) нужно именно программирование а не использование CMS-ок?

Спрашиваю про уровень джуна со стажем. Реально ли новичку дрючить КМС-ки, так почти ничего за свою "карьеру" и не написав?
Аноним 02/10/18 Втр 11:33:19  1273226
>>1273220

Взял бы и попробовал использовать какую-нибудь CMS. Wordpress или Drupal. Там теоретически ничего сложного, но по факту много всяких подвохов. Так что я советую изучение программирования не забрасывать.
Аноним 02/10/18 Втр 11:35:58  1273228
>>1273218
Я изучаю для себя, хочу сделать свой проект с возможностью модернизации последующей, и чтобы голову не ломать с переделкой в дальнейшем хочется делать если не хорошо, то хотя бы правильно
Аноним 02/10/18 Втр 11:44:46  1273237
>>1273226
Я ни-ни!
тот самый анон
Аноним 02/10/18 Втр 13:19:00  1273289
Что за наркоман выдумывал принцип работы объектов в JS? Поскорее бы вернуться к PHP, там все намного логичней.
Аноним 02/10/18 Втр 15:40:47  1273388
Смотрел старые посты, и обнаружил, что пропустил человека с файлообменником:

>>1240285 - https://github.com/Qevg/filehosting

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

Если что, предыдущий тред доступен в архивах: https://phpclub.tech/pr/res/1232710.html

А так, вроде как проверил все посты в старом треде, вот последние непроверенные задачки. Позно, конечно, но лучше поздно, чем никогда.

>>1256038

> Калькулятор ОПа. https://3v4l.org/D5Apr

Решено верно.

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

Тут есть разные подходы. Можно регуляркой разбить выражение на части, чтобы каждое дробное число или знак операции было отдельным куском строки, и преобразовать его в тип float с помощью floatval($x). А можно читать символы по одному и добавлять к строке. А перед вычислением проверить эту строку на правильность регуляркой и преобразовать в float.

>>1255784

> Ребят, вопрос по symfony - если мне нужен минимальный функционал API причем даже не CRUD, а просто ~5 эндпоинтов, мне кажется, что для этого не стоит тащить целый бандл типа api-platform/fosrestbundle и достаточно будет добавить просто эти 5 эндпоинтов в роуты?

Достаточно добавить.
Аноним 02/10/18 Втр 15:41:20  1273389
>>1255400

> Аноны, что делать, если я хочу свои говноподелия просматривать с мобилки/планшета, но именно через локальный сервер?

Проще всего на компьютере в конфиге сервера поставить привязку (bind) к адресу 0.0.0.0 - это значит "слушать на всех сетевых интерфейсах" (там может стоять 127.0.0.1 - слушать только на loopback-интерфейсе, к которому нельзя подключиться снаружи). После этого посмотреть IP компьютера и зайти на него с телефона (http://192.168.x.y/).

>>1253706

> Добрый вечер, такой вопрос по системам очередей (MQ). К примеру у меня есть определенные данные которые мне в любом случае надо обработать и ни в коем случае нельзя их потерять. На данный момент я вижу, что MQ тут реально был бы кстати, но встает следующий вопрос - нормальный ли подход если я организую работу в следующем ключе:
> 1. Создаем задачу с данными
> 2. Первый Consumer создает запись в БД и Продюсит следующую задачу с обработкой
> 3. Второй Consumer обрабатывает данные и Продюсит следующую задачу
> 4. Третий Consumer получает обработанные данные и создает ещё одну задачу
> 5. Четвертый Consumer делает реквест с отправкой данных конечному адресату

> Или можно как-то по другому всё сделать? Нельзя чтобы на каком нибудь из этапов потерялись данные.
> Ещё думаю над таким вариантом
> 1. Получаем данные и создаем тут же запись в БД (молимся чтобы БД была доступна, сеть работала и запись создалась успешно), тут же создаем задачу в RabbitMQ
> 2. Первый Consumer Обрабатывает данные и продюсит следующую задачу
> 3. Получаем данные вторым Consumer, обновляем БД (снова молимся) и отправляем данные конечному получателю

> ОП и другие небезразличные помогайте

Первый вопрос, который возникает: если для выполнения задачи надо сделать несколько действий, что мешает сделать их в одном скрипте? То есть берем задачу, делаем все нужные обработки и сохраняем результаты. Зачем разбивать это на части?

А в общем тут есть 2 подхода: хранить задачу в MQ либо хранить задачу в БД, а MQ использовать для уведомления воркера о ее появлении. Подход с БД имеет тот плюс, что ты всегда можешь увидеть список и статус задач.

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

В описанной тобой ситуации, если задач не слишком много, можно вообще обойтись без MQ, consumer может периодически проверять наличие новых задач в БД и выполнять их.

Что касается надежности, надо смотреть на конкретную очередь - некоторые предоставляют гарантии сохранности данных.
Аноним 02/10/18 Втр 15:41:42  1273391
>>1248514

> http://sandbox.onlinephpfunctions.com/code/13dd69c45baf6239448f6cf4f104365e29663936
> Привет, ОП!
> Я правильно решил эту мини-задачку из ООПа?

Да, все верно.

>>1244359

>> addEmployee(Employee $e)
> ОП, извини, что вопросов много задают тупых, но никак не могу вкурить, что ты имел ввиду под этим.

Я имел в виду, что для добавления работников в департамент можно сделать такой метод, куда передается уже созданный объект работника. Вместо того, чтобы поручать департаменту самому создавать работников.

>>1238140

> https://ideone.com/Ws1AAk
> Оцените решение

> $dep <= 1000000;
Вообще, тут должно быть <, а не <=, в остальном верно.
Аноним 02/10/18 Втр 15:42:11  1273392
>>1238138

Задача про группировку слов по первой букве
> https://ideone.com/FgM9lY

> lcfirst($word[0]);
Это будет работать только для латиницы, для кириллицы нет: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Также, у тебя там много вложенных циклов. Это все можно сделать одним циклом:

список = [];

перебираем слова {
берем первую букву;
добавляем слово в массив список[буква];
}

Ну и варнинги надо исправить:

> PHP Notice: Undefined variable: combined in /home/Y1BEf2/prog.php on line 17
> PHP Warning: in_array() expects parameter 2 to be array, null given in /home/Y1BEf2/prog.php on line 17

>>1237587

> Опчик, проверь пожалуйста задачу про ООО Вектор
> https://ideone.com/slxeeN


> public function setRank($rank){
> switch ($rank){
> case 1:
> $this->rank = 1;
Это не удачная идея, что ты в поле rank вместо ранга сохранешь не сам ранг, а множитель. Ну представь, тебе надо будет повысить ранг работнику на один. Как ты это сделаешь?

> public function setSalary($baseSalary){
Лучше было назвать setBaseSalary(), чтобы не путать базовую ставку и итоговую зарплату.

> class Manager extends Employee{
> protected $coffeeConsumption = 20;
У тебя наследник Employee должен определить зарплату, кофе итд. Но это никак не документировано и не проверяется. Лучше использовать абстрактные методы, чтобы решить эту проблему:

abstract function getBaseSalary();

В остальном верно.

Ждем версию с антикризисными мерами.
Аноним 02/10/18 Втр 16:20:45  1273430
>>1273289

Вообще, там была идея сделать объекты без классов, на прототипах. Вот тут вот https://medium.com/@benastontweet/lesson-1a-the-history-of-javascript-8c1ce3bffb17 пишут, что автор вдохновлялся языками Java, Scheme и Self (можешь почитать про последние 2 для расширения кругозора).

В традиционном ООП мы описываем класс с полями и методами, при желании наследуем классы, а затем создаем объекты этих классов. В прототипном подходе классы выкидывают как ненужную сущность и объекты создают из других объектов с помощью "наследования" через прототипы.

Класс с полями и методами из традиционного ООП в прототипном заменен на базовый объект с методами. Операции наследования классов и создания объекта класса в прототипном ООП заменены на одну операцию создания нового объекта.

То есть мы создаем "базовый" объект такого вида:

var basePerson = {
setSalary: function (s) { this.salary = s; },
getSalary: function() { return this.salary; },
getName: function() { return this.name; }
};

А затем от него создаем (наследуем) уже конкретные объекты:

var ivan = Object.create(basePerson, { name: "Ivan", salary: 100 });
var peter = Object.create(basePerson, { name: "Peter", salary: 200 });
console.log(peter.getName());

Object.create() создает новый объект с указанным прототипом и свойствами.

Для удобства, можно добавить функцию-конструктор для создания объектов:

functon newPerson(name, salary) {
return Object.create(basePerson, { name: name, salary: salary });
}

var sidor = newPerson('Sidor', 300);

Как видишь, это похоже на традиционный ООП, где классы сделаны в виде объектов.

Наследование базовых объектов делается аналогично созданию:

var baseManager = Object.create(basePerson, {
getSubordinates: function () { ... },
setSubordinates: function () { ... }
});

var fedor = Object.create(baseManager, { ... });

Правда, в первоначальных версиях ES3 почему-то не сделали Object.create(), а заставили создавать объекты только через конструкторы:

// Код, что и выше, но в версии для ES3
function Person(name, salary) {
this.name = name;
this.salary = salary;
}

Person.prototype = basePerson;
var sidor = new Person('Sidor', 300);

Из-за отсутствия Object.create() наследование базовых объектов в ES3 делается очень коряво и я не рискну написать его по памяти.

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

- в Яве: https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
- в Руби: https://ruby-doc.org/core-2.5.1/Class.html

Ну и в общем прототипный ООП как-то не очень нашел поддержку и люди начали писать библиотеки для имитации традиционного ООП на классах. А в ES6 завезли синтаксис для описания классов, правда самих классов фактически по прежнему нет.
Аноним 02/10/18 Втр 18:29:51  1273495
>>1273430
Вывод один - надо забивать на глубокое изучение JS и учить jquery.
Аноним 02/10/18 Втр 21:51:13  1273600
Я тут единственный такой успешный могу проходить задания из оп поста по 5+ часов?
Аноним 02/10/18 Втр 22:09:48  1273613
>>1273289>>1273495

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

Так. Короче только объекты.
Все объекты делятся на callable и non-callable. Callable это функции, в понимании большинства. Но по факту это все те же объекты, со всеми свойствами что и у других.

Все объекты могут принимать всего несколько типов сообщений - get, set и call. При чем call может принимать только callable объект. при попытке послать call сообщение не-callable объекту будет исключение.

Сообщение get содержит один параметр, сообщение set два. Сообщение call параметром содержит кортеж аргументов, а так контекст this.

Если в объекте (а так же в цепочке прототипов) не назначены слушатели для get и set с определенными параметрами, ищутся слоты с такими именами в объекте и по цепочке. Если находится возвращается то, что в них лежит. Если в них лежит callable объект и ему посылают сообщние call сразу как получили его из слота, то у него будет перегружен контекст (this) на объект из чьего слота его получили. Если только этот объект не был сконструирован стрелочным синтаксисом, иначе контекст перегрузить нельзя. Если после получение callable объекта из слота его сразу не вызвать, а например положить ссылку на него в переменную, то контекст будет сброшен на тот, который был установлен у него в момент его создания (и это не обязательно будет тот же объект из чьего слота его получили).

У callable объектов есть scope (область видимости) и контекст (this) в момент посылки им сообщения call (вызова). scope средствами языка перегрузить нельзя (на самом деле частично можно изъебнуться с помощью eval), но некоторые окружения позволяют (например в ноде есть модеуль vm), this перегружается у callable объектов сконструированных не-стрелочным синтаксисом

Классов нет. Есть конструкторы. Любой конструктор принимает новый созданный объект, которому выставлен определенный прототип (другой объект). Оператор instanceof (someObject instanceof SomeClassName) проверяет лишь есть ли в цепочке прототипов у someObject объект который лежит у SomeClassConstructor в слоте с именем prototype. На сам конструктор ему поебать. Чтобы сменить класс, достаточно сменить цепочку прототипов. Даже если объект был сконструированным определенным конструктором.

Так же у объектов есть параметр ограничения доступа, контролирующие его расширяемость или изменяемость (sealed, extensible, frozen). У слотов объекта есть параметры configurable, enumerable, writable. Параметры слотов объекта не влияют на объекты, что в них лежат. Они лишь контролируют доступ к самим слотам.

Все. Никаких классов. Никаких интерфейсов. Как отдельных сущностей. По факту все есть объект и все строит из них.
наследование реализуется выстраиванием цепочки прототипов. Инкапсуляция только на уровне scope'в (читай замыканий).
В остальном все меняется и все динамично, если только специально все не зафризить в момент конструирования. Но обычно этим никто не заморачивается по причине оверхеда и бессмысленности. Разве только фанатики по иммутабельности, н это все из разряда те, кому надо чтобы им по рукам бил компилятор\рантайм\дядя петя. Все "привычные" понятия тянуться в язык для еще более простого вкатывания тех, кто приходит из других языков. Так уж сложилось, что есть куча литературы по привычному, статически классовому ООП, но очень мало по мессадж-пассинг\прототайп-базед\мета-программинг. Все эти притянутые понятия выливают в синтаксический сахар, который не делает ничего полезного, а даже наоборот, еще больше вносит путаницы и от того непонимамания многих вещей в языке. При этом часто этот синтаксический сахар дэже урезан и вспомнинают об этом лишь после (как например проебались с полями в конструкции class и тянут ее теперь только в proposol'ах будущих версий).

JS истинно объектный язык. В современный язык притащили много вкусных вещей для метапрограммирования. Нову примитивную сущность Symbol, и Proxy-объекты. С помощью которых можно еще больше и сильнее перегружать и менять поведение в динамике.

Другое дело, что почти никто не умеет этим пользоваться и не понимает, что такое объектное программирование на самом деле.
Им нужно не объектное, а статически типизированное. А какие именно структуры будут скрываться за этими типами, не собо важно. Важно что это просто структуры и функции, строго привязанные к ним, или иногда менее строго. То, что в Java\C++ это больше структурное программирование, нежели объектное. Объектное программирование не может существовать без динамической среды. Это противоречит самому понятию объекта. А динамическое программирование это слишком сложна и непанятна. И как бы не старались с пеной у рта фанатики кричать про низкий порог входа - низкий он именно что для входа, а не для всего остального. Модификация программ в рантайме всегда было уделом креативно мыслящих людей. Для большинства это слишком сложный уровень высокой абстракции.
Аноним 02/10/18 Втр 22:34:31  1273629
>>1273613

Примитив это все же не объект. Простой пример:

var a = 6;
a.x = 1;
console.log(a.x); // undefined
Аноним 02/10/18 Втр 22:41:22  1273635
>>1273613
ты охуенен. Посоветуй литературу для развития или сайты. Да чего угодно. Не доку по жс или реакту, а вообще что-то типо шаблонов и современном программировании, подходов к разработке и т.д. что "сложна и непанятна".

>Модификация программ в рантайме всегда было уделом креативно мыслящих людей. Для большинства это слишком сложный уровень высокой абстракции.
Аноним 02/10/18 Втр 22:53:18  1273639
image.png (28Кб, 485x294)
image.png (136Кб, 778x590)
>>1273629

Читай внимательнее
> их можно тоже рассматривать в качестве синглтон объектов

И во-первых - пик 1.
Во-вторых - пик 2.

Аноним 03/10/18 Срд 01:12:09  1273677
>>1273639
Нифига себе волшебство.
Аноним 03/10/18 Срд 09:22:16  1273750
ЖС за одно только динамическое типизирование надо запретить.
Аноним 03/10/18 Срд 09:36:13  1273758
>>1273750
Пиши на тупскрипте, никто не запрещает.
Аноним 03/10/18 Срд 09:47:18  1273767
>>1273750
>динамическое типизирование
php, python, lua, perl - тоже запретить?
Может еще беспартийных расстреливать?
Аноним 03/10/18 Срд 10:42:10  1273815
ОП, задачку про файлообменник можно с Лярваелем сделать?
Аноним 03/10/18 Срд 12:43:44  1273876
>>1273815

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

Ну ты попробуй, давай посмотрим, что получится.
Аноним 03/10/18 Срд 12:57:01  1273886
>>1273876
Еще вопрос, какой лучше делать максимальный размер файла, и хранить ли его вечно или какой-то срок?
Аноним 03/10/18 Срд 13:25:56  1273898
>>1273886

На твое усмотрение. 100 Мб, например.
Аноним 03/10/18 Срд 14:14:13  1273922
ОП, ты вроде забегал сюда. Не забыл про мои опечаточники?
>>1272269
Аноним 03/10/18 Срд 15:51:38  1273961
>>1273876
Вообще, ты прав. Как-то слишком все просто выйдет через Ларавел.
Аноним 03/10/18 Срд 16:16:14  1273967
>>1273767
вот кстате петон можно запретить
Аноним 03/10/18 Срд 18:08:49  1274021
>>1273750
>>1273967
В тот момент, когда вы перестаете хотеть что-то запрещать, ненавидеть и плеваться желчью по отношению к тому, что не смогли осилить. Вот тогда вы, достигнув сатори, становитесь программистами.

Другое дело, что с большинством из вас этого так никогда и не случается.
Аноним 03/10/18 Срд 20:59:49  1274125
Господа, поясните следующее:
$a = '\x61';
$b = "\x61"

Если сделать var_dump, в первом случае выведется, как есть. Во втором случае выведется "a".

Что это за кодировка?
Как работают двойные кавычки по декодингу таких сущностей?
И как в php раскодировать переменную $a, чтобы в дампе было тоже "a"?
Аноним 03/10/18 Срд 21:07:02  1274128
>>1274125
http://php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Аноним 03/10/18 Срд 21:12:20  1274131
>>1274128
Так, символ в шестнадцатеричной системе, понял. Значит двойные кавычки такую последовательность сами конвертируют. А как все-таки быть и одинарными кавычками?
Аноним 03/10/18 Срд 21:16:26  1274133
>>1274131
А никак, в одинарных кавычках ничего не сконвертируется. Баш напоминает. И вообще я мимокрокодил.
Аноним 03/10/18 Срд 21:22:53  1274143
>>1274133
Блин, как же быть?
Мне один сервис отдает данные в виде такой строки: '\x61\x61\x61'
И мне ее надо у себя на сайте сконвертировать в читаемые символы.
Аноним 03/10/18 Срд 21:24:34  1274144
>>1268753 (OP)
Зацените мой YodaSpeak(хотя скорее Yoba). Короче смотрите и завидуйте моему изящному коду))) Кста тз перепутал и теперь йода рандомом пиздит лол
https://repl.it/@Ninogi/UncomfortableWickedTransformations
Аноним 03/10/18 Срд 21:35:36  1274148
>>1274143

Ты, к сожалению, плохо прочел мануал.

Экранирующие последовательности работают только если ты пишешь их прямо в коде:

$a = "\x41";

Здесь при разборе строки PHP заменит \x41 на A и сохранит в память строку "A" (без кавычек). То есть экранирующие посл-ти работают только в строках в коде на этапе разбора программы. В ходе работы программы строки хранятся в памяти уже в преобразованном виде и обработка бекслешей не производится.

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

Если во время выполнения программы у тебя в переменной хранится строка вида "\x..." то с ней ничего делаться не будет.

Однако, есть функции как stripslashes и stripcslashes. Почитай про них.
Аноним 03/10/18 Срд 21:39:36  1274151
>>1274148
Анон, ты наверное не понял.
Вот есть у меня переменная $a:
$a = '\x41';

Во время работы скрипта, в переменной будет именно строка из символов '\x41' без всяких преобразований.
Так вот, как мне дальше в скрипте значение переменной $a преобразовать в символ A?
Аноним 03/10/18 Срд 22:28:56  1274178
>>1274151
>Так вот, как мне дальше в скрипте значение переменной $a преобразовать в символ A?
в двойные кавычки ебани echo "\x41";

мимикрокодил
Аноним 03/10/18 Срд 22:31:52  1274181
>>1274178
ууу, как же сложно-то.

$a = '\x41';
$b = pseudo_convert($a);
echo $b; // A

вот так возможно сделать какой-либо функцией?
Аноним 03/10/18 Срд 22:38:08  1274187
>>1274181
mb_convert_encoding("\x41", 'UTF-8');
Аноним 03/10/18 Срд 22:39:49  1274189
>>1274187
Энкодинг бесполезен. На моменте интерпретации строки в двойных кавычках, уже будет получен символ А.
Аноним 03/10/18 Срд 22:39:52  1274190
>>1274181
А вот так проверять кодировку
echo mb_detect_encoding("x41");
Аноним 03/10/18 Срд 22:48:10  1274195
>>1274151

Ты мой пост невнимательно прочел.

Аноним 03/10/18 Срд 22:48:16  1274196
>>1274189
echo pack("H", '\x41');
Аноним 03/10/18 Срд 22:52:50  1274199
>>1274196
Наконец-то решение.
Только вот так будет правильно: echo pack("H*", '41');
Как же быть со строкой '\x41\x41\x41\x41'?
preg_match'ем искать цифры, потом их прогонять через pack и склеивать?
Аноним 03/10/18 Срд 22:53:40  1274200
Поясните, почему в шапке говорится про symphony? Остальные фреймворки совсем говно чтоли? Как на счет Laravel?
Аноним 03/10/18 Срд 22:54:35  1274201
>>1274199
>preg_match'ем искать цифры, потом их прогонять через pack и склеивать?
Да))

Когда приходить такое - это пиздец.
Если это приходит с какого-то сервера то значит сериализация запорота
Аноним 03/10/18 Срд 22:57:33  1274204
>>1274195
спасибо, анон
stripcslashes('\x41\x41');
работает, как нужно
Аноним 03/10/18 Срд 22:58:35  1274205
>>1274200
>symphony
symfony

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


Сам пробовал и то и это.
Говнокод есть и там и там, но ларавельщики вообще тупые нахуй какие-то.




Аноним 04/10/18 Чтв 02:40:09  1274237
Спрашивают ли алгоритмы и структуры данных на собеседованиях?
Аноним 04/10/18 Чтв 02:43:13  1274239
>>1274237
>алгоритмы и структуры данных
Любое нормальное тех. собеседования и этого и начинается. Это основа, дебил. Если ты, чмо тупое, не знал об этом, то не теряй время, а читай учебники и решай задачи. Через годик освоишь.
Аноним 04/10/18 Чтв 02:46:20  1274240
>>1273388
>> https://github.com/Qevg/filehosting
>> Извини, анончик, постараюсь глянуть в ближайшее время.
в выходные doker and CI постараюсь прикрутить

вот тут ещё сделал рефакторинг и написал тесты
https://github.com/Qevg/Student-list

Аноним 04/10/18 Чтв 08:39:29  1274272
>>1274237
На веб-макакия? Нет, в основном.
Аноним 04/10/18 Чтв 08:43:31  1274273
>>1274237
Бывает, элементарщину спрашивают.
Пару раз было просили что то реализовать, но они ебанатами были полными.
Пыхеру редко когда это все надо, особенно крудошлепам уоторые магазины по продаже бисера пишут.

А вот про стандатные структуры типа \SplQueue, часто спрашивают.
Так что если сможешь объяснить что это и нахуя нужно, то нехило так блеснешь знаниями
Аноним 04/10/18 Чтв 09:30:44  1274288
Указал в hosts : 127.0.0.1 megafun
Указал в конфиге апача :
LoadModule rewrite_module modules/mod_rewrite.so
<Directory "${SRVROOT}/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<VirtualHost *:8080>
DocumentRoot "${SRVROOT}/htdocs/megafun/public"
ServerName megafun
</VirtualHost>

Перезапустил апач.
А теперь вопрос, почему это нихуя не работает?
Аноним 04/10/18 Чтв 09:49:48  1274298
>>1274288
> почему это нихуя не работает
А мы почем знаем?
Аноним 04/10/18 Чтв 10:16:40  1274316
>>1274288

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

В hosts имя домена прописал? Если нет, то почему? Если не прописал, то подумай, что делает браузер при вводе адреса сайта.

Если прописал, то что получается при попытке открыть сайт? Что в логе ошибок Апача?
Аноним 04/10/18 Чтв 10:27:53  1274323
>>1274316
>Ты не написал, что ты делаешь и что происходит, в чем именно ошибка.
Это называется недосып, совсем крыша поехала.
А проблему я уже решил.
Аноним 04/10/18 Чтв 14:07:55  1274437
>>1274273
Спасибо. Элементарщина, это типа найти сложность алгоритма и что это вообще такое, чем отличается сортировка слиянием и пузырьком с точки зрения времени выполнения, ну и всё в этом духе?
Аноним 04/10/18 Чтв 14:12:43  1274444
Какие характеристики ноута посоветуете для веб-разработки? Вкатывальщик, ничего сложного ануса разрабатывать скорее не дадут.
Аноним 04/10/18 Чтв 14:30:50  1274471
>>1274444
Все на чем можно набирать текст в текстовый редактор подойдет.
Если денег не жалко, то 13 + дюймов на базе интела от 8gb оперативки, ssd 128gb+ и батарея поживучей (тут главное не купить "планшет в корпусе ноутбука"). Среди моих знакомых сейчас в тренде синкпады, т.к. последние Макбуки Про пугают все постоянными косяками с клавиатурой.
Аноним 04/10/18 Чтв 14:34:47  1274477
>>1274444
ThinkPad, если хочешь быть модным.
Аноним 04/10/18 Чтв 15:22:29  1274524
Круто, внезапно, вообще перестали сss-ки работать, даже если я положу их в одну папку с шаблонами.
Аноним 04/10/18 Чтв 15:44:24  1274542
>>1274437
>Элементарщина, это типа найти сложность алгоритма и что это вообще такое, чем отличается сортировка слиянием и пузырьком с точки зрения времени выполнения, ну и всё в этом духе?

Просто, какие знаешь, чем отличаются
Аноним 04/10/18 Чтв 17:33:01  1274617
Pure или бутстрап? Оба выглядят отвратительно, но, вроде как, pure настраивать легче, или нет?
Аноним 04/10/18 Чтв 17:56:53  1274626
>>1274617

ReactJs
Аноним 04/10/18 Чтв 18:06:43  1274632
cotol.jpg (70Кб, 410x283)
>>1274626
Аноним 04/10/18 Чтв 21:03:15  1274775
react21.jpg (309Кб, 1024x576)
>>1274632
someApprentice 04/10/18 Чтв 22:21:12  1274823
somebae.jpg (115Кб, 808x1024)
У нас, на сайте phpclub.tech, есть задача, с которой справился бы любой новичок.

https://github.com/richBlueElephant/phpClub/issues/90

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

https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B0

Необходимые знания:
-Умение пользоваться Composer'ом, чтобы развернуть проект у себя на локальной машине.
-Минимальное знание ООП, чтобы написать простой класс.
-Минимальное знание git.

Чему вы можете научится выполняя эту задачу:
-Разворачивать рабочий "боевой" проект, на своей локальной машине.
-Применять свои знания на, опять же, боевом проекте.
-Делать Pull Request'ы, которые просто необходимо уметь.


Чувствуйте себя свободно задавать если есть какие-то вопросы.
Аноним 05/10/18 Птн 11:26:54  1274975
>>1274823
А вы работаете пацаны, программистами? Специально учились или благодаря треду?
Аноним 05/10/18 Птн 12:28:54  1275022
48828988p0maste[...].jpg (184Кб, 800x800)
Надо переставать писать enctype="multipart/formdata", постоянно дефис забываю, а потом полтора часа голову ломаю, почему $_FILES пустой.
Аноним 05/10/18 Птн 12:29:40  1275024
Аноны, сайт phpclub.tech, который упомянут выше - это "официальный" архив тредов клуба PHP. В нем, например, можно найти комментарии по разным задачам.

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

Если, например, вы сейчас готовитесь делать задачу про студентов, или делаете, то у вас знаний вполне достаточно.
Аноним 05/10/18 Птн 13:23:18  1275055
FILTER_SANITIZE_SPECIAL_CHARS пойдет для фильтрации имен загружаемых файлов?
Аноним 05/10/18 Птн 14:07:14  1275091
26b09940c8afd66[...].gif (299Кб, 310x222)
>>1274471
>>1274477

Ноутбук Lenovo ThinkPad L380 Clam 13" 1366x768, Intel Core i3 8130U 2.2GHz, 4Gb RAM, 128Gb SSD, WiFi, BT, Cam, DOS, черный (20M5003QRT)

Как такое? Какие пеки у вас?
Аноним 05/10/18 Птн 14:34:46  1275111
>>1274444

Проверь, нет ли в нем неприятных ограничений. Например, я сталкивался с ноутом, где стояло ограничение на 4 Гб памяти (больше нельзя поставить).
Аноним 05/10/18 Птн 14:38:18  1275117
>>1275091
>1366x768
Я б нистал меньше 1080p. В /hw/ есть тред синкпадо-анонов, есть смысл с ними проконсультироваться для твоего бюджета. Может можно L380 дешево проапгрейдить.
Аноним 05/10/18 Птн 14:52:36  1275130
>>1275111
>>1275117
Спасибо ребята :3
someApprentice 05/10/18 Птн 15:29:35  1275147
>>1274975
Да-да, работаем и все благодаря этому треду.
someApprentice 05/10/18 Птн 15:35:01  1275152
>>1275024
>ну ок, если вы начинающий, то совсем быстро разобраться не получится
А вот не нужно пугать начинающих! Всё получится если иметь желание и энтузиазм разобраться. Главное начать и, если что-то непонятно, задать правильный вопрос.
Аноним 05/10/18 Птн 15:41:20  1275157
>>1274823
Вкачусь в воскресенье, если никто не опередит.
someApprentice 05/10/18 Птн 16:49:55  1275181
>>1275157
Уже опередили.

Но ничего страшного! Ты всё равно можешь взяться с какое-нибудь другое issue и добавиться к нам в конфу в слаке ( https://join.slack.com/t/phpclub-group/shared_invite/enQtMzA2MjcyMTAwNjc5LTNlZTI3ZjE5MTgyZWVhZjc3MmMyMzlhZGJmYTg0ODQ3YjAzYWRmMGNjZmJhYjdlMWFhZjg5MzNhNWE1YzdmNjc ).

К примеру, у нас есть такая же супер простая задача для рефактиринга валидации https://github.com/richBlueElephant/phpClub/issues/10
Если ты делаешь "Студентов" или уже сделал, то знаний вполне хватит чтобы с ней справиться.


Чувствую себя свободно задавать любые вопросы.
Аноним 06/10/18 Суб 01:36:54  1275401
>>1268753 (OP)
Здравствуйте, господа. Пишет вам java-собрат. Пару дней назад получил от знакомого заказ на wordpress интернет магазин, вполне стандартный, с онлайн конрзиной, оплатой и избранным. Локация ДС

Никогда не занимался таким, но сложно не должно быть. Сколько ценник ломить?
Аноним 06/10/18 Суб 10:36:17  1275449
Как лучше хранить дефолтные настройки для пользователей, что бы их мог менять администратор? Сделать в базе дефолтного пользователя и грузить его каждый раз до вызова всей логики? Держать в json файле?
Как белые люди делают?
Аноним 06/10/18 Суб 10:39:04  1275451
>>1275449
>Как белые люди делают?
В инишниках хранят.
Аноним 06/10/18 Суб 12:20:38  1275483
>>1268753 (OP)
Подскажите, вот у ОПа в задаче про список студентов предлагается каждого студента делать объектом, но зачем это мне?
В любом случае обработка действия это обращение к БД->получение данных->формирование таблицы, зачем мне добавлять еще шаг ->загнать данные в объекты-> перед формированием таблицы?
Аноним 06/10/18 Суб 15:00:59  1275545
>>1275483
И вообще, мускль неплохо так и в командную строку выводит в виде таблицы, может мне просто скриншот отдавать, и обращений к БД не надо никаких, профит.
Аноним 06/10/18 Суб 15:02:09  1275547
Хотел отдохнуть сегодня от написания задачки, но слишком уж хочется коммитить. Как это лечить?
Аноним 06/10/18 Суб 15:43:41  1275563
>>1275547
Прописываю Вам регулярный просмотре аниме 2 раза в сутки, утром и вечером.
Аноним 06/10/18 Суб 15:55:51  1275570
>>1275545
Спасибо, охуенно объяснил. Пошел ты нахуй
Аноним 06/10/18 Суб 16:02:03  1275572
Ну что анонсы. Есть ли смысл дропать питон и дрочить пхп? А то деньги на жрат ощена нужны. Говорят у вас тут с этим все в порядке.
Аноним 06/10/18 Суб 16:21:41  1275578
>>1275483
А я люблю обмазываться объектами когда делаю студентов. Каждый день я хожу по земле с черным блокнотом и собераю в него все сущности которые могу придумать. На два полных блокнота целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, сажусь за пеку, включаю любимую IDE…ммм и сваливаю в нее свое сокровище. И набираю, представляя, что меня поглотил единый организм Object. Мне вообще кажется, что объекты, умеют думать, у них есть свои семьи, города, чувства, не прекращайте плодить сущности, лучше приютите у себя, говорите с ними, ласкайте их…. А вчера в ванной, мне преснился чудный сон, как будто я нырнул в море, и оно прератилось в интерфейс, рыбы, водоросли, медузы, все в виде объектов, даже небо, даже Аллах!.
Аноним 06/10/18 Суб 16:35:33  1275586
>>1275578
Содомит
Аноним 06/10/18 Суб 17:28:55  1275620
image.png (80Кб, 640x870)
>>1275483
Вот такая поебень, зачем?
Аноним 06/10/18 Суб 17:42:29  1275625
>>1275483

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

Но давай я отвечу вопросом на вопрос и спрошу: а какие плюсы/минусы есть у представления студента в виде массива или в виде объекта?

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

function f1(array $student) { ... }

function f2(Student $student) { ... }

В какой функции будет проще разобраться?

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

Соответственно, исходя из плюсов/минусов мы и выбираем нужный вариант.
Аноним 06/10/18 Суб 17:51:04  1275630
>>1275625
Вопрос по ООП-Будильнику.

Как лучше реализовать изменение параметров Alarm, через AlarmClock?
В каких случаях стоит использовать выбрасывание исключений?
Аноним 06/10/18 Суб 17:51:21  1275631
>>1275630
>Заранее спасибо!
Аноним 06/10/18 Суб 18:01:43  1275633
>>1275625
Спасибо.
Аноним 06/10/18 Суб 18:09:45  1275639
Попытался сделать счетчик посещений на печеньках.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<?php
if (!$_COOKIE["NumVisited"]) {
setcookie("NumVisited", 1, time() + 1800);
} else {
$_COOKIE["NumVisited"]++;
}
var_dump ($_COOKIE["NumVisited"]);
?>
</body>
</html>

Вылезает Warning: Cannot modify header information - headers already sent by (output started at C:\блаблабла.php) in C:\блаблабла.php on line 16

Что с этим делать? В гугле какой-то пиздеж про запятые и про header(), но ничего все равно не работает.
Аноним 06/10/18 Суб 18:12:47  1275641
>>1275630

Это зависит от того, как ты реализуешь архитектуру.

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

Желательно проектировать АПИ (набор методов для управления будильником) так, чтобы они были удобными в использовании, логичными (не требовали лишних аргументов), защищали от ошибок.

Исключение выбрасывается, если функции переданы некорректные данные (например: время 25 часов 99 минут) или она из-за непредвиденных обстоятельств не может выполнить свою работу. Урок: https://github.com/codedokode/pasta/blob/master/php/exceptions.md
Аноним 06/10/18 Суб 18:15:02  1275643
>>1275639

Во-первых, если ты не слышал про HTTP, то прочитай что-нибудь про него, без этого никак, например, тут: https://github.com/codedokode/pasta/blob/master/network/http.md

Во-вторых, а как по-твоему работает функция setcookie? Она, очевидно, добавляет в HTTP-ответ HTTP заголовок. Но HTTP заголовки в HTTP-ответе должны идти до тела ответа, а вывод HTML кода начинает отдачу тела ответа.
Аноним 06/10/18 Суб 18:28:31  1275649
>>1275643
Понел, спасибо.
Аноним 06/10/18 Суб 20:53:54  1275694
Пытаюсь учиться по гайду из Оп-поста, немного застрял на игре в кубики, по 2 броска которая. Как логически реализовать я понял, а вот код не хочет работать. Уже трижды сам находил свои ошибки и поправил их, но где-то все равно остались косяки, помогите найти, пожалуйста.
https://ideone.com/kLyMgg
Аноним 06/10/18 Суб 20:59:43  1275697
>>1275694
Я идиот, простите. В строке
>if (($anonDice1 == $anonDice2) && ($compDice1 == $compDice2)) {
забыл закрыть вторую скобку. Теперь все работает
Аноним 07/10/18 Вск 13:12:16  1275897
Есть ли способ получить инфу о медифайле помимо отвратного getID3?
Аноним 07/10/18 Вск 13:15:45  1275900
>>1275697
Зачем тебе вообще скобки в этом выражении?
Аноним 07/10/18 Вск 16:58:18  1276045
Screenshot6-4.jpg (66Кб, 815x475)
Палиндром
jdoodle.com/a/HQs
Новый айПад
jdoodle.com/a/HQJ
Стих
jdoodle.com/a/H4L
Аноним 07/10/18 Вск 17:17:33  1276066
metadata.png (162Кб, 1911x640)
Сколько же дерьма в этой вашей медии.
Аноним 07/10/18 Вск 19:12:16  1276140
Я так понимаю, в разделе "Регулярные выражения" в задаче про телефонные номера ОДНО регулярное выражение должно покрыть ВСЕ "правильные" варианты введения номера, верно?
Аноним 07/10/18 Вск 21:45:16  1276189
>>1276140
Да
Аноним 07/10/18 Вск 21:52:42  1276194
изображение.png (25Кб, 1231x781)
>>1268917
>jdoodle.com/a/G3e
это не кодерский подход. А если тебе скажут группировать по сочетанию первых двух букв? Будешь уже 32x32 ифов писать?

Этот сайт не дает сохранять без регистрации, так что только скрин.
Аноним 08/10/18 Пнд 14:39:21  1276398
Как же крыша едет от этого, есть параметры:
$haystack = 'name';
$needle = '9763215619';
есть выражения:
$stmt = $this -> mysqli -> prepare("SELECT FROM table WHERE ? LIKE ? ORDER BY file_id DESC");
$stmt -> bind_param('ss', $haystack, $needle);

Когда делаю execute выдает ноль рузультатов, а если просто делаю:
$stmt = $this -> mysqli -> prepare("SELECT
FROM table WHERE name LIKE '9763215619' ORDER BY file_id DESC");

все работает. В чем может быть проблема?
Аноним 08/10/18 Пнд 15:05:26  1276407
>>1276398
Нельзя биндить названия колонок, таблиц, баз e.t.c.
Аноним 08/10/18 Пнд 15:07:32  1276408
>>1276407
Ясно. Эт жопа.
Аноним 08/10/18 Пнд 15:40:52  1276417
>>1276398

Ты хотел сделать WHERE name LIKE '1234'

А получилось WHERE 'name' LIKE '1234'

То есть сравнение строки со строкой.

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

$allowed = ['name', 'age'];
if (!in_array($field, $allowed)) {
throw new \Exception(...);
}

...prepare("... WHERE `$field` LIKE ? ... ");

Аноним 08/10/18 Пнд 15:46:33  1276418
>>1276408
Нет, это нормально. Ты можешь подставить сам:

$query = "select * from table where {$name} like ?";

Но если ты берешь это из инпута, то обязан проверить. Например сперва прогнать через белый список.
Аноним 08/10/18 Пнд 15:48:00  1276422
>>1276417
Как. Здравствуйте, товарищъ Хайвмайнд.
Аноним 08/10/18 Пнд 18:58:55  1276509
Блин какая же сложная задача про числа прописью.
Аноним 08/10/18 Пнд 19:38:14  1276523
upload.png (13Кб, 502x303)
Хватит столько инфы о файле для обменника?
Аноним 08/10/18 Пнд 19:42:48  1276525
Это снова чувак, который задавал вопрос про регулярные выражения. Я покрыл все "правильные" строки, но что с неправильными? Они не должны парситься/должны парситься по особому? Если что вот говнорегулярка, но я её обязательно поправлю:
/ ?([+] ?7 ?-?| ?8) ?-? ?[(]? ?[0-9]?[0-9] ?-?[0-9] ?-?[0-9] ?-? ?[)]? ?-? ?[0-9] ?-? ?[0-9] ?-? ?[0-9] ?-? ?[0-9] ?-? ?[0-9] ?-? ?[0-9] ?-? ?[0-9]?/
Аноним 08/10/18 Пнд 20:36:22  1276550
Сколько же танцев с бубном пришлось исполнить из-за того, что массивы при использовании json_encode теряют порядок.
Аноним 08/10/18 Пнд 21:00:10  1276563
>>1276525
Переделывай, это пиздец
Аноним 08/10/18 Пнд 21:00:45  1276564
>>1276523

Хорошо, только для битрейта стоит указать единицы измерения (я думаю, bit/s).

Аноним 08/10/18 Пнд 21:02:19  1276567
>>1276550

В яваскрипте словари ({ a: 1, b:2}) не сохраняют порядок элементов. Они лишь используются для сопоставления ключей и значений. Массивы сохраняют порядок, но в них ключи числовые и идут по порядку.

А в PHP массивы сохраняют порядок и объединяют в себе функционал массивов и словарей из JS.
Аноним 08/10/18 Пнд 21:03:50  1276569
>>1276563

Такой комментарий несет мало пользы, если не содержит подсказок или объяснения, что именно плохо.

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

Допустим, у нас есть выражение для "одной буквы": [a-z]. Чтобы записать "от 2 до 5 букв", можно использовать фигурные скобки: [a-z]{2,5}.
Аноним 08/10/18 Пнд 21:11:22  1276571
>>1276567
Да понятно. Пришлось это обходить заворачиванием в новый массив, в котором под нулевым ключем все ключи, а под первым все значения. Тогда порядок можно сохранить.
Аноним 08/10/18 Пнд 21:27:06  1276575
>>1276525
это в лоб, прочитай условия задачи и примеры внимательно
Аноним 08/10/18 Пнд 21:31:01  1276576
>>1276571

Странный подход. Обычно в JSON это сохраняют как

[
{ key: x, value: y},
{ key: z, value: w}
]
Аноним 08/10/18 Пнд 21:35:16  1276578
>>1276576
>Странный
Ну не знаю. Для последующего декода очень даже удобный.
someApprentice 09/10/18 Втр 19:39:58  1276937
Как получить переменную из асинхронной функции в ReactPHP?

function getSmtn()
{
$loop = \React\EventLoop\Factory::create();
$connector = new \React\Socket\Connector($loop);

$connector->connect('...')->then(function (\React\Socket\ConnectionInterface $connection) use ($loop) {
$connection->on('data', function ($data) use ($connection) {
$smtn = $data;

$connection->close();
});
});

$loop->run();

return $smtn;
}
Аноним 09/10/18 Втр 19:42:39  1276940
proxy.duckduckg[...].jpg (17Кб, 474x266)
/([+] ?[7] ?| ?8[-]?) ?[(]? ?\d{3}\d? ?[)]? ?-? ?\d\d? ?-? ?\d ?-? ?\d{2} ?-? ?\d{2} ?\d?/

Аноним 09/10/18 Втр 20:27:56  1276975
proxy.duckduckg[...].jpg (118Кб, 1280x720)
>>1276940
/[+]?([ ]{1,})?[-]?[(]?[ ]?[+7]?[0-9]{1,}[ ]?[)]?/

Неужели всё было так просто? -_-
Аноним 09/10/18 Втр 20:39:30  1276991
Ох лол... понял фейл.
Аноним 09/10/18 Втр 21:50:18  1277028
ЛИЛИЧКА
https://pastebin.com/DyyTb2GQ
Аноним 09/10/18 Втр 23:09:16  1277058
ОП убежал, так что можно не торопиться вкидывать по одной
Аноним 09/10/18 Втр 23:11:00  1277059
>>1276975
сорян, что из пхп кода, вот
$pattern = "/^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$/";
Аноним 09/10/18 Втр 23:26:42  1277072
>>1276937

Асинхронная функция не может вернуть результат сразу. Обычно они возвращают промис, который позже раскроется либо в результат, либо в исключение.

$promise = getSmtnAsync();
$promise->done(...);

У промисов PHP есть неприятная особенность, в сравнении с JS промисами: они не сообщают об необработанных исключениях. Если ты не поставил обработчик (в done/then), то исключение просто потеряется. А ведь это может быть любое исключение, в том числе ErrorException вызванное например опечаткой в имени переменной или функции.

Аналогично, в PHP ошибки чтения/записи в поток по умолчанию игнорируются, если ты не поставил обработчик на on('error', ...). В общем, обработка ошибок сделана максимально плохо.

В твоем коде вообще логичнее всего было бы вернуть объект connection. Если же надо прочитать все данные до конца, тогда надо их читать в функции и по окончанию передать в промис через Deferred:

$def = new Deferred();
// На основании исследования пальца и потолка я решил что это эффективнее, чем строка. В реальности лучше проверить тестами.
$buffer = [];
$connection->on('data', function ($d) use ... { $buffer[] = $d });
$connection->on('error', function ($e) .. { $def->reject(4e); });
$connection->on('end', function () {
$content = implode('', $buffer);
$def->resolve($content);
});

return $def->promise();

Тут только надо проверить последовательность прихода событий, чтобы например ошибка не потерялась, если end приходит раньше error.

Не забывай, обработка ошибок сделана максимально плохо и тебе надо делать ее полностью самостоятельно.
Аноним 09/10/18 Втр 23:40:47  1277077
>>1276940
>/([+] ?[7] ?| ?8[-]?)
ололо
Аноним 10/10/18 Срд 00:35:18  1277094
>>1276940

Я вижу, анон запутался. Давайте ему поможем.

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

Примеры:

Правильные выражения:
123
1+2+3
1+3-2

Неправильные:

xyz (это не число)
-2 (у нас в задаче нет отриц. чисел)
1++2 (2 знака подряд)
1 2 (нет знака между числами)

Пишем регулярку. Структуру выражения можно записать как:

число знак число знак число ...

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

число (знак число)*

Продолжим. Как записать "число" в виде регулярки? Это просто 1 или более цифр:

число = [0-9]+

Знак это плюс или минус: [+\-]

Соберем это вместе:

^[0-9]+([+\-][0-9]+)*$

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

^\s*[0-9]+\s*([+\-]\s*[0-9]+\s*)*$

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

Попробуй так же записать свое выражение. Что в нем может встретиться и где.
Аноним 10/10/18 Срд 03:50:34  1277130
Я потрачу полгода на изучение и смогу после этого зарабатывать в комплютере и самосовершенствоваться?
Аноним 10/10/18 Срд 04:58:31  1277132
>>1275639
Еще куки можно поставить c помощью мета тега:

echo "<meta http-equiv="Set-Cookie" content="NAME=value; EXPIRES=date; DOMAIN=domain_name; PATH=path; SECURE" />";

Но так делать, конечно, не стоит, если только нужно установить куку, а заголовки по какой-либо причине уже были отправлены клиенту и изменить это нельзя.
Аноним 10/10/18 Срд 07:25:42  1277151
1271604324previ[...].jpg (150Кб, 1280x971)
([+] ?[7] ?| ?8)\D?\D?\D?\d\d\d\D?\D?\D?\D?\d\D?\D?\d\D?\d\D?\D?\D?\d\D?\d\D?\D?\D?\d\d

Ммм регулярка...

Аноним 10/10/18 Срд 07:26:47  1277152
proxy.duckduckg[...].jpg (11Кб, 342x342)
>>1277094
>>1277077
>>1277059
Спасибо за ответы, сейчас буду разбираться
Аноним 10/10/18 Срд 07:53:48  1277164
eg.PNG (24Кб, 943x438)
>>1277059
>"/^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$/"
Не работает
Аноним 10/10/18 Срд 07:57:46  1277165
reg2.PNG (21Кб, 937x399)
>>1277059
Работает со знаком вопроса, но наполовину. Больше одного знака не цифры чот не хочет, разве запись "{10}" не относится к символам, отличных от цифры?
Аноним 10/10/18 Срд 08:03:34  1277166
proxy.duckduckg[...].png (2491Кб, 1635x1582)
>>1277094
>>1277059
^\s?(8|\+\s?7)([\s\(-]\d[\s\)-]){10}$
Ололо работает! прекращаю срать в тред и иду разбираться почему работает
Аноним 10/10/18 Срд 08:09:57  1277169
>>1277094
>>1277059
^\s?(8|\+\s?7)([\s\(-]\d[\s\)-]){10}$

Работает со звездочками блин, забыл их дописать в правильный ответ...
Аноним 10/10/18 Срд 10:01:50  1277192
>>1277130
Нет. У тебя откуда-то ошибочное мнение, что можно за полгода вайти-в-айти и начать зарабатывать. Минимум год, если ты умный (судя по вопросам - нет). максимум 2 года, на эту цифру и рассчитывай.
Аноним 10/10/18 Срд 11:32:55  1277223
>>1277192
Ну тут смотря что указывается под "зарабатывать" и "полгода". Если он ежедневно будет задрачивать теорию/кодить часов +6 то на джуна может и вкотиться. Мне кажется на начальном этапе решают больше параметры типа гитхаб + общая адекватность + отсутствие вредных привычек + наличие семьи/ребенка. Будет ЗАРАБАТЫВАТЬ %копейки% и СОВЕРШЕНСТВОВАТЬСЯ %иначе выкинут%.

А потом как у всех.
Аноним 10/10/18 Срд 11:35:15  1277224
15378125750940.jpg (32Кб, 382x362)
>>1277169
Бляяяяяять, разметка! Я обосрался дважды -_- И тот анон тоже ошибся. Вот она, регулярочка:
>^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$
Аноним 10/10/18 Срд 11:35:58  1277226
>>1277224
Обосрался третий раз...
Аноним 10/10/18 Срд 11:40:21  1277230
>>1277226
>Обосрался третий раз...
мы вам перезвоним
Аноним # OP  10/10/18 Срд 12:00:58  1277239
https://youtrack.jetbrains.com/issue/WI-38997

Товарищи пхпшники проголосуйте пожалуйста.
Аноним 10/10/18 Срд 13:13:56  1277270
>>1277239
Опушка, а когда задачки проверять будешь? Ты для многих из нас был главным источником мотивации.
Аноним 10/10/18 Срд 13:34:27  1277279
>>1277270
Это не истинный оп.
Аноним 10/10/18 Срд 14:14:13  1277291
jhjj.png (12Кб, 900x129)
Но ведь достаточно просто имя файла в двойные скобки поместить и все будет прекрасно работать.
Аноним 10/10/18 Срд 14:42:30  1277300
>>1277291

Пруфы? Я лично много лет назад тестировал отдачу файла с именем с кириллицей в разных браузерах. ИЕ тогда интерпретировал содержимое заголовка как текст в Windows-1251, а другие браузеры как utf-8, если не путаю.

Если тебе интересно, например, как проблема решается в Симфони то можно глянуть код тут https://github.com/symfony/http-foundation/blob/master/BinaryFileResponse.php#L156

Пока 100% работающий метод это поместить имя файла в конец ссылки. Ну и для новых браузеров будет работать метод из Симфони.

(кстати там же можно увидеть код, поддерживающий отдачу через X-Accel-Redirect)
Аноним 10/10/18 Срд 15:02:00  1277308
>>1277300
Хм, действительо. Проверил киррилицу в жопере, огнелисе и хроме - работает, а эксплорер хероту выдает.
Аноним 10/10/18 Срд 15:09:44  1277309
Хотя, написал:
header('Content-Disposition: attachment; filename="'.urlencode($data[0]['orig_name']).'"');
и теперь в эксплорере под нужным именем сохраняется. Иероглифы тоже проверил.
someApprentice 10/10/18 Срд 17:34:35  1277349
>>1277072
Я пытался самостоятельно закончить шифровальный мессенджер на JS фреймворке и с PHP на бэкенде, но оказалось, что Angular не способен в server-side rendering с другими языками.

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

https://github.com/angular/universal/issues/1000
https://github.com/angular/universal/issues/1069
https://github.com/angular/universal/commit/c16860c06ed645a0f3a6937191d1f9b7a6e2dc48

Когда я сделал это, я тестировал подгрузку шаблона просто:

$connector->connect('...')->then(function ($connection) use ($loop) {
$options = [
'id' => 1,
'url' => '/',
'document' => '<app-root></app-root>'
];

$connection->write(json_encode($options));

$connection->on('data', function ($data) use ($connection) {
$template = json_decode($data, JSON_OBJECT_AS_ARRAY)['html'];

include __DIR__ . '/../templates/index.phtml';

$connection->close();
});
});


Мне удавалось просто заинклудить шаблон, но проблемы начались когда я начал писать реальный код и установил Symfony, где рендеринг шаблона выполняется через return, и, к тому же, я обнаружил что с Angular server-side rendering даже нет причины использовать PHP, потому что он уже и так всё делает.


Я хотел написать чтобы приложение способно было работать без JS, а JS лишь добавлял плавности для подгрузки и/или перехода между компонентами.
Мне нужно чтобы я мог выдать шаблон с помощью PHP, а JS просто повесился поверх него. Чтобы максимум что мне пришлось сделать для этого, это скомпилировать JS код через Webpack или через что ещё это делают?. Ни больше не меньше!

Такой фронтэнд фреймворк существует? Вы можете посоветовать?

Я готов написать такое приложение и на ES6 и транспилировать его через Babel, чтобы получить поддержку относительно старых браузеров, но, опять же, я не уверен какие библиотеки я должен использовать.

Мне ни один из предложенных гуглом шаблонизаторов не нравится, потому что в них нужно определять шаблон либо как строку, либо как скрипт с типом type="script/name of template engine".

Не совсем ясно какую библиотеку использовать для роутинга - в гугле только одна библиотека по первой ссылке и куча блогов о том как написать собственный, и, наконец, документация по роутингу для Vue.js и ReactJS.

Все это не понятно и нужно тестировать самому.

Может мне просто взять ReactJS? Он подойдет для такой задачи?


А я потратил всё лето на изучение Angular, как напрасно как жаль, эх...
Аноним 10/10/18 Срд 19:25:59  1277389
>>1277349

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

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

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

Есть подход, когда мы рендерим страницы на сервере и пишем JS код, который добавляет им интерактивности (progressive enhancement). Это не очень тебе подойдет, так как это подходит для "сайтов", а не "приложений". И придется дублировать шаблоны в PHP и JS коде.

Что касается, server side rendering - его первоочередная цель - это сделать сайты, построенные на SPA, индексируемыми (что, как мне кажется, проще решить отказом от SPA для таких сайтов).

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

В твоем случае логичнее всего сделать основным режимом SPA, а если хочется поддержка браузеров без JS, то можно поддерживать ограниченный функционал (например, упрощенный просмотр сообщений и упрощенная отправка). Сделать полноценный аналог без JS будет сложно. По таким причинам:

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

2) нужно как-то сохранять состояние при перезагрузках страницы. Представь сценарий: пользователь вводит текст сообщения, затем жмет на кнопку добавления смайлика (которая открывает попап с ними). Нам надо перезагрузить страницу, но не потерять введенный текст. Это сама по себе сложная задача. Какой-то майкрософтовский фреймворк делал так: он в конце выполнения серверного скрипта сериализовал состояние (значения переменных) и вставлял в страницу в виде строки. При выполнении любого действия это состояние (с помощью простого JS) в запросе POST отправлялось на сервер, и значения переменных восстанавливались. Эта штука называлась viewState: https://msdn.microsoft.com/en-us/library/bb386448.aspx

Или представь такой сценарий: пользователь в оффлайне отправляет сообщение, оно сохраняется в localStorage, пользователь закрывает вкладку. Затем пользователь снова открывает вкладку - и в отрендеренной сервером странице этого сообщения нету.

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

Я вижу такие варианты:

- сделать отдельные страницы на отдельных роутах для упрощенной HTML-версии (как в Gmail). Они могут быть сделаны на PHP, или же на JS, но отдельным модулем, и не включены в браузерное приложение.
- вставить в существующие Angular шаблоны условия для отключения лишнего функционала при работе на сервере, скрыть часть элементов страницы (которые не работают без JS), убрать лишние роуты.

По твоему PHP коду: в нем ошибка. Событие data не говорит о том, что все данные приняты. Оно говорит о поступлении куска данных. Ты должен собирать приходящие данные в буфер до получения события end, которое говорит о том, что пир закончил передачу данных и закрыл TCP-соединение на передачу. В ответ на это ты делаешь close(). Также ты должен проверять событие error, которое говорит об ошибке в процессе работы соединения.

Не может быть проблемы из-за этого, что ты не получил все данные до конца?

Также, ты должен прокидывать в ангулар-приложение HTTP-заголовки. Например, авторизационные куки, если они проверяются в приложении.

> Мне удавалось просто заинклудить шаблон, но проблемы начались когда я начал писать реальный код и установил Symfony, где рендеринг шаблона выполняется через return

Напиши, в чем проблемы.

> я обнаружил что с Angular server-side rendering даже нет причины использовать PHP, потому что он уже и так всё делает.

Это тоже вариант - оставить в PHP только API (и, может быть, страницы авторизации/регистрации), а рендеринг страниц мессенджера отдать Node.JS приложению. Почему нет?

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

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

А так, это умеет делать реакт. Можно отрендерить страницу на сервере, и потом к ней подцепить скрипты, когда они загрузятся. Я видел, например, дата-атрибуты в HTML-коде медузы (https://meduza.io) - можешь поковырять, если интересно.

Судя по мануалу, Ангулар умеет что-то похожее: https://angular.io/guide/universal#the-root-appmodule
Это позволяет показать какие-то данные до загрузки кода, но страница будет неинтерактивной (разве что на ней будут работать ссылки и классические формы).

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

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

Это, как мне кажется, умеет и Ангулар, и Реакт.

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

Также, для ускорения загрузки стоит "впекать" часть данных при генерации страницы на сервере. Если приложению после загрузки надо, например, загрузить список контактов, то можно его весь или часть вставить в тело страницы, например в теге script type="application/json" data-url="/api/contacts". Наверно, это как-то можно автоматизировать.

> Я готов написать такое приложение и на ES6 и транспилировать его через Babel, чтобы получить поддержку относительно старых браузеров, но, опять же, я не уверен какие библиотеки я должен использовать.

Babel транспилирует в ES5, для поддержки совсем старых браузеров добавляется ES5 shim, который при удачном стечении обстоятельств позволяет работать коду в ES3 браузерах (стоит только помнить, что совсем старые браузеры могут не поддерживать часть HTML5 тегов и новые CSS правила. Тут нужно тестирование). При этом современным браузерам в идеале хорошо бы отдавать ES6. Ну и при разработке желательно избежать запуска Babel, который не очень быстро работает, а грузить ES6 код напрямую.
Аноним 10/10/18 Срд 20:09:42  1277403
Есть непустой массив $data_success(проверено вардампом).
Есть вывод шаблона через слим :
$response = $this -> view -> render($response,'home.phtml', $data_success);
Есть шаблон home.phtml с кодом:
<? if(isset($data_success)): ?>
Код №1
<? else: ?>
Код №2
<? endif; ?>

Вопрос: почему всегда отображается код номер два?
Аноним 10/10/18 Срд 21:21:48  1277425
>>1277403
Сам разобрался. Анальный фреймворк все переданные значения переименовывает автоматически.
someApprentice 11/10/18 Чтв 00:25:29  1277500
>>1277389
>То есть ты можешь, например, отрендерить на сервере страницу со списком контактов и последними сообщениями, а потом подцепить к ней приложение. Причем отрендерить стоит упрощенную версию страницы, чтобы пользователь не тыкал зря на неработающие кнопки. Сделать контакты ссылками - это позволит переключаться между ними. Сделать форму отправки классической HTML формой.
>
>А после подгрузки JS кода будут отрендерены дополнительные элементы, нажатия на контакты будут обрабатываться приложением, как и форма отправки сообщения.
А вот моё "черновое" приложение чата на чистом JS, как раз так и работало: - сначала отдавалась отрендеренная страница на PHP, а потом инициализировался JS, и все переходы по контактам, подгрузка новых или старых сообщений, и поиск контактов происходили "плавно" (если не считать времени на получение сообщений через http и дешифровку). Кстати, и если отключить JS в браузере, то можно так же было отправлять сообщения из той же формы, искать контакты, и подгружать старые сообщения, переходя по ссылке которая при включенном JS скрывалась при скролле вверх. Только это было моей первой работой и код получался запутанным. Хотелось бы, с моими новыми знаниями о JS, написать что-то погибче, используя современные инструменты и протоколы.


>В твоем случае логичнее всего сделать основным режимом SPA, а если хочется поддержка браузеров без JS, то можно поддерживать ограниченный функционал (например, упрощенный просмотр сообщений и упрощенная отправка). Сделать полноценный аналог без JS будет сложно. По таким причинам:
>
>1) любое действие требует перезагрузки страницы. Ну представь, например, фильтр по контактам, работающий по мере набора текста - это нельзя сделать без JS (только если превратить его в классическую форму с кнопкой). Или например открывающийся интерактивно попап для выбора смайликов.
>2) нужно как-то сохранять состояние при перезагрузках страницы. Представь сценарий: пользователь вводит текст сообщения, затем жмет на кнопку добавления смайлика (которая открывает попап с ними). Нам надо перезагрузить страницу, но не потерять введенный текст. Это сама по себе сложная задача. Какой-то майкрософтовский фреймворк делал так: он в конце выполнения серверного скрипта сериализовал состояние (значения переменных) и вставлял в страницу в виде строки. При выполнении любого действия это состояние (с помощью простого JS) в запросе POST отправлялось на сервер, и значения переменных восстанавливались. Эта штука называлась viewState: https://msdn.microsoft.com/en-us/library/bb386448.aspx
Ну вот, как у меня и было, в случае с поиском контактов, можно сделать классическую форму с кнопкой, затем, при инициализации JS, отменить интерфейс её отправки и обрабатывать эту форму уже с помощью самого JS.
В случае со смайлами, можно с сервера отрендерить форму без кнопки смайлов, а после загрузки JS, плавно вывести её (а при JS роутенге можно выводить её сразу).

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

В общем, везде можно придумать что-то.

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


>> я обнаружил что с Angular server-side rendering даже нет причины использовать PHP, потому что он уже и так всё делает.
>Это тоже вариант - оставить в PHP только API (и, может быть, страницы авторизации/регистрации), а рендеринг страниц мессенджера отдать Node.JS приложению. Почему нет?
А можно и API написать на Node.js. Только я не умею писать сервера, а в мануале по Angular'у написано что их пример сервера не безопасен https://angular.io/guide/universal#universal-web-server

>This sample server is not secure! Be sure to add middleware to authenticate and authorize users just as you would for a normal Angular application server.

Или я что-то путаю?


Так как мне следует поступить? Я склоняюсь к тому чтобы попробовать React, и если с ним не получится, то написать на ES6, и если и на нём не получится, то на Node.js уж железно получится написать приложение на Angular'е!
someApprentice 11/10/18 Чтв 00:27:14  1277501
1-pic.png (151Кб, 1920x1080)
2-pic.png (217Кб, 1920x1080)
>>1277389
>Я вижу такие варианты:
>
>- сделать отдельные страницы на отдельных роутах для упрощенной HTML-версии (как в Gmail). Они могут быть сделаны на PHP, или же на JS, но отдельным модулем, и не включены в браузерное приложение.
То есть сделать, например роут '/conversation/:id/' отдельно на PHP и отдельно на JS? Как понять отдельным модулем? Отдельным от чего? Как модули JS могут быть не включены в браузерное приложение? То есть, имеется ввиду, пререндерить сначала модуль, например, на Node.js?


>По твоему PHP коду: в нем ошибка. Событие data не говорит о том, что все данные приняты. Оно говорит о поступлении куска данных. Ты должен собирать приходящие данные в буфер до получения события end, которое говорит о том, что пир закончил передачу данных и закрыл TCP-соединение на передачу. В ответ на это ты делаешь close(). Также ты должен проверять событие error, которое говорит об ошибке в процессе работы соединения.
>
>Не может быть проблемы из-за этого, что ты не получил все данные до конца?
Я конечно же об это знал, что сокеты могут отправить сигнал о завершении трансляции, но в этом случае не подумал об этом, потому что так было в примере предложенным самими разработчиками этого инструмента, и мне самому очень не понятно как устроен серверный код Angular'а и JS.

https://github.com/angular/universal/issues/1000

>import * as net from 'net';
>
>const client = net.createConnection(9090, 'localhost', () => {
> const renderOptions = {id: 1, url: '/path',
> document: '<app-root></app-root>'} as SocketEngineRenderOptions;
> client.write(JSON.stringify(renderOptions));
>});
>
>client.on('data', data => {
> const res = JSON.parse(data.toString()) as SocketEngineResponse;
> server.close();
> done();
>});

Здесь нет проблемы с получением данных, потому что я проверял вывод шаблонов без Symfony и всё было в порядке.1-pic

>Также, ты должен прокидывать в ангулар-приложение HTTP-заголовки. Например, авторизационные куки, если они проверяются в приложении.
Я не знаю как это сделать и думаю что информации об этом не существует. Я вспоминаю вот это обсуждение по этому поводу https://github.com/angular/universal/issues/1000#issuecomment-391463462

>>What are your thoughts about cookies?
>I havn't put any effort into cookies just yet, but that's definitely something we can add onto these new additions. Right now i'd just like to keep it simple and make sure it solves the problems that people have with Universal on other platforms.

Кстати, полноценная возможность коммуникации Angular Universal с другими языками ещё только в разработке https://github.com/angular/universal#in-progress

>Node.js bridge protocol to communicate with different language backends - Django, Go, PHP etc.

Интересно как это будет и избавит ли это меня от текущих проблем.


>> Мне удавалось просто заинклудить шаблон, но проблемы начались когда я начал писать реальный код и установил Symfony, где рендеринг шаблона выполняется через return
>Напиши, в чем проблемы.
В том что шаблон я получаю в асинхронной функции, а в Symfony я могу отрендерить его только в синхроном коде контроллера, вызвав return.2-pic


>Если тебя беспокоит скорость загрузки JS кода и потребление трафика при загрузке (типичная проблема для SPA приложений), то я бы думал об его разделении на части и уменьшении. Ну, условно говоря, если у нас есть страница настроек, нам не надо подгружать контроллер и шаблон для нее сразу - можно это сделать, когда пользователь ее откроет. Вебпак позволяет разделять код на бандлы.
В Ангуляре есть ленивая подгрузка роутов когда модули загружаются только когда они нужны. Не уверен только как именно это работает - лениво загружается код по сети или лениво загружается инициализация модулей. Мне ещё предстоит узнать, какую конкретно играет роль Webpack по отношению к Ангуляру.

https://angular.io/guide/router#milestone-6-asynchronous-routing


>> Я готов написать такое приложение и на ES6 и транспилировать его через Babel, чтобы получить поддержку относительно старых браузеров, но, опять же, я не уверен какие библиотеки я должен использовать.
>Babel транспилирует в ES5, для поддержки совсем старых браузеров добавляется ES5 shim, который при удачном стечении обстоятельств позволяет работать коду в ES3 браузерах (стоит только помнить, что совсем старые браузеры могут не поддерживать часть HTML5 тегов и новые CSS правила. Тут нужно тестирование). При этом современным браузерам в идеале хорошо бы отдавать ES6. Ну и при разработке желательно избежать запуска Babel, который не очень быстро работает, а грузить ES6 код напрямую.
Разве Babel не транспилирует ES6 ещё? Почему-то его оффициальный сайт не открывается.
someApprentice 11/10/18 Чтв 00:37:20  1277505
>>1277501
* на изображении 2-pic нужно обратить внимание на переменные заголовка (title) - в PHP шаблоне выведется 'Symfony', а в Angular выведется 'ng'.
Аноним 11/10/18 Чтв 12:50:01  1277618
MegaFun.png (53Кб, 1920x1052)
После уныло-похоронного списка студентов обменник решил сделать поярче. Жаль только, что я вообще никак не могу понять, как сменить стиль поля выбора файла.
Аноним 11/10/18 Чтв 13:21:21  1277622
>>1268753 (OP)
Ребят, у меня вопрос по организации процесса разработки - деплоя. Хотелось бы узнать как вы это автоматизируете и увидеть на реальных примерах весь процесс.
Как я делаю это сейчас: есть у меня несколько сайтов. Поменял я, допустим, какой-то код, сохранил файл, закоммитил и залил через ide на рабочий сервер.
Может кто-нибудь подробно расписать как это всё автоматизируется, чтобы сам процесс загрузки изменённых файлов на рабочий сервер происходил автономно, а от разработчика требовался только коммит в мастер ветку, например.
Аноним 11/10/18 Чтв 15:23:00  1277681
>>1277618
Аниме-дитя, ты?
Аноним 11/10/18 Чтв 15:32:12  1277688
[Glue] Amanchu![...].png (4260Кб, 1920x1080)
>>1277681
Сам ты аниме.
Аноним 11/10/18 Чтв 18:01:54  1277780
117dda9d2311bb2[...].jpg (243Кб, 630x330)
Сиськи! Внимание! Молния! Внимание привлек)
Вопрос: Может кто нибудь подсказать как открыть сайт для любого пользователя?
Надо что бы можно было прописать ip , порт и подключится с любого компьютера
Аноним 11/10/18 Чтв 18:35:33  1277797
>>1277780
>Сиськи! Внимание! Молния! Внимание привлек)
Укатывайся обратно к себе на пикабу, сын собаки сутулой.
Аноним 11/10/18 Чтв 18:50:31  1277809
>>1277780
Как вариант, можно сделать авторизацию на уровне apache-сервера с помощью .htaccess
Аноним 11/10/18 Чтв 23:36:53  1277922
UKevggrHgkA.jpg (131Кб, 708x1000)
Анончик здравствуй, начал вкатыватья в кодинг, решил пощупать пхп. Сейчас иду по ньюби гайду в шапке.
Решил задачку https://ideone.com/e.js/o57cn0
Все хорошо, но не выполняется условие в 13 строке, не могу понять чому. Уже поздно и мб я в глаза ебусь, но сколько не разбираю непонятно. Хэлп.
Аноним 11/10/18 Чтв 23:52:46  1277927
хы.jpg (92Кб, 862x599)
>>1277922
Да вроде выполняется всё.
Аноним 11/10/18 Чтв 23:54:52  1277928
>>1277927
я "и" перепутал с "или"
лел
Аноним 12/10/18 Птн 05:59:44  1277977
>>1269893
Норм синтаксис, вот $a жуть.
Аноним 12/10/18 Птн 10:09:34  1278013
Существует достойная опен сорс бесплатная замена пхпшторму?

Я так понимаю нетбинс более менее норм?
Аноним 12/10/18 Птн 10:43:05  1278019
не понял почему остаток от деления работает так:
50 % 100 = 50, тут же нет остатка?
Аноним 12/10/18 Птн 10:50:12  1278022
>>1278019
Ты 50 делишь на 100, остаток сразу есть.
Аноним 12/10/18 Птн 10:51:31  1278023
>>1278019
Не волнуйся, вы это пройдете в 6-м классе.
Аноним 12/10/18 Птн 10:56:33  1278024
>>1278022
посмотрел в вики, оказалось что это не тривиальная операция, остаток - это типа частичка которая дополняет неполное частное, при этом поведение при отрицательных числах тоже не тривиально, тут надо смотреть формулу, а не интуитивно понимать.
9/90 = 90 * 0 + 9
Аноним 12/10/18 Птн 10:58:13  1278025
>>1278023
сьеби, токсичный даун
Аноним 12/10/18 Птн 13:13:19  1278054
Охренеть imagick медленный. Сделал анимированные превьюхи для гифок через него, так он их генерирует секунды три.
Аноним 12/10/18 Птн 15:06:57  1278112
>>1278054
гореть в аду такому бордописателю
мимо
Аноним 12/10/18 Птн 17:22:44  1278182
Пытаюсь парсить сайт curl'ом.

Заменил ссылки в html, чтобы обращения шли не к localhost, а к сайту. Всякие css и js файлы подключил, в общем:
$content = str_replace('href="/', 'href="https://site.com/', $content);
$content = str_replace('src="/', 'src="https://site.com/', $content);

Но оказалось, что остались еще post- и get-запросы с относительными ссылками, которые в итоге тоже обращаются к локалхосту. Как перенаправлять их на site.com?
Аноним 12/10/18 Птн 18:12:08  1278206
>>1277797
Ты хентай 90-х
Аноним 12/10/18 Птн 18:44:47  1278222
>>1278182
Всё перегуглил. Нужно что-то отправлять в http-заголовках, как я понял, но что конкретно уже не понимаю.

Как заменить Request URL: http://localhost/al_im.php
На Request URL: https://site.com/al_im.php ?
Поменять отправляемый заголовок Host: localhost? Я пробовал:
curl_setopt($ch, CURLOPT_HTTPHEADER, "Host: site.com");
Но ничего не поменялось. Кажется, оно даже не отправилось.
Аноним 12/10/18 Птн 20:46:12  1278306
>>1278222

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

Аноним 12/10/18 Птн 23:56:02  1278382
>>1278306
Вот тег твой очень помог, а я вообще даже не думал смотреть в сторону html. А метод был корявым, потому что этого для начала хватало и альтернатив я не знал.

Буду теперь искать, как Access-Control-Allow-Origin обойти. Это же возможно?
Аноним 13/10/18 Суб 12:23:50  1278487
14825424996810.jpg (477Кб, 1536x2048)
Заметил за собой, что невнимательно читаю условия задачи. Так бы времени экономил огого.
Аноним 13/10/18 Суб 12:57:05  1278489
>>1278382
>Это же возможно?
В общем случае нет.
Аноним 13/10/18 Суб 18:41:39  1278562
Задачу про ТестХаб хоть кто-нибудь полностью делал? Выглядит слишком долгой для аттенш спана среднестатистического мейлачера-вкатывальщика.
Аноним 13/10/18 Суб 18:58:29  1278576
>>1278222
>al_im.php
У вк есть API.
Аноним 13/10/18 Суб 19:09:06  1278585
>>1278562
Я тут читал архивач в глубь, там был разговор на эту тему. К тому времени как упорные аноны берутся за эту задачу, они уже начинают ходить по собеседованиям и как правило находят работу.
Аноним 13/10/18 Суб 19:40:52  1278596
>>1278562
Я тоже читал часть старых тредов (на phpclub.tech), никто даже на процентов 30 не реализовывал того, что описано в задаче, только самые базовые вещи, которые средний разраб накидает за вечер.

>>1278585
Так и есть, если реализовать полностью ту задачу с полным покрытием тестами и деплоем, то можно апплаиться на junior+/middle-
Задачу очень долго делать и не очень понятно зачем, если с такими навыками уже можно получать деньги.
Аноним 13/10/18 Суб 21:50:50  1278643
У кого нибудь есть идеи почему у меня в travis не получается законектиться с postgres?
Вылетает вот такая ошибка:

In Db.php line 506:

Db: SQLSTATE[08006] [7] could not connect to server: Connection refused
Is the server running on host "postgres" (172.18.0.4) and accepting
TCP/IP connections on port 5432? while creating PDO connection

https://travis-ci.com/Qevg/filehosting/builds/87855623
На локалке все работает, а в travis нет
postgres из official image конфиги там правильные
думал может проблема в том, что postgresql(сервис) не успевает запуститься сделал https://github.com/Qevg/filehosting/blob/master/.docker/postgres/wait-for-postgres.sh как в доке написано https://docs.docker.com/compose/startup-order/
Но это не помогло или я неправильно его сделал (https://travis-ci.com/Qevg/filehosting/builds/87855849) filehosting.site | Postgres is up - executing command показывает уже после того как codeception запустился. Есть у кого идеи что не так?
https://github.com/Qevg/filehosting
https://travis-ci.com/Qevg/filehosting/builds


Если кому не лень попробуйте у себя запустить. Нужен git, docker, docker-compose, composer
git clone https://github.com/Qevg/filehosting.git
cd filehosting
composer install
make configure-docker-testing
docker-compose -f docker-compose.testing.yml build
docker-compose -f docker-compose.testing.yml run --rm codecept run

и в /etc/hosts 127.0.0.1 filehosting.site
Аноним 13/10/18 Суб 22:50:50  1278644
>>1278643
>https://github.com/Qevg/filehosting
Вообще в докеркомпостер конфиге можно определить ГЛАВНЫЙ сервис, например, в котором поднимается php-fpm делается копосер инсталл и вообще хранится код, когда этот сервис соберется то остальные уже должны будут собранными быть
Аноним 13/10/18 Суб 22:52:19  1278645
>>1278644
UPD:
app:
build:
context: docker/php7-fpm
volumes:
- ./:/var/www/site:cached
depends_on:
- mysql
- mongodb
- beanstalkd
Аноним 13/10/18 Суб 23:28:04  1278651
Вкатился на первую работу еще на ругулярках кажется.
В итоге с перерывами уже 3 года кожу по сути. Дальше вектора в итоге не дошел в силу лени и неусидчивости.
Аноним 14/10/18 Вск 00:56:41  1278673
>>1278643

Прочел ли ты примечания к пункту depends_on?

https://docs.docker.com/compose/compose-file/#depends_on

И от это: https://docs.docker.com/compose/startup-order/

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

Читаем мануал:

> To handle this, design your application to attempt to re-establish a connection to the database after a failure.

Это так разработчики Докера вежливо написали, что проблему решать не собираются.

То бишь они советуют сделать в приложении реконнект (я думаю, нет: этот совет рассчитан на приложение, которое работает как сервер и в фоне поддерживает пул соединений). Но в твоем случае лучше перед запуском codecept влепить баш скрипт, который тестирует (через клиент ком. строки или php скрипт) наличие соединения.

Получается, ты wait-for-postgres не туда влепил. Нгиксу-то что, ему постгрес даром не нужен.

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

Зависимости будут такие:

- codecept зависит от nginx, postgres, redis, sphinx, chrome
- nginx зависит от php

Кстати, я не очень понял, а то, что написано в command - оно внутри докер-контейнера запускается или на хосте? Если внутри, то откуда в контейнере нгинкса есть psql? (вопрос от человека, никогда не пользовавшегося докером)

И еще. Я вижу, у тебя там php компилируется. Это каждый раз будет происходить? Я хотел было дать совет кешировать папку с образами докер, но в мануале тревиса написано противоположное: https://docs.travis-ci.com/user/caching/#things-not-to-cache
Аноним 14/10/18 Вск 01:01:15  1278675
>>1278596

Middle во многих компаниях это года 3 опыта, желательно на фреймворках. Задачу делать, конечно же, имеет смысл - ОП поможет тебе писать большие приложения правильно, соблюдая все лучшие практики, а не наобум.
Аноним 14/10/18 Вск 06:35:26  1278719
>>1277780

Это не так просто, так как ты скорее всего за NAT провайдера и снаружи к тебе не подсоединиться.

Выше давали ссылку на сервис, который позволяет это обойти за счет проксирования: https://ngrok.com/

>>1277622

Самый простой способ - деплой через гит. На сервере добавляешь в git hook баш-скрипт, который при пуше делает нужные действия: composer install, cache:warmup (для Симфони), прогон миграций итд. Не забудь set -e и проверку на ошибки в скрипте, так как баш скрипт по умолчанию при ошибке продолжает выполнять следующие команды.

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

Для атомарного деплоя (для нагруженных сайтов) придется заморочиться: создаем новую папку, копируем файлы в нее, выполняем там все нужные команды, переключаем на сервере корневой каталог на новую папку. Плюс - возможность так же атомарно откатиться на старую папку.

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

Более сложные способы - освоить ansible например. Он понадобится, когда у тебя будет не один, а больше серверов.

Больше ссылок:

- https://toster.ru/q/305788
- https://www.youtube.com/watch?v=qMu4YHJV1Z8 / https://www.slideshare.net/BadooDev/5-php-70464795 (заблокирован в РФ)
Аноним 14/10/18 Вск 06:35:56  1278720
>>1277618

Почти никак. В стандарте сказано, что для элементов форм браузер сам решает, какие стили применять, а какие игнорировать. Разве что размер и цвет можно поменять. Что делать? Можно взять кастомное поле. Рисуем свою кнопку, поверх нее кладем прозрачный инпут, при выборе файла выводим яваскриптом имя. Плюс - любая кастомизация, минус - можно ухудшить элемент, может каком-то браузере стандартный лучше выглядит и работает.

>>1277501

Давай я еще раз объясню возможные сценарии.

1) Главное у нас JS приложение. Браузеры без JS получают упрощенные HTML версии отрендеренных на сервере страниц

Запускаем на сервере наше JS-приложение. Пользователь заходит на главную, приложение пререндерит ему упрощенную главную страницу, отдает. Дополнительно отдает JS-код. Если браузер поддерживает JS, то код запускается и прицепляется к странице, делая ее полноценной.

Когда пользователь куда-то жмет, код перехватывает нажатие, получает данные через АПИ и отрисовывает на стороне браузера. Если у пользователя отключен JS, то при нажатии происходит переход по ссылке и упрощенная страница рендерится на сервере.

PHP тут отвечает только на запросы к API. Этот роутинг между PHP и JS можно настроить на нгинксе.

2) Есть отдельная упрощенная версия приложения

Запускаем на сервере наше JS-приложение. Пользователь заходит на главную, получает пустую страницу + ссылку на упрощенную версию (/html/) + JS код. Если он поддерживает JS, то приложение запускается и рисует в браузере интерфейс. Если нет - то он жмет на ссылку (или редиректится автоматом) на упрощенную версию.

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

PHP тут отвечает только на запросы к API

> То есть сделать, например роут '/conversation/:id/' отдельно на PHP и отдельно на JS?

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

Если пользователь зашел напрямую на этот URL - он получает HTML страницу + JS приложение (на случай если у него включен JS). Если же пользователь внутри JS приложения нажимает на контакт, то никаких страниц не загружается, а приложение отправляет запрос к АПИ и своими силами выводит данные.

То есть роут и шаблон будет один - в JS приложении. Но оно может работать как в браузере (если в нем включен JS), так и на сервере.

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

> Как понять отдельным модулем?

Если ты решил сделать отдельные, упрощенные версии страниц на отдельных URL (/html/conversation/:id/), то код для них незачем включать в браузерное приложение - он нужен только на сервере (и наоборот, код для отображения полноценных страниц в браузере не нужен на сервере). Логично разделить код на "бандлы" и не отправлять серверный "бандл" в браузер.

> Как модули JS могут быть не включены в браузерное приложение?

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

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

Я понимаю так: в ангуларе есть модуль platform-server. Он предоставляет функцию https://angular.io/api/platform-server/renderModuleFactory, которая берет HTML-код (пустышку с тегом <app-root>), URL, и рендерит в него содержимое данной страницы, как браузере. Также, в platform-server есть простейшая эмуляция браузерных API вроде document, DOM, window, location, чтобы код не падал с ошибкой из-за их отстутствия.

Ты берешь

1) Node.JS
2) модуль platform-server
3) свое ангулар-приложение

И добавляешь к ним небольшой вспомогательный скрипт. Этот скрипт поднимает HTTP-сервер, принимает HTTP-запросы от браузера и вызывает renderModuleFactory, которая настраивает окружение, вызывает твое приложение и оно рендерит запрошенную страницу. И отдает назад в браузер. То есть на сервере выполняется по сути тот же код, что в браузере, и рендерится статическая HTML страница. И почти без усилий ты получаешь серверную версию своего ангулар-приложения для браузеров без JS.

Твое приложение думает, что оно запущено в браузере, и работает точно так же. Шлет запросы к АПИ, берет шаблон, отрисовывает данные в нем (упс, не знаю, как там с промисами - не отрисует ли приложение просто индикатор загрузки, не дождавшись ответа АПИ?).

Описано тут: https://angular.io/guide/universal#how-it-works

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

Это не значит, что код 100% корректный. Может, у тебя просто время передачи данных было такое, что они передались одним блоком. Плюс, ты наверно передавал данные на локалхосте между 2 процессами, почти без задержек.

Код некорректный. Событие data обозначает приход одной порции данных (причем размер порции никак не документирован и зависит от многих факторов), а не всех переданных данных. У тебя просто так вышло, что данные влезли в одну порцию.

Кстати, у тебя там server.close() вместо client.close().

> Я не знаю как это сделать и думаю что информации об этом не существует.

Даже если ее не существует, если понимать, как Angular universal работает, то можно попробовать придумать решение.

Тебе приходит HTTP-запрос от пользователя. В нем есть куки. Твое ангулар-приложение скорее всего использует их 2 путями:

- извлекает из document.cookie и что-то делает
- отправляет аякс-запросы, к которым они прикрепляются в браузере автоматически

На сервере, естественно, этого всего по умолчанию нет.

В platform-server наверно есть какая-то эмуляция видимых из браузера кук (document.cookie). Тебе надо их в нее как-то передать. Если там нет эмулции кук - придется сделать или найти библиотеку для этого.

Плюс, в platform-server есть эмуляция XMLHttpRequest для отправки аякс-запросов. Нужно как-то куки и туда прокинуть, если твое АПИ как-то их проверяет (вот мы и поняли, почему авторизация в АПИ без кук в данном случае удобнее).

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

Я погуглил по "angular platform-server pass cookies".

Судя по https://github.com/angular/angular/issues/15730 - возможность прокинуть куки есть, хоть и с багами.

> Кстати, полноценная возможность коммуникации Angular Universal с другими языками ещё только в разработке

В описанном мной варианте она не нужна.

> В том что шаблон я получаю в асинхронной функции, а в Symfony я могу отрендерить его только в синхроном коде контроллера

Ты получаешь шаблон (точнее, HTML код) из сокета. Используй синхронную библиотеку или функцию для работы с сокетами. Например: socket_create() + fwrite() в цикле (он с первого раза может не записать все данные) + stream_get_contents(). Не забудь проверку на ошибки. Ты разве не работал с сокетами Беркли, с TCP?

Там JS код для Ноды, он асинхронный. В PHP мы можем писать синхронный код и не мучаться.

> Разве Babel не транспилирует ES6 ещё?

Да, он транспилирует ES6 в ES5. А к ES5 коду мы можем добавить ES5 shim дял браузеров, которые поддерживают только ES3, и надеяться, что это заработает. Если не заработает - давать им HTML версию.

Если у тебя есть время, я бы советовал полностью разобраться в этом. Так как пока есть пробелы в знаниях. Я всегда готов ответить на вопросы и пояснить.
Аноним 14/10/18 Вск 06:36:27  1278721
>>1277500

> сначала отдавалась отрендеренная страница на PHP, а потом инициализировался JS, и все переходы по контактам, подгрузка новых или старых сообщений, и поиск контактов происходили "плавно" (если не считать времени на получение сообщений через http и дешифровку).

Так тоже можно, пока приложение простое. Как только оно превращается в полноценное MVC приложение, начинает само хранить данные, рендерить их в шаблон, работать в оффлайне - получается дублирование кода - тебе нужен одинаковый шаблон в PHP и в JS, одинаковый код для обработки данных, одинаковые классы и там, и там.

Если твой код просто посылает аякс-запрос на сервер, получает HTML, вставляет его в DOM (или делает небольшие изменения через jQuery) - это работает. Но если ты хочешь в браузере работать с моделями и рендрить их в шаблоны - это уже не работает. Так как у тебя получается дублирование кода.

>>Или представь такой сценарий: пользователь в оффлайне отправляет сообщение, оно сохраняется в localStorage, пользователь закрывает вкладку. Затем пользователь снова открывает вкладку - и в отрендеренной сервером странице этого сообщения нету.

> Тут нужно сначала определить, где именно будут хранится сообщения... Или, если это не имеет значения, то всегда отправлять сообщения из localStorage на сервер при восстановлении соединения и обновлять вкладку.

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

> А можно и API написать на Node.js

Тогда можно на PHP. По идее синхронный код на PHP написать проще. Хотя асинхронный с ReactPHP (или с нодой, или с Го) будет быстрее, что важно для мессенджера. Ну и сложные задачи ведь интереснее.

> Только я не умею писать сервера

Надо изучить сокеты Беркли и попробовать что-то написать. Я могу придумать задачку. Для начала: сделай 2 приложения, клиент и сервер. Сервер открывает порт X, слушает его, принимает соединение, выводит, все, что передано, в консоль, закрывает соединение, ждет следущее и так бесконечно. Клиент при запуске соединяется с сервером на порту X и передает указанное в аргументах командной строки сообщение.

Писать можно на любом языке, синхронно или асинхронно.

Если вдруг ты это уже делал и знаешь, и хочешь писать именно на Ноде, то изучай express например. Сделай на нем hello world.

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

> Я склоняюсь к тому чтобы попробовать React, и если с ним не получится, то написать на ES6, и если и на нём не получится, то на Node.js уж железно получится написать приложение на Angular'е!

Ты по моему смешал все в кучу. ES6 - это версия JS, а React/Angular - фреймворки. Писать можно на любом.

> то на Node.js уж железно получится написать приложение на Angular'е!
Angular предназначен для браузера. На ноде он запускается только для серверного рендеринга и это дополнительная фича, а не основное предназначение. На сервере, если ты пишешь чисто серверное приложение, ни ангулар, ни реакт не нужны, это оверинжиниринг, там хватит обычного шаблонизатора, коих под ноду предостаточно.

Не путай:

- обычный шаблонизатор: получает данные и шаблон, рендерит HTML. Самое то для сервера.
- ангулар/реакт: получает данные ("модель" или view model, что точнее) и шаблон, рендерит, записывает в DOM, данные меняются, он снова рендерит и снова обновляет ДОМ. Так пока пользователь не закроет вкладку. Самое то для браузерного приложения.

Разница между реакт и ангулар в том, как они ищут изменения.

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

Ну и еще, реакт это только библиотека для view, а англуар это полноценный фреймворк, который предоставляет еще например DI, и многое другое.
Аноним 14/10/18 Вск 06:40:26  1278722
>>1277500

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

Ты делаешь форум - один подход. Делаешь сайт с редко менябщейся документацией - другой. Делаешь интерактивное приложение (мессенджер) - третий.
Аноним 14/10/18 Вск 16:33:54  1278969
>>1278651
> В итоге с перерывами уже 3 года кожу по сути. Дальше вектора в итоге не дошел в силу лени и неусидчивости.
А на работе как дела? Часто нагоняй получаешь от ТимЛида?Повышали зп? Менял место работы?
Аноним 14/10/18 Вск 17:11:49  1278975
Сап, двач! Есть ли кто-то, кто разрабатывает на php с freebsd?

Какие подводные? Заведётся ли докер? Вообще, стоит ли пробовать такое?
Аноним 15/10/18 Пнд 12:15:57  1279357
Анчоусы, надо сгенерировать письмо юзеру со ссылкой на опрос. Его он может пройти без авторизации, почему надо создать в БД запись user_id => hash и в ссылку на опрос этот хэш поместить.
Вопрос: как создавать этот хэш? Какой функцией или алгоритмом?
Аноним 15/10/18 Пнд 13:00:56  1279387
>>1279357
Функцию hash() не пробовал?
Аноним 15/10/18 Пнд 13:13:26  1279394
Зачем в абстрактных классах доступны приватные методы/свойства? Какой в этом смысл? Ведь объект абстрактного класса не может быть создан, а его дочерние классы не могут получить доступ к приватным методам и свойствам.

Или могут и я где-то проебался?
Аноним 15/10/18 Пнд 13:14:58  1279395
>>1279387
Вот загуглил про нее, думаю какой алгоритм теперь выбрать.
Алао на счёт соли непонятно: как ее сгенерить и какой длины, подставлять в начало или конец, можно ли хранить ее как константу класса или обязательно в БД?
Аноним 15/10/18 Пнд 13:16:38  1279399
>>1279394
Приватные функции родительского абстрактного класса могут использоваться в защищённых функциях в нем же. А доступ к защищённым есть у дочернего класса.
Аноним 15/10/18 Пнд 13:32:03  1279420
eVoExyk[1].png (5Кб, 227x222)
63exFpF[1].png (8Кб, 259x288)
gqQhQT7[1].png (10Кб, 258x364)
>>1279394
Пожалуй, поясню немного. Вот какой смысл в этой хуйне? Чтобы что? Пик 1

Лол, пока формулировал вопрос - разобрался (относительно). Пик 2 - работает, но я не очень понимаю как, почему и за счёт чего.

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

Почему если я реализую в ребёнке идентичный по коду метод, то он не будет работать, а унаследованный от родителя - будет? Пик 3. Если вместо $this в 22 строке использовать parent::, то ничего не изменится.

>>1279399
Не до конца уверен, что правильно осознал написанное, но пока аутировал тут - на мой вопрос ответили. Ну и хуй с ним, всё равно вкину в тред, может, кому-то другому поможет наблюдение за ходом моей мысли.
Аноним 15/10/18 Пнд 13:54:03  1279436
yIaTUc1[1].png (10Кб, 226x343)
ICFUC5b[1].png (6Кб, 1364x247)
Да, я определенно нихуя не понял. Оставим методы в стороне, поговорим о свойствах. Мною происходящее воспринималось примерно так, что свойство - часть объекта. То есть, на основании класса К1 мы лепим объекты О1К1 О2К1 О3К1 и т. д, каждый из них "строится по классу" и, значит, содержит в себе те или иные свойства, методы для манипуляции с ними и т. д.

Но при вскрывшхиося обстоятельствах получается вот есть. Есть класс АК (абстрактный класс), он содержит приватное свойство $prop. Он же (АК) содержит метод pub_fn(), который меняет значение $prop и выводит его на экран. На основе АК мы создаём другой класс, К1. Делаем объект О1К1, вызываем его функцию pub_fn(), которую его класс унаследовал от АК1, свойство меняется и выводится. Создаём О2К1, свойство меняется и выводится.

Но где, блжард, это свойство находится? Оно вообще часть чего? Если оно часть объекта, то с хуя ли внутри класса К1 не получается получить к нему доступ через $this? Мой взгляд, который заключался в том, что объект - это некая единая сущность, которая просто "собирает воедино весь код относящихся к нему классов" (ну, типа, есть АК (абстрактный класс), там объявлено свойство $prop, это свойство - часть объекта, этой частью объекта мы можем манипулировать и из класса К1, который унаследован от АК) - тупое говно тупого говна? Видимо, объект - это какая-то такая не очень цельная хуита, в которой, условно говоря, каждый класс имеет некую свою область видимости не связанную со внешним миром?

То есть, $this - не указание на объект как таковой, а указание на "ту часть объекта, которая связана с этим классом"?
someApprentice 15/10/18 Пнд 19:36:34  1279602
>>1278720
>>1278721
Мне нравится 3-ий вариант с дублированием кода, но я не могу понять, почему это плохо - это плата за то чтобы опыт пользователя был максимально комфортным.

В отличие от первых двух вариантов, не нужно иметь отдельно и JS и PHP приложения на сервере, а можно обойтись чем-то одним - либо PHP, либо JS.

И к тому же, всё равно не получится не дублировать код. Допустим в упрощенной HTML версии есть формы (поиск или отправка сообщения), их всё равно нужно будет обработать на сервере так же как и в фронтенд JS приложении. Разве это не так?

Если не существует универсальной архитектуры, то почему бы не применить и такой способ?


Однако, как я уже писал, первые два способа можно улучшить, отказавшись от PHP и писать API на Node.js.

И даже можно ещё сильнее улучшить это, отрисовав Angular приложение на сервере Node.js, и тогда не придётся дублировать код. Только придётся самому написать библиотеку для проброса кукисов и не ясно какой ответ будет от запросов отправленных с упрощенной HTML страницы, и как там с промисами. Но об этом позже.

>> Я склоняюсь к тому чтобы попробовать React, и если с ним не получится, то написать на ES6, и если и на нём не получится, то на Node.js уж железно получится написать приложение на Angular'е!
>Ты по моему смешал все в кучу. ES6 - это версия JS, а React/Angular - фреймворки. Писать можно на любом.
Я имел ввиду, что у меня есть три варианта на чем написать приложение.

1) PHP (Symfony) + React на фронтенде

+Использование популярного фронтенд фреймворка
+Сверх быстрая отрисовка DOM

-Нужно изучить React, чтобы понять может ли он подхватывать отрендеренную на сервере HTML страницу и дальше работать как SPA приложение
-Дублирование серверного и клиентского кода

2) PHP (Symfony) + нативное ES6 приложение на фронтенде

+Не нужно ничего изучать

-Вспомогательные библиотеки могут не соответствовать заданным требованиям
-Дублирование серверного и клиентского кода

3) Node.JS + Angular

+Использование популярного фронтенд фреймворка
+Возможность подключить модуль platform-server на сервере Node.js и легко вывести отрендеренную Angular'ом стрианицу

-Нужно изучить устройство Node.js сервера
-Нужно написать безопасный скрипт для подъема сервера и вызова renderModuleFactory
-Нужно пробрасывать кукисы используя не совершенный подход, ранее испытав неудачный опыт с Angular Socket Engine (это тяжело поддерживать)
-Неизвестно какой ответ будет от запросов отправленных с упрощенной HTML страницы и будут ли промисы выполняться тоже на серверной части или "подхватяться" на клиентской


И ещё мне сейчас пришел 4-ый вариант с вашей подсказкой про socket_create():

4) PHP (Symfony) + Angular

+Использование популярного фронтенд фреймворка
+PHP отвечает и за отрисовку и за API приложения
+Не нужно ничего изучать

-Нужно пробрасывать кукисы используя не совершенный подход, ранее испытав неудачный опыт с Angular Socket Engine (это тяжело поддерживать)
-Неизвестно какой ответ будет от запросов отправленных с упрощенной HTML страницы и будут ли промисы выполнятся тоже на серверной части или "подхватяться" на клиентской
-Тяжело поддерживать, в связи с тем, что данный подход мало известен, т.е. имеет низкий порог вхождения для сторонних разработчиков


У меня есть пробелы в знаниях, так как отсутствует опыт написания современных JS приложений, поэтому мне бы пригодился ваш совет что из этого выбрать, чтобы было просто надёжно, т.е. чтобы в дальнейшем не возникало каких-то проблем с подхватом HTML страницы JS кодом, чтобы после подхвата работало полноценное SPA приложение, чтобы на сервере не нужно было без конца применять не совершенные подходы. Если сократить, то вопрос будет простым - может ли React подхватывать HTML страницу и вешать на неё JS?



>Кстати, у тебя там server.close() вместо client.close().
Где? $connection это же вроде client, разве нет?
Аноним 15/10/18 Пнд 19:42:30  1279605
>>1278975

Я не работал с ним, так что предлагаю изучить https://wiki.freebsd.org/Docker и проверить экспериментально.

С удивлением прочел, что в FreeBSD есть слой совместимости с линуксом.

Но вообще, на PHP можно и без докера разрабатывать.
Аноним 15/10/18 Пнд 20:44:01  1279639
>>1279357

Это не хеш. Хеш это результат математического преобразования исходных данных. Почитай определение: https://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

Тебе нужен просто случайно сгенерированный надежным генератором токен. В PHP7 для этого есть random_int и random_bytes.
Аноним 15/10/18 Пнд 20:55:06  1279649
>>1279420

"Приватное" поле значит. что обращаться к нему можно только из кода в том же классе, то есть кода, который написан между class { ... и }.

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

Наследование не значит, что методы куда-то переносятся в другой класс. Они остаются на месте, просто если в наследнике такого метода нет, то он ищется в предках (с проверкой прав доступа)

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

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

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

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

Таким образом, реализуется инкапсуляция - сокрытие внутреннего устройства класса и разделение ответственности между классами.
Аноним 15/10/18 Пнд 21:21:34  1279664
>>1279436

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

При этом вся логика доступа работает так, как описано в классах.

Если тебе хочется представить, как это выглядит, то пожалуйста:

Когда ты описываешь класс, PHP читает это описание и сохраняет в память в удобному ему виде:

[Класс]
Название: Parent
Предок: нету
Поля:
- private $a = null
- public $b = 1
Методы: ....

В классе хранятся только значения свойств по умолчанию.

Если ты наследуешь класс - он сохраняет в память описание второго класса и ставит ссылку на базовый:

[Класс]
Название: Child
Предок: Parent
Поля:
- public $b = 3; // переопределяем значение поля по умолчанию
- public $c = 2;
- private $a = 10; // это другое поле! не то же, что выше
Методы: ....

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

[Объект]
Ссылка на класс: Child
Значения полей:
- Parent#a/private: null
- Child#b: 3
- Child#c: 2
- Child#a/private: 10

Здесь свойство b встречается только 1 раз, так как определение в классе Child просто переопределяет то, что в Parent.

Потом вызывает конструктор. Заметь, что в объекте список методов не хранится, так как он есть в классе, удалять или добавлять методы в объект нельзя и потому незачем его дублировать.

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

Если ты из класса Parent сделаешь $this->a = .., то PHP будет искать поля в таком порядке:

приватное поле Parent#a
Child#a
Parent#a

Если ты из класса Child сделаешь $this->a = ..., то PHP будет искать поле в таком порядке:

приватное поле Child#a
Child#a
Parent#a

Если снаружи - то он будет искать в порядке

Child#a
Parent#a

Вот интересный код для проверки (и для собеседования):

class A
{
private $a = 1;
}

class B extends A
{
private $a = 2;
}

class C extends B
{
public $a = 3;
}

class D extends C
{
public $a = 4;
}

var_dump(new A);
var_dump(new B);
var_dump(new C);
var_dump(new D);

Что он выведет? Попробуй подумать, потом смотри ответ https://ideone.com/VM3tVG


Аноним 15/10/18 Пнд 21:26:51  1279667
>>1279639
А как же коллизии? Для разный email'ов теоретически может быть одинаковая "рандомная" строка.
Аноним 15/10/18 Пнд 21:28:35  1279668
>>1279436

> То есть, $this - не указание на объект как таковой, а указание на "ту часть объекта, которая связана с этим классом"?

Это указание на объект, просто при поиске свойства или метода проверяются правила доступа. И учитывается, из какого класса мы пытаемся к ним обратиться.
Аноним 15/10/18 Пнд 21:32:33  1279670
>>1279667

1) Ну-ка посчитай вероятность такой коллизии
2) Ты можешь при генерации проверить, нет ли коллизии, и перегенерировать.
Аноним 15/10/18 Пнд 21:33:21  1279671
>>1279667

И в базу нужно влепить уникальный ключ для защиты от дубликатов.
Аноним 15/10/18 Пнд 21:36:10  1279675
>>1279670
>2) Ты можешь при генерации проверить, нет ли коллизии, и перегенерировать
Тогда лишний запрос к БД.
Не легче ли поюзать что-то типа:
$salt = 'verystrongsalt';
$token = hash('sha256', $salt . 'abu@gmail.com');
Аноним 15/10/18 Пнд 21:51:47  1279679
>>1279675

При использовании хеша возможны те же коллизии.

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

Какой плюс у хешей тут? Я не вижу.

Я замечаю, что когда некоторые люди узнают про хеш-функции, они пытаются везде их использовать, даже там, где не надо.
Аноним 15/10/18 Пнд 21:54:57  1279682
>>1279679
>Какой плюс у хешей тут? Я не вижу.
Ну хотя бы не делать лишний запрос в БД, чтобы искать, есть ли такая рандомная строка или нет.
Аноним 16/10/18 Втр 08:45:42  1279838
>>1278719
Спасибо, анон, за пояснения про деплой - очень полезно.
Аноним 16/10/18 Втр 08:50:37  1279840
Это норм что у пхп RPS меньше чем длина хуя типичного пыхера?
Аноним 16/10/18 Втр 09:45:42  1279845
>>1279840
Пошел нахуй
Аноним 16/10/18 Втр 12:40:03  1279881
Ларавель рассчитан на даунов, или у авторов документации и их учебных видюшек просто такой стиль?
Аноним 16/10/18 Втр 14:34:47  1279936
>>1279664
Вот за это я и не люблю ООП.
Аноним 16/10/18 Втр 14:58:25  1279948
>>1279936
За логичность?
Аноним 16/10/18 Втр 17:26:52  1280068
какаие же упоротые фреймворки на нем
Аноним 16/10/18 Втр 17:34:40  1280072
>>1268753 (OP)
Подскажите пожалуйста как добавлять запрос в конец URI по клику на кнопку, может есть способ проще чем разбирать текущий и собирать новый?
В той же задаче про список студентов: поиск index.php?search=хуй, потом сортировка &sort_by=first_name, а потом го на вторую страницу &page=2.
Аноним 16/10/18 Втр 17:49:22  1280080
>>1280072
Пишешь ссылку, добавляешь , что тебе нужно в ее конец.
Аноним 16/10/18 Втр 17:55:01  1280086
>>1280080
Смотри, у меня уже есть результат поиска, выглядит так: i.php?search=хуй
Делаю кнопку с href='i.php?sort_by=хуй'.
И таблица будет отсортирована, только результаты поиска пойдут по пизде, а хотелось бы чтоб по клику стало i.php?search=хуй&sort_by=хуй, но может же быть сортировка и до поиска.
Аноним 16/10/18 Втр 18:07:31  1280097
>>1280072

Удобнее всего собирать с нуля функцией с кучей аргументов.

Зачем что-то делать с URL, что-то там дописывать, вырезать? Это плохой путь.

Кстати, есть еще относительные URL вида ?sort=name : https://github.com/codedokode/pasta/blob/master/network/urls.md
Аноним 16/10/18 Втр 19:47:21  1280150
>>1279948

ПРИСВАИВАЕШЬ ПЕРЕМЕННУЮ
@
ПРИСВАИВАЕТСЯ
@
ТЕПЕРЬ У ТЕБЯ ДВЕ ПЕРЕМЕННЫХ
@
ЗАБЫЛ ПРИСВОИТЬ
@
А ОНА УЖЕ ПРИСВОЕНА ДО ТЕБЯ
@
ЛОГИЧНОСТЬ
Аноним 16/10/18 Втр 21:50:44  1280234
Решил, перед тем как начать писать ТестХаб, отправить резюме на несколько джуно-вакансий. Чувствую, что обоссут.
Аноним 17/10/18 Срд 09:10:49  1280385
>>1280234
TestHub недостаточное условие для трудоустройства на джуна
Аноним 17/10/18 Срд 09:57:48  1280401
>>1280385
Да, это, скорее, на миддла.
Аноним 17/10/18 Срд 15:07:40  1280525
>>1278719
>Самый простой способ - деплой через гит. На сервере добавляешь в git hook баш-скрипт, который при пуше делает нужные действия
А как git на рабочем сервере узнает об этом пуше?
Я думаю сделать так: на локальной машине, где ведётся разработка, я делаю пуш в удалённый репозиторий (битбакет), на битбакете настраиваю веб-хук, инфа о пуше через веб-хук летит на рабочий сервер по адресу сайта и там я уже запускаю composer если надо, git pull и т.д.
Хуйня или норм?
Аноним 17/10/18 Срд 19:12:48  1280664
nono.png (39Кб, 564x768)
>включаешь видеокурс
>в первом же ролики говорят, что либо ты используешь пхп-сторм, либо идешь нахуй
Как это надоело.
>>1278720
>Рисуем свою кнопку, поверх нее кладем прозрачный инпут, при выборе файла выводим яваскриптом имя
Как-то так?
Аноним 17/10/18 Срд 22:57:11  1280788
>>1280664
Анимешник, а ты доделал список студентов?
Аноним 17/10/18 Срд 23:29:25  1280793
5105810491.jpg (49Кб, 532x503)
Решение задачки по размену в тупую(т.е. не методом динамического программирования) показалось невероятно сложным и "думал" половину дня. Цикл с пика дополняется костылями в виде проверки суммы подмассивов массива на соответствие необходимой сумме к размену, лишние варианты стираются - https://ideone.com/FLJC6a
Все оче плохо?
Аноним 18/10/18 Чтв 00:04:49  1280803
Что можно написать на пыхе в 2018, чтобы горда указывать её в резюме? Везде нужно обоссные фулстаки, никому чистая фронт макака не нужна. Гостевуху или что-то повеселее, и сколько на это нужно времени? Знаю джс и немного жабу в универе пердолил. Извиняюсь за классику.
Аноним 18/10/18 Чтв 08:32:03  1280858
>>1280788
Давно уже.
Аноним 18/10/18 Чтв 14:18:17  1280991
В понедельник иду на собеседование пхп-ларавел-макакой, на нем раньше не писал почти кроме лаба1 и курсач3 другой работы один хуй нет в мухосранске, что нужно подтянуть в плане знаний? И чтобы пройти, и чтобы не обсираться сходу на рабочем месте.
Аноним 18/10/18 Чтв 14:18:38  1280992
>>1280991
Ах да, бэкенд-жуниор.
Аноним 18/10/18 Чтв 14:29:01  1280998
>>1280991
Если в студию сокол идешь - ничего не надо, если в приличную контору - не успеешь.
Аноним 18/10/18 Чтв 14:43:53  1281006
>>1280998
>Если в студию сокол идешь - ничего не надо
Других и нет у нас.
Ну энивей минимум-то надо какой-то. https://laravel.com/docs/5.7 хватит дрочнуть, чтобы писать интернет-магазинчики для наебизнесменов мухосрани?
Аноним 18/10/18 Чтв 15:43:40  1281036
>>1280991
>Что нужно подтянуть в плане знаний?
Перемножение матриц и сортировку пузырьком
Аноним 18/10/18 Чтв 16:19:18  1281065
[Harunatsu] Kom[...].png (1443Кб, 1280x720)
>то чувство, когда в мухосранске только две вакансии на пхп-джуна и в одной из них прямым текстом пишут, что берут только студентов.
Аноним 18/10/18 Чтв 17:35:21  1281110
go.png (22Кб, 332x106)
>>1281065
Аноним 18/10/18 Чтв 17:41:16  1281112
golang.png (1Кб, 165x49)
>>1281110
Аноним 18/10/18 Чтв 17:46:27  1281120
>>1281065
Го в дс, будем снимать одну комнатку на двоих :3
Аноним 19/10/18 Птн 02:03:43  1281276
СЧИТАЛКА
https://ideone.com/iDy18v
Аноним 19/10/18 Птн 03:01:34  1281279
Если я застрял на 2 задаче (про курс доллара) я совсем даун?
Аноним 19/10/18 Птн 03:10:21  1281280
>>1281279
Вроде решил, но хуле в условии написано дописать строчку? Или я неправильно решил?

https://ideone.com/S8pq4n
Аноним 19/10/18 Птн 03:20:04  1281281
http://codepad.org/7N715LEE

Дайте, пожалуйста, совет, как можно попроще решить задачу с палиндромами, ибо я придумал только через костыли.
Аноним 19/10/18 Птн 03:31:27  1281283
<?php

error_reporting(-1);

echo "Бросаем кубик...\n";
$random = mt_rand($1, $6);
echo "Выпало $random\n";

?>

Почему строчка с рандомом неправильная? хуле ему надо?
Нахуя нужно \n если можно поставить ; и писать с новой строчки?
Аноним 19/10/18 Птн 03:35:41  1281284
>>1281283
В $mt_rand ты вместо простого интервала от 1 до 6 ссылаешься на переменные $1 и $6
Аноним 19/10/18 Птн 03:38:24  1281285
>>1281284
Так в мануале написано, хоть бы подписали что $ это всегда переменная
Аноним 19/10/18 Птн 15:11:07  1281402
>>1281281
убрать пробелы через str_replace(' ', '', $text)
Аноним 19/10/18 Птн 18:53:24  1281522
>>1280525
bump
Аноним 19/10/18 Птн 18:55:17  1281523
Таки зачем передавать данные в $_POST через ajax, если можно и без него?
Аноним 19/10/18 Птн 20:20:23  1281556
зачем вы изучаете этого франкенштейна?
Аноним 19/10/18 Птн 20:34:53  1281561
>>1281523

Вопрос запутанный. $_POST - это переменная в PHP (в которую данные попадают из тела HTTP POST-запроса). Ajax - это способ отправки запросов на сервер из JS-кода.

Поясни, о какой ситуации идет речь.
Аноним 19/10/18 Птн 20:41:26  1281564
>>1281561
Я говорю, зачем мне отправлять серверу данные из формы через ajax, если их можно отправить сабмитом в указанный action. Дело только в отсутствии необходимости обновлять страницу?
Аноним 19/10/18 Птн 22:17:29  1281603
>>1281285
>хоть бы подписали что $ это всегда переменная
Глаза разуй
Аноним 19/10/18 Птн 22:20:31  1281605
Ща будет перекат
Аноним 19/10/18 Птн 22:31:41  1281611
ПЕРЕКАТ
https://2ch.hk/pr/res/1281608.html

ПЕРЕКАТ
https://2ch.hk/pr/res/1281608.html

ПЕРЕКАТ
https://2ch.hk/pr/res/1281608.html

ПЕРЕКАТ
https://2ch.hk/pr/res/1281608.html
Аноним 19/10/18 Птн 22:53:27  1281618
>>1281402
А другие действия как то можно сократить?
Аноним 21/10/18 Вск 11:16:30  1282086
who is taller t[...].png (65Кб, 640x994)
Попытался всё-таки сделать вторую задачку на массив. Можно ли сделать этот код короче и как?
Аноним 21/10/18 Вск 13:04:34  1282127
>>1282086
Я тут не местный, самоучитель ОПа не открывал ни разу. Но если к этому моменту ты уже знаешь про циклы, то можно сократить. Получаешь список ключей массива, потом циклом проходишь по ним. Не нужно 100500 if.
Аноним 21/10/18 Вск 16:00:57  1282267
>>1282086
Это троллинг или у всех зумеров теперь такие симптомы? Отвечал уже одному такому по другой задаче но с аналогичным подходом >>1276194
хуй знает поможет тебе это или нет


Топ тредов
Избранное