Двач.hk не отвечает.
Вы видите копию треда, сохраненную 20 сентября 2015 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
157 Кб, 1024x683
193 Кб, 1024x768
72 Кб, 1022x575
Клуб любителей изучать PHP 57 #531765 В конец треда | Веб
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.

Почему 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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
56 Кб, 500x644
93 Кб, 561x800
Пиши верно #2 #531766
А ну стой, злодей! Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
56 Кб, 500x644
93 Кб, 561x800
Пиши верно #2 #531766
А ну стой, злодей! Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.

Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
#3 #531771
Напомню себе проверить решения:

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

И есои я про кого-то забыл, напомните о себе плиз.
#4 #531815
>>531771
Задание на yii снимается.
Я сначала сделаю какой-нибудь примитив, например сайт для объявлений. Просто набить руку, чтобы легче ориентироваться в api.

А потом так и быть возьмусь за задание с тестами. Его кстати кто-то вообще делал? Я где-то полгода мониторю тред, еще не видел чтобы кто-то брался.
Что там за "подводные камни"? Ты лучше сразу скажи, мне очень важно прикинуть время, которое у меня это займет.
#5 #531817
Анон спрашивал про ООП.

>>531797

Приведу тебе пример ООП подхода. Допустим мы хотим сделать программу которая ведет список сотрудников в компании, кто на какой должности, кто сколько зарабатывает. Мы делаем класс Сотрудник и описываем, какие у него есть свойства: имя, фамилия, должность, зарплата, находится ли в отпуске или на работе.

Затем мы добавляем методы, то есть функции, позволяющие делать что-то с сотрудником, например повысить зарплату, уволить, отправить в отпуск, вернуть из отпуска. Эти методы меняют свойства объекта, например метод повысить зарплату меняет значение свойства «зарплата».

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

$ivan = new Employee; // Создать новый объект класса Сотрудник
$ivan->name = 'Иван'; // задали ему имя
$ivan->position = 'менеджер';
$ivan->salary = 100; // задали зарплату

$petr = new Employee;
$petr->name = 'Петр';
$petr->position = 'продавец';
$petr->salary = 50;

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

То есть классы и объекты описывают какие-то сущности с которыми работает программа. когда ты изучишь ООП ты увидишь что оно очень логичное и естественное.
#6 #531818
>>531815

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

Подводные камни начинаются с самого начала. Почитай описание и попробуй представить как ты спроектируешь базу данных для тестов, вопросов, ответов? Разумеется в нашем учебном треде мы придеремся к малейшим отклонениям от нормализованной формы (с благими намерениями конечно, чтобы потом на работе твои коллеги не спрашивали какой идиот создал эту таблицу).
#7 #531820
>>531815

И знаешь, задание на тесты близко по сложности к реальным проектам. Я видел один реальный проект сравнимой, точнее даже чуть меньшей сложности на аналогичного уровня фреймворке. Его разработчики в нашем треде не учились и хорошим практикам не следовали. Код кривой, куча ошибок, причем часто вместо исправления они просто игнорировались и код как следствие работал через раз и понять почему он не работает было очень нелегко. Теперь этот проект будут дорабатывать и исправлять другие разработчики, посмотрим что выйдет. Переписывать радикально я думаю мы ничего не будем, зачем деньги на ветер выбрасывать, будут мучаться с тем что есть.
#8 #531827
И еще анон, который учит HTML/CSS и берется за JS, имей в виду что если хорошо это изучить (+ DOM и jQuery) то ты уже можешь быть верстальщиком как минимум. Без jQuery наверно вряд ли так как таких верстальщиков тысячи на фрилансе.
SAGE #9 #531840
в ЭТОМ ТРЕДЕ ОДНИ ТРАЛИ. НАСТОЯЩИЙ ТРЕД С ОПОМ ТУТ http://2ch.hk/pr/res/528349.html
SAGE #10 #531845
>>531827
ТАМ НУЖНО JS И ФРЕЙМВОРКИ ЗНАТЬ, ЧТОБЫ ФРОНТЕНДЕРОМ РАБОТАТЬ ГНИДА ПИЗДЛИВАЯ
109 Кб, 1000x798
#11 #531848
Анон, который делает макет, а ты видел крутые фичи в хромовском отладчике, которые на пикрелейтед? Есть возможность отлаживать адаптивную верстку и есть возможность имитировать медленную скорость соединения.

Хромовский отладчик не первый, до него был Firebug в фаерфоксе, а до него верстку отлаживали правкой кода и перезагрузкой страницы (кто хорошо знал CSS рендерил страницу в голове). Но он по скорости, удобству и фичам конечно на первом месте.

-----

В прошлом треде один особо наглый анон (наверно он прошел специальные курсы по оборзению) спросил не желает ли кто поработать на него бесплатно: >>530535

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

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

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

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

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

Это сложный вопрос. Участие за долю — это фактически инвестиция. Вы берете какую-то часть времени своей жизни и вкладываете ее в ваше совместное дело. Вы бы могли потратить это время на обычную работу за деньги, значит потенциальная выгода должна быть значительно выше чем зарплата за это время. Не забудьте, что ее надо оценивать с учетом риска. Ну например если шанс что стартап станет успешным и принесет вам 10 000 тугриков равен 5% то математическое ожидание (то есть средняя сумма которую вы заработаете сделав много попыток) составит 10 000 × 5% = 500 тугриков. Ну и помните что 5% шанс на успех это 95% шанс на провал. Потраченные зря месяцы работы в режиме 7×12. В то время как 50 тугриков зарплаты это реальные деньги которые вы получите в конце месяца и на которые летом вместо круглосуточного кодинга можно отправиться куда-нибудь путешествовать.

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

Вот например статья про веб-студию которая пыталась инвестировать в разные проекты, почитайте, очень интересный опыт (TLDR: профита не получилось): http://habrahabr.ru/company/mkechinov/blog/246547/

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

Ну и напоследок поменяю направление мысли еще раз. Ни Биллу Гейтсу, ни Стиву Джобсу зарплату никто не платил. Они работали за долю.
109 Кб, 1000x798
#11 #531848
Анон, который делает макет, а ты видел крутые фичи в хромовском отладчике, которые на пикрелейтед? Есть возможность отлаживать адаптивную верстку и есть возможность имитировать медленную скорость соединения.

Хромовский отладчик не первый, до него был Firebug в фаерфоксе, а до него верстку отлаживали правкой кода и перезагрузкой страницы (кто хорошо знал CSS рендерил страницу в голове). Но он по скорости, удобству и фичам конечно на первом месте.

-----

В прошлом треде один особо наглый анон (наверно он прошел специальные курсы по оборзению) спросил не желает ли кто поработать на него бесплатно: >>530535

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

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

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

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

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

Это сложный вопрос. Участие за долю — это фактически инвестиция. Вы берете какую-то часть времени своей жизни и вкладываете ее в ваше совместное дело. Вы бы могли потратить это время на обычную работу за деньги, значит потенциальная выгода должна быть значительно выше чем зарплата за это время. Не забудьте, что ее надо оценивать с учетом риска. Ну например если шанс что стартап станет успешным и принесет вам 10 000 тугриков равен 5% то математическое ожидание (то есть средняя сумма которую вы заработаете сделав много попыток) составит 10 000 × 5% = 500 тугриков. Ну и помните что 5% шанс на успех это 95% шанс на провал. Потраченные зря месяцы работы в режиме 7×12. В то время как 50 тугриков зарплаты это реальные деньги которые вы получите в конце месяца и на которые летом вместо круглосуточного кодинга можно отправиться куда-нибудь путешествовать.

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

Вот например статья про веб-студию которая пыталась инвестировать в разные проекты, почитайте, очень интересный опыт (TLDR: профита не получилось): http://habrahabr.ru/company/mkechinov/blog/246547/

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

Ну и напоследок поменяю направление мысли еще раз. Ни Биллу Гейтсу, ни Стиву Джобсу зарплату никто не платил. Они работали за долю.
#12 #531849
Алсо, кто хочет посмеяться, тут еще много таких: https://www.avito.ru/sankt-peterburg/zaprosy_na_uslugi/it_internet_telekom/sozdaniye_i_prodvizheniye_saytov
160 Кб, 609x325
#13 #531850
>>531849
Ещё бойан в тему.
#14 #531851
Там ссылка затерялась в многобуквенном посте, я ее раз вкину, она важная, студия инвестировала услугами в IT-бизнесы, итоги за 8 лет: http://habrahabr.ru/company/mkechinov/blog/246547/
#15 #531852
>>531818
Мне как раз редактор пока кажется самым сложным.
Ну ладно, с первого взгляда я накидал общую схему базы, так сказать сущности. Можешь пока посмотреть, насколько идиотски это выглядит.
По проектированию бд: это дело доверяют джуниорам, серьезно?

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
- email
- password

result
- id
- test_id
- user_id
- perform_date
- mark
- sum
- attempts
- fulfilled
#15 #531852
>>531818
Мне как раз редактор пока кажется самым сложным.
Ну ладно, с первого взгляда я накидал общую схему базы, так сказать сущности. Можешь пока посмотреть, насколько идиотски это выглядит.
По проектированию бд: это дело доверяют джуниорам, серьезно?

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
- email
- password

result
- id
- test_id
- user_id
- perform_date
- mark
- sum
- attempts
- fulfilled
#16 #531855
>>531848
Я на хабре видел предложение войти в долю и проспонсировать создание сайта.
#17 #531856
>>531852
В некоторых местах джуниорам доверяют целые проекты, как попадешь.
#18 #531858
>>531852

> По проектированию бд: это дело доверяют джуниорам, серьезно?


А по твоему господину джуниору полагается личный помощник по проектированию баз данных? Или может ручной гном который это за него сделает?

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

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

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

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


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

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

> 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


Непонятно назначение поля
#18 #531858
>>531852

> По проектированию бд: это дело доверяют джуниорам, серьезно?


А по твоему господину джуниору полагается личный помощник по проектированию баз данных? Или может ручной гном который это за него сделает?

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

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

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

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


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

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

> 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


Непонятно назначение поля
#19 #531864
Как верстку на джумолу натянуть? Там все в пхп-шаблонах же.
#20 #531867
>>531864
Мы не умеем.
#21 #531892
>>531889
>>531888
>>531887
>>531886
>>531885
>>531883
>>531875
>>531876
Зая, ты проксю-то хоть надел?
#22 #531903
Почему среди пхп быдлокодеров столько шизофреников? В других ЯП такая же ситуация?
#23 #531907
>>531903
Иногда даже значительно больше.
59 Кб, 1136x675
#24 #531910
Почему у меня класс не находит. Вон же он лежит, йопта.
Fatal error: Class 'Slim\Views\Twig' not found in C:\xampp\htdocs\TwigBlog\app\start.php on line 27
sage #25 #531911
>>531910
Что за IDE?
#26 #531919
>>531911
нетбинс
#27 #531924
>>531911
PhpStorm
#28 #531926
>>531910
Ну и убогий же дизаен.
#29 #531948
>>531919
Благодарю.
Кун с макетом #30 #531956
>>531827

>И еще анон, который учит HTML/CSS и берется за JS, имей в виду что если хорошо это изучить (+ DOM и jQuery) то ты уже можешь быть верстальщиком как минимум. Без jQuery наверно вряд ли так как таких верстальщиков тысячи на фрилансе.


Работа верстальщика мне почему-то не по душе. Мне может даже и нравится верстать, но именно в эту степь уходить не хочу, хочу все-таки в бэкенд. Просто в голове у меня такое представление, что уже даже соседский пес HTML\CSS курсы проходит и верстать учится и что верстальщиков ну уж очень много. Далеко сверх меры и найти работу будет сложно.
А вот в бэкенд я бы с головой хотел уйти и все все там изучать, даже надежда есть, что если будет несколько человек на одно место, то возьмут меня с мыслью "Да этот парень не просто выучил что-то и пришел штаны просиживать, в нем видно стремление к изучению. Глядишь через годик и сеньора нашего учить будет. Пожалуй, его и выберем."

>>531848

>Анон, который делает макет, а ты видел крутые фичи в хромовском отладчике, которые на пикрелейтед? Есть возможность отлаживать адаптивную верстку и есть возможность имитировать медленную скорость соединения.


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

И да, я сейчас начну тестировать шрифты, зарегистрировал уже сайт для этого отдельный. Сейчас перечитаю пост, ознакомлюсь со статьями, которые ты мне дал и покажу что получится сделать.
117 Кб, 1366x768
#31 #531964
Как решить эту проблему?
#32 #531978
>>531964
Ну же ребята хелп
#33 #531979
>>531956
У меня в вузике был предмет инженерная графика, вот очень похоже на верстку. Здесь линия 0,3мм, здесь 0,5мм, здесь шрифт с таким-то наклоном, тут с другим, здесь такой-то отступ, тьфу, параша.

мимо тожефронтенднелюблю
#34 #531980
Ну чуваки, ну кто ставил apache ну же отзовитесь
#35 #531988
>>531964
>>531980
Решетка в начале строки означает комментарий. Нужно раскомментировать строчку ServerName.
Чтобы раскомментировать, нужно удалить значок решетки.
#36 #531992
>>531988
Спасибо
52 Кб, 959x555
#37 #532033
Почему.
#38 #532049
>>532033
Потому что счетчик остановился на 11, ведь уже на 11 месяце долг у тебя меньше месячной выплаты, на 11 шаге выполняется строка 16 для 11 месяца и тут же выполняется if.
#39 #532055
А как удаленно работать, если все просят поговорить голосом, а у меня социофапия дошла до такой стадии, что я не могу себя заставить говорить по вебке, только писать могу.
#40 #532067
>>532055
Соври, что настолько нищеброд, что нет денег даже на микрофон. Ну или притворись немым. А лучше поработай над своей социофапией.
#41 #532068
>>532067
Скажи что ты глухонемой. И я не шучу.
Ты можешь даже льготы получить за это, особенно от европейских и амуриканских работодателей, они очень положительно настроены к инвалидам и тянкам которые занимаются ИТ.
#42 #532069
>>532068

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


Это ты про тех самых знаменитых, которые на слово ничего себе каламбур получился русским анонам верят?
#43 #532078
>>532067
Я так и сказал, он отморозился.
#44 #532079
>>532068
Можно сказать, что я глухонемая тянка в инвалидной коляске?
#45 #532080
Что такого фундаментального почитать по базам данных?
#46 #532083
>>532080
Дейт, Кодд.
#47 #532084
>>532080
Том Кайт, учебники по Oracle.
Кун с макетом. #48 #532104
>>531956
Фух, починили наконец мне интернет. Сел значит ставить шрифты и столкнулся с такой проблемой. Скачиваю шрифт, устанавливаю, все работает. Но вот курсивность и жирность выставить не могу. Я перебрал штук 5 и у всех жирность сразу максимальная. То есть можно только поставить 100 и чуть уменьшится. А курсив вообще не работает. Аноны, может подскажете хороший шрифт для тренировки, где и курсивность и жирность работает? Только мне бы какой-нибудь мудреный, с закорючками там. А то многие у меня уже откуда-то есть, а откуда удалять понятия не имею. Я так например не мог проверить работоспособность шрифта на макете.

И да, еще столкнулся с такой проблемой.
Скачал шрифт .ttf, поставил, все работает. Переконвертировал в .eot, добавил в порядке
.ttf
.eot
и не работает ни один.
Поставил
.eot
.ttf
и все заработало и в хроме и в ИЕ.
Я еще статьи не прочитал, только недавно вот сел за это дело. Может быть там разгадка есть. Типа определенный порядок форматов.
#49 #532126
>>531858
Переделал, посмотри еще раз структуру базы для testhub.
https://gist.github.com/nsdvw/b19480f1dd4f2f7f8de5

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


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

>если в чем-то не уверен, проконсультируется с сеньором или специалистом по БД


>В некоторых компаниях изменения в Бд делает разработчик, но с одобрения главного разработчика.


Ну это уже более адекватно.

> http://design-pattern.ru/patterns/single-table-inheritance.html


На будущее отметил себе эту идею, но тут у меня пока получается немного по-другому: у меня варианты ответа хранятся абсолютно независимо от вопросов, так что это не тот случай.
#50 #532168
Пацаны, однокурсник предлагает прибыльную работёнку, нужно задрочить джумлу и клепать сайты. Мне бабки нужны, готов выполнять обезьянью работу. Только опыт в пыхе скудный, по верхам ООП+MySQL, говнокодил на CodeIgniter когда-то. Можно ли брать CMS, обладая лишь поверхностными знаниями?
#51 #532176
ОП, как можно быстрее в сложный навороченный сайт быстрее вникнуть? Пришел на работу, там гора каких-то классов, кругом сплошные абстракции, контроллеры, ООП, вьюхи, билдеры sql запросов, мапперы, что за что отвечает непонятно. Плюс еще старый сайт через какой-то самописный бридж подключен и часть функций на него переведена. Коллеги мало помогают, сказали типа ну сиди и втыкай, уже на меня тикетов навешали, результатов требуют. Спросил есть ли доки и описания какие, ничего нет конечно. Вообще как в подобный сайт вникать? Пока сижу просто классы читаю и методы, но их там тысячи и что за что отвечает, хз. В части даже явный говнокод, а в других наоборот паттерны всякие сложные вроде Data Mapper. Коллега, заметил, везде die(var_dump(всякие переменные)) сует и в браузере запускает, щас тоже так стал, может еще какие способы есть?
#52 #532193
>>532176

> Коллега, заметил, везде die(var_dump(всякие переменные)) сует и в браузере запускает, щас тоже так стал, может еще какие способы есть?


Расскажи коллеге про xdebug. Ну и сам посмотри.
#53 #532195
>>532176
пздц
#54 #532210
>>532193
Для xdebug вроде нужно же страницу знать, не? А там когда запускаешь, все идет через какой-то центральный контроллер, а по ходу еще штук 100 других контроллеров, подконтроллеров, родительских и унаследованных классов и сервисов подключается. И не поймешь даже, откуда страница вылазит.
#55 #532213
>>532210
Фреймворк-то как называется? Зенд штоли?
Только не говори, что это самописная хуйня или йоба-смс от вована.
#56 #532220
>>532213
Самописная хуйня со вставками других фреймворков. В подключениях в Composere там засветились Zend, Symphony, Yii, CodeIgniter и еще штук 5 каких-то. Нахуй они там нужны, хз, но части классов на одном, части на другом. Чтобы этот зоопарк вместе работал, переходники самописные кругом рулят и кусками все разнесено. Работников, как я понял по отметкам @author в коде, там за несколько лет куча посменялась, и все свои тулы использовали, так что теперь в этом черт ногу сломит.
#57 #532222
>>532220
И еще, размер всего сайта - 3 гига. И это без картинок и БД и со сжатыми через grunt css и javascriptами. Только, чтобы выкатить на рабочий комп, целый день ушел.
77 Кб, 1004x472
#58 #532223
Привет, котаны, рад снова видеть нормальный официальный тред, но это лирика, а теперь вопрос.
Подскажите в чем проблема и где ее искать: есть бубунта 14,04, есть апаче2, есть вихост. Все работает, все сделано и настроено еще год назад. Страничка на указанном порту открывается, но вот я добавляю папку АССЕТС с ксс и тут же получаю в фаербаге 403 форбидден и адресс моего ксс файла, который лежит в директории на которую вхост создан(условно говоря МойПроект/АССЕТС/мейн.ксс). Что за нах? При чем с менйом я как-то порешал просто добавил права 777 на всю папку МойПроект, но вот добавляю еще один ксс файл и снова та же петрушка, но теперь именно с новодобавленным фалом. chmod на var/www/ уже пробовал, правда паранойи из-зa поставил u+w -R. Подскажите срочно если кто имеет возможность, а то я вместо написания кода уже полчаса туплю с этой проблемой.
#59 #532225
>>532104

Обычно 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» то есть «вес».
#59 #532225
>>532104

Обычно 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» то есть «вес».
#60 #532226
>>532220
пздц (2)

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

Если очень нужны деньги, то на крайняк можно на полставки ходить чистить вордпресс, а в свободное время учиться.
#61 #532227
>>532223
upd. в общем, сразу же попробовал опять прописать chmod 777 -R /home/huykin/myProject/, ребутнул апаче на всякий случай и все заработало. Ну что за пздц, котаны? Мне что после добавления каждого файла такой хуетой маяться? Почему цшмод не пашет на постоянной основе(я думал раз прописл права и все в ажуре, ан нет). Как быть, поясните чайнику от линупса.
65 Кб, 685x536
#62 #532228
>>532226
Как же я буду смс-то чистить?
#63 #532230
>>531910

А что в файле Slim/View/Twig.php? Ты его не трогал? Не менял там ничего?

Также, подключение автозагрузчиков должно идти первым.

Также, ты 2 раза создаешь объект Slim.

Ну и конечно потом надо будет подключить Slim через композер, это вторая задача и пора бы научиться им пользоваться.
#64 #532233
>>532226
Меня никуда не брали просто больше. Еще там какой-то скрам-хуям со скрам-мастером. На практике это выглядит так - висит доска во всю стену с именами всех, а на ней, какие на ком тикеты. Плюс отдельная доска, где завершенные тикеты на весь тим. Каждый день приходит начальник и с утра пидорасит, кто чем вчера занимался и почему на ком-то тикетов больше положенного висит. Все эти тикеты стремятся быстрее закрыть, чтобы не быть пидорасом. А если на доске с тимом тикетов мало образовалось, то пидорасы уже все, и собирают совещание, чтобы отхуесосить весь тим. Поэтому все коллеги стремятся хуяк-хуяк и в продакшн, как тут в прошлых тредах ржали. Наверное поэтому такой зоопарк и неразбериха.
#65 #532235
>>532233
Скрам-хуям, насмотрятся всяких там кремниевых долин и давай "перенимать опыт", а перенималка не выросла.
#66 #532237
>>531910

Чтобы понять в чем ошибка, поставь вот сюда: 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 ты эти задачи не выполнишь.

Командное взаимодействие это другое. Это не про то, что ты будешь просить других сделать часть твоей работы. Это именно взаимодействие, например если ты и кто-то еще делают пересекающиеся вещи, вы можете договориться как это сделать чтобы не дублировать код и не вызвать конфликтов.
#66 #532237
>>531910

Чтобы понять в чем ошибка, поставь вот сюда: 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 ты эти задачи не выполнишь.

Командное взаимодействие это другое. Это не про то, что ты будешь просить других сделать часть твоей работы. Это именно взаимодействие, например если ты и кто-то еще делают пересекающиеся вещи, вы можете договориться как это сделать чтобы не дублировать код и не вызвать конфликтов.
#67 #532238
>>532227
Вроде нужно своего пользователя в группу www-data добавить.
#68 #532249
>>532233
А когда начальник вместе с заказчиком собираются что бы всех похуесосить это Agile.
#69 #532250
>>532126

В твоей базе все же есть путаница. Как ты хранишь правильные ответы на вопрос с вводом текста или вводом числа с погрешностью? Как ты хранишь введенные студентом ответы на такие вопросы?

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


Так я говорил о том что есть разные типы вопросов и они наследуются. А не ответы наследуются от вопросов. Я имел в виду такое: есть 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
#69 #532250
>>532126

В твоей базе все же есть путаница. Как ты хранишь правильные ответы на вопрос с вводом текста или вводом числа с погрешностью? Как ты хранишь введенные студентом ответы на такие вопросы?

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


Так я говорил о том что есть разные типы вопросов и они наследуются. А не ответы наследуются от вопросов. Я имел в виду такое: есть 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
#70 #532251
>>532168

Это больше верстка будет чем программирование. HTML знаешь?

>>532176

Начни с ответа на вопросы:

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

— какие внешние хранилища используются (базы/кеши/NoSQL)
— какие внешние API используются?
— какой фреймворк/библиотеки используются? (посмотреть можно в composer.json или в отдельной папке вроде vendor если у вас нет композера)

Если используется фреймворк то документация есть в интернете. Уже хорошо.

Далее попробуй посмотреть структуру папок и понять что вообще там есть.

Потом попробуй разобрать от начала и до конца как происходит вывод какой-нибудь несложной и желательно новой страницы (например страница новостей или что-нибудь вроде нее). То есть от index.php, через роутинг до нужного контроллера и шаблона.

> Коллега, заметил, везде die(var_dump(всякие переменные)) сует и в браузере запускает, щас тоже так стал, может еще какие способы есть?


Отладчик, но иногда var_dump и удобнее.
#71 #532255
>>532220

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

>>532222

Да ну, не может быть. Если файл весит 10 Кб то 3 Гб это 300 000 файлов. Может быть это вес репозитория с историей?

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


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

>>532176

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

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

Ну и плюс, у тебя есть еще возможность в ходе исправления чуть-чуть улучшать код, убирать неэффективные места. добавлят комменатрии, давать понятные имена функциям и переменным. Это же бесценный опыт. Держись за свою работу зубами и когтями.
#72 #532256
>>532255
Спасибо, ОП, приму к сведению советы и постараюсь им следовать.
#73 #532257
>>532176

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

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

> что за что отвечает непонятно


Ты ведь знаешь что такое MVC и паттерны работы с БД ( https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md )? Значит должен понимать хотя бы примерно зачем они.

> через какой-то самописный бридж


Не SymfonyBridge имеется в виду?

Но начать надо с определения фреймворка, с разбора index.php, как делается роутинг.
#74 #532262
>>532251

>Joomla


>Это больше верстка будет чем программирование. HTML знаешь?


Лендинг на бутстрапе - мой потолок, всякие хитрые анимации на CSS3 делать не умею. На JS и JQuery игрульки писал. Но веб-кодер из меня никакой, увлечение этим длилось 2 месяца, забросил полгода назад. Сейчас нашёл книгу по джумле, там объясняют для тех, кто вообще не юзал PHP+MySQL. А однокурсник говорит, что нужно будет заниматься разработкой компонентов и модулей для Джумлы, при этом говорит, что Yii ему проще давался, lдля меня такие фреймворки - тёмный лес. Я же только на мини-фреймворках писал.
#75 #532265
>>532195

Если бы не было сложностей, не было бы и спроса на программистов. Получали бы свои 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

Не обязательно, хотя можно.
#75 #532265
>>532195

Если бы не было сложностей, не было бы и спроса на программистов. Получали бы свои 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

Не обязательно, хотя можно.
#76 #532266
>>532262

Компоненты чуть сложнее, там придется в PHP коде джумлы разбираться.
#77 #532267
>>532266
Он мне скидывал код, там название статического метода - нижний пробел, то есть вызывать его нужно так ::_
Ну это же издевательство какое-то.
#78 #532268
>>532267

Во времена PHP4 не было private и через подчеркивание обозначали непубличные методы, может в этом дело?
#79 #532282
>>531903

>Почему среди пхп быдлокодеров столько шизофреников?


>>532265

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

#80 #532299
>>532250
Сдаюсь.
Общую идею о наследовании таблиц понял, эти паттерны STI, ClassTI и ConcreteTI.
Но я не понимаю в нашем случае, какие уникальные поля есть у разных типов вопросов.

У нас есть объект Вопрос. От него наследуется два потомка: ВопросСВыборомОтвета, ВопросСВпечатываниемОтвета.
Пусть будет QuestionWithChoice и QuestionWithTyping.
От QuestionWithChoice наследуются классы QuestionWithSingleChoice и QuestionWithMultipleChoice.
От QuestionWithTyping наследуются классы QuestionWithTypingNumber и QuestionWithTypingString.

Но какие же у них уникальные свойства, и как будут выглядеть таблицы?
На данный момент вижу, что все свойства у разных типов вопросов абсолютно идентичны.
У всех есть
description (собственно текст вопроса)
points (кол-во очков за верный ответ - впрочем, может тут подвох? если можно выбрать несколько вариантов, то можно получить не 100% за правильный ответ, а меньше)
test_id
type ENUM

Тогда зачем мне бить вопросы на несколько "наследуемых таблиц", если я могу их положить в одну?
Я ничего не понимаю.
#81 #532302
>>532299

Уникальные свойства, которые есть только у одного типа вопросов:

— вопрос с текстом — правильный текст
— вопрос с числом — число и погрешность

Аналогично, «ответ студента на вопрос» тоже может иметь в зависимости от типа свойства «выбранный вариант», «выбранные варианты», «введенный текст», «введенное число» (которое при желании можно объединить с текстом).

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


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

Если ты положишь в одну это будет неявное STI.
#82 #532303
>>532299

Я не говорю что надо сделать 4 таблицы. Я говорю что ты должен понимать что и как тут наследуется. И метод выбирать исходя из плюсов, минусов и реально ли это реализовать в Юи. Я против STI ничего не имею.
115 Кб, 1200x900
#83 #532307
Потихоньку вкатываюсь в пыху из перла. Флоаты пыхи - дерьмище полное, 2 флоата даже сравнить по-нормальному нельзя. За ебаных почти 20 лет не смогли сделать нормальные флоаты, пиздец просто.
#84 #532308
>>532302

>— вопрос с текстом — правильный текст


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

> ENUM ('0', '1')


>Значения энума нельзя делать числом


Я же в кавычки взял. Или оно все равно приводится к числу? Хорошо, пусть будет yes/no.

>погрешность для числа


Это наверное допустимая разница между введенным и правильным числом?

Ладно, я лучше завтра на свежую голову. Нужно ведь еще разобраться >реально ли реализовать в Юи эти паттерны.
#85 #532309
>>532307
А, нет блять, в перле то же самое, но там хотя бы на изичах можно сравнить с помощью eq. Ебаное человечество, нет нормальных флоатов, пиздец.
#86 #532314
>>532307

Ты пишешь по моему глупости. Во-первых, сравнить числа через == в 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

Предлагаемая там формула очевидно неверная и дает ошибки если сравниваемые числа округляются в разные стороны. Если ты хотел упомнять этот способ то знай что он неграмотный.
#87 #532316
>>532308

> Хм, я думал хранить варианты ответов в отдельной таблице и завести там колонку "верный/неверный" ответ. И для типов вопроса "введенный текст" и "введенное число" тоже хранить их как единственно верный вариант ответа в таблице с вариантами.


У тебя не предусмотрена там погрешность. Да и бессмысленно делать отдельную таблицу для вопросов у которых ровно один вариант ответа — в этом случае логично ответ хранить вместе с вопросом.

> Может и от нее избавиться? Забить варианты тем же енамом в таблицу вопросов?


Как, интересно? Если хранить их в одном поле через запятую, то ты нарушаешь принципы нормализации, что одна ячейка дложна хранить одно значение (про нормализацию должен прочесть любой разработчик прежде чем браться проектировать БД так что советую набрать в гугле «нормализация баз данных» и прочесть, это любят на собеседовании спрашивать).

> Или оно все равно приводится к числу?


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

> Это наверное допустимая разница между введенным и правильным числом?


Да, в стиле Пи = 3.14 ± 0.01 или ответ = 10 ± 5%
53 Кб, 604x290
платина #88 #532321
Анон, есть ли у тебя стори о том как человек без математического образования зарабатывает на пхп-программировании. И вообще, такое возможно?
#89 #532322
>>532321
И еще. Скажи на своем или чужом опыте, анон, про необходимый минимум для Remote Work, а.
52 Кб, 604x453
#90 #532323
>>532322
Например, обязательно ли проживать на территории страны работодателя?
#91 #532324
>>532323
В большинстве случаев имею ввиду. Закономерность.
#92 #532329
>>532233
Няш, а что ты умеешь? Какие задачки от ОПа решал? Что на собеседовании спрашивали?
4 задача по JS #93 #532340
В чем у меня затык?

ЮНапиши функцию fmap(a, gen), которая принимает на вход 2 функции, a и gen, где gen — функция-генератор вроде той, что была в первом задании. fmap возвращает новую функцию-генератор, которая при каждом вызове берет следующее значение из gen и пропускает его через функцию a.
http://pastebin.com/7grA8c76
192 Кб, 960x936
Опросик. #94 #532342
Анонимус, а сколько часов в день ты тратишь на изучение|разработку? И на сколько продвигаешься за это время? Кол-во пройденного измеряй в своем материале.

Например:
4 часа в сутки.
50 страниц такой-то книжки такого-го автора.

или

столько-то тысяч строк кода за такое-то кол-во времени

Спасибо за внимание.
#95 #532343
>>532321
Важно не образование, а склад ума.
Иному человеку хоть профессора найми, он все равно не поймет математику.
#96 #532344
>>532321
У меня есть. Сидит на удаленке в какой-то немецкой конторе. Получает примерно 1.5-2к евро. Для бульбостана очень окей. Вышки нет, в школе сурово сосал в математике. В универ поступить не смог. Еще у него очень хуево с алгоритмами. Думаю даже задачу с кредитами с одного захода не порешает. Берет трудолюбием и упертостью. Сейчас вроде его отправили во фронтэнд.
Да и математику что мешает подучить на том же https://www.khanacademy.org/ для низкого старта + потом курсы с https://www.coursera.org/ и http://ocw.mit.edu/index.htm (да-да тот самый MIT совершенно на халяву). Мозги хорошо тренирует если небольшими дозами и регулярно. Это после отмороженной нашей школы кажется, что математика это ад и погибель, а на самом деле там красота и охуенность.
#97 #532345
>>532344
Не понял, он до фронтэнда он кем работал?
#98 #532346
>>532345
Пхп мидл девелопер.
#99 #532351
>>532321
А зачем пхп-макаке нужен матан?
#100 #532353
>>532176
Вот поэтому нужно сначала все выучить, а потом идти жаботать, дебил тупой.
#102 #532361
>>532230

>подключить Slim через композер,


что за композер? как через него подключать?
#104 #532371
>>532342

>50 страниц такой-то книжки такого-го автора.


чо бля? я перепечатываю с ютуба.
#105 #532373
>>532367
у меня аж голова заболела, пока читал.
#106 #532376
>>532342
Минимум 4 часа погромирования и минимум 50 страниц в сутки как раз.
Стараюсь обычно больше читать даже, чтобы создать себе общую картину, делаю также заметки и потом пишу код и стараюсь использовать новые фичи.
#107 #532377
>>532237

>код показывай


fontsmaket.esy.es
#108 #532379
>>532377

> 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 или вроде того).
#109 #532380
>>532377

Что я хотел сказать, если в шрифте несколько начертаний, то надо несколько файлов (для каждого начертания свой файл) и несколько правил @font-face.

«Начертание» здесь значит разновидность одного и того же шрифта. то есть «жирный», «курсивный», «обычный» и тд.
#110 #532382
>>532379
>>532380
Официально признаю у себя дцп.
Все понятно стало. Сейчас попробую настроить тот шрифт OpenSans к тексту на тестовом сайте fontsmaket.esy.es
И именно только то, что нужно, а не все начертания.
#111 #532389
А где у меня пхп.ехе лежит? или его нужно заново устанавливать? не ищется на компе. в какую директорию композер этот ложить?
#112 #532391
>>532376
Что вы там читаете, синтаксис? Не проще ли проекты делать с ютуба?
#113 #532392
>>532389
а все, нашел, вот я туплю порой.
#114 #532393
>>532389

Композер ставится установщиком, если ты ставишь руками то можно кинуть в директорию с проектом или в любую на твой выбор. В этом случае придется писать путь к нему в команде.
#115 #532394
>>532391
Вот так и рождаются быдлокодеры. И зачем все эти Макконнелы и Таненбаумы пишут свои книги? Я уж молчу про паттерны, бест практисы, рефакторинги и сам кампуктер саенс как таковой. А ещё дискретная математика и алгоритмы.
Ведь всё это НИНУЖНА, сел и хуячишь с ютубчика!
#116 #532396
>>532394
возник вопрос - в гугле загуглил да почитал.

>2015


>читать книги по программированию

#117 #532397
>>532396

Начинающий не сможет любую информацию найти и понять. Ну и не имея определенного опыта, трудно сказать хорошее советуют или плохое.
#118 #532400
>>532396
В голос с тебя.
Интересно, как ты гуглишь Макконнела или Боба Мартина?

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


>What does a good programmer's code look like? stackoverflow



топкек
#119 #532401
>>532397
Я к тому, что если уже работаешь в какой-то серьезной хуйне и получаешь дохуя, то есть смысл дрочить всякие алгоритмы, книги (которые устаревают быстрее видео с ютуба), а для нюфани главное, чтобы быстро и работало, а иначе это просто проеб времени на говно, которое не пригодится.
#120 #532406
>>532401
Если не ждать переводов, то книги выходят очень быстро. Я только в рашкокоммьюнити заметил такую нелюбовь к книгам, на реддитах и стаковерфлоу как раз частенько книги и рикаминдуют читать.
Ну, видимо поэтому второкурсники нормального вуза США работают в гугле, а нашим даунам и 10 лет опыта мало чтобы что-то лучше бодишопа найти.
#121 #532410
>>532406

В бодишопах тоже собеседования строгие. С видеокурсами максимум можно рассчитывать на провинциальную вебстудию.
#122 #532413
>>532410
А с чем можно рассчитывать хотя бы на бодишоп?
#123 #532415

>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.
#124 #532426
>>532410
я и живу в провинции, на что мне еще рассчитывать лол?
зато в видео все понятно, а от голой теории у меня жопа болит, потому что я перестаю ее понимать, если не вижу результат вывода.
#125 #532438
Мне кажется если вас всех избить, то у вас будет получаться лучше.
#126 #532444
>>532426

Ты ее не понимаешь так как скачешь по верхам, пропускаешь темы и берешься сразу за сложное.
#127 #532456
>>532438
Тебе в /hc
#128 #532461
>>532379
В общем вот что получилось.

fontsmaket.esy.es
#129 #532465
>>532444
А что я должен, калькуляторы сидеть писать?
422 Кб, 1125x812
#130 #532474
>>532406
Заябись книжку по ОПП за 90й год качнул да? Остальное про ООП мусолится то, что в любой онлайн документации есть. Вот очень мне интересно сидеть вычитывать, как в 1 и 2й версии обоже ООП не было, а потом какой-то хуй внезапно решил его ввести и насколько это спорный подход блаблабла, очень практично и очень пригодится столь ценное знание, чтобы понтануться перед столичными очкариками из Яндекса, что я аж обоже целую книгу про ОПП прочитал и теперь знаю ОБОЖЕ историю введения опп в пхп обожежежежежеж?
#131 #532490
>>532474
Качни последнюю «Java in a Nutshell» и ещё по C# есть неплохие книги.
583 Кб, 1933x1475
#132 #532508
>>532474
Видишь этот взгляд?
Это презрение.
#133 #532520
>>532508
Фаулеру можно.
Но ты не Фаулер.
81 Кб, 803x546
#134 #532525
>>532316
Если я правильно понял: у варианта ответа с вводом числа с клавиатуры есть свойства "правильное число" и "погрешность"; у варианта с вводом строки свойство "правильная строка"; у вопросов с вариантами вроде бы нет доп.свойств, но зато для них есть таблица с вариантами ответов.

Тогда так https://gist.github.com/nsdvw/b19480f1dd4f2f7f8de5

>Если хранить их в одном поле через запятую, то ты нарушаешь принципы нормализации


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

По нормализации имею общее представление.
Если своими словами, то первая нф: атомарность - в одной ячейке должно храниться только одно значение; вторая: неизбыточность - все свойства должны зависеть от первичного ключа, атрибуты зависящие от других атрибутов нужно выносить во внешние справочники; третья нф: транзитивность - поля не должны быть взаимоисключающими, например название города и почтовый индекс.
#135 #532526
>>532490
по шарпу да, но не пхп же.
#136 #532531
>>532314
Ну и нахуй ты столько написал? Я писал, что нельзя сравнить по-нормальному, без ебаных эпсилонов или подключения сторонних модулей. В перле с этим лучше >>532309. Если в том абсурдном примере, который ты привел, заменить != на ne, то флоаты будут сравнены по-нормальному.
А все, что ты написал наилегчайше гуглится/придумывается и вообще в официальном мане на странице флоатов все это обсосано в комментах.
>>532321
Большинство задач в веб-программировании решается без каких-либо тугих умственных размышлений, почти все можно решить на опыте и знаниях. Там даже хорошо, если чувак не выебывается и пишет тупой, одноклеточный код. Тем более, если это фронтенд.
#137 #532553
>>532531

Ты по моему так ничего и не понял
#138 #532555
>>532553
Ахах, объясни еще раз.
someApprentice #139 #532786
https://github.com/someApprentice/Cat-and-Mouse

Итак, кошки и мышки введут себя совершенно странно: выходят за придел карты, появляются где заходят и вообще ведут себя как захотят!
Уверен, что я просто где-то ошибся в этих строках:
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

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

Насчет поиска ошибок, сделай так: уменьши число мышей и кошек до 1-2-3 и сделай вывод при каждом ходе кто и как ходит, вроде

Мышь 1 переместилась с (10, 20) на (20, 30)

Чтобы увидеть где именно начинается странное поведение. После этого добавь вывод переменных, которые влияют на выбор хода (например $from, $speed, $x, $y из твоего примера) чтобы понять что приводит к таким ошибкам.

То есть мы идем от места ошибки к ее источникам.

Попробуй сначала найти ошибку сам. Если не получится, тогда я могу глянуть код.
#141 #533055
Котаны как остаток добить? http://ideone.com/naBQNj
Аноним #142 #533079
Кто-нибудь из Перми есть? У меня есть большой гараж, го коворкинг центр замутим. Вместе будем пхп изучать, мб стартап замутим. Там чисто, не воняет, но надо всякую фигню выкинуть, поставить столы, стулья, диваны. Интернет через usb-модем только, потому что там нет провода к модему.

У меня идея для стартапа: приложение, которое позволяет установить дату для изменения. Т.е. например 1 января 2017 года мы меняем Х на Y, все подписываются, форсят пост (петиция, ватева), обсуждают, а кто после 1 числа не выполнил изменение, тот лох и пидр. Монетизация за счёт рекламы и спонсорских постов.
#143 #533108
<?php
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
#144 #533123
>>533079

> приложение, которое позволяет установить дату для изменения. Т.е. например 1 января 2017 года мы меняем Х на Y, все подписываются, форсят пост (петиция, ватева), обсуждают, а кто после 1 числа не выполнил изменение, тот лох и пидр


Не понял нихуя. Твоё приложение может изменить семнадцать миллионов строчек кода?
#145 #533126
>>533108
$foo->$baz[1]
Вместо $baz[1] очевидно подставится его значение, то есть 'bar' (в массивах отсчет идет с нуля, поэтому элемент под индексом 1 это второй по счету). Поэтому выполнится $foo->bar.

>var $bar


Так писали в старом php4.
sage #146 #533128
>>533108
Потому что пхп - говно. Привыкай.
#147 #533134
>>533126

>$foo->$baz[1]


Спасибо, но
Мы обращаемся к элементу массива расположенного в объекте класса foo, но baz находится вне класса foo, вот это вот не понятно
#148 #533136
>>533126
Так написано в документации на русском
#149 #533143
Чем отличается elseif от else if кроме как возможности переноса if на новую строку?
#150 #533150
>>533134

>Мы обращаемся к элементу массива расположенного в объекте класса 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 и не путаться.
#151 #533155
>>533134
Ёбана, ты обращаешья к свойству объекта, используя переменную вместо прямого указания свойства. Т.е. $foo->$baz[1] а не $foo->baz[1], а $baz[1] у тебя имеет значение bar.
#152 #533158
>>533155
>>533150
Да понял я понял что заменяется, вопрос в другом, как-то нелогично сделано.
#153 #533161
>>533155
Тогда где он будет искать массив baz? Во всем файле или в своем блоке/области видимости?
#154 #533163
>>533158
Переменные как бы для того и нужны, что тут нелогичного.
>>533161
В своей области видимости искать будет, в данном случае везде кроме объекта foo.
#155 #533165
>>533161
В глобальной области конечно.
Это самая обычная переменная.

function foo() {echo 'hello, foo';}
function bar() {echo 'hello, bar';}
$x = 'foo';
$x(); // выведет 'hello, foo'
$x = 'bar';
$x(); // выведет 'hello, bar'

Вместо переменной подставляется ее значение, вот и все. С массивами то же самое, потому что элементы массива это обычные переменные.
#156 #533167
>>533165

>$x = 'foo';


>$x(); // выведет 'hello, foo'


кошмар
#157 #533177
>>532340
Помогите, в чем ошибка
#158 #533184
Подскажите плиз как зациклить $balance?

for ($god = 1; $god <= 20; $god ++) {
\t
\t$ostatokNekto = $nekto $procent;
\t$balance = $ostatokNekto
$procent;
\t$ostatokLet = $let + $god;
\techo "{$god} год спустя {$balance} лет человеку {$ostatokLet}\n";
#159 #533187
>>533108

За такой код в продакшене надо отрывать руки. Видимо тут поработали те самые странные разработчики, которые внгедрились в команду 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
#159 #533187
>>533108

За такой код в продакшене надо отрывать руки. Видимо тут поработали те самые странные разработчики, которые внгедрились в команду 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
#160 #533188
>>532340
>>533177

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

Также, я не понимаю, почему переменные объявлены во внешней функции. Есть необходимость чтобы они сохранялись между вызовами внутренней? По моему такой необходимости нет.
#161 #533190
>>533184

Переменная может вычисляться через ее старое значение, если она существует к этому моменту:

$balance = $balance + ...
$balance = $balance × ...

Если я правильно тебя понял.
#162 #533196
>>533190
http://ideone.com/Y8pZ8K
Полный код что-бы понятнее.
#163 #533209
А можно сделать чтобы функция возвращала два или более значений?
#164 #533211
Как определить, что запрос был сделан аяксом?
На stackoverflow говорят прикреплять заголовок xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
и проверять его в массиве $_SERVER.
http://stackoverflow.com/questions/2579254/does-serverhttp-x-requested-with-exist-in-php-or-not

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

>>533209
Массив возвращать.
#165 #533212
>>533209
в пхп указатели есть?
87 Кб, 735x554
#166 #533214
>>533211

>Массив возвращать.


а вызывать в таком случае как её?
$array = array(funcName($arg, $arg2), funcName2($args...))

?так штоле?
#167 #533215
>>533212
до 5.4 были ссылки.
#168 #533216
>>533212
Указатели на сосач.
#169 #533217
>>533215
сейчас есть?
#170 #533221
>>533214
Чо? Как обычно вызывать. хотя хуй этот пых знает
#171 #533222
>>533217
зависит от тебя кеек
#172 #533223
>>533222
в 5.7 есть?
#173 #533242
Что я пишу
<?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 не переносит строку?
#174 #533251
>>533211

> Как определить, что запрос был сделан аяксом?


А зачем? Что, аякс-запросы чем-то особенные?

Если это должно определять на тип результата (например вернуть 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), но на самой странице его не будет.
#174 #533251
>>533211

> Как определить, что запрос был сделан аяксом?


А зачем? Что, аякс-запросы чем-то особенные?

Если это должно определять на тип результата (например вернуть 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), но на самой странице его не будет.
#175 #533255
>>533196

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

$balance = $balance + 5;

И в учебнике (во втором уроке по моему) написан способ записать это короче.

Также, не называй переменные транслитом, не знаешь английский, используй гугл транслейт или яндекс-словари. А русские слова лучше писать в комментариях русскими буквами.
#176 #533256
>>533251
Спасибо
#177 #533268
>>533255
Спасибки про транслит я помню.
#178 #533270
>>533251
Легитимный ОП, ты ли это?
#179 #533276
что-то тиипа такого
echo "{${$volume + $credit}} \n";
#180 #533277
>>533276
Как вывести именно сумму
#181 #533279
пишет Undefined variable
Как ее определить?
#182 #533280
А нет, не то
#183 #533292
Вот у меня есть две переменные $a = 1, $b = 2;
Как вывести их сумму? То есть
echo "{${$a + $b}}" пишу так, он пишет undefined variable
Как определить эту переменную?
#184 #533303
>>533292
А так нельзя?
echo $a + $b;
#185 #533330
>>533292

Ты какую-то ерунду нагородил. Зачем эти доллары и скобки? Пиши echo $a + $b;
#186 #533331
>>533292

А если тебе надо это вставить в текст, лучш всего завести отдельную переменную:

$c = $a + $b;
echo "С равно $c\n";
#187 #533380
>>531765 (OP)

>- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл


Может есть у кого в fb2?
4 задание по JS #188 #533425
Ребята, просто скажите, что исправить, чтобы задачка решилась.
Не нужно мне давать никаких статей читать.
Просто скажите, что исправить.

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;
}
}
#189 #533430
>>533425

> Не нужно мне давать никаких статей читать.


Почему?

> Просто скажите, что исправить.


Суть задачек в том чтобы научиться. От готовых ответов ты ничему не научишься.
#190 #533431
>>533430
потому что у меня уходит на одну простую задачку 1-2 дня
пишешь-пишешь, зайдешь в тупик, пишешь сюда, тут ждешь ответа пару часов, потом исправляешь то, что тебе сказали, а оно все равно не работает
#191 #533432
убивается вся мотивация
я уже сделал максимум, что я мог сделать
но ее решить не могу.

хочу посмотреть ответ и пойти дальше
#192 #533433
>>533432

>потому что у меня уходит на одну простую задачку 1-2 дня


Это нормально. Там нет простых задач, по крайней мере для начинающих.
Нужно научиться терпению, для программиста усидчивость, внимательность и упорство одни из главных качеств.
Тем более в php, здесь и мозгов не нужно, только трудолюбие.
Да и куда тебе спешить, ты же мелкобуквенный школьник, у тебя полно времени.
#193 #533435
Лол, сделал все-таки ее.
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;
}
}
#194 #533438
>>533431

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

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

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

Также рекомендую показать решения других задач, вдруг там есть что исправить.
#194 #533438
>>533431

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

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

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

Также рекомендую показать решения других задач, вдруг там есть что исправить.
#195 #533440
На некоторых зарубежных сайтах иногда вижу вежливые предупреждения об использовании кук. Это просто тактичность, или может есть какие-то технические моменты, о которых нужно знать разработчику?
Что такого страшного в кукисах, чтобы писать о них ворнинги?

Например:
Ironmaiden.com uses cookies, by continuing to browse the site, you are agreeing to our use of cookies. Click here to find out more.
#196 #533441
>>533440

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

На моем сайте кстати внизу тоже про это написано мелким шрифтом.
#197 #533442
>>533440

Вообще, закон задумывался как лучше, предупредить пользователя что за ним следят, но вышло в итоге куча надоедливых предупреждений. А как избавиться от слежки? Сложно, но для начала можно отключить куки на всех сайтах кроме тех где они нужны (где есть логин или что-то сохраняется в куки). Хром позволяет делать такие вещи, я например отключил яваскрипт на всех сайтах кроме нескольких доверенных.
#198 #533444
>>533441
А что за секретные данные могут попасть в куки, что так беспокоиться о них? Ну пароль от этого конкретного сайта, статистика посещения.
Не понимаю, в чем конкретно угроза безопасности. Даже если куки будут украдены посторонними личностями, не вижу ничего смертельного.

>>533442

>как избавиться от слежки?


В чем слежка? Что запишут мой айпи или пароль на конкретном сайте?
Да и слежки бояться, на улицу не выходить. В людях заложено пялиться друг на друга и оценивать, лезть не в свое дело.
А в будущем города будут усеяны видеокамерами, и все операции производиться по биометрическим данным (например отпечатки пальцев вместо кредитной карты в магазине). Так что параноикам не поздоровится.
#199 #533445
>>533444

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

Но есть вещь и похуже — это 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 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо. Тем более как мы знаем, многие наши крупные руководители пользуются американской техникой с так называемыми «облачными» технологиями которые заботливо «бекапят» (это в наше время так называется) всю информацию прямиком на сервера подконтрольные США. Это конечно немного другая история, но все равно нехорошо как-то.

> В людях заложено пялиться друг на друга


Одно дело ты видишь на улице тысячу человек и ни одного не запомнил, другое дело, набираешь «Иван Иванов» и видишь полное досье и историю посещенных страниц.
#199 #533445
>>533444

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

Но есть вещь и похуже — это 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 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо. Тем более как мы знаем, многие наши крупные руководители пользуются американской техникой с так называемыми «облачными» технологиями которые заботливо «бекапят» (это в наше время так называется) всю информацию прямиком на сервера подконтрольные США. Это конечно немного другая история, но все равно нехорошо как-то.

> В людях заложено пялиться друг на друга


Одно дело ты видишь на улице тысячу человек и ни одного не запомнил, другое дело, набираешь «Иван Иванов» и видишь полное досье и историю посещенных страниц.
someApprentice #200 #533447
https://ideone.com/5nFbAL - как это понимать?
#201 #533448
>>533447

case равносилен такому:

$value = $i; // вычисляем выражение в switch 1 раз

if ($value == ($i > 0)) { ... } // по очереди сравнивем его с выражениями в case
elseif ($value == (($i < 0))) { ... }
else { ...}

Обычно только пишут так:

switch (true) {
case $x == 1 : ...
case $x > 5: ...
..
}

А у тебя какой-то особо усложеннный пример. Не пиши такой код.
#202 #533450
>>533444

Ну и говоря об улице. Ты не имеешь права просто так следить на улице за кем угодно, в законе есть соответствующая (уголовная) ответственность. Вопрос, а почему бы не применить аналогичные нормы к умникам, которые пытаются стоять за спиной и пялиться в твой монитор с помощью всех этих систем?
2045 Кб, 330x204
#203 #533452
Напоследок не могу не скопировать картинку с той статьи про анонимность.
#204 #533459
делаю файлообменник на слиме. Чтобы юзер мог выбирать галочку публичный-не публичный файл в поле нужно ставить значение ENUM "0", "1"? И тогда, если он ставит галку в чекбоксе, то в поле передается значение 1, в ином случае поле будет иметь значение ноль?
#205 #533460
>>533108
зачем два разаз определять переменую bar?
40 Кб, 483x900
#206 #533461
>>533445
Довольно познавательно. Меня всегда интересовал вопрос безопасности. Довольно долгое время меня беспокоит вопрос о Tor Browser. У него открытый код, но поскольку я не очень хороший программист, я не понимаю что там написано. Плюс ко всему меня настораживает что проект начинался в армии США.
#207 #533462
>>533445
кстати, да, если ты не вылогинился из своих соцсетей, то чисто теоретически на стороннем сайте могут узнать айди соцсети. То же самое с регистрацией, когда вводишь на левых сайтах мыло и пароль, который у тебя от мыла - просто могут смотреть твой ящик, привязку вебкошелька, да вообще что угодно. Особенно эта параноай развивается, если проводишь все время в сети.
40 Кб, 483x900
someApprentice #208 #533463
>>533461
Забыл подписаться...
#209 #533464
>>533445

>По твоему, это справедливо, что гигантские массивы данных идут туда (и угадай с 3 раз, собирает ли их американская разведка или нет), а не например в Москву? Я считаю, несправедливо.


Пидораха, залогинься.
#210 #533465
>>533461
Да, дети, не стоит читать забаненные роскомом новостные сайты через Тор, фу быть такими, сидите в чебурашке не рыпайтесь.
#211 #533473
Какую IDE для php выбрать? Установил всякие апачи, но в книжке пишут что лучше прогать в иде
#212 #533475
>>533473
Brackets ставь и хватит.
#213 #533476
>>533473
PhpStorm. на рутрэкере есть с ключом.
#214 #533478
>>533462
Не знаю, я в целях "безопасности" использую фейки.
В соцсетях у меня только в вк пустая страница, почты постоянной вообще нет. Часто пользуюсь угнанными у быдла акаунтами. В прошлом году выкладывали 4 млн взломанных ящиков мэйлру, оставил себе около сотни.
Не понимаю, чем мне может навредить даже потеря такого акаунта, не говоря уже о том, что кто-то узнает айди.

>>533450

>Ты не имеешь права просто так следить на улице за кем угодно


Совсем зажрались в своей Москве.
Тут на улице быдло может тебя невозбранно и обматерить и побить, а на него видите ли смотреть незаконно.
#215 #533492
>>533473
Вот: https://en.wikipedia.org/wiki/List_of_PHP_editors
Из бесплатных самый популярный Sublime Text 3.
Есть ещё гитхабовский Atom: https://atom.io/
#216 #533501
Добрый день, тредик. Давненько не заходил к вам, в основном потому что на работе хватает общения с php в последнее время и завален задачками. (работаю уже 4 месяца)

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

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

Можно как я понимаю слать письма напрямую средствами php - http://php.net/manual/ru/function.mail.php

либо через smtp сервер.

Через что лучше слать?
Я плохо пока понимаю с чем имею дело и простите за тупые вопросы.
#217 #533506
>>533501
А, еще кое что забыл. Как реализовать отписку от рассылки? Пока думаю что в базу вкручу каждому пользователю уникальный токен, который будет приходить в письме вместе со ссылкой на скрипт для отписки

site.ru/unsubscripe.php?token=current_user_token

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

Выглядит просто, есть ли другие более изящные вариант?
#218 #533509
>>533506
Какие фреймворки ты знаешь? (Риторический вопрос)
67 Кб, 526x327
#219 #533518
>>533509
На Codeigniter на работке ковыряюсь. У меня под рукой даже есть функция рассылки писем в одном проекте, а что?
Кун с макетом. maketi.esy.es #220 #533538
В общем, ОП, я не стал ждать когда дашь свой комментарий по поводу тестового сайта со шрифтами. И попытался настроить шрифты на макете. Вроде бы получилось.

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

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

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

И да, в IE теперь при наведении нормально углы срезаются на работах в портфолии, но вот не помню чтобы я это чинил, магия какая-то.
#221 #533545
Как узнать список модулей апача (на хостинге, например) средствами php?
Мне нужно отдавать файл через readfile, если не включен x-sendfile. Как это проверить?
apache_get_modules не предлагать, ибо он в списке disable_functions.
#222 #533558
>>531765 (OP)
Оп, я почти случайно зашел в /пр, по своим делам, и случайно же увидел этот тред.
Такая-то милота написана, читал оп пост и второй и не мог не улыбаться.
Добра тебе и удачи.
ОП #223 #533569
>>533558
Ой, спасибо милашка :З
#224 #533580
Делаю файлообменник, видео файлы принимать не хочет, говорит, слишком много байтов и content length выдает ошибку. Что делать-то? это XAMMP
#225 #533581
А вообще, кто учит, не хотите конфу организовать?
#226 #533583
>>533478
у меня не в вк, но в другой соцсети реалка, например. нет, ну не все же такие аутисты в сети одними фейками пользоваться, на тот же веб кошелек ты должен присылать свой паспорт, многие системы и программы требуют ввода телефона, который тоже зареген на паспорт.
#227 #533587
>>533581
Этот тред тогда что по-твоему?
#228 #533588
>>533581
Я не против, например, но где? Если в скайпе, то сразу нет. Зелло - неплохой вариант.
#229 #533590
>>533580
Есть лимиты на максимальный размер принимаемого файла и общий размер отсылаемых постом данных.
Выставляются в настройках php.ini
upload_max_filesize
post_max_size
Посмотри в phpinfo, чему они равны сейчас, выставь значение побольше.
#230 #533594
>>533588
У Паши можно. В Telegram.
#231 #533596
>>533509
И где ты? Зачем ты вообще спрашивал про фреймворки? Сижу теперь тебя жду пусть даже и просто за жизнь потереть, а не за рассылку
#232 #533610
>>533587
Ну вот например сегодня целый день не отправлялись посты, а если сосака упадет на неделю, где я буду задавать тупые вопросы?
#233 #533611
>>533590
спасибо
#234 #533624
Оп. Опять хочу потревожить тебя для уточнения задачи про кота и мышь.
Есть вот такая ситуация.
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 защищена?
#235 #533632
Сап, программач, хотел написать днем, но постинг не работал...
Подскажи, /pr/, вот мне достался по наследству от знакомого сайт, но я понятия не имею как им грамотно управлять. Решил решить проблему фундаментально, создать простенький сайтик ручками, без всяких CMS и прочего. Порыскал по форумам и напоролся на такой совет:
Сделай простой сайт (не статический, а с базой данных).
И усложняй, приделывая:
— админку для добавления, удаления и редактирования страниц (практика основных простых запросов к БД)
— сделай регистрацию и авторизацию на своем сайте (практика работы с $_POST и $_GET, сессии, cookies)
— сделай чтобы страницы могли быть вложенны друг в друга и чтобы можно было в админке изменять у страницы родителя. На сайте выводи дерево страницы. (познаешь основы «деревьев», рекурсию)
— сделай форму для закачки файла (практика прастейшей работы с файлами)
— сделай чтобы закачивалась картинка и масштабировалась (практика работы c библиотекой GD для работы с изображениями). Можно капчу попробовать сделать кстати.

Вопрос заключается в следующем. Если есть опыт работы с html, но абсолютно отсутствует знание PHP и представление о базах данных, то хватит ли мне первой ссылки ОП-трэда и вообще, нужна ли она? Нужны ли какие-то специфичные учебники по БД? Пользоваться консолью умею, практикую, MySQL установлен, как и Apache, но, опять же повторюсь, не имею понятия что это вообще такое.
#236 #533635
>>533624

Никакую. Можно только ходить вокруг и облизываться.
#237 #533641
>>533632

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

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

> Нужны ли какие-то специфичные учебники по БД?


Нужны. В ОП посте есть задачи на SQL и там ссылки на туториалы для нубов.
#238 #533645
>>533641
Спасибо, буду работать.
#239 #533670
Как вывод системной команды построчно перенаправить в сокет?
#240 #533696
test
#241 #533702
Я вам посмеяться принес: http://siliconrus.com/2015/08/china-girls/
someApprentice #242 #533714
>>532946
ОПчик, я почти исправил все ошибки, осталась последняя:

Животные по карте перемещаются таким образом: https://ideone.com/UTm5nA

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

if (is_object($this->map['x']['y]') или if (!$this->map['x']['y'] = '')?

И можно ли обратиться к объекту таким образом: $this->map['x']['y']->Die();

Сэнкс фо ридинг
#244 #533716
Мануал по PHP от опа?
#245 #533718
https://www.youtube.com/watch?v=dYFaJiaK9lI
С 49:00 и до конца.
"Сделайте ваш код более декларативным...", "ООП призвано решить проблему изменяемого состояния в императивном программировании..." и т. д.
Чёт я не понял ничего. Что он хотел сказать?
#246 #533721
Аноны, как вы храните информацию? Evernote, org-mode и т.п.? Просто складируете файлы на диске? Облачные хранилища/органайзеры? Может кто-то юзает вики?
#247 #533722
>>533721
Какую информацию?
#248 #533724
>>531765 (OP)
Сколько мне еще эти сайты строчить? Я чот заебался уже файлообменник делать.
#249 #533726
Алсо как вот этой функцией отформатировать выводимые данные, как в ргхосте?
exif_read_data("file.jpg");
foreach($exif as $key=>$section) {
foreach($section as $name=>$val) {
echo "<tr><td>$name:</td><td>$val</td></tr>";
#250 #533728
>>533724
Не делай. Можешь попробовать устроиться на работу, если хочешь.
#251 #533729
>>533718
шизофрения какая-то.
#252 #533730
>>533728
Не получается чот( Все весомое портфолио требуют, опыт работы и знание более одного фреймворка.
184 Кб, 665x662
#253 #533732
А нельзя просто сделать сайт, чтобы деньги приносил и все?
#254 #533735
>>533730
Ну делай, епт. Если задолбался, сходи развейся, и снова за работу.
#255 #533736
>>533732
Можно.
#256 #533740
>>533624
Оп, проконсультируй.
Заодно посмотри, пожалуйста, правильно ли я реализовал ,предложенный тобою, алгоритм.
https://github.com/Integer64/myTestSite.dev/blob/master/CatMouse/models/Cat.php>>533624
#257 #533746
>>533736
А как?)
>>533735
Я не могу развеяться, пока все не сделаю.
#258 #533749
>>533746
Сходи побегай, сделай физ-нагрузку, потом прими душ. И с чистой головой шуруй работать дальше над проектом.
#259 #533751
>>533740
Зачем ты диры везде ставишь, оно же итак инклудит то, что рядом лежит?
#260 #533752
>>533721
Юзаю медиавики. Туда складирую все знания, полученные мной, и которые мне кажутся полезными.
#261 #533753
>>533746

> А как?)


Сделай нужный людям сайт. Ставь рекламу. Всё.
#262 #533756
>>533753

>Сделай нужный людям сайт


порнолаб что ли?
#263 #533760
>>533756
Тут не проецировать нужно, устрой опрос где-нибудь.
#264 #533761
>>533760
Посоны, давайте конфу в слаке сделаем, а? Второго такого падения сосаки моя душа не выдержит.
#265 #533762
>>533761
давайте. я правда не знаю, что это.
#266 #533764
>>533751
Не все инклудит. Можешь проверить.
#267 #533767
>>533722
Статьи, заметки, ссылки, схемы, диаграммы, короткие аудио и видеоролики по определённым темам и т.п.
>>533752
Какого вида информацию туда вносишь? Текст и картинки?
Пробовал установить медиавики, работает просто пиздец как медленно. Ты кеширование php включал? С ним быстро работает?
#268 #533771
>>533762>>533761
https://php-pr.slack.com/
Вот, запилил кароч. Попробуйте зайти и отписаться.
Есть разделы: общий, для задачек из учебника, для хтмл-цсс-жс. Ещё есть /b/.
Сразу оговорюсь, что работать это будет только при шатании макабы, в обычное время постинг будет закрыт. Я пока, правда, не разобрался как это сделать.
#269 #533774
>>533771
Ах да. Сначала надо зарегистрироваться на самом слаке.
#270 #533775
>>533774
Регистрация нужна чтобы создать команду. В существующую приглашать надо.
#271 #533776
>>533771
можешь открыть доступ с доменов
linuxmail.org
#272 #533777
>>533775
>>533776
Ща, пагодьте.
#273 #533778
>>533777
Team Settings -> Team Sign Up Mode -> expand -> Any email address from these domains:
#274 #533779
>>533778
Да открыто уже.
#275 #533780
>>533779
без собаки поставь, а то не пускает
#276 #533781
>>533780
без собаки стоит
#277 #533782
>>533771
https://php-pr.slack.com/signup
Вот новая ссылка.
#278 #533788
Так пацаны проясните пару моментов.

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

Так вот, для управления контентом нужно все равно юзать какую-то cms, или это пишется самостоятельно? Сколько времени занимает?
Например на тот же wordpress портануть дизайн и js особых проблем не составляет, а с php-скриптами что делать? Как это всё взаимодействует с бд и всякой логикой cms? Нужно ебаться с плагинами?

Короче, к чему вы пришли в решении таких задач? Как такое делать правильно?
#279 #533793
>>533782
Не нашёл я, как можно разрешить вход всем.
Кароч, оставляйте, свои email`ы, я отправлю вам инвайт.
#280 #533794
>>533793
deuzsite@gmail.com
#281 #533795
>>533788
По вордпрессу надо документацию читать, там функции дописываются через пхпадмин. А так, если нужен особый функционал и дизин, то просто берешь фреймворки и сам пишет цмс, я так понимаю.
#282 #533801
>>533771
А зачем закрывать постинг в обычное время? Вдруг вакаба зашатается, а ты будешь дрыхнуть и люди не смогут постить.
#283 #533804
>>533801

>а ты будешь дрыхнуть


Это маловероятно.
#284 #533808
>>533804
>>533801
Но если аноны словно по щелчку пальцев будут послушно перекатываться обратно при возобновлении работы сосаки, то закрывать постинг действительно не будет смысла.
#285 #533810
>>533718
Он хотел сказать: "юзай ООП и будет тебе счастье"
#286 #533811
>>533810
Но в начале видео он говорит, что ООП часто пихают там, где не надо.
#287 #533813
>>533811
Но это же вовсе не значит, что его надо избегать.
#288 #533816
>>533767

> Какого вида информацию туда вносишь? Текст и картинки?


Всю, которая требуется. От текста и ссылок до видеороликов. Сейчас база почти 200 гб (с медиафайлами)

> Пробовал установить медиавики, работает просто пиздец как медленно. Ты кеширование php включал? С ним быстро работает?


Не знаю, у меня на обычном LAMP-стеке шустренько работает. Под виндой на опенсервере тоже нормально работало.
#290 #533818
>>533817
Бойанисто, но схоронил.
#291 #533820
>>533811
Просто есть вещи, которые с помощью ООП сделать в разу легче. Понятно, что если тебе надо написать прогу, которая, напирмер, выводит n-ое число фиббоначи, то тут ООП пихать, как пальба по воробьям из пушек. Это утрированно, конечно, но сути это не меняет.
#292 #533823
>>533782
>>533771
>>533793

https://slack-auto-for-php-pr.herokuapp.com/
Пробуйте получить инвайт тут. Сами.
https://github.com/blackberryJam/abiturients #293 #533829
>>530370
>>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#Клиентская-валидация

В общем, твое решение производит хорошее впечатление. Советую переходить к задаче про файлообменник.
https://github.com/blackberryJam/abiturients #293 #533829
>>530370
>>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#Клиентская-валидация

В общем, твое решение производит хорошее впечатление. Советую переходить к задаче про файлообменник.
#294 #533833
Аноны, а я тут https://github.com/codedokode/pasta/blob/master/student-list.md добавил еще пару разделов. А вы хоть читаете все эти примечания?
#295 #533834
>>533833
Я читал.
#296 #533835
>>533833
Я начал читать учебник по PHP (первая ссылка). Вот как дойду до фреймворков, так сразу присоединюсь.
#297 #533837
>>533730
У меня ничего не потребовали. На пробный срок так берут.
#298 #533839
>>533730
Ну так портфолио из таких сайтов и делается.
#299 #533840
>>531765 (OP)
Почему у меня на некоторых картинках выскакивает ошибка при инициализации функции exif_read_data???
#300 #533842
>>533829
Кстати, не смог подключить твиг в слим. не знаю почему. Использовал композер.
#301 #533845
Привет пэхаписты, решил отдохнуть от изучения крестов на некоторое время и в это самое время начать учить что-то веб ориентированное, выбор пал на пхп, как вы догадались. Воарос такой, сложно ли мне будет вкатиться к вам уже имея какие-то знания в программировании? В крестах дошел до наследственности и написал пару практических программок.
еще хтмл начал учить, но это я так, просто написал
#302 #533846
>>533845

>сложно ли мне будет вкатиться к вам уже имея какие-то знания в программировании?


Какой-то глупый вопрос.
5 задание по JS #303 #533849
http://pastebin.com/hy8ymjrX
не получается
#304 #533852
>>533839
из каких таких? у меня даже никакой идеи для сайта нет, буду на остальных фреймворках после файлообменника бложики делать.
#305 #533853
>>533829
Спасибо за ответы.

>Doctrine 2 в качестве библиотеки data mapper


Это значит, что брать DBAL, а не ORM? Чем они, кстати, отличаются? Я так и не понял.
Фреймворком решил взять Silex.

>Советую переходить к задаче про файлообменник.


Я уже почти начал. С JS, DOM, AJAX только разберусь.
#306 #533854
>>533845
Сложно. Предыдущие знания мешать будут, новые не влезут. Нужно сначала старые стереть.
#307 #533855
>>533852
Тебе дали студентов, фалообменник, тестхаб. Зачем ещё что-то придумывать?
#308 #533857
>>533853

>брать DBAL, а не ORM


Вернее, наоборот?
https://github.com/MindiMakridi/RESTFUL #309 #533859
>>531680
>>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/MindiMakridi/RESTFUL #309 #533859
>>531680
>>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 на всякий случай.
#310 #533861
>>527570
Исправил что мог.
Добавил древовидные комментарии, капчу.
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 одобряешь или нет?
#311 #533862
>>533845
Норм всё будет. Особенно с этим учебником в ОП-посте, так вообще. Там всё понятно очень. Есть, конечно, пара вопросов, которые не освещаются в начале, чтобы не забивать мозг, но если интересно, можно же и самому найти ответы.
#312 #533863
>>533853

Доктрина 2 это ORM (ORM это штука сохраняющая и заружающая объекты из базы — Object to Relational database Mapper) реализующий паттерн Data Mapper который ты наверно уже знаешь. Только с ней тебе не придется писать руками класс data mapper — она предоставляет готовый. Ну и там еще десятки фич, вроде поддержки отношений между сущностями, ленивой загрузки и тд., это очень мощная библиотека.

> С JS, DOM, AJAX только разберусь.


Начинать можно и без них, если что.
739 Кб, 1920x1094
#313 #533868
У меня котик гнойными сопельками заболел, надо заставить себя сводить его к ветеринару.
#314 #533875
>>533863
http://www.doctrine-project.org/projects/orm.html
То есть брать вот это?
#315 #533878
>>533849
ОП, не забывай про горе JS-ера
#316 #533881
Аноны, вот читаю я про PHP и немного не понимаю. Есть 2 варианта:
echo "Всего {$number} элементов";
echo "Всего $number элементов";
Какой вариант правильнее? Интерпретатор ни на тот ни на другой не ругается.
#317 #533882
>>533859

>А почему URL передается в конструктор?


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

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


А как же https://github.com/MindiMakridi/RESTFUL/blob/master/lib/Thumbnail.php#L74 ?
https://github.com/never3ver/vector #318 #533883
>>531508
>>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-го ранга на один ранг с целью расширить их полномочия.

Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
https://github.com/never3ver/vector #318 #533883
>>531508
>>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-го ранга на один ранг с целью расширить их полномочия.

Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
#319 #533884
>>533882

Ладно, URL в конструкторе пусть остается, а вот формулы надо бы разобрать и упростить.
#320 #533885
>>533859

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


>


>- размер картинки-превьюшки (ее пропорции совпадают с исходной для метода scale)


>- x, y, w, h для вырезаемой области из исходной картинки (совпадают с исходной картинкой для метода scale)



Джисус факин крист, я просто поставил style="max-width:400px". Нахуй так ебаться вообще?
#321 #533887
>>533885
И правда. Ты победил.
#322 #533889
А ничего что я файлообменник делаю вообще не используя классы? На чистом слиме и if-ах?
#323 #533892
https://github.com/MindiMakridi

Вот я вообще не так обменник делаю. Смешиваю функции во вьюз. Что же мне все таки подключать твиг и выносить все функции в классы, а потом вызывать вот так -> ??
#324 #533894
>>533892
Эй, зачем ты прикрепил мой гитхаб?
#325 #533896
>>533771
Ну и нахуя ты это сделал?
Есть же божественный телеграм.
#326 #533897
>>533894
Потому что я сделал обменник не так как ты.
#327 #533898
Сильно стемный код? Нужно все функции и переменные классы выносить?
#328 #533899
>>533896

>Есть же божественный телеграм.


Я им не пользовался. И у слака возможности, вроде как, шире. Этакая смесь irc-чата и борды.
51 Кб, 1113x852
#329 #533900
Сильно стемный код? Нужно все функции и переменные классы выносить?
#330 #533901
>>533896
Он же поцреот и не пользуется русафопскими сайтиками.
#331 #533902
>>533896
Ну и зачем вы перекатываетесь с одного чата в другой? Создайте кто-нибудь голосовой чат, чтобы пользоваться им всегда, а не только во время падения двача. Как я уже говорил зелло рация - неплохой вариант. Ну или аналоги.
#332 #533903
>>533897

>Потому что я сделал обменник не так как ты.


Чтобы сделать файлообменник не так как я - достаточно его сделать. Я не знаю, где ты там нашел файлообменник.
#333 #533904
>>533900
Не понимаю, как вы в светлых темах кодите?
Мне нужна тёмная кулхацкерская - иначе скучно. И читается код легче на тёмной.
Задания по JS #334 #533906
>>532055

Если хочешь работать с западными заказчиками, может еще и вебка понадобиться. Так что лучше тренируйся где-нибудь, не знаю, найди голосовой чат в /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.
Задания по JS #334 #533906
>>532055

Если хочешь работать с западными заказчиками, может еще и вебка понадобиться. Так что лучше тренируйся где-нибудь, не знаю, найди голосовой чат в /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.
#335 #533909
>>533896
>>533899
Посмотрел. Пашино поделие нам не подходит.
#336 #533910
>>533885

Трафик лишний, качество страдает.

>>533889

Ну делай, потом мы скажем что не так.

>>533892

Покажи на проверку или покажит кусок кода, посмотрим. Так не понятно.

>>533896

С встроенным деаноном?

>>533900

Вообще да, ужасно, ты смешиваешь логику получения данных и логику вывода. Иди почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html

Если такому коду учат в учебнике, подумай о поиске более хорошего.

>>533902

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

>>533904

переключаться между темным и севтлым неудобно для глаз.
#336 #533910
>>533885

Трафик лишний, качество страдает.

>>533889

Ну делай, потом мы скажем что не так.

>>533892

Покажи на проверку или покажит кусок кода, посмотрим. Так не понятно.

>>533896

С встроенным деаноном?

>>533900

Вообще да, ужасно, ты смешиваешь логику получения данных и логику вывода. Иди почитай http://www.phpinfo.su/articles/practice/shablony_v_php.html

Если такому коду учат в учебнике, подумай о поиске более хорошего.

>>533902

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

>>533904

переключаться между темным и севтлым неудобно для глаз.
#337 #533912
>>533910
трафик лишний, а триллиард строчек лишнего кода не лишний?
#338 #533913
>>533910
>>533902

>Вот, это надо анону который стесняется с заказчиками разговаривать, пусть практикуется там.



Поддерживаю. Сам сначала боялся даже на каналах с небольшим количеством человек разговаривать. А сейчас могу спокойно на любой зайти и нормально пообщаться. При чем изменился в довольно короткие сроки. Да и тем более там никакого деанона, можно регаться на фейкомыла. 2 года там уже сижу. Очень советую.
#339 #533915
>>532413

Там могут и ООП с паттернами спрашивать и фреймворк уровня Симфони 2 или Юи 2. Зависит от компании. Поищи вакансии и посмотри, погугли про то как там собеседования проводят.

>>532465

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

>>532474

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

>>533055

Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 59139, а около 61270.

Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда он маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;

Попробуй переписать код внутри цикла примерно так:

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

«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
#340 #533916
>>533906

>Задачи по JS


Ок, гамбургеры переделаю. Задачу про Вектор решал.

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


До меня это дошло после того, как решение было запощщено.
#341 #533920
>>533624
>>533740
Походу надоел я ОПу, со своим решением кота и мышки )
#342 #533921
>>533913
Не, ну ты зайди хоть зацени, какая удобная штука этот слак.
Ну и насчет зелло: его вроде под ubuntu нет.
#343 #533923
>>533223

Есть, мануал открой.

>>533270

У нас же анонимный тред.

>>533279

Чтобы создать переменную, достаточно что-то в нее записать например

$a = 0;
$b = '';

>>533459

В ENUM нельзя использовать числа так как MySQL понимает их как номера опций, а не значения. Надо либо использовать yes/no либо TINYINT(1) NOT NULL .

> И тогда, если он ставит галку в чекбоксе, то в поле передается значение 1, в ином случае поле будет иметь значение ноль?


Что передает чекбокс от базы вообще никак не зависит. Запрос формирует браузер, так: если галочка поставлена то в POST добавляется элемент с ее именем (указанным в name) и значением 'on' (или другим не-пустым), а если нет то не добавляется.

>>533461

Можно попробовать погуглить мнение других людей. Также, однажды ФБР проводило операцию по раскрытию пользователей тора, оно захватило сайт в .onion и добавила туда яваскрипт, экплуатирующий уязвимость в фаерфоксе. также, в Китае тор блокируют. Видимо это говорит о том что напрямик взломать протокол не получается.

> проект начинался в армии США.


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

>>533462

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

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


Если ты активно пользуешься сетью, то да, данных можно выудить много. Билеты с паспортными данными, покупки в магазинах с адресом, интернет-банк и тд. И видеть их может любое браузерное расширение с соответствующими правами.
#343 #533923
>>533223

Есть, мануал открой.

>>533270

У нас же анонимный тред.

>>533279

Чтобы создать переменную, достаточно что-то в нее записать например

$a = 0;
$b = '';

>>533459

В ENUM нельзя использовать числа так как MySQL понимает их как номера опций, а не значения. Надо либо использовать yes/no либо TINYINT(1) NOT NULL .

> И тогда, если он ставит галку в чекбоксе, то в поле передается значение 1, в ином случае поле будет иметь значение ноль?


Что передает чекбокс от базы вообще никак не зависит. Запрос формирует браузер, так: если галочка поставлена то в POST добавляется элемент с ее именем (указанным в name) и значением 'on' (или другим не-пустым), а если нет то не добавляется.

>>533461

Можно попробовать погуглить мнение других людей. Также, однажды ФБР проводило операцию по раскрытию пользователей тора, оно захватило сайт в .onion и добавила туда яваскрипт, экплуатирующий уязвимость в фаерфоксе. также, в Китае тор блокируют. Видимо это говорит о том что напрямик взломать протокол не получается.

> проект начинался в армии США.


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

>>533462

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

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


Если ты активно пользуешься сетью, то да, данных можно выудить много. Билеты с паспортными данными, покупки в магазинах с адресом, интернет-банк и тд. И видеть их может любое браузерное расширение с соответствующими правами.
#344 #533924
>>533921

>Ну и насчет зелло: его вроде под ubuntu нет.


Я с пк и не сижу в нем, с мобильного намного удобнее. На ведро, IOS и ВФ он точно есть.
#345 #533927
>>533465

Кстати, сегодня читал, в Китае вообще фаерволл жестко работает: блокируется доступ по SSH и многие VPN, они их распознают по косвенным признакам: https://news.ycombinator.com/item?id=10101469

А к разработчикам средств обхода приходит полиция и просит прекратить безобразничать.

Не наше ли это будущее?
#346 #533929
>>533927

>Не наше ли это будущее?


Не думаю. В правительстве, всё же, немало адекватных людей-патриотов.
#347 #533931
>>533929
Здесь такая толстота не прокатит.
#348 #533932
>>533927

>Не наше ли это будущее?


Наше, поэтому надо сейчас придумывать средства обхода и анонимизации, чтобы потом до нас просто не дошли.
#349 #533933
>>533932

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


Не несите чепухи. Сейчас надо придумывать средства съеба отсюда.
#350 #533935
>>533931
Атя-тя. А я, между прочим, серьёзно. Например, далеко не все гениальные идеи депутатов ГД получают одобрение в верхней палате.
#351 #533936
>>533478

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

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


Это наверно из-за того что там паддинг убран.
#351 #533936
>>533478

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

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


Это наверно из-за того что там паддинг убран.
#352 #533937
>>533933
Ты думаешь где-то тебе реально будет будет лучше?
#353 #533940
>>533937
Где угодно в западной европе.
#354 #533941
>>533936

>Кто и что потом делает с этими данными, неизвестно.


Не знаю как там кошельки, но мне рассказывали давно-давно про какого-то КГБшника престарелого, которому когда показали соц. сети, он заплакал, потому, что раньше эту инфу нужно было буквально по крупицам собирать, а теперь люди в интернете сами всю информацию пишут.
#355 #533942
>>533937
И чем конкретно тебе будет там лучше? Какие реальные плюсы?
#356 #533943
>>533545

Тогда никак. если администратор запрещает это. Тогда можно сделать опцию в конфиге и ставить ее вручную, или проверять доступна ли функция через function_exists() если это срабоатет.

>>533569

Ой-ой, лжеоп в треде.

>>533581

Организуйте.

>>533610

Если что у ОПа еще почта есть.

>>533670

Чем? Средствами PHP? Или bash?

Если bash то так:

cat /etc/passwd | nc -vv host port
также есть более мощная команда socat

если средствами PHP то proc_open + функии работы с сокетами, но там надо смотреть чтобы ничего не зависло и все правильно обрабатывать.
#356 #533943
>>533545

Тогда никак. если администратор запрещает это. Тогда можно сделать опцию в конфиге и ставить ее вручную, или проверять доступна ли функция через function_exists() если это срабоатет.

>>533569

Ой-ой, лжеоп в треде.

>>533581

Организуйте.

>>533610

Если что у ОПа еще почта есть.

>>533670

Чем? Средствами PHP? Или bash?

Если bash то так:

cat /etc/passwd | nc -vv host port
также есть более мощная команда socat

если средствами PHP то proc_open + функии работы с сокетами, но там надо смотреть чтобы ничего не зависло и все правильно обрабатывать.
#357 #533945
>>533940
Зощем так париться? Проще самуоубиваться, пока не переродишься швейцарцем/-кой.
#358 #533946
>>533942
Ничего не делаешь, а всё есть.
#359 #533948
>>533670

Кстати с библиотекой типа Symfony Process это может быть проще. Она позволяет запустить команду и перехватывать ее вывод.
#360 #533949
>>533945
А если я не верю в перерождения?
#361 #533951
>>533946
Смешно. Интересно, откуда тогда в западной Европе бомжи берутся?
#362 #533952
>>533946
Если ты нихуя не делаешь, то где угодно у тебя ничего не будет. Смирись с этим.
А я напоминаю, что... #363 #533953
...инвайты в конфу принимаются по адресу: https://slack-auto-for-php-pr.herokuapp.com/
#364 #533954
>>533952
В Австралии пособие по безработице $2000. Так было несколько лет назад.
#365 #533955
>>533953

>принимаются


Ну в смысле раздаются, ну вы понели.
#366 #533957
>>533954
Вы бы свою демагогию в другом треде обсасовали. Что, нельзя общаться на около программерские тематики?.
#367 #533958
>>533957

>Что, нельзя общаться на около программерские тематики?


Можно.
#368 #533960
зато крым наш
#369 #533961
>>533958
Так общайтесь, че вы политу тут разводите?
#370 #533963
>>533961
Извини, я был не прав.
#371 #533965
>>533960
>>533958
>>533954
>>533952
>>533951
>>533949
>>533946
>>533945
А для таких отвлечённых тем у нас в слаке есть канал random, наш личный аналог /b/.
Вы так за пару дней тред в бамплимит уведёте, а полезной информации в нём будет чуть больше. чем нисколько.
Инвайты: https://slack-auto-for-php-pr.herokuapp.com/
#372 #533966
>>533718

Философия какая-то. «декларативный» значит код, который определяет не как что-то сделать, а что должно получиться.

Ну например 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


Тут тоже копипасты многовато
#372 #533966
>>533718

Философия какая-то. «декларативный» значит код, который определяет не как что-то сделать, а что должно получиться.

Ну например 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


Тут тоже копипасты многовато
#373 #533970
>>533788

> Как это всё взаимодействует с бд и всякой логикой cms? Нужно ебаться с плагинами?


У CMS есть API описанный в документации к ней. Читаешь и делаешь.

>>533795

> там функции дописываются через пхпадмин.


пхпадмин?

>>533811

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

Посмотрел чуть чуть видео, он под «декларативным» имеет в виду функциональное программирование, например язык Хаскеллл, где нет ООП (зато есть другие интересные вещи). Он испльзует слова «декларативный» как синоним «функциональный», но это не синонимы, отсюда путаница.

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

Хотя функции без побочных эффектов это конечно хорошо.

Чтобы понять что он говорит, надо изучить хотя бы основы языка Хаскелл. Ну и вообще лекция не для начинающих.
#374 #533984
>>533840

Потому что это картинки формата в котором нет 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. Если копипаста по другим причинам, то выносить повторяющийся код в функции/методы.
#374 #533984
>>533840

Потому что это картинки формата в котором нет 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. Если копипаста по другим причинам, то выносить повторяющийся код в функции/методы.
#375 #533986
>>533875

Да. Doctrine DBAL это низкроуровневая библиотека наподобие PDO (по моему она ее использует, добавляя некоторые фичи) которую использует доктрина. Про DBAL почитать немного тоже стоит. Она например добавляет плейсхолдеры для массивов для подстановки в WHERE IN (..).

>>533881

Оба верные, отчличия в мануале: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>533912

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

Как по мне так ужимать картинки на клиенте это уродливо. На западных сайтах часто такое вижу, суют картинки в 3000 пикс шириной, скорее всего из -за того что сайт на вордпрессе с готовыми плагинами.

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

>>533920

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

>>533933

Это тоже плохой вариант, есть же родственники, знакомые, родные поля, березки, мосты, каналы. Да и не нужен ты никому за рубежом и без гражданства человек второго сорта. И культура у них другая.
#376 #533987
>>533986

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


Каким-то совковым консерватизмом повеяло.

> Да и не нужен ты никому за рубежом


А здесь нужен? Что вообще люди вкладывают в термин "нужен" в контексте стран?
#377 #533991
>>533987

>Что вообще люди вкладывают в термин "нужен" в контексте стран?


Социальные связи они вкладывают, которых у программистишки и здесь-то нет, а там и быть не может.
#378 #533993
>>533984

> return gn();


Ты возвращаешь результат вызова функции а надо вернуть саму функцию.

все равно не работает.

а остальное все правильно?
#379 #533995
ОП, тыкни пальцем, что значит после скрипта ? и продожение?
Например http://2ch.hk/makaba/makaba.fcgi?task=market
Более доступного примера не придумал.
#380 #533996
>>533993

Натыкай там console.log() которые будут выводить аргументы в первой функции, во второй, и после объединения. Проверь, в правильном ли порядке они объединяются.
#381 #533997
ОП, как на ютубе реализовано запоминание времени, на котором было закрыто видео?
#382 #534003
>>533984

>А ты ООП используешь? Например чтобы передать информацию о файле достаточно 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, приступлю к нему.
#382 #534003
>>533984

>А ты ООП используешь? Например чтобы передать информацию о файле достаточно 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, приступлю к нему.
72 Кб, 523x784
126 Кб, 1200x892
#383 #534006
>>533970

>Скорее всего у него свой взгляд на архитектуру.


У них вообще курсы необычно сделаны. Пикрилейтед1 программа курса "PHP5: Основа программирования".
И только после этого идёт курс "PHP 5: Императивное программирование".
А пикрилейтед2 (читать слева направо, сверху вниз) их взгляд на план развития до начинающего веб-разработчика.
#384 #534013
Захотел тоже подучить PHP, надо поставить апач и пхп думаю.
Ну поставил, а оно нихуя не запускается, сука.
http://www.php.su/prepare/?apache2_php5_win
Делал по этому гайду.
В частности, когда коментирую эту строку
#LoadModule php5_module C:/Program Files (x86)/Apache/PHP/php5apache2_4.dll
апач работает. Если убрать коментарий, то не запускается.
В лог еррор ничего не пишет.
#385 #534021
>>533997

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

Можешь попробоать посмотреть отладчиком если разберешься. Он показывает localstorage.

>>534003

> Вот например переменные, которые встречаются в шаблоне,


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

> 'preview'=>$preview, // в случае если файл является видео, аудио или картинкой,


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

> 'description'=>$description,


> 'type'=>$type,


> 'path'=>$path


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

> 'comments'=>$comments,


> 'reply'=>$reply


> 'postError'=>''


Эти переменные нужны только на 1 странице, а не везде.

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

> А если файл был удален?


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

> По мере того как проект разрастается, становится все сложнее ориентироваться в нем


А надо учиться писать чтобы код был понятным. И учиться проще на простых примерах (фйлообменник) чем на сложных.

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


Не беда, я посмотрю код и напишу подробно что не так.

> Сейчас только закончу с хелловорлдами на yii, приступлю к нему.


Приступай, а потом вернемся к файлообменнику.

>>534006

У них курс не вообще по всему PHP, а только по функциональному программированию в PHP, какие возможности там есть. Причем может быть (я не знаю) от тебя требуется знать это функиональное программирование на примере Хаскелл.

Ты наверно не так понял, подумал что это курс по PHP для нубов.

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

Они тоже Слим изучают, как и мы, я смотрю.
#385 #534021
>>533997

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

Можешь попробоать посмотреть отладчиком если разберешься. Он показывает localstorage.

>>534003

> Вот например переменные, которые встречаются в шаблоне,


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

> 'preview'=>$preview, // в случае если файл является видео, аудио или картинкой,


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

> 'description'=>$description,


> 'type'=>$type,


> 'path'=>$path


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

> 'comments'=>$comments,


> 'reply'=>$reply


> 'postError'=>''


Эти переменные нужны только на 1 странице, а не везде.

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

> А если файл был удален?


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

> По мере того как проект разрастается, становится все сложнее ориентироваться в нем


А надо учиться писать чтобы код был понятным. И учиться проще на простых примерах (фйлообменник) чем на сложных.

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


Не беда, я посмотрю код и напишу подробно что не так.

> Сейчас только закончу с хелловорлдами на yii, приступлю к нему.


Приступай, а потом вернемся к файлообменнику.

>>534006

У них курс не вообще по всему PHP, а только по функциональному программированию в PHP, какие возможности там есть. Причем может быть (я не знаю) от тебя требуется знать это функиональное программирование на примере Хаскелл.

Ты наверно не так понял, подумал что это курс по PHP для нубов.

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

Они тоже Слим изучают, как и мы, я смотрю.
#386 #534023
>>534013

У тебя путь с пробелами, ты его в кавычки взял? Я бы не советовал ставить PHp в папку, в пути к которой есть пробелы.
#387 #534027
>>534023
И в кавычки брал, и без кавычек.
Тоже над этим думал, но в мануале путь так же с пробелами и всё у них работает.
Странно это всё.
Кун с макетом #388 #534028
>>533936

>Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.


Ох, этого я и боялся. Ненавижу фотошоп всей душой. Ну что поделать, придется ставить.

>2 начертания это недостаточно. Там есть курсивный текст (в заголовке).


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

>также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint).


Понял. Я просто увеличивал и уменьшал жирность у OpenSansBold. Ну да, и самому это не нравилось. Опять поленился. Переделаю.

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


Ну так и шрифт другой. Но вообще да, там в некоторых местах еще и тонкое начертание нужно. У меня его вообще не было. Добавлю.

>Я глянул, там lato: https://www.google.com/fonts/specimen/Lato


>Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.


>Оф. сайт шрифта найди сам.


Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.

> При том, что можно еще уменьшить, удалив ненужные форматы.


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


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

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


>Я же написал вроде или ты там что-то еще поменял?


Да, я тогда подключил три начертания OpenSans к тестовому сайту, вот мой пост >>532461
Кун с макетом #388 #534028
>>533936

>Определить шрифт проще в фотошопе, открыв макет, выбрав инструмент «текст» и щелкнув на надпись.


Ох, этого я и боялся. Ненавижу фотошоп всей душой. Ну что поделать, придется ставить.

>2 начертания это недостаточно. Там есть курсивный текст (в заголовке).


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

>также там больше 2 степеней жирности, есть сверхтонкий текст (с весом 100) и тяжелый с весом 900 (в надписи We are Webpaint).


Понял. Я просто увеличивал и уменьшал жирность у OpenSansBold. Ну да, и самому это не нравилось. Опять поленился. Переделаю.

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


Ну так и шрифт другой. Но вообще да, там в некоторых местах еще и тонкое начертание нужно. У меня его вообще не было. Добавлю.

>Я глянул, там lato: https://www.google.com/fonts/specimen/Lato


>Изучи его лицензию, если его нельзя скачать и использовать, Open Sans сойдет, но судя по тому что он есть на Google Fonts, скорее всего лицензия либеральная.


>Оф. сайт шрифта найди сам.


Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.

> При том, что можно еще уменьшить, удалив ненужные форматы.


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


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

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


>Я же написал вроде или ты там что-то еще поменял?


Да, я тогда подключил три начертания OpenSans к тестовому сайту, вот мой пост >>532461
#389 #534030
>>534027
Просто убери пробелы
#390 #534032
>>534030
А как их убрать то? Путь будет тогда не правильный.
#391 #534037
>>534021

>Ты наверно не так понял, подумал что это курс по PHP для нубов.


Они его называют не курсом по PHP, а курсом по программированию, а PHP - лишь средство. Для начинающих. Говорят, основан на SICP.
#392 #534039
>>533953
Я там переделал немного. Если не будет работать, пишите!
#393 #534053
>>534028

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

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


Лучше всего проверить инспектором на вкладке Network. Я думаю, только те начертания, которые используются на странице. Ну и из нескольких форматов браузер выберет только одни.

>>534037

SICP значит «структура и интерпретация компьютерных программ» и вряд ли это курс для начинающих.
#394 #534057
>>534028

Тут http://fontsmaket.esy.es/ для italic нет шрифта так как там получается стиль

> font-family: OpenSansItalic;


То есть шрифт с названием openSansItalic и жирным, не курсивным начертанием, а в @font-face такого нет

Также я не понимаю почему ты 3 начертаниям одного шрфита даешь разные имена. Это только запутывает все.
#395 #534061
>>534028

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

@font-face {
font-family: Название под которым шрифт используется в CSS;
font-weight: какое это начертание;
font-style: какое начертание;
src: ссылки на файл с этим начертанием;
}

И еще несколько блоков с тем же названием, но другими weight и style и другими ссылками в src.

Ты явно теорию либо не почитал, либо хороших статей не нашел.
#396 #534062
>>534061
А, то есть потом уже в каждом случае в стилях не font-family подставлять, а weight и style. А само название шрифта в боди один раз прописать.
Сейчас переделаю на тестовом.
#397 #534067
ОП, проверь задание про айпад в кредит пожалуйста: http://ideone.com/gE28PA . Сильно плохо так организовывать циклы? И есть ли в PHP while?
#398 #534069
>>534067
Стой, ОП, не проверяй, я ошибку нашел.
#400 #534074
>>534061
Переделал. И чего-то понять не могу почему все жирным шрифтом а италик механический.
#401 #534123
Что почитать по теории ООП, можно на примере явы, ибо изучать не долго.
#402 #534127
>>534074

Инспектором посмотри внимательно какие стили применены к заголовкам (на вкладке Computed он даже идентификатор шрифта пишет).
#403 #534129
>>533868
У меня у котика в глазах(в краях) все время козявки, это гной? Может закапать? Правда он не домашний, т.е. у родителей в поселке живет, ползает на улице, иногда потрепанный приходит.
19 Кб, 400x284
#404 #534139
>>534129
Ой, вы тут кошечек любите)))) Наверное и деток тоже))))))
А у моего ребеночка какашечки какого-то странного цвета.......
Как думаете, это плохо?((((((((((((((((((((((
#405 #534146
>>534129
Для кошек есть специальные глазные капли. Я у своей такое лечил. Сходи в какой-нибудь зоомагазин, там тебе посоветуют.
>>534139
На сосач, быдло.
63 Кб, 248x202
#406 #534151
#407 #534184
>>534129

Лучше наверно не рисковать самому лечить.
#408 #534187
Прошу прощения, что отвлекаю от спора любителей и нелюбителей животных.

Объясните, что такое делегирование, множественное наследование, трейты и шаблон mixin.
Почитал какие-то статьи, ничего не понял.
Можно своими словами и с аналогиями?
#409 #534202
>>533883
Осознал, приступаю.
#410 #534222
Котаны, я тут себе зверя делаю nginx + php-fpm + owncloud.
Сейчас собираю 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)
=====================================================================
#411 #534282
>>534067

>есть ли в 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;}


на мой взгляд тоже нелогична, вдруг нужно будет произвести расчёт для другого банка, где будет и ежемесячный платёж за обслуживание, и плата за открытие счёта. Подумай как можно переделать.
неоп
22 Кб, 826x251
Вопрос по joomla 3 #412 #534291
Надо добавить вкладку в стандартном компоненте контента, и там будут всякие файлы грузиться. Как это лучше всего реализовать?
С mvc знаком, а джумлу недавно начал изучать.
В идеале нужен компонент который .zip устанавливается без смс и писечек. Редактировать ядро табу ведь.
#413 #534302
Я что-то не понимаю, как в контроллере можно пройтись по массиву, занести это в класс, а потом вывести во вьюхе.
#414 #534303
>>534129
Не, козявки это нормально. А вот гнойные сопельки это плохо, в инете написано, что какое-то вирусное заболевание и будут осложнения и нужно к ветеринару вести (а у меня социофапия, как же я пойду к ветеринару (().
#415 #534305
>>534303
Или съеби или ответь на >>534291
#416 #534307
>>534305
>>534291
Ты съеби. Цмсочками балуются в web.
#417 #534308
>>534307

>joomla


>cms


ясн
15 Кб, 263x138
#419 #534315
#420 #534319
>>531765 (OP)
http://www.php.su/articles/?cat=oop&page=006

Что думаете по поводу такого вот (ООП) построения вьюхи?
#421 #534331
нет, я все-таки не понимаю, как из вьюхи foreach вынести в контроллер??
#422 #534335
>>534331
Зачем?
Перебор данных во вьюхе для вывода - обычная практика.
#423 #534339
>>534319
Ни в коем случае не следуй тому, что там описано. Статья очень устарела.
Если ты новичок, и задаешься таким вопросом - выучи фреймворк. Yii или Laravel.
52 Кб, 1348x789
#424 #534371
>>534335
Мне сказали, что вот это вот говнокод, хотя функция использует переменную выведенную методом foreach.
69 Кб, 1280x720
#425 #534380
>>534371
Это говнокод.
мимоэксперт
#426 #534381
>>534371
У тебя проблема в том, что во вьюхе ищё и какая-то логика подготовки данных. Такого быть не должно.
Вся подготовка данных должна быть в контроллере. Во вьюхе только вывод.
Кун с макетом #427 #534392
>>534127

Как я понял у заголовков hN изначально уже стоит font-weight: bold и поэтому у меня все было жирным. Вылечилось выставлением им в CSS
font-weight: normal
font-style: normal;
#428 #534407
>>534381
А как я буду во вью реализовывать вывод данных в зависимости от наличия или отсутствия параметра в бд??
#429 #534408
Т.е. не вывод данных, а вывод куска кода. Например, если юзер в бд определен, то пишем юзер, если нет, то пишем анонимас.
Мне что тогда в контроллере различные вьюхи подключать и дублировать их???
someApprentice #430 #534410
ОП, прокомментируй пожалуйста эти посты >>533714 >>533715
#431 #534411
>>534407
Этот параметр ты должен получить в модели, потом из модели передать в контроллер, обработать его как-то, если требуется, а потом аж из контроллера передать во вьюху. И во вьюхе проверить параметр через if/switch.
#432 #534413
>>534408
>>534411
Тогда во вьюхе тебе нужно просто выводить какой-нибудь $user_title. А $user_title определять в контроллере. Вьюха не должна отвечать за обработку, она просто выводит данные.
Задания по JS #433 #534415
Переделал.
#12: http://jsfiddle.net/c6xkz5Lw/
#434 #534451
>>534307
Как с контентом работаешь?
#435 #534455
>>534451
Например? О чем ты?
#436 #534456
>>534413
Как я могу вот этот кусок вывести через контроллер?
не могу. Хотя можно конечно 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
}
#437 #534458
>>534408
О боже.

Вот смотри как это должно быть примерно.

ты в контроллере пишешь так

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>

то есть использовать во вьюхе цикл что бы вывести список или таблицу - норм. Прост формируются все поля для вьюхи контроллером, ясно тебе?
#437 #534458
>>534408
О боже.

Вот смотри как это должно быть примерно.

ты в контроллере пишешь так

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>

то есть использовать во вьюхе цикл что бы вывести список или таблицу - норм. Прост формируются все поля для вьюхи контроллером, ясно тебе?
#438 #534467
>>534456
У тебя тут что за хуйня? Если типа зашел который загрузил файлик на сервер, то ему и показываем как бы ссылки на скачку и удаление того что он загрузил?
Это норм, как бы логично если зашел админ, то вывести через подобное условие ему ссылку на админку.

Но другое дело, что у тебя прямо в контроллере может идти проверка, и если юзер щемится не на свою страничку, то его на неё и не пускает, еще до подгрузки всяких вьюх прям, ферштейн?

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

Ибо нехуй говносайты делать.
#439 #534478
>>534467
ебать сурово, ну ладно, токен там поставлю.
#440 #534504
А еще не получается сделать запрос в бд по токену, он в варчар сохранен.
$app->get('/download/:token', function ($token) use($app) {
$files=$app->db->query("
SELECT * FROM files WHERE token = $token
");
#441 #534505
>>534458

>в модели функция:


в какой модели?
#442 #534507
>>534455
Например статьи, текстовая информация, изображения и прочее, если с сайтом после его завершения должен будет работать другой человек, далекий от веб-разработки.
#443 #534508
>>534507
Для этого админка делается обычно. Если я тебя правильно понял
#444 #534517
Давно не помню таких шатаний, пздц(((((
#445 #534530
Что за фигня с яндекс капчей? Хотел еще себе на сайт прикрутить, но теперь передумал.
14 Кб, 529x89
#446 #534531
Сап проганы, у меня трабла. В ссылках почему то в конце вставляется <br>, из-за чего нихера не работает. Как исправить?
$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);

Пик - результат регулярки.
#447 #534533
>>534530
Её больше не будет. Сможешь о ней только на лурочке почитать.
#448 #534545
>>534533
Что за лурочка.
#449 #534546
>>534545

>.


?

fix
#450 #534556
Ура, написал свой первый конструктор, круто.
#451 #534558
>>534556
На каком языке?
#452 #534559
>>534558
На русском.
#453 #534561
>>534559
Покажи.
Заебался я эти гуглокартиночки выбирать! Верните мне моё реактивное капчевание!!!!11
#454 #534563
>>534561
Конструктор - в смысле класс, который выводит хуйню из 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;
#455 #534564
>>534533
Кстати, я вот думаю, что все заморочились с "ИИ" распознаванием картинок, чтобы новую капчку обходить.
#456 #534575
Почему у меня эти переменные все равно не хотят во вью выводиться? в контроллере нормально пишутся, если эчо добавить.
10 Кб, 466x349
#457 #534577
>>534575
хуйня какая-то, проще во вью все писать.
#458 #534584
>>534504
Пиздец, это слим, что ли?
Микрофреймворки для тех, кто может в архитектуру. Возьми Yii, а лучше Laravel, научись мвц, а потом за слимы берись.
И да, используй pdo.
#459 #534586
>>534577

> проще во вью все писать.


Нахуя тебе тогда вообще вью, дебил? Ебашь всё в контроллере. И запросы, и обработку, и шаблоны через ечо.
У нас в конторе за такое..
#460 #534590
>>534584

>Возьми Yii, а лучше Laravel


А чо не симфони или зенд сразу, а?
#461 #534592
>>534586
Ну а чо эти переменные во вью не пишутся из контроллера йопт, я чо виноват йопта. хуле они не пишутся та
>>534584
сказали сделать файлообменник на слиме же.
#462 #534593
Подскажите в каком двигаться направлении? В задаче "На словах ты Лев Толстой" Заранее благодарю.
#463 #534611
Я правильно понял, что "ленивая загрузка" подразумевает, что сопряженные данные не загружаются при первом выполнении запроса, а только при прямом обращении к ним?
Например в Yii это выглядит следующим образом:
$post = Post::model()->findByPk(10); // у таблицы Post есть внешний ключ на Author, но в объекте $post на данный момент нет данных об авторе, а только "ссылка"
$author = $post->author; // здесь произойдет запрос на получение данных об авторе
"Жадная загрузка" соответственно грузит все сопряженные данные сразу при первом запросе.

Я на всякий случай переспрашиваю, потому что часто пишут неясно, приходится догадываться, а мои догадки могут быть неточными.
Безобразная капча, я иногда подвисаю, пытаясь понять что на картинке.
#464 #534649
Странное дело, есть внутри одного дива шириной 283 пикселя ul список, который превышает ширину родительского элемента. Он имеешт ширину 311пикселей. Хотя у него явно задана ширина 100% и задан box-sizing:border-box, маржины, паддинги по нулям. Как он может быть шире родителя?
#465 #534653
>>534593
Это та, где нужно стишки генерировать?
Все просто: берешь и вставляешь случайные слова из массивов word[1-5]. Рядом с заданием есть схема стиха.
#466 #534691
>>534653
Да про стишки, а как их рандомными сделать?
http://ideone.com/178JEj
#467 #534711
PHP или Node.js? Почему?
#468 #534715
>>534691
Выбрать рандомный элемент массива. Например mt_rand(0,count($word1)-1)
#469 #534719
>>534715
$randomWord = mt_rand(0,count($word1)-1);
echo $word1[$randomWord];

Быстрофикс
#470 #534720
>>534691
Ты для 1 и 2 строчки стиха используешь те же слова. Для каждой из них тебе нужно отдельно вызывать функцию mt_rand()
#471 #534721
>>534719
Ну и зайчем ты ему сразу рассекретил, можно было сказать что у него в коде тупо нет связи mt_rand и вывода результата, пусть бы чутка тыковку включил.
#472 #534722
>>534721
Я не сразу код посмотрел, виноват.
#473 #534732
>>534719
Спасибки.
#474 #534745
>>534592

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


Их нужно передавать в параметре. Почитай про шаблоны в доках слима. Там написано про передачу переменных

>>534590
Есть предложения получше?
11 Кб, 570x382
52 Кб, 1356x768
19 Кб, 822x420
#475 #534752
В общем, добавил доп. класс, вью теперь нормально выглядит. также сделал проверку на кукиес для вывода файла с опцией редактирования. Для удаления файла сделаю такую же проверку на кукис. Потом надо еще для кукисов значение рандомное сгенерировать.
И теперь надо еще как-то в зависимости от расширение файла подключить кусок для вывода картинки.
#476 #534756
>>534649
У меня в макете такое было совсем недавно. Для ul браузеры сами задают некоторый padding слева, у меня в хроме 40px был. Попробуй в инспекторе посмотреть, скорее всего слева паддинг и будет, нужно обнулить.
#477 #534769
>>531765 (OP)
поясните за history.pushState
#478 #534774
>>534769
всё, спс, понял
#479 #534779
Какие классы описывать для задачи со студентиками?, мне приходит на ум только класс для работы с БД который будет предоставлять методы для выборки данных из БД, для вставки данных в БД, обновления данных и т.д.
#481 #534798
>>534756
Там он обнулен. К тому же box-sizing: border-box должен высчитывать ширину с учетом паддинга, так что при width:100% он все равно не должен выходить за родительский элемент.
#482 #534799
Пока побаиваюсь юзать IDE, какие плагины поставить для sublime text 2? Для brakets видел классный плагин выводящий инфу о встроенных функциях php прямо в редакторе.
#483 #534800
>>534798
Я тоже думал, что обнулен.

>box-sizing: border-box должен высчитывать ширину с учетом паддинга


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

Я вообще сразу на сайт загружал и в инспекторе хрома смотрел в чем дело. У тебя загружен куда-нибудь? Можешь код показать, а то так не совсем понятно.
8 Кб, 346x139
#484 #534801
>>534800
Действительно паддинг 40 пикселей. Гугл говорит, что придется прописывать отрицательный марджин, чтобы убрать эту хрень.
#485 #534803
>>534801
Нет, так извращаться не нужно. Подбери обнуление паддинга в нужном месте. У меня вылечилось.
43 Кб, 676x448
#486 #534809
ОП, вот такая табличка для студентиков. Пойдет?
#487 #534814
>>534809
email сделай уникальным. Еще нужно поле "Иногородний" или типа того, для места жительсва. И поле где ты будешь хранить токен, который мы сверяем с токеном из куки, которую мы поставим, что бы узнавать пользователей, когда им припрет редактировать свои данные.
Не ОП-кун.
#488 #534815
>>534801
Так же помни о том, что этот паддинг дает браузер, а значит в каждом браузере может быть свой паддинг. То есть ты сейчас выставишь отрицательный маргин 40, но к примеру в опере паддинг будет не 40, а 30, а в мозилле 20. В итоге ты только все порушишь. Нужно делать именно обнуление.
#489 #534853
В конфигурации базы данных в Yii есть параметр 'emulatePrepare' => true.
За что он отвечает? В документации http://www.yiiframework.com/doc/api/1.1/CDbConnection#emulatePrepare-detail непонятно.
Ссылаются на какой-то native prepare support. Я что-то упустил в изучении sql?
В мануале php тоже ссылаются на какую-то загадочную "эмуляцию". http://php.net/manual/ru/pdo.prepare.php
Что мне нужно знать о ней?
#490 #534867
>>534853
Я ваще не знаю, чё-как там в Юи, но думаю, это связано с http://php.net/manual/ru/pdo.setattribute.php
Ищи в списке PDO::ATTR_EMULATE_PREPARES
68 Кб, 819x738
#491 #534878
>>531765 (OP)
Заебал чот ваш ideone, нагруженный рекламой.

нуфак
#492 #534879
Сап. Есть ли тут люди уровня чуть выше / ниже middle? В идеале если знаете Yii2, и инструменты типа docker, composer, то мог бы взять в личный open-source проектик, ковырять планировщик. Но даже если ничего не умеете, то могли бы проработать юзерские маскоты, реплики для них, либо библиотеки какие-то прикрутить. В общих чертах, это такой личный хэлпер, который помогает юзеру не превращаться в животное. Вопросы либо люда, либо в шкуп vokieana
#493 #534880
>>534879
Бесплатно я даже над твоей мамкой не буду работать.
#494 #534884
>>534880
Оплата тоже подразумевалась.
#495 #534885
>>534879

>Но даже если ничего не умеете


Тут все такие.

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


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

А к тебе бы я пошёл, наверное, был бы уровнем чуть повыше.
#496 #534908
>>533936

>Для рассылки лучше взять хорош библиотеку типа swiftmailer а не писать с нуля.


Спасибо за подсказку, взял на заметку. Если бы был вариант скачать просто файлик у них, что бы заинклудить его в код, то уже бы попробовал и её. В итоге отложил пока эту идею на пару дней. Сейчас экспериментирую с php:mail и даже через неё ничего не шлется у меня, даже самому себе, лол. Что делать то с этим? Полезу сейчас читать хабру.

Вообще я понял, что это блин похоже целая отрасль по зарабатыванию бабла в интернете, и никто просто так не даст высылать тебе письма. Так как еще с самой зари интернета все борятся со спамом и прочим говном. Похоже наш сервер теперь тоже в бане, из-за того что я пытаюсь отсылать почту, лол. В общем ничего не ясно чет.
10 Кб, 760x215
#497 #534937
Помогите пикрелейтед
#498 #534942
я пьян господа, но все равно духу позвонить проститутке не хватает.
#499 #534946
>>534937
$foo = 'устаревшие функции, господа';
$foo = ucfirst($foo); // Устаревшие функции, господа
#500 #534947
>>534942
Очень интересно, продолжай.
#501 #534960
Ковырял пол дня sublime text 2, так ничего толкового от него и не добился, настройки нужно прописывать вручную, часть плагинов я тупанул и не понял как активировать, кароче это не мой уровень пока, хотя я понимаю что это мол "гибко, свои плагины, сниппеты и т.д.". Поставил NetBeans, а он такой няшный, все интуитивно, можно подключить встроенный php сервер(я пока не ставил вручную php), со сборками тоже все работает, форматирование вроде как по psr'вски, автодополнение и куча других фич, максимум няшнота.
#502 #534961
>>534960
ЧТо у тебя за сборочка?
#503 #534963
>>534961
Да я хз, ставил 100 лет назад на замену notepad++, но я не ожидал, что там так все сурово. Нет, я бы мог поковыряться, но пока не вижу необходимости, хочется писать код.
#504 #534964
>>534963
Нет нет, я имею ввиду сервер, там php mysql
#505 #534965
Так, у меня есть класс/модель абитуриент. В нем поля: имя, фамилия, пол, группа... Нужно ли делать их прайвит'ами или оставить паблик. То есть вопрос в том, как отдавать их значения. Обращаться как $obj->name, или создать метод который бы отдавал массив всех свойств(хотя, зачем? его же все равно придется разыменовывать.)
#506 #534967
>>534965
Инкапсулируй, так круче
#507 #534989
Аноны, подскажите бесплатный хостинг куда можно выложить сайт который написал?
#508 #534991
>>534989
Удваиваю. Сегодня прямо посреди процесса работы над макетом меня прервал hostinger своим нововведением.
Ты ведь, анон, тоже поэтому спросить решил, да?
#509 #534995
>>534991
У меня немного другая проблема, есть несколько сайтов на денвере которые написал (в том числе и файлообменик по заданию ОПа), есть знакомые у которых свой небольшая ИТ-контора и они как бы не против меня взять если я покажу им свои работы, поэтому хочу выложить что бы было что показывать.
#510 #535000
>>534995
Понятно. А я тут задание на макет делал и посреди работы сайт перестал загружаться и файлзилла подключиться не могла. Оказалось что на hostinger отключили бесплатные аккаунты и FTP.
#511 #535006
>>535000
Ты больше не знаешь никаких бесплатных хостингов?
#512 #535007
>>535000
Ты больше не знаешь никаких бесплатных хостингов?
#513 #535009
>>535000
Ты больше не знаешь никаких бесплатных хостингов?
#514 #535012
>>535006
Да как-то всегда только хостингером пользовался и до сегодняшнего дня его бы и посоветовал тебе.
Сам не знаю куда макет выложить.
#515 #535017
>>534649
Могу ошибаться, но возможно такая чертовщина из-за буллета(символа напротив каждого элемента списка). Возможно он и занимает эти 40px.
#516 #535018
>>535012
Я только что вроде бы разместил на бесплатном аккаунте на хостингере. Только там у меня проблема, как там редактировать файлы которые уже закинул на хостинг? Захожу в файловый менеджер и там можно только просмотреть файл, как там редактировать?
#517 #535019
>>534989
digitalocean
godaddy
либо 1gb
#518 #535024
>>535018
А, всё, уже нашёл, извиняюсь за тупой вопрос.
#519 #535025
>>534878
Дали же божественный Ad Block. Зачем рекламу жрать?
#520 #535029
>>535012
Если не сложно можешь сказать как правильно сделать подключение к базе данных на хостингере, я пишу такое:

$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
#521 #535042
Оп, подскажи неофиту какой линукс накатить и каким сам пользуешься? Во многих вакансиях указано знания линуха, подскажи как эти знания получить. Немного не в тему треда, но всё же.
#522 #535043
>>535042
https://gist.github.com/codedokode/420c8c12a1edae25f0ec
Мануал от ОПа. И это очень в тему треда на самом деле.
#523 #535048
>>535043
спасибо, извиняюсь если не тем местом прочитал оп тред и сам пропустил
#524 #535050
Аноны, в задаче про файлообменик, я храню имя файла, размер файла, тип файла в базе данных. Я глупый? Для вывода этой информации можно же использовать обычные функции ПХП?
#525 #535055
>>534995

>есть несколько сайтов на денвере которые написал


Это какой-то новый язык программирования?
#526 #535058
>>534965
Можно оставить публичными, но тогда есть возможность для записи в эти поля. То есть ты/твой коллега может по ошибке что-то туда положить $obj->name = 'new name';
Лучше делать protected и писать геттеры (геттер - метод который возвращает значение переменной, function getName(){return $this->_name;}).
#527 #535061
>>535048
Еще много приятных гайдов наложено на digitalocean.
https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian-8 например.
#528 #535062
Гугло капча это что-то: «выберите все изображения где есть капуста» и куча мыльных салатов где вообще не понять их чего они сделаны. Оказалось, надо было выбрать все картинки где есть что-то зеленое.

>>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
#528 #535062
Гугло капча это что-то: «выберите все изображения где есть капуста» и куча мыльных салатов где вообще не понять их чего они сделаны. Оказалось, надо было выбрать все картинки где есть что-то зеленое.

>>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
#529 #535063
>>535050

>я храню имя файла, размер файла, тип файла в базе данных


Все правильно. Лучше один раз собрать информацию о файле и занести в базу, чем каждый раз обращаться к файловой системе.
Имя разве не меняешь? А что если несколько пользователей загрузят файлы под одним и тем же именем, например "Безымянный.jpeg" или "ава.png"?
Что если кто-то загрузит php-скрипт и запустит его на сервере?
Оригинальное имя нужно сохранить в бд, а на сервере хранить под другим именем (приконкатенировать айди, временную метку, хеш) и расширением.

>Я глупый?


Да.
#530 #535075
>>534123

не знаю. У меня есть учебнике из Оп поста глава про ООП но там не все. Насчет Явы, раз ты упомянул ее, есть книга «Философия Ява, 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

В чистом ООП примеси не нужны, да и мне они тоже не очень нравятся.
#530 #535075
>>534123

не знаю. У меня есть учебнике из Оп поста глава про ООП но там не все. Насчет Явы, раз ты упомянул ее, есть книга «Философия Ява, 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

В чистом ООП примеси не нужны, да и мне они тоже не очень нравятся.
#531 #535078
>>534187

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

Я рекомендую тебе сделать наше задание на список студентов. Там все это разжевывается и там подробные пояснения на эту тему. Если ты пытался делать файлообменник, то тебе пока рано это делать и лучше начать с более простой задачи.
#531 #535078
>>534187

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

Я рекомендую тебе сделать наше задание на список студентов. Там все это разжевывается и там подробные пояснения на эту тему. Если ты пытался делать файлообменник, то тебе пока рано это делать и лучше начать с более простой задачи.
#532 #535080
>>534505
ну погугли MVC, блин.
#533 #535083
>>534937
У тебя кодировка многобайтная.

Ты обращаясь к $text[0] обращаешься не к первой букве, а к первому байту этой буквы. Поэтому нужно тут через (mb_)substr первую буквы дергать, если хочешь её сделат большой.
#534 #535085
Аноны, я помню, там файлообменник надо проверить и кошки-мышки, сегодня не успеваю.

>>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 из конструктора? По моему ты что-то не так понял.

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

Я советую вернуться к этой главе и прорешать все задачи там, сдать их и исправить замечания. Если ты пропускаешь разделы учебника то заслуженно страдаешь. Вернись и исправь пробелы в знаниях. Это касается и других уроков, не только ООП.
#534 #535085
Аноны, я помню, там файлообменник надо проверить и кошки-мышки, сегодня не успеваю.

>>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 из конструктора? По моему ты что-то не так понял.

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

Я советую вернуться к этой главе и прорешать все задачи там, сдать их и исправить замечания. Если ты пропускаешь разделы учебника то заслуженно страдаешь. Вернись и исправь пробелы в знаниях. Это касается и других уроков, не только ООП.
#535 #535088
Кто-нибудь вообще с первого раза гуглокапчу разгадывает? у меня он «указателем» назвает дорожный знак «кирпич». Там еще и перевод кривой.

>>534575

Ты не приложил кода ни текста ошибки, если он есть. Какой ответ ты ждешь?

>>534577

Еще проще вообще не писать.

>>534584

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

>>534592

Вернись и сделай пропущенные уроки. И все начнет передаваться.

> сказали сделать файлообменник на слиме же


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

>>534593

Генерируешь число от 0 до N-1, где N число элементов в массиве, и берешь соответствующий элемент из массива.

>>534611

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

Подсказка: гугли «проблему N + 1 запроса»

> потому что часто пишут неясно, приходится догадываться


Можно код почитать.

>>534649

Инспектором посмотри какие на нем CSS правила. Они могут быть переопределены другим правилом.

>>534711

Смотря для чего.

>>534732

Решение на проверку потом сдай.

>>534745

> Есть предложения получше?


изучить пропущенные темы.
#535 #535088
Кто-нибудь вообще с первого раза гуглокапчу разгадывает? у меня он «указателем» назвает дорожный знак «кирпич». Там еще и перевод кривой.

>>534575

Ты не приложил кода ни текста ошибки, если он есть. Какой ответ ты ждешь?

>>534577

Еще проще вообще не писать.

>>534584

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

>>534592

Вернись и сделай пропущенные уроки. И все начнет передаваться.

> сказали сделать файлообменник на слиме же


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

>>534593

Генерируешь число от 0 до N-1, где N число элементов в массиве, и берешь соответствующий элемент из массива.

>>534611

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

Подсказка: гугли «проблему N + 1 запроса»

> потому что часто пишут неясно, приходится догадываться


Можно код почитать.

>>534649

Инспектором посмотри какие на нем CSS правила. Они могут быть переопределены другим правилом.

>>534711

Смотря для чего.

>>534732

Решение на проверку потом сдай.

>>534745

> Есть предложения получше?


изучить пропущенные темы.
#536 #535091
Ура, ОП пришел, сейчас и мне наверное ответит. Сижу жду пока дойдет до меня :3
516 Кб, 1280x960
#537 #535095
Оп, я хотел спросить. Вот по поводу инкапсуляции и php блядь нигде не замечаю использывания этого принципа.

Везде стучаться на прямую к объектам, даже в фреймворках.
Что за дела? Где get/set-теры?
#538 #535096
>>535078

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

>Кто-нибудь вообще с первого раза гуглокапчу разгадывает?


Хм, у меня почему-то не каждый раз появляются картинки, в четырех случаях от пяти достаточно отметить галочку "я не робот".
#538 #535096
>>535078

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

>Кто-нибудь вообще с первого раза гуглокапчу разгадывает?


Хм, у меня почему-то не каждый раз появляются картинки, в четырех случаях от пяти достаточно отметить галочку "я не робот".
#539 #535102
>>534752

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

>>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
#539 #535102
>>534752

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

>>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
28 Кб, 461x182
317 Кб, 392x583
#540 #535105

>не каждый раз появляются картинки


Пик1. Один раз на сессию?

Пик2. Помогите решить капчу: средняя тачка в нижнем ряду это пикап? Не разбираюсь в быдломобилях.
#541 #535114
>>535102

>Ты уверен что совет в гугле именно к твоему случаю? Лучший выход изучить CSS как следует, у нас кстати есть задачки на HTML/CSS в Оп посте.


>Я бы начал с вопроса, зачем ты ставишь width 100% если блоки по умолчанию занимают всю ширину родителя с учетом паддингов и маргинов. Ты зачем код и жизнь себе усложняешь? Надо знать возможности CSS и способы поиционирования элементов, а не переставлять свойства наугад.



Я смотрел в инспекторе, там паддинг задан нулевой , не знаю почему он переписывается браузером. Убирал в инспекторе галочку с width 100%, ничего не меняется, возможно баг инспектора и если убрать в ксс файле все станет нормально. А вообще это не мой сайт, если что, я просто наткнулся на одном сайте на полосы прокрутки и решил посмотреть, что их вызвало и был озадачен.
#542 #535116
>>534946

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.
#542 #535116
>>534946

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.
#543 #535121
>>535105

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

У меня каждый раз показывает.

>>535114

правила каскадируются и одни правила переопределяют другие. Ты все рассмотрел?

Без примера кода или скриншота не понять.

Полосы прокрутки могут быть вызваны много чем, достаточно длинного слова или картинки, выходящего за край экрана.
#544 #535170
>>535105
Я с этой капчей уже на форче натренировался. нет.
#545 #535171
>>535102

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


Укажи ошибки тогда. Честно говоря, задачи твои говно - мне их скучно решать. Да и описаны они хуево, я их также как этот решу, файлообменник хоть на ргхосте посмотреть можно. Лан, раз указывать ошибки не можешь, то пошел нахуй. Сам как-нибудь напишу и залью в портфолио.
#546 #535174
>>535078
Да не охота мне лишний цсс было подключать. Ты чужую лень вечно на незнание списываешь и звучишь, как высокомерный мудак.
#547 #535175
И в твоем примере тоже ивы и елсы во вью допускаются, так что хуле вы раскукарекались.
?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
#547 #535175
И в твоем примере тоже ивы и елсы во вью допускаются, так что хуле вы раскукарекались.
?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
#548 #535214
Посмотрел вакансии джуниоров в Москве, совсем уж начальные знания требуют. Всего 2 нормальные вакансии и зп 25к. Зато куча вариантов, где требуют 1-3 года опыта и дают 50к+. Вроде как по требованиям я прохожу, но нет коммерческого опыта. Реально ли без него сразу устроиться на нормальную работу? Есть пара сайтов, но чистого пхп там мало, в основном Laravel + Angular.
#549 #535215
>>535116
ОП, почему ты мои посты >>534410 оставляешь без внимания?
#550 #535221
Что за логи и как они пишутся?
Кстати, вот задачку можете порешать.
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
32 Кб, 988x690
#551 #535224
божи, зачем я начала гуглить вакансии?
#552 #535225
>>535171

Залей. Это будет лучшим свидетельством твоей безграмотности.

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

В задаче впрочем это не нужно.
#553 #535228
1. А как вообще ботов для вк пишут? Там же нужно иметь доступ к их коду для этого?
2. Зачем использовать в небольших проектах дата маппер, ведь это только лишнее усложнение кода ибо запросы нечасто делаются.
#554 #535229
>>535221
Это где такие тестовые дают?
#555 #535230
>>535225
А как узнать, сколько по времени функция или запрос выполняютя?
#556 #535231
>>535229
Да я погуглил вакансии, ДС, там еще предлагали работу репетитором пхп по скайпу лол (МВК, ООП) 500 рэ час. Везде кстати на удаленке требуют наличие гарнитуры и живое общение голосом, а у меня мик хуевый и прям в вебке.
#557 #535232
>>535095
Кстати, вот в Magento-о таки прайват, гененрируються сами, а если не получается, то можно всегда по нейму вытащить, ОП-кун, кстати по карьере вопрос, уже 3 месяц работаю с Magento и немного Wordpreess, вктатиться в нормальные проекты с фреймворками можно будет потом? Сейчас посмотрел код Laravel кончил от него просто
#558 #535233
>>535230
Можно что-то схожее по принципу сделать:
$a = time();
func();
$a = time() - $a;
echo $a;
#559 #535235
>>535228
>>535228
У vk есть открытое API для взаимодействия, бака. Гугли.

Затем, что это разделения логики + если потом что изменять в духе db или еще что-то, то тебе не придетсья переписывать половину кода
#560 #535237
>>535228

1. Смотря какие цели. Тут бот должен имитировать браузер, значит нужен селениум (может быть патченный) или что-то аналогичное. Мы тут не обсуждаем разработку вредоносных программ, а для невредоносных вконтакте предоставляет АПИ: http://vk.com/dev

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

Да и веб-приложения маленькие редко бывают. Маленькими бывают только учебные задания.

>>535233

time считает с точностью до секунды что слишком грубо. Лучше microtime(true) который возврващает дробное число (там точность зависит от ОС, на винде около 15 мс, на линуксе больше).

>>535232

Можно, почему нет?
#561 #535238
>>535228

2. А что бы ты предложил? Чтобы использовались объекты, а не какие-нибудь массивы.
#562 #535239
>>535062

>> Сделаю. Но вроде бы даже не то название я находил. Может действительно бесплатный найду.


>Там используется именно Lato (кстати, это переводится как «Лето») и он бесплатен для использования в вебе, о чем написано на сайте: http://www.latofonts.com/lato-free-fonts/


>Там же можно скачать архив с шрифтом в нужных форматах, уже сконвертированный.



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

Я вчера уже начал переделывать макет, скачал этот шрифт, правда пришлось сделать два, так как в макете присутствует еще Lato Black, он какой-то сверхжирный и в папке с различными начертаниями шрифта Lаto его не было. В общем все сконвертировал, в КСС подключил и начал понемного изменять шрифты текста на сайте, но прервало то, что мой аккаунт на хостингере отключили, как и у всех остальных, и теперь ищу другое место куда загрузить. Не могу найти пока, перепробовал кучу бесплатных хостингов, но все не нравятся.

И еще, столкнулся с такой проблемой что размер шрифта в макете и на сайте не совпадает. Я специально смотрел в макете, чтобы точно такой же размер поставить и вот пример. В макете слова в шапке написаны 13pt, выставляю на сайте такой и слова просто огромными получаются. Ставлю 13 но не pt а px и уже вроде похоже на правду, но тоже не уверен. Гуглил таблицу переводов фотошоповских pt в px и фигню только нашел. Например 13pt там равны 17px. Выставил 17px и те же огромные слова получились. На глаз получается подбирать шрифт?
#563 #535241
>>535239

> так как в макете присутствует еще 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 ставить. Ну или на глаз подбери постепенно меняя размер. Ты еще помни что браузер можешь чуть по-другому рендерить шрифт потому идеально с фотошопом не совпадет все равно.
#564 #535243
>>535239

> но прервало то, что мой аккаунт на хостингере отключили


Ты можешь html файл сохранить на диск и в браузере смотреть же.
#565 #535244
Какая разница, какой код? Главное, чтобы работало и уязвимостей не было йопта.
#566 #535245
>>535238
Просто в контроллере хуячишь гет пост и сокл запросы.
#567 #535247
>>535235

>бака


почему ты разговариваешь, как анимешный пидорас?
#568 #535250
>>535237

>Апи


вот это вот получается, что любой пидр может получить данные из моих соцсетей, пиздец. чем больше я узнаю о сети, тем больше мне плохеет.
9 Кб, 544x394
#569 #535257
>>535241

>Это просто начертание с жирностью 900, сверхжирный.



А что писать в font-weight? Что то типа ExtraBold делал так в 1й раз, но переделал на два шрифта или 900 Откуда эта цифра 900 еще, понимаю что есть диапазон 100-900, но где указано что у Lato Black веса 900??

>Можешь попробовать github pages, бесплатно, без рекламы. Нужно умение пользоваться гитом (FTP там нет), но он тебе все равно в дальнейшнем понадобится:



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

>pt и px не путаешь?



Не думаю. Прикрепил пикчу.

И да, сайт макета работает уже. У меня было много бесплатных аккаунтов нарегано, нужно было 2 только оставить. Удалил лишние. Я это к тому, что можно посмотреть как выглядят слова в шапке. По моему даже 13 px там много. maketi.esy.es
#570 #535265
>>535232
магенто же платный. у них платформа прям на сайте.
#571 #535284
Недостатки Active Record

Модели Active Record нарушаю принципы SOLID. В частности, принцип единой ответственности (SRP — «S» в принципах SOLID). Согласно принципу, доменный объект должен иметь только одну зону ответственности, то есть только свою бизнес-логику. Вызывая его для сохранения данных, вы добавляете ему дополнительную зону ответственности, увеличивая сложность объекта, что усложняет его поддержку и тестирование.
Реализации сохранения данных тесно связана с бизнес-логикой, а это означает, что если вы позже захотите использовать другую абстракцию для сохранения данных (например для хранения данных в XML-файле, а не в базе данных), то вам придется делать рефакторинг кода.
See? У датамаппера есть недостатки.
14 Кб, 646x134
#572 #535301
Теперь я официально зашкварен видеокурсами.
#573 #535305
>>535301
еще и платными, кек.
если не жалко денег, то найми лучше репететора
#574 #535309
>>535305
Найти бы его ещё. За $9.
#575 #535310
>>535309
В месяц.
#576 #535311
>>535310
Алсо, чем ОП не репетитор?
#577 #535312
>>535311
Он не берёт деньги.
#578 #535313
>>535311
Он гуглить заставляет(((
#579 #535316
>>535312
>>535313
Мне норм.
28 Кб, 736x373
#580 #535335
Почему перестановка местами этих шрифтов влияет на сами шрифты на макете. В боди прописан font-weight: normal;
Но он становится то тонким то нормальным, если эти 2 фонт-фейса менять местами.
#581 #535384
»535247
Потому, что я еще застал время, когда онямужники знали, что kde на freebsd надо ставтить на порты, а ты сосал хуй :c
»535237
Оп-кун, еще есть PhantomJs, не обязательно анонам учить приемы автоматизированного тестирования.
»535265
У них есть community edition, который бесплатный и есть тырпрайз, работаю с обеими, когда как. Кстати денег срубить можно много, а можно и попасть, если облажаешься жутко и отвественным сделают тебя, но ты лохом последним должен быть.

Оп, ты вот что мне подскажи, что лучше сделать в качестве учебного на Laravel, а то файлообеменик слишком просто, а банальные блоги тоже не сложно и уныло. Сайт с тестами делать не хочу, у меня нет так много времени.
#582 #535405
ОП, буду благодарен, если прокомментируешь данные программы:
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
#583 #535409
>>535225

>Я вчера не успел проверить файлообменник и кошки-мышки. А без ответа чтобы их было легче найти.


Так ты ответишь позже?
#584 #535424
>>535409
Я не помню, чтоб он кого-то игнорировал. неОП
72 Кб, 794x756
#585 #535425
>>535301
Я знаю кунг-фу HTTP!
#586 #535452
А как при помощи ПХП можно включать веб-камеру пользователя по его разрешению? Типо как в чатрулетке и на прочих подобных сайтах.
#587 #535470
>>535452
Это делается на клиенте через js, причем тут php?
У-у сука, я тебе не гугл
14 Кб, 533x83
#588 #535475
>>535085

>Непонятно что ты хочешь сделать. ЧТо такое \\3 например?


Эта фигня в регулярках, номер строк после (.)
Т.е. \\3 это (\s|\n|[,.?!](\s|\n)|$)
Я хочу заменить ссылку на изображение вк на само изображение. У меня это получилось, но в конце ссылки приписывается блядское <br> с какого-то хера и всё ломает. Как ты можешь не знать регулярки? Это же азы.
sage #589 #535505
>>535384

> что я еще застал время, когда онямужники знали, что kde на freebsd надо ставтить на порты


С лурочки узнал?
139 Кб, 954x896
#590 #535509
br там берется из исходного текста куда ты скорее всего его сам же и вставляешь для перевода строки.

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

Твой скриншот инспектора вообще не в тему так как он не показывает исходный код HTML, а показывает распарсенное дерево DOM которое не совпадает с исходным кодом по разным причинам.

Также у тебя скорее всего там XSS которая позволяет злоумышленнику вствить произвольный HTMl код. Ты вообще неправильно делаешь, надо парсить исходное сообщение на узлы и их преобразоывать в HTMl а не лепить костыли с заменами на регулярках. Ты должен понимать где у тебя текст, а где HTMl код а я вижу что ты не понимаешь и думаешь что это одно и то же, хотя это не одно и то же. Например <b> как текст это 3 символа, а в HTML это тег.

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

Мне сейчас некогда обяъснять, как это сделать, но у меня нашлась картинка которая может быть поможет.
#591 #535510
>>535505

Шапку треда посмотри. Слово бака самое что ни на есть уместное в этом ITT треде.
#592 #535513
>>535475

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

Текст: /index.php?a=1&copy=1
HTML: /index.php?a=1&amp;copy=1

Учел ли ты это в своем коде?
#593 #535555
Реквестирую огромные статьи и книги про настройку сторонних шрифтов.
ОП, я тот кун с макетом и я не могу понять что там делать. Почитал уже и бред от яндекса про шрифты и много других статей. Ну не работает оно и все.
#594 #535557
>>535085
Да я уже все это сделал. Осталось только дописать удаление файла, его публичный доступ, вью, ссылки ну и красиво запихать это все в валидаторы и дата мапперы (что я буду делать в последнюю очередь, когда уже все будет работать).
#595 #535562
>>535555

В твоем случае, попробуй вес прописать не через слова типа lighter. а числом, и в font-face и в коде. Ну и проверь правильно ли везде выставлен вес и font-style.

> Откуда эта цифра 900 еще, понимаю что есть диапазон 100-900, но где указано что у Lato Black веса 900??



Тут например https://www.google.com/fonts/specimen/Lato
#596 #535564
>>535562

>В твоем случае, попробуй вес прописать не через слова типа lighter. а числом, и в font-face и в коде.



А я, как обычно, до этого сам не догадался. Сейчас будет сделано.
#597 #535569
Посмотрел код джумалы - ну и говно, ничего не понятно. Как там вообще что-то менять можно.
#598 #535574
$app->get('/', function() use ($app, $obj) {
try {
$obj->thisMightThrowException();
$app->redirect('/success');
} catch(\Exception $e) {
$app->flash('error', $e->getMessage());
$app->redirect('/error');
}
});

Что делает thisMightThrowException(); в слиме? проверяет корректнось url? что это такое $obj?
#599 #535583
>>535562
>>535564

Все работает. Спасибо за ссылку. Выстроил по ней вес.

Доделал все шрифты которые там используются. Так же, так как у меня теперь есть фотошоп, а, следовательно, и точные размеры элементов, я кое-что переделал, например кнопки теперь размером как и на макете. Правда там есть небольшая разница, потому что размеры реальные имеют например такой вид 148,21312412 px, их я округлял, но это совсем незаметно.

Проверить работу можно на прежнем месте http://maketi.esy.es/
#600 #535597
>>535569

Там и не надо ничего менять а надо использовать API

>>535574

Это просто кусок кода, недописанный, очевидно. ПРичем на мой взгляд еще и неправильный так как ловтяся все исключения без разбора, это неверно. Почитай мой урок про исключения лучше.
#601 #535625
>>535078

>br в верстке это 100% признак незнания CSS


Из шаблонов Yii
<div id="footer">
Copyright &copy; <?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__; ?> Как это прописать в твиг?

Я не робот. Спасибо абу.
#602 #535627
Я не знаю, что за говно тут советовало выставлять в енум true или false, но у меня нихуя не проверяется это значение, поэтому я ставлю числа.
#603 #535643
>>535625
Да он какой-то поехавший реально. До каждой запятой и закорючки доебывается.
#604 #535646
>>535597
Ты долбоеба кусок, этот код я скопировал из ОФИЦИАЛЬНОГО руководства слима. http://docs.slimframework.com/routing/helpers/
#605 #535656
>>535646

>>Ты долбоеба кусок


Потише, братишка, в этой ситуации.
Касательно кода: это просто абстрактный пример. На примере этого куска объясняют работу методов halt(), pass(), redirect() ,stop(). thisMightThrowException дословно переводится этоМожетВызватьИсключение. Подразумевается, что это какой-то метод, который может вызвать исключение.
#606 #535673
Почему у меня аутолоадер не работает?
function myAutoloader($class)
{
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
include $file;
}
}

spl_autoload_register('myAutoloader');
#607 #535688
>>535673
Где у тебя папка с классами лежит?
16 Кб, 604x167
#608 #535696
Пиздос, в моем коде куча использования class_alias(), который облегчает жизнь, а на единственном бесплатном хостинге с доменом, фтп, пхп, мускулом, который я нарыл 000webhost.com эта функция не работает. Хост плохой или class_alias чем-то заменить? я пхп-неофит двух недель отроду и этой мое первое знакомство с хостингами
#609 #535697
Посоны, что значит в PHP, когда названия классов с \ пишутся, например \Exception. Пробовал убирать \, переставало ловиться исключение.
#610 #535699
>>535697
Про неймспейсы почитай.
#611 #535706
ОП, поясни за TableDataGateway, у тебя на сайте непонятно. Есть пример его простой какой на PHP? Не въеду, чем от DataMapper отличается и как он вообще реализован.
#612 #535710
>>535696
Если ты юзаешь такую поебень, то у тебя стопудово неправильная архитектура. Классам не нужны никакие альясы, есть же неймспейсы, есть трейты, есть наследование и интерфейсы, абстрактные классы в конце концов. Всего этого с головой хватает, чтобы без таких костылей обходиться.
#613 #535715
>>535710
Я юзаю просто для того, чтобы писать не StudentMapper а SM, чтоб проще читалось и понималось.
#614 #535720
>>535715
Если ты работаешь один, то конечно можно как писать как угодно.
Но если будешь устраиваться в хорошую контору, то коллегам подобное "упрощение" может очень не понравиться.
#615 #535741
>>535706
Гугли на хабре есть примеры разбора ActiveRecord and DataMapper. Плюс погугли паттерн DAO в java
#616 #535760
Аноны, есть чатик с комнатами, диалоги сделаны при помощи яваскрипта и довольно быстро стираются, истории диалогов нигде нет. Хочу сохранять диалоги в блокнот, и поэтому попробовал написать парсер. Но парсит он как-то криво и сообщения вообще не парсит, парсит комнату не полностью. Парсю по адресу комнаты, который можно найти только в исходном коде. Как быть? Есть ли варианты? Я использую file_gets_contents, на curl не может быть других результатов?
#617 #535762
>>535760
Извини анон, кое-что прояснилось, но это привело к ещё большему количеству вопросов. Оказывается мне парсит не саму комнату, а страницу входа в неё (хотя на этом браузере я уже в ней нахожусь). Но войти в неё я не могу, через ту странице где я открыл её спарсенный вариант, так как при нажатии кнопки переводит на страницу
адрес_моего_денвер/login а надо адерсчата/login и дальше адресчата/room как это сделать? Если это сделать то дальше можно будет запускать скрипт каждые 30 секунд и парсить все сообщения.
#618 #535769
Двощ, запись $out .= $b, эквивалентна записи $out = $out.$b? Или как
38 Кб, 390x470
#619 #535779
>>535078

> br в верстке это 100% признак незнания CSS.


> div в верстке это 100% признак незнания JS.


> html в верстке это 100% признак незнания PHP.

#620 #535796
аноны спасайте, траблы с mysql
есть скрипт, с бесконечным циклом, работает на линуксе
подключена база
та вот, через часов 5 работы скрипта выводит варнинги-Warning: mysql_fetch_array() expects parameter 1

$g = mysql_fetch_array(mysql_query("SELECT * FROM `stat` WHERE id='1'"));
#621 #535816
>>535688
в папке classes очевидно же.
#622 #535818
>>535796
Сделай проверку в бесконечном цикле, чтобы считал время и перезапускался каждые 4 часа.
#623 #535820
>>535769
бля, это настолько тупой вопрос, что я даже не знаю, попробуй оба и посмотри результат.
#624 #535831
>>535625

> Макаров быдло-боберкодер получается?


Просто плохо знает 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

Алсо, вот вещи которые я научился распознавать с первого раза: указатели (на самом деле дорожные знаки), капуста, пончики (они круглые и с дыркой). Алсо капча истекает где-то через минуту если пост не отправить.
#624 #535831
>>535625

> Макаров быдло-боберкодер получается?


Просто плохо знает 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

Алсо, вот вещи которые я научился распознавать с первого раза: указатели (на самом деле дорожные знаки), капуста, пончики (они круглые и с дыркой). Алсо капча истекает где-то через минуту если пост не отправить.
#625 #535835
>>535831
Лезть в файл, создавать стайлс.цсс, подключать его в хедере только чтобы поставить паддинг в 10 пикселей, когда можно было поставить br
#626 #535837
>>535706

Лучше наверно обратиться к первоисточнику (точнее переводу) и сравнить картинки:

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.
Как минимум это включает, кроме приведенного выше, еще поддержку работы с отношениями между таблицами и ленивую загрузку связанных объектов при обращении к ним.

Первоисточник вообще это книга Фаулера «Паттерны (шаблоны) проектирования корпоративных приложений». Можешь попробовать почитать как-нибудь, хотя она рассчитана на людей с опытом.
#626 #535837
>>535706

Лучше наверно обратиться к первоисточнику (точнее переводу) и сравнить картинки:

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.
Как минимум это включает, кроме приведенного выше, еще поддержку работы с отношениями между таблицами и ленивую загрузку связанных объектов при обращении к ним.

Первоисточник вообще это книга Фаулера «Паттерны (шаблоны) проектирования корпоративных приложений». Можешь попробовать почитать как-нибудь, хотя она рассчитана на людей с опытом.
#627 #535838
>>535706

За счет абстракции от базы данных 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 ");
....
}

Грамотный разработчик должен понимать преимущества обоих подходов и уметь выбирать по ситуации.
#627 #535838
>>535706

За счет абстракции от базы данных 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 ");
....
}

Грамотный разработчик должен понимать преимущества обоих подходов и уметь выбирать по ситуации.
#628 #535844
>>535715

Ты превращаешь свой код в нечитаемую кашу. Как это расшифровывать? Откуда я узнаю что значит SM? Ты предлагаешь мне перед чтением кода прочесть и выучить наизусть словарь сокращений? Боюсь, у меня нет на это времени как и у твоих будущих коллег, которым придется читать твой код.

Не делай так. Также, там в коде имя класса приходится писать всего 1 или 2 раза, в bootstrap.php. Почему это тебе приходится писать его чаще, а? Ты уверен что все правильно делаешь?

Ну и в конце концов, может пора уже начать использовать IDE с автодополнением?

>>535769

Почти эквивалентна (результат дает такой же хотя внутри работает чуть по другому).

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

>>535779

Бред же. Или ты пошутить неуклюже пытался?

>>535796

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

>>535835

Там ведь уже создан и подключен, что ты глупость пишешь? Алсо есть еще тег style.

Самое важное что исплоьзуют br те кто не понимают концепцию HTML/CSS, как они работают. Так же как некоторые пользователи ворда не понимают форматирование и отступы.
#628 #535844
>>535715

Ты превращаешь свой код в нечитаемую кашу. Как это расшифровывать? Откуда я узнаю что значит SM? Ты предлагаешь мне перед чтением кода прочесть и выучить наизусть словарь сокращений? Боюсь, у меня нет на это времени как и у твоих будущих коллег, которым придется читать твой код.

Не делай так. Также, там в коде имя класса приходится писать всего 1 или 2 раза, в bootstrap.php. Почему это тебе приходится писать его чаще, а? Ты уверен что все правильно делаешь?

Ну и в конце концов, может пора уже начать использовать IDE с автодополнением?

>>535769

Почти эквивалентна (результат дает такой же хотя внутри работает чуть по другому).

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

>>535779

Бред же. Или ты пошутить неуклюже пытался?

>>535796

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

>>535835

Там ведь уже создан и подключен, что ты глупость пишешь? Алсо есть еще тег style.

Самое важное что исплоьзуют br те кто не понимают концепцию HTML/CSS, как они работают. Так же как некоторые пользователи ворда не понимают форматирование и отступы.
#629 #535845
>>535762

Тебе надо изучить HTTP, HTML и JS наверно сначала, если ты не понимаешь как работает чат и как обменивается данными, то тебе рано писать такие скрипты. Алсо используй Chrome Webtools чтобы посмотреть как он устроен.
#630 #535847
>>535835

> лезть в другие файлы, читать мануалы, писать какие-то классы и отделять HTML от PHP, когда можно просто написать echo '<div>', mysql_fetch_query("SELECT name FROM user WHERE id = $_POST[id]"); как учили в видеокурсах на ютубе

#631 #535854
В общем в этом куске у меня не определена переменная $class, как ее определить? Не все классы же руками вбивать, иначе проще require поставить.
function myAutoloader($class)
{
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
include $file;
}
}

spl_autoload_register('myAutoloader');
#632 #535856
>>535854

Как она может быть не определена? Проверь не опечатался ли ты и не русская ли там буква c
#633 #535865
>>535844

> функции mysql_ устарели


Знаю, слышал, но не понимаю из-за чего? Много букав читать не хочется, кратко объясни
#634 #535883
>>535865

Потому что так написано в мануале (открывал ли ты его?)

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 лет назад, почти не обновляется и в ней нет например тех же плейсхолдеров, что в сочетании с кучей неграмотных уроков в сети побуждает людей быдлокодить и вставлять переменные прямо в запрос.
#635 #535885
>>535865

Про старые туториалы отдельно написано:

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

19 Кб, 450x300
#636 #535886
ОП'чик и другие пэхэпэ няши из етого треда, у меня такая проблема: не могу понять почему не проходит запрос:
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.
Кол-во параметров и свойств совпадает, названия тоже.
#637 #535893
Как вы может быть слышали, крупные компании (мейл, яндекс) обычно организуют свои школы, где берут способных ребят и доучивают их до джуниоров. Вот например на Хабре статья про них: http://habrahabr.ru/company/mailru/blog/265463/

Выглядит интересно, например мастер-класс по nginx проводит его автор (Игорь Сысоев), раньше он был сисдамином в Рамблеме, а сейчас у него компания, которая этот самый nginx (точнее поддержку) продает крупным корпорациям.
#638 #535897
>>535856
А в каком месте она определена, поясни? Может к этому коду еще что-то допистать надо?
при вар дампе выводит пустоту вместо имени класса.
#639 #535898
>>535886

> Не понятно, последовательность prepare->bind->execute обязательна для запроса с placeholder'ами?


bind можно не делать если ты массив передаешь в execute.

> Кол-во параметров и свойств совпадает, названия тоже.


А можно пруф, например сделай var_dump массива который ты передаешь в execute.

Ну и ты плохую идею придумал, объект превращать в массив. Где это такому учат? Не в нашем треде точно. Например как ты собрался гарантировать что никто никогда не добавит в этот класс новое поле, которое не сохраняется в базу?

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

Логичнее сделать список полей и по этому списку циклом забрать поля из объекта и перенести в массив.

Также, по моему в массиве должны быть ключи с двоеточием в начале, точно так же как и записано в запросе. Уточни этот момент в мануале.
#640 #535901
>>535897

> function myAutoloader($class)


$class в скобках очевидно значит что в функции всегда есть переменная $class и она хранит первый переданный функции аргумент. Ты не прогулял ли урок по функциям?

Или ты пытаешься сдампить переменную снаружи функции?
#641 #535904
>>535583
ОП, скажи пожалуйста, будут еще какие-нибудь комментарии насчет макета? Ну там исправлять нужно еще что-нибудь? Или уже все, можно забыть о нем и переходить к следующим работам спокойно, не отвлекаясь на него.
17 Кб, 501x203
#642 #535908
>>535898

>var_dump


делал ранее и не заметил, что он как то косячно преобразовал имена полей(на пикрелейтед)

>Ну и ты плохую идею придумал, объект превращать в массив. Где это такому учат? Не в нашем треде точно. Например как ты собрался гарантировать что никто никогда не добавит в этот класс новое поле, которое не сохраняется в базу?


Я об этом еще не думал, но я понял что ты хочешь сказать - делать максимально универсальный/масштабируемый код. Но ведь мапперы в таком маленьком приложении не нужны, во всяком случае мне пока сложно понять зачем. Позже начну повторять java и почитаю что-нибудь по паттернам/UML.
#643 #535909
>>535886
а хуй знает, возьми слим, там есть bindparameters (правда у меня тоже не сработали эти плейсхолдеры).
#644 #535911
>>535901
ват? откуда вообще эта переменная $class берется, он открывает папку классс и считывает тоже оттуда файл и пишет его имя в $class? наверное у меня просто пхп 4, а не 5 не работает. Или нужно дополнительно вызывать function myAutoloader(вот тут пишем имя класса)? или пееменная класс берется при создни объекта $obj = new $class?
2 Кб, 100x100
2 Кб, 100x100
290 Кб, 1600x639
#645 #535912
https://github.com/MindiMakridi/RESTFUL исправил всё.

>Также, у тебя там встречается 2 раза imagecreatetruecolor. Я думаю, картинку можно создавать только один раз. А обрезку реализовать указанием координат и размера вырезаемой из исходной картинки области.


Так и сделал. Но теперь результат другой, я не уверен, что правильный. Первая пикча - результат кропа по первому алгоритму, вторая - то, как обрезается сейчас. Третья - исходное изображение.
#646 #535914
>>535912
max-size пропиши, хуле хуйней страдаешь.
#647 #535916
>>535908

>делал ранее и не заметил, что он как то косячно преобразовал имена полей(на пикрелейтед)


разобрался, а дело было вот в чем:

>Если вы преобразуете в массив объект (object), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными исключениями: целочисленные свойства станут недоступны; к закрытым полям класса (private) спереди будет дописано имя класса; к защищенным полям класса (protected) спереди будет добавлен символ '*'. Эти добавленные значения с обоих сторон также имеют нулевые байты.

#648 #535917
>>535916
а все из-за того, что тут http://habrahabr.ru/post/137664/ это было описано как фича
#649 #535922
>>535908

Для 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 мы создаем превьюшку и переносим на нее кусок картинки.
#649 #535922
>>535908

Для 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 мы создаем превьюшку и переносим на нее кусок картинки.
#650 #535925
>>535917

Как мы видим, автор статьи ошибся.
#651 #535928
>>535844

> Бред же. Или ты пошутить неуклюже пытался?


Чем ты в CSS заменишь br? Маржином?
#652 #535941
>>535928
display: block
#653 #535944
>>535928

По моему у тебя тоже непонимание HTML/CSS. br, если он использован уместно (для обозначения разрыва строки), ничем заменять не надо. В стихах, почтовых адресах, текстах программ.

А вот если его используют для вертикального выстраивания блоков, это уже неправильно. В HTMl/CSS это делается гораздо удобнее.
161 Кб, 1024x768
#654 #535951
Как научиться алгоритмическому мышлению?
Ведь выучить синтаксис язка - дело максимум пары месяцев.
1 Кб, 100x100
#655 #535954
>>535922
Все равно получается не то. Вот смотри, оригинал пикчи у меня 1600х639. Я беру меньшую сторону, то бишь высоту и приравниваю её к 100(так как я хочу создать 100х100 пикчу). Дальше 1600 умножаю на 100/639, получается 250.
В итоге получаем что-то вроде этого
imagecopyresampled($new_image, $old_image, 0, 0, $x, $y, 100, 100, 250, 100);
Результат пикрелейтед. Хотя с таким же алгоритмом и промежуточной картинкой получалась правильная превьюшка. Где ошибка в моих рассуждениях?
#656 #535956
>>535954

> Дальше 1600 умножаю на 100/639, получается 250.


А должно получиться 639×639
#657 #535957
>>535954

А, то есть я имею в виду что кусок который ты вырезаешь должен быть размером 639×639. А у тебя 250×250
#658 #535959
>>535957
250х100 же. К тому же в учебнике ОПа написано следующее:

>есть 2 режима уменьшения, когда например мы пытаемся вписать картинку 1000×200 в квадрат 100×100: CROP — уменьшает картинку до 500×100 и отрезает правую и левую части


По твоей логике мы уменьшаем картинку не до 500х100, а до 200х200
#659 #535969
>>535959

> Вот смотри, оригинал пикчи у меня 1600х639.


> я хочу создать 100х100 пикчу


Очевидно что для сохранения пропорций надо вырезать кусок размером 639×639 и уменьшить его в 639/100 = 6.39 раз. Возможно в учебнике просто не очень понятно сформулировано, но CROP это когда мы берем максимально большой кусок из исходной картинки, который пропорцими соответствует превьюшке. А SCALE это когда мы ничего не отрезаем, а только уменьшаем.
#660 #535981
>>535922
В слиме нет PDO, сасай.
#661 #535983
>>535954
Ошибка в твоих рассуждениях в том, что ты долбоеб, не использующий макс сайз.
#662 #535984
>>535898

>Логичнее сделать список полей и по этому списку циклом забрать поля из объекта и перенести в массив.


В таком случае названия полей в БД и название свойств в классе должны совпадать, причем на каждое свойство в классе должен быть описан гетер вида 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);
}
35 Кб, 1025x406
#663 #535987
>>535984
так читабельнее
#664 #535988
>>535983

Тебе же выше ответили почему ты не прав, вернись и перечитай.

>>535984

Можно сделать массив вида [имя поля => имя колонки].

> arrayOfFields


не надо писать arrayOf, пиши fields или fieldNames

Функцию лучше назвать getFieldsAsArray например.
2 Кб, 100x100
#665 #535993
>>535969
Вот теперь у меня получается точная копия того, что было с промежуточной картинкой, которая вроде как правильная. Правда всё это:

>Логика должна быть такая:



- у нас есть размер превьюшки, pw/ph
- у нас есть размер исходной картинки w/h
- из них вычисляем во сколько раз мы уменьшим картинку, scale, заодно проверяя не выйдет ли у нас увеличение вместо уменьшения
- получаем окончательный размер превьюшки (она может стать меньше если исходная картинка очень маленькая)
- из этих данных мы вычисляем размер вырезаемой области на исходной картинке, sw/sh
- из них мы вычисляем расположение вырезаемой области на исходной картинке, sx/sy

>Имея sw/sh/sx/sy мы создаем превьюшку и переносим на нее кусок картинки.



Мне не понадобилось, я просто беру меньшую сторону картинки в качестве ширины и высоты исходного изображения и вырезаю квадрат из середины. Подозреваю, что я снова где-то не прав. Обновил репозиторий короче.
https://github.com/MindiMakridi/RESTFUL
#666 #535996
>>535988

>Можно сделать массив вида [имя поля => имя колонки]


зачем?

>не надо писать arrayOf


это еще почему
#667 #535999
>>535996

>>Можно сделать массив вида [имя поля => имя колонки]


> зачем?


Это если имена не совпадают

>>не надо писать arrayOf


> это еще почему


Потому что и так понятно что там хранится, если множественное число.
#668 #536014
>>535999

>Это если имена не совпадают


Но фишка была в том, чтобы к примеру передав в меппер поля таблицы, дернуть из объекта соответствующие свойства и записать их в таблицу.
#669 #536016
>>536014
И вообще это уже переусложнение, т.к. у нас все таки учебный процесс.
#670 #536025
>>535941
А если нужно два отступа?

>>535944
По-моему гораздо быстрее и проще для строчки написать br, чем делать для неё отдельный класс. Тогда львиная доля css-кода на крупном проекте будет из переносов состоять. Причем, иногда нужен перенос, но элемент не должен быть блочным.
Универсальнее и проще br. А там уже кому как нравится.
#671 #536027
>>535951
Пробуй всё, с чем ты сталкиваешься в реальности алгоритмизировать.
#672 #536029
>>535981
В пхп есть пдо, значит и в слиме есть.
#673 #536044
>>536025
Какие два отступа? Делаешь один отступ с помощью display:block, а его величину меняешь с помощью margin.
#674 #536046
Как сделать счетчик посещений страницы (например объявления)?
Если обновлять счетчик при каждом запросе, то можно быстро набампать посещения, обновляя страницу F5 (или через бота).
Значит нужно ограничение по айпи.
Но где его хранить? Если в базе, то при высокой нагрузке таблица посещений очень быстро достигнет гигантских размеров.
Чистить эту таблицу и обновлять счетчик по расписанию?
Или может сохранять не в таблицу, а логи, что лучше?
#675 #536053
я просто хочу быть программистом, сидеть в офисе клацать по клавишам получать за это копеечки, почему это так сложно? ;c
#676 #536054
>>536053
а то, я уже DataMapper второй день пилю.
#677 #536056
>>536053
Для этого есть вордпресс.
А программистам хорошо платят за огромные знания и умение решать нестандартные задачи.
#678 #536078
>>536046
Хранить ip посетителей в таблице1. При посещении страницы записывать ip в таблицу2. Раз в n времени (или n запросов) переписывать ip из таблицы2 в таблицу1, проверяя их на уникальность.
Но я хз, и вообще нуб.
#679 #536096
>>535845
А что значит выучить HTTP? Заголовки? Вроде бы как основы знаю. Но где можно почитать подробнее?
#680 #536107
Ну и зачем мне решать тупые задачки, если я могу просто погуглить и скопировать код или скопировать у чуваков итт? как-то тупо.
#681 #536109
>>536054
я еще даже не начинал... хотя че там пилить? мне просто тупо лень, никакой мотивации нет. как подумаю, сколько еще фреймворков и цмс и еще хрен знает каких подводных камней осваивать...
#682 #536115
>>536109
Мне кажется, ты слишком много думаешь.
Какая же теперь офигенная капча! Ничего выбирать не надо, просто галочку ставь и всё. И зачем нужны пасскоды после этого?
#683 #536116
>>536078
А лучше, наверное, парсить логи, да.
#684 #536133
Что такое cgi и cli? Если я правильно понял, cli это как модуль апача, а cgi независимая программа?
Если я хочу запускать 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 должен писать в файл)

Скиньте может какой-нибудь внятный гайд по крону.
#686 #536145
Посоны,почему разработка под битрикс считается дном?
#687 #536149
>>536133

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 не нужен, тем более он древний и неэффективный.
#688 #536151
>>536145
Потому что битрикс заставляет тебя пложить говнокод.
#689 #536153
Кстати, на memrise в сентябре будет конкурс на 1к $. Сам я давно им не пользуюсь, но тут вроде был анон, который недавно начал учить там слова, может это поднимет ему мотивацию.
http://www.memrise.com/blog/win-1000-in-our-september-back-to-school-learning/
#690 #536161
>>535838
>>535837
Спасибо, хорошо пояснил. У нас просто на фирме на хайлоад сайте TDG везде, а я даже понять не мог, почему там он, а не DataMapper. Теперь понятно.
#691 #536163
>>536107
Ну и зачем мне ездить на тупом троллейбусе, если я могу просто заплатить за проезд и сразу же выйти? Как-то тупо.
#692 #536176
>>532265

>Или может он на собеседовании переоценил свои навыки? А, анон, что ты на собеседовании рассказывал?



Вроде не переоценил, похоже оставят. Написал за эту неделю логгер для прокси с трейтами, интерфейсами и dependency injection, кучу юнит тестов, интеграционные тесты, новый роутер, который отлавливает параметры в строке, push нотификатор через curl с авторизацией по токенам, и еще всего по мелочи.

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


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

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


Все равно Scrum мне как-то не очень нравится. В начале спринта целый день всем тимом обсуждают что запланировано на спринт с Продакт Овнером, потом еще день обсуждают всякие Code Review, где всем надо за свой код пояснять с разбором на проекторе во всю стену, потом Feature Planing еще на полдня, совместное писание тикетов, рисование скрам-схем и досок и еще множество подобных мероприятий. В итоге вместо кодинга у всего тима полнедели на разговоры про него уходит, причем какие-то малополезные, потому что полезные все со схемками и объяснениями обычно 1 на 1 отдельно потом бывают. Ну из полезного там только, что Scrum мастер постоянно сениоров зазывает лозунгами, чтобы юниорам помогли.
#693 #536201
>>536149
Ошибся с путем к скрипту, и не дал право на запись в файл.
Теперь работает, если запускать руками, но через крон не получается.
Путей /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
Решил хранить айпи посетителей в отдельной таблице, а раз в час обновлять кроном основную таблицу и очищать вспомогательную.
#694 #536212
>>536201
О, заработало наконец. Помогло добавление в начале php-скрипта функции chdir(__DIR__). У меня использовались относительные пути при вызове функции fopen(), вероятно из-за этого была ошибка.
Permission denied - я сначала думал, что дело в правах, но оказалось, что он просто не может найти файл.

Почему так? Когда я запускал из браузера, скрипт прекрасно работал, а крону понадобилась эта функция chdir.
Наверное, что-то связанное с особенностями баша. Черт его знает, какую директорию он подсовывает в качестве текущей, наверное домашнюю пользовательскую.
#695 #536228
Оп-кун, а так какую учебку посоветуешь кроме тестов для лавараля?
#696 #536240
>>536176

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


Может нет прав на переход в один из каталогов в которые вложен файл.

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


по моему это в мануале описано который ты не прочел. Как раз не менять директорию а оставлять какая есть это логичное поведение.
#696 #536240
>>536176

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


Может нет прав на переход в один из каталогов в которые вложен файл.

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


по моему это в мануале описано который ты не прочел. Как раз не менять директорию а оставлять какая есть это логичное поведение.
#697 #536241
>>536201

Почему я вспомнил про редис? Потому что реально у mysql органичение порядка сотни или нескольких сотен транзакций в секунду (не по вине mysql, а потому что она стремится к надежности и ждет сброса данных на диск и HDD быстрее не умеет, разве что SDD). Ты можешь в него упереться при большой посещаемости.
28 Кб, 600x423
#698 #536279
Аноны, поясните за string(2)? По идее должен быть string(1) (символ-то один).
#699 #536308
>>536279
Как я догадываюсь из-за кодировки. Занимает 2 байта может, а вообще ждем оп-а
#700 #536350
>>536115
почему много думаю? по-моему кодинг это просто тупо трата времени от безделья. когда хиккуешь дома, заняться нечем, думаешь, а давай деятельность поимитирую, какое-нить говно накодю...
#701 #536358
>>536240
Путей /var/log/cron и /var/log/messages действительно нет, запускал ls от суперпользователя. Ну и черт с ними.

>по моему это в мануале описано который ты не прочел


"Мануалы" поганого качества, являются справочниками для специалистов, а не приятными для чтения учебниками, коими обязаны быть. Вот например как там найти путь к папке логов?
Ага, нашел их в файле syslog.
И вообще на форумах говорят прописывать руками путь к файлам логов, например >/var/log/cron.log 2>&1

> а раз в час обновлять кроном основную таблицу и очищать вспомогательную.


> Лучше ночью так как на время очистки она может заблокироваться.


Так в innodb ведь "блокировка на уровне строк".

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


Каждый день узнаю новые слова. Ок, пошел гуглить мемкеш и редис.
#702 #536359
>>536153
Нечестный конкурс.
Если уже знаешь много слов, то можно спокойно набампать по несколько тысяч слов в день в нубских курсах.
Я за первые два дня набрал около 1,5 тысяч (все что помнил со школы), а когда пошли незнакомые слова, то стало намного сложнее.
Еще 1,5 тысячи взял за две недели.
Но вообще классный сайт, только очень утомительно часами напролет монотонно набирать слова.
#703 #536360
>>536359
Там по условиям конкурса они должны быть в long-term memory, то есть недостаточно один раз просто пробежаться по 1500 словам.
#704 #536393
>>536163
Зачем мне платить, если могу проехать бесплатно?
#705 #536396
>>536393
Если знаешь, как добраться, то незачем.
#706 #536397
>>536393
Зачем вообще учить всякую хуйню, если можно пойти работать гей-шлюхой?
#707 #536408
>>536397
Анус не вечный, знаешь ли.
#708 #536442
>>536397
Зачем вообще писать оригинальный код, если можно куски с чужих проектов натырить и собрать воедино?
#709 #536462
>>531765 (OP)
http://codepad.org/2VHQ0Tsf
Почему насчитал 9, если выше только 8?
#710 #536472
>>536462
Ты сравниваешь весь массив с ростом анона.
http://ideone.com/LKruCz
#711 #536477
>>536472
спасибо
#712 #536480
>>536308
А ОП ответит?
#713 #536488
>>536480
Сам бы уже 20 раз загуглил. В Википедии в статье про ютф8 все доступно написано. В этой кодировке символы могут кодироваться более чем одним байтом. В твоем случае кириллица. Два байта. Введёшь какой-нибудь японский иероглиф, будет, например, три байта. Латиница, цифры кодируются одним байтом. Когда дампишь строку, выводится количество байт отведенных под нее в памяти. В случае с латиницей это будет равняться длине строки.

неОП
#714 #536562
>>536393
Бесплатно можешь только нахуй проехать.
#715 #536593
Есть проблема анон, парсю при помощи simple_html_dom страницу выдачи гугла под определённый запрос. Нахожу все ссылки а также весь краткий текст для каждого сайта, который выводится гуглом. Всё нормально, могу вывести это у себя на страницы. Но когда мне нужно найти определённые совпадения слов в этом самом кратком тексте который я получают через свойство ->plaintext совпадения не находится, хотя они есть и вполне очевидны.

Для парсинга использую команду file_get_html, которая преобразовывает HTML в объект, но ведь если обращаться через ->plaintext это же будет обычный текст?
#716 #536600
>>536593

Вот сам код:

$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 выводит одни нули. Хотя слово будете повторяется очень много раз на сранице.
#717 #536605
>>536600
Прояснилось немного, он находит только латиницу, кирилицу не находит. Значит это уже проблемы другого порядка. Но как сделать так что бы находил и кирилицу?
#718 #536645
>>536600

>$pattern = "/будете/u"


Попробуй так.
#719 #536646
#720 #536805
>>531765 (OP)
Оп, дай совет про усложнённый вариант задачки про банкомат. Там где надо выдать минимальным числом купюр 6600.
https://github.com/someApprentice/Cat-and-Mouse/ #721 #536831
Наконец-то дошли руки до проверки.

>>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). Возможно ли это исправить?


Возможно. Использовать алгоритм оценивающий все варианты ходов в баллах и выбирающий наилучший.
https://github.com/someApprentice/Cat-and-Mouse/ #721 #536831
Наконец-то дошли руки до проверки.

>>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). Возможно ли это исправить?


Возможно. Использовать алгоритм оценивающий все варианты ходов в баллах и выбирающий наилучший.
#722 #536832
>>536805

Гугли «задача о рюкзаке»:

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

Там как ты видишь довольно хитрый алгоритм. Можно взять и менее оптимальный, но более простой алгоритм: перебираем все возможные сочетания банкнот, оставляя из них только те которые дают нужную сумму. Из этих берем сочетание с наименьшим числом купюр и выводим как правильный ответ.
https://github.com/nsdvw/file-sharing #723 #536834
>>533861

Я успел проверить не 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 &mdash; 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, а в маппере.
https://github.com/nsdvw/file-sharing #723 #536834
>>533861

Я успел проверить не 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 &mdash; 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, а в маппере.
https://github.com/nsdvw/file-sharing #724 #536835
>>533861

Полный текст поста вакаба не пропускает, видит там спам, читай дальше тут: http://pastebin.com/11PAUhyc
#725 #536849
>>533995

Это часть 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 которые будут ее вызывать.
#725 #536849
>>533995

Это часть 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 которые будут ее вызывать.
#726 #536865
>>534456

Операции меняющие данные на сервере вроде удаления должны делать не кликом по ссылке а методом 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/ или реддита. Они тоже простые.
#726 #536865
>>534456

Операции меняющие данные на сервере вроде удаления должны делать не кликом по ссылке а методом 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/ или реддита. Они тоже простые.
#727 #536883
>>535452

там флеш либо яваскрипт

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

там длина в байтах а не символах
#727 #536883
>>535452

там флеш либо яваскрипт

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

там длина в байтах а не символах
переход #728 #536887
Этот тред закрыт. Ваши вопросы и ответы жду в следующем треде: >>536866 (OP)
#729 #536900
>>536350
Так оно и есть. Поэтому дома кодить есть смысл только для обучения. Потом устраиваешься на нормальную фирму, и пошло-поехало уже всерьез и надолго.
#730 #537042
>>536900
А чтобы устроиться на фирму, даже символически, за 8-10к работать, нужен год ежедневного 4-6 часового самообучения.
замкнутый круг
#731 #537228
>>536831

>Заодно пусть этот метод передает животному ссылку на $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), можно сделать массив направлений и сделать цикл по нему.



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


Мне не понятно это сделать. Я подумаю над тем что именно мне не понятно, и позже задам вопрос, если что-то останется непонятным
#731 #537228
>>536831

>Заодно пусть этот метод передает животному ссылку на $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), можно сделать массив направлений и сделать цикл по нему.



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


Мне не понятно это сделать. Я подумаю над тем что именно мне не понятно, и позже задам вопрос, если что-то останется непонятным
#732 #541593
>>537042
ну хуй его знает, я 4 месяца подрочил задачки опа, прочитал книжку, что он в оппосте советовал и устроился, ещё и норм зарплатка
#733 #541596
>>541593
и пускай те, кто говорят, что задачки опа полная хуйня, подрочат мой хуй себе в рот, я знаю, они любят отсасывать.
Эти задачки - как раз то, что нужно. На собеседованиях не спрашивают, как html теги писать, там задачи на логику в основном, а ОПовские задачки как раз такие. Он вообще молодец
#734 #541663
>>541593
Город какой? миллионик?
#735 #541682
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 20 сентября 2015 года.

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

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