Это копия, сохраненная 20 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>523494 (OP)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:
Подскажи сайты для поиска работы, я не умею гуглить? brainstorage.me, geekjob.ru, hh.ru
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Если тебе лень выравнивать код руками, закачай его на 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/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Если тебе лень выравнивать код руками, закачай его на 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/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
>>531680 https://github.com/MindiMakridi/RESTFUL задачка на превьюшки.
>>531566 maketi.esy.es
>>531508 https://github.com/never3ver/vector
>>531386 http://ideone.com/4t6fb2 номера телефонов
>>531338 посоветуй сайт на Юи
>>530370 абитуриенты https://github.com/blackberryJam/abiturients
И есои я про кого-то забыл, напомните о себе плиз.
Задание на yii снимается.
Я сначала сделаю какой-нибудь примитив, например сайт для объявлений. Просто набить руку, чтобы легче ориентироваться в api.
А потом так и быть возьмусь за задание с тестами. Его кстати кто-то вообще делал? Я где-то полгода мониторю тред, еще не видел чтобы кто-то брался.
Что там за "подводные камни"? Ты лучше сразу скажи, мне очень важно прикинуть время, которое у меня это займет.
>>531797
Приведу тебе пример ООП подхода. Допустим мы хотим сделать программу которая ведет список сотрудников в компании, кто на какой должности, кто сколько зарабатывает. Мы делаем класс Сотрудник и описываем, какие у него есть свойства: имя, фамилия, должность, зарплата, находится ли в отпуске или на работе.
Затем мы добавляем методы, то есть функции, позволяющие делать что-то с сотрудником, например повысить зарплату, уволить, отправить в отпуск, вернуть из отпуска. Эти методы меняют свойства объекта, например метод повысить зарплату меняет значение свойства «зарплата».
Затем, у нас есть класс, мы создаем объекты этого класса, сколько у нас сотрудников, столько объектов, и заполняемих свойства:
$ivan = new Employee; // Создать новый объект класса Сотрудник
$ivan->name = 'Иван'; // задали ему имя
$ivan->position = 'менеджер';
$ivan->salary = 100; // задали зарплату
$petr = new Employee;
$petr->name = 'Петр';
$petr->position = 'продавец';
$petr->salary = 50;
И далее мы можем что-то делать с этими объектами. Например, вывести их список, посчитать расходы на зарплату, уволить кого-нибудь и тд.
То есть классы и объекты описывают какие-то сущности с которыми работает программа. когда ты изучишь ООП ты увидишь что оно очень логичное и естественное.
Делал, один анон с перерывами, но сделал редактор тестов и прохождение теста, даже по моему на хостинг выкладывал, и у меня где-то его гитхаб записан.
Подводные камни начинаются с самого начала. Почитай описание и попробуй представить как ты спроектируешь базу данных для тестов, вопросов, ответов? Разумеется в нашем учебном треде мы придеремся к малейшим отклонениям от нормализованной формы (с благими намерениями конечно, чтобы потом на работе твои коллеги не спрашивали какой идиот создал эту таблицу).
И знаешь, задание на тесты близко по сложности к реальным проектам. Я видел один реальный проект сравнимой, точнее даже чуть меньшей сложности на аналогичного уровня фреймворке. Его разработчики в нашем треде не учились и хорошим практикам не следовали. Код кривой, куча ошибок, причем часто вместо исправления они просто игнорировались и код как следствие работал через раз и понять почему он не работает было очень нелегко. Теперь этот проект будут дорабатывать и исправлять другие разработчики, посмотрим что выйдет. Переписывать радикально я думаю мы ничего не будем, зачем деньги на ветер выбрасывать, будут мучаться с тем что есть.
ТАМ НУЖНО JS И ФРЕЙМВОРКИ ЗНАТЬ, ЧТОБЫ ФРОНТЕНДЕРОМ РАБОТАТЬ ГНИДА ПИЗДЛИВАЯ
Хромовский отладчик не первый, до него был Firebug в фаерфоксе, а до него верстку отлаживали правкой кода и перезагрузкой страницы (кто хорошо знал CSS рендерил страницу в голове). Но он по скорости, удобству и фичам конечно на первом месте.
-----
В прошлом треде один особо наглый анон (наверно он прошел специальные курсы по оборзению) спросил не желает ли кто поработать на него бесплатно: >>530535
Суть предложения примерно такая: я планирую делать бизнес и получать прибыль, и мне нужен сайт. Платить за него я не буду, но если вы его мне сделаете, то может быть получите еще заказы.
Если вы будете искать заказы на фрилансе, вы будете с таким сталкиваться. Иногда с другими формулировками: заплатить я много не готов, но если вы справитесь, вас ждут заказы за большие деньги.
Что ж, это учебный тред и тут такой пост как нельзя кстати. Таких людей, аноны, надо обходить за версту. Любой нормальный заказчик/менеджер понимает что труд стоит денег, его цель найти хорошего разработчика и удерживать его, а не торговаться неделю чтобы скинуть 300 рублей.
У тех, кто пытается обхитрить разработчика, разумеется ничего не выйдет. Если разработчик честный, он выполнит свои обязательства и уйдет. Если нечестный, то перед уходом еще напакостит. Очевидно что такой заказчик свой проект никогда не доделает (так как большую часть времени он будет тратить не на разработку, а на поиск разработчиков), а если и доделает, то он вряд ли будет качественным и надежным.
Есть еще другой вариант: вам предлагается выполнить работу за долю. Во-первых, если это предлагает незнакомый человек с фриланса и без документального оформления (доля в ООО, на которое офомлены активы организации), сразу гоните его прочь. А что если это человек которого вы давно знаете? не обманщик, не аноним с двачей. стоит ли соглашаться?
Это сложный вопрос. Участие за долю — это фактически инвестиция. Вы берете какую-то часть времени своей жизни и вкладываете ее в ваше совместное дело. Вы бы могли потратить это время на обычную работу за деньги, значит потенциальная выгода должна быть значительно выше чем зарплата за это время. Не забудьте, что ее надо оценивать с учетом риска. Ну например если шанс что стартап станет успешным и принесет вам 10 000 тугриков равен 5% то математическое ожидание (то есть средняя сумма которую вы заработаете сделав много попыток) составит 10 000 × 5% = 500 тугриков. Ну и помните что 5% шанс на успех это 95% шанс на провал. Потраченные зря месяцы работы в режиме 7×12. В то время как 50 тугриков зарплаты это реальные деньги которые вы получите в конце месяца и на которые летом вместо круглосуточного кодинга можно отправиться куда-нибудь путешествовать.
Заметьте, что есть большая разница между вами и например венчурным инвестором. Венчурный инвестор инвестирует свои или деньги фонда. Это не его последние деньги и он без них проживет. Он ничего не делает и лишь собирает прибыль. Это не мешает ему отправиться летом куда-нибудь путешествовать. Вы инвестируете время своей жизни и недополученную зарплату, и рискуете гораздо сильнее.
Вот например статья про веб-студию которая пыталась инвестировать в разные проекты, почитайте, очень интересный опыт (TLDR: профита не получилось): http://habrahabr.ru/company/mkechinov/blog/246547/
Ну и кроме того, можно попробовать уговорить партнеров на компромиссный вариант: вы получаете меньшую долю, но получаете зарплату в стартапе. Если они серьезно уверены в успехе дела, им же не жалко сейчас заплатить вам чтобы в будущем получить больше, верно? Им не жалко взять под это дело кредит в банке или попросить инвестиций, верно?
Ну и напоследок поменяю направление мысли еще раз. Ни Биллу Гейтсу, ни Стиву Джобсу зарплату никто не платил. Они работали за долю.
Хромовский отладчик не первый, до него был Firebug в фаерфоксе, а до него верстку отлаживали правкой кода и перезагрузкой страницы (кто хорошо знал CSS рендерил страницу в голове). Но он по скорости, удобству и фичам конечно на первом месте.
-----
В прошлом треде один особо наглый анон (наверно он прошел специальные курсы по оборзению) спросил не желает ли кто поработать на него бесплатно: >>530535
Суть предложения примерно такая: я планирую делать бизнес и получать прибыль, и мне нужен сайт. Платить за него я не буду, но если вы его мне сделаете, то может быть получите еще заказы.
Если вы будете искать заказы на фрилансе, вы будете с таким сталкиваться. Иногда с другими формулировками: заплатить я много не готов, но если вы справитесь, вас ждут заказы за большие деньги.
Что ж, это учебный тред и тут такой пост как нельзя кстати. Таких людей, аноны, надо обходить за версту. Любой нормальный заказчик/менеджер понимает что труд стоит денег, его цель найти хорошего разработчика и удерживать его, а не торговаться неделю чтобы скинуть 300 рублей.
У тех, кто пытается обхитрить разработчика, разумеется ничего не выйдет. Если разработчик честный, он выполнит свои обязательства и уйдет. Если нечестный, то перед уходом еще напакостит. Очевидно что такой заказчик свой проект никогда не доделает (так как большую часть времени он будет тратить не на разработку, а на поиск разработчиков), а если и доделает, то он вряд ли будет качественным и надежным.
Есть еще другой вариант: вам предлагается выполнить работу за долю. Во-первых, если это предлагает незнакомый человек с фриланса и без документального оформления (доля в ООО, на которое офомлены активы организации), сразу гоните его прочь. А что если это человек которого вы давно знаете? не обманщик, не аноним с двачей. стоит ли соглашаться?
Это сложный вопрос. Участие за долю — это фактически инвестиция. Вы берете какую-то часть времени своей жизни и вкладываете ее в ваше совместное дело. Вы бы могли потратить это время на обычную работу за деньги, значит потенциальная выгода должна быть значительно выше чем зарплата за это время. Не забудьте, что ее надо оценивать с учетом риска. Ну например если шанс что стартап станет успешным и принесет вам 10 000 тугриков равен 5% то математическое ожидание (то есть средняя сумма которую вы заработаете сделав много попыток) составит 10 000 × 5% = 500 тугриков. Ну и помните что 5% шанс на успех это 95% шанс на провал. Потраченные зря месяцы работы в режиме 7×12. В то время как 50 тугриков зарплаты это реальные деньги которые вы получите в конце месяца и на которые летом вместо круглосуточного кодинга можно отправиться куда-нибудь путешествовать.
Заметьте, что есть большая разница между вами и например венчурным инвестором. Венчурный инвестор инвестирует свои или деньги фонда. Это не его последние деньги и он без них проживет. Он ничего не делает и лишь собирает прибыль. Это не мешает ему отправиться летом куда-нибудь путешествовать. Вы инвестируете время своей жизни и недополученную зарплату, и рискуете гораздо сильнее.
Вот например статья про веб-студию которая пыталась инвестировать в разные проекты, почитайте, очень интересный опыт (TLDR: профита не получилось): http://habrahabr.ru/company/mkechinov/blog/246547/
Ну и кроме того, можно попробовать уговорить партнеров на компромиссный вариант: вы получаете меньшую долю, но получаете зарплату в стартапе. Если они серьезно уверены в успехе дела, им же не жалко сейчас заплатить вам чтобы в будущем получить больше, верно? Им не жалко взять под это дело кредит в банке или попросить инвестиций, верно?
Ну и напоследок поменяю направление мысли еще раз. Ни Биллу Гейтсу, ни Стиву Джобсу зарплату никто не платил. Они работали за долю.
Ещё бойан в тему.
Мне как раз редактор пока кажется самым сложным.
Ну ладно, с первого взгляда я накидал общую схему базы, так сказать сущности. Можешь пока посмотреть, насколько идиотски это выглядит.
По проектированию бд: это дело доверяют джуниорам, серьезно?
test
- id
- name
- description
- time_limit
- show_result (enum('0','1'))
- created_by
- added_date
- сделать результаты прохождения публичными (что это? с вашего позволения выбрасываю этот пункт)
tag
- id
- name
test_tag
- test_id
- tag_id
question
- id
- description
- test_id
- cost (или value? или worth? не силен в наглийском)
- answer_type_id
- sequence_number (номер по порядку для перетаскивания вопросов)
answer
- id
- text
- question_id
- is_right (enum('0', '1'))
answer_type
- id
- name
user
- id
- name
- password
result
- id
- test_id
- user_id
- perform_date
- mark
- sum
- attempts
- fulfilled
Мне как раз редактор пока кажется самым сложным.
Ну ладно, с первого взгляда я накидал общую схему базы, так сказать сущности. Можешь пока посмотреть, насколько идиотски это выглядит.
По проектированию бд: это дело доверяют джуниорам, серьезно?
test
- id
- name
- description
- time_limit
- show_result (enum('0','1'))
- created_by
- added_date
- сделать результаты прохождения публичными (что это? с вашего позволения выбрасываю этот пункт)
tag
- id
- name
test_tag
- test_id
- tag_id
question
- id
- description
- test_id
- cost (или value? или worth? не силен в наглийском)
- answer_type_id
- sequence_number (номер по порядку для перетаскивания вопросов)
answer
- id
- text
- question_id
- is_right (enum('0', '1'))
answer_type
- id
- name
user
- id
- name
- password
result
- id
- test_id
- user_id
- perform_date
- mark
- sum
- attempts
- fulfilled
Я на хабре видел предложение войти в долю и проспонсировать создание сайта.
В некоторых местах джуниорам доверяют целые проекты, как попадешь.
> По проектированию бд: это дело доверяют джуниорам, серьезно?
А по твоему господину джуниору полагается личный помощник по проектированию баз данных? Или может ручной гном который это за него сделает?
Конечно в разных компаниях делают по-разному. Где-то джуниора и близко не подпустят к базе. В нормальных разработчик разбирается во всех используемых в приложении технологиях и может без лишней помощи добавить пару таблиц или полей. А если в чем-то не уверен, проконсультируется с сеньором или специалистом по БД, как там лучше индексы поставить. Это же эффективнее получается чем когда он по каждому поводу кого-то зовет.
В некоторых компаниях изменения в Бд делает разработчик, но с одобрения главного разработчика.
Разумеется для этого джуниор должен знать нормализацию, внешние ключи, транзакции, индексы. Но ведь вопросы по ним задают на собеседовании, получается он их знает.
> сделать результаты прохождения публичными (что это? с вашего позволения выбрасываю этот пункт)
Это значит, что результаты теста отображаются в таблице на сайте и любой может смотреть их. Иначе видны только студенту и преподавателю. Если у тебя нет регистрации то можно пока не реализовавать.
Еще, там описание может быть немного устаревшее местами, актуальная версия это набросок дизайна страниц.
> cost (или value? или worth? не силен в наглийском)
points, число очков, наверно. value (ценность) тоже наверно подойдет
Насчет типов вопросов, там 4 типа по моему:
— одиночный выбор
— множественный выбор
— ввод числа с допустимой погрешностью (чему равно Пи?)
— ввод строки (напишите столицу России?)
У тебя это реализуется?
Кстати, у нас тут 4 типа вопросов или 4 типа ответов на вопрос?
Насчет answer_type_id, может лучше его ENUM сделать? Ведь типы ответов зашиты в коде и их нельзя менять через админку. (хотя конечно где-то было мнение что энум зло, но я не согласен).
Также, я не вижу где хранятся данные студентов ответы на вопросы. answer это ответы студентов или варианты ответов на вопрос?
Для вариантов ответов (точнее, для вопросов) можно сделать интересную вещь, наследование таблиц. Смотри, у нас есть 4 типа вопросов, у них есть общие поля а есть уникальные для своего типа. Это явно наследование таблиц и возможные способы его реализации давно описаны Фаулером:
http://design-pattern.ru/patterns/single-table-inheritance.html
http://design-pattern.ru/patterns/class-table-inheritance.html
http://design-pattern.ru/patterns/concrete-table-inheritance.html
Если так то тебе стоит не изобретать велосипед, а познакомиться с паттернами, взвесить достоинства и недостатки и выбрать лучший. А, и конечно тот, который реально реализовать в Юи.
> sum
Сумма баллов? Имей в виду это избыточные данные так как оценка считается из ответов студента. Но тут они конечно опрадавны так как иначе будут запросы громоздкие очень (например на сортировку учеников по баллам).
> marks
> attempts
> fulfilled
Непонятно назначение поля
> По проектированию бд: это дело доверяют джуниорам, серьезно?
А по твоему господину джуниору полагается личный помощник по проектированию баз данных? Или может ручной гном который это за него сделает?
Конечно в разных компаниях делают по-разному. Где-то джуниора и близко не подпустят к базе. В нормальных разработчик разбирается во всех используемых в приложении технологиях и может без лишней помощи добавить пару таблиц или полей. А если в чем-то не уверен, проконсультируется с сеньором или специалистом по БД, как там лучше индексы поставить. Это же эффективнее получается чем когда он по каждому поводу кого-то зовет.
В некоторых компаниях изменения в Бд делает разработчик, но с одобрения главного разработчика.
Разумеется для этого джуниор должен знать нормализацию, внешние ключи, транзакции, индексы. Но ведь вопросы по ним задают на собеседовании, получается он их знает.
> сделать результаты прохождения публичными (что это? с вашего позволения выбрасываю этот пункт)
Это значит, что результаты теста отображаются в таблице на сайте и любой может смотреть их. Иначе видны только студенту и преподавателю. Если у тебя нет регистрации то можно пока не реализовавать.
Еще, там описание может быть немного устаревшее местами, актуальная версия это набросок дизайна страниц.
> cost (или value? или worth? не силен в наглийском)
points, число очков, наверно. value (ценность) тоже наверно подойдет
Насчет типов вопросов, там 4 типа по моему:
— одиночный выбор
— множественный выбор
— ввод числа с допустимой погрешностью (чему равно Пи?)
— ввод строки (напишите столицу России?)
У тебя это реализуется?
Кстати, у нас тут 4 типа вопросов или 4 типа ответов на вопрос?
Насчет answer_type_id, может лучше его ENUM сделать? Ведь типы ответов зашиты в коде и их нельзя менять через админку. (хотя конечно где-то было мнение что энум зло, но я не согласен).
Также, я не вижу где хранятся данные студентов ответы на вопросы. answer это ответы студентов или варианты ответов на вопрос?
Для вариантов ответов (точнее, для вопросов) можно сделать интересную вещь, наследование таблиц. Смотри, у нас есть 4 типа вопросов, у них есть общие поля а есть уникальные для своего типа. Это явно наследование таблиц и возможные способы его реализации давно описаны Фаулером:
http://design-pattern.ru/patterns/single-table-inheritance.html
http://design-pattern.ru/patterns/class-table-inheritance.html
http://design-pattern.ru/patterns/concrete-table-inheritance.html
Если так то тебе стоит не изобретать велосипед, а познакомиться с паттернами, взвесить достоинства и недостатки и выбрать лучший. А, и конечно тот, который реально реализовать в Юи.
> sum
Сумма баллов? Имей в виду это избыточные данные так как оценка считается из ответов студента. Но тут они конечно опрадавны так как иначе будут запросы громоздкие очень (например на сортировку учеников по баллам).
> marks
> attempts
> fulfilled
Непонятно назначение поля
Мы не умеем.
Иногда даже значительно больше.
Fatal error: Class 'Slim\Views\Twig' not found in C:\xampp\htdocs\TwigBlog\app\start.php on line 27
PhpStorm
Ну и убогий же дизаен.
Благодарю.
>И еще анон, который учит HTML/CSS и берется за JS, имей в виду что если хорошо это изучить (+ DOM и jQuery) то ты уже можешь быть верстальщиком как минимум. Без jQuery наверно вряд ли так как таких верстальщиков тысячи на фрилансе.
Работа верстальщика мне почему-то не по душе. Мне может даже и нравится верстать, но именно в эту степь уходить не хочу, хочу все-таки в бэкенд. Просто в голове у меня такое представление, что уже даже соседский пес HTML\CSS курсы проходит и верстать учится и что верстальщиков ну уж очень много. Далеко сверх меры и найти работу будет сложно.
А вот в бэкенд я бы с головой хотел уйти и все все там изучать, даже надежда есть, что если будет несколько человек на одно место, то возьмут меня с мыслью "Да этот парень не просто выучил что-то и пришел штаны просиживать, в нем видно стремление к изучению. Глядишь через годик и сеньора нашего учить будет. Пожалуй, его и выберем."
>>531848
>Анон, который делает макет, а ты видел крутые фичи в хромовском отладчике, которые на пикрелейтед? Есть возможность отлаживать адаптивную верстку и есть возможность имитировать медленную скорость соединения.
Ну насчет проверки адаптивной версии да, рандомным кликанием нашел, даже пользовался, хотя больше конечно телефоном сразу, который под рукой лежит. А вот функции медленного интернета не замечал как-то, в принципе полезная штука. Спасибо за подсказку.
И да, я сейчас начну тестировать шрифты, зарегистрировал уже сайт для этого отдельный. Сейчас перечитаю пост, ознакомлюсь со статьями, которые ты мне дал и покажу что получится сделать.
Ну же ребята хелп
У меня в вузике был предмет инженерная графика, вот очень похоже на верстку. Здесь линия 0,3мм, здесь 0,5мм, здесь шрифт с таким-то наклоном, тут с другим, здесь такой-то отступ, тьфу, параша.
мимо тожефронтенднелюблю
Спасибо
Потому что счетчик остановился на 11, ведь уже на 11 месяце долг у тебя меньше месячной выплаты, на 11 шаге выполняется строка 16 для 11 месяца и тут же выполняется if.
Соври, что настолько нищеброд, что нет денег даже на микрофон. Ну или притворись немым. А лучше поработай над своей социофапией.
Скажи что ты глухонемой. И я не шучу.
Ты можешь даже льготы получить за это, особенно от европейских и амуриканских работодателей, они очень положительно настроены к инвалидам и тянкам которые занимаются ИТ.
>особенно от европейских и амуриканских работодателей
Это ты про тех самых знаменитых, которые на слово ничего себе каламбур получился русским анонам верят?
Я так и сказал, он отморозился.
Можно сказать, что я глухонемая тянка в инвалидной коляске?
Дейт, Кодд.
Том Кайт, учебники по Oracle.
Фух, починили наконец мне интернет. Сел значит ставить шрифты и столкнулся с такой проблемой. Скачиваю шрифт, устанавливаю, все работает. Но вот курсивность и жирность выставить не могу. Я перебрал штук 5 и у всех жирность сразу максимальная. То есть можно только поставить 100 и чуть уменьшится. А курсив вообще не работает. Аноны, может подскажете хороший шрифт для тренировки, где и курсивность и жирность работает? Только мне бы какой-нибудь мудреный, с закорючками там. А то многие у меня уже откуда-то есть, а откуда удалять понятия не имею. Я так например не мог проверить работоспособность шрифта на макете.
И да, еще столкнулся с такой проблемой.
Скачал шрифт .ttf, поставил, все работает. Переконвертировал в .eot, добавил в порядке
.ttf
.eot
и не работает ни один.
Поставил
.eot
.ttf
и все заработало и в хроме и в ИЕ.
Я еще статьи не прочитал, только недавно вот сел за это дело. Может быть там разгадка есть. Типа определенный порядок форматов.
Переделал, посмотри еще раз структуру базы для testhub.
https://gist.github.com/nsdvw/b19480f1dd4f2f7f8de5
>А по твоему господину джуниору полагается личный помощник по проектированию баз данных? Или может ручной гном который это за него сделает?
Нет, полагается опытный наставник, с которым можно посоветоваться, и который проверит работу.
И речь об ответственности: проектирование бд вообще самая важная вещь во всем проекте, поэтому мне кажется странным доверять такое стажеру с опытом двух гостевых книг и файлообменника.
Собственно я всего лишь интересуюсь командным взаимодействием, везде ведь пишут в требованиях "умение работать в команде". А по твоим словам получается, что как вручат тебе тз, так полностью выполняешь проект молча и самостоятельно, начиная от дизайна и верстки и заканчивая тестированием.
То ли ты всю жизнь провел на фрилансе, где тупым заказчикам программисты и логотипы рисуют, и наполняют контентом, и раскручивают сайт в гугле; то ли скорее всего просто троллишь.
>если в чем-то не уверен, проконсультируется с сеньором или специалистом по БД
>В некоторых компаниях изменения в Бд делает разработчик, но с одобрения главного разработчика.
Ну это уже более адекватно.
> http://design-pattern.ru/patterns/single-table-inheritance.html
На будущее отметил себе эту идею, но тут у меня пока получается немного по-другому: у меня варианты ответа хранятся абсолютно независимо от вопросов, так что это не тот случай.
> Коллега, заметил, везде die(var_dump(всякие переменные)) сует и в браузере запускает, щас тоже так стал, может еще какие способы есть?
Расскажи коллеге про xdebug. Ну и сам посмотри.
Для xdebug вроде нужно же страницу знать, не? А там когда запускаешь, все идет через какой-то центральный контроллер, а по ходу еще штук 100 других контроллеров, подконтроллеров, родительских и унаследованных классов и сервисов подключается. И не поймешь даже, откуда страница вылазит.
Фреймворк-то как называется? Зенд штоли?
Только не говори, что это самописная хуйня или йоба-смс от вована.
Самописная хуйня со вставками других фреймворков. В подключениях в Composere там засветились Zend, Symphony, Yii, CodeIgniter и еще штук 5 каких-то. Нахуй они там нужны, хз, но части классов на одном, части на другом. Чтобы этот зоопарк вместе работал, переходники самописные кругом рулят и кусками все разнесено. Работников, как я понял по отметкам @author в коде, там за несколько лет куча посменялась, и все свои тулы использовали, так что теперь в этом черт ногу сломит.
И еще, размер всего сайта - 3 гига. И это без картинок и БД и со сжатыми через grunt css и javascriptами. Только, чтобы выкатить на рабочий комп, целый день ушел.
Подскажите в чем проблема и где ее искать: есть бубунта 14,04, есть апаче2, есть вихост. Все работает, все сделано и настроено еще год назад. Страничка на указанном порту открывается, но вот я добавляю папку АССЕТС с ксс и тут же получаю в фаербаге 403 форбидден и адресс моего ксс файла, который лежит в директории на которую вхост создан(условно говоря МойПроект/АССЕТС/мейн.ксс). Что за нах? При чем с менйом я как-то порешал просто добавил права 777 на всю папку МойПроект, но вот добавляю еще один ксс файл и снова та же петрушка, но теперь именно с новодобавленным фалом. chmod на var/www/ уже пробовал, правда паранойи из-зa поставил u+w -R. Подскажите срочно если кто имеет возможность, а то я вместо написания кода уже полчаса туплю с этой проблемой.
Обычно 1 файл содержит только шрифт одного начертания и жирности. Ну например в случае Open Sans:
OpenSansBold — полужирный
OpenSansExtraBoldItalic — особо жирный курсивный
Потому ты должен в каждом блоке font-face кроме названия под которым этот шрифт будет доступен, указать его жирность, курсивность (иначе браузер подумает что это нежирный некурсивный шрифт). Можно также указать и другие хакартеристики , а именно (список отсюда https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face ):
font-variant, font-stretch, font-weight, font-style
Ими ты описываешь характеристики шрифта в файле на который указывает свойство src. И браузер будет знать что например жирная или курсивная версия шрифта тут.
В некоторых случаях браузер способен сам сгенерировать курсивное начертание, если его нет в шрифте или ты не указал файл для него. Это делается механическим наклоном букв и называется faux italic (механический курсив). Это довольно некрасиво, посмотри на картинку и ты увидишь что в настоящем курсивном начертании буквы меняют свою форму: https://upload.wikimedia.org/wikipedia/commons/1/17/Cyrillic-italics-nonitalics2.svg
Они выглядят по-другому так как курсивный шрифт это шрифт имитирующий рукописные буквы (а обычный шрифт имитирует выбитые на камне буквы, потому в нем больше прямых линий, а в курсивном больше скруглений ускоряющих написание).
При механическом курсиве разумеется такого не будет, потому если у шрифта нет курсивной версии, его лучше не использовать. Примером такого шрифта является например Tahoma, который входит в Windows.
Аналогично браузер умеет механически увеличивать жирность, и это тоже выглядит не очень. Вот еще 2 картинки, можешь попробовать угадать где используется настоящий курсив и жирность, а где искуственные:
http://alistapart.com/d/say-no-to-faux-bold/real-styles.png
http://alistapart.com/d/say-no-to-faux-bold/smear-slant.png
В твоем случае, у Open Sans есть курсивный/некурсивный варианты, и 5 вариантов веса (жирности) (Light, Regular, SemiBold, Bold, ExtraBold). При их комбинации получается 8 вариантов шрифта с одинаковым названием но разными свойствами. Ты должен их правильно описать.
Кстати, на досуге еще подумай, почему жирность шрифта по английски называется «weight» то есть «вес».
Обычно 1 файл содержит только шрифт одного начертания и жирности. Ну например в случае Open Sans:
OpenSansBold — полужирный
OpenSansExtraBoldItalic — особо жирный курсивный
Потому ты должен в каждом блоке font-face кроме названия под которым этот шрифт будет доступен, указать его жирность, курсивность (иначе браузер подумает что это нежирный некурсивный шрифт). Можно также указать и другие хакартеристики , а именно (список отсюда https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face ):
font-variant, font-stretch, font-weight, font-style
Ими ты описываешь характеристики шрифта в файле на который указывает свойство src. И браузер будет знать что например жирная или курсивная версия шрифта тут.
В некоторых случаях браузер способен сам сгенерировать курсивное начертание, если его нет в шрифте или ты не указал файл для него. Это делается механическим наклоном букв и называется faux italic (механический курсив). Это довольно некрасиво, посмотри на картинку и ты увидишь что в настоящем курсивном начертании буквы меняют свою форму: https://upload.wikimedia.org/wikipedia/commons/1/17/Cyrillic-italics-nonitalics2.svg
Они выглядят по-другому так как курсивный шрифт это шрифт имитирующий рукописные буквы (а обычный шрифт имитирует выбитые на камне буквы, потому в нем больше прямых линий, а в курсивном больше скруглений ускоряющих написание).
При механическом курсиве разумеется такого не будет, потому если у шрифта нет курсивной версии, его лучше не использовать. Примером такого шрифта является например Tahoma, который входит в Windows.
Аналогично браузер умеет механически увеличивать жирность, и это тоже выглядит не очень. Вот еще 2 картинки, можешь попробовать угадать где используется настоящий курсив и жирность, а где искуственные:
http://alistapart.com/d/say-no-to-faux-bold/real-styles.png
http://alistapart.com/d/say-no-to-faux-bold/smear-slant.png
В твоем случае, у Open Sans есть курсивный/некурсивный варианты, и 5 вариантов веса (жирности) (Light, Regular, SemiBold, Bold, ExtraBold). При их комбинации получается 8 вариантов шрифта с одинаковым названием но разными свойствами. Ты должен их правильно описать.
Кстати, на досуге еще подумай, почему жирность шрифта по английски называется «weight» то есть «вес».
пздц (2)
Я бы на твоем месте еще подучился у опа, а потом устроился в нормальную контору.
Там ты все равно ничему не научишься, тем более что коллеги как я понял даже хуже тебя разбираются.
Человеческая жизнь не стоит и одной строки Бодлера Год ракования в быдлоконторе не стоит одного поста опа.
аминь
Если очень нужны деньги, то на крайняк можно на полставки ходить чистить вордпресс, а в свободное время учиться.
upd. в общем, сразу же попробовал опять прописать chmod 777 -R /home/huykin/myProject/, ребутнул апаче на всякий случай и все заработало. Ну что за пздц, котаны? Мне что после добавления каждого файла такой хуетой маяться? Почему цшмод не пашет на постоянной основе(я думал раз прописл права и все в ажуре, ан нет). Как быть, поясните чайнику от линупса.
Как же я буду смс-то чистить?
А что в файле Slim/View/Twig.php? Ты его не трогал? Не менял там ничего?
Также, подключение автозагрузчиков должно идти первым.
Также, ты 2 раза создаешь объект Slim.
Ну и конечно потом надо будет подключить Slim через композер, это вторая задача и пора бы научиться им пользоваться.
Меня никуда не брали просто больше. Еще там какой-то скрам-хуям со скрам-мастером. На практике это выглядит так - висит доска во всю стену с именами всех, а на ней, какие на ком тикеты. Плюс отдельная доска, где завершенные тикеты на весь тим. Каждый день приходит начальник и с утра пидорасит, кто чем вчера занимался и почему на ком-то тикетов больше положенного висит. Все эти тикеты стремятся быстрее закрыть, чтобы не быть пидорасом. А если на доске с тимом тикетов мало образовалось, то пидорасы уже все, и собирают совещание, чтобы отхуесосить весь тим. Поэтому все коллеги стремятся хуяк-хуяк и в продакшн, как тут в прошлых тредах ржали. Наверное поэтому такой зоопарк и неразбериха.
Скрам-хуям, насмотрятся всяких там кремниевых долин и давай "перенимать опыт", а перенималка не выросла.
Чтобы понять в чем ошибка, поставь вот сюда: https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L129 var_dump который дампит разные переменные и посмотри чему они равны. Может он имя файла неправиоьно определяет.
>>531979
Не любишь потому что не умеешь наверно. Ведь верстка это тоже искусство, сделать красивую структуру HTML, минималистичный CSS код, без костылей, чтобы все тянулось, с минимум яваскрипта и чтобы можно было повторно использовать.
>>532104
> Переконвертировал в .eot, добавил в порядке
Ты format указываешь в свостве src? код показывай.
>>532126
> Нет, полагается опытный наставник, с которым можно посоветоваться, и который проверит работу.
В этом случае SQL код пишешь все равно ты и надо уметь проектировать. Наставник только проверит работу, а разъяснять тебе принципы нормализации не будет.
> проектирование бд вообще самая важная вещь во всем проекте,
Вообще да. Структуру базы можно поменять позже но при этом приходится заботиться о переносе данных и переделке кода, так что лучше сразу делать правильно. Ну и если писать код правильно, то изменения получаются менее болезненные чем в лапшекоде.
> А по твоим словам получается, что как вручат тебе тз, так полностью выполняешь проект молча и самостоятельно, начиная от дизайна и верстки и заканчивая тестированием.
Нет, я про другое. Если делается новый сайт и в компании/команде есть отдельный версальщик то верстку дадут ему. Но если например надо добавить новый раздел на существующий сайт или какой-нибудь попап с настройками, то тут отвлекать верстальщика это только лишняя потеря времени на взаимодействие. Быстрее самому сделать. Аналогично, если тебе надо что-то поменять. Не звать же верстальщика ради добавления в форму автодополнения на jquery UI, верно?
Опять же насчет базы данных, добавить одну таблицу или поле это скорее всего твое дело, а придумать схему кеширования данных во всем приложении или оптимизировать сложную выборку это задача более старших товарищей (которая в некоторых обстоятельствах может достаться и тебе). Опять же, не будешь ты ради написания SQL запроса кого-то звать.
Как видишь, без знания SQL или HTML/CSS ты эти задачи не выполнишь.
Командное взаимодействие это другое. Это не про то, что ты будешь просить других сделать часть твоей работы. Это именно взаимодействие, например если ты и кто-то еще делают пересекающиеся вещи, вы можете договориться как это сделать чтобы не дублировать код и не вызвать конфликтов.
Чтобы понять в чем ошибка, поставь вот сюда: https://github.com/slimphp/Slim/blob/2.x/Slim/Slim.php#L129 var_dump который дампит разные переменные и посмотри чему они равны. Может он имя файла неправиоьно определяет.
>>531979
Не любишь потому что не умеешь наверно. Ведь верстка это тоже искусство, сделать красивую структуру HTML, минималистичный CSS код, без костылей, чтобы все тянулось, с минимум яваскрипта и чтобы можно было повторно использовать.
>>532104
> Переконвертировал в .eot, добавил в порядке
Ты format указываешь в свостве src? код показывай.
>>532126
> Нет, полагается опытный наставник, с которым можно посоветоваться, и который проверит работу.
В этом случае SQL код пишешь все равно ты и надо уметь проектировать. Наставник только проверит работу, а разъяснять тебе принципы нормализации не будет.
> проектирование бд вообще самая важная вещь во всем проекте,
Вообще да. Структуру базы можно поменять позже но при этом приходится заботиться о переносе данных и переделке кода, так что лучше сразу делать правильно. Ну и если писать код правильно, то изменения получаются менее болезненные чем в лапшекоде.
> А по твоим словам получается, что как вручат тебе тз, так полностью выполняешь проект молча и самостоятельно, начиная от дизайна и верстки и заканчивая тестированием.
Нет, я про другое. Если делается новый сайт и в компании/команде есть отдельный версальщик то верстку дадут ему. Но если например надо добавить новый раздел на существующий сайт или какой-нибудь попап с настройками, то тут отвлекать верстальщика это только лишняя потеря времени на взаимодействие. Быстрее самому сделать. Аналогично, если тебе надо что-то поменять. Не звать же верстальщика ради добавления в форму автодополнения на jquery UI, верно?
Опять же насчет базы данных, добавить одну таблицу или поле это скорее всего твое дело, а придумать схему кеширования данных во всем приложении или оптимизировать сложную выборку это задача более старших товарищей (которая в некоторых обстоятельствах может достаться и тебе). Опять же, не будешь ты ради написания SQL запроса кого-то звать.
Как видишь, без знания SQL или HTML/CSS ты эти задачи не выполнишь.
Командное взаимодействие это другое. Это не про то, что ты будешь просить других сделать часть твоей работы. Это именно взаимодействие, например если ты и кто-то еще делают пересекающиеся вещи, вы можете договориться как это сделать чтобы не дублировать код и не вызвать конфликтов.
А когда начальник вместе с заказчиком собираются что бы всех похуесосить это Agile.
В твоей базе все же есть путаница. Как ты хранишь правильные ответы на вопрос с вводом текста или вводом числа с погрешностью? Как ты хранишь введенные студентом ответы на такие вопросы?
> На будущее отметил себе эту идею, но тут у меня пока получается немного по-другому: у меня варианты ответа хранятся абсолютно независимо от вопросов, так что это не тот случай.
Так я говорил о том что есть разные типы вопросов и они наследуются. А не ответы наследуются от вопросов. Я имел в виду такое: есть 4 вида вопросов:
- с одиночным выбором
- с множественным
- с вводом числа
- с текстом
Соответственно у них есть общие, а есть уникальные для одного типа поля. Значит это 4 разных сущности которые наследуются и к ним применим один из описанных паттерном (STI, ClassTI, ConcreteTI).
> ограничение по времени на ответ в секундах
Комментарии надо указывать через слово COMMENt тогда они сохранятся в базе и помогут другим людям разобраться в ней:
http://stackoverflow.com/questions/2162420/alter-mysql-table-to-add-comments-on-columns/2162456#2162456
http://phpclub.ru/mysql/doc/create-table.html
Комментарии можно добавлять на колонки или таблицы.
> date_added
Короче наверно просто писать added
> FOREIGN KEY (test_id) REFERENCES test (id) ON DELETE RESTRICT
Почему? При удалении тега или теста логично автоматически удалять его привязки (не сами теги а именно связь между ними).
> type ENUM ('один ответ из списка'
В ENUM пишут обычно компьютерно-читаемые значения на английском без пробелов, например chooseOne или select-one
> ENUM ('0', '1')
Значения энума нельзя делать числом так как числа понимаются MySQL как номер опции и это вызывает баги.
http://phpclub.ru/mysql/doc/enum.html
> Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
> является ли вариант правильным ответом;
> не знаю как иначе хранить булев тип
Можно делать TINYINT NOT NULL, это не совсем булев тип но подойдет. Или ENUM но не с числами.
> пароль и имейл пока пустые для анонимного прохождения
Имей в виду что сам пароль в открытом виде не хранят в базе, это очень небезопасно. Хранить надо соленый хеш.
> ip CHAR(15) NOT NULL,
про IPv6 слышал? https://ru.wikipedia.org/wiki/IPv6#.D0.9D.D0.BE.D1.82.D0.B0.D1.86.D0.B8.D1.8F
В твоей базе все же есть путаница. Как ты хранишь правильные ответы на вопрос с вводом текста или вводом числа с погрешностью? Как ты хранишь введенные студентом ответы на такие вопросы?
> На будущее отметил себе эту идею, но тут у меня пока получается немного по-другому: у меня варианты ответа хранятся абсолютно независимо от вопросов, так что это не тот случай.
Так я говорил о том что есть разные типы вопросов и они наследуются. А не ответы наследуются от вопросов. Я имел в виду такое: есть 4 вида вопросов:
- с одиночным выбором
- с множественным
- с вводом числа
- с текстом
Соответственно у них есть общие, а есть уникальные для одного типа поля. Значит это 4 разных сущности которые наследуются и к ним применим один из описанных паттерном (STI, ClassTI, ConcreteTI).
> ограничение по времени на ответ в секундах
Комментарии надо указывать через слово COMMENt тогда они сохранятся в базе и помогут другим людям разобраться в ней:
http://stackoverflow.com/questions/2162420/alter-mysql-table-to-add-comments-on-columns/2162456#2162456
http://phpclub.ru/mysql/doc/create-table.html
Комментарии можно добавлять на колонки или таблицы.
> date_added
Короче наверно просто писать added
> FOREIGN KEY (test_id) REFERENCES test (id) ON DELETE RESTRICT
Почему? При удалении тега или теста логично автоматически удалять его привязки (не сами теги а именно связь между ними).
> type ENUM ('один ответ из списка'
В ENUM пишут обычно компьютерно-читаемые значения на английском без пробелов, например chooseOne или select-one
> ENUM ('0', '1')
Значения энума нельзя делать числом так как числа понимаются MySQL как номер опции и это вызывает баги.
http://phpclub.ru/mysql/doc/enum.html
> Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.
> является ли вариант правильным ответом;
> не знаю как иначе хранить булев тип
Можно делать TINYINT NOT NULL, это не совсем булев тип но подойдет. Или ENUM но не с числами.
> пароль и имейл пока пустые для анонимного прохождения
Имей в виду что сам пароль в открытом виде не хранят в базе, это очень небезопасно. Хранить надо соленый хеш.
> ip CHAR(15) NOT NULL,
про IPv6 слышал? https://ru.wikipedia.org/wiki/IPv6#.D0.9D.D0.BE.D1.82.D0.B0.D1.86.D0.B8.D1.8F
Это больше верстка будет чем программирование. HTML знаешь?
>>532176
Начни с ответа на вопросы:
— архитектура проекта? (имеется в виду в плане, из сколько частей он состоит, например бывает что проект состоит из нескольких взаимодействующих сервисов, расположенных на разных серверах. Если у тебя проект молнолитный и из одного приложения то все проще)
— какие внешние хранилища используются (базы/кеши/NoSQL)
— какие внешние API используются?
— какой фреймворк/библиотеки используются? (посмотреть можно в composer.json или в отдельной папке вроде vendor если у вас нет композера)
Если используется фреймворк то документация есть в интернете. Уже хорошо.
Далее попробуй посмотреть структуру папок и понять что вообще там есть.
Потом попробуй разобрать от начала и до конца как происходит вывод какой-нибудь несложной и желательно новой страницы (например страница новостей или что-нибудь вроде нее). То есть от index.php, через роутинг до нужного контроллера и шаблона.
> Коллега, заметил, везде die(var_dump(всякие переменные)) сует и в браузере запускает, щас тоже так стал, может еще какие способы есть?
Отладчик, но иногда var_dump и удобнее.
Zend и Симфони состоят из компонентов которые можно использовать отдельно (потому это самые крутые фреймворки). Ну например ты можешь взять роутер из симфони. Посмотри внимательно названия этих компонент и погугли или напиши сюда, я скажу что это.
>>532222
Да ну, не может быть. Если файл весит 10 Кб то 3 Гб это 300 000 файлов. Может быть это вес репозитория с историей?
> Только, чтобы выкатить на рабочий комп, целый день ушел.
Плохо, на 2 последних работах я уже в первый день писал код либо правил баги. Правда я был не с нулевым опытом к тому моменту.
>>532176
И вообще, попробуй воспринимать это позитивно. Все что нас не убивает, делает сильнее. Работа со сложным кодом позволит тебе приобрести полезные навыки, ты познакомишься с кучей использованных там библиотек. Это гораздо лучше чем ворошить примитивные сайты на джумле.
Программист это не тот, кто пишет код. Программист это тот, кто решает задачи. Сейчас перед тобой задача в минимальные сроки понять архитектуру проекта, думай, как это лучше сделать? Разобрать как выполняется код на примере простой страницы? Выписать список папок и понять какие классы в них хранятся на примере одного из них? Изучить как сделана работа с базой данных?
Ну и плюс, у тебя есть еще возможность в ходе исправления чуть-чуть улучшать код, убирать неэффективные места. добавлят комменатрии, давать понятные имена функциям и переменным. Это же бесценный опыт. Держись за свою работу зубами и когтями.
Спасибо, ОП, приму к сведению советы и постараюсь им следовать.
Насчет var_dump, альтернатива это отладчик. Надо повозиться с настройкой xdebug, зато можно в IDE пошагово выполнять код и смотреть значения перемнных. Иногда впрочем var_dump воткнуть быстрее
Но если ты понимаешь структуру кода, и как все работает, это гораздо эффективнее и ты можешь быстрее разбираться в нем.
> что за что отвечает непонятно
Ты ведь знаешь что такое MVC и паттерны работы с БД ( https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md )? Значит должен понимать хотя бы примерно зачем они.
> через какой-то самописный бридж
Не SymfonyBridge имеется в виду?
Но начать надо с определения фреймворка, с разбора index.php, как делается роутинг.
>Joomla
>Это больше верстка будет чем программирование. HTML знаешь?
Лендинг на бутстрапе - мой потолок, всякие хитрые анимации на CSS3 делать не умею. На JS и JQuery игрульки писал. Но веб-кодер из меня никакой, увлечение этим длилось 2 месяца, забросил полгода назад. Сейчас нашёл книгу по джумле, там объясняют для тех, кто вообще не юзал PHP+MySQL. А однокурсник говорит, что нужно будет заниматься разработкой компонентов и модулей для Джумлы, при этом говорит, что Yii ему проще давался, lдля меня такие фреймворки - тёмный лес. Я же только на мини-фреймворках писал.
Если бы не было сложностей, не было бы и спроса на программистов. Получали бы свои 20 к в месяц и жали кнопки в какой-нибудь визуальной среде.
>>532210
Там ты ставишь точку останова в конкретном файле и смотришь чему в ней равны переменные, выполняешь код пошагово или перепрыгиваешь к следующей точке. Почитай про отладку:
https://netbeans.org/kb/docs/php/debugging_ru.html
http://www.angarsky.ru/drupal/otladka-php-xdebug-phpstorm.html
Гугл: отладка php кода
Суть в том, что в PHP на сервере устанавливается плагин xdebug. Когда ты выбираешь в IDE «начать отладку», она открывает порт, ожидая соединения от xdebug, и открывает страницу в браузере со специальным приписанным параметром. xdebug его видит и подсоединяется к IDE. После чего она через это соединения управляет интерпретатором PHP.
Netbeans и PhpStorm оба содержат средства для взаимодействия с xdebug и отладки. Есть и другие сторонние программы и расширения но я не знаю насколько они нжедные и удобные.
>>532223
Так разрешения наверно не стоят нужные. Сделай stat /var/www.../file.css и посмотри какие у него разрешения.
Имей в виду что для доступа к файлу нужно право на чтение во всех вышестоящих папках. Сделай stat и для них.
Чем ты добавляешь файлы? Надо настроить программу чтобы она ставила правильные разрешения.
>>532226
Так он и учится, только теперь уже в качестве стажера и на реальном коде. Считаю что у него сейчас очень хорошие возможности для этого.
Или может он на собеседовании переоценил свои навыки? А, анон, что ты на собеседовании рассказывал?
> можно на полставки ходить чистить вордпресс
На ООП коде он научиться гораздо большему. Не надо бояться больших проектов, все нормальные проекты большие.
>>532227
Ребутать апач не надо.
> Почему цшмод не пашет на постоянной основе(я думал раз прописл права и все в ажуре, ан нет).
Он меняет разрешения на сущесвующих файлах а не на будущих. Это не машина времени.
Тебе надо изучить систему разрешений в линуксе, почитать хорошую и подробную статью. А потом мануал по chmod на всякий случай.
>>532233
Держись за эту работу всеми когтями. Джуниорам полезно работать в сложных проектах в условиях постоянного стресса.
Насчет стендап митинга по моему это нормально. ты рассказываешь что сделал, что не успел и почему, прежде всего чтобы самому подвести итоги и составить планы на сегодня.
>>532238
Не обязательно, хотя можно.
Если бы не было сложностей, не было бы и спроса на программистов. Получали бы свои 20 к в месяц и жали кнопки в какой-нибудь визуальной среде.
>>532210
Там ты ставишь точку останова в конкретном файле и смотришь чему в ней равны переменные, выполняешь код пошагово или перепрыгиваешь к следующей точке. Почитай про отладку:
https://netbeans.org/kb/docs/php/debugging_ru.html
http://www.angarsky.ru/drupal/otladka-php-xdebug-phpstorm.html
Гугл: отладка php кода
Суть в том, что в PHP на сервере устанавливается плагин xdebug. Когда ты выбираешь в IDE «начать отладку», она открывает порт, ожидая соединения от xdebug, и открывает страницу в браузере со специальным приписанным параметром. xdebug его видит и подсоединяется к IDE. После чего она через это соединения управляет интерпретатором PHP.
Netbeans и PhpStorm оба содержат средства для взаимодействия с xdebug и отладки. Есть и другие сторонние программы и расширения но я не знаю насколько они нжедные и удобные.
>>532223
Так разрешения наверно не стоят нужные. Сделай stat /var/www.../file.css и посмотри какие у него разрешения.
Имей в виду что для доступа к файлу нужно право на чтение во всех вышестоящих папках. Сделай stat и для них.
Чем ты добавляешь файлы? Надо настроить программу чтобы она ставила правильные разрешения.
>>532226
Так он и учится, только теперь уже в качестве стажера и на реальном коде. Считаю что у него сейчас очень хорошие возможности для этого.
Или может он на собеседовании переоценил свои навыки? А, анон, что ты на собеседовании рассказывал?
> можно на полставки ходить чистить вордпресс
На ООП коде он научиться гораздо большему. Не надо бояться больших проектов, все нормальные проекты большие.
>>532227
Ребутать апач не надо.
> Почему цшмод не пашет на постоянной основе(я думал раз прописл права и все в ажуре, ан нет).
Он меняет разрешения на сущесвующих файлах а не на будущих. Это не машина времени.
Тебе надо изучить систему разрешений в линуксе, почитать хорошую и подробную статью. А потом мануал по chmod на всякий случай.
>>532233
Держись за эту работу всеми когтями. Джуниорам полезно работать в сложных проектах в условиях постоянного стресса.
Насчет стендап митинга по моему это нормально. ты рассказываешь что сделал, что не успел и почему, прежде всего чтобы самому подвести итоги и составить планы на сегодня.
>>532238
Не обязательно, хотя можно.
Он мне скидывал код, там название статического метода - нижний пробел, то есть вызывать его нужно так ::_
Ну это же издевательство какое-то.
Во времена PHP4 не было private и через подчеркивание обозначали непубличные методы, может в этом дело?
Сдаюсь.
Общую идею о наследовании таблиц понял, эти паттерны STI, ClassTI и ConcreteTI.
Но я не понимаю в нашем случае, какие уникальные поля есть у разных типов вопросов.
У нас есть объект Вопрос. От него наследуется два потомка: ВопросСВыборомОтвета, ВопросСВпечатываниемОтвета.
Пусть будет QuestionWithChoice и QuestionWithTyping.
От QuestionWithChoice наследуются классы QuestionWithSingleChoice и QuestionWithMultipleChoice.
От QuestionWithTyping наследуются классы QuestionWithTypingNumber и QuestionWithTypingString.
Но какие же у них уникальные свойства, и как будут выглядеть таблицы?
На данный момент вижу, что все свойства у разных типов вопросов абсолютно идентичны.
У всех есть
description (собственно текст вопроса)
points (кол-во очков за верный ответ - впрочем, может тут подвох? если можно выбрать несколько вариантов, то можно получить не 100% за правильный ответ, а меньше)
test_id
type ENUM
Тогда зачем мне бить вопросы на несколько "наследуемых таблиц", если я могу их положить в одну?
Я ничего не понимаю.
Уникальные свойства, которые есть только у одного типа вопросов:
— вопрос с текстом — правильный текст
— вопрос с числом — число и погрешность
Аналогично, «ответ студента на вопрос» тоже может иметь в зависимости от типа свойства «выбранный вариант», «выбранные варианты», «введенный текст», «введенное число» (которое при желании можно объединить с текстом).
> Тогда зачем мне бить вопросы на несколько "наследуемых таблиц", если я могу их положить в одну?
Например чтобы в коде у тебя было несколько классов-моделей для разных видов вопросов.
Если ты положишь в одну это будет неявное STI.
Я не говорю что надо сделать 4 таблицы. Я говорю что ты должен понимать что и как тут наследуется. И метод выбирать исходя из плюсов, минусов и реально ли это реализовать в Юи. Я против STI ничего не имею.
>— вопрос с текстом — правильный текст
Хм, я думал хранить варианты ответов в отдельной таблице и завести там колонку "верный/неверный" ответ. И для типов вопроса "введенный текст" и "введенное число" тоже хранить их как единственно верный вариант ответа в таблице с вариантами.
Значит, правильный ответ перенести в таблицу с вопросами?
Ок.
Тогда таблица с вариантами ответов будет нужна только для хранения собственно вариантов на выбор, то есть для двух из четырех типов вопросов.
Может и от нее избавиться? Забить варианты тем же енамом в таблицу вопросов? О, кажется нашлось еще одно уникальное свойство для выборочных типов вопросов.
> ENUM ('0', '1')
>Значения энума нельзя делать числом
Я же в кавычки взял. Или оно все равно приводится к числу? Хорошо, пусть будет yes/no.
>погрешность для числа
Это наверное допустимая разница между введенным и правильным числом?
Ладно, я лучше завтра на свежую голову. Нужно ведь еще разобраться >реально ли реализовать в Юи эти паттерны.
А, нет блять, в перле то же самое, но там хотя бы на изичах можно сравнить с помощью eq. Ебаное человечество, нет нормальных флоатов, пиздец.
Ты пишешь по моему глупости. Во-первых, сравнить числа через == в PHP ты можешь, но результат может тебя не устроить так как вычисления приближенные и числа окажется не совсем равны.
Потому числа с плавающей точкой сравнивают, находя разность и проверяя что она меньше определенной величины:
$epsilon = 0.00001;
if (abs($a - $b) < $epsilon) { ... }
Это описано даже в мануале: http://php.net/manual/ru/language.types.float.php
Эпсилон выбирается в зависимости от задачи и значений чисел. Подробный алгоритм описан тут:
https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
http://floating-point-gui.de/
В Перле ситуация точно такая же. Я не раз замечал что критики PHP сами в предмете не разбираются.
Более того, в некоторых книгах предлагаются еще более абсурдные способы сравнения: http://docstore.mik.ua/orelly/perl4/cook/ch02_04.htm
Предлагаемая там формула очевидно неверная и дает ошибки если сравниваемые числа округляются в разные стороны. Если ты хотел упомнять этот способ то знай что он неграмотный.
> Хм, я думал хранить варианты ответов в отдельной таблице и завести там колонку "верный/неверный" ответ. И для типов вопроса "введенный текст" и "введенное число" тоже хранить их как единственно верный вариант ответа в таблице с вариантами.
У тебя не предусмотрена там погрешность. Да и бессмысленно делать отдельную таблицу для вопросов у которых ровно один вариант ответа — в этом случае логично ответ хранить вместе с вопросом.
> Может и от нее избавиться? Забить варианты тем же енамом в таблицу вопросов?
Как, интересно? Если хранить их в одном поле через запятую, то ты нарушаешь принципы нормализации, что одна ячейка дложна хранить одно значение (про нормализацию должен прочесть любой разработчик прежде чем браться проектировать БД так что советую набрать в гугле «нормализация баз данных» и прочесть, это любят на собеседовании спрашивать).
> Или оно все равно приводится к числу?
Не знаю, но я бы не рисковал, так как mysql любит преобразовывать типы данных молча.
> Это наверное допустимая разница между введенным и правильным числом?
Да, в стиле Пи = 3.14 ± 0.01 или ответ = 10 ± 5%
И еще. Скажи на своем или чужом опыте, анон, про необходимый минимум для Remote Work, а.
Например, обязательно ли проживать на территории страны работодателя?
В большинстве случаев имею ввиду. Закономерность.
Няш, а что ты умеешь? Какие задачки от ОПа решал? Что на собеседовании спрашивали?
ЮНапиши функцию fmap(a, gen), которая принимает на вход 2 функции, a и gen, где gen — функция-генератор вроде той, что была в первом задании. fmap возвращает новую функцию-генератор, которая при каждом вызове берет следующее значение из gen и пропускает его через функцию a.
http://pastebin.com/7grA8c76
Например:
4 часа в сутки.
50 страниц такой-то книжки такого-го автора.
или
столько-то тысяч строк кода за такое-то кол-во времени
Спасибо за внимание.
Важно не образование, а склад ума.
Иному человеку хоть профессора найми, он все равно не поймет математику.
У меня есть. Сидит на удаленке в какой-то немецкой конторе. Получает примерно 1.5-2к евро. Для бульбостана очень окей. Вышки нет, в школе сурово сосал в математике. В универ поступить не смог. Еще у него очень хуево с алгоритмами. Думаю даже задачу с кредитами с одного захода не порешает. Берет трудолюбием и упертостью. Сейчас вроде его отправили во фронтэнд.
Да и математику что мешает подучить на том же https://www.khanacademy.org/ для низкого старта + потом курсы с https://www.coursera.org/ и http://ocw.mit.edu/index.htm (да-да тот самый MIT совершенно на халяву). Мозги хорошо тренирует если небольшими дозами и регулярно. Это после отмороженной нашей школы кажется, что математика это ад и погибель, а на самом деле там красота и охуенность.
Пхп мидл девелопер.
А зачем пхп-макаке нужен матан?
Вот поэтому нужно сначала все выучить, а потом идти жаботать, дебил тупой.
у меня аж голова заболела, пока читал.
Минимум 4 часа погромирования и минимум 50 страниц в сутки как раз.
Стараюсь обычно больше читать даже, чтобы создать себе общую картину, делаю также заметки и потом пишу код и стараюсь использовать новые фичи.
> src: url(../fonts/Rurintania.eot);
>\tsrc: url(../fonts/Rurintania.ttf);
Второе свойство тут переопределяет первое и первое никогда не срабатывает. Это то же самое что написать
color: blue;
color: red;
текст получится красным. Почитай про синтаксис правила src и как в нем указать несколько форматов.
> font-weight: 900;
> font-style: italic;
У тебя нет правил, описывающих жирный или курсивный шрифт. У тебя только одно правило @font-face и оно описывает обычный, нежирный и некурсивный шрифт. Чтобы добавить другие начертания, надо добавить правила @font-face для них и указать файлы с шрифтом в нужном начертании (RurintaniaBold или вроде того).
Что я хотел сказать, если в шрифте несколько начертаний, то надо несколько файлов (для каждого начертания свой файл) и несколько правил @font-face.
«Начертание» здесь значит разновидность одного и того же шрифта. то есть «жирный», «курсивный», «обычный» и тд.
а все, нашел, вот я туплю порой.
Композер ставится установщиком, если ты ставишь руками то можно кинуть в директорию с проектом или в любую на твой выбор. В этом случае придется писать путь к нему в команде.
Вот так и рождаются быдлокодеры. И зачем все эти Макконнелы и Таненбаумы пишут свои книги? Я уж молчу про паттерны, бест практисы, рефакторинги и сам кампуктер саенс как таковой. А ещё дискретная математика и алгоритмы.
Ведь всё это НИНУЖНА, сел и хуячишь с ютубчика!
Начинающий не сможет любую информацию найти и понять. Ну и не имея определенного опыта, трудно сказать хорошее советуют или плохое.
В голос с тебя.
Интересно, как ты гуглишь Макконнела или Боба Мартина?
>меня опять не взяли на работу, сказали что пишу говнокод
>What does a good programmer's code look like? stackoverflow
топкек
Я к тому, что если уже работаешь в какой-то серьезной хуйне и получаешь дохуя, то есть смысл дрочить всякие алгоритмы, книги (которые устаревают быстрее видео с ютуба), а для нюфани главное, чтобы быстро и работало, а иначе это просто проеб времени на говно, которое не пригодится.
Если не ждать переводов, то книги выходят очень быстро. Я только в рашкокоммьюнити заметил такую нелюбовь к книгам, на реддитах и стаковерфлоу как раз частенько книги и рикаминдуют читать.
Ну, видимо поэтому второкурсники нормального вуза США работают в гугле, а нашим даунам и 10 лет опыта мало чтобы что-то лучше бодишопа найти.
В бодишопах тоже собеседования строгие. С видеокурсами максимум можно рассчитывать на провинциальную вебстудию.
>5. Arguably the best documentation for any language"
I should very much like to see that argument.
My impression of PHP documentation (after using it for three of the last five years) is that it's a endless pile of bullshit whose primary content is in user comments on the doc pages.
That's the core library. Third party libraries are typically wholly uncommented and undocumented.
я и живу в провинции, на что мне еще рассчитывать лол?
зато в видео все понятно, а от голой теории у меня жопа болит, потому что я перестаю ее понимать, если не вижу результат вывода.
Тебе в /hc
Заябись книжку по ОПП за 90й год качнул да? Остальное про ООП мусолится то, что в любой онлайн документации есть. Вот очень мне интересно сидеть вычитывать, как в 1 и 2й версии обоже ООП не было, а потом какой-то хуй внезапно решил его ввести и насколько это спорный подход блаблабла, очень практично и очень пригодится столь ценное знание, чтобы понтануться перед столичными очкариками из Яндекса, что я аж обоже целую книгу про ОПП прочитал и теперь знаю ОБОЖЕ историю введения опп в пхп обожежежежежеж?
Если я правильно понял: у варианта ответа с вводом числа с клавиатуры есть свойства "правильное число" и "погрешность"; у варианта с вводом строки свойство "правильная строка"; у вопросов с вариантами вроде бы нет доп.свойств, но зато для них есть таблица с вариантами ответов.
Тогда так https://gist.github.com/nsdvw/b19480f1dd4f2f7f8de5
>Если хранить их в одном поле через запятую, то ты нарушаешь принципы нормализации
Я оговорился, я имел ввиду какую-нибудь сериализацию, например в json. Но действительно лучше вынести варианты в отдельную таблицу.
По нормализации имею общее представление.
Если своими словами, то первая нф: атомарность - в одной ячейке должно храниться только одно значение; вторая: неизбыточность - все свойства должны зависеть от первичного ключа, атрибуты зависящие от других атрибутов нужно выносить во внешние справочники; третья нф: транзитивность - поля не должны быть взаимоисключающими, например название города и почтовый индекс.
по шарпу да, но не пхп же.
Ну и нахуй ты столько написал? Я писал, что нельзя сравнить по-нормальному, без ебаных эпсилонов или подключения сторонних модулей. В перле с этим лучше >>532309. Если в том абсурдном примере, который ты привел, заменить != на ne, то флоаты будут сравнены по-нормальному.
А все, что ты написал наилегчайше гуглится/придумывается и вообще в официальном мане на странице флоатов все это обсосано в комментах.
>>532321
Большинство задач в веб-программировании решается без каких-либо тугих умственных размышлений, почти все можно решить на опыте и знаниях. Там даже хорошо, если чувак не выебывается и пишет тупой, одноклеточный код. Тем более, если это фронтенд.
Ахах, объясни еще раз.
Итак, кошки и мышки введут себя совершенно странно: выходят за придел карты, появляются где заходят и вообще ведут себя как захотят!
Уверен, что я просто где-то ошибся в этих строках:
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Mouse.php#L23-L43
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L22-L42
Я помню, что ты предлагал мне высчитывать по балам наиболее выгодный ход, но мне интересней сначала высчитать площадь "опасной" зоны для мышки (в случае если несколько кошек окружают мышку) и потом можно так же по балам высчитать наиболее выгодный ход.
Насчет поиска ошибок, сделай так: уменьши число мышей и кошек до 1-2-3 и сделай вывод при каждом ходе кто и как ходит, вроде
Мышь 1 переместилась с (10, 20) на (20, 30)
Чтобы увидеть где именно начинается странное поведение. После этого добавь вывод переменных, которые влияют на выбор хода (например $from, $speed, $x, $y из твоего примера) чтобы понять что приводит к таким ошибкам.
То есть мы идем от места ошибки к ее источникам.
Попробуй сначала найти ошибку сам. Если не получится, тогда я могу глянуть код.
У меня идея для стартапа: приложение, которое позволяет установить дату для изменения. Т.е. например 1 января 2017 года мы меняем Х на Y, все подписываются, форсят пост (петиция, ватева), обсуждают, а кто после 1 числа не выполнил изменение, тот лох и пидр. Монетизация за счёт рекламы и спонсорских постов.
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
Результат выполнения данного примера:
I am bar.
I am bar.
Почему
echo "{$foo->$baz[1]}\n"; но в классе foo нет массива baz
> приложение, которое позволяет установить дату для изменения. Т.е. например 1 января 2017 года мы меняем Х на Y, все подписываются, форсят пост (петиция, ватева), обсуждают, а кто после 1 числа не выполнил изменение, тот лох и пидр
Не понял нихуя. Твоё приложение может изменить семнадцать миллионов строчек кода?
$foo->$baz[1]
Вместо $baz[1] очевидно подставится его значение, то есть 'bar' (в массивах отсчет идет с нуля, поэтому элемент под индексом 1 это второй по счету). Поэтому выполнится $foo->bar.
>var $bar
Так писали в старом php4.
Потому что пхп - говно. Привыкай.
>$foo->$baz[1]
Спасибо, но
Мы обращаемся к элементу массива расположенного в объекте класса foo, но baz находится вне класса foo, вот это вот не понятно
>Мы обращаемся к элементу массива расположенного в объекте класса foo,
Ты как-то неправильно себе это представляешь.
Смотри, есть переменная $baz[1], ее значение строка 'bar'.
Ну вот это значение и подставляется вместо $baz[1] в выражении $foo->$baz[1].
То же самое, если ты напишешь
$word = 'hello';
echo $word;
Выведет строку 'hello'.
http://ideone.com/yS6r0Z
>>533143
Ничем, но else if (раздельно) нельзя использовать в альтернативном синтаксисе (с двоеточием).
http://php.net/manual/ru/control-structures.elseif.php
Так что лучше в php всегда использовать elseif, а else if оставить для js и не путаться.
Ёбана, ты обращаешья к свойству объекта, используя переменную вместо прямого указания свойства. Т.е. $foo->$baz[1] а не $foo->baz[1], а $baz[1] у тебя имеет значение bar.
Тогда где он будет искать массив baz? Во всем файле или в своем блоке/области видимости?
В глобальной области конечно.
Это самая обычная переменная.
function foo() {echo 'hello, foo';}
function bar() {echo 'hello, bar';}
$x = 'foo';
$x(); // выведет 'hello, foo'
$x = 'bar';
$x(); // выведет 'hello, bar'
Вместо переменной подставляется ее значение, вот и все. С массивами то же самое, потому что элементы массива это обычные переменные.
for ($god = 1; $god <= 20; $god ++) {
\t
\t$ostatokNekto = $nekto $procent;
\t$balance = $ostatokNekto $procent;
\t$ostatokLet = $let + $god;
\techo "{$god} год спустя {$balance} лет человеку {$ostatokLet}\n";
За такой код в продакшене надо отрывать руки. Видимо тут поработали те самые странные разработчики, которые внгедрились в команду PHP и периодически добавляют в него бесполезные фичи для запутывания кода.
$foo->$baz[1] равносильно $foo->{$baz[1]} то есть приоритет операций идет не слева направо. И как я помню, в последних версиях этот приоритет то ли поменяли то ли решили оставить.
>>533136
Значит этот абзац в документации остался со времен PHP4. Документация большая, всю ее в один день не перепишешь.
>>533143
elseif выглядит аккауратнее и является часть одно большого оператора if, а else if выглядит неаккуратно и является опереатором if внутри блока else.
>>533158
Есть такое понятние как приоритет операций. Ты же не возмущаешься что в математике сначала выполняется умножение, а потом сложение? Также, есть особенности парсера который разбирает код.
Ну и как я написал выше, такой код все равно писать нельзя.
>>533161
Он будет искать его по тем же правилам что и обычную переменную, в зависимости от того происходит дело внутри функции или снаружи.
>>533163
Ты как-то непонятно пишешь. надо было написать что так же как и любую другую переменную.
>>532340
>>533177
> for (var i = 0; i < arguments.length; i++) {
> args = arguments;
Ты не очищаешь массив args и при втором вызове seq() в нем останутся аргументы с предыдущего раза которые могут добавиться к текущим.
> res = a(gen(args));
gen(args) это не то же самое что gen(1, 2, 3). В первом случае ты передаешь один аргумент-массив, во втором 3 аргумента.
Чтобы передать массив как отдельные аргументы, надо использовать методы call либо apply:
http://javascript.ru/Function/apply
https://learn.javascript.ru/call-apply
За такой код в продакшене надо отрывать руки. Видимо тут поработали те самые странные разработчики, которые внгедрились в команду PHP и периодически добавляют в него бесполезные фичи для запутывания кода.
$foo->$baz[1] равносильно $foo->{$baz[1]} то есть приоритет операций идет не слева направо. И как я помню, в последних версиях этот приоритет то ли поменяли то ли решили оставить.
>>533136
Значит этот абзац в документации остался со времен PHP4. Документация большая, всю ее в один день не перепишешь.
>>533143
elseif выглядит аккауратнее и является часть одно большого оператора if, а else if выглядит неаккуратно и является опереатором if внутри блока else.
>>533158
Есть такое понятние как приоритет операций. Ты же не возмущаешься что в математике сначала выполняется умножение, а потом сложение? Также, есть особенности парсера который разбирает код.
Ну и как я написал выше, такой код все равно писать нельзя.
>>533161
Он будет искать его по тем же правилам что и обычную переменную, в зависимости от того происходит дело внутри функции или снаружи.
>>533163
Ты как-то непонятно пишешь. надо было написать что так же как и любую другую переменную.
>>532340
>>533177
> for (var i = 0; i < arguments.length; i++) {
> args = arguments;
Ты не очищаешь массив args и при втором вызове seq() в нем останутся аргументы с предыдущего раза которые могут добавиться к текущим.
> res = a(gen(args));
gen(args) это не то же самое что gen(1, 2, 3). В первом случае ты передаешь один аргумент-массив, во втором 3 аргумента.
Чтобы передать массив как отдельные аргументы, надо использовать методы call либо apply:
http://javascript.ru/Function/apply
https://learn.javascript.ru/call-apply
>>533177
Также я не понимаю, зачем тут переменная res (и кстати не сокращай, пиши result). Какой смысл что ты кладешь что-то в переменную и никуда дальше не передаешь?
Также, я не понимаю, почему переменные объявлены во внешней функции. Есть необходимость чтобы они сохранялись между вызовами внутренней? По моему такой необходимости нет.
Переменная может вычисляться через ее старое значение, если она существует к этому моменту:
$balance = $balance + ...
$balance = $balance × ...
Если я правильно тебя понял.
На stackoverflow говорят прикреплять заголовок xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
и проверять его в массиве $_SERVER.
http://stackoverflow.com/questions/2579254/does-serverhttp-x-requested-with-exist-in-php-or-not
Вроде работает, но на всякий случай переспрашиваю, все-таки пять лет прошло, вдруг придумали что-нибудь новое.
>>533209
Массив возвращать.
>Массив возвращать.
а вызывать в таком случае как её?
$array = array(funcName($arg, $arg2), funcName2($args...))
?так штоле?
Указатели на сосач.
<?php
\t$opName = "молодец";
\tfor($i = 1; $i <= 10; $i ++) {
\t\techo "Say\n {$i}";
\t}
ЧТо
<?php
\t$opName = "молодец";
\tfor($i = 1; $i <= 10; $i ++) {
\t\techo "Say\n $i";
\t}
Вывод один и тот же. В чем отичие "{$i}" и просто "$i".
Никто не сталкивался с проблемой, почему \n не переносит строку?
> Как определить, что запрос был сделан аяксом?
А зачем? Что, аякс-запросы чем-то особенные?
Если это должно определять на тип результата (например вернуть JSON вместо HTML) то просто добавь явный параметр: /get/something?result=json
Иначе у тебя создается дурацкая ситуация когда один и тот же URL возвращает разные типы данных и это очень невесело отлаживать. Также, при одинаковом URL кеш может закешировать HTML ответ и вернуть при попытке запросить JSON. Это верный путь к быдлокодерству.
> На stackoverflow говорят прикреплять заголовок xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
Так делает jQuery но я считаю надо явно указывать что тебе требуется в URL. Иначе ты запутываешь код и получаешь проблемы с кешированием. Ну и дети с SO видимо плохо разбираются в HTTP.
По идее в HTTP уже есть заголовок Accept. Клиент может указать в нем тип данных, который он хотел бы получить. Например аякс-запрос мог бы указывать там Accept: application/json. Но это ведет к тем же самым проблемам.
Так что указывай параметр в URL.
>>533212
Есть ссылки, но в 99% они не нужны и ты делаешь то-то не то.
>>533214
$array = dSomething();
>>533217
Мануал бы открыл https://www.google.ru/search?q=php+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8&oq=php+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8&aqs=chrome..69i57j0l3.2608j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
>>533242
> В чем отичие "{$i}" и просто "$i".
Мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
> почему \n не переносит строку?
Ты в браузере страницу открываешь? \n работает, открой исходный код страницы (Ctrl + U). Просто на самой странице не отображается по правилам HTML.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
> Как определить, что запрос был сделан аяксом?
А зачем? Что, аякс-запросы чем-то особенные?
Если это должно определять на тип результата (например вернуть JSON вместо HTML) то просто добавь явный параметр: /get/something?result=json
Иначе у тебя создается дурацкая ситуация когда один и тот же URL возвращает разные типы данных и это очень невесело отлаживать. Также, при одинаковом URL кеш может закешировать HTML ответ и вернуть при попытке запросить JSON. Это верный путь к быдлокодерству.
> На stackoverflow говорят прикреплять заголовок xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
Так делает jQuery но я считаю надо явно указывать что тебе требуется в URL. Иначе ты запутываешь код и получаешь проблемы с кешированием. Ну и дети с SO видимо плохо разбираются в HTTP.
По идее в HTTP уже есть заголовок Accept. Клиент может указать в нем тип данных, который он хотел бы получить. Например аякс-запрос мог бы указывать там Accept: application/json. Но это ведет к тем же самым проблемам.
Так что указывай параметр в URL.
>>533212
Есть ссылки, но в 99% они не нужны и ты делаешь то-то не то.
>>533214
$array = dSomething();
>>533217
Мануал бы открыл https://www.google.ru/search?q=php+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8&oq=php+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8&aqs=chrome..69i57j0l3.2608j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
>>533242
> В чем отичие "{$i}" и просто "$i".
Мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
> почему \n не переносит строку?
Ты в браузере страницу открываешь? \n работает, открой исходный код страницы (Ctrl + U). Просто на самой странице не отображается по правилам HTML.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Тебе надо сделать как в моем посте. Ну к примеру чтобы каждый раз увеличивать сумму на 5, можно написать
$balance = $balance + 5;
И в учебнике (во втором уроке по моему) написан способ записать это короче.
Также, не называй переменные транслитом, не знаешь английский, используй гугл транслейт или яндекс-словари. А русские слова лучше писать в комментариях русскими буквами.
Спасибо
Спасибки про транслит я помню.
Как вывести именно сумму
Как вывести их сумму? То есть
echo "{${$a + $b}}" пишу так, он пишет undefined variable
Как определить эту переменную?
А если тебе надо это вставить в текст, лучш всего завести отдельную переменную:
$c = $a + $b;
echo "С равно $c\n";
>- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
Может есть у кого в fb2?
Не нужно мне давать никаких статей читать.
Просто скажите, что исправить.
function fmap(a, gen) {
var args = [];
for (var i = 0; i < arguments.length; i++) {
args = arguments;
}
return function seq(){
res = a(gen.apply(undefined, args));
args = [];
return res;
}
}
> Не нужно мне давать никаких статей читать.
Почему?
> Просто скажите, что исправить.
Суть задачек в том чтобы научиться. От готовых ответов ты ничему не научишься.
потому что у меня уходит на одну простую задачку 1-2 дня
пишешь-пишешь, зайдешь в тупик, пишешь сюда, тут ждешь ответа пару часов, потом исправляешь то, что тебе сказали, а оно все равно не работает
я уже сделал максимум, что я мог сделать
но ее решить не могу.
хочу посмотреть ответ и пойти дальше
>потому что у меня уходит на одну простую задачку 1-2 дня
Это нормально. Там нет простых задач, по крайней мере для начинающих.
Нужно научиться терпению, для программиста усидчивость, внимательность и упорство одни из главных качеств.
Тем более в php, здесь и мозгов не нужно, только трудолюбие.
Да и куда тебе спешить, ты же мелкобуквенный школьник, у тебя полно времени.
function fmap(a, gen) {
return function seq(){
var args = [];
for (var i = 0; i < arguments.length; i++) {
args = arguments;
}
res = a(gen.apply(gen, args));
args = [];
return res;
}
}
Да, задачки сложные, а как ты думаешь, почему? Они составлены так, чтобы без понимания определенной темы их нельзя было решить. Другие задачки можно решить гуглением, или перестановкой местами строк, а наши нельзя.
Если не получается, запости снова код и проси подсказку, а не готовое решение.
Ну и морально готовься что все равно придется прочитать весь learn.javascript.ru, так как там много полезного.
Последний раз ты запостил код, и там куча ошибок, и с ними по очереди надо разобраться:
> for (var i = 0; i < arguments.length; i++) {
> args = arguments;
Это так и написано или вакаба съела символы [ ] ? Лучше постить код на jsfiddle тогда.
Далее, ты составляешь список аргументов в момент вызова fmap, а по условиям задачи, что надо передавать в gen? Список аргументов при вызове fmap (включая a и gen) или список аругментов при вызове внутренней функции seq?
Далее, args = [] , а это зачем?
Далее,
> res = ...
Ты создаешь глобальную переменную и это плохо, необходимости в этом нет, почему var забыл? Чтобы не забывать, пиши в начале функции
"use strict";
тогда точно забыть не получится.
Ну и наконец, для копирования аргументов вместо цикла for можно использовать хитрый трюк, мы можем взять метод slice() у массива и подсунуть ему вместо массива псевдомассив arguments, как описано тут: http://javascript.ru/arguments
Этот трюк часто используют так как он короче.
Насчет того, что приходится ждать. Да, советчиков тут не очень много и у них есть другие дела. Чтобы не ждать никого, ты можешь параллельно начать решать следующую задачу или например задачки на HTML/CSS или PHP, если ты ими интересуешься. Ну то есть подумай сам, как эффективнее организовать, я не ведь запрещаю несколько задач параллельно решать.
>>533432
Нет, ты не сделал все, что смог. Если ты будешь заниматься программированием (пока ты только изучаешь основы) то каждый раз перед тобой будет стоять какая-нибудь новая проблема. Однако задача программиста как раз их решать. Иначе они были бы не нужны.
Ну и ты можешь решать другие задачи пока ждешь подсказки. Это же не запрещается.
>>533435
Ты же 2 поста выше написал что сделал все что мог и решить ее не можешь!
Раз ты смог, тогда улучши код:
— добавь "use strict"; в начале функции и перепроверь (описание строгого режима: https://learn.javascript.ru/strict-mode ), в начале скрипта может не срабтать. Скорее всего будет ошибка из-за переменной res
— не сокращай названия, пиши result вместо res
— избавься от переменной res, она не нужна так как мы можем сразу вернуть результат без сохранения в переменную. Очищать args не требуется так как это локальная переменная и она уничтожится при выходе из функции.
Также рекомендую показать решения других задач, вдруг там есть что исправить.
Да, задачки сложные, а как ты думаешь, почему? Они составлены так, чтобы без понимания определенной темы их нельзя было решить. Другие задачки можно решить гуглением, или перестановкой местами строк, а наши нельзя.
Если не получается, запости снова код и проси подсказку, а не готовое решение.
Ну и морально готовься что все равно придется прочитать весь learn.javascript.ru, так как там много полезного.
Последний раз ты запостил код, и там куча ошибок, и с ними по очереди надо разобраться:
> for (var i = 0; i < arguments.length; i++) {
> args = arguments;
Это так и написано или вакаба съела символы [ ] ? Лучше постить код на jsfiddle тогда.
Далее, ты составляешь список аргументов в момент вызова fmap, а по условиям задачи, что надо передавать в gen? Список аргументов при вызове fmap (включая a и gen) или список аругментов при вызове внутренней функции seq?
Далее, args = [] , а это зачем?
Далее,
> res = ...
Ты создаешь глобальную переменную и это плохо, необходимости в этом нет, почему var забыл? Чтобы не забывать, пиши в начале функции
"use strict";
тогда точно забыть не получится.
Ну и наконец, для копирования аргументов вместо цикла for можно использовать хитрый трюк, мы можем взять метод slice() у массива и подсунуть ему вместо массива псевдомассив arguments, как описано тут: http://javascript.ru/arguments
Этот трюк часто используют так как он короче.
Насчет того, что приходится ждать. Да, советчиков тут не очень много и у них есть другие дела. Чтобы не ждать никого, ты можешь параллельно начать решать следующую задачу или например задачки на HTML/CSS или PHP, если ты ими интересуешься. Ну то есть подумай сам, как эффективнее организовать, я не ведь запрещаю несколько задач параллельно решать.
>>533432
Нет, ты не сделал все, что смог. Если ты будешь заниматься программированием (пока ты только изучаешь основы) то каждый раз перед тобой будет стоять какая-нибудь новая проблема. Однако задача программиста как раз их решать. Иначе они были бы не нужны.
Ну и ты можешь решать другие задачи пока ждешь подсказки. Это же не запрещается.
>>533435
Ты же 2 поста выше написал что сделал все что мог и решить ее не можешь!
Раз ты смог, тогда улучши код:
— добавь "use strict"; в начале функции и перепроверь (описание строгого режима: https://learn.javascript.ru/strict-mode ), в начале скрипта может не срабтать. Скорее всего будет ошибка из-за переменной res
— не сокращай названия, пиши result вместо res
— избавься от переменной res, она не нужна так как мы можем сразу вернуть результат без сохранения в переменную. Очищать args не требуется так как это локальная переменная и она уничтожится при выходе из функции.
Также рекомендую показать решения других задач, вдруг там есть что исправить.
Что такого страшного в кукисах, чтобы писать о них ворнинги?
Например:
Ironmaiden.com uses cookies, by continuing to browse the site, you are agreeing to our use of cookies. Click here to find out more.
Европейское законодательство обязывает сайты сообщать как и с какой целью они отслеживают пользователей и куда идут данные. куки обычно используются системами аналитики.
На моем сайте кстати внизу тоже про это написано мелким шрифтом.
Вообще, закон задумывался как лучше, предупредить пользователя что за ним следят, но вышло в итоге куча надоедливых предупреждений. А как избавиться от слежки? Сложно, но для начала можно отключить куки на всех сайтах кроме тех где они нужны (где есть логин или что-то сохраняется в куки). Хром позволяет делать такие вещи, я например отключил яваскрипт на всех сайтах кроме нескольких доверенных.
А что за секретные данные могут попасть в куки, что так беспокоиться о них? Ну пароль от этого конкретного сайта, статистика посещения.
Не понимаю, в чем конкретно угроза безопасности. Даже если куки будут украдены посторонними личностями, не вижу ничего смертельного.
>>533442
>как избавиться от слежки?
В чем слежка? Что запишут мой айпи или пароль на конкретном сайте?
Да и слежки бояться, на улицу не выходить. В людях заложено пялиться друг на друга и оценивать, лезть не в свое дело.
А в будущем города будут усеяны видеокамерами, и все операции производиться по биометрическим данным (например отпечатки пальцев вместо кредитной карты в магазине). Так что параноикам не поздоровится.
С помощью кук сайт может следить за тобой. Он может запомнить когда и откуда ты пришел на сайт, что делал, куда ушел, даже если ты там был несколько месяцев назад. Это куки сайта, они действуют в пределах одного домена. То есть в общем выглядит не страшно.
Но есть вещь и похуже — это 3rd party (сторонние) куки. Эти куки ставят системы аналитики и рекламные системы так, что кука доступна на всех подключенных к ним сайтам и позволяет отслеживать твое перемещение по сети (куки ставятся в ифрейме либо посылаются при запросе скрипта со стороннего сайта, если тебе интересно). На какие сайты заходишь, какие поисковые запросы вводишь. Та же Google Analytics установлена на большинстве сайтов.
Фейсбук и контакт следят за людьми через кнопки лайков, установленные на многих сайтов. Злонамеренные расширения к браузеру следят вообще за всем чем можно.
Было где-то демо, ты заходишь и тебе показывают последние посещенные тобой сайты, данные извлекаются из какой-то рекламной системы которая следит за пользователями через кнопки шаринга или что-то такое. Оно сейчас не рабоает, статья тут: http://habrahabr.ru/post/254217/
Как минимум все эти данные используются для подсовывания тебе целевой рекламы, но их можно использовать и для более злых целей. Например по ним можно оценивать платежеспособность и выдавать более высокие цены. Вот пример его-то отдаленно похожего:
http://siliconrus.com/2014/03/florist-prices/
http://siliconrus.com/2014/08/more-mac/
Внимательный читатель заметит что система слежки не очень совершенна если у пользователя несколько устройств, например компьютер и айпад. Можно ли как-то исправить этот недостаток? Ну конечно, можно. Во-первых, андроид-устройства требуют от тебя ввести логин на гугле, по которому можно связать тебя с твоим компьютером (если на нем ты его исопльзуешь), причем Гугл кроме твоего логина как бонус получает твой номер телефона, данные симки. Но эти данные доступны только гуглу, что же делать другим рекламным сетям которые пока не способны выпустить ОС для смартфонов? На помощь придет провайдер который добавит в передаваемые браузером на сайт данные идентификатор клиента: http://habrahabr.ru/post/247465/
Это на мой взгляд особая степень свинства. Я пользуюсь интернетом не бесплатно, я за него плачу не для того чтобы мои данные продавались направо и налево.
Ты не беспокоишься? Прекрасно, но жругие могут так не думать.Как минимум это неприятно.
И надеюсь мой рассказ объяснит тебе мотивацию, почему крупные компании тратят большие деньги на разработку и бесплатно распространяют свои операционные системы и браузеры (точнее, гугл тратит, а мейл ру просто поменял скин и адрес для отправки собранных данных).
Также, тут есть политический момент. Самый популярный браузер — Гугл Хром, популярная система аналитики Google Analytics, самые популярные смартфоны это Android и iPhone,и как-то само собой вышло так, что вся эти информация со всего мира стекается в Калифорнию. По твоему, это справедливо, что гигантские массивы данных идут туда (и угадай с 3 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо. Тем более как мы знаем, многие наши крупные руководители пользуются американской техникой с так называемыми «облачными» технологиями которые заботливо «бекапят» (это в наше время так называется) всю информацию прямиком на сервера подконтрольные США. Это конечно немного другая история, но все равно нехорошо как-то.
> В людях заложено пялиться друг на друга
Одно дело ты видишь на улице тысячу человек и ни одного не запомнил, другое дело, набираешь «Иван Иванов» и видишь полное досье и историю посещенных страниц.
С помощью кук сайт может следить за тобой. Он может запомнить когда и откуда ты пришел на сайт, что делал, куда ушел, даже если ты там был несколько месяцев назад. Это куки сайта, они действуют в пределах одного домена. То есть в общем выглядит не страшно.
Но есть вещь и похуже — это 3rd party (сторонние) куки. Эти куки ставят системы аналитики и рекламные системы так, что кука доступна на всех подключенных к ним сайтам и позволяет отслеживать твое перемещение по сети (куки ставятся в ифрейме либо посылаются при запросе скрипта со стороннего сайта, если тебе интересно). На какие сайты заходишь, какие поисковые запросы вводишь. Та же Google Analytics установлена на большинстве сайтов.
Фейсбук и контакт следят за людьми через кнопки лайков, установленные на многих сайтов. Злонамеренные расширения к браузеру следят вообще за всем чем можно.
Было где-то демо, ты заходишь и тебе показывают последние посещенные тобой сайты, данные извлекаются из какой-то рекламной системы которая следит за пользователями через кнопки шаринга или что-то такое. Оно сейчас не рабоает, статья тут: http://habrahabr.ru/post/254217/
Как минимум все эти данные используются для подсовывания тебе целевой рекламы, но их можно использовать и для более злых целей. Например по ним можно оценивать платежеспособность и выдавать более высокие цены. Вот пример его-то отдаленно похожего:
http://siliconrus.com/2014/03/florist-prices/
http://siliconrus.com/2014/08/more-mac/
Внимательный читатель заметит что система слежки не очень совершенна если у пользователя несколько устройств, например компьютер и айпад. Можно ли как-то исправить этот недостаток? Ну конечно, можно. Во-первых, андроид-устройства требуют от тебя ввести логин на гугле, по которому можно связать тебя с твоим компьютером (если на нем ты его исопльзуешь), причем Гугл кроме твоего логина как бонус получает твой номер телефона, данные симки. Но эти данные доступны только гуглу, что же делать другим рекламным сетям которые пока не способны выпустить ОС для смартфонов? На помощь придет провайдер который добавит в передаваемые браузером на сайт данные идентификатор клиента: http://habrahabr.ru/post/247465/
Это на мой взгляд особая степень свинства. Я пользуюсь интернетом не бесплатно, я за него плачу не для того чтобы мои данные продавались направо и налево.
Ты не беспокоишься? Прекрасно, но жругие могут так не думать.Как минимум это неприятно.
И надеюсь мой рассказ объяснит тебе мотивацию, почему крупные компании тратят большие деньги на разработку и бесплатно распространяют свои операционные системы и браузеры (точнее, гугл тратит, а мейл ру просто поменял скин и адрес для отправки собранных данных).
Также, тут есть политический момент. Самый популярный браузер — Гугл Хром, популярная система аналитики Google Analytics, самые популярные смартфоны это Android и iPhone,и как-то само собой вышло так, что вся эти информация со всего мира стекается в Калифорнию. По твоему, это справедливо, что гигантские массивы данных идут туда (и угадай с 3 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо. Тем более как мы знаем, многие наши крупные руководители пользуются американской техникой с так называемыми «облачными» технологиями которые заботливо «бекапят» (это в наше время так называется) всю информацию прямиком на сервера подконтрольные США. Это конечно немного другая история, но все равно нехорошо как-то.
> В людях заложено пялиться друг на друга
Одно дело ты видишь на улице тысячу человек и ни одного не запомнил, другое дело, набираешь «Иван Иванов» и видишь полное досье и историю посещенных страниц.
case равносилен такому:
$value = $i; // вычисляем выражение в switch 1 раз
if ($value == ($i > 0)) { ... } // по очереди сравнивем его с выражениями в case
elseif ($value == (($i < 0))) { ... }
else { ...}
Обычно только пишут так:
switch (true) {
case $x == 1 : ...
case $x > 5: ...
..
}
А у тебя какой-то особо усложеннный пример. Не пиши такой код.
Ну и говоря об улице. Ты не имеешь права просто так следить на улице за кем угодно, в законе есть соответствующая (уголовная) ответственность. Вопрос, а почему бы не применить аналогичные нормы к умникам, которые пытаются стоять за спиной и пялиться в твой монитор с помощью всех этих систем?
зачем два разаз определять переменую bar?
Довольно познавательно. Меня всегда интересовал вопрос безопасности. Довольно долгое время меня беспокоит вопрос о Tor Browser. У него открытый код, но поскольку я не очень хороший программист, я не понимаю что там написано. Плюс ко всему меня настораживает что проект начинался в армии США.
кстати, да, если ты не вылогинился из своих соцсетей, то чисто теоретически на стороннем сайте могут узнать айди соцсети. То же самое с регистрацией, когда вводишь на левых сайтах мыло и пароль, который у тебя от мыла - просто могут смотреть твой ящик, привязку вебкошелька, да вообще что угодно. Особенно эта параноай развивается, если проводишь все время в сети.
Забыл подписаться...
>По твоему, это справедливо, что гигантские массивы данных идут туда (и угадай с 3 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо.
Пидораха, залогинься.
Да, дети, не стоит читать забаненные роскомом новостные сайты через Тор, фу быть такими, сидите в чебурашке не рыпайтесь.
Brackets ставь и хватит.
PhpStorm. на рутрэкере есть с ключом.
Не знаю, я в целях "безопасности" использую фейки.
В соцсетях у меня только в вк пустая страница, почты постоянной вообще нет. Часто пользуюсь угнанными у быдла акаунтами. В прошлом году выкладывали 4 млн взломанных ящиков мэйлру, оставил себе около сотни.
Не понимаю, чем мне может навредить даже потеря такого акаунта, не говоря уже о том, что кто-то узнает айди.
>>533450
>Ты не имеешь права просто так следить на улице за кем угодно
Совсем зажрались в своей Москве.
Тут на улице быдло может тебя невозбранно и обматерить и побить, а на него видите ли смотреть незаконно.
Вот: https://en.wikipedia.org/wiki/List_of_PHP_editors
Из бесплатных самый популярный Sublime Text 3.
Есть ещё гитхабовский Atom: https://atom.io/
Зашел к вам, что бы спросить о подводных камнях по следующей теме: В общем мне дали таск написать сервис рассылки писем.
В общем есть база клиентов, и нужно иногда им рассылать почту. Для меня задача кажется легкой. Собственно скрипт дернул с базы массив клиентов, прошелся циклом и всем разослал по письму. Но думаю что там есть подводные камни в виде того, что почтовые сервисы будут меня принимать за спам и все такое. Собственно на что в этой ситуации обратить внимание?
Можно как я понимаю слать письма напрямую средствами php - http://php.net/manual/ru/function.mail.php
либо через smtp сервер.
Через что лучше слать?
Я плохо пока понимаю с чем имею дело и простите за тупые вопросы.
А, еще кое что забыл. Как реализовать отписку от рассылки? Пока думаю что в базу вкручу каждому пользователю уникальный токен, который будет приходить в письме вместе со ссылкой на скрипт для отписки
site.ru/unsubscripe.php?token=current_user_token
ну и в базе будет меняться значение у поля:
subscribed на false
соответственно в дальнейшем пользователь который прошел единожды посвоей ссылчке - больше не будет беспокоен.
Выглядит просто, есть ли другие более изящные вариант?
На Codeigniter на работке ковыряюсь. У меня под рукой даже есть функция рассылки писем в одном проекте, а что?
Конвертировал в разные форматы. Получил 5 форматов, все их оставил, подсоединил. Вес папки шрифтов в 3 раза уменьшился. Потому как оставил только нужные шрифты, а именно обычный и жирный. При том, что можно еще уменьшить, удалив ненужные форматы.
В хроме, яндексе, IE, торе, мозилле, опере и с андройда шрифты подключенные видно.
И да, я знаю что по дизайну этот шрифт очень не подходит, но ведь главное, что я научился подключать шрифты? Не подходит еще и потому, что я нашел сайт, который по картинке определяет шрифт и тот, который используется в макете платный и стоит 79 долларов. Пиратской версии гугл не выдал да, я помню, что пиратские не надо использовать, особенно с зарубежными заказчиками, но ради тренировки на макете все-таки поискал.
И да, в IE теперь при наведении нормально углы срезаются на работах в портфолии, но вот не помню чтобы я это чинил, магия какая-то.
Мне нужно отдавать файл через readfile, если не включен x-sendfile. Как это проверить?
apache_get_modules не предлагать, ибо он в списке disable_functions.
Оп, я почти случайно зашел в /пр, по своим делам, и случайно же увидел этот тред.
Такая-то милота написана, читал оп пост и второй и не мог не улыбаться.
Добра тебе и удачи.
у меня не в вк, но в другой соцсети реалка, например. нет, ну не все же такие аутисты в сети одними фейками пользоваться, на тот же веб кошелек ты должен присылать свой паспорт, многие системы и программы требуют ввода телефона, который тоже зареген на паспорт.
Я не против, например, но где? Если в скайпе, то сразу нет. Зелло - неплохой вариант.
Есть лимиты на максимальный размер принимаемого файла и общий размер отсылаемых постом данных.
Выставляются в настройках php.ini
upload_max_filesize
post_max_size
Посмотри в phpinfo, чему они равны сейчас, выставь значение побольше.
У Паши можно. В Telegram.
И где ты? Зачем ты вообще спрашивал про фреймворки? Сижу теперь тебя жду пусть даже и просто за жизнь потереть, а не за рассылку
Ну вот например сегодня целый день не отправлялись посты, а если сосака упадет на неделю, где я буду задавать тупые вопросы?
спасибо
Есть вот такая ситуация.
1 2 3 4 5 х
1 . . . . .
2 C M M . .
3 . M . . .
4 . . . . .
y
Вопрос:
1.Какую мышку можно съесть?.
2.Мышка на x = 2, y = 2 защищена?
2.Мышка на x = 2, y = 3 защищена?
Подскажи, /pr/, вот мне достался по наследству от знакомого сайт, но я понятия не имею как им грамотно управлять. Решил решить проблему фундаментально, создать простенький сайтик ручками, без всяких CMS и прочего. Порыскал по форумам и напоролся на такой совет:
Сделай простой сайт (не статический, а с базой данных).
И усложняй, приделывая:
— админку для добавления, удаления и редактирования страниц (практика основных простых запросов к БД)
— сделай регистрацию и авторизацию на своем сайте (практика работы с $_POST и $_GET, сессии, cookies)
— сделай чтобы страницы могли быть вложенны друг в друга и чтобы можно было в админке изменять у страницы родителя. На сайте выводи дерево страницы. (познаешь основы «деревьев», рекурсию)
— сделай форму для закачки файла (практика прастейшей работы с файлами)
— сделай чтобы закачивалась картинка и масштабировалась (практика работы c библиотекой GD для работы с изображениями). Можно капчу попробовать сделать кстати.
Вопрос заключается в следующем. Если есть опыт работы с html, но абсолютно отсутствует знание PHP и представление о базах данных, то хватит ли мне первой ссылки ОП-трэда и вообще, нужна ли она? Нужны ли какие-то специфичные учебники по БД? Пользоваться консолью умею, практикую, MySQL установлен, как и Apache, но, опять же повторюсь, не имею понятия что это вообще такое.
Я бы советовал посмотреть задачи из Оп поста про список студентов и файлообменник. Они тоже для начинающих но там подробные комментарии по реализации и они учат правильному коду. А в твоем задании нет никаких советов по архитектуре например.
Ну или ты можешь решить свою задачу используя советы из задачи про студентов.
> Нужны ли какие-то специфичные учебники по БД?
Нужны. В ОП посте есть задачи на SQL и там ссылки на туториалы для нубов.
Спасибо, буду работать.
ОПчик, я почти исправил все ошибки, осталась последняя:
Животные по карте перемещаются таким образом: https://ideone.com/UTm5nA
Так вот, когда дело доходит, что Кошка ловит Мышку, мышка не успевает понять что уже мертва, и ломает код пикрелейтед. Решение уже придумал:
Перед тем как передвинуть животное, нужно будет проверить не содержит ли ячейка, куда хочет переместиться, объект Животное, и если содержит, то вызвать метод этого животного, который "скажет" ему о смерти.
Перед тем это сделать у меня встал вопрос как проверить что это объект и обратиться к этому объекту?
if (is_object($this->map['x']['y]') или if (!$this->map['x']['y'] = '')?
И можно ли обратиться к объекту таким образом: $this->map['x']['y']->Die();
Сэнкс фо ридинг
С 49:00 и до конца.
"Сделайте ваш код более декларативным...", "ООП призвано решить проблему изменяемого состояния в императивном программировании..." и т. д.
Чёт я не понял ничего. Что он хотел сказать?
Сколько мне еще эти сайты строчить? Я чот заебался уже файлообменник делать.
exif_read_data("file.jpg");
foreach($exif as $key=>$section) {
foreach($section as $name=>$val) {
echo "<tr><td>$name:</td><td>$val</td></tr>";
шизофрения какая-то.
Не получается чот( Все весомое портфолио требуют, опыт работы и знание более одного фреймворка.
Оп, проконсультируй.
Заодно посмотри, пожалуйста, правильно ли я реализовал ,предложенный тобою, алгоритм.
https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php>>533624
Сходи побегай, сделай физ-нагрузку, потом прими душ. И с чистой головой шуруй работать дальше над проектом.
Зачем ты диры везде ставишь, оно же итак инклудит то, что рядом лежит?
Юзаю медиавики. Туда складирую все знания, полученные мной, и которые мне кажутся полезными.
Посоны, давайте конфу в слаке сделаем, а? Второго такого падения сосаки моя душа не выдержит.
Не все инклудит. Можешь проверить.
https://php-pr.slack.com/
Вот, запилил кароч. Попробуйте зайти и отписаться.
Есть разделы: общий, для задачек из учебника, для хтмл-цсс-жс. Ещё есть /b/.
Сразу оговорюсь, что работать это будет только при шатании макабы, в обычное время постинг будет закрыт. Я пока, правда, не разобрался как это сделать.
Team Settings -> Team Sign Up Mode -> expand -> Any email address from these domains:
без собаки стоит
Вот допустим делается сайт для заказчика, ясен хуй там должна быть админка и удобный интерфейс для редактирования текста в записях, добавление страниц, и страниц в менюху допустим, изменение лого, ну и тд.
Но так же допустим что нужен какой-то особый серверный функционал (вы ведь этим здесь занимаетесь?), который средствами cms нормально не делается.
Так вот, для управления контентом нужно все равно юзать какую-то cms, или это пишется самостоятельно? Сколько времени занимает?
Например на тот же wordpress портануть дизайн и js особых проблем не составляет, а с php-скриптами что делать? Как это всё взаимодействует с бд и всякой логикой cms? Нужно ебаться с плагинами?
Короче, к чему вы пришли в решении таких задач? Как такое делать правильно?
Не нашёл я, как можно разрешить вход всем.
Кароч, оставляйте, свои email`ы, я отправлю вам инвайт.
По вордпрессу надо документацию читать, там функции дописываются через пхпадмин. А так, если нужен особый функционал и дизин, то просто берешь фреймворки и сам пишет цмс, я так понимаю.
А зачем закрывать постинг в обычное время? Вдруг вакаба зашатается, а ты будешь дрыхнуть и люди не смогут постить.
Но в начале видео он говорит, что ООП часто пихают там, где не надо.
Но это же вовсе не значит, что его надо избегать.
> Какого вида информацию туда вносишь? Текст и картинки?
Всю, которая требуется. От текста и ссылок до видеороликов. Сейчас база почти 200 гб (с медиафайлами)
> Пробовал установить медиавики, работает просто пиздец как медленно. Ты кеширование php включал? С ним быстро работает?
Не знаю, у меня на обычном LAMP-стеке шустренько работает. Под виндой на опенсервере тоже нормально работало.
Бойанисто, но схоронил.
Просто есть вещи, которые с помощью ООП сделать в разу легче. Понятно, что если тебе надо написать прогу, которая, напирмер, выводит n-ое число фиббоначи, то тут ООП пихать, как пальба по воробьям из пушек. Это утрированно, конечно, но сути это не меняет.
>>533771
>>533793
https://slack-auto-for-php-pr.herokuapp.com/
Пробуйте получить инвайт тут. Сами.
>>531771
В общем, ты тут решил написать свой мини-фреймворк. Почему бы и нет, хотя мне все же он кажется великоватым для такой простой задачи. В следующей задаче на файлообменник ты познакомишься с микрофреймворком Slim (или Silex) и узнаешь, как выглядит фреймворк для крошечных проектов. Тогда ты сможешь сравнить его со своим.
Также, советую использовать в файлообменнике twig в качестве шаблонизатора, и (если не боишься) Doctrine 2 в качестве библиотеки data mapper. С рукописными дата мапперами ты уже знаком, нет наверно смысла второй раз делать аналогично.
> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L22
Я думаю, это тут необязательно писать, когда кому-нибудь понадобится PDO, он вызовет getPdo и тот создастся.
> https://github.com/blackberryJam/abiturients/blob/master/app/autoloader.php#L7
> $length = strlen($prefix);
> mb_substr($className, $length);
Функция strlen возвращает число байт, а mb_substr принимает число символов. Ты создаешь потенциальный баг здесь, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8
В данном случае лучше исплоьзовать mb-функции и там, и там.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/FrontController.php#L39
> str_replace($this->rootURI, "", $this->uri);
Это неправильный код, так как он заменяет rootURI не только в начале uri, а везде. Если rootUri = '/abc' а uri = '/abc/abcde/abc12' то мы получим на выходе 'de12'.
Лучше проверить, начинается ли uri с rootURI (mb_strpos) и если так, то отрезать от начала кусок нужной длины (mb_substr).
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/ControllerBase.php#L28
> redirectToPage404()
Но эта функция не делает редирект, почему такое название? Ты путаешь читателя.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L60
> $viewHelper = 'AbiturientsList\Util\ViewHelper';
Это, как я понимаю, для того, чтобы не писать полное имя класса в шаблоне? Тогда наверно проще было сделать в начале шаблона use, хотя можно оставить и как у тебя сделано.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/UserpageController.php#L17
> $service->saveTokenToCookie($token);
Мне кажется, сохранять токен в куки надо после успешного сохранения объекта в базу. Иначе при неправильном заполнении формы регистрации в базе абитуриента нет, а кука выставлена. Нехорошо, согласись?
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L4
> use Exception;
Можно просто писать \Exception в коде.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L30
> $string = '';
по моему это должно быть внутри, а не перед циклом
> https://github.com/blackberryJam/abiturients/blob/master/templates/paginator.html.php
Тут конечно получилось нагромождение кода. Не знаю точно, как это улучшить, но как минимум эти условия работающие с массивами:
> ($paginationSet[0]['page'] > 1)
стоило бы заменить на обращение к объекту-пагинатору: if ($paginator->showFirstPage()):
Впрочем, это не обязательно исправлять.
Алсо, тут:
> <li><a href="#">...</a></li>
Нужно было тег <a> вообще не писать.
В форме ты не использовал тип email для поля с адресом почты, почему? Получил бы от браузера валидацию этого поля. Перечитай-ка раздел про клиентскую валидацию тут: https://github.com/codedokode/pasta/blob/master/student-list.md#Клиентская-валидация
В общем, твое решение производит хорошее впечатление. Советую переходить к задаче про файлообменник.
>>531771
В общем, ты тут решил написать свой мини-фреймворк. Почему бы и нет, хотя мне все же он кажется великоватым для такой простой задачи. В следующей задаче на файлообменник ты познакомишься с микрофреймворком Slim (или Silex) и узнаешь, как выглядит фреймворк для крошечных проектов. Тогда ты сможешь сравнить его со своим.
Также, советую использовать в файлообменнике twig в качестве шаблонизатора, и (если не боишься) Doctrine 2 в качестве библиотеки data mapper. С рукописными дата мапперами ты уже знаком, нет наверно смысла второй раз делать аналогично.
> https://github.com/blackberryJam/abiturients/blob/master/app/bootstrap.php#L22
Я думаю, это тут необязательно писать, когда кому-нибудь понадобится PDO, он вызовет getPdo и тот создастся.
> https://github.com/blackberryJam/abiturients/blob/master/app/autoloader.php#L7
> $length = strlen($prefix);
> mb_substr($className, $length);
Функция strlen возвращает число байт, а mb_substr принимает число символов. Ты создаешь потенциальный баг здесь, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8
В данном случае лучше исплоьзовать mb-функции и там, и там.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/FrontController.php#L39
> str_replace($this->rootURI, "", $this->uri);
Это неправильный код, так как он заменяет rootURI не только в начале uri, а везде. Если rootUri = '/abc' а uri = '/abc/abcde/abc12' то мы получим на выходе 'de12'.
Лучше проверить, начинается ли uri с rootURI (mb_strpos) и если так, то отрезать от начала кусок нужной длины (mb_substr).
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/ControllerBase.php#L28
> redirectToPage404()
Но эта функция не делает редирект, почему такое название? Ты путаешь читателя.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/MainPageController.php#L60
> $viewHelper = 'AbiturientsList\Util\ViewHelper';
Это, как я понимаю, для того, чтобы не писать полное имя класса в шаблоне? Тогда наверно проще было сделать в начале шаблона use, хотя можно оставить и как у тебя сделано.
> https://github.com/blackberryJam/abiturients/blob/master/app/Controller/UserpageController.php#L17
> $service->saveTokenToCookie($token);
Мне кажется, сохранять токен в куки надо после успешного сохранения объекта в базу. Иначе при неправильном заполнении формы регистрации в базе абитуриента нет, а кука выставлена. Нехорошо, согласись?
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L4
> use Exception;
Можно просто писать \Exception в коде.
> https://github.com/blackberryJam/abiturients/blob/master/app/Service/AbiturientService.php#L30
> $string = '';
по моему это должно быть внутри, а не перед циклом
> https://github.com/blackberryJam/abiturients/blob/master/templates/paginator.html.php
Тут конечно получилось нагромождение кода. Не знаю точно, как это улучшить, но как минимум эти условия работающие с массивами:
> ($paginationSet[0]['page'] > 1)
стоило бы заменить на обращение к объекту-пагинатору: if ($paginator->showFirstPage()):
Впрочем, это не обязательно исправлять.
Алсо, тут:
> <li><a href="#">...</a></li>
Нужно было тег <a> вообще не писать.
В форме ты не использовал тип email для поля с адресом почты, почему? Получил бы от браузера валидацию этого поля. Перечитай-ка раздел про клиентскую валидацию тут: https://github.com/codedokode/pasta/blob/master/student-list.md#Клиентская-валидация
В общем, твое решение производит хорошее впечатление. Советую переходить к задаче про файлообменник.
Я читал.
Я начал читать учебник по PHP (первая ссылка). Вот как дойду до фреймворков, так сразу присоединюсь.
У меня ничего не потребовали. На пробный срок так берут.
Почему у меня на некоторых картинках выскакивает ошибка при инициализации функции exif_read_data???
Кстати, не смог подключить твиг в слим. не знаю почему. Использовал композер.
еще хтмл начал учить, но это я так, просто написал
>сложно ли мне будет вкатиться к вам уже имея какие-то знания в программировании?
Какой-то глупый вопрос.
не получается
из каких таких? у меня даже никакой идеи для сайта нет, буду на остальных фреймворках после файлообменника бложики делать.
Спасибо за ответы.
>Doctrine 2 в качестве библиотеки data mapper
Это значит, что брать DBAL, а не ORM? Чем они, кстати, отличаются? Я так и не понял.
Фреймворком решил взять Silex.
>Советую переходить к задаче про файлообменник.
Я уже почти начал. С JS, DOM, AJAX только разберусь.
Сложно. Предыдущие знания мешать будут, новые не влезут. Нужно сначала старые стереть.
Тебе дали студентов, фалообменник, тестхаб. Зачем ещё что-то придумывать?
>>531771
Ты там сделал проверку на наличие папки в .htaccess. Я думаю, список допустимых разрешений лучше прописать где-то в коде в виде массива, а папки создавать по мере необходимости. Так все же надежнее получается.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L7
> switch ($extension[2]) {
> case 1:
Там вообще-то читаемые константы есть вроде IMAGETYPE_JPEG, используй их вместо цифр. Константы в мануале: http://php.net/manual/ru/image.constants.php
> if (preg_match("/jpg|png|gif/", $fname)) {
Это не проверяет что расширение у файла gif, ведь эти буквы могут быть в любом месте. Также, твой способ проверки уникальности файла очень неэффективен, так как он читает содержимое всех файлов (которых там могут быть мегабайты или даже гигабайты) в память и это медленно. Для проверки уникальности от содержимого файлов при загрузке вычисляют хеш (например md5) и сохраняют этот хеш в базу или список, и проверяют по ней.
В твоем случае наверно проще разрешить загружать одинаковые картинки. Ну или как-то сделать список хешей.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L39
> } while (file_exists("images/$fileName"));
Из-за ошибки этот код может и зациклиться. Лучше использовать цикл for с ограничением на число попыток.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L46
> echo "Файл загружен";
Ты выводишь текст до вывода метатега <meta charset> и браузер может воспринять его кодировку неправильно. Да и как можно выводить текст до тега html? Надо вместо этого передавать переменную и в шаблоне templates/upload.html в зависимости от нее вывоить текст в нужном месте.
> https://github.com/MindiMakridi/RESTFUL/blob/master/createThumb.php#L4
> new Thumbnail($_SERVER['REQUEST_URI']);
А почему URL передается в конструктор? Один объект можно использовать только для генерации одной превьюшки? Ну ладно, хотя логично назвать класс ThumbnailCreator (будем считать это ошибкой составителя задачи).
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L14
> $this->thumbPath = mb_substr($url, 1);
Это как-то неправильно. Отрезать слеш лучше через ltrim().
> $this->url = explode("/", mb_substr($url, 12));
Непонятно откуда взялось число 12. Тут конечно его не должно быть. Ну и может тут лучше использоват регулярное выражение?
Также, ты не забыл что в URL могут быть query параметры, например /thumbnail/img.png?a=1&b=2. Их можно удалить функцией parse_url().
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L24
> $fileName = $this->url[2];
Непонятно что такое url[2]. Лучше перенести это в конструктор и парсить URL регуляркой.
Кстати, если у тебя есть метод getFilename(), не очень понятно зачем хранить это значение в поле filename.
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L43
> $size = getimagesize("images/$this->fileName");
Если файл не является картинкой, $size будет содержать false, ты это не провеяешь.
> case 1: return "gif";
Используй константу вместо числа
У тебя что-то много public функций. Это неправильно, надо стараться ставить максимально ограниченный доступ, иначе тому кто читает твой код будет труднее, так как ему придется просмотреть все функции (а так он бы смотрел только часть).
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L92
> $newWidth = $this->$thumbWidth;
Лишний знак доллара. Также, по моему тут неправильная формула вычисления ширины и высоты. Ну и вообще как-то многовато формул, наверняка это можно записать короче.
Также, ты не должен увеличивать картинки ни при каких обстоятелствах. Тут это условие не соблюдается.
Я думаю, лучше сначала вычислить параметр $scale, показывающий, во сколько раз мы уменьшаем картинку (тут же можно проверить чтобы он был больше или равен 1), а потом уже с его помощью вычислять новые размеры и $x, $y.
Также, у тебя там встречается 2 раза imagecreatetruecolor. Я думаю, картинку можно создавать только один раз. А обрезку реализовать указанием координат и размера вырезаемой из исходной картинки области. Получается, мы должны рассчитать 6 параметров:
- размер картинки-превьюшки (ее пропорции совпадают с исходной для метода scale)
- x, y, w, h для вырезаемой области из исходной картинки (совпадают с исходной картинкой для метода scale)
При этом x, y вычисляется из остальных 4 параметров.
> header('Content-Type: image/jpg');
MIME-тип возвращает функция getimagesize в одном из элементов массива, а также его можно получить функцией http://php.net/manual/ru/function.image-type-to-mime-type.php
> if(!preg_match("/scale|crop/", $mode)){
Нету ^$ и флага u на всякий случай.
>>531771
Ты там сделал проверку на наличие папки в .htaccess. Я думаю, список допустимых разрешений лучше прописать где-то в коде в виде массива, а папки создавать по мере необходимости. Так все же надежнее получается.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L7
> switch ($extension[2]) {
> case 1:
Там вообще-то читаемые константы есть вроде IMAGETYPE_JPEG, используй их вместо цифр. Константы в мануале: http://php.net/manual/ru/image.constants.php
> if (preg_match("/jpg|png|gif/", $fname)) {
Это не проверяет что расширение у файла gif, ведь эти буквы могут быть в любом месте. Также, твой способ проверки уникальности файла очень неэффективен, так как он читает содержимое всех файлов (которых там могут быть мегабайты или даже гигабайты) в память и это медленно. Для проверки уникальности от содержимого файлов при загрузке вычисляют хеш (например md5) и сохраняют этот хеш в базу или список, и проверяют по ней.
В твоем случае наверно проще разрешить загружать одинаковые картинки. Ну или как-то сделать список хешей.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L39
> } while (file_exists("images/$fileName"));
Из-за ошибки этот код может и зациклиться. Лучше использовать цикл for с ограничением на число попыток.
> https://github.com/MindiMakridi/RESTFUL/blob/master/upload.php#L46
> echo "Файл загружен";
Ты выводишь текст до вывода метатега <meta charset> и браузер может воспринять его кодировку неправильно. Да и как можно выводить текст до тега html? Надо вместо этого передавать переменную и в шаблоне templates/upload.html в зависимости от нее вывоить текст в нужном месте.
> https://github.com/MindiMakridi/RESTFUL/blob/master/createThumb.php#L4
> new Thumbnail($_SERVER['REQUEST_URI']);
А почему URL передается в конструктор? Один объект можно использовать только для генерации одной превьюшки? Ну ладно, хотя логично назвать класс ThumbnailCreator (будем считать это ошибкой составителя задачи).
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L14
> $this->thumbPath = mb_substr($url, 1);
Это как-то неправильно. Отрезать слеш лучше через ltrim().
> $this->url = explode("/", mb_substr($url, 12));
Непонятно откуда взялось число 12. Тут конечно его не должно быть. Ну и может тут лучше использоват регулярное выражение?
Также, ты не забыл что в URL могут быть query параметры, например /thumbnail/img.png?a=1&b=2. Их можно удалить функцией parse_url().
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L24
> $fileName = $this->url[2];
Непонятно что такое url[2]. Лучше перенести это в конструктор и парсить URL регуляркой.
Кстати, если у тебя есть метод getFilename(), не очень понятно зачем хранить это значение в поле filename.
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L43
> $size = getimagesize("images/$this->fileName");
Если файл не является картинкой, $size будет содержать false, ты это не провеяешь.
> case 1: return "gif";
Используй константу вместо числа
У тебя что-то много public функций. Это неправильно, надо стараться ставить максимально ограниченный доступ, иначе тому кто читает твой код будет труднее, так как ему придется просмотреть все функции (а так он бы смотрел только часть).
> https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L92
> $newWidth = $this->$thumbWidth;
Лишний знак доллара. Также, по моему тут неправильная формула вычисления ширины и высоты. Ну и вообще как-то многовато формул, наверняка это можно записать короче.
Также, ты не должен увеличивать картинки ни при каких обстоятелствах. Тут это условие не соблюдается.
Я думаю, лучше сначала вычислить параметр $scale, показывающий, во сколько раз мы уменьшаем картинку (тут же можно проверить чтобы он был больше или равен 1), а потом уже с его помощью вычислять новые размеры и $x, $y.
Также, у тебя там встречается 2 раза imagecreatetruecolor. Я думаю, картинку можно создавать только один раз. А обрезку реализовать указанием координат и размера вырезаемой из исходной картинки области. Получается, мы должны рассчитать 6 параметров:
- размер картинки-превьюшки (ее пропорции совпадают с исходной для метода scale)
- x, y, w, h для вырезаемой области из исходной картинки (совпадают с исходной картинкой для метода scale)
При этом x, y вычисляется из остальных 4 параметров.
> header('Content-Type: image/jpg');
MIME-тип возвращает функция getimagesize в одном из элементов массива, а также его можно получить функцией http://php.net/manual/ru/function.image-type-to-mime-type.php
> if(!preg_match("/scale|crop/", $mode)){
Нету ^$ и флага u на всякий случай.
Исправил что мог.
Добавил древовидные комментарии, капчу.
https://github.com/nsdvw/file-sharing
Проверь последний разок, только не сильно усердствуй, потому что мне если честно уже надоело ковыряться с этим файлообменником, пора идти дальше.
Из явных косяков, меня беспокоит проблема передачи переменных в шаблон. В каждом роуте используются разные шаблоны, поэтому не выход передавать их через слимовский appendData. В результате скапливаются десятки монотонных строк кода вида
$firstVar = 'value1';
$secondVar = 'value2';
....
$fifteenthVar = 'value15';
$app->display('view', array('firstVar'=>$firstVar, ........., 'fifteenthVar'=>$fifteenthVar,));
Еще момент. Если я правильно понял алгоритм для работы с формами, то он выглядит так: если форма прошла валидацию, редиректим на гет. Если не прошла, то тут же без редиректа выводим форму с сообщением об ошибке и введенными от пользователя значениями полей.
Но в таком случае опять получается копипаст из маршрута, который отвечает за гет(смотри например у меня '/view/:id') в посте.
https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L42
>Тут нет никакой проверки что такие поля есть в объекте. Это плохо.
Как проверить, что поля есть в объекте? isset не помогает.
Базу для testhub >>532525 одобряешь или нет?
Норм всё будет. Особенно с этим учебником в ОП-посте, так вообще. Там всё понятно очень. Есть, конечно, пара вопросов, которые не освещаются в начале, чтобы не забивать мозг, но если интересно, можно же и самому найти ответы.
Доктрина 2 это ORM (ORM это штука сохраняющая и заружающая объекты из базы — Object to Relational database Mapper) реализующий паттерн Data Mapper который ты наверно уже знаешь. Только с ней тебе не придется писать руками класс data mapper — она предоставляет готовый. Ну и там еще десятки фич, вроде поддержки отношений между сущностями, ленивой загрузки и тд., это очень мощная библиотека.
> С JS, DOM, AJAX только разберусь.
Начинать можно и без них, если что.
echo "Всего {$number} элементов";
echo "Всего $number элементов";
Какой вариант правильнее? Интерпретатор ни на тот ни на другой не ругается.
>А почему URL передается в конструктор?
А как лучше? Просто все необходимые классу данные содержатся в URL, я и подумал, что передавать его конструктору будет хорошей идеей.
>Также, ты не должен увеличивать картинки ни при каких обстоятелствах. Тут это условие не соблюдается.
А как же https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L74 ?
>>531771
> https://github.com/never3ver/vector/blob/master/index.php#L59
Вместо копипасты можно было сделать массив из 4 объектов и обходить его циклом foreach.
> <?php echo
Короче писать <?=. Алсо на будущее, прочти-ка урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
> https://github.com/never3ver/vector/blob/master/service.php
Можно было сделать класс Компания и там методы вычисления всего этого.
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L24
> $temp = $this->salary;
$temp ничего не значит, лучше использовать $salary
> https://github.com/never3ver/vector/blob/master/autoload.php
Где-то я уже видел этот код. Чтобы чуть его поменять, замени функцию на анонимную. Что это: http://php.net/manual/ru/functions.anonymous.php
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L10
> protected $salary;
У тебя предполагается что это свойство будет переопределено классом-потомком. Но как об этом догадаться глядя на базовый класс? У тебя же даже нет комментария. И где гарантия что при наследовании его не забудут определить? Для решения этой проблемы надо заменить это свойство на абстрактный метод. Абстрактный метод это метод который обязаны реализовать конкретные (не абстрактные) классы и PHP не разрешит забыть его определить.
Также, сам класс Employee надо пометить абстрактным (абстрактный класс это класс объекты которого нельзя создавать, но от которого можно наследоваться). Мануал: http://php.net/manual/ru/language.oop5.abstract.php
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L57
> public function addEmployee($employee)
Тут нужен тайп-хинт: http://php.net/manual/ru/language.oop5.typehinting.php Это и делает код читабельнее и не дает передать что-то левое в функцию. Ставь их везде, где можно.
>https://github.com/never3ver/vector/blob/master/Classes/Department.php#L47
Конструктор традиционно приянто писать в начале класса.
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L18
> foreach ($this->employees as $value) {
Этот код я видел уже много раз, скучно. Давай-ка для разнообразия ты посчитаешь результат через array_reduce() и анонимную функцию.
Ну и еще тебе, как особо сообразительному, даю вторую часть задачи (на самом деле я всем ее даю):
-------
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
>>531771
> https://github.com/never3ver/vector/blob/master/index.php#L59
Вместо копипасты можно было сделать массив из 4 объектов и обходить его циклом foreach.
> <?php echo
Короче писать <?=. Алсо на будущее, прочти-ка урок про XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
> https://github.com/never3ver/vector/blob/master/service.php
Можно было сделать класс Компания и там методы вычисления всего этого.
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L24
> $temp = $this->salary;
$temp ничего не значит, лучше использовать $salary
> https://github.com/never3ver/vector/blob/master/autoload.php
Где-то я уже видел этот код. Чтобы чуть его поменять, замени функцию на анонимную. Что это: http://php.net/manual/ru/functions.anonymous.php
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L10
> protected $salary;
У тебя предполагается что это свойство будет переопределено классом-потомком. Но как об этом догадаться глядя на базовый класс? У тебя же даже нет комментария. И где гарантия что при наследовании его не забудут определить? Для решения этой проблемы надо заменить это свойство на абстрактный метод. Абстрактный метод это метод который обязаны реализовать конкретные (не абстрактные) классы и PHP не разрешит забыть его определить.
Также, сам класс Employee надо пометить абстрактным (абстрактный класс это класс объекты которого нельзя создавать, но от которого можно наследоваться). Мануал: http://php.net/manual/ru/language.oop5.abstract.php
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L57
> public function addEmployee($employee)
Тут нужен тайп-хинт: http://php.net/manual/ru/language.oop5.typehinting.php Это и делает код читабельнее и не дает передать что-то левое в функцию. Ставь их везде, где можно.
>https://github.com/never3ver/vector/blob/master/Classes/Department.php#L47
Конструктор традиционно приянто писать в начале класса.
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L18
> foreach ($this->employees as $value) {
Этот код я видел уже много раз, скучно. Давай-ка для разнообразия ты посчитаешь результат через array_reduce() и анонимную функцию.
Ну и еще тебе, как особо сообразительному, даю вторую часть задачи (на самом деле я всем ее даю):
-------
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
>А обрезку реализовать указанием координат и размера вырезаемой из исходной картинки области. Получается, мы должны рассчитать 6 параметров:
>
>- размер картинки-превьюшки (ее пропорции совпадают с исходной для метода scale)
>- x, y, w, h для вырезаемой области из исходной картинки (совпадают с исходной картинкой для метода scale)
Джисус факин крист, я просто поставил style="max-width:400px". Нахуй так ебаться вообще?
И правда. Ты победил.
Вот я вообще не так обменник делаю. Смешиваю функции во вьюз. Что же мне все таки подключать твиг и выносить все функции в классы, а потом вызывать вот так -> ??
>Есть же божественный телеграм.
Я им не пользовался. И у слака возможности, вроде как, шире. Этакая смесь irc-чата и борды.
Он же поцреот и не пользуется русафопскими сайтиками.
Ну и зачем вы перекатываетесь с одного чата в другой? Создайте кто-нибудь голосовой чат, чтобы пользоваться им всегда, а не только во время падения двача. Как я уже говорил зелло рация - неплохой вариант. Ну или аналоги.
>Потому что я сделал обменник не так как ты.
Чтобы сделать файлообменник не так как я - достаточно его сделать. Я не знаю, где ты там нашел файлообменник.
Не понимаю, как вы в светлых темах кодите?
Мне нужна тёмная кулхацкерская - иначе скучно. И читается код легче на тёмной.
Если хочешь работать с западными заказчиками, может еще и вебка понадобиться. Так что лучше тренируйся где-нибудь, не знаю, найди голосовой чат в /b и поговори со школьниками.
Да и что бояться, в самом худшем случае ты просто заказ не получишь.
>>532323
Обычно это указано в объявлении
>>532342
В хорошем случае пишу около 100 строк в час (в случае HTML кода получается больше). Поскольку больше определенного числа ты писать не сможешь, надо стараться одной строкой сделать как можно больше. К примеру, использовать библиотеки, а не изобретать их заново.
>>532358
Задание 11
> var newList = sortCities(list);
Я бы не советовал что-то возвращать так как метод sort сортирует существующий массив и не создает новый. Таким образом newList это не отдельный массив, а ссылка на list. Почитай там в пасте с задачами в самом начале это разжевывается, про копирование и ссылки.
В остальном, верно.
Задание 12
А ты решал задачу на PHP про Вектор?
> try/catch
Конструктор не должен вызывать alert. Может быть пользователь твоего класса хочет вывести сообщение другим способом. надо просто выбрасывать искючение, и не ловить его.
Более того, бессмысленно писать throw и catch в одноц функции так как в этом случае проще написать if.
> this.price = 50;
Почему цена сделана в виде свойства? Тебе же ее придется пересчитывать при любых изменениях. Мне кажется, проще сделать метод который вычисляет актуальную цену, и нигде ее не хранить.
> switch (this.size) {
Нужен deafult c выбрасыванием исключения, а то сейчас у тебя ошибка молча игнориурется
> Hamburger.prototype.addSpice
На каждый вид добавки делать метод нерационально, лучше сделать один метод для добавления добавки, а типы добавок обозначить константами вроде Hamburger.SEASONING_MAYO
> Object.defineProperty(Hamburger.prototype, "sizesAllowed", {
> writable: false
Вообще, writable значит что туда нельзя записать ссылку на другой массив или объект. Но сам массив менять по-прежнему можно (например методом push). Неизменности можно добиться если сделать метод, возвращающий массив.
Размеры надо обозначить константами.
> function HamburgerWithCheese() {
Я думаю, не стоит тут делать наследование, так как особой разницы между разными гамбургерами нет (ну то есть методы у них у всех одинаковые), просто лучше передавать в конструктор тип начинки. Типы обозначить константами.
> valuesAllowed.forEach(function(item, i, valuesAllowed) {
Есть метод indexOf, он доступен в версии JS ES5, как и forEach.
Если хочешь работать с западными заказчиками, может еще и вебка понадобиться. Так что лучше тренируйся где-нибудь, не знаю, найди голосовой чат в /b и поговори со школьниками.
Да и что бояться, в самом худшем случае ты просто заказ не получишь.
>>532323
Обычно это указано в объявлении
>>532342
В хорошем случае пишу около 100 строк в час (в случае HTML кода получается больше). Поскольку больше определенного числа ты писать не сможешь, надо стараться одной строкой сделать как можно больше. К примеру, использовать библиотеки, а не изобретать их заново.
>>532358
Задание 11
> var newList = sortCities(list);
Я бы не советовал что-то возвращать так как метод sort сортирует существующий массив и не создает новый. Таким образом newList это не отдельный массив, а ссылка на list. Почитай там в пасте с задачами в самом начале это разжевывается, про копирование и ссылки.
В остальном, верно.
Задание 12
А ты решал задачу на PHP про Вектор?
> try/catch
Конструктор не должен вызывать alert. Может быть пользователь твоего класса хочет вывести сообщение другим способом. надо просто выбрасывать искючение, и не ловить его.
Более того, бессмысленно писать throw и catch в одноц функции так как в этом случае проще написать if.
> this.price = 50;
Почему цена сделана в виде свойства? Тебе же ее придется пересчитывать при любых изменениях. Мне кажется, проще сделать метод который вычисляет актуальную цену, и нигде ее не хранить.
> switch (this.size) {
Нужен deafult c выбрасыванием исключения, а то сейчас у тебя ошибка молча игнориурется
> Hamburger.prototype.addSpice
На каждый вид добавки делать метод нерационально, лучше сделать один метод для добавления добавки, а типы добавок обозначить константами вроде Hamburger.SEASONING_MAYO
> Object.defineProperty(Hamburger.prototype, "sizesAllowed", {
> writable: false
Вообще, writable значит что туда нельзя записать ссылку на другой массив или объект. Но сам массив менять по-прежнему можно (например методом push). Неизменности можно добиться если сделать метод, возвращающий массив.
Размеры надо обозначить константами.
> function HamburgerWithCheese() {
Я думаю, не стоит тут делать наследование, так как особой разницы между разными гамбургерами нет (ну то есть методы у них у всех одинаковые), просто лучше передавать в конструктор тип начинки. Типы обозначить константами.
> valuesAllowed.forEach(function(item, i, valuesAllowed) {
Есть метод indexOf, он доступен в версии JS ES5, как и forEach.
Трафик лишний, качество страдает.
>>533889
Ну делай, потом мы скажем что не так.
>>533892
Покажи на проверку или покажит кусок кода, посмотрим. Так не понятно.
>>533896
С встроенным деаноном?
>>533900
Вообще да, ужасно, ты смешиваешь логику получения данных и логику вывода. Иди почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html
Если такому коду учат в учебнике, подумай о поиске более хорошего.
>>533902
Вот, это надо анону который стесняется с заказчиками разговаривать, пусть практикуется там.
>>533904
переключаться между темным и севтлым неудобно для глаз.
Трафик лишний, качество страдает.
>>533889
Ну делай, потом мы скажем что не так.
>>533892
Покажи на проверку или покажит кусок кода, посмотрим. Так не понятно.
>>533896
С встроенным деаноном?
>>533900
Вообще да, ужасно, ты смешиваешь логику получения данных и логику вывода. Иди почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html
Если такому коду учат в учебнике, подумай о поиске более хорошего.
>>533902
Вот, это надо анону который стесняется с заказчиками разговаривать, пусть практикуется там.
>>533904
переключаться между темным и севтлым неудобно для глаз.
>>533902
>Вот, это надо анону который стесняется с заказчиками разговаривать, пусть практикуется там.
Поддерживаю. Сам сначала боялся даже на каналах с небольшим количеством человек разговаривать. А сейчас могу спокойно на любой зайти и нормально пообщаться. При чем изменился в довольно короткие сроки. Да и тем более там никакого деанона, можно регаться на фейкомыла. 2 года там уже сижу. Очень советую.
Там могут и ООП с паттернами спрашивать и фреймворк уровня Симфони 2 или Юи 2. Зависит от компании. Поищи вакансии и посмотри, погугли про то как там собеседования проводят.
>>532465
Я не знаю какие ты видеуроки смотришь потому прокомемнтировать не могу, но в любом случае одного перепечатывания с экрана недостаточно, надо понимать что ты делаешь, может читать статьи или мануалы.
>>532474
Пикрелейтед кстати актуален и сейчас, только по моему вышла вторая версия phpDocumentor.
>>533055
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 59139, а около 61270.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда он маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>Задачи по JS
Ок, гамбургеры переделаю. Задачу про Вектор решал.
>Почему цена сделана в виде свойства? Тебе же ее придется пересчитывать при любых изменениях. Мне кажется, проще сделать метод который вычисляет актуальную цену, и нигде ее не хранить.
До меня это дошло после того, как решение было запощщено.
Не, ну ты зайди хоть зацени, какая удобная штука этот слак.
Ну и насчет зелло: его вроде под ubuntu нет.
Есть, мануал открой.
>>533270
У нас же анонимный тред.
>>533279
Чтобы создать переменную, достаточно что-то в нее записать например
$a = 0;
$b = '';
>>533459
В ENUM нельзя использовать числа так как MySQL понимает их как номера опций, а не значения. Надо либо использовать yes/no либо TINYINT(1) NOT NULL .
> И тогда, если он ставит галку в чекбоксе, то в поле передается значение 1, в ином случае поле будет иметь значение ноль?
Что передает чекбокс от базы вообще никак не зависит. Запрос формирует браузер, так: если галочка поставлена то в POST добавляется элемент с ее именем (указанным в name) и значением 'on' (или другим не-пустым), а если нет то не добавляется.
>>533461
Можно попробовать погуглить мнение других людей. Также, однажды ФБР проводило операцию по раскрытию пользователей тора, оно захватило сайт в .onion и добавила туда яваскрипт, экплуатирующий уязвимость в фаерфоксе. также, в Китае тор блокируют. Видимо это говорит о том что напрямик взломать протокол не получается.
> проект начинался в армии США.
может быть для поддержки разведчиков в других странах. Им нужны обычные пользователи чтобы в их трафике прятать свой.
>>533462
И даже если вылогинился то в куках может что-то оставаться. например в гугле после разлогинивания твой email все равно выводится в форме логина, то есть он запоминает его.
> просто могут смотреть твой ящик, привязку вебкошелька, да вообще что угодно
Если ты активно пользуешься сетью, то да, данных можно выудить много. Билеты с паспортными данными, покупки в магазинах с адресом, интернет-банк и тд. И видеть их может любое браузерное расширение с соответствующими правами.
Есть, мануал открой.
>>533270
У нас же анонимный тред.
>>533279
Чтобы создать переменную, достаточно что-то в нее записать например
$a = 0;
$b = '';
>>533459
В ENUM нельзя использовать числа так как MySQL понимает их как номера опций, а не значения. Надо либо использовать yes/no либо TINYINT(1) NOT NULL .
> И тогда, если он ставит галку в чекбоксе, то в поле передается значение 1, в ином случае поле будет иметь значение ноль?
Что передает чекбокс от базы вообще никак не зависит. Запрос формирует браузер, так: если галочка поставлена то в POST добавляется элемент с ее именем (указанным в name) и значением 'on' (или другим не-пустым), а если нет то не добавляется.
>>533461
Можно попробовать погуглить мнение других людей. Также, однажды ФБР проводило операцию по раскрытию пользователей тора, оно захватило сайт в .onion и добавила туда яваскрипт, экплуатирующий уязвимость в фаерфоксе. также, в Китае тор блокируют. Видимо это говорит о том что напрямик взломать протокол не получается.
> проект начинался в армии США.
может быть для поддержки разведчиков в других странах. Им нужны обычные пользователи чтобы в их трафике прятать свой.
>>533462
И даже если вылогинился то в куках может что-то оставаться. например в гугле после разлогинивания твой email все равно выводится в форме логина, то есть он запоминает его.
> просто могут смотреть твой ящик, привязку вебкошелька, да вообще что угодно
Если ты активно пользуешься сетью, то да, данных можно выудить много. Билеты с паспортными данными, покупки в магазинах с адресом, интернет-банк и тд. И видеть их может любое браузерное расширение с соответствующими правами.
>Ну и насчет зелло: его вроде под ubuntu нет.
Я с пк и не сижу в нем, с мобильного намного удобнее. На ведро, IOS и ВФ он точно есть.
Кстати, сегодня читал, в Китае вообще фаерволл жестко работает: блокируется доступ по SSH и многие VPN, они их распознают по косвенным признакам: https://news.ycombinator.com/item?id=10101469
А к разработчикам средств обхода приходит полиция и просит прекратить безобразничать.
Не наше ли это будущее?
>Не наше ли это будущее?
Не думаю. В правительстве, всё же, немало адекватных людей-патриотов.
>Не наше ли это будущее?
Наше, поэтому надо сейчас придумывать средства обхода и анонимизации, чтобы потом до нас просто не дошли.
>поэтому надо сейчас придумывать средства обхода и анонимизации, чтобы потом до нас просто не дошли.
Не несите чепухи. Сейчас надо придумывать средства съеба отсюда.
Атя-тя. А я, между прочим, серьёзно. Например, далеко не все гениальные идеи депутатов ГД получают одобрение в верхней палате.
Если ты не школьник и активно пользуешься сетью, то например при покупке билетов на поезд указываешь паспотные данные, для магазинов указываешь адрес, пользуешься интернет-банком и тд. Да и даже без этого, если просто логгировать твои поисковые запросы можно много узнать.
Плюс, всякие кошельки тоже все хотят идентификации, да и закон требует при наличии больше 15 000 р. Кто и что потом делает с этими данными, неизвестно.
>>533501
Для рассылки лучше взять хорош библиотеку типа swiftmailer а не писать с нуля.
Проблема не в том чтобы разослать а чтобы письма не шли в спам, на хабре есть статьи как этого избежать.
Если вы расылаете письма без согласия пользователя то скоре всего туда попадете.
Также есть сервисы вроде mailchimp которые могут сделать рассылку.
>>533506
Да, так и сделать.
Также, рекомендуется сделать заголовок List-Unsubscribe для того чтобы пользователь мог отписаться из почтового сервиса.
>>533538
>Не подходит еще и потому, что я нашел сайт, который по картинке определяет шрифт и тот, который используется в макете платный и стоит 79 долларов.
Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.
2 начертания это недостаточно. Там есть курсивный текст (в заголовке), также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint). Опять же это проще увидеть в фотошопе кликнув по тексту.
У тебя в макете невооруженным глазом видно что вес шрифта не такой во многих местах.
Я глянул, там lato: https://www.google.com/fonts/specimen/Lato
Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.
Оф. сайт шрифта найди сам.
> При том, что можно еще уменьшить, удалив ненужные форматы.
Это ничего не даст так как браузер и не грузит все форматы, а только нужный ему.
> В общем, ОП, я не стал ждать когда дашь свой комментарий по поводу тестового сайта со шрифтами.
Я же написал вроде или ты там что-то еще поменял?
> И да, в IE теперь при наведении нормально углы срезаются
Это наверно из-за того что там паддинг убран.
Если ты не школьник и активно пользуешься сетью, то например при покупке билетов на поезд указываешь паспотные данные, для магазинов указываешь адрес, пользуешься интернет-банком и тд. Да и даже без этого, если просто логгировать твои поисковые запросы можно много узнать.
Плюс, всякие кошельки тоже все хотят идентификации, да и закон требует при наличии больше 15 000 р. Кто и что потом делает с этими данными, неизвестно.
>>533501
Для рассылки лучше взять хорош библиотеку типа swiftmailer а не писать с нуля.
Проблема не в том чтобы разослать а чтобы письма не шли в спам, на хабре есть статьи как этого избежать.
Если вы расылаете письма без согласия пользователя то скоре всего туда попадете.
Также есть сервисы вроде mailchimp которые могут сделать рассылку.
>>533506
Да, так и сделать.
Также, рекомендуется сделать заголовок List-Unsubscribe для того чтобы пользователь мог отписаться из почтового сервиса.
>>533538
>Не подходит еще и потому, что я нашел сайт, который по картинке определяет шрифт и тот, который используется в макете платный и стоит 79 долларов.
Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.
2 начертания это недостаточно. Там есть курсивный текст (в заголовке), также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint). Опять же это проще увидеть в фотошопе кликнув по тексту.
У тебя в макете невооруженным глазом видно что вес шрифта не такой во многих местах.
Я глянул, там lato: https://www.google.com/fonts/specimen/Lato
Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.
Оф. сайт шрифта найди сам.
> При том, что можно еще уменьшить, удалив ненужные форматы.
Это ничего не даст так как браузер и не грузит все форматы, а только нужный ему.
> В общем, ОП, я не стал ждать когда дашь свой комментарий по поводу тестового сайта со шрифтами.
Я же написал вроде или ты там что-то еще поменял?
> И да, в IE теперь при наведении нормально углы срезаются
Это наверно из-за того что там паддинг убран.
>Кто и что потом делает с этими данными, неизвестно.
Не знаю как там кошельки, но мне рассказывали давно-давно про какого-то КГБшника престарелого, которому когда показали соц. сети, он заплакал, потому, что раньше эту инфу нужно было буквально по крупицам собирать, а теперь люди в интернете сами всю информацию пишут.
Тогда никак. если администратор запрещает это. Тогда можно сделать опцию в конфиге и ставить ее вручную, или проверять доступна ли функция через function_exists() если это срабоатет.
>>533569
Ой-ой, лжеоп в треде.
>>533581
Организуйте.
>>533610
Если что у ОПа еще почта есть.
>>533670
Чем? Средствами PHP? Или bash?
Если bash то так:
cat /etc/passwd | nc -vv host port
также есть более мощная команда socat
если средствами PHP то proc_open + функии работы с сокетами, но там надо смотреть чтобы ничего не зависло и все правильно обрабатывать.
Тогда никак. если администратор запрещает это. Тогда можно сделать опцию в конфиге и ставить ее вручную, или проверять доступна ли функция через function_exists() если это срабоатет.
>>533569
Ой-ой, лжеоп в треде.
>>533581
Организуйте.
>>533610
Если что у ОПа еще почта есть.
>>533670
Чем? Средствами PHP? Или bash?
Если bash то так:
cat /etc/passwd | nc -vv host port
также есть более мощная команда socat
если средствами PHP то proc_open + функии работы с сокетами, но там надо смотреть чтобы ничего не зависло и все правильно обрабатывать.
Зощем так париться? Проще самуоубиваться, пока не переродишься швейцарцем/-кой.
Кстати с библиотекой типа Symfony Process это может быть проще. Она позволяет запустить команду и перехватывать ее вывод.
Если ты нихуя не делаешь, то где угодно у тебя ничего не будет. Смирись с этим.
В Австралии пособие по безработице $2000. Так было несколько лет назад.
Вы бы свою демагогию в другом треде обсасовали. Что, нельзя общаться на около программерские тематики?.
Извини, я был не прав.
>>533958
>>533954
>>533952
>>533951
>>533949
>>533946
>>533945
А для таких отвлечённых тем у нас в слаке есть канал random, наш личный аналог /b/.
Вы так за пару дней тред в бамплимит уведёте, а полезной информации в нём будет чуть больше. чем нисколько.
Инвайты: https://slack-auto-for-php-pr.herokuapp.com/
Философия какая-то. «декларативный» значит код, который определяет не как что-то сделать, а что должно получиться.
Ну например CSS код декларативный. Он говорит «элементы с классом .x должны иметь красный цвет». Сравни CSS код с аналогичным кодом на JS который в цикле обходит элементы и раскрашивает их.
>>533726
Посмотри какая там верстка. Например через Ctrl + U.
>>533751
Не всегда.
>>533740
Надо будет удалить еще старый код. Алгоритм выглядит верно, формула подсчета — не уверен. Ты уверен что ход на клетку с мышью на ней у тебя будет выгоднее чем ход на клетку где рядом 4 мыши?
> protected function goUpAndRight($eat = false){
Я думаю что нам не нужно 8 копипаст одной и той же функции. Что ты будешь делать для животного которое шахматным конем прыгает?
> private $location = ["x" => 0, "y" => 0];
А точно массив лучше чем 2 отдельных свойства?
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L10
Тут все свойства нужны? Лишних нет?
> public function getSeeAnimals()
> {
> return $this->seeAnimals;
Непонятно зачем делать отдельное свойство если можно сделать метод, берущий эти данные с карты. Например, у карты можно сделать метод возвращающий всех животных определенного типа.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L108
Это должен быть метод карты, а не метод животного. С какой стати размер карты это свойство кошки? Это свойство карты. разберись с лишними свойствами и методами.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L246
Тут тоже копипасты многовато
Философия какая-то. «декларативный» значит код, который определяет не как что-то сделать, а что должно получиться.
Ну например CSS код декларативный. Он говорит «элементы с классом .x должны иметь красный цвет». Сравни CSS код с аналогичным кодом на JS который в цикле обходит элементы и раскрашивает их.
>>533726
Посмотри какая там верстка. Например через Ctrl + U.
>>533751
Не всегда.
>>533740
Надо будет удалить еще старый код. Алгоритм выглядит верно, формула подсчета — не уверен. Ты уверен что ход на клетку с мышью на ней у тебя будет выгоднее чем ход на клетку где рядом 4 мыши?
> protected function goUpAndRight($eat = false){
Я думаю что нам не нужно 8 копипаст одной и той же функции. Что ты будешь делать для животного которое шахматным конем прыгает?
> private $location = ["x" => 0, "y" => 0];
А точно массив лучше чем 2 отдельных свойства?
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L10
Тут все свойства нужны? Лишних нет?
> public function getSeeAnimals()
> {
> return $this->seeAnimals;
Непонятно зачем делать отдельное свойство если можно сделать метод, берущий эти данные с карты. Например, у карты можно сделать метод возвращающий всех животных определенного типа.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L108
Это должен быть метод карты, а не метод животного. С какой стати размер карты это свойство кошки? Это свойство карты. разберись с лишними свойствами и методами.
> https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/classes/Animal.php#L246
Тут тоже копипасты многовато
> Как это всё взаимодействует с бд и всякой логикой cms? Нужно ебаться с плагинами?
У CMS есть API описанный в документации к ней. Читаешь и делаешь.
>>533795
> там функции дописываются через пхпадмин.
пхпадмин?
>>533811
Скорее всего у него свой взгляд на архитектуру. Но мы будем придерживаться стандартного подхода и паттернов Фаулера.
Посмотрел чуть чуть видео, он под «декларативным» имеет в виду функциональное программирование, например язык Хаскеллл, где нет ООП (зато есть другие интересные вещи). Он испльзует слова «декларативный» как синоним «функциональный», но это не синонимы, отсюда путаница.
Соответственно он пытается рассказать (агитировать) о преимуществе функциональных языков и неизменяемых данных, и на мой взгляд, он там преувиличивает. если бы функциональные языки были так хорошо пригодны для релаьных задач, наверно самым популярным языком был бы не PHP.
Хотя функции без побочных эффектов это конечно хорошо.
Чтобы понять что он говорит, надо изучить хотя бы основы языка Хаскелл. Ну и вообще лекция не для начинающих.
Потому что это картинки формата в котором нет exif?
>>533842
Покажи код, покажи что пишет в ошибке.
>>533845
Наш тред рассчитан на изучение с нуля так что думаю легко.
>>533849
>>533878
> return gn();
Ты возвращаешь результат вызова функции а надо вернуть саму функцию.
>>533852
зачем бложики, на них ничему не научишься. делай тестхаб или клон ютуба.
>>532525
В общем, выглядит норм. Ты STI используешь? Только тогда в Юи сделай-ка для разных типов вопросов разные модели.
> wright_number
граммар наци: right
> sequence_number
Уникальный ключ не требуется? Это сортировка впрочем.
> или взять варчар побольше? вдруг придумают более сложный алгоритм
когда придумают тогда и поменяешь
> id BIGINT UNSIGNED
а ты оптимист. Но в общем это хорошая идея, 4 млрд не так и много как кажется.
> CREATE TABLE answer (
> test_id INT UNSIGNED NOT NULL,
> question_id BIGINT UNSIGNED NOT NULL,
Тут нет избыточных данных?
Также, у тебя есть сущность «попытка сдачи теста» (может быть «экзамен»)? То есть человек может сдавать тест несколько раз.
Файлообменник сегодня наверно не посмотрю, ты ведь только сегодня ссылку добавил.
> Из явных косяков, меня беспокоит проблема передачи переменных в шаблон. В каждом роуте используются разные шаблоны, поэтому не выход передавать их через слимовский appendData. В результате скапливаются десятки монотонных строк кода вида
А ты ООП используешь? Например чтобы передать информацию о файле достаточно 1 объекта File а не 10 отдельных переменных.
В случае с формой логина, надо передавать либо массив значений для нее, либо сделать объект LoginFormModel и передавать его. Лучше объект.
Если у тебя есть какие-то переменные, нужные на всех страницах (в шапке например) то надо либо добавлять их через appendData либо сделать функцию/метод, возвращающие их. Копипастить не стоит.
Вывод формы и обработку ее надо делать одним действием (у тебя для /reg сделано 2 метода).
Превьюшки надо создавать либо при загрузке либо при первом обращении к файлу но не при каждом открытии страницы файла.
Ты выбираешь авторов комментариев в цикле, это очень неэффективно, надо делать это одним запросом, то есть собрать все id, сделать запрос с IN и присоединить авторов. Либо же при выборке сделать джойн.
Также index.php у тебя подозрительно большой. Боюсь, что замечания все же будут так как тут очень далеко от идеала. Ты ведь и сам наверно чусствуешь что не все в порядке.
Пока я не проверил все, ты можешь делать другую задачу а потом вернуться к этой.
> Если я правильно понял алгоритм для работы с формами, то он выглядит так: если форма прошла валидацию, редиректим на гет. Если не прошла, то тут же без редиректа выводим форму с сообщением об ошибке и введенными от пользователя значениями полей.
> Но в таком случае опять получается копипаст из маршрута, который отвечает за гет(смотри например у меня '/view/:id') в посте.
В твоем случае надо сделать один обработчик и на POST и на GET. Если копипаста по другим причинам, то выносить повторяющийся код в функции/методы.
Потому что это картинки формата в котором нет exif?
>>533842
Покажи код, покажи что пишет в ошибке.
>>533845
Наш тред рассчитан на изучение с нуля так что думаю легко.
>>533849
>>533878
> return gn();
Ты возвращаешь результат вызова функции а надо вернуть саму функцию.
>>533852
зачем бложики, на них ничему не научишься. делай тестхаб или клон ютуба.
>>532525
В общем, выглядит норм. Ты STI используешь? Только тогда в Юи сделай-ка для разных типов вопросов разные модели.
> wright_number
граммар наци: right
> sequence_number
Уникальный ключ не требуется? Это сортировка впрочем.
> или взять варчар побольше? вдруг придумают более сложный алгоритм
когда придумают тогда и поменяешь
> id BIGINT UNSIGNED
а ты оптимист. Но в общем это хорошая идея, 4 млрд не так и много как кажется.
> CREATE TABLE answer (
> test_id INT UNSIGNED NOT NULL,
> question_id BIGINT UNSIGNED NOT NULL,
Тут нет избыточных данных?
Также, у тебя есть сущность «попытка сдачи теста» (может быть «экзамен»)? То есть человек может сдавать тест несколько раз.
Файлообменник сегодня наверно не посмотрю, ты ведь только сегодня ссылку добавил.
> Из явных косяков, меня беспокоит проблема передачи переменных в шаблон. В каждом роуте используются разные шаблоны, поэтому не выход передавать их через слимовский appendData. В результате скапливаются десятки монотонных строк кода вида
А ты ООП используешь? Например чтобы передать информацию о файле достаточно 1 объекта File а не 10 отдельных переменных.
В случае с формой логина, надо передавать либо массив значений для нее, либо сделать объект LoginFormModel и передавать его. Лучше объект.
Если у тебя есть какие-то переменные, нужные на всех страницах (в шапке например) то надо либо добавлять их через appendData либо сделать функцию/метод, возвращающие их. Копипастить не стоит.
Вывод формы и обработку ее надо делать одним действием (у тебя для /reg сделано 2 метода).
Превьюшки надо создавать либо при загрузке либо при первом обращении к файлу но не при каждом открытии страницы файла.
Ты выбираешь авторов комментариев в цикле, это очень неэффективно, надо делать это одним запросом, то есть собрать все id, сделать запрос с IN и присоединить авторов. Либо же при выборке сделать джойн.
Также index.php у тебя подозрительно большой. Боюсь, что замечания все же будут так как тут очень далеко от идеала. Ты ведь и сам наверно чусствуешь что не все в порядке.
Пока я не проверил все, ты можешь делать другую задачу а потом вернуться к этой.
> Если я правильно понял алгоритм для работы с формами, то он выглядит так: если форма прошла валидацию, редиректим на гет. Если не прошла, то тут же без редиректа выводим форму с сообщением об ошибке и введенными от пользователя значениями полей.
> Но в таком случае опять получается копипаст из маршрута, который отвечает за гет(смотри например у меня '/view/:id') в посте.
В твоем случае надо сделать один обработчик и на POST и на GET. Если копипаста по другим причинам, то выносить повторяющийся код в функции/методы.
Да. Doctrine DBAL это низкроуровневая библиотека наподобие PDO (по моему она ее использует, добавляя некоторые фичи) которую использует доктрина. Про DBAL почитать немного тоже стоит. Она например добавляет плейсхолдеры для массивов для подстановки в WHERE IN (..).
>>533881
Оба верные, отчличия в мануале: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>533912
Нет, они же на сервере лежат. Чтобы не был трилиард строк можно взять готовую библиотеку (если ее нет, написать один раз и использовать везде свою).
Как по мне так ужимать картинки на клиенте это уродливо. На западных сайтах часто такое вижу, суют картинки в 3000 пикс шириной, скорее всего из -за того что сайт на вордпрессе с готовыми плагинами.
Ну и на сервере можно например ватермарки добалять и другие эффекты.
>>533920
Нет. Просто сегодня я уже много проверил и остальное наверно завтра. Решай пока что-нибудь еще или код оптимизируй, убери копипаст, вынеси все что к карте относится из животного.
>>533933
Это тоже плохой вариант, есть же родственники, знакомые, родные поля, березки, мосты, каналы. Да и не нужен ты никому за рубежом и без гражданства человек второго сорта. И культура у них другая.
>есть же родственники, знакомые, родные поля, березки, мосты, каналы. Да и не нужен ты никому за рубежом и без гражданства человек второго сорта. И культура у них другая
Каким-то совковым консерватизмом повеяло.
> Да и не нужен ты никому за рубежом
А здесь нужен? Что вообще люди вкладывают в термин "нужен" в контексте стран?
>Что вообще люди вкладывают в термин "нужен" в контексте стран?
Социальные связи они вкладывают, которых у программистишки и здесь-то нет, а там и быть не может.
> return gn();
Ты возвращаешь результат вызова функции а надо вернуть саму функцию.
все равно не работает.
а остальное все правильно?
Например https://2ch.hk/makaba/makaba.fcgi?task=market
Более доступного примера не придумал.
Натыкай там console.log() которые будут выводить аргументы в первой функции, во второй, и после объединения. Проверь, в правильном ли порядке они объединяются.
>А ты ООП используешь? Например чтобы передать информацию о файле достаточно 1 объекта File а не 10 отдельных переменных
Так проблема в том, что мне нужно передать в представление кучу переменных, которые между собой вообще никак не связаны (ну или я не могу уловить связь и выявить сущность).
Вот например переменные, которые встречаются в шаблоне, отвечающем за вывод описания конкретного файла.
$app->render(
'file_info.tpl',
array(
'file'=>$file, // это объект класса File, то есть собственно модель с информацией о файле
'title'=>$title, // title страницы, у каждой страницы разный заголовок; на главной это "SiteName - главная", на странице со списком файлов - "SiteName - загрузки" и т.д. не могу вынести в appendData
'login'=>$login, // залогинен ли пользователь? разве что эту переменную можно вынести "за скобки"
'loginEmail'=>$loginEmail, // это не прошедшее валидацию значение для поля имейл формы логина, чтобы пользователю не пришлось снова его вводить
'loginPassword'=>$loginPassword, // то же самое для пароля
'loginError'=>$loginError, // текст ошибки для формы, не прошедшей валидацию
'bookmark'=>$bookmark, // в дизайне что-то типа похожее на "Tabs" jQueryUI, то есть закладки; мне нужно знать, какая закладка активна
'preview'=>$preview, // в случае если файл является видео, аудио или картинкой, выводим плеер/предпросмотр; переменная содержит либо название подшаблона (video_preview.tpl, audio_preview.tpl, image_preview.tpl) либо false для прочих файлов (при false "виджет" предпросмотра не выводится)
'description'=>$description, // в таблице описания файла есть общие для всех типов файлов параметры (название, размер, дата загрузки и т.д.); и есть специфические характеристики (для картинки это разрешение, для аудио - время воспроизведения и т.д.); переменная определяет, какой из шаблонов для спец.информации подключить
'type'=>$type, // переменная для jPlayer, содержит тип файла в том виде, каком его читает jPlayer (например для видео webm это строка 'webmv')
'path'=>$path, // переменная для jPlayer, содержит путь к файлу
'comments'=>$comments, // массив объектов комментариев
'reply'=>$reply, // значение подставляется в hidden input формы комментирования, чтобы понять, на какой комментарий отвечаем (или ни на какой, значит это комментарий к файлу, а не ответ)
'postError'=>'', // в случае если форма комментирования не прошла валидацию, рендерим страницу с текстом ошибки
));
И так в каждом представлении. Я не вижу, в какой объект упаковать эту кучу, чтобы можно было удобно его передать в представление, эти переменные не связаны друг с другом. Так что я лучше забью на этот смарти, и потренируюсь с твигом. Кажется, его симпатичная система наследования (и переопределения) шаблонов должна большей частью решить эту проблему.
>Превьюшки надо создавать либо при загрузке либо при первом обращении к файлу но не при каждом открытии страницы файла.
А если файл был удален? Превью у меня не создается каждый раз при обращении к файлу, каждый раз проверяется существование превью, и если не существует, то создается. Видимо, я объединил проверку существования превью и его генерацию в одном методе, не нужно было этого делать. Сейчас посмотрю, уже не помню.
>Боюсь, что замечания все же будут так как тут очень далеко от идеала. Ты ведь и сам наверно чувствуешь что не все в порядке.
По мере того как проект разрастается, становится все сложнее ориентироваться в нем, неточности проявляются все сильнее и все скатывается в говнокод. Поэтому у меня позывы слиться и закончить уже с этим проектом.
Мне кажется, мне нужно сначала хорошо ознакомиться с каким-нибудь фреймворком, тогда смогу по подобию писать чистый и красивый код.
Так что постепенно переключаюсь на teshub. Сейчас только закончу с хелловорлдами на yii, приступлю к нему.
>А ты ООП используешь? Например чтобы передать информацию о файле достаточно 1 объекта File а не 10 отдельных переменных
Так проблема в том, что мне нужно передать в представление кучу переменных, которые между собой вообще никак не связаны (ну или я не могу уловить связь и выявить сущность).
Вот например переменные, которые встречаются в шаблоне, отвечающем за вывод описания конкретного файла.
$app->render(
'file_info.tpl',
array(
'file'=>$file, // это объект класса File, то есть собственно модель с информацией о файле
'title'=>$title, // title страницы, у каждой страницы разный заголовок; на главной это "SiteName - главная", на странице со списком файлов - "SiteName - загрузки" и т.д. не могу вынести в appendData
'login'=>$login, // залогинен ли пользователь? разве что эту переменную можно вынести "за скобки"
'loginEmail'=>$loginEmail, // это не прошедшее валидацию значение для поля имейл формы логина, чтобы пользователю не пришлось снова его вводить
'loginPassword'=>$loginPassword, // то же самое для пароля
'loginError'=>$loginError, // текст ошибки для формы, не прошедшей валидацию
'bookmark'=>$bookmark, // в дизайне что-то типа похожее на "Tabs" jQueryUI, то есть закладки; мне нужно знать, какая закладка активна
'preview'=>$preview, // в случае если файл является видео, аудио или картинкой, выводим плеер/предпросмотр; переменная содержит либо название подшаблона (video_preview.tpl, audio_preview.tpl, image_preview.tpl) либо false для прочих файлов (при false "виджет" предпросмотра не выводится)
'description'=>$description, // в таблице описания файла есть общие для всех типов файлов параметры (название, размер, дата загрузки и т.д.); и есть специфические характеристики (для картинки это разрешение, для аудио - время воспроизведения и т.д.); переменная определяет, какой из шаблонов для спец.информации подключить
'type'=>$type, // переменная для jPlayer, содержит тип файла в том виде, каком его читает jPlayer (например для видео webm это строка 'webmv')
'path'=>$path, // переменная для jPlayer, содержит путь к файлу
'comments'=>$comments, // массив объектов комментариев
'reply'=>$reply, // значение подставляется в hidden input формы комментирования, чтобы понять, на какой комментарий отвечаем (или ни на какой, значит это комментарий к файлу, а не ответ)
'postError'=>'', // в случае если форма комментирования не прошла валидацию, рендерим страницу с текстом ошибки
));
И так в каждом представлении. Я не вижу, в какой объект упаковать эту кучу, чтобы можно было удобно его передать в представление, эти переменные не связаны друг с другом. Так что я лучше забью на этот смарти, и потренируюсь с твигом. Кажется, его симпатичная система наследования (и переопределения) шаблонов должна большей частью решить эту проблему.
>Превьюшки надо создавать либо при загрузке либо при первом обращении к файлу но не при каждом открытии страницы файла.
А если файл был удален? Превью у меня не создается каждый раз при обращении к файлу, каждый раз проверяется существование превью, и если не существует, то создается. Видимо, я объединил проверку существования превью и его генерацию в одном методе, не нужно было этого делать. Сейчас посмотрю, уже не помню.
>Боюсь, что замечания все же будут так как тут очень далеко от идеала. Ты ведь и сам наверно чувствуешь что не все в порядке.
По мере того как проект разрастается, становится все сложнее ориентироваться в нем, неточности проявляются все сильнее и все скатывается в говнокод. Поэтому у меня позывы слиться и закончить уже с этим проектом.
Мне кажется, мне нужно сначала хорошо ознакомиться с каким-нибудь фреймворком, тогда смогу по подобию писать чистый и красивый код.
Так что постепенно переключаюсь на teshub. Сейчас только закончу с хелловорлдами на yii, приступлю к нему.
>Скорее всего у него свой взгляд на архитектуру.
У них вообще курсы необычно сделаны. Пикрилейтед1 программа курса "PHP5: Основа программирования".
И только после этого идёт курс "PHP 5: Императивное программирование".
А пикрилейтед2 (читать слева направо, сверху вниз) их взгляд на план развития до начинающего веб-разработчика.
Ну поставил, а оно нихуя не запускается, сука.
http://www.php.su/prepare/?apache2_php5_win
Делал по этому гайду.
В частности, когда коментирую эту строку
#LoadModule php5_module C:/Program Files (x86)/Apache/PHP/php5apache2_4.dll
апач работает. Если убрать коментарий, то не запускается.
В лог еррор ничего не пишет.
какой-нибудь localstorage? Или если ты залогинен, логично на сервере держать эту информацию (чтобы потом проанализировать).
Можешь попробоать посмотреть отладчиком если разберешься. Он показывает localstorage.
>>534003
> Вот например переменные, которые встречаются в шаблоне,
Данные из формы логина логично объединить в объект, который можно использовать и в обработчике этой формы. Но если подумать, они не нужны на всех страницах. Они нужны только на странице логина.
> 'preview'=>$preview, // в случае если файл является видео, аудио или картинкой,
Это нужно только на странице файла. Логику выбора шаблона можно перенести в сам шаблон и не передавать переменную.
> 'description'=>$description,
> 'type'=>$type,
> 'path'=>$path
надо смотреть код, но интуиция подсказывает что можно и их убрать. Опять же это нужно только на одной странице.
> 'comments'=>$comments,
> 'reply'=>$reply
> 'postError'=>''
Эти переменные нужны только на 1 странице, а не везде.
Я потом проверю код и дам более подробные советы, что поменять.
> А если файл был удален?
Тогда ты не можешь просмотреть его страницу и создавать ничего не требуется.
> По мере того как проект разрастается, становится все сложнее ориентироваться в нем
А надо учиться писать чтобы код был понятным. И учиться проще на простых примерах (фйлообменник) чем на сложных.
> Поэтому у меня позывы слиться и закончить уже с этим проектом.
Не беда, я посмотрю код и напишу подробно что не так.
> Сейчас только закончу с хелловорлдами на yii, приступлю к нему.
Приступай, а потом вернемся к файлообменнику.
>>534006
У них курс не вообще по всему PHP, а только по функциональному программированию в PHP, какие возможности там есть. Причем может быть (я не знаю) от тебя требуется знать это функиональное программирование на примере Хаскелл.
Ты наверно не так понял, подумал что это курс по PHP для нубов.
Вторая картинка выглядит адекватной. Линукс полезен, для написания скриптов и уверенной работы на сервере. Только не уверен что за паттерны стоит браться так рано.
Они тоже Слим изучают, как и мы, я смотрю.
какой-нибудь localstorage? Или если ты залогинен, логично на сервере держать эту информацию (чтобы потом проанализировать).
Можешь попробоать посмотреть отладчиком если разберешься. Он показывает localstorage.
>>534003
> Вот например переменные, которые встречаются в шаблоне,
Данные из формы логина логично объединить в объект, который можно использовать и в обработчике этой формы. Но если подумать, они не нужны на всех страницах. Они нужны только на странице логина.
> 'preview'=>$preview, // в случае если файл является видео, аудио или картинкой,
Это нужно только на странице файла. Логику выбора шаблона можно перенести в сам шаблон и не передавать переменную.
> 'description'=>$description,
> 'type'=>$type,
> 'path'=>$path
надо смотреть код, но интуиция подсказывает что можно и их убрать. Опять же это нужно только на одной странице.
> 'comments'=>$comments,
> 'reply'=>$reply
> 'postError'=>''
Эти переменные нужны только на 1 странице, а не везде.
Я потом проверю код и дам более подробные советы, что поменять.
> А если файл был удален?
Тогда ты не можешь просмотреть его страницу и создавать ничего не требуется.
> По мере того как проект разрастается, становится все сложнее ориентироваться в нем
А надо учиться писать чтобы код был понятным. И учиться проще на простых примерах (фйлообменник) чем на сложных.
> Поэтому у меня позывы слиться и закончить уже с этим проектом.
Не беда, я посмотрю код и напишу подробно что не так.
> Сейчас только закончу с хелловорлдами на yii, приступлю к нему.
Приступай, а потом вернемся к файлообменнику.
>>534006
У них курс не вообще по всему PHP, а только по функциональному программированию в PHP, какие возможности там есть. Причем может быть (я не знаю) от тебя требуется знать это функиональное программирование на примере Хаскелл.
Ты наверно не так понял, подумал что это курс по PHP для нубов.
Вторая картинка выглядит адекватной. Линукс полезен, для написания скриптов и уверенной работы на сервере. Только не уверен что за паттерны стоит браться так рано.
Они тоже Слим изучают, как и мы, я смотрю.
У тебя путь с пробелами, ты его в кавычки взял? Я бы не советовал ставить PHp в папку, в пути к которой есть пробелы.
И в кавычки брал, и без кавычек.
Тоже над этим думал, но в мануале путь так же с пробелами и всё у них работает.
Странно это всё.
>Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.
Ох, этого я и боялся. Ненавижу фотошоп всей душой. Ну что поделать, придется ставить.
>2 начертания это недостаточно. Там есть курсивный текст (в заголовке).
Хмм, действительно курсив. Вначале я подумал, что там обычный механический наклон. Переделаю.
>также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint).
Понял. Я просто увеличивал и уменьшал жирность у OpenSansBold. Ну да, и самому это не нравилось. Опять поленился. Переделаю.
>У тебя в макете невооруженным глазом видно что вес шрифта не такой во многих местах.
Ну так и шрифт другой. Но вообще да, там в некоторых местах еще и тонкое начертание нужно. У меня его вообще не было. Добавлю.
>Я глянул, там lato: https://www.google.com/fonts/specimen/Lato
>Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.
>Оф. сайт шрифта найди сам.
Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.
> При том, что можно еще уменьшить, удалив ненужные форматы.
>Это ничего не даст так как браузер и не грузит все форматы, а только нужный ему.
А что насчет начертаний? К примеру у меня есть файлы жирного курсивного и обычного шрифта. А на сайте только обычный текст. Что будет загружаться пользователю, если у него нету ни одного из этих шрифтов? Только обычное начертание или курсив и жирный тоже? То есть вопрос о том, можно ли запихнуть сразу всю папку со всеми начертаниями, чтобы потом если нужно будет добавить текст на сайт, не нужно было идти и конвертировать, но так чтобы эти неиспользуемые начертания не загружались, пока не нужны.
> В общем, ОП, я не стал ждать когда дашь свой комментарий по поводу тестового сайта со шрифтами.
>Я же написал вроде или ты там что-то еще поменял?
Да, я тогда подключил три начертания OpenSans к тестовому сайту, вот мой пост >>532461
>Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.
Ох, этого я и боялся. Ненавижу фотошоп всей душой. Ну что поделать, придется ставить.
>2 начертания это недостаточно. Там есть курсивный текст (в заголовке).
Хмм, действительно курсив. Вначале я подумал, что там обычный механический наклон. Переделаю.
>также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint).
Понял. Я просто увеличивал и уменьшал жирность у OpenSansBold. Ну да, и самому это не нравилось. Опять поленился. Переделаю.
>У тебя в макете невооруженным глазом видно что вес шрифта не такой во многих местах.
Ну так и шрифт другой. Но вообще да, там в некоторых местах еще и тонкое начертание нужно. У меня его вообще не было. Добавлю.
>Я глянул, там lato: https://www.google.com/fonts/specimen/Lato
>Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.
>Оф. сайт шрифта найди сам.
Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.
> При том, что можно еще уменьшить, удалив ненужные форматы.
>Это ничего не даст так как браузер и не грузит все форматы, а только нужный ему.
А что насчет начертаний? К примеру у меня есть файлы жирного курсивного и обычного шрифта. А на сайте только обычный текст. Что будет загружаться пользователю, если у него нету ни одного из этих шрифтов? Только обычное начертание или курсив и жирный тоже? То есть вопрос о том, можно ли запихнуть сразу всю папку со всеми начертаниями, чтобы потом если нужно будет добавить текст на сайт, не нужно было идти и конвертировать, но так чтобы эти неиспользуемые начертания не загружались, пока не нужны.
> В общем, ОП, я не стал ждать когда дашь свой комментарий по поводу тестового сайта со шрифтами.
>Я же написал вроде или ты там что-то еще поменял?
Да, я тогда подключил три начертания OpenSans к тестовому сайту, вот мой пост >>532461
>Ты наверно не так понял, подумал что это курс по PHP для нубов.
Они его называют не курсом по PHP, а курсом по программированию, а PHP - лишь средство. Для начинающих. Говорят, основан на SICP.
Я там переделал немного. Если не будет работать, пишите!
Можешь гимп попробовать, но не гарантирую что все откроется.
> К примеру у меня есть файлы жирного курсивного и обычного шрифта. А на сайте только обычный текст. Что будет загружаться пользователю, если у него нету ни одного из этих шрифтов?
Лучше всего проверить инспектором на вкладке Network. Я думаю, только те начертания, которые используются на странице. Ну и из нескольких форматов браузер выберет только одни.
>>534037
SICP значит «структура и интерпретация компьютерных программ» и вряд ли это курс для начинающих.
Тут http://fontsmaket.esy.es/ для italic нет шрифта так как там получается стиль
> font-family: OpenSansItalic;
То есть шрифт с названием openSansItalic и жирным, не курсивным начертанием, а в @font-face такого нет
Также я не понимаю почему ты 3 начертаниям одного шрфита даешь разные имена. Это только запутывает все.
Должно быть так:
@font-face {
font-family: Название под которым шрифт используется в CSS;
font-weight: какое это начертание;
font-style: какое начертание;
src: ссылки на файл с этим начертанием;
}
И еще несколько блоков с тем же названием, но другими weight и style и другими ссылками в src.
Ты явно теорию либо не почитал, либо хороших статей не нашел.
А, то есть потом уже в каждом случае в стилях не font-family подставлять, а weight и style. А само название шрифта в боди один раз прописать.
Сейчас переделаю на тестовом.
Переделал. И чего-то понять не могу почему все жирным шрифтом а италик механический.
Инспектором посмотри внимательно какие стили применены к заголовкам (на вкладке Computed он даже идентификатор шрифта пишет).
У меня у котика в глазах(в краях) все время козявки, это гной? Может закапать? Правда он не домашний, т.е. у родителей в поселке живет, ползает на улице, иногда потрепанный приходит.
Ой, вы тут кошечек любите)))) Наверное и деток тоже))))))
А у моего ребеночка какашечки какого-то странного цвета.......
Как думаете, это плохо?((((((((((((((((((((((
Объясните, что такое делегирование, множественное наследование, трейты и шаблон mixin.
Почитал какие-то статьи, ничего не понял.
Можно своими словами и с аналогиями?
Осознал, приступаю.
Сейчас собираю php5 из исходников с нужными моджулями Debian 8.1/php-5.6.12
Сконфигурировалось ровно, собралось тоже. Но тесты показали что не все так хорошо. Чем/как мне чинить косяки?
=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
file_get_contents() test using offset parameter out of range [ext/standard/tests/file/file_get_contents_error001.phpt]
FPM: Test status page [sapi/fpm/tests/010.phpt]
=====================================================================
=====================================================================
WARNED TEST SUMMARY
---------------------------------------------------------------------
zend multibyte (8) [ext/mbstring/tests/zend_multibyte-08.phpt] (warn: XFAIL section but test passes)
zend multibyte (10) [ext/mbstring/tests/zend_multibyte-10.phpt] (warn: XFAIL section but test passes)
zend multibyte (11) [ext/mbstring/tests/zend_multibyte-11.phpt] (warn: XFAIL section but test passes)
Phar: bug #69958: Segfault in Phar::convertToData on invalid file [ext/phar/tests/bug69958.phpt] (warn: XFAIL section but test passes)
FPM: Test various messages on start, from master and childs [sapi/fpm/tests/015.phpt] (warn: XFAIL section but test passes)
=====================================================================
>есть ли в PHP while?
Конечно есть http://fi2.php.net/manual/ru/control-structures.while.php
Можешь скачать мануал здесь http://fi2.php.net/download-docs.php Рекомендую chm с комментариями, тот что на ~30МБ.
>>534071
В расчёте есть ошибка, у софтбанка должно получиться 61268. Цикл, на мой дилетантский взгляд, сделан очень нелогично, переделай через while.
Проверка
>if ($servicePayment == 0) {
>$creditBalance += 7777;}
на мой взгляд тоже нелогична, вдруг нужно будет произвести расчёт для другого банка, где будет и ежемесячный платёж за обслуживание, и плата за открытие счёта. Подумай как можно переделать.
неоп
С mvc знаком, а джумлу недавно начал изучать.
В идеале нужен компонент который .zip устанавливается без смс и писечек. Редактировать ядро табу ведь.
Не, козявки это нормально. А вот гнойные сопельки это плохо, в инете написано, что какое-то вирусное заболевание и будут осложнения и нужно к ветеринару вести (а у меня социофапия, как же я пойду к ветеринару (().
http://www.php.su/articles/?cat=oop&page=006
Что думаете по поводу такого вот (ООП) построения вьюхи?
Ни в коем случае не следуй тому, что там описано. Статья очень устарела.
Если ты новичок, и задаешься таким вопросом - выучи фреймворк. Yii или Laravel.
Мне сказали, что вот это вот говнокод, хотя функция использует переменную выведенную методом foreach.
У тебя проблема в том, что во вьюхе ищё и какая-то логика подготовки данных. Такого быть не должно.
Вся подготовка данных должна быть в контроллере. Во вьюхе только вывод.
Как я понял у заголовков hN изначально уже стоит font-weight: bold и поэтому у меня все было жирным. Вылечилось выставлением им в CSS
font-weight: normal
font-style: normal;
А как я буду во вью реализовывать вывод данных в зависимости от наличия или отсутствия параметра в бд??
Мне что тогда в контроллере различные вьюхи подключать и дублировать их???
Этот параметр ты должен получить в модели, потом из модели передать в контроллер, обработать его как-то, если требуется, а потом аж из контроллера передать во вьюху. И во вьюхе проверить параметр через if/switch.
#12: http://jsfiddle.net/c6xkz5Lw/
Как я могу вот этот кусок вывести через контроллер?
не могу. Хотя можно конечно display none поставить, а в контроллере джаваскрипт прописать, но это пиздец.
if($cookieUser==$cookieLoad) {
?>
<div class="row">
<div class="col-md-6" style="padding-top:10px;">
<div class="btn-group" role="group" aria-label="...">
<a href="http://localhost/TwigBlog/download/<?=$value['id']?>"><button type="button" class="btn btn-primary">Download</button></a>
<a><button type="button" class="btn btn-success" data-toggle="modal" data-target="#myModal">Edit</button></a>
<a href="http://localhost/TwigBlog/delete/<?=$value['id']?>"><button type="button" class="btn btn-danger">Delete</button></a>
</div>
</div>
</div>
<?php
}
О боже.
Вот смотри как это должно быть примерно.
ты в контроллере пишешь так
if (isset($user)) {
$view_data['user_name'] = $user['name'];
} else {
$view_data['user_name'] = "Anonimouse";
}
и такими вот примерно хуйнями заполняешь этот самый массив $view_data
далее у тебя есть например в модели функция: которая возвращает массив всех юзверей тебе, с их инфой.
и ты в контроллере для их плучения пишешь:
$view_data['users'] = get_users();
после чего ты просто передаешь этот готовый массив $view_data во вьюху и там выводишь из него данные
<h3>добрый день, <?=$viev_data['user_name']?></h3>
<p>На нашем говнофоруме уже зарегались следующие долбоебы:</p>
<ul>
<? foreach ($view_data['users'] as $user) { echo "<li>" . $user['name'] . "</li>"; }?>
</ul>
то есть использовать во вьюхе цикл что бы вывести список или таблицу - норм. Прост формируются все поля для вьюхи контроллером, ясно тебе?
О боже.
Вот смотри как это должно быть примерно.
ты в контроллере пишешь так
if (isset($user)) {
$view_data['user_name'] = $user['name'];
} else {
$view_data['user_name'] = "Anonimouse";
}
и такими вот примерно хуйнями заполняешь этот самый массив $view_data
далее у тебя есть например в модели функция: которая возвращает массив всех юзверей тебе, с их инфой.
и ты в контроллере для их плучения пишешь:
$view_data['users'] = get_users();
после чего ты просто передаешь этот готовый массив $view_data во вьюху и там выводишь из него данные
<h3>добрый день, <?=$viev_data['user_name']?></h3>
<p>На нашем говнофоруме уже зарегались следующие долбоебы:</p>
<ul>
<? foreach ($view_data['users'] as $user) { echo "<li>" . $user['name'] . "</li>"; }?>
</ul>
то есть использовать во вьюхе цикл что бы вывести список или таблицу - норм. Прост формируются все поля для вьюхи контроллером, ясно тебе?
У тебя тут что за хуйня? Если типа зашел который загрузил файлик на сервер, то ему и показываем как бы ссылки на скачку и удаление того что он загрузил?
Это норм, как бы логично если зашел админ, то вывести через подобное условие ему ссылку на админку.
Но другое дело, что у тебя прямо в контроллере может идти проверка, и если юзер щемится не на свою страничку, то его на неё и не пускает, еще до подгрузки всяких вьюх прям, ферштейн?
И вообще, я вангую уязвимость в твоем коде. Пусть я такой зашел к тебе на сайт, загрузил файл, мне выдало страницу, а на ней ссылка вида: http://localhost/TwigBlog/download/123
Хуясе подумал я, и давай вручную перебирать айдишники для даунлоада.
http://localhost/TwigBlog/download/1
http://localhost/TwigBlog/download/2
и так далее
А после того как все скачал, то и прошелся запросами такого вида:
http://localhost/TwigBlog/delete/1
http://localhost/TwigBlog/delete/2
...
Ибо нехуй говносайты делать.
$app->get('/download/:token', function ($token) use($app) {
$files=$app->db->query("
SELECT * FROM files WHERE token = $token
");
Например статьи, текстовая информация, изображения и прочее, если с сайтом после его завершения должен будет работать другой человек, далекий от веб-разработки.
Для этого админка делается обычно. Если я тебя правильно понял
$post = preg_replace("~(https)://(.)pp.vk.me(.)(\s|\n|[,.?!](\s|\n)|$)~",'<img src="https://pp.vk.me\\3" title="https://pp.vk.me/\\3" width="256"><br>',$post);
Пик - результат регулярки.
Конструктор - в смысле класс, который выводит хуйню из foreach
ДО этого вообще не особо понимал, нахуй эти классы нужны.
class test {
public function __construct(array $files){
foreach($files as $post=>$value){
return $this->name=$value['path'];
}}
$obj = new test($files);
echo $obj->name;
Кстати, я вот думаю, что все заморочились с "ИИ" распознаванием картинок, чтобы новую капчку обходить.
Пиздец, это слим, что ли?
Микрофреймворки для тех, кто может в архитектуру. Возьми Yii, а лучше Laravel, научись мвц, а потом за слимы берись.
И да, используй pdo.
> проще во вью все писать.
Нахуя тебе тогда вообще вью, дебил? Ебашь всё в контроллере. И запросы, и обработку, и шаблоны через ечо.
У нас в конторе за такое..
Например в Yii это выглядит следующим образом:
$post = Post::model()->findByPk(10); // у таблицы Post есть внешний ключ на Author, но в объекте $post на данный момент нет данных об авторе, а только "ссылка"
$author = $post->author; // здесь произойдет запрос на получение данных об авторе
"Жадная загрузка" соответственно грузит все сопряженные данные сразу при первом запросе.
Я на всякий случай переспрашиваю, потому что часто пишут неясно, приходится догадываться, а мои догадки могут быть неточными.
Безобразная капча, я иногда подвисаю, пытаясь понять что на картинке.
Это та, где нужно стишки генерировать?
Все просто: берешь и вставляешь случайные слова из массивов word[1-5]. Рядом с заданием есть схема стиха.
Ты для 1 и 2 строчки стиха используешь те же слова. Для каждой из них тебе нужно отдельно вызывать функцию mt_rand()
Ну и зайчем ты ему сразу рассекретил, можно было сказать что у него в коде тупо нет связи mt_rand и вывода результата, пусть бы чутка тыковку включил.
Я не сразу код посмотрел, виноват.
И теперь надо еще как-то в зависимости от расширение файла подключить кусок для вывода картинки.
У меня в макете такое было совсем недавно. Для ul браузеры сами задают некоторый padding слева, у меня в хроме 40px был. Попробуй в инспекторе посмотреть, скорее всего слева паддинг и будет, нужно обнулить.
поясните за history.pushState
всё, спс, понял
Там он обнулен. К тому же box-sizing: border-box должен высчитывать ширину с учетом паддинга, так что при width:100% он все равно не должен выходить за родительский элемент.
Я тоже думал, что обнулен.
>box-sizing: border-box должен высчитывать ширину с учетом паддинга
Этот паддинг не учитывается. Он дается браузерами автоматически, то есть ты его можешь нигде вообще не прописывать, но в браузере он будет отображаться.
Я вообще сразу на сайт загружал и в инспекторе хрома смотрел в чем дело. У тебя загружен куда-нибудь? Можешь код показать, а то так не совсем понятно.
Действительно паддинг 40 пикселей. Гугл говорит, что придется прописывать отрицательный марджин, чтобы убрать эту хрень.
Нет, так извращаться не нужно. Подбери обнуление паддинга в нужном месте. У меня вылечилось.
email сделай уникальным. Еще нужно поле "Иногородний" или типа того, для места жительсва. И поле где ты будешь хранить токен, который мы сверяем с токеном из куки, которую мы поставим, что бы узнавать пользователей, когда им припрет редактировать свои данные.
Не ОП-кун.
Так же помни о том, что этот паддинг дает браузер, а значит в каждом браузере может быть свой паддинг. То есть ты сейчас выставишь отрицательный маргин 40, но к примеру в опере паддинг будет не 40, а 30, а в мозилле 20. В итоге ты только все порушишь. Нужно делать именно обнуление.
За что он отвечает? В документации http://www.yiiframework.com/doc/api/1.1/CDbConnection#emulatePrepare-detail непонятно.
Ссылаются на какой-то native prepare support. Я что-то упустил в изучении sql?
В мануале php тоже ссылаются на какую-то загадочную "эмуляцию". http://php.net/manual/ru/pdo.prepare.php
Что мне нужно знать о ней?
Я ваще не знаю, чё-как там в Юи, но думаю, это связано с http://php.net/manual/ru/pdo.setattribute.php
Ищи в списке PDO::ATTR_EMULATE_PREPARES
Оплата тоже подразумевалась.
>Но даже если ничего не умеете
Тут все такие.
>могли бы проработать юзерские маскоты, реплики для них, либо библиотеки какие-то прикрутить
Мне кажется, решение ОПовских заданий принесёт больше пользы.
А к тебе бы я пошёл, наверное, был бы уровнем чуть повыше.
>Для рассылки лучше взять хорош библиотеку типа swiftmailer а не писать с нуля.
Спасибо за подсказку, взял на заметку. Если бы был вариант скачать просто файлик у них, что бы заинклудить его в код, то уже бы попробовал и её. В итоге отложил пока эту идею на пару дней. Сейчас экспериментирую с php:mail и даже через неё ничего не шлется у меня, даже самому себе, лол. Что делать то с этим? Полезу сейчас читать хабру.
Вообще я понял, что это блин похоже целая отрасль по зарабатыванию бабла в интернете, и никто просто так не даст высылать тебе письма. Так как еще с самой зари интернета все борятся со спамом и прочим говном. Похоже наш сервер теперь тоже в бане, из-за того что я пытаюсь отсылать почту, лол. В общем ничего не ясно чет.
Очень интересно, продолжай.
Да я хз, ставил 100 лет назад на замену notepad++, но я не ожидал, что там так все сурово. Нет, я бы мог поковыряться, но пока не вижу необходимости, хочется писать код.
Нет нет, я имею ввиду сервер, там php mysql
Инкапсулируй, так круче
Удваиваю. Сегодня прямо посреди процесса работы над макетом меня прервал hostinger своим нововведением.
Ты ведь, анон, тоже поэтому спросить решил, да?
У меня немного другая проблема, есть несколько сайтов на денвере которые написал (в том числе и файлообменик по заданию ОПа), есть знакомые у которых свой небольшая ИТ-контора и они как бы не против меня взять если я покажу им свои работы, поэтому хочу выложить что бы было что показывать.
Понятно. А я тут задание на макет делал и посреди работы сайт перестал загружаться и файлзилла подключиться не могла. Оказалось что на hostinger отключили бесплатные аккаунты и FTP.
Ты больше не знаешь никаких бесплатных хостингов?
Ты больше не знаешь никаких бесплатных хостингов?
Да как-то всегда только хостингером пользовался и до сегодняшнего дня его бы и посоветовал тебе.
Сам не знаю куда макет выложить.
Могу ошибаться, но возможно такая чертовщина из-за буллета(символа напротив каждого элемента списка). Возможно он и занимает эти 40px.
Я только что вроде бы разместил на бесплатном аккаунте на хостингере. Только там у меня проблема, как там редактировать файлы которые уже закинул на хостинг? Захожу в файловый менеджер и там можно только просмотреть файл, как там редактировать?
А, всё, уже нашёл, извиняюсь за тупой вопрос.
Дали же божественный Ad Block. Зачем рекламу жрать?
Если не сложно можешь сказать как правильно сделать подключение к базе данных на хостингере, я пишу такое:
$dsn = 'mysql:dbname=program;host=hostinger.ru';
$user = '21319358'; //ид пользователя
$password = 'tort512'; //пароль указанный при регистрации
$pdo = new PDO($dsn, $user, $password);
Но мне пишет следующее:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'hostinger.ru' (111 "Connection refused")' in /home/u653722351/public_html/inc/bd.php:5 Stack trace: #0 /home/u653722351/public_html/inc/bd.php(5): PDO->__construct('mysql:dbname=pr...', '21319358', 'tort512') #1 /home/u653722351/public_html/index.php(2): include('/home/u653722351...') #2 {main} thrown in /home/u653722351/public_html/inc/bd.php on line 5
https://gist.github.com/codedokode/420c8c12a1edae25f0ec
Мануал от ОПа. И это очень в тему треда на самом деле.
Можно оставить публичными, но тогда есть возможность для записи в эти поля. То есть ты/твой коллега может по ошибке что-то туда положить $obj->name = 'new name';
Лучше делать protected и писать геттеры (геттер - метод который возвращает значение переменной, function getName(){return $this->_name;}).
Еще много приятных гайдов наложено на digitalocean.
https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian-8 например.
>>534028
> Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.
Там используется именно Lato (кстати, это переводится как «Лето») и он бесплатен для использования в вебе, о чем написано на сайте: http://www.latofonts.com/lato-free-fonts/
Там же можно скачать архив с шрифтом в нужных форматах, уже сконвертированный.
>>534032
>>534013
Я все же советую установить PHP в папку без пробелов и убедиться что он работает как описано например тут:
https://gist.github.com/codedokode/7054af4a03865c4cc863
Вот урок по установке Апача, хотя там ничего не написано про твой случай: https://gist.github.com/codedokode/10774100
>>534071
> for ($i = 1; $i <= 2; $i = 1)
для вечного цикла есть while (true) {} или for (;;) { }
Но в твоем случае наверно лучше сделать цикл не вечным, а с условием «пока долг больше нуля».
> return $paymentTotal;
> break;
return выходит из функции (и следовательно из цикла) и break никогда не выполнится.
> $creditBalance = 39999;
Это лучше сделать аргументом функции чтобы получилась универсальная функция на все случаи жизни.
> if ($servicePayment == 0) {
> $creditBalance += 7777;
Эта проверка в общем неправильная так как завтра банк может поменять условия или появится еще один банк без комиссий. Надо явно передавать дополнительный платеж как отдельный аргумент функции.
> if ($creditBalance <= $monthlyPayment)
Эту проверку надо делать после добавления процентов и комисиии (но до выплаты). то есть должна быть такая логика:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Ну и ответ во втором банке получается 61268 по моему.
В общем, переделывай.
> Сильно плохо так организовывать циклы?
нехорошо так как запутываешь читателя
> есть ли в PHP while?
https://www.google.ru/search?q=php+while&oq=php+while&aqs=chrome..69i57j0l5.1945j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
>>534028
> Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.
Там используется именно Lato (кстати, это переводится как «Лето») и он бесплатен для использования в вебе, о чем написано на сайте: http://www.latofonts.com/lato-free-fonts/
Там же можно скачать архив с шрифтом в нужных форматах, уже сконвертированный.
>>534032
>>534013
Я все же советую установить PHP в папку без пробелов и убедиться что он работает как описано например тут:
https://gist.github.com/codedokode/7054af4a03865c4cc863
Вот урок по установке Апача, хотя там ничего не написано про твой случай: https://gist.github.com/codedokode/10774100
>>534071
> for ($i = 1; $i <= 2; $i = 1)
для вечного цикла есть while (true) {} или for (;;) { }
Но в твоем случае наверно лучше сделать цикл не вечным, а с условием «пока долг больше нуля».
> return $paymentTotal;
> break;
return выходит из функции (и следовательно из цикла) и break никогда не выполнится.
> $creditBalance = 39999;
Это лучше сделать аргументом функции чтобы получилась универсальная функция на все случаи жизни.
> if ($servicePayment == 0) {
> $creditBalance += 7777;
Эта проверка в общем неправильная так как завтра банк может поменять условия или появится еще один банк без комиссий. Надо явно передавать дополнительный платеж как отдельный аргумент функции.
> if ($creditBalance <= $monthlyPayment)
Эту проверку надо делать после добавления процентов и комисиии (но до выплаты). то есть должна быть такая логика:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Ну и ответ во втором банке получается 61268 по моему.
В общем, переделывай.
> Сильно плохо так организовывать циклы?
нехорошо так как запутываешь читателя
> есть ли в PHP while?
https://www.google.ru/search?q=php+while&oq=php+while&aqs=chrome..69i57j0l5.1945j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
>я храню имя файла, размер файла, тип файла в базе данных
Все правильно. Лучше один раз собрать информацию о файле и занести в базу, чем каждый раз обращаться к файловой системе.
Имя разве не меняешь? А что если несколько пользователей загрузят файлы под одним и тем же именем, например "Безымянный.jpeg" или "ава.png"?
Что если кто-то загрузит php-скрипт и запустит его на сервере?
Оригинальное имя нужно сохранить в бд, а на сервере хранить под другим именем (приконкатенировать айди, временную метку, хеш) и расширением.
>Я глупый?
Да.
не знаю. У меня есть учебнике из Оп поста глава про ООП но там не все. Насчет Явы, раз ты упомянул ее, есть книга «Философия Ява, 4 издание», вот тут например глава про ООп из нее, но она замудреная местами: http://rastafara.nt.net.ua/index.php/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_1_Thinking_in_Java_4th_edition
>>534187
> делегирование
Это вызов функций другого (включенного в класс) объекта. Ну то есть у нас есть класс A и у него есть метод doSomething и он сам ничего не делает,а только вызывает метод doSomething у объекта класса B.
https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
> множественное наследование
Это когда класс наследуется от нескольких сразу (в PHP нельзя, и хорошо так как это приводит к путанице): https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
> трейты
это набор полей и функций который можно добавить в класс.
https://www.google.ru/search?q=%D1%82%D1%80%D0%B5%D0%B9%D1%82%D1%8B&oq=nhtqns&aqs=chrome.1.69i57j0.4290j0j4&sourceid=chrome&es_sm=0&ie=UTF-8
> шаблон mixin
Примесь это набор методов которые можно добавить в один или несколько классов. в PHP реализуются через трейты, в JS просто натыкиванием в объект новых методов.
https://learn.javascript.ru/mixins
В чистом ООП примеси не нужны, да и мне они тоже не очень нравятся.
не знаю. У меня есть учебнике из Оп поста глава про ООП но там не все. Насчет Явы, раз ты упомянул ее, есть книга «Философия Ява, 4 издание», вот тут например глава про ООп из нее, но она замудреная местами: http://rastafara.nt.net.ua/index.php/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_1_Thinking_in_Java_4th_edition
>>534187
> делегирование
Это вызов функций другого (включенного в класс) объекта. Ну то есть у нас есть класс A и у него есть метод doSomething и он сам ничего не делает,а только вызывает метод doSomething у объекта класса B.
https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
> множественное наследование
Это когда класс наследуется от нескольких сразу (в PHP нельзя, и хорошо так как это приводит к путанице): https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
> трейты
это набор полей и функций который можно добавить в класс.
https://www.google.ru/search?q=%D1%82%D1%80%D0%B5%D0%B9%D1%82%D1%8B&oq=nhtqns&aqs=chrome.1.69i57j0.4290j0j4&sourceid=chrome&es_sm=0&ie=UTF-8
> шаблон mixin
Примесь это набор методов которые можно добавить в один или несколько классов. в PHP реализуются через трейты, в JS просто натыкиванием в объект новых методов.
https://learn.javascript.ru/mixins
В чистом ООП примеси не нужны, да и мне они тоже не очень нравятся.
Если ты не очень понял, или хочешь разобраться лучше, давай-ка ты и потрудишься. Напиши простые примеры кода на PHP (или другом языке), демонстрирующие эти явления.
>>534222
Как минимум можно посмотреть подробный лог и поискать причину падения тестов там. Скорее всего либо ты при сборке что-то не добавил, либо баги в самом PHP
>>534291
Я не разбираюсь так что могу лишь посоветовать поискать в документации или погуглить.
>>534302
Я не понял, зачем тут класс и что именно ты хочешь сделать.
>>534319
Я думаю, что класс тут лишнее усложнение и смесь HTML с кодом класса смотрится некрасиво. Для вью лучше использовать обычные PHP шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
>>534331
Код покажи иначе никто не ответит
>>534371
Да, это плохой код так как тут есть логика которую надо выносить в модель или контроллер: чтение списка файлов с диска. Это не задача вью, его задача отображать то, что ему дали.
Стили у тебя почем-то прописаны прямо в HTML, а не в CSS файле. Может HTML/CSS подучить стоит?
br в верстке это 100% признак незнания CSS.
В шаблоне надо использовать foreach с двоеточием как описано тут: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Ссылки не должны собираться из кусков, а должны генерироваться функцией.
Килобайт это 1024, а не 1000 байт.
Ифов слишком много и все запутанно.
Обращений к кукам в вью быть не должно.
При выводе данных надо использовать htmlspecialchars.
Я рекомендую тебе сделать наше задание на список студентов. Там все это разжевывается и там подробные пояснения на эту тему. Если ты пытался делать файлообменник, то тебе пока рано это делать и лучше начать с более простой задачи.
Если ты не очень понял, или хочешь разобраться лучше, давай-ка ты и потрудишься. Напиши простые примеры кода на PHP (или другом языке), демонстрирующие эти явления.
>>534222
Как минимум можно посмотреть подробный лог и поискать причину падения тестов там. Скорее всего либо ты при сборке что-то не добавил, либо баги в самом PHP
>>534291
Я не разбираюсь так что могу лишь посоветовать поискать в документации или погуглить.
>>534302
Я не понял, зачем тут класс и что именно ты хочешь сделать.
>>534319
Я думаю, что класс тут лишнее усложнение и смесь HTML с кодом класса смотрится некрасиво. Для вью лучше использовать обычные PHP шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
>>534331
Код покажи иначе никто не ответит
>>534371
Да, это плохой код так как тут есть логика которую надо выносить в модель или контроллер: чтение списка файлов с диска. Это не задача вью, его задача отображать то, что ему дали.
Стили у тебя почем-то прописаны прямо в HTML, а не в CSS файле. Может HTML/CSS подучить стоит?
br в верстке это 100% признак незнания CSS.
В шаблоне надо использовать foreach с двоеточием как описано тут: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Ссылки не должны собираться из кусков, а должны генерироваться функцией.
Килобайт это 1024, а не 1000 байт.
Ифов слишком много и все запутанно.
Обращений к кукам в вью быть не должно.
При выводе данных надо использовать htmlspecialchars.
Я рекомендую тебе сделать наше задание на список студентов. Там все это разжевывается и там подробные пояснения на эту тему. Если ты пытался делать файлообменник, то тебе пока рано это делать и лучше начать с более простой задачи.
ну погугли MVC, блин.
У тебя кодировка многобайтная.
Ты обращаясь к $text[0] обращаешься не к первой букве, а к первому байту этой буквы. Поэтому нужно тут через (mb_)substr первую буквы дергать, если хочешь её сделат большой.
>>534392
Да, в браузере есть CSS правила по умолчанию, чтобы HTML без CSS был хоть как-то оформлен.
Там минимальные правила, они задают размер шрифта заголовков, маргины для разных элементов, вид ссылок, стили для списков. Приоритет этих правил тоже минимальный.
Стили для вебкита: http://trac.webkit.org/browser/trunk/Source/WebCore/css/html.css
Стили фаерфокса: http://hg.mozilla.org/mozilla-central/file/tip/layout/style/html.css
Ты должен иметь о них представление.
>>534407
Сделаешь переменную с понятным именем вроде $isFileAnImage (является ли файл картинкой?) и будешь проверять ее.
>>534408
Это элементарно:
<?php if ($user): ?>
<?php else: ?>
<?php endif ?>
Почитай статью про шаблоны и сделай задачу про студентов.
>>534413
Не, тут это не надо. Можно сделать что если юзер не залогинен то $user === null, иначе это объект User.
>>534478
Нужен токен либо проверка авторизации при удалении. Это обязательно. Ведь те же поисковики могут через браузер проиндексировать ссылки и перейти по ним.
Да, кстати, действия меняющие данные на сервере. вроде удаления, не должны делаться ссылкой и GET запросом, нужен POST запрос. Ты видимо HTTP не изучал (жаль, по нему конечно трудно найти хорошую статью).
>>534504
Ты должен вынести всю работу с базой в отдельный класс, а не размазывать запросы по коду. Вернись к задаче на студентов, сделай ее, сдай и исправь все замечания для начала.
>>534505
Которая M из MVC
>>534507
Контент обычно хранят в базе (можно в файлах, если его не будут менять, но в базе гораздо удобнее).
>>534531
Непонятно что ты хочешь сделать. ЧТо такое \\3 например?
>>534563
Я не знаю, что ты за задачу решал, но выглядит подозрительно. Также, твой код неправильный. Какой смыцс делать return из конструктора? По моему ты что-то не так понял.
По ООП в моем учебнике есть глава и там объясняется что такое конструктор. Это функция, которая вызывается при создании объекта и инициализирует его.
Я советую вернуться к этой главе и прорешать все задачи там, сдать их и исправить замечания. Если ты пропускаешь разделы учебника то заслуженно страдаешь. Вернись и исправь пробелы в знаниях. Это касается и других уроков, не только ООП.
>>534392
Да, в браузере есть CSS правила по умолчанию, чтобы HTML без CSS был хоть как-то оформлен.
Там минимальные правила, они задают размер шрифта заголовков, маргины для разных элементов, вид ссылок, стили для списков. Приоритет этих правил тоже минимальный.
Стили для вебкита: http://trac.webkit.org/browser/trunk/Source/WebCore/css/html.css
Стили фаерфокса: http://hg.mozilla.org/mozilla-central/file/tip/layout/style/html.css
Ты должен иметь о них представление.
>>534407
Сделаешь переменную с понятным именем вроде $isFileAnImage (является ли файл картинкой?) и будешь проверять ее.
>>534408
Это элементарно:
<?php if ($user): ?>
<?php else: ?>
<?php endif ?>
Почитай статью про шаблоны и сделай задачу про студентов.
>>534413
Не, тут это не надо. Можно сделать что если юзер не залогинен то $user === null, иначе это объект User.
>>534478
Нужен токен либо проверка авторизации при удалении. Это обязательно. Ведь те же поисковики могут через браузер проиндексировать ссылки и перейти по ним.
Да, кстати, действия меняющие данные на сервере. вроде удаления, не должны делаться ссылкой и GET запросом, нужен POST запрос. Ты видимо HTTP не изучал (жаль, по нему конечно трудно найти хорошую статью).
>>534504
Ты должен вынести всю работу с базой в отдельный класс, а не размазывать запросы по коду. Вернись к задаче на студентов, сделай ее, сдай и исправь все замечания для начала.
>>534505
Которая M из MVC
>>534507
Контент обычно хранят в базе (можно в файлах, если его не будут менять, но в базе гораздо удобнее).
>>534531
Непонятно что ты хочешь сделать. ЧТо такое \\3 например?
>>534563
Я не знаю, что ты за задачу решал, но выглядит подозрительно. Также, твой код неправильный. Какой смыцс делать return из конструктора? По моему ты что-то не так понял.
По ООП в моем учебнике есть глава и там объясняется что такое конструктор. Это функция, которая вызывается при создании объекта и инициализирует его.
Я советую вернуться к этой главе и прорешать все задачи там, сдать их и исправить замечания. Если ты пропускаешь разделы учебника то заслуженно страдаешь. Вернись и исправь пробелы в знаниях. Это касается и других уроков, не только ООП.
>>534575
Ты не приложил кода ни текста ошибки, если он есть. Какой ответ ты ждешь?
>>534577
Еще проще вообще не писать.
>>534584
Ему просто надо изучать все последовательно, а не перепрыгивать уроки. Так как он пропускает темы то он и с более сложными фреймворками не разберется.
>>534592
Вернись и сделай пропущенные уроки. И все начнет передаваться.
> сказали сделать файлообменник на слиме же
только перед ним надо сделать студентов, а перед ними ООП, а перед ними пройти учебник. Пропускать эти уроки можно тем кто их хорошо знает, на пятерку, а у тебя там есть пробелы в знаниях.
>>534593
Генерируешь число от 0 до N-1, где N число элементов в массиве, и берешь соответствующий элемент из массива.
>>534611
Да, правильно. Чтобы проверить что ты все понимаешь, попробуй написать преимущества и недостатки жадной и ленивой загрузки. ЧТобы ты мог потом проанализировать какой способ когда лучше применять.
Подсказка: гугли «проблему N + 1 запроса»
> потому что часто пишут неясно, приходится догадываться
Можно код почитать.
>>534649
Инспектором посмотри какие на нем CSS правила. Они могут быть переопределены другим правилом.
>>534711
Смотря для чего.
>>534732
Решение на проверку потом сдай.
>>534745
> Есть предложения получше?
изучить пропущенные темы.
>>534575
Ты не приложил кода ни текста ошибки, если он есть. Какой ответ ты ждешь?
>>534577
Еще проще вообще не писать.
>>534584
Ему просто надо изучать все последовательно, а не перепрыгивать уроки. Так как он пропускает темы то он и с более сложными фреймворками не разберется.
>>534592
Вернись и сделай пропущенные уроки. И все начнет передаваться.
> сказали сделать файлообменник на слиме же
только перед ним надо сделать студентов, а перед ними ООП, а перед ними пройти учебник. Пропускать эти уроки можно тем кто их хорошо знает, на пятерку, а у тебя там есть пробелы в знаниях.
>>534593
Генерируешь число от 0 до N-1, где N число элементов в массиве, и берешь соответствующий элемент из массива.
>>534611
Да, правильно. Чтобы проверить что ты все понимаешь, попробуй написать преимущества и недостатки жадной и ленивой загрузки. ЧТобы ты мог потом проанализировать какой способ когда лучше применять.
Подсказка: гугли «проблему N + 1 запроса»
> потому что часто пишут неясно, приходится догадываться
Можно код почитать.
>>534649
Инспектором посмотри какие на нем CSS правила. Они могут быть переопределены другим правилом.
>>534711
Смотря для чего.
>>534732
Решение на проверку потом сдай.
>>534745
> Есть предложения получше?
изучить пропущенные темы.
Везде стучаться на прямую к объектам, даже в фреймворках.
Что за дела? Где get/set-теры?
>Напиши простые примеры кода на PHP, демонстрирующие эти явления.
Я сейчас вожусь с Yii, там в руководстве говорится, что "Для компонентов реализован шаблон проектирования mixin".
http://yiiframework.ru/doc/guide/ru/basics.component
Поэтому пошел гуглить, и в результате насобирал еще колоду новых слов.
Но ты вроде более-менее внятно объяснил, так что поправь, если мои примеры будут неправильными.
Делегирование (фактически обертка над другим методом). В датаМаппере так хранится объект соединения с бд, и методы crud его используют.
class MyMapper
{
private $connection;
public function __construct(PDO $connection)
{
$this->connection = $connection;
}
public function save(Model $model)
{
$sth = $this->connection->prepare("INSERT ...");
...
}
}
>Это когда класс наследуется от нескольких сразу (в PHP нельзя)
Зато можно реализовать много интерфейсов, или это не то?
> трейты
>это набор полей и функций который можно добавить в класс.
Вот это непонятно. Что-то типа "импорта"?
class A
{
public function foo(){echo 'Hello ';}
}
class B
{
use A;
}
$b->foo();
Я что-то нигде не видел, чтобы эту фигню кто-то использовал, зато нагуглил вопросы на собеседованиях, там это зачем-то спрашивают. Может есть какие-то "подводные камни", то есть недостатки применения этого паттерна, или отдельные редкие случаи, когда он очень удобен? Вдруг спросят.
Что касается mixin, то это тоже самое что трейты, просто в реализации php? Ну и назвали бы тогда mixin, зачем новые кудрявые слова.
В общем, так и не понял, что такое "компонент" в yii, и как там реализованы примеси. Трейтами что ли? Ладно, пойду копаться в исходниках.
>Кто-нибудь вообще с первого раза гуглокапчу разгадывает?
Хм, у меня почему-то не каждый раз появляются картинки, в четырех случаях от пяти достаточно отметить галочку "я не робот".
>Напиши простые примеры кода на PHP, демонстрирующие эти явления.
Я сейчас вожусь с Yii, там в руководстве говорится, что "Для компонентов реализован шаблон проектирования mixin".
http://yiiframework.ru/doc/guide/ru/basics.component
Поэтому пошел гуглить, и в результате насобирал еще колоду новых слов.
Но ты вроде более-менее внятно объяснил, так что поправь, если мои примеры будут неправильными.
Делегирование (фактически обертка над другим методом). В датаМаппере так хранится объект соединения с бд, и методы crud его используют.
class MyMapper
{
private $connection;
public function __construct(PDO $connection)
{
$this->connection = $connection;
}
public function save(Model $model)
{
$sth = $this->connection->prepare("INSERT ...");
...
}
}
>Это когда класс наследуется от нескольких сразу (в PHP нельзя)
Зато можно реализовать много интерфейсов, или это не то?
> трейты
>это набор полей и функций который можно добавить в класс.
Вот это непонятно. Что-то типа "импорта"?
class A
{
public function foo(){echo 'Hello ';}
}
class B
{
use A;
}
$b->foo();
Я что-то нигде не видел, чтобы эту фигню кто-то использовал, зато нагуглил вопросы на собеседованиях, там это зачем-то спрашивают. Может есть какие-то "подводные камни", то есть недостатки применения этого паттерна, или отдельные редкие случаи, когда он очень удобен? Вдруг спросят.
Что касается mixin, то это тоже самое что трейты, просто в реализации php? Ну и назвали бы тогда mixin, зачем новые кудрявые слова.
В общем, так и не понял, что такое "компонент" в yii, и как там реализованы примеси. Трейтами что ли? Ладно, пойду копаться в исходниках.
>Кто-нибудь вообще с первого раза гуглокапчу разгадывает?
Хм, у меня почему-то не каждый раз появляются картинки, в четырех случаях от пяти достаточно отметить галочку "я не робот".
Вернись и реши предыдущие задания. У тебя тут много ошибок и тебе надо начинать с более простых вещей, а не браться за сложное.
>>534769
тут читал? https://www.google.ru/search?q=history.pushstate&oq=history.pushstate&aqs=chrome..69i57j0l5.4951j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
Эти функции для того, чтобы твое яваскрипт приложение могло менять URL в адресной строке (не вызывая перезагрузку страницы), узнавать о событиях навигации (вперед/назад/смена URL) и полноценно поддерживало следующие функции браузера:
— назад/вперед
— добавление в закладки
— копирование/отправка URL со ссылкой на опрелеленный раздел в приложении
— обновить страницу не теряя открытую в приложении страницу
>>534798
Инспектором смотри какие CSS правила применены можешь скриншотом запостить.
>>534799
А почему не 3? Не знаю, почитай обзоры что ли.
Вот мои, без комментарииев:
AutoFileName\
DocBlockr\
Emmet\
FileRename-master\
PHP-Twig.tmbundle-master\
Sublime-JSHint-master\
SublimePHPCompanion\
XdebugClient\ (глючный, не работает)
Ну и IDE зря боишься, надо найти время и почитать мануал к ней и статьи/уроки чтобы полноценно научиться использовать ее возможности и писать код быстрее. IDE это очень мощный инструмент в умелых руках.
>>534801
Ты уверен что совет в гугле именно к твоему случаю? Лучший выход изучить CSS как следует, у нас кстати есть задачки на HTML/CSS в Оп посте.
Я бы начал с вопроса, зачем ты ставишь width 100% если блоки по умолчанию занимают всю ширину родителя с учетом паддингов и маргинов. Ты зачем код и жизнь себе усложняешь? Надо знать возможности CSS и способы поиционирования элементов, а не переставлять свойства наугад.
>>534809
Табличку лучше SQL кодом постить (SHOW CREATE TABLE x \G )
>>534814
Верные советы
>>534853
Это опция PDO, как реализовывать плейсхолдеры?
— подставлять значения в SQL на стороне PHP и слать готовый запрос
— слать отдельно запрос, отдельно данные плейсхолдеров и пусть подставляет база
Опция нужна для баз не поддерживающих плейсхолдеры и для отладки багов.
Подстановка на стороне базы лучше так как она может закешировать план выполнения запроса и чуть-чуть уменьшить время выполнения.
>>534878
держи пасту в помощь: https://gist.github.com/codedokode/420c8c12a1edae25f0ec
>>534879
Если это работа, надо описывать условия и работы и оплаты подробнее.
Если за долю то не советую, так как ты аноним и тебя никто не знает, а доверять надо людям которых хорошо знаешь, очень хорошо.
>>534908
Погугли «habr настройка рассылки». надо лишь разбираться в технологиях, которые используются. Некоторые почтовые службы так же дают доступ к информации по пользователям жмущим «в спам». Также есть FBL который ты можешь использовать для отписывания пользователей. Также ты должен принимать письма-отлупы о невозможности доставки и больше не слать ничего таким пользователям.
Почтовые сервисы вроеде mail.ru, yandex, google публикуют рекмендации для веб-мастеров по поводу рассылок.
Также надо явно спрашивать согласие пользователй на получнеие рассылки иначе они будут жать «в спам», а ты попадешь в бан.
В общем, гугли, изучай, не ленись.
>>534937
Когда ты обращаешьяс к строке по индексу:
$text[0]
ты получаешь не 1-ю букву, а первый байт. Соответственно ты ломаешь коды букв. Не используй этот метод, используй mb_substr.
Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Вернись и реши предыдущие задания. У тебя тут много ошибок и тебе надо начинать с более простых вещей, а не браться за сложное.
>>534769
тут читал? https://www.google.ru/search?q=history.pushstate&oq=history.pushstate&aqs=chrome..69i57j0l5.4951j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
Эти функции для того, чтобы твое яваскрипт приложение могло менять URL в адресной строке (не вызывая перезагрузку страницы), узнавать о событиях навигации (вперед/назад/смена URL) и полноценно поддерживало следующие функции браузера:
— назад/вперед
— добавление в закладки
— копирование/отправка URL со ссылкой на опрелеленный раздел в приложении
— обновить страницу не теряя открытую в приложении страницу
>>534798
Инспектором смотри какие CSS правила применены можешь скриншотом запостить.
>>534799
А почему не 3? Не знаю, почитай обзоры что ли.
Вот мои, без комментарииев:
AutoFileName\
DocBlockr\
Emmet\
FileRename-master\
PHP-Twig.tmbundle-master\
Sublime-JSHint-master\
SublimePHPCompanion\
XdebugClient\ (глючный, не работает)
Ну и IDE зря боишься, надо найти время и почитать мануал к ней и статьи/уроки чтобы полноценно научиться использовать ее возможности и писать код быстрее. IDE это очень мощный инструмент в умелых руках.
>>534801
Ты уверен что совет в гугле именно к твоему случаю? Лучший выход изучить CSS как следует, у нас кстати есть задачки на HTML/CSS в Оп посте.
Я бы начал с вопроса, зачем ты ставишь width 100% если блоки по умолчанию занимают всю ширину родителя с учетом паддингов и маргинов. Ты зачем код и жизнь себе усложняешь? Надо знать возможности CSS и способы поиционирования элементов, а не переставлять свойства наугад.
>>534809
Табличку лучше SQL кодом постить (SHOW CREATE TABLE x \G )
>>534814
Верные советы
>>534853
Это опция PDO, как реализовывать плейсхолдеры?
— подставлять значения в SQL на стороне PHP и слать готовый запрос
— слать отдельно запрос, отдельно данные плейсхолдеров и пусть подставляет база
Опция нужна для баз не поддерживающих плейсхолдеры и для отладки багов.
Подстановка на стороне базы лучше так как она может закешировать план выполнения запроса и чуть-чуть уменьшить время выполнения.
>>534878
держи пасту в помощь: https://gist.github.com/codedokode/420c8c12a1edae25f0ec
>>534879
Если это работа, надо описывать условия и работы и оплаты подробнее.
Если за долю то не советую, так как ты аноним и тебя никто не знает, а доверять надо людям которых хорошо знаешь, очень хорошо.
>>534908
Погугли «habr настройка рассылки». надо лишь разбираться в технологиях, которые используются. Некоторые почтовые службы так же дают доступ к информации по пользователям жмущим «в спам». Также есть FBL который ты можешь использовать для отписывания пользователей. Также ты должен принимать письма-отлупы о невозможности доставки и больше не слать ничего таким пользователям.
Почтовые сервисы вроеде mail.ru, yandex, google публикуют рекмендации для веб-мастеров по поводу рассылок.
Также надо явно спрашивать согласие пользователй на получнеие рассылки иначе они будут жать «в спам», а ты попадешь в бан.
В общем, гугли, изучай, не ленись.
>>534937
Когда ты обращаешьяс к строке по индексу:
$text[0]
ты получаешь не 1-ю букву, а первый байт. Соответственно ты ломаешь коды букв. Не используй этот метод, используй mb_substr.
Урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>не каждый раз появляются картинки
Пик1. Один раз на сессию?
Пик2. Помогите решить капчу: средняя тачка в нижнем ряду это пикап? Не разбираюсь в быдломобилях.
>Ты уверен что совет в гугле именно к твоему случаю? Лучший выход изучить CSS как следует, у нас кстати есть задачки на HTML/CSS в Оп посте.
>Я бы начал с вопроса, зачем ты ставишь width 100% если блоки по умолчанию занимают всю ширину родителя с учетом паддингов и маргинов. Ты зачем код и жизнь себе усложняешь? Надо знать возможности CSS и способы поиционирования элементов, а не переставлять свойства наугад.
Я смотрел в инспекторе, там паддинг задан нулевой , не знаю почему он переписывается браузером. Убирал в инспекторе галочку с width 100%, ничего не меняется, возможно баг инспектора и если убрать в ксс файле все станет нормально. А вообще это не мой сайт, если что, я просто наткнулся на одном сайте на полосы прокрутки и решил посмотреть, что их вызвало и был озадачен.
ucfirst не работает с кириллицей в utf-8 и потому ненпригодна в современном мире. да вообще она с момента рождения была малопригодна.
>>534960
Ну и хорошо, только поищи статьи/уроки или мануал почитай чтобы уметь основными возможностями пользоваться.
>>534965
Можно и так и так. В больших проектах лучше конечно прайват.
Для доступа пишешь геттеры\сеттеры для каждого поля, у меня в редакторе для них макрос сделан: https://gist.github.com/codedokode/cd2f41c8dcf1237fde4b
> или создать метод который бы отдавал массив всех свойст
зачем нам массив когда есть объект?
>>534989
Гугли, лентяй. Регистрируйся и тестируй на своем опыте самые популярные хостиги, заодно можешь потом тут отписаться.
Также, если это на время, можно взять на пробу платный хостинг, у них часто дают бесплатный период.
>>535018
редактируешь у себя и выгружаешь через FTP/SFTP. Не надо ничего редактировать на хостинге. это плохая привычка.
>>535029
Для базы данных обычно отдельные реквизиты и пароль, задаются в админке хостинга при создании. Почитай FAQ, погугли. И проверь есть ли база на бесплатном тарифе.
>>535042
Дебиан советую, простой и минималистичный, можно поставить в виртуалке без графической оболочки и логиниться в него как в настоящий сервер.
Уроков и статей море, погугли, попробуй.
Паста от меня: https://gist.github.com/codedokode/420c8c12a1edae25f0ec
>>535050
В базе удобнее так как можно например одним запросом посчитать средний объем файла или найти самый маленький файл.
>>535058
да, с закрытыми свойствами код надежнее, но чуть больше по объему.
>>535063
Да, верно, файлы надо переименовывать, но так, чтобы админ мог потом понять где какой файл, потому не используйте случайные бессмысленные коды.
>>535091
Если ты файлообменник или кошки-мышки то потерпи, не сегодня.
>>535095
Привел бы примеры, а то трудно обсуждать. Я в симфони вижу очень много инкапсуляции, да и в Слиме есть немного.
Ну и есть тот факт что с сеттерами код больше. Вот в C# ты можешь создать поле и сеттер/геттер по умолчанию так:
string name { get; set; };
А в PHP надо поле + 2 функции написать. Ну что поделать.
>>535096
> Делегирование (фактически обертка над другим методом). В датаМаппере так хранится объект соединения с бд, и методы crud его используют.
Не, делегирование это когда вызывающая функция ничего не делает, только вызывает функцию и другого объекта. То есть не решает задачу, а делегирует ее решение кому-то другому.
Посмотри примеры кода: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
>>Это когда класс наследуется от нескольких сразу (в PHP нельзя)
> Зато можно реализовать много интерфейсов, или это не то?
Можно, но интерфейс это другое. Интерфейс это
какая-то способность, умение (выражающаяся в наличии методов).
Ну допустим у нас есть игра, и некоторые объекты в ней умеют стрелять (танк, солдат), а некоторые нет. Можно сделать интерфейс IArmed (вооруженный) c методом fire() и сделать чтобы эти классы его реализовали.
И когда ты захочешь потом написать функцию, которая принимаает любой стреляющий объект, ты можешь указть это в тайп-хинте:
function fireAtEverybody(IArmed $subject) { ... }}
А PHP гарантирует что у классов будет нужный метод и что в функию будет передан правильный объект. Ну и код получается самодокументирующий, сразу понятно что к чему.
> Вот это непонятно. Что-то типа "импорта"?
Да, только не class A, а trait A. Мануал почитай.
> Я что-то нигде не видел, чтобы эту фигню кто-то использовал,
Я тоже. В чистом ООП вместо трейтов используют либо интерфейс + методы, либо интерфейс + делегирование либо используют промежуточный объект:
с трейтом:
$obj->traitMethod();
с промежуточным объектом:
$obj->getSomething()->traitMethod();
> Что касается mixin, то это тоже самое что трейты, просто в реализации php?
Скорее трейт это (один из) способов реализации миксина в PHP.
ucfirst не работает с кириллицей в utf-8 и потому ненпригодна в современном мире. да вообще она с момента рождения была малопригодна.
>>534960
Ну и хорошо, только поищи статьи/уроки или мануал почитай чтобы уметь основными возможностями пользоваться.
>>534965
Можно и так и так. В больших проектах лучше конечно прайват.
Для доступа пишешь геттеры\сеттеры для каждого поля, у меня в редакторе для них макрос сделан: https://gist.github.com/codedokode/cd2f41c8dcf1237fde4b
> или создать метод который бы отдавал массив всех свойст
зачем нам массив когда есть объект?
>>534989
Гугли, лентяй. Регистрируйся и тестируй на своем опыте самые популярные хостиги, заодно можешь потом тут отписаться.
Также, если это на время, можно взять на пробу платный хостинг, у них часто дают бесплатный период.
>>535018
редактируешь у себя и выгружаешь через FTP/SFTP. Не надо ничего редактировать на хостинге. это плохая привычка.
>>535029
Для базы данных обычно отдельные реквизиты и пароль, задаются в админке хостинга при создании. Почитай FAQ, погугли. И проверь есть ли база на бесплатном тарифе.
>>535042
Дебиан советую, простой и минималистичный, можно поставить в виртуалке без графической оболочки и логиниться в него как в настоящий сервер.
Уроков и статей море, погугли, попробуй.
Паста от меня: https://gist.github.com/codedokode/420c8c12a1edae25f0ec
>>535050
В базе удобнее так как можно например одним запросом посчитать средний объем файла или найти самый маленький файл.
>>535058
да, с закрытыми свойствами код надежнее, но чуть больше по объему.
>>535063
Да, верно, файлы надо переименовывать, но так, чтобы админ мог потом понять где какой файл, потому не используйте случайные бессмысленные коды.
>>535091
Если ты файлообменник или кошки-мышки то потерпи, не сегодня.
>>535095
Привел бы примеры, а то трудно обсуждать. Я в симфони вижу очень много инкапсуляции, да и в Слиме есть немного.
Ну и есть тот факт что с сеттерами код больше. Вот в C# ты можешь создать поле и сеттер/геттер по умолчанию так:
string name { get; set; };
А в PHP надо поле + 2 функции написать. Ну что поделать.
>>535096
> Делегирование (фактически обертка над другим методом). В датаМаппере так хранится объект соединения с бд, и методы crud его используют.
Не, делегирование это когда вызывающая функция ничего не делает, только вызывает функцию и другого объекта. То есть не решает задачу, а делегирует ее решение кому-то другому.
Посмотри примеры кода: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
>>Это когда класс наследуется от нескольких сразу (в PHP нельзя)
> Зато можно реализовать много интерфейсов, или это не то?
Можно, но интерфейс это другое. Интерфейс это
какая-то способность, умение (выражающаяся в наличии методов).
Ну допустим у нас есть игра, и некоторые объекты в ней умеют стрелять (танк, солдат), а некоторые нет. Можно сделать интерфейс IArmed (вооруженный) c методом fire() и сделать чтобы эти классы его реализовали.
И когда ты захочешь потом написать функцию, которая принимаает любой стреляющий объект, ты можешь указть это в тайп-хинте:
function fireAtEverybody(IArmed $subject) { ... }}
А PHP гарантирует что у классов будет нужный метод и что в функию будет передан правильный объект. Ну и код получается самодокументирующий, сразу понятно что к чему.
> Вот это непонятно. Что-то типа "импорта"?
Да, только не class A, а trait A. Мануал почитай.
> Я что-то нигде не видел, чтобы эту фигню кто-то использовал,
Я тоже. В чистом ООП вместо трейтов используют либо интерфейс + методы, либо интерфейс + делегирование либо используют промежуточный объект:
с трейтом:
$obj->traitMethod();
с промежуточным объектом:
$obj->getSomething()->traitMethod();
> Что касается mixin, то это тоже самое что трейты, просто в реализации php?
Скорее трейт это (один из) способов реализации миксина в PHP.
Я думаю пикап это машина куда можно класть грузы сзади, но могу ошибаться.
У меня каждый раз показывает.
>>535114
правила каскадируются и одни правила переопределяют другие. Ты все рассмотрел?
Без примера кода или скриншота не понять.
Полосы прокрутки могут быть вызваны много чем, достаточно длинного слова или картинки, выходящего за край экрана.
Я с этой капчей уже на форче натренировался. нет.
>У тебя тут много ошибок и тебе надо начинать с более простых вещей, а не браться за сложное.
Укажи ошибки тогда. Честно говоря, задачи твои говно - мне их скучно решать. Да и описаны они хуево, я их также как этот решу, файлообменник хоть на ргхосте посмотреть можно. Лан, раз указывать ошибки не можешь, то пошел нахуй. Сам как-нибудь напишу и залью в портфолио.
Да не охота мне лишний цсс было подключать. Ты чужую лень вечно на незнание списываешь и звучишь, как высокомерный мудак.
?php if ($guestbook_messages): ?>
09.
<?php foreach ($guestbook_messages as $message): ?>
10.
11.
<?php if ($message['user_id']): ?>
12.
<p class="register_user_info">Пользователь:
13.
<a href="/users/<?=$message['user_id']?>.html">
14.
<?=htmlspecialchars($message['user_name'])?>
15.
</a>
16.
</p>
17.
<?php else: ?>
18.
<p class="anonim_user_info">Анонимный пользователь с IP <?=$message['user_ip']?></p>
19.
<?php endif; ?>
Read more: http://www.phpinfo.su/articles/practice/shablony_v_php.html#ixzz3jtNy8WvS
?php if ($guestbook_messages): ?>
09.
<?php foreach ($guestbook_messages as $message): ?>
10.
11.
<?php if ($message['user_id']): ?>
12.
<p class="register_user_info">Пользователь:
13.
<a href="/users/<?=$message['user_id']?>.html">
14.
<?=htmlspecialchars($message['user_name'])?>
15.
</a>
16.
</p>
17.
<?php else: ?>
18.
<p class="anonim_user_info">Анонимный пользователь с IP <?=$message['user_ip']?></p>
19.
<?php endif; ?>
Read more: http://www.phpinfo.su/articles/practice/shablony_v_php.html#ixzz3jtNy8WvS
Кстати, вот задачку можете порешать.
https://docviewer.yandex.ru/?url=ya-disk-public%3A%2F%2FhgmHJY7TBoclM%2FmgYkJgib%2BkBAnt2FlfAwHmxsuyVkc%3D&name=%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5.txt&c=55dd77b6cae1
Залей. Это будет лучшим свидетельством твоей безграмотности.
>>535175
Они там выглядят по-другому, не как у тебя
>>535215
Я вчера не успел проверить файлообменник и кошки-мышки. А без ответа чтобы их было легче найти.
>>535221
это обычный текстовый файл, где построчно записаны какие-то события.
https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB_%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8
> как они пишутся?
функциями работы с файлами типа fwrite
В задаче впрочем это не нужно.
2. Зачем использовать в небольших проектах дата маппер, ведь это только лишнее усложнение кода ибо запросы нечасто делаются.
Да я погуглил вакансии, ДС, там еще предлагали работу репетитором пхп по скайпу лол (МВК, ООП) 500 рэ час. Везде кстати на удаленке требуют наличие гарнитуры и живое общение голосом, а у меня мик хуевый и прям в вебке.
Кстати, вот в Magento-о таки прайват, гененрируються сами, а если не получается, то можно всегда по нейму вытащить, ОП-кун, кстати по карьере вопрос, уже 3 месяц работаю с Magento и немного Wordpreess, вктатиться в нормальные проекты с фреймворками можно будет потом? Сейчас посмотрел код Laravel кончил от него просто
1. Смотря какие цели. Тут бот должен имитировать браузер, значит нужен селениум (может быть патченный) или что-то аналогичное. Мы тут не обсуждаем разработку вредоносных программ, а для невредоносных вконтакте предоставляет АПИ: http://vk.com/dev
2. Чтобы научиться использовать дата маппер и чтобы начиться писать более аккаратный код. Даже в маленьком проекте работу с базой надо выносить отдельно. Я не хочу видеть уродливый код как в других учебниках, где авторы сами толком программировать не умеют.
Да и веб-приложения маленькие редко бывают. Маленькими бывают только учебные задания.
>>535233
time считает с точностью до секунды что слишком грубо. Лучше microtime(true) который возврващает дробное число (там точность зависит от ОС, на винде около 15 мс, на линуксе больше).
>>535232
Можно, почему нет?
>> Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.
>Там используется именно Lato (кстати, это переводится как «Лето») и он бесплатен для использования в вебе, о чем написано на сайте: http://www.latofonts.com/lato-free-fonts/
>Там же можно скачать архив с шрифтом в нужных форматах, уже сконвертированный.
Я скачал фотошоп, открыл им этот макет. И да я аутист и не знал что PSD это фотошоповский формат. Так же не знал что там все по слоям расписано. То есть я точные цифры размеров блоков, кнопок, шрифтов и т.д. могу там посмотреть спокойно. Пока сложновато еще, никогда фотошопом не пользовался, как раз из-за его сложности, но разберусь как-нибудь.
Я вчера уже начал переделывать макет, скачал этот шрифт, правда пришлось сделать два, так как в макете присутствует еще Lato Black, он какой-то сверхжирный и в папке с различными начертаниями шрифта Lаto его не было. В общем все сконвертировал, в КСС подключил и начал понемного изменять шрифты текста на сайте, но прервало то, что мой аккаунт на хостингере отключили, как и у всех остальных, и теперь ищу другое место куда загрузить. Не могу найти пока, перепробовал кучу бесплатных хостингов, но все не нравятся.
И еще, столкнулся с такой проблемой что размер шрифта в макете и на сайте не совпадает. Я специально смотрел в макете, чтобы точно такой же размер поставить и вот пример. В макете слова в шапке написаны 13pt, выставляю на сайте такой и слова просто огромными получаются. Ставлю 13 но не pt а px и уже вроде похоже на правду, но тоже не уверен. Гуглил таблицу переводов фотошоповских pt в px и фигню только нашел. Например 13pt там равны 17px. Выставил 17px и те же огромные слова получились. На глаз получается подбирать шрифт?
> так как в макете присутствует еще Lato Black
Это просто начертание с жирностью 900, сверхжирный. Я скачал архив на 22 Мб с оф сайта с веб-шрифтами и там он есть.
> Не могу найти пока, перепробовал кучу бесплатных хостингов, но все не нравятся.
Можешь попробовать github pages, бесплатно, без рекламы. Нужно умение пользоваться гитом (FTP там нет), но он тебе все равно в дальнейшнем понадобится:
https://pages.github.com/ (на можешь попробовать бинг транслейтом обработать)
Книга по гиту: https://git-scm.com/book/ru/v1
Ну или поищи что-нибудь еще.
> В макете слова в шапке написаны 13pt, выставляю на сайте такой
pt и px не путаешь? В CSS pt = 5/4 px. В обычном мире pt (пункт) это https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D1%83%D0%BD%D0%BA%D1%82
> В макете слова в шапке написаны 13pt, выставляю на сайте такой
Попробуй 13px ставить. Ну или на глаз подбери постепенно меняя размер. Ты еще помни что браузер можешь чуть по-другому рендерить шрифт потому идеально с фотошопом не совпадет все равно.
> но прервало то, что мой аккаунт на хостингере отключили
Ты можешь html файл сохранить на диск и в браузере смотреть же.
Просто в контроллере хуячишь гет пост и сокл запросы.
>Апи
вот это вот получается, что любой пидр может получить данные из моих соцсетей, пиздец. чем больше я узнаю о сети, тем больше мне плохеет.
>Это просто начертание с жирностью 900, сверхжирный.
А что писать в font-weight? Что то типа ExtraBold делал так в 1й раз, но переделал на два шрифта или 900 Откуда эта цифра 900 еще, понимаю что есть диапазон 100-900, но где указано что у Lato Black веса 900??
>Можешь попробовать github pages, бесплатно, без рекламы. Нужно умение пользоваться гитом (FTP там нет), но он тебе все равно в дальнейшнем понадобится:
За подсказку спасибо, ссылки сохранил, но пока что я пожалуй поищу еще хостинг.
Посмотрел там по гиту понятия не имею что это целый учебник, не хочу пока еще какой-то учебник читать. Лучше перейду к учебнику по яваскриптам.
>pt и px не путаешь?
Не думаю. Прикрепил пикчу.
И да, сайт макета работает уже. У меня было много бесплатных аккаунтов нарегано, нужно было 2 только оставить. Удалил лишние. Я это к тому, что можно посмотреть как выглядят слова в шапке. По моему даже 13 px там много. maketi.esy.es
магенто же платный. у них платформа прям на сайте.
Модели Active Record нарушаю принципы SOLID. В частности, принцип единой ответственности (SRP — «S» в принципах SOLID). Согласно принципу, доменный объект должен иметь только одну зону ответственности, то есть только свою бизнес-логику. Вызывая его для сохранения данных, вы добавляете ему дополнительную зону ответственности, увеличивая сложность объекта, что усложняет его поддержку и тестирование.
Реализации сохранения данных тесно связана с бизнес-логикой, а это означает, что если вы позже захотите использовать другую абстракцию для сохранения данных (например для хранения данных в XML-файле, а не в базе данных), то вам придется делать рефакторинг кода.
See? У датамаппера есть недостатки.
Но он становится то тонким то нормальным, если эти 2 фонт-фейса менять местами.
Потому, что я еще застал время, когда онямужники знали, что kde на freebsd надо ставтить на порты, а ты сосал хуй :c
»535237
Оп-кун, еще есть PhantomJs, не обязательно анонам учить приемы автоматизированного тестирования.
»535265
У них есть community edition, который бесплатный и есть тырпрайз, работаю с обеими, когда как. Кстати денег срубить можно много, а можно и попасть, если облажаешься жутко и отвественным сделают тебя, но ты лохом последним должен быть.
Оп, ты вот что мне подскажи, что лучше сделать в качестве учебного на Laravel, а то файлообеменик слишком просто, а банальные блоги тоже не сложно и уныло. Сайт с тестами делать не хочу, у меня нет так много времени.
http://ideone.com/BRxyii
http://ideone.com/HyfBsZ
http://ideone.com/pVKdWf
http://ideone.com/MfScps
http://ideone.com/2WdKog
http://ideone.com/tJujsL
http://ideone.com/4nb3tt
>Я вчера не успел проверить файлообменник и кошки-мышки. А без ответа чтобы их было легче найти.
Так ты ответишь позже?
Я не помню, чтоб он кого-то игнорировал. неОП
>Непонятно что ты хочешь сделать. ЧТо такое \\3 например?
Эта фигня в регулярках, номер строк после (.)
Т.е. \\3 это (\s|\n|[,.?!](\s|\n)|$)
Я хочу заменить ссылку на изображение вк на само изображение. У меня это получилось, но в конце ссылки приписывается блядское <br> с какого-то хера и всё ломает. Как ты можешь не знать регулярки? Это же азы.
> что я еще застал время, когда онямужники знали, что kde на freebsd надо ставтить на порты
С лурочки узнал?
захватывает его точка со звездочкой так как звездочка делает жадный поиск. стремясь найти максимум символов.
Твой скриншот инспектора вообще не в тему так как он не показывает исходный код HTML, а показывает распарсенное дерево DOM которое не совпадает с исходным кодом по разным причинам.
Также у тебя скорее всего там XSS которая позволяет злоумышленнику вствить произвольный HTMl код. Ты вообще неправильно делаешь, надо парсить исходное сообщение на узлы и их преобразоывать в HTMl а не лепить костыли с заменами на регулярках. Ты должен понимать где у тебя текст, а где HTMl код а я вижу что ты не понимаешь и думаешь что это одно и то же, хотя это не одно и то же. Например <b> как текст это 3 символа, а в HTML это тег.
Раньше на форумах пытались регулярками обрабатывать bb коды (разметку) и там всегда были уязвимости так как регулярки не заточены на работу с сложным кодом, где элементы могут быть вложены друг в друга.
Мне сейчас некогда обяъснять, как это сделать, но у меня нашлась картинка которая может быть поможет.
и приведу тебе еще один пример почему нельзя просто вставлять текст в HTML без преобразования:
Текст: /index.php?a=1©=1
HTML: /index.php?a=1&copy=1
Учел ли ты это в своем коде?
ОП, я тот кун с макетом и я не могу понять что там делать. Почитал уже и бред от яндекса про шрифты и много других статей. Ну не работает оно и все.
Да я уже все это сделал. Осталось только дописать удаление файла, его публичный доступ, вью, ссылки ну и красиво запихать это все в валидаторы и дата мапперы (что я буду делать в последнюю очередь, когда уже все будет работать).
В твоем случае, попробуй вес прописать не через слова типа lighter. а числом, и в font-face и в коде. Ну и проверь правильно ли везде выставлен вес и font-style.
> Откуда эта цифра 900 еще, понимаю что есть диапазон 100-900, но где указано что у Lato Black веса 900??
Тут например https://www.google.com/fonts/specimen/Lato
>В твоем случае, попробуй вес прописать не через слова типа lighter. а числом, и в font-face и в коде.
А я, как обычно, до этого сам не догадался. Сейчас будет сделано.
try {
$obj->thisMightThrowException();
$app->redirect('/success');
} catch(\Exception $e) {
$app->flash('error', $e->getMessage());
$app->redirect('/error');
}
});
Что делает thisMightThrowException(); в слиме? проверяет корректнось url? что это такое $obj?
>>535564
Все работает. Спасибо за ссылку. Выстроил по ней вес.
Доделал все шрифты которые там используются. Так же, так как у меня теперь есть фотошоп, а, следовательно, и точные размеры элементов, я кое-что переделал, например кнопки теперь размером как и на макете. Правда там есть небольшая разница, потому что размеры реальные имеют например такой вид 148,21312412 px, их я округлял, но это совсем незаметно.
Проверить работу можно на прежнем месте http://maketi.esy.es/
>br в верстке это 100% признак незнания CSS
Из шаблонов Yii
<div id="footer">
Copyright © <?php echo date('Y'); ?> by My Company.<br/>
All Rights Reserved.<br/> <!-- еще и с xml-ным слешом -->
<?php echo Yii::powered(); ?>
</div><!-- footer -->
Макаров быдло-боберкодер получается? Тогда кто я?
И чем плох <br>?
Я понимаю, когда весь шаблон испещрен этими брейками вместо использования блочных элементов. Но один разок вставить перенос мне кажется не грешно, чем тыкать два дополнительных дива или параграфа.
По делу: прикрутил twig к yii, обошлось почти без печальных последствий. Вопрос по этой строке из конфига 'fileExtension' => '.twig'
Для чего шаблонизаторы используют собственные расширения? У твига это .twig, у смарти .tpl
На что это влияет? Может на удобство поиска по файловой системе, или еще что?
На всякий случай интересуюсь, вдруг это важно, может есть какие-то соглашения по этому вопросу. По умолчанию yii не использует сторонние шаблонизаторы, так что я выставил эту настройку в .php, буду сохранять шаблоны под стандартным расширением, если не всплывет никаких подводных камней.
По синтаксису twig: как из него получить доступ к константам например? <?php echo __FILE__; ?> Как это прописать в твиг?
Я не робот. Спасибо абу.
Да он какой-то поехавший реально. До каждой запятой и закорючки доебывается.
Ты долбоеба кусок, этот код я скопировал из ОФИЦИАЛЬНОГО руководства слима. http://docs.slimframework.com/routing/helpers/
>>Ты долбоеба кусок
Потише, братишка, в этой ситуации.
Касательно кода: это просто абстрактный пример. На примере этого куска объясняют работу методов halt(), pass(), redirect() ,stop(). thisMightThrowException дословно переводится этоМожетВызватьИсключение. Подразумевается, что это какой-то метод, который может вызвать исключение.
function myAutoloader($class)
{
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
include $file;
}
}
spl_autoload_register('myAutoloader');
Про неймспейсы почитай.
Если ты юзаешь такую поебень, то у тебя стопудово неправильная архитектура. Классам не нужны никакие альясы, есть же неймспейсы, есть трейты, есть наследование и интерфейсы, абстрактные классы в конце концов. Всего этого с головой хватает, чтобы без таких костылей обходиться.
Я юзаю просто для того, чтобы писать не StudentMapper а SM, чтоб проще читалось и понималось.
Если ты работаешь один, то конечно можно как писать как угодно.
Но если будешь устраиваться в хорошую контору, то коллегам подобное "упрощение" может очень не понравиться.
Гугли на хабре есть примеры разбора ActiveRecord and DataMapper. Плюс погугли паттерн DAO в java
Извини анон, кое-что прояснилось, но это привело к ещё большему количеству вопросов. Оказывается мне парсит не саму комнату, а страницу входа в неё (хотя на этом браузере я уже в ней нахожусь). Но войти в неё я не могу, через ту странице где я открыл её спарсенный вариант, так как при нажатии кнопки переводит на страницу
адрес_моего_денвер/login а надо адерсчата/login и дальше адресчата/room как это сделать? Если это сделать то дальше можно будет запускать скрипт каждые 30 секунд и парсить все сообщения.
> br в верстке это 100% признак незнания CSS.
> div в верстке это 100% признак незнания JS.
> html в верстке это 100% признак незнания PHP.
есть скрипт, с бесконечным циклом, работает на линуксе
подключена база
та вот, через часов 5 работы скрипта выводит варнинги-Warning: mysql_fetch_array() expects parameter 1
$g = mysql_fetch_array(mysql_query("SELECT * FROM `stat` WHERE id='1'"));
в папке classes очевидно же.
Сделай проверку в бесконечном цикле, чтобы считал время и перезапускался каждые 4 часа.
бля, это настолько тупой вопрос, что я даже не знаю, попробуй оба и посмотри результат.
> Макаров быдло-боберкодер получается?
Просто плохо знает HTML/CSS. Он же не верстальщик в конце-концов. Следовательно, приводить его версту как образец точно не стоит.
Все же br это плохо. CSS предоставляет свойство display: block для вертикального расположения элементов. Более того, мы можем сверстать этот код лучше.
Вот это читается так: «тут строка, затем перевод строки, затем еще строка, затем перевод строки» (я выкинул одну из строк для упрощения примера)
Copyright 2015 by My Company.<br/>
Powered by YIi.<br/>
А вот это как «тут идет копирайт, затем информация о фреймворке»:
<div class="footer-copyright">Copyright 2015 by My Company.</div>
<div class="footer-powered-by">Powered by Yii.</div>
Нужны ли тебе пояснения почему второй пример лучше?
— разметка во втором примере не задает отображение текста, она описывает его смысл, чем является этот текст
— разметка во втором примере позволяет нам с помощью CSS позиционировать текст как угодно, хот вертикально, хоть одной строкой (ибо 3 строки в футере это перебор).
Верстать с помощью <br> это то же самое что в ворде выравнивать текст пробелами. HTML задумывался чтобы его использовали как во втором примере.
Заметь, что я выкинул одну из 3 строк. Если надо ее вернуть, я бы сделал так:
<div class="footer-copyright">Copyright 2015 by My Company. <br>All Rights Reserved.</div>
<div class="footer-powered-by">Powered by Yii.</div>
Либо так:
<div class="footer-copyright">
<p>Copyright 2015 by My Company.</p>
<p>All Rights Reserved.</p>
</div>
<div class="footer-powered-by">Powered by Yii.</div>
Так как «all rights reserved» это часть заявления об авторских правах.
> Для чего шаблонизаторы используют собственные расширения? У твига это .twig, у смарти .tpl
расширение обычно обозначает тип файла так что это логично. Плюс, это позволяет в ОС выводить разные иконки для файлов и открывать разные программы при двойном клике, это позволяет редактору выбирать нужную схему подсветки и автодополнения.
> На всякий случай интересуюсь, вдруг это важно, может есть какие-то соглашения по этому вопросу.
Принято называть твиговские файлы с расширением twig. В Симфони даже пишут file.html.twig чтобы показать что это HTML-шаблон. Так что не придумывай своих вариантов.
> как из него получить доступ к константам например?
{% set HELLO = constant('HELLO') %}
http://twig.sensiolabs.org/doc/tests/constant.html
> так что я выставил эту настройку в .php, буду сохранять шаблоны под стандартным расширением, если не всплывет никаких подводных камней.
Ты только путаешь читателя. В каком месте в twig шаблоне содержится PHP код?
>>535409
Отвечу.
>>535627
Нельзя числа использовать в енумах, погугли, алсо с такой манерой задавать вопросы ты можешь не дождаться на них ответа.
>>535646
Значит в официальном руководстве Слима несовершенный код. Возможно автор не очень хорошо знает исключения, но у тебя-то есть доступ к уроку про них: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
>>535673
Поставь там echo или var_dump который выведет имя класса и имя файла который ты пытаешься подключить, а также сработал if или нет.
>>535696
> , в моем коде куча использования class_alias(), который облегчает жизнь,
как? Я не видел код, но по моему ты делаешь что-то неправильно.
> Хост плохой или class_alias чем-то заменить?
Ищи другой хостинг, хотя по моему лучше не использовать эту функцию.
>>535697
Указание что класс в корневом неймспейсе: https://www.google.ru/search?q=php+%D0%BD%D0%B5%D0%B9%D0%BC%D1%81%D0%BF%D0%B5%D0%B9%D1%81%D1%8B&oq=php+%D0%BD%D0%B5%D0%B9%D0%BC%D1%81%D0%BF%D0%B5%D0%B9%D1%81%D1%8B&aqs=chrome..69i57j0l5.3349j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
Алсо, вот вещи которые я научился распознавать с первого раза: указатели (на самом деле дорожные знаки), капуста, пончики (они круглые и с дыркой). Алсо капча истекает где-то через минуту если пост не отправить.
> Макаров быдло-боберкодер получается?
Просто плохо знает HTML/CSS. Он же не верстальщик в конце-концов. Следовательно, приводить его версту как образец точно не стоит.
Все же br это плохо. CSS предоставляет свойство display: block для вертикального расположения элементов. Более того, мы можем сверстать этот код лучше.
Вот это читается так: «тут строка, затем перевод строки, затем еще строка, затем перевод строки» (я выкинул одну из строк для упрощения примера)
Copyright 2015 by My Company.<br/>
Powered by YIi.<br/>
А вот это как «тут идет копирайт, затем информация о фреймворке»:
<div class="footer-copyright">Copyright 2015 by My Company.</div>
<div class="footer-powered-by">Powered by Yii.</div>
Нужны ли тебе пояснения почему второй пример лучше?
— разметка во втором примере не задает отображение текста, она описывает его смысл, чем является этот текст
— разметка во втором примере позволяет нам с помощью CSS позиционировать текст как угодно, хот вертикально, хоть одной строкой (ибо 3 строки в футере это перебор).
Верстать с помощью <br> это то же самое что в ворде выравнивать текст пробелами. HTML задумывался чтобы его использовали как во втором примере.
Заметь, что я выкинул одну из 3 строк. Если надо ее вернуть, я бы сделал так:
<div class="footer-copyright">Copyright 2015 by My Company. <br>All Rights Reserved.</div>
<div class="footer-powered-by">Powered by Yii.</div>
Либо так:
<div class="footer-copyright">
<p>Copyright 2015 by My Company.</p>
<p>All Rights Reserved.</p>
</div>
<div class="footer-powered-by">Powered by Yii.</div>
Так как «all rights reserved» это часть заявления об авторских правах.
> Для чего шаблонизаторы используют собственные расширения? У твига это .twig, у смарти .tpl
расширение обычно обозначает тип файла так что это логично. Плюс, это позволяет в ОС выводить разные иконки для файлов и открывать разные программы при двойном клике, это позволяет редактору выбирать нужную схему подсветки и автодополнения.
> На всякий случай интересуюсь, вдруг это важно, может есть какие-то соглашения по этому вопросу.
Принято называть твиговские файлы с расширением twig. В Симфони даже пишут file.html.twig чтобы показать что это HTML-шаблон. Так что не придумывай своих вариантов.
> как из него получить доступ к константам например?
{% set HELLO = constant('HELLO') %}
http://twig.sensiolabs.org/doc/tests/constant.html
> так что я выставил эту настройку в .php, буду сохранять шаблоны под стандартным расширением, если не всплывет никаких подводных камней.
Ты только путаешь читателя. В каком месте в twig шаблоне содержится PHP код?
>>535409
Отвечу.
>>535627
Нельзя числа использовать в енумах, погугли, алсо с такой манерой задавать вопросы ты можешь не дождаться на них ответа.
>>535646
Значит в официальном руководстве Слима несовершенный код. Возможно автор не очень хорошо знает исключения, но у тебя-то есть доступ к уроку про них: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
>>535673
Поставь там echo или var_dump который выведет имя класса и имя файла который ты пытаешься подключить, а также сработал if или нет.
>>535696
> , в моем коде куча использования class_alias(), который облегчает жизнь,
как? Я не видел код, но по моему ты делаешь что-то неправильно.
> Хост плохой или class_alias чем-то заменить?
Ищи другой хостинг, хотя по моему лучше не использовать эту функцию.
>>535697
Указание что класс в корневом неймспейсе: https://www.google.ru/search?q=php+%D0%BD%D0%B5%D0%B9%D0%BC%D1%81%D0%BF%D0%B5%D0%B9%D1%81%D1%8B&oq=php+%D0%BD%D0%B5%D0%B9%D0%BC%D1%81%D0%BF%D0%B5%D0%B9%D1%81%D1%8B&aqs=chrome..69i57j0l5.3349j0j7&sourceid=chrome&es_sm=0&ie=UTF-8
Алсо, вот вещи которые я научился распознавать с первого раза: указатели (на самом деле дорожные знаки), капуста, пончики (они круглые и с дыркой). Алсо капча истекает где-то через минуту если пост не отправить.
Лезть в файл, создавать стайлс.цсс, подключать его в хедере только чтобы поставить паддинг в 10 пикселей, когда можно было поставить br
Лучше наверно обратиться к первоисточнику (точнее переводу) и сравнить картинки:
Data Mapper:
http://martinfowler.com/eaaCatalog/dataMapper.html
http://design-pattern.ru/patterns/data-mapper.html
TableDataGateway:
http://martinfowler.com/eaaCatalog/tableDataGateway.html
http://design-pattern.ru/patterns/table-data-gateway.html
Я вижу разницу в том, что DataMapper заточен больше на работу с объектом Person: методы insert/update/select все принимают или возвращают этот объект. А вот TableDataGateway в общем может работать и без объекта, посмотри на методы insert/update.
> A Table Data Gateway holds all the SQL for accessing a single table or view: selects, inserts, updates, and deletes. Other code calls its methods for all interaction with the database.
TableDataGateway это класс, содержащий все SQL запросы. То есть каждый метод в нем обычно содержит 1 запрос на получение или изменение данных в базе. Для каждой таблицы делается обычно свой класс TDG, унаследованный от общего предка.
Например в TDG может быть такой метод обновления текста поста:
$tdg->updatepostText($postId, $newText);
Очевидно что в нем скрыт запрос UPDATE posts SET text = ? WHERE id = ?.
> The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other
DataMapper это штука которая мапит (отображает, сопоставляет) объекты в приложении и строки таблиц. Она пытается создать абстракцию, как будто никакой базы нет, и все объекты лежат где-то в памяти. Тебе (в идеальном случае) не надо писать SQL код и вообще знать что база существует. То есть это более сложная штука.
В DM ты обновляешь пост примерно так:
$post = $postRepository->findById($postId);
$post->setText($newText);
$entityManager->flush(); // сбросить изменения в объектах в памяти в базу данных (что именно изменилось, определяется автоматически)
Как видишь в данном случае мы переложили работу по составлению SQL запроса на железяку, а сами работаем с обычным объектом, как будто бы никакой базы и нет. В данном примере ты можешь не увидеть преимуществ (плохо если так), но представь если например ты обрабатываешь массив объектов из разных таблиц, связанных с друг другом, вручную писать запросы на их загрузку и сохранение займет время и сделает код громоздким.
Вот другой пример чем DM отличается от TDG:
$post = $postRepository->findById(10); // делает запрос SELECT
$post2 = $postRepository->findById(10); // возвращает указатель на тот же объект что и $post
То есть DM с помощью Identity Map обеспечивает наличие ровно одного объекта для одной строки в таблице. А вот TDG таких гарантий не дает, так как устроен примитивнее.
То есть DM гораздо более сложная штука, чтобы последняя строчка работала как надо, нужна куча кода за ней, которая сравнит загруженные в память объекты с исходными данными и сгенерирует нужные INSERT/UPDATE/DELETE запросы.
Примером DM является доктрина 2. Если ты ее изучишь, я думаю ты осознаешь что именно есть в DM.
Как минимум это включает, кроме приведенного выше, еще поддержку работы с отношениями между таблицами и ленивую загрузку связанных объектов при обращении к ним.
Первоисточник вообще это книга Фаулера «Паттерны (шаблоны) проектирования корпоративных приложений». Можешь попробовать почитать как-нибудь, хотя она рассчитана на людей с опытом.
Лучше наверно обратиться к первоисточнику (точнее переводу) и сравнить картинки:
Data Mapper:
http://martinfowler.com/eaaCatalog/dataMapper.html
http://design-pattern.ru/patterns/data-mapper.html
TableDataGateway:
http://martinfowler.com/eaaCatalog/tableDataGateway.html
http://design-pattern.ru/patterns/table-data-gateway.html
Я вижу разницу в том, что DataMapper заточен больше на работу с объектом Person: методы insert/update/select все принимают или возвращают этот объект. А вот TableDataGateway в общем может работать и без объекта, посмотри на методы insert/update.
> A Table Data Gateway holds all the SQL for accessing a single table or view: selects, inserts, updates, and deletes. Other code calls its methods for all interaction with the database.
TableDataGateway это класс, содержащий все SQL запросы. То есть каждый метод в нем обычно содержит 1 запрос на получение или изменение данных в базе. Для каждой таблицы делается обычно свой класс TDG, унаследованный от общего предка.
Например в TDG может быть такой метод обновления текста поста:
$tdg->updatepostText($postId, $newText);
Очевидно что в нем скрыт запрос UPDATE posts SET text = ? WHERE id = ?.
> The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other
DataMapper это штука которая мапит (отображает, сопоставляет) объекты в приложении и строки таблиц. Она пытается создать абстракцию, как будто никакой базы нет, и все объекты лежат где-то в памяти. Тебе (в идеальном случае) не надо писать SQL код и вообще знать что база существует. То есть это более сложная штука.
В DM ты обновляешь пост примерно так:
$post = $postRepository->findById($postId);
$post->setText($newText);
$entityManager->flush(); // сбросить изменения в объектах в памяти в базу данных (что именно изменилось, определяется автоматически)
Как видишь в данном случае мы переложили работу по составлению SQL запроса на железяку, а сами работаем с обычным объектом, как будто бы никакой базы и нет. В данном примере ты можешь не увидеть преимуществ (плохо если так), но представь если например ты обрабатываешь массив объектов из разных таблиц, связанных с друг другом, вручную писать запросы на их загрузку и сохранение займет время и сделает код громоздким.
Вот другой пример чем DM отличается от TDG:
$post = $postRepository->findById(10); // делает запрос SELECT
$post2 = $postRepository->findById(10); // возвращает указатель на тот же объект что и $post
То есть DM с помощью Identity Map обеспечивает наличие ровно одного объекта для одной строки в таблице. А вот TDG таких гарантий не дает, так как устроен примитивнее.
То есть DM гораздо более сложная штука, чтобы последняя строчка работала как надо, нужна куча кода за ней, которая сравнит загруженные в память объекты с исходными данными и сгенерирует нужные INSERT/UPDATE/DELETE запросы.
Примером DM является доктрина 2. Если ты ее изучишь, я думаю ты осознаешь что именно есть в DM.
Как минимум это включает, кроме приведенного выше, еще поддержку работы с отношениями между таблицами и ленивую загрузку связанных объектов при обращении к ним.
Первоисточник вообще это книга Фаулера «Паттерны (шаблоны) проектирования корпоративных приложений». Можешь попробовать почитать как-нибудь, хотя она рассчитана на людей с опытом.
За счет абстракции от базы данных DM позволяет делать более универсальный и просто код. ПРедставь например что у нас есть база Сотрудников и Департаменов из задачи Вектор. Представь, что надо написать функцию, дающую премию при условии что человек сотрудник 1 ранга из отдела маркетинга. Вот как ее можно написать:
function giveAward(Employee $emp)
{
if ($emp->getRank() == 1 &&
$emp->getDepartment()->getType() == Department::TYPE_MARKETING) {
$emp->giveAward();
}
}
Как видишь, эта функция никак не привязана к базе данных. Она просто работает с объектом в памяти, и ей можно подсунуть как обычные объекты из той задачи, так и привязанные к базе с помощью Data Mapper объекты. Заметь, что тут нет ни строки SQL кода и ничего что бы вообще указывало на наличие базы. Это пример кода к которому ты должен стремиться.
Заметь так же что функция getDepartment() автоматически найдет и подгрузит из базы объект-департамент при первом обращении к ней.
Вот код обработки всех сотрудников с помощью DM:
$employees = $empRepository->findAll(); // загружаем все объекты-сотрудники и надеемся что их не очень много и они влезут в память
foreach ($employees as $emp) {
giveAward($emp);
}
$em->flush(); // сбрасываем изменения в базу
С другой стороны, если тебе надо обработать большую таблицу работников, то с DM мы вынуждены грузить их в память и поверь уже на 10 000 памяти будет отъедаться много. Да еще и время процессорное потратится. Через ТDG это будет намного быстрее работать, а память почти не нужна:
function giveAwardsToEmployeees()
{
$this->pdo->prepare("UPDATE employees e SET money = money + ? WHERE e.departmentId = ? AND e.rank = 1 ");
....
}
Грамотный разработчик должен понимать преимущества обоих подходов и уметь выбирать по ситуации.
За счет абстракции от базы данных DM позволяет делать более универсальный и просто код. ПРедставь например что у нас есть база Сотрудников и Департаменов из задачи Вектор. Представь, что надо написать функцию, дающую премию при условии что человек сотрудник 1 ранга из отдела маркетинга. Вот как ее можно написать:
function giveAward(Employee $emp)
{
if ($emp->getRank() == 1 &&
$emp->getDepartment()->getType() == Department::TYPE_MARKETING) {
$emp->giveAward();
}
}
Как видишь, эта функция никак не привязана к базе данных. Она просто работает с объектом в памяти, и ей можно подсунуть как обычные объекты из той задачи, так и привязанные к базе с помощью Data Mapper объекты. Заметь, что тут нет ни строки SQL кода и ничего что бы вообще указывало на наличие базы. Это пример кода к которому ты должен стремиться.
Заметь так же что функция getDepartment() автоматически найдет и подгрузит из базы объект-департамент при первом обращении к ней.
Вот код обработки всех сотрудников с помощью DM:
$employees = $empRepository->findAll(); // загружаем все объекты-сотрудники и надеемся что их не очень много и они влезут в память
foreach ($employees as $emp) {
giveAward($emp);
}
$em->flush(); // сбрасываем изменения в базу
С другой стороны, если тебе надо обработать большую таблицу работников, то с DM мы вынуждены грузить их в память и поверь уже на 10 000 памяти будет отъедаться много. Да еще и время процессорное потратится. Через ТDG это будет намного быстрее работать, а память почти не нужна:
function giveAwardsToEmployeees()
{
$this->pdo->prepare("UPDATE employees e SET money = money + ? WHERE e.departmentId = ? AND e.rank = 1 ");
....
}
Грамотный разработчик должен понимать преимущества обоих подходов и уметь выбирать по ситуации.
Ты превращаешь свой код в нечитаемую кашу. Как это расшифровывать? Откуда я узнаю что значит SM? Ты предлагаешь мне перед чтением кода прочесть и выучить наизусть словарь сокращений? Боюсь, у меня нет на это времени как и у твоих будущих коллег, которым придется читать твой код.
Не делай так. Также, там в коде имя класса приходится писать всего 1 или 2 раза, в bootstrap.php. Почему это тебе приходится писать его чаще, а? Ты уверен что все правильно делаешь?
Ну и в конце концов, может пора уже начать использовать IDE с автодополнением?
>>535769
Почти эквивалентна (результат дает такой же хотя внутри работает чуть по другому).
Первый вариант приписывает строку к сущестующей строке, второй создает временную строку и сохраняет ее в переменную.
>>535779
Бред же. Или ты пошутить неуклюже пытался?
>>535796
Соединение разрывается наверно. Алсо функции mysql_ устарели, зачем ты по древним учебникам учишься?
>>535835
Там ведь уже создан и подключен, что ты глупость пишешь? Алсо есть еще тег style.
Самое важное что исплоьзуют br те кто не понимают концепцию HTML/CSS, как они работают. Так же как некоторые пользователи ворда не понимают форматирование и отступы.
Ты превращаешь свой код в нечитаемую кашу. Как это расшифровывать? Откуда я узнаю что значит SM? Ты предлагаешь мне перед чтением кода прочесть и выучить наизусть словарь сокращений? Боюсь, у меня нет на это времени как и у твоих будущих коллег, которым придется читать твой код.
Не делай так. Также, там в коде имя класса приходится писать всего 1 или 2 раза, в bootstrap.php. Почему это тебе приходится писать его чаще, а? Ты уверен что все правильно делаешь?
Ну и в конце концов, может пора уже начать использовать IDE с автодополнением?
>>535769
Почти эквивалентна (результат дает такой же хотя внутри работает чуть по другому).
Первый вариант приписывает строку к сущестующей строке, второй создает временную строку и сохраняет ее в переменную.
>>535779
Бред же. Или ты пошутить неуклюже пытался?
>>535796
Соединение разрывается наверно. Алсо функции mysql_ устарели, зачем ты по древним учебникам учишься?
>>535835
Там ведь уже создан и подключен, что ты глупость пишешь? Алсо есть еще тег style.
Самое важное что исплоьзуют br те кто не понимают концепцию HTML/CSS, как они работают. Так же как некоторые пользователи ворда не понимают форматирование и отступы.
Тебе надо изучить HTTP, HTML и JS наверно сначала, если ты не понимаешь как работает чат и как обменивается данными, то тебе рано писать такие скрипты. Алсо используй Chrome Webtools чтобы посмотреть как он устроен.
> лезть в другие файлы, читать мануалы, писать какие-то классы и отделять HTML от PHP, когда можно просто написать echo '<div>', mysql_fetch_query("SELECT name FROM user WHERE id = $_POST[id]"); как учили в видеокурсах на ютубе
function myAutoloader($class)
{
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
include $file;
}
}
spl_autoload_register('myAutoloader');
> функции mysql_ устарели
Знаю, слышал, но не понимаю из-за чего? Много букав читать не хочется, кратко объясни
Потому что так написано в мануале (открывал ли ты его?)
http://php.net/manual/ru/function.mysql-query.php
http://php.net/manual/ru/faq.databases.php#faq.databases.mysql.deprecated
Полная история на англ:
https://wiki.php.net/rfc/mysql_deprecation#why
Библиотека которую они используют старая и в ней не очень хороший код. Она написана 15 лет назад, почти не обновляется и в ней нет например тех же плейсхолдеров, что в сочетании с кучей неграмотных уроков в сети побуждает людей быдлокодить и вставлять переменные прямо в запрос.
Про старые туториалы отдельно написано:
> There are thousands of tutorials out there that teach users PHP using ext/mysql. Many of these tutorials also teach other outdated practices, such as magic quotes, improper (or no) escaping of user input and use of register globals, but undoubtedly some are also still of value. Removing ext/mysql in future will make these tutorials at best useless, and at worst, impediments to PHP takeup.
function save(Enrollee $enrollee) {
try{
$sql = "INSERT INTO students (name, surname, sex, group, email, points, birth, phone, nonresident)
VALUES (:name, :surname, :sex, :group, :email, :points, :birth, :phone, :nonresident)";
$stmt = $this->pdo->prepare($sql);
//var_dump((array)$enrollee);
$stmt->execute((array)$enrollee);
} catch (PDOException $e) {
print_r($e->getMessage());
}
}
Читаю в этот мануал: http://habrahabr.ru/post/137664/
Не понятно, последовательность prepare->bind->execute обязательна для запроса с placeholder'ами?
Ошибка вот такая: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined.
Кол-во параметров и свойств совпадает, названия тоже.
Выглядит интересно, например мастер-класс по nginx проводит его автор (Игорь Сысоев), раньше он был сисдамином в Рамблеме, а сейчас у него компания, которая этот самый nginx (точнее поддержку) продает крупным корпорациям.
А в каком месте она определена, поясни? Может к этому коду еще что-то допистать надо?
при вар дампе выводит пустоту вместо имени класса.
> Не понятно, последовательность prepare->bind->execute обязательна для запроса с placeholder'ами?
bind можно не делать если ты массив передаешь в execute.
> Кол-во параметров и свойств совпадает, названия тоже.
А можно пруф, например сделай var_dump массива который ты передаешь в execute.
Ну и ты плохую идею придумал, объект превращать в массив. Где это такому учат? Не в нашем треде точно. Например как ты собрался гарантировать что никто никогда не добавит в этот класс новое поле, которое не сохраняется в базу?
Нет такого, что число полей в объекте всегда равно числу колонок в таблице. Могут быть добавлены новые поля. которые не соответсвуют колонкам.
Логичнее сделать список полей и по этому списку циклом забрать поля из объекта и перенести в массив.
Также, по моему в массиве должны быть ключи с двоеточием в начале, точно так же как и записано в запросе. Уточни этот момент в мануале.
> function myAutoloader($class)
$class в скобках очевидно значит что в функции всегда есть переменная $class и она хранит первый переданный функции аргумент. Ты не прогулял ли урок по функциям?
Или ты пытаешься сдампить переменную снаружи функции?
ОП, скажи пожалуйста, будут еще какие-нибудь комментарии насчет макета? Ну там исправлять нужно еще что-нибудь? Или уже все, можно забыть о нем и переходить к следующим работам спокойно, не отвлекаясь на него.
>var_dump
делал ранее и не заметил, что он как то косячно преобразовал имена полей(на пикрелейтед)
>Ну и ты плохую идею придумал, объект превращать в массив. Где это такому учат? Не в нашем треде точно. Например как ты собрался гарантировать что никто никогда не добавит в этот класс новое поле, которое не сохраняется в базу?
Я об этом еще не думал, но я понял что ты хочешь сказать - делать максимально универсальный/масштабируемый код. Но ведь мапперы в таком маленьком приложении не нужны, во всяком случае мне пока сложно понять зачем. Позже начну повторять java и почитаю что-нибудь по паттернам/UML.
а хуй знает, возьми слим, там есть bindparameters (правда у меня тоже не сработали эти плейсхолдеры).
ват? откуда вообще эта переменная $class берется, он открывает папку классс и считывает тоже оттуда файл и пишет его имя в $class? наверное у меня просто пхп 4, а не 5 не работает. Или нужно дополнительно вызывать function myAutoloader(вот тут пишем имя класса)? или пееменная класс берется при создни объекта $obj = new $class?
>Также, у тебя там встречается 2 раза imagecreatetruecolor. Я думаю, картинку можно создавать только один раз. А обрезку реализовать указанием координат и размера вырезаемой из исходной картинки области.
Так и сделал. Но теперь результат другой, я не уверен, что правильный. Первая пикча - результат кропа по первому алгоритму, вторая - то, как обрезается сейчас. Третья - исходное изображение.
max-size пропиши, хуле хуйней страдаешь.
>делал ранее и не заметил, что он как то косячно преобразовал имена полей(на пикрелейтед)
разобрался, а дело было вот в чем:
>Если вы преобразуете в массив объект (object), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: целочисленные свойства станут недоступны; к закрытым полям класса (private) спереди будет дописано имя класса; к защищенным полям класса (protected) спереди будет добавлен символ '*'. Эти добавленные значения с обоих сторон также имеют нулевые байты.
Для private/protected полей при преобразовании в массив в имена добавляются нечитаемые коды: http://php.net/manual/ru/language.types.array.php#language.types.array.casting
> Но ведь мапперы в таком маленьком приложении не нужны, во всяком случае мне пока сложно понять зачем
Мапперы там чтобы научиться их использовать, с моделями и чтобы приучить к мысли что SQL код должен быть в отдельном классе. Да и как без мапперов? у тебя же все равно где-то будет написан SQL код, почему бы не засунуть его в маппер.
> делать максимально универсальный/масштабируемый код.
В данном случае решение с преобразованием в массив как мы видим, вообще не работает. Но ты понял верно, ведь в реальном проекте код может писать не один человек. и его могут дорабатывать позже и он не должен ломаться от малейших изменений.
>>535909
Слим тут вобще не причем, ты что-то путаешь. Это был вопрос про PDO.
>>535911
Ты понимаешь что ты пишешь? Это автозагрузчик классов. PHP при обращении к несуществующему классу вызывает его, передавая имя класса первым аргументом. И дает шанс подключить нужный файл прежде чем вывести ошибку о несуществующем классе.
> откуда вообще эта переменная $class берется,
Ее передает PHP когда вызывает твою функцию-автозагрузчик. Он передает имя класса для того чтоьы твоя функция поняла какой файл нужно подключить.
> он открывает папку классс и считывает тоже оттуда файл и пишет его имя в $class?
Кто он? PHP? Он вообще ничего про твою папку не знает.
> наверное у меня просто пхп 4
В нем и spl_register_autoloader нет, да и ты можешь проверить версию командой phpinfo();
> Или нужно дополнительно вызывать function myAutoloade
Нужно понимать что ты пишешь и для чего. Почитай где-нибудь теорию про автозагрузку, например
http://habrahabr.ru/post/136761/
(если там плохо объяснено то попробуй сам подумать).
>>535912
Вторая пикча явно неправильная. При кропе мы вырезаем кусок, который по высоте содержит всю картинку, а по ширине ее середину, первая пикча выглядит правильнее.
Это значит что ты неправильно высчитываешь координаты и размер области на исходной картинке для вырезания.
Логика должна быть такая:
- у нас есть размер превьюшки, pw/ph
- у нас есть размер исходной картинки w/h
- из них вычисляем во сколько раз мы уменьшим картинку, scale, заодно проверяя не выйдет ли у нас увеличение вместо уменьшения
- получаем окончательный размер превьюшки (она может стать меньше если исходная картинка очень маленькая)
- из этих данных мы вычисляем размер вырезаемой области на исходной картинке, sw/sh
- из них мы вычисляем расположение вырезаемой области на исходной картинке, sx/sy
Имея sw/sh/sx/sy мы создаем превьюшку и переносим на нее кусок картинки.
Для private/protected полей при преобразовании в массив в имена добавляются нечитаемые коды: http://php.net/manual/ru/language.types.array.php#language.types.array.casting
> Но ведь мапперы в таком маленьком приложении не нужны, во всяком случае мне пока сложно понять зачем
Мапперы там чтобы научиться их использовать, с моделями и чтобы приучить к мысли что SQL код должен быть в отдельном классе. Да и как без мапперов? у тебя же все равно где-то будет написан SQL код, почему бы не засунуть его в маппер.
> делать максимально универсальный/масштабируемый код.
В данном случае решение с преобразованием в массив как мы видим, вообще не работает. Но ты понял верно, ведь в реальном проекте код может писать не один человек. и его могут дорабатывать позже и он не должен ломаться от малейших изменений.
>>535909
Слим тут вобще не причем, ты что-то путаешь. Это был вопрос про PDO.
>>535911
Ты понимаешь что ты пишешь? Это автозагрузчик классов. PHP при обращении к несуществующему классу вызывает его, передавая имя класса первым аргументом. И дает шанс подключить нужный файл прежде чем вывести ошибку о несуществующем классе.
> откуда вообще эта переменная $class берется,
Ее передает PHP когда вызывает твою функцию-автозагрузчик. Он передает имя класса для того чтоьы твоя функция поняла какой файл нужно подключить.
> он открывает папку классс и считывает тоже оттуда файл и пишет его имя в $class?
Кто он? PHP? Он вообще ничего про твою папку не знает.
> наверное у меня просто пхп 4
В нем и spl_register_autoloader нет, да и ты можешь проверить версию командой phpinfo();
> Или нужно дополнительно вызывать function myAutoloade
Нужно понимать что ты пишешь и для чего. Почитай где-нибудь теорию про автозагрузку, например
http://habrahabr.ru/post/136761/
(если там плохо объяснено то попробуй сам подумать).
>>535912
Вторая пикча явно неправильная. При кропе мы вырезаем кусок, который по высоте содержит всю картинку, а по ширине ее середину, первая пикча выглядит правильнее.
Это значит что ты неправильно высчитываешь координаты и размер области на исходной картинке для вырезания.
Логика должна быть такая:
- у нас есть размер превьюшки, pw/ph
- у нас есть размер исходной картинки w/h
- из них вычисляем во сколько раз мы уменьшим картинку, scale, заодно проверяя не выйдет ли у нас увеличение вместо уменьшения
- получаем окончательный размер превьюшки (она может стать меньше если исходная картинка очень маленькая)
- из этих данных мы вычисляем размер вырезаемой области на исходной картинке, sw/sh
- из них мы вычисляем расположение вырезаемой области на исходной картинке, sx/sy
Имея sw/sh/sx/sy мы создаем превьюшку и переносим на нее кусок картинки.
По моему у тебя тоже непонимание HTML/CSS. br, если он использован уместно (для обозначения разрыва строки), ничем заменять не надо. В стихах, почтовых адресах, текстах программ.
А вот если его используют для вертикального выстраивания блоков, это уже неправильно. В HTMl/CSS это делается гораздо удобнее.
Ведь выучить синтаксис язка - дело максимум пары месяцев.
Все равно получается не то. Вот смотри, оригинал пикчи у меня 1600х639. Я беру меньшую сторону, то бишь высоту и приравниваю её к 100(так как я хочу создать 100х100 пикчу). Дальше 1600 умножаю на 100/639, получается 250.
В итоге получаем что-то вроде этого
imagecopyresampled($new_image, $old_image, 0, 0, $x, $y, 100, 100, 250, 100);
Результат пикрелейтед. Хотя с таким же алгоритмом и промежуточной картинкой получалась правильная превьюшка. Где ошибка в моих рассуждениях?
А, то есть я имею в виду что кусок который ты вырезаешь должен быть размером 639×639. А у тебя 250×250
250х100 же. К тому же в учебнике ОПа написано следующее:
>есть 2 режима уменьшения, когда например мы пытаемся вписать картинку 1000×200 в квадрат 100×100: CROP — уменьшает картинку до 500×100 и отрезает правую и левую части
По твоей логике мы уменьшаем картинку не до 500х100, а до 200х200
> Вот смотри, оригинал пикчи у меня 1600х639.
> я хочу создать 100х100 пикчу
Очевидно что для сохранения пропорций надо вырезать кусок размером 639×639 и уменьшить его в 639/100 = 6.39 раз. Возможно в учебнике просто не очень понятно сформулировано, но CROP это когда мы берем максимально большой кусок из исходной картинки, который пропорцими соответствует превьюшке. А SCALE это когда мы ничего не отрезаем, а только уменьшаем.
Ошибка в твоих рассуждениях в том, что ты долбоеб, не использующий макс сайз.
>Логичнее сделать список полей и по этому списку циклом забрать поля из объекта и перенести в массив.
В таком случае названия полей в БД и название свойств в классе должны совпадать, причем на каждое свойство в классе должен быть описан гетер вида get[свойство]. Вот такой метод я набросал:
function getPropertiesObject(Enrollee $enrolle) {
foreach ($this->arrayOfFields as $value) {
$method = "get" . $value;
if(method_exists($enrolle, $method)){
$this->arrayProperties[] = $enrolle->$method();
}
}
//print_r($this->arrayProperties);
}
так читабельнее
Вот теперь у меня получается точная копия того, что было с промежуточной картинкой, которая вроде как правильная. Правда всё это:
>Логика должна быть такая:
- у нас есть размер превьюшки, pw/ph
- у нас есть размер исходной картинки w/h
- из них вычисляем во сколько раз мы уменьшим картинку, scale, заодно проверяя не выйдет ли у нас увеличение вместо уменьшения
- получаем окончательный размер превьюшки (она может стать меньше если исходная картинка очень маленькая)
- из этих данных мы вычисляем размер вырезаемой области на исходной картинке, sw/sh
- из них мы вычисляем расположение вырезаемой области на исходной картинке, sx/sy
>Имея sw/sh/sx/sy мы создаем превьюшку и переносим на нее кусок картинки.
Мне не понадобилось, я просто беру меньшую сторону картинки в качестве ширины и высоты исходного изображения и вырезаю квадрат из середины. Подозреваю, что я снова где-то не прав. Обновил репозиторий короче.
https://github.com/MindiMakridi/RESTFUL
>Можно сделать массив вида [имя поля => имя колонки]
зачем?
>не надо писать arrayOf
это еще почему
>>Можно сделать массив вида [имя поля => имя колонки]
> зачем?
Это если имена не совпадают
>>не надо писать arrayOf
> это еще почему
Потому что и так понятно что там хранится, если множественное число.
>Это если имена не совпадают
Но фишка была в том, чтобы к примеру передав в меппер поля таблицы, дернуть из объекта соответствующие свойства и записать их в таблицу.
И вообще это уже переусложнение, т.к. у нас все таки учебный процесс.
А если нужно два отступа?
>>535944
По-моему гораздо быстрее и проще для строчки написать br, чем делать для неё отдельный класс. Тогда львиная доля css-кода на крупном проекте будет из переносов состоять. Причем, иногда нужен перенос, но элемент не должен быть блочным.
Универсальнее и проще br. А там уже кому как нравится.
Пробуй всё, с чем ты сталкиваешься в реальности алгоритмизировать.
В пхп есть пдо, значит и в слиме есть.
Какие два отступа? Делаешь один отступ с помощью display:block, а его величину меняешь с помощью margin.
Если обновлять счетчик при каждом запросе, то можно быстро набампать посещения, обновляя страницу F5 (или через бота).
Значит нужно ограничение по айпи.
Но где его хранить? Если в базе, то при высокой нагрузке таблица посещений очень быстро достигнет гигантских размеров.
Чистить эту таблицу и обновлять счетчик по расписанию?
Или может сохранять не в таблицу, а логи, что лучше?
Для этого есть вордпресс.
А программистам хорошо платят за огромные знания и умение решать нестандартные задачи.
Хранить ip посетителей в таблице1. При посещении страницы записывать ip в таблицу2. Раз в n времени (или n запросов) переписывать ip из таблицы2 в таблицу1, проверяя их на уникальность.
Но я хз, и вообще нуб.
А что значит выучить HTTP? Заголовки? Вроде бы как основы знаю. Но где можно почитать подробнее?
я еще даже не начинал... хотя че там пилить? мне просто тупо лень, никакой мотивации нет. как подумаю, сколько еще фреймворков и цмс и еще хрен знает каких подводных камней осваивать...
Мне кажется, ты слишком много думаешь.
Какая же теперь офигенная капча! Ничего выбирать не надо, просто галочку ставь и всё. И зачем нужны пасскоды после этого?
А лучше, наверное, парсить логи, да.
Если я хочу запускать php-скрипты по крону, нужно ставить cgi? Ставил php апт-гетом, так что наверное это cli.
Пытался запустить скрипт по этому мануалу https://masterhost.ru/support/doc/php/#cron
что-то не получается. Только выставил запуск каждую минуту, и другой путь к php.
1. Содержимое файла crontest (права 775)
0-59 ☆☆☆☆ /usr/bin/php5 /home/user/script.php (775)
2. crontab /home/user/crontest
? ничего не просходит (script.php должен писать в файл)
Скиньте может какой-нибудь внятный гайд по крону.
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=crontab&category=1
Сделай crontab -l чтобы увидеть текущий кронтаб и проверить что там есть скрипт.
Также в ходе выполнения скрипта могут быть ошибки — PHP пишет их в поток ошибок, а крон пересылает их на почту (если она настроена). Также крон ведет логи, то ли /var/log/cron то ли /var/log/messages, посмотри их
Проверь работает ли скрипт запустив руками командой которую ты указал в кронтабе.
Также почитай http://php.net/manual/ru/features.commandline.php
CGI это древний (но зато очень простой) способ использовать внешнее приложение для отдачи данных пользователю. Идея была в том что при обращении пользователя по определенному адресу веб-сервер вызывает внешнюю программу или скрипт и отдает то, то она выведет, пользователю. Он давно не используется так как не эффективен. Почитать:
http://www.firststeps.ru/cgi/cgi1.html
http://www.tvs-sm.narod.ru/domains/web_design/html_guide/Charter16_1.htm
> Если я хочу запускать php-скрипты по крону, нужно ставить cgi?
CGI это стандарт взаимодействия веб сервера и программы. У тебя веб сервера тут нет значит и CGI не нужен, тем более он древний и неэффективный.
Потому что битрикс заставляет тебя пложить говнокод.
http://www.memrise.com/blog/win-1000-in-our-september-back-to-school-learning/
Ну и зачем мне ездить на тупом троллейбусе, если я могу просто заплатить за проезд и сразу же выйти? Как-то тупо.
>Или может он на собеседовании переоценил свои навыки? А, анон, что ты на собеседовании рассказывал?
Вроде не переоценил, похоже оставят. Написал за эту неделю логгер для прокси с трейтами, интерфейсами и dependency injection, кучу юнит тестов, интеграционные тесты, новый роутер, который отлавливает параметры в строке, push нотификатор через curl с авторизацией по токенам, и еще всего по мелочи.
>Держись за эту работу всеми когтями. Джуниорам полезно работать в сложных проектах в условиях постоянного стресса.
Да, стрессово, но вроде уже понимать что-то стал. Кстати используются подходы все, какие у ОПа на сайте описаны, так что не так уж и непонятно в итоге получилось.
>Насчет стендап митинга по моему это нормально. ты рассказываешь что сделал, что не успел и почему, прежде всего чтобы самому подвести итоги и составить планы на сегодня.
Все равно Scrum мне как-то не очень нравится. В начале спринта целый день всем тимом обсуждают что запланировано на спринт с Продакт Овнером, потом еще день обсуждают всякие Code Review, где всем надо за свой код пояснять с разбором на проекторе во всю стену, потом Feature Planing еще на полдня, совместное писание тикетов, рисование скрам-схем и досок и еще множество подобных мероприятий. В итоге вместо кодинга у всего тима полнедели на разговоры про него уходит, причем какие-то малополезные, потому что полезные все со схемками и объяснениями обычно 1 на 1 отдельно потом бывают. Ну из полезного там только, что Scrum мастер постоянно сениоров зазывает лозунгами, чтобы юниорам помогли.
Ошибся с путем к скрипту, и не дал право на запись в файл.
Теперь работает, если запускать руками, но через крон не получается.
Путей /var/log/cron и /var/log/messages нет (убунту).
Есть папка /var/spool/cron/crontabs, но у нее какие-то странные права доступа
drwx-wx--T 2 root crontab 4096 Авг 28 22:33 crontabs
Что значит большая T?
crontab -l показывает скрипт, но я не вижу результата его выполнения.
Здесь https://masterhost.ru/support/doc/cron/#limitations написано, что
>существует ограничение на периодичность запуска программ из cron. Пользователь может запускать свои программы таким образом не чаще чем 1 раз в 1 час.
Это еще почему? А если мне нужно каждую минуту?
Ладно, в общем я пытаюсь решить проблему со счетчиком посещений. >>536046
Решил хранить айпи посетителей в отдельной таблице, а раз в час обновлять кроном основную таблицу и очищать вспомогательную.
О, заработало наконец. Помогло добавление в начале php-скрипта функции chdir(__DIR__). У меня использовались относительные пути при вызове функции fopen(), вероятно из-за этого была ошибка.
Permission denied - я сначала думал, что дело в правах, но оказалось, что он просто не может найти файл.
Почему так? Когда я запускал из браузера, скрипт прекрасно работал, а крону понадобилась эта функция chdir.
Наверное, что-то связанное с особенностями баша. Черт его знает, какую директорию он подсовывает в качестве текущей, наверное домашнюю пользовательскую.
code review это и есть средство обучения джуниора, мы тут тоже анонам с файлообменниками коде ревью делаем. Ну и вдобавок это способ обмена информацией, узнать что делают твои коллеги. И еще способ защититься от потомки чужого кода и появления в проекте плохого кода.
>>536201
> Путей /var/log/cron и /var/log/messages нет (убунту).
Странно, скорее всего ты не так или не там смотрел. Или у тебя прав нет на просмотр.
> Что значит большая T?
Там кроме флагов r,w,x есть еще 3 флага: SUIG, SGID, sticky. Если они применены к файлу это одно дело, а к каталогу — совсем другое:
http://www.opennet.ru/base/sys/file_access.txt.html
http://www.linuxcenter.ru/lib/books/kostromin/gl_04_05.phtml
>>существует ограничение на периодичность запуска
Это на их хостинге только
> Ладно, в общем я пытаюсь решить проблему со счетчиком посещений.
Вопрос сколько посещений он будет считать, если у тебя хайлоад то тебе нужен какой-нибудь мемкеш или редис с периодическим сбросом в таблицу, если нет то может и обычных таблиц хватит.
> а раз в час обновлять кроном основную таблицу и очищать вспомогательную.
Лучше ночью так как на время очистки она может заблокироваться.
>>536212
> Permission denied - я сначала думал, что дело в правах, но оказалось, что он просто не может найти файл.
Может нет прав на переход в один из каталогов в которые вложен файл.
> Наверное, что-то связанное с особенностями баша. Черт его знает, какую директорию он подсовывает в качестве текущей, наверное домашнюю пользовательскую.
по моему это в мануале описано который ты не прочел. Как раз не менять директорию а оставлять какая есть это логичное поведение.
code review это и есть средство обучения джуниора, мы тут тоже анонам с файлообменниками коде ревью делаем. Ну и вдобавок это способ обмена информацией, узнать что делают твои коллеги. И еще способ защититься от потомки чужого кода и появления в проекте плохого кода.
>>536201
> Путей /var/log/cron и /var/log/messages нет (убунту).
Странно, скорее всего ты не так или не там смотрел. Или у тебя прав нет на просмотр.
> Что значит большая T?
Там кроме флагов r,w,x есть еще 3 флага: SUIG, SGID, sticky. Если они применены к файлу это одно дело, а к каталогу — совсем другое:
http://www.opennet.ru/base/sys/file_access.txt.html
http://www.linuxcenter.ru/lib/books/kostromin/gl_04_05.phtml
>>существует ограничение на периодичность запуска
Это на их хостинге только
> Ладно, в общем я пытаюсь решить проблему со счетчиком посещений.
Вопрос сколько посещений он будет считать, если у тебя хайлоад то тебе нужен какой-нибудь мемкеш или редис с периодическим сбросом в таблицу, если нет то может и обычных таблиц хватит.
> а раз в час обновлять кроном основную таблицу и очищать вспомогательную.
Лучше ночью так как на время очистки она может заблокироваться.
>>536212
> Permission denied - я сначала думал, что дело в правах, но оказалось, что он просто не может найти файл.
Может нет прав на переход в один из каталогов в которые вложен файл.
> Наверное, что-то связанное с особенностями баша. Черт его знает, какую директорию он подсовывает в качестве текущей, наверное домашнюю пользовательскую.
по моему это в мануале описано который ты не прочел. Как раз не менять директорию а оставлять какая есть это логичное поведение.
Почему я вспомнил про редис? Потому что реально у mysql органичение порядка сотни или нескольких сотен транзакций в секунду (не по вине mysql, а потому что она стремится к надежности и ждет сброса данных на диск и HDD быстрее не умеет, разве что SDD). Ты можешь в него упереться при большой посещаемости.
почему много думаю? по-моему кодинг это просто тупо трата времени от безделья. когда хиккуешь дома, заняться нечем, думаешь, а давай деятельность поимитирую, какое-нить говно накодю...
Путей /var/log/cron и /var/log/messages действительно нет, запускал ls от суперпользователя. Ну и черт с ними.
>по моему это в мануале описано который ты не прочел
"Мануалы" поганого качества, являются справочниками для специалистов, а не приятными для чтения учебниками, коими обязаны быть. Вот например как там найти путь к папке логов?
Ага, нашел их в файле syslog.
И вообще на форумах говорят прописывать руками путь к файлам логов, например >/var/log/cron.log 2>&1
> а раз в час обновлять кроном основную таблицу и очищать вспомогательную.
> Лучше ночью так как на время очистки она может заблокироваться.
Так в innodb ведь "блокировка на уровне строк".
>если у тебя хайлоад то тебе нужен какой-нибудь мемкеш или редис с периодическим сбросом в таблицу
Каждый день узнаю новые слова. Ок, пошел гуглить мемкеш и редис.
Нечестный конкурс.
Если уже знаешь много слов, то можно спокойно набампать по несколько тысяч слов в день в нубских курсах.
Я за первые два дня набрал около 1,5 тысяч (все что помнил со школы), а когда пошли незнакомые слова, то стало намного сложнее.
Еще 1,5 тысячи взял за две недели.
Но вообще классный сайт, только очень утомительно часами напролет монотонно набирать слова.
Там по условиям конкурса они должны быть в long-term memory, то есть недостаточно один раз просто пробежаться по 1500 словам.
Если знаешь, как добраться, то незачем.
Зачем вообще учить всякую хуйню, если можно пойти работать гей-шлюхой?
Анус не вечный, знаешь ли.
Зачем вообще писать оригинальный код, если можно куски с чужих проектов натырить и собрать воедино?
спасибо
Сам бы уже 20 раз загуглил. В Википедии в статье про ютф8 все доступно написано. В этой кодировке символы могут кодироваться более чем одним байтом. В твоем случае кириллица. Два байта. Введёшь какой-нибудь японский иероглиф, будет, например, три байта. Латиница, цифры кодируются одним байтом. Когда дампишь строку, выводится количество байт отведенных под нее в памяти. В случае с латиницей это будет равняться длине строки.
неОП
Бесплатно можешь только нахуй проехать.
Для парсинга использую команду file_get_html, которая преобразовывает HTML в объект, но ведь если обращаться через ->plaintext это же будет обычный текст?
Вот сам код:
$html = file_get_html("https://www.google.com.ru/search?q=Если+вы+будете");
$search = $html->find('.g div.s span.st');
foreach($search as $s) {
\t
$text = $s->plaintext;
\t $pattern = "/будете/";
\t $pos = preg_match($pattern, $text);
echo $pos;
}
В $search1 содержится спарсенное краткое описание страницы сайта с поисковой страницы гугла, $pos выводит одни нули. Хотя слово будете повторяется очень много раз на сранице.
Прояснилось немного, он находит только латиницу, кирилицу не находит. Значит это уже проблемы другого порядка. Но как сделать так что бы находил и кирилицу?
Оп, дай совет про усложнённый вариант задачки про банкомат. Там где надо выдать минимальным числом купюр 6600.
>>532786
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L18
> $world->addAnimalToMap($this);
По моему, это не очень правильно, мышь не должна сама себя добавлять на карту, лучше это будет делать внешний код. То есть убрать World из конструктора и сделать вместо него метод:
$world->addAnimal($mouse);
Заодно пусть этот метод передает животному ссылку на $world, и ее не надо будет передавать в каждый метод. Ее проще хранить в поле у животного.
Тогда все логично: создаем мир, создаем кошек-мышек, ставим их на карту и понеслась.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L28
> public function overviewWorld(World $world) {
Это должно быть где-то в World, например там может быть метод «получить карту в радиусе N».Но зачем нам этот метод? Зачем нам массив сложной непонятной структуры, если мы можем просто сделать у World метод «получить список животных в определенном радиусе»?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L44
>public function searchTheAnimal(World $world, Animal $animal) {
Назначение метода непонятно. Зачем искать животное в массиве если его координаты хранятся в свойствах x и y?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/game.php#L8
> $mouse->move($world, $cat);
> $cat->move($world, $mouse);
Что ты сделаешь когда животных на карте станет больше двух? Этот код должен выглядеть так:
$mouse->move();
$cat->move();
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L3
> private $m;
> private $n;
Нужны нормальные названия полей
> protected $map = array();
В чем смысл этого поля? зачем хранить огромный массив клеток? Ведь теперь мы должны как-то остлеживать что если у животного поменялись координаты, надо перенести его из одной клеточки в другую. Тут ошибку сделать проще простого. По моему если убрать этот массив, все сразу станет проще.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L26
> public function addAnimalToMap(Animal $animal) {
Тут нет никакой защиты от случая когда клетка уже занята, ты просто ее затираешь новым животным без следа.
Также, чем getCoordinate() удобнее чем getX() и getY()? По моему ты тут вводишь лишний массив без которого все только проще.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L36
> if (!isset($from['x']) and !isset($from['y']) and !isset($to['x']) and !isset($to['y'])) {
> return false
Ты пишешь return false, а ты везде проверяешь что вернула эта функция? А если программист забудет написать проверку? В мире ООП у нас для ошибок есть исключения, почитай урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L41
> switch ($to['y']) {
> case ($to['y'] > $this->m):
Трудно понимаемый код. Почему нельзя написать if? Switch обычно используют как-то так:
switch($x) {
case 1: .... break;
case 2: .... break;
default: ...
}
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L43
> $to['y'] = $to['y'] - ($to['y'] - $this->m);
Что это значит? По моему, если сократить то получается $to['y'] = $this->m;
Но дело даже не в этом. Смотри, пользователь тебя просит поставить животное на конкретную клетку. Почему ты пытаешься что-то добавлять от себя и поставить его на другую клетку? Где тут логика? Если переданы неверные координаты, надо выкидывать исключение чтобы программист разобрался и исправил программу, а не молча подменять числа в надежде что это сработает. А если та клетка занята? А если той клетки тоже нет? Твоя программа вместо того чтобы сразу сказать что в ней ошибка, пытается это скрыть. ты ведь этим только себе жизнь усложняешь, это тебе же дольше эту ошибку искать придется.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L35
> public function moveAnimal(array $from, array $to) {
Зачем тут массивы? Почему не $x1, $y1,$x2, $y2?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L21
Вот тут 8 почти одинаковых скопированных условий. Копипаста это верный путь к ошибкам и опечаткам. Где гарантия что там их нет? Надо заменить копипасту на цикл. Можно сделать либо 2 вложенных цикла (по x и по y), можно сделать массив направлений и сделать цикл по нему.
Код надо бы переделать на работу с любым количеством котов и мышей. Кстати, алгоритм оценки ходов прост, понятен, легко работает с любым количеством животных.
> //Очень не красивое условие (находится наиболее далекая координата от первой попавшейся кошки из массива $search). Возможно ли это исправить?
Возможно. Использовать алгоритм оценивающий все варианты ходов в баллах и выбирающий наилучший.
>>532786
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L18
> $world->addAnimalToMap($this);
По моему, это не очень правильно, мышь не должна сама себя добавлять на карту, лучше это будет делать внешний код. То есть убрать World из конструктора и сделать вместо него метод:
$world->addAnimal($mouse);
Заодно пусть этот метод передает животному ссылку на $world, и ее не надо будет передавать в каждый метод. Ее проще хранить в поле у животного.
Тогда все логично: создаем мир, создаем кошек-мышек, ставим их на карту и понеслась.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L28
> public function overviewWorld(World $world) {
Это должно быть где-то в World, например там может быть метод «получить карту в радиусе N».Но зачем нам этот метод? Зачем нам массив сложной непонятной структуры, если мы можем просто сделать у World метод «получить список животных в определенном радиусе»?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L44
>public function searchTheAnimal(World $world, Animal $animal) {
Назначение метода непонятно. Зачем искать животное в массиве если его координаты хранятся в свойствах x и y?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/game.php#L8
> $mouse->move($world, $cat);
> $cat->move($world, $mouse);
Что ты сделаешь когда животных на карте станет больше двух? Этот код должен выглядеть так:
$mouse->move();
$cat->move();
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L3
> private $m;
> private $n;
Нужны нормальные названия полей
> protected $map = array();
В чем смысл этого поля? зачем хранить огромный массив клеток? Ведь теперь мы должны как-то остлеживать что если у животного поменялись координаты, надо перенести его из одной клеточки в другую. Тут ошибку сделать проще простого. По моему если убрать этот массив, все сразу станет проще.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L26
> public function addAnimalToMap(Animal $animal) {
Тут нет никакой защиты от случая когда клетка уже занята, ты просто ее затираешь новым животным без следа.
Также, чем getCoordinate() удобнее чем getX() и getY()? По моему ты тут вводишь лишний массив без которого все только проще.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L36
> if (!isset($from['x']) and !isset($from['y']) and !isset($to['x']) and !isset($to['y'])) {
> return false
Ты пишешь return false, а ты везде проверяешь что вернула эта функция? А если программист забудет написать проверку? В мире ООП у нас для ошибок есть исключения, почитай урок: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L41
> switch ($to['y']) {
> case ($to['y'] > $this->m):
Трудно понимаемый код. Почему нельзя написать if? Switch обычно используют как-то так:
switch($x) {
case 1: .... break;
case 2: .... break;
default: ...
}
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L43
> $to['y'] = $to['y'] - ($to['y'] - $this->m);
Что это значит? По моему, если сократить то получается $to['y'] = $this->m;
Но дело даже не в этом. Смотри, пользователь тебя просит поставить животное на конкретную клетку. Почему ты пытаешься что-то добавлять от себя и поставить его на другую клетку? Где тут логика? Если переданы неверные координаты, надо выкидывать исключение чтобы программист разобрался и исправил программу, а не молча подменять числа в надежде что это сработает. А если та клетка занята? А если той клетки тоже нет? Твоя программа вместо того чтобы сразу сказать что в ней ошибка, пытается это скрыть. ты ведь этим только себе жизнь усложняешь, это тебе же дольше эту ошибку искать придется.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L35
> public function moveAnimal(array $from, array $to) {
Зачем тут массивы? Почему не $x1, $y1,$x2, $y2?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L21
Вот тут 8 почти одинаковых скопированных условий. Копипаста это верный путь к ошибкам и опечаткам. Где гарантия что там их нет? Надо заменить копипасту на цикл. Можно сделать либо 2 вложенных цикла (по x и по y), можно сделать массив направлений и сделать цикл по нему.
Код надо бы переделать на работу с любым количеством котов и мышей. Кстати, алгоритм оценки ходов прост, понятен, легко работает с любым количеством животных.
> //Очень не красивое условие (находится наиболее далекая координата от первой попавшейся кошки из массива $search). Возможно ли это исправить?
Возможно. Использовать алгоритм оценивающий все варианты ходов в баллах и выбирающий наилучший.
Гугли «задача о рюкзаке»:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
http://informatics.mccme.ru/mod/book/view.php?id=815
Там как ты видишь довольно хитрый алгоритм. Можно взять и менее оптимальный, но более простой алгоритм: перебираем все возможные сочетания банкнот, оставляя из них только те которые дают нужную сумму. Из этих берем сочетание с наименьшим числом купюр и выводим как правильный ответ.
Я успел проверить не 100% кода, а где-то 70%, но думаю, найденных ошибок и замечаний тебе вполне хватит для начала. Код определенно надо улучшать.
> https://github.com/nsdvw/file-sharing/blob/master/db.sql#L25
> CREATE TABLE comment (
Если ты делаешь древовидные комменты, то в таблице стоит сделать ссылку на родительский комментарий как минимум. Она поможет например при необходимости восстановить или перепроверить значения в materialized path. Да и позволит легко определять кто родитель. Ссылка должна быть сделана с внешним ключом разумеется.
LoginManager надо сделать нормальным, не статическим классом и синглетоном в Слиме. Нужные ему зависимости (маппер) передавать через конструктор. Копипасту, где ты получаешь отдельный объект PDO прямо в классе, надо убрать.
Форму логина, встроенную в шапку, надо переделать так, чтобы с любой страницы она отправляла на отдельную страницу логина, где выводятся ошибки, если они есть (а если нет то после логина делается редирект на исходную страницу).
Тогда нам не надо в каждом действии передавать переменные $loginError = '', $loginEmail = '', $loginPassword = '' и не надо их указывать в шаблоне, так как они всегда пустые.
У тебя очень много копипасты в index.php, программист должен не копировать код, а думать как этого избежать.
> if (LoginManager::login()) {
> $login = true;
Вместо того чтобы это писать в каждом действии, лучше в самом начале передать объект LoginManager в смарти.
> $title = 'FileSharing — upload file';
Опять же, название по умолчанию можно передать один раз в начале index.php
> $bookmark = 'Upload';
Чтобы это не копипастить, можно их передать через view->appendData один раз в начаел index.php.
> $app->post('/login',
> $app->get('/login',
Не вижу смысла делать тут 2 функции ради одной страницы. Лучше объединить их в одну, которая обрабатвает и POST и GET.
> $app->get('/logout',
так как логаут изменяет состояние системы, его надо делать через POST.Также, защити-ка его CSRF токеном, для работы с токенами стоит сделать конечно отдельный универсальный класс, который можно подключить к любой форме, с методами сгенерировать токен если надо, получить токен, проверить токен: https://github.com/codedokode/pasta/blob/master/security/xsrf.md
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L138
> $uploadError = (isset($_GET['error']))
При ошибке ты не должен редиректить. Ведь в этом случае пользователь не сможет повторно отправлить файл на загрузку нажатием кнопки F5. Соответственно эта проверка тоже не нужна. При ошибке надо просто снова выводить форум загрузки. По этой причине удобно объединить вместе функции / и /upload_file
> $file->size = ViewHelper::formatSize($file->size);
Это неправльно. Почему одно и то же поле хранит значение в разных форматах? Как в таком коде ориентироваться, когда непонятно в каком формате там лежит значение? Так быть не должно.
> echo json_encode($file);
При отдаче JSON надо выставлять заголовок Content-Type: application/json. Также, ты не должен применять json_encode к объекту, ну сам подумай, это же не массив а объект, как его можно преобразовывать в JSON? Это чревато раскрытием каких-то данных которые пользователь знать не должен, ведь твой код никак не проверяет какие поля можно отдать, а какие нельзя.
Этого быть не должно. Лучше сделать из класса массив только с перечисленными полями и его уже преобразовывать в JSON. Метод получения массива можно поместить в класс.
> echo 'error';
Это неправильно, ты в одном случае отдаешь JSON, а в другом текстовую строку, как ты отличишь одно от другого? Как ты передаешь в чем именно ошибка? Логично при ошибке тоже отдавать JSON.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L178
> if ($user->hash !== sha1($user->salt . $loginForm->password)) {
не надо копипастить по всему коду метод вычисления хеша, надо сделать отдельную функцию или метод.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L181
> LoginManager::setSession(array('id'=>$user->id, 'hash'=>$user->hash,));
Метод SetSession неправильный, у LoginManager должен быть метод «залогинить пользователя», принимающий на вход например объект User, а не метод принимающий массив неизвестного вида. Не стоит заменять объект на массив. Метод може выглядеть так: $loginManager->autorizeUser($user);
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L215
> if (!LoginManager::isLoggedIn()) {
> $author_id = null;
> } else {
> $author_id = $_COOKIE['id'];
> }
Вся работа с авторизационными куками должна быть в классе LoginManager, а не размазана повсему коду. В данном случае логично у класса сделать метод getLoggedUser() который возвращает либо объект User либо null.
> $request_method = (isset($_GET['ajax'])) ? 'ajax' : 'direct';
Тут лучше использовать переменную $isAjax с значениями true/false. А то возникает вопрос например почему тут не используются константы вместо строк.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L224
> $app->response->redirect("/?error=$error");
При ошибке не надо никуда редиректить, чтобы пользователь мог отправить форму повторно.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L242
> $app->response->redirect('/view/?upload=ok');
Ты при успешной загрузке редиректишь на страницу в пути к которой не указан id файла. А как пользователь тогда получит ссылку на файл? Логичнее редиректить его на страницу файла.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L294
> $user->fromForm($registerForm);
Это как-то не очень правильно, получается у нас модель пользователя должна знать о форме его редактирования. Это неправильно так как модель ничего не должна знать о внешнем мире и как она редактируется. Вместо этого в модели формы должен быть метод, возвращающий или заполняющий модель пользователя.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L303
> $registerError = $registerForm->errorMessage;
> $registerLogin = $registerForm->login;
> $registerEmail = $registerForm->email;
Вместо того чтобы передавать переменные по отдельности, логичнее передать в смари саму форму.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L415
> $comment->level = Comment::getLevelFromPath($comment->materialized_path);
Вместо этого надо сделать метод getLevel()
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L416
> $comment->author_id = $app->userMapper->findById($comment->author_id);
запрашивать записи по одной неэффективно. Надо собрать id авторов, выбрать их одним запросом, присоединить к комментариям. И делать это надо не в index.php, а в маппере.
Я успел проверить не 100% кода, а где-то 70%, но думаю, найденных ошибок и замечаний тебе вполне хватит для начала. Код определенно надо улучшать.
> https://github.com/nsdvw/file-sharing/blob/master/db.sql#L25
> CREATE TABLE comment (
Если ты делаешь древовидные комменты, то в таблице стоит сделать ссылку на родительский комментарий как минимум. Она поможет например при необходимости восстановить или перепроверить значения в materialized path. Да и позволит легко определять кто родитель. Ссылка должна быть сделана с внешним ключом разумеется.
LoginManager надо сделать нормальным, не статическим классом и синглетоном в Слиме. Нужные ему зависимости (маппер) передавать через конструктор. Копипасту, где ты получаешь отдельный объект PDO прямо в классе, надо убрать.
Форму логина, встроенную в шапку, надо переделать так, чтобы с любой страницы она отправляла на отдельную страницу логина, где выводятся ошибки, если они есть (а если нет то после логина делается редирект на исходную страницу).
Тогда нам не надо в каждом действии передавать переменные $loginError = '', $loginEmail = '', $loginPassword = '' и не надо их указывать в шаблоне, так как они всегда пустые.
У тебя очень много копипасты в index.php, программист должен не копировать код, а думать как этого избежать.
> if (LoginManager::login()) {
> $login = true;
Вместо того чтобы это писать в каждом действии, лучше в самом начале передать объект LoginManager в смарти.
> $title = 'FileSharing — upload file';
Опять же, название по умолчанию можно передать один раз в начале index.php
> $bookmark = 'Upload';
Чтобы это не копипастить, можно их передать через view->appendData один раз в начаел index.php.
> $app->post('/login',
> $app->get('/login',
Не вижу смысла делать тут 2 функции ради одной страницы. Лучше объединить их в одну, которая обрабатвает и POST и GET.
> $app->get('/logout',
так как логаут изменяет состояние системы, его надо делать через POST.Также, защити-ка его CSRF токеном, для работы с токенами стоит сделать конечно отдельный универсальный класс, который можно подключить к любой форме, с методами сгенерировать токен если надо, получить токен, проверить токен: https://github.com/codedokode/pasta/blob/master/security/xsrf.md
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L138
> $uploadError = (isset($_GET['error']))
При ошибке ты не должен редиректить. Ведь в этом случае пользователь не сможет повторно отправлить файл на загрузку нажатием кнопки F5. Соответственно эта проверка тоже не нужна. При ошибке надо просто снова выводить форум загрузки. По этой причине удобно объединить вместе функции / и /upload_file
> $file->size = ViewHelper::formatSize($file->size);
Это неправльно. Почему одно и то же поле хранит значение в разных форматах? Как в таком коде ориентироваться, когда непонятно в каком формате там лежит значение? Так быть не должно.
> echo json_encode($file);
При отдаче JSON надо выставлять заголовок Content-Type: application/json. Также, ты не должен применять json_encode к объекту, ну сам подумай, это же не массив а объект, как его можно преобразовывать в JSON? Это чревато раскрытием каких-то данных которые пользователь знать не должен, ведь твой код никак не проверяет какие поля можно отдать, а какие нельзя.
Этого быть не должно. Лучше сделать из класса массив только с перечисленными полями и его уже преобразовывать в JSON. Метод получения массива можно поместить в класс.
> echo 'error';
Это неправильно, ты в одном случае отдаешь JSON, а в другом текстовую строку, как ты отличишь одно от другого? Как ты передаешь в чем именно ошибка? Логично при ошибке тоже отдавать JSON.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L178
> if ($user->hash !== sha1($user->salt . $loginForm->password)) {
не надо копипастить по всему коду метод вычисления хеша, надо сделать отдельную функцию или метод.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L181
> LoginManager::setSession(array('id'=>$user->id, 'hash'=>$user->hash,));
Метод SetSession неправильный, у LoginManager должен быть метод «залогинить пользователя», принимающий на вход например объект User, а не метод принимающий массив неизвестного вида. Не стоит заменять объект на массив. Метод може выглядеть так: $loginManager->autorizeUser($user);
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L215
> if (!LoginManager::isLoggedIn()) {
> $author_id = null;
> } else {
> $author_id = $_COOKIE['id'];
> }
Вся работа с авторизационными куками должна быть в классе LoginManager, а не размазана повсему коду. В данном случае логично у класса сделать метод getLoggedUser() который возвращает либо объект User либо null.
> $request_method = (isset($_GET['ajax'])) ? 'ajax' : 'direct';
Тут лучше использовать переменную $isAjax с значениями true/false. А то возникает вопрос например почему тут не используются константы вместо строк.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L224
> $app->response->redirect("/?error=$error");
При ошибке не надо никуда редиректить, чтобы пользователь мог отправить форму повторно.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L242
> $app->response->redirect('/view/?upload=ok');
Ты при успешной загрузке редиректишь на страницу в пути к которой не указан id файла. А как пользователь тогда получит ссылку на файл? Логичнее редиректить его на страницу файла.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L294
> $user->fromForm($registerForm);
Это как-то не очень правильно, получается у нас модель пользователя должна знать о форме его редактирования. Это неправильно так как модель ничего не должна знать о внешнем мире и как она редактируется. Вместо этого в модели формы должен быть метод, возвращающий или заполняющий модель пользователя.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L303
> $registerError = $registerForm->errorMessage;
> $registerLogin = $registerForm->login;
> $registerEmail = $registerForm->email;
Вместо того чтобы передавать переменные по отдельности, логичнее передать в смари саму форму.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L415
> $comment->level = Comment::getLevelFromPath($comment->materialized_path);
Вместо этого надо сделать метод getLevel()
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L416
> $comment->author_id = $app->userMapper->findById($comment->author_id);
запрашивать записи по одной неэффективно. Надо собрать id авторов, выбрать их одним запросом, присоединить к комментариям. И делать это надо не в index.php, а в маппере.
Полный текст поста вакаба не пропускает, видит там спам, читай дальше тут: http://pastebin.com/11PAUhyc
Это часть URL под названием query , с ее помощью можно передать скрипт на сервере какие-то параметры.
Структура URL: https://ru.wikipedia.org/wiki/URL#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_URL
>>533714
> Так вот, когда дело доходит, что Кошка ловит Мышку, мышка не успевает понять что уже мертва, и ломает код
Ты не должен вызывать move у мертвых животных. Если ты хранишь в World список животных и удаляешь их из него при съедении, проблема решится сама собой.
> Перед тем как передвинуть животное, нужно будет проверить не содержит ли ячейка, куда хочет переместиться, объект Животное, и если содержит, то вызвать метод этого животного, который "скажет" ему о смерти.
Это лучше сделать по-другому, в методе передвижения кошки сделать вызов метода World, проверяющий, что на клетке на которую мы ходим. если мышка — снимаем ее с карты перед тем как сделать ход.
Удобно сделать метод $world->getAnimalAt($x, $y)
>>534415
> throw new Error('Введены неверные данные');
> return;
return никогда не выполнится и потому не нужен
> Object.defineProperty(Hamburger.prototype, "getCalAndPriceTable"
Чтобы не копипастить этот код defineProperty, и повысить читабельность, я бы сделал вспомогательную функцию:
addReadonlyMethod(Hamburger, 'getSomething', function () { .... });
Хотя тогда странно почему часть функций добавлена через defineProperty, а часть напрямую.
> throw new Error('Введены неверные данные.');
Сообщения лучше делать чуть более подробными а то сам же потом замучаешься искать в какой функции это произошло.
> Hamburger.prototype.addSeasoning
Там можно выбрать обе добавки, это должно быть не просто свойство а массив.
Соответственно алгоритм подсчета цены придется поменять.
> Hamburger.prototype.calculate
Лучше вместо передачи типа сделать 2 функции caluclatePrice и calculateCalorites которые будут ее вызывать.
Это часть URL под названием query , с ее помощью можно передать скрипт на сервере какие-то параметры.
Структура URL: https://ru.wikipedia.org/wiki/URL#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_URL
>>533714
> Так вот, когда дело доходит, что Кошка ловит Мышку, мышка не успевает понять что уже мертва, и ломает код
Ты не должен вызывать move у мертвых животных. Если ты хранишь в World список животных и удаляешь их из него при съедении, проблема решится сама собой.
> Перед тем как передвинуть животное, нужно будет проверить не содержит ли ячейка, куда хочет переместиться, объект Животное, и если содержит, то вызвать метод этого животного, который "скажет" ему о смерти.
Это лучше сделать по-другому, в методе передвижения кошки сделать вызов метода World, проверяющий, что на клетке на которую мы ходим. если мышка — снимаем ее с карты перед тем как сделать ход.
Удобно сделать метод $world->getAnimalAt($x, $y)
>>534415
> throw new Error('Введены неверные данные');
> return;
return никогда не выполнится и потому не нужен
> Object.defineProperty(Hamburger.prototype, "getCalAndPriceTable"
Чтобы не копипастить этот код defineProperty, и повысить читабельность, я бы сделал вспомогательную функцию:
addReadonlyMethod(Hamburger, 'getSomething', function () { .... });
Хотя тогда странно почему часть функций добавлена через defineProperty, а часть напрямую.
> throw new Error('Введены неверные данные.');
Сообщения лучше делать чуть более подробными а то сам же потом замучаешься искать в какой функции это произошло.
> Hamburger.prototype.addSeasoning
Там можно выбрать обе добавки, это должно быть не просто свойство а массив.
Соответственно алгоритм подсчета цены придется поменять.
> Hamburger.prototype.calculate
Лучше вместо передачи типа сделать 2 функции caluclatePrice и calculateCalorites которые будут ее вызывать.
Операции меняющие данные на сервере вроде удаления должны делать не кликом по ссылке а методом POST. Так предусмотрено в HTTP.
В ссылке незачем писать http://localhost, используй относительные ссылки без протокола и хоста.
> <a><button
Что за извращение? Почему button внутри тега a?
> <a href="http://localhost/TwigBlog/download/<?=$value['id']?>"><button
то же самое, извращение какое-то. В бутстрапе есть способ сделать чтобы ссылка выглядела как кнопка и наоборот.
> if($cookieUser==$cookieLoad) {
В шаблоне надо использовать версию с двоеточием и endif. Также шаблон не дожен заморачиватьяс с куками, а должен иметь переменную типа $isFileOwner (является ли пользователь владельцем файла).
> aria-label="..."
Что это значит?
>>534458
В шаблоне надо использовать foreach c двоеточием и endforeach
>>535214
наверно, все зависит от компании.
>>533714
> if (!$this->map['x']['y'] = '')?
тут точно ошибка так как надо использовать != а = это присваивание значения
> И можно ли обратиться к объекту таким образом: $this->map['x']['y']->Die();
Можно но гораздо лучше поместить его в переменную с понятным именем.
>>535247
В нашем треде это слово уместно, на шапку посмотри
>>535284
Я вроде отвечал на тот пост уже. Актив рекорд это не датамаппер, это другой подход же.
>>535335
Замени lighter и normal на числа, может в этом дело
>>535384
Ты можешь из сайта с тестами сделать только создание и прохождение теста например.
Ну или сделай клон https://news.ycombinator.com/ или реддита. Они тоже простые.
Операции меняющие данные на сервере вроде удаления должны делать не кликом по ссылке а методом POST. Так предусмотрено в HTTP.
В ссылке незачем писать http://localhost, используй относительные ссылки без протокола и хоста.
> <a><button
Что за извращение? Почему button внутри тега a?
> <a href="http://localhost/TwigBlog/download/<?=$value['id']?>"><button
то же самое, извращение какое-то. В бутстрапе есть способ сделать чтобы ссылка выглядела как кнопка и наоборот.
> if($cookieUser==$cookieLoad) {
В шаблоне надо использовать версию с двоеточием и endif. Также шаблон не дожен заморачиватьяс с куками, а должен иметь переменную типа $isFileOwner (является ли пользователь владельцем файла).
> aria-label="..."
Что это значит?
>>534458
В шаблоне надо использовать foreach c двоеточием и endforeach
>>535214
наверно, все зависит от компании.
>>533714
> if (!$this->map['x']['y'] = '')?
тут точно ошибка так как надо использовать != а = это присваивание значения
> И можно ли обратиться к объекту таким образом: $this->map['x']['y']->Die();
Можно но гораздо лучше поместить его в переменную с понятным именем.
>>535247
В нашем треде это слово уместно, на шапку посмотри
>>535284
Я вроде отвечал на тот пост уже. Актив рекорд это не датамаппер, это другой подход же.
>>535335
Замени lighter и normal на числа, может в этом дело
>>535384
Ты можешь из сайта с тестами сделать только создание и прохождение теста например.
Ну или сделай клон https://news.ycombinator.com/ или реддита. Они тоже простые.
там флеш либо яваскрипт
>>535951
решать простые олимпиадные задачи и читать разборы.
>>536393
бесплатно до ближайшего отделения полиции
>>536133
cgi = common gateway interface = интерфейс (правила взаимодействия) сервера и веб-приложения
cli = command line interface = интерфейс (правила взаимодействия пользователя с компьюетром) командной строки
>>536153
Я бы настороженно относился к любым интернет конкурсам. есть риск накруток, есть риск что приз отдадут своим людям.
>>536228
Сделай клон реддит или news.ycombinator.com, постишь ссылки, комментируешь, лайкаешь, регистрация, модерация.
>>536350
кому как
>>536358
есть, только это файлы а не папки
> "Мануалы" поганого качества, являются справочниками для специалистов, а не приятными для чтения учебниками, коими обязаны быть. Вот например как там найти путь к папке логов?
По запросу ubuntu logs на втором месте: https://help.ubuntu.com/community/LinuxLogFiles
А вообще ты должен изучить структуру файловой системы линукс, там есть договоренности что в какой папке хранится. Конфиги системные например в /etc, пользовательские в домашней папке.
> Так в innodb ведь "блокировка на уровне строк".
Ну так а для удаления всех строк надо все их заблокировать. Ну не знаю, проверь попробуй может и не заблокирует.
> Ок, пошел гуглить мемкеш и редис.
Сначала лучше просто мемкеш
>>536480
там длина в байтах а не символах
там флеш либо яваскрипт
>>535951
решать простые олимпиадные задачи и читать разборы.
>>536393
бесплатно до ближайшего отделения полиции
>>536133
cgi = common gateway interface = интерфейс (правила взаимодействия) сервера и веб-приложения
cli = command line interface = интерфейс (правила взаимодействия пользователя с компьюетром) командной строки
>>536153
Я бы настороженно относился к любым интернет конкурсам. есть риск накруток, есть риск что приз отдадут своим людям.
>>536228
Сделай клон реддит или news.ycombinator.com, постишь ссылки, комментируешь, лайкаешь, регистрация, модерация.
>>536350
кому как
>>536358
есть, только это файлы а не папки
> "Мануалы" поганого качества, являются справочниками для специалистов, а не приятными для чтения учебниками, коими обязаны быть. Вот например как там найти путь к папке логов?
По запросу ubuntu logs на втором месте: https://help.ubuntu.com/community/LinuxLogFiles
А вообще ты должен изучить структуру файловой системы линукс, там есть договоренности что в какой папке хранится. Конфиги системные например в /etc, пользовательские в домашней папке.
> Так в innodb ведь "блокировка на уровне строк".
Ну так а для удаления всех строк надо все их заблокировать. Ну не знаю, проверь попробуй может и не заблокирует.
> Ок, пошел гуглить мемкеш и редис.
Сначала лучше просто мемкеш
>>536480
там длина в байтах а не символах
Так оно и есть. Поэтому дома кодить есть смысл только для обучения. Потом устраиваешься на нормальную фирму, и пошло-поехало уже всерьез и надолго.
А чтобы устроиться на фирму, даже символически, за 8-10к работать, нужен год ежедневного 4-6 часового самообучения.
замкнутый круг
>Заодно пусть этот метод передает животному ссылку на $world, и ее не надо будет передавать в каждый метод. Ее проще хранить в поле у животного.
>поле
В смысле в свойстве?
>https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L28
>public function overviewWorld(World $world) {
>Это должно быть где-то в World, например там может быть метод «получить карту в радиусе N».Но зачем нам этот метод? Зачем нам массив сложной непонятной структуры, если мы можем просто сделать у World метод «получить список животных в определенном радиусе»?
Потому что мир не может думать за место мышек. У них должно быть свое представление о мире. Понимаю что для изучения программирования такой подход не очень подходит, но пусть будет все реалистично. Это же не очень критично будет?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L44
>public function searchTheAnimal(World $world, Animal $animal) {
>Назначение метода непонятно. Зачем искать животное в массиве если его координаты хранятся в свойствах x и y?
Этот метод предназначен чтобы найти чтобы найти других животных в обозримой видимости.
> protected $map = array();
>В чем смысл этого поля? зачем хранить огромный массив клеток? Ведь теперь мы должны как-то остлеживать что если у животного поменялись координаты, надо перенести его из одной клеточки в другую. Тут ошибку сделать проще простого. По моему если убрать этот массив, все сразу станет проще.
Мне просто сложно представить этот мир. В принципе, я с тобой полностью согласен. Я подумаю над этим.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L35
> public function moveAnimal(array $from, array $to) {
>Зачем тут массивы? Почему не $x1, $y1,$x2, $y2?
А так понятно будет?
По моему так удобней - сразу видно какие координаты что значат. Почему так не правильно?
>Также, чем getCoordinate() удобнее чем getX() и getY()? По моему ты тут вводишь лишний массив без которого все только проще.
Ну использование одного метода избавляет от лишней писанины, плюс я не уверен что когда-нибудь потребуется отдельно X и отдельно Y.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L43
> $to['y'] = $to['y'] - ($to['y'] - $this->m);
>Что это значит? По моему, если сократить то получается $to['y'] = $this->m;
>Но дело даже не в этом. Смотри, пользователь тебя просит поставить животное на конкретную клетку. Почему ты пытаешься что-то добавлять от себя и поставить его на другую клетку? Где тут логика? Если переданы неверные координаты, надо выкидывать исключение чтобы программист разобрался и исправил программу, а не молча подменять числа в надежде что это сработает. А если та клетка занята? А если той клетки тоже нет? Твоя программа вместо того чтобы сразу сказать что в ней ошибка, пытается это скрыть. ты ведь этим только себе жизнь усложняешь, это тебе же дольше эту ошибку искать придется.
Ну суть этого метода заключается в том, что животное может сгенерировать координату которая выходит за пределы карты. Этот метод всего лишь не дает им выйти за пределы карты. Так же я думал еще, с помощью этого метода сделать такую фичу: если животное пытается выйти за пределы карты, то оно ударяется об стенку, получает сотрясение и пропускает один ход о_х
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L21
>Вот тут 8 почти одинаковых скопированных условий. Копипаста это верный путь к ошибкам и опечаткам. Где гарантия что там их нет? Надо заменить копипасту на цикл. Можно сделать либо 2 вложенных цикла (по x и по y), можно сделать массив направлений и сделать цикл по нему.
>Код надо бы переделать на работу с любым количеством котов и мышей. Кстати, алгоритм оценки ходов прост, понятен, легко работает с любым количеством животных.
Мне не понятно это сделать. Я подумаю над тем что именно мне не понятно, и позже задам вопрос, если что-то останется непонятным
>Заодно пусть этот метод передает животному ссылку на $world, и ее не надо будет передавать в каждый метод. Ее проще хранить в поле у животного.
>поле
В смысле в свойстве?
>https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L28
>public function overviewWorld(World $world) {
>Это должно быть где-то в World, например там может быть метод «получить карту в радиусе N».Но зачем нам этот метод? Зачем нам массив сложной непонятной структуры, если мы можем просто сделать у World метод «получить список животных в определенном радиусе»?
Потому что мир не может думать за место мышек. У них должно быть свое представление о мире. Понимаю что для изучения программирования такой подход не очень подходит, но пусть будет все реалистично. Это же не очень критично будет?
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L44
>public function searchTheAnimal(World $world, Animal $animal) {
>Назначение метода непонятно. Зачем искать животное в массиве если его координаты хранятся в свойствах x и y?
Этот метод предназначен чтобы найти чтобы найти других животных в обозримой видимости.
> protected $map = array();
>В чем смысл этого поля? зачем хранить огромный массив клеток? Ведь теперь мы должны как-то остлеживать что если у животного поменялись координаты, надо перенести его из одной клеточки в другую. Тут ошибку сделать проще простого. По моему если убрать этот массив, все сразу станет проще.
Мне просто сложно представить этот мир. В принципе, я с тобой полностью согласен. Я подумаю над этим.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L35
> public function moveAnimal(array $from, array $to) {
>Зачем тут массивы? Почему не $x1, $y1,$x2, $y2?
А так понятно будет?
По моему так удобней - сразу видно какие координаты что значат. Почему так не правильно?
>Также, чем getCoordinate() удобнее чем getX() и getY()? По моему ты тут вводишь лишний массив без которого все только проще.
Ну использование одного метода избавляет от лишней писанины, плюс я не уверен что когда-нибудь потребуется отдельно X и отдельно Y.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L43
> $to['y'] = $to['y'] - ($to['y'] - $this->m);
>Что это значит? По моему, если сократить то получается $to['y'] = $this->m;
>Но дело даже не в этом. Смотри, пользователь тебя просит поставить животное на конкретную клетку. Почему ты пытаешься что-то добавлять от себя и поставить его на другую клетку? Где тут логика? Если переданы неверные координаты, надо выкидывать исключение чтобы программист разобрался и исправил программу, а не молча подменять числа в надежде что это сработает. А если та клетка занята? А если той клетки тоже нет? Твоя программа вместо того чтобы сразу сказать что в ней ошибка, пытается это скрыть. ты ведь этим только себе жизнь усложняешь, это тебе же дольше эту ошибку искать придется.
Ну суть этого метода заключается в том, что животное может сгенерировать координату которая выходит за пределы карты. Этот метод всего лишь не дает им выйти за пределы карты. Так же я думал еще, с помощью этого метода сделать такую фичу: если животное пытается выйти за пределы карты, то оно ударяется об стенку, получает сотрясение и пропускает один ход о_х
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L21
>Вот тут 8 почти одинаковых скопированных условий. Копипаста это верный путь к ошибкам и опечаткам. Где гарантия что там их нет? Надо заменить копипасту на цикл. Можно сделать либо 2 вложенных цикла (по x и по y), можно сделать массив направлений и сделать цикл по нему.
>Код надо бы переделать на работу с любым количеством котов и мышей. Кстати, алгоритм оценки ходов прост, понятен, легко работает с любым количеством животных.
Мне не понятно это сделать. Я подумаю над тем что именно мне не понятно, и позже задам вопрос, если что-то останется непонятным
ну хуй его знает, я 4 месяца подрочил задачки опа, прочитал книжку, что он в оппосте советовал и устроился, ещё и норм зарплатка
и пускай те, кто говорят, что задачки опа полная хуйня, подрочат мой хуй себе в рот, я знаю, они любят отсасывать.
Эти задачки - как раз то, что нужно. На собеседованиях не спрашивают, как html теги писать, там задачи на логику в основном, а ОПовские задачки как раз такие. Он вообще молодец
да
Это копия, сохраненная 20 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.