Вы видите копию треда, сохраненную 17 января 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>408466
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть еще у нас задачки на HTML, JS, MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
HTML/CSS: Путь верстальщика: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Не поздно ли в мои 40 становиться программистом? Ох, это будет сложно, но если ты покажешь лучшие знания, чем моложежь, то шансы есть.
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Подробнее: https://gist.github.com/codedokode/8759492
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Подробнее: https://gist.github.com/codedokode/8759492
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
class Student
метод чека на ошибки вводе данных, которые присваивают Student-у должен быть в нем?
или StudentMapper, проверять на уникальность перед записью нужно выносить в отедельный класс или функцию?
Я просто нашел шпаргалки по SOLID-у и теперь пытаюсь код писать в соотвествии.
Есть разные мнения, где. С одной стороны конечно логично если студент умеет сам себя проверять на правильность, а маппер должен заниматься взаимодействием с БД (не очень-то логично что для проверки студента на правильность тебе надо тянуть класс работы с БД). Но с другой стороны уникальность email студент проверить не может. Так что наверно придется либо в маппер засунуть либо по 2 классам разнести.
Я пока так и впихнул, правда проверка перед сохранениям в БД в одном методе. А ты как думаешь, что лучше?
тут http://stackoverflow.com/questions/1127898/oo-design-patterns-to-use-for-validation если ты понимаешь анлийский, вообще предлагают сделать валидатор отдельной сущностью:
foreach ($validators as $validator) {
$errors += $validator->validate($staudent);
}
При таком подходе:
— часть валидаторов, например валидатор уникальности email, могут иметь доступ к StudentMapper, часть имеет доступ еще к чему-то
— валидаторы становятся довольно абстрактными и их можно повторно использовать (валидатор уникальности email так же легко может проверять уникальность имени пользователя) .
В ZF валидаторы сделаны как отдельные классы: http://framework.zend.com/manual/2.0/en/modules/zend.validator.set.html — но заметь что там еще нужен класс, который применит эти валдаторы к полям модели студента.
Я думаю, что для простой задачи отдельные классы-валидаторы наверно слишком сложно. Можно тупо функции положить в класс или вписать валидацию в маппер.
В одном методе не дложно быть. Должна быть возможность проверить студента не сохраняя в БД. Да и не надо все в один метод валить.
http://habrahabr.ru/post/244311/
Так охуенно, у меня аж малофья потекла.
Алсо, ничего страшного в этом нет. Все новички делают ошибки. В нашем треде им помогают их исправить и объясняют почему и как надо писать правильно.
Алсо, я прокомментирую. Многих не устраивают существующие фремйоврки и в этом нет ничего плохого, может так появится новый фреймворк.
Но вот идти поперек общепринятых привычек все же не стоит. Ведь люди вряд ли захотят разбираться в твоей велосипедной модульной системе, велосипедном шаблонизаторе ии роутере — они просто возьмут более традиционный фреймворк.
Ну и
> PHPT тесты — запускаются из одного файла, писать и читать тесты просто (не зря их используют в разработке самого PHP, и, например, в модифицированном виде в HHVM), в отличии от монстра PHPUnit
(для тех кто не знает, phpt — это тесты когда в файле пишут сначала код, а потом текст, который он должен вывести).
Честно говоря, я не так давно начал пользоватья phpUnit для своих маленьких библиотечек и он хорош. конечно, где-то там приходится нескоько линих строк напсиать, где-то не хватает ассерта и надо писать свой, но он в общем очень продуманный и удобный, и если есть какая0то поблема то скорее всего в гугле есть ответ.
Если мне например надо сравнить 2 массива (ожидаемый и получившийся) или 2 объекта — там все это есть. А как это делать череp ориентированный на вывод текста phpt? да никак, какими-нибудь костылями разве что. Не очень-то и удоюно.
> Повсеместное кэширование — в подавляющем большинстве запросов ядро даже не соединяется с БД, так как кэшируется всё, что имеет смысл кэшировать.
Где кеширование там инвалидация кеша. Для какого-то сайта ок кешировать все подряд, для какого-то не ок, и получается куча проблем на отладку которых уйдет время.
>>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP
> Хм, у меня работает.
Какая версия mySQL? Можешь сделать
SHOW CREATE TABLE files\G
?
> Я на это и расчитывал, думал, что он начнет путь от сервера. Ну и я не знал, как подключить относительным путем, шаблон то не в корне лежит. Но оказалось, что путь отсчитывается с index.php.
Браузер не знает какой шаблон или файл отвечает за вывод страницы (откуда? сервер для него черный ящик). Он видит только URL в адресной строке вроде /download/6 и от него отсчиытвает.
Если писать путь с / то он всегда идет от корня сайта:
<img src="/hello.png"
Тебе бы надо почитать про относительные URL, например:
http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm
Держи мини-задачку:
Есть страница http://example.com/test/hello/world.ext?x=2
Напиши как можно более короткие относительные (относительно этой страницы) ссылки, которые указывают на страницы:
http://example.com/test/hello/world.ext?x=1
http://example.com/test/hello/world.ext?x=2#qwerty
http://example.com/test/goodbye/world.png
http://example.com/test/hello/kitty.png?x=2
http://example.com/?x=2
http://goodbye.example.com/test
(еще хорошей задачей было бы написать функцию-преобразовывалку относительных ссылок в абсолютные. Но это наверно сложновато).
> А у меня нет таких классов. Наверное, это связано с этим
У тебя есть другие: http://getbootstrap.com/components/#navbar
> А при выключенных коротких тегах <?= работает?
Начиная с 5.4 да. Так что смело используй.
> Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?
Да. Практически все хостинги исплоьзуют линукс так что учись писать кроссплатформенно. То есть пути лучше писать через прямой слеш (работает везде), не делать привязки к именам дисков, понимать что в линуксе нет дисков, а единая файловая система и имена файлов чувствительны к регистру.
> Бтв, в тексте коммента тоже.
Молодец что сам нашел.
> По хорошему и имейл стоит проверять, но можно же и не проверять?
Можно проверять что есть @ и что внутри нет пробелов. На практике люди часто опечатываются например заменяя точку на пробел или путая еще какой-нибудь символ. Кстати, насчет валидации, на клиенте браузер предоставляет HTML5 валидацию, она простенькая но у нас и проект простенький:
http://htmlbook.ru/html/input/required
http://habrahabr.ru/post/105761/
http://webformyself.com/vvedenie-v-formy-html5-i-novye-atributy/ (много рекламы но вроде статья адекватная)
Заметь что у такой валидации есть плюсы и минусы. Плюсы — простота, надежность, кроссбраузерность, graceful degradation. минусы — нет контроля над поведением и внешним видом, дизайнеры не одобрят.
Ну и помни что валидация всегда должна быть на сервере для безопасности, а на клиенте для удобства.
> Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.
nl2br например погугли. Если ты хранишь перевод строки как \n то в HTML он равносилен пробелу. Ох, пробелы у тебя в знаниях HTML.
> В общем то у меня там стоит if (data == 0), что сработает, при возвращении false.
https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L26 — тут нету, может ты конечно пока не запушил на гитхаб это. Вообще сфинкс возвращает false если все плохо, например что-то неправильно настроено или непраивльн сформирован запрос. Надо либо ронять сайт исключением либо хотя бы писать в лог детали.
> Это вообще жуть. Я ни слова не понял. Но разберусь.
Если кратко. Злодей создает html-страничку с формой комментария как у тебя, уже заполненной. У этой формы в action написано
action="http://uppu.ru/comment"
То есть данные из нее отправляются на твой сайт. Злодей делает эту форму невидимой и добавляет скрипт для ее автоматической отправки при загрузке страницы.
После этого он заманивает людей на свою страничку (например поместив ее в невидимый ифрейм на посещаемом сайте) и все посетители его сайта не подозревая об этом оставляют комментарии у тебя от своего IP.
Увидеть такую ситуацию можно по заголовку referer (но ты не должен использовать его для защиты так как это ненадежно. Исплоьзуй токены).
Комметарии — это мелочь. А если бы у тебя быа платежная система, а в ней форма перевода денег?
Идея борьбы добавлять к форме токен, индивидуальный для каждого пользователя. Злоумышленник его не знает и не может вписать его значение в форму.
По идее защита от CSRF должна была бы автоматически быть встроена в браузеры. Увы, когда делались формы, никто о таких вещах не догадывался.
>>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP
> Хм, у меня работает.
Какая версия mySQL? Можешь сделать
SHOW CREATE TABLE files\G
?
> Я на это и расчитывал, думал, что он начнет путь от сервера. Ну и я не знал, как подключить относительным путем, шаблон то не в корне лежит. Но оказалось, что путь отсчитывается с index.php.
Браузер не знает какой шаблон или файл отвечает за вывод страницы (откуда? сервер для него черный ящик). Он видит только URL в адресной строке вроде /download/6 и от него отсчиытвает.
Если писать путь с / то он всегда идет от корня сайта:
<img src="/hello.png"
Тебе бы надо почитать про относительные URL, например:
http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm
Держи мини-задачку:
Есть страница http://example.com/test/hello/world.ext?x=2
Напиши как можно более короткие относительные (относительно этой страницы) ссылки, которые указывают на страницы:
http://example.com/test/hello/world.ext?x=1
http://example.com/test/hello/world.ext?x=2#qwerty
http://example.com/test/goodbye/world.png
http://example.com/test/hello/kitty.png?x=2
http://example.com/?x=2
http://goodbye.example.com/test
(еще хорошей задачей было бы написать функцию-преобразовывалку относительных ссылок в абсолютные. Но это наверно сложновато).
> А у меня нет таких классов. Наверное, это связано с этим
У тебя есть другие: http://getbootstrap.com/components/#navbar
> А при выключенных коротких тегах <?= работает?
Начиная с 5.4 да. Так что смело используй.
> Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?
Да. Практически все хостинги исплоьзуют линукс так что учись писать кроссплатформенно. То есть пути лучше писать через прямой слеш (работает везде), не делать привязки к именам дисков, понимать что в линуксе нет дисков, а единая файловая система и имена файлов чувствительны к регистру.
> Бтв, в тексте коммента тоже.
Молодец что сам нашел.
> По хорошему и имейл стоит проверять, но можно же и не проверять?
Можно проверять что есть @ и что внутри нет пробелов. На практике люди часто опечатываются например заменяя точку на пробел или путая еще какой-нибудь символ. Кстати, насчет валидации, на клиенте браузер предоставляет HTML5 валидацию, она простенькая но у нас и проект простенький:
http://htmlbook.ru/html/input/required
http://habrahabr.ru/post/105761/
http://webformyself.com/vvedenie-v-formy-html5-i-novye-atributy/ (много рекламы но вроде статья адекватная)
Заметь что у такой валидации есть плюсы и минусы. Плюсы — простота, надежность, кроссбраузерность, graceful degradation. минусы — нет контроля над поведением и внешним видом, дизайнеры не одобрят.
Ну и помни что валидация всегда должна быть на сервере для безопасности, а на клиенте для удобства.
> Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.
nl2br например погугли. Если ты хранишь перевод строки как \n то в HTML он равносилен пробелу. Ох, пробелы у тебя в знаниях HTML.
> В общем то у меня там стоит if (data == 0), что сработает, при возвращении false.
https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L26 — тут нету, может ты конечно пока не запушил на гитхаб это. Вообще сфинкс возвращает false если все плохо, например что-то неправильно настроено или непраивльн сформирован запрос. Надо либо ронять сайт исключением либо хотя бы писать в лог детали.
> Это вообще жуть. Я ни слова не понял. Но разберусь.
Если кратко. Злодей создает html-страничку с формой комментария как у тебя, уже заполненной. У этой формы в action написано
action="http://uppu.ru/comment"
То есть данные из нее отправляются на твой сайт. Злодей делает эту форму невидимой и добавляет скрипт для ее автоматической отправки при загрузке страницы.
После этого он заманивает людей на свою страничку (например поместив ее в невидимый ифрейм на посещаемом сайте) и все посетители его сайта не подозревая об этом оставляют комментарии у тебя от своего IP.
Увидеть такую ситуацию можно по заголовку referer (но ты не должен использовать его для защиты так как это ненадежно. Исплоьзуй токены).
Комметарии — это мелочь. А если бы у тебя быа платежная система, а в ней форма перевода денег?
Идея борьбы добавлять к форме токен, индивидуальный для каждого пользователя. Злоумышленник его не знает и не может вписать его значение в форму.
По идее защита от CSRF должна была бы автоматически быть встроена в браузеры. Увы, когда делались формы, никто о таких вещах не догадывался.
А еще. Для всех пришедшиз из формы данных надо делать trim. Ведь пробел с края, например после имени, невидим, его легко поставить но он не должен идти в базу.
http://ideone.com/nglLZe
>>411728
http://ideone.com/515bd5
Вот первая, только я не понял зачем нужно указывать количество яблок если это и так исходит из строки где перечисляется вес каждого яблока
В этой задаче можно самому отредактировать стартовую строчку условия? Там дохрена незаэкранорованных кавычек в условии.
python, очевидно же
Тут вот какая проблема возникла: если у мышей убрать свойство $cats и сделать его просто возвращаемым массивом свойства findAllCats, то выдаёт фатал ерор, так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение, что он не определен, во вторых критическую ошибку, что мы пытаемся вызвать метод getCoordinateX не у объекта. Хотя со свойством $cats все работало.
Ну ты же сам себе противоречишь. Причем так мерзко, как какая-нибудь вертлявая шлюха - в жопу я не даю, я ведь порядочная женщина. Делайте ребята что-нибудь новое, ломайте устои - но только следуйте стандартам. Вообще охуеть.
На самом деле не знаю, может он там еще того говна намесил, но что меня реально бесит аж трисет - когда высеры трех с половиной хипстеров пытаются протолкнуть как проверенные годами практики, научно доказанные истины, высеченные блядь на золотых скрижалях.
А дядю Боба, я бы вообще убил нахуй молотком по голове. Но хуй знает кому я пытаюсь это доказать, тут же одни утята собрались почти наверняка.
Хоть я и не сторонник выравнивания табами, но я считаю что этот ебаный хипстахаб, на который все так люто надрачивают, просто блядь обязан добавить нормальную их поддержку. Жавадибилам ведь уже пошли на встречу сделав схлопывающиеся каталоги, теперь настало очередь табов.
И только не надо рассказывать тут что это так и задумано, что табы так и должны отображаться. Ни для кого не секрет, что веб-технологии и фронтенд в частности это большая куча из говна и костылей в которой вообще блядь все сломано. Если нужен еще один костылик для нормального отображения табов - то говно вопрос его добавить.
>SHOW CREATE TABLE files\G
1. row
Table: files
Create Table: CREATE TABLE `files` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`size` int(11) NOT NULL,
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mediadata` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
Видимо MySQL умнее меня, лол.
>Тебе бы надо почитать про относительные URL, например:
И там мне говорят, что пути от корня - нормально. Такие дела. Мол, это локально такие пути творят какую-то фигню, а на вебсервере все хорошо.
>Держи мини-задачку:
world.ext?x=1
#qwerty
../goodbye/world.png
kitty.png?x=2
/?x=2
http://goodbye.example.com/test
>Молодец что сам нашел.
Так соседние строчки просто.
>Можно проверять что есть @ и что внутри нет пробелов.
Вроде бы есть какой-то встроенный метод. А у бутстрапа есть какой-то скрипт для проверки на стороне клиента.
>У тебя есть другие: http://getbootstrap.com/components/#navbar
Так я оттуда и взял. Не сам же я додумался туда форму вписать.
>Ох, пробелы у тебя в знаниях HTML.
Пробелы - это когда знания есть. У меня они на уровне "я в восьмом классе делал две странички".
>Исплоьзуй токены
Как только узнаю, что это. Вечером, скорее всего.
>SHOW CREATE TABLE files\G
1. row
Table: files
Create Table: CREATE TABLE `files` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`size` int(11) NOT NULL,
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mediadata` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
Видимо MySQL умнее меня, лол.
>Тебе бы надо почитать про относительные URL, например:
И там мне говорят, что пути от корня - нормально. Такие дела. Мол, это локально такие пути творят какую-то фигню, а на вебсервере все хорошо.
>Держи мини-задачку:
world.ext?x=1
#qwerty
../goodbye/world.png
kitty.png?x=2
/?x=2
http://goodbye.example.com/test
>Молодец что сам нашел.
Так соседние строчки просто.
>Можно проверять что есть @ и что внутри нет пробелов.
Вроде бы есть какой-то встроенный метод. А у бутстрапа есть какой-то скрипт для проверки на стороне клиента.
>У тебя есть другие: http://getbootstrap.com/components/#navbar
Так я оттуда и взял. Не сам же я додумался туда форму вписать.
>Ох, пробелы у тебя в знаниях HTML.
Пробелы - это когда знания есть. У меня они на уровне "я в восьмом классе делал две странички".
>Исплоьзуй токены
Как только узнаю, что это. Вечером, скорее всего.
http://ideone.com/4iLVaa
Не знаю, что делать с этим
Вылетает с:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3', '5'' at line 1 in C:\wamp\www\view.php on line 14
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3' OFFSET'5'' at line 1 in C:\wamp\www\view.php on line 14
http://ideone.com/SwmSzq Вообщем вот. Систему очков пока не придумал, так что тестирую на старой. Критические ошибки исправил, но все равно выдает предупреждения, когда кошка вне поле зрения мышей. Ах да, насчет изменения иконки кошки. Как мне модифицировать метод getIcon родительского класса в классе кошки?
>PHP bug: if you don't specify PDO::PARAM_INT, PDO may enclose the argument in quotes. This can mess up some MySQL queries that don't expect integers to be quoted.
>If you're not sure whether the value you're passing is an integer, use the is_int() function.
Используй bind_value с PARAM_INT для лимита и оффсета, или сразу лимит с двумя параметрами.
Спасибо, помогло
Видимо он, как и я, далеко не из дс.
Киев/Львов.
Почти везде jQuery требуют вместе с js + из 3,5 вакансий 1,5 удаленки, которая с кидалом скорее всего и еще 1(нужно ВО).
например вот тут кто может пояснить что и зачем напихано в форму?
http://ab-w.net/HTML/html_forms.php
<title>Один из возможных вариантов HTML формы</title>
</head>
<body>
<form name="f1" method="get" action="enter_data.php">
<input name="link" type="hidden" value="index.php" />
Логин: <br />
<input name="login" type="text" size="25" maxlength="30" value="Вася" /> <br />
Пароль: <br />
<input name="pd" type="password" size="25" maxlength="30" value="" /> <br />
<input name="remember" type="checkbox" value="yes" /> Запомнить <br />
<input type="submit" name="enter" value="Вход" />
</form>
</body>
</html>
что есть enter_data.php , а что index.php в этой форме?
Код у тебя ужасный. Транслит, куча значков, которых никто кроме тебя не поймет, куча магических чисел которые надо выносить в константы. Вряд ли кто-то захочет в этом разбираться, если ты хочешь чтобы твой код читали и понимали, пиши проще.
Насчет поиска столкновений — можно написать неоптимизированно, перед ходом проверяя занято ли место, можно как в играх делают, кластеризовать пространство и проверять только объекты в текущем кластере.
Кстати на второй картинке некоторые мышки бегут навстречу кошке почему-то, даже когда до нее осталось совсем немного.
А так, конечно, хорошо, что ты решил сделать не поле из клеточек, а непрерывное пространство. Интересно смотрится.
Кстати, на Хаскелле наверно удобно моделировать и другие вещи, например движение планет в двойной или тройной звездной системе, сборку молекул и т.д (просто когда я вижу эти точечки, у меня сразу ассоциации с физикой вознимают).
Ну там предполагалось что ты просто посмотришь, поймешь как это работает, может быть что-то поменяешь.
>>411859
> только я не понял зачем нужно указывать количество яблок если это и так исходит из строки где перечисляется вес каждого яблока
Подозреваю, чтобы упростить код чтения данных. То есть тебе не надо разбираться где там конец строки, а просто прочитать указанное количество чисел. Олимпиадные задачки ведь часто решаются на Си/Паскале а там нет встроенных регулярок или хотя бы explode чтобы распарсить входную строку.
Если ты уже передаешь массив (а не строку) то число передавать не надо.
> замостить площадь
Правильно решено
> яблоки
2 яблока можно поделить, а пишет что нет: http://ideone.com/jDrBHm
яблоки 200 200 200 нельзя поделить, а пишет что можно: http://ideone.com/dbxv75
Поменять можно только в сторону усложнения.
> Там дохрена незаэкранорованных кавычек в условии.
И ты не можешь их вставить в строку? Ой ты бедненький. Ну-ка беги перечитывай мануал: http://php.net/manual/ru/language.types.string.php (целиком)
Есть минимум 2 способа:
— вставлять через бекслеш
— использовать heredoc/nowdoc (рекомендуется)
В общем, ты должен уметь писать любые строки с любыми символами.
>>411883
В 90 строк потому что он все сваливает в кучу.
Язык Haskell.
>>411901
> Тут вот какая проблема возникла
Проблема есть, но ты ее решаешь неприавльно. Свойства — это свойства объекта. «Кошки рядом» вряд ли является свойством мыши. Значит проблему надо решать не добавлением свойства а по-другому, например, исправить неприавльно написанный код.
> так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение
Это у тебя код неприавльный.
>>411911
Изобрести новый роутер — хорошо. Придумывать свои правила оформления кода, или лепить все на статических методах — плохо (у меня есть урок почему).
Табы должны умереть. Почему?
Табы создают путаницу, на вид невозможно отличить таб от пробела, значит люди будут их путать. Люди путают русскую и английскую «с» (поэтому кстати в программистских шрифтах они должны выглядеть по-разному, как перечеркнутый нуль и буква «О»), а уж пробел и таб перепутать проще простого.
Табы плохо отображаются а браузере, в консоли, и т.д. Таб — неудачное и не прижившееся решение сделать простой способ отображения табличных данных. Не знаю кто решил что его надо использовать для оформления кода.
Я учу анонов и знаю, что никому из них неохота разбираться в этих аутистких особенностях, а охота писать код. Также я видел реальный код реальных проектов и перепутанные табы с пробелами там самая маленькая проблема. Если никто не ставить табы правильно глупо навязывать их использование вообще.
Если кому-то хочется настраивать величину отступа в коде, он может скачать или написать скрипт для своего вим/емакс и настраивать сколько влезет. Но на диск сохранять файл с пробелами.
Другие люди не должны терпеть неудобства только потмоу что какому-то аутисту нравится использовать несколько видов пробелов.
Также хочу напомнить, что кроме таба и пробела есть другие пробельные символы: неразрывный пробел, узкий пробел пробел нулевой ширины, разделитель строк. Почему бы вам и их не начать использовать?
Поменять можно только в сторону усложнения.
> Там дохрена незаэкранорованных кавычек в условии.
И ты не можешь их вставить в строку? Ой ты бедненький. Ну-ка беги перечитывай мануал: http://php.net/manual/ru/language.types.string.php (целиком)
Есть минимум 2 способа:
— вставлять через бекслеш
— использовать heredoc/nowdoc (рекомендуется)
В общем, ты должен уметь писать любые строки с любыми символами.
>>411883
В 90 строк потому что он все сваливает в кучу.
Язык Haskell.
>>411901
> Тут вот какая проблема возникла
Проблема есть, но ты ее решаешь неприавльно. Свойства — это свойства объекта. «Кошки рядом» вряд ли является свойством мыши. Значит проблему надо решать не добавлением свойства а по-другому, например, исправить неприавльно написанный код.
> так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение
Это у тебя код неприавльный.
>>411911
Изобрести новый роутер — хорошо. Придумывать свои правила оформления кода, или лепить все на статических методах — плохо (у меня есть урок почему).
Табы должны умереть. Почему?
Табы создают путаницу, на вид невозможно отличить таб от пробела, значит люди будут их путать. Люди путают русскую и английскую «с» (поэтому кстати в программистских шрифтах они должны выглядеть по-разному, как перечеркнутый нуль и буква «О»), а уж пробел и таб перепутать проще простого.
Табы плохо отображаются а браузере, в консоли, и т.д. Таб — неудачное и не прижившееся решение сделать простой способ отображения табличных данных. Не знаю кто решил что его надо использовать для оформления кода.
Я учу анонов и знаю, что никому из них неохота разбираться в этих аутистких особенностях, а охота писать код. Также я видел реальный код реальных проектов и перепутанные табы с пробелами там самая маленькая проблема. Если никто не ставить табы правильно глупо навязывать их использование вообще.
Если кому-то хочется настраивать величину отступа в коде, он может скачать или написать скрипт для своего вим/емакс и настраивать сколько влезет. Но на диск сохранять файл с пробелами.
Другие люди не должны терпеть неудобства только потмоу что какому-то аутисту нравится использовать несколько видов пробелов.
Также хочу напомнить, что кроме таба и пробела есть другие пробельные символы: неразрывный пробел, узкий пробел пробел нулевой ширины, разделитель строк. Почему бы вам и их не начать использовать?
> задачка на URL
Ты решил 4 из 6 пунктов.
> world.ext?x=1
Можно сделать еще раза в 2 короче
можно сделать на 5 символов короче
> Вроде бы есть какой-то встроенный метод.
Есть функция filter_var. Насчет бутстрапа сомневаюсь но type="email" в современных браузерах само проверяет поле, у меня в хроме работаеи. Также, указывать тип email полезно для мобильных устройств которые выдвинут соответствующую клавиатуру с значками @ и .
>>411933
Я могу ошибаться, но по моему достаточно просто привести переменную к числу то ест писать
$bindParam(':limit', intval($limit))
Но с PARAM_INT конечно надежнее выходит.
>>411951
Это реально изучить может за пару-тройку месяцев. Не хочешь мои задачки по JS помучать?
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Также если ты слабо знаешь HTML/CSS есть задачки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> задачка на URL
Ты решил 4 из 6 пунктов.
> world.ext?x=1
Можно сделать еще раза в 2 короче
можно сделать на 5 символов короче
> Вроде бы есть какой-то встроенный метод.
Есть функция filter_var. Насчет бутстрапа сомневаюсь но type="email" в современных браузерах само проверяет поле, у меня в хроме работаеи. Также, указывать тип email полезно для мобильных устройств которые выдвинут соответствующую клавиатуру с значками @ и .
>>411933
Я могу ошибаться, но по моему достаточно просто привести переменную к числу то ест писать
$bindParam(':limit', intval($limit))
Но с PARAM_INT конечно надежнее выходит.
>>411951
Это реально изучить может за пару-тройку месяцев. Не хочешь мои задачки по JS помучать?
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Также если ты слабо знаешь HTML/CSS есть задачки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> . Как мне модифицировать метод getIcon родительского класса в классе кошки?
Просто пишешь в классе кошки public function getIcon и он перекроет родительский. Родительский можно вызвать ихз него через parent::getIcon.
http://php.net/manual/ru/language.oop5.paamayim-nekudotayim.php
То есть ты пишешь примерно так
если (кошка спит) {
вернуть одно
} иначе {
вызвать родительский метод
}
таким образом дети могут переопределять или дополнять поведение родителя.
> но все равно выдает предупреждения, когда кошка вне поле зрения мышей
Это у тебя код кривой.
> if ($cats[0]) {
Это ошибка. Ты не должен обращаться к несуществующему элементу. Проверить наличие можно так:
if (count($cats)....
if (isset($cats[0])
if (!empty($cats[0]))
if (array_key_exists(....)
Если раньше это не выдавало ошибку, то это из-за странности php (на мой взгляд это баг) который прощал обращение к несуществующему элементу массива хранящегося в свойстве. В будущих версиях php это исправят.
Также. вторая ошибка: если ни одной кошки нет, переменные x и у не создадутся и дальнейший код тоже работать правильно не будет.
Всю эту функцию вообще надо переписать, она кривая до невозможности.
> elseif ($this->y < $y && $this->y != 0 && !$this->field->checkTile($this->x, $this->y - 1))
Вместо того чтобы копипастить эту колбасу, надо сделать функцию и вызывать ее.
> $target = $this->findClosestMouse( );
> if ($target['x'] > $this->x) {
Незачем тут лишний массив делать. Можно в target хранить объект-мышь а не ее координаты.
В общем, давай, решись уже переделать код.
> . Как мне модифицировать метод getIcon родительского класса в классе кошки?
Просто пишешь в классе кошки public function getIcon и он перекроет родительский. Родительский можно вызвать ихз него через parent::getIcon.
http://php.net/manual/ru/language.oop5.paamayim-nekudotayim.php
То есть ты пишешь примерно так
если (кошка спит) {
вернуть одно
} иначе {
вызвать родительский метод
}
таким образом дети могут переопределять или дополнять поведение родителя.
> но все равно выдает предупреждения, когда кошка вне поле зрения мышей
Это у тебя код кривой.
> if ($cats[0]) {
Это ошибка. Ты не должен обращаться к несуществующему элементу. Проверить наличие можно так:
if (count($cats)....
if (isset($cats[0])
if (!empty($cats[0]))
if (array_key_exists(....)
Если раньше это не выдавало ошибку, то это из-за странности php (на мой взгляд это баг) который прощал обращение к несуществующему элементу массива хранящегося в свойстве. В будущих версиях php это исправят.
Также. вторая ошибка: если ни одной кошки нет, переменные x и у не создадутся и дальнейший код тоже работать правильно не будет.
Всю эту функцию вообще надо переписать, она кривая до невозможности.
> elseif ($this->y < $y && $this->y != 0 && !$this->field->checkTile($this->x, $this->y - 1))
Вместо того чтобы копипастить эту колбасу, надо сделать функцию и вызывать ее.
> $target = $this->findClosestMouse( );
> if ($target['x'] > $this->x) {
Незачем тут лишний массив делать. Можно в target хранить объект-мышь а не ее координаты.
В общем, давай, решись уже переделать код.
> что есть enter_data.php
Иди читай теорию по html form: http://htmlbook.ru/html/form
> а что index.php в этой форме?
Думаю это страница на которой происходит логин и на которую надо вернуться после авторизации. Неприятно же когда после логина тебя перекидывает на главную, а не на страницу с которой логинился.
Также, я думаю, тебе надо пока изучать более простые вещи, например просто работу с формами. Ты берешься сразу за сложное и в итоге ничего не понимаешь.
>> world.ext?x=1
>Можно сделать еще раза в 2 короче
Очевидно ?x=1
>можно сделать на 5 символов короче
Здесь не так очевидно.
Реально, но у меня остался месяц + 2-3 недели, во время, которых надо сдать сессию, что бы иметь пол года стипендию.
CSS Я вообще почти не знаю(руководствуюсь принципом, по ходу задачи разберусь), а вот html знаю.
https://ru.wikipedia.org/wiki/URI#.D0.9E.D1.82.D0.BD.D0.BE.D1.81.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_URI
Я советую прочесть целиком, статья небольшая и понятная.
Схему (http:) можно не указывать если она общая. Это удобно когда есть http и https версия сайта и ты хочешь чтобы ссылка использовала тот же протокол.
Заметь также что относительный URL может быть вообще пустым. То есть <a href=""> вполне рабочая ссылка на саму себя.
Стандарт описывающий относительные URL: https://tools.ietf.org/html/rfc3986#section-4.2 (англ)
>>412011
Ну может если ты будешь быстро изучать ты справишься лучше, но это вряд ли. Можешь конечно погуглить статьи по jQUery c готовыми примерами, но знать ты его от этого не станешь.
>Я советую прочесть целиком, статья небольшая и понятная.
Прочитал. Все равно не вижу там ничего похожего.
Я сделал в итоге простую форму, с перекидыванием на страницу проверки. Не стал вещь которую не до конца понимаю копировать.
> $apples2[$value] = count(array_keys($array, $value));
Есть же array_count_values
> if ($arg > $count) {
> $arg = $count;
Это лучше записать через функцию max или min
> $sum = $arg $mass;
> $half -= $sum;
Это лучше написать в 1 строчку
> if ($arg != 0) {
> $summary_mass += $sum;
if тут не нужен. Если arg == 0 то sum тоже равно нулю.
Посмотри на современный интернет. Глючный, кривой, ненадежный, тормозит, быдлокод на быдлокоде. Ты думаешь гении эти сайты делают?
\t<div class="row">
\t\t<?php echo $form->labelEx($model,'name'); ?>
\t\t<?php echo $form->textField($model,'name',array('size'=>45,'maxlength'=>45)); ?>
\t\t<?php echo $form->error($model,'name'); ?>
\t</div>
А как мне указать поле из другой таблицы?
подразумеваю, что надо создать контролер, модель и вид таблицы bands_albums. И как-то оттуда из вида выдернуть нужные мне поля. Правильно мыслю?
>Связи групп и альбомов указываются в таблице bands_albums.
Зачем? У альбома много групп может быть?
Если у тебя можно выбрать несколько групп то надо либо использовать виджет вроде такого:
http://harvesthq.github.io/chosen/
(не будешь же ты id руками вводить, верно?)
Либо сделать связь между группами и альбомами на отдельной странице.
Связь между таблицами прописывается в activeRecord классе, ты знаешь?
http://habrahabr.ru/post/216605/
http://play-stop.ru/yii/realizovat-svyaz-mnogie-ko-mnogim-v-yii.html
> if ($arg > max($apples2)) {
> $arg = max($apples2);
Нет. Это не то. Я имел в виду, что конструкцию
if ($a > $b) {
$a = $b;
}
можно заменить на $a = min($a, $b);
Исправь это и задача будет решена.
>>412052
Ну и добавлю еще. Ты можешь подумать, что у нас тут «программирование уровня /b», но это не так. Если ты будешь решать все задания, которые я даю, включая задания на HTML, MySQL, JS, фреймворки, то у тебя будет неплохой уровень знаний и опыта в итоге и ты будешь гораздо лучше чем те кто учился по сомнительным устаревшим учебникам или на сомнительных курсах. А те технолгии, что мы изучаем (после учебника), вроде фреймворков, используют многие компании.
Наш курс довольно продуманный, задачи идут от простых к сложным и каждая задача проверяет знание какой-то особенности языка. То же и с заданиями на другие технологии. Решить их правильно, не понимая, не получится.
И некоторые аноны уже отписывались, они сидели в нашем треде, решали задачки, почитывали книги, и смогли в итоге найти работу.
> не могут решать задачи с айфонами
Это задача для новичка сложная, на ней все спотыаются, не надо тут делать выводы из-за того что у тебя ничего не получится.
Спасибо. Теперь немного прояснилось
Поддвачну ОПа. Нашел работу с меньшим уровнем знаний, чем можно получить тут. Начинал тогда делать учебник опа, но не закончил, теперь вот делаю.
ОП, смотри это из тестхаба. Создаем тест, добавляем необходимое количество вопросов для него. Весь функционал для этого я сделал, но возникла загвоздка. Для описания теста и для текста вопроса нужно добавить возможность форматирования, редактирования, добавления картинок в текст. Нашел такой замечательный плагин http://imperavi.com/redactor/, благо с Yii его можно юзать бесплатно.
Там, помимо редактирования текста, есть возможность добавления в него картинок http://imperavi.com/redactor/examples/upload-images/. То есть там необходимо указать путь до скрипта, результатом выполнения которого будет сохраненный файл на сервере и JSON строка типа { "filelink": "/images/img.jpg" }, которая отдается обратно плагину.
Вот я и думаю как быть. Есть несколько текстовый полей, в каждом из которых потенциально может быть несколько картинок. И сохранять картинки на сервер сразу же при их добавлении в поле редактора мне не нравится. В основном из-за того, что придется держать папку для временных файлов, которые нужно будет удалять по истечении какого-то промежутка времени. Хотя, учитывая, что преподавателей не так много, это не страшно.
В общем вопрос как лучше обрабатывать и сохранять на сервер добавленные в текстовое поле картинки.
Можешь что-то посоветовать из своего опыта?
Надеюсь не очень сумбурно получилось.
Там просто нужно посчить количество мелких и больших яблок. Если мелких нечетное то сразу нахуй. Если больших нечетное то мелких должно быть больше одного (при этом четное конечно).
правда простая же, проверьте
http://ideone.com/shdMR7
во эта ещё клёвая
http://informatics.mccme.ru/moodle/mod/statements/view3.php?chapterid=1380&run_id=1590r700#1
https://github.com/babyba/sat
Я решаю задачу попроще и подскажи, пожалуйста, почему поиск не работает? Я не правильно понял что делает оператор LIKE?
Скажи, еще такую вещь, я безнадежен, если переписывал все это 2 или 3 раза с нуля потому, что оно не хотело работать?
P.S. Я ще не прикручивал туда css
Теперь наверное надо сказать как я попробовал это реализовать.
Собственно в таблице базы данных есть два значения:
1-ое список всех городов
2-ое список уже названных городов, который постепенно пополняется
Суть в том что когда пользователь вводит свой город в цикле который читает данные из таблицы происходит поиск города который начинается на последнюю букву введённого пользователем города. После чего все варианты таких городов складываются в определённый массив, из которого в случайном порядке выводится тот или иной вариант, после чего выбранный вариант записывается в таблицу с уже названными городами. Дальше мне надо что бы в следующий раз этот город не записывался в массив для случайного выбора, но я не знаю как это сделать. Дело в том что функция strpos как-то странно работает в моём случае в цикле вида:
while($row=mysql_fetch_array($q)) {
}
И я не могу запретить добавляться элементу если я его нашёл в таблице для тех имён городов которые уже были названы.
В моём коде скорее всего много непонятного, он явно не лаконичный и не работает в Идеон, так как использует базу данных, извиняюсь если что, вот сам код http://ideone.com/lDZ8Sg
Не сильно понял твое объяснение, но первое что пришло в голову: сделай одну таблицу со всеми городами и добавь туда поле, которое будешь помечать, когда город выбран. Тогда когда ты будешь делать новую выборку, те города, что помечены как уже выбиравшиеся, не будут туда попадать, SQL это делает.
А ясно, спасибо, я кажется понял
А я бы вообще не так сделал, ну вот есть база у тебя с городами, и ты просто читай её, а не перезаписывай каждый ход, а например названные города скидывай во временным массив, который живет только во время выполнения скрипта и ищи в нем города с помощью in_array. А уж если игрок называет какой-то неведомый город для компьютера, то тот переспрашивает, точно ли это город, и тогда заносит его в свою таблицу городов, что бы самому использовать в дальнейшем. Хотя пока я писал ответ вижу что уже дали более дельный совет, прост делать пометку о том назван этот город или нет, тогда не придется компу вычислять какой город уже назван сравнивая базу с массивом.
>Хотя пока я писал ответ вижу что уже дали более дельный совет, прост делать пометку о том назван этот город или нет
1. Запускаю игру в двух вкладках.
2. ?????
3. PROFIT
Это где задания в духе:
Вот пример правильного цикла -
for ($i=0; $i<10; $i++) {
echo "ti huy";
}
А вот тебе задача на циклы, допиши код до рабочего состояния
for ($i=0; $i<10; $i++) {
echo "ti huy"
}
нажми сабмит...
Теперь ты знаешь циклы! Можешь переходить к другим урокам.
Чет не очень ясно как оттуда знания получать кароче. Что ты сможешь написать сам после этой "академии"
>>412172
Ну на кодеакадеми самые основы изучаются, да.
>>412126
Тебе может через сессии надо как-то делать. Причем чтобы работало в нескольких вкладках, то не через те которые _SESSION, а через свои (так как _SESSION в нескольких вкладках будет общий).
То есть когда человек заходит в игру, создаешь новый игровой сеанс, и указанные им города помечаешь как использованные в этом сеансе.
Ведь параллельно может играть нескько человек и у каждого свой список использованных городов. Ну и один человек может открыть несколько вкладок и вести несколько игр.
Вообще, я вижу по коду, ты скорее всего не очень разбираешься в том как работает БД и как делаются связи в БД. Тебе надо сначала изучить базы данных, хотя бы основы.
Отсеивать лишние города можно сразу при выборке из базы. То же самое с выбором, чтобы выбрать один город, не обязатльно вытягивать все.
У тебя таблица спроектирована неправильно. Например непонятно почему ты указываешь использованные города с помощю названий, а не id, непонятно почему хранишь использованные города в той же таблице что и список всех городов. Это все неправильно сделано.
Вот полезная статья: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (прочитать надо и предыдущие 2 части тоже)
Вот задачки для проверки: https://gist.github.com/codedokode/10539213
Насчет функций strtoupper, strlen, они не работает с русскими буквами в utf-8 и их лучше вообще не использовать. Вот подробное объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>412121
Я посмотрю твой код и напишу замечания (много!), но чуть позже , как будет время. Насчет LIKE, он так не работает.
Вот почитай
http://www.mysql.ru/docs/man/String_comparison_functions.html
LIKE сравнивает строки целиком. Чтобы можно было ввести только части имени или фамилии, надо использовать символ %
>>412172
Ну на кодеакадеми самые основы изучаются, да.
>>412126
Тебе может через сессии надо как-то делать. Причем чтобы работало в нескольких вкладках, то не через те которые _SESSION, а через свои (так как _SESSION в нескольких вкладках будет общий).
То есть когда человек заходит в игру, создаешь новый игровой сеанс, и указанные им города помечаешь как использованные в этом сеансе.
Ведь параллельно может играть нескько человек и у каждого свой список использованных городов. Ну и один человек может открыть несколько вкладок и вести несколько игр.
Вообще, я вижу по коду, ты скорее всего не очень разбираешься в том как работает БД и как делаются связи в БД. Тебе надо сначала изучить базы данных, хотя бы основы.
Отсеивать лишние города можно сразу при выборке из базы. То же самое с выбором, чтобы выбрать один город, не обязатльно вытягивать все.
У тебя таблица спроектирована неправильно. Например непонятно почему ты указываешь использованные города с помощю названий, а не id, непонятно почему хранишь использованные города в той же таблице что и список всех городов. Это все неправильно сделано.
Вот полезная статья: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (прочитать надо и предыдущие 2 части тоже)
Вот задачки для проверки: https://gist.github.com/codedokode/10539213
Насчет функций strtoupper, strlen, они не работает с русскими буквами в utf-8 и их лучше вообще не использовать. Вот подробное объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>412121
Я посмотрю твой код и напишу замечания (много!), но чуть позже , как будет время. Насчет LIKE, он так не работает.
Вот почитай
http://www.mysql.ru/docs/man/String_comparison_functions.html
LIKE сравнивает строки целиком. Чтобы можно было ввести только части имени или фамилии, надо использовать символ %
Да, неплохая задачка.
>>412100
По идее хорошо бы складывать картинки в папку соответствующую id теста, чтобы не было бардака и чтобы их можно удалить было.
Но проблема в том что id нам до сохранения неизвестен.
Также, часто для картинок делают отдельную таблицу, чтобы можно было найти все картинки, принадлежащие тесту. Но тут опять же надо знать id.
Можно как вариант изначально класть во временную папку типа
/upload/temp/zfgf/...
А при сохранении переименовывать папку в постоянную. Или же создавать «временную» запись для теста в таблице чтобы получить id и сразу класть картинки в постоянную папку.
Лишние картинки можно удалять как-то сборщиком мусора, запускаемым по расписанию.
Также надо позаботиться чтобы картинки с одинаковыми именами нее затирали друг друга, например дописывать что-то в имя.
Также надо подумать о безопасности: а что если нам загрузят php, phtml, файл ии htaccess?
http://ideone.com/1LNOm6
Вспомнил, что не переделал программу на чтение текста и поиск длинных слов.
и вообще, расскажите как лучше отлаживать код, смотреть значения переменных
В конце предыдущего треда мне ОП кидал
В рекомменд листе в прикрепленном треде есть только книги с шаблонами и всякими рекомендациями, настоящой книги как на для других языков нет.
Почему строка с null не работает? При отмене срабатывает else, а не else if
А ну можно и так. Наверно просто за этот богомерзкий язык никто браться не хочет даже если в комментариях огромное количество примеров с неадекватным синтаксисом/поведениям пхп. Ни слишком просто уж. Думал что есть СКРЫТЫЕ МЕТОДЫ И СПОСОБЫ писать нормальный код на пхп, но говно в самой основе заложено.
Без обид.
Ты что в танке? В интернет попробуй зайти, почитать там, погуглить.
Например возьмем ОСНОВЫ и посмотрим первый коммент: https://php.net/manual/ru/language.variables.basics.php
Больше ненависти и ругани методов можно загуглить на хабре, например.
Все не действует так как ожидаешь - главная проблема пхп - нет целостности.
Но работы и сайтов на нем много, так что некуда деваться. Пока что.
А если в гугле написать запрос по си, то тебя отправят на 666кулхацкер666.ру. И что теперь, си гавно?
Такое комменты пишут только неучи в стиле так слажна шопиздец))0 очень запутана как-та((9
Вместо того чтобы раз сесть и выучить. Больше с ругать не за что.
Ты мне напоминаешь пидорашку с ГОСДОЛГОМ США.
Тебе сколько лет?
Ты не понял о чем я вообще.
Я повторю, по частям.
>В интернет попробуй зайти, почитать там, погуглить.
>А если в гугле написать запрос по си, то тебя отправят на 666кулхацкер666.ру. И что теперь, си гавно?
Твой аргумент про то, что пхп - гавно - это "в комментах неучи". Мой аргумент - "неучи в комментах на всех языках". Ты же отвечаешь "пидорашка ко-ко-ко госдолг сша".
Ты сюда потроллить зашел или свои же посты забываешь за две минуты?
Как обычно. Сколько прошу аргументов про говнистость пхп, столько меня посылают в гугл.
На этом вот моменте с поиском пути затупил жутко, даже такая статья
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83#PHP
нихера не прояснила, только ещё больше запутала. Можешь набросать какой-то пример? Поиск пути здесь означает получение списка вершин, из какой в какую надо идти для попадания из первой вершины в последнюю.
Это мое ощущения от языка тоже. Приятно что не я один их замечаю.
А ты свой анус остуди.
>>412358
Пхп-кодеры уже даже на ссылку в посте нажать и проскроллить не могут?
Специально для тебя:
print isset($a); // $a is not set. Prints false. (Or more accurately prints ''.)
$b = 0; // isset($b) returns true (or more accurately '1')
$c = array(); // isset($c) returns true
И это я рандомно ткнул на первую ссылку.
Вот подробный разбор по частям всех прелестей))
http://habrahabr.ru/post/142140/
>print isset($a); // $a is not set. Prints false. (Or more accurately prints ''.)
$b = 0; // isset($b) returns true (or more accurately '1')
$c = array(); // isset($c) returns true
Ну и что с этим не так?
Вот осваиваю я только мускуль и делаю тестовое задание одной конторки паралельно. И так как в Никсоне якобы предоставлены устаревшие инструменты работы с MySQL как функции mysql_, то я полез в гугл, а оттуда на офф-сайт за изучением mysqli_, ну и берем первую же ссылку:
http://php.net/manual/ru/function.mysqli-connect.php
первый же коммент с примером кода, находящийся в топе, с 18 лойсами, первая же строка:
$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link));
И что? Да нихуя она не работает, если передать этой функции неправильные логин и пароль или другую инфу о базе, то не будет никакой ошибки mysqli_error, а будет другая ошибка, о том что в функцию mysqli_error передан неправильный параметр. Ну ведь действительно блядь, $link еще не успел стать ресурсом или чем он там становится после успешного подключения к базе, так что он не подходит еще для передачи в функцию. Так какого хуя это не заминусовано? В общем с сегодняшнего дня я перестал доверять на 100% этому сайту, такие дела.
А это он просто не знает отличий isset от empty, вот и агрится на своё собственное невежество.
Насчет variable variable: это фича из времени PHP3. Ни в одном нормальном проекте она не используется, и никто так не пишет. Проблемы не вижу. В других языках тоже eval есть например, это же не значит что язык плохой.
> $c = array(); // isset($c) returns true
И что тут не так?
isset возвращает true если переменная существует и не равна null. Как задумано, так и работает.
Си с PHP сравнивать нельзя: эти клоуны за 50 лет не смогли ни стандарт оформдения кода принять, ни решить проблему с инклудом тысяч заголовков ради компиляции одного файла, ни от макросов избавиться, коллекций нет, ничего вообще нет, функции стандартной библиотеки не работают с utf-8 и каждая вторая содержит переполнение буфера. Си это такое болото, до которого PHP далеко.
> прочти первый коммент
Давай почитаем.
> Before a variable is used, it has no existence.
Неверно. Переменная не существует, пока ты ее не создашь (а не пока не используешь). Это логично, если ты не какой-нибудь сишник или яваскриптщик, а например питонщик или рубист — там так же. Отукда появится переменная, если ты ее еще не создал? PHP твои мысли что ли угадывать должен?
> It is unset.
Бред. Переменная не может быть «unset», она либо есть либо нет.
> With the exception of null, the value a variable holds plays no part in determining whether a variable is set.
Я вообще не понимаю этого чувака. Создавай переменные прежде чем их использовать и не будет никакой проблемы. Так же работают и многие другия ЯП.
> Setting an existing variable to null is a way of unsetting a variable.
Неверно. Это лишь присваивание переменной null и все.
> is_null() is an equivalent test to checking that isset() is false.
Неверно:
> $ php -r 'var_dump(is_null($sfsdfsdf));'
> PHP Notice: Undefined variable: sfsdfsdf in Command line code on line 1
> bool(true)
is_null выдает ошибку, а isset — нет. Они не эквивалентны.
> If it is used without having been given a value then it is uninitalized and it receives the default value for the type.
Неверно. Если ты исплоьзуешь несуществующую переменную ты получаешь Notice (то есть ошибку в программе) и знаечие null.
Почему PHP использует Notice а не исключение? Исторически. Превратить все нотисы в исключения можно 3 строками кода, я всегда так делаю, быдоокодеры никогда.
В общем, человек плохо понимает PHP и пишет бред. Наверно он учился по плохим западным учебникам или курсам уровня кодеакадеми, а не в нашем треде.
Насчет variable variable: это фича из времени PHP3. Ни в одном нормальном проекте она не используется, и никто так не пишет. Проблемы не вижу. В других языках тоже eval есть например, это же не значит что язык плохой.
> $c = array(); // isset($c) returns true
И что тут не так?
isset возвращает true если переменная существует и не равна null. Как задумано, так и работает.
Си с PHP сравнивать нельзя: эти клоуны за 50 лет не смогли ни стандарт оформдения кода принять, ни решить проблему с инклудом тысяч заголовков ради компиляции одного файла, ни от макросов избавиться, коллекций нет, ничего вообще нет, функции стандартной библиотеки не работают с utf-8 и каждая вторая содержит переполнение буфера. Си это такое болото, до которого PHP далеко.
> прочти первый коммент
Давай почитаем.
> Before a variable is used, it has no existence.
Неверно. Переменная не существует, пока ты ее не создашь (а не пока не используешь). Это логично, если ты не какой-нибудь сишник или яваскриптщик, а например питонщик или рубист — там так же. Отукда появится переменная, если ты ее еще не создал? PHP твои мысли что ли угадывать должен?
> It is unset.
Бред. Переменная не может быть «unset», она либо есть либо нет.
> With the exception of null, the value a variable holds plays no part in determining whether a variable is set.
Я вообще не понимаю этого чувака. Создавай переменные прежде чем их использовать и не будет никакой проблемы. Так же работают и многие другия ЯП.
> Setting an existing variable to null is a way of unsetting a variable.
Неверно. Это лишь присваивание переменной null и все.
> is_null() is an equivalent test to checking that isset() is false.
Неверно:
> $ php -r 'var_dump(is_null($sfsdfsdf));'
> PHP Notice: Undefined variable: sfsdfsdf in Command line code on line 1
> bool(true)
is_null выдает ошибку, а isset — нет. Они не эквивалентны.
> If it is used without having been given a value then it is uninitalized and it receives the default value for the type.
Неверно. Если ты исплоьзуешь несуществующую переменную ты получаешь Notice (то есть ошибку в программе) и знаечие null.
Почему PHP использует Notice а не исключение? Исторически. Превратить все нотисы в исключения можно 3 строками кода, я всегда так делаю, быдоокодеры никогда.
В общем, человек плохо понимает PHP и пишет бред. Наверно он учился по плохим западным учебникам или курсам уровня кодеакадеми, а не в нашем треде.
по логике иссет должна показывать тру только в случае когда переменная не просто ИНИЦИАЛИЗИРОВАНА, как $c, а в нее введены значения, но в пхп совсем не так.
А про ад с == и === я даже начинать не хочу.
По какой такой логике во первых, во вторых в переменную $b введено значение 0, чем она тебя не устроила?
> isset возвращает true если переменная существует
> set
> существует
Топкек.
Хватило чтобы далее не читать твой высер.
> по логике иссет должна показывать тру только в случае когда переменная не просто ИНИЦИАЛИЗИРОВАНА
Ты мануал по isset прочти а потом рассказывай про логику. Ты мануалы не читаешь, а приходишь и говоришь что ничего не работает.
И не равна null, жопочтец
> А про ад с == и === я даже начинать не хочу.
Это же есть и в яваскрипте, а в других языках естьболь и унижение в виде явных приведений типов (хотя мне явное нравится больше, я в принципе готов пострадать ради правильности).
Ну и на практике если не быдлокодить то на php все нормально пишется.
> ад с == и ===
Нет там ничего адового. С приведением типов и без приведения сравнение. Типизация слабая, так что без этого никак.
Простая программа из одной строчки выдает адские ошибки.
Ты ебанутый? Зачем мне мануалы этого говноязыка?
Я тебе говорю про историческое значения SET в программировании и просто здоровой логики, а ты мне про нулл и мануалы этой дешевой поделки.
Зачем тогда [CODE] if ($c) [/CODE]?
Если по твой логике и этого "языка" иссет и if ($c) это одно и то же?
http://ru.wikibooks.org/wiki/Ruby/%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B
> Иногда возникает ситуация, когда при попытке вывода на экран русскоязычной строки при помощи метода p выводится непонятный код вида
> "\323\367\350\362\345 \320\363\341\350!"
> Чтобы избежать таких ситуаций следует поместить в начало программы следующий программный код:
> $KCODE = "u"
Ох лол. Объясните, почему в начале программы надо писать магический код на языке напоминающем PHP?
Это лишь твои фантазии. Расскажи мне где isset работает по-другому?
Тут «set» значит «значение задано». Во многих языках. например SQL null обозначает «неизвестно», «не указано», видимо тут логика аналогичная, если null то не задано.
> Если по твой логике и этого "языка" иссет и if ($c) это одно и то же?
Нет конечно
Ну и тебе могу сказать, что в любом другом языке елси ты не будешь читать докуметацию то получишь те же проблемы.
Может быть он про set как set of, ака множество?
> [] - совсем не сет, а инициализация.
Схуяли? Я могу узнать его длину, сравнить с другим массивом, прогнать его через array_map и всё остальное что я могу сделать с массивом [1, 2, 3, 4, 5].
Что?
Спасибо, я тот кто спрашивал насчёт игры в города. Я сейчас переделал, в принципе сейчас кажется работает всё, даже есть вероятность того когда компьютер может не найти ответ в базе данных. Но случилось так, что я построил скрипт, таким образом что он подбирает города по последней букве, а игрок может называть любые лишь бы такие существовали в базе данных, я вначале даже этого и не заметил. И сейчас немного не понимаю как это исправить, не подскажешь, для того что бы игрок имел возможность писать город только с последней буквы названного компьютером города нужно использовать только сессии? Или можно без них обойтись?
Ты с с-подобными знаком?
Грубо говоря потому, что говно-код будет работать нормально, до поры до времени.
Конечно, БД не сложные, за вечер для использования можно разобрать, фреймворки нужны для любых языков. Java script - не сложный, он похож на php чем-то, кстати. html и css аналогично вечер-другой для использования.
А вообще у тебя странная логика. Если язык простой, то сопутсвующих ему технологий не должно быть что-ли?
Чтобы писать на php - надо знать php, а те вещи, что ты перечислил, нужны для разработки приложений, разработка которых только с помощью одного пхп невозможна.
чуви, не путай концепты и скриптовый язык. РНР это просто скриптовый язык кажись. а ты перечислил кашу из технологий и подходов. то есть чтобы что-то на чем-то писать надо понимать что тебе нужно и как это реализовать + современные подходы. то бишь посредством рнр либ(те самые фреймворки, что есть набор либ) ты вызываешь тот самый хтмл, который в свою очередь интерпретируют современные браузеры и через функционал операционки и драйверов отрисовывают тебе котиков с порнухой. считается легким, т.к. наверно много хау-ту мануалов чтобы накодить домашнюю страницу плюс нечеткая типизация, пох на регистр и т.д. а вот чтобы что то серьезное делать, али не плодить костылей и вырвиглазного сложноподдерживаемого кода- надо разбираться в технологиях. начни с простых задач, а там потихоньку освоишся.
>Для gif не создаются превьюшки.
Очень странно. Это было из-за того, что getID3 возвращал ошибку "Не удалось определить тип файла", хотя с гиф файлами он должен работать. Пока что прикрутил взятие медиадаты для гифок одним методом.
>Если загрузить файл tif то он почему-то ставится в качестве превьюшки, хотя браузер такой формат не поддерживает.
Сделал превью только для гиф/пнг/джпг/бмп. Я так думаю, что он бы пытался ставить как превьюшку и другие форматы, MIME-тип которых начинался бы с image/.
>При ошибке у тебя зачем-то вываливаются технические подробности ошибки поьзователю:
Да, забыл само исключение из вывода убрать.
>Если загрузить файл с очень длинным именем, оно переносится в таблице последних файлов на вторую строчку, и она разъезжается. Тут конечно надо применять table-layout: fixed и вручную заданную ширину колонок.
Ох уж эта верстка!
>Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.
Это самое сложное. Я попробовал что-то с этим сделать, но не уверен в своем решении.
Ну и проблемы с ".htaccess" решил простым переименованием его при заливании в "htaccess".
github.com/sqghub/uppu.ru
как работают объекты и классы в пхп? http://archive-ipq-co.narod.ru/l1/pasta.html Если сложить код в кучу в примере он не работает уже начиная со средины, там не хватает кода который бы работал, чтобы можно было бы его просмотреть и понять как это всё работает вместе. Начал читать Никсона, было всё ясно аж до момента когда началась тема с классами и объектами. Есть где-нибудь подробное разжевывание с пояснениями каждой запятой?
Особенно с инкапсуляцией пока больше всего неясностей. Вот создан класс, объявлен объект, внутри свойства описаны и методы но они приватные, какое может быть применение у объекта в этом случае если его свойства и методы нельзя вызвать снаружи? Плюс с созданием объектов внутри массива
Вот в этом участке кода из урока ОПа
http://ideone.com/rNJ1T4
разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?
И почему дважды объявляется один и тот же объект в функции
$q = new Question; ?
Что там непонятного? У опа в примерах нет ни инкапсуляции, ни приватных методов. Какой счетчик?
$var[] = добавляет в массив еще один элемент, это аналогично функции array_push.
И мы не создаем один и тот же объект дважды, мы создаем объекты одного и того же класса дважды, и перезаписываем переменную $q
Перепиши пожалуйста эту функцию из примера, чтобы она работала, не могу понять ход её выполнения пока не вижу её рабочую версию.
Спасибо.
Теперь и у меня вышло
http://ideone.com/Qe2ne5 . А с областью видимости? Если внутри объекта всё private какое применение у этого есть?
Если private или protected то как-то так:
http://ideone.com/ER23Am
ты не можешь напрямую обращаться вне класса к приватному или протектед свойству, но внутри класса ты можешь делать это любыми методами.
То-есть приватным нужно например назначить например password который может быть вызван внутри объекта только определенным методом и никак иначе? Вроде уже яснее
Выглядит верно. Хотя решение от анона >>412112 тоже выглядит верным, но более простым.
>>412117
Я не могу проверить так как не разбираюсь в Хаскелле, но названия ужасные.
>>412121
> все это 2 или 3 раза с нуля потому, что оно не хотело работать?
ну если ты начинающий, это вполне нормально. Только зря ты мучаешься и сам переписываешь, лучше бы вкинул в тред как можно раньше, тебе бы дали советы и бы быстрее получил результат.
Советы и замечания.
Я вижу, что начнающему может быть сложно решить эту задачу, не беда, если делать ее постепенно исправляя замечания, то придешь в итоге к чему-нибудь работающему.
Насчет кода. Каждый класс должен быть в своем файле и имя класса должно соответствовать имени файла. Ничего постороннего в файле с классом быть не должно.
Имена могут строиться по такой схеме:
В PSR-0 на подчеркиваниях: My_Class -> My/Class.php
В PSR-4 на неймспейсах: My\Class -> My/Class.php
Чуть-чуть про них: http://zenwalker.me/2014/03/php-psr-0-vs-psr-4.html
Надо положить в репозиторий схему (дамп) базы данных в формате SQL. Как иначе я ее проверю? Не добавляй в дамп команды создания базы или пользователей — только команды создания таблиц.
> <form action = 'addToDataBase.php'
Что за странный стиль расстановки пробелов? Обычно в HTML вокруг знака равно пробелы не ставят (а в PHP ставят).
В плане верстки, верстать br'ами очень нехорошо, надо бы нормально делать. Если ты не очень разбираешься в HTML/CSS, может тебе стоит порешать простые задачки из «Пути HTML»? Они помогут разобраться: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> Пол:<br>
> type = 'text'
Обычно для выбора пола делают радиокнопки: http://htmlbook.ru/samhtml5/formy/pereklyuchateli
(кстати, советую весь раздел про формы http://htmlbook.ru/samhtml5/formy посмотреть).
> <input name = 'email' type = 'text'
лучше использовать type=email — тогда современный браузер сам проверит его на правильность, а на мобильныхз устройствах будет выдвигаться клавиатура с значками для ввода емайла.
> <input name = 'local' type = 'text'
Тут нужен чекбокс (галочка)
> <input name = 'year' type = 'text' size = '32'>
Что-то для ввода года 32 символа слишком много, мне кажется.
Кстати, главной страницей должен быть список абитуриентов.
> LIKE :search
Конструкцию LIKE надр использовать только при поиске, а если поиск не ведется то не надо, а надо выводить всех подряд.
> ?>
Не ставь этот маркер в конце файла, он может принести тебе проблемы если ты после него забудешь пробел.
В шаблоне вместо echo надо исплоьзовать <?=
HTML-код не должен быть в кавычках внутри echo.
Также, у тебя может присутствовать уязвимость XSS, вот мини-урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64
> $view = new Pages($_GET);
Это не очень удачная идея, передавать массив, лучше явно передавать по отдельности значения page и number. Или даже делать это через методы:
$filter->setSearch($search);
Ну и название не очен удачное, мне кажется этот класс стоит назвать Filter, FilterArgs или как-то так, так как он отвечает за параметры вывода таблицы.
Советы и замечания.
Я вижу, что начнающему может быть сложно решить эту задачу, не беда, если делать ее постепенно исправляя замечания, то придешь в итоге к чему-нибудь работающему.
Насчет кода. Каждый класс должен быть в своем файле и имя класса должно соответствовать имени файла. Ничего постороннего в файле с классом быть не должно.
Имена могут строиться по такой схеме:
В PSR-0 на подчеркиваниях: My_Class -> My/Class.php
В PSR-4 на неймспейсах: My\Class -> My/Class.php
Чуть-чуть про них: http://zenwalker.me/2014/03/php-psr-0-vs-psr-4.html
Надо положить в репозиторий схему (дамп) базы данных в формате SQL. Как иначе я ее проверю? Не добавляй в дамп команды создания базы или пользователей — только команды создания таблиц.
> <form action = 'addToDataBase.php'
Что за странный стиль расстановки пробелов? Обычно в HTML вокруг знака равно пробелы не ставят (а в PHP ставят).
В плане верстки, верстать br'ами очень нехорошо, надо бы нормально делать. Если ты не очень разбираешься в HTML/CSS, может тебе стоит порешать простые задачки из «Пути HTML»? Они помогут разобраться: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> Пол:<br>
> type = 'text'
Обычно для выбора пола делают радиокнопки: http://htmlbook.ru/samhtml5/formy/pereklyuchateli
(кстати, советую весь раздел про формы http://htmlbook.ru/samhtml5/formy посмотреть).
> <input name = 'email' type = 'text'
лучше использовать type=email — тогда современный браузер сам проверит его на правильность, а на мобильныхз устройствах будет выдвигаться клавиатура с значками для ввода емайла.
> <input name = 'local' type = 'text'
Тут нужен чекбокс (галочка)
> <input name = 'year' type = 'text' size = '32'>
Что-то для ввода года 32 символа слишком много, мне кажется.
Кстати, главной страницей должен быть список абитуриентов.
> LIKE :search
Конструкцию LIKE надр использовать только при поиске, а если поиск не ведется то не надо, а надо выводить всех подряд.
> ?>
Не ставь этот маркер в конце файла, он может принести тебе проблемы если ты после него забудешь пробел.
В шаблоне вместо echo надо исплоьзовать <?=
HTML-код не должен быть в кавычках внутри echo.
Также, у тебя может присутствовать уязвимость XSS, вот мини-урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64
> $view = new Pages($_GET);
Это не очень удачная идея, передавать массив, лучше явно передавать по отдельности значения page и number. Или даже делать это через методы:
$filter->setSearch($search);
Ну и название не очен удачное, мне кажется этот класс стоит назвать Filter, FilterArgs или как-то так, так как он отвечает за параметры вывода таблицы.
http://ideone.com/QelX2V
Ну вот, я просто попытался воспользоваться функцией этой, но она просто перезаписывает первую ячейку, как сделать чтобы он записывал следующую ячейку массива следующим вопросом?
И, кстати, у тебя функция printQuestions ничего не возвращает, зачем пытаться записать её значение (которого не существует) в переменную $print? Мне кажется тебе стоит еще раз пройтись по уроку с функциями.
У тебя должно получиться что-то вроде этого.
http://ideone.com/TiGwNn
На 46ой строчке ты записываешь в переменную $questions массив из одного вопроса, который тебе вернула функция createQuestion. На 58ой ты перезаписываешь переменную $questions новым массивом, а старый теряется. В результате в переменной остается только последний вопрос, который ты в неё записал.
Дальше, насчет StudentViewer, StudentUpdater, я думаю, незачем разделять код работы с таблицей students на несколько классов, а можно поместить в один.
Классы Student и StudentUpdate это копипаста. Зачем дублировать код? Сделай один класс Student и везде его используй.
> https://github.com/babyba/sat/blob/master/addToDataBase.php#L19
тут надо проверять что такое поле существует иначе выдавать ошибку. А то этот код никак не скажет что ты например опечатался в названии поля.
> public $md5;
Это поле надо назвать понятнее, например, accessToken или accessCode.
> $this->md5 = md5($this->email).md5($this->lastName);
Если ты хочешь использоват это как пароль, то это плохая идея так как любой зная фамилию и email может посчитать хеш.
Лучше всего генерировать его случайно, тогда его точно не подобрать.
> if(!preg_match('/^[А-ЯA-Z][а-яa-z]$/u'
Я думаю, не стоит требовать чтобы первая буква была большой, можно просто автоматически исправлять регистр если первая буква маленькая.
> echo "Введите правильное им'я.\n";
> die( );
Это не дружественно к пользователю, когда при ошибке появоляется белый экран с нечитаемой надписью (так как кодировку ты не задал и скорее всего текст не отобразится правильно).
Формы надо обрабатывать по-другому: при ошибке появляется заполненная форма и сообщение об ошибке.
Также, формы добавления и редактирования очень похожи. Для них можно использовать общий код, а не копипастить. Копипаста и дублирование кода — это не решение, дублирования не должно быть вообше. это называется «Don't Repeat Yourself», «не повторяйся».
Вот как обычно работают с формами:
значения = значения по умолчанию;
ошибки = пустой массив;
если (открыта страница редактирования) {
загрузить значения из базы;
}
если (форма отправлена) {
заполнить массив значений из POST/GET;
проверить все ли верно, сохранив ошибки в масссив ошибок;
если (все верно) {
сохранить данные;
делаем редирект для щащиты от повторной отпрравки формы;
завершаем скрипт;
}
}
вывести форму, возможно с ошибками;
Заметь, в моем примере «значения» это массив. Но у тебя же есть класс Student — гораздо удобнее хранить значения прямо в нем.
> if (!preg_match('/^[a-zA-Z0-9]@[a
В email могут быть минусы, плюсы, подчеркивания и еще много чего.
> @[a-zA-Z]{1,7}
Абсолютно непонятно откуда взялась цифра 7, и почему там не может быть минуса или второй точки.
j.m.johnson@phys-department.cs.mit.edu - вот вполне валидный адрес
> public function checkFill($array){
Не надо передавать массив. У тебя уже есть объект со всеми нужными свойствами. Проверяй свойства объекта.
> setcookie('pass', $person->md5,
Задача маппера сохранить сущность в базу данных. Куки в нем ставиься или проверяться не должны.
> $SAT = new PDO
Лучше $pdo = new PDO
Что касается поиска и постраничного вывода, это надо поместить прямо на страницу со списком.
Если что-то непонятно, задавай вопросы. Это тред для начинающих.
Дальше, насчет StudentViewer, StudentUpdater, я думаю, незачем разделять код работы с таблицей students на несколько классов, а можно поместить в один.
Классы Student и StudentUpdate это копипаста. Зачем дублировать код? Сделай один класс Student и везде его используй.
> https://github.com/babyba/sat/blob/master/addToDataBase.php#L19
тут надо проверять что такое поле существует иначе выдавать ошибку. А то этот код никак не скажет что ты например опечатался в названии поля.
> public $md5;
Это поле надо назвать понятнее, например, accessToken или accessCode.
> $this->md5 = md5($this->email).md5($this->lastName);
Если ты хочешь использоват это как пароль, то это плохая идея так как любой зная фамилию и email может посчитать хеш.
Лучше всего генерировать его случайно, тогда его точно не подобрать.
> if(!preg_match('/^[А-ЯA-Z][а-яa-z]$/u'
Я думаю, не стоит требовать чтобы первая буква была большой, можно просто автоматически исправлять регистр если первая буква маленькая.
> echo "Введите правильное им'я.\n";
> die( );
Это не дружественно к пользователю, когда при ошибке появоляется белый экран с нечитаемой надписью (так как кодировку ты не задал и скорее всего текст не отобразится правильно).
Формы надо обрабатывать по-другому: при ошибке появляется заполненная форма и сообщение об ошибке.
Также, формы добавления и редактирования очень похожи. Для них можно использовать общий код, а не копипастить. Копипаста и дублирование кода — это не решение, дублирования не должно быть вообше. это называется «Don't Repeat Yourself», «не повторяйся».
Вот как обычно работают с формами:
значения = значения по умолчанию;
ошибки = пустой массив;
если (открыта страница редактирования) {
загрузить значения из базы;
}
если (форма отправлена) {
заполнить массив значений из POST/GET;
проверить все ли верно, сохранив ошибки в масссив ошибок;
если (все верно) {
сохранить данные;
делаем редирект для щащиты от повторной отпрравки формы;
завершаем скрипт;
}
}
вывести форму, возможно с ошибками;
Заметь, в моем примере «значения» это массив. Но у тебя же есть класс Student — гораздо удобнее хранить значения прямо в нем.
> if (!preg_match('/^[a-zA-Z0-9]@[a
В email могут быть минусы, плюсы, подчеркивания и еще много чего.
> @[a-zA-Z]{1,7}
Абсолютно непонятно откуда взялась цифра 7, и почему там не может быть минуса или второй точки.
j.m.johnson@phys-department.cs.mit.edu - вот вполне валидный адрес
> public function checkFill($array){
Не надо передавать массив. У тебя уже есть объект со всеми нужными свойствами. Проверяй свойства объекта.
> setcookie('pass', $person->md5,
Задача маппера сохранить сущность в базу данных. Куки в нем ставиься или проверяться не должны.
> $SAT = new PDO
Лучше $pdo = new PDO
Что касается поиска и постраничного вывода, это надо поместить прямо на страницу со списком.
Если что-то непонятно, задавай вопросы. Это тред для начинающих.
Я просто скопировал строчки из урока. Думал сперва собрать из строчек код и потом уже смотреть как всё работает.
У опа в уроке подразумевается, что функция createQuestions не принимает никаких параметров, а сразу выдает массив вопросов уже заданных в функции. У тебя же переделанная функция, значит и весь остальной код нужно подстраивать под неё. Но там всего нужно было изменить пару строчек, как я уже писал выше >>412567
> Принадлежность того или иного символа к буквенным определяется с учетом текущей локали.
Ну нет. У тебя локаль никак не используется, и хорошо. Но у тебя словом считается все, кроме пробела, и нескольких знаков, а логично словом считать набор букв.
Чтобы найти буквы любых алфавитов, можно использовать в регулярке свойства юникодных символов: http://php.net/manual/ru/regexp.reference.unicode.php
Удобнее всего находить и сразу же заменять слова через preg_replace_callback. Ну еще можно через preg_split или preg_match_all, но не так удобно.
> foreach ($text_array as $k => &$str)
Если ты не используешь k, не надо ее писать
Переменные пишутся кемелкейсом, textArray, а не text_array
> mb_strlen($str, 'UTF-8');
Если ты задал кодировку через mb_internal_encoding то писать второй раз ее не надо.
Так, программа работает верно, но, я думаю, полезно разобраться со свойствами юникода. Ведь в мире есть огромное число букв и все их ты вряд ли сможешь перечислить вручную.
Ну я текст просто рандомный взял из документации.
> j100 = jabloki.count("1")
Ничем не опревданные костыли. Что мешает прочитать строку и превратить ее в список чисел?
Проверка по моему искуственно усложнена, это можно записать одним ифом гораздо короче.
> моар
http://codeforces.ru/problemset
>>412259
Никак.
> расскажите как лучше отлаживать код, смотреть значения переменных
Если у тебя есть IDE вроде phpstorm, eclipse, netbeans то в ней можно, если все верно настроено, и установлен xdebug, отлаживать код. Ты можешь ставить точки останова, смотреть значения переменных, выполнять код по шагам и смотреть что меняется.
PhpStorm: http://habrahabr.ru/post/209024/
http://habrahabr.ru/sandbox/77402/
https://www.jetbrains.com/phpstorm/webhelp/debugging-php-applications.html
Eslipse PDT: https://wiki.eclipse.org/Debugging_using_XDebug
Netbeans: https://netbeans.org/kb/docs/php/debugging_ru.html
Я советую тебе научиться, это полезно. В интернете такж много статей (+ видео на ютубе для ленивых). Если что-то не будет работать, можешь писать в тред только максимум подробностей сразу же указывай, а то мы читать мысли не умеем.
Действительно. Зачем одна простая операция .count когда можно прочитать строку, превратить её в список чисел, затем разделить какждое число на 100
$i++ равносильно $i = $i + 1 то есть прибавить к текущему значению единицу и записать обратно в $i.
$i += 10; равносильно $i = $i + 10;
У меня в первом или втором уроке это упомянуто.
>>412320
Браузер какой? У меня в Хроме пишет «Вход отменен». Может ты перепутал что?
Примеры лучше на jsfiddle или jsbin наверно выклаыдвать, там их запустить сразу можно.
>>412360
> Я никак не могу реализовать поиск кратчайшего (по числу пройденных ребер) пути в ориентированном графе.
Можно взять другой алгоритм, смотри сколько их: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
> Можешь набросать какой-то пример?
Там же пример кода на PHP. В чем смысл мне набросать то же самое?
Там используется очередь (ее можно сделать из массива), то есть мы берем из нее вершину, обходим ее деетй и каждого добавляем в очеердь. После чего берем очередную вершину из очереди и так пока они не закончатся.
В начале в очереди стартовая вершина
Алгоритм забирает ее и обходит ее детей (не внуков и далее, а только детей) и каждого кладет в очередь. В очереди теперь лежат дети 1-го уровняю
Алгоритм берет очередного ребенка первого уровня, вобходит его детей и их добавляет в очередь.
Ну и так пока не обойдет все вершины.
То есть суть алгоритма в том, что он обходит всех потомков стартового узла в определенном порядке (сначала 1-го уровня вложенности, потом второго, и тд). очередь нужна именно чтобы обеспечиит этот порядок.
Попробуй это на листочке бумажки нарисовать.
Если тебе что-то непонятно, задавай конкретные вопросы, я поясню.
$i++ равносильно $i = $i + 1 то есть прибавить к текущему значению единицу и записать обратно в $i.
$i += 10; равносильно $i = $i + 10;
У меня в первом или втором уроке это упомянуто.
>>412320
Браузер какой? У меня в Хроме пишет «Вход отменен». Может ты перепутал что?
Примеры лучше на jsfiddle или jsbin наверно выклаыдвать, там их запустить сразу можно.
>>412360
> Я никак не могу реализовать поиск кратчайшего (по числу пройденных ребер) пути в ориентированном графе.
Можно взять другой алгоритм, смотри сколько их: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
> Можешь набросать какой-то пример?
Там же пример кода на PHP. В чем смысл мне набросать то же самое?
Там используется очередь (ее можно сделать из массива), то есть мы берем из нее вершину, обходим ее деетй и каждого добавляем в очеердь. После чего берем очередную вершину из очереди и так пока они не закончатся.
В начале в очереди стартовая вершина
Алгоритм забирает ее и обходит ее детей (не внуков и далее, а только детей) и каждого кладет в очередь. В очереди теперь лежат дети 1-го уровняю
Алгоритм берет очередного ребенка первого уровня, вобходит его детей и их добавляет в очередь.
Ну и так пока не обойдет все вершины.
То есть суть алгоритма в том, что он обходит всех потомков стартового узла в определенном порядке (сначала 1-го уровня вложенности, потом второго, и тд). очередь нужна именно чтобы обеспечиит этот порядок.
Попробуй это на листочке бумажки нарисовать.
Если тебе что-то непонятно, задавай конкретные вопросы, я поясню.
После непродолжительных поисков по местным сайтам объявлений я увидел несколько вакансий контент-менеджера. Помимо освоенного мною ремесла копирайтинга и граф. редакторов там требуется уметь админить инет-магазины.
С чего мне начать, дабы научиться это делать? И не только магазины, а и сайты вцелом.
Имею знание английского, понимание основ программирования, небольшой опыт написания кода на C++, C#, еще меньший опыт HTML (не более, чем нужно копимакаке).
> Поиск пути здесь означает получение списка вершин, из какой в какую надо идти для попадания из первой вершины в последнюю.
Там алгоритм просто перебирает всех потомков, для каждого проверяя не является ли он конечной целью.
>>412379
Ну не читай комменты, это же не я и не авторы php плюсы ставят. Молодец, что не поленился сам проверить.
Вот тут в документации пример как надо проверять ошибку соединения: http://php.net/manual/ru/mysqli.error.php
Ну и ты зря используешь процелурный стиль, он о моему устраевший и неудобный.
>>412421
> И сейчас немного не понимаю как это исправить, не подскажешь, для того что бы игрок имел возможность писать город только с последней буквы названного компьютером города нужно использовать только сессии?
нужно где-то хранить последнее использованное слово чтобы можно было сравнить буквы, в сессии или в базе.
> Или можно без них обойтись?
Можно в базе хранить данные.
>>412435
Другие языки еще сложнее.
>>412541
> Если сложить код в кучу в примере он не работает уже начиная со средины, там не хватает кода который бы работал,
Возможно там какие-то очевидные вещи не написаны. Они очевидны тем, кто учебник с начала проходил. А можешь показать код, который не работает? Может я смогу понять чего там не зватает?
По моему у меня самое простое объяснение ООП.
>>412544
> применение у объекта в этом случае если его свойства и методы нельзя вызвать снаружи?
При инкапусуляции несколько методов специально делают публичными. То есть ты можешь снаружи вызывать только их, а лезть в свойства или вызывать внутренние методы не можешь. это делает код понятным (чем меньше методов доступно тем проще разобраться) и надежным (нельзя залезть внутрь объекта и записать туда что-то левое).
Объект с инкапсуляцией это как автомат по продаже кофе. Ты можешь только нажать кнопку и выбрать сорт, а залезть внутрь и смешать ингридиенты ты не можешь.
А объект без инкапсуляции - это автомат с открыой крышкой, в который любой мождет залезть руками.
> разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?
Нет, когда ты пишешь [] то элемент добавляется в конец массива ничего не затирая. Мануал:
http://php.net/manual/ru/language.types.array.php#language.types.array.syntax.modifying
> И почему дважды объявляется один и тот же объект в функции
А почему нет? Мы сначала кладем в переменную первый объект, изменяем его свойства, кладем его в массив. А затем кладем второй объект в ту же переменную, первый-то надежно сохранен в массиве.
>>412557
Или protected или private, да. Ну сам подумай, что хорошего в кофейном автомате со снятой крышкой? туда могут что-нибудь нехорошее вместо кофе залить. Или могут взять его не заплатив.
> Поиск пути здесь означает получение списка вершин, из какой в какую надо идти для попадания из первой вершины в последнюю.
Там алгоритм просто перебирает всех потомков, для каждого проверяя не является ли он конечной целью.
>>412379
Ну не читай комменты, это же не я и не авторы php плюсы ставят. Молодец, что не поленился сам проверить.
Вот тут в документации пример как надо проверять ошибку соединения: http://php.net/manual/ru/mysqli.error.php
Ну и ты зря используешь процелурный стиль, он о моему устраевший и неудобный.
>>412421
> И сейчас немного не понимаю как это исправить, не подскажешь, для того что бы игрок имел возможность писать город только с последней буквы названного компьютером города нужно использовать только сессии?
нужно где-то хранить последнее использованное слово чтобы можно было сравнить буквы, в сессии или в базе.
> Или можно без них обойтись?
Можно в базе хранить данные.
>>412435
Другие языки еще сложнее.
>>412541
> Если сложить код в кучу в примере он не работает уже начиная со средины, там не хватает кода который бы работал,
Возможно там какие-то очевидные вещи не написаны. Они очевидны тем, кто учебник с начала проходил. А можешь показать код, который не работает? Может я смогу понять чего там не зватает?
По моему у меня самое простое объяснение ООП.
>>412544
> применение у объекта в этом случае если его свойства и методы нельзя вызвать снаружи?
При инкапусуляции несколько методов специально делают публичными. То есть ты можешь снаружи вызывать только их, а лезть в свойства или вызывать внутренние методы не можешь. это делает код понятным (чем меньше методов доступно тем проще разобраться) и надежным (нельзя залезть внутрь объекта и записать туда что-то левое).
Объект с инкапсуляцией это как автомат по продаже кофе. Ты можешь только нажать кнопку и выбрать сорт, а залезть внутрь и смешать ингридиенты ты не можешь.
А объект без инкапсуляции - это автомат с открыой крышкой, в который любой мождет залезть руками.
> разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?
Нет, когда ты пишешь [] то элемент добавляется в конец массива ничего не затирая. Мануал:
http://php.net/manual/ru/language.types.array.php#language.types.array.syntax.modifying
> И почему дважды объявляется один и тот же объект в функции
А почему нет? Мы сначала кладем в переменную первый объект, изменяем его свойства, кладем его в массив. А затем кладем второй объект в ту же переменную, первый-то надежно сохранен в массиве.
>>412557
Или protected или private, да. Ну сам подумай, что хорошего в кофейном автомате со снятой крышкой? туда могут что-нибудь нехорошее вместо кофе залить. Или могут взять его не заплатив.
Ну а по аналогии полностью приватный или защищенный объект это как кофейный автомат без кнопок просто с вилкой для розетки? Там я уже более менее с помощью анонов разобрался с ходом, ещё перечитаю Никсона по классам и попробую уже что-то из практики. Минус примера в мануале, в том что он слишком массивен и насыщен функциями, достаточно было бы 1-2 свойств и 1 метода для объекта, а так плохо воспринимается мне как новичку.
У Никсона скупо ООП описан, я вообще ничего не знал, пока Оповские уроки не прочитал.
Ты не понимаешь примеры потому что плохо знаешь функции и массивы, тебе бы стоило их изучить прежде чем за ООП браться.
Не стоит городить массив ради того чтобы положить туда ровно один объект. Проще вернуть сразу этот объект.
Также, чтобы массивы не затирали друг друга, их можно поместить в разные переменные и объединить с помощью array_merge.
>>412570
Там не надо 2 раза вызывать createQustions. А достаточно вызвать ее один раз.
>>412579
Потому что твой count заставляет разгадывать зачем это написано. Явное лучше неявного.
Ну и сегодня у нас там только числа 100 и 200 а завтра добавятся 10 и 20.
Если ты хочешь посоревноваться «кто сложнее запутает код», то ты не по адресу пришел. Или ты просто не знаешь как разбить строку на массив чисел в руби?
>>412582
Найти демо-версию админки в открытом доступе или поставить себе на компьютер админку интернет-магазина и освоить, параллельно читая документацию.
>Минус примера в мануале, в том что он слишком массивен и насыщен функциями, достаточно было бы 1-2 свойств и 1 метода для объекта, а так плохо воспринимается мне как новичку.
Он плохо воспринимается, потому-что ты не пошагово его делал, нужно было самому писать все свойства и методы класса с самого начала и проверять работает ли код, а не склеивать готовые куски.
> полностью приватный или защищенный объект это как кофейный автомат без кнопок просто с вилкой для розетки?
даже без вилки.
Я думаю, анон просто не очень разбирается в массивах и функциях (не решал предыдущие задачи), и немного переоценил свои силы, оттого и сложности.
Но я решал предыдущие задачки
Лиличка:
http://ideone.com/zKp8G9
Вот на поиск ближайших цифр в массиве
http://ideone.com/2j3S6k
Вот на банкомат http://ideone.com/EcepAn
Я подумал, что этого достаточно чтобы разобраться с объектами и классами :C
Как поставить ее себе на пеку? Я ума не приложу даже как составить запрос гуглу.
Задача http://codeforces.ru/problemset/problem/492/A
Решение http://ideone.com/eXaq4D
Видимо, надо было больше решать! Ну попробуй тогда реши задачи из урока про ООП, включая Вектор и кошки-мышки.
>>412599
ну CMS для интернет-магазинов много. Определись, какую ты хочешь изучать.
Например, на сайте разработчика CMS часто бывает выложено демо
Вот пример сайта где есть демо-версии разных CMS, можно их пробовать не устанавливая:
http://www.opensourcecms.com/scripts/show.php?catid=3&category=eCommerce
https://www.softaculous.com/demos
Чтобы установить себе на компьютер, надо установить Апач, MySQL, PHP, это может быть сложно.
>>412603
Так там число кубиков до 10 000 может быть, твоя программа потянет? Тут все же стоит почитать про арифместические/геометричесике прогрессии и про числа Фибоначчи, мне кажется задача с ними связана.
Вообще, на олимпиадах задания тестируются автоматически, а для защиты от решения в лоб обычно дают большие входные числа, так, что без оптимизаций не уложищься в лимит по времени.
Моя то уложилась в 0,78с (хоть это и раби), но печально, когда программирование скатывают в математику. Это как пенсионеркам-поломойкам выдать альпинисткое снаряжение и запустить соревнование по мытью небоскреба.
>>412562
По поводу кнопок и радио кнопок, и полей - исправлю.
И с версткой <br> попытаюсь разобраться. Таблицами можно?
Не придумал, как реализовать поиск, кстати, он что-то не работает, когда запроса вида ... LIKE %:search%
Почему не ставить? Разве не должен быть код заключен в <?php ... ?>?
Окей, буду передавать по отдельности.
По поводу поля md5 понятно, но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?
Ух, блин, как много всего и все таки это сложно немного.
Я уберу эту регулярку. когда будет type = 'emai'.
С последними понятно. Спасибо.
P.S. Вчера во время исправления навернулся и оно опять передает строку, а почему - не знаю. Скрины:
Либо скать интерпретатор, либо использовать сборки вроде wamp, денвер(не рекомендую), либо хостинг.
Как установить интерпретатор:
https://gist.github.com/codedokode/7054af4a03865c4cc863
Заметь что если php установлен и все верно настроено, Netbeans сам умеет его вызывать и ты можешь запускать программу не выходя из IDE.
https://netbeans.org/kb/docs/php/project-setup.html#scriptCommandLine
https://netbeans.org/kb/docs/php/project-setup_ru.html
Если у тебя PHP находится в одной из папок в PATH, скорее всего даже настраивать ничего не надо.
Также, рано или поздно тебе понадобится Апач. Вот небольшой FAQ по его установке: https://gist.github.com/codedokode/10774100
Сложить числа — математика уровня 5 класса. Никто же тебя уравнения с интегралами и векторами решать не заставляет. Так что странные аналогии. И почему программист не может разбираться в математике? Я думаю, может.
>>412623
Никсон только для основ годится. Про современный PHP можно почитать например на сайте phptherightway (там есть русский перевод).
Также, 2 неплохие книги (Зандстра и Шлосснейгл) указаны в ОП-треде. Они не очень новые, но вещи типа принципов ООП не устарели.
Заметь, вся эта литература научит тебя лишь языку PHP. Дальше лучше изучать те же фреймворки, например, Slim, Silex, Yii2 , Symfony 2, потому что этого в книгах наверно нет (хотя может и есть, не знаю), а именно на фреймворках многие проекты сейчас делаются.
Не все описано в книгах. Ты вряд ли найдешь книгу например на тему «как использовать redis в php проектах».
Ну и если у тебя есть пробелы в HTML/CSS, JS, базах данных, тебе про них стоит почитать. У меня есть хорошие задачки для проверки знаний на эти темы.
> Таблицами можно?
Это еще хуже чем br. Чувак, таблицами уже 10 лет никто не верстает. Почему дивами не хочешь заверстать?
Если ты плохо разбираешься в HTML, ты можешь пока оставить на br, и заниматься php-частью. Но тогда надо параллельно осваивать HTML/CSS. У меня есть урок с ссылочками на теорию и задачками, можешь их тоже потихоньку решать, ближе к концу научишься как правильно сверстать эту форму: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> он что-то не работает, когда запроса вида ... LIKE %:search%
У тебя и в SQL пробелы в знаниях. Смотри, то что мы подставляем через плейсхолдеры, вставляется в запрос в кавычках, напрмиер:
WHERE x = ? превратится в WHERE x = 'qwww'
Соответственно
LIKE %:search% превратится в LIKE %'abc'%
А это неправильно с точки зрения языка SQL так как проценты должны быть внутри строки, а не снаружи.
> Разве не должен быть код заключен в <?php ... ?>?
закрывающий маркер не обязателен: http://php.net/manual/ru/language.basic-syntax.phptags.php
> но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?
Ты когда на сайте регистрируешься вместо пароля тоже файмилию указываешь? Там должен быть уникальный код, который трудно подобрать. То есть что-то случайное вроде
dgsusgt76dstf76sfdssf
> Я уберу эту регулярку. когда будет type = 'emai'.
Вообще, проверка данных на клиенте (в браузере) не отменяет того что их надо проверять на сервере (в твоем скрипте) так как злоумышленник может прислать любые данные и мы должны проверять их на правильность прежде чем записывать в базу.
Насчет ошибки, может это из-за точки с запятой?
> Ух, блин, как много всего и все таки это сложно немного.
Не беда, со временем разберешься.
> Таблицами можно?
Это еще хуже чем br. Чувак, таблицами уже 10 лет никто не верстает. Почему дивами не хочешь заверстать?
Если ты плохо разбираешься в HTML, ты можешь пока оставить на br, и заниматься php-частью. Но тогда надо параллельно осваивать HTML/CSS. У меня есть урок с ссылочками на теорию и задачками, можешь их тоже потихоньку решать, ближе к концу научишься как правильно сверстать эту форму: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
> он что-то не работает, когда запроса вида ... LIKE %:search%
У тебя и в SQL пробелы в знаниях. Смотри, то что мы подставляем через плейсхолдеры, вставляется в запрос в кавычках, напрмиер:
WHERE x = ? превратится в WHERE x = 'qwww'
Соответственно
LIKE %:search% превратится в LIKE %'abc'%
А это неправильно с точки зрения языка SQL так как проценты должны быть внутри строки, а не снаружи.
> Разве не должен быть код заключен в <?php ... ?>?
закрывающий маркер не обязателен: http://php.net/manual/ru/language.basic-syntax.phptags.php
> но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?
Ты когда на сайте регистрируешься вместо пароля тоже файмилию указываешь? Там должен быть уникальный код, который трудно подобрать. То есть что-то случайное вроде
dgsusgt76dstf76sfdssf
> Я уберу эту регулярку. когда будет type = 'emai'.
Вообще, проверка данных на клиенте (в браузере) не отменяет того что их надо проверять на сервере (в твоем скрипте) так как злоумышленник может прислать любые данные и мы должны проверять их на правильность прежде чем записывать в базу.
Насчет ошибки, может это из-за точки с запятой?
> Ух, блин, как много всего и все таки это сложно немного.
Не беда, со временем разберешься.
Вы наркоманы регулярки на HTML использовать? Тут нужен DOM или что-то аналогичное. Если ты не понимаешь что такое DOM, то изучи сначала.
надо решить это уравнение для k:
2k(k+1)(k+2) = 12n
http://ideone.com/000gUS
давай ещё. мне нра олимпиадки ;з
Уже, и не в первый раз.
Правда http://geektimes.ru/post/242306/
У меня пока работает.
Так как гитхаб на https то можно лишь заблокировать сайт целиком.
Если у кого-то из анонов не получается из-за этого решать задачки (например композер не может скачать библиотеку с гитхаба), вы можете попробовать использовать что-нибудь вроде этого http://antizapret.prostovpn.org/ Но советую включать эту штуку только на время, так как ее авторы получают доступ к вашему трафику, кто знает их реальные мотивы.
Алсо не понимаю, почему блокируют сайты с поддельными дипломами. Если это незаконно, можно провести операцию в реале и поймать продавцов. Если это pаконно, непонятно зачем блокировать. Видимо заблокировать все же проще чем кого-то ловить
Не хочу писать код, который потом буду переписывать или, в лучшем случае, пихать потом кусками. Хочу - написал регистрацию или отправлялку писем и добавляй там и сям по мере необходимости.
Хех, а я уже хотел было перебраться на руssкий vps за 200 рублей, но теперь передумал.
На VPS блокировки могут и не действовать.
>>412700
«модули» у меня ассоциируются с дурным подходом когда весь код сваливали в один файл и называли это модулем. Сейчас используется ООП и фреймворки, и боюсь, кратко это не объяснить. Посмотри например как в Сифмони 2 сделаны бандлы или расширения в Yii.
Там не сложение чисел, а поиск волшебной формулы. По твоей логике кабинетные поломойки должны иметь навыки промышленных альпинистов чтобы мыть окна в небоскребах. Нет, так не пойдет. Математик пусть решает теоремы, уравнения, ищет свои засранные формулы, а программист эти формулы программирует.
http://ideone.com/gRCXgq Почему столбики в таблице не выходят?
str_pad не поддерживает utf-8 и русские буквы. Не используй ее и прочитай вот этот мини-урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Если гитхаб не открывается, то вот копия текста: http://ideone.com/kBwfL9
А мультибайтовой аналогичной функции я так понял не завезли ещё :C
переделал тогда функции эти http://ideone.com/gRCXgq
>«модули» у меня ассоциируются с дурным подходом когда весь код сваливали в один файл и называли это модулем.
Хуйню пишешь, при этом про ооп заикаешься, ребенок.
Я совершенно не понимаю, как запоминать промежуточные вершины, куда их добавлять, грубо говоря, и как удалять, если оказалось, что она никуда не ведет. Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?
Абсолютно выбешивает, когда у тебя ничего не работает. Може кто-нибудь рассказать почему такая хрень происходит? Второй день уже
Начал немного разбираться с версткой?
http://jsfiddle.net/4ut95L7k/
Как сделать так что бы текст не вылазил за границы?
>>>411620
>Я вижу ты не очень знаешь яваскрипт. Не хочешь ли порешать наши задачки, которые помогут тебе исправить пробелы в знаниях? Я проверю решения и подскажу если ты где-то запутался: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
ОП, покажи, пожалуйста, пример, где выполняется та же самая задача только с заменой классов (речь идет о той, которая в этой ссылке http://jsfiddle.net/zybs794e/1/) Я не могу присвоить элементу "x" определенный стиль с цикле.
Не могу присвоить класс с нужным стилем, я имел ввиду.
Понял ты правильно, но по моему переусложнил решение.
Верно, для защиты используется какой-то код который передается с формой, индивидуальный для каждого пользователя, который не может подобрать злоумышленник.
Код можно получать как минимум 2 способами:
— генерировать код из IP-адреса. Недостаток в том, что если у человека динамический IP и отправка формы идет с другого IP, он получит ошибку. В мобильном интернете такое бывает, если например соединение разовралось и переподключилось заново пока человек выбирал файлы для загрузки.
— генерировать случайный код и сохранять его в куку (а если кука уже есть, то брать код из нее и продлевать ее время жизни)
Твой вариант с сессиями — это усложненный вариант с кукой (так как id сессии хранится в куке PHPSESSID). Не очень понятно, зачем городить сессии если можно явно выставить куку. Минус в том, что неактивные сессии по умолчанию удаляются через 15 минут, а в случае с кукой мы можем выставить длительность произвольно. Также, сессии могут вызывать интересные блокировки при использовании аякс-запросов: http://habrahabr.ru/company/bitrix/blog/179803/
Проблема блокировки актуальна только когда от одного плоьзователя идет одновременно несколько запросов и несколько скриптов пытаются открыть одну сессию — в таком случае скрипты заблокируются и будут выполняться по очереди. а не одновременно. В твоем проекте такой проблемы нет.
Потому правильнее было бы сделать наверно то на куках, но с сессией тоже можно.
Ну и в случае форм, которые можно отправить заново, при несовпадении CSRF токена с правильным, не надо выводить страшные надписи типа «фатальная ошибка», ведь может пользователь просто долго не отправлял форму или очистил куки в браузере. Надо просто вывести заполненную форму с сообщением, что прошло много времени и надо отправить форму повторно. У тебя заполненную форму вывести не получится, потому надо просто вывести сообщение.
А теперь поговорим про ошибки.
Во-первых, ты в случае несовпадения токена ты все равно принимаешь загруженный файл:
https://github.com/sqghub/uppu.ru/blob/master/index.php#L65
В чем смысл защиты, непонятно.
В случае комментария при ошибке можно бы и выводить форму заново. Сложно ли это сделать? Для этого наверно удобно код обработки пост-запроса на добавление комментария перенести в обработчик страницы /download/:fileId, чтобы было:
....
создать пустой объект Comment;
если (отправлена форма комментария) {
— прочитать данные из POST и заполнить объект Comment
— проверить все ли правильно
— если да, добавить комментарий и сделать редирект, выйти из функции
}
вывести страницу просмотра файла.
....
То есть обычно POST от формы обрабатывает тот же обработчик что и выводит форму. Тогда нам не приходится дублировать код ее вывода.
Вторая ошибка: ты постоянно перегенерируешь id на каждом запросе. А он должен быть постоянным. Представь: пользователь открыл вторую вкладку с твоим сайтом и в ней ходит по страницам. Он получит куку с новым значением id, и тот id который был в форме на первой вкладке станет неактуальным. комментарий из нее не примется и весь текст потеряется, придется вводить его заново.
Куки (и следовательно сессии) общие для всех вкладок с сайтом. Надо помнить об этом.
Ну и кстати, сделал ли ты валидацию комментария на сервере? чтобы пустой нельзя было добавить или слишком короткий например или слишком длинный.
Проверку и генерацию токена лучше сделать отдельными функциями, чтобы было вроде
if (!tokenIsValid(...)) {
...
}
Так читабельнее и так проще будет менять алгоритм проверки если что.
Что ты дальше хочешь делать? Какие планы?
Понял ты правильно, но по моему переусложнил решение.
Верно, для защиты используется какой-то код который передается с формой, индивидуальный для каждого пользователя, который не может подобрать злоумышленник.
Код можно получать как минимум 2 способами:
— генерировать код из IP-адреса. Недостаток в том, что если у человека динамический IP и отправка формы идет с другого IP, он получит ошибку. В мобильном интернете такое бывает, если например соединение разовралось и переподключилось заново пока человек выбирал файлы для загрузки.
— генерировать случайный код и сохранять его в куку (а если кука уже есть, то брать код из нее и продлевать ее время жизни)
Твой вариант с сессиями — это усложненный вариант с кукой (так как id сессии хранится в куке PHPSESSID). Не очень понятно, зачем городить сессии если можно явно выставить куку. Минус в том, что неактивные сессии по умолчанию удаляются через 15 минут, а в случае с кукой мы можем выставить длительность произвольно. Также, сессии могут вызывать интересные блокировки при использовании аякс-запросов: http://habrahabr.ru/company/bitrix/blog/179803/
Проблема блокировки актуальна только когда от одного плоьзователя идет одновременно несколько запросов и несколько скриптов пытаются открыть одну сессию — в таком случае скрипты заблокируются и будут выполняться по очереди. а не одновременно. В твоем проекте такой проблемы нет.
Потому правильнее было бы сделать наверно то на куках, но с сессией тоже можно.
Ну и в случае форм, которые можно отправить заново, при несовпадении CSRF токена с правильным, не надо выводить страшные надписи типа «фатальная ошибка», ведь может пользователь просто долго не отправлял форму или очистил куки в браузере. Надо просто вывести заполненную форму с сообщением, что прошло много времени и надо отправить форму повторно. У тебя заполненную форму вывести не получится, потому надо просто вывести сообщение.
А теперь поговорим про ошибки.
Во-первых, ты в случае несовпадения токена ты все равно принимаешь загруженный файл:
https://github.com/sqghub/uppu.ru/blob/master/index.php#L65
В чем смысл защиты, непонятно.
В случае комментария при ошибке можно бы и выводить форму заново. Сложно ли это сделать? Для этого наверно удобно код обработки пост-запроса на добавление комментария перенести в обработчик страницы /download/:fileId, чтобы было:
....
создать пустой объект Comment;
если (отправлена форма комментария) {
— прочитать данные из POST и заполнить объект Comment
— проверить все ли правильно
— если да, добавить комментарий и сделать редирект, выйти из функции
}
вывести страницу просмотра файла.
....
То есть обычно POST от формы обрабатывает тот же обработчик что и выводит форму. Тогда нам не приходится дублировать код ее вывода.
Вторая ошибка: ты постоянно перегенерируешь id на каждом запросе. А он должен быть постоянным. Представь: пользователь открыл вторую вкладку с твоим сайтом и в ней ходит по страницам. Он получит куку с новым значением id, и тот id который был в форме на первой вкладке станет неактуальным. комментарий из нее не примется и весь текст потеряется, придется вводить его заново.
Куки (и следовательно сессии) общие для всех вкладок с сайтом. Надо помнить об этом.
Ну и кстати, сделал ли ты валидацию комментария на сервере? чтобы пустой нельзя было добавить или слишком короткий например или слишком длинный.
Проверку и генерацию токена лучше сделать отдельными функциями, чтобы было вроде
if (!tokenIsValid(...)) {
...
}
Так читабельнее и так проще будет менять алгоритм проверки если что.
Что ты дальше хочешь делать? Какие планы?
Насчет отправки почты — есть тот же SwiftMailer, можно это не писать.
>>412741
> \t$count = $arg - mb_strlen($string);
> $space = str_repeat(' ', $count);
Если строка длинее чем arg то получится отрицательный count и функция str-repeat выдаст ошибку. Надо проверять что count > 0
В остальном все верно.
>>412781
> , как запоминать промежуточные вершины,
там используется очередь. Структура данных «очередь» напоминает настоящую очередь:
https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
Очередь можно реализовать разными способами. В случае PHP может быть массив (или объект встроенного в Php класса SplQueue если ты знаком с ООП). С очередью можно делать только 2 операции: добавить объект в очередь (вставить его в начало массив через array_unshift) или снять с другого конца очереди (вынуть из конца массива через array_pop). Таким образом, объекты из очереди вынимаются всегда в том же порядке что и вставлялись.
Вот описание очереди на SplQueue: http://habrahabr.ru/post/190176/
> куда их добавлять,
Новые найденные вершины добавляются в очередь
> и как удалять, если оказалось, что она никуда не ведет
Когда мы вынимаем очередную вершину для проверки, она удаляется из очереди. Если она никуда не ведет, ничего делать не надо — она уже и так удалена из очереди. Если она ведет в какие-то вершины то алгоритм добавит их в очередь и они позже будут проверены.
Главное, что тебе надо понять — что такое и как работает очередь. Тогда остальной алгоритм мне кажется станет понятнее.
> Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?
Тот пример проверяет есть ли путь из вершины A в вершину В но не возвращает как его пройти. Это можно сделать, суть доработав алгоритм (надо для каждой вершины также сохранять, откуда мы в нее пришли. Тогда мы сможем найдя вершину B восстановить путь).
Если у тебя есть еще вопросы по алгоритму, задавай.
Ну и если ты хочешь получше разобраться с графами и стеками, то у меня есть задачка: дан список программ, причем некоторые из них зависят от дургих (чтобы установить A надо сначала установить B и С). Надо вывести порядок, в котором требуется устанавливать программы. Если это невозможно, надо вывести соотвествующее сообщение.
Решение: гугли топологическая сортировка.
>>412671
Держи задачку выше про порядок установки программ.
Насчет отправки почты — есть тот же SwiftMailer, можно это не писать.
>>412741
> \t$count = $arg - mb_strlen($string);
> $space = str_repeat(' ', $count);
Если строка длинее чем arg то получится отрицательный count и функция str-repeat выдаст ошибку. Надо проверять что count > 0
В остальном все верно.
>>412781
> , как запоминать промежуточные вершины,
там используется очередь. Структура данных «очередь» напоминает настоящую очередь:
https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
Очередь можно реализовать разными способами. В случае PHP может быть массив (или объект встроенного в Php класса SplQueue если ты знаком с ООП). С очередью можно делать только 2 операции: добавить объект в очередь (вставить его в начало массив через array_unshift) или снять с другого конца очереди (вынуть из конца массива через array_pop). Таким образом, объекты из очереди вынимаются всегда в том же порядке что и вставлялись.
Вот описание очереди на SplQueue: http://habrahabr.ru/post/190176/
> куда их добавлять,
Новые найденные вершины добавляются в очередь
> и как удалять, если оказалось, что она никуда не ведет
Когда мы вынимаем очередную вершину для проверки, она удаляется из очереди. Если она никуда не ведет, ничего делать не надо — она уже и так удалена из очереди. Если она ведет в какие-то вершины то алгоритм добавит их в очередь и они позже будут проверены.
Главное, что тебе надо понять — что такое и как работает очередь. Тогда остальной алгоритм мне кажется станет понятнее.
> Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?
Тот пример проверяет есть ли путь из вершины A в вершину В но не возвращает как его пройти. Это можно сделать, суть доработав алгоритм (надо для каждой вершины также сохранять, откуда мы в нее пришли. Тогда мы сможем найдя вершину B восстановить путь).
Если у тебя есть еще вопросы по алгоритму, задавай.
Ну и если ты хочешь получше разобраться с графами и стеками, то у меня есть задачка: дан список программ, причем некоторые из них зависят от дургих (чтобы установить A надо сначала установить B и С). Надо вывести порядок, в котором требуется устанавливать программы. Если это невозможно, надо вывести соотвествующее сообщение.
Решение: гугли топологическая сортировка.
>>412671
Держи задачку выше про порядок установки программ.
Из-за точки с запятой в конце?
>>412803
Текст выходит из-за того, что браузер по умолчанию не разливает длинные слова. Чтобы заставить его это сделать, есть такие CSS свойства:
http://htmlbook.ru/css/word-break (работает в CSS3 и в ИЕ) — грубо разбивает слова если они не влезают.
В новых браузерах также есть свойство hyphens, которое не просто переносит слова в случайных местах, а делает это по правилам и добавляет дефис. Оно работает только в новых браузерах, если ты указал язык текста в HTML и если в браузер встроены правила для этого языка.
Вот статья: http://htmlbook.ru/blog/perenosy-slov
Нет не разобрался. Проблема все таже. Поскольку решил проблему с LIMIT, то думал что и с этим решу. Хрен там.
>>412886
Нет, просто переменные имелли тип строки, а не целого. А вот с LIKE хрень.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE 'Vasya'' at line 1 in C:\wamp\www\classes\StudentMapper.php on line 45
Точно такой же как у тебя, нет. Там есть задача на работу с CSS-классами: https://gist.github.com/codedokode/ce30e7a036f18f416ae0#1%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC%D0%B8 и в ходе ее решения надо уметь добавлять и удалять классы. По сути ты просто добваляешь/удаляешь слово из свойства className (это свойство описано например в учебнике learn.javascript.ru)
И есть задача на переключение кнопок средствами CSS3: https://gist.github.com/codedokode/58ebc90bd006baf4b35c#%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-11
Предполагается что ты делаешь какой-то класс, например, active для выделенной буквы, а при клике удаляешь этот класс у всех других букв и добавляешь на кликнутую.
Номер при этом передавать в функцию не обязательно, можно передавать this, который указывет на нажатый DOM элемент.
Также, ты в своем коде присваиваешь стиль выделенному элементу 5 раз подряд. Зачем? Может ты просто не понимаешь, как цикл работает? Если это так, тебе лучше сначала изучить сам яваскрипт и циклы. Вот неплохой учебник: http://learn.javascript.ru/
Вообще у тебя тебя вроде при клике все работает. Только вот код не очень хороший. Если ты его откуда-то скопировал, не понимая как он работает, и попытался подстроить под свои нужды, то это бессмысленно: в программировании такой подход не работает. Надо понимать что значит и делает каждая строчка.
Да нет, код писал сам, только в предыдущем треде спросил совета как всё в одну функцию уместить. И да, мне нужно, чтобы функция срабатывала при клике мыши.
Можно, но зачем? Это часто ведет к Sql инъекциям.
>>412908
А, понял. Ты забыл слово WHERE и т.д. Почитай про синтаксис SELECT и посмотри как там условия пишутся: http://phpclub.ru/mysql/doc/select.html
Надо писать SELECT x FROM y WHERE z LIKE t
Я вижу, ты плохо знаешь SQL. Не хочешь параллельно полезные задачки порешать? https://gist.github.com/codedokode/10539213
http://ideone.com/USPnCu
Когда вставляю всю статью идеон отказывается обрабатывать скрипт, поэтому вставил одну лишь часть. У меня получилось выделить только дату в формате число месяц год и месяц год, в случае с выбором просто года возникла проблема, вот регулярка:
$pattern="![0-9]?[0-9]? [A-Za-z]+ [0-9]{4}!";
Я не могу поставить ? перед [A-Za-z] а по другому не знаю как сделать
Ну в любом случае 5 раз подряд присваивать не надо стиль одному элементу.
Если тебе сложно сделать с классами, оставь как есть. Но имей в виду, что это довольно-таки плохо. Гораздо удобнее когда текущему элементу просто добавляется класс и можно как угодно через CSS настраивать его вид.
Хорошо. Ссылка у тебя надеюсь уже есть? Там во второй части, где задания на DOM, я думаю добавить задания с 4-5 возможность начинать использовать jQuery, надеюсь я успею это поправить пока ты решаешь более ранние задачи.
>>412918
А почему в коде пустые строки идут через одну и нет отступов? Неудобно же читать.
Любой мусор воспринимается как дата: http://ideone.com/ZoCupA
Зачем заменять названия месяцев 2 раза? Можно же так проверять, найти месяц и посмотреть каким он по счету идет в массиве?
> $rez['0']
зачем кавычки?
> for($i=0; $i<count($rez['0']); $i++) {
Тут уместнее foreach
> $time["$c"]
зачем тут кавычки?
Для работы с кириллицей и utf-8 в регулярку надо добавить флаг u
Спасибо. Я еще поработаю над классами. Дело в том, что я перерабатываю портфолио, которое делал аж весной и за которое меня зачмырили недавно на собеседовании. Учебники, конечно, хорошо, но я потерял ОЧЕНЬ много времени с HeadFirst Lab JS и jQuery, поэтому задачи выполняю практические, которые уже смогу интегрировать в портфолио. Но, конечно, да, зубы я обломал на кодинге.
>А почему в коде пустые строки идут через одну и нет отступов?
PHPformater так выдал, я попытался исправить.
>Любой мусор воспринимается как дата
Добавил пробел после года в регулярке, но проблемы это наверное не решило. Единственный вариант который приходит в голову это забить в регулярке список всех месяцев как варианты, или проверять перед занесением в массив $time есть таймстап или нет, но так наверное не правильно?
>Зачем заменять названия месяцев 2 раза?
Что бы в конце вывести на русском
Вот что вышло http://ideone.com/w6xamV
http://jsfiddle.net/dkvd325a/
Остальные задания будут отдельно, а то слишком много в одном месиве получается.
Приехали. WHERE же не обязательное условия.
SELECT FROM students;
Выведет к примеру все записи из таблицы, без всяких where.
Мне вчера на лекции по базам данных преподаватель рассказывал, что нужно джойнить таблицы, а условия прописывать в WHERE, а не в ON. Оп, где правда?
Оп, кстати, ушел. Выше пост. Теперь я понял в чем ошибка. Мне надо по полю искать WHERE firstName LIKE pattern.
Что значить джойнить?(прости за тупой вопрос).
Может у тебя есть идея как организовать поиск не по одному полю, а по всем?
>Что значить джойнить?(прости за тупой вопрос).
Использовать JOIN, очевидно.
>Может у тебя есть идея как организовать поиск не по одному полю, а по всем?
SELECT FROM `table` WHERE ((`field1`=:param) OR (`field2` = :param) OR (`field3` = :param)) чем не устраивает?
А, извини.
>>>SELECT FROM `table` WHERE ((`field1`=:param) OR (`field2` = :param) OR (`field3` = :param)) чем не устраивает?
Хм, наверное тем, что полей может быть с десяток, лол
Компактно как-то
Все равно не понимаю. С очередью более-менее разобрался, я не знал, что это просто синоним FIFO-структуры данных. Хотя я больше к стэкам привык. Но понятнее от этого не стало. Можешь вот в этом алгоритме
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83#PHP
вставить эту самую очередь, запоминающую последовательность вершин в кратчайшем пути? Без тебя, видимо, так и не разберусь.
http://jsfiddle.net/5t8awtk6/
В смысле одинаковые? Вес разный, например. Количество вершин между начальной и конечной в разных возможных путях разный. Но вообще это на то и алгоритм поиска кратчайшего пути, чтобы его искать. Только он возвращает саму возможность найти путь, а не этот путь.
Если вес разный, то тебе другой алгоритм нужен.
https://ru.wikipedia.org/wiki/Неинформированный_метод_поиска#UCS
Вроде бы такой.
Но для того display и придумали, что я ставлю inline-block и он теперь обтекается. Предыдущие пять заданий чуть выше.
Неверно. display: inline-block заставляет элемент снаружи выглядеть как inline элемент (а изнутри как block). inline-элементы выстраиваются горизонтально по строками. Где ты прочел про обтекание?
Также, div блочный элемент и значит блоки перед ним и после него расположены вертикально друг над другом.
Блочные элементы выстраиваются вертикально, а inline внутри них — гоизонтально по строчкам. При этом inline элементы из одного блока никак не влияют на другие. Ты не читал этот урок? http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
Если тебе так будет проще, то блочные и инлайновые элементы можно сравнить с абзацами и словами в них. Абзацы выстраиваются вертикально, а слова — горизонтально и переносятся по строчкам.
Нене, не в этом смысле, мне нужен именно поиск в ширину. Кратчайший путь имеется ввиду по количеству ребер от помеченной номером 1 вершины до n-ой, а в случае наличия одинаковых путей по длине - по нумерации ближайшей различающейся в двух путях вершины.
Мне кажется, ты зря берешь тот php код что там приведен. Он не очень понятный. Я думаю, тебе надо посмотреть на описание алгоритма в начале статьи и написать свой код по нему. Свой-то код всяко понятнее.
Алгоритм который под пунктом «Итеративная формулировка:».
Или ты в алгоритме пока что-то не понял? Если кратко, то надо сделать такой алгоритм:
пока очередь не пуста, берем вершину, находим всех е детей, добавляем их в очередь, повторяем с начала.
При этом мы ведем список уже посещенных вершин и никогда не добавляем добавленную ранее вершину в очередь второй раз.
>>412922
Имей в виду, тебе надо больше заниматься JS, так как он у тебя слабенький. Почитай например learn.javascript.ru
>>412925
Ты можешь извлекать регуляркой сочетания день/слово/год и проверять существующий это месяц или нет. Если нет — откидываем. Если да, то собираем дату из дня, номера месяца, года.
И соответственно тогда не нужен этот костыль с заменой месяцев, который к тому же не работает если месяц написан с большой буквы.
Также, год может быть только либо 2 либо 4 значным.
Также, не надо жестко задавать что между днем и месяцем ровно один пробел. Их может быть несколько.
Пробел после года — ненадежно, так как там может идти например запятая. Лучше проверять что нет цифр и букв.
Мне кажется, ты зря берешь тот php код что там приведен. Он не очень понятный. Я думаю, тебе надо посмотреть на описание алгоритма в начале статьи и написать свой код по нему. Свой-то код всяко понятнее.
Алгоритм который под пунктом «Итеративная формулировка:».
Или ты в алгоритме пока что-то не понял? Если кратко, то надо сделать такой алгоритм:
пока очередь не пуста, берем вершину, находим всех е детей, добавляем их в очередь, повторяем с начала.
При этом мы ведем список уже посещенных вершин и никогда не добавляем добавленную ранее вершину в очередь второй раз.
>>412922
Имей в виду, тебе надо больше заниматься JS, так как он у тебя слабенький. Почитай например learn.javascript.ru
>>412925
Ты можешь извлекать регуляркой сочетания день/слово/год и проверять существующий это месяц или нет. Если нет — откидываем. Если да, то собираем дату из дня, номера месяца, года.
И соответственно тогда не нужен этот костыль с заменой месяцев, который к тому же не работает если месяц написан с большой буквы.
Также, год может быть только либо 2 либо 4 значным.
Также, не надо жестко задавать что между днем и месяцем ровно один пробел. Их может быть несколько.
Пробел после года — ненадежно, так как там может идти например запятая. Лучше проверять что нет цифр и букв.
1
> <div class="task1 left">
> <b>
А зачем тут b? Если ты хочешь сделать шрифт жирным во всем блоке, ты можешь это без лишнего тега сделать. Все оформление должно задаваться в CSS, в HTML мы делаем только разметку текста по смыслу: что является заголовком, что в каком блоке расположено.
Можно использовать strong чтобы выделить несколько слов, но если весь абзац жирный — это не выделение, а это такой шрифт и не надо писать лишние теги.
Также, в задаче 1 блоки должны быть окружены тонкой черной рамкой.
> div.task1
Нет смысла писать тут div, так как это излишне. Да и какой смысл делать класс, который применим к определенному тегу? Это по моему только запутывает ситуацию. То есть тут лучше писать просто .task1
То же относится и к другим селекторам в CSS файле.
2
Нет черной рамки, нет полей 10px над и под текстом.
> font-size: 14px
Когда задаешь размер шрифта надо тут же задавать line-height. Если не знаешь что поствить ставь 1.2 - 1.4
В остальном верно.
3
> span.task3
> div.task3
Не надо так, один класс ведет себя по разному на разных тегах. Это создает путаницу. Сделай 2 разных класса или тег типа em. Тем более в условии написано:
> из тегов можно использовать только <em>
Также, не хватает стрелочки вправо. Также надо задать line-height.
> font-family: Times;
Надо писать "Times New Roman", так же в конце списка шрифтов надо всегда писать один из стандартных: http://htmlbook.ru/css/font-family
4
> div.task4 {
Имена классов конечно ужасные, лучше бы писал block или как-то так, а в CSS
.task4 .block { ... }
По тегу b то же самое что и в первом задании: он тут не нужен. Тем более, внутрь инлайновых тегов нельзя вкладывать блочные (br). Тебе даже jsfiddle это красным цветом показывает.
Между желтыми блоками должно быть 10px, у тебя меньше. В задании есть ссылка на полезную статью на эту тему.
Шрифт должен быть без засечек, типа Arial или можно просто sans-serif.
Рамка должна быть тоньше, не 2px, а 1.
5
Тут только убери теги из селекторов и думаю все будет верно.
1
> <div class="task1 left">
> <b>
А зачем тут b? Если ты хочешь сделать шрифт жирным во всем блоке, ты можешь это без лишнего тега сделать. Все оформление должно задаваться в CSS, в HTML мы делаем только разметку текста по смыслу: что является заголовком, что в каком блоке расположено.
Можно использовать strong чтобы выделить несколько слов, но если весь абзац жирный — это не выделение, а это такой шрифт и не надо писать лишние теги.
Также, в задаче 1 блоки должны быть окружены тонкой черной рамкой.
> div.task1
Нет смысла писать тут div, так как это излишне. Да и какой смысл делать класс, который применим к определенному тегу? Это по моему только запутывает ситуацию. То есть тут лучше писать просто .task1
То же относится и к другим селекторам в CSS файле.
2
Нет черной рамки, нет полей 10px над и под текстом.
> font-size: 14px
Когда задаешь размер шрифта надо тут же задавать line-height. Если не знаешь что поствить ставь 1.2 - 1.4
В остальном верно.
3
> span.task3
> div.task3
Не надо так, один класс ведет себя по разному на разных тегах. Это создает путаницу. Сделай 2 разных класса или тег типа em. Тем более в условии написано:
> из тегов можно использовать только <em>
Также, не хватает стрелочки вправо. Также надо задать line-height.
> font-family: Times;
Надо писать "Times New Roman", так же в конце списка шрифтов надо всегда писать один из стандартных: http://htmlbook.ru/css/font-family
4
> div.task4 {
Имена классов конечно ужасные, лучше бы писал block или как-то так, а в CSS
.task4 .block { ... }
По тегу b то же самое что и в первом задании: он тут не нужен. Тем более, внутрь инлайновых тегов нельзя вкладывать блочные (br). Тебе даже jsfiddle это красным цветом показывает.
Между желтыми блоками должно быть 10px, у тебя меньше. В задании есть ссылка на полезную статью на эту тему.
Шрифт должен быть без засечек, типа Arial или можно просто sans-serif.
Рамка должна быть тоньше, не 2px, а 1.
5
Тут только убери теги из селекторов и думаю все будет верно.
Ты не понял. Ты либо не пишешь WHERE и не пишешь условия выборки типа LIKE либо пишешь и то и другое.
Почитай еще раз про синтаксис SELECT.
>>412934
Если используется обычный JOIN то условие в ON равносильно WHERE. Если LEFT JOIN то очевидно нет.
Я считаю, логичнее условия джойна прописывать в ON для наглядности, чтобы при чтении отделить условия объединения от условий фильтрации. Преподавателю видимо нравится по-другому писать.
Так что думаю это скорее дело вкуса.
>>412936
Объединять таблицы. В моем уроке по SQL ( https://gist.github.com/codedokode/10539213 ) есть очень хорошая ссылка вот на этот урок: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Я советую прочитать его (начиная с первой части конечно), там много полезного, а что такое джойны надо разумеется знать чтобы испьзовать базы данных.
Ну и потом советую решить задачки из моего урока.
> как организовать поиск не по одному полю, а по всем?
В твоем случае проще всего через OR перечисить все поля.
>>412942
Проще вписать десяток чем прикручивать сторонние поисковые движки вроде sphinx.
>>412988
если (есть кука) {
выдать заголовок location на нужную страницу;
завершить скрипт;
}
>>412997
Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.
Ты не понял. Ты либо не пишешь WHERE и не пишешь условия выборки типа LIKE либо пишешь и то и другое.
Почитай еще раз про синтаксис SELECT.
>>412934
Если используется обычный JOIN то условие в ON равносильно WHERE. Если LEFT JOIN то очевидно нет.
Я считаю, логичнее условия джойна прописывать в ON для наглядности, чтобы при чтении отделить условия объединения от условий фильтрации. Преподавателю видимо нравится по-другому писать.
Так что думаю это скорее дело вкуса.
>>412936
Объединять таблицы. В моем уроке по SQL ( https://gist.github.com/codedokode/10539213 ) есть очень хорошая ссылка вот на этот урок: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Я советую прочитать его (начиная с первой части конечно), там много полезного, а что такое джойны надо разумеется знать чтобы испьзовать базы данных.
Ну и потом советую решить задачки из моего урока.
> как организовать поиск не по одному полю, а по всем?
В твоем случае проще всего через OR перечисить все поля.
>>412942
Проще вписать десяток чем прикручивать сторонние поисковые движки вроде sphinx.
>>412988
если (есть кука) {
выдать заголовок location на нужную страницу;
завершить скрипт;
}
>>412997
Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.
Сразу же ошибки:
> .article div p{
> display: inline-block;
Очень странный код. Во-первых, абзацы должны идти вертикально, для них самое уместно это display block.
Во-вторых. ты применяешь правило ( margin: 10px 10px 10px 10px; ) только к абзацам, а в тексте могут быть списки, таблицы, картинки. Ты делаешь это неправильно. Если ты хочешь сделать поля справа и слева их надо делать паддингом на родителе, маргин предназначен для отталкивания элементов друг от друга.
Не расстраивайся. попробуй написать код сам, если ты алгоритм понял. Если не понял, задавай еще вопросы, будем разбирать постепенно, пока не поймем.
Можно как-то без SELECT обойтись? Я почитал, там какая-то ракетная математика.
>Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.
http://jsfiddle.net/5t8awtk6/
Я тут попробовал.
>Мне одному кажется, что треды улетат в лимит ну очень быстро?
Ну так хорошо же.
>Я даже уже боюсь открывать его просто так, ибо очень много кто пишет, и за день копится столько постов, что уже просто нереально разобраться в написанном.
Добавь в избранное, сразу видно сколько постов ты пропустил и при клике на тред в избранном он загружается с новых постов
http://ideone.com/W1Mhat
Доделал, ну сейчас чувствую даже некоторое облегчение когда классы для меня стали более понятны с практической точки зрения.
По JS остановился на задаче №10, ты говорил переделать чтобы было без for in, я переделал но не помню показывал или нет, в общем вот: http://jsfiddle.net/b3z8jtxn/1/
По php у меня была ошибка в задаче про айфон в кредит, переделал: http://ideone.com/DZiCBU
По это задаче ты сказал пикрелейтед. У меня получилось совпадение при долге в 1000, но я не понимаю почему при долге в 4000 ты говоришь что должно получится выплата в 6123. Ведь это получается что 4000(умножить)1.03+1000 = 5120. Соответственно непонятно, почему при изначальных условия задачи общие выплаты должны бытьпримерно 61270. Случайно нагугленный кредитный калькулятор показал почти ту же сумму, что вышла у меня. Такие дела.
и по какому принципу я мог бы обойти все страницы сайта?
Задача по JS №11: http://jsfiddle.net/b4661fvm/1/
>>413256
Я не ОП, но делал подобное.
>Оп, скажи, будь милостив к рабу своему, возможно ли написать скрипт, который парсил бы определенный сайт и слизывал оттуда цены в какую-то таблицу?
Да
>реально ли это реализовать через регулярные выражения?
Вполне
>и по какому принципу я мог бы обойти все страницы сайта?
Ну самое простое, посмотри разметку пагинации нужной страницы, лови ее регуляркой и подставляй в file_get_contents,() ну или если количество страниц уже известной, можешь просто в цикле обходить.
У тебя задача не верно решена. Шутка в том, что у опа в формуле ошибка, ты с ней никак не посчитаешь правильно. Суть в том, что сначала ты должен начислять проценты и сервисную плату, и уже только потом проверять какой баланс и делать выплаты.
Да и сам подумай, как ты за месяц мог выплатить 5120 рублей, когда у тебя в месяц доступно лишь 5000?
>>413262
Большое спасибо, анон, за подсказку. Печально конечно что сам не дошел до этого. Переделал, теперь все вышло как ОП говорит: http://ideone.com/DZiCBU
Скачал и понял, что не знаю, как его сделать, чтоб он заработал в Yii. Куда кидать, че прописывать?
В модели у меня, оказывается, уже прописаны связи многие-ко-многим. Модель настраивать не нужно
Если анону нравится notepad++ путь пользуется, по сути огромной разницы с Sublime нет. Вот если на IDE переходить то да, разница будет.
>>413277
Chosen не написан специально для Yii и никак специально устанавливать его не надо. Все надо сделать самому.
Кинуть надо куда-то в папку для статики и подключить стандартными средствами Yii.
Чуть-чуть упомянуто тут: http://yiiframework.ru/doc/cookbook/ru/core.assets
http://habrahabr.ru/post/139166/
Ссылка на скрипт вставляется через Yii::app()->clientScript->registerScriptFile или Chtml::asset
Ты можешь и не использовать систему управления статикой, а например создать папочку js в корне сайта и распаковать chosen туда. Но тогда ты лишаешься возможностей по централизованному управлению статическими файлами, там наверняка их можно склеивать, изменять путь при обновлении файла ит.д.
Chosen надо распаковать конечно в отдельную папку. Ни в коем случае не перемешивай файлы внешних библиотек и не правь их.
Это было про то как установить. А как подключить, написано на сайте по ссылке. Ты создаешь например select или select multiple, вызваешь chosen и он превратит его в выпадающий список. Постарайся сделать это так, чтобы страница не прыгала при загрузке.
Соответственно если ты хочешь выбирать граппу, тебе надо сделать select multiple со списокм всех групп. А на сервере ты получишь id выбранных групп и сможешь их добавить.
Chosen удобен тем что ты можешь набрать только часть названия группы и он выдаст подсказку.
Недостаток в том что больше 100-300 групп в него запихнуть нельзя: страница станет слишком тяжелая (ведь все эти группы перечислены в ней). Если у тебя больше групп, то надо сделать полноценный автокомплит, когда на сервер отправляется набранный текст, а с сервера приходит список соответствующих ему групп.
Гугление по слвоам «chosen ajax autocomplete» показывает, что эта проблема уже решена и добрые
люди написали дополнение к chosen чтобы он мог брать результаты с сервера:
https://github.com/meltingice/ajax-chosen
https://github.com/ksykulev/chosen-ajax-addition
Опять же тут ничего специально для Юи не написано, надо разобраться и прикрутить это самому.
Искать на сервере можно запросом:
WHERE name LIKE 'текст%' — такой запрос может использовать индекс по полю name, но ищет только по началу названия.
Если ты будешь исплоьзовать условие WHERE name LIKE '%текст%' то он будет искать и по середине слова, ео без индекса, скорее всего медленно. Чтобы искать по середине названия быстро, надо подключать движки вроде Sphinx или хотя бы полнотекстовый индекс в MySQL.
Зато если ты справишься, у тебя будет удобный выбор групп.
Ну или ты можешь погуглить, может для связи многие ко многим есть готовые решения для Yii.
Если анону нравится notepad++ путь пользуется, по сути огромной разницы с Sublime нет. Вот если на IDE переходить то да, разница будет.
>>413277
Chosen не написан специально для Yii и никак специально устанавливать его не надо. Все надо сделать самому.
Кинуть надо куда-то в папку для статики и подключить стандартными средствами Yii.
Чуть-чуть упомянуто тут: http://yiiframework.ru/doc/cookbook/ru/core.assets
http://habrahabr.ru/post/139166/
Ссылка на скрипт вставляется через Yii::app()->clientScript->registerScriptFile или Chtml::asset
Ты можешь и не использовать систему управления статикой, а например создать папочку js в корне сайта и распаковать chosen туда. Но тогда ты лишаешься возможностей по централизованному управлению статическими файлами, там наверняка их можно склеивать, изменять путь при обновлении файла ит.д.
Chosen надо распаковать конечно в отдельную папку. Ни в коем случае не перемешивай файлы внешних библиотек и не правь их.
Это было про то как установить. А как подключить, написано на сайте по ссылке. Ты создаешь например select или select multiple, вызваешь chosen и он превратит его в выпадающий список. Постарайся сделать это так, чтобы страница не прыгала при загрузке.
Соответственно если ты хочешь выбирать граппу, тебе надо сделать select multiple со списокм всех групп. А на сервере ты получишь id выбранных групп и сможешь их добавить.
Chosen удобен тем что ты можешь набрать только часть названия группы и он выдаст подсказку.
Недостаток в том что больше 100-300 групп в него запихнуть нельзя: страница станет слишком тяжелая (ведь все эти группы перечислены в ней). Если у тебя больше групп, то надо сделать полноценный автокомплит, когда на сервер отправляется набранный текст, а с сервера приходит список соответствующих ему групп.
Гугление по слвоам «chosen ajax autocomplete» показывает, что эта проблема уже решена и добрые
люди написали дополнение к chosen чтобы он мог брать результаты с сервера:
https://github.com/meltingice/ajax-chosen
https://github.com/ksykulev/chosen-ajax-addition
Опять же тут ничего специально для Юи не написано, надо разобраться и прикрутить это самому.
Искать на сервере можно запросом:
WHERE name LIKE 'текст%' — такой запрос может использовать индекс по полю name, но ищет только по началу названия.
Если ты будешь исплоьзовать условие WHERE name LIKE '%текст%' то он будет искать и по середине слова, ео без индекса, скорее всего медленно. Чтобы искать по середине названия быстро, надо подключать движки вроде Sphinx или хотя бы полнотекстовый индекс в MySQL.
Зато если ты справишься, у тебя будет удобный выбор групп.
Ну или ты можешь погуглить, может для связи многие ко многим есть готовые решения для Yii.
> как правильно сделать в представлении поле из другой таблици.
Если групп мало, надо выводить select multiple со списком всех групп и среди них отметить выбранные, стандартными средствами html.
Изучи сначала HTML: http://htmlbook.ru/html/select
Потом изучи соотв. хелпер в Юи для генерации селекта: http://www.yiiframework.com/doc/api/1.1/CHtml#listBox-detail (заметь что там есть функция listData для генерации списка групп из модели)
Напомню, это если групп немного. Если групп много, надо разбираться с аякс версией chosen. Причем если ты хочешь отображать выбранные ранее группы, тут тоже придется разобраться как эт делать.
Нет никакой математики. Во-первых, читал ли ты все 3 урока из этого цикла постов? Если нет, иди читай: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Во-вторых, читал ли ты это: http://www.pyramidin.narod.ru/rusql/ch3.html ? Прочитай, этот учебник написан по моему простым языком.
Если ты прочел и что-то не понял, задавай вопросы. Без умения написать SELECT можешь считать что ты вообще базы данных не знаешь.
Ну и конечно советую тебе изчать базы данных более серьезно и проверить свои знания решением задачек отсюда: https://gist.github.com/codedokode/10539213
Без знания баз данных, как ты собираешься делать сайты? Все динамические сайты используют базы данных. К тому же тебя никто не бросает один на один с мануалами: если что-то непонятно, всегда можно у меня спросить.
6
У тебя меню не слева от текста, и рамки странные, не как на картинке, и цвета не те.
Если ты рамками пытаешься определить размеры элементов, я тебе советую освоить инспектор (Ctrl + Shift + I) — он все это позволяет изучать гораздо удобнее. он показывает размеры элементов и примененные к ним CSS правила.
Насчет того, как надо сделать, посмотри примеры тут:
http://www.456bereastreet.com/lab/developing_with_web_standards/csslayout/2-col/finished.html
и тут http://www.maxdesign.com.au/articles/css-layouts/
Разберись как там сделано (инспектор тебе поможет).
> .article div p{
> display: inline-block;
Это непраивльно. Абзацы выстраиваются друг над другом ветикально и для них надо использовать display block. Ну сам подумай, в твоем варианте они должны что ли горизонтально выстраиваться? Бред же.
> .menu ul {
> display: inline-block;
Неправильно. inline-block позвляет нам выстроить 2 блока горизонтально, это верно. Мы могли бы теоретически сделать .menu (а не .menu ul) и .article (а не .article p, я не понимаю, почему ты так решил) оба инлайн-блоками и расположить так:
.menu | .article
Но тут есть один недостаток: для инлайн-блока мы не можем никак задать ширину в виде «100% - 230px» как требуется в задании. Inline-block позволяет задать ширину только 2 способами:
— по ширине содержимого (у нас там много текста и он растянет блок на 100% потому не годится)
— явно, в пикселях или процентах например. Тоже не подходит
Здесь нужно использовать флоаты. Основной текст мы можем отбить от левого края за счет маргина. Меню мы можем вынести вбок за счет флоата.
Тебе надо больше решать задачек на флоаты, я вижу ты не разбираешься в этой теме.
6
У тебя меню не слева от текста, и рамки странные, не как на картинке, и цвета не те.
Если ты рамками пытаешься определить размеры элементов, я тебе советую освоить инспектор (Ctrl + Shift + I) — он все это позволяет изучать гораздо удобнее. он показывает размеры элементов и примененные к ним CSS правила.
Насчет того, как надо сделать, посмотри примеры тут:
http://www.456bereastreet.com/lab/developing_with_web_standards/csslayout/2-col/finished.html
и тут http://www.maxdesign.com.au/articles/css-layouts/
Разберись как там сделано (инспектор тебе поможет).
> .article div p{
> display: inline-block;
Это непраивльно. Абзацы выстраиваются друг над другом ветикально и для них надо использовать display block. Ну сам подумай, в твоем варианте они должны что ли горизонтально выстраиваться? Бред же.
> .menu ul {
> display: inline-block;
Неправильно. inline-block позвляет нам выстроить 2 блока горизонтально, это верно. Мы могли бы теоретически сделать .menu (а не .menu ul) и .article (а не .article p, я не понимаю, почему ты так решил) оба инлайн-блоками и расположить так:
.menu | .article
Но тут есть один недостаток: для инлайн-блока мы не можем никак задать ширину в виде «100% - 230px» как требуется в задании. Inline-block позволяет задать ширину только 2 способами:
— по ширине содержимого (у нас там много текста и он растянет блок на 100% потому не годится)
— явно, в пикселях или процентах например. Тоже не подходит
Здесь нужно использовать флоаты. Основной текст мы можем отбить от левого края за счет маргина. Меню мы можем вынести вбок за счет флоата.
Тебе надо больше решать задачек на флоаты, я вижу ты не разбираешься в этой теме.
А мне это не только читать, но и отвечать надо.
>>413219
Отлично. Решай задачи дальше, там еще про вектор есть и сложная задача про кошек-мышек.
>>413234
Ну здравствуй. Давай посмотрим что ты там сделал.
> задаче №10
Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.
> Ведь это получается что 4000(умножить)1.03+1000 = 5120.
Ну так выплатить 5120 ты неможешь, ты платишь 5000, а за месяц на 120 добавляется еще процент и комиссия. ты думаешь банк так просто откажется от своей прибыли?
>>413256
Да, возможно. Хотя парсить HTML лучше не регулярками. а DOM и Xpath.
> и по какому принципу я мог бы обойти все страницы сайта?
Ищешь все ссылки на странице, переводишь относительные ссылки в абсолютные, добавляешь в список те, которых там еще нет. И так для каждой страницы.
Алсо, многие сайты банят ботов, кто пытается их агрессивно парсить, имей в виду, может тебе лучше сразу отказаться от своей затеи.
>>413258
> var cities = {
> "Токио — Иокогама" : 37555,
Лучше бы хранить массивом, мне кажется, так:
var cities = [
{ name: "Токио", population: 3755 },
....
Так как тогда мы получаем список однотипных объектов. И вот это вот
> for(key in array) {
> arTmp.push(array[key]);
Будет не нужно.
Также, преимущество в том что тогда ты сможешь исользовать встроенную в JS функцию sort а не писать свою пузырьковую неэффективную сортировку.
Также, надо вывести результат в нормальном виде, с названиями городов.
Ну и как я написал выше, давай не будем тут изобретать велосипед и иcпользуем функцию sort.Уметь написать пузырьковую сортировку — это хорошо, но тут лучше исплоьзовать встроенную функцию.
sort умеет сортировать массивы по произвольному критерию, если ей передать функцию сравнения.
> document.getElementById("result").
Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.
> for (var k = 0; k < num; k++) {
> arResult.push(arTmp[k]);
Почитай про метод slice.
Вообще, я вижу ты не знаешь про стандартные методы у массивов. Изучи-ка статьи
http://learn.javascript.ru/array-methods
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array
Ну и вообще, эта задача строчек в 5 решается на стандартных функциях.
А мне это не только читать, но и отвечать надо.
>>413219
Отлично. Решай задачи дальше, там еще про вектор есть и сложная задача про кошек-мышек.
>>413234
Ну здравствуй. Давай посмотрим что ты там сделал.
> задаче №10
Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.
> Ведь это получается что 4000(умножить)1.03+1000 = 5120.
Ну так выплатить 5120 ты неможешь, ты платишь 5000, а за месяц на 120 добавляется еще процент и комиссия. ты думаешь банк так просто откажется от своей прибыли?
>>413256
Да, возможно. Хотя парсить HTML лучше не регулярками. а DOM и Xpath.
> и по какому принципу я мог бы обойти все страницы сайта?
Ищешь все ссылки на странице, переводишь относительные ссылки в абсолютные, добавляешь в список те, которых там еще нет. И так для каждой страницы.
Алсо, многие сайты банят ботов, кто пытается их агрессивно парсить, имей в виду, может тебе лучше сразу отказаться от своей затеи.
>>413258
> var cities = {
> "Токио — Иокогама" : 37555,
Лучше бы хранить массивом, мне кажется, так:
var cities = [
{ name: "Токио", population: 3755 },
....
Так как тогда мы получаем список однотипных объектов. И вот это вот
> for(key in array) {
> arTmp.push(array[key]);
Будет не нужно.
Также, преимущество в том что тогда ты сможешь исользовать встроенную в JS функцию sort а не писать свою пузырьковую неэффективную сортировку.
Также, надо вывести результат в нормальном виде, с названиями городов.
Ну и как я написал выше, давай не будем тут изобретать велосипед и иcпользуем функцию sort.Уметь написать пузырьковую сортировку — это хорошо, но тут лучше исплоьзовать встроенную функцию.
sort умеет сортировать массивы по произвольному критерию, если ей передать функцию сравнения.
> document.getElementById("result").
Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.
> for (var k = 0; k < num; k++) {
> arResult.push(arTmp[k]);
Почитай про метод slice.
Вообще, я вижу ты не знаешь про стандартные методы у массивов. Изучи-ка статьи
http://learn.javascript.ru/array-methods
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array
Ну и вообще, эта задача строчек в 5 решается на стандартных функциях.
> у опа в формуле ошибка
Верно. Там специально написан ннправильный код, чтобы вы не копировали его бездумно.
>>413274
> \t$paymentTotal = $paymentTotal + $creditBalance;
Почему не хочешь использовать более короткую запись через += ?
> if ($creditBalance < 0) {
А если он равен нулю, а не меньше нуля? Продолжаем платить?
> if ($creditBalance < $monthlyPayment) {
Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:
выплата = меньшее из чисел (остаток долга, 5000)
уменьшаем долг на выплату;
добавляем выплату к общей сумме;
Попробуй так записать код.
>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:
Да здесь уже кто-то догадался так сделать, помню он скидывал сюда код, еще кто-то спрашивал "зачем там min".
Смысл? Я уже знаю как это реализовывать. Ну может завтра запилю от нечего делать.
Неправильно выразился. Мне не нечего делать, я прокрастинирую в этом треде, занимаясь всякой ерундой и подсказывая по мелочи анонам. У меня еще даже кошки мышки не решены.
Ну ок, прокрастинируй, у нас тут никакого расписания нет, кому как удобно тот так и решает задачки.
https://codebabes.com/ ?
По моему забавная хрень, только курсы медленно появляются.
Интересная ссылка. Видео у них хорошо смонтировано, и, что важно, код печатается огромными буквами.
Правда, там ничего не рассказывается про настройку сервера и PHP (то есть начинающий может быть и не сможет это все повторить) и надо знать HTML прежде чем браться за PHP.
Ну и создание файла через touch к консоли тоже как минимум под одной ОС работать не будет. Да и непонятно начинающему, и это никак не поясняют.
Ну и я не понимаю зачем они просят деньги за пропуск тестов. Ты же ничего не запомнишь так?
Также, при ошибке они не пишут где в тесте ошибка и само сообщение сделано лиловым по оранжевому.
Алсо, я не понял, а там тян-ведущая будет раздеваться что ли? Это же наверно отвлекает от изучения PHP. Ну и ученицам-тянам наверно не очень интересно будет.
$a = "ue34, 4y3, 4yt4we,";
$b = "43wt5, 235, 2v, 4y3,";
preg_match_all("/[A-Za-z_0-9]{1,10}/i", $a, $matches);
preg_match_all("/[A-Za-z_0-9]{1,10}/i", $b, $matches2);
foreach ($matches as $key => $value) {
if (in_array($value, $matches2)) {
echo $value;
}
}
Большое спаcибо.
Интересно, как ты к $workers обращаешься в последней строке, когда это локальная переменная функции? И в то же время, ты вызываешь функцию doShit но результат никуда не записываешь, от того твой вызов бесполезен. С функциями у тебя пробел знаний, который нужно восполнить.
http://ideone.com/epNyPd
Упс, точно, я всё смотрел внутрь функции, что вроде и массив создан, и переменные переданы в конструктор и объект создан и массиву присвоен новый объект и возвратил значение массива и на автомате уже просто вызвал функцию :<
Спасибо
Суть в том, что просто посчитать количество записей, и функцией ранд выбрать одну - не катит, ибо "случайные данные" нужно сделать строго по определенному полю.
Вынести это поле в отдельную таблицу тоже не катит, ибо получится миллион таблиц (полей много)
Если делать через ORDER BY RAND, то это же пиздец слоупочно получается (а быстродействие очень важно)
Есть еще вариант - делать выборку всех данных, а потом в массиве делать ранд... Но это похоже не сильно от ORDER BY RAND отличается.
Вообщем, как быть?
а что если делать order by 1 where поле без rand, заранее подсчитав количество записей для этого поля? Это самый оптимальный вариант?
Как можно лучше сделать?
PHP Parse error: syntax error, unexpected 'if' (T_IF) in /home/DKTtvT/prog.php on line 3
Не понимаю сути ошибки, синтаксически же всё верно!
Лол! Никогда не делал таких ошибок, люто проиграл.
Вот из-за таких пидарасов, как ты, сюда и заходить не хочется.
Если на хтмлях рисовать, то можно вот эту либу глянуть http://libcanvas.github.io/
Токены унес в куки. Ну и попробовал тексты комментариев сохранять в случае ошибки. Вышло как-то сложновато.
проверьте ньюфага...
Кокой ты. Не хочешь - не заходи, кого оно ебёт, твое желание или нежелание.
Я всё. Фрактал — это цикл в цикле. Ещё можно поиграться с переменными i+1 и захуяить ещё больше циклов в цикле.
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /var/www/test.php on line 92
Warning: file_get_contents(): Failed to enable crypto in /var/www/test.php on line 92
Warning: file_get_contents(https://ya.ru/): failed to open stream: operation failed in /var/www/test.php on line 92
wtf??
Подожди, ванги проснутся, посмотрят что у тебя на 92 строке и ответят.
>>Warning: file_get_contents(https://ya.ru/): failed to open stream: operation failed in /var/www/test.php on line 92
>>Warning: file_get_contents(https://ya.ru/)
3 недели назад над банкоматом 3 дня тупил
Неплохо, а я таблицу так и не смог выравнить, хотя функцию написал и она работала в предыдущей задаче.
А ты чем пользовался? случайно не str_pad? мне тут рассказали выше в треде - что она плохо работает с мультибайтовыми кодировками, и я её переписал с помощью mb_strlen и формулы для дополнения вручную
Нет же, я же говорю сам написал. В самой первой задаче так и говорится: самому написать функцию которая выравнивает строки.
Помню это ощущение.
Совладай с черепашкой. Нарисуй зигзаг, квадрат, круг, звезду, а дальше экспериментируй со значениями: https://ideone.com/rmTNQm
for i in range(1) : — количество повторов.
t.forward(Х) — делает шаг.
t.left(-45) — поворачивается. Кстати, значение ничем не отличается от t.right(45)
https://docs.python.org/2/library/turtle.html
Я помню в школе на информатике нашел какую-то программу для детей, связанную с програмированием где надо было двигать черепаху. Это случайно не оно?
бамп
Правда. Очевидно нужен, раз существует.
> Пока что думаю хранить в куках логин в открытом виде и логин в зашифрованом.
Можно использовать подпись, которая считается по формуле:
подпись = хеш-функция(секретный пароль . открытый логин)
В качестве хеш-функции можно взять md5 или sha1. Злоумышленние не знает секретный пароль и не может подделать подпись.
>>413710
Программированием на PHP и JS.
>>413714
Узнаешь чему равен например MAX(id). затем берешь случайное число от 1 до MAX(id) и берешь первую запись, с id равным или больше этого числа. Этот запрос пойдет по индексу если правильно написать.
Минус — распределение получается неравномерным если в id есть дыры. Если у нас id идут как 1..100, 300..400 то 300 будет выпадать очень часто.
Если данные меняются не очень часто то можно избежать проблемы дыр, сделав дополнительное поле и например каждую ночь перепроставляя его значения по возрастанию.
Вот подробный анализ способов: http://jan.kneschke.de/projects/mysql/order-by-rand/ (англ)
Вообще, аноны, обратите внимание на этот вопрос, такие любят спрашивать на собеседовании. Никогда не используйте ORDER BY rand так как этот способ вытяивает всю таблицу в память (а если записей много то во временный файл который очеь медленный) и в памяти/файле долго сортирует.
https://ideone.com/dIgULE
http://ideone.com/6OK75p
https://ideone.com/YmIsO2
Сделал? Ну молодец, давай проверим код.
Я вижу что например номера вроде +79001234567 не пройдут.
Ты зря определил что код города может быть ровно 3 цифры. В маленьких городах код города может быть 4 или 5 цифр. лучше просто разрешить скобкам появляться в любом месте номера.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек! Давай-ка научимся основам автоматического тестирования и заставим железяку проверять саму себя.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
Добавь эти номера и код, который их проверяет. Я вижу, что некоторые из них сейчас не распознаются.
>>413774
Там ниже черепашку советуют. Но еcть и другие варианты:
— в php: gd или imagemagick (если ты под виндой то замучаешься устанавливать imagemagick)
— в JS: исопльзовать канвас: http://habrahabr.ru/post/111308/
Код на JS работает в любом современном браузере, для PHP нужен сервер например Апач, и сам PHP.
Вот люди деревья рисуют на JS: http://habrahabr.ru/post/210614/
Сделал? Ну молодец, давай проверим код.
Я вижу что например номера вроде +79001234567 не пройдут.
Ты зря определил что код города может быть ровно 3 цифры. В маленьких городах код города может быть 4 или 5 цифр. лучше просто разрешить скобкам появляться в любом месте номера.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек! Давай-ка научимся основам автоматического тестирования и заставим железяку проверять саму себя.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
Добавь эти номера и код, который их проверяет. Я вижу, что некоторые из них сейчас не распознаются.
>>413774
Там ниже черепашку советуют. Но еcть и другие варианты:
— в php: gd или imagemagick (если ты под виндой то замучаешься устанавливать imagemagick)
— в JS: исопльзовать канвас: http://habrahabr.ru/post/111308/
Код на JS работает в любом современном браузере, для PHP нужен сервер например Апач, и сам PHP.
Вот люди деревья рисуют на JS: http://habrahabr.ru/post/210614/
Ничего, только что-то линии пикселизованные. Ну и если в библиотеке есть режим «исключающее или», XOR — попробуй включить, будет куда веселее так как в этом режиме на пересечении линий появляется белая точка.
>>413828
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L57
Валидацию лучше сделать отдельной функцией в Comment или CommentMapper (где именно? выше уже обсуждали эту тему: >>411751 >>411755 ). Тогда легко будет добавлять новые проверки. Например что fileId не пусто, проверка на длину имени, и т.д.
Валидатор может возвращать либо true/false либо список ошибок.
> if (isset($_POST['token'])) {
> if ($app->token->valid($_POST['token'])) {
используй слимовский $app->request->post('token')
> $app->redirect("/download/{$comment->getFileId()}#comment-{$comment->getId()}");
А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?
> https://github.com/sqghub/uppu.ru/blob/master/model/Comment.php#L111
Мы же вроде говорили, что для анонима лучше храить null вместо имени и подменять при выводе, а не при вставке в базу.
> https://github.com/sqghub/uppu.ru/blob/master/model/Token.php#L25
Знаешь ли ты разницу между == и === ? в чувствительных для безопасности местах надо использовать ===. Есть пример когда использование == позволяет обойти проверку пароля, например:
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Изучи этот пример и пойми почему выводится true (если написать === то уязвимости нет). По моему где-то раньше была как раз такая уязвимость в каком-то модуле проверки капчи, и у тебя есть шанс ее повторить (вообще, капчи отдельная тема, там легко допустить ошибку).
Вот мануал: http://php.net/manual/ru/language.operators.comparison.php
Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L49
Не объявляй функции в шаблонах. Из-за этого например нельзя 2 раза его отрендерить. В данном случае можно приинклудить другой шаблон через
$this->render(....);
(в шаблоне this указывает на объект \Slim\View)
> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) {
В шаблоне надо использовать if с двоеточием.
Само условие я бы переписал, как
if (!$isCommentPosted): ...
В остальном, хорошо. У тебя вообще эта задача хорошо получается (то что касается серверной части).
Ничего, только что-то линии пикселизованные. Ну и если в библиотеке есть режим «исключающее или», XOR — попробуй включить, будет куда веселее так как в этом режиме на пересечении линий появляется белая точка.
>>413828
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L57
Валидацию лучше сделать отдельной функцией в Comment или CommentMapper (где именно? выше уже обсуждали эту тему: >>411751 >>411755 ). Тогда легко будет добавлять новые проверки. Например что fileId не пусто, проверка на длину имени, и т.д.
Валидатор может возвращать либо true/false либо список ошибок.
> if (isset($_POST['token'])) {
> if ($app->token->valid($_POST['token'])) {
используй слимовский $app->request->post('token')
> $app->redirect("/download/{$comment->getFileId()}#comment-{$comment->getId()}");
А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?
> https://github.com/sqghub/uppu.ru/blob/master/model/Comment.php#L111
Мы же вроде говорили, что для анонима лучше храить null вместо имени и подменять при выводе, а не при вставке в базу.
> https://github.com/sqghub/uppu.ru/blob/master/model/Token.php#L25
Знаешь ли ты разницу между == и === ? в чувствительных для безопасности местах надо использовать ===. Есть пример когда использование == позволяет обойти проверку пароля, например:
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Изучи этот пример и пойми почему выводится true (если написать === то уязвимости нет). По моему где-то раньше была как раз такая уязвимость в каком-то модуле проверки капчи, и у тебя есть шанс ее повторить (вообще, капчи отдельная тема, там легко допустить ошибку).
Вот мануал: http://php.net/manual/ru/language.operators.comparison.php
Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L49
Не объявляй функции в шаблонах. Из-за этого например нельзя 2 раза его отрендерить. В данном случае можно приинклудить другой шаблон через
$this->render(....);
(в шаблоне this указывает на объект \Slim\View)
> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) {
В шаблоне надо использовать if с двоеточием.
Само условие я бы переписал, как
if (!$isCommentPosted): ...
В остальном, хорошо. У тебя вообще эта задача хорошо получается (то что касается серверной части).
> '8$2$3$4$5$6$7$8$9$10$11'
Что-то ты нагородил. По моему, проще заменить все не-цифры на пустую строку.
Ну и ты по моему непраивльно посчитал скобки. Вот начало регулярки:
/^(8|\\+7)[(-\\s](\\d)([-\\s](\\d)) ....
вот чему соответствуют символы:
$1 -> (8|\\+7)
$2 -> (\\d)
$3 -> ([-\\s](\\d))
$4 -> (\\d)
Считать надо по открывающим скобкам. Как видимшь у тебя одна цифра 2 раза выведется (в $3 и $4)
>>413881
HTTPS — это защищенный протокол. В ходе установки соединения клиент (в данном случае curl) получает от сервера пруф что он настоящий сервер, в виде цифровой подписи с использованием сертификата домена (в данном случае ya.ru).
Сертификаты в свою очередь образуют цепочки, то есть яндекс генерирует свой сертификат и подписывает его у вышестоящего регистратора (а тот может быть еще у вышестоящего, если он не крупный регистратор), а самый верхний сертификат называется корневым. Корневых сертификатов немного и они все известны.
Чтобы проверить что сертификат не поддельный, клиент (curl) должен проверить что цепочка подписей в нем верная. Чтобы проверить цепочку, надо проверить в том числе ее корневой сертификат, а для этого у клиента должен быть список открытых ключей всех регистраторов. В браузеры, например, встроены такие списки. Если в этом списке нет какого-то регистратора, выданные им сертификаты браузер не примет.
В твоем коде ты скорее всего не передал curl путь к файлу с открытыми ключами, потому curl не может проверить цепочку сетификатов и отказывается соединяться (так как они вполне могут оказаться поддельными, подснунутыми злоумышленником).
Надо либо дать курлу путь к файлу с ключами через опцию CURLOPT_CAPATH/CURLOPT_CAINFO либо отключить проверку сертификатов (естественно в этом случае соединение перестает быть безопасным) опцией CURLOPT_SSL_VERIFYPEER.
Мануал: http://php.net/manual/ru/function.curl-setopt.php
Объяснение https://www.emaro-ssl.ru/blog/root-certificate/
https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8
Вот тут если что авторы curl предоставляют список открытых ключей, аналогичным используемым в фаерфоксе: http://curl.haxx.se/docs/sslcerts.html
Для отладки проблем с сертификатами есть опция curl CURLOPT_CERTINFO которая вывдит информацию об используемых сертификатах (надо запускать скрипт из консоли чтобы увидеть).
Ты можешь просмотреть цепочку сертификатов на сайте браузером, например зайдя на https-сайт и кликнув на зеленый замочек.
> '8$2$3$4$5$6$7$8$9$10$11'
Что-то ты нагородил. По моему, проще заменить все не-цифры на пустую строку.
Ну и ты по моему непраивльно посчитал скобки. Вот начало регулярки:
/^(8|\\+7)[(-\\s](\\d)([-\\s](\\d)) ....
вот чему соответствуют символы:
$1 -> (8|\\+7)
$2 -> (\\d)
$3 -> ([-\\s](\\d))
$4 -> (\\d)
Считать надо по открывающим скобкам. Как видимшь у тебя одна цифра 2 раза выведется (в $3 и $4)
>>413881
HTTPS — это защищенный протокол. В ходе установки соединения клиент (в данном случае curl) получает от сервера пруф что он настоящий сервер, в виде цифровой подписи с использованием сертификата домена (в данном случае ya.ru).
Сертификаты в свою очередь образуют цепочки, то есть яндекс генерирует свой сертификат и подписывает его у вышестоящего регистратора (а тот может быть еще у вышестоящего, если он не крупный регистратор), а самый верхний сертификат называется корневым. Корневых сертификатов немного и они все известны.
Чтобы проверить что сертификат не поддельный, клиент (curl) должен проверить что цепочка подписей в нем верная. Чтобы проверить цепочку, надо проверить в том числе ее корневой сертификат, а для этого у клиента должен быть список открытых ключей всех регистраторов. В браузеры, например, встроены такие списки. Если в этом списке нет какого-то регистратора, выданные им сертификаты браузер не примет.
В твоем коде ты скорее всего не передал curl путь к файлу с открытыми ключами, потому curl не может проверить цепочку сетификатов и отказывается соединяться (так как они вполне могут оказаться поддельными, подснунутыми злоумышленником).
Надо либо дать курлу путь к файлу с ключами через опцию CURLOPT_CAPATH/CURLOPT_CAINFO либо отключить проверку сертификатов (естественно в этом случае соединение перестает быть безопасным) опцией CURLOPT_SSL_VERIFYPEER.
Мануал: http://php.net/manual/ru/function.curl-setopt.php
Объяснение https://www.emaro-ssl.ru/blog/root-certificate/
https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8
Вот тут если что авторы curl предоставляют список открытых ключей, аналогичным используемым в фаерфоксе: http://curl.haxx.se/docs/sslcerts.html
Для отладки проблем с сертификатами есть опция curl CURLOPT_CERTINFO которая вывдит информацию об используемых сертификатах (надо запускать скрипт из консоли чтобы увидеть).
Ты можешь просмотреть цепочку сертификатов на сайте браузером, например зайдя на https-сайт и кликнув на зеленый замочек.
>Валидацию лучше сделать отдельной функцией в Comment или CommentMapper
Ну отдельный класс я делать для валидатора не буду. Поставлю валидацию в Comment.
>А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?
Я думал, что после редиректа слим прерывает функцию, хм. И как выход из неё сделать, там же ретурна нет?
>Мы же вроде говорили, что для анонима лучше храить null вместо имени и подменять при выводе, а не при вставке в базу.
Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.
>Изучи этот пример и пойми почему выводится true
Строка приведется к числу и сравнится 0 и 0.
>Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.
Кк, перенесу. Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?
>(в шаблоне this указывает на объект \Slim\View)
Не знал.
И еще, я начал задачки по js, не могу понять, как в четвертой сделать любое число аргументов. Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.
Ой, я перепутал. Я думал, ты используешь curl и написал инструкцию для него. А ты используешь file_get_contents. Для нее параметры HTTPS задаются через контекст потока:
http://php.net/manual/ru/context.ssl.php
Здесь ты видишь те же параметры verify_peer и cafile/capath
Чтобы задать эти параметры, ты создаешь контекст (http://php.net/manual/ru/function.stream-context-create.php и http://php.net/manual/ru/context.php ), задаешь их на нем и передаешь этот контекст в функцию file_get_contents (почитай мануал, там есть 3-й или 4-й параметр для этого). Так же можно например задать таймаут для соединения.
>>413888
Ошибочки:
Когда ты решаешь задачу на ООП, ты должен ответит на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
И исходя из этого ты пишешь классы. посмотри что я написал выше, и сравни со своим кодом. Видишь, что ты сделал все не совсем так? У тебя там ООП никакого нету, все сделано на функциях и массивах и как следствие код получился спутанный и я например не представляю как в нем поменять правила расчет зарлпаты инженера или добавить еще пару профессий.
Например в твоем коде, если изменить ранг сотрудника, у него не пересчитается атоматически зарплата и потребление кофе. А если делать как описано выше, то пересчитается.
> /$a - 1 если 2 ранг, 0 если нет, $b - 1 (3 ранг), $c - 1 (если директор)
Ну ты думаю тут и сам догадываешься что так делать нельзя? Излишне запутанная система и имена никуда не годятся. Также вместо 0/1 лучше использовать true/false которые в программировании обозначают да/нет
> $worker = new Worker($k1, $k2, $k3, $a, $b, $c);
Невозможно ничего понять, что за k1, k2? Называй переменные нормально.
В общем, ответь сначала на 4 вопроса выше и переделай код.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный класс» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
Ой, я перепутал. Я думал, ты используешь curl и написал инструкцию для него. А ты используешь file_get_contents. Для нее параметры HTTPS задаются через контекст потока:
http://php.net/manual/ru/context.ssl.php
Здесь ты видишь те же параметры verify_peer и cafile/capath
Чтобы задать эти параметры, ты создаешь контекст (http://php.net/manual/ru/function.stream-context-create.php и http://php.net/manual/ru/context.php ), задаешь их на нем и передаешь этот контекст в функцию file_get_contents (почитай мануал, там есть 3-й или 4-й параметр для этого). Так же можно например задать таймаут для соединения.
>>413888
Ошибочки:
Когда ты решаешь задачу на ООП, ты должен ответит на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
И исходя из этого ты пишешь классы. посмотри что я написал выше, и сравни со своим кодом. Видишь, что ты сделал все не совсем так? У тебя там ООП никакого нету, все сделано на функциях и массивах и как следствие код получился спутанный и я например не представляю как в нем поменять правила расчет зарлпаты инженера или добавить еще пару профессий.
Например в твоем коде, если изменить ранг сотрудника, у него не пересчитается атоматически зарплата и потребление кофе. А если делать как описано выше, то пересчитается.
> /$a - 1 если 2 ранг, 0 если нет, $b - 1 (3 ранг), $c - 1 (если директор)
Ну ты думаю тут и сам догадываешься что так делать нельзя? Излишне запутанная система и имена никуда не годятся. Также вместо 0/1 лучше использовать true/false которые в программировании обозначают да/нет
> $worker = new Worker($k1, $k2, $k3, $a, $b, $c);
Невозможно ничего понять, что за k1, k2? Называй переменные нормально.
В общем, ответь сначала на 4 вопроса выше и переделай код.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный класс» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
https://github.com/sqghub/uppu.ru/
Валидацию файлов в общем-то тоже стоило бы перенести в file, но так как я ничего кроме токена не проверяю, то оставил пока что так же.
Также, в строках 163-169 копипаста, которая абсолютно не годится. Используй цикл.
>>413903
> getCoordinateX()
А что не getX? Ладно, пусть будет так, я не против.
> public function showCoordinates()
Можно наверно делать просто var_dump($cat); — оно выводит свойства
> field->shareHeight()
Обычно такие функции называют getSomething()
> if (($x < 0 && $this->x > 0) || ($x > 0 && $this->x < $this->field->shareHeight())) {
проверка непераивльная. Гораздо лучше проверять условием типа
if ($this->field->isXOnMap($this->x + $x))
(обрати внимание насколько лаконичнее получилось)
> public function setField(GameField $field)
При удалении животного с карты логично в field передавать null, то есть разрывать связь «животное - карта» с обеих сторон.
Ты проверяешь 4 варианта хода, но иногда надо проверять 5 (иногда выгоднее стоять на месте чем идти навстречу кошке). А если мышка в углу, у нее 3 варианта хода. А если она окружена мышками и кошками, то только один — стоять на месте. Потому тут надо не 4 переменных, а массив ходов передавать.
> Cупер тупой костыль, но я не знаю как извлечь наибольшую переменную из 4, т.к max возвращает только значение
Надо передавать не 4 переменных, а массив ходов, примерно такого формата:
array(
array('dx' => 1, 'dy' => 0, 'score' => 14),
....
)
А еще лучше хранить не относительные, а сразу абсолютные координаты — проще будет.
Тогда будет гораздо проще и можно написать функцию, принимающую массив ходов и возвращающую наилучший.
Ну и давай посмотрим на функцию public function makeMove(). Согласись, выглядит пугающе? Давай попробуем ее переписать методом «водопада», то есть от высокоуровневых функций к низкоуровневым.
Как выбраь ход? Очевидно, алгоритм простой:
ходы = определитьВсеДоступныеХоды( );
ходыСОчками = посчитатьОчки(ходы);
лучшийХод = выбратьЛучшийХод(ходыСОчками);
сделать лучшийХод;
Осталось только это написать кодом. Теперь можно браться за более мелкие функции:
функция определитьВсеДоступныеХоды:
вариантыКоординатХодов = (на месте, влево, вправо, вверх, вниз);
список = пустой массив;
для каждого варианта:
посчитать координаты для варианта;
если (можноСходитьНаУказаннуюКлетку) {
добавить в список;
}
если список пуст — тревога, программа сломана.
вернуть список;
Ну и так далее. Попробуй улучшить код. По идее тут еще можно упростить код, напрмер «посчитатьЧислоОчков» можно перенести в функцию выбора лучшего хода.
Вместо «up» или «down» по моему удобнее работать с координатами.
ну и сам алгоритм расчета у тебя странный:
> if ($cat->getCoordinateX() > $this->x && $cat->getCoordinateX() - $this->x < $down) {
> $down = $cat->getCoordinateX() - $this->x;
У тебя последняя кошка затирает влияние предыдущих кошек, а ведь она может быть далеко, а предыдущие близко. Надо наверно выбирать ближайшую к клетке кошку и оценивать сколько ей надо ходов чтобы достигнуть клетки.
В коде кошки нет проверки что клетка занята другой кошкой.
> public function shareHeight()
> {
> return $this->height - 1;
Это коварно. Я бы никогда не ожидал что функция getHeight вернет не высоту, а высоту минус один. Не делай так, иначе твой код становится похожим на минное поле. Функции должны соответсвовать своему названию. В данном случае функция должна называться getHeightMinusOne или getMaximumX.
Также, в строках 163-169 копипаста, которая абсолютно не годится. Используй цикл.
>>413903
> getCoordinateX()
А что не getX? Ладно, пусть будет так, я не против.
> public function showCoordinates()
Можно наверно делать просто var_dump($cat); — оно выводит свойства
> field->shareHeight()
Обычно такие функции называют getSomething()
> if (($x < 0 && $this->x > 0) || ($x > 0 && $this->x < $this->field->shareHeight())) {
проверка непераивльная. Гораздо лучше проверять условием типа
if ($this->field->isXOnMap($this->x + $x))
(обрати внимание насколько лаконичнее получилось)
> public function setField(GameField $field)
При удалении животного с карты логично в field передавать null, то есть разрывать связь «животное - карта» с обеих сторон.
Ты проверяешь 4 варианта хода, но иногда надо проверять 5 (иногда выгоднее стоять на месте чем идти навстречу кошке). А если мышка в углу, у нее 3 варианта хода. А если она окружена мышками и кошками, то только один — стоять на месте. Потому тут надо не 4 переменных, а массив ходов передавать.
> Cупер тупой костыль, но я не знаю как извлечь наибольшую переменную из 4, т.к max возвращает только значение
Надо передавать не 4 переменных, а массив ходов, примерно такого формата:
array(
array('dx' => 1, 'dy' => 0, 'score' => 14),
....
)
А еще лучше хранить не относительные, а сразу абсолютные координаты — проще будет.
Тогда будет гораздо проще и можно написать функцию, принимающую массив ходов и возвращающую наилучший.
Ну и давай посмотрим на функцию public function makeMove(). Согласись, выглядит пугающе? Давай попробуем ее переписать методом «водопада», то есть от высокоуровневых функций к низкоуровневым.
Как выбраь ход? Очевидно, алгоритм простой:
ходы = определитьВсеДоступныеХоды( );
ходыСОчками = посчитатьОчки(ходы);
лучшийХод = выбратьЛучшийХод(ходыСОчками);
сделать лучшийХод;
Осталось только это написать кодом. Теперь можно браться за более мелкие функции:
функция определитьВсеДоступныеХоды:
вариантыКоординатХодов = (на месте, влево, вправо, вверх, вниз);
список = пустой массив;
для каждого варианта:
посчитать координаты для варианта;
если (можноСходитьНаУказаннуюКлетку) {
добавить в список;
}
если список пуст — тревога, программа сломана.
вернуть список;
Ну и так далее. Попробуй улучшить код. По идее тут еще можно упростить код, напрмер «посчитатьЧислоОчков» можно перенести в функцию выбора лучшего хода.
Вместо «up» или «down» по моему удобнее работать с координатами.
ну и сам алгоритм расчета у тебя странный:
> if ($cat->getCoordinateX() > $this->x && $cat->getCoordinateX() - $this->x < $down) {
> $down = $cat->getCoordinateX() - $this->x;
У тебя последняя кошка затирает влияние предыдущих кошек, а ведь она может быть далеко, а предыдущие близко. Надо наверно выбирать ближайшую к клетке кошку и оценивать сколько ей надо ходов чтобы достигнуть клетки.
В коде кошки нет проверки что клетка занята другой кошкой.
> public function shareHeight()
> {
> return $this->height - 1;
Это коварно. Я бы никогда не ожидал что функция getHeight вернет не высоту, а высоту минус один. Не делай так, иначе твой код становится похожим на минное поле. Функции должны соответсвовать своему названию. В данном случае функция должна называться getHeightMinusOne или getMaximumX.
Нет, не поверю, потому что так не работает. Пост запрос у меня вся форма, в которой есть class_id. Мне нужно сделать апдейт записи. Делаю на yii.
$form = tbl_Class::model()->findByAttributes(array('class_id'=>$_POST['tbl_Class']));
Так под каким именем ты в пост это впихнул, под тем и спрашивай.
Попробуй еще цвет менять для каждой новой линии. Чтобы плавно менять цвета, удобно использовать не RGB, а цветовую модуль HSV
https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
Питон наверняка умеет с ней работать.
Ну и попробуй поиграть с режимами наложения линий — там наверняка это есть, и будет еще интереснее.
>>414017
JS лишь один из вариантов. На PHP по моему писать удобнее, там хотя бы классы есть и нормальные фреймворки. Node.JS больше подходит для маленьких асинхронных программ.
>>414119
Первая задача: верно
Вторая: верно же сделано. Только вот насчет этого:
> $result[0] = 8;
прочитай почему не надо работать со стройкой как с массивом (строка это не массив символов. а массив байт): https://gist.github.com/codedokode/ff99e357e9860ea169b8
Третья
Во-первых для работы с utf-8 надо всегда добавлять в регулярку флаг u. Иначе русские буквы могут работать не так, как ты задумал, например вместо одной буквы будет ловиться другая. Проще всегда ставить флаг u, так как мы используем utf-8.
> $regexp = "/(^|\\s)([\\S])([A-z])([\\S])(\\s|$)/";
Тут есть подвох: регулярка захватвает пробелы до и после слова. Это значит, что если идут 2 слова подряд, то второе слово она не поймает, так как пробел перед ним захвачен предыдущим совпадением.
Чтобы этого избежать, можно использовать конструкцию
\\b
которая соответствует границе между буквой и не-буквой и не захватывает ни одного символа. Либо использовать assertions, которые проверяют совпадение, но не захватывают символы: http://php.net/manual/ru/regexp.reference.assertions.php
Также, \\S соответвует не только буквам, а всему чему угодно, цифрам, знакам, и т.д. Плохо.
Также, задача должна уметь искать еще латинские слова. в которые вставлена русская буква.
А на полностью латинские слова типа этого: https://ideone.com/9KCOkM ругаться не должна. То есть надо искать не латинницу, а слова со смешанным алфавитом.
> \tfunction ($matches) {
> global $decryptTable;
Не используй global никогда. Для анонимных функций переменные можно передать через use: https://php.net/manual/ru/functions.anonymous.php (3-й пример)
Ну и посмотри, может там проще сначала текст на слова разбить и по ним пройтись, я не знаю. Или может можно сразу текст через preg_prelace_callback пропустить. Подумай, как удобнее.
Попробуй еще цвет менять для каждой новой линии. Чтобы плавно менять цвета, удобно использовать не RGB, а цветовую модуль HSV
https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
Питон наверняка умеет с ней работать.
Ну и попробуй поиграть с режимами наложения линий — там наверняка это есть, и будет еще интереснее.
>>414017
JS лишь один из вариантов. На PHP по моему писать удобнее, там хотя бы классы есть и нормальные фреймворки. Node.JS больше подходит для маленьких асинхронных программ.
>>414119
Первая задача: верно
Вторая: верно же сделано. Только вот насчет этого:
> $result[0] = 8;
прочитай почему не надо работать со стройкой как с массивом (строка это не массив символов. а массив байт): https://gist.github.com/codedokode/ff99e357e9860ea169b8
Третья
Во-первых для работы с utf-8 надо всегда добавлять в регулярку флаг u. Иначе русские буквы могут работать не так, как ты задумал, например вместо одной буквы будет ловиться другая. Проще всегда ставить флаг u, так как мы используем utf-8.
> $regexp = "/(^|\\s)([\\S])([A-z])([\\S])(\\s|$)/";
Тут есть подвох: регулярка захватвает пробелы до и после слова. Это значит, что если идут 2 слова подряд, то второе слово она не поймает, так как пробел перед ним захвачен предыдущим совпадением.
Чтобы этого избежать, можно использовать конструкцию
\\b
которая соответствует границе между буквой и не-буквой и не захватывает ни одного символа. Либо использовать assertions, которые проверяют совпадение, но не захватывают символы: http://php.net/manual/ru/regexp.reference.assertions.php
Также, \\S соответвует не только буквам, а всему чему угодно, цифрам, знакам, и т.д. Плохо.
Также, задача должна уметь искать еще латинские слова. в которые вставлена русская буква.
А на полностью латинские слова типа этого: https://ideone.com/9KCOkM ругаться не должна. То есть надо искать не латинницу, а слова со смешанным алфавитом.
> \tfunction ($matches) {
> global $decryptTable;
Не используй global никогда. Для анонимных функций переменные можно передать через use: https://php.net/manual/ru/functions.anonymous.php (3-й пример)
Ну и посмотри, может там проще сначала текст на слова разбить и по ним пройтись, я не знаю. Или может можно сразу текст через preg_prelace_callback пропустить. Подумай, как удобнее.
Если ОП занят, он заходит где-то раз в день. Не надо его ждать, решай задачки дальше.
>>414160
> там же ретурна нет?
Почему? Есть.
> Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.
Тогда ок
> Строка приведется к числу и сравнится 0 и 0.
Молодец. не создавай тогда в своем коде таких возможностей и используй ===.
> Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?
Неправильно. В классе Comment не должно быть никакого токена. Токен связан с приемом данных от формы, а Comment лишь представляет сущность-комментарий и ничего не знает, о том откуда берутся данные в нем.
Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.
Алсо назвать лучше CSRFToken для ясности.
> Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.
Почитай про псевдопеременную arguments и методы call/apply у функций. Это есть на learn.javascript.ru Ну и код потихоньку показывай.
>>414174
В Yii есть объект request, изучи его и получай данные из него.
Если ОП занят, он заходит где-то раз в день. Не надо его ждать, решай задачки дальше.
>>414160
> там же ретурна нет?
Почему? Есть.
> Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.
Тогда ок
> Строка приведется к числу и сравнится 0 и 0.
Молодец. не создавай тогда в своем коде таких возможностей и используй ===.
> Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?
Неправильно. В классе Comment не должно быть никакого токена. Токен связан с приемом данных от формы, а Comment лишь представляет сущность-комментарий и ничего не знает, о том откуда берутся данные в нем.
Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.
Алсо назвать лучше CSRFToken для ясности.
> Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.
Почитай про псевдопеременную arguments и методы call/apply у функций. Это есть на learn.javascript.ru Ну и код потихоньку показывай.
>>414174
В Yii есть объект request, изучи его и получай данные из него.
> \model\Comment::setToken($app->token);
Comment не должен ничего знать о токене. Токен — это не свойство комментария. Токен — это система защиты подделки данных формы, и комментарий не должен о ней знать.
Сделай проверку токена просто через if в index.php (в больших фреймворках есть класс Form, от которого наследуются все формы, и соответственно проверку можно вставлять туда, у тебя маленькое приложение и наверно лепить классы для форм не стоит. Но как-нибдь потом познакомиться с тем как формы сделаны в ZF2, Yii 2 или Symfony 2, стоит).
В функции валидации наверно стоит возвращать причину ошибки, чтобы ее можно было вывести в сообщении:
if ('' === $this->text) {
return "Пожалуйста, введите текст комментария";
}
или
if ('' === $this->text) {
return array(false, "Пожалуйста, введите текст комметария");
}
Также, не забывай делать trim для всех данных из форм иначе комментарий из 2 пробелов будет считаться непустым.
> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) :
> if ($comment->getId() == $newComment->getParentId()) :
какя понимаю, эти условия должны быть взаимоисключающими и противоположными, но в одном условии 2 части. а в другом почему-то только одна.
Я советую просто сделать переменную isCommentPosted
> \model\Comment::setToken($app->token);
Comment не должен ничего знать о токене. Токен — это не свойство комментария. Токен — это система защиты подделки данных формы, и комментарий не должен о ней знать.
Сделай проверку токена просто через if в index.php (в больших фреймворках есть класс Form, от которого наследуются все формы, и соответственно проверку можно вставлять туда, у тебя маленькое приложение и наверно лепить классы для форм не стоит. Но как-нибдь потом познакомиться с тем как формы сделаны в ZF2, Yii 2 или Symfony 2, стоит).
В функции валидации наверно стоит возвращать причину ошибки, чтобы ее можно было вывести в сообщении:
if ('' === $this->text) {
return "Пожалуйста, введите текст комментария";
}
или
if ('' === $this->text) {
return array(false, "Пожалуйста, введите текст комметария");
}
Также, не забывай делать trim для всех данных из форм иначе комментарий из 2 пробелов будет считаться непустым.
> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) :
> if ($comment->getId() == $newComment->getParentId()) :
какя понимаю, эти условия должны быть взаимоисключающими и противоположными, но в одном условии 2 части. а в другом почему-то только одна.
Я советую просто сделать переменную isCommentPosted
Содержимое POST можно просмотреть либо var_dump($_POST) (неожиданно?) либо инспектором (Ctrl + Shift + i) на вкладке Network.
Ну наконец-то появились нормальные сообщения в коммитах: https://github.com/sqghub/uppu.ru/commits/master (упс, пока писал, опять зведочки пошли)
>Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.
Ты же наоборот сказал вынести валидацию в коммент.
>Почитай про псевдопеременную arguments
Почитал. Сделал.
>>414184
>Ну наконец-то появились нормальные сообщения в коммитах:
Ну, я так понял, что по хорошему нужно любое изменение сразу коммитить. А я, как правило, делаю коммит с целым винегретом различных исправлений, потому и комментарии там не особо полезны будут.
Валидацию коммента. А проверка CSRF это другая вещь, это защита формы. В любом случае у комментария нет такого свойства как «токен» так как он модет быть добавлен не через форму.
> то по хорошему нужно любое изменение сразу коммитить.
Да. Так удобнее историю смотреть.
Валидацию исправил.
>>414181
>и код потихоньку показывай.
https://github.com/sqghub/JavaScript
Хотя это лучше наjsfiddle выкладывать, да?
По uppu: хорошо, а при ошибке отпрваки коментария сообщение об ошике выводится рядом с ним? Надо бы вывести, а то представь, страница перезагружается, а в чем дело, непонятно.
> наjsfiddle выкладывать,
да, там результат виден
Задачи по яваскрипт выглядят верно, давай на всякий случай их выложим на ресурс вроде jsfiddle/jsbin/codepen.
>Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.
Спасибо, я посмотрю как решить в ES3.
>Вообще, я вижу ты не знаешь про стандартные методы у массивов. Изучи-ка статьи
Читал про них, но конечно не все сходу помню. Переделаю.
>>413445
>Почему не хочешь использовать более короткую запись через += ?
Не то чтобы не хочу, просто ставлю во главу угла работоспособность, а не качество кода. Неправильно, будем стараться лучше.
>Попробуй так записать код.
Завтра все перепишу.
>Задачи по яваскрипт выглядят верно, давай на всякий случай их выложим на ресурс вроде jsfiddle/jsbin/codepen.
Первая:
http://jsbin.com/madokiloxo/1/edit?js,console
Вторая:
http://jsbin.com/vepejovolu/1/edit
Третья:
http://jsbin.com/gowuracema/1/edit
Четвертая:
http://jsbin.com/jefopepidu/1/edit
Ой, консоль на всех, кроме первой поехала.
Пятая:
http://jsbin.com/yigujodeba/1/edit?js,console
Шестая:
http://jsbin.com/qoxulobuxi/1/edit?js,console
Седьмая:
http://jsbin.com/boyutokaxi/1/edit?js,console
Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.
Восьмая:
http://jsbin.com/siconoyune/1/edit?js,console
Девятая:
http://jsbin.com/velowureju/1/edit?js,console
Десятая:
http://jsbin.com/pajanevocu/1/edit?js,console
Одиннадцатая:
http://jsbin.com/humutinixe/1/edit?js,console
Если задача была в том, чтобы самому написать алгоритм сортировки, то пузырьком или выбором я сделать могу легко, да.
Двенадцатая:
http://jsbin.com/pidesubipu/1/edit?js,console
Например, мне нужно найти абсолютно все появления буквы e в словах (в словах, где она встречается, нужно вывести это дважды). И когда я использую для этого регулярку типа:
[code]/\\b(\\w)(e)(\\w)\\b/ui[/code]
для текста "Where is engine?" мне выдаёт:
Wher[e]
engin[e]
Когда хотелось бы:
Wh[e]re
Wher[e]
[e]ngine
engin[e]
Если бы у ассершенов не было ограничения, о котором я уже говорил, то мне бы помогла регулярка
[code]/(?<=\\b(\\w))(a)(?=(\\w)\\b)/ui[/code]
А так я даже хз, как мне тут стоит сделать.
class Engineer extends Employee
{
}
Вот так, если класс Employee абстрактный класс и создан лишь для наследования и содержит уже все необходимые свойства и методы или вот так будет вернее:
class Engineer extends Employee
{
\tpublic function __construct($salary, $coffee, $reports)
\t{
\t\tparent::__construct($salary, $coffee, $reports);
\t}
}
?
И ещё вопрос, может ли абстрактный класс не содержать абстрактных методов?
>Можно ли при объявлении дочернего класса не описывать его методы и свойства
Можно, для этого и придумано наследование.
Как можно изменить свойства дочернего класса не напрямую вводом цифры, а с помощью расчетов?
К примеру в родительском классе $a = 2; мне надо чтобы в дочернем классе это значение было в 3 раза больше при любом значении этой переменной в родительском классе
Какой то слишком массивный код у меня вышел http://ideone.com/hRDxAh по сравнению с первым вариантом http://ideone.com/mxvzn8
Вот такая хрень получается. Жду советов по улучшению, моя голова уже не варит.
Добра тебе :)
$text = "привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.";
$text = preg_replace('/\s+/',' ',$text);
echo "{$text}\n";
$regexp='/([.?!])/u';
$parts=preg_split($regexp, $text, 0, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
foreach ($parts as &$value) {
\tif ($value[0]!=" ") {
\t\t$value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));
\t}
\telse {
\t\t$value=mb_strtoupper(mb_substr($value, 1, 1)).mb_substr($value, 2, mb_strlen($value));
\t}
}
$text1=implode($parts);
echo "{$text1}\n";
\t$text1=preg_replace('/\s?([,.?!])(\S)/u','$1 $2',$text1);
\techo $text1;
Сам бы я себе поставил за такой код оценку из пикрилейтед, но ничего другого не придумал. Прочитал подсказку, не могу понять, как можно реализовать алгоритм именно в таком порядке и таким количеством строчек, как на картинке в задании. Намекните, что ли.
Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?
https://gist.github.com/anonymous/bf2787d38416fe2c1ae4
Вот тут непонятно что должно быть в местах где ... в функции createQuestions()
окей, пока посмотрю GD для капчи. Гостевуху на файлах я уже писал, на самом деле. Сечас попробую запилить с админкой и с бд.
Тем, что в интерфейсе не могут описываться методы?
Это концептуально разные понятия.
На жизненном примере покажу
Вася 15лвл, он принадлежит к конкретному классу человек, который в свою очередь наследуется от абстрактного класса "живое существо".
Мы не можем создать экземпляр "живого существа", но догадываемся, что у живого существа есть возраст, хелсы, каким-то образом оно питается, каким-то размножается и так далее - это все будет абстрактными методами
А в конкретном классе "человек" будут реализованы эти методы размножения/питания и т.д.
Т.е. абстрактный класс - это обобщение над обычным классами, но по этому обобщению построить конкретный экземпляр невозможно
Интерфейс - это что-то типа "скилла". Например "умение передавать информацию".
Вот и сделаем псевдокодом
интерфейс УмениеОбщаться
публичный_метод сообщить($информацию);
публичный_метод принять($информацию);
Мы же знаем, что человек умеет общаться, дельфин умеет общаться (но при этом они делают это по разному!). Но инфузория туфелька не умеет. А общаться еще умеет например мобильный телефон (условно), робот р2д2 и так далее. Таким образом мы можем к любому классу, который нам нужен присобачить "УмениеГоворить" и миллион других умений в различных комбинациях.
Дети, пытайтесь лучше понять это как-то так, чем через повторение тупорылых фраз из говняных книжек. Как я заебался на собеседованиях слышать пургу всякую про ооп, пиздец просто. Или все кодеры такие узколобые?
>Это концептуально разные понятия.
Расскажи это c++, где нет интерфейсов, зато множественное наследование.
Первая
> Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.
Этого нету. Надо дописать что-то вроде
x = x || 100;
Задачи 2, 3, 4 решены верно.
>>414221
5
> for (var i = 0; i < arguments.length; i++)
> args = arguments;
всегда заключай тело цикла в {} даже если праила разрешают это не делать. Иначе легко допустить ошибку.
Этот цикл можно заменить на трюк с Array.prototype.slice: http://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work (англ)
> funct.apply(null,newArgs);
лучше писать this вместо null, тогда this тоже будет передаваться функции (хотя по условию этого не требуется, так что можешь не исправлять).
Так, работает верно.
6
Верно
7
> for (var i = 0; i < arguments.length; i++) {
> args.push(arguments);
В apply можно передавать всевдомассив arguments и цикл не нужен.
> Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.
Не очень понял, в чем была пробелма, вроде же работает. В строгом режиме есть ограничения на то, что можно передать в качестве this, но тут вроде они не должны вызывать проблем.
8, 9
Верно.
10
> for (var key in inputObject)
Тут надо проверять еще принадлежит ли свойство объекту или его прототипу через hasOwnProperty. Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:
Object.prototype.x = 1;
var y = {};
count(y); // 1, а должно быть 0
В новых браузерах с ES5 есть метод Object.keys(x) который возвращает массив ключей, кстати.
Первая
> Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.
Этого нету. Надо дописать что-то вроде
x = x || 100;
Задачи 2, 3, 4 решены верно.
>>414221
5
> for (var i = 0; i < arguments.length; i++)
> args = arguments;
всегда заключай тело цикла в {} даже если праила разрешают это не делать. Иначе легко допустить ошибку.
Этот цикл можно заменить на трюк с Array.prototype.slice: http://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work (англ)
> funct.apply(null,newArgs);
лучше писать this вместо null, тогда this тоже будет передаваться функции (хотя по условию этого не требуется, так что можешь не исправлять).
Так, работает верно.
6
Верно
7
> for (var i = 0; i < arguments.length; i++) {
> args.push(arguments);
В apply можно передавать всевдомассив arguments и цикл не нужен.
> Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.
Не очень понял, в чем была пробелма, вроде же работает. В строгом режиме есть ограничения на то, что можно передать в качестве this, но тут вроде они не должны вызывать проблем.
8, 9
Верно.
10
> for (var key in inputObject)
Тут надо проверять еще принадлежит ли свойство объекту или его прототипу через hasOwnProperty. Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:
Object.prototype.x = 1;
var y = {};
count(y); // 1, а должно быть 0
В новых браузерах с ES5 есть метод Object.keys(x) который возвращает массив ключей, кстати.
Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.
11
> if (a['population'] >= b['population']) return -1;
Принято заключать действие в {} после if
Также, есть хитрость. Функция на самом деле может вернуть не ровно 1/-1, а любое положительное или отрицатльеное число. Можно писать
return x.population - y.population;
Хотя так конечно менее понятно.
Писать свой алгоритм не надо. Решено верно.
12
> const types = [
Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:
Hambuger.TYPE_BIG = 'big';
....
var hamburger = new Hamburger(Hamburger.TYPE_BIG);
(заметь, я сделал константу свойством класса, чтобы она не болталась сама по себе, а была с ним связана).
А у тебя пользователю твоего класса никакие константы не доступны, приходится писать строкой "big".
Также, добавки — это необязательная вещь. Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом:
ham.add(TOPPING_CHEESE);
ham.add(TOPPING_SALAD);
У тебя сделано отдельными методоами, можно наверно и так, но в случае с константами, мне кажется, меньше кода придется переписывать. Внутри хранить добавки лучше не в переменных, а в массиве добавок.
Насчет реализации ООП: в JS конечно боль с классами (пока ES6 не примут), и они делаются на костылях, но мне кажется на прототипах было бы менее костыльно. Во-первых, у тебя весь класс засунут в одну функцию, а большие функции это плохо. Во-вторых, у тебя при создании объекта каждый раз пересоздаются все его методы, а можно делать это один раз.
Я советую переделать класс на прототипах. Тогда это будет гораздо ближе к обычным классам. Правда, в этом варианте не будет приватных переменных.
> for (i = 0; i < types.length; i++) {
Это надо вынести в функцию/метод contains
> const types = ["small", "big"];
> const prices = [50, 100];
Ты зря раскидал свойства гамбургера по разным массивам. лучше собрать в один:
{ price: 50, calories: 100500 }
как это сделано с добавками.
Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.
11
> if (a['population'] >= b['population']) return -1;
Принято заключать действие в {} после if
Также, есть хитрость. Функция на самом деле может вернуть не ровно 1/-1, а любое положительное или отрицатльеное число. Можно писать
return x.population - y.population;
Хотя так конечно менее понятно.
Писать свой алгоритм не надо. Решено верно.
12
> const types = [
Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:
Hambuger.TYPE_BIG = 'big';
....
var hamburger = new Hamburger(Hamburger.TYPE_BIG);
(заметь, я сделал константу свойством класса, чтобы она не болталась сама по себе, а была с ним связана).
А у тебя пользователю твоего класса никакие константы не доступны, приходится писать строкой "big".
Также, добавки — это необязательная вещь. Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом:
ham.add(TOPPING_CHEESE);
ham.add(TOPPING_SALAD);
У тебя сделано отдельными методоами, можно наверно и так, но в случае с константами, мне кажется, меньше кода придется переписывать. Внутри хранить добавки лучше не в переменных, а в массиве добавок.
Насчет реализации ООП: в JS конечно боль с классами (пока ES6 не примут), и они делаются на костылях, но мне кажется на прототипах было бы менее костыльно. Во-первых, у тебя весь класс засунут в одну функцию, а большие функции это плохо. Во-вторых, у тебя при создании объекта каждый раз пересоздаются все его методы, а можно делать это один раз.
Я советую переделать класс на прототипах. Тогда это будет гораздо ближе к обычным классам. Правда, в этом варианте не будет приватных переменных.
> for (i = 0; i < types.length; i++) {
Это надо вынести в функцию/метод contains
> const types = ["small", "big"];
> const prices = [50, 100];
Ты зря раскидал свойства гамбургера по разным массивам. лучше собрать в один:
{ price: 50, calories: 100500 }
как это сделано с добавками.
Тут лучше изменить подход. Например, сначала ищем слова, где есть хотя бы одна не та буква, а потом уже проходимся по каждому и заменяем.
preg_match_all/replace не проходится дважды по одному слову, а ассершен не может работать с строками переменной длины.
>>414283
> может ли абстрактный класс не содержать абстрактных методов?
Да. Абстрактный класс - значит его нельзя создать через new, а абстрактный метод — значит, он обязан быть реализован в наследнике. Это разные вещи.
>>414349
Определить тип изображения можно например функцией getimagesize, расширению доверять особо не стоит, так как некоторые люди думают, что файл можно конвертировать в другой формат сменой расширения.
Насчет плеера, браузер и флеш не поддерживает большинство форматов видео, по идее хорошо бы проверять прежде чем отображать плеер, это можно сделать яваскриптом с помощью метода canPlayType в который надо передать MIME-тип видео (его можно определить например библиотекой getId3).
>>414350
> switch ($isDirector) {
Ради 2 вариантов хватит ифа.
> $this->reports = 0;
А вот это плохая идея. Если мы захотим разжаловать директора в обычного сотрудника, как ты восстановишь поле? Я думаю, лучше просто хранить свойство «директор ли», а проверять его в функции вычисления зарплаты. Об этом в условии задачи не написано, но все ведь не предугадаешь.
Также, у тебя почему-то не хранится в Employee ранг сотрудника, а он влияет на зарплату.
> foreach ($object as $k => $v) {
> if ($k === 'salary') {
Что за наркоманство? А написать $object->salary нельзя? Не перебирай свойства объекта через foreach
> foreach ($this->workers as $object) {
as $worker
> $c = count($this->workers, 2);
Что еще за 2? Алсо, эту функцию можно записать в 1 строчку, а не в две.
> public function doCoffee()
Это принято называть getCoffee
> public function doShow()
Это должно быть не в департаменте. Может у нас есть 30 разных отчетов, что же ты будешь в Департамент 30 разных функций добавлять? Не надо.
> class Procurement extends Department
Для разных департаментов не надо создавать разные классы, так как они ничем кроме названия не отличаются (а у работников хотя бы зарплаты разные).
> doEmployeeSecondRank
> doEmployeeThirdRank
Это неправльно. Во-первых, ты копипастишь функции, а копипаста самое большое зло в программировании. Во-вторых, ранг — это свойство работника. Например, мы можем поднять или понизить его — как это сделать в твоей программе? Никак.
Также, не называй функции начиная с do. Это слово ничего не значит.
> $procurement = new Procurement(array_merge(doEmployeeFirstRank($me, 9), doEmployeeSecondRank($me, 3)
Лучше сделать у Департамента метод добавитьЛюдей и добавлять в несколько строчек. Также, можно хранить босса не в общей массе работников, а отдельным свойством и назначать отдельной функцией.
> $vektor = array(
$departments наверно лучше
> if ($k == 0) {
> echo padRight($str, $col1);
лучше наеврно просто сделать массив размеров колонок чем городить сложный if
> $adv = $advertising->doShow( );
> $sal = $sales->doShow( );
тут нужна не копипаста, а цикл.
> switch ($k) {
> case 1:
> $sumWorkers += $v;
Как-то усложненно все. Не проще ли в цикле, где ты выводишь департаменты, складывать суммы?
Тут лучше изменить подход. Например, сначала ищем слова, где есть хотя бы одна не та буква, а потом уже проходимся по каждому и заменяем.
preg_match_all/replace не проходится дважды по одному слову, а ассершен не может работать с строками переменной длины.
>>414283
> может ли абстрактный класс не содержать абстрактных методов?
Да. Абстрактный класс - значит его нельзя создать через new, а абстрактный метод — значит, он обязан быть реализован в наследнике. Это разные вещи.
>>414349
Определить тип изображения можно например функцией getimagesize, расширению доверять особо не стоит, так как некоторые люди думают, что файл можно конвертировать в другой формат сменой расширения.
Насчет плеера, браузер и флеш не поддерживает большинство форматов видео, по идее хорошо бы проверять прежде чем отображать плеер, это можно сделать яваскриптом с помощью метода canPlayType в который надо передать MIME-тип видео (его можно определить например библиотекой getId3).
>>414350
> switch ($isDirector) {
Ради 2 вариантов хватит ифа.
> $this->reports = 0;
А вот это плохая идея. Если мы захотим разжаловать директора в обычного сотрудника, как ты восстановишь поле? Я думаю, лучше просто хранить свойство «директор ли», а проверять его в функции вычисления зарплаты. Об этом в условии задачи не написано, но все ведь не предугадаешь.
Также, у тебя почему-то не хранится в Employee ранг сотрудника, а он влияет на зарплату.
> foreach ($object as $k => $v) {
> if ($k === 'salary') {
Что за наркоманство? А написать $object->salary нельзя? Не перебирай свойства объекта через foreach
> foreach ($this->workers as $object) {
as $worker
> $c = count($this->workers, 2);
Что еще за 2? Алсо, эту функцию можно записать в 1 строчку, а не в две.
> public function doCoffee()
Это принято называть getCoffee
> public function doShow()
Это должно быть не в департаменте. Может у нас есть 30 разных отчетов, что же ты будешь в Департамент 30 разных функций добавлять? Не надо.
> class Procurement extends Department
Для разных департаментов не надо создавать разные классы, так как они ничем кроме названия не отличаются (а у работников хотя бы зарплаты разные).
> doEmployeeSecondRank
> doEmployeeThirdRank
Это неправльно. Во-первых, ты копипастишь функции, а копипаста самое большое зло в программировании. Во-вторых, ранг — это свойство работника. Например, мы можем поднять или понизить его — как это сделать в твоей программе? Никак.
Также, не называй функции начиная с do. Это слово ничего не значит.
> $procurement = new Procurement(array_merge(doEmployeeFirstRank($me, 9), doEmployeeSecondRank($me, 3)
Лучше сделать у Департамента метод добавитьЛюдей и добавлять в несколько строчек. Также, можно хранить босса не в общей массе работников, а отдельным свойством и назначать отдельной функцией.
> $vektor = array(
$departments наверно лучше
> if ($k == 0) {
> echo padRight($str, $col1);
лучше наеврно просто сделать массив размеров колонок чем городить сложный if
> $adv = $advertising->doShow( );
> $sal = $sales->doShow( );
тут нужна не копипаста, а цикл.
> switch ($k) {
> case 1:
> $sumWorkers += $v;
Как-то усложненно все. Не проще ли в цикле, где ты выводишь департаменты, складывать суммы?
>Этого нету. Надо дописать что-то вроде
http://jsbin.com/hafokixuxi/1/edit
Вот так?
>5
http://jsbin.com/feyeyuhita/1/edit?js,console
Поправил.
>Не очень понял, в чем была пробелма, вроде же работает. В строгом режиме есть ограничения на то, что можно передать в качестве this, но тут вроде они не должны вызывать проблем.
В строгом режиме у меня писал ошибку в том что this - undefined в функции testThis, если вызывать её без apply.
>В apply можно передавать всевдомассив arguments и цикл не нужен.
http://jsbin.com/cefoxuburo/1/edit?js,console
Исправил.
>Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:
Ох уж эти прототипы. Не нравится мне такое наследование.
>Принято заключать действие в {} после if
Наглый копипаст, виноват.
>12
>Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:
Переделаю позже.
>как это сделано с добавками.
А я не знаю, почему я так и не сделал. Брейн лаг, наверное.
>Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом
Они там из конструктора и не берутся. Это я решил, что так там делаются приватные свойства.
>Я советую переделать класс на прототипах.
Разберусь тогда позже.
>Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.
Еще четыре заданий до них.
>Этого нету. Надо дописать что-то вроде
http://jsbin.com/hafokixuxi/1/edit
Вот так?
>5
http://jsbin.com/feyeyuhita/1/edit?js,console
Поправил.
>Не очень понял, в чем была пробелма, вроде же работает. В строгом режиме есть ограничения на то, что можно передать в качестве this, но тут вроде они не должны вызывать проблем.
В строгом режиме у меня писал ошибку в том что this - undefined в функции testThis, если вызывать её без apply.
>В apply можно передавать всевдомассив arguments и цикл не нужен.
http://jsbin.com/cefoxuburo/1/edit?js,console
Исправил.
>Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:
Ох уж эти прототипы. Не нравится мне такое наследование.
>Принято заключать действие в {} после if
Наглый копипаст, виноват.
>12
>Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:
Переделаю позже.
>как это сделано с добавками.
А я не знаю, почему я так и не сделал. Брейн лаг, наверное.
>Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом
Они там из конструктора и не берутся. Это я решил, что так там делаются приватные свойства.
>Я советую переделать класс на прототипах.
Разберусь тогда позже.
>Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.
Еще четыре заданий до них.
Вижу. что код ты улучшил, но пока неидельно.
> if (($this->field->isXOnMap($this->x + $x)) && !$this->field->checkTile($this->x + $x, $this->y)) {
> if ($this->field->isXOnMap($this->x + $value['x']) && $this->field->isYOnMap($this->y + $value['y']) && !$this->field->checkTile($this->x + $value['x'], $this->y + $value['y'])) {
Можно объединить в одну функцию, field->canMoveTo($x, $y)
> public function unsetField()
Можно просто в setField дописать
public function setField(GameField $field = null)
тогда можно будет передавать null. Но можно и как у тебя, конечно.
> foreach ($ways as $key => $value)
as $direction => $way сам собой напрашивается. Ну и наверно можно не хранить ключи-слова типа left, зачем?
> $previousUp = INF;
> $previousDown = INF;
Зачем 4 переменных? В таких ситуациях используют массив.
> public function calculateScore($list)
По моему ты написал как-то сложно. Тут надо использовать цикл:
для каждого хода:
очки = посчитатьОчкиДляХода(ход);
А не делать 4 переменных. А если мышь сможет ходить в 8 сторон, ты еще 8 блоков условий накопипастишь? Не надо.
Также, алгоримт подсчета очков стоит улучшить. Например, добавить подсчет очков число вариантов ходов из новой клетки, чтобы не забегать в углы (причем этот фактор должен иметь меньший вес: лучше сходить в угол, чем навстречу кошке).
> $turn = $this->chooseBestTurn( );
> $this->moveX($turn['x']);
У тебя chooseBestTurn может почему-то вернуть 0. И тогда будет ощибка. Так быть не должно, надо например провеять чему равно turn сначала. Ну и вместо 0 логично использовать null.
> $this->field->killMouse($tile->getCoordinateX(), $tile->getCoordinateY( ));
тут было бы проще передавать просто $tile. И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.
> public function move($x, $y)
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
> $distance = abs($this->x - $animal->getCoordinateX()) + abs($this->y - $animal->getCoordinateY( ));
Неверно считается расстояние. Кошка же по диагонали может ходить.
> $this->field = array_fill(0,
Ты никак не используешь это свойство. Раз так, хватит просто переменной.
Искажение карты еще стоит исправить.
Мышка 1 почему-то не убегает, а идет параллельно кошке. И кошка могла бы съесть ее на ход раньше.
http://ideone.com/3R0Rbr — мышк 2 храбро идет навстречу кошке почему-то.
Алсо там
> PHP Notice: Undefined offset: 1 in /home/n46k2E/prog.php on line 370
Вижу. что код ты улучшил, но пока неидельно.
> if (($this->field->isXOnMap($this->x + $x)) && !$this->field->checkTile($this->x + $x, $this->y)) {
> if ($this->field->isXOnMap($this->x + $value['x']) && $this->field->isYOnMap($this->y + $value['y']) && !$this->field->checkTile($this->x + $value['x'], $this->y + $value['y'])) {
Можно объединить в одну функцию, field->canMoveTo($x, $y)
> public function unsetField()
Можно просто в setField дописать
public function setField(GameField $field = null)
тогда можно будет передавать null. Но можно и как у тебя, конечно.
> foreach ($ways as $key => $value)
as $direction => $way сам собой напрашивается. Ну и наверно можно не хранить ключи-слова типа left, зачем?
> $previousUp = INF;
> $previousDown = INF;
Зачем 4 переменных? В таких ситуациях используют массив.
> public function calculateScore($list)
По моему ты написал как-то сложно. Тут надо использовать цикл:
для каждого хода:
очки = посчитатьОчкиДляХода(ход);
А не делать 4 переменных. А если мышь сможет ходить в 8 сторон, ты еще 8 блоков условий накопипастишь? Не надо.
Также, алгоримт подсчета очков стоит улучшить. Например, добавить подсчет очков число вариантов ходов из новой клетки, чтобы не забегать в углы (причем этот фактор должен иметь меньший вес: лучше сходить в угол, чем навстречу кошке).
> $turn = $this->chooseBestTurn( );
> $this->moveX($turn['x']);
У тебя chooseBestTurn может почему-то вернуть 0. И тогда будет ощибка. Так быть не должно, надо например провеять чему равно turn сначала. Ну и вместо 0 логично использовать null.
> $this->field->killMouse($tile->getCoordinateX(), $tile->getCoordinateY( ));
тут было бы проще передавать просто $tile. И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.
> public function move($x, $y)
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
> $distance = abs($this->x - $animal->getCoordinateX()) + abs($this->y - $animal->getCoordinateY( ));
Неверно считается расстояние. Кошка же по диагонали может ходить.
> $this->field = array_fill(0,
Ты никак не используешь это свойство. Раз так, хватит просто переменной.
Искажение карты еще стоит исправить.
Мышка 1 почему-то не убегает, а идет параллельно кошке. И кошка могла бы съесть ее на ход раньше.
http://ideone.com/3R0Rbr — мышк 2 храбро идет навстречу кошке почему-то.
Алсо там
> PHP Notice: Undefined offset: 1 in /home/n46k2E/prog.php on line 370
Код лучше постить на ideone. Смотри, как он расползается тут.
> Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?
не было, чтобы уроки не были слишком сложными. Использовать можно.
> .mb_substr($value, 1, mb_strlen($value));
Третий параметр (длина) можно не указывать, почитай мануал
> $value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));
Ты копипастишь эту строчку. Убери копипасту. Алсо, пробел можно удалить через trim.
В общем. исправь это и запости на ideone, посомтрим. Ну и через phpformatter пропусти.
>>414467
Заполнение свойств объекта, текст вопроса, варианты ответов, и тд. Этот код по моему есть выше.
>>414472
Есть хорошие задачки:
- попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
- посложнее: https://gist.github.com/codedokode/9424217
Советую по мере решения сразу же вбрасывать ссылочку на гитхаб, чем раньше найдем ошибки тем меньше переделывать придется.
Также, если охота яваскрипт помучать: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Код лучше постить на ideone. Смотри, как он расползается тут.
> Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?
не было, чтобы уроки не были слишком сложными. Использовать можно.
> .mb_substr($value, 1, mb_strlen($value));
Третий параметр (длина) можно не указывать, почитай мануал
> $value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));
Ты копипастишь эту строчку. Убери копипасту. Алсо, пробел можно удалить через trim.
В общем. исправь это и запости на ideone, посомтрим. Ну и через phpformatter пропусти.
>>414467
Заполнение свойств объекта, текст вопроса, варианты ответов, и тд. Этот код по моему есть выше.
>>414472
Есть хорошие задачки:
- попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
- посложнее: https://gist.github.com/codedokode/9424217
Советую по мере решения сразу же вбрасывать ссылочку на гитхаб, чем раньше найдем ошибки тем меньше переделывать придется.
Также, если охота яваскрипт помучать: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
>Ну и наверно можно не хранить ключи-слова типа left, зачем?
Как же я буду добавлять очки к ходу, если у него нет своего идентификатора?
> И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.
Так функция вызывается, когда двое животных в одной точке, поэтому она убивает только мышку. Я не могу сделать её универсальной, иначе она сотрёт и кошку тоже, как только та поймает мышку.
http://.../.../advert.php?id=563
Которые по сути обрабатывает один файл, воспринимаются поисковиками как разные страницы? Надо ли добавлять такие страницы в карту сайта?
И ещё один вопрос, например сайт где много одинаковых страниц, допустим вконтакте, каким образом там формируется страница пользователя при регистрации? GET запрос переходит на одну страницу которая всё обрабатывает и выводит нужные данные для каждого пользователя, или же при регистрации создаётся файл с кодом индивидуально для каждого пользователя?
Сервер можно настроить так, что Url не соответствует имени файла, и например любые запросы отправляются на index.php (или любой другой скрипт) независимо от того что написано в URL.
Вконакте не создает файлы для всех возможных URL, он использует возможности настройки сервера.
Гуглится по словам ЧПУ, pretty urls.
> Которые по сути обрабатывает один файл, воспринимаются поисковиками как разные страницы?
Это вопрос к СЕОшникам, а не к PHP программистам. Формально если URL разный, то это разные страницы. но поисковики скорее всего будут снижать им рейтинг, так как у них указан один и тот же файл. Для SEO лучше хорошие адреса типа /articles/how-to-make-something.html
>>414563
> Как же я буду добавлять очки к ходу, если у него нет своего идентификатора?
Ход это массив значений которому не нужен идентификатор. Добавляй очки в массив, в поле score.
> Я не могу сделать её универсальной, иначе она сотрёт и кошку тоже, как только та поймает мышку.
Нет. Ты же передаешь в функцию объект который надо удалить, то есть мышку. И функция должна удалять только ее. Но естественно проверь чтобы кошка не могла съесть кошку.
Вижу, ты улучшил код. Но если посмртреть повнимательнее, то можно увидеть еще небольшой список замечаний.
> if ($score < $direction['score']) {
> $list[$key]['score'] = $score;
Тут ошибка. Ты обновляешь исходный массив но не обновляешь его копию в direction (и сравшиваешь дальше очки со старой копией).
Ты зря все сваливаешь в одну функцию. Мне кажется, было бы удобнее еще чуть разбить:
> public function calculateScore($list)
Здесь можно добавить функцию которая считает очки для единственного хода.
Хорошо бы добавить учет числа возможных ходов при расчетет числа баллов. Чтобы мышки не забегали в углы (и клетки окруженные мышами).
Также вынести в отдельную функцию определение расстояния от клетки до ближайшей кошки.
> $score = abs($cat->getCoordinateX() - $direction['x']) + abs($cat->getCoordinateY() - $direction['y']);
Непраивльный по моему метод определения расстояния до кошки. Также, я вижу что там есть в 2 местах код, который ищет ближайшее к клетке животное — а это копипаста, нехорошо, надо бы вынести куда-нибудь.
Надо еще добавить тайпхинты, если в функцию передается массив? то дописать array.
> $this->moveX($turn['x']);
> $this->moveY($turn['y']);
Лучше наверно просто сделать функцию moveTo(x, y)
Еще тут, у кошки сомнительный код:
> $this->x = $this->x + $x;
...
> $tile = $this->field->checkTile($this->x, $this->y);
Ты сначала кошкой встаешь на клетку, а потом спрашиваешь у карты, кто на ней стоит. По моему, тут может вернуться кошка и тогда мышка не будет замечена. Надо в обратном порядке делать, или например временно записывать новые x и y в переменные.
Дальше, есть такая функция и у кошки и у мышки, public function makeMove(). Мне кажется незачем ее копипастить, а можно переместить в базовый класс Животное, ведь любое животное сначала выбирает, а потом делает ход.
chooseBestTurn тогда надо будет сделать абстрактной функцией.
Если ты это исправишь, думаю, все будет нормально.
Вижу, ты улучшил код. Но если посмртреть повнимательнее, то можно увидеть еще небольшой список замечаний.
> if ($score < $direction['score']) {
> $list[$key]['score'] = $score;
Тут ошибка. Ты обновляешь исходный массив но не обновляешь его копию в direction (и сравшиваешь дальше очки со старой копией).
Ты зря все сваливаешь в одну функцию. Мне кажется, было бы удобнее еще чуть разбить:
> public function calculateScore($list)
Здесь можно добавить функцию которая считает очки для единственного хода.
Хорошо бы добавить учет числа возможных ходов при расчетет числа баллов. Чтобы мышки не забегали в углы (и клетки окруженные мышами).
Также вынести в отдельную функцию определение расстояния от клетки до ближайшей кошки.
> $score = abs($cat->getCoordinateX() - $direction['x']) + abs($cat->getCoordinateY() - $direction['y']);
Непраивльный по моему метод определения расстояния до кошки. Также, я вижу что там есть в 2 местах код, который ищет ближайшее к клетке животное — а это копипаста, нехорошо, надо бы вынести куда-нибудь.
Надо еще добавить тайпхинты, если в функцию передается массив? то дописать array.
> $this->moveX($turn['x']);
> $this->moveY($turn['y']);
Лучше наверно просто сделать функцию moveTo(x, y)
Еще тут, у кошки сомнительный код:
> $this->x = $this->x + $x;
...
> $tile = $this->field->checkTile($this->x, $this->y);
Ты сначала кошкой встаешь на клетку, а потом спрашиваешь у карты, кто на ней стоит. По моему, тут может вернуться кошка и тогда мышка не будет замечена. Надо в обратном порядке делать, или например временно записывать новые x и y в переменные.
Дальше, есть такая функция и у кошки и у мышки, public function makeMove(). Мне кажется незачем ее копипастить, а можно переместить в базовый класс Животное, ведь любое животное сначала выбирает, а потом делает ход.
chooseBestTurn тогда надо будет сделать абстрактной функцией.
Если ты это исправишь, думаю, все будет нормально.
Опять говно всплыло на нулевую.
diff leb1.txt leb2.txt
110d109
< 72
118d116
< 64
123,124d120
< 59
< 58
129,130d124
< 53
< 52
137,138d130
< 45
< 44
144,145d135
< 38
< 37
150,151d139
< 32
< 31
153,154d140
< 29
< 28
158d143
< 24
160,161d144
< 22
< 21
164,166d146
< 18
< 17
< 16
169,173d148
< 13
< 12
< 11
< 10
< 9
175,181d149
< 7
< 6
< 5
< 4
< 3
< 2
< 1
diff leb1.txt leb2.txt
110d109
< 72
118d116
< 64
123,124d120
< 59
< 58
129,130d124
< 53
< 52
137,138d130
< 45
< 44
144,145d135
< 38
< 37
150,151d139
< 32
< 31
153,154d140
< 29
< 28
158d143
< 24
160,161d144
< 22
< 21
164,166d146
< 18
< 17
< 16
169,173d148
< 13
< 12
< 11
< 10
< 9
175,181d149
< 7
< 6
< 5
< 4
< 3
< 2
< 1
Я пытался добавить учет количества возможных ходов из новой точки, но по моему сделал еще хуже http://ideone.com/OEx7oY
>PHP
Ебать вы тут копрофилы. И говнецом в виде пхп-лапши небось обмазываетесь, быдло?
Окропил всех ИТТ,
Мамашу выеби свою, анимеблядь.
http://ideone.com/xkrzIC
Я тут немного переделал свойства департаментов и стало намного проще делать вывод, добавил в свойства департамента суммарные данные по работникам.
Да у тебя там многое не так.
У тебя кошки после поедания не пропускают ход, кошка даже на десяток мышей кидается и тд.
Да ты знатный копрофил, я тебе должен сказать.
Вот именно. Если брать понятия "интерфейс" и "абстрактный класс" вне контекста php, то интерфейс - это подмножество абстрактного класса. Они-то и сделаны были как замена множественному наследованию. А всякие там "концептуальные" свойства им приписали уже потом.
> Чтобы поменять цвета всех клеточек сразу, необязательно обходить их в цикле. Если помечать нажатые клетки определенным классом, то перекрасить их все одновременно можно, поменяв класс на самой таблице.
Непоне
Может есть списочек того, что хорошо бы знать, чтобы устроиться пхп-джуниором? А то листаю вакансии своего городка, а там только "знание кмс" и "знание фреймворков".
Абтрактный метод — это метод, у котрого нет тела и который обязаны реализовать потомки класса: http://php.net/manual/ru/language.oop5.abstract.php
>>414652
В шаблоне наверно надо какой-нибудь класс поставить на текущйи пункт. Почитай документацию по «аккордеону»
>>414722
Не понял о чем ты
>>414857
> $distance 2 + $extra;
А в чем смысл прибавлять extra?
> public function move($x, $y)
...
> $this->x = $this->x + $x;
...
> $tile = $this->field->checkTile($this->x, $this->y);
Ты это еще не исправил. Ты сначала кошкой встаешь на клетку, а потом ищешь кто еще на ней есть. Так кошка может не заметить мышку.
Также, в функции move у кошки надо перевернуть if. У тебя там он слишком большой. Также можно упростить if и в makeMove у кошки.
Также, у тебя поле почему-то криво выводится. Там нескольких пробелов не хватает.
И посмотри тут ошибка внизу: http://ideone.com/kUycaY
> PHP Notice: Undefined offset: 0 in /home/cCChGL/prog.php on line 370
> Я пытался добавить учет количества возможных ходов из новой точки, но по моему сделал еще хуже
Это потому что ты не используешь вес. Разные факторы имеют разную важность. То, что на клетке рядом кошка во много раз важнее чем то, сколько из нее можно сделать ходов. Потому общее число очков надо считать по такой формуле:
score = w1×f1 + w2×f2
Где w1, w2 — веса факторов, а f1 и f2 — сами факторы (расстояние до кошки и число вариантов хода)
Абтрактный метод — это метод, у котрого нет тела и который обязаны реализовать потомки класса: http://php.net/manual/ru/language.oop5.abstract.php
>>414652
В шаблоне наверно надо какой-нибудь класс поставить на текущйи пункт. Почитай документацию по «аккордеону»
>>414722
Не понял о чем ты
>>414857
> $distance 2 + $extra;
А в чем смысл прибавлять extra?
> public function move($x, $y)
...
> $this->x = $this->x + $x;
...
> $tile = $this->field->checkTile($this->x, $this->y);
Ты это еще не исправил. Ты сначала кошкой встаешь на клетку, а потом ищешь кто еще на ней есть. Так кошка может не заметить мышку.
Также, в функции move у кошки надо перевернуть if. У тебя там он слишком большой. Также можно упростить if и в makeMove у кошки.
Также, у тебя поле почему-то криво выводится. Там нескольких пробелов не хватает.
И посмотри тут ошибка внизу: http://ideone.com/kUycaY
> PHP Notice: Undefined offset: 0 in /home/cCChGL/prog.php on line 370
> Я пытался добавить учет количества возможных ходов из новой точки, но по моему сделал еще хуже
Это потому что ты не используешь вес. Разные факторы имеют разную важность. То, что на клетке рядом кошка во много раз важнее чем то, сколько из нее можно сделать ходов. Потому общее число очков надо считать по такой формуле:
score = w1×f1 + w2×f2
Где w1, w2 — веса факторов, а f1 и f2 — сами факторы (расстояние до кошки и число вариантов хода)
>А в чем смысл прибавлять extra?
Короче, когда мышка достигает потолка на поле, а мышка ниже неё, она перестаёт вообще делать телодвижения, потому-что соседние клетки имеют такое же максимальное расстояние до кошки (т.к расстояние берется по одной оси, по которой кошка дальше), как и та на которой мышь уже стоит. Единственный способ это решить, который мне пришел в голову, это добавлять к очкам еще и расстояние по второстепенной оси, предварительно увеличив в два раза очки главной оси. Сумбурно написал, но надеюсь ты понял.
http://ideone.com/PwpzXA проще показать наверное, чем объяснить. Как видишь мышка впадает в экзистенциальный кризис и решает просто стоять на месте.
И, да, чем 2 не вес расстояния, а 1 вес числа вариантов, как в моем примере здесь http://ideone.com/OEx7oY ?
Аниме без школьников? Ну не знаю, Welсome to NHK или десу ното какой-нибудь. Что-то мне в голову ничего больше не приходит.
>>414886
Ничего не делать, просто не давать пройти на занятое место. У тебя мышки и кошки ходят поверх друг друга, а должны обходить.
А так, видео выглядит замечательно.
Ну и на первом видео у тебя по моему мышки тупят, там видно что некотоые бегут навстречу кошке, а не от нее.
>>414894
> добавил в свойства департамента суммарные данные по работникам.
Это не хорошая идея. Ведь если ты поменяешь ранг у работника или уволишь кого-нибудь, они не пересчитаются. Лучше сделать вычисление этих данных методами.
Ну а вывод будет занимать примерно столько же, просто вместо
$department->coffee
будет
$department->getCoffee()
> if ($isDirector == 1) {
> $this->salary = 1.5;
Это неправильно, salary должна обозначать базовую неизменную ставку, а умножать надо в функции вычисления зарплаты. а то в твоем варианте если разжаловать из директор в обычные сотрудники, зарплата обратно не пересчитается.
То же самое с рангом, если у тебя повысить ранг сотруднику, зарлпата не пересчитывается.
> procurement = new Department('Procurement', array_merge(getEmployee(1, $me, 9), getEmployee(2, $me, 3), getEmployee(3, $me, 2), getEmployee(1, $ma, 2), getEmployee(2, $me, 1, 1)));
Это можно было хотя бы в столбик записать, слишком длинно же. А лучше, давай сделаем у департамента метод addEmployee который позволяет добавлять по несколько сотрудников за раз.
> global $col1;
Не используй global. Аргументы можно передать и так.
> $repSal /= 4;
тут должна быть не цифра 4, а число департаментов
>>414921
Нет.
>>414926
Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.
>>414929
Зависит от компании. Где-то будут спрашивать всякие вопросы из теории типа «чему равно 0 == "hello"» или «чем отличается 1-я, 2-я и 3-я нормальные формы в SQL» или «какие бывают уровни изоляции транзакций». Для подготовки к таким вопросам стоит просто прочесть мануал по PHP.
Бывает, что дают какое-то тестовое задание: сделать прстой сайт или страничку или написать класс.
Ну а бывает, что хотят отличников и победителей олимпиад.
Аниме без школьников? Ну не знаю, Welсome to NHK или десу ното какой-нибудь. Что-то мне в голову ничего больше не приходит.
>>414886
Ничего не делать, просто не давать пройти на занятое место. У тебя мышки и кошки ходят поверх друг друга, а должны обходить.
А так, видео выглядит замечательно.
Ну и на первом видео у тебя по моему мышки тупят, там видно что некотоые бегут навстречу кошке, а не от нее.
>>414894
> добавил в свойства департамента суммарные данные по работникам.
Это не хорошая идея. Ведь если ты поменяешь ранг у работника или уволишь кого-нибудь, они не пересчитаются. Лучше сделать вычисление этих данных методами.
Ну а вывод будет занимать примерно столько же, просто вместо
$department->coffee
будет
$department->getCoffee()
> if ($isDirector == 1) {
> $this->salary = 1.5;
Это неправильно, salary должна обозначать базовую неизменную ставку, а умножать надо в функции вычисления зарплаты. а то в твоем варианте если разжаловать из директор в обычные сотрудники, зарплата обратно не пересчитается.
То же самое с рангом, если у тебя повысить ранг сотруднику, зарлпата не пересчитывается.
> procurement = new Department('Procurement', array_merge(getEmployee(1, $me, 9), getEmployee(2, $me, 3), getEmployee(3, $me, 2), getEmployee(1, $ma, 2), getEmployee(2, $me, 1, 1)));
Это можно было хотя бы в столбик записать, слишком длинно же. А лучше, давай сделаем у департамента метод addEmployee который позволяет добавлять по несколько сотрудников за раз.
> global $col1;
Не используй global. Аргументы можно передать и так.
> $repSal /= 4;
тут должна быть не цифра 4, а число департаментов
>>414921
Нет.
>>414926
Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.
>>414929
Зависит от компании. Где-то будут спрашивать всякие вопросы из теории типа «чему равно 0 == "hello"» или «чем отличается 1-я, 2-я и 3-я нормальные формы в SQL» или «какие бывают уровни изоляции транзакций». Для подготовки к таким вопросам стоит просто прочесть мануал по PHP.
Бывает, что дают какое-то тестовое задание: сделать прстой сайт или страничку или написать класс.
Ну а бывает, что хотят отличников и победителей олимпиад.
Я не понимаю о чем речь, но не проще ли высчитывать для каждой соседней точки очки как длину стороны треугольника? Где координаты одной точки треугольника это координаты кошки, координаты мыши это вторая точка, а координаты третьей точки - координаты потенциальной клетки для перехода?
> Единственный способ это решить, который мне пришел в голову, это добавлять к очкам еще и расстояние по второстепенной оси,
Да, это имеет смысл, но не уверен что тут надо использовать max. Лучше наверно рассчитывать второе расстояние, dx + dy или корень(dx^2 + dy^2) и добавлять его с понижающим весом.
>>415037
да, это вес, но к числу возможных ходов ты не добавил вес почему-то.
Не совсем, так как кошка ходит по клеточкам, а не по стороне треугольника. И можно посчитать неприавльно.
Нет, погоди, почему 1? Если для числа кошек вес = 2 то получается наличие 2 лишних клеток для хода перевешивает тот факт, что рядом кошка?
>Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.
Даже не знал что в ксс есть условия.
И даже ненагуглил, ОП ты увере?
Смотри. Допустим у нас черные клеточки имеют класс .checked, тогда мы можем написать
.checked { color: black; }
.inverted .checked { color: white; }
Если на таблицу добавить класс inverted то черные клеточки станут белыми. ты этого не знал? Может тебе стоит задачки из пути HTML/CSS порешать?
>Может тебе стоит задачки из пути HTML/CSS порешать?
Я УДАРЮ ТЕБЯ В ЛИЦО, НУ ИЛИ В ЖИВОТ, ЕСЛИ ТЫ КРАСИВЫЙ
Попробовал написать игровой автомат при помощи сессий, вот что вышло-http://ideone.com/AT5UcQ. Он конечно в Идеоне не работает, но у меня на денвере кажется работает, только вот одна проблема возникла, не могу прекратить скрипт после того как баланс станет меньше 0. Логично предположить что можно сделать выполнение скрипта при условии:
if($_session["balance"]>0) {
....
}
Но так не выходит потому что сессия у меня определяется в середине скрипта, и тогда он просто не будет работать, как ещё это можно реализовать?
Приветствую вас будущие хакеры.
У меня к вам нюфажный вопрос-задание, помогите пожалуйста.
Как создать такую херню?
1. где плюсики, чтоб можно было добавить фото.
2. товары 1 товары 2, как при нажатии их главное окно не менялось? Нужно отдельный файл создать? скажем tovari1.html, tovari2.html
Извините за ньюфажный вопрос если ответите, просто мне важнo понимание общей струткуры.
>Тебе нужен яваскрипт — язык, программы на котором выполняются на страние в браузере.
Это я знаю ну разве это не в команде с html css и явой выполняется? Вариант ли такую страничку только в яваскрипте создать?
http://ideone.com/Fm386s
Перенес рассчет зарплаты из работника в департаменты, поменял способ создания департаментов (И сразу вопрос: когда я в массиве указывал "1, $ma, 15", пропуская четвертую переменную, и потом при разбивке этой строки на массив через explode() и присвоении через языковую конструкцию list() переменным $rank, $class, $count, $isDirector значения массива который получился на выходе из explode() ideone ругался на это, видимо на отсутствие четвертого элемента для переменной $isDirector, можно ли так делать если в конструкторе уже стояло $isDirector = 0 по умолчанию? Или надо делать как я сделал тут и указывал в конце "1, $ma, 15, 0" ?)
Вот начальная страничка двача.
Неужели это 571 строка кода только начальной страницы? только начальной да?
Вот код раздела /pr здесь уже 5441 строчек кода.
Интересно сколько код двача весит? и вообще сколько строчек кода у двача?
пробегись по всем разделам и просуммируй количества строчек
столько и будет строчек кода у двача
алсо незабудь скрытые разделы и каждый тред в каждом разделе - у них свои строчки, страницы то разные
Но в тредах всего-лишь текст, который потом через гет запрос выдаётся браузеру, нет?
Думаю, что не сложнее форума.
{
\t"item_1" : [
\t\t{"name" : "Article 1"},
\t\t{"status" : 0}
\t],
\t"item_2" : [
\t\t{"name" : "Article 2"},
\t\t{"status" : 0}
\t]
}
Может ли Javascript изменить файл items.json, чтобы например у Article 1 всегда был status = 1, пока я опять его не поменяю в своём index.html? Я знаю, что для Пыха нужно создавать БД и посылать SQL-запросы для её изменения. Но интересует в данном случае JS - могу ли я использовать items.json в качестве своего рода базы данных и изменять её посредством js-скриптов.
Не в тот тред пишешь. Есть отдельный лля JS.
Отвечу, что думаю. Да, это возможно, но дело в том, что сам JSON тебе все равно придется хранить где-то отдельно, самый простой способ - в localstorage браузера.
Читаешь свой объект оттуда, изменяешь и сохраняешь обратно.
ОП и с джаваскриптом помогает. Касательно localstorage, я пробовал туда сохранять данные, но мне не удавалось одновременно их туда записывать и доставать без перезагрузки страницы браузера.
Последний ход второй мыши вообще самоубийственный, поэтому нет, не эффективно.
1) Госзакупочки - http://ideone.com/BoKyTS
2) Первое из "повторим" - http://ideone.com/2HwBt2
Почему самоубийственный? Потому-что в угол идет? Ну так она не может просчитывать на два хода вперед, только на один.
Ты меня не понял совсем. У тебя сначала просчитываются варианты хода для мышки? Просчитываются они относительно текущей координаты кошки, верно? Так и считай как я на картинке нарисовал.
Не очень верно выразился, тут можно даже не использовать вычисление стороны треугольника, а банально воспользоваться формулой нахождения длины отрезка из линейной алгебры.
Желтое - текущее расстояние между кошкой и мышкой (не нужно)
Зеленое - потенциальные мышиные ходы.
Синее - просчет расстояний для этих ходов.
Далее смотрим какое из этих расстояний будет наибольшим, то есть куда мышь может сходить, что бы после хода оказалась от кошки дальше всего, это я красным пометил. Вот эти синие расстояния и есть своеобразные очки. Ходим туда, где больше.
Кошка в свою очередь будет использовать тот же самый алгоритм, только она будет высчитывать на какой клетке она будет находится ближе к мышке после своего хода. Изи же?
Напиши, пожалуйста, про файлообменник, бложик, арканоид. По каким мануалам делал, где брал задание? Не хочу соснуть на след. собеседовании и показать что-то интересное.
Твой алгоритм не учитываает что кошек может быть несколько. Ну и вместо вычисления длины отрезка лучше считать число ходов нужных кошке для достижения клетки (они не совпадают, например кошка идет по диагонали за 1 ход, а длина отрезка будет 1.41).
Я думаю, на гитхабе Опа:
- файлообменник: https://gist.github.com/codedokode/9424217
- арканоид (на JS + канвас): https://gist.github.com/codedokode/9933897
- бложек — не знаю
Также, если ты слаб в знании HTML/JS у нас есть задачки:
- Путь HTML/CSS https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- Путь JS https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Задачки на SQL (и список слов которые хорошо бы знать) https://gist.github.com/codedokode/10539213
Если ты провалился из-за PHP то напиши из-за чего, может тоже что-нибудь посоветую.
>>415362
Если никто не захочет, то есть еще вариант пофиксить баг/написать фичу в каком-нибудь опен сурс проекте. Там тоже придется разбираться в чужом коде, мерджить, работать с тестами (ты же не делал тесты? если хочешь, можем поучиться писать тесты например для файлообменника).
Ну и еще для развития полезно изучить Yii2 или Symfony 2, особенно последний.
>>415348
Вообще, CSS скорее всего такого не позволяет. абсолютно позицонированный элемент может иметь размер зависящий от предка, но АП элементы не могут опираться на таблицу или ячейки таблиы.
Напиши подробнее, может что-нибудь придумаем.
Может быть тут яваскрипт нужен.
>>415305
Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.
>>415286
Месяц-два. У меня верстка есть кстати, правда, кривая: https://github.com/codedokode/board-markup
>>415273
Это не строчки кода, а HTML-код страницы. Посты хранятся в базе данных, и при обращении серверные скрипты берут посты из БД, подставляют в шаблон и формируют страницу которую ты видишь. Она может быть нигде не хранится, а генерируется каждй раз (а может и хранится ради ускорения отдачи ее во второй раз).
Ты слышал про динамические сайты? Это как раз сайты которые генерируют html код подставляя данные из БД в шаблон.
Я думаю, на гитхабе Опа:
- файлообменник: https://gist.github.com/codedokode/9424217
- арканоид (на JS + канвас): https://gist.github.com/codedokode/9933897
- бложек — не знаю
Также, если ты слаб в знании HTML/JS у нас есть задачки:
- Путь HTML/CSS https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- Путь JS https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Задачки на SQL (и список слов которые хорошо бы знать) https://gist.github.com/codedokode/10539213
Если ты провалился из-за PHP то напиши из-за чего, может тоже что-нибудь посоветую.
>>415362
Если никто не захочет, то есть еще вариант пофиксить баг/написать фичу в каком-нибудь опен сурс проекте. Там тоже придется разбираться в чужом коде, мерджить, работать с тестами (ты же не делал тесты? если хочешь, можем поучиться писать тесты например для файлообменника).
Ну и еще для развития полезно изучить Yii2 или Symfony 2, особенно последний.
>>415348
Вообще, CSS скорее всего такого не позволяет. абсолютно позицонированный элемент может иметь размер зависящий от предка, но АП элементы не могут опираться на таблицу или ячейки таблиы.
Напиши подробнее, может что-нибудь придумаем.
Может быть тут яваскрипт нужен.
>>415305
Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.
>>415286
Месяц-два. У меня верстка есть кстати, правда, кривая: https://github.com/codedokode/board-markup
>>415273
Это не строчки кода, а HTML-код страницы. Посты хранятся в базе данных, и при обращении серверные скрипты берут посты из БД, подставляют в шаблон и формируют страницу которую ты видишь. Она может быть нигде не хранится, а генерируется каждй раз (а может и хранится ради ускорения отдачи ее во второй раз).
Ты слышал про динамические сайты? Это как раз сайты которые генерируют html код подставляя данные из БД в шаблон.
> явой
ява != яваскрипт
> Вариант ли такую страничку только в яваскрипте создать?
Можно но это глупо так как HTML и CSS удобнее хранить в HTML и CSS файлах, а не запихивать в яваскрипт.
> как при нажатии их главное окно не менялось?
за счет яваскрипта, их надо сделать не ссылками уводящими на другую страницу, а кнопками.
> Нужно отдельный файл создать? скажем tovari1.html, tovari2.html
нет
Тебе надо изучить яваскрипт, (а может и HTML подучить) я вижу ты не понимаешь совсем, как он работает. Хороший учебник есть на learn.javascript.ru, а у меня если что есть задачки.
>>415346
Ты что-то не так делал, для localstorage никакие перезагрузки страницы не нужны.
>Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.
Это задание мне нужно будет выложить на гитхаб pages. Насколько я знаю, там нет возможности прикрутить PHP, а покупать хостинг ради портфолио меня смущает. Но я могу ошибаться, т.к. сталкивался с json только в старом учебнике по Javascript от Head First Lab. В общем, анончик, мне нужно запилить "эмуляцию" корзины интернет-магазина без создания БД на MySQL и пыха. Такое реально сделать на JS и захостить на гитхабе?
>если никто не захочет, то есть еще вариант пофиксить баг/написать фичу в каком-нибудь опен сурс проекте. Там тоже придется разбираться в чужом коде, мерджить, работать с тестами (ты же не делал тесты? если хочешь, можем поучиться писать тесты например для файлообменника
Тесты не делал, научиться хочу. Можно и опенсорс, но как найти? Как вообще влиться в какой-то проект? А вообще у меня была идея пилить некий онлайн to-do list. Я даже начал на симфонии его делать, но не смог разобраться как в доктрине привязывать сразу несколько файлов (например несколько картинок) к одному таску, расстроился и дропнул. Вообще симфонии мне очень тяжёлой показалась я думаю yii2 полегче должен быть.
Имею достаточные знания по PHP, опыт работы 3+ лет, еще не достаточно глубоко зарылся в крутые штуки, поэтому появилась идея создать небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего): серию скринкастов + вебинары (пару раз в неделю по вечерам) + задания и некоторые фишки для быстрого запоминания всей информации. Курс будет рассчитан на почти нулевые знания.
В процессе планирую описать не только саму разработку, но и в целом подход к разработке, постараюсь привить УМЕНИЯ вместе со знаниями.
Ну и после курса, если не ебланить, можно будет без проблем устроиться на джуниорскую позицию.
Планирую брать за это небольшие деньги - около 2-3к за курс.
Основное преимущество перед книгами - вебинары и задания. Да, я не научу строить фейсбук или высоконагруженную йобу, но основная цель - научить ориентироваться во всем этом и показать верное направление.
Срок обучения - 1-2 месяца.
Да, знаю про наличие всяких обучающих центров, где так же преподают PHP - но там или дорого для учащегося (около 10к), либо мне, как автору, сложно туда попасть (уже есть свои курсы по PHP), либо же проценты они берут грабительские (70% себе, 30% - автору).
Как думаешь анон, выгорит такая затея? Ты бы записался на курс?
>Как думаешь анон, выгорит такая затея? Ты бы записался на курс?
Нет. Помощь опа лучше всяких ВЕБИНАРОВ.
Покупать кота в мешке, то есть платить вперед не зная за что, вряд ли кто-то согласится. Сначала продемонстрируй свое умение учить, а потом проси деньги. Можно сделать демо-урок или что-нибудь такое.
Насчет опенсорс, я посмотрю и подумаю где можно поучаствовать. В крайнем случае можно свою небольшую полезную бибилтеку или приложение сделать.
Я в симфони и доктрине разбираюсь и умею гуглить, так что могу подсказать если что. Насчет привязки картинок к таску, надо наверно разобраться с тем как в доктрине реализуется отношение один-ко-мнгим. Если ты этого не знаешь, то ты просто в ней толком не разобрался.
> я думаю yii2 полегче должен быть.
Он проще, но симфони праивльнее и полезнее
>>415493
Можно взять триал, если предлагают, на платном хостинге и не платить. А можно сохранять в localstorage, почеиму бы и нет. И я не представляю как ты будешь делать корзину без магазина. А товары как тда добавлять?
Да, планирую демо-уроки в виде отрезков из скринкастов, откуда можно будет понять уровень в целом + сделать первый онлайновый урок бесплатным, чтобы можно было оценить качество.
Отлично подметил, в таком случае:
>что кошек может быть несколько.
Нужно просчитывать расстояния от каждой кошки, брать ту которая будет ближе всего, и по сути является самой реальной угрозой, и плясать от неё. Либо же брать две ближайших кошки, и выбирать клетку на которой сумма расстояний от обоих кошек будет наибольшей.
>идет по диагонали за 1 ход, а длина отрезка будет 1.41).
Вот это кстати паршиво, боже как несовершенен поклеточный мир. И ведь даже квака третья в своё время этим страдала, и халфа помоему, когда по диагонали ты двигался быстрее чем прямо, лел. Распрыг во все поля. надо заставить мышку двигаться зигзагом, и её никто не догонит, лел
У мыши ттх хуже чем у кошки, она по диагонали не ходит.
Бессплатные хостинги отменили что-ли? Тебе же портфолио всего-то.
бамп
>"name: blablabla\n" и "name: blablabla2\n"
fix
Надо выдернуть все от пробела после name: и до конца строки, которая \n.
> Перенес рассчет зарплаты из работника в департаменты,
По моему зря. Работник и сам может считать свою зарплату, если сделать ему метод getSalary. Не очень понятно, почему это должно быть в департаменте. Ведь для расчета нужны только свойства работника, департамент не нужен. Я думаю, праивльнее сделать метод в работнике.
Ну и смотри, допустим мы хотим чтобы у менеджеров зарплата считалась как-то по-другому. В твоем случае придется городить еще ифы, а в моем лишь перепределить getSalary в классе Менеджер.
> когда я в массиве указывал "1, $ma, 15", пропуская четвертую переменную, и потом при разбивке этой строки на массив через explode() и присвоении через языковую конструкцию list() переменным $rank, $class, $count, $isDirector значения массива который получился на выходе из explode() ideone ругался на это, видимо на отсутствие четвертого элемента для переменной $isDirector, можно ли так делать если в конструкторе уже стояло $isDirector = 0 по умолчанию?
Нельзя. Ведь ошибку тебе выдает list из-за того что ты пылаешься получить больше значений чем есть в массиве. Он ничего не знает о том, куда дальше пойдут эти переменные.
Ну и я не очень понимаю, зачем ты сделал строку вместо массива. По моему, с массивом было бы проще, но путь так будет, я не против.
> Или надо делать как я сделал тут и указывал в конце "1, $ma, 15, 0" ?)
Либо указывать 0 в конце либо переделать list чтобы он не брал 4 переменных когда их там нет.
Вместо 0 и 1 для isDirector в программировании принято использовать true и false (и вообще для всех ситуаций когда надо сказать да/нет, включено/выключено и тд). вот мануал: http://php.net/manual/ru/language.types.boolean.php
Булевых значений не было в моем учебнике ради простоты, но на самом-то деле они есть. Может потом урок сделаю.
В остальном хорошо.
В общем, насчет фреймворков, тут есть 3 выбора: Yii1, Yii2 и Symfony 2. Symfony сложнее, Yii проще. Yii2 лучше чем Yii1 так как там отказались от многих своих велосипедов и привели код ближе к современным стандартам, но по нему меньше документации (тем более на русском) и он пока менее распространен. Но очевидно, что в будущем его доля будет расти, а Yii1 перестанут развивать.
Symfony 2 гороаздо более продвинутый, там и сложный роутер, и yaml, и dependency injection, и ORM doctrine, и замечательный twig, в общем все на ООП и паттернах, но в нем сложнее и гораздо дольше разбираться.
Плюс, еще есть тема автоматизированного тестирования. Она тоже довольно интересная, в рамках ее мы будем писать юнит- и функциональные тесты (в случае файлообменника наверно в основном функциональные), которые смогут проверять что все работает правильно. Иметь тесты — очень удобно: если ты добавил какую-то фичу или поменял код, ты можешь убедиться что ничего не сломалось (без тестов проверить большой сложный продукт вряд ли реально). Мы могли бы изучить фреймворк phpUnit, может быть посмотреть codeception и может даже PhntomJS/Selenium (c помощью которых делаются браузерные тесты). Также, мы могли бы попробоать подключить к твоему проекту на гитхаб CI сервер Travis CI (он бесплатен для открытых проектов).
Тесты особенно важны в проектах с большим числом участников: как ты без них проверишь, что никто ничего не сломал? разве что рутинным ручным тестированием, что тебе быстро надоест. Обычно хорошие open source проекты содержат тесты.
CI (Continuous integration) сервер — это штука которая умеет сама подсоединяться к репозитоию, выкачивать новый код и прогонять по нему тесты. Таикм образом, тебе не надо запускать тесты руками, и ждать пока они выполнятся — ты всегда можешь зайти на CI сервер и увидеть историю проверок. Вот пример тестов для одного open source проекта (фреймворк Slim):
https://github.com/codeguy/Slim/tree/master/tests
А вот страница на Travis где отображаютя результаты выполнения тестов:
https://travis-ci.org/codeguy/Slim
(можно кликнуть на Job и увидеть подробности выполнения теста например https://travis-ci.org/codeguy/Slim/jobs/43590635 )
Это может выглядеть сложным, но для того же файлообменника все будет гораздо проще.
Правда, не знаю, везде ли используются тесты. Компании типа Яндекса или Баду (они на Php написаны) активно их используют, а другие компании часто тестируют вручную или вообещ не тестируют.
Насчет того, что востребовано на рынке труда, я не в курсе, но думаю можно прошерстить вакансии и составить самому статистику.
Ну и насчет битрикса, надо понимать, что в студии по созданию сайтов (особенно не высокобюджетных) вряд ли есть время на изучение каких-то сложных фреймворков, обычно сайты делаются на какой-то сторонней или своей CMS. Если ты хочешь заниматься более сложными вещами, тебе надо смотреть в сторону компаний-аутсорсеров (которые делают сложные проекты на заказ) или продуктовых компаний (которые делают продукт для себя и зарабатывают на нем). Ну и смотреть, какие технологии используются в компании, над какими проектами они работают.
Ну и еще, если ты хочешь развиваться, ты бы мог посмотреть в сторону яваскрипт и яваскрипт-библиотек и фреймворков. У меня есть задачки на эту тему (на яваскрипт-фреймворки правда пока нету, только на jQuery и jQuery UI).
В общем, насчет фреймворков, тут есть 3 выбора: Yii1, Yii2 и Symfony 2. Symfony сложнее, Yii проще. Yii2 лучше чем Yii1 так как там отказались от многих своих велосипедов и привели код ближе к современным стандартам, но по нему меньше документации (тем более на русском) и он пока менее распространен. Но очевидно, что в будущем его доля будет расти, а Yii1 перестанут развивать.
Symfony 2 гороаздо более продвинутый, там и сложный роутер, и yaml, и dependency injection, и ORM doctrine, и замечательный twig, в общем все на ООП и паттернах, но в нем сложнее и гораздо дольше разбираться.
Плюс, еще есть тема автоматизированного тестирования. Она тоже довольно интересная, в рамках ее мы будем писать юнит- и функциональные тесты (в случае файлообменника наверно в основном функциональные), которые смогут проверять что все работает правильно. Иметь тесты — очень удобно: если ты добавил какую-то фичу или поменял код, ты можешь убедиться что ничего не сломалось (без тестов проверить большой сложный продукт вряд ли реально). Мы могли бы изучить фреймворк phpUnit, может быть посмотреть codeception и может даже PhntomJS/Selenium (c помощью которых делаются браузерные тесты). Также, мы могли бы попробоать подключить к твоему проекту на гитхаб CI сервер Travis CI (он бесплатен для открытых проектов).
Тесты особенно важны в проектах с большим числом участников: как ты без них проверишь, что никто ничего не сломал? разве что рутинным ручным тестированием, что тебе быстро надоест. Обычно хорошие open source проекты содержат тесты.
CI (Continuous integration) сервер — это штука которая умеет сама подсоединяться к репозитоию, выкачивать новый код и прогонять по нему тесты. Таикм образом, тебе не надо запускать тесты руками, и ждать пока они выполнятся — ты всегда можешь зайти на CI сервер и увидеть историю проверок. Вот пример тестов для одного open source проекта (фреймворк Slim):
https://github.com/codeguy/Slim/tree/master/tests
А вот страница на Travis где отображаютя результаты выполнения тестов:
https://travis-ci.org/codeguy/Slim
(можно кликнуть на Job и увидеть подробности выполнения теста например https://travis-ci.org/codeguy/Slim/jobs/43590635 )
Это может выглядеть сложным, но для того же файлообменника все будет гораздо проще.
Правда, не знаю, везде ли используются тесты. Компании типа Яндекса или Баду (они на Php написаны) активно их используют, а другие компании часто тестируют вручную или вообещ не тестируют.
Насчет того, что востребовано на рынке труда, я не в курсе, но думаю можно прошерстить вакансии и составить самому статистику.
Ну и насчет битрикса, надо понимать, что в студии по созданию сайтов (особенно не высокобюджетных) вряд ли есть время на изучение каких-то сложных фреймворков, обычно сайты делаются на какой-то сторонней или своей CMS. Если ты хочешь заниматься более сложными вещами, тебе надо смотреть в сторону компаний-аутсорсеров (которые делают сложные проекты на заказ) или продуктовых компаний (которые делают продукт для себя и зарабатывают на нем). Ну и смотреть, какие технологии используются в компании, над какими проектами они работают.
Ну и еще, если ты хочешь развиваться, ты бы мог посмотреть в сторону яваскрипт и яваскрипт-библиотек и фреймворков. У меня есть задачки на эту тему (на яваскрипт-фреймворки правда пока нету, только на jQuery и jQuery UI).
Я тут пока код проверю:
Собака прыгает на 2 клеточки, а не на 1. И она умеет прыгать по диагонали. Ну и у тебя кошка не боится собаки, может сделаем чтобы она убегала если оказывается в радиусе 5×5 вокруг собаки (и не подходила к ней ближе чем на 3 клетки соответственно)? Заметь, при использовании алгоритма подсчета очков для этого требовалось бы всего лишь немного поменять схему вычисления числа очков.
Заметь также, если на клетке куда хочет сходить кошка, уже кто-то есть, она не делает ход. Но если бы ты использовал подсчет очков, то кошка не стояла бы на месте, а пыталась обойти другую кошку.
> if (is_object($cat)) {
Чтобы проверить на null/не null лучше писать просто
if ($cat) {
А то создается впечатление что у тебя там могут быть другие типы данных в переменной.
> $list[$key]['score'] = $distance 4 + $extra 2 + count($furtherTurns) + 1;
Зачем прибавлять 1 ко всем очкам? Не понимаю.
> return " @ ";
Ты зря так делаешь. Пробелы лучше добавлять не в 10 разных местах к каждой иконке, а один раз в функции GameField#printField.
> (abs($this->x - $animal->getCoordinateX()) <= 9
9 это непонятное число. Лучше сделать константу или переменную с говорящим именем типа mouseVision. И для квадрата 9×9 тут надо указывать не 9, а 5.
> if ($this->sleepCount > 0) {
> $this->sleepCount--;
> } else {
Здесь пожно поставить return после sleepCount-- и тогда огромный блок else будет не нужен.
Аналогично в Cat#makeMove() c помощью return можно избавиться от огромного if ($target). Огромный if размером со всю функцию — это не очень хорошо.
Насчет последнего хода мышки, можно добавить какой-то фактор с маленьким весом, который бы давал клеткам ближе к центру больше очков, вроде (расстояние до центра поля).
Вообще, неплохо, кроме мелких багов, программа более-менее работает.
Я тут пока код проверю:
Собака прыгает на 2 клеточки, а не на 1. И она умеет прыгать по диагонали. Ну и у тебя кошка не боится собаки, может сделаем чтобы она убегала если оказывается в радиусе 5×5 вокруг собаки (и не подходила к ней ближе чем на 3 клетки соответственно)? Заметь, при использовании алгоритма подсчета очков для этого требовалось бы всего лишь немного поменять схему вычисления числа очков.
Заметь также, если на клетке куда хочет сходить кошка, уже кто-то есть, она не делает ход. Но если бы ты использовал подсчет очков, то кошка не стояла бы на месте, а пыталась обойти другую кошку.
> if (is_object($cat)) {
Чтобы проверить на null/не null лучше писать просто
if ($cat) {
А то создается впечатление что у тебя там могут быть другие типы данных в переменной.
> $list[$key]['score'] = $distance 4 + $extra 2 + count($furtherTurns) + 1;
Зачем прибавлять 1 ко всем очкам? Не понимаю.
> return " @ ";
Ты зря так делаешь. Пробелы лучше добавлять не в 10 разных местах к каждой иконке, а один раз в функции GameField#printField.
> (abs($this->x - $animal->getCoordinateX()) <= 9
9 это непонятное число. Лучше сделать константу или переменную с говорящим именем типа mouseVision. И для квадрата 9×9 тут надо указывать не 9, а 5.
> if ($this->sleepCount > 0) {
> $this->sleepCount--;
> } else {
Здесь пожно поставить return после sleepCount-- и тогда огромный блок else будет не нужен.
Аналогично в Cat#makeMove() c помощью return можно избавиться от огромного if ($target). Огромный if размером со всю функцию — это не очень хорошо.
Насчет последнего хода мышки, можно добавить какой-то фактор с маленьким весом, который бы давал клеткам ближе к центру больше очков, вроде (расстояние до центра поля).
Вообще, неплохо, кроме мелких багов, программа более-менее работает.
У нас ограничение на 1 просчитываемый ход (мозг то у мышки маленький). Хотя конечно можно было бы просчитывать дополнительно второй-третий ход и брать тот, который уведет нас дальше от углов и кошек.
>>415410
Госзакупки — замечательно, все работает, хотя наверно если в слове большинство букв латинские, было бы логичнее выделять только русскую.
Расстановка пробелов — там куча ошибок, смотри внизу cnhfybws:
> PHP Notice: Use of undefined constant makeFirstLetterUppercase - assumed 'makeFirstLetterUppercase' in /home/IrTgsF/prog.php on line 20
Их надо исправить. В данном случае, имя функции должно быть строкой, то есть заключено в кавычки, иначе php думает что это константа. PHP по доброте душевной сам преобразует имя в строку, но ты не должен на это полагаться.
Как ты их не заметил кстати? Целых 6 ошибок.
Насчет разделения на предложения, твоя регулярка не разделит предложение в начале которого идет цифра.
Так, в остальном верно.
>>415504
Молодец, правильно пишешь. Но с другой стороны, платные курсы могут иногда предложить больше чем я — например разбор задач или индивидуальные консультации. Главное убедиться, что преподаватель облаждает нужным уровнем навыков.
Ну и тому анону, сразу скажу,
> небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего)
небольшой курс не получится. Чтобы все это изучить, нужен большой курс.
>>415518
Вообще-то сам факт того что в прыжке ты можешь менять направления движения, уже далек от реальности (если конечно у тебя нет с собой реактивного двигателя). Ну и такие фичи в итоге только добавили интереса игре.
>>415545
ОП не постит решения
>>415560
Если твой текст это JSON, ini или что-то такое, лучше воспользоваться json_decode или парсером для нужного формата.
Алсо, положи кусок кодана PHP на ideone, так сказать трудно.
> и до конца строки, которая \n.
Под windows конец строки кодируется как \r\n может в этом проблема? Алсо, чтобы матчить конец строки можно использовать $
У нас ограничение на 1 просчитываемый ход (мозг то у мышки маленький). Хотя конечно можно было бы просчитывать дополнительно второй-третий ход и брать тот, который уведет нас дальше от углов и кошек.
>>415410
Госзакупки — замечательно, все работает, хотя наверно если в слове большинство букв латинские, было бы логичнее выделять только русскую.
Расстановка пробелов — там куча ошибок, смотри внизу cnhfybws:
> PHP Notice: Use of undefined constant makeFirstLetterUppercase - assumed 'makeFirstLetterUppercase' in /home/IrTgsF/prog.php on line 20
Их надо исправить. В данном случае, имя функции должно быть строкой, то есть заключено в кавычки, иначе php думает что это константа. PHP по доброте душевной сам преобразует имя в строку, но ты не должен на это полагаться.
Как ты их не заметил кстати? Целых 6 ошибок.
Насчет разделения на предложения, твоя регулярка не разделит предложение в начале которого идет цифра.
Так, в остальном верно.
>>415504
Молодец, правильно пишешь. Но с другой стороны, платные курсы могут иногда предложить больше чем я — например разбор задач или индивидуальные консультации. Главное убедиться, что преподаватель облаждает нужным уровнем навыков.
Ну и тому анону, сразу скажу,
> небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего)
небольшой курс не получится. Чтобы все это изучить, нужен большой курс.
>>415518
Вообще-то сам факт того что в прыжке ты можешь менять направления движения, уже далек от реальности (если конечно у тебя нет с собой реактивного двигателя). Ну и такие фичи в итоге только добавили интереса игре.
>>415545
ОП не постит решения
>>415560
Если твой текст это JSON, ini или что-то такое, лучше воспользоваться json_decode или парсером для нужного формата.
Алсо, положи кусок кодана PHP на ideone, так сказать трудно.
> и до конца строки, которая \n.
Под windows конец строки кодируется как \r\n может в этом проблема? Алсо, чтобы матчить конец строки можно использовать $
>Ну и насчет битрикса, надо понимать, что в студии по созданию сайтов (особенно не высокобюджетных) вряд ли есть время на изучение каких-то сложных фреймворков, обычно сайты делаются на какой-то сторонней или своей CMS. Если ты хочешь заниматься более сложными вещами, тебе надо смотреть в сторону компаний-аутсорсеров (которые делают сложные проекты на заказ) или продуктовых компаний (которые делают продукт для себя и зарабатывают на нем). Ну и смотреть, какие технологии используются в компании, над какими проектами они работают.
Т.е. джуниору в любом случае придется обмазаться какой-то CMS?
По аналогии со статейкой про DI\IoC - чтоб даже полному идиоту стало понятно, о чем речь.
Очень желательно, чтоб сразу с простыми примерами, чтоб можно было почитать и понять, как вообще всё это начать у себя в проектах использовать.
Ато начитался твоего треда, на работу ПХП-макакой устроился. Говнокодим по черному, я уже примерно начинаю понимать, зачем вообще нужны тесты, но пока неясно с чего начать.
Заранее спасибо, ты лучший!
Ну если там используется какая-то CMS то да, придется в ней разобраться. В большинстве CMS код мягко скажем, неидеальный, ощущение что пишут его студенты.
>>415667
Спасибо на добром слове. Да, постараюсь сделать, у меня давно уже зреет мысль сделать мини-урок по тестированию, с задачками на написание тестов.
Насчет с чего начать — надо подумать, где тесты тебе могут помочь. Может быть например тестами можно проверять какой-то функционал который часто ломается, может код с хитрой логикой, может вы пишете АПИ и тестируете его руками. А может тебе больше подойдет скрипт который обходит страницы сайта по заранее сделанному списку и просто проверяет что там нет никаких php (а может и js) ошибок.
Аноны, я хочу учебник скачать по PHP Дайте ссыль.
Вообще планирую после НГ поменять работу, но сначал пойти на курсы по веб-дизайну(фотошопер любительского уровня) или по PHP. Подскажите с чего начать, хочу потихоньку сегодня самостоятельно начинать, а после НГ топать на курсы.
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');
// Установка полей для штампа и получение высоты/ширины штампа
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Копирование изображения штампа на фотографию с помощью смещения края
// и ширины фотографии для расчета позиционирования штампа.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// освобождение памяти
imagedestroy($im);
как сохронить это изображение, которое получаем?
может шапку для приличия почитаешь, унтерок?
А у тебя рисовать хорошо получается? Или может ты фотографией увлекаешься? Если так то может стоит и с фотошопом повозиться.
Насчет учебника, не знаю, для начинающих есть Никсон, но уровень там конечно так себе.
Не могу вывести записи из таблицы которых еще нет в другой таблице.
Есть две таблицы:
[CODE]couriers
{
Id
Name
Lastname
......
}
staffercoriers
{
Id
IdStaffer
IdCoriers
}[/CODE]
Нужно вывести записи из таблицы couriers, только те которых еще нет в staffercoriers по полю IdCoriers.
И что бы поле IdStaffer было равно текущему юзеру. Вернее, вывести тех курьеров которых еще нет у Стафера
я заметил код на рнр
Для неё есть запрос который выводит те компьютеры для которых memory(Mb)=3000
select t.id, t.cpu, t.memory from PC as t
where t.memory=3000;
Я не понимаю, что за t. перед названием столбца? Я никогда так не писал запросы.
Извините если тупой вопрос.
>select t.id, t.cpu, t.memory from PC as t where t.memory=3000;
Тут t - это обозначение для колонок из таблицы PC. Нужно в случаях с джойнами, например.
select t.id, t.cpu, m.name from PC as t
join Manufactures m on t.manufacturer = m.id
Спасибо за помощь, кажется немного понял.
А нет, всё очень дерьмово, можно даже не проверять...
чуть кривовато(
алсо есть идея заменить кош на головы SPJ
а мышей - на головы всяких гнидо-обоссунов и прочих динамиконяш ;з
>ОП не постит решения
Лал, т.е. ты подкидываешь задачки, на которые у тебя нет своего, эталанного решения?
Окропил тебя.
Добавь ОП-а хуесоса, что бы коты пиздили его, когда приблизятся, а мыши в этот момент устраивали хоровод и содомию.
ок это будет мой тебе подарок на нг
шоб
Константа MOUSEVISION относится к мышке, потому логично добавить ее в класс Mouse, а не глобальной константой.
> ($distanceToCenter × 0.1);
Это не очень надежно так как если поле больше то этот фактор может перевесить растояние до кошек. Надо было делить на ширину поля.
Так, там еще можно улучшить код, но я думаю, хватит уже мучать эту задачу, давай дальше двигаться. В учебнике мы изучали основы PHP, а теперь пора научиться использовать php для создания сайтов и приложений.
После учебника у нас есть 2 более сложных задачи на выбор:
— попроще https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
— посложнее https://gist.github.com/codedokode/9424217
Также, у нас есть задачки на HTML/CSS, JS, SQL. На мой взгляд, неплохие.
Что из этого ты бы хотел порешать?
Ну, думаю надо двигаться от простого к сложного. Сначала первую, а потом вторую. Только вот их уже придется выкладывать на гитхаб я так понимаю, с ним я пока не знаком.
Это алиасы (синонимы), чтобы не писать длинное название таблицы, можно создать синоним. Почитай вообещ про синтаксис SELECT например тут: http://phpclub.ru/mysql/doc/select.html
>>415831
> Use of undefined constant makeFirstLetterLowercase -
Ты кавычки забыл вокруг имени функции
>>415837
О, круто выглядит. А можно сделать чтобы у мышек были хвостики, а кошки, когда едят мышку, высовывали язычок?
>>415913
Но обычно кошки ко мне хорошо относятся, трутся, просят погладить и поиграть с ними.
>>415979
Здесь смотрел? http://archive-ipq-co.narod.ru/l1/pasta.html
Если интернета нет, ты можешь себе на компьютер поставить php и запускать программы
Гайд: https://gist.github.com/codedokode/7054af4a03865c4cc863
Гайд по командной строке https://gist.github.com/codedokode/10539568
Также, в некоторых IDE (netbeans, eclipse, phpstorm) можно в настройках указать путь к php и тогда можно запускать программы прямо из редактора.
>>416042
Гитхаб — это хостинг git-репозиториев. git — система управления версиями, он везде сейчас используется. git позволяет тебе сохранять код и историю его изменения (ну а гитхаб позволяет все это опубликовать). Простая книга на русском:
http://git-scm.com/book/ru/v1/
Если что-то непонятно, задавай вопросы.
Это алиасы (синонимы), чтобы не писать длинное название таблицы, можно создать синоним. Почитай вообещ про синтаксис SELECT например тут: http://phpclub.ru/mysql/doc/select.html
>>415831
> Use of undefined constant makeFirstLetterLowercase -
Ты кавычки забыл вокруг имени функции
>>415837
О, круто выглядит. А можно сделать чтобы у мышек были хвостики, а кошки, когда едят мышку, высовывали язычок?
>>415913
Но обычно кошки ко мне хорошо относятся, трутся, просят погладить и поиграть с ними.
>>415979
Здесь смотрел? http://archive-ipq-co.narod.ru/l1/pasta.html
Если интернета нет, ты можешь себе на компьютер поставить php и запускать программы
Гайд: https://gist.github.com/codedokode/7054af4a03865c4cc863
Гайд по командной строке https://gist.github.com/codedokode/10539568
Также, в некоторых IDE (netbeans, eclipse, phpstorm) можно в настройках указать путь к php и тогда можно запускать программы прямо из редактора.
>>416042
Гитхаб — это хостинг git-репозиториев. git — система управления версиями, он везде сейчас используется. git позволяет тебе сохранять код и историю его изменения (ну а гитхаб позволяет все это опубликовать). Простая книга на русском:
http://git-scm.com/book/ru/v1/
Если что-то непонятно, задавай вопросы.
Я те все сделал кроме кошек-мышек, я себе денвер установил, просто без инета нет доступа к поиску задач
А про вектор и 4 департамента тоже сделал? А что кошки -мышки не хочешь? Просто там более простые задачи будут повторением задачи про вектор.
Про вектор сделал, я тут позавчера выкладывал решение где-то выше. Про мышек начал, создал класс доски, создал абстрактный класс животных, наследовал кошек и мышек от него, добавил иконки, создал функция для создания кошек и мышек, добавил функцию отображения доски дальше нет пока идей как заставить их искать друг друга на доске и менять своё положение.
Менять положение — это менять координаты.
Насчет выбора хода, есть такая идея:
- создаем список всех возможных ходов
- ставим каждому очки (например для мышки чем дальше клеточка от кошек тем больше за нее очков дается, также надо убавлять очки за ход в угол, так как там меньше выходов)
- выбираем ход с наибольшим числом очков
Также, нет плагина для интеграции Codeception со фреймворком Slim.
Ну и еще вариант, посмотреть проекты отсюда: https://github.com/trending?l=php&since=monthly — может кому из них нужны исправления.
В общем, анон, пока просто посмотреть можешь.
Кто-то >>415667 просил урок про тесты. Держите, первая версия: https://gist.github.com/codedokode/a455bde7d0748c0a351a
Если есть идеи что можно потестировать, ссылки, статьи, замечания — пишите.
<form enctype="multipart/form-data" method="post">
<input type="file" min="1" accept="image/jpeg,image/jpg" max="999999" name="pictures[]" multiple="true" />
<input type="submit" name="submit" />
</form>
<?php
include 'config.php';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "D:\\photo\\$name");
}
}
?>
почему не загружает файлы больше мегабайта? настройки пхп.ини смотрел, .htaccess с параметрами добавлял
php.ini точно тот, вот скрин
http://jsbin.com/qaxeturizi/1/edit?js,console
Правда я сомневаюсь, что правильно понял идею с прототипами.
Ну вообще, ты на верном пути. Разумеется, тут много чего добавить еще нужно, например выбор хода и сам ход, поедание мышек кошками, и т.д.
А в чем-то сложность? Или ты в принципе представляешь что писать дальеш?
Вот пока советы и замечания по коду.
> public function __construct($n, $cats, $mouses)
Не очень правильно передавать сюда котов и мышей. В конструктор передаются обязательные параметры, а карту можно создать без животных, и добавить их позже. Тут лучше сделать метод вроде addAnimal которым можно животных добавлять когда захочешь.
> FillTheGroundPls
Именга функций принято писать с маленькой буквы, а писать Pls, Me, The не нужно, так как они не несут никакой информации.
> foreach ($z->ground as $v) {
Тут переменной z не передано
> public $x;
> public $y;
Я думаю, хватит писать код на публичных свойствх, это все же не первое задание. Давай теперь вовсю использовать инкапсуляцию.
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
> public $icon = ' @ ';
Пробелы лучше добавлять в месте вывода, а не тут.
> global $z;
Никогда не используй глобальные переменные, тем более в учебных задачах, где требуется все делать «правильно»
> function getNewAnimals
Эту функцию, конечно, надо будет переделать и вообще убрать наверно.
Ну вообще, ты на верном пути. Разумеется, тут много чего добавить еще нужно, например выбор хода и сам ход, поедание мышек кошками, и т.д.
А в чем-то сложность? Или ты в принципе представляешь что писать дальеш?
Вот пока советы и замечания по коду.
> public function __construct($n, $cats, $mouses)
Не очень правильно передавать сюда котов и мышей. В конструктор передаются обязательные параметры, а карту можно создать без животных, и добавить их позже. Тут лучше сделать метод вроде addAnimal которым можно животных добавлять когда захочешь.
> FillTheGroundPls
Именга функций принято писать с маленькой буквы, а писать Pls, Me, The не нужно, так как они не несут никакой информации.
> foreach ($z->ground as $v) {
Тут переменной z не передано
> public $x;
> public $y;
Я думаю, хватит писать код на публичных свойствх, это все же не первое задание. Давай теперь вовсю использовать инкапсуляцию.
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
> public $icon = ' @ ';
Пробелы лучше добавлять в месте вывода, а не тут.
> global $z;
Никогда не используй глобальные переменные, тем более в учебных задачах, где требуется все делать «правильно»
> function getNewAnimals
Эту функцию, конечно, надо будет переделать и вообще убрать наверно.
йода
Все верно.
Числа прописью
> if (($number%100-$number%10) != 10) {
Вот это мне пришлось разгадывать. Лучше бы написать просто
if ($x < 10 || $x > 19)
Ну и number % 10 там раза четыре встречается, лучше вынести в переменную.
> \t$i = floor($number/$grade);
> $result .= $spelling[$grade × $i].' ';
Умножение лучше перенести в верхнюю строчку
В строках 59-66 (разбор числа на группы по 3) мне кажется можно объединить if/elsief в просто if.
В остальном, верно.
Калькулятор
В else/elseif скобки ставятся так:
} else {
} elseif (...) {
А так, все верно.
>>416313
А что пишет? Какое сообщение об ошибке? Чему $error равно?
Тут пишут есть еще 2 параметра, влияющих: http://stackoverflow.com/a/3263496
>>416314
Перекатимся. Ничего страшного от того, что мы день повисим на второй странице, не будет.
>>416360
Первый код неприавльный так как ты там строки через одну пропускаешь.
йода
Все верно.
Числа прописью
> if (($number%100-$number%10) != 10) {
Вот это мне пришлось разгадывать. Лучше бы написать просто
if ($x < 10 || $x > 19)
Ну и number % 10 там раза четыре встречается, лучше вынести в переменную.
> \t$i = floor($number/$grade);
> $result .= $spelling[$grade × $i].' ';
Умножение лучше перенести в верхнюю строчку
В строках 59-66 (разбор числа на группы по 3) мне кажется можно объединить if/elsief в просто if.
В остальном, верно.
Калькулятор
В else/elseif скобки ставятся так:
} else {
} elseif (...) {
А так, все верно.
>>416313
А что пишет? Какое сообщение об ошибке? Чему $error равно?
Тут пишут есть еще 2 параметра, влияющих: http://stackoverflow.com/a/3263496
>>416314
Перекатимся. Ничего страшного от того, что мы день повисим на второй странице, не будет.
>>416360
Первый код неприавльный так как ты там строки через одну пропускаешь.
Да, ты понял неправильно. Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале. Вот готовый шаблон класса без наследования:
// конструктор
function A() { this.x = y; ... }
// добавляем методы
A.prototype.someMethod = function () { ... } ;
Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.
Теперь изучим как сделать наследование. Унаследуем класс B от A. Тут все сложнее так как нам надо сделать, чтобы в B.prototype был пустой объект с прототипом = A.prototype.
В Es5 для этого есть Object.create. В ES3 делается хак с использованием функции, погугли или почитай тут http://learn.javascript.ru/prototype .
Вот как выглядит «класс» с наследоанием:
function B () {
A.call(this, ...); // вызваем констурктор предка
....
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B; // исправляем св-во constructor
B.prototype.someMethod = function () {
// вызов метода предка
A.prototype.someMethod.call(this, ...);
...
};
Вот как-то так. При таком наследовании корректно работает instanceof:
var b = new B( );
b instanceof B; // true
b instanceof A; // true
b instanceof Object; true
Object.getPrototypeOf(b); // B.prototype
Object.getPrototypeOf(B.prototype); // A.prototype
Если не брать наследоване то по моему все просто и лаконично. И сравни со своим кодом где все нагорожено и усложнено.
Так что почитай где-нибудь про прототипы, хотя бы на learn.javascript.ru: http://javascript.ru/tutorial/object/inheritance
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#The_Class (англ)
https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain
Ты наверно заметил, что это все выглядит костыльно и громоздко. Это потому, что предполагалось что в JS будет прототипное программирование, то есть объекты будет создаваться не на основе классов, а на основе друг друга. Потому классы туда и не завезли.
В ES6 будет синтаксис для классов, который будет настраивать те же самые прототипы: http://habrahabr.ru/post/175371/
Пока ES6 не пришел, пишутся всякие библиотеки для облегчения создания классов:
http://jsclass.jcoglan.com/classes.html
http://dkraczkowski.github.io/js.class/
http://microjs.com/#class (десятки их)
Но ты пока научись вручную прототипы настраивать.
Да, ты понял неправильно. Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале. Вот готовый шаблон класса без наследования:
// конструктор
function A() { this.x = y; ... }
// добавляем методы
A.prototype.someMethod = function () { ... } ;
Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.
Теперь изучим как сделать наследование. Унаследуем класс B от A. Тут все сложнее так как нам надо сделать, чтобы в B.prototype был пустой объект с прототипом = A.prototype.
В Es5 для этого есть Object.create. В ES3 делается хак с использованием функции, погугли или почитай тут http://learn.javascript.ru/prototype .
Вот как выглядит «класс» с наследоанием:
function B () {
A.call(this, ...); // вызваем констурктор предка
....
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B; // исправляем св-во constructor
B.prototype.someMethod = function () {
// вызов метода предка
A.prototype.someMethod.call(this, ...);
...
};
Вот как-то так. При таком наследовании корректно работает instanceof:
var b = new B( );
b instanceof B; // true
b instanceof A; // true
b instanceof Object; true
Object.getPrototypeOf(b); // B.prototype
Object.getPrototypeOf(B.prototype); // A.prototype
Если не брать наследоване то по моему все просто и лаконично. И сравни со своим кодом где все нагорожено и усложнено.
Так что почитай где-нибудь про прототипы, хотя бы на learn.javascript.ru: http://javascript.ru/tutorial/object/inheritance
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#The_Class (англ)
https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain
Ты наверно заметил, что это все выглядит костыльно и громоздко. Это потому, что предполагалось что в JS будет прототипное программирование, то есть объекты будет создаваться не на основе классов, а на основе друг друга. Потому классы туда и не завезли.
В ES6 будет синтаксис для классов, который будет настраивать те же самые прототипы: http://habrahabr.ru/post/175371/
Пока ES6 не пришел, пишутся всякие библиотеки для облегчения создания классов:
http://jsclass.jcoglan.com/classes.html
http://dkraczkowski.github.io/js.class/
http://microjs.com/#class (десятки их)
Но ты пока научись вручную прототипы настраивать.
>Ты наверно заметил, что это все выглядит костыльно и громоздко. Это потому, что предполагалось что в JS будет прототипное программирование, то есть объекты будет создаваться не на основе классов, а на основе друг друга. Потому классы туда и не завезли.
Потому я и решил, что не понял прототипы. Потому что выглядит так, будто бы я пришиваю классы туда, где они не подразумевались.
>Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале.
Просто я его впихнул в функцию. Так-то можно сразу написать что-то вроде:
function Hamburger() {}
Hamburger.prototype = this;
>Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.
Это я понял.
Ну и вообще я просто другой паттерн выбрал. У меня здесь по сути два класса: создатель и сам гамбургер. Просто чтобы создавать функции единожды, как ты писал выше, я их запихнул в креатор и "наследую" оттуда.
>Вот как выглядит «класс» с наследоанием:
Мне вот очень не нравится, что код, относящийся к классу B, располагается после его описания. Ну правда костыль на костыле. Я совсем никакого удовольствия не получаю от написания кода.
>Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале.
Вот и все отличие: http://jsbin.com/robidupaqa/1/edit?js,console
В моем случае же Creator - и есть прототип для всех будущих гамбургеров. Или я вообще не понимаю о чем речь.
> Так-то можно сразу написать что-то вроде:
> function Hamburger() {}
> Hamburger.prototype = this;
Если честно, выглядит как бессмыслица. Почитай-ка сначала статьи по ссылкам.
> Ну и вообще я просто другой паттерн выбрал.
Не, ты нагородил лишнего и переусложнил все. «Создатель» тут лишний, для этого есть уже функция-конструктор.
> что код, относящийся к классу B, располагается после его описания.
B — это не класс, а функция-конструктор. Вполне логично, что методы идут после конструктора, а не наоборот. По ркайней мере код выглядит аккуратнее, как набор методов, а не все засунуто в одну огромную функцию и свалено в кучу.
По крайней мере этот паттерн с прототипами общепринятый.
> Или я вообще не понимаю
Я тоже не понимаю. Например, зачем нам функция creator когда в явкрипте уже предусмотрена функция- конструктор. Ты по моему изобретаешь велосипед на квадратных колесах и делаешь то, что уже сделано.
>B — это не класс, а функция-конструктор.
Оу. Я почему-то вбил себе в голову, что эта функция и является вариантом класса.
Ну вот и замечательною Настоящих классов в JS до Es6 нет. Мы просто называем конструктор + методы «классом» по привычке и потому, что так короче.
А так, объекты в JS создаются либо функцией-конструктором (причем любая функция — это конструктор, какого-то разделения нет), либо на основе другого объекта с помощью Object.create
Попытка три: http://jsbin.com/poqoqohuco/1/edit?js,console
Сейчас мои представления такие: через class.prototype. объявляются методы класса, в конструкторе делаем поля, а через class. - константы. Но, опять же, чую я, что не все так.
Вот баг: http://jsbin.com/hejuhusame/1/edit?js,console — 2 разных гамбургера стоят одинаково.
> if (this.PROPS[type] === undefined) {
Есть оператор in
> Hamburger.TYPE_BIG = "big";
> Hamburger.prototype.PROPS = {
> big: {
По идее надо бы использовать константу, а не дублировать 2 раза слово big.
> this.adds[additiveName] = true;
Вообще, это выглядит как усложнение. То есть ты бы мог сделать список добавок массивом и класть туда их, а ты зачем-то начинаешь исхитряться с хранением в ключах словаря. Я конечно понимаю, что где-то так короче код получается, но лучше бы cделать нормально.
Массив — это список чего-то.
Словарь — это соответствие строка -> что-то.
Очевидно список добавок уместнее сделать массивом. Тут добавок немного и никаких оптимизаций не требуется.
Вообще, если подумать, список добавок — это множество ( структура данных, которая хранит неупорядоченный список неповторябщихся значений ) , но в JS нет множеств, а ближайшее, что есть — это массив.
>По идее надо бы использовать константу, а не дублировать 2 раза слово big.
Тогда придется переписать все в стиле
Hamburger.TYPE_BIG = "big";
Hamburger.prototype.PROPS[this.TYPE_BIG] = {};
Hamburger.TYPE_SMALL = "small";
Hamburger.prototype.PROPS[this.TYPE_SMALL] = {};
Мне показалось, что синтаксис с {} нагляднее.
>Очевидно список добавок уместнее сделать массивом.
Да, действительно. Жаль, кстати, что множеств нет.
>Вот баг: http://jsbin.com/hejuhusame/1/edit?js,console — 2 разных гамбургера стоят одинаково.
Своим же словам не следую, лол.
>в конструкторе делаем поля
Все, что объявлено в class.prototype - общее. Статичные члены, так сказать.
http://jsbin.com/fivayulucu/1/edit?js,console
>но в JS нет множеств, а ближайшее, что есть — это массив.
Я вот сейчас подумал, а ведь работу множеств проще реализовать через объекты, а не через массивы.
Верно, но тогда лучше сделать специальный класс Set с правильно названными методами, а не брать словарь и притворяться что это множество.
>>416543
while — это цикл. Он выполняется пока условие в скобках истинно (я поясню ниже что это значит). Как только условие становится ложно то цикл завершается.
Что значит ложно/истинно? Ложно = false, истинно = true. Если в скобках находится значение другого типа (число, строка, массив, объект) то оно приводится к булеву типу по правилам описанным тут: http://php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting
Если кратно:
Пустые значения null, 0, "", "0", array() приводятся к false
Все остальное приводится к true.
То есть к примеру цикл
while (1) { echo "asdasd"; }
выполняется вечно, так как 1 приводится к true/ а цикл
while (0) { ... }
не выполнится ни разу так как 0 приравнивается к false.
Теперь вернемся к твоему коду. Что делает $row = $STH->fetch() ?
Она выбиарет из базы очередную строку в виде массива либо false если данные закончились. Это значение копируется в переменную $row и возвращается дальше, циклу while для проверки.
Если данные еще есть, то в row запишется массив, который для while равносилен true и цикл продолжается.
Если данные закончились то в row запишется false и цикл завершится.
Вот алгоритм работы:
1. Выбрать строку из БД (или false если данные закончились)
2. Сохранить ее в $row
3. Приводится ли она к false? Если да, то выходим.
4. Иначе, выполняем тело цикла
5. Переходим к п.1
Задавай уточняющие вопрсоы если что-то непонятно.
Верно, но тогда лучше сделать специальный класс Set с правильно названными методами, а не брать словарь и притворяться что это множество.
>>416543
while — это цикл. Он выполняется пока условие в скобках истинно (я поясню ниже что это значит). Как только условие становится ложно то цикл завершается.
Что значит ложно/истинно? Ложно = false, истинно = true. Если в скобках находится значение другого типа (число, строка, массив, объект) то оно приводится к булеву типу по правилам описанным тут: http://php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting
Если кратно:
Пустые значения null, 0, "", "0", array() приводятся к false
Все остальное приводится к true.
То есть к примеру цикл
while (1) { echo "asdasd"; }
выполняется вечно, так как 1 приводится к true/ а цикл
while (0) { ... }
не выполнится ни разу так как 0 приравнивается к false.
Теперь вернемся к твоему коду. Что делает $row = $STH->fetch() ?
Она выбиарет из базы очередную строку в виде массива либо false если данные закончились. Это значение копируется в переменную $row и возвращается дальше, циклу while для проверки.
Если данные еще есть, то в row запишется массив, который для while равносилен true и цикл продолжается.
Если данные закончились то в row запишется false и цикл завершится.
Вот алгоритм работы:
1. Выбрать строку из БД (или false если данные закончились)
2. Сохранить ее в $row
3. Приводится ли она к false? Если да, то выходим.
4. Иначе, выполняем тело цикла
5. Переходим к п.1
Задавай уточняющие вопрсоы если что-то непонятно.
Аналогично работает if, потому ты можешь писать вещи типа
if ($x) { .. }
Условие выполнится если в $x непустое значение, то есть не false, null, 0, "0", "", array()
> Тогда придется переписать все в стиле
Да, если делать правильно, то так.
> Своим же словам не следую, лол.
Чтобы не допускать эту ошибку, создавай все свойства-объекты в конструкторе.
> Hamburger.prototype.add = function(additiveName) {
Нет защиты от двойной добавки
> for (var i=0; i<this.adds.length; i++) {
> if (this.adds === additiveName) {
Это надо вынгести в функцию например с названием indexOf. Кстати, в ES5 у массивов уже есть метод indexOf: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Ты еще куда-то потерял начинку.
А так, в остальном верно. получается довольно громоздко, это из-за того, что мы имитирует традиионный ООП в языке, в котором его нет (и константы у нас не настоящие, и классы тоже).
Тем не менее, примерно так обычно и пишут ООП-код на JS.
Вот пример создания «класса» в фреймворке Backbone: https://github.com/jashkenas/backbone/blob/master/backbone.js#L274
Как видишь, они используют вспомогательную функцию (можешь разобрать ее код) для задания методов.
Заметь, что некоторые свойства начинаются с подчеркивания. Так как в JS нет private/protected то так обозначают притворимся-что-они-приватные свойства.
> Тогда придется переписать все в стиле
Да, если делать правильно, то так.
> Своим же словам не следую, лол.
Чтобы не допускать эту ошибку, создавай все свойства-объекты в конструкторе.
> Hamburger.prototype.add = function(additiveName) {
Нет защиты от двойной добавки
> for (var i=0; i<this.adds.length; i++) {
> if (this.adds === additiveName) {
Это надо вынгести в функцию например с названием indexOf. Кстати, в ES5 у массивов уже есть метод indexOf: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Ты еще куда-то потерял начинку.
А так, в остальном верно. получается довольно громоздко, это из-за того, что мы имитирует традиионный ООП в языке, в котором его нет (и константы у нас не настоящие, и классы тоже).
Тем не менее, примерно так обычно и пишут ООП-код на JS.
Вот пример создания «класса» в фреймворке Backbone: https://github.com/jashkenas/backbone/blob/master/backbone.js#L274
Как видишь, они используют вспомогательную функцию (можешь разобрать ее код) для задания методов.
Заметь, что некоторые свойства начинаются с подчеркивания. Так как в JS нет private/protected то так обозначают притворимся-что-они-приватные свойства.
>Нет защиты от двойной добавки
Потому что там был до этого true/false и дважды присвоить true - все равно, что ничего. Забыл переделать, да.
>Ты еще куда-то потерял начинку.
Какую начинку?
http://jsbin.com/jamaxuhofa/1/edit?js,console
>получается довольно громоздко, это из-за того, что мы имитирует традиионный ООП в языке, в котором его нет (и константы у нас не настоящие, и классы тоже).
А я то думал это я так плох.
>Вот пример создания «класса» в фреймворке Backbone
>_.extend
Это у них там свой экстенд что ли? А _ - это что-то типо глобальной области видимости, объект-солянка из методов?
>Какую начинку?
Я потерял не начинку, а приправку и майонез. Ну да неважно, это три минуты делов.
Это я понял, я другого не пойму: почему $row нужно приравнивать к fetch в условии цикла, а в его теле (как тут http://ideone.com/1V2xyD) нельзя? По моему должен быть один и тот же результат, но это не так.
Хотя проверил сейчас, ргхост для фейкового mp3 плеер создает. Может просто проверить разширение на canPlayType() и все?
Разобрался. Все равно спасибо опу, я б сам не догодался даже что гуглить.
>>413443
>Лучше бы хранить массивом, мне кажется, так:
Все исправил: http://jsfiddle.net/zLqejjsx/
>Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.
Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.
Вариация задачи №12: http://jsfiddle.net/g34y347c/
>>413445
>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:
>Попробуй так записать код.
http://ideone.com/DZiCBU
Установил lamp на убунте, apach 403 бросает, что делать? Права 755
Forbidden
You don't have permission to access / on this server.
Эй, мочерня. Тут параша опять протекла. Удалите уже этот тред на хуй, воняет на всю нулевую сука.
Есть ли в /www/ файл index.html? Если нет, создай и попробуй снова постучаться на локалхост
> А _ - это что-то типо глобальной области видимости
Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями: http://underscorejs.org/ (русский: http://underscorejs.ru/). Соответсвенно extend это функция из нее.
Сейчас есть lodash — это типа улучшенная версия underscore.
Жду версию с начинкой и приправой.
>>416618
Можно и в теле, но автор решил что так короче.
> По моему должен быть один и тот же результат, но это не так.
По моему нет. По моему ты не понимаешь либо как работает fetch либо как работает цикл. В примере
while ($s->fetch()) {
$row = $s->fetch( );
....
}
1-я, 3-я, 5-я, 7-я и т.д. считанные из базы строки никуда не попадают (так как они считываются внутри условия и никуда не сохраняются), а в $row попадают только 2-я, 4-я, 6-я и т.д. строки. То есть через одну. Посмотри на код внимательно сам.
>>416661
Так как код ты не показал, я ничего подсказать не могу.
>>416722
Создадим, как капча заработает.
> Оп, как проверить тип файла (музыка, видео), чтобы плеер прикрутить? Ненагуглил нихрена вообще.
Библиотекой getId3:
http://getid3.sourceforge.net/
http://www.getid3.org/demo/
(она доступна в композере: https://packagist.org/search/?q=getid3 )
> А _ - это что-то типо глобальной области видимости
Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями: http://underscorejs.org/ (русский: http://underscorejs.ru/). Соответсвенно extend это функция из нее.
Сейчас есть lodash — это типа улучшенная версия underscore.
Жду версию с начинкой и приправой.
>>416618
Можно и в теле, но автор решил что так короче.
> По моему должен быть один и тот же результат, но это не так.
По моему нет. По моему ты не понимаешь либо как работает fetch либо как работает цикл. В примере
while ($s->fetch()) {
$row = $s->fetch( );
....
}
1-я, 3-я, 5-я, 7-я и т.д. считанные из базы строки никуда не попадают (так как они считываются внутри условия и никуда не сохраняются), а в $row попадают только 2-я, 4-я, 6-я и т.д. строки. То есть через одну. Посмотри на код внимательно сам.
>>416661
Так как код ты не показал, я ничего подсказать не могу.
>>416722
Создадим, как капча заработает.
> Оп, как проверить тип файла (музыка, видео), чтобы плеер прикрутить? Ненагуглил нихрена вообще.
Библиотекой getId3:
http://getid3.sourceforge.net/
http://www.getid3.org/demo/
(она доступна в композере: https://packagist.org/search/?q=getid3 )
>>416732
В canPlayType передается не расширение, а MIME-тип (вроде audio/mpeg). MIME можно получить у getId3. Вот примеры использования canPlayType:
https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics#canPlayType (англ)
Информация о поддерживаемых форматах https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)
Разные браузеры поддерживают разные форматы, и даже в пределах одного формата может быть разница (например браузер может поддерживать H.264 с VP8 и не поддерживать VP9 или поддерживать аудио внутри видеофайла в MP3 но не поддерживать AAC). Также, что касается видео, то например «avi» или «mkv» или «webm» — это лишь формат контейнера, а внутри может быть видео и аудиопотоки, закодированные разными кодеками и по расширению вообще сказать нельзя, поддерживается оно или нет. Аудио внутри видеофайла может быть в MP3, AAC или еще чем-то.
Заметь, что браузер может вернуть "probably", а может "maybe" (когда возможность зависи не только от браузера, а например от наличия кодеков в системе или от использованных в файле кодеков):
> probably: if the specified type appears to be playable.
> maybe: if it's impossible to tell whether the type is playable without playing it.
> The empty string: if the specified type definitely cannot be played
Браузер, как видишь, никогда не говорит «да», только «нет» или «может быть». Думаю, плеер можно показать в обоих случаях.
Тут http://www.w3schools.com/tags/av_met_canplaytype.asp есть примеры, где видно что кроме типа файла передаются использованные для видео кодеки:
> video/mp4; codecs="avc1.4D401E, mp4a.40.2"
> video/webm; codecs="vp8.0, vorbis"
Не знаю, работает ли это везде, и как правиьно укзывать названия кодеков, но если ты можешь передавать кодеки и это работает то было бы хорошо.
>>416733
Это работает только в новых браузерах так как появилось в HTML5. Надо добавлять заголовок
Content-Disposition: attachment
Для скачивания
>>416732
В canPlayType передается не расширение, а MIME-тип (вроде audio/mpeg). MIME можно получить у getId3. Вот примеры использования canPlayType:
https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics#canPlayType (англ)
Информация о поддерживаемых форматах https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)
Разные браузеры поддерживают разные форматы, и даже в пределах одного формата может быть разница (например браузер может поддерживать H.264 с VP8 и не поддерживать VP9 или поддерживать аудио внутри видеофайла в MP3 но не поддерживать AAC). Также, что касается видео, то например «avi» или «mkv» или «webm» — это лишь формат контейнера, а внутри может быть видео и аудиопотоки, закодированные разными кодеками и по расширению вообще сказать нельзя, поддерживается оно или нет. Аудио внутри видеофайла может быть в MP3, AAC или еще чем-то.
Заметь, что браузер может вернуть "probably", а может "maybe" (когда возможность зависи не только от браузера, а например от наличия кодеков в системе или от использованных в файле кодеков):
> probably: if the specified type appears to be playable.
> maybe: if it's impossible to tell whether the type is playable without playing it.
> The empty string: if the specified type definitely cannot be played
Браузер, как видишь, никогда не говорит «да», только «нет» или «может быть». Думаю, плеер можно показать в обоих случаях.
Тут http://www.w3schools.com/tags/av_met_canplaytype.asp есть примеры, где видно что кроме типа файла передаются использованные для видео кодеки:
> video/mp4; codecs="avc1.4D401E, mp4a.40.2"
> video/webm; codecs="vp8.0, vorbis"
Не знаю, работает ли это везде, и как правиьно укзывать названия кодеков, но если ты можешь передавать кодеки и это работает то было бы хорошо.
>>416733
Это работает только в новых браузерах так как появилось в HTML5. Надо добавлять заголовок
Content-Disposition: attachment
Для скачивания
>>416797
> Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.
Если ты программируешь на яваскрипте у тебя наверняка постоянно открыта консоль, так что проблемы нет (если не открыта, нажми Ctrl + Shift + J). А я к тому же ленивый и не люблю закрывать постоянно выскакивающие окна (попробуй работать с консолью и тоже станешь ленивым).
> Все исправил
А города скопировать забыл:
> ReferenceError: cities is not defined @ http://fiddle.jshell.net/_display/:37
Также, вместо if (a.population > b.population) { ... можно писать просто return a.population - b.population, хотя это немного менее понятно, но зато короче.
Так, сделано верно.
> Вариация задачи №12:
Ой, ты зря так сделал, что сразу же считаешь цену. Не надо. Надо всего лишь сохранять что выбрано, а цену считать в отдельном методе «посчитатьЦену». Иначе смотри, мы допустим решим поменять тип начинки и что? Цена пересчитается? Нет, конечно.
Вообще, в данном случае у объекта не должно быть свойств типа «цена» так как ее всегда можно посчитать зная тип гамбургера, начинку и добавки.
> return console.log("неверный размер");
Абсолютно непраивльно. Ты пишешь в консоль сообщение об ошибке. А что, если кто-то вызывает твою функцию из кода, как он проверит что ошибки нет? Никак. Надо не выводить сообщение кооторое никто не прочтет, а выкидыват исключение.
Не исплоьзуй console.log внутри Gamburger.
>>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:
>>Попробуй так записать код.
Прекрасно. Теперь решение простое и лаконичное.
>>416820
Что в логах? Написано же белым по черному:
> [Sun Dec 14 19:16:52.456755 2014] [core:error] [pid 30907] (13)Permission denied: [client 127.0.0.1:34364] AH00035: access to /index.php denied (filesystem path '/home/bully/www') because search permissions are missing on a component of the path
На папке нет разрешения на поиск в ней файлов (это опция 'x' в правах, для файлов она дает разрешение на выполнение, а для папок разрешение на просмотр списка файлов). Надо дать не 755, а 777.
>>416797
> Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.
Если ты программируешь на яваскрипте у тебя наверняка постоянно открыта консоль, так что проблемы нет (если не открыта, нажми Ctrl + Shift + J). А я к тому же ленивый и не люблю закрывать постоянно выскакивающие окна (попробуй работать с консолью и тоже станешь ленивым).
> Все исправил
А города скопировать забыл:
> ReferenceError: cities is not defined @ http://fiddle.jshell.net/_display/:37
Также, вместо if (a.population > b.population) { ... можно писать просто return a.population - b.population, хотя это немного менее понятно, но зато короче.
Так, сделано верно.
> Вариация задачи №12:
Ой, ты зря так сделал, что сразу же считаешь цену. Не надо. Надо всего лишь сохранять что выбрано, а цену считать в отдельном методе «посчитатьЦену». Иначе смотри, мы допустим решим поменять тип начинки и что? Цена пересчитается? Нет, конечно.
Вообще, в данном случае у объекта не должно быть свойств типа «цена» так как ее всегда можно посчитать зная тип гамбургера, начинку и добавки.
> return console.log("неверный размер");
Абсолютно непраивльно. Ты пишешь в консоль сообщение об ошибке. А что, если кто-то вызывает твою функцию из кода, как он проверит что ошибки нет? Никак. Надо не выводить сообщение кооторое никто не прочтет, а выкидыват исключение.
Не исплоьзуй console.log внутри Gamburger.
>>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:
>>Попробуй так записать код.
Прекрасно. Теперь решение простое и лаконичное.
>>416820
Что в логах? Написано же белым по черному:
> [Sun Dec 14 19:16:52.456755 2014] [core:error] [pid 30907] (13)Permission denied: [client 127.0.0.1:34364] AH00035: access to /index.php denied (filesystem path '/home/bully/www') because search permissions are missing on a component of the path
На папке нет разрешения на поиск в ней файлов (это опция 'x' в правах, для файлов она дает разрешение на выполнение, а для папок разрешение на просмотр списка файлов). Надо дать не 755, а 777.
>Если ты программируешь на яваскрипте у тебя наверняка постоянно открыта консоль, так что проблемы нет
Ты прав, она открыта постоянно.
>Вообще, в данном случае у объекта не должно быть свойств типа «цена» так как ее всегда можно посчитать зная тип гамбургера, начинку и добавки.
Понял, перепилю.
>Content-Disposition: attachment
>Для скачивания
Так и делал. Перенес на хост, теперь вместо загрузки просто открывает файл браузером. В скрипте сначала:
header("Content-Disposition: attachment; filename=\"{$fileInfo['fileName']}\"");
А потом header("Location: foo/bar");
> А потом header("Location: foo/bar");
Ну так это редирект и браузер делает новый запрос
Плюс ты делаешь ошибку используя filename, эта опция не поддерживает utf-8 и ты не можешь использовать русские буквы (если в каком-то браузере работает — это ничего не значит, так как в других может не работать)
>>416895
> Использовал readfile() - помогло
Это плохая идея так как ты грузишь php в память ради скачивания файла. Апач умеет добавлять заголовки черех htaccess, положенный в нужную папку:
Header add Content-Disposition attachment
Вы видите копию треда, сохраненную 17 января 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.