Этого треда уже нет.
Это копия, сохраненная 24 ноября 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Клуб изучающих PHP #104 /php/ 1268753 В конец треда | Веб
Добро пожаловать в клуб востребованных и незаменимых людей.
Тут мы изучаем язык 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? — Да, однозначно. Посмотри любую вакансию.
2 1268755
В прошлом треде >>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
3 1268762
Ребзя, а чому вы не юзаете форматированный вывод строк при помощи printf? Глаз упал на

> I am $age years old



Чому переменную не обрамляете фигурными скобками? Раньше это было чуть ли не стандартом: ${var} или {$var} в строке.
Снимок экрана 2018-09-23 в 12.50.38.png183 Кб, 2442x376
4 1268763
ДЛЯ СЛЕДУЮЩЕГО ПЕРЕКАТА
5 1268765
>>68762

>printf


Актуально для консольных утилит.
ECHO проще, у него даже злоебучих круглых скобок нет.

>>68762

>${var}


Лишние знаки, нахуй они нужны?
6 1268773
>>68762
Пишу переменные в фигурных скобках в тексте. Учился по какой то олдовой книге, с тех пор так и пишу.
7 1268780
>>68773
Держи вкурсе
8 1268782
>>68765
Вот этот >>68773 пишет походу про ту же книгу, которую я когда-то читал. Возможно, это было у котерова в рнр5. Пока писал на рнр, уже 8 лет ни строчки не написал, считалось хорошим тоном в строках писать переменную в curly braces.
bapkong.jpg248 Кб, 1372x1952
9 1268857
Bapkong has entered the arena.
И начал очень медленно писать студентов.
10 1268861
Анон, пытаюсь сделать задачку на палиндром, пока на этапе удаления пробелов и перевода строки в нижний регистр. Командная строка говорит, что в строчке перевода что-то не так, но я не понимаю...подскажите пожалуйста! И если не сложно посмотрите на следующую где я хочу удалить пробелы, пойдет ли такой вариант?
11 1268864
>>68861
ideone не работает с mb функциями. Если тебе принципиально решение на идеоне, сделай проверку тождества через регексп с флагом игноркейсом.
26.jpg271 Кб, 960x1280
12 1268917

>- дан список слов в массиве, например: $words = ['кошка', 'кит', 'собака']. Список слов может быть любым, не только как в примере.


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



>К: кошка, кит


>С: собака



Код: jdoodle.com/a/G3e

Тащемта для всего алфавита нужен один if, 32 else if и else если в массиве первая буква не кириллический символ, а что-то другое.
13 1268922
>>68857
Буду болеть за тебя, аниме-ребенок!
14 1268923
>>68917

>26.jpg


Рязань
15 1268926
Спасибо. Может, сегодня успею всю основную структуру фронт контроллера написать.
16 1268927
>>68926
Ссылку забыл >>68922
image.png476 Кб, 714x644
17 1268947
>>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 и БД.
18 1268949
>>68947
Я не тот анон, но спасибо что ответил.
19 1268958
https://ideone.com/yC58nJ
Как в задаче про банкомат проверить, достаточно ли купюр для выдачи?
maxresd.jpg156 Кб, 1280x720
20 1268987
Дублирую из предыдущего треда.
Сделал граммар нази и опечаточники. Итак.
1) Граммар нази. Тут у меня есть ощущение, что я как-то не аутентично использую функции для работы с регулярками + там же надо делать исправление больших букв и я его добавил отдельным правилом т.е. не оче умно. Но т.к. я уже долго в этом вожусь - оставил как есть.
Задача: https://ideone.com/OW5uJV
2) Опечаточники. Тут ты, ОП, в спойлере у задачки оставил примеры текстов - которые добавляют дополнительные условия, т.е. в слове может быть несколько опечаток, или англ.символы могут идти подряд, что заставляет переписывать регулярки и код. Кароче пока тоже оставил как есть.
Задача: https://ideone.com/KmRlPx
P.S. В общем мне нужен пример решения, хочется двигаться дальше. ОП'чик скинь мне на мыло vovchenk$u.oalANUSyandex=mnPUNCTUMrTqNu или телегу @y0urbe3tfr1end
# OP 21 1268996
>>68987
Скинул, тебе за щеку.
ОП-треда, который проверяет задачки, потерялся.
Просто загугли задачки и посмотри как у других.
22 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 1269042
>>69041
mysql работает, в php.ini extension=openssl раскомменчено
24 1269044
>>69041

> PHP was built without openssl extension



>>69042

То есть тебе эта строчка ни о чем не говорит? РНР собран без поддержки openssl. Собирай ручками, довен.
25 1269046
>>68958
"Лиличка" - https://3v4l.org/9nNiF
Приступил к следующей задачке, и обосрался еще раз.
Как вывести столбцы рядом друг с другом, а не все в один большой столбец?
26 1269047
>>69044
а хуль у них на официальном сайте такое гамно лежит без поддержки openssl?
https://windows.php.net/download/ скачивал VC15 x64 Thread Safe 7.2.10
да я и не умею собирать
27 1269066
>>69047
Я ебу чому они без опенссл выкладывают сборки? Я на прыщах всегда сам собирал рнр с нужными мне модулями. Вот читай как выйти из твоего положения http://php.net/manual/ru/openssl.installation.php
69252480p0master1200.jpg285 Кб, 600x814
28 1269067
Пришлось потратить всего-то 7 часов на то, чтобы заставить фронт контроллер вывести дефолтную страницу для списка студентов.
29 1269088
>>68753 (OP)
Привет, анон. Сдавал задание на галеру одну и мне сказали что хуйня, можешь глянуть краем глаза что не так? Они не отвечают
# OP 30 1269090
>>69088
Глянул
32 1269109
>>69096

>2002+16


>процедурное программирование

33 1269110
>>69109
А как надо?
# OP 34 1269135
>>69096
Ебанутый
35 1269138
>>69135
Бле, скажи че исправить надо?
# OP 36 1269140
>>69138
Для начала залей с вой код на гитхаб или идеон
37 1269162
>>68762
скобки не нужны ровно до тех пор пока не понадобится вплотную написать текст к значению переменной и подобное

printf следует использовать для _форматированного_ вывода только когда нужен _форматированный_ вывод, как бы нелогично не звучало
38 1269212
>>69162
Твои слова расходятся с написанным в шапке.

Чем форматированная строка хуже echo? Как по мне, проще самому управлять выводом. Особенно, когда используешь строгую типизацию. Приучает к дисциплине и ещё больше походит на божественный Си.
39 1269221
>>69212

>строгую типизацию


Сынок, потише в этом треде с умными словами, особенно когда не знаешь значений
У твоей "божественной" Си слабая типизация как и у ПХП
40 1269235
>>69221
В смысле?

int i = 2; это разве не строгая типизация?! Или когда в аргументах функции пишешь что-то навроде float d = 5.
41 1269242
>>69212
Она не хуже - она другая. Безопасность типов она между тем не обеспечивает.
Подумой, как говорится.
42 1269245
43 1269250
>>69242
declare(strict_type=1)
string $username = “Pinnacle”;
printf(“Hello %s!”, $username);

Разве это не максимально безопасный код? Типа в ручную управляешь типом данных, чуть что интерпритатор сразу дропает выполнение кода с ошибкой.
44 1269252
А есть в среде PHP признанный классик, как Лутц в Python?
45 1269282
>>69252
Да, Reference Manual скомпиленный в CHM с комментариями.
46 1269315
>>69235

>int i = 2; это разве не строгая типизация?


Нет. Это статическая.
Просвещайся.
https://habr.com/post/161205/
47 1269393
Надеюсь оп скоро выздоровеет.
48 1269433
Давно я таких анальных ошибок не видел: не могу создать таблицу с колонкой group. Подставляю вместо group абсолютно любое слово - создается.
49 1269434
>>69433
Речь идет об mysql, если что.
50 1269438
>>69433
`group`
51 1269439
>>69433
Да, так бесит эта MySQL, был баг, что одним запросом формы, создавалось 2 записи в таблице, 10 раз перепроверил метод который создаёт запись в таблице, ничего не нашел.
Потом психанул написал запрос на этой же странице, и все стало нормально создавать. Или когда уже уставший пишешь запрос и где-то проебал запятую в SQL запросе, то это пиздец, потом в куче текста эту запятую хуй найдёшь.
52 1269453
>>69438
Да, в этом проблема была. Начинал ставить одинарные кавычки, оказалось, что надо `.
53 1269491
Ну что аноны, жив еще php, стоит вкатываться?
54 1269500
Аноны у меня встал вопрос.
Мне надо вывести определённое количество новостей на странице, я вывожу их таким способом
while($row = $result->fetch_array(MYSQLI_ASSOC)
....код
}
Но как ограничить вывод допустим 3 штуками на страницу?
55 1269516
>>69235
Строгая это:
int a = 1;
float b = 2;
float c = b + (float)a;
56 1269522
https://ideone.com/97hAvs
В чем дело, почему программа возвращает ложное значение?
10 же больше чем 6.
57 1269530
>>69522

>https://ideone.com/97hAvs


>echo "У анона выпало ($anonDice1) и ($anonDice1)\nУ компьютера ($compDice1) и ($compDice2)\n";

1492378203437.gif1,7 Мб, 500x281
58 1269532
>>69500
Ограничивай количество запрашиваемых элементов из БД.
59 1269533
>>69530
Блин так и знал что в галза долблюсь. Я даже не заметил что всегда даблы выпадают.
60 1269548
>>69532
Блин, точно. Забыл за LIMIT спасибо.
13.png17 Кб, 783x539
61 1269565
Я не осознаю своих действий. Ебаная депрессия не дает мне нормально соображать
Безымянный.jpg69 Кб, 643x542
62 1269576
>>69565
Ничего страшного, годик попревозмогаешь и вкатишься в Питере за 7к в месяц и обеды соленым немытым хуем лошка, вкатившегося годом ранее тебя и носящим лычку миддла.

Через пару лет мб дослужишься до компенсации проезда на маршрутке. А там глядишь и в дойче банк позовут. И все у тебя будет хорошо. Нет, конечно, ты умрешь бомжом в Гатчине на кухне съемной однокомнатной халабуды от передоза героином
63 1269581
>>69576
Какой ты токсичный, анон. Плохо быть тобою, плохо.
Без названия (5).png51 Кб, 599x876
64 1269584
>>69576
Тащемта я и так в дойче банке работаю. Мне php для себя нужно.
69331974p0.jpg508 Кб, 860x1200
65 1269596

>Uncaught TypeError: Return value of StudentMapper::searchEmail() must be an instance of boolean, boolean returned

66 1269601
>>69584
Почему тут все обмазываются дойче банком? Зарплата на пикриле нищенская по немецким меркам.
67 1269606
>>69601
В Германии столько дворники получают.
68 1269608
>>69601
Потому что кое кто живет слухами. Работники дойч банков экономят каждую копейку. У меня каждый месяц получается откладывать всего 100-200 евро. Отдел програмистов в банке не намного лучше живет, зарплата всего 300- 400 евро больше.
69 1269612
>>69596
мust be an instance of boolean
мust
be
boolean
70 1269629
>>69596

В PHP5 нельзя в тайп-хинтах использовать примитивные типы вроде int, он их понимает как имена классов. Советую обновиться до PHP7.
71 1269635
>>69584
Пиздец
1535774337789.jpg492 Кб, 966x1300
72 1269639
>>69612
>>69629
Вообще-то дело в том, что надо указывать bool, а не boolean.
73 1269640
>>69516
Выше говорят, что это статическая типизация. Правда я так особо и не вкурил в чём радикальное отличие статической/слабой типизации от сильной/строгой. Что-то пишут овердохуя про ООП, но я ниасилил. Может в ООП это и есть слабая типизация, а на уровне объявления переменных не является таковой.
74 1269647
Какой же нереальный пиздец этот фулл-текст серч в mysql.
75 1269703
>>68753 (OP)

>клуб востребованных и незаменимых людей


А вакансий жуниоров нихуя.
76 1269706
>>69703
*В твоём Усть-Залупинске
77 1269709
>>69706
В любом кроме двух ДС.
error.png6 Кб, 1173x86
78 1269712
Как отправлять сообщения в телегу? Не пойму в чем ошибка.
Допустим я хочу чтобы бот оправил сообщение в конфу.
$send = fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}
&parse_mode=html&text={$txt}","r");
Выдает ошибку. Хелпаните ньюфагу.
79 1269730
Где ОП?
80 1269731
В одном из последних постов опа он писал, что времени у него мало, так что занят скорее всего. Ну или от каждодневной платины выпилился.
81 1269735
Как же заёбывает постоянно перед каждым вызовом переменной ставить сраный $, почему нельзя было сделать как в C раз объявил int a = 1 int b = 1 a + b и всё , обращайся к ней без ебучих лишний символов.
15039281774410.jpg270 Кб, 1400x1128
82 1269736
Похепаны, кто понимает в MySQL, помогите оптимизировать запрос в базотреде позязя
>>1269732
x80db7aea.png157 Кб, 1861x2008
83 1269741
ОП (няша которая проверяет задачки), за что ты оставил нас?
Аноним 84 1269777
Опушка, а таки накалякал TDG, посмотри пожалуйста, как будет время https://github.com/wheelafterwheel/TDG. Доумо аригато.
85 1269778
Во имя трипла и прицепившейся сажи!
86 1269780
>>69140
Но блин там же много файлов, и не хочется весь этот позор на гит выкладывать
87 1269785
>>69777
По какому гайду учишься?
88 1269789
>>69785
По гуглу и официальным документациям. Что интересно - в то и ныряю. К сожалению, за ручку как ОП никто не водит.
89 1269792
>>69789
Давно занимаешься?
90 1269797
>>69792
Урывками оооочень давно, иногда забивается на по полгода. Это интересное хобби. Жаль разделить не с кем.
91 1269799
>>69797

>Жаль разделить не с кем


Можно попробовать
92 1269800
>>69799
Каким образом?
93 1269801
>>69799
фвй
94 1269803
В старом треде проверил посты с 20 сент. по сегодня: >>1269790 - зайдите и посмотрите, наверняка ваша задачка проверена.

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

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

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

Не горжусь уебищными тернарниками для решения вопросов пола. Надо было на стадии, когда с числами работал внутри рексурсии, как автор советовал, решать, т.к. потом после обработки массива с числительными у меня уже не числа, а строки, пришлось матчить регекспом.
96 1269808
>>69803

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



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

А как через сабстр? Все равно же нужно знать порядковый номер, а он у первой буквы может быть рандомным, если там десяток точек или кавычек предшествует?
97 1269809
>>69803

>Ну или сделать регулярку, ищущую слова из букв разных алфавитов.



Ты имеешь в виду ограничиться флагом /u или делать полноценные [aá] и т.д.?
аниме-хрюшка.jpg56 Кб, 604x336
98 1269810
>>69803
https://ideone.com/Grtrs6
В который раз переделал задачу с текстовыми/числовыми вопросами. Проверьте, плз.

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

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

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

3. Решаю сейчас ООП-будильник, потом нужно будет решать Вектор или эти задачки взаимозаменяемые?
1462628935735.png781 Кб, 857x746
99 1269834
Как же не хочется жаваскрипт учить.
100 1269837
>>69834
Да уш, тяжело смотреть на него после php. Но он достоин любви.
101 1269849
А почему пэха сдохла? Норм же язык был.
102 1269859
>>69849

>104 тред на дваче


>пэха сдохла


Молодой человек, этот тред не для вас написан
103 1269861
>>1269793
>>69803

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


Сами вопросы хранить в отдельной таблице( один(Тест) ко многому) и варианты ответа то же в отдельной таблице(один(Вопрос) ко многому)
Так что ли?
104 1269863
>>69810

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


Да.

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


>проверку внутри функции


Довен, тайпхинты как раз существуют, чтобы эти проверки РУКАМИ не делать?
Сделаешь , ты условие if(!is_bool){ throw new \RuntimeException("Не верный тип");, и чем это будет отличаться от ошибок которые выдает тебе интрепретатор?
Если типы не совпадают, то их нужно как-то приводить к нужному типу перед передачей в функцию.
Еще тайпхинты дают ахуенную подсказку при работе с IDE.
105 1269864
>>69861
Можешь и в одной, если количество вариантов ответов везде одинаково. Id вопроса, вопрос, правильный ответ, неправильный ответ №1, неправильный ответ №2, неправильный ответ №3. А при выводе ответы перемешивать.
107 1269878
>>69872
Как блять поисковые связаны с тем что язык жив или нет?
108 1269893
>>69834
У него блядский вырвиглазный синтаксис, как на нём вообще можно писать скрипты, код невозможно читать.
1498547394680.jpg91 Кб, 319x436
109 1269912
Как же я ненавижу ебаться с CSS. Надо было следовать советам Опа и делать студентов с бутстрапом, но слишком уж хотелось все с нуля писатькроме автолодера.
110 1269916
>>69912
Ты целыми днями решаешь эту задачу, откуда у тебя столько свободного времени?
111 1269917
>>69834
Ага, всякие очевидные вещи перечитывать и только потому что синтаксис отличается
112 1269922
>>69916
Безработица.
уныние.jpg74 Кб, 1895x1048
113 1269926
Мне надо сайты для бюро ритуальнных услуг делать.
114 1269940
Котаны, помогите разобраться в ошибке применительно к этому сниппету:
https://ideone.com/NhFrF5

Ошибка:

>PHP Fatal error: Constant expression contains invalid operations in /home/Gc2l35/prog.php on line 4

115 1269942
>>69940
Значение по умолчанию должно быть константой. Вызовы функций не допускаются.
116 1269950
>>69799
>>69797
Пробовал, жалко не получалось. Можем втроека
117 1269957
>>69950
Ну мне трудно представить, как это все выглядит.
118 1269961
>>69942
Нихуя себе
119 1269962
>>69712
Из-за ркн мой бот не хочет работать, как сделать так, чтобы бот отправлял сообщения через прокси?
120 1269968
>>69926
Просто добавь https://purecss.io/
14196229031860.jpg28 Кб, 604x464
121 1269987
Есть у кого нормальный халявный PhpStorm?
Заебался уже копаться в этом говне и активаторах, ни один из которых не работает.
122 1269999
>>69987
Зачем там активатор? Есть куча левых license server. Да и просто код можно найти и добавить их сервер в хостс чтоб он не проверялся и шторм считал что он лицензионный.
123 1270026
>>69999
Все эти сервера нихуя не работают.
Шторм палит, что они левые
70805374p0master1200.jpg380 Кб, 850x1200
124 1270029
>>69968
Вот следующие задание буду с чужими СSS делать, а студентов закончу со своими.
уныние.jpg122 Кб, 1891x1044
125 1270046
Постраничную навигацию по таблице было интересно делать. А вот сортировку без жаваскрипа делать не охота.
126 1270049
>>69999
50 бачей за три года же всего
127 1270061
>>70049
Не за 3 года а за 3-ий год. За 3 90 + 70 + 50 = 210
128 1270069
>>70061
тогда не нужно, пусть эти жиды сами им пользуются
129 1270070
>>70049
90 за 1 год
130 1270081
>>70046

Сортировка легко делается без JS: делаем заголовки колонок ссылками вида ...&sort=-name
567.png7 Кб, 789x166
131 1270085
Ребят, а есть команда в PHP, например что бы в цикле for, в случае отрицательного баланса на счету, пропускалась часть тела ( не выполнялась), а выполнялась другая часть цикла, состоящая из функции if ?
133 1270092
>>70081
Да это понятно, проблемы начинаются, когда при повторных нажатиях надо менять тип сортировки.
134 1270093
>>70091
Чет с if магия непонятная начинает происходить в проге, а можно цикл в цикле?
135 1270095
>>70085
Внутри условия поставь условие на отрицательный баланс.
136 1270096
>>70093
Можно.
137 1270098
>>69926
Довольно неплохо!
цукцук.png58 Кб, 1557x881
138 1270107
>>70095
Внутри какого условия, условия цикла, или имелось в виду что то другое? Если условие if, то оно уже есть.
139 1270110
>>70085
Тебе нужно другое условие. Если долг + проценты меньше ежемесячного платежа, то выплатить оставшееся, вывести свое ехо и кинуть break;
140 1270114
>>70085
goto называется.
141 1270126
>>70107
Возможно тебе поможет continue
А вообще ну ты пиздец дупло, конечно
142 1270132
>>70110
Ща отдохну и попробую, а то уже 4 часа пытаюсь и голова заболела.
143 1270133
>>70092

Нужно выводить ссылку с учетом текущего типа сортировки. То есть если выбрана сортировка -name, то надо выводить в заголовке +name вместо -name.
144 1270134
>>70085

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

if (условие) {
одни действия;
} else {
другие действия;
}
145 1270137
>>69987

Не проще поставить и настроить netbeans for PHP или Eclipse for PHP? Лицензионно и бесплатно.
146 1270141
>>70137
Я итак на нетбинсе, но шторм вне конкуренции, он слишком охуененн.
1468592852006.jpg101 Кб, 1280x720
147 1270146
>>70133
Слишком уж большой костыль выходит для такой мелочи.
148 1270178
>>69987
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
149 1270225
>>70146

>test

150 1270324
Я У МАМЫ КАЛЬКУЛЯТОР
https://pastebin.com/EsM3d1e8
151 1270371
>>70046

>gender


Non-binary
Rather not to say
152 1270391
>>70324

> https://pastebin.com/EsM3d1e8



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



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

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

>>70146

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

>>69962

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

>>69940

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

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

...
}
152 1270391
>>70324

> https://pastebin.com/EsM3d1e8



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



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

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

>>70146

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

>>69962

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

>>69940

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

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

...
}
153 1270393
>>69926

Хороший повод получше освоить 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, и наверно как-то еще. Не забудь предусмотреть область для показа ошибок.

>>69861

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

>>69810

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



Решай в любом порядке, но лучше решить обе. Вектор посложнее.
153 1270393
>>69926

Хороший повод получше освоить 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, и наверно как-то еще. Не забудь предусмотреть область для показа ошибок.

>>69861

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

>>69810

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



Решай в любом порядке, но лучше решить обе. Вектор посложнее.
154 1270394
>>69809

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

>>69808

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

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

>>69806

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

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

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

>>69808

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

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

>>69806

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

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

> 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. Далее, связи между сущностями и ленивую загрузку. Задача интересная, хоть и сложная.
155 1270395
>>69777

> 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. Далее, связи между сущностями и ленивую загрузку. Задача интересная, хоть и сложная.
156 1270396
>>69640

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

int a = 1;

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

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

$a = calc();

function calc() {
....
}

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

https://ru.wikipedia.org/wiki/Сильная_и_слабая_типизация

>>69439

Это что-то с твоим кодом. Если что, есть паттерн Post/Redirect/Get для защиты от повторной отправки формы.
157 1270404
>>70396

>(например, в выражении "2" + 2 язык может автоматичеки преобразовать строку "2" в число)


Нет, это не слабая типизация. Это неявное преобразование типов.

Смотри на Си. ты не можешь там сделать "2" + 2, так чтобы он на лету преобразовал строку "2" в число 2. При этом у Си - слабая типизация.
158 1270420
>>70404
Ну все правильно он сказал
Ты не можешь "2" + 2 в С сделать, но
void *ptr можешь кастовать хоть во что
или enum с целыми неявно смешивать
именно поэтому слабая
159 1270422
>>70391

>как это аккуратно сделать


Яваскриптом.
>>70393

>Не забудь предусмотреть область для показа ошибок


Ошибки во всплывающем окошке выводятся.
160 1270427
>>70420
Хотя даже тут ты наврал и меня запутал

>> "2" + 2


для С норм, потому что "2" указатель на константную строку
161 1270431
>>70427
И сколько у тебя получится?

Читай внимательно

>ты не можешь там сделать "2" + 2, так чтобы он на лету преобразовал строку "2" в число 2

162 1270433
>>70420

>язык может автоматичеки преобразовать


>кастовать

Снимок.PNG1,5 Мб, 1620x947
163 1270453
>>68753 (OP)
Анон, допомоги понять одну хероту.
Есть сает http://dzzb.ru
Запилил там "окна консоли" в некоторых статьях через css. Примеры:
http://dzzb.ru/blog/MScen
http://dzzb.ru/blog/StartGen
http://dzzb.ru/blog/Punch!
И вот в FurryFox и даже в IE эти "окна" отображаются нормально - с заголовком, который берется из картинки, а хром не воспринимает этот параметр CSS ниразу. Допиливал и "webkit" ко всем параметрам и бочку делал - нихуя. Насоветуй как хром полечить.
165 1270593
>>70395
Слава слонику, ты тут многие замечания описал, которые мне тоже не нравятся (ура!). Ремарочка, как появился 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 после закрытия транзакции? Это вполне возможно из-за асинхронности...


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

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

Остальные замечания: все постараюсь исправить. Нужны комментарии на вопросы выше.
165 1270593
>>70395
Слава слонику, ты тут многие замечания описал, которые мне тоже не нравятся (ура!). Ремарочка, как появился 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 после закрытия транзакции? Это вполне возможно из-за асинхронности...


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

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

Остальные замечания: все постараюсь исправить. Нужны комментарии на вопросы выше.
Безымянный.jpg103 Кб, 600x423
166 1270770
>>70394

ЧИСЛА ПРОПИСЬЮ
(реран с учетом замечаний)
https://ideone.com/Q3KtKC
0/200 day 1 167 1270776
Врываюсь в тред со второй попытки. Объявляю сам себе челендж: отучится 200 часов за 60 дней. Ща посплю и понеслась.
168 1270820
>>70770
Ебать ты англичанин.
sage 169 1270833
>>70776
Надеюсь не недоязык пехопе учить будешь, сверхчеловек?
170 1270977
>>69926
Или для записи в поликлинику
171 1270987
>>69926
А мне нравится дизайн. Чуть чуть выровнять только. А то сейчас что не сайт - битва космических истребителей от лукасфилм.
172 1271044
ОП, посмотри, пожалуйста, 13 задача по HTML/CSS

https://github.com/deadj/deadj.github.io
deadj.github.io
173 1271238
>>71044

>>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.
173 1271238
>>71044

>>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.
174 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-petNhDrovANUSsidor-siBBUdorovPUNCTUMrUA@u

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

Но сама идея решения верная.
174 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-petNhDrovANUSsidor-siBBUdorovPUNCTUMrUA@u

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

Но сама идея решения верная.
175 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";


Локальная переменная, созданная в функции, не доступна снаружи.
175 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";


Локальная переменная, созданная в функции, не доступна снаружи.
176 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;


Тут "" не нужно.

В общем, сейчас программа не работает нормально, так как сравнвает байты, а не буквы. Надо это исправить.
176 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;


Тут "" не нужно.

В общем, сейчас программа не работает нормально, так как сравнвает байты, а не буквы. Надо это исправить.
177 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. Твоя же программа в этом случае не сможет набрать нужную сумму.

Надо исправить эту проблему. У тебя программа вообще пока нерабочая.
177 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. Твоя же программа в этом случае не сможет набрать нужную сумму.

Надо исправить эту проблему. У тебя программа вообще пока нерабочая.
178 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.
178 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.
179 1271252

>>1263349



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


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

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

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


Сделай тесты, а не гадай.

>>1262263



> можешь пояснить свой мотив в запиле гайдов и помощи вкатывальщикам на протяжении уже нескольких лет?


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

>>1257990



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



Все зависит от используемого сервиса. Если он будет распознавать команды и выдавать результат - то не так и сложно. Но по факту распознавани голоса не такая простая вещь, особенно если надо распознавать разных людей, в зашумленной обстановке итд. Я бы советовал для начала найти такой сервис распознавания и протестировать его, а потом делать выводы.
180 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, которого нет в массиве.
180 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, которого нет в массиве.
181 1271254

>>1256748



> Аноны, чекните задание про рост школьников, все правильно?


> https://ideone.com/ZdgItc



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

>>1256224



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



Ок, верно.

>>1256073



> В задачке про массивы с 10ю ключами порядок ключей важен или только их наличие?


Порядок не важен.
182 1271255
Уф, проверил все с конца до 760 поста. Напомню себе проверить >>1247821

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



Больше месяца прошло, нехорошо.
183 1271269
ОП, я тоже думал в качестве пет-проекта написать игру небольшую, что-то вроде простого варгейма. Получается, php не пригодится для этого, учить параллельно и js?
184 1271276
Всем привет!
Недавно начал читать гайд для новичков из ОП. Весьма интересно. Недавно наткнулся на такую фишку как bootstrap, я так понял это библиотека готовых решений. Насколько оправдано пользование этим ресурсом? Или лучше всё писать ручками?
185 1271302
>>71276

> Насколько оправдано пользование этим ресурсом?


Ни на сколько. Хреньворк - априори хуйня. Тем более этот страпон.
186 1271307
>>68753 (OP)

> полезная задача сделать список студентов


Пошёл нахуй со своими студентами. Лучше делать список гей-шлюх, и то приличнее будет.
187 1271308
https://ideone.com/B177aS
Сделал игру с кубиками, не совсем понял за кусок:
exit()
его ставить в конце всех условий или?
188 1271313
>>71308
Нет, долбоёб, это точка остановки программы. Плюс лишняя точка с запятой в последнем условии.
189 1271317
>>71313
Это не тред для самоутверждения людей с комплексами. Это тред для помощи новичкам.
190 1271319
>>71313
Ты такой токсичный.
То, что это останавливает программу, я понял. Но где её ставить? По идее если условие выполнено, это повод остановить программу т.е. ставить после каждого условия?
191 1271327
Объясните простым языком разницу между абстрактным классом и интерфейсом, пожалуйста.
192 1271333
>>71327
Я так понял, в интерфейсе все методы это заготовки без реализации, в абстрактном можно прописать не абстрактный метод с реализацией сразу. Вот на практике я Х
хер знает, когда что лучше брать.
193 1271342
>>71327
Абстрактный класс имеет как минимум один абстрактный (не определенный) метод. Интерфейс - это тот же абстрактный класс, с той разницей, что в нём не может быть свойств и не определены тела методов. Абстрактный класс наследуется, а интерфейс реализуется: наследовать можно только один класс, а реализовать сколько угодно.

>>71319
А тебе не приходило в голову, что программа на пыхапе обычно сама останавливается? Рот твой токсичный.
194 1271343
>>71319

Обычно ставить не надо нигде. Там в задаче оно ставится, чтобы , если условие в первом блоке if сработало, код ниже бы не выполнялся. Можно (так даже лучше) сделать вообще без exit, если перегруппировать блоки if.
195 1271346
>>71327

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

Если что, урок про интерфейсы в помощь: https://github.com/codedokode/pasta/blob/master/php/interfaces.md
196 1271371
>>71333
>>71342
>>71346
Спасибо, добра вам!
197 1271373
Сап камрады, есть у кого образ на докер, вагрант(без разницы) со стеком php4?
Screenshot2018-09-28-11-56-20-998com.android.chrome.png133 Кб, 720x1440
198 1271383
Неожиданно.
199 1271390
Задача про массивы с рандомным именем
https://ideone.com/sIORAY
Не совсем понимаю, что не так. Вроде создал нулевую таблицу, потом она заполняется где каждый элемент берет номер $i, и значение рандомного слога а на выходе - болты.
200 1271395
>>71390
$pieces[$i] без кавычек
201 1271398
>>71395
Благодарю. Всё сошлось
202 1271405
>>71398
А теперь объясни, почему.
203 1271409
>>71405
А это в гайде не могу найти ¯\_(ツ)_/¯
204 1271414
За двойные кавычки в php надо в жопу ебать без смазки.
205 1271433
>>71414
Ты латентный пидор.
206 1271440
>>71409
Нет ты объясняй давай, что это ещё за не могу.
Как внутри массива располагаются элементы? Чем ассоциативный массив от простого отличается?
207 1271443
>>71440
Каждому имени в массиве относится ключ, ну как в задачке с ростом было. Имя - рост. Где ключ это рост.
В простых массивах идет поиск по индексу, в ассоциативных по ассоциациям, вроде так
208 1271446
>>71443
Ещё раз.
209 1271447
>>71446
Я даже не знаю что и ответить.
210 1271454
>>71447
$assoc = array(
"Index" => "value",
"Index" => "value2",
...
);

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

Ничего странного не замечаешь?
211 1271459
Поделитесь уютным чатиком где можно будет обсудить что-то или получить помощь/совет
212 1271494
>>71459
а зачем ты нужен уютному чатику
213 1271508
>>71494
Если у тебя такой вопрос возникает, значит твой чатик не уютный
214 1271516
>>71459
тг WebDevHeroes
215 1271603
>>70770
ОООпчик, ты меня проглядел?((( Смотрю, уже ниже спустился по ответам.
216 1271888
>>71414
За одинарные может быть? Вроде как доступно больше функций с одинарными кавычками, не? Не срача ради, сугубый интерес.
sage 217 1271942
>>71603
Дичайший быдлокод (в плане самого алгоритма), ещё и с английскими комментариями. Фу, бля.
218 1271970
>>71454
Извиняюсь, не было возможности заходить на двачи.
У нижнего массива цифры вижу в имени
219 1271974
>>71970
Не то. Посмотри еще раз внимательнее.
220 1271975
>>71974
"Index" в ковычках двойных, а 0 нет?
221 1271976
Хотя, тут скорее, что Index'у несколько ключей соответствует
222 1271980
>>71975
Там индекс - целое неотрицательное число, а там - строка. Догнал, кусок долбоёба?
223 1271981
>>71980
Страшнавыключай
224 1271986
>>71980
Не в этом его ошибка.

>>71976
Тааак! И что произойдет, если под один индекс пихать разные значения? $pieces["$i"]
225 1271988
>>71986
Он спрашивал, что такое ассоциативный массив. К чему твой пример с повторяющимся индексом - не совсем понятно.
226 1271990
>>71988
Потому что ты не в теме, проходи, не мешай.
227 1272029
>>71942
Ну я и есть нубас. В прошлый раз Оп мне на ошибки указал, я их исправляю потихонечку. Сейчас еще укажет надеюсь, я снова переделаю. Так, глядишь, и научусь чему.
228 1272062
>>71986

Чёт всёравно не улавливаю суть. Если в ковычках он это считает одним именем, чтоли?
229 1272066
>>72029
Всё правильно, так и надо. Только не создавай затруднения уже на начальном этапе. Смотри, как этот код примерно должен выглядеть: https://ideone.com/DyCEJU
docs.png47 Кб, 1873x575
230 1272080
>>72062
Вот этот шкаф представляет собой массив. В нем каждый ящик может хранить только последнее положенное в него (все, что было в ящике перед тем как мы ложим туда - исчезает). Если два ящика назвать одинаково, произойдет коллапс Вселенной (шутка, просто предыдущий исчезнет и шкаф скорее всего развалится).

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

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

2) Итак у нас три документа маршируют сохраниться в ящик. Который из них останется в живых если мы откроем ящик после? Который это будет ящик?
231 1272082
>>72066
Ох, мне аж чуть плохо не стало, подумал 1С.
232 1272088
>>72080
1) Без ковычек числа да? 007 - ковычек не надо
2) Смотря какой порядок, если с права на лево, то выживет левый в папке index
233 1272100
>>72088
1) не все языки простят тебе 007 в качестве ключа.

2) ну теперь то ты понял свою ошибку в $pieces["$i"]?
RVsOIBYqu7g.jpg122 Кб, 1280x720
235 1272228
Доделал Опечаточники:
https://www.ideone.com/Enbf5W
237 1272245
>>72066
Надо на работе как-нибудь захерачить сразу в продакшен такое. Начальника с инфарктом скорая увезет, наверно...
142243930111140f3d3ae13db636bece75fa495bfd22.jpg44 Кб, 600x338
238 1272269
>>72228
Да, там опечатка в условии, не заметил.
Перезалил.
Опечаточники: https://www.ideone.com/XKbY9H
239 1272282
Дианон есть?
240 1272292
>>72225
Смотри, вот практически твой же код, только написанный по-человечески, сравни: https://www.ideone.com/kPx9jn
241 1272293
>>72228
Фу, блядь, нахуй он ему язык вырвал? И почему он жёлтый?
242 1272343
>>72292
>>72066
Аха, ясненько. Тролобасы подъехали.
243 1272346
Как на курсы записаться, хочу такую кошечку
sage 244 1272361
>>72343
Совсем дебил?
245 1272408
сделал криво косо плохо задачку про компанию вектор, мб кто-нибудь почекает да подскажет чего-то https://ideone.com/UiCDNk
246 1272454
ОП, посмотри 13 задание по CSS/HTML, пожалуйста.

https://deadj.github.io/
Capture.JPG103 Кб, 1366x768
247 1272475
>>72361
Че такой дерзкий? Выпускной сертификат от ОП-а показал быстро
248 1272484
>>72475

> Выпускной сертификат от ОП-а показал быстро


Твоя опа-хреньворкщица сама сертификат не хочет показать? Или там только справка бакалавра?
68753574p5master1200.jpg534 Кб, 955x722
249 1272522
Таки четыре дня - слишком большой отдых от обучения.
250 1272630
Если вы не знаете, аноны, то на Хабре выходит дайджест с новостями из мира PHP (советую читать): https://habr.com/company/zfort/blog/424949/

Мне больше всего нравится новость про то, что в 7.4 добавят типизированные свойства классов: https://wiki.php.net/rfc/typed_properties_v2
251 1272657
>>72630
Осталось еще $ у переменных убрать, и будет Java.
252 1272752
>>72100
Я так понимаю, что пытался всё воткнуть в $i - т.е. это было не число как я задумывал, а именно имя $i ему уже присваивались значения, и высвечивалось последнее?
253 1272761
>>72752
Ура! Ты молодец. Да, ты в цикле обновлял значение у текстового ключа "$i", а не добавлял новые числовые ключи $i. Впредь будь внимательнее, или я тебя заебу вопросами ты понял?
254 1272763
>>72761
Было познавательно, особенно картинка, сам делал?
255 1272787
>>72763
У Фаулера позаимствовал.
256 1272824
Туго жаваскрипт идет.
257 1272825
>>72824
let или var ?
258 1272828
259 1272842
260 1272935
Помогите срочно! gd не работает на apache. Проверил вардампом gd_info() в самой консоли php - все показывает. Копирую то же самое в файл на серве - ошибка 500. В чем проблема? В php.ini gd2 раскомментирован.
261 1272942
>>72935
Все разрешилось рестартом сервера.
262 1273133
В шапке советуют html академию, кто-нибудь проходил там курсы? Что скажете за бесплатные/платные уроки и учебу с наставником?
263 1273166
>>73133
Рекомендую бесплатные. Темы платных курсов можно будет изучить после, самостоятельно и бесплатно.
264 1273176
>>73166
И реально после курса бесплатного можно садиться и делать свои сайты? чувствую обман
265 1273190
>>73176

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

А так, в вебе никаких секретов нет и при упорстве все можно освоить бесплатно.
266 1273191
>>73176

При этом я не говорю, что платные курсы это плохо. Если это не курсы вида "купить за деньги учебник", а например, курсы подразумевают что препод следит за успеваемостью, помогает в сложных случаях и тд, то это конечно может быть более эффективно чем самостоятельная учеба.
267 1273208
>>73190
Получается чтобы делать сайты средней руки надо знать html, php, js, css?
268 1273218
>>73208

SQL еще.

Если твоя задача как можно быстрее делать сайты, то можно взять CMS - там вообще программирования не нужно, но сделать можно только то, что заложено в CMS или ее модули.
269 1273220
>>73218
Такой еще вопрос от другого анона: насколько в работе (да и вообще на практике) нужно именно программирование а не использование CMS-ок?

Спрашиваю про уровень джуна со стажем. Реально ли новичку дрючить КМС-ки, так почти ничего за свою "карьеру" и не написав?
270 1273226
>>73220

Взял бы и попробовал использовать какую-нибудь CMS. Wordpress или Drupal. Там теоретически ничего сложного, но по факту много всяких подвохов. Так что я советую изучение программирования не забрасывать.
271 1273228
>>73218
Я изучаю для себя, хочу сделать свой проект с возможностью модернизации последующей, и чтобы голову не ломать с переделкой в дальнейшем хочется делать если не хорошо, то хотя бы правильно
272 1273237
>>73226
Я ни-ни!
тот самый анон
273 1273289
Что за наркоман выдумывал принцип работы объектов в JS? Поскорее бы вернуться к PHP, там все намного логичней.
274 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 эндпоинтов в роуты?



Достаточно добавить.
275 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 может периодически проверять наличие новых задач в БД и выполнять их.

Что касается надежности, надо смотреть на конкретную очередь - некоторые предоставляют гарантии сохранности данных.
275 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 может периодически проверять наличие новых задач в БД и выполнять их.

Что касается надежности, надо смотреть на конкретную очередь - некоторые предоставляют гарантии сохранности данных.
276 1273391

>>1248514



> http://sandbox.onlinephpfunctions.com/code/13dd69c45baf6239448f6cf4f104365e29663936


> Привет, ОП!


> Я правильно решил эту мини-задачку из ООПа?



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

>>1244359



>> addEmployee(Employee $e)


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



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

>>1238140



> https://ideone.com/Ws1AAk


> Оцените решение



> $dep <= 1000000;


Вообще, тут должно быть <, а не <=, в остальном верно.
277 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();

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

Ждем версию с антикризисными мерами.
277 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();

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

Ждем версию с антикризисными мерами.
278 1273430
>>73289

Вообще, там была идея сделать объекты без классов, на прототипах. Вот тут вот 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 завезли синтаксис для описания классов, правда самих классов фактически по прежнему нет.
278 1273430
>>73289

Вообще, там была идея сделать объекты без классов, на прототипах. Вот тут вот 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 завезли синтаксис для описания классов, правда самих классов фактически по прежнему нет.
279 1273495
>>73430
Вывод один - надо забивать на глубокое изучение JS и учить jquery.
280 1273600
Я тут единственный такой успешный могу проходить задания из оп поста по 5+ часов?
281 1273613
>>73289>>73495

В 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++ это больше структурное программирование, нежели объектное. Объектное программирование не может существовать без динамической среды. Это противоречит самому понятию объекта. А динамическое программирование это слишком сложна и непанятна. И как бы не старались с пеной у рта фанатики кричать про низкий порог входа - низкий он именно что для входа, а не для всего остального. Модификация программ в рантайме всегда было уделом креативно мыслящих людей. Для большинства это слишком сложный уровень высокой абстракции.
281 1273613
>>73289>>73495

В 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++ это больше структурное программирование, нежели объектное. Объектное программирование не может существовать без динамической среды. Это противоречит самому понятию объекта. А динамическое программирование это слишком сложна и непанятна. И как бы не старались с пеной у рта фанатики кричать про низкий порог входа - низкий он именно что для входа, а не для всего остального. Модификация программ в рантайме всегда было уделом креативно мыслящих людей. Для большинства это слишком сложный уровень высокой абстракции.
282 1273629
>>73613

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

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

>Модификация программ в рантайме всегда было уделом креативно мыслящих людей. Для большинства это слишком сложный уровень высокой абстракции.

284 1273639
>>73629

Читай внимательнее

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



И во-первых - пик 1.
Во-вторых - пик 2.
285 1273677
>>73639
Нифига себе волшебство.
286 1273750
ЖС за одно только динамическое типизирование надо запретить.
287 1273758
>>73750
Пиши на тупскрипте, никто не запрещает.
288 1273767
>>73750

>динамическое типизирование


php, python, lua, perl - тоже запретить?
Может еще беспартийных расстреливать?
289 1273815
ОП, задачку про файлообменник можно с Лярваелем сделать?
290 1273876
>>73815

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

Ну ты попробуй, давай посмотрим, что получится.
291 1273886
>>73876
Еще вопрос, какой лучше делать максимальный размер файла, и хранить ли его вечно или какой-то срок?
292 1273898
>>73886

На твое усмотрение. 100 Мб, например.
293 1273922
ОП, ты вроде забегал сюда. Не забыл про мои опечаточники?
>>72269
294 1273961
>>73876
Вообще, ты прав. Как-то слишком все просто выйдет через Ларавел.
295 1273967
>>73767
вот кстате петон можно запретить
296 1274021
>>73750
>>73967
В тот момент, когда вы перестаете хотеть что-то запрещать, ненавидеть и плеваться желчью по отношению к тому, что не смогли осилить. Вот тогда вы, достигнув сатори, становитесь программистами.

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

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

Что это за кодировка?
Как работают двойные кавычки по декодингу таких сущностей?
И как в php раскодировать переменную $a, чтобы в дампе было тоже "a"?
299 1274131
>>74128
Так, символ в шестнадцатеричной системе, понял. Значит двойные кавычки такую последовательность сами конвертируют. А как все-таки быть и одинарными кавычками?
300 1274133
>>74131
А никак, в одинарных кавычках ничего не сконвертируется. Баш напоминает. И вообще я мимокрокодил.
301 1274143
>>74133
Блин, как же быть?
Мне один сервис отдает данные в виде такой строки: '\x61\x61\x61'
И мне ее надо у себя на сайте сконвертировать в читаемые символы.
302 1274144
>>68753 (OP)
Зацените мой YodaSpeak(хотя скорее Yoba). Короче смотрите и завидуйте моему изящному коду))) Кста тз перепутал и теперь йода рандомом пиздит лол
https://repl.it/@Ninogi/UncomfortableWickedTransformations
303 1274148
>>74143

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

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

$a = "\x41";

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

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

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

Однако, есть функции как stripslashes и stripcslashes. Почитай про них.
304 1274151
>>74148
Анон, ты наверное не понял.
Вот есть у меня переменная $a:
$a = '\x41';

Во время работы скрипта, в переменной будет именно строка из символов '\x41' без всяких преобразований.
Так вот, как мне дальше в скрипте значение переменной $a преобразовать в символ A?
sage 305 1274178
>>74151

>Так вот, как мне дальше в скрипте значение переменной $a преобразовать в символ A?


в двойные кавычки ебани echo "\x41";

мимикрокодил
306 1274181
>>74178
ууу, как же сложно-то.

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

вот так возможно сделать какой-либо функцией?
307 1274187
>>74181
mb_convert_encoding("\x41", 'UTF-8');
308 1274189
>>74187
Энкодинг бесполезен. На моменте интерпретации строки в двойных кавычках, уже будет получен символ А.
309 1274190
>>74181
А вот так проверять кодировку
echo mb_detect_encoding("x41");
310 1274195
>>74151

Ты мой пост невнимательно прочел.
311 1274196
>>74189
echo pack("H", '\x41');
312 1274199
>>74196
Наконец-то решение.
Только вот так будет правильно: echo pack("H*", '41');
Как же быть со строкой '\x41\x41\x41\x41'?
preg_match'ем искать цифры, потом их прогонять через pack и склеивать?
313 1274200
Поясните, почему в шапке говорится про symphony? Остальные фреймворки совсем говно чтоли? Как на счет Laravel?
314 1274201
>>74199

>preg_match'ем искать цифры, потом их прогонять через pack и склеивать?


Да))

Когда приходить такое - это пиздец.
Если это приходит с какого-то сервера то значит сериализация запорота
315 1274204
>>74195
спасибо, анон
stripcslashes('\x41\x41');
работает, как нужно
316 1274205
>>74200

>symphony


symfony

>Laravel


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

Сам пробовал и то и это.
Говнокод есть и там и там, но ларавельщики вообще тупые нахуй какие-то.
317 1274237
Спрашивают ли алгоритмы и структуры данных на собеседованиях?
318 1274239
>>74237

>алгоритмы и структуры данных


Любое нормальное тех. собеседования и этого и начинается. Это основа, дебил. Если ты, чмо тупое, не знал об этом, то не теряй время, а читай учебники и решай задачи. Через годик освоишь.
319 1274240
>>73388

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


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


в выходные doker and CI постараюсь прикрутить

вот тут ещё сделал рефакторинг и написал тесты
https://github.com/Qevg/Student-list
320 1274272
>>74237
На веб-макакия? Нет, в основном.
321 1274273
>>74237
Бывает, элементарщину спрашивают.
Пару раз было просили что то реализовать, но они ебанатами были полными.
Пыхеру редко когда это все надо, особенно крудошлепам уоторые магазины по продаже бисера пишут.

А вот про стандатные структуры типа \SplQueue, часто спрашивают.
Так что если сможешь объяснить что это и нахуя нужно, то нехило так блеснешь знаниями
322 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>

Перезапустил апач.
А теперь вопрос, почему это нихуя не работает?
323 1274298
>>74288

> почему это нихуя не работает


А мы почем знаем?
324 1274316
>>74288

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

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

Если прописал, то что получается при попытке открыть сайт? Что в логе ошибок Апача?
325 1274323
>>74316

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


Это называется недосып, совсем крыша поехала.
А проблему я уже решил.
326 1274437
>>74273
Спасибо. Элементарщина, это типа найти сложность алгоритма и что это вообще такое, чем отличается сортировка слиянием и пузырьком с точки зрения времени выполнения, ну и всё в этом духе?
327 1274444
Какие характеристики ноута посоветуете для веб-разработки? Вкатывальщик, ничего сложного ануса разрабатывать скорее не дадут.
328 1274471
>>74444
Все на чем можно набирать текст в текстовый редактор подойдет.
Если денег не жалко, то 13 + дюймов на базе интела от 8gb оперативки, ssd 128gb+ и батарея поживучей (тут главное не купить "планшет в корпусе ноутбука"). Среди моих знакомых сейчас в тренде синкпады, т.к. последние Макбуки Про пугают все постоянными косяками с клавиатурой.
329 1274477
>>74444
ThinkPad, если хочешь быть модным.
330 1274524
Круто, внезапно, вообще перестали сss-ки работать, даже если я положу их в одну папку с шаблонами.
331 1274542
>>74437

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



Просто, какие знаешь, чем отличаются
332 1274617
Pure или бутстрап? Оба выглядят отвратительно, но, вроде как, pure настраивать легче, или нет?
333 1274626
>>74617

ReactJs
somebae.jpg115 Кб, 808x1024
someApprentice 336 1274823
У нас, на сайте phpclub.tech, есть задача, с которой справился бы любой новичок.

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

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

https://ru.wikipedia.org/wiki/Навигационная_цепочка

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

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

Чувствуйте себя свободно задавать если есть какие-то вопросы.
337 1274975
>>74823
А вы работаете пацаны, программистами? Специально учились или благодаря треду?
48828988p0master1200.jpg184 Кб, 800x800
338 1275022
Надо переставать писать enctype="multipart/formdata", постоянно дефис забываю, а потом полтора часа голову ломаю, почему $_FILES пустой.
339 1275024
Аноны, сайт phpclub.tech, который упомянут выше - это "официальный" архив тредов клуба PHP. В нем, например, можно найти комментарии по разным задачам.

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

Если, например, вы сейчас готовитесь делать задачу про студентов, или делаете, то у вас знаний вполне достаточно.
340 1275055
FILTER_SANITIZE_SPECIAL_CHARS пойдет для фильтрации имен загружаемых файлов?
26b09940c8afd668f1eaeb502e45d1d8.gif299 Кб, 310x222
341 1275091
>>74471
>>74477

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

Как такое? Какие пеки у вас?
342 1275111
>>74444

Проверь, нет ли в нем неприятных ограничений. Например, я сталкивался с ноутом, где стояло ограничение на 4 Гб памяти (больше нельзя поставить).
343 1275117
>>75091

>1366x768


Я б нистал меньше 1080p. В /hw/ есть тред синкпадо-анонов, есть смысл с ними проконсультироваться для твоего бюджета. Может можно L380 дешево проапгрейдить.
344 1275130
>>75111
>>75117
Спасибо ребята :3
someApprentice 345 1275147
>>74975
Да-да, работаем и все благодаря этому треду.
someApprentice 346 1275152
>>75024

>ну ок, если вы начинающий, то совсем быстро разобраться не получится


А вот не нужно пугать начинающих! Всё получится если иметь желание и энтузиазм разобраться. Главное начать и, если что-то непонятно, задать правильный вопрос.
347 1275157
>>74823
Вкачусь в воскресенье, если никто не опередит.
someApprentice 348 1275181
>>75157
Уже опередили.

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

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

Чувствую себя свободно задавать любые вопросы.
349 1275401
>>68753 (OP)
Здравствуйте, господа. Пишет вам java-собрат. Пару дней назад получил от знакомого заказ на wordpress интернет магазин, вполне стандартный, с онлайн конрзиной, оплатой и избранным. Локация ДС

Никогда не занимался таким, но сложно не должно быть. Сколько ценник ломить?
350 1275449
Как лучше хранить дефолтные настройки для пользователей, что бы их мог менять администратор? Сделать в базе дефолтного пользователя и грузить его каждый раз до вызова всей логики? Держать в json файле?
Как белые люди делают?
351 1275451
>>75449

>Как белые люди делают?


В инишниках хранят.
352 1275483
>>68753 (OP)
Подскажите, вот у ОПа в задаче про список студентов предлагается каждого студента делать объектом, но зачем это мне?
В любом случае обработка действия это обращение к БД->получение данных->формирование таблицы, зачем мне добавлять еще шаг ->загнать данные в объекты-> перед формированием таблицы?
353 1275545
>>75483
И вообще, мускль неплохо так и в командную строку выводит в виде таблицы, может мне просто скриншот отдавать, и обращений к БД не надо никаких, профит.
354 1275547
Хотел отдохнуть сегодня от написания задачки, но слишком уж хочется коммитить. Как это лечить?
355 1275563
>>75547
Прописываю Вам регулярный просмотре аниме 2 раза в сутки, утром и вечером.
356 1275570
>>75545
Спасибо, охуенно объяснил. Пошел ты нахуй
357 1275572
Ну что анонсы. Есть ли смысл дропать питон и дрочить пхп? А то деньги на жрат ощена нужны. Говорят у вас тут с этим все в порядке.
358 1275578
>>75483
А я люблю обмазываться объектами когда делаю студентов. Каждый день я хожу по земле с черным блокнотом и собераю в него все сущности которые могу придумать. На два полных блокнота целый день уходит. Зато, когда после тяжёлого дня я прихожу домой, сажусь за пеку, включаю любимую IDE…ммм и сваливаю в нее свое сокровище. И набираю, представляя, что меня поглотил единый организм Object. Мне вообще кажется, что объекты, умеют думать, у них есть свои семьи, города, чувства, не прекращайте плодить сущности, лучше приютите у себя, говорите с ними, ласкайте их…. А вчера в ванной, мне преснился чудный сон, как будто я нырнул в море, и оно прератилось в интерфейс, рыбы, водоросли, медузы, все в виде объектов, даже небо, даже Аллах!.
359 1275586
>>75578
Содомит
image.png80 Кб, 640x870
360 1275620
>>75483
Вот такая поебень, зачем?
361 1275625
>>75483

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

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

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

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

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

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

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

Соответственно, исходя из плюсов/минусов мы и выбираем нужный вариант.
362 1275630
>>75625
Вопрос по ООП-Будильнику.

Как лучше реализовать изменение параметров Alarm, через AlarmClock?
В каких случаях стоит использовать выбрасывание исключений?
363 1275631
>>75630

>Заранее спасибо!

364 1275633
>>75625
Спасибо.
365 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(), но ничего все равно не работает.
366 1275641
>>75630

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

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

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

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

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

Во-вторых, а как по-твоему работает функция setcookie? Она, очевидно, добавляет в HTTP-ответ HTTP заголовок. Но HTTP заголовки в HTTP-ответе должны идти до тела ответа, а вывод HTML кода начинает отдачу тела ответа.
368 1275649
>>75643
Понел, спасибо.
369 1275694
Пытаюсь учиться по гайду из Оп-поста, немного застрял на игре в кубики, по 2 броска которая. Как логически реализовать я понял, а вот код не хочет работать. Уже трижды сам находил свои ошибки и поправил их, но где-то все равно остались косяки, помогите найти, пожалуйста.
https://ideone.com/kLyMgg
370 1275697
>>75694
Я идиот, простите. В строке

>if (($anonDice1 == $anonDice2) && ($compDice1 == $compDice2)) {


забыл закрыть вторую скобку. Теперь все работает
371 1275897
Есть ли способ получить инфу о медифайле помимо отвратного getID3?
372 1275900
>>75697
Зачем тебе вообще скобки в этом выражении?
Screenshot6-4.jpg66 Кб, 815x475
373 1276045
Палиндром
jdoodle.com/a/HQs
Новый айПад
jdoodle.com/a/HQJ
Стих
jdoodle.com/a/H4L
metadata.png162 Кб, 1911x640
374 1276066
Сколько же дерьма в этой вашей медии.
375 1276140
Я так понимаю, в разделе "Регулярные выражения" в задаче про телефонные номера ОДНО регулярное выражение должно покрыть ВСЕ "правильные" варианты введения номера, верно?
376 1276189
изображение.png25 Кб, 1231x781
377 1276194
>>68917

>jdoodle.com/a/G3e


это не кодерский подход. А если тебе скажут группировать по сочетанию первых двух букв? Будешь уже 32x32 ифов писать?

Этот сайт не дает сохранять без регистрации, так что только скрин.
378 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");

все работает. В чем может быть проблема?
379 1276407
>>76398
Нельзя биндить названия колонок, таблиц, баз e.t.c.
380 1276408
>>76407
Ясно. Эт жопа.
381 1276417
>>76398

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

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

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

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

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

...prepare("... WHERE `$field` LIKE ? ... ");
382 1276418
>>76408
Нет, это нормально. Ты можешь подставить сам:

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

Но если ты берешь это из инпута, то обязан проверить. Например сперва прогнать через белый список.
383 1276422
>>76417
Как. Здравствуйте, товарищъ Хайвмайнд.
384 1276509
Блин какая же сложная задача про числа прописью.
upload.png13 Кб, 502x303
385 1276523
Хватит столько инфы о файле для обменника?
386 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]?/
387 1276550
Сколько же танцев с бубном пришлось исполнить из-за того, что массивы при использовании json_encode теряют порядок.
388 1276563
>>76525
Переделывай, это пиздец
389 1276564
>>76523

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

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

А в PHP массивы сохраняют порядок и объединяют в себе функционал массивов и словарей из JS.
391 1276569
>>76563

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

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

Допустим, у нас есть выражение для "одной буквы": [a-z]. Чтобы записать "от 2 до 5 букв", можно использовать фигурные скобки: [a-z]{2,5}.
392 1276571
>>76567
Да понятно. Пришлось это обходить заворачиванием в новый массив, в котором под нулевым ключем все ключи, а под первым все значения. Тогда порядок можно сохранить.
393 1276575
>>76525
это в лоб, прочитай условия задачи и примеры внимательно
394 1276576
>>76571

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

[
{ key: x, value: y},
{ key: z, value: w}
]
395 1276578
>>76576

>Странный


Ну не знаю. Для последующего декода очень даже удобный.
someApprentice 396 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;
}
proxy.duckduckgo.com.jpg17 Кб, 474x266
397 1276940
/([+] ?[7] ?| ?8[-]?) ?[(]? ?\d{3}\d? ?[)]? ?-? ?\d\d? ?-? ?\d ?-? ?\d{2} ?-? ?\d{2} ?\d?/
proxy.duckduckgo.com.jpg118 Кб, 1280x720
398 1276975
>>76940
/[+]?([ ]{1,})?[-]?[(]?[ ]?[+7]?[0-9]{1,}[ ]?[)]?/

Неужели всё было так просто? -_-
399 1276991
Ох лол... понял фейл.
400 1277028
401 1277058
ОП убежал, так что можно не торопиться вкидывать по одной
402 1277059
>>76975
сорян, что из пхп кода, вот
$pattern = "/^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$/";
403 1277072
>>76937

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

$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.

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

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

$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.

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

>/([+] ?[7] ?| ?8[-]?)


ололо
405 1277094
>>76940

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

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

Примеры:

Правильные выражения:
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*)*$

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

Попробуй так же записать свое выражение. Что в нем может встретиться и где.
405 1277094
>>76940

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

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

Примеры:

Правильные выражения:
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*)*$

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

Попробуй так же записать свое выражение. Что в нем может встретиться и где.
406 1277130
Я потрачу полгода на изучение и смогу после этого зарабатывать в комплютере и самосовершенствоваться?
407 1277132
>>75639
Еще куки можно поставить c помощью мета тега:

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

Но так делать, конечно, не стоит, если только нужно установить куку, а заголовки по какой-либо причине уже были отправлены клиенту и изменить это нельзя.
1271604324preview201801161941461.jpg150 Кб, 1280x971
408 1277151
([+] ?[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

Ммм регулярка...
proxy.duckduckgo.com.jpg11 Кб, 342x342
409 1277152
>>77094
>>77077
>>77059
Спасибо за ответы, сейчас буду разбираться
eg.PNG24 Кб, 943x438
410 1277164
>>77059

>"/^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$/"


Не работает
reg2.PNG21 Кб, 937x399
411 1277165
>>77059
Работает со знаком вопроса, но наполовину. Больше одного знака не цифры чот не хочет, разве запись "{10}" не относится к символам, отличных от цифры?
proxy.duckduckgo.com.png2,4 Мб, 1635x1582
412 1277166
>>77094
>>77059
^\s?(8|\+\s?7)([\s\(-]\d[\s\)-]){10}$
Ололо работает! прекращаю срать в тред и иду разбираться почему работает
413 1277169
>>77094
>>77059
^\s?(8|\+\s?7)([\s\(-]\d[\s\)-]){10}$

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

А потом как у всех.
15378125750940.jpg32 Кб, 382x362
416 1277224
>>77169
Бляяяяяять, разметка! Я обосрался дважды -_- И тот анон тоже ошибся. Вот она, регулярочка:

>^\\s?(8|\\+\\s?7)([\\s\\(-]\\d[\\s\\)-]){10}$

417 1277226
>>77224
Обосрался третий раз...
418 1277230
>>77226

>Обосрался третий раз...


мы вам перезвоним
# OP 419 1277239
https://youtrack.jetbrains.com/issue/WI-38997

Товарищи пхпшники проголосуйте пожалуйста.
420 1277270
>>77239
Опушка, а когда задачки проверять будешь? Ты для многих из нас был главным источником мотивации.
421 1277279
>>77270
Это не истинный оп.
jhjj.png12 Кб, 900x129
422 1277291
Но ведь достаточно просто имя файла в двойные скобки поместить и все будет прекрасно работать.
423 1277300
>>77291

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

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

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

(кстати там же можно увидеть код, поддерживающий отдачу через X-Accel-Redirect)
424 1277308
>>77300
Хм, действительо. Проверил киррилицу в жопере, огнелисе и хроме - работает, а эксплорер хероту выдает.
425 1277309
Хотя, написал:
header('Content-Disposition: attachment; filename="'.urlencode($data[0]['orig_name']).'"');
и теперь в эксплорере под нужным именем сохраняется. Иероглифы тоже проверил.
someApprentice 426 1277349
>>77072
Я пытался самостоятельно закончить шифровальный мессенджер на 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, как напрасно как жаль, эх...
someApprentice 426 1277349
>>77072
Я пытался самостоятельно закончить шифровальный мессенджер на 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, как напрасно как жаль, эх...
427 1277389
>>77349

Ну, я думаю, что изучение 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 код напрямую.
427 1277389
>>77349

Ну, я думаю, что изучение 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 код напрямую.
428 1277403
Есть непустой массив $data_success(проверено вардампом).
Есть вывод шаблона через слим :
$response = $this -> view -> render($response,'home.phtml', $data_success);
Есть шаблон home.phtml с кодом:
<? if(isset($data_success)): ?>
Код №1
<? else: ?>
Код №2
<? endif; ?>

Вопрос: почему всегда отображается код номер два?
429 1277425
>>77403
Сам разобрался. Анальный фреймворк все переданные значения переименовывает автоматически.
someApprentice 430 1277500
>>77389

>То есть ты можешь, например, отрендерить на сервере страницу со списком контактов и последними сообщениями, а потом подцепить к ней приложение. Причем отрендерить стоит упрощенную версию страницы, чтобы пользователь не тыкал зря на неработающие кнопки. Сделать контакты ссылками - это позволит переключаться между ними. Сделать форму отправки классической 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 430 1277500
>>77389

>То есть ты можешь, например, отрендерить на сервере страницу со списком контактов и последними сообщениями, а потом подцепить к ней приложение. Причем отрендерить стоит упрощенную версию страницы, чтобы пользователь не тыкал зря на неработающие кнопки. Сделать контакты ссылками - это позволит переключаться между ними. Сделать форму отправки классической 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 431 1277501
>>77389

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


>


>- сделать отдельные страницы на отдельных роутах для упрощенной 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.

>Если тебя беспокоит скорость загрузки 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 431 1277501
>>77389

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


>


>- сделать отдельные страницы на отдельных роутах для упрощенной 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.

>Если тебя беспокоит скорость загрузки 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 432 1277505
>>77501
* на изображении 2-pic нужно обратить внимание на переменные заголовка (title) - в PHP шаблоне выведется 'Symfony', а в Angular выведется 'ng'.
MegaFun.png53 Кб, 1920x1052
433 1277618
После уныло-похоронного списка студентов обменник решил сделать поярче. Жаль только, что я вообще никак не могу понять, как сменить стиль поля выбора файла.
434 1277622
>>68753 (OP)
Ребят, у меня вопрос по организации процесса разработки - деплоя. Хотелось бы узнать как вы это автоматизируете и увидеть на реальных примерах весь процесс.
Как я делаю это сейчас: есть у меня несколько сайтов. Поменял я, допустим, какой-то код, сохранил файл, закоммитил и залил через ide на рабочий сервер.
Может кто-нибудь подробно расписать как это всё автоматизируется, чтобы сам процесс загрузки изменённых файлов на рабочий сервер происходил автономно, а от разработчика требовался только коммит в мастер ветку, например.
435 1277681
>>77618
Аниме-дитя, ты?
[Glue] Amanchu! - 10 [BD 1080p][8DB345D8].mkvsnapshot09.32[[...].png4,2 Мб, 1920x1080
436 1277688
>>77681
Сам ты аниме.
117dda9d2311bb2861977bb5735dd9b2.jpg243 Кб, 630x330
437 1277780
Сиськи! Внимание! Молния! Внимание привлек)
Вопрос: Может кто нибудь подсказать как открыть сайт для любого пользователя?
Надо что бы можно было прописать ip , порт и подключится с любого компьютера
438 1277797
>>77780

>Сиськи! Внимание! Молния! Внимание привлек)


Укатывайся обратно к себе на пикабу, сын собаки сутулой.
439 1277809
>>77780
Как вариант, можно сделать авторизацию на уровне apache-сервера с помощью .htaccess
UKevggrHgkA.jpg131 Кб, 708x1000
440 1277922
Анончик здравствуй, начал вкатыватья в кодинг, решил пощупать пхп. Сейчас иду по ньюби гайду в шапке.
Решил задачку https://ideone.com/e.js/o57cn0
Все хорошо, но не выполняется условие в 13 строке, не могу понять чому. Уже поздно и мб я в глаза ебусь, но сколько не разбираю непонятно. Хэлп.
хы.jpg92 Кб, 862x599
441 1277927
>>77922
Да вроде выполняется всё.
442 1277928
>>77927
я "и" перепутал с "или"
лел
443 1277977
>>69893
Норм синтаксис, вот $a жуть.
444 1278013
Существует достойная опен сорс бесплатная замена пхпшторму?

Я так понимаю нетбинс более менее норм?
445 1278019
не понял почему остаток от деления работает так:
50 % 100 = 50, тут же нет остатка?
446 1278022
>>78019
Ты 50 делишь на 100, остаток сразу есть.
447 1278023
>>78019
Не волнуйся, вы это пройдете в 6-м классе.
448 1278024
>>78022
посмотрел в вики, оказалось что это не тривиальная операция, остаток - это типа частичка которая дополняет неполное частное, при этом поведение при отрицательных числах тоже не тривиально, тут надо смотреть формулу, а не интуитивно понимать.
9/90 = 90 * 0 + 9
449 1278025
>>78023
сьеби, токсичный даун
450 1278054
Охренеть imagick медленный. Сделал анимированные превьюхи для гифок через него, так он их генерирует секунды три.
451 1278112
>>78054
гореть в аду такому бордописателю
мимо
452 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?
453 1278206
>>77797
Ты хентай 90-х
454 1278222
>>78182
Всё перегуглил. Нужно что-то отправлять в 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");
Но ничего не поменялось. Кажется, оно даже не отправилось.
455 1278306
>>78222

Есть тег base, но с ним аякс-запросы получатся кроссдоменными и работать, конечно же не будут. Ты что-то делаешь не то. Я вообще не понимаю, зачем ты заменяешь ссылки в тексте страницы, да и еще и таким кривым, корявым методом.
456 1278382
>>78306
Вот тег твой очень помог, а я вообще даже не думал смотреть в сторону html. А метод был корявым, потому что этого для начала хватало и альтернатив я не знал.

Буду теперь искать, как Access-Control-Allow-Origin обойти. Это же возможно?
14825424996810.jpg477 Кб, 1536x2048
457 1278487
Заметил за собой, что невнимательно читаю условия задачи. Так бы времени экономил огого.
458 1278489
>>78382

>Это же возможно?


В общем случае нет.
459 1278562
Задачу про ТестХаб хоть кто-нибудь полностью делал? Выглядит слишком долгой для аттенш спана среднестатистического мейлачера-вкатывальщика.
460 1278576
>>78222

>al_im.php


У вк есть API.
461 1278585
>>78562
Я тут читал архивач в глубь, там был разговор на эту тему. К тому времени как упорные аноны берутся за эту задачу, они уже начинают ходить по собеседованиям и как правило находят работу.
462 1278596
>>78562
Я тоже читал часть старых тредов (на phpclub.tech), никто даже на процентов 30 не реализовывал того, что описано в задаче, только самые базовые вещи, которые средний разраб накидает за вечер.

>>78585
Так и есть, если реализовать полностью ту задачу с полным покрытием тестами и деплоем, то можно апплаиться на junior+/middle-
Задачу очень долго делать и не очень понятно зачем, если с такими навыками уже можно получать деньги.
463 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
463 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
464 1278644
>>78643

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


Вообще в докеркомпостер конфиге можно определить ГЛАВНЫЙ сервис, например, в котором поднимается php-fpm делается копосер инсталл и вообще хранится код, когда этот сервис соберется то остальные уже должны будут собранными быть
465 1278645
>>78644
UPD:
app:
build:
context: docker/php7-fpm
volumes:
- ./:/var/www/site:cached
depends_on:
- mysql
- mongodb
- beanstalkd
466 1278651
Вкатился на первую работу еще на ругулярках кажется.
В итоге с перерывами уже 3 года кожу по сути. Дальше вектора в итоге не дошел в силу лени и неусидчивости.
467 1278673
>>78643

Прочел ли ты примечания к пункту 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
467 1278673
>>78643

Прочел ли ты примечания к пункту 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
468 1278675
>>78596

Middle во многих компаниях это года 3 опыта, желательно на фреймворках. Задачу делать, конечно же, имеет смысл - ОП поможет тебе писать большие приложения правильно, соблюдая все лучшие практики, а не наобум.
469 1278719
>>77780

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

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

>>77622

Самый простой способ - деплой через гит. На сервере добавляешь в 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 (заблокирован в РФ)
470 1278720
>>77618

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

>>77501

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

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 версию.

Если у тебя есть время, я бы советовал полностью разобраться в этом. Так как пока есть пробелы в знаниях. Я всегда готов ответить на вопросы и пояснить.
470 1278720
>>77618

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

>>77501

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

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 версию.

Если у тебя есть время, я бы советовал полностью разобраться в этом. Так как пока есть пробелы в знаниях. Я всегда готов ответить на вопросы и пояснить.
471 1278721
>>77500

> сначала отдавалась отрендеренная страница на 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, и многое другое.
471 1278721
>>77500

> сначала отдавалась отрендеренная страница на 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, и многое другое.
472 1278722
>>77500

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

Ты делаешь форум - один подход. Делаешь сайт с редко менябщейся документацией - другой. Делаешь интерактивное приложение (мессенджер) - третий.
473 1278969
>>78651

> В итоге с перерывами уже 3 года кожу по сути. Дальше вектора в итоге не дошел в силу лени и неусидчивости.


А на работе как дела? Часто нагоняй получаешь от ТимЛида?Повышали зп? Менял место работы?
474 1278975
Сап, двач! Есть ли кто-то, кто разрабатывает на php с freebsd?

Какие подводные? Заведётся ли докер? Вообще, стоит ли пробовать такое?
475 1279357
Анчоусы, надо сгенерировать письмо юзеру со ссылкой на опрос. Его он может пройти без авторизации, почему надо создать в БД запись user_id => hash и в ссылку на опрос этот хэш поместить.
Вопрос: как создавать этот хэш? Какой функцией или алгоритмом?
476 1279387
>>79357
Функцию hash() не пробовал?
477 1279394
Зачем в абстрактных классах доступны приватные методы/свойства? Какой в этом смысл? Ведь объект абстрактного класса не может быть создан, а его дочерние классы не могут получить доступ к приватным методам и свойствам.

Или могут и я где-то проебался?
478 1279395
>>79387
Вот загуглил про нее, думаю какой алгоритм теперь выбрать.
Алао на счёт соли непонятно: как ее сгенерить и какой длины, подставлять в начало или конец, можно ли хранить ее как константу класса или обязательно в БД?
479 1279399
>>79394
Приватные функции родительского абстрактного класса могут использоваться в защищённых функциях в нем же. А доступ к защищённым есть у дочернего класса.
480 1279420
>>79394
Пожалуй, поясню немного. Вот какой смысл в этой хуйне? Чтобы что? Пик 1

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

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

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

>>79399
Не до конца уверен, что правильно осознал написанное, но пока аутировал тут - на мой вопрос ответили. Ну и хуй с ним, всё равно вкину в тред, может, кому-то другому поможет наблюдение за ходом моей мысли.
481 1279436
Да, я определенно нихуя не понял. Оставим методы в стороне, поговорим о свойствах. Мною происходящее воспринималось примерно так, что свойство - часть объекта. То есть, на основании класса К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 482 1279602
>>78720
>>78721
Мне нравится 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, разве нет?
someApprentice 482 1279602
>>78720
>>78721
Мне нравится 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, разве нет?
483 1279605
>>78975

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

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

Но вообще, на PHP можно и без докера разрабатывать.
484 1279639
>>79357

Это не хеш. Хеш это результат математического преобразования исходных данных. Почитай определение: https://ru.wikipedia.org/wiki/Хеширование

Тебе нужен просто случайно сгенерированный надежным генератором токен. В PHP7 для этого есть random_int и random_bytes.
485 1279649
>>79420

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

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

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

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

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

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

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

Таким образом, реализуется инкапсуляция - сокрытие внутреннего устройства класса и разделение ответственности между классами.
486 1279664
>>79436

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

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

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

Когда ты описываешь класс, 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
486 1279664
>>79436

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

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

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

Когда ты описываешь класс, 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
487 1279667
>>79639
А как же коллизии? Для разный email'ов теоретически может быть одинаковая "рандомная" строка.
488 1279668
>>79436

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



Это указание на объект, просто при поиске свойства или метода проверяются правила доступа. И учитывается, из какого класса мы пытаемся к ним обратиться.
489 1279670
>>79667

1) Ну-ка посчитай вероятность такой коллизии
2) Ты можешь при генерации проверить, нет ли коллизии, и перегенерировать.
490 1279671
>>79667

И в базу нужно влепить уникальный ключ для защиты от дубликатов.
491 1279675
>>79670

>2) Ты можешь при генерации проверить, нет ли коллизии, и перегенерировать


Тогда лишний запрос к БД.
Не легче ли поюзать что-то типа:
$salt = 'verystrongsalt';
$token = hash('sha256', $salt . 'a/tibuANUSgmaiz~9lPUNCTUMco+a@m');
492 1279679
>>79675

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

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

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

Я замечаю, что когда некоторые люди узнают про хеш-функции, они пытаются везде их использовать, даже там, где не надо.
493 1279682
>>79679

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


Ну хотя бы не делать лишний запрос в БД, чтобы искать, есть ли такая рандомная строка или нет.
494 1279838
>>78719
Спасибо, анон, за пояснения про деплой - очень полезно.
495 1279840
Это норм что у пхп RPS меньше чем длина хуя типичного пыхера?
496 1279845
>>79840
Пошел нахуй
497 1279881
Ларавель рассчитан на даунов, или у авторов документации и их учебных видюшек просто такой стиль?
498 1279936
>>79664
Вот за это я и не люблю ООП.
499 1279948
>>79936
За логичность?
500 1280068
какаие же упоротые фреймворки на нем
501 1280072
>>68753 (OP)
Подскажите пожалуйста как добавлять запрос в конец URI по клику на кнопку, может есть способ проще чем разбирать текущий и собирать новый?
В той же задаче про список студентов: поиск index.php?search=хуй, потом сортировка &sort_by=first_name, а потом го на вторую страницу &page=2.
502 1280080
>>80072
Пишешь ссылку, добавляешь , что тебе нужно в ее конец.
503 1280086
>>80080
Смотри, у меня уже есть результат поиска, выглядит так: i.php?search=хуй
Делаю кнопку с href='i.php?sort_by=хуй'.
И таблица будет отсортирована, только результаты поиска пойдут по пизде, а хотелось бы чтоб по клику стало i.php?search=хуй&sort_by=хуй, но может же быть сортировка и до поиска.
504 1280097
>>80072

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

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

Кстати, есть еще относительные URL вида ?sort=name : https://github.com/codedokode/pasta/blob/master/network/urls.md
505 1280150
>>79948

ПРИСВАИВАЕШЬ ПЕРЕМЕННУЮ
@
ПРИСВАИВАЕТСЯ
@
ТЕПЕРЬ У ТЕБЯ ДВЕ ПЕРЕМЕННЫХ
@
ЗАБЫЛ ПРИСВОИТЬ
@
А ОНА УЖЕ ПРИСВОЕНА ДО ТЕБЯ
@
ЛОГИЧНОСТЬ
506 1280234
Решил, перед тем как начать писать ТестХаб, отправить резюме на несколько джуно-вакансий. Чувствую, что обоссут.
507 1280385
>>80234
TestHub недостаточное условие для трудоустройства на джуна
508 1280401
>>80385
Да, это, скорее, на миддла.
509 1280525
>>78719

>Самый простой способ - деплой через гит. На сервере добавляешь в git hook баш-скрипт, который при пуше делает нужные действия


А как git на рабочем сервере узнает об этом пуше?
Я думаю сделать так: на локальной машине, где ведётся разработка, я делаю пуш в удалённый репозиторий (битбакет), на битбакете настраиваю веб-хук, инфа о пуше через веб-хук летит на рабочий сервер по адресу сайта и там я уже запускаю composer если надо, git pull и т.д.
Хуйня или норм?
nono.png39 Кб, 564x768
510 1280664

>включаешь видеокурс


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


Как это надоело.
>>78720

>Рисуем свою кнопку, поверх нее кладем прозрачный инпут, при выборе файла выводим яваскриптом имя


Как-то так?
511 1280788
>>80664
Анимешник, а ты доделал список студентов?
5105810491.jpg49 Кб, 532x503
512 1280793
Решение задачки по размену в тупую(т.е. не методом динамического программирования) показалось невероятно сложным и "думал" половину дня. Цикл с пика дополняется костылями в виде проверки суммы подмассивов массива на соответствие необходимой сумме к размену, лишние варианты стираются - https://ideone.com/FLJC6a
Все оче плохо?
513 1280803
Что можно написать на пыхе в 2018, чтобы горда указывать её в резюме? Везде нужно обоссные фулстаки, никому чистая фронт макака не нужна. Гостевуху или что-то повеселее, и сколько на это нужно времени? Знаю джс и немного жабу в универе пердолил. Извиняюсь за классику.
514 1280858
>>80788
Давно уже.
515 1280991
В понедельник иду на собеседование пхп-ларавел-макакой, на нем раньше не писал почти кроме лаба1 и курсач3 другой работы один хуй нет в мухосранске, что нужно подтянуть в плане знаний? И чтобы пройти, и чтобы не обсираться сходу на рабочем месте.
516 1280992
>>80991
Ах да, бэкенд-жуниор.
517 1280998
>>80991
Если в студию сокол идешь - ничего не надо, если в приличную контору - не успеешь.
518 1281006
>>80998

>Если в студию сокол идешь - ничего не надо


Других и нет у нас.
Ну энивей минимум-то надо какой-то. https://laravel.com/docs/5.7 хватит дрочнуть, чтобы писать интернет-магазинчики для наебизнесменов мухосрани?
519 1281036
>>80991

>Что нужно подтянуть в плане знаний?


Перемножение матриц и сортировку пузырьком
[Harunatsu] Komori-san wa Kotowarenai! - 10 [BD 720p-AAC][F[...].png1,4 Мб, 1280x720
520 1281065

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

golang.png1 Кб, 165x49
522 1281112
523 1281120
>>81065
Го в дс, будем снимать одну комнатку на двоих :3
524 1281276
525 1281279
Если я застрял на 2 задаче (про курс доллара) я совсем даун?
526 1281280
>>81279
Вроде решил, но хуле в условии написано дописать строчку? Или я неправильно решил?

https://ideone.com/S8pq4n
527 1281281
http://codepad.org/7N715LEE

Дайте, пожалуйста, совет, как можно попроще решить задачу с палиндромами, ибо я придумал только через костыли.
528 1281283
<?php

error_reporting(-1);

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

?>

Почему строчка с рандомом неправильная? хуле ему надо?
Нахуя нужно \n если можно поставить ; и писать с новой строчки?
529 1281284
>>81283
В $mt_rand ты вместо простого интервала от 1 до 6 ссылаешься на переменные $1 и $6
530 1281285
>>81284
Так в мануале написано, хоть бы подписали что $ это всегда переменная
531 1281402
>>81281
убрать пробелы через str_replace(' ', '', $text)
532 1281522
533 1281523
Таки зачем передавать данные в $_POST через ajax, если можно и без него?
534 1281556
зачем вы изучаете этого франкенштейна?
535 1281561
>>81523

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

Поясни, о какой ситуации идет речь.
536 1281564
>>81561
Я говорю, зачем мне отправлять серверу данные из формы через ajax, если их можно отправить сабмитом в указанный action. Дело только в отсутствии необходимости обновлять страницу?
537 1281603
>>81285

>хоть бы подписали что $ это всегда переменная


Глаза разуй
538 1281605
Ща будет перекат
540 1281618
>>81402
А другие действия как то можно сократить?
who is taller than anon.training.png65 Кб, 640x994
541 1282086
Попытался всё-таки сделать вторую задачку на массив. Можно ли сделать этот код короче и как?
542 1282127
>>82086
Я тут не местный, самоучитель ОПа не открывал ни разу. Но если к этому моменту ты уже знаешь про циклы, то можно сократить. Получаешь список ключей массива, потом циклом проходишь по ним. Не нужно 100500 if.
543 1282267
>>82086
Это троллинг или у всех зумеров теперь такие симптомы? Отвечал уже одному такому по другой задаче но с аналогичным подходом >>76194
хуй знает поможет тебе это или нет
Тред утонул или удален.
Это копия, сохраненная 24 ноября 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски