Вы видите копию треда, сохраненную 19 сентября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>369682
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Начинающим: Никсон Р. - Создаем динамические веб-сайты с помощью PHP (аноны говорят, она не очень хорошая)
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Где архивы предыдущих тредов? Известно, где, на 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 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне.
В общем, давайте начинать уже!
> Предыдущий тред был тут
На самом деле тут >>373424 — но никто и не заметил
Побежал писать код? Стой, прочти сначала этот пост.
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт 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 жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
у определений функций и классов так:
function bakeCookies(...)
{
// ...
}
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
> Предыдущий тред был тут
На самом деле тут >>373424 — но никто и не заметил
Побежал писать код? Стой, прочти сначала этот пост.
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт 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 жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
у определений функций и классов так:
function bakeCookies(...)
{
// ...
}
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Так вот, Yii 1, Yii 2 или Symphony2?
Правильно ли я нагуглил, что вторым юйем мало кто ещё пользуется?
Во, и еще вопрос: что делает кеширование в Twig?
Делает статичной ту небольшую часть логики, что есть в шаблоне (циклы там, условия) и в результате мы обрабатываем как обычно - сперва скрипт с логикой для страницы, потом шаблон, но вместо пересчитывания циклов и условий в Twig-шаблоне мы отдаём статическую страничку из кеша и при необходимости перезагружаем кеш?
На php делал все задания по ООП, на мышах застрял, ну и я пообещал себе сделать позже, т.к. js для работы нужен больше.
Вот, задача про компанию вектор.
В принципе все готово за исключением вывода таблицы, но пока делать не стал так как кажется что некоторые вещи надо бы иначе написать, а как хз. В частности мне не нравится то что я в конструкторе использую свойства которые появятся только в подклассах, но и не копировать же 4 раза 1 и тот конструктор.
http://ideone.com/7Cmtbr
Задачка на функцию и банки. У меня в процессе возникло затруднение некоторое. В пхп якобы нельзя работать внутри функции с глобальными переменными, так? То есть если мне нужно в функции передавать какую-нибудь глобальную переменную, то мне нужно в описание функции добавить еще 1 переменную и глобальную передавать уже в неё при вызове функции?
>искать надо не в check, а в накопленном к данному моменту пути, то есть видимо path.
Ну так check это и есть массив накопленного пути, а в path у нас записаны все точки.
Там есть видео, я так понимаю его вставлять с помощью тега <video>? Также там на видео какие-то навороченные штучки(кнопка воспроизведения, полоса с продолжительностью) - это с помощью jQuery делается? Но я в него пока не умею.
Как можно сделать двойную тень?
И да, что вообще меняется при отзывчивой верстке? Сначала пишем html-код для компьютера, потом пишем css-код для мобильных(ненужным блоком просто устанавливаем display: none;, например?), потом уже пишем css для компьютеров?
Да, и нужно в них разбираться.
Вот код 12 задачи, там только свойства посмотри.
>> Правильно ли я понимаю, когда мы пишем что-то подобное: Hamburger.type[Hamburger.SIZE_SMALL] у конструктора Hamburger появляется объект type с свойством-объектом SIZE_SMALL?
>Нет. Ничего само не появляется. Если ты ранее явно не создал свойство type то Hamburger.type вернет undefined
Надо писать сначала Hamburger.type ={}, потом Hamburger.type[Hamburger.SIZE_SMALL] = {}? Ну а в таком случае что произойдет? Создается объект type у конструктора, потом мы кладем в свойство этого объекта другой объект SIZE_SMALL и ему задаем свойства. В таком случае Hamburger.type[Hamburger.SIZE_SMALL] как-то связан с константой SIZE_SMALL?
Да, верно, Юи 2 малораспространен, хотя он лучше в том плане, что там код приведен к общепринятым стандартам, и меньше велосипедов.
> Так вот, Yii 1, Yii 2 или Symphony2?
Yii, а за ним Symfony 2.
> Во, и еще вопрос: что делает кеширование в Twig?
Когда ты пытаешься вывести шаблон, происходит следующее:
- разбор шаблона и преобразование его в PHP-файл (очень медленно)
- выполнение этого php-файла (быстро)
Кеширование позволяет не делать преобразование каждый раз, а сделать один раз и сохранить уже готовый php файл в временную папку, а потом сразу использовать его что ускоряет работу кода.
Или ты про какое-то другое кеширование говорил? Приведи ссылочку тогда.
>>377589
Ок, хорошо
>>377590
> if ($isChief == 1) {
> $this->coffeeConsumption *= 2;
Не, это неправильно. У тебя если у человека убрать статус шефа, то потребление кофе назад не вернется. Не надо изменять это свойство, надо просто учитывать то, что сотрудник шеф, при расчете потребления в отдельном методе (кстати, где он?).
Ну и мне кажется, надо сделать добавление шефа по-другому:
$chief = new Engineer(3);
$department->setChief($chief);
так гораздо гибче получается — не надо руками везде указывать isChief, а он поставится сам когда ты назначаешь кого-то шефом. Ну и придется у департамента сделать отдельное свойство шеф, а то сейчас у тебя например получить кто шеф в департаменте невозможно без поиска по всем сотрудникам.
Кстати, для параметра $rank можно задать значение по умолчанию = 1 чтобы его можно было не указывать.
> public function __construct ($name, $employees)
Это неудобно, передавать сотрудников сразу в конструкторе. Лучше сделать метод addEmployees() чтобы можно было сотрудников постепенно добавлять а их конструктора убрать.
> class Employee
Надо добавить abstract. Чтобы запретить создавать объекты Employee и показать что это лишь базовй класс для других.
Вместо 0/1 удобнее испольовать true/false для isChief: http://php.net/manual/ru/language.types.boolean.php (да, они не описаны в учебнике, я знаю).
> мне не нравится то что я в конструкторе использую свойства которые появятся только в подклассах,
Интуиция тебя не подвела, это действительно неправильно. Базовый класс ничего не знает о своих наследниках. Но мы можем добавить все эти свойства в базовый класс и записать туда например 0.
Также, по возможности используй тайп хинты: http://php.net/manual/ru/language.oop5.typehinting.php — они делают код лучше
Да, верно, Юи 2 малораспространен, хотя он лучше в том плане, что там код приведен к общепринятым стандартам, и меньше велосипедов.
> Так вот, Yii 1, Yii 2 или Symphony2?
Yii, а за ним Symfony 2.
> Во, и еще вопрос: что делает кеширование в Twig?
Когда ты пытаешься вывести шаблон, происходит следующее:
- разбор шаблона и преобразование его в PHP-файл (очень медленно)
- выполнение этого php-файла (быстро)
Кеширование позволяет не делать преобразование каждый раз, а сделать один раз и сохранить уже готовый php файл в временную папку, а потом сразу использовать его что ускоряет работу кода.
Или ты про какое-то другое кеширование говорил? Приведи ссылочку тогда.
>>377589
Ок, хорошо
>>377590
> if ($isChief == 1) {
> $this->coffeeConsumption *= 2;
Не, это неправильно. У тебя если у человека убрать статус шефа, то потребление кофе назад не вернется. Не надо изменять это свойство, надо просто учитывать то, что сотрудник шеф, при расчете потребления в отдельном методе (кстати, где он?).
Ну и мне кажется, надо сделать добавление шефа по-другому:
$chief = new Engineer(3);
$department->setChief($chief);
так гораздо гибче получается — не надо руками везде указывать isChief, а он поставится сам когда ты назначаешь кого-то шефом. Ну и придется у департамента сделать отдельное свойство шеф, а то сейчас у тебя например получить кто шеф в департаменте невозможно без поиска по всем сотрудникам.
Кстати, для параметра $rank можно задать значение по умолчанию = 1 чтобы его можно было не указывать.
> public function __construct ($name, $employees)
Это неудобно, передавать сотрудников сразу в конструкторе. Лучше сделать метод addEmployees() чтобы можно было сотрудников постепенно добавлять а их конструктора убрать.
> class Employee
Надо добавить abstract. Чтобы запретить создавать объекты Employee и показать что это лишь базовй класс для других.
Вместо 0/1 удобнее испольовать true/false для isChief: http://php.net/manual/ru/language.types.boolean.php (да, они не описаны в учебнике, я знаю).
> мне не нравится то что я в конструкторе использую свойства которые появятся только в подклассах,
Интуиция тебя не подвела, это действительно неправильно. Базовый класс ничего не знает о своих наследниках. Но мы можем добавить все эти свойства в базовый класс и записать туда например 0.
Также, по возможности используй тайп хинты: http://php.net/manual/ru/language.oop5.typehinting.php — они делают код лучше
> В пхп якобы нельзя работать внутри функции с глобальными переменными, так?
Да. Функция должна работать с тем, что ей явно передано. Это делает ее независимой от остальной части кода.
> То есть если мне нужно в функции передавать какую-нибудь глобальную переменную, то мне нужно в описание функции добавить еще 1 переменную и глобальную передавать уже в неё при вызове функции?
Да.
Сделай еще чтобы функция не выводила сразу ответ через echo а возвращала через return сколько всего выполчено. А то может мы хотим что-то с этим результатом сделать, например, сравнить где выгоднее (кстати, допиши-ка чтобы он писал какой банк выгоднее).
Ответил уже тут >>377641
>>377622
> Там есть видео, я так понимаю его вставлять с помощью тега <video>? Также там на видео какие-то навороченные штучки(кнопка воспроизведения, полоса с продолжительностью) - это с помощью jQuery делается? Но я в него пока не умею.
Можешь пока картинку поставить, а кнопки просто неподвижными элементами сверстать.
> Как можно сделать двойную тень?
И box-shadow и text-shadow позволяют указать несколько теней: http://htmlbook.ru/css/box-shadow
> И да, что вообще меняется при отзывчивой верстке?
Отзывчивая верстка — та, которая подстраивается под размер экрана (и другие характеристики устройства). То есть не пытается на маленьком экране выводиться вширь на 1000 px. Вместо этого блоки выстраиваются вертикально. Проверить можно, уменьшив окно браузера.
Просто отключать блоки не вариант, надо именно перестраивать, например вместо того чтобы ставить их горизонтально, ставить вертикально на малентком экране.
http://habrahabr.ru/post/119127/
http://habrahabr.ru/post/144003/
> Сначала пишем html-код для компьютера, потом пишем css-код для мобильных(ненужным блоком просто устанавливаем display: none;, например?), потом уже пишем css для компьютеров?
Можно в любом порядке, это непринципиально. Мне удобнее для больших экранов сначала сверстать а потом для маленьких. Но есть принцип mobile first когда сначала делают мобильную верисю.
Да.
>>377633
> Надо писать сначала Hamburger.type ={}, потом Hamburger.type[Hamburger.SIZE_SMALL] = {}?
Да
> Создается объект type у конструктора
Да. Только правильнее «добавляется свойство type у конструктора Hamburger, в которое помещается пустой объект».
> потом мы кладем в свойство этого объекта другой объект SIZE_SMALL и ему задаем свойства.
Нет, мы добавляем свойство с именем, которое хранится в Hamburger.SIZE_SMALL (а там хранится 'SMALL').
Hamburger.SIZE_SMALL — это не объект, а просто строка 'SMALL'. Имя свойства может быть только числом или строкой, а не объектом.
> В таком случае Hamburger.type[Hamburger.SIZE_SMALL] как-то связан с константой SIZE_SMALL?
Никак не связан. Сравни:
> x['y'] = 1;
> В таком случае x['y'] как-то связан со строкой 'y'?
>>377634
То, что в Hamburger.type, Hamburger.filling, Hamburger.additive сделано верно.
Да.
>>377633
> Надо писать сначала Hamburger.type ={}, потом Hamburger.type[Hamburger.SIZE_SMALL] = {}?
Да
> Создается объект type у конструктора
Да. Только правильнее «добавляется свойство type у конструктора Hamburger, в которое помещается пустой объект».
> потом мы кладем в свойство этого объекта другой объект SIZE_SMALL и ему задаем свойства.
Нет, мы добавляем свойство с именем, которое хранится в Hamburger.SIZE_SMALL (а там хранится 'SMALL').
Hamburger.SIZE_SMALL — это не объект, а просто строка 'SMALL'. Имя свойства может быть только числом или строкой, а не объектом.
> В таком случае Hamburger.type[Hamburger.SIZE_SMALL] как-то связан с константой SIZE_SMALL?
Никак не связан. Сравни:
> x['y'] = 1;
> В таком случае x['y'] как-то связан со строкой 'y'?
>>377634
То, что в Hamburger.type, Hamburger.filling, Hamburger.additive сделано верно.
Warning: file_get_contents() [function.file-get-contents]: Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?
Как это исправить, где что включить?
http://stackoverflow.com/questions/1975461/file-get-contents-with-https
Тут пишут надо расширение openssl включить.
Расскоментировал extension=php_openssl.dll, перезагрузил сервер. Все равно не работает. Расришерине лежит в папке.
Может у тебя не шиндошс?
В смысле не тот? php.ini, который у меня в папке шиндовс лежит. Нашел чувака, у которого такая же проблема, ему посоветовали какую-то программу скачать.
>Ок, все верно
как тебе то что я вывожу имя банка через кейс? По другому не додумался как можно сделать кроме как сравнивая переменные с самими же собой.
По другому можно
if ($bank1 < $bank2 && $bank1 < $bank3) {
банк 1 выгоднее
}
Или положить цены в массив и найти наименьшую.
Твой вариант тоже норм.
>>377701
Ищи по слову openssl. У меня есть заголовок openssl, под ним написано
OpenSSL supportenabled
И этот код работает:
error_reporting(-1);
$d = file_get_contents('https://www.google.com/');
var_dump($d);
Ты сервер перезапустил кстати?
А ты в том ли файле раскомментировал строчку? Тут http://stackoverflow.com/questions/14291151/you-must-enable-the-openssl-extension-to-download-files-via-https пишут что например у WAMP свой конфиг.
Что у тебя за сборка кстати?
http://php.net//manual/ru/openssl.installation.php
Тут написано dll-ка должна быть доступна.
И кстати, имей в виду, сборки предназначены для экономии времени опытных разработчиков. Начинающим лучше ставить все самому.
Ты читал ссылку? http://php.net//manual/ru/openssl.installation.php
Там надо чтобы библиотека ssleay.dll была доступна. Посомтри, где она у тебя хранится и чему равна PATH (посмотреть можно в свойствах системы вызываемых по Win + Pause (или Break?) -> дополнительно -> переменные среды).
Посомтри нет ли чего в логе ошибок (в папке Апача logs/error.log)
Ты же заменил слово disabled на enabled в конфиге, да?
Теперь всё работает, по крайней мере пишет SSL enabled. У меня оказывается не был прописан путь к пхп, хотя я его туда добавлял, когда устанавливал, мамой клянусь.
Протестил на https://google.ru, он работает, а этот тред нет.
[function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable
Так и должно быть?
Да, тут же какая-то клаудфлаерская антиддос-хуита
http://ideone.com/natdNO
> Скопировано 3 раза. Попрбуй избавиться от копипасты.
Поправил. Норм?
http://ideone.com/uIH6Xr
>while/endwhile применяется в шаблонах. 5000 надо выносить в переменную. Код лучше бы постить на ideone так как непонятно что он выодит и работает ли вообще.
Я ж написал, что на коленке код писал то есть абсолютно не думая, чисто на интуиции отталкивался трактовки задачи. Вайл/ендвайл я применял вместо скобок, нахуй скобки, когда можно словами написать. Зачем 5000 выносить в переменную, если это фиксированный ежемесячный платеж. Ладно еще в константу.
>Это называется костыли. Лучше бы нормально сделать, а то такой код поддерживать и развивать невозможно.
Ты про арифметику остатков не слышал да? Покажи свой код, будь добр.
>Прекрасно состоавлено (ну ок может и не очень).
Я тебе на пальцах объяснил почему задача некорректна, ты зачем такой сложный?
>Там в предыдущей более простой задаче (которую ты пропустил? зря) пояснено, что эти проценты добавляются к остатку кредита каждый месяц + добавляется фиксированная комиссия.
Какой предыдущей? Я эту задачу с джпега взял.
> Рубипроблемы
Есть некоторые ПРОБЛЕМЫ в движке и стандарте, когда ты с языками, отличными от английского работаешь, но там скорее косметически неприятно. В данном случае проблемы нет и работать будет хоть с муслимскими иероглифами.
мимо-рубипроходил
Нормально ли доверять $_FILES['userfile']['type'] и при скачивании файла записывать этот mimetype в заголовок или сначала проверять в скрипте (всякие getImageSize для проверки на изображение)?
И да, на каком этапе нужно переходить на jQuery? Я просто видел, что ты в прошлом треде писал, что стоит сначала пописать на чистом js, а потом перекатываться на jQuery/
Что-то я какой-то косноязычный. Извиняй за кривой слог.
Ну задумка такая, что надо сначала решить все задачки на DOM — а потмо переходить к jQuery. По нему я правда пока еще задачек не придумал.
>>377749
Ок, теперь верно. Хотя я бы не заводил переменную newSumm, а использовал creditSumm
>>377757
> Вайл/ендвайл я применял вместо скобок, нахуй скобки, когда можно словами написать.
Не любишь скобки — пиши на другом языке.
> Зачем 5000 выносить в переменную, если это фиксированный ежемесячный платеж.
Чтобы все исходные данные были в начале прогаммы и их удобно было поменять.
> Ладно еще в константу.
Константы не для этого используются.
> Ты про арифметику остатков не слышал да?
Не слышал. Я вижу, что вместо простого и логичного решения ты нагородил то, что мешает читать и поддерживать код. Какой смысл усложнять логику, если можно не усложнять?
Так любой быдлокодер может сказать, что он не быдлокодер, а просто использует нечеткую логику.
> Я тебе на пальцах объяснил почему задача некорректна, ты зачем такой сложный?
Ты не прав. Я согласен, что описание не очень точное, это я потом исправлю, но в общем другие аноны как-то понимают, что требуется. Тем более что в предыдущей задаче есть часть решения, и там уже написана формула увеличения долга.
> Какой предыдущей? Я эту задачу с джпега взял.
А не надо было учебник с середины проходить.
Ну задумка такая, что надо сначала решить все задачки на DOM — а потмо переходить к jQuery. По нему я правда пока еще задачек не придумал.
>>377749
Ок, теперь верно. Хотя я бы не заводил переменную newSumm, а использовал creditSumm
>>377757
> Вайл/ендвайл я применял вместо скобок, нахуй скобки, когда можно словами написать.
Не любишь скобки — пиши на другом языке.
> Зачем 5000 выносить в переменную, если это фиксированный ежемесячный платеж.
Чтобы все исходные данные были в начале прогаммы и их удобно было поменять.
> Ладно еще в константу.
Константы не для этого используются.
> Ты про арифметику остатков не слышал да?
Не слышал. Я вижу, что вместо простого и логичного решения ты нагородил то, что мешает читать и поддерживать код. Какой смысл усложнять логику, если можно не усложнять?
Так любой быдлокодер может сказать, что он не быдлокодер, а просто использует нечеткую логику.
> Я тебе на пальцах объяснил почему задача некорректна, ты зачем такой сложный?
Ты не прав. Я согласен, что описание не очень точное, это я потом исправлю, но в общем другие аноны как-то понимают, что требуется. Тем более что в предыдущей задаче есть часть решения, и там уже написана формула увеличения долга.
> Какой предыдущей? Я эту задачу с джпега взял.
А не надо было учебник с середины проходить.
Переделал чуток.
Сделал проверки для миниатюрного изображения и аудио-плеера, игнорируя $_FILES['userfile']['type'].
Чуток почитал статьи, там указывают тип "application/octet-stream" при скачивании, сделал также. Отдаю файлы через апачевский XSendFile, правда XSenfFilePath никак не хочет указывать разрешённые директории.
Ну типа того, удобно всё слепленное в кучу
Это поле ставится браузером. Браузер может не знать о каком-то типе файла, а также может передать вместо него что угодно, потому доверять ему особо не стоит.
> и при скачивании файла записывать этот mimetype в заголовок
Определенно нет, а то злоумышленник сможет нужный ему заголовок сформировать.
>>377769
Яндекс определяет мобиыльные устройства по user-agent и пересылает их на мобильную версию сайта. Она отличается, возможно потому им удобнее поддерживать 2 версии сайта.
Если в браузере прописать юзер-агентом например Сафари на iPhone, то открывается другая версия страницы (в Хроме это можно сделать в настройках dev tools, в ФФ через расширения или правку конфига). То же и в маркете, и а
Ну и немного он адаптируется — попробуй поменять ширину окна, он тянется. То же и с яндекс-авто, маркетом.
Гитхаб тоже кстати на UA смотрит.
Сбербанк не регирует ни на ширину, ни на юзер-агент, ну видимо им это не надо.
>>377763
Тебе бы надо сделать github pages — чтобы страницу можно было на гитхабе просматривать.
И начинать лучше начиная с простых задач, например второй задачи про поле с клетками.
Если уж делать виджет галереи, то его требуется делать так, чтобы его можно было поместить на любую страницу без лишней настройки и без конфликтов. То есть, логично чтобы он использовался примерно таким образом:
<скрипт src="код"></скрипт>
<скрипт>
var gallery = new GalleryWidget({
root: someElement
});
</скрипт>
Число и размеры картинок не должны быть жестко заданы в коде.
classList — часть HTML 5, ты в курсе? Как и query selector кстати.
> var slide2 = document.querySelector('.slider .images > li:nth-child(2)');
> var slide3 = document.querySelector('.slider .images > li:nth-child(3)');
Это не годится, число слайдов надо в переменной хранить а не копипастить строчки. Ну и я не вижу работы с дом, ты бы легко мог использовать свойства children, nextSibling.
Код слайдера не должен лежать в глобальном контенксте, а должен быть офомлен в виде класса. А то ты засоряешь глобальные переменные своими.
Хотелось бы, чтобы слайды анимиовались и там, где нет CSS3. Для того тебе бы пригодился класс для анимации из одной из предыдыущих задачек.
При клике несколько раз по кнопке значок на ней выделяется и появляется синяя полоска. Надо либо использовать css-свойство запрещающее выделять текст либо отменять событие onselectstart или как-то так.
> class="hide"
> class="ahead"
Все имена классов должны быть с префиксом, иначе при вставлке на стороннюю страницу, будут конфликты.
> width: 500px;
Это тоже плохо. Что это за слайдер, у которого нельзя поменять ширину или поставить чтобы она равнялась ширине родиьеля?
Высота тоже жестко прописана в коде. Неудобно, удобнее когда это все само определяется размерами картинок.
Лучше сделать универсальное решение, которое можно поместить на любую страницу, без лишней настройки.
Ну и я не уверен, что это хорошо ставить все img прямо в коде. Это вызовет загрузку всех картинок, даже если пользователь их не будет смотреть. Лучше подгружать только текущую картинку и 2-3 следующих, а адреса картинок передавать в параметрах виджета. Правда, в этом случае мы не сможем для браузеров без JS отобразить картинки списком (а также поисковые системы их не проиндексируют) — но что поделать, для них можно оставить только первую картинку в виде img.
Это поле ставится браузером. Браузер может не знать о каком-то типе файла, а также может передать вместо него что угодно, потому доверять ему особо не стоит.
> и при скачивании файла записывать этот mimetype в заголовок
Определенно нет, а то злоумышленник сможет нужный ему заголовок сформировать.
>>377769
Яндекс определяет мобиыльные устройства по user-agent и пересылает их на мобильную версию сайта. Она отличается, возможно потому им удобнее поддерживать 2 версии сайта.
Если в браузере прописать юзер-агентом например Сафари на iPhone, то открывается другая версия страницы (в Хроме это можно сделать в настройках dev tools, в ФФ через расширения или правку конфига). То же и в маркете, и а
Ну и немного он адаптируется — попробуй поменять ширину окна, он тянется. То же и с яндекс-авто, маркетом.
Гитхаб тоже кстати на UA смотрит.
Сбербанк не регирует ни на ширину, ни на юзер-агент, ну видимо им это не надо.
>>377763
Тебе бы надо сделать github pages — чтобы страницу можно было на гитхабе просматривать.
И начинать лучше начиная с простых задач, например второй задачи про поле с клетками.
Если уж делать виджет галереи, то его требуется делать так, чтобы его можно было поместить на любую страницу без лишней настройки и без конфликтов. То есть, логично чтобы он использовался примерно таким образом:
<скрипт src="код"></скрипт>
<скрипт>
var gallery = new GalleryWidget({
root: someElement
});
</скрипт>
Число и размеры картинок не должны быть жестко заданы в коде.
classList — часть HTML 5, ты в курсе? Как и query selector кстати.
> var slide2 = document.querySelector('.slider .images > li:nth-child(2)');
> var slide3 = document.querySelector('.slider .images > li:nth-child(3)');
Это не годится, число слайдов надо в переменной хранить а не копипастить строчки. Ну и я не вижу работы с дом, ты бы легко мог использовать свойства children, nextSibling.
Код слайдера не должен лежать в глобальном контенксте, а должен быть офомлен в виде класса. А то ты засоряешь глобальные переменные своими.
Хотелось бы, чтобы слайды анимиовались и там, где нет CSS3. Для того тебе бы пригодился класс для анимации из одной из предыдыущих задачек.
При клике несколько раз по кнопке значок на ней выделяется и появляется синяя полоска. Надо либо использовать css-свойство запрещающее выделять текст либо отменять событие onselectstart или как-то так.
> class="hide"
> class="ahead"
Все имена классов должны быть с префиксом, иначе при вставлке на стороннюю страницу, будут конфликты.
> width: 500px;
Это тоже плохо. Что это за слайдер, у которого нельзя поменять ширину или поставить чтобы она равнялась ширине родиьеля?
Высота тоже жестко прописана в коде. Неудобно, удобнее когда это все само определяется размерами картинок.
Лучше сделать универсальное решение, которое можно поместить на любую страницу, без лишней настройки.
Ну и я не уверен, что это хорошо ставить все img прямо в коде. Это вызовет загрузку всех картинок, даже если пользователь их не будет смотреть. Лучше подгружать только текущую картинку и 2-3 следующих, а адреса картинок передавать в параметрах виджета. Правда, в этом случае мы не сможем для браузеров без JS отобразить картинки списком (а также поисковые системы их не проиндексируют) — но что поделать, для них можно оставить только первую картинку в виде img.
Ну я работаю веб-мастером получается. Joomla и Webasyst теперь знаю вдоль и поперек. Но кодить все равно приходится, но по мелочи. Чаще для упрощения себе жизни, работая с огромным количеством файлов или товаров например.
http://dev.mysql.com/downloads/
MySQL Server - сама СУБД.
MySQL Workbench - удобный графический интерфейс к ней.
Посмотри позязя, я правильный перечень установил?
В самоучителе по пхп еще написано, что для запуска нужно создать файл с расширением бат и прописать адрес: start c:\Home_server\mysql\bin\mysqld-nt.exe -u root
-standalone
exit
Но в папке бин папки Мускул Сервер 5.6 нет такого файла.
Придурок, ты хоть знаешь что такое нечеткая логика? Короче, ясно все с тобой, я не буду тебе ничего доказывать, так как твоя глупость и упертость безгранична.
http://archive-ipq-co.narod.ru/l1/mou-ikkai.html
Ну раз крутой такой что вах вах решай эти. Ну или вот на ооп задачки внизу страницы имеются
http://archive-ipq-co.narod.ru/l1/pasta.html
Смотрю у тебя очень интересная и насыщенная жизнь, не жалко тратить свое время на постинг унылой ерунды в треде где такие клоуны как ты только вызывают улыбки у тутошних обитателей?
Хочу уже взяться за задачу с кошками мышками, но ума не приложу с чего начать. пока что только создал массив $field['x'] = 100, $field['y'] = 100 и решил что вроде как тут 3 класса. Поле, кошка и мышка.
Сам будто не тоже самое сделал.
Я тут исправляю сейчас по твоим замечаниям. Возник вопрос.
>Я тут еще подумал, а в чем смысл в раздельном логине для студентов и преподавателей?
Там ведь есть еще логин через социальные сети. Так вот если человек не зарегистрирован в системе и пытается залогиниться через них, я его не логиню, а сначала регистрирую. И если сделать страницу логина общей для всех пользователей, то я не смогу определить, кто это, преподаватель или студент. Соответственно не смогу назначить нужный тип в базе.
Самая адекватная идея, которая пришла мне в голову, спрашивать у пользователя кто он, когда при oauth регистрации мы выводим форму с просьбой указать групп(у/ы). Что скажешь?
Отказывает в доступе. Я правда бат. в мускуле не создал, поэтому?
Для того, чтобы подключиться, нужно указать в майскуэле коннекте логин и пароль. Ты его полюбому должен был создавать при установке майскуэля. Если нет, то погугли как создать нового пользователя.
И mysql_* не используются сейчас, возьми учебник поновее.
да что за хуйня только что успешно создал ДБ, а теперь опять фейл!
фреймы и js не предлагать
Таких компонентов тьма, да и стандартный owerflow:auto работает.
Ресь о том, как сделать колонку до низа страницы без указания факсированного размера, предварительно вычисляя его JS.
Ну хорошо конечно, но ты бы мог еще и ссылочку на гитхаб скинуть, а то трудно что-то прокомментировать.
> function addEmployees($employees)
Тут можно было добавить type hint: array $employees
> return count($this->employees) + 1;
Правильнее бы проверить есть ли шеф и если нет то не добавлять 1
> return round($employeesSalary);
Лучше возвращать число как есть, а округлять уже при выводе
> $total['employeesCount'][] = $employeesCount;
А зачем массив? Сразу складывай числа.
> foreach ($total as $value) {
> echo padLeft(array_sum($value), $columnWidth);
Этот код очень ненадежный, так как предполагает что элементы в массиве идут строго в определенном порядке. Плохо. Лучше явно перечислить поля, или например сделать массив с названиями полей.
В остальном, все хорошо.
>>378075
По моему, ты установил кучу ненужной фигни.
> В самоучителе по пхп еще написано, что для запуска нужно создать файл с расширением бат
Если ты установил MySQL как сервис в систему, то запустить его можно через окно управления сервисами (пуск -> services.msc) или командой net start mysql
Учти, что у денвера есть свой mysql, если тот запущен то он займет порт 3389 и второй mysql будет не запустить.
>>378090
http://codeforces.ru/
http://algolist.manual.ru/olimp/
http://acmp.ru/?main=tasks
> function addEmployees($employees)
Тут можно было добавить type hint: array $employees
> return count($this->employees) + 1;
Правильнее бы проверить есть ли шеф и если нет то не добавлять 1
> return round($employeesSalary);
Лучше возвращать число как есть, а округлять уже при выводе
> $total['employeesCount'][] = $employeesCount;
А зачем массив? Сразу складывай числа.
> foreach ($total as $value) {
> echo padLeft(array_sum($value), $columnWidth);
Этот код очень ненадежный, так как предполагает что элементы в массиве идут строго в определенном порядке. Плохо. Лучше явно перечислить поля, или например сделать массив с названиями полей.
В остальном, все хорошо.
>>378075
По моему, ты установил кучу ненужной фигни.
> В самоучителе по пхп еще написано, что для запуска нужно создать файл с расширением бат
Если ты установил MySQL как сервис в систему, то запустить его можно через окно управления сервисами (пуск -> services.msc) или командой net start mysql
Учти, что у денвера есть свой mysql, если тот запущен то он займет порт 3389 и второй mysql будет не запустить.
>>378090
http://codeforces.ru/
http://algolist.manual.ru/olimp/
http://acmp.ru/?main=tasks
> Cannot redeclare class mail
Ты где-то видимо 2 раза подключил файл с определением класса, вот и ошибка. Попробуй найти где.
Если ты не разбираешься ни в Битрикс ни в PHP, то лучше вообще не берись за задачи, связанные с написанием кода — ничего не выйдет.
Тем более если речь о такой запутанной и сложной системе как битрикс — не разбираясь в ней, в ее потроха лезть не стоит. Надо сначала изучить архитектуру, почитать мануалы.
Тем более что твою задачу наверняка можно решить без написания кода, поставив какой-нибудь плагин или расширение. Лучше поищи в этом направлении.
>>378124
Начни с определения, какие классы будут, какие у них будут свойства и методы.
И давай в этой задаче использовать инкапсуляуию, то есть сделаем все свойства private/protected и публичными оставим только методы. Это позволяет разбить код на изолированные друг от друга классы и сделать его надежнее.
>>378140
> И если сделать страницу логина общей для всех пользователей, то я не смогу определить, кто это, преподаватель или студент. Соответственно не смогу назначить нужный тип в базе.
Да, ты прав.
> Самая адекватная идея, которая пришла мне в голову, спрашивать у пользователя кто он, когда при oauth регистрации мы выводим форму с просьбой указать групп(у/ы). Что скажешь?
Раз уж ты выводишь диалог то да, можно там и справшивать. Одна страница входа все же лучше чем две.
>>378154
Где подробности? Что phpinfo() показывает? Что в php.ini? сервер перезапускал?
> Cannot redeclare class mail
Ты где-то видимо 2 раза подключил файл с определением класса, вот и ошибка. Попробуй найти где.
Если ты не разбираешься ни в Битрикс ни в PHP, то лучше вообще не берись за задачи, связанные с написанием кода — ничего не выйдет.
Тем более если речь о такой запутанной и сложной системе как битрикс — не разбираясь в ней, в ее потроха лезть не стоит. Надо сначала изучить архитектуру, почитать мануалы.
Тем более что твою задачу наверняка можно решить без написания кода, поставив какой-нибудь плагин или расширение. Лучше поищи в этом направлении.
>>378124
Начни с определения, какие классы будут, какие у них будут свойства и методы.
И давай в этой задаче использовать инкапсуляуию, то есть сделаем все свойства private/protected и публичными оставим только методы. Это позволяет разбить код на изолированные друг от друга классы и сделать его надежнее.
>>378140
> И если сделать страницу логина общей для всех пользователей, то я не смогу определить, кто это, преподаватель или студент. Соответственно не смогу назначить нужный тип в базе.
Да, ты прав.
> Самая адекватная идея, которая пришла мне в голову, спрашивать у пользователя кто он, когда при oauth регистрации мы выводим форму с просьбой указать групп(у/ы). Что скажешь?
Раз уж ты выводишь диалог то да, можно там и справшивать. Одна страница входа все же лучше чем две.
>>378154
Где подробности? Что phpinfo() показывает? Что в php.ini? сервер перезапускал?
В ОП-посте есть немного.
По js — learn.javascript.ru
>>378200
Таблицей через display: table попробуй. Вообще, по моему тут нужен либо flexbox либо JS, средствами CSS так просто это не сделать.
Еще есть единица измерения wh (или vh?) — проценты от высоты окна, но она не везде работает.
>>378210
Выичслять через JS дурацкая идея так как размер не будет сам пересчитываться при изменении размеров окна или масштаба (это можно исправить) и при изменениях на странице (а это - нет).
>>378214
height 100% работает только если у родителя и всех предков стоит высота в пикселях или процентах, а не auto.
гугли адаптивную вёрстку.
Анончики, самая первая попытка кодить после паскаля в школе и дельфи универа.
Нормально оформлено?
http://ideone.com/AtZzFp
if (condition) {
бла бла бла;
}
for (bla; bla; bla) {
бла бла бла;
}
function getName()
{
return blabla;
}
class Name
{
public bla;
}
Ну и твое должно выглядеть так
if ($humanSum>$robotSum) {
echo "\nЧеловеки победили! \n";
} elseif ($humanSum==$robotSum) {
echo "\nНичья! \n";
} else {
echo "\nПобеда роботов! \n";
}
В общем у ифов и циклов открывающая фигурная на одной строке, а у функций и классов на следующей.
if (condition) {
бла бла бла;
}
for (bla; bla; bla) {
бла бла бла;
}
function getName()
{
return blabla;
}
class Name
{
public bla;
}
Ну и твое должно выглядеть так
if ($humanSum>$robotSum) {
echo "\nЧеловеки победили! \n";
} elseif ($humanSum==$robotSum) {
echo "\nНичья! \n";
} else {
echo "\nПобеда роботов! \n";
}
В общем у ифов и циклов открывающая фигурная на одной строке, а у функций и классов на следующей.
Ппонял, спасибо. Попробую привыкнуть.
Ящитаю лучше так:
if ($humanSum>$robotSum) {
echo "\nЧеловеки победили! \n";
}
elseif ($humanSum==$robotSum) {
echo "\nНичья! \n";
}
else {
echo "\nПобеда роботов! \n";
}
Определить достоинство игральных карт по номеру
Игральным картам присвоены следующие порядковые номера в зависимости от их достоинства: "валет" - 11, "дама" - 12, "король" - 13, "туз" - 14. Порядковые номера остальных карт соответствуют их названиям("семерка", "восмерка" и т. д.). Вам нужно разработать программу, которая выводила достоинство карты по заданному номеру, который будет вводит пользователь.
<?php
$number=7;
switch ($number):
case 6:
echo "Шестерка";
break;
case 7:
echo "Семерка";
break;
case 8:
echo "Восьмерка";
break;
case 9:
echo "Девятка";
break;
case 10:
echo "Десятка";
break;
default:
echo "Неправильный номер карты";
endswitch;
В цикле var tmp += '<div><span>'+someValue+'</span></div>' и потом jQuery('#id').html(tmp).
В php у меня трудно с файлами, урлами, курлы не пользую и не знаю для чего это, ооп и фреймворки тоже.
Минимум знаний о протоколах, http, например, посылаемых заголовках и т.д., а именно как это можно использовать на практике.
Хочу узнать о модных js фишках, и я не имею ввиду jQuery().slideDown(). Вот о прототипах я не знаю. В общем необходимо узнать нахуя это нужно на практике.
Flexbox тоже много где не работает. А где работает, то работает по-разному.
>Учти, что у денвера есть свой mysql,
А как отключить майсокл в денвере. Я еще посмотрел, у меня и в пхп есть папочка с мускулом.
http://jsbin.com/hekole/10/edit?js,console
Оп, но я люблю динамичность, чтобы и объекты сами создавались, и считалось все само собой по запуску скрипта.
Ну ладно, я пришел задать пару вопросов.
Что лучше, создать объект Houses, в котором рандомно вычисляется количество домов и рандомно в каждом квартир, или создать рандомное количество объектов House, где в каждом рандомное количество квартир. Что будет быстрее и производительнее?
Что лучше: написать для каждого свойства метод setSomething или создать метод setProperties, который запишет в свойства рандомные значения?
Ну и так погуляй по коду, посмотри что не так.
По идее современные телефоны вполне хорошо отображают html5. Но для сайтов часто применяют адаптивную верстку — когда на узком экране содержимое выстраивается вертикально. Это считается удобнее, чем зумить и таскать страницу туда-сюда.
position fixed элементы могут работать не так.
Все, что основано на hover (наведении мыши), работать не будет.
Событие клика приходит с задержкой около 400 мс. Если хочешь мгновенную реакцию, надо ловить touch события.
Флеша нет.
Не css-анимации могут тормозить.
Если используются кастомные селекты или календарики, их надо не включать на мобильном. а оставлять обычный селект и input date.
>>378262
После if фигурные скобки не так поставлены. Пропусти код например через phpformatter.com — он тебе его поправит.
По программе — верно, только нет проверки на даблы.
>>378299
fl.ru, weblancer, odesk.
> и можно мб хоть какую-то копеечку заработать или хотя бы задания оттуда поделать и понять, за что сколько платят.
На это ориентироваться не стоит. На фриланс выикдывают обычно всякую рутину которой никто заниматься не хочет. Он годится как средство подработки, но лучше развиваться дальше и найти нормальную работу.
>>378308
Нет, это не по стандартам. Вот пример из стандарта PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#11-example
>>378351
> мб так даже
Ни в коем случае. Хватит выдумвать свои способы когда есть стандарт.
>>378319
Можно,
$cards = array(
6 => 'Шестерка',
7 => ....
);
По идее современные телефоны вполне хорошо отображают html5. Но для сайтов часто применяют адаптивную верстку — когда на узком экране содержимое выстраивается вертикально. Это считается удобнее, чем зумить и таскать страницу туда-сюда.
position fixed элементы могут работать не так.
Все, что основано на hover (наведении мыши), работать не будет.
Событие клика приходит с задержкой около 400 мс. Если хочешь мгновенную реакцию, надо ловить touch события.
Флеша нет.
Не css-анимации могут тормозить.
Если используются кастомные селекты или календарики, их надо не включать на мобильном. а оставлять обычный селект и input date.
>>378262
После if фигурные скобки не так поставлены. Пропусти код например через phpformatter.com — он тебе его поправит.
По программе — верно, только нет проверки на даблы.
>>378299
fl.ru, weblancer, odesk.
> и можно мб хоть какую-то копеечку заработать или хотя бы задания оттуда поделать и понять, за что сколько платят.
На это ориентироваться не стоит. На фриланс выикдывают обычно всякую рутину которой никто заниматься не хочет. Он годится как средство подработки, но лучше развиваться дальше и найти нормальную работу.
>>378308
Нет, это не по стандартам. Вот пример из стандарта PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#11-example
>>378351
> мб так даже
Ни в коем случае. Хватит выдумвать свои способы когда есть стандарт.
>>378319
Можно,
$cards = array(
6 => 'Шестерка',
7 => ....
);
> В цикле var tmp += '<div><span>'+
Это лапша. Для этого лучше использовать шаблонизаторы. Есть такие:
- мощные handlebars (наследник mustache js)
- простенький JSRender как плагин jQuery, который наверно тут подойдет больше учиытвая что шаблон простой: http://habrahabr.ru/post/148573/
- microtemplating (который я бы поостергся использовать): http://ejohn.org/blog/javascript-micro-templating/
- сайт помогающий выбрать: http://garann.github.io/template-chooser/
Я бы советовал смотреть на синтаксис, ибо у многих шаблонизаторов он очень даже своеобразный.
> В php у меня трудно с файлами, урлами, курлы не пользую и не знаю для чего это, ооп и фреймворки тоже.
У меня есть урок по ООП для полных нулей в этом, не хочешь глянуть? http://archive-ipq-co.narod.ru/l1/pasta.html
Фреймворки — это вроде библиотек, содержащих готовый каркас приложения.
> Минимум знаний о протоколах, http, например, посылаемых заголовках и т.д., а именно как это можно использовать на практике.
Это проще всего в википедии почитать, описания кодов состояния и заголовков:
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP
Там часто используемых не так и много.
> Вот о прототипах я не знаю
Они нужны так как на них делается ООП, в jQuery кстати тоже.
> Хочу узнать о модных js фишках,
Ты бы сначала сам jS изучил. Не хочешь простые задачки порешать? https://gist.github.com/codedokode/ce30e7a036f18f416ae0
А так — это Require.JS/AMD, Backbone, underscore, Angular.
> В цикле var tmp += '<div><span>'+
Это лапша. Для этого лучше использовать шаблонизаторы. Есть такие:
- мощные handlebars (наследник mustache js)
- простенький JSRender как плагин jQuery, который наверно тут подойдет больше учиытвая что шаблон простой: http://habrahabr.ru/post/148573/
- microtemplating (который я бы поостергся использовать): http://ejohn.org/blog/javascript-micro-templating/
- сайт помогающий выбрать: http://garann.github.io/template-chooser/
Я бы советовал смотреть на синтаксис, ибо у многих шаблонизаторов он очень даже своеобразный.
> В php у меня трудно с файлами, урлами, курлы не пользую и не знаю для чего это, ооп и фреймворки тоже.
У меня есть урок по ООП для полных нулей в этом, не хочешь глянуть? http://archive-ipq-co.narod.ru/l1/pasta.html
Фреймворки — это вроде библиотек, содержащих готовый каркас приложения.
> Минимум знаний о протоколах, http, например, посылаемых заголовках и т.д., а именно как это можно использовать на практике.
Это проще всего в википедии почитать, описания кодов состояния и заголовков:
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP
Там часто используемых не так и много.
> Вот о прототипах я не знаю
Они нужны так как на них делается ООП, в jQuery кстати тоже.
> Хочу узнать о модных js фишках,
Ты бы сначала сам jS изучил. Не хочешь простые задачки порешать? https://gist.github.com/codedokode/ce30e7a036f18f416ae0
А так — это Require.JS/AMD, Backbone, underscore, Angular.
Не знаю, там наверно панелька или что-то такое есть для управления серевером и для отключения.
>>378409
> this.checkType(this.size);
Это лучше делать сразу в конструкторе. Иначе если getCost не вызвывать то ошибка не обнаружится.
> if (this.extended[m] == this.extended[m - 1]) {
А это там, где добавляется добавка
А так, в остальном норм.
>>378413
Стектрейс — это список функций, внутри которых произошла ошибка. Показывается не только та функция, где она произошла, но и последовательность функций, из кторых она вызвана. Это помогает найти причины ошибки.
Соответственно, выбрасывая нестандартные исключения ты можешь остаться без стектрейса, что неудобно.
>>378422
> или создать рандомное количество объектов House,
Это конечно. Дома же разные бывают. Для каждого дома — свой объект.
> Что будет быстрее и производительнее?
Тут надо сделать правильнее, а не производительнее
> Что лучше:
Передавать число квартир в конструктор. С чего это дом должен сам генерировать число квартир в нем? То же отсноистя и к остальным случайным числам.
setPower надо вообще выпилить, это что-то непонятное.
Делай все как принято в ООП:
PowerUnit, есть метод посчитать вклад в энергетический баланс (аргумент: днем или ночью), который переопределен во всех потомках
Дом, есть свойство — число квартир
Солнечная панель, свойство — мощность
и так далее.
Не знаю, там наверно панелька или что-то такое есть для управления серевером и для отключения.
>>378409
> this.checkType(this.size);
Это лучше делать сразу в конструкторе. Иначе если getCost не вызвывать то ошибка не обнаружится.
> if (this.extended[m] == this.extended[m - 1]) {
А это там, где добавляется добавка
А так, в остальном норм.
>>378413
Стектрейс — это список функций, внутри которых произошла ошибка. Показывается не только та функция, где она произошла, но и последовательность функций, из кторых она вызвана. Это помогает найти причины ошибки.
Соответственно, выбрасывая нестандартные исключения ты можешь остаться без стектрейса, что неудобно.
>>378422
> или создать рандомное количество объектов House,
Это конечно. Дома же разные бывают. Для каждого дома — свой объект.
> Что будет быстрее и производительнее?
Тут надо сделать правильнее, а не производительнее
> Что лучше:
Передавать число квартир в конструктор. С чего это дом должен сам генерировать число квартир в нем? То же отсноистя и к остальным случайным числам.
setPower надо вообще выпилить, это что-то непонятное.
Делай все как принято в ООП:
PowerUnit, есть метод посчитать вклад в энергетический баланс (аргумент: днем или ночью), который переопределен во всех потомках
Дом, есть свойство — число квартир
Солнечная панель, свойство — мощность
и так далее.
У тебя в switch если ни один из вариантов не сработает происходит выход из функции без return
> if (!(typeof(type) in DefaultTypes)) {
Этот if надо перевернуть:
if (.. in defaultTypes) {
return ...;
}
> if (typeof(type) === 'object' && type.length)
Это неправильно, надо еще проверять что в length неотрицательное число и что есть свойства 0 ... length -1
>>378448
У тебя вообще почему-то слово klass добавляется: http://jsbin.com/kafiweyavoza/1/edit
Удалять класс удобнее регулярным выражением либо replace(). Учти, что класс может быть в нескольких экземплярах — тогда надо удалить все.
> removeClass не работает. Почему?
Потому что
> node.className.split(' ', classes1);
Второй аргумент зачем?
У тебя в switch если ни один из вариантов не сработает происходит выход из функции без return
> if (!(typeof(type) in DefaultTypes)) {
Этот if надо перевернуть:
if (.. in defaultTypes) {
return ...;
}
> if (typeof(type) === 'object' && type.length)
Это неправильно, надо еще проверять что в length неотрицательное число и что есть свойства 0 ... length -1
>>378448
У тебя вообще почему-то слово klass добавляется: http://jsbin.com/kafiweyavoza/1/edit
Удалять класс удобнее регулярным выражением либо replace(). Учти, что класс может быть в нескольких экземплярах — тогда надо удалить все.
> removeClass не работает. Почему?
Потому что
> node.className.split(' ', classes1);
Второй аргумент зачем?
http://jsbin.com/kafiweyavoza/3/edit?js,console
Чем удобнее? Мне с регулярками вот совсем не удобно работать. Да и забываться начали.
Кстати как-то через json еще делают. Но я не вникал пока что.
Немного не то, что я хотел.
Норм. Я тупо сравнение для трех зделол после запила функции, а ты запилил для n-го кол-ва.
http://jsbin.com/kafiweyavoza/5/edit?js,console
Ну вот.
На jquery более сложная функция: http://jsbin.com/mapute/3/edit?js,console
PowerUnit - это PowerGrid по моему, да?
От isDay зависят не все классы.
>То же отсноистя и к остальным случайным числам.
Как тогда? Есть диапазон, и мощность колеблется в его рамках. Или я должен диапазоны всех классов держать в голове? А может выбрасывать исключения, которые указывают на максимальное значение?
>который переопределен во всех потомках
http://jsbin.com/hekole/14/edit?js,console
Значит нужен миксин? А пока свойства не копируются.
http://ideone.com/lbr6yq
Нужна помощь с задачей про коше мышек, вообще не могу представить какие у кого должны быть свойство и как вообще все это дело писать. Непонимать абсолютно.
class Field
public $x = N;
public $y = N;
abstract class Animal
public $name;
public $x;
public $y;
class Cat extends Animal
class Mouse extends Animal
Решать дополнительные задания, смотри сколько их у нас:
— на работу с датами: https://gist.github.com/codedokode/10539805
— по основам JS/DOM: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
— сделать игру на JS: https://gist.github.com/codedokode/9933897
— по основам MySQL: https://gist.github.com/codedokode/10539213
— задача сделать клон rghost на фреймворке: https://gist.github.com/codedokode/9424217 (требуется знание MySQL, основ HTML/CSS)
— задача сделать борду, верстка уже сделана: https://github.com/codedokode/board-markup
В принципе, можно например изучить основы MySQL и переходить к файлообменнику — это хорошая задача, которая позволяет прокачать знания в разных областях и познакомиться с фреймворками.
У тебя вообще как с HTML/CSS? Изучал? не изучал? У меня в учебнике вроде есть 10 простых заданий на CSS.
Ну и стоило бы решения задач показать, может у тебя там ошибки есть? По ООП по крайней мере, это важная тема.
Я сейчас посмотрел, checkType не защищает от того например что мы поменяем местами size и filling или попробуем добавить в качестве добавки Hamburger.TYPE_SMALL. Надо бы это исправить.
Ну и это:
> if (arguments == arguments[i - 1])
ненадежная проверка. Надо сделать по-другому:
if (arrayContains(this.extended, arguments)) {
throw...
}
>>378498
Хорошо, что ты догадался использовать массив для банков. Так действительно удобнее. Считает программа правильно.
В строках 27-31 функция расползлась. Если вызов функции не помещяется в строчку, аргументы можно писать вертикально с отступом, как тут: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#46-method-and-function-calls
Настрой IDE чтобы при нажатии Tab вставлялось 4 пробела, а не таб (такая настройка есть в любом нормальном редакторе, кроме блокнота). А то твой код будет разваливаться и разъезжаться в разных редакторах.
> payment = $debtAmount < $monthlyPayment ? $debtAmount : $monthlyPayment;
Используй min(). И обычно при переносе строк знак остается на первой строке:
$x = $y ?
$z :
$w;
А тут вообще все можно было в 1 строчку записать.
Я сейчас посмотрел, checkType не защищает от того например что мы поменяем местами size и filling или попробуем добавить в качестве добавки Hamburger.TYPE_SMALL. Надо бы это исправить.
Ну и это:
> if (arguments == arguments[i - 1])
ненадежная проверка. Надо сделать по-другому:
if (arrayContains(this.extended, arguments)) {
throw...
}
>>378498
Хорошо, что ты догадался использовать массив для банков. Так действительно удобнее. Считает программа правильно.
В строках 27-31 функция расползлась. Если вызов функции не помещяется в строчку, аргументы можно писать вертикально с отступом, как тут: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#46-method-and-function-calls
Настрой IDE чтобы при нажатии Tab вставлялось 4 пробела, а не таб (такая настройка есть в любом нормальном редакторе, кроме блокнота). А то твой код будет разваливаться и разъезжаться в разных редакторах.
> payment = $debtAmount < $monthlyPayment ? $debtAmount : $monthlyPayment;
Используй min(). И обычно при переносе строк знак остается на первой строке:
$x = $y ?
$z :
$w;
А тут вообще все можно было в 1 строчку записать.
О, теперь более-менее нормально.
> if (!node.className && !hasClass(node, klass)) {
Вторая проверка hasClass зачем?
http://jsbin.com/rucarugafuce/1/edit — не добавляется класс add
Имена CSS классов чувствительны к регистру (вопрос на SO: http://stackoverflow.com/a/12533957 ). Использовать флаг i для регулярки нельзя.
> node.className = '';
> node.className += newClasses.trim();
Зачем += ? Почему нельзя сразу записать newClasses в className?
Ну и функция String.prototype.trim() появлилась только в ES5, то есть в IE8 ее нет, так что напиши пожалуйста и ее заменитель. Тебе наверно эта задача уже поднадоела, но я думаю, что исправив эти замечания, с ней можно будет закончить.
> На jquery более сложная функция
О, это очень хорошо что ты исходники jQuery читаешь. Продолжай их дальше читать.
Только у тебя по моему какой-то старый код. Новый на гитхабе: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js#L55
Там чуть сложнее из-за того, что можно передать несколько классов сразу через пробел, а также передавать функцию (которая позволяет заменять классы, как ты наверно догадался).
Также, объект jQuery содержит коллекцию DOM элементов и может удалять классы у них всех сразу, что видно из этого:
> for ( i = 0, l = this.length; i < l; i++ ) {
> elem = this[ i ];
this — это ссылка на объект jQuery, который в ключах 0, 1, ... length - 1 хранит дом-элементы (то есть объект jQuery напоминает псевдомассив, если ты разберешь функцию его создания, то увидишь). Соответственно, в цикле мы удаляем классы у всех хранящихся в нем элементов.
И вместо регулярок там используется обычное удаление подстроки — возможно, ради оптимизации (так как генерация регулярного выражения занимает какое-то время, пусть и маленькое). Но видишь, там приходится использовать while так как если ты передаешь в replace строку вместо регулярки, то она заменяется только первый раз (из-за отсутствия флага g, который в JS сделан очень неудачно на мой взгляд, так как его все время забываешь поставить). И приходится заменять прбельные символы (табы, переводы строк) на пробелы этим выражением:
replace( rclass, " " )
чтобы поиск по строке работал.
Заметь также, вот это место:
> if ( elem.className !== finalValue ) {
> elem.className = finalValue;
Мы не записываем назад строку если она не поменялась — чтобы не запустить пересчет css-значений и перерисовку и вообще, чтобы поменьше обращаться к DOM. Я правда это не тестировал, но тоже слышал, что какие-то браузеры могут запустить пересчет css значений или перерисовку при записи в DOM.
О, теперь более-менее нормально.
> if (!node.className && !hasClass(node, klass)) {
Вторая проверка hasClass зачем?
http://jsbin.com/rucarugafuce/1/edit — не добавляется класс add
Имена CSS классов чувствительны к регистру (вопрос на SO: http://stackoverflow.com/a/12533957 ). Использовать флаг i для регулярки нельзя.
> node.className = '';
> node.className += newClasses.trim();
Зачем += ? Почему нельзя сразу записать newClasses в className?
Ну и функция String.prototype.trim() появлилась только в ES5, то есть в IE8 ее нет, так что напиши пожалуйста и ее заменитель. Тебе наверно эта задача уже поднадоела, но я думаю, что исправив эти замечания, с ней можно будет закончить.
> На jquery более сложная функция
О, это очень хорошо что ты исходники jQuery читаешь. Продолжай их дальше читать.
Только у тебя по моему какой-то старый код. Новый на гитхабе: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js#L55
Там чуть сложнее из-за того, что можно передать несколько классов сразу через пробел, а также передавать функцию (которая позволяет заменять классы, как ты наверно догадался).
Также, объект jQuery содержит коллекцию DOM элементов и может удалять классы у них всех сразу, что видно из этого:
> for ( i = 0, l = this.length; i < l; i++ ) {
> elem = this[ i ];
this — это ссылка на объект jQuery, который в ключах 0, 1, ... length - 1 хранит дом-элементы (то есть объект jQuery напоминает псевдомассив, если ты разберешь функцию его создания, то увидишь). Соответственно, в цикле мы удаляем классы у всех хранящихся в нем элементов.
И вместо регулярок там используется обычное удаление подстроки — возможно, ради оптимизации (так как генерация регулярного выражения занимает какое-то время, пусть и маленькое). Но видишь, там приходится использовать while так как если ты передаешь в replace строку вместо регулярки, то она заменяется только первый раз (из-за отсутствия флага g, который в JS сделан очень неудачно на мой взгляд, так как его все время забываешь поставить). И приходится заменять прбельные символы (табы, переводы строк) на пробелы этим выражением:
replace( rclass, " " )
чтобы поиск по строке работал.
Заметь также, вот это место:
> if ( elem.className !== finalValue ) {
> elem.className = finalValue;
Мы не записываем назад строку если она не поменялась — чтобы не запустить пересчет css-значений и перерисовку и вообще, чтобы поменьше обращаться к DOM. Я правда это не тестировал, но тоже слышал, что какие-то браузеры могут запустить пересчет css значений или перерисовку при записи в DOM.
Я пришел к выводу, что 1.8.2 самый оптимальный, т.к. на другие IE у меня по-крайней мере начинает ругаться.
Ну так ты сам написал:
> default:
> return 'undefined';
Вот он и возвращает 'undefined'
Посмотри, что дает toString.call() для дом-объекта и исправляй логику. Она у тебя неправильная.
>>378511
> От isDay зависят не все классы.
Ну и что? Это не запрещает нам передавать его как аргумент в расчет баланса.
> Есть диапазон, и мощность колеблется в его рамках.
Не, ты не так понял (или я плохо объяснил), мощность панели каждый день постоянна, просто бывают панели разных мощностей.
> Значит нужен миксин?
Не нужен.
> А пока свойства не копируются.
А почему ты конструктор предка не вызываешь из конструктора потомка? Сам себя он не вызовет. Это ты наследование неправильно реализуешь.
> var structure = {
Думаю логичнее использовать массив, так как однотипных элементов сети может быть несколько, например несколько электростанций или домов.
>>378536
> вообще не могу представить какие у кого должны быть свойство и как вообще все это дело писать.
Очевидно, что у мышек и кошек есть много общего - их можно поместить на карту и двигать по ней. Логично сделать их наследниками общего класса Животное (или Юнит или Персонаж).
Свойства животных — координаты, у кошек добавляется сонливость. Должны быть методы перемещения по карте, у кошки еще метод «съесть мышку». Должен быть метод «сделать ход», который будет вызваться каждый ход.
Свойство карты — это массив находящихся на ней животных. Должны быть методы добавления и удаления с карты.
Ну и еще можно сделать объект Игра, который создает карту, животных, помещает их на нее, и считает ходы, в общем руководит процессом.
То, что у тебя написано, подойдет как основа.
По ООО вектор:
> $chief->isChief = true;
Такие вещи лучше делать через методы. В задачке про кошек сделай именно через методы. Иначе код получается сильно связанным: значение свойства можно поменять из любого места программы, а не только из самого класса.
> public function setChief(Employee $chief)
По хорошему, тут надо бы проверять, а нет ли у департамента существующего шефа, если есть то увольнять его, сбросив флаг isChief. Но в этой задаче шефов не меняют, потому я могу на это закрыть глаза.
Ну и проверять, а не является ли новый шеф шефом в другом департаменте? Если да, то убирать его оттуда, но опять же, в этой задаче можно обойтись без этого.
> $employeesSalary += $this->chief->getSalary();
Тут надо сначала проверять, а есть ли шеф.
В остальном, все хорошо.
Ну так ты сам написал:
> default:
> return 'undefined';
Вот он и возвращает 'undefined'
Посмотри, что дает toString.call() для дом-объекта и исправляй логику. Она у тебя неправильная.
>>378511
> От isDay зависят не все классы.
Ну и что? Это не запрещает нам передавать его как аргумент в расчет баланса.
> Есть диапазон, и мощность колеблется в его рамках.
Не, ты не так понял (или я плохо объяснил), мощность панели каждый день постоянна, просто бывают панели разных мощностей.
> Значит нужен миксин?
Не нужен.
> А пока свойства не копируются.
А почему ты конструктор предка не вызываешь из конструктора потомка? Сам себя он не вызовет. Это ты наследование неправильно реализуешь.
> var structure = {
Думаю логичнее использовать массив, так как однотипных элементов сети может быть несколько, например несколько электростанций или домов.
>>378536
> вообще не могу представить какие у кого должны быть свойство и как вообще все это дело писать.
Очевидно, что у мышек и кошек есть много общего - их можно поместить на карту и двигать по ней. Логично сделать их наследниками общего класса Животное (или Юнит или Персонаж).
Свойства животных — координаты, у кошек добавляется сонливость. Должны быть методы перемещения по карте, у кошки еще метод «съесть мышку». Должен быть метод «сделать ход», который будет вызваться каждый ход.
Свойство карты — это массив находящихся на ней животных. Должны быть методы добавления и удаления с карты.
Ну и еще можно сделать объект Игра, который создает карту, животных, помещает их на нее, и считает ходы, в общем руководит процессом.
То, что у тебя написано, подойдет как основа.
По ООО вектор:
> $chief->isChief = true;
Такие вещи лучше делать через методы. В задачке про кошек сделай именно через методы. Иначе код получается сильно связанным: значение свойства можно поменять из любого места программы, а не только из самого класса.
> public function setChief(Employee $chief)
По хорошему, тут надо бы проверять, а нет ли у департамента существующего шефа, если есть то увольнять его, сбросив флаг isChief. Но в этой задаче шефов не меняют, потому я могу на это закрыть глаза.
Ну и проверять, а не является ли новый шеф шефом в другом департаменте? Если да, то убирать его оттуда, но опять же, в этой задаче можно обойтись без этого.
> $employeesSalary += $this->chief->getSalary();
Тут надо сначала проверять, а есть ли шеф.
В остальном, все хорошо.
Молодец, что. Вдохнови тогда других анонов, а то некоторые не верят, что в нашем треде можно чему-то научиться.
>>378567
Реально, другие аноны изучали. Насчет книг, 2 хороших, годных книги (Зандстра и Шлосснейгл) указаны в ОП-посте, но чтобы за них взяться, надо сначала изучить основы HTML и PHP по любой другой книге.
Если уровень курсов тебе не понравился, то второй раз наверно не стоит идти.
Ну и в нашем треде ты всегда можешь уточнить, если тебе будет что-то непонятно.
>>378572
Да, в версии 2 перестали поддерживать IE8: http://jquery.com/browser-support/
Версия 1 в отдельной ветке: https://github.com/jquery/jquery/tree/1.x-master — но в ней вроде код тот же самый: https://github.com/jquery/jquery/blob/1.x-master/src/attributes/classes.js#L11
>>378574
> if (node.className.search(new RegExp('(\\s+|^)' + klass + '(\\s+|$)', 'g')) == -1) {
А что не hasClass? Короче бы вышло и читабельнее. И флаг g не нужен тут.
> node.className = '';
> node.className += newClasses.trim();
Зачем тут 2 строки когда можно написать одну?
> return (' ' + node.className + ' ').indexOf(' ' + klass + ' ') > -1;
Тут есть (как ты надеюсь заметил благодаря jQuery) подвох, что классы могут быть разделены другим пробельным символом вроде таба или перевода строки:
class1\tclass2
class1\nclass2
Надо бы их заменять на пробел (можно сделать замену \s+ -> ' ').
Молодец, что. Вдохнови тогда других анонов, а то некоторые не верят, что в нашем треде можно чему-то научиться.
>>378567
Реально, другие аноны изучали. Насчет книг, 2 хороших, годных книги (Зандстра и Шлосснейгл) указаны в ОП-посте, но чтобы за них взяться, надо сначала изучить основы HTML и PHP по любой другой книге.
Если уровень курсов тебе не понравился, то второй раз наверно не стоит идти.
Ну и в нашем треде ты всегда можешь уточнить, если тебе будет что-то непонятно.
>>378572
Да, в версии 2 перестали поддерживать IE8: http://jquery.com/browser-support/
Версия 1 в отдельной ветке: https://github.com/jquery/jquery/tree/1.x-master — но в ней вроде код тот же самый: https://github.com/jquery/jquery/blob/1.x-master/src/attributes/classes.js#L11
>>378574
> if (node.className.search(new RegExp('(\\s+|^)' + klass + '(\\s+|$)', 'g')) == -1) {
А что не hasClass? Короче бы вышло и читабельнее. И флаг g не нужен тут.
> node.className = '';
> node.className += newClasses.trim();
Зачем тут 2 строки когда можно написать одну?
> return (' ' + node.className + ' ').indexOf(' ' + klass + ' ') > -1;
Тут есть (как ты надеюсь заметил благодаря jQuery) подвох, что классы могут быть разделены другим пробельным символом вроде таба или перевода строки:
class1\tclass2
class1\nclass2
Надо бы их заменять на пробел (можно сделать замену \s+ -> ' ').
Глянь еще эту строчку в jQUery: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js#L154
Буду пытаться учиться с вами, господа. Сейчас вспоминаю HTML\CSS, а то как-то было не до этого.
Было сильное желание заработать денег, т.к. жил в нищите. Случайно наткнулся на этот тред. Загорелся, решил научиться. Это было где-то в феврале 2013 года, точно не помню. Думал быстро научусь за пару месяцев, хотел все и сразу. Первые задачи сам делал, в тред не выкладывал, т.к. быстро решались и был уверен в правильности.
Старые решенные задачи еще даже сохранились. Сейчас смешно смотреть на тот стиль написания.
Ну и пошло-поехало, делал одну задачу за другой. Сумма прописью мне трудно далась, бросал на недели даже. А сдача про банкомат так вообще был ад какой-то, месяц или больше (или 3 месяца?) я с ней возился лол (ОП наверное помнит). А после нее все пошло как по маслу, может благодаря ей я и разобрался во всех нюансах.
Во всех задачах ОПа самая решающая задача и поворотная - наверное про сдачу, где очень хорошо нарабатывается опыт.
Попутно с мая этого года я искал работу, побывал во всех студиях мухосранска, ждал заказы на фрилансе. И вот в начале июля мне позвонили и сказали подойти на собеседование. Спросили, что знаю и умею, а я ответил, CSS и HTML, а PHP и JS в процессе изучения. Ну меня и взяли. Теперь у меня собственное рабочее место, отличный коллектив, и рутинная работа лол.
Кстати мотивация такая сильная появилась довольно недавно, где-то с мая как раз, когда начались поиски. Сейчас мое просиживание за компом заключается в постоянном решении задач ОПа. Если выходной, то я с большой вероятностью просижу и прорешаю весь день какие-нибудь ОПовские задачи. Сейчас это как мания какая-то, мне это интересно. С работы прихожу и сразу сажусь на свое удобное место и решаю, решаю и решаю задачи ОПа постоянно допоздна, а потом просыпаю работу лол.
Такие дела, анончики.
Лол, а у меня с банкоматом и прописью довольно легко вышло, буквально за день решил, а вот с кругом и считалочкой было сложнее, и я уже неделю застрял на задаче с поиском пути.
А там усложненная версия есть, где добавлены купюры по 200 и 2000, вряд ли ты ее за день решишь.
Ничего не давали и теорию не спрашивали. З/п 20к сейчас, что для меня большие деньги лол по сравнению с былыми временами, когда жил на 100р в день. Через год думаю устраиваться в более крупную компанию на более крупную з/п, но уже с опытом.
>>378613
21лвл. В 30 легко устроиться также, нет разницы.
Чем конкретно на работе занимаешься? Какие задачи тебе ставят?
Первые дни как вникал в проект? Сидел сам разбирался?
Joomla, Webasyst, MODX, Wordpress, самописные движки. Верстаю сайты, запиливаю интернет магазины для местных барыг, иногда не только местных. Разбираюсь с джумлой, простые модули вроде получается писать. Мелкие задачи с js: кнопка вверх, плавная прокрутка, открывашка картинок и т.д. Разные задачи, хотя многое мне еще не доверяют, особенно касаемо php.
http://learn.javascript.ru/strict-mode
http://habrahabr.ru/post/118666/
Как это организовать?
Что-то вроде Hamburger.price.size[Hamburger.TYPE_SMALL], но так не работает.
Что организовать? Проверку что размер правильный? Можно сделать массив возможных размеров:
Hamburger.sizes = [Hamburger.SIZE_SMALL, ...];
И проверять что size в нем есть. Можно еще как-то.
какой-то хуй сказал что надо использовать стрикт и все понеслись? сила интерпретатора в том чтобы не маяться хуйней с проверкой типов
Оп, я твое задание невнимательно прочитал и создал такое вот поле. Интересно можно ли сократить код как-нибудь?
> Интересно можно ли сократить код как-нибудь?
Конечно, можно. Надо цвет ячейки задавать в том же цикле, где и создается таблица. Вычислить его нетрудно зная i и n
Цвет ячейки гораздо умнее задавать с помощью класса.
Алсо, где реакция на нажатие?
>>378657
> else if (typeof(type) === 'object' && type.length >= 0 && type[0]) {
Надо бы сделать нормальную проверку. type[0] не годится так как если там хранится false то это не сработает.
Надо проверять что length неотрицательное число и что есть свойства от 0 до length -1.
То, что в default, лучше вынести за switch, а default убрать — тогда отступов будет меньше. А то как-то многовато кода внутри switch
>>378650
> node.className = (node.className).replace(/\s+/g, ' ');
Вот это плохо. Лучше сохранять это в новую переменную, так как запись в className может вызвать пересчет css-свойств (reflow) и перерисовку (repaint), а функция проверки наличия класса не должна вызвать таких эффектов.
Пруф: открой инспектор в Хроме прямо на этой странице, там введи код:
function upd() { document.body.className += ' '; }
Затем перейди на вкладку Timeline и нажми запись (кружочек внизу), и выполни в консоли upd(). затем останови запись — там будет recalculate styles и layout. То есть при добавлении пробела к className происходит пересчет стилей, довольно тяжелый, так как страница большая (у меня 127 ms вышло).
Более того, пересчет стилей запускается даже если сделать
document.body.className += '';
то есть просто записать в className старое значение. Так-то!
> Интересно можно ли сократить код как-нибудь?
Конечно, можно. Надо цвет ячейки задавать в том же цикле, где и создается таблица. Вычислить его нетрудно зная i и n
Цвет ячейки гораздо умнее задавать с помощью класса.
Алсо, где реакция на нажатие?
>>378657
> else if (typeof(type) === 'object' && type.length >= 0 && type[0]) {
Надо бы сделать нормальную проверку. type[0] не годится так как если там хранится false то это не сработает.
Надо проверять что length неотрицательное число и что есть свойства от 0 до length -1.
То, что в default, лучше вынести за switch, а default убрать — тогда отступов будет меньше. А то как-то многовато кода внутри switch
>>378650
> node.className = (node.className).replace(/\s+/g, ' ');
Вот это плохо. Лучше сохранять это в новую переменную, так как запись в className может вызвать пересчет css-свойств (reflow) и перерисовку (repaint), а функция проверки наличия класса не должна вызвать таких эффектов.
Пруф: открой инспектор в Хроме прямо на этой странице, там введи код:
function upd() { document.body.className += ' '; }
Затем перейди на вкладку Timeline и нажми запись (кружочек внизу), и выполни в консоли upd(). затем останови запись — там будет recalculate styles и layout. То есть при добавлении пробела к className происходит пересчет стилей, довольно тяжелый, так как страница большая (у меня 127 ms вышло).
Более того, пересчет стилей запускается даже если сделать
document.body.className += '';
то есть просто записать в className старое значение. Так-то!
> newCell.style.borderWidth = '1px';
Это надо делать через css. Я бы еще border-collapse добавил.
> Не работает.
Посмотри отладчиком или сдампь что там в переменной e (точнее e.target) приходит.
Алсо, не вешай события через onclick (почему? потому что так ты затираешь предыдущий обработчик), onclick используется только в html-коде, а тут надо использовать addEventListener/attachEvent.
http://jsbin.com/datan/11/edit?js,console
Работает! Только я кажется лишнего нагородил, наверное нужно оптимизировать как-то.
Оп, а мои функции addClass, removeClass, hasClass уже можно применять открыто вместо jQuery'вских, или еще можно как-то оптимизировать, сделать совершенней?
А то получилась бы моя библиотека по работе с классами.
А можно сделать, чтобы при зажатой клавише мышки окрашивались квадратики на которых падает указатель? Можно было бы создать холст для рисования с маленькими ячейками. А также чтобы количество ячеек увеличивалось по размерам окна и уменьшалось соответственно. Подобие canvas получится.
> Оп, а мои функции addClass, removeClass, hasClass уже можно применять открыто
Можно, только положи их в объект например dom (или любой другой) чтобы глобальные переменные не засорять:
var dom = {};
dom.addClass = function () ...
>>378821
> А можно сделать, чтобы при зажатой клавише мышки окрашивались квадратики на которых падает указатель?
Конечно, можно. Вместо click надо обрабатывать mousedown, mousemove и mouseup. Причем обрабатывать аккуратно: пока ты движешься по клеточке, mousemove может придти несколько раз, но перкрашивать ее надо один раз.
>>378818
> <a id="changeColor">
В задании требуется сделать кнопку, а для кнопок есть button type="button". Ссылка — это то, что куда-то ведет и есть href.
> if (document.addEventListener) {
Хорошая новость: attachEvent нужен только в ИЕ8 и ниже, так что скоро он перестанет быть нужен вообще.
> removeClass(target, 'white');
> addClass(target, 'black');
Достаточно только класса black вообще-то
> target.className == 'white')
Ненадежно, надо использовать hasClass а то если мы добавим еще какие-то классы, все сломается
Смену цветов при нажатии кнопки надо сделать без циклов. Подсказка: попробуй просто добавлять/убирать класс на самой таблице.
Кстати, сделай-ка еще функцию toggleClass которая либо убирает (если он уже есть) либо добавляет класс — она тут пригодится.
> Оп, а мои функции addClass, removeClass, hasClass уже можно применять открыто
Можно, только положи их в объект например dom (или любой другой) чтобы глобальные переменные не засорять:
var dom = {};
dom.addClass = function () ...
>>378821
> А можно сделать, чтобы при зажатой клавише мышки окрашивались квадратики на которых падает указатель?
Конечно, можно. Вместо click надо обрабатывать mousedown, mousemove и mouseup. Причем обрабатывать аккуратно: пока ты движешься по клеточке, mousemove может придти несколько раз, но перкрашивать ее надо один раз.
>>378818
> <a id="changeColor">
В задании требуется сделать кнопку, а для кнопок есть button type="button". Ссылка — это то, что куда-то ведет и есть href.
> if (document.addEventListener) {
Хорошая новость: attachEvent нужен только в ИЕ8 и ниже, так что скоро он перестанет быть нужен вообще.
> removeClass(target, 'white');
> addClass(target, 'black');
Достаточно только класса black вообще-то
> target.className == 'white')
Ненадежно, надо использовать hasClass а то если мы добавим еще какие-то классы, все сломается
Смену цветов при нажатии кнопки надо сделать без циклов. Подсказка: попробуй просто добавлять/убирать класс на самой таблице.
Кстати, сделай-ка еще функцию toggleClass которая либо убирает (если он уже есть) либо добавляет класс — она тут пригодится.
Вот как мне записать в $pathDone весь проделанный путь? В промежуточных циклах функция вызывает саму себя и ничего не возвращает, как из неё извлечь данные? Переменные, которые я там создам все равно будут локальными.
Такого больше нет в пхп. Только массив всех переменных $GLOBALS, но он мне не подходит, по понятным причинам.
Как это нет?
Есть желание пополам с необходимостью уехать из своих пердей с безработицей и нищетой в происках лучшей жизни. Судя по вакансиям, от начинающих макак требуют вообще знание пыхи+js+html+css. Хочу учить все это чтобы иметь больше шансов трудоустроиться на новом месте года через два-три.
Такой вот хитрый план. Ну, что скажешь?
Нормально. Такой же план.
Там в макете есть шрифты, которых я не нашел(google.com/fonts, typekit.com, webfont.ru/). Я заменил Lucida Sans на Roboto, Segoe WP на OpenSans. А Lao UI - я так понимаю встроенный?
Как там делать картинки в топ-меню? Псевдоклассами? Спрайтщм можно? Или лучше по отдельности?
Там у мобильной версии у верхний части есть тенюшка. Лучше в один блок засунуть left-column и top-menu? Чтобы тень норм была. А то когда по отдельности видно разделение.
Правильно ли я делаю когда пишу в body font-size: 100% или лучше в px? И как сделать так, чтобы по уменьшению размера экрана уменьшался шрифт, И нужно ли вообще так делать, Или размер шрифта должен быть неизменным?
Так, все оказалось ещё хуже, чем я думал. Я попробовал вбить маршрут с василеостровской до петроградской, чтобы не было зацикливания (так как соединяющие их точки -первые элементы соответствующих массивов) и она все равно не работает. Так что дело не только в зацикливании пути, но видимо функция еще и не вызывает саму себя больше одного раза, то-ли просто не может вытащить значение из вложенных функций в самую первую.
http://jsbin.com/datan/17/edit?js,console
Все-таки класс .white может нужен? Что-то не выходит.
>свойства от 0 до length -1
Я вот честно не знаю как это проверить. Разве что type[type.length - 1];
Я думаю да. На jQuery будет тоже самое только написанное все за тебя.
> if(!('className' in node)){
Для чего эта проверка?
Удаление классов нормально не работает: http://jsfiddle.net/j4p618cc/
> node.className.split(' ').indexOf(klass) > -1;
Тут пара моментов:
1) классы могут быть разделены не только пробелом, но и табом \t или переводом строки \n. Это редко, но бывает.
2) indexOf для массива появилась только в версии ES5 (то есть в новых браузерах, а мы пишем в этой задачке кроссбраузерные функции). Раз ты ее используешь, то напиши вместо этого метода свою функцию.
>>378878
Ох, тебе надо было номера разложить в 2 массива — правильные и неправильные, чтобы программа сама себя бы проверяла. А так, приходится глазами всматриваться в них и сравнивать.
Но ты правильно решил сделать список. Только его надо чуть улучшить.
Задачу надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
К этому списку добавь еще свои номера и проверь. Я чувствую, там некоторые варианты не пройдут проверку.
Еще, по моему тут слишком сложно:
> (\s?-?\s?[(]?\s?\d\s?[)]?\s?-?\s?)
Вместо того чтобы подбирать комбинации символов, проще использовать вариант «любое число скобок, пробелов, минусов».
> if(!('className' in node)){
Для чего эта проверка?
Удаление классов нормально не работает: http://jsfiddle.net/j4p618cc/
> node.className.split(' ').indexOf(klass) > -1;
Тут пара моментов:
1) классы могут быть разделены не только пробелом, но и табом \t или переводом строки \n. Это редко, но бывает.
2) indexOf для массива появилась только в версии ES5 (то есть в новых браузерах, а мы пишем в этой задачке кроссбраузерные функции). Раз ты ее используешь, то напиши вместо этого метода свою функцию.
>>378878
Ох, тебе надо было номера разложить в 2 массива — правильные и неправильные, чтобы программа сама себя бы проверяла. А так, приходится глазами всматриваться в них и сравнивать.
Но ты правильно решил сделать список. Только его надо чуть улучшить.
Задачу надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный.
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 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' // нет +
);
К этому списку добавь еще свои номера и проверь. Я чувствую, там некоторые варианты не пройдут проверку.
Еще, по моему тут слишком сложно:
> (\s?-?\s?[(]?\s?\d\s?[)]?\s?-?\s?)
Вместо того чтобы подбирать комбинации символов, проще использовать вариант «любое число скобок, пробелов, минусов».
> Вот как мне записать в $pathDone весь проделанный путь?
Перед тем как вызывать себя рекурсивно, копируешь $pathDone в новый массив и добавляешь туда точку, в которую идешь. Так, при каждом вызове функции будет добавляться по точке и в итоге в последний вызов функции придет полный путь.
А ты вместо этого делаешь что-то странное:
> $container=oneStep($paths, $paths[$point][$key1], $paths[$point][$key1]['time'], $key1, $target);
Не очень понятно зачем ты передаешь $paths[$point][$key1] в качестве $pathDone — там же должен идти массив пройденных точек, а не это.
> В промежуточных циклах функция вызывает саму себя и ничего не возвращает, как из неё извлечь данные?
Передаешь в функцию через аргументы, возвращаешь через return. Этого достаточно. Если надо вернуть несколько значений — возвращай массив.
Ну и может тебе стоит еще почитать про другие алгоритмы? Там может оказаться что-то попроще: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
>>378889
Не смотрел — не советуй.
>>378891
Не надо искать костыли когда можно сделать нормально.
http://ideone.com/zYW3cL
Я вроде немного продвинулся вперёд, но все равно $pathDone придётся переделывать, как я понял.
Если будешь хорошо стараться, то быстрее чем за «два-три» года выучишь. Смысл имеет так как php/js/html/sql/css — очень востребованный набор. Посмотри hh.ru b проверь сам.
В нашем треде кстати есть задачки на все эти технологии.
>>378902
Что-то я потерял макет. Ты можешь его куда-нибудь закачать?
> Там в макете есть шрифты, которых я не нашел
Ну если нет таких, то замени на похожие по внешнему виду и стилю.
Вот список web safe шрифтов, то есть которые скорее всего установлены:
http://sawarogu.3neko.ru/articles/spisok-bezorasnykh-shriftov-web-safe-fonts/
> Я заменил Lucida Sans на Roboto,
Lucida Sans поставляется вместе с Windows и маком если я не путаю. Только она там называется Lucida Sans Unicode (на маке — Lucida Grande). Если я не путаю ее с другим шрифтом.
> Segoe WP на OpenSans
Segoe UI — входит в Windows начиная с висты. По поводу WP в вики написано:
> Segoe WP is the Windows Phone 7 specific version of Segoe. The Segoe WP family is distributed with Microsoft Visual Studio 2010.
Версия доработанная в честь выхода Windows Phone. Думаю, можно заменить на Segoe UI с фоллбеком на OpenSans (хотя я не уверен, что у них размеры и пропорции букв совпадают).
> А Lao UI - я так понимаю встроенный?
Вряд ли, это как раз какой-то нестандартный.
> Как там делать картинки в топ-меню? Псевдоклассами? Спрайтщм можно? Или лучше по отдельности?
Если это иконки то да, спрайтами и псевдоэлементы after/before можно использовать, они вроде даже в IE8 работают.
> Лучше в один блок засунуть left-column и top-menu? Чтобы тень норм была. А то когда по отдельности видно разделение.
Видимо, да.
> Правильно ли я делаю когда пишу в body font-size: 100% или лучше в px?
100% от чего? Нет смысла это писать. лучше наверно в px.
> И как сделать так, чтобы по уменьшению размера экрана уменьшался шрифт,
Не надо. По идее в CSS есть например миллиметры и сантиметры (а в CSS3 и проценты от ширины окна), но ты ведь должен не только размер шрифта менять, но и всех элементов, картинок, а это очень заморочно. Плюс, как-то сделать чтобы шрифт не стал нечитаемым. Потому лучше использовать пиксели и неизменный шрифт размером как на макете.
Если будешь хорошо стараться, то быстрее чем за «два-три» года выучишь. Смысл имеет так как php/js/html/sql/css — очень востребованный набор. Посмотри hh.ru b проверь сам.
В нашем треде кстати есть задачки на все эти технологии.
>>378902
Что-то я потерял макет. Ты можешь его куда-нибудь закачать?
> Там в макете есть шрифты, которых я не нашел
Ну если нет таких, то замени на похожие по внешнему виду и стилю.
Вот список web safe шрифтов, то есть которые скорее всего установлены:
http://sawarogu.3neko.ru/articles/spisok-bezorasnykh-shriftov-web-safe-fonts/
> Я заменил Lucida Sans на Roboto,
Lucida Sans поставляется вместе с Windows и маком если я не путаю. Только она там называется Lucida Sans Unicode (на маке — Lucida Grande). Если я не путаю ее с другим шрифтом.
> Segoe WP на OpenSans
Segoe UI — входит в Windows начиная с висты. По поводу WP в вики написано:
> Segoe WP is the Windows Phone 7 specific version of Segoe. The Segoe WP family is distributed with Microsoft Visual Studio 2010.
Версия доработанная в честь выхода Windows Phone. Думаю, можно заменить на Segoe UI с фоллбеком на OpenSans (хотя я не уверен, что у них размеры и пропорции букв совпадают).
> А Lao UI - я так понимаю встроенный?
Вряд ли, это как раз какой-то нестандартный.
> Как там делать картинки в топ-меню? Псевдоклассами? Спрайтщм можно? Или лучше по отдельности?
Если это иконки то да, спрайтами и псевдоэлементы after/before можно использовать, они вроде даже в IE8 работают.
> Лучше в один блок засунуть left-column и top-menu? Чтобы тень норм была. А то когда по отдельности видно разделение.
Видимо, да.
> Правильно ли я делаю когда пишу в body font-size: 100% или лучше в px?
100% от чего? Нет смысла это писать. лучше наверно в px.
> И как сделать так, чтобы по уменьшению размера экрана уменьшался шрифт,
Не надо. По идее в CSS есть например миллиметры и сантиметры (а в CSS3 и проценты от ширины окна), но ты ведь должен не только размер шрифта менять, но и всех элементов, картинок, а это очень заморочно. Плюс, как-то сделать чтобы шрифт не стал нечитаемым. Потому лучше использовать пиксели и неизменный шрифт размером как на макете.
Макет раз - http://rghost.ru/57518135 (компьютер)
Макет два - http://rghost.ru/57518184(мобильник)
А зачем там столько разновидностей Sans-serif шрифтов? Там макет так и сделан? Просто как-то странно когда используется много шрифтов похожего начертания, так обычно не делают так как должен быть контраст между разными шрифтами.
Алсо,
> @media screen and (max-width: 640px) {
> @media screen and (min-width: 1024px) {
А что если ширина окна 900 пикселей? Так не делают. Делают просто верстку для всех, а потом дополнения для маленьких экранов (или наоборот для огромных).
Алсо, что это за упоротые цифры:
> width: 49.01960784313725%;
> width: 78.46153%;
> 2.411764705882353em;
Это ненадежно, так как ты не знаешь с какой точностью работает браузер и как округляет числа. Не рассчитывай что выйдет ровно столько сколько ты написал, может получиться на 1-2 пикселя больше или меньше.
>>378903
Попробуй сделать чтобы она выводила точки которые обрабатываются, чтобы было наглядно видно что вызвается и что передается в функцию. Слишком много только не выводи, а то на ideone если лимит на объем вывода.
>>378908
Не нужен. Белая клетка — та, у которой нет класса black (а когда цвета перевернуты то наоборот). Этого вполне достаточно.
> Что-то не выходит.
Попробуй что-нибудь поменять.
> <input ... />
В HTML слеш в конце не ставится, он ставится в XML и XHTML. Полная история: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/
> newCell.width = '28px';
Это надо делать через CSS а не JS.
> return false;
Зачем?
> border-spacing: 0;
Чтобы не было жирных линий, используй border-collapse
А зачем там столько разновидностей Sans-serif шрифтов? Там макет так и сделан? Просто как-то странно когда используется много шрифтов похожего начертания, так обычно не делают так как должен быть контраст между разными шрифтами.
Алсо,
> @media screen and (max-width: 640px) {
> @media screen and (min-width: 1024px) {
А что если ширина окна 900 пикселей? Так не делают. Делают просто верстку для всех, а потом дополнения для маленьких экранов (или наоборот для огромных).
Алсо, что это за упоротые цифры:
> width: 49.01960784313725%;
> width: 78.46153%;
> 2.411764705882353em;
Это ненадежно, так как ты не знаешь с какой точностью работает браузер и как округляет числа. Не рассчитывай что выйдет ровно столько сколько ты написал, может получиться на 1-2 пикселя больше или меньше.
>>378903
Попробуй сделать чтобы она выводила точки которые обрабатываются, чтобы было наглядно видно что вызвается и что передается в функцию. Слишком много только не выводи, а то на ideone если лимит на объем вывода.
>>378908
Не нужен. Белая клетка — та, у которой нет класса black (а когда цвета перевернуты то наоборот). Этого вполне достаточно.
> Что-то не выходит.
Попробуй что-нибудь поменять.
> <input ... />
В HTML слеш в конце не ставится, он ставится в XML и XHTML. Полная история: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/
> newCell.width = '28px';
Это надо делать через CSS а не JS.
> return false;
Зачем?
> border-spacing: 0;
Чтобы не было жирных линий, используй border-collapse
>что это за упоротые цифры
Лол, ну я прочитал книгу Итана Маркота "Отзывчивый веб-дизайн", ну и там прямо так и делалось. А как тогда?
Так как делать ширину? В % или px? А шрифты в em или в px? Сначала сделать общий css, потом для каких экранов доделывать?
if(in_array("$key", $pathDone)){
continue;
}
страница показывает NULL?
Циклом
>>378930
> SIZE_SMALL = 'МАЛЕНЬКИЙ';
Ой, вот так делать не стоит, название лучше записать в Hamburger.type. Не надо в константах хранить информацию.
> for (var size in Hamburger.type) {
> if (hamburger == size) {
А зачем здесь цикл? Цикл нужен чтобы сделать много действий подряд.А у нас действие одно — задать размер гамбургера.
> return 'Несуществующий вид гамбургера. Попробуйте снова.';
Используй исключения и throw new Error(). Твой вариант ошибки не сработает если тот, кто вызвал функцию, не проверяет что она возвращает. А вот исключение — сработает.
> (arguments[2] && additive === undefined)
Как это условие может выполниться? additive же и есть аргумент с индексом 2 если считать с нуля. Что это вообще должно делать?
> this.order.additive = Hamburger.additive[typeAdditive];
> this.text += ', Добавка: ' + typeAdditive;
> this.correctAddi = true;
По моему, это неправильный подход. Так не принято делать в ООП. Это не ООП, а непонятно что.
Какие свойства есть у гамбургера?
- размер
- начинка
- список добавок
Все остальное (text, correctHamb, generalPrice) можно вычислить исходя из этих данных с помощью методов. Раз их можно в любой момент вычислить, значит их нет смысла вообще хранить как свойства. Меньше свойств — меньше геморроя по поддержанию их в актуальном состоянии.
Ты немного все переусложнил. Вместо
> this.order.additive
можно написать this.addditive — так и проще и короче.
В общем, предлагаю воспользоваться принципом «не преумножай сущности» и выпилить все свойства, кроме указанных трех.
Функция makeSelection должна только задавать параметры гамбургера (и проверять что они верные).
А если заводить кучу свойств, то ты замучаешься их потом обновлять например при изменении в заказе или удалении добавок.
> return 'Количество калорий: ' + this.generalCal;
Это неудобно. Может я захочу сложить число калорий в нескольких гамбургерах, как это сделать если ты возвращаешь не число, а текст? Возвращай число, а текст дописывай где-нибудь в другом месте, например в отдельной функции.
Циклом
>>378930
> SIZE_SMALL = 'МАЛЕНЬКИЙ';
Ой, вот так делать не стоит, название лучше записать в Hamburger.type. Не надо в константах хранить информацию.
> for (var size in Hamburger.type) {
> if (hamburger == size) {
А зачем здесь цикл? Цикл нужен чтобы сделать много действий подряд.А у нас действие одно — задать размер гамбургера.
> return 'Несуществующий вид гамбургера. Попробуйте снова.';
Используй исключения и throw new Error(). Твой вариант ошибки не сработает если тот, кто вызвал функцию, не проверяет что она возвращает. А вот исключение — сработает.
> (arguments[2] && additive === undefined)
Как это условие может выполниться? additive же и есть аргумент с индексом 2 если считать с нуля. Что это вообще должно делать?
> this.order.additive = Hamburger.additive[typeAdditive];
> this.text += ', Добавка: ' + typeAdditive;
> this.correctAddi = true;
По моему, это неправильный подход. Так не принято делать в ООП. Это не ООП, а непонятно что.
Какие свойства есть у гамбургера?
- размер
- начинка
- список добавок
Все остальное (text, correctHamb, generalPrice) можно вычислить исходя из этих данных с помощью методов. Раз их можно в любой момент вычислить, значит их нет смысла вообще хранить как свойства. Меньше свойств — меньше геморроя по поддержанию их в актуальном состоянии.
Ты немного все переусложнил. Вместо
> this.order.additive
можно написать this.addditive — так и проще и короче.
В общем, предлагаю воспользоваться принципом «не преумножай сущности» и выпилить все свойства, кроме указанных трех.
Функция makeSelection должна только задавать параметры гамбургера (и проверять что они верные).
А если заводить кучу свойств, то ты замучаешься их потом обновлять например при изменении в заказе или удалении добавок.
> return 'Количество калорий: ' + this.generalCal;
Это неудобно. Может я захочу сложить число калорий в нескольких гамбургерах, как это сделать если ты возвращаешь не число, а текст? Возвращай число, а текст дописывай где-нибудь в другом месте, например в отдельной функции.
Да.
>>378941
> column.height = tbHeight;
Ой не, вот это не используй — это какие-то древние свойства 20-летней давности. Используй CSS вместо JS для этого.
> row.style.borderColor = 'black';
Используй CSS а не JS
> document.getElementById('table').onclick
Давай будем использовать addEventListener так как на onclick можно повесить только один обработчик (тут он один, но все равно это дурная практика). onclick — он для использования в HTML-коде.
> (hasClass(target, 'fill_black')) ? removeClass(target, 'fill_black'): addClass(target, 'fill_black');
Используй тут if, не пиши так, так как явное лучше неявного. Алсо, тут можно бы написать функцию toggleClass(node, klass) которая включает/выключает класс.
Кнопка «сменить цвет» не работает — она все закрашивает черным, а должна менять местами черное и белое.
Да.
>>378941
> column.height = tbHeight;
Ой не, вот это не используй — это какие-то древние свойства 20-летней давности. Используй CSS вместо JS для этого.
> row.style.borderColor = 'black';
Используй CSS а не JS
> document.getElementById('table').onclick
Давай будем использовать addEventListener так как на onclick можно повесить только один обработчик (тут он один, но все равно это дурная практика). onclick — он для использования в HTML-коде.
> (hasClass(target, 'fill_black')) ? removeClass(target, 'fill_black'): addClass(target, 'fill_black');
Используй тут if, не пиши так, так как явное лучше неявного. Алсо, тут можно бы написать функцию toggleClass(node, klass) которая включает/выключает класс.
Кнопка «сменить цвет» не работает — она все закрашивает черным, а должна менять местами черное и белое.
Чет я не догоняю как без цикла сменить всем ячейкам цвет. Писать рекурсивный toggleClass? По производительности все равно будет как цикл.
>а когда цвета перевернуты то наоборот
Наоборот что? Черная клетка та, у которой нет класса .black?
> $pathDone=array($pathDone, "$point=>$key"=>$paths[$point][$key]);
Не, это какие-то костыли. После нескольких вызовов ты получишь массив с кучей вложенных элементов вида
array(array(array(array(....))))
и с ним невозможно будет работать. Сделай лучше нормальный массив, одноуровневый.
> $container=oneStep($paths, $pathDone, $time, $key, $target);
> return $container;
По идее ты должен попробовать проложить путь через каждую точку в цикле и выбрать наилучший и его вернуть, а не самый первый.
> но все равно $pathDone придётся переделывать, как я понял.
ну да
>>378957
> регулярные выражения?
можно
> С помощью innerHTML?
ну ты попробуй, а я прокомментирую и скорее всего скажу что это неправльно.
> Хотел попробовать сделать второй номер, но я так понимаю там нужны функции из первого?
да, они там пригодятся.
>>378959
Спасибо
>>378962
Не писать по 10 знаков после запятой, а максимум 1-2 и понимать, что браузер все равно округлит так как захочет, плюс-минус пара пикселей и макет должен это выдержать.
>>378963
Ширину можно и в %. Шрифт — в пикселях.
> Сначала сделать общий css, потом для каких экранов доделывать?
Потом для маленьких (то есть смартфонов).
>>378964
Не знаю.
>>378969
> throw new Error('Неверные данные');
Лучше писать 'Неверные данные, size=' + size — это поможет тебе же при отладке программы.
> this.checkForSimilarExtended(arguments);
А она сработает если добавить одну и ту же добавку несколькими отдельными вызовами addExtended? Очевидно нет: http://jsbin.com/veqogomunuke/1/edit
В остальном, все нормально.
> $pathDone=array($pathDone, "$point=>$key"=>$paths[$point][$key]);
Не, это какие-то костыли. После нескольких вызовов ты получишь массив с кучей вложенных элементов вида
array(array(array(array(....))))
и с ним невозможно будет работать. Сделай лучше нормальный массив, одноуровневый.
> $container=oneStep($paths, $pathDone, $time, $key, $target);
> return $container;
По идее ты должен попробовать проложить путь через каждую точку в цикле и выбрать наилучший и его вернуть, а не самый первый.
> но все равно $pathDone придётся переделывать, как я понял.
ну да
>>378957
> регулярные выражения?
можно
> С помощью innerHTML?
ну ты попробуй, а я прокомментирую и скорее всего скажу что это неправльно.
> Хотел попробовать сделать второй номер, но я так понимаю там нужны функции из первого?
да, они там пригодятся.
>>378959
Спасибо
>>378962
Не писать по 10 знаков после запятой, а максимум 1-2 и понимать, что браузер все равно округлит так как захочет, плюс-минус пара пикселей и макет должен это выдержать.
>>378963
Ширину можно и в %. Шрифт — в пикселях.
> Сначала сделать общий css, потом для каких экранов доделывать?
Потом для маленьких (то есть смартфонов).
>>378964
Не знаю.
>>378969
> throw new Error('Неверные данные');
Лучше писать 'Неверные данные, size=' + size — это поможет тебе же при отладке программы.
> this.checkForSimilarExtended(arguments);
А она сработает если добавить одну и ту же добавку несколькими отдельными вызовами addExtended? Очевидно нет: http://jsbin.com/veqogomunuke/1/edit
В остальном, все нормально.
Я пытаюсь сделать одноуровневый массив, но что-то не выходит. Пробовал делать и $pathDone[]=$key и через array_push, но в любом случае он выводит 0, не знаю почему. Получается только
через $pathDone=array($pathDone, $key) с кучей вложенных массивов.
>По идее ты должен попробовать проложить путь через каждую точку в цикле и выбрать наилучший и его вернуть, а не самый первый.
Без return рекурсивная функция не работает, я бы с радостью просто записывал результат в переменную, а не сразу возвращал её, но тогда вызов подфункции ничего нам давать не будет.
> Я пытаюсь сделать одноуровневый массив, но что-то не выходит.
Проверь, что ты туда кладешь. Надо класть только названия станций, а не все подряд. И
$pathDone[]=$key
должно работать. Проверь, что в $key.
> Без return рекурсивная функция не работает, я бы с радостью просто записывал результат в переменную, а не сразу возвращал её, но тогда вызов подфункции ничего нам давать не будет.
А ты записывай не в переменную, а в массив, а потом выбирай из массива лучши вариант и возвращай его.
> this.checkForSimilarExtended(this.extended);
Проще перед добавлением каждой добавки в this.extended проверить, есть ли она уже там.
Алсо, если ты делаешь вложенный цикл, то лучше бы обойтись без него. А если никак, то внутренний цикл лучше начинать не с 1 а с i + 1.
А в остальном, верно.
>> return false;
>Зачем?
Я просто подумал, что без него цвет просто мигнет. Где-то читал про это. Где-то же на onclick ставят return false;
>>378985
Да и насчет
>А ты записывай не в переменную, а в массив, а потом выбирай из массива лучши вариант и возвращай его.
Мне все равно придется возвращать что-то, массив ли или переменную. Допустим мы вызываем функцию для трех точек.
1. Вызывается функция oneStep.
2. Она в свою очередь вызывает саму себя.
3. Третья функция таки находит цель и возвращает результат из else локальной переменной container второй функции. Загвоздка в том, что эта вторая функция ничего не будет возвращать самой первой, если мы не напишем return $container, то есть все равно сразу придется возвращать первый попавшийся результат, иначе вызов второй функции просто не даст ничего и страница будет пустой.
>css-правила
Типа таких http://jsfiddle.net/c98x5dud/2/ ?
Ненавижу css! Понимаю что декларативный язык все такое, но почему даже моя умная IDE WebStorm не может анализировать css и написать что ты упоролся и пишешь ерунду. Как вообще тестируют css если он не выводит ошибки и вообще нихера не делает.
Ты сделал очень большую ошибку. Ты вместо -1 написал в начале
error_reporting(0);
А это значит не показывать сообщения об ошибках. Исправь это для начала.
> Не работает. Прост пустой массив получается.
Значит, в массив ничего не кладется и до строчки $pathDone[]=$key; он просто-напросто не доходит. Ищи, почему.
>>378990
А ты не гадай а читай мануалы
http://learn.javascript.ru/#book-toc-425
в частности это http://learn.javascript.ru/default-browser-action
>>378993
> Мне все равно придется возвращать что-то, массив ли или переменную.
Верно.
> Загвоздка в том, что эта вторая функция ничего не будет возвращать самой первой, если мы не напишем return $container, то есть все равно сразу придется возвращать первый попавшийся результат, иначе вызов второй функции просто не даст ничего и страница будет пустой
Неверно. Ты можешь вызвать функцию oneStep несколько раз в цикле, результаты сложить в массив, а потом пройтись по массиву, выбрать лучший и в итоге его вернуть через return.
иначе твоя функция проверяет только первый вариант в каждой точке и не способна найти путь через другие точки.
> иначе вызов второй функции просто не даст ничего и страница будет пустой.
Почему, если в функции стоит return, рано или подзно он выполнится.
>>378998
Ты наверно его плохо знаешь. Я например, не ненавижу, он прост и логичен.
В общем да, примерно так и надо. Исправь еще другие замечания только.
Ты сделал очень большую ошибку. Ты вместо -1 написал в начале
error_reporting(0);
А это значит не показывать сообщения об ошибках. Исправь это для начала.
> Не работает. Прост пустой массив получается.
Значит, в массив ничего не кладется и до строчки $pathDone[]=$key; он просто-напросто не доходит. Ищи, почему.
>>378990
А ты не гадай а читай мануалы
http://learn.javascript.ru/#book-toc-425
в частности это http://learn.javascript.ru/default-browser-action
>>378993
> Мне все равно придется возвращать что-то, массив ли или переменную.
Верно.
> Загвоздка в том, что эта вторая функция ничего не будет возвращать самой первой, если мы не напишем return $container, то есть все равно сразу придется возвращать первый попавшийся результат, иначе вызов второй функции просто не даст ничего и страница будет пустой
Неверно. Ты можешь вызвать функцию oneStep несколько раз в цикле, результаты сложить в массив, а потом пройтись по массиву, выбрать лучший и в итоге его вернуть через return.
иначе твоя функция проверяет только первый вариант в каждой точке и не способна найти путь через другие точки.
> иначе вызов второй функции просто не даст ничего и страница будет пустой.
Почему, если в функции стоит return, рано или подзно он выполнится.
>>378998
Ты наверно его плохо знаешь. Я например, не ненавижу, он прост и логичен.
В общем да, примерно так и надо. Исправь еще другие замечания только.
Пожалуйста. ОП полностью прав: если что-то можно сделать с помощью css или html - это нужно делать с помощью ccs или html.
http://jsbin.com/datan/25/edit?js,output
Начал сапера делать. Меня интересует переменная table, и почему она не видна функции setFlag. А может сделать свойство table у Field?
Тоже пойду отдохну.
http://ideone.com/2WE2WW
Вот переделал слегка. Сейчас еще попробую с регекспом пошаманить на предмет
>> (\s?-?\s?[(]?\s?\d\s?[)]?\s?-?\s?)
Вместо того чтобы подбирать комбинации символов, проще использовать вариант «любое число скобок, пробелов, минусов».
А так скидываю рабочую версию просто.
Почему теперь не работает? NULL возвращает для некоторых точек, а для некоторых всё нормально.
>PHP Warning: in_array() expects parameter 2 to be array, null given in /home/7t2r3S/prog.php on line 145
От этой херни я не знаю как избавиться. Объявлять массив в начале функции? Тогда массив будет равен 0 всегда. Выставить аргумент по умолчанию тоже не вариант.
Так, хорошо, первую ошибку исправил. Теперь, в $result должны же убираться символы не входящие в $regexp1, но они остаются, почему ?
+ в регулярных выражениях это "обязательно встретится минимум 1 раз и до бесконечности". Если тебе нужен знак плюс, то его надо экранировать.
>?7?8
Я так понял у тебя должно быть либо +7, либо 8, но у тебя регулярка допускает и то и другое сразу, то есть номер +78....
Алсо, я делал примерно так 8([0-9]\\-\\s\\(\\)){9}, не ручаюсь за правильность, но суть ты думаю уловил.
http://ideone.com/3CC52W
В таком случае у тебя неправильное регулярное выражение. Нужно искать НЕ цифры, и заменять их (только не $0, эта переменная соответствует всему регулярному выражению в скобках).
Понял, спасибо. Вот перепиленная версия, для двух случаев, но я ошибся где-то в if, снова.
Вроде нет ошибки. И вместо
>?7?8?
Лучше всё-таки сделать (\\+7)|8), потому-что в текущей версии программы можно написать во первых любую первую цифру, во вторых ввести 12 значный номер, начинающийся с +78
Точно, так будет лучше, чем писать новое выражение
Мне уже стыдно спрашивать, но допиливаю ту задачу, теперь в ответе пытаюсь заменить +7 на 8, пока придумал только такой громоздкий способ, который ещё почему-то не работает. http://ideone.com/9FWYFx
Объясню сразу как должно работать, получившуюся в результате
первого preg_replace строку мы проверяем, если видим, что первый символ 7, то заменяем её на 8.
>>379225
http://ideone.com/3CC52W Я думаю это можно было сделать проще (Оп пояснит, когда вернется), но пока так.
>>379282
Все, кроме сессий — это части протокола HTTP, потому я бы советовал тебе изучить именно его. GET/POST связан еще с темой html-форм, потому если ты в них плохо разбираешься, то почитай http://htmlbook.ru/samhtml5/formy
Протокол HTTP позволяет получать данные с сервера и отправлять на сервер. И запрос и ответ на него состоят из трех частей: первой строки, заголовков и необязательного тела.
В HTTP есть разные методы (виды запросов), из них главные — это GET (используется для получения страницы или файла с сервера и для отправки форм вроде формы поиска), POST (используется для отправки HTML-форм на сервер, в том числе закачки файлов). Еще есть HEAD — это то же самое что и GET но при HEAD сервер отслыает клиенту только заголовки ответа, а тело не отправляет.
Куки — средство хранения информации на клиенте (в браузере), сервер их может ставить с помощью HTTP-заголовка Set-Cookie, после чего клиент (браузер) сохраняет их и начинает посылать их обратно в заголовках с каждым запросом к серверу. Например, можно каждому посетителю ставить в куку уникальный номер и таким образом их различать.
Сессии — это способ хранения данных не на клиенте, а на сервере (так что клиент не может ни прочитать данные ни подменить), они в PHP построены поверх кук, то есть на сервере создается файлик/запись в базе данных, генерируется длинный идентификатор к ней и кладется в куку.
В общем, читай про HTTP. Где взять хороший и наглядный учебник я не знаю, потому дам ссылки, которые выглядят подходяще:
https://ru.wikipedia.org/wiki/HTTP
http://portscan.ru/article-protocol-http.html
https://tech.yandex.ru/education/shri/msk-2012/talks/537/
PHP автоматически извлекает данные запроса и заголовки и помещат их в _POST, _GET, _COOKIE и _SERVER перед запуском твоего скрипта. Ему остается только взять их оттуда и что-нибудь сделать.
Можешь почитать учебник PHP:
http://php.net/manual/ru/language.variables.external.php
http://php.net/manual/ru/reserved.variables.php
http://php.net/manual/ru/features.file-upload.post-method.php
Также, ты можешь открыть инспектор в Хроме или ФФ (Ctrl + Shift + I), там открыть вкладку Network и загрузить какой-нибудь сайт и посмотреть, какие там запросы отправляются, какие заголовки. Советую посмотреть все это самому.
Если есть еще какие-то вопросы или что-то непонятно, задавай, я потом отвечу.
>>379282
Все, кроме сессий — это части протокола HTTP, потому я бы советовал тебе изучить именно его. GET/POST связан еще с темой html-форм, потому если ты в них плохо разбираешься, то почитай http://htmlbook.ru/samhtml5/formy
Протокол HTTP позволяет получать данные с сервера и отправлять на сервер. И запрос и ответ на него состоят из трех частей: первой строки, заголовков и необязательного тела.
В HTTP есть разные методы (виды запросов), из них главные — это GET (используется для получения страницы или файла с сервера и для отправки форм вроде формы поиска), POST (используется для отправки HTML-форм на сервер, в том числе закачки файлов). Еще есть HEAD — это то же самое что и GET но при HEAD сервер отслыает клиенту только заголовки ответа, а тело не отправляет.
Куки — средство хранения информации на клиенте (в браузере), сервер их может ставить с помощью HTTP-заголовка Set-Cookie, после чего клиент (браузер) сохраняет их и начинает посылать их обратно в заголовках с каждым запросом к серверу. Например, можно каждому посетителю ставить в куку уникальный номер и таким образом их различать.
Сессии — это способ хранения данных не на клиенте, а на сервере (так что клиент не может ни прочитать данные ни подменить), они в PHP построены поверх кук, то есть на сервере создается файлик/запись в базе данных, генерируется длинный идентификатор к ней и кладется в куку.
В общем, читай про HTTP. Где взять хороший и наглядный учебник я не знаю, потому дам ссылки, которые выглядят подходяще:
https://ru.wikipedia.org/wiki/HTTP
http://portscan.ru/article-protocol-http.html
https://tech.yandex.ru/education/shri/msk-2012/talks/537/
PHP автоматически извлекает данные запроса и заголовки и помещат их в _POST, _GET, _COOKIE и _SERVER перед запуском твоего скрипта. Ему остается только взять их оттуда и что-нибудь сделать.
Можешь почитать учебник PHP:
http://php.net/manual/ru/language.variables.external.php
http://php.net/manual/ru/reserved.variables.php
http://php.net/manual/ru/features.file-upload.post-method.php
Также, ты можешь открыть инспектор в Хроме или ФФ (Ctrl + Shift + I), там открыть вкладку Network и загрузить какой-нибудь сайт и посмотреть, какие там запросы отправляются, какие заголовки. Советую посмотреть все это самому.
Если есть еще какие-то вопросы или что-то непонятно, задавай, я потом отвечу.
>PHP автоматически извлекает данные запроса и заголовки и помещает их в _POST, _GET, _COOKIE и _SERVER
>автоматически
Вот оно, волшебное слово. Почему-то каждый раз, когда я слышу о какой-то фишке, то представляю, что мне нужно будет ее чуть ли не самому реализовать на языке. Почему - не знаю. О том, что в языке/программе/протоколе все давно реализовано и довольно просто оперируется с помощью функций и переменных, я и думать не могу. Поэтому каждый раз дико фэйлю и боюсь даже попробовать.
>>378960
https://github.com/infinitecats/infinitecats.github.io - там пока сверстанный хедер, пока без мобильника.Потяжелее, чем прошлый
1) Надо сделать скрипт, который постоянно крутится при старте сервера. Он не вызывается никакой страницой, просто постоянно запущен. Допустим, им выполняются определенные долгие вычисления. CRON-хуен не предлагать, серверная машина на винде
2) Без сложных костылей уметь связаться с этим постоянно запущенным скриптом другим скриптом, который запускается обычно, от набора его url-а в браузере. Авансом шлю няшу
Планировщик задач
> dom.addEvent(table,
Ты используешь в глобальном коде переменную, которая нигде раньше не создана. С чего оно должно работать?
> Меня интересует переменная table, и почему она не видна функции setFlag
Видна, если ты ее передаешь.
>>379170
Работает верно, на все эти сложные \s?-? я бы заменил на «любое число пробелов, минусов, скобок»
>>379173
А зачем ты NULL в pathDone передаешь в самом начале? Вот тут:
> $testvar=oneStep($paths, NULL, 0, 'vas' , 'gor');
Ошибка в том, что ты в одной переменной хранишь данные разных типов (null и массив). Храни всегда данные одинакового типа (только массив) и проблем таких не будет. Потому что трудно писать надежный код когда у тебя в переменной то массив то просто null.
>>379200
Тебе тот же совет что и другим анонам: проверь свою программу на списке номеров:
Правильные: 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' // нет +
);
> dom.addEvent(table,
Ты используешь в глобальном коде переменную, которая нигде раньше не создана. С чего оно должно работать?
> Меня интересует переменная table, и почему она не видна функции setFlag
Видна, если ты ее передаешь.
>>379170
Работает верно, на все эти сложные \s?-? я бы заменил на «любое число пробелов, минусов, скобок»
>>379173
А зачем ты NULL в pathDone передаешь в самом начале? Вот тут:
> $testvar=oneStep($paths, NULL, 0, 'vas' , 'gor');
Ошибка в том, что ты в одной переменной хранишь данные разных типов (null и массив). Храни всегда данные одинакового типа (только массив) и проблем таких не будет. Потому что трудно писать надежный код когда у тебя в переменной то массив то просто null.
>>379200
Тебе тот же совет что и другим анонам: проверь свою программу на списке номеров:
Правильные: 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' // нет +
);
Чтобы заменить +7 (точнее 7 в начале) на 8, надо написать регулярку такого типа:
«искать 7 в самом начале строки»
И ее заменять на 8. Там есть символ чтобы указать что надо искать только текст в начале строки, а не середине или в конце.
>>379228
Хорошо, но проверь свою программу на списке номеров в посте выше.
>>379302
тебе ответ тут: http://paste2.org/648a7bY7 (спам фильтр)
Оп, проверь пикчу - >>379439
Я не знаю, почему не посты не отправляются.
Вот
http://ideone.com/Uxtnrs
http://ideone.com/iLn1TI
Ни один способ без передачи нулл не работает.
Ты не бойся, а попробуй использовать.
>>379319
> font-size: 17px;
Всегда когда указываешь font-size, указывай рядом line-height. На body надо задавать основной шрифт, то есть которым пишется например текст новости.
Меню у тебя больше по высоте чем на макете.
Всегда обращай внимание на выравнивание иконок относительно текста. Почтовый конверт у тебя уехал вверх.
Стрелки на слайдере не совпадают по яркости с макетом, на макете темнее.
> .header {
> width: 1300px;
А почему тут ширина фиксированная? Попробуй уменьшить масштаб в браузере — шапка не тянется на всю ширину. И наоборот, на более узком окне (например 1200px) появляется прокрутка.
> .header .slider-controls .ahead {
> left: 1128px;
Лучше использовать right
Плеер надо сделать из компонентов, то есть кнопки и полоса прогресса — отдельными элементами.
Насчет фона, у меня есть интересная мысль, как его попробовать сжать из 250 Кб до меньшего размера. Можно сделать 2 слоя — размытый фон в jpg и текстура для сеточки в прозрачном png. Размытый JPEG очень сильно жмется, и может быть, тут будет гораздо меньше чем 250 Кб. Попробуй-ка.
То же самое кстати можно делать, когда есть картинка с текстом: жмем текст в PNG, а фон в JPG — получается экономия.
> .header .slider-controls .ahead .img-ahead {
Слишком много классов. .header и .ahead можно смело выкинуть. Обычно хватает 2 классов — блок и элемент в этом блоке.
> .header .slider .slide-text h2:nth-child(2) {
Тут лучше использовать CSS-класс а не nth-child
> <li class="about"><div class="top-menu-icon icon-about"></div><a href="#">About us</a></li>
Слишком много букв. Можно записать так:
<li class="about"><span class="icon"></span><a href="#">About us</a></li>
Или даже использовать псевдоэлемент :before и выкинуть спан.
> <div class="back"><div class="slider-controls-img img-back"></div></div>
<div class="back"><div class="slider-img"></div></div>
При наведении на кнопку слайдера она увеличивается, и картинка в ней мылится. Нельзя увеличивать растровые картинки. Лучше бы сделать изначально большую картинку, и по умолчанию выводить уменьшенной.
Странно, что h1 у тебя идет позже чем h2. Я бы сделал
h1 (одним тегом) — The Cool, The Minimal
h2 — LOREM IPSUM SIT AMET
> <h2>Better design</h2>
Это точно не заголовок. h2 тут можно убрать.
Слайды ты сделал не совсем верно. Там идет горизонтальный прокручиваемый ряд элементов, и пост с видео, и твиттер — это 2 равноценных записи в этой ленте. Они должны быть на одном уровне.
Ты не бойся, а попробуй использовать.
>>379319
> font-size: 17px;
Всегда когда указываешь font-size, указывай рядом line-height. На body надо задавать основной шрифт, то есть которым пишется например текст новости.
Меню у тебя больше по высоте чем на макете.
Всегда обращай внимание на выравнивание иконок относительно текста. Почтовый конверт у тебя уехал вверх.
Стрелки на слайдере не совпадают по яркости с макетом, на макете темнее.
> .header {
> width: 1300px;
А почему тут ширина фиксированная? Попробуй уменьшить масштаб в браузере — шапка не тянется на всю ширину. И наоборот, на более узком окне (например 1200px) появляется прокрутка.
> .header .slider-controls .ahead {
> left: 1128px;
Лучше использовать right
Плеер надо сделать из компонентов, то есть кнопки и полоса прогресса — отдельными элементами.
Насчет фона, у меня есть интересная мысль, как его попробовать сжать из 250 Кб до меньшего размера. Можно сделать 2 слоя — размытый фон в jpg и текстура для сеточки в прозрачном png. Размытый JPEG очень сильно жмется, и может быть, тут будет гораздо меньше чем 250 Кб. Попробуй-ка.
То же самое кстати можно делать, когда есть картинка с текстом: жмем текст в PNG, а фон в JPG — получается экономия.
> .header .slider-controls .ahead .img-ahead {
Слишком много классов. .header и .ahead можно смело выкинуть. Обычно хватает 2 классов — блок и элемент в этом блоке.
> .header .slider .slide-text h2:nth-child(2) {
Тут лучше использовать CSS-класс а не nth-child
> <li class="about"><div class="top-menu-icon icon-about"></div><a href="#">About us</a></li>
Слишком много букв. Можно записать так:
<li class="about"><span class="icon"></span><a href="#">About us</a></li>
Или даже использовать псевдоэлемент :before и выкинуть спан.
> <div class="back"><div class="slider-controls-img img-back"></div></div>
<div class="back"><div class="slider-img"></div></div>
При наведении на кнопку слайдера она увеличивается, и картинка в ней мылится. Нельзя увеличивать растровые картинки. Лучше бы сделать изначально большую картинку, и по умолчанию выводить уменьшенной.
Странно, что h1 у тебя идет позже чем h2. Я бы сделал
h1 (одним тегом) — The Cool, The Minimal
h2 — LOREM IPSUM SIT AMET
> <h2>Better design</h2>
Это точно не заголовок. h2 тут можно убрать.
Слайды ты сделал не совсем верно. Там идет горизонтальный прокручиваемый ряд элементов, и пост с видео, и твиттер — это 2 равноценных записи в этой ленте. Они должны быть на одном уровне.
> серверная машина на винде
Сделай свою службу или пропиши в автозапуск (правда, службу перезапустят при падении в отличие от автозапуска). Или планировщик, но тут логичнее службу.
> Без сложных костылей уметь связаться с этим постоянно запущенным скриптом другим скриптом
- давать задания через таблицу в БД
- через NoSQL очередь вроде http://habrahabr.ru/post/44907/ и https://www.rabbitmq.com/tutorials/tutorial-two-php.html (очередь нужна если большие нагрузки, если маленькие хватит и таблицы, только с блокировками разберись)
- через сокеты, но придется придумать протокол и писать сервер. Можно например JSON-RPC поверх HTTP.
- через средства IPC: http://habrahabr.ru/post/193270/ — если они работают под виндой
>>379439
Значит твой скрипт кривой и его надо исправлять. А в pathDone передавать не NULL, а пустой массив. Очеивдно же что изначально пройденный путь пустой.
>>379440
А, у меня то же.
>>379442
И чем 0 лучше чем NULL? Я же написал, надо для pathDone передавать только массивы.
Алсо, еще и ideone отключился теперь. Пойду спать.
> серверная машина на винде
Сделай свою службу или пропиши в автозапуск (правда, службу перезапустят при падении в отличие от автозапуска). Или планировщик, но тут логичнее службу.
> Без сложных костылей уметь связаться с этим постоянно запущенным скриптом другим скриптом
- давать задания через таблицу в БД
- через NoSQL очередь вроде http://habrahabr.ru/post/44907/ и https://www.rabbitmq.com/tutorials/tutorial-two-php.html (очередь нужна если большие нагрузки, если маленькие хватит и таблицы, только с блокировками разберись)
- через сокеты, но придется придумать протокол и писать сервер. Можно например JSON-RPC поверх HTTP.
- через средства IPC: http://habrahabr.ru/post/193270/ — если они работают под виндой
>>379439
Значит твой скрипт кривой и его надо исправлять. А в pathDone передавать не NULL, а пустой массив. Очеивдно же что изначально пройденный путь пустой.
>>379440
А, у меня то же.
>>379442
И чем 0 лучше чем NULL? Я же написал, надо для pathDone передавать только массивы.
Алсо, еще и ideone отключился теперь. Пойду спать.
>Ты используешь в глобальном коде переменную, которая нигде раньше не создана.
Где-то она создана все равно:
var table = document.createElement('table');
http://jsbin.com/datan/37/edit?js,console
Я не понимаю.
>Ты используешь в глобальном коде
Через call, apply не работает.
> Где-то она создана все равно:
Во-первых, программа выполняется сверху вниз. Ты должен сначала создать переменную, а потом использовать, а не наоборот. Во-вторых, твоя переменная создается внутри функции, значит она локальная, и снаружи (в глобальном коде) она не видна и доступ получить к ней невозможно.
По моему, ты что-то путаешь. Почему к моменту dom.addEvent(table... эта переменная должна существовать и что в ней по твоему должно быть?
> Я не понимаю.
Сравни: http://jsbin.com/muxiwojuhuli/1/edit?html,console
var a = 100;
console.log(a); // 100
console.log(b); // undefined
var b = 200;
господа, иду постепенно по шагам инструкции от няшного-добра-ему-вообще-молодец анона http://archive-ipq-co.narod.ru
Столкнулся с проблемой исправления ошибок в тексте по регекспу. Суть в том, что при поиске отсутствия пробела после запятой, в регекспе важен следующий после неё символ, который, при true срабатывании, отличается от пробела.
Как исправить эту ошибку, не проебав этот самый символ, ведь заменяется всё попавшее под регексп?
Вот для примера:
http://ideone.com/6ZVlwa
Знаю, что, наверняка, малоэффективно использую код, и буду благодарен за помощь.
Анон, выкинь из этого списка то, что мне нахуй не нужно, а что следует почитать-посмотреть-попробовать:
Р. Никсон - Создаем динамические веб-сайты с помощью PHP, MySQL, javascript и CSS. 2-е издание
видосики из интернетов: developerstarter, infospir, knowcity и прочая, и прочая
samouchitelPHP56sfericheski-v-vakuume.pdf
HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов.fb2
Joomla3, wordpress, drupal
php_enhanced_ru.chm
Люк Веллинг, Лора Томсон - Разработка web-приложений с помощью PHP и MySQL (4 издание) - 2010
Stroganov_Vash_Pervi_Sait_PHP.djvu
Курс профессионального javaScript [2013]
Программирование на JavaScript (jQuery,AJAX) (2013) уровень б
Я специально вывалил содержимое папки с собранной мной инфой, чтобы анону был понятен уровень пиздеца, творящегося сейчас у меня в голове. Информации масса, ее слишком много, чтобы было понятно, с какого конца и за что браться.
Пока дрочу задачки из ОП-поста. Будущее туманно.
>Книги
Пиздос.
Выкинь все на хуй. По порядку.
PHP->PHP.net/docs->expirience->
исследование шаблонизаторов->
MDN->CSS->
MDN->Java ScriptRe ference->
expirience->
ищешь популярные framworks->
дрочишь сайтики->
.....->
Succes! You are monkey!
Оп, вот я идиот. Я смотрел на функцию createField и не видел, что творится вокруг. А там и вправду table откуда-то берется. Просто консоль мне твердила, что ошибка на 78 строке.
Ну ладно, буду внимательней.
function recurs($var){
$var++;
if($var<3)
recurs($var);
echo $var;
}
$var = 0;
recurs($var);
Должно же быть 123, а получается 321. Почему?
Поставь echo До проверки условия.
Потому, что рекурсивно вызываешь функцию, которая вызывает echo только когда var<3, а это произойдет в 3-й итерации рекурсивного вызова, когда условие var<3 не выполнится и функция echo сработает напечатав по порядку 3 2 1, по мере выхода из рекурсивных функций.
Используй For или .each
class Model {
public $text;
public function __construct() {
$this->text = 'Hello world!';
}
}
class View {
private $model;
private $controller;
public function __construct(Controller $controller, Model $model) {
$this->controller = $controller;
$this->model = $model;
}
public function output() {
return '<h1>' . $this->model->text .'</h1>';
}
}
class Controller {
private $model;
public function __construct(Model $model) {
$this->model = $model;
}
}
//initiate the triad
$model = new Model();
//It is important that the controller and the view share the model
$controller = new Controller($model);
$view = new View($controller, $model);
echo $view->output();
Подскажите что прочитать что бы понимать что тут написано. В PHP могу и довольно не плохо.
class Model {
public $text;
public function __construct() {
$this->text = 'Hello world!';
}
}
class View {
private $model;
private $controller;
public function __construct(Controller $controller, Model $model) {
$this->controller = $controller;
$this->model = $model;
}
public function output() {
return '<h1>' . $this->model->text .'</h1>';
}
}
class Controller {
private $model;
public function __construct(Model $model) {
$this->model = $model;
}
}
//initiate the triad
$model = new Model();
//It is important that the controller and the view share the model
$controller = new Controller($model);
$view = new View($controller, $model);
echo $view->output();
Подскажите что прочитать что бы понимать что тут написано. В PHP могу и довольно не плохо.
Пажи с флагом. Я подрываюсь на минах, когда в коде пытаюсь открыть якобы не заминированную клетку. В консоле все видно Флаг будет просто символ, через Cell.prototype.setText поставить проще простого.
Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк каждый месяц начисляет 3% за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, тоже каждый месяц, наш герой идет в банк и платит 5000 р (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?
Вот таким скриптом:
<?php
$opName = 'школьник';
for ($i = 40000; $i <= 0; $i = $i - 2800) {
echo "{$i}-оплата кредита — {$opName}\n";
}
Не понимаю где ошибка.
Блядь, это очень похоже на массивы, но нахуя столько сложностей то?
Пытаюсь понять зачем нужен ООП
У тебя хуёвый пример. ООП это шкаф с полочками для книг, шкаф для многих строк кода. Понять пользу шкафа трудно, когда у тебя одна книга. Найти выше в тредах пример про кошку/мышку и попробуй сделать его без ООП, а потом с ООП, и опиши для себя разницу.
Но ведь книги нужно хранить в библиотеке и искать их просто крикнув библиотекарю "пошёл и достал мне чего-нибудь интересного".
Не могу найти задачу, про которую ты гоСпасибо.
>Не могу найти задачу, про которую ты гоСпасибо.
Криворукий я.
Помоги нагуглить задачу про котов и мышей, заранее спасибо.
> Но ведь книги нужно хранить в библиотеке и искать их просто крикнув библиотекарю "пошёл и достал мне чего-нибудь интересного".
Речь не об этом. Я говорю про подход к организации хранения информации (кода), или все книги лежат в общей стопке, или у тебя есть шкаф, где на полочках написано, что за книги там лежат. Про кошку-мышку есть ссылка в ОП-посте на его сайте.
А если я рассовываю разные функции по разным файлам? Например у меня есть файл с функциями нужными для управления пользователями. Есть файл с функциями работы с изображениями. Это плохой подход к программированию? Или он плох при работе в команде?
Ну ответьте же на ответ
Не пойму почему одна мина только появляется. Да и так, ОП, посмотри на код, верный путь выбрал?
Но i--; не защищает от расстановки 2 двух мин на одну и ту же клетку.
Я заметил, что вот такая штука не срабатывает:
innerHTML == '' , когда дело касается проверки.
Еще хотел спросить, как реализовать сохранение в памяти, что на клетке находится мина, если я ее пометил флажком? Вот это будет главной проблемой, как уместить 3 знака на клетке. По-моему я уже свернул с верной дороги. Что думаешь?
> Как исправить эту ошибку, не проебав этот самый символ, ведь заменяется всё попавшее под регексп?
Ты можешь использовать в выражении для замены специальные конструкции:
$0 — вставляет текст, захваченный регулярным выражением
$1 — вставляет текст, захваченный первыми круглыми скобками
$2 — вторыми
И так далее.
Пример:
$text = "кошка кошке кошку";
$text = preg_replace("/кош(ка|ке)/ui", 'соба$1', $text);
echo $text; // собака собаке кошку
Здесь $1 заменяется на «ка» или «ке», которые попадают в первые круглые скобки в регулярке.
>>379593
Нормальные книги по PHP — Зандстра и Шлосснейгл (названия в ОП-посте) — но они для тех, кто уже что-то знает. Книга «Р. Никсон - Создаем динамические веб-сайты с помощью PHP, MySQL, javascript и CSS» даст общее представление о PHP/MySQL/JS/CSS, но уровень в ней довольно низкий, так что годится только для знакомства.
По яваскрипту нормальные книги — это Фленаган «Javascript, Полное руководство, 6-е издание» (не пятое и ниже), но она огромная и трудна для начинающих, и Дуглас Крокфорд «яваскрипт, сильные стороны».
Остальные книги, которые ты тут упомянул, я не знаю, но по моему они дублируют друг друга.
Будь осторожен, книги по PHP в большинстве пишут авторы, которые сами толком не умеют на нем программировать, ничему хорошему они не научат.
> Как исправить эту ошибку, не проебав этот самый символ, ведь заменяется всё попавшее под регексп?
Ты можешь использовать в выражении для замены специальные конструкции:
$0 — вставляет текст, захваченный регулярным выражением
$1 — вставляет текст, захваченный первыми круглыми скобками
$2 — вторыми
И так далее.
Пример:
$text = "кошка кошке кошку";
$text = preg_replace("/кош(ка|ке)/ui", 'соба$1', $text);
echo $text; // собака собаке кошку
Здесь $1 заменяется на «ка» или «ке», которые попадают в первые круглые скобки в регулярке.
>>379593
Нормальные книги по PHP — Зандстра и Шлосснейгл (названия в ОП-посте) — но они для тех, кто уже что-то знает. Книга «Р. Никсон - Создаем динамические веб-сайты с помощью PHP, MySQL, javascript и CSS» даст общее представление о PHP/MySQL/JS/CSS, но уровень в ней довольно низкий, так что годится только для знакомства.
По яваскрипту нормальные книги — это Фленаган «Javascript, Полное руководство, 6-е издание» (не пятое и ниже), но она огромная и трудна для начинающих, и Дуглас Крокфорд «яваскрипт, сильные стороны».
Остальные книги, которые ты тут упомянул, я не знаю, но по моему они дублируют друг друга.
Будь осторожен, книги по PHP в большинстве пишут авторы, которые сами толком не умеют на нем программировать, ничему хорошему они не научат.
И у меня кстати есть еще мини-задачка для яваскриптщиков:
if (x) {
...
}
Перечислите все значения x при которых if не сработает. Это так называемые ложные (falsy) значения. Всего их 6.
if (x !== x) { .. }
Чему должно быть равно x чтобы это условие сработало?
>>379678
Надо для мины эффект пострашнее сделать. Например, чтобы при наступлении на мину поле несколько раз быстро мигало, перекрашиваясь по очереди в черный и желтый цвет.
У таблиц есть методы insertRow() ( http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-39872903 ), а у строк — insertCell ( http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68927016 )
Еще инфа:
http://learn.javascript.ru/traversing-dom#таблицы
https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement (англ.)
> и too much recursion
Допустим я кликнул в пустую клетку A. Ты открываешь ее, затем для каждой соседней клетки по очереди вызываешь clickEvent. Она открывает соседнюю клетку B, которая тоже пустая, и из-за этого вызывает clickEvent для всех соседних с B клеток, в том числе A. И так до бесконечности.
> & # 9760
А точка с запятой где? Почитай-ка https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML
> if (!(currentElement instanceof Cell)) {
> throw 'Element from around not instance of Cell'
> }
Для таких случаев (когда обязательно должно выполняться условие) есть функция assert (точнее есть такое название, а функцию ты должен сам написать), которая используется так:
assert(currentElement instanceof Cell);
Это короче и читабельнее чем if, и любой нормальный программист понимает что значит assert.
> clickEvent
Лучше назвать clickCell или даже openCell, название функции должно начинаться с глагола.
Исправь баги, и снова покажи код, оценим твой ООП.
И у меня кстати есть еще мини-задачка для яваскриптщиков:
if (x) {
...
}
Перечислите все значения x при которых if не сработает. Это так называемые ложные (falsy) значения. Всего их 6.
if (x !== x) { .. }
Чему должно быть равно x чтобы это условие сработало?
>>379678
Надо для мины эффект пострашнее сделать. Например, чтобы при наступлении на мину поле несколько раз быстро мигало, перекрашиваясь по очереди в черный и желтый цвет.
У таблиц есть методы insertRow() ( http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-39872903 ), а у строк — insertCell ( http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68927016 )
Еще инфа:
http://learn.javascript.ru/traversing-dom#таблицы
https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement (англ.)
> и too much recursion
Допустим я кликнул в пустую клетку A. Ты открываешь ее, затем для каждой соседней клетки по очереди вызываешь clickEvent. Она открывает соседнюю клетку B, которая тоже пустая, и из-за этого вызывает clickEvent для всех соседних с B клеток, в том числе A. И так до бесконечности.
> & # 9760
А точка с запятой где? Почитай-ка https://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML
> if (!(currentElement instanceof Cell)) {
> throw 'Element from around not instance of Cell'
> }
Для таких случаев (когда обязательно должно выполняться условие) есть функция assert (точнее есть такое название, а функцию ты должен сам написать), которая используется так:
assert(currentElement instanceof Cell);
Это короче и читабельнее чем if, и любой нормальный программист понимает что значит assert.
> clickEvent
Лучше назвать clickCell или даже openCell, название функции должно начинаться с глагола.
Исправь баги, и снова покажи код, оценим твой ООП.
> var columns = rows[rowIndex].childNodes;
Это очень ненадежно, так как по идее между узлами <td> в дереве DOM например могут быть текстовые узлы с пробелами:
<td></td> (пробелы) <td></td>
В твоем случае их нет, но если заменить алгоритм генерации таблицы, то они могут появиться. То есть этот код работает на честном слове. Такой код, естественно, писать нельзя.
Используй вместо childNodes свойство children (которое содержит только HTML-элементы) либо, что лучше, используй свойства rows[] и cells которые есть у таблиц в ДОМе.
> this.tdElemtnt = tdElement;
Опечатки.
Это код для тех, кто разбирается в ООП. Если не разбираешься, то сначала прочти мой урок по ООП для чайников http://archive-ipq-co.narod.ru/l1/pasta.html и реши пару задач оттуда.
Алсо, почитать можно Зандстру или Шлосснейгла (названия книг в ОП-посте)
>>379700
Это задача сложная, некоторые ее с десятого раза сдавали.
>>379709
Но ведь можно и не писать код, а сказать кому-нибудь «эй, напиши этот код за меня».
>>379711
http://archive-ipq-co.narod.ru/l1/pasta.html в конце страницы
>>379714
Это подход с использованием костылей и техник 15-летней давности, без ООП тебя не возьмут на нормальную работу и ты не сможешь пользоваться современными фреймворками, другие программисты будут смеяться над тобой, и да, он плох тем что с увеличением размера кода он превращается в помойку. В ООП есть инкапсуляция, наследование и полиморфизм, а у тебя тут разве что инкапсуляция на честном слове (что один файл не будет трогать переменные из другого файла).
Мой урок по ООП (ссылка выше) очень простой, и в нем любой может разобраться, советую почитать. То, что ты учился по кривому учебнику без ООП, не повод от него отказываться.
Вот смотри еще пример. У тебя есть файл, который управляет пользователями (добавляет, удаляет, изменяет свойства пользователей в БД). Допустим, есть второй файл, который вызывает функции из него. Например, второй файл обходит всех пользователей в базе (вызывая функции из первого файла) и меняет в их именах большие буквы на маленькие.
Допустим, мы хотим протестировать второй файл, но не обращаясь к реальной базе данных (ибо в этом случае мы еще тестируем и базу данных, а это нам не нужно, да и работать будет медленно). В мире ООП мы просто делаем вместо класса работы с пользователями класс-заглушку (который не обращается к базе данных, а просто меняет данные о пользователе в массиве внутри себя) и подсовываем второму файлу. После чего смотрим в эту заглушку и убеждаемся что там все имена пользователей стали с маленькими буквами.
А как это сделать у тебя?
Это был пример «полиморфизма» (возможности вместо одного класса подсунуть другой), который невозможен в случае использования функций.
Тащемта я сегодня ночью понюхал амфетамина и прочитал книгу по ООП. Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования - 2011.
Все стало просто и понятно. Написал пару классов сам. Как всегда, зря я этого боялся. Мог бы еще лет 5 назад это сделать и мог бы на собеседованиях хвастаться тем что могу в ООП.
>тебя не возьмут на нормальную работу и ты не сможешь пользоваться современными фреймворками, другие программисты будут смеяться над тобой
Лол, придумали какие-то правила и живут в своем мирке. Программисты страннее чем я думал. Это как у тян "мужчина должен".
>В мире ООП мы просто делаем вместо класса работы с пользователями класс-заглушку
В мире процедурного программирования я просто закомментирую пару строк в функции что бы она перестала общаться с базой данных и хранила информацию в массиве.
Спасибо за ответы, вы мне очень помогли. Люблю вас.
jQuery по таймеру спрашивает у php скрипта новые посты и добавляет их в блок.
Самое простое это .load()
ОП, а мне не ответил.
Неправильно читать innerHTML и с чем-то его сравнивать. Это тупиковый путь.
Правльных вариантов 2:
1) Сделать объект Cell и в нем хранить информацию о клетке как другой достопочтенный анон: >>379678
2) Хранить информацию в data-* аттрибутах вроде data-isMine= "1" и использовать get/setAttribute()
> Я заметил, что вот такая штука не срабатывает:
> innerHTML == '' , когда дело касается проверки
Все работает, это ты неприавльно что--то делаешь. Сдампь в консоль чему равен innerHTML
> Но i--; не защищает от расстановки 2 двух мин на одну и ту же клетку.
Проверяй и не ставь мину туда где она есть
Аякс или вебсоекты. Второе лучше.
>>379838
Да ну, непраивльно, перезагружать весь блок если ничего не поменялось.
>>379804
> придумали какие-то правила и живут в своем мирке.
Не придумали, а вывели из опыта (которого у тебя нет)
> я просто закомментирую пару строк в функции
Это автоматические тесты, которые например запускаются на каждый коммит. Замучаешься комментировать.
Сделай цикл. Каждый месяц прибавляй проценты/комиссию, потом смотри чему равен долг и плати 5000 или меньше. И учитывай выплаченную сумму. И так пока долг до нуля не дойдет.
Твой код не работает так как процент начисляется на текущий остаток долга, он не одинаковый каждый месяц.
>>379641
Самостоятельное изучение тоже может быть плохо, так как в сети и на stack overflow много плохих и неграмотных примеров, особенно на легких языках вроде HTML, JS, PHP.
Учитесь лучше в нашем треде. Мы быдлокод заставляем исправлять.
>W5.2 Некто кладет в банк 10000 р. Банк начисляет 10% годовых (то есть, каждый год на счету становится на 10% больше, чем в прошлом году). Напиши программу, считающую, через сколько лет в банке будет миллион? Сколько лет будет этому некто? Доживет ли некто до этого дня, если сегодня ему 16 лет?
65 лет 1 067 189 рублёу?
>Для таких случаев (когда обязательно должно выполняться условие) есть функция assert (точнее есть такое название, а функцию ты должен сам написать), которая используется так:
assert(currentElement instanceof Cell);
Мне же нужно выбросить исключение с конкретным текстом, а функция assert одна. Вообще assert по-моему используют в тестах для проверки выражения и вывода какой-то шаблонной инфы. Не вижу как тут можно заюзать assert
>Допустим я кликнул в пустую клетку A. Ты открываешь ее, затем для каждой соседней клетки по очереди вызываешь clickEvent. Она открывает соседнюю клетку B, которая тоже пустая, и из-за этого вызывает clickEvent для всех соседних с B клеток, в том числе A. И так до бесконечности.
У меня же проверка
//если клетка уже открыта заканчиваем событие
if(!currentCell.close){
return true;
}
ХЗ откуда тут рекурсия
Всмысле бесконечная рекурсия
https://github.com/infinitecats/infinitecats.github.io - исправил. Там немного блока с контентом + хедер мобилки.
>Всегда когда указываешь font-size, указывай рядом line-height.
Я вот не знаю какую ставить. В фш написано, что "Авто".
>Стрелки на слайдере не совпадают по яркости с макетом, на макете темнее.
Там только левая темная, видно из-за того, что нельзя назад листать. Классы для js, наверное, потом сделаю.
>Плеер надо сделать из компонентов, то есть кнопки и полоса прогресса — отдельными элементами.
Посмотри, у меня какая-то дурная кнопка получилась. Видимо не так. Случайно не с помощью jQuery? Я просто пока его не освоил(пока DOM прохожу).
>Насчет фона, у меня есть интересная мысль, как его попробовать сжать из 250 Кб до меньшего размера. Можно сделать 2 слоя — размытый фон в jpg и текстура для сеточки в прозрачном png. Размытый JPEG очень сильно жмется, и может быть, тут будет гораздо меньше чем 250 Кб. Попробуй-ка.
То же самое кстати можно делать, когда есть картинка с текстом: жмем текст в PNG, а фон в JPG — получается экономия.
Я что-то ничего не понял. Можно по шагам? Там вроде все одной картинкой сразу сделано, вот я так и вырезал.
>Слишком много классов. .header и .ahead можно смело выкинуть. Обычно хватает 2 классов — блок и элемент в этом блоке.
Я просто посмотрел, у меня потом еще один слайдер. Думал чтобы не запутаться. У меня там вообще много классов css-файле. Сократить? По 2-3 сделать?
>Слайды ты сделал не совсем верно. Там идет горизонтальный прокручиваемый ряд элементов, и пост с видео, и твиттер — это 2 равноценных записи в этой ленте. Они должны быть на одном уровне.
Я это исправлю, как дойду до туда.
http://habrahabr.ru/post/119127/ - ты мне давал ссылочку... Я там посмотрел, если уж совсем по хардкору, то нужно 4 макета? не знаешь, верстальщиков не заставляют додумывать отзывчивый дизайн?
Кстати, я правильно там делаю, когда картинкам(в топ-меню иконкам, логотипу) задаю фиксированные размеры?
https://github.com/infinitecats/infinitecats.github.io - исправил. Там немного блока с контентом + хедер мобилки.
>Всегда когда указываешь font-size, указывай рядом line-height.
Я вот не знаю какую ставить. В фш написано, что "Авто".
>Стрелки на слайдере не совпадают по яркости с макетом, на макете темнее.
Там только левая темная, видно из-за того, что нельзя назад листать. Классы для js, наверное, потом сделаю.
>Плеер надо сделать из компонентов, то есть кнопки и полоса прогресса — отдельными элементами.
Посмотри, у меня какая-то дурная кнопка получилась. Видимо не так. Случайно не с помощью jQuery? Я просто пока его не освоил(пока DOM прохожу).
>Насчет фона, у меня есть интересная мысль, как его попробовать сжать из 250 Кб до меньшего размера. Можно сделать 2 слоя — размытый фон в jpg и текстура для сеточки в прозрачном png. Размытый JPEG очень сильно жмется, и может быть, тут будет гораздо меньше чем 250 Кб. Попробуй-ка.
То же самое кстати можно делать, когда есть картинка с текстом: жмем текст в PNG, а фон в JPG — получается экономия.
Я что-то ничего не понял. Можно по шагам? Там вроде все одной картинкой сразу сделано, вот я так и вырезал.
>Слишком много классов. .header и .ahead можно смело выкинуть. Обычно хватает 2 классов — блок и элемент в этом блоке.
Я просто посмотрел, у меня потом еще один слайдер. Думал чтобы не запутаться. У меня там вообще много классов css-файле. Сократить? По 2-3 сделать?
>Слайды ты сделал не совсем верно. Там идет горизонтальный прокручиваемый ряд элементов, и пост с видео, и твиттер — это 2 равноценных записи в этой ленте. Они должны быть на одном уровне.
Я это исправлю, как дойду до туда.
http://habrahabr.ru/post/119127/ - ты мне давал ссылочку... Я там посмотрел, если уж совсем по хардкору, то нужно 4 макета? не знаешь, верстальщиков не заставляют додумывать отзывчивый дизайн?
Кстати, я правильно там делаю, когда картинкам(в топ-меню иконкам, логотипу) задаю фиксированные размеры?
Все, понял что я мудак Проверка клетки на close/open есть, но выставить клетке свойство close я забыл. Теперь все работает.
Покажи. У тебя еще target is null на 57 строке. Вот jsbin более требователен, он ничего не выводит.
Ну вроди как-то так http://jsfiddle.net/8awrh5n2/
>У тебя еще target is null на 57 строк
null может быть только если не находит элемент с нужным id
>Вот jsbin более требователен, он ничего не выводит
Не люблю jsbin т.к. не понял как там сохранить код
Еще нужно добавить кнопку новой игры и надписи win/loose и замечания ОП наверное будут.
Долго делал? Я вот скоро сам доделаю. Но со структурой ООП у меня опять косячно вышло.
Да, примерно так.
>>379959
long polling — это костыль для браузеов не поддеживающих вебсокеты, а не особая технология.
>>379960
Ну если тебе принципиально текст на тот случай написать, то да. А так, assert используют когда хотят указать какое-то условие, которое всегда должно соблюдаться.
>>379964
Тогда сделай в начале функции вывод x и y по которым произошел клик и посмотри в чем дело.
>>379976
> у меня потом еще один слайдер
Можно дать им разные классы, header-slider и feed-slider
> Кстати, я правильно там делаю, когда картинкам(в топ-меню иконкам, логотипу) задаю фиксированные размеры?
да
> Я вот не знаю какую ставить. В фш написано, что "Авто".
Скорее всего около 1.2. Можешь линейкой померять расстояние между 2 линиями строк.
> у меня какая-то дурная кнопка получилась.
Сделай треугольник картинкой тогда
> Я что-то ничего не понял. Можно по шагам? Там вроде все одной картинкой сразу сделано, вот я так и вырезал.
Ну если невозможно, то жаль. Так, многовато 250 Кб на 1 картинку.
> верстальщиков не заставляют додумывать отзывчивый дизайн?
Обычно нет. Тут у нас и 2 макетов хватит.
> Сократить? По 2-3 сделать?
Там многие классы излишние: .back .img-back — тут явно back лишний.
Да, примерно так.
>>379959
long polling — это костыль для браузеов не поддеживающих вебсокеты, а не особая технология.
>>379960
Ну если тебе принципиально текст на тот случай написать, то да. А так, assert используют когда хотят указать какое-то условие, которое всегда должно соблюдаться.
>>379964
Тогда сделай в начале функции вывод x и y по которым произошел клик и посмотри в чем дело.
>>379976
> у меня потом еще один слайдер
Можно дать им разные классы, header-slider и feed-slider
> Кстати, я правильно там делаю, когда картинкам(в топ-меню иконкам, логотипу) задаю фиксированные размеры?
да
> Я вот не знаю какую ставить. В фш написано, что "Авто".
Скорее всего около 1.2. Можешь линейкой померять расстояние между 2 линиями строк.
> у меня какая-то дурная кнопка получилась.
Сделай треугольник картинкой тогда
> Я что-то ничего не понял. Можно по шагам? Там вроде все одной картинкой сразу сделано, вот я так и вырезал.
Ну если невозможно, то жаль. Так, многовато 250 Кб на 1 картинку.
> верстальщиков не заставляют додумывать отзывчивый дизайн?
Обычно нет. Тут у нас и 2 макетов хватит.
> Сократить? По 2-3 сделать?
Там многие классы излишние: .back .img-back — тут явно back лишний.
Оп, смотри код до 105 строки, дальше старые ненужные вещи, которые позже разберу.
Хочу реализовать вот что: все классы (Cell, Field, Game) независимы, но они при этом прослушивают друг друга. Cell сам обрабатывает события на себе и меняет свое состояние. Field открывает соседние ячейки, проверяет на на что-нибудь еще, например, на выигрыш, когда все мины пойманы. Ну а Game будет заниматься логикой.
Cell к примеру вообще не знает о Game и Field, а Field интересуется только своими ячейками.
Верны рассуждения?
Но я не знаю куда вынести события. Раз события вешаются на table, то и должны они быть вне 3-х классов. Но опять же в этих событиях начинаются различные проверки и тогда опять появляется путаница.
У меня в голове возник еще один вариант, можно уже пользоваться готовыми объектами-узлами и приписывать им свойства и методы?
Я хочу построить идеальную внутреннюю структуру этой игры на ООП, чтобы наконец разобраться во всех нюансах.
Какой структуры нужно придерживаться?
Хотя ответ правильный, но решение неверное. Тут надо сделать функцию расчета кредита и вызвать ее с разными аргументами. Код будет проще и короче.
Алсо, что с форматированием? Такой код надо пропускать через phpformatter.com прежде чем постить.
>>380005
Никаких
>>380020
Неплохо для начала, но да, надо определение победы (остались нераскрытыми только мины) и чтобы хотя бы надпись или окошечко появлялось, и возможность начать новую игру.
> if (!('className' in node)) {
> return false;
Это зачем? Когда оно срабатывает?
> node.className = node.className.split(klass).join('');
Это неприавльный код. Пример, есть className 'klass kla klasses' и мы пытаемся удалить kla
> (hasClass(node, klass)) ?
Тут нужно использовать if
> this.mineField = tableModel;
Одинаковые вещи надо называть одинаково
> if (this.mineField[y][x] === undefined)
Эта проверка сработает только для неприавльного x, для непраивльного y вылетит искючение так как будет
(undefined)[x]
> this.currentCell = this.mineField[y][x];
> return this.currentCell;
Странно, функция называется получитьКлеточку, но при этом она тихонько меняет какое-то свойство. Это неочевидно и неожиданно и потому плохо. Менять currentCell надо методом вроде задатьТекущуюКлеточку.
> table {
Если ты хочешь чтобы твою игру можно было поместить на любую страницу, надо использовать классы с префиксом, например
.sapper-table
.sapper-table td
Иначе ты меняешь вид таблиц не только в своей игре, а на всей странице.
> currentCell.setText(aroundMine);
Это можно написать один раз, а не два
> currentCell.setText('');
Я бы сделал у Cell методы toggleFlag() и showMine()
Алсо, по второму клику флаг должен убираться.
> this.mineField[yIndex][xIndex]
Это повторяется 4 раза подряд, нехорошо
> (aroundCells.isMine) ? mineCount++ : 0;
Тут нужен if, а не костыли
> addEventListener('contextmenu',
Это неприавльно. contextmenu — это событие попытки вызвать меню. Оно может быть вызвано например кнопкой справа от пробела или еще как-то. Тебе нужно не оно, а событие mousedown (для открытия клетки тоже), а в нем уже смотреть какая кнопка нажата.
Использование mousedown позволит избавиться от задержки которую вносит onclick
Хотя ответ правильный, но решение неверное. Тут надо сделать функцию расчета кредита и вызвать ее с разными аргументами. Код будет проще и короче.
Алсо, что с форматированием? Такой код надо пропускать через phpformatter.com прежде чем постить.
>>380005
Никаких
>>380020
Неплохо для начала, но да, надо определение победы (остались нераскрытыми только мины) и чтобы хотя бы надпись или окошечко появлялось, и возможность начать новую игру.
> if (!('className' in node)) {
> return false;
Это зачем? Когда оно срабатывает?
> node.className = node.className.split(klass).join('');
Это неприавльный код. Пример, есть className 'klass kla klasses' и мы пытаемся удалить kla
> (hasClass(node, klass)) ?
Тут нужно использовать if
> this.mineField = tableModel;
Одинаковые вещи надо называть одинаково
> if (this.mineField[y][x] === undefined)
Эта проверка сработает только для неприавльного x, для непраивльного y вылетит искючение так как будет
(undefined)[x]
> this.currentCell = this.mineField[y][x];
> return this.currentCell;
Странно, функция называется получитьКлеточку, но при этом она тихонько меняет какое-то свойство. Это неочевидно и неожиданно и потому плохо. Менять currentCell надо методом вроде задатьТекущуюКлеточку.
> table {
Если ты хочешь чтобы твою игру можно было поместить на любую страницу, надо использовать классы с префиксом, например
.sapper-table
.sapper-table td
Иначе ты меняешь вид таблиц не только в своей игре, а на всей странице.
> currentCell.setText(aroundMine);
Это можно написать один раз, а не два
> currentCell.setText('');
Я бы сделал у Cell методы toggleFlag() и showMine()
Алсо, по второму клику флаг должен убираться.
> this.mineField[yIndex][xIndex]
Это повторяется 4 раза подряд, нехорошо
> (aroundCells.isMine) ? mineCount++ : 0;
Тут нужен if, а не костыли
> addEventListener('contextmenu',
Это неприавльно. contextmenu — это событие попытки вызвать меню. Оно может быть вызвано например кнопкой справа от пробела или еще как-то. Тебе нужно не оно, а событие mousedown (для открытия клетки тоже), а в нем уже смотреть какая кнопка нажата.
Использование mousedown позволит избавиться от задержки которую вносит onclick
> все классы (Cell, Field, Game) независимы, но они при этом прослушивают друг друга.
Вообще, это усложнение. События (паттерн Observer) обычно используют при взаимодействии например компонентов от разных производителей, чтобы расширить их не залезая в их код. В твоем случае связь гораздо проще:
Field владеет и управляет всеми Cell
Game владеет и управляет Field
И потому тебе не нужна подписка на события. Game в любой момент может сделать this.field.doSmth(), а Field может сделать this.getCellAt(x, y).doSmthElse()
> Cell к примеру вообще не знает о Game и Field, а Field интересуется только своими ячейками.
Это верно.
> Cell сам обрабатывает события на себе
Это не получится так как Cell много, а обработчик клика будет один
> Но я не знаю куда вынести события.
Пусть Game слушает их и вызвает нужный метод Field вроде открытьЯчейку или поставитьФлажок. А тот уже меняет состояние нужной ячейки и делат еще что-то.
> можно уже пользоваться готовыми объектами-узлами и приписывать им свойства и методы?
Узлами DOM? Ой, что-то у меня ощущение что ты хочешь что-то усложнить и запутать. DOM нужен для изменений на странице, это средство отображения информации и все.
С 17 августа, где-то по 2 часа в день.
>со структурой ООП у меня опять косячно вышло.
Перфекционизмом не страдаю, по мне лучше написать кривую структуру чем не написать вовсепхп обезьяна жи есть А потом можно отрефакторить и сделать все по красоте.
>>380082
Это твой код? На мой взгляд ты совершенно напрасно в методе Field.prototype.createField используешь глобальный объект table. Логичней было бы чтобы класс получал скажем в конструкторе объект html таблицы. Ну и у Cell если есть isOpened то зачем тебе isClosed?
http://jsbin.com/lubewuqa/4/edit - гамбургеры. Там пока только makeSelection рабочая.
Слушай, makeAddative должна внутри makeSelection вызываться? Или нет?
Может все-таки order сделать свойством? Я просто не знаю, как мне потом работать с заказом, если он внутри makeSelection. Вызывать makeSelection внутри calcPrice и calcCalor? Как ему(makeSelection) тогда аргументы нужные передать?
Table это объект html. В ООП да и вообще в программировании глобальные переменные не приветствуются, но дело твое
>И потому тебе не нужна подписка на события
Так, про это подробнее расскажи.
Ты об этом: http://learn.javascript.ru/custom-events ?
Ты прав, исправлю.
Оп, я не понимаю как работает этот код.
Наверное это самая непонятная строка:
handlers.apply(this, [].slice.call(arguments, 1));
Наверное здесь trigger и вызывает событие. Поясни.
Почему все зависает, если на 95 строке написать:
this.cells[y] = [];
> function uncorrectHamb(message) {
Нехорошо, ты при каждом вызове makeSelection создаешь новую функцию. Зачем? Надо создать ее один раз, так:
Hamburger.IncorrectArgs = function ...
То же относится и к checkTypeHamb, checkFilling. Не надо этот бардак, когда функции создаются внутри функций, лучше сделать их методами Hamburger
> Слушай, makeAddative должна внутри makeSelection вызываться? Или нет?
Как хочешь, так и делай
> Может все-таки order сделать свойством?
Я тебя не понимаю. Есть гамбургер, у него ровно 3 свойства: размер, начинка, список добавок. Зачем что-то усложнять? какая от этого выгода?
Вот смотри, ты решил усложнить и складывать все в одно свойство вместо трех: this.order. Допустим, мы захотим написать метод getFilling(). В случае с 3 свойствами он пишется элементарно:
...getFilling = function () { return this.filling; }
В твоем случае, надо будет писать целый алгоритм по обходу массива order и определению, что именно там является начинкой. Мне кажется, нужно не усложнять жизнь и сделать обычные свойства.
> Я просто не знаю, как мне потом работать с заказом, если он внутри makeSelection.
Не понял, что значит «он внутри makeSelection»? Все, что нужно, ты можешь сохранить в свойства объекта.
> Вызывать makeSelection внутри calcPrice и calcCalor?
Зачем, не понимаю? Объясни, как ты представляешь себе использование этого класса.
>>380215
> node.getAttribute('class').
Есть свойство node.className, его писать короче.
> function hasClass(node, klass) {
Неплохо, но есть более короткий способ: добавляем к className справа и слева пробелы и ищем в нем как в строке подстроку ' ' + klass + ' '. Для удаления, можно удалять регулярным выражением.
Также, учти, что имена классов могут быть разделены не только пробелом. но и табом (\t) и переводом строки (\n).
> if (classes == klass) {
> classes.splice(i, 1);
Не удалит если один класс идет 2 раза подряд: http://jsbin.com/dakodalamayu/1/edit?console (последний пример)
совет возьми сразу несколько книг и читай одновременно
http://jsbin.com/hafiwatasaxi/2/edit - второе по DOM. Т.к ты еще не смотрел первый номер, то тут могут быть ошибки с этими функциями из первого. Там у меня проблемка: если много раз нажимать на одну и ту же клетку, то класс удаляется и добавляются все новые пробелы. Я не знаю как исправить.
> а во второй задаче надо вешать событие клика на всю таблицу?
Конечно
> Я пока думаю, что как-нибудь через event.clientX / event.clientY, но думаю, что это как-то сложно.
У события есть свойство target (учебник читал? прочти: http://learn.javascript.ru/bubbling-and-capturing#%D1%86%D0%B5%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82-event-target ). Ты можешь с его помощью определить на какой ячейке кликнули.
>>380338
> Ты об этом
Нет, я думал, ты хочешь использовать паттерн наблюдатель (observer), может я просто не так понял.
То, что там — это делается на джейквери за счет того, что у нее написан собственный аналог системы браузерных событий (вроде бы для одинакового поведения в разных браузерах). То есть получая событие от браузера, jQuery создает на его основе свой объект-событие и обходит узлы DOM, вручную вызвыая обработчики.
>>380349
Функция on добавляет в список обработчиков события указанную функцию. off — удаляет. trigger берет список добавленных ранее функций для данного события и вызывает их по очереди.
> [].slice.call(arguments, 1)
Это всего лишь такой хитрый способ применить метод массива slice к псевдомассиву arguments. slice делает копию массива начиная с 1-го элемента (пропуская нулевой)).
То есть это равносильно циклу:
var args = [];
for (i = 1; i < arguments.length; i++) {
args.push(arguments[ i ]);
}
apply вызывает указанную функцию с указанными аргументами и значением this.
Если ты не знаешь что делает apply или slice, погугли. Если ты не знаешь что такое псевдопеременная arguments, погугли.
В итоге, функция trigger вызвает все обработчики события, и при этом передает каждому свои аргументы, пропуская нулевой (так как в нем лежит eventName). B если мы вызовем
...trigger('something', 1, 2, 3);
То все обработчики будут вызваны по очереди с аргументами (1, 2, 3).
Она не зависает, а просто медленно работает. У меня в ФФ замораживается секунд на 10, но потом отвисает. Ты можешь узнать, в каком месте зависает, если сделаешь профайлинг.
В ФФ открой отладчик, перейди на вкладку Profile, нажми Start и потом запусти код на jsbin, подожди немного и останови профайлинг. После чего, сортируя и пробуя разные режимы, определи, что именно тормозит.
В Хроме профайлер тоже подвис, но я смог остановить яваскрипт, открыв вкладку Script и нажав кнопочку с паузой. После этого ты можешь кнопочками выполнить код пошагово и увидеть, что происходит и чему равны переменные (очень удобно, кстати). Или же ты можешь перейти на вкладку профайлера — он разблокировался, когда я поставил скрипт на паузу.
Попробуй это сделать. Важно, чтобы ты научился пользоваться профайлером и отладчиком.
Статья в помощь: http://habrahabr.ru/post/143767/
Открой fl.ru и поищи по слову ТЗ: https://www.fl.ru/search/?type=projects&search_string=%F2%E7&action=search
>>380502
Лучше бы ссылку на оглавление скинул.
Мне не нравится то, что там рекомендуется «method polymorphism», то есть когда методу можно передавать аргументы разных типов, это верный путь к бардаку.
Книга — cookbook (книга рецептов) то есть рассчитана не на изучение с нуля, а на тех, кто знает сам язык.
В первой главе используются плохие строковые функции (вроде substr) и обращение к строке как к массиву, которые не работают с utf-8. Книга рассчитана видимо на США, где может быть до сих пор используют ASCII, но для нас это точно неактуально. Нет смысла изучать эти дурные и неправильные примеры.
Сами примеры тоже сомнительные. Какой смысл пересказывать мануал по strpos? Чего только стоит это:
> 2.8 Taking Logarithms
> Problem
> You want to take the logarithm of a number.
> Solution. For logs using base e (natural log), use log()
Некоторые примеры поражают бесполезностью:
> 5.3 Exchanging Values Without Using Temporary Variables
Единственное, где это может понадобиться — на собеседовании.
В примерах используется $db->query, которая нигде не описана и вызовет ошибки при попытке начинающим выполнить код.
Используются preg_replace, но не объясняются регулярки. Без их знания (которое не совсем просто дается, скажет вам любой изучавший их анон) код не понять.
В главе 14.2 неправильно закодировано тело POST-запроса, & amp ; там не нужен
Не используется gettext(), почему?
Оформление кода не соответствуют стандартам, сам код часто лапша на функциях или длинная портянка.
Главы про дату/время, XML, локализацию более-менее полезны. Глава про Software Engineering (отладка, юнит-тесты) хороша, но она крошечная и читатель скорее всего ее пропустит толком не разобравшись.
В общем, книга малополезна, наполовину содержит пересказ мануала, не прививает навыки написания качественного кода.
>>380516
C PHP либо HTML/CSS
>>380531
Проверку на hasClass можно сделать чуть оптимальнее: заменяем \\s на пробелы в className, дописываем пробелы с краев и после этого ищем обычным поиском ' ' + klass + ' ' (без регулярок). Именно так сделана проверка в jQuery: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js#L148
> node.className = classes.replace(regexp, ' ').replace(regexp, ' ');
Зачем replace 2 раза? У тебя же флаг g стоит
При удалении класса, чтобы не копились пробелы в className, надо их удалять с краев с помощью функции trim (которую тебе тоже надо написать самому).
В addClass незачем возиться с массивом. Можно просто прибавить к className пробел (если оно не пустое) и имя класса.
Открой fl.ru и поищи по слову ТЗ: https://www.fl.ru/search/?type=projects&search_string=%F2%E7&action=search
>>380502
Лучше бы ссылку на оглавление скинул.
Мне не нравится то, что там рекомендуется «method polymorphism», то есть когда методу можно передавать аргументы разных типов, это верный путь к бардаку.
Книга — cookbook (книга рецептов) то есть рассчитана не на изучение с нуля, а на тех, кто знает сам язык.
В первой главе используются плохие строковые функции (вроде substr) и обращение к строке как к массиву, которые не работают с utf-8. Книга рассчитана видимо на США, где может быть до сих пор используют ASCII, но для нас это точно неактуально. Нет смысла изучать эти дурные и неправильные примеры.
Сами примеры тоже сомнительные. Какой смысл пересказывать мануал по strpos? Чего только стоит это:
> 2.8 Taking Logarithms
> Problem
> You want to take the logarithm of a number.
> Solution. For logs using base e (natural log), use log()
Некоторые примеры поражают бесполезностью:
> 5.3 Exchanging Values Without Using Temporary Variables
Единственное, где это может понадобиться — на собеседовании.
В примерах используется $db->query, которая нигде не описана и вызовет ошибки при попытке начинающим выполнить код.
Используются preg_replace, но не объясняются регулярки. Без их знания (которое не совсем просто дается, скажет вам любой изучавший их анон) код не понять.
В главе 14.2 неправильно закодировано тело POST-запроса, & amp ; там не нужен
Не используется gettext(), почему?
Оформление кода не соответствуют стандартам, сам код часто лапша на функциях или длинная портянка.
Главы про дату/время, XML, локализацию более-менее полезны. Глава про Software Engineering (отладка, юнит-тесты) хороша, но она крошечная и читатель скорее всего ее пропустит толком не разобравшись.
В общем, книга малополезна, наполовину содержит пересказ мануала, не прививает навыки написания качественного кода.
>>380516
C PHP либо HTML/CSS
>>380531
Проверку на hasClass можно сделать чуть оптимальнее: заменяем \\s на пробелы в className, дописываем пробелы с краев и после этого ищем обычным поиском ' ' + klass + ' ' (без регулярок). Именно так сделана проверка в jQuery: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js#L148
> node.className = classes.replace(regexp, ' ').replace(regexp, ' ');
Зачем replace 2 раза? У тебя же флаг g стоит
При удалении класса, чтобы не копились пробелы в className, надо их удалять с краев с помощью функции trim (которую тебе тоже надо написать самому).
В addClass незачем возиться с массивом. Можно просто прибавить к className пробел (если оно не пустое) и имя класса.
Вообще неплохо, вот замечания.
> body.insertAdjacentHTML
Копипаста из td. Надо от нее избавиться и генерировать программно.
> var table = body.firstChild;
Ненадежно. А что, если там в начале пробелы или другой элемент? Проще создавать table через createElement
Надпись в кнопке прыгает при наведении — ужасно.
В toggleClass лучше поставить вызовы addClass/removeClass
Если вместо click слушать событие mousedown то будет ощущение что клетки реагируют на нажатие быстрее, без задержки (для кнопки впрочем надо использовать click так как именно так работают все кнопки).
> <div
Есть тег button type="button". Может тебе список HTML-тегов стоит подучить?
У кого-то 10 секунд, а у меня минут 5 висит и не может развиснуть, в итоге приходится закрывать принудительно. Окно браузера недоступно.
Расскажи про observe. То есть запускается событие на Field и об этом Cell и Game должны знать?
У тебя Хром наверно. В ФФ завершается само через 10 секунд.
>>380627
Это используется в других ситуациях, например в MVC вью может подписаться на события изменения в модели и при их получении обновлять что-то на странице.
В сапере это точно не нужно.
А вообще сама идея паттерна Наблюдатель простая, есть объекты которые генерируют события когда что-то происходит, и есть объекты которые на них подписываются. Обычно это в MVC используется.
Значит можно через отладчк в Хроме поставить скрипт на паузу (отладчик надо открыть до запуска скриптов).
Почему на выводе пере variable1 куча пробелов?
Сапер мне надоел, хотя задача и погружает в жс с головой. Последний вопрос ОПу: нужно ли как-то убивать contextmenu? поделаю-ка я задачи на верстку пока
http://jsbin.com/qebovupucuke/3/edit - исправил.
>Зачем replace 2 раза? У тебя же флаг g стоит
Ну смотри, там в последней проверке(где много классов b), если убрать второй replace, то классы b не удаляться все(останется один). Там видимо получается так, что заменяем ' b ' на ' ',и продолжает искать со следующей позиции, а дальше 'b ', такая подстрока не подходит, и он ее пропускает. Вроде как-то так. Наверное можно как-то по проще, чем ставить второй replace.
>Копипаста из td. Надо от нее избавиться и генерировать программно.
http://jsbin.com/hafiwatasaxi/3/edit - попытался, но что-то не совсем получилось. Не могу сгенерировать таблицу, вроде все верно делал, но почему-то выдает только одну клетку.
http://ideone.com/0A0Eh7
А так нет:
http://ideone.com/myB5ix
В чем дело, не пойму. Алсо, тупиковая ветвь, как например с крепостью тоже записывается в путь. А так же я сделал на будущее проверку на время, которая в первом скрипте по сути сейчас должна быть бесполезна, так как мы все равно возвращаем первый попавшийся результат, но как оказалось без неё скрипт работать не хочет и возвращает NULL.
Потому, что все, что идет вне маркеров <?php ... ?> выводится как есть, например:
2 + 2 равняется <?php echo 2 + 2; ?>, так-то!
выведет
2 + 2 равняется 4, так-то!
У тебя перед <?php идут пробелы, они и выводятся.
>>380727
> Сапер мне надоел,
Ох, а у меня ведь много советов и замечаний по улучшению.
По поводу архитектуры, мне кажется, надо часть кода перенести в Cell. Например, вместо того чтобы в Field проверять состояние флага, проще сделать метод Cell.prototype.toggleFlag. Это задача клетки — вывести флажок, а не поля. Поле просто хранит список клеток и раздает им команды.
И по моему определение победителя работает неверно: http://imgur.com/oPYzTeC
> нужно ли как-то убивать contextmenu?
Если ты предотвращаешь реакцию на нажатие правой кнопки в mousedown, то contextmenu не должно сработать.
> if (!('className' in node)) {
Зачем это?
> var regexp = new RegExp('\\s' + klass + '\\s');
Неправильно, так как удалит в строке 'klass' подстроку 'kla'
> Math.floor(Math.random() column)
Это надо вынести в отдельную переменную или функцию, а то слишком длинная строчка получается
> Sapper.prototype.createGameResult =
Это удобнее сделать по-другому. Не стоит городить порятнку из createElement/appendChild. Делаем шаблон вида
<div>{message}</div>....
В нем соответственно заменяем {message} на текст сообщения, после чего создаем див и вставляем с помощью innerHTML в него HTML-код, и добавляем див на страницу.
Хранить шаблон можно прямо в строке (плохо так как в JS строки нельзя переносить) или в HTML-коде в теге скрипт (хорошо), как описано тут: http://javascript.ru/unsorted/templating
> this.table.parentNode.insertBefore(this.createGameResult
Лучше сделать функцию this.showMessage('...')
> this.currentCell.startFlashing();
Это должно быть не в gameOver, а наверно в openCellEvent
> currentCell.setText(aroundMine);
Повторяется 2 раза, можно не повторяться
> (aroundCells.isMine) ? mineCount++ : 0;
Тут нужен if
> document.addEventListener('click', function(event) {
> if (event.target.id == 'button_reload') {
Тут надо вешать событие на кнопку, например, при создании диалога.
ОП
Потому, что все, что идет вне маркеров <?php ... ?> выводится как есть, например:
2 + 2 равняется <?php echo 2 + 2; ?>, так-то!
выведет
2 + 2 равняется 4, так-то!
У тебя перед <?php идут пробелы, они и выводятся.
>>380727
> Сапер мне надоел,
Ох, а у меня ведь много советов и замечаний по улучшению.
По поводу архитектуры, мне кажется, надо часть кода перенести в Cell. Например, вместо того чтобы в Field проверять состояние флага, проще сделать метод Cell.prototype.toggleFlag. Это задача клетки — вывести флажок, а не поля. Поле просто хранит список клеток и раздает им команды.
И по моему определение победителя работает неверно: http://imgur.com/oPYzTeC
> нужно ли как-то убивать contextmenu?
Если ты предотвращаешь реакцию на нажатие правой кнопки в mousedown, то contextmenu не должно сработать.
> if (!('className' in node)) {
Зачем это?
> var regexp = new RegExp('\\s' + klass + '\\s');
Неправильно, так как удалит в строке 'klass' подстроку 'kla'
> Math.floor(Math.random() column)
Это надо вынести в отдельную переменную или функцию, а то слишком длинная строчка получается
> Sapper.prototype.createGameResult =
Это удобнее сделать по-другому. Не стоит городить порятнку из createElement/appendChild. Делаем шаблон вида
<div>{message}</div>....
В нем соответственно заменяем {message} на текст сообщения, после чего создаем див и вставляем с помощью innerHTML в него HTML-код, и добавляем див на страницу.
Хранить шаблон можно прямо в строке (плохо так как в JS строки нельзя переносить) или в HTML-коде в теге скрипт (хорошо), как описано тут: http://javascript.ru/unsorted/templating
> this.table.parentNode.insertBefore(this.createGameResult
Лучше сделать функцию this.showMessage('...')
> this.currentCell.startFlashing();
Это должно быть не в gameOver, а наверно в openCellEvent
> currentCell.setText(aroundMine);
Повторяется 2 раза, можно не повторяться
> (aroundCells.isMine) ? mineCount++ : 0;
Тут нужен if
> document.addEventListener('click', function(event) {
> if (event.target.id == 'button_reload') {
Тут надо вешать событие на кнопку, например, при создании диалога.
ОП
Первая задача: тут не нужен float, все гораздо проще, делается только за счет выставления маргинов.
Вторая задача: в общем, верно, но куда потерялись паддинги и бордер у зеленого блока?
> классы не удалятся все(останется один).
Вообще верно, проблема есть, но 2 раза делать replace — не решение (так как класс может повторяться хоть 10 раз). Надо тогда либо переписать регулярку на использование assertions (по типу ( ? = ...)) либо вызвать replace в цикле, либо разложить список классов в массив и удалять элементы.
> trim
Это делается проще через одну регулярку и replace
> if ( ... + 1 )
Почему не проверка что меньше 0 ? По моему, это усложняет понимание кода
> присутствует слово из спам листа
http://paste2.org/Kp4Vpe7C
>>380862
> , ОП, вот так работает:
тут тоже есть ошибка. Смотри:
foreach ($paths[$point] as $key => $val) {
....
$pathDone[] = $key;
Ты добавляешь все проверенные вершины в один массив, а это неверно, надо на каждом шаге цикла делать переменную-копию pathDone и добавлять вершину туда, в копию — иначе некоторые маршруты не будут проверяться.
То есть если у нас есть путь vas, teh и мы проверяем в цикле варианты kre, let, dvo то у тебя pathDone принимает значения:
vas, teh, kre
vas, teh, kre, let
vas, teh, kre, let, dvo
А должно быть
vas, teh, kre
vas, teh, let
vas, teh, dvo
Точно также, неправильно считается время.
> (!$paths){
> return $container;
А в чем смысл той проверки во втором варианте? Не понимаю. И что, если условие не сработает то ты возвращаешь null? Это правильно?
> В чем дело, не пойму
Сдампи $paths. И вообще, сделай чтобы программа выводила какие-то подробности о том, что она проверяет.
> присутствует слово из спам листа
http://paste2.org/Kp4Vpe7C
>>380862
> , ОП, вот так работает:
тут тоже есть ошибка. Смотри:
foreach ($paths[$point] as $key => $val) {
....
$pathDone[] = $key;
Ты добавляешь все проверенные вершины в один массив, а это неверно, надо на каждом шаге цикла делать переменную-копию pathDone и добавлять вершину туда, в копию — иначе некоторые маршруты не будут проверяться.
То есть если у нас есть путь vas, teh и мы проверяем в цикле варианты kre, let, dvo то у тебя pathDone принимает значения:
vas, teh, kre
vas, teh, kre, let
vas, teh, kre, let, dvo
А должно быть
vas, teh, kre
vas, teh, let
vas, teh, dvo
Точно также, неправильно считается время.
> (!$paths){
> return $container;
А в чем смысл той проверки во втором варианте? Не понимаю. И что, если условие не сработает то ты возвращаешь null? Это правильно?
> В чем дело, не пойму
Сдампи $paths. И вообще, сделай чтобы программа выводила какие-то подробности о том, что она проверяет.
>А в чем смысл той проверки во втором варианте? Не понимаю. И что, если условие не сработает то ты возвращаешь null? Это правильно
Ну смотри, мне же нужно, чтобы программа проверила все шаги, прежде чем вернуть окончательное значение. Для этого я и сделал проверку, остались ли непроверенные точки.
Боюсь вводить в непонятный интерфейс. алсо, как неудобно это всплывающее окно, закрывающее текст поста.
>>380894
> var newClasses = node.className.replace(new RegExp('(\\s+|^)' + klass + '(\\s+|$)', 'g'), ' ');
Мы тут обнаружили, что это не работает когда класс повторяется много раз подряд вроде a b b b b b с — заменяет не все классы.
> Field.prototype.openCell
Название не соответствует действию. Надо назвать setupClickListener или как-то так.
> dom.addEvent(this.table, 'contextmenu',
Ты путаешь виды событий. contextmenu - это открытие меню, которое может открываться не только мышью но и клавиатурой. Тебе нужно события mousedown которое обозначает нажатие кнопки мыши
> this.cells[this.getCellIndex(target)].isOpened = true;
Не лезь внутрь другого класса, а вызывай метод.
> generateMines
Код ненадежный, так как нет никакой защиты от вечного цикла. Надо примерно так:
var mineCount = 0, i;
for (i = 0; i < 10 needMines && mineCount < needMines; i++) {
....
если удалось поставить мину то mineCount++;
}
Или же сделать массив свободных клеточек и выбирать место для мины из него.
> cellIndex < 0 || cellIndex > this.width - 1 || this.cells[cellIndex].isOpened || cellIndex === this.cells.indexof(cell) || !this.cells[this.getCellIndex(cellIndex)].isRigged
Нельзя так писать, так как это нечитаемо. Надо писать вроде такого:
if (!this.cellExists(x, y)) {
continue;
}
var cell = this.getCellAt(x, y);
...
Клетки проще и удобнее хранить в 2-мерном массиве, чем мучаться с этими заморочными расчетами нужного индекса. Зачем?
Боюсь вводить в непонятный интерфейс. алсо, как неудобно это всплывающее окно, закрывающее текст поста.
>>380894
> var newClasses = node.className.replace(new RegExp('(\\s+|^)' + klass + '(\\s+|$)', 'g'), ' ');
Мы тут обнаружили, что это не работает когда класс повторяется много раз подряд вроде a b b b b b с — заменяет не все классы.
> Field.prototype.openCell
Название не соответствует действию. Надо назвать setupClickListener или как-то так.
> dom.addEvent(this.table, 'contextmenu',
Ты путаешь виды событий. contextmenu - это открытие меню, которое может открываться не только мышью но и клавиатурой. Тебе нужно события mousedown которое обозначает нажатие кнопки мыши
> this.cells[this.getCellIndex(target)].isOpened = true;
Не лезь внутрь другого класса, а вызывай метод.
> generateMines
Код ненадежный, так как нет никакой защиты от вечного цикла. Надо примерно так:
var mineCount = 0, i;
for (i = 0; i < 10 needMines && mineCount < needMines; i++) {
....
если удалось поставить мину то mineCount++;
}
Или же сделать массив свободных клеточек и выбирать место для мины из него.
> cellIndex < 0 || cellIndex > this.width - 1 || this.cells[cellIndex].isOpened || cellIndex === this.cells.indexof(cell) || !this.cells[this.getCellIndex(cellIndex)].isRigged
Нельзя так писать, так как это нечитаемо. Надо писать вроде такого:
if (!this.cellExists(x, y)) {
continue;
}
var cell = this.getCellAt(x, y);
...
Клетки проще и удобнее хранить в 2-мерном массиве, чем мучаться с этими заморочными расчетами нужного индекса. Зачем?
Это недостаток javascript.ru. Оно есть тут например: https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement
Но ты можешь использовать createElement + appendChild, это ничем не хуже.
>>380897
trim() можно упростить за счет регулярки и replace. Тем болеее что у тебя он только один пробел удаляет.
> replace('\\s', ' ')
\\s внутри строки обозначает просто 2 символа \ и s. Надо использовать регулярку, чтоыб это работало. Плюс, в JS в регулярках надо писать один бекслеш, а не два (так как там это конструкция языка, а не строка).
По removeClass я в прошлый раз замечания написал, там тоже не совсем верно сделано
Вместо цикла по i лучше сделать 2 вложенных цикла по x и y
> var button = document.getElementsByTagName('button')[0];
Ненадежно, используй поиск по id
В event listener надо бы проверять что кликнули именно по td а не куда-то еще.
>>380900
А ты понимаешь, что внутри каждого вызова функции своя локальная копия массива $paths и unset удаляет только один элемент в этой локальной копии?
Исправил - http://jsbin.com/qebovupucuke/4/edit. Не знаю насчет trim, там какая-то странная и не совсем мне понятная регулярка получилась. Как по-другому - не знаю.
> Не знаю насчет trim, там какая-то странная и не совсем мне понятная регулярка получилась.
Не, неправильно. В новых браузерах с ES5 есть метод trim() у строк, а для старых , пишется он элементарно: http://stackoverflow.com/a/498978
> node.className.replace('\\s', ' ')
\\s в данном случае не регулярка, а обычная строка из бекслеша и буквы s и не несет специального смысла.
Дописал тест для не-пробелов: http://jsbin.com/johesetoyofe/1/edit?js,console
Может это вдохновит новичков.
не работаю, учу пхп в пхп треде, пхп вся моя жызнь, без пхп и трипкода я лох.
>>380893
>но куда потерялись паддинги и бордер у зеленого блока?
А вот же padding: 0 10px;. Там что-то еще есть? У меня вообще проблема с определением элементов дизайна на глаз.
> document.addEventListener('click', function(event) {
> if (event.target.id == 'button_reload') {
>Тут надо вешать событие на кнопку, например, при создании диалога.
Я когда на локалочке пишу все event-ы у меня в функции window.onload т.е. связывание происходит когда загружается весь дом. Как мне повесть событие на кнопку если ее при window.onload? Я просто делегировал событие - это не правильно? Знаю что в жквери есть функция live для этого.
> пишу все event-ы у меня в функции window.onload
Это неправильно. load срабатывает после загрузки всех компонент страницы. в том числе картинок. Если на странице есть какие-нибудь внешние скрипты вроде кнопок лайков, которые иногда долго грузятся, то все это время твоя страница не будет реагировать на клики. Нельзя так делать.
Чуть более правильно (но по прежнему не идеально) — вешать события на DomContentLoaded ( $(function () {....}) или $(document).ready(...) ). Оно срабатывает после полной загрузки html-файла страницы. Так делают во многих блогах, особенно западных (ну что с них возьмешь, на западе очень много непрофессионализма), на хабре, в учебниках и статьях.
Либо, что то же самое, делать это в блоке скрипт в самом конце страницы.
Это тоже неидеально, так как если в подвале стоит подключение какого-нибудь тормозного скрипта типа рекламы, социальных кнопок или яндекс-карт (которые иногда подвисают секунд на 10-20) то мы опять же получаем неработающую страницу. Если скриптов нет, то проблем нет, если только мы не имеем длинную страницу и медленное соединение.
По моему, иделаьный вариант — либо использовать аттрибуты:
<button onclick="..." (плюньте в хипстеров которые говорят что это немодно, этот способ работает уже лет 20)
либо вешать обработчик перед вставкой в DOM:
button = createElement(...);
button.addEventListener('click', ...)
В твоем случае удобно вешать обработчик после вставки диалога в DOM.
>Я просто делегировал событие - это не правильно?
Ошибки тут нет, но это излишне, слушать клики со всей страницы ради единственной кнопочки. Логичнее обработчик на эту кнопку и повесить, разве нет?
>>380923
> Там что-то еще есть?
Посмотри картинку, там зеленый прямоугольник в рамке.
> Третье задание
> margin-right: 5px;
А почему 5, а не 10? Прочти-ка статью: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html
А так, верно.
Я не догоняю, как у меня может
>То есть если у нас есть путь vas, teh и мы проверяем в цикле варианты kre, let, dvo
Kre, let, dvo это соседние пути нашей точки? Если так, то
$pathDone не может принимать значения vas, teh, kre, let, dvo
как ты написал, он выберет одну соседнюю, и дальше уже пойдет вложенный цикл для это самой соседней точки, который в свою очередь запустит еще один, пока мы не достигнем конечной точки.
Но ведь в изначальном доме нет кнопки, как мне именно на нее повесить событие?
http://rghost.ru/57630860 С гитом я пока не разобрался еще, а пора бы.
Вопрос в том, как вот эту часть лучше всего организовать, чтобы пользователь свою страницу мог посещать, а другие — нет? В голову приходит какая-то постная, слишком сложная хуйня, мне кажется, все можно сделать удобнее и эффективнее. Сначала подумал назначать модели страниц id пользователя (через один-ко-многим), который ее создал, и при посещении проверять сначала активацию, если неактивирована, то совпадение пользовательского id, но мне кажется, это абсолютно идиотский подход.
Пардон, проглядел пост >>380925
>либо вешать обработчик перед вставкой в DOM:
Не хотелось бы использовать addEventListener в своих классах. Может у меня MVC головного мозга, но стойкое желание убрать любые обращения во внешний мир суть action контроллеров из классов суть моделей так что я бы заюзал атрибуты.
jsBin что-то сбоит, закинул на jsfiddle. Думал сегодня доделаю, хотел уже проверять, но возникла проблема. По клику выводит ошибку:
this.openCell is not a function
В принципе, понятно почему так происходит, но мне просто необходимо запустить функцию openCell. Оп, подскажи. Может как по-другому можно?
Можешь еще остальное глянуть, я немного поправил.
> Kre, let, dvo это соседние пути нашей точки?
Да
> $pathDone не может принимать значения vas, teh, kre, let, dvo
А ты поставь echo и проверь, может или не может. Я думаю, что может. Я тебе в очередной раз советую выводить на каждом шаге в какой точке мы находимся и какую проверяем.
> он выберет одну соседнюю, и дальше уже пойдет вложенный цикл для это самой соседней точки, который в свою очередь запустит еще один, пока мы не достигнем конечной точки
Рано или поздно мы вернемся из всех вложенных вызовов функций, и сработает например это условие
> if ($time > $container['time']) {
> continue;
И мы продолжим выполнять цикл, добавляя еще одну точку в pathDone.
>>380949
Определенно пора разобраться. А то посмотри, ты даешь нам архив, в нем лежит adminer.php, который явно не ты написал, плюс у некоторых файлов лежат лишние копии.
Сейчас еще напишу. Замечаний много.
У тебя в коде серьезная уязвимость под названием SQL-инъекция:
> VALUES (now(), \''.$_POST["post_text"].'\');');
Нельзя подставлять значения напрямую в текст запроса, так как злоумышленник может легко, подставив кавычки, дописать к запросу что угодно. Не знаю, можно ли воспользоваться уязвимостью тут, но в общем обычно sql-уязвимость позволяет злоумышленнику получить полную структуру БД, получить данные из любых таблиц (в том числе например логины пользователей), иногда читать файлы и в особо тяжелых случаях (MS SQL сервер где разрешено выполнение внешних команд) получить возможность выполнять команды на взломанном сервере.
Чтобы уязвимости не было, нужно как минимум экранировать вставляемые данные, а лучше, использовать плейсхолдеры, как описано тут: http://habrahabr.ru/post/137664/
Сам код у тебя смешан в кучу. Ты смешиваешь логику на PHP (например получение данных из БД или вставку) и их представление в виде HTML в одном файле. Это недопустимо, так как получается каша. Не знаю, где такому учат, но это неправильно. Надо разделять код: в одном ты получаешь данные из базы, в другом ты их выводишь на страницу. Почитай: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Я вижу, у тебя используется шаблон, но зачем ты тогда html код пишешь в index.php? Его там быть не должно.
mysql_ функции давно устарели, да и сам процедурный подход. Используй PDO или хотя бы mysqli (лучше PDO).
> function DB
Так было принято объявлять конструктор в PHP4 10 лет назад. Не знаю, где ты откопал такой старый учебник, но сейчас классы в PHP другие (конструктор пишется как public function _ _ construct). Я советую прочитать весь раздел по ООП, чтобы изучить новые особенности PHP: http://php.net/manual/ru/language.oop5.php
> </br>
У br нет закрывающего тега. Правильно просто <br>
> <DOCTYPE html>
Непраивльно пишешь доктайп, изучай http://htmlbook.ru/html/!doctype
> <input type="submit" />
Слеш в конце одиночных тегов пишут в XML и XHTML, а HTML его не пишут. История: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/
В общем, пока на двоечку с плюсом. Исправляйся.
У нас кстати есть задачка посложнее, для тех кто знает основы PHP, MySQL и хочет сделать сайт: https://gist.github.com/codedokode/9424217 — эта задачка поможет тебе освоить микрофреймворк Slim и изучить многие вещи, нужные для разработки сайтов с современным походом.
У тебя в коде серьезная уязвимость под названием SQL-инъекция:
> VALUES (now(), \''.$_POST["post_text"].'\');');
Нельзя подставлять значения напрямую в текст запроса, так как злоумышленник может легко, подставив кавычки, дописать к запросу что угодно. Не знаю, можно ли воспользоваться уязвимостью тут, но в общем обычно sql-уязвимость позволяет злоумышленнику получить полную структуру БД, получить данные из любых таблиц (в том числе например логины пользователей), иногда читать файлы и в особо тяжелых случаях (MS SQL сервер где разрешено выполнение внешних команд) получить возможность выполнять команды на взломанном сервере.
Чтобы уязвимости не было, нужно как минимум экранировать вставляемые данные, а лучше, использовать плейсхолдеры, как описано тут: http://habrahabr.ru/post/137664/
Сам код у тебя смешан в кучу. Ты смешиваешь логику на PHP (например получение данных из БД или вставку) и их представление в виде HTML в одном файле. Это недопустимо, так как получается каша. Не знаю, где такому учат, но это неправильно. Надо разделять код: в одном ты получаешь данные из базы, в другом ты их выводишь на страницу. Почитай: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Я вижу, у тебя используется шаблон, но зачем ты тогда html код пишешь в index.php? Его там быть не должно.
mysql_ функции давно устарели, да и сам процедурный подход. Используй PDO или хотя бы mysqli (лучше PDO).
> function DB
Так было принято объявлять конструктор в PHP4 10 лет назад. Не знаю, где ты откопал такой старый учебник, но сейчас классы в PHP другие (конструктор пишется как public function _ _ construct). Я советую прочитать весь раздел по ООП, чтобы изучить новые особенности PHP: http://php.net/manual/ru/language.oop5.php
> </br>
У br нет закрывающего тега. Правильно просто <br>
> <DOCTYPE html>
Непраивльно пишешь доктайп, изучай http://htmlbook.ru/html/!doctype
> <input type="submit" />
Слеш в конце одиночных тегов пишут в XML и XHTML, а HTML его не пишут. История: http://softwaremaniacs.org/blog/2005/12/19/xhtml-you-say/
В общем, пока на двоечку с плюсом. Исправляйся.
У нас кстати есть задачка посложнее, для тех кто знает основы PHP, MySQL и хочет сделать сайт: https://gist.github.com/codedokode/9424217 — эта задачка поможет тебе освоить микрофреймворк Slim и изучить многие вещи, нужные для разработки сайтов с современным походом.
> Сначала подумал назначать модели страниц id пользователя (через один-ко-многим), который ее создал, и при посещении проверять сначала активацию, если неактивирована, то совпадение пользовательского id
Так и надо делать.
>>380957
У него привязка не к браузеру, а к аккаунут пользователя как я понял. Пользователь может например с нескольких устройств на сайт заходить, и куки никак не помогут.
>>380977
> Не хотелось бы использовать addEventListener в своих классах
Так я предлагаю использовать в той же функции где окошко и создается. Раз уж ты createElement и appendChild вовсю используешь, от addEventListener хуже не станет.
> но стойкое желание убрать любые обращения во внешний мир суть action контроллеров из классов суть моделей
Это правильная идея. Но appendChild, или просто обращение к window/document — это такое же обращение во внешний мир. И оно у тебя есть.
Лол, этого ОП-а петушка еще не забанили?
Задачки вижу остались такими же быдлокодерскими. ОП-не исправим, лал.
>>379952
>Самостоятельное изучение тоже может быть плохо
Что ты несешь, долбоеб? Самые лучшие прогеры в мире, беспорно, - самоучки. Это они диктуют культуру читаемого кода и предлагают сетевые стандарты, гикнутые самоучки, а не обезьянки вроде тебя, так что лезь под шконарь, кукаретик блядь.
>Мы быдлокод заставляем исправлять.
Быдлокод на быдлокод? Да ты шутник дохуя.
>Учитесь лучше в нашем треде.
А может новички сами решат, где им учится, а петушок? Не кукарекай там из под шконоря, пока не разрешат. Охуеть просто.
Задание 4 — почти верно, только надо еще пиксель-два паддинга на спаны добавить, посмотри на картинку, там паддинг есть на цветных прямоугольниках. И шрифт крупнее сделай, как на картинке.
Задание 5 — не доделано же? Я только загловок вижу.
>>380994
Значение this не передается, как переменные в замыкании, во внутреннюю функцию. но можно скопировать this в обычную переменную. В твоем случае, можно сделать так:
Field.prototype.clickListener = function() {
var self = this;
dom.addEvent(this.table, 'click', function(e) {
....
self.openCell(...);
Другой вариант — использовать привязку функции к значению this:
function handler(e) { ... }
addEventListener(...., handler.bind(this)); // в новых браузерах с ES5 у функций есть метод bind
Решал ли ты задачки которые идут перед задачами на DOM? Там есть одна задачка вроде бы на эту тему.
> Можешь еще остальное глянуть
Не работает же вроде, на клики не реагирует.
> if (cell.hasMine) {
HasMine — это же метод, без скобок он всегда будет срабатывать
> markCell
Надо переименовать метод, он не помечает ячейку, а устанавливает обработчик клика по ней.
> if (target.tagName == 'TD' && target.innerHTML === '' && e.button == 2) {
> target.innerHTML = '⚑';
Неправильно. обработчик не должен менять текст в ячейке, а должен лишь вызвать метод toggleFlag() у нужной Cell. Каждый должен заниматься своим делом.
contextmenu предотвращать не надо, и так должно работать.
Массив ячеек лучше сделать 2-мерным.
> .generateMines
Она не гарантирует что мин будет сколько требуется так как i считает только до this.mines
> getNumberAroundMines = function(cell) {
Надо передавать сюда не DOM ноду, а объект Cell
Что-то печально у тебя с архитектурой все. Каждый должен заниматься своим делом:
— Cell управляет данной ему ячейкой таблицы, в том числе выводом там разных значков и сменой классов. Знает, есть ли в ячейке мина или флажок.
— Field хранит коллекцию Cell, слушает события, вызывает их методы при приходе события. Не пытается сам менять что-то в ячейке, а вызывает для этого метогды Cell.
Задание 4 — почти верно, только надо еще пиксель-два паддинга на спаны добавить, посмотри на картинку, там паддинг есть на цветных прямоугольниках. И шрифт крупнее сделай, как на картинке.
Задание 5 — не доделано же? Я только загловок вижу.
>>380994
Значение this не передается, как переменные в замыкании, во внутреннюю функцию. но можно скопировать this в обычную переменную. В твоем случае, можно сделать так:
Field.prototype.clickListener = function() {
var self = this;
dom.addEvent(this.table, 'click', function(e) {
....
self.openCell(...);
Другой вариант — использовать привязку функции к значению this:
function handler(e) { ... }
addEventListener(...., handler.bind(this)); // в новых браузерах с ES5 у функций есть метод bind
Решал ли ты задачки которые идут перед задачами на DOM? Там есть одна задачка вроде бы на эту тему.
> Можешь еще остальное глянуть
Не работает же вроде, на клики не реагирует.
> if (cell.hasMine) {
HasMine — это же метод, без скобок он всегда будет срабатывать
> markCell
Надо переименовать метод, он не помечает ячейку, а устанавливает обработчик клика по ней.
> if (target.tagName == 'TD' && target.innerHTML === '' && e.button == 2) {
> target.innerHTML = '⚑';
Неправильно. обработчик не должен менять текст в ячейке, а должен лишь вызвать метод toggleFlag() у нужной Cell. Каждый должен заниматься своим делом.
contextmenu предотвращать не надо, и так должно работать.
Массив ячеек лучше сделать 2-мерным.
> .generateMines
Она не гарантирует что мин будет сколько требуется так как i считает только до this.mines
> getNumberAroundMines = function(cell) {
Надо передавать сюда не DOM ноду, а объект Cell
Что-то печально у тебя с архитектурой все. Каждый должен заниматься своим делом:
— Cell управляет данной ему ячейкой таблицы, в том числе выводом там разных значков и сменой классов. Знает, есть ли в ячейке мина или флажок.
— Field хранит коллекцию Cell, слушает события, вызывает их методы при приходе события. Не пытается сам менять что-то в ячейке, а вызывает для этого метогды Cell.
>Задание 5 — не доделано же? Я только загловок вижу.
jsBin что ты делаешь, прекрати. Не любил же я этот сайт, вот теперь придется все делать заново хорошо там делать особо нечего
Учил джаву три месяца - бросил, т.к. унылое говно, которое вообще неясно, где применяется. Хочется чего-то более жизненного.
У ОПа прошу какое-нибудь задание, чтобы не совсем для нуба в кодинге, но для нуба в пхп.
http://jsbin.com/dagoxeleburo/31/
По правому клику:
document.getElementById(...).rows is not a function строка 74
Хотя table раньше добавляется в документ, чем запускается функция toggleFlag. Это даже визуально видно.
По левому клику: везде цифра 4. Код проверочный на 233 строке вообще игнорируется.
Джаву можно применять там же, где и php. Бери какой-нибудь play или spring mvc, если нужен веб.
Вместо h3 логичнее использовать h1
Шрифт заголовка должен быть крупнее и другой (Trebuchet MS).
Вертикальные расстояния между пунктами меню должны быть больше.
Текст не должен загибаться под меню.
>>381057
Так как мы не знаем твой уровень знания PHP, то давай начнем с первого задания из этого урока: http://archive-ipq-co.narod.ru/l1/regexp.html
> Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Когда сделаешь программу, чтобы проверить то все верно, сделай, чтобы она сама себя проверяла на таких номерах:
Правильные: 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' // нет +
);
Если ты хорошо знаешь PHP, то ты эту и другие простые задачки за 5 минут решишь.
У нас есть задачки типа «сделать сайт-файлообменник на фреймворке», но чтобы к ним перейти, надо сначала как следует изучить сам PHP и ООП, и познакомиться с основами HTML.
Если что-то непонятно или есть каике-то вопросы, задавай. Зашел в тупик? Покажи код и напиши что непонятно.
Вместо h3 логичнее использовать h1
Шрифт заголовка должен быть крупнее и другой (Trebuchet MS).
Вертикальные расстояния между пунктами меню должны быть больше.
Текст не должен загибаться под меню.
>>381057
Так как мы не знаем твой уровень знания PHP, то давай начнем с первого задания из этого урока: http://archive-ipq-co.narod.ru/l1/regexp.html
> Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Когда сделаешь программу, чтобы проверить то все верно, сделай, чтобы она сама себя проверяла на таких номерах:
Правильные: 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' // нет +
);
Если ты хорошо знаешь PHP, то ты эту и другие простые задачки за 5 минут решишь.
У нас есть задачки типа «сделать сайт-файлообменник на фреймворке», но чтобы к ним перейти, надо сначала как следует изучить сам PHP и ООП, и познакомиться с основами HTML.
Если что-то непонятно или есть каике-то вопросы, задавай. Зашел в тупик? Покажи код и напиши что непонятно.
Тогда давай использовать отладчик. Все равно ты должен уметь им пользоваться. Неплохой отладчик идет вместе с Хромом. Удобнее наверно отлаживать код на странице просмотра результата (а не там где идет редактирование).
Чтобы приступить к отладке, открой Ctrl + Shift + I, там вкладку Sources, выбери файл с твоим кодом (можно поиском через Ctrl + P, можно в панели слева), и поставь точку останова в начале интересующей функции, например openCell (чтобы поставить точку останова, найди нужную строчку и щелкни по цифре с номером строки).
Теперь щелкай по клеточкам или куда-то еще, чтобы вызвалась функция openCell. Когда выполнение дойдет до брейкпойнта, скрипт остановится, и ты сможешь в отладчике просматривать значения переменных (наводя на них мышку или используя вкладку watch), ты можешь по шагам выполнять код (кнопками сверху) и изучать что происходит.
На вкладке Call stack ты можешь видеть стек вызовов функций и переключаться между ними. Также, ты можешь зайти в консоль и выполнить какой-то код или посмотреть значение переменной внутри выбранной функции.
В общем, научись пользоваться отладчиком и заодно выясни в чем причина.
Лучше, как я сказал, использовать Хром, в фаерфоксе нужно устанавливать firebug, встроенный отладчик там слабенький.
<?php
$ch = curl_init("https://2ch.hk/index.html");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_HEADER, true);
curl_exec($ch);
curl_close($ch);
При указании своей страницы на бесплатном хосте по http все возвращает, и заголовок и страницу. В этом же случае вообще тишина, даже заголовка с ошибкой нет.
Оп, ну пошагово могу пройти. Но все равно не могу разобраться, где есть что.
Поставил метку на функции openCell по клику ничего не происходит. Отладчик там останавливается только по перезагрузке страницы.
Метка на toggleFlag тоже ничего не меняет.
Да и с куками только в теории знаком. На практике еще ни разу с ними не работал. Я думал что они используются для хранения информации о юзере у него в браузере, что бы при повторном посещении его опознать. Как они на получение страницы через curl влияют?
У 2ch клаудфайр проверяет наличие куки "_cf" или что-то типа того. Я только с libcurl на с++ дело имел, там такая вот функция есть.
curl_easy_setopt( m_pCurlHandle, CURLOPT_COOKIEFILE, "" );
И еще есть возможность задать буфер ошибки.
curl_easy_setopt( m_pCurlHandle,CURLOPT_ERRORBUFFER,m_pErrorBuffer);
Программа считает переплату.
<?php
function creditCalculate($credit_sum, $precent, $peni, $months) {
$sum = ($credit_sum $precent) + ($peni $months);
$over = $sum - $credit_sum;
return $over;
}
$bank1 = creditCalculate(39999, 1.04, 500, 12);
$bank2 = creditCalculate(39999, 1.03, 1000, 12);
$bank3 = creditCalculate(39999, 1.02, 0, 12);
echo "В банке HomoBank переплата составит: {$bank1}<br>";
echo "В банке Saberbank переплата составит: {$bank2}<br>";
echo "В банке Motherfaka переплата составит: {$bank3}<br>";
?>
Какие замечания?
Я не тот анон, но задачку с номерами сделал. И, как мне кажется, довольно компактно. Пикрилейтед.
Правильные: 84951234567, 8(495)1234567, 8-495-123-45-67, 8(495)123-45-67.
Остальные - неправильные.
381179-анон
Теперь программа проверяет формат номера, допущенные выводит на экран в формате 84951234567, в остальных случаях - вывод сообщения и exit.
Ты неприавльно поставил брейкопйнт. Надо ставить на первой строке тела функции а не на строчке где эта функция определяется (так как в этом случае оно срабатывает в момент создания функции а не в момент ее выполнения) .
(тут ставить не надо) function lalala()
{
(ставить надо тут) var x = 1;
.....
}
Логи сервера. Если ты запускаешь на хостинге, то логи либо лежат где-нибудь в папочке logs, либо доступны в панели управления. Найди там «лог ошибок» или error.log и посмотри текст ошибки.
Или в скрипте включи отобажаение ошибок например через ini_set.
Я не могу тебе помочь если ты не можешь нормально написать в чем именно ошибка и что выводится.
Начни отсюда
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
Алсо, запости код, и напиши в каком именно месте застрял.
Какой смысл смотреть готовое решение? Ну увидишь ты там реализацию того же Дейкстры и ничего не поймешь и что дальше? В вики он понятнее объясняется, да еще и с картинками.
>>381158
В PHP вроде чтобы получить ошибку есть функция curl_error.
>>381197
Проверь еще по большому списку:
Правильные: 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' // нет +
);
Начни отсюда
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
Алсо, запости код, и напиши в каком именно месте застрял.
Какой смысл смотреть готовое решение? Ну увидишь ты там реализацию того же Дейкстры и ничего не поймешь и что дальше? В вики он понятнее объясняется, да еще и с картинками.
>>381158
В PHP вроде чтобы получить ошибку есть функция curl_error.
>>381197
Проверь еще по большому списку:
Правильные: 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' // нет +
);
http://jsbin.com/dagoxeleburo/37/edit?js,output
Разобрался. В ФФ удобнее даже. Но проблема с рекурсией в openCell.
Пиздец я еблан, нашел фейл.
Смотри, это хорошо, что ты проверил свою программу, но как ее проверим мы? Надо сделать немного по-другому. Скопируй массивы с плохими и хорошими номерами в свою программу и сделай, чтобы она в цикле их перебирала и проверяла регуляркой (и писала, правильно все или нет). И тогда увидим, все ли верно.
Код лучше заливать на ideone.com — там будет сразу виден и результат выполнения.
Твоя регулярка пропустит номер вида
7+4951234567
Который неправильный. Твоя регулярка пропустит номе
8 1234 1234567
В котором слишком много цифр.
[8]{1} можно записать просто как 8
Код лучше заливать на ideone, чтобы был виден результат. Как мне иначе проверить твою программу? Не руками же с картинки перепечатывать.
Сколько у тебя получилось во втором банке? Должно получаться около 61268 всего выплачено по кредиту. По моему, с твоей формулой правильный ответ не получится, так как там каждый месяц надо добавлять проценты на остаток долга и комиссию, а у тебя этого нет.
>>381209
Написал замечания и советы выше. 8{1} то же самое что просто 8.
Если ты у себя на локалхосте запускаешь, то проблем вообще быть не должно.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log . Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
>>381223
Там еще надо, когда номер выводишь, заменять +7 на 8 — у тебя этого вроде нет.
Также, удалять лишние символы наверно проще отдельной регуляркой.
Я читал эту статью, там ведь алгоритмы для поиска для клеток у которых расстояния одинаковые до соседних точек и можно рассчитать сразу примерно сколько займет путь до конца (эвристическая оценка вроде).
А отладчик не помогает найти причину рекурсии?
> if (!this.cellExist(k, j)) {
> aroundCells.push(this.cells[rowIndex][cellIndex]);
Это странный код — ты проверяешь одну ячейку, а в массив кладешь другую.
> if (rowIndex === undefined) {
Опять же странная проверка, проверять переменную надо до того, как ты ее успел использовать, а не после.
> cellExist
Функция недописана, не проверяет что x меньше нуля, не проверяет y.
> generateMines
Тут ошибка, мин может сгенерироваться меньше чем требуется, если координаты двух из них совпадут.
> dom.addEvent(this.getTable(), 'contextmenu',
Это не нужно, достаточно предостаращать действие при нажатии правой кнопки мыши.
> && target.innerHTML === ''
Это ужасный код. Стоит добавить хотя бы пробел и весь твой код перестанет работать. Так писать нельзя. И вообще, это какие-то уостыли. У тебя есть замечательный объект Cell, а ты ковыряешься в HTML-коде. Зачем?
> cell.toggleFlag(self.getTable());
Зачем туда передавать таблицу? Если и передавать, то передавай в конструкторе.
> e.button == 2
Это очень не кроссбраузерно так как в старом ИЕ и в W3C браузерах кнопки пронумерованы по-разному.
> var cell = this.cells[y][x];
> this.cell.mineCell(this.getTable());
Ошибка на ошибке
> document.body.getElementById('field').rows(this.y).cells(this.x).innerHTML
надо либо в конструктор передавать этот td, либо находить с помощью метода, не не писать такую длинную колбасу.
Еще, смотри, там есть сообщение внизу:
> : 'l' used out of scope.
Ты используешь переменную l снаружи блока, в котором она объявлена. Это либо ошибка либо кривой код (который недопустим в качестве решения).
А отладчик не помогает найти причину рекурсии?
> if (!this.cellExist(k, j)) {
> aroundCells.push(this.cells[rowIndex][cellIndex]);
Это странный код — ты проверяешь одну ячейку, а в массив кладешь другую.
> if (rowIndex === undefined) {
Опять же странная проверка, проверять переменную надо до того, как ты ее успел использовать, а не после.
> cellExist
Функция недописана, не проверяет что x меньше нуля, не проверяет y.
> generateMines
Тут ошибка, мин может сгенерироваться меньше чем требуется, если координаты двух из них совпадут.
> dom.addEvent(this.getTable(), 'contextmenu',
Это не нужно, достаточно предостаращать действие при нажатии правой кнопки мыши.
> && target.innerHTML === ''
Это ужасный код. Стоит добавить хотя бы пробел и весь твой код перестанет работать. Так писать нельзя. И вообще, это какие-то уостыли. У тебя есть замечательный объект Cell, а ты ковыряешься в HTML-коде. Зачем?
> cell.toggleFlag(self.getTable());
Зачем туда передавать таблицу? Если и передавать, то передавай в конструкторе.
> e.button == 2
Это очень не кроссбраузерно так как в старом ИЕ и в W3C браузерах кнопки пронумерованы по-разному.
> var cell = this.cells[y][x];
> this.cell.mineCell(this.getTable());
Ошибка на ошибке
> document.body.getElementById('field').rows(this.y).cells(this.x).innerHTML
надо либо в конструктор передавать этот td, либо находить с помощью метода, не не писать такую длинную колбасу.
Еще, смотри, там есть сообщение внизу:
> : 'l' used out of scope.
Ты используешь переменную l снаружи блока, в котором она объявлена. Это либо ошибка либо кривой код (который недопустим в качестве решения).
Есть разные алгоритмы. Алгоритм Дейкстры не использует никакой эвристики, и просто проверяет все варианты. Он простой.
А так, да, есть A-star который проверяет сначала те узлы, которые ближе к цели. Его можно было бы исплоьзовать, если бы у нас были координаты точек — по координатам можно прикинуть, какая из точек ближе к цели — но у нас их нет (ну или ты должен их сам проставить).
Смотрю между руби, пхп и нод.жс.
Сейчас задам глупый вопрос, можно ли учить сразу фреймворк ларавель, без знаний нативного пхп? (такое прокатывает в жс например, знаешь джиквери, и доволен). Базовые знания пхп есть конечно, не полный дуб. В общем, очень нужен ваш совет, спасибо.
Блог с разметкой, пагнацией, комментариями и категориями (а лучше тегами) сделать сможешь?
Нет, этого не учил, все мои знания - это js. Массивы, переменные, функции, объекты и тд. Но ничего практического на пхп я не писал.
Решил обмазатся фреймворками, скачал видио уроки по Zend2
В связи с этим у меня возникла пару вопросов. Зачем, Господи зачем ты придумал это говно? НЗачемахуя мне нужен этот адовы пиздец? Архитектура говно, куча лишнего кода, который ужасно тормозит простой пример 'Hello wold!'. Каждый фреймвок как будто отделенный язык. Ладно бы если был только один фреймворк. Но их просто дохуища. И в каждой гавно конторе требуют знать если не несколько то хотя бы тот на котором они пишут.
Отлично, спасибо! Много нового узнал.
Но тут у меня беда с функцией array_merge. Суть в том что в я получаю результат как-будто единственного её выполнения, но ведь она выполняется в цикле. МОжет быть она перезаписывает результат?
http://pastebin.com/C38NQsmV
Нельзя, по моему
> такое прокатывает в жс например, знаешь джиквери, и доволен
Неправда, не прокатывает. Получается копипастер, который только умеет копипастить код из интернета, а не программист.
> Архитектура говно, куча лишнего кода,
Сомневаюсь. Что значит «куча лишнего кода», тебе его приходится писать самому или он уже написан и тихо-мирно лежит на диске? По моему, это большая разница.
> Каждый фреймвок как будто отделенный язык
Нет. Более того, изучив один-два, все остальные становятся понятными (если ты конечно тщательно его изучил, а не прыгал по верхам).
Тормозит может потому, что ты что-нибудь не настроил? Там скорее всего APC или аналогичный кеш нужен.
Установи (если у тебя его нет) оп-кешер вроде Xcache или Eaccelerator (есть еще кешер в APC но я наблюдал с ним разные баги).
Отключи всякие отладочные панели и прочие лишние вещи.
Смотри например тут еще есть какие-то советы: http://hounddog.github.io/blog/performance-in-zend-framework-2/
Вот еще: http://www.masterzendframework.com/reviews/maximising-zend-framework-2-performance-phpuk14 — там в частности расширение советуется для склейки файлов.
Ты бы хоть разобраться попытался, в чем дело.
Если есть еще какие-то вопросы, задавай. Я правда с самими ZF2 не работал, но работал с ZF1 и умею гуглить.
Алсо, кроме видеоуроков надо бы читать документацию. Тебе же там не расскажут подробности про тот или иной компонент.
Ну смотри, как я понимаю. Ищем любые непробельные символы или ищем только пробельные символы? Как-то глупо получается. Видимо, | - это не "или".
Пока только сделал makeAdditive и makeSelection. Дальше пока не стал, а то как обычно ошибок понаделаю. Я решил делать свойство list с заказом у объекта order1. И свойство additive, но наверное его лучше в общий заказ запихнуть?
Только пробельные символы. \s значит пробел или другой пробельный символ
^ значит что искать в начале строки
$ что в конце
Получается ищем один или больше пробельных символов в начале или конце строки.
>В PHP вроде чтобы получить ошибку есть функция curl_error.
Благодарю, помогло. Выдало SSL certificate problem: unable to get local issuer certificate
тут нашел ответ http://stackoverflow.com/questions/17478283/paypal-access-ssl-certificate-unable-to-get-local-issuer-certificate
Но правда не идеальный. Скачал я файл с сертификатами, кинул в папку с php, добавил параметр в ини. И начало выдавать ошибку http://chrisschuld.com/2008/07/how-to-fix-the-curl-error-error-setting-certificate-verify-locations/.
В качестве фикса указано изменение прав доступа к папке с файлом сертификатов, но я же под windows 7, какой тут chmod.
Пришлось вырубить проверку сертификата. Не знаю насколько это хорошо или плохо.
<?php
$ch = curl_init("https://2ch.hk/index.html");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
Там уроки еще очень плохие. В комментария все ругают автора. Думаю может книжку почитать http://rutracker.org/forum/viewtopic.php?t=4158510 может получше пойдет. Zend выбрал первым фреймворком только из за того что у него международная сертификация. Но многие говорят/пишут что он довольно таки сложный по сравнению с другими.
Тогда лучше было выбрать симфони 2. ZF1 был популярнее Symfony 1, а во второй версии вышло наоборот — Symfony 2 популярнее. По ней есть также годные самочители например
http://symfony.in.ua/symfony2-jobeet-tutorial.html
http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html
Прежде чем браться за фреймворк, убедись что ты отлично знаешь ООП в PHP. Если нет — перечитай раздел по ООП в официальном мануале.
http://ru.wikibooks.org/wiki/Zend_framework_2
http://habrahabr.ru/post/192522/
http://zf2.com.ua/doc
http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=askeet#newwindow=1&q=zf2+%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA
Спасиб. Принципы ООП ещё на плюсах и джаве дрочил, тут немного отличаются, но не суть важно.
http://ideone.com/yq7BPo
http://jsbin.com/dagoxeleburo/39/edit?js,output
> if (!this.cellExist(k, j)) {
> aroundCells.push(this.cells[rowIndex][cellIndex]);
Исправил.
> if (rowIndex === undefined) {
Оно тут не нужно получается.
> cellExist
Исправил.
> generateMines
Переделал.
> dom.addEvent(this.getTable(), 'contextmenu',
Ну тут я не знаю.
> && target.innerHTML === ''
Ну да, но разве он сейчас основная проблема?
> cell.toggleFlag(self.getTable());
Исправил.
> e.button == 2
Надо все варианты кнопок перебрать?
> var cell = this.cells[y][x];
> this.cell.mineCell(this.getTable());
Исправил.
> document.body.getElementById('field').rows(this.y).cells(this.x).innerHTML
Теперь с помощью конструктора.
> : 'l' used out of scope.
Не знаю как там по-другому.
Тяжело разбираться в коде, все как-то запутанно.
http://jsbin.com/dagoxeleburo/39/edit?js,output
> if (!this.cellExist(k, j)) {
> aroundCells.push(this.cells[rowIndex][cellIndex]);
Исправил.
> if (rowIndex === undefined) {
Оно тут не нужно получается.
> cellExist
Исправил.
> generateMines
Переделал.
> dom.addEvent(this.getTable(), 'contextmenu',
Ну тут я не знаю.
> && target.innerHTML === ''
Ну да, но разве он сейчас основная проблема?
> cell.toggleFlag(self.getTable());
Исправил.
> e.button == 2
Надо все варианты кнопок перебрать?
> var cell = this.cells[y][x];
> this.cell.mineCell(this.getTable());
Исправил.
> document.body.getElementById('field').rows(this.y).cells(this.x).innerHTML
Теперь с помощью конструктора.
> : 'l' used out of scope.
Не знаю как там по-другому.
Тяжело разбираться в коде, все как-то запутанно.
Кто знает. Учи принципы, тогда будет легче перескочить на другие языки.
Долго. Но через 10 лет ты уже может будешь знать все, как и ОП.
передается адрес url
с этой станицы собираются все ссылки
ссылки делятся на 3 категории:
внутренние (ведущие на этот же домен),
внешние (ведущие на другой домен),
неиндексируемые (находящиеся внутри тегов noindex или имеющие аттрибут rel="nofollow").
Также все найденные ссылки вывести на экран, визуально разбив на 3 полученные группы
Совсем застрял.
Цикл не нужен вообще?
У тебя же одно и тоже считается, дело не в цикле. Если
сделать х=2+2, ты хоть 500 раз считай, результат всегда будет одинаковым.
У тебя $alo никак не меняется, каждый цикл она считает одно и тоже. Более того, ты считаешь одно, а возвращаешь совсем другое. Зачем то возвращаешь $creditbalance которая даже не изменяется внутри функции и так и возвращается в том же виде, в каком была передана.
У нас в PHP есть пакетный менеджер composer (репозиторий: https://packagist.org/ )
Я обычно composer советую использовать в задачке на клон файлообменника для установки зависимостей (плюс, композер умеет генерировать автозагрузчик для всех библиотек, что упрощает их подключение). Пока вроде с ним проблем ни у кого не было.
Про bower - не рассказываю, так как только слышал о нем, но сам не использовал. Он просто скачивает и распаковывает пакет в папку или что-то еще умеет?
Насчет grunt — читал немного про него, и у меня сложилось отрицательное впечателение, так как там вместо конфига (наподобие make файлов например) надо писать JS-код, причем как-то заморочно, с коллбеками, словарями и еще чем-то, я например по памяти не напишу его. Я подозреваю, что никто в нем и не разбирается, а просто копипастит код из интернета.
Сам я, когда была необходимость что-то делать перед деплоем js/css файлов, всегда писал bash-скрипты и просто вставлял их вызов в скрипт деплоя (тоже самописный). там обычно была не просто склейка, а например вставка каких-то сгенерированных на PHP справочных данных, вставка шаблонов из файлов в js-строки, и т.д.
Конечно, лучше бы использовать стандартное решение для склейки/минификации, но grunt, как я написал, с первого взгляда мне не понравился. Не понимаю, почему он популярен, тем более что каких-то навороченных возможностей (вроде инкрементальной сборки только изменившихся зависимостей, которая много лет есть в makefile) там нет, и все как-то костыльно. Ну может я просто не разобрался.
> вторая по DOM.
Замечания: http://paste2.org/GL4J9O5K
Так, более-менее норм.
>>381386
Ох, ну опять ты придумываешь свою схему. Смотри, что предлагал я: сделать объект Гамбургер со свойствами размер, начинка, список добавок. Соответственно, работать с ним можно было бы так:
var hamburger = new Hamburger();
hamburger.makeSelection(размер, начинка);
hamburger.addAddditive(добавка);
hamburger.addAdditive(другая добавка);
var price = hamburger.getPrice();
....
Но ты опять решил пойти своим путем:
- сделал Заказ отдельным массивом сложной структуры (ладно бы ты сделал класс Заказ, но ты cделал безликий массив)
- вместо простого создания объекта и вызова его методов усложнил выбор заказа:
> order1.list = order1.makeSelection(Hamburger.SIZE_BIG, Hamburger.FILLING_SALAD);
Почему не просто
order1.makeSelection(Hamburger.SIZE_BIG, Hamburger.FILLING_SALAD) ?
Вот допустим, я программист, которому надо написать программу для расчета стоимости гамбургера на основе твоего класса. Как я догадаюсь, что надо написать такую хитрую строку: вызвать один метод, а его результат извне засунуть в свойство объекта?
Обычно так не делают, никто не лезет снаружи в свойства объекта, а вызывают методы. Это называется инкапсуляция, это делает код более надежным и понятным (смотри выше мой пример кода).
Или может, у тебя есть какие-то причины писать именно так, а не как обычно принято? Если веских причин нет, давай сделаем как обычно принято (как в моем коде выше).
Если что-то непонятно, или если есть вопросы, пиши.
> CheckFilling
В JS обычно функции начинают с первой маленькой буквы (с большой буквы пишут константы и функции-конструкторы, т.е. классы).
> вторая по DOM.
Замечания: http://paste2.org/GL4J9O5K
Так, более-менее норм.
>>381386
Ох, ну опять ты придумываешь свою схему. Смотри, что предлагал я: сделать объект Гамбургер со свойствами размер, начинка, список добавок. Соответственно, работать с ним можно было бы так:
var hamburger = new Hamburger();
hamburger.makeSelection(размер, начинка);
hamburger.addAddditive(добавка);
hamburger.addAdditive(другая добавка);
var price = hamburger.getPrice();
....
Но ты опять решил пойти своим путем:
- сделал Заказ отдельным массивом сложной структуры (ладно бы ты сделал класс Заказ, но ты cделал безликий массив)
- вместо простого создания объекта и вызова его методов усложнил выбор заказа:
> order1.list = order1.makeSelection(Hamburger.SIZE_BIG, Hamburger.FILLING_SALAD);
Почему не просто
order1.makeSelection(Hamburger.SIZE_BIG, Hamburger.FILLING_SALAD) ?
Вот допустим, я программист, которому надо написать программу для расчета стоимости гамбургера на основе твоего класса. Как я догадаюсь, что надо написать такую хитрую строку: вызвать один метод, а его результат извне засунуть в свойство объекта?
Обычно так не делают, никто не лезет снаружи в свойства объекта, а вызывают методы. Это называется инкапсуляция, это делает код более надежным и понятным (смотри выше мой пример кода).
Или может, у тебя есть какие-то причины писать именно так, а не как обычно принято? Если веских причин нет, давай сделаем как обычно принято (как в моем коде выше).
Если что-то непонятно, или если есть вопросы, пиши.
> CheckFilling
В JS обычно функции начинают с первой маленькой буквы (с большой буквы пишут константы и функции-конструкторы, т.е. классы).
> Пришлось вырубить проверку сертификата. Не знаю насколько это хорошо или плохо.
Если кровавый режим вклинится в соединение и подменит сайт на другой, ты не узнаешь.
>>381422
Если тень сделана через эффекты слоев (layer effects) — то в них (эффекты слоев отображаются значком fx в списке слоев), там же можно увидеть и параметры тени (правая кнопка на слое -> эффекты слоев). Если тень сделана другим методом — то на глаз. если сомневаешься, залей сюда кусочек картинки с текстом, я скажу.
>>381517
{} используются когда надо отделить переменную от текcта:
{$weight}kg
Или чтобы вставить сложное выражение: http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Для Дейкстры не нужна рекурсия, посмотри всевдокод алгоритма: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC
С рекурсией ты только делаешь все сложнее.
> что должна возвращать вложенная рекурсивная функция
В случае Дейкстры — ничего
> как мне сохранить путь до всех точек в массиве.
Когда ты передаешь массив в функцию, то передается не сам массив, а его копия. И в функции ты меняешь только эту копию, оригинал остается таким же. Если функция вызывает себя рекурсивно, то в каждый вызов передается новая копия, а после завершения функций все эти копии уничтожаются (а исходный массив остается таким же как и был).
Это можно обойти, если передавать переменную в функцию по ссылке: http://php.net/manual/ru/language.references.pass.php
Но этот трюк усложняет код (так как мы имеем в итоге кучу ссылок на один массив), потому я советую избегать его. Тем более для Дейкстры это не нужно.
Код не работает же, расчехляй отладчик.
> Тяжело разбираться в коде, все как-то запутанно.
Ты же сам его и написал! Пиши в следующий раз понятнее.
> dom.removeClass
Эта функция не удалит класс, если он идет несколько раз подряд: a b b b b с . Надо либо удалять в цикле, либо разбивать на массив классов и проходиться по нему.
> this.isMine = true;
Опечатка
> Cell.prototype.hasMine = function() {
> if (this.isMined) {
Можно просто return this.isMined;
> if (cell.hasMine()) {
> this.cell.mineCell();
Тут нет ошибки? cell != this.cell
> if (!l) {
> var l = 0;
Эта проверка бессмысленна. Локальной переменной l ранее ничего в этой функции не присваивалось, потому она равна undefined, потому if срабатывает всегда. Значит его можно заменить на
var l = 0;
Более того, это можно перенести внутрь for
> this.openCell(aroundCells[l].getX(), aroundCells[l].getY(), l);
А тут есть защита от зацикливания? Алсо, ты передаешь 3 аргумента, а принимает функция только 2.
> break;
Тоже непонятно зачем
> Field.prototype.getTable
Лучше сохранять ссылку на table в свойстве объекта Field в момент создания таблицы.
> if (x > this.width - 1 || x < this.width - 1
Это равносильно if (x != this.width - 1)
> Надо все варианты кнопок перебрать?
Сделай пока отдельную функцию isRegionButton(e). В ней можно проверять так:
- если есть свойство e.which, определяем по нему (оно работает в новых браузерах и работает одинаково)
- если его нет, это скорее всего IE значит есть свойство button и можно определить по нему.
Вот статья (старая) на тему: http://unixpapa.com/js/mouse.html — раздел «Identifying buttons». — посмотри таблицу там. Видишь, что бывает когда стандарт появляется позже реализации. Такое же веселье в JS с клавиатурными событиями.
Код не работает же, расчехляй отладчик.
> Тяжело разбираться в коде, все как-то запутанно.
Ты же сам его и написал! Пиши в следующий раз понятнее.
> dom.removeClass
Эта функция не удалит класс, если он идет несколько раз подряд: a b b b b с . Надо либо удалять в цикле, либо разбивать на массив классов и проходиться по нему.
> this.isMine = true;
Опечатка
> Cell.prototype.hasMine = function() {
> if (this.isMined) {
Можно просто return this.isMined;
> if (cell.hasMine()) {
> this.cell.mineCell();
Тут нет ошибки? cell != this.cell
> if (!l) {
> var l = 0;
Эта проверка бессмысленна. Локальной переменной l ранее ничего в этой функции не присваивалось, потому она равна undefined, потому if срабатывает всегда. Значит его можно заменить на
var l = 0;
Более того, это можно перенести внутрь for
> this.openCell(aroundCells[l].getX(), aroundCells[l].getY(), l);
А тут есть защита от зацикливания? Алсо, ты передаешь 3 аргумента, а принимает функция только 2.
> break;
Тоже непонятно зачем
> Field.prototype.getTable
Лучше сохранять ссылку на table в свойстве объекта Field в момент создания таблицы.
> if (x > this.width - 1 || x < this.width - 1
Это равносильно if (x != this.width - 1)
> Надо все варианты кнопок перебрать?
Сделай пока отдельную функцию isRegionButton(e). В ней можно проверять так:
- если есть свойство e.which, определяем по нему (оно работает в новых браузерах и работает одинаково)
- если его нет, это скорее всего IE значит есть свойство button и можно определить по нему.
Вот статья (старая) на тему: http://unixpapa.com/js/mouse.html — раздел «Identifying buttons». — посмотри таблицу там. Видишь, что бывает когда стандарт появляется позже реализации. Такое же веселье в JS с клавиатурными событиями.
Развивайся, у современных веб-фреймворков много общего, и перескочить на другой язык скорее всего будет не так сложно. Я лично 5 лет назад думал, что PHP будет заменен Руби, ан нет, не заменен.
>>381551
Кстати, видел наши задачки по JS для начинающих?
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
>>381552
Покажи код, скажи на каком месте застрял. мы можем дать совет, пояснение или ссылку на мануал, но код за тебя не напишем.
В этой задаче удобно использовать DOM и Xpath для поиска ссылок.
Алсо, это подозрительно напоминает тестовое задание, а оно должно проверять твои знания, а не мои.
>>381608
Во втором банке должно быть около 61270. У тебя слишком мало.
Я думаю, причина в том, что ты прибавляешь комиссию ровно один раз. То есть не считаешь весь процесс выплаты кредита, а только первый месяц и выводишь сколько долга осталось через месяц.
Алсо, функции надо начинать с глагола, например посчитатьКредит = calculateIphoneCredit()
Развивайся, у современных веб-фреймворков много общего, и перескочить на другой язык скорее всего будет не так сложно. Я лично 5 лет назад думал, что PHP будет заменен Руби, ан нет, не заменен.
>>381551
Кстати, видел наши задачки по JS для начинающих?
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
>>381552
Покажи код, скажи на каком месте застрял. мы можем дать совет, пояснение или ссылку на мануал, но код за тебя не напишем.
В этой задаче удобно использовать DOM и Xpath для поиска ссылок.
Алсо, это подозрительно напоминает тестовое задание, а оно должно проверять твои знания, а не мои.
>>381608
Во втором банке должно быть около 61270. У тебя слишком мало.
Я думаю, причина в том, что ты прибавляешь комиссию ровно один раз. То есть не считаешь весь процесс выплаты кредита, а только первый месяц и выводишь сколько долга осталось через месяц.
Алсо, функции надо начинать с глагола, например посчитатьКредит = calculateIphoneCredit()
Я пробовал в echo пихать две переменные в скобки, {$a - $b}, даже {($a - $b)] пробовал, а оно все равно не выводило разницу, только печатало значения и знак минуса между ними.
Мануал почитай по ссылке http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
>>381641
То, что ты парсишь HTML регулярками. Я же написал недвусмысленно: продемонстрировать знания DOM и Xpath ждут от тебя авторы задачи.
Давай тогда я буду тебя поэтапно по коду спрашивать. Начнем с makeSelection. Ну вот ты говоришь, что заказ я делаю неправильно. Ну вот смотри, я сделал через объект его - http://jsbin.com/lubewuqa/7/edit. Если не так, то я даже тогда не знаю, как мне сделать этот заказ. Ты еще вот тут >>380390 говорил, что должен быть не один заказ, а три свойства. А в голову мне ничего такого не приходит. Или может внутри метода makeSelection что-то записывать в свойства самого объекта? Но я тогда не знаю как.
Спасибо за развернутый ответ.
Я практически чистый бэкендщик, решил для собственных нужд и ради интереса сделать проект в себе с относительно сложным фронтендом. И тут обнаружил, что оказывается есть пакетный менеджер и система сборки для фронтенда. Было интересно твоё мнение по поводу этих инструментов.
Надо так:
...makeSelection = function (size, filling) {
this.checkSize(size);
this.checkFilling(filling);
this.size = size;
this.filling = filling;
};
Ты наверно задачи на ООП из учебника PHP не решал.
Посоветуйте, пожалуйста, хороший ide для mac os который не сильно жрет батарею и оперативку и достаточно простой. И скажите где взять этот интерпретатор и какой именно.
На том сайте что посоветовал ОП писать невозможно - все переменные нужно вручную вводить.
PhphStorm годный? Как там интерпретатор настроить?
Что здесь будет this? Я просто когда пробую запускать просто пишу: order3.makeSelection(Hamburger.SIZE_BIG, Hamburger.FILLING_POTATO). И This - Это Hamburger, а ему не нужны новые свойства.
Почему тебе так припекло?
Я могу лишь вычислить соседние циклом foreach($paths[$point] as $key=>$value)
можно конечно вложить в этот цикл еще один с $paths[$key], а в него такой же и так до победного, но это полный бред.
Еле разобрался в установке пхп на мак, но все-равно не работает в ide.
Не уверен точно, но попробую объяснить: твой браузер воспринимает только хтмл, в котором перенос строки это <br> , а \n это перенос для пыхапе, который имеет смысл только на всяких айдеонах или в командной строке.
PhpStorm годный, еще есть Sublime Text 3, но это просто редактор, а не IDE. Netbeans PHP еще должен работать, он вроде кроссплатформенный.
> и нужен какой-то интерпретатор.
Ява? Интерпретатор PHP? Ты бы писал конкретно что ему надо, я бы мог прокомментировать, а так я ничего сказать не могу.
> На том сайте что посоветовал ОП писать невозможно - все переменные нужно вручную вводить.
Пиши в редакторе, а в ideone копипасть. Ideone хорош тем, что на него можно ссылкой поделиться.
А так, ты можешь запускать код в консоли (в маках по моему PHP идет в комплекте, правда не самый новый, но если это 5.4 то вполне ок) — открой консоль (Terminal App), перейди в нужную директорию и выполни команду
php myprogram.php
И она выполнится. Заметь, для этого даже устанавливать ничего не надо.
>>381722
Не, ты все путаешь. Смотри, в нормальном ООП есть классы (в которых мы описываем методы и свойства), и есть созданные из этих классов объекты. Соответственно this в PHP указывает на текущий объект, на котором был вызван метод.
В JS нет настоящих классов. Но есть функции-конструкторы и прототипы. Ты можешь объявить методы через свойство prototype функции-конструктора и они будут доступны в прототипе созданных объектов.
> Что здесь будет this?
this будет равно order3, очевидно. Подробнее:
http://javascript.ru/this
http://javascript.ru/tutorial/object/thiskeyword
> И This - Это Hamburger
Неверно.
PhpStorm годный, еще есть Sublime Text 3, но это просто редактор, а не IDE. Netbeans PHP еще должен работать, он вроде кроссплатформенный.
> и нужен какой-то интерпретатор.
Ява? Интерпретатор PHP? Ты бы писал конкретно что ему надо, я бы мог прокомментировать, а так я ничего сказать не могу.
> На том сайте что посоветовал ОП писать невозможно - все переменные нужно вручную вводить.
Пиши в редакторе, а в ideone копипасть. Ideone хорош тем, что на него можно ссылкой поделиться.
А так, ты можешь запускать код в консоли (в маках по моему PHP идет в комплекте, правда не самый новый, но если это 5.4 то вполне ок) — открой консоль (Terminal App), перейди в нужную директорию и выполни команду
php myprogram.php
И она выполнится. Заметь, для этого даже устанавливать ничего не надо.
>>381722
Не, ты все путаешь. Смотри, в нормальном ООП есть классы (в которых мы описываем методы и свойства), и есть созданные из этих классов объекты. Соответственно this в PHP указывает на текущий объект, на котором был вызван метод.
В JS нет настоящих классов. Но есть функции-конструкторы и прототипы. Ты можешь объявить методы через свойство prototype функции-конструктора и они будут доступны в прототипе созданных объектов.
> Что здесь будет this?
this будет равно order3, очевидно. Подробнее:
http://javascript.ru/this
http://javascript.ru/tutorial/object/thiskeyword
> И This - Это Hamburger
Неверно.
Сам себя сагаешь?
>>381730
Да, ООП обязателен для решения этой задачи.
> Стоит дочитать до конца раздел о событиях Кантора?
Дочитай, он же небольшой вроде.
> Или знаний на уровне второго задания хватит?
Скорее всего хватит, но раздел там вроде небольшой, а прочесть его надо будет рано или поздно.
> С ООП все очень плохо
Тогда задавай вопросы. Ты должен знать, как работают прототипы в JS, что такое конструктор, как добавлять свойства и методы, как создавать объекты, как наследовать «классы», как работает this.
>>381740
> как в алгоритме Дейкстры без рекурсии проходить по соседним точкам?
За счет циклов. Посмотри алгоритм в википедии — ты видишь там рекурсию?
> можно конечно вложить в этот цикл еще один
Не надо. Там просто есть цикл:
Пока (есть необойденные вершины) {
берем одну из них;
помечаем ее как обойденную;
обходим без рекурсии всех ее соседей и проставляем там числа;
}
Ты читал статью в википедии? Там готовый алгоритм написан, тебе над его с русского на PHP перевести всего лишь.
Сам себя сагаешь?
>>381730
Да, ООП обязателен для решения этой задачи.
> Стоит дочитать до конца раздел о событиях Кантора?
Дочитай, он же небольшой вроде.
> Или знаний на уровне второго задания хватит?
Скорее всего хватит, но раздел там вроде небольшой, а прочесть его надо будет рано или поздно.
> С ООП все очень плохо
Тогда задавай вопросы. Ты должен знать, как работают прототипы в JS, что такое конструктор, как добавлять свойства и методы, как создавать объекты, как наследовать «классы», как работает this.
>>381740
> как в алгоритме Дейкстры без рекурсии проходить по соседним точкам?
За счет циклов. Посмотри алгоритм в википедии — ты видишь там рекурсию?
> можно конечно вложить в этот цикл еще один
Не надо. Там просто есть цикл:
Пока (есть необойденные вершины) {
берем одну из них;
помечаем ее как обойденную;
обходим без рекурсии всех ее соседей и проставляем там числа;
}
Ты читал статью в википедии? Там готовый алгоритм написан, тебе над его с русского на PHP перевести всего лишь.
Перенос работает — открой исходный код страницы, он там есть. Другой вопрос, что в языке HTML перенос строки в исходном коде игнорируется.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
>>381761
Поставь в отладчике точку останова в начало функции openCell и посмотри почему оно не работает. Посмотри, что хранится в переменных, что возвращают разные функции (вроде getAroundCells).
Если что-то непонятно, то напиши что именно непонятно, а то из твоего поста это неясно. Я даже не знаю, что именно подсказать. Общая логика в программе у тебя правильная, просто где-то ошибка или опечатка.
Также, ты можешь поставить несколько console.log внутрь openCell, может будет понятнее что там происходит.
Зависит от компании. Я бы советовал разобраться хорошо, тогда ты будешь более ценен. В любом случае, уметь читать код и делать простые правки необходимо.
Спасибо, но я уже сам анальными муками разобрался что к чему и поставил php+mamp+phpStorm. В мак ос маверикс некроджобс решил анально ораничить php и возможность создания серверов (она тоде встроена). Пришлось долго пердолить терминал десятками команд - на винде в разы все легче.
Почему сервер мускул мне отказывает в доступе? пробовал root в пользователь и пароль и пустые оставлять пробелы. что не так?
$link=mysql_connect("localhost", "root", "root");
ну что может писать ебать?
Warning: mysql_connect() [function.mysql-connect]: Access denied for user ' '@'localhost' (using password: YES) in Z:\home\localhost\www\testing_php.php on line 325
Кстати, у меня что-то подобное было. Погуглил: нужно было сменить пароль для рут юзера.
http://export.yandex.ru/weather-ng/forecasts/29642.xml
на минусы нажимайте, чтоб теги свернуть, чтобы понять суть проблемы.
еоп. есть один парсер. погоды. грубу говоря, температуры. temperature.
вот сайт с предложением, как спарсить погоду.
http://habrahabr.ru/post/136149/
там парсится отсюда:
<fact></fact>
а надо, чтоб ещё парсил на будущее, из
<day date="2014-08-27">
</day><day date="2014-08-28">
<day date="2014-08-29">
а когда вставляешь на место fact , например
$temp=$xml->day date="2014-08-29"->temperature;, чтобы эту самую temperature; спарсить, то ничего, своершенно. таки.
памагице, любезные. или любой другой способ подскажите, как из xml-ки вытащить из разных дней temperature, и расфасовать по табличке с прогнозом погодки.
Снес себе ваще весь мускул нахуй из пхп. Знаете, идитека нахуй со своим программированием.
Пароль yes это значит, что пароль требуется. Попробуй зайди под рутом через командную строку mysql.
http://codepad.org/CqJLIbJ0
http://jsbin.com/lubewuqa/3/edit - код смотреть не надо(только makeSelection). смотри, это какой-то из моих неправильных вариантов. Ну тут я использую this в makeSelection и ты мне говорил, что я "преумножаю сущности". Я так понял, что это записывается в свойства класса Гамбургер. Я вроде бы знаю достаточно теории, но с задачей что-то не выходит. Но что-то вообще ничего не получается. Может у тебя есть какая-нибудь готовая ООП задача, чтобы я ее разобрал? Или кусочек метода из этой?
function Animal() {};
Animal.run = ....;(без прототипа), а не так: Animal.prototype.run = ....;
var rabbit = new Animal();
rabbit.run....
Включи отображение ошибок в PHP (поменять display_errors = On в php.ini) — увидишь еще и текст ошибки. У тебя ошибка в программе и отклбючен вывод сообщений об ошибках.
Смотри сам: http://codepad.org/F8m3AYtu
Там иногда слишком большое число выпадает в mt_rand, больше чем есть элементов в массиве.
>>381813
Кстати, тут в итернете пишут http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-9-mavericks/ что в макоси даже Апач установлен, достаточно просто его запустить, правда, да, немного надо с консолькой и конфигами помучаться.
>>381814
Потому, что ты пароль неправильный написал.
>>381822
Это переводится: пароль был отправлен: ДА
Алсо обрати внимание: user ' '@'localhost' — ты пытаешься под пустым именем пользователя залогиниться
>>381824
>а когда вставляешь на место fact , например
>$temp=$xml->day date="2014-08-29"->temperature;, чтобы эту самую temperature; спарсить,
А кто тебе сказал, что там так можно писать? Надо сначала изучить используемую бублиотеку, а не копипастить код и менять наугад в надежде, что заработает.
Иди почитай сначала документацию: http://php.net//manual/ru/book.simplexml.php — там все прекрасно объяснено.
Если в документации что-то непонятно, я могу пояснить.
Включи отображение ошибок в PHP (поменять display_errors = On в php.ini) — увидишь еще и текст ошибки. У тебя ошибка в программе и отклбючен вывод сообщений об ошибках.
Смотри сам: http://codepad.org/F8m3AYtu
Там иногда слишком большое число выпадает в mt_rand, больше чем есть элементов в массиве.
>>381813
Кстати, тут в итернете пишут http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-9-mavericks/ что в макоси даже Апач установлен, достаточно просто его запустить, правда, да, немного надо с консолькой и конфигами помучаться.
>>381814
Потому, что ты пароль неправильный написал.
>>381822
Это переводится: пароль был отправлен: ДА
Алсо обрати внимание: user ' '@'localhost' — ты пытаешься под пустым именем пользователя залогиниться
>>381824
>а когда вставляешь на место fact , например
>$temp=$xml->day date="2014-08-29"->temperature;, чтобы эту самую temperature; спарсить,
А кто тебе сказал, что там так можно писать? Надо сначала изучить используемую бублиотеку, а не копипастить код и менять наугад в надежде, что заработает.
Иди почитай сначала документацию: http://php.net//manual/ru/book.simplexml.php — там все прекрасно объяснено.
Если в документации что-то непонятно, я могу пояснить.
> Включи отображение ошибок в PHP (поменять display_errors = On в php.ini) — увидишь еще и текст ошибки. У тебя ошибка в программе и отклбючен вывод сообщений об ошибках.
Как там может быть ошибка, если все работает? Но не всегда так как нужно.
> Там иногда слишком большое число выпадает в mt_rand, больше чем есть элементов в массиве.
Как это возможно если диапазон от нуля до размера массива?
Странно этот php работает.
YES значит что пароль был отправлен. Клиент не может знать, требуется для пользователя пароль или нет.
>>381900
Давай я тебе лучше правильный код сразу напишу для этой функции:
Hamburger.prototype.makeSelection = function(size, filling) {
this.checkSize(size); // выбрасывает исключение если размер неправильный
this.checkFilling(filling);
this.size = size;
this.filling = filling;
};
Насчет простой задачки ... ну допустим есть Компания, в ней работают несколько Работников. У каждого работника есть стаж в годах, базовая зарплата (тугриков в час), и число отработанных часов в этом месяце. Стаж влияет на зарплату: за каждый год стажа зарплата становится на 5% выше базовой, то есть с 5 годами — на 25% выше.
Сделай программу, которая создаст Компанию, добавит в нее несколько Сотрудников и посчитает сколько они часов в сумме отработали за месяц и сколько им надо заплатить.
Должны быть такие «классы»:
Компания, свойства: список сотрудников, методы: посчитатьОбщуюВыработку, посчитатьОбщуюЗарплату
Работник, свойства: стаж, базовая ставка, число часов. Методы: посчитатьЗарплату, посчитатьЧислоЧасов
Новые свойства и методы запрещется добавлять. Писать console.log внутри конструктора или методов тоже запрещается.
YES значит что пароль был отправлен. Клиент не может знать, требуется для пользователя пароль или нет.
>>381900
Давай я тебе лучше правильный код сразу напишу для этой функции:
Hamburger.prototype.makeSelection = function(size, filling) {
this.checkSize(size); // выбрасывает исключение если размер неправильный
this.checkFilling(filling);
this.size = size;
this.filling = filling;
};
Насчет простой задачки ... ну допустим есть Компания, в ней работают несколько Работников. У каждого работника есть стаж в годах, базовая зарплата (тугриков в час), и число отработанных часов в этом месяце. Стаж влияет на зарплату: за каждый год стажа зарплата становится на 5% выше базовой, то есть с 5 годами — на 25% выше.
Сделай программу, которая создаст Компанию, добавит в нее несколько Сотрудников и посчитает сколько они часов в сумме отработали за месяц и сколько им надо заплатить.
Должны быть такие «классы»:
Компания, свойства: список сотрудников, методы: посчитатьОбщуюВыработку, посчитатьОбщуюЗарплату
Работник, свойства: стаж, базовая ставка, число часов. Методы: посчитатьЗарплату, посчитатьЧислоЧасов
Новые свойства и методы запрещется добавлять. Писать console.log внутри конструктора или методов тоже запрещается.
Вот авторское - http://jsbin.com/hoxafibadula/1/edit.
Скажи, что тут значит запись var self = this;? И зачем она?
И если, например, сделать так:
var order = new Hamburger();
order.makeSelection(...);
То у order будут свойства size и filling?
А, еще у компании есть методы добавитьСотрудника(сотрудник) и уволитьСотрудника (сотрудник), забыл. при попытке добавить уже добавленного или уволить не работабщего сотрубника — выкидывать исключение.
>>381908
Потому что в JS нет настоящих классов.
Твой код работать не будет. Ты создаешь свойство run у функции-конструктора, и на создаваемом объекте оно не появится само собой. Иди читай про прототипы.
>>381923
Так потому и слова пропускаются что ошибка. Ну е мое, посмотри ссылку http://codepad.org/F8m3AYtu
> Как это возможно если диапазон от нуля до размера массива?
В массиве 4 элемента. Перечисли, какие у них индексы? 0, 1, ... что дальше?
>>381924
> Чем они отличаются?
Второй способ — классическая имитация классов, его надо использовать.
Первый способ имеет недостатки:
- конструктор становится огромным, когда у тебя там будет 500-1000 строк. Констурктор замусорен лишним кодом
- при создании объекта все методы создаются заново, а во втором варианте они создаются только один раз. Это логичнее.
Первый вариант обычно используют те, кто не разобрался как работают прототипы.
А, еще у компании есть методы добавитьСотрудника(сотрудник) и уволитьСотрудника (сотрудник), забыл. при попытке добавить уже добавленного или уволить не работабщего сотрубника — выкидывать исключение.
>>381908
Потому что в JS нет настоящих классов.
Твой код работать не будет. Ты создаешь свойство run у функции-конструктора, и на создаваемом объекте оно не появится само собой. Иди читай про прототипы.
>>381923
Так потому и слова пропускаются что ошибка. Ну е мое, посмотри ссылку http://codepad.org/F8m3AYtu
> Как это возможно если диапазон от нуля до размера массива?
В массиве 4 элемента. Перечисли, какие у них индексы? 0, 1, ... что дальше?
>>381924
> Чем они отличаются?
Второй способ — классическая имитация классов, его надо использовать.
Первый способ имеет недостатки:
- конструктор становится огромным, когда у тебя там будет 500-1000 строк. Констурктор замусорен лишним кодом
- при создании объекта все методы создаются заново, а во втором варианте они создаются только один раз. Это логичнее.
Первый вариант обычно используют те, кто не разобрался как работают прототипы.
> В массиве 4 элемента. Перечисли, какие у них индексы? 0, 1, ... что дальше?
Спасибо, что-то затупил на этом.
Кстати, в пхп.ини все поменял как ты сказал, но ошибка не вылезла. Буду наверно еще пердолить.
Ошибка здесь:
> Clock.prototype._render();
В качестве this будет передан не текущий объект, а Clock.prototype. Это неправильно и не будет работать. Надо писать
this._render();
Но так написать мы тоже не можем так как внутри коллбека function() {Clock.prototype._render(); } this будет равно window, а не нашему объекту.
Потому мы используем трюк с переменной:
var self = this; // сохраняем текущий объект в переменную
...
function () { self._render(); }
Почитай про this: http://javascript.ru/tutorial/object/thiskeyword
>>381927
Я написал тебе правильное решение для функции makeSelection, используй его.
> То у order будут свойства size и filling?
Из твоего кода это непонятно так как ты привел только кусок.
Ошибка здесь:
> Clock.prototype._render();
В качестве this будет передан не текущий объект, а Clock.prototype. Это неправильно и не будет работать. Надо писать
this._render();
Но так написать мы тоже не можем так как внутри коллбека function() {Clock.prototype._render(); } this будет равно window, а не нашему объекту.
Потому мы используем трюк с переменной:
var self = this; // сохраняем текущий объект в переменную
...
function () { self._render(); }
Почитай про this: http://javascript.ru/tutorial/object/thiskeyword
>>381927
Я написал тебе правильное решение для функции makeSelection, используй его.
> То у order будут свойства size и filling?
Из твоего кода это непонятно так как ты привел только кусок.
Ты мог не в том php.ini поменять. Если ты ставил отдельный PHP то у него свой, отдельный конфиг скорее всего.
Ты можешь прямо в программе проверить:
var_dump(ini_get('display_errors'));
И поменять:
ini_set('display_errors', 'On');
Также, ты можешь сделать файл вида
<?php phpinfo();
И он выведет, какой именно файл php.ini был использован (и чему равно display_errors).
Спасибо, все настроил.
http://jsbin.com/dagoxeleburo/54/edit?js,output
Теперь внутренние функции, которые использует метод openCell возвращают верные значения.
А так же уже что-то стало выводиться, но все равно ерунда.
this.openCell(aroundCells[l].getX(), aroundCells[l].getY(), l);
Посмотри в код, не понимаю почему l не передается. Я же теперь обращаюсь к ней как к arguments[2].
location.reload();
return "you leave?"
};
onload=function(){
location.reload();
}
Оп, интересная штука получается. Не знал про onbeforeunload.
https://gist.github.com/finom/3ecfcea07d95f5dd7f8a
Оп, смотри какой полифил нашел. Сегодня только узнал, что это. Сильно запутанный код. Там как-то все на лету происходит.
Element.prototype[ s_add ] = win[ s_add ] = doc[ s_add ] = function( on, fn, self ) {....
Откуда тут Element взялся?
Похоже она более совершенная, чем моя в http://jsbin.com/dagoxeleburo/54/edit Даже смешно сравнивать. Как такое пишут?
> в первом случае у нас приходит document, а после поиска массив,
Бери в качестве начальных данных не документ, а массив из одного элемента - документа.
Насколько я понимаю есть две стороны: клиентская и серварная.
Клиентская это javascript, что еще?
Серверная php, css(?), что еще?
Ну и html обезательно.
Посоветуйте чем заменить php, он конечно популярный и все дела, но после c, c++ и java пользоваться им немного НЕПРИВЫЧНО. Буду его учить, конечно, но хочу и другие варианты попробовать.
Поправьте меня, если я в чем-то неправ и что еще нужно знать веб верстальщику чтобы быть успешным и востребованным?
лютый ньюфаг в вебе, не бейте, лучше обоссыте
Element — это видимо конструктор для DOM Element в ИЕ, а Element.prototype —его прототип. Соответственно, этим мы добавляем ко всем DOM элементам метод 'addEventListener'
В старых ИЕ это все называлось Dynamic HTML (DHTML) Object Model.
http://msdn.microsoft.com/en-us/library/hh869680(v=vs.85).aspx
Вот тут описаны эти конструкторы. Вот мануал по Element: http://msdn.microsoft.com/en-us/library/hh869681(v=vs.85).aspx
А строчка
Element.prototype[ s_add ] = win[ s_add ] = doc[ s_add ] = ...
Добавляет функцию в прототип DOM нод, в window и document.
Там еще код внутри расширяет объект event, так как в старом ИЕ событие не передается в обработчик, а хранится в глобальной переменной event.
Код берет событие из window.event, добавляет свойства target и which (нажатая кнопка мыши), и пару методов. И только потом вызывает обработчик.
Клиентская — то, что обрабатывается в браузере. Серверная — что выполняется на сервере.
Клиентская — HTML/CSS/JS (в страницу можно встроить программы на javascript и они выполняются в браузере)
Серверная — PHP/Java/Ruby/Python/ + базы данных (SQL) + NoSQL хранилища и кеши. Это то, что генерирует страницы. Например, серверная программа может брать из базы данных результаты футбольных игр и генерировать страницу с турнирной таблицей в формате HTML (которую отобразит браузер).
> чем заменить php
Java, C#, Ruby, Python
> что еще нужно знать веб верстальщику
JS, DOM, jQuery, jQuery UI, Backbone, Knockout, Angular.
Это другая вещь. Это всего лишь штука которая добавляет в ИЕ пару функций. Причем я не особый сторонник полифиллов, я считаю лучше сделать отдельную функцию, а не пытаться имитировать в ИЕ нормальный браузер, так как имитация получается все равно неполноценная и это плохо. Например, в W3c браузерах можно передать третьим параметром true, а тут нельзя (точнее передать можно но работать оно все равно не будет).
> Как такое пишут?
Не вижу ничего сложного. Если ты прототипы изучал то должен знать что можно (но нив коем случае так не делай) расширять прототипы стандартных объектов. Наример пишешь
String.prototype.sayYes = function ...
И у всех строк появляется метод sayYes. Но нив коем случае так не делай, это крайне дурная практика.
Ага, я вначале в сапере хотел все свойства и методы сразу в DOM ноды записывать. Хотя может и было бы проще, не было бы функций поиска event.target в массиве cells и т.д.
Спасибо, теперь понятно
Знаю про мускул только из книги Никсона, могу простые таблицы делать и к пхп присобачивать, но ОП говорит, что описанная там технология ужасно устарела.
Спасибо, поонанирую на досуге.
Гугли PDO как минимум.
$a = new Test();
$a->newProp = 1;
$b = $a;
$b->newProp = 2;
var_dump($a->newProp);
Я знаю что объекты передаются по ссылке. Но ведь для того чтобы передать по ссылке нужно указать &. Получается = работает по разному? Или инстанс объекта это типа указатель на структуру? я пхпшник что такое указатель толком не знаю, так что если ерунда не ругайтесь
http://ideone.com/E2MFN3 вроде всё правильно.
Мне всё таки любопытно, как она решается через рекурсию?
Ну я думаю это прогресс. Но вот какие проблемы:
- если пустая ячейка, цикл открывает не все ячейки.
- цифры не всегда окружают все пустые ячейки.
>Ты в $b скопировал из $a адрес объекта Test.
>Я знаю что объекты передаются по ссылке.
Внимание вопрос! Почему языковая конструкция "=" в этом примере скопировала адрес
Потому что "=" копирует значение, $a - указатель на объект, т.е. переменная со значением "адрес объекта".
Если хочешь копировать используй метод clone().
suki, пока я его выучу это уже будет не рhр.
Хорошо, ждем результатов.
>>381981
> Посмотри в код, не понимаю почему l не передается.
Она передается. Поставь там console.log(l) и убедись сам.
Алсо, вместо arguments[2] надо просто добавить 3-й аргумент к функции. В JS можно передавать меньше или больше аргументов чем указано, и это не вызовет ошибку (тем аргументам, которые не переданы, будет выставлено значение undefined).
>>382012
onbeforeunload предназаначена для тех случаев, когда мы хотим защитить пользователя от потери данных, например если он заполнил, но не отправил форму или если он редактриует большой текст, не сохранив его.
И то мне она не нравится, так как всплывающие окна раздражают (в старой Опере это событие вообещ было отключено по этой причине). Для предотвращения потери данных лучше сохранять в фоне данные в localStorage — в этом случае даже если у компьютера выключится питание, данные можо будет восстановить при следующем заходе на страницу.
Там еще раньше было просто onunload — https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onunload — но оно вроде не выводит окно-предупреждение и срабатывает уже после ухода со страницы.
Вот еще история про это событие: http://habrahabr.ru/post/141793/
Что касается location.reload и прочих трюков, они по идее не должны работать.
>>382021
> var selectorList = selector.split(' ');
Я бы разбивал по \s+ так как пробелов может быть несколько.
> if (Object.keys(tabList).length) {
Слишком сложно. надо писать if (isEmpty(tabList)) ...
Насчет проверки массив/не массив — сделай функцию, которая всегда принимает массив, то есть
find(token, contextArray)
Функция, в которую можно передавать аргументы разных типов, становится замусорена лишним кодом и может стать источником багов.
В селекторе может быть указано несколько классов например
div.a.b#c
Это у тебя не учтено.
Поиск по одному селектору лучше делать так:
- если указан id и контекст — это документ, ищем по id
- если доступна getElementsByClassname и указан класс, ищем ей
- иначе если указан тег ищем через getElementsByTagName
- иначе ищем полным перебором
После поиска мы должны еще отсеять лишнее. Например если указан селектор
td.a.b
То мы можем найти все элементы с классом a, а потом пройтись по ним и проверить на соответствие условиям. Если в селекторе единственное условие, и мы по нему делали поиск (например указан 1 класс и мы использовали getByClassName) то можно этот этап пропустить.
Там еще раньше было просто onunload — https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onunload — но оно вроде не выводит окно-предупреждение и срабатывает уже после ухода со страницы.
Вот еще история про это событие: http://habrahabr.ru/post/141793/
Что касается location.reload и прочих трюков, они по идее не должны работать.
>>382021
> var selectorList = selector.split(' ');
Я бы разбивал по \s+ так как пробелов может быть несколько.
> if (Object.keys(tabList).length) {
Слишком сложно. надо писать if (isEmpty(tabList)) ...
Насчет проверки массив/не массив — сделай функцию, которая всегда принимает массив, то есть
find(token, contextArray)
Функция, в которую можно передавать аргументы разных типов, становится замусорена лишним кодом и может стать источником багов.
В селекторе может быть указано несколько классов например
div.a.b#c
Это у тебя не учтено.
Поиск по одному селектору лучше делать так:
- если указан id и контекст — это документ, ищем по id
- если доступна getElementsByClassname и указан класс, ищем ей
- иначе если указан тег ищем через getElementsByTagName
- иначе ищем полным перебором
После поиска мы должны еще отсеять лишнее. Например если указан селектор
td.a.b
То мы можем найти все элементы с классом a, а потом пройтись по ним и проверить на соответствие условиям. Если в селекторе единственное условие, и мы по нему делали поиск (например указан 1 класс и мы использовали getByClassName) то можно этот этап пропустить.
Есть такой подход (он часто применяется в jQuery плагинах например): хранить данные в объектах DOM, либо как дополнительные свойства (это называется expando, в JS почти все это объект и туда можно добавлять свойства):
var div = document.getElementById('x');
div.something = 'yes'; // это работает, хотя и не гарантируется стандартами
Либо как аттрибуты:
div.setAttribute('data-something', 'smth');
Все, что кладется в аттрибуты, хранится как строка. Стандартом HTML5 предусмотрены data- аттрибуты которые ты можешь добавлять и использовать как хочешь.
Но это плохой подход, так как он спутывает логику программы и логику отображения данных. Лучше для отображения использовать DOM, а для хранения и обработки данных — свои классы — так код будет чище и аккуратнее.
А что не так с исключениями? Все работает вроде.
Программа не позволяет добавить 2 разных добавки. Не проверяется ситуация, когда одна добавка добавляется 2 раза подряд.
> if (!this.additive === undefined) {
Непонятно, что выполнится раньше, ! или ===. Надо либо ставить !== либо использовать скобки либо писать
if (!this.additive)
В свойствах size и fillign надо хранить саму константу (например Hamburger.SIZE_SMALL) а не словарь с ее параметрами. То, что у тебя. не позволит например сделать метод
getSize()
А так, неплохо, лучше чем раньше.
>>382130
Используй PDO как клиентскую библиотеку для связи с MySQL. Не забудь выставить ERRMODE_EXCEPTION чтобы видеть ошибки MySQL.
Никогда не вставляй переменные в тело запроса напрямую, используй плейсхолдеры.
Статья http://habrahabr.ru/post/137664/
По MySQL у меня есть сборник ссылочек и задачка: https://gist.github.com/codedokode/10539213 — попробуешь свои силы?
А что не так с исключениями? Все работает вроде.
Программа не позволяет добавить 2 разных добавки. Не проверяется ситуация, когда одна добавка добавляется 2 раза подряд.
> if (!this.additive === undefined) {
Непонятно, что выполнится раньше, ! или ===. Надо либо ставить !== либо использовать скобки либо писать
if (!this.additive)
В свойствах size и fillign надо хранить саму константу (например Hamburger.SIZE_SMALL) а не словарь с ее параметрами. То, что у тебя. не позволит например сделать метод
getSize()
А так, неплохо, лучше чем раньше.
>>382130
Используй PDO как клиентскую библиотеку для связи с MySQL. Не забудь выставить ERRMODE_EXCEPTION чтобы видеть ошибки MySQL.
Никогда не вставляй переменные в тело запроса напрямую, используй плейсхолдеры.
Статья http://habrahabr.ru/post/137664/
По MySQL у меня есть сборник ссылочек и задачка: https://gist.github.com/codedokode/10539213 — попробуешь свои силы?
Переходи на PDO. Хватит насиловать труп mysql_query
>>382144
Кроме библиотеки PDO, я тебе советую еще изучить паттерны проектирования для работы с БД:
http://design-pattern.ru/patterns/table-data-gateway.html
http://design-pattern.ru/patterns/data-mapper.html
http://design-pattern.ru/patterns/active-record.html
И другие: http://design-pattern.ru/
>>382263
Это и есть «передача по ссылке». В PHP скаляры (булевы, числа и строки) и массивы копируются, а объекты передаются по ссылке. Примеры:
$a = array(1, 2, 3);
$b = $a; // копирование, создается независимая копия массива
$b[0] = 10;
var_dump($a[0]); // 1
$d = &$a; // передача по ссылке — $d и $a указывают на один массив
// ссылка имеет много подвохов и недостатков, потому не используй это в своем коде
$d[0] = 4;
var_dump($a[0]); // 4
В случае объектов, они всегда передаются по ссылке (как будто бы там всегда ставится &).
То же касается и передачи в функцию: если ты
передаешь массив и в функции он меняется, исходный остается неизменным (так как в функцию передается копия). А если ты использовал & или передавал объект, то в функцию передается ссылка на тот же самый массив или объект, а не копия.
> Но ведь для того чтобы передать по ссылке нужно указать &.
Оператор = работает по-разному для объектов и других значение. Объекты всегда передаются по ссылке, даже если & не указывать. Если указывать, это будет почти то же самое.
Мануал: http://php.net/manual/ru/language.references.php
http://php.net/manual/ru/language.oop5.references.php
Чтобы скопировать объект, надо использовать оператор clone ( http://php.net/manual/ru/language.oop5.cloning.php )
> инстанс объекта это типа указатель на структуру
PHP — это не Си, и ссылка — это не совсем указатель (не адрес в памяти), хотя у них и есть что-то похожее. Если тебя интересует, как это реализовано внутри, то можешь глянуть:
http://habrahabr.ru/post/226707/
http://habrahabr.ru/post/162713/
Переходи на PDO. Хватит насиловать труп mysql_query
>>382144
Кроме библиотеки PDO, я тебе советую еще изучить паттерны проектирования для работы с БД:
http://design-pattern.ru/patterns/table-data-gateway.html
http://design-pattern.ru/patterns/data-mapper.html
http://design-pattern.ru/patterns/active-record.html
И другие: http://design-pattern.ru/
>>382263
Это и есть «передача по ссылке». В PHP скаляры (булевы, числа и строки) и массивы копируются, а объекты передаются по ссылке. Примеры:
$a = array(1, 2, 3);
$b = $a; // копирование, создается независимая копия массива
$b[0] = 10;
var_dump($a[0]); // 1
$d = &$a; // передача по ссылке — $d и $a указывают на один массив
// ссылка имеет много подвохов и недостатков, потому не используй это в своем коде
$d[0] = 4;
var_dump($a[0]); // 4
В случае объектов, они всегда передаются по ссылке (как будто бы там всегда ставится &).
То же касается и передачи в функцию: если ты
передаешь массив и в функции он меняется, исходный остается неизменным (так как в функцию передается копия). А если ты использовал & или передавал объект, то в функцию передается ссылка на тот же самый массив или объект, а не копия.
> Но ведь для того чтобы передать по ссылке нужно указать &.
Оператор = работает по-разному для объектов и других значение. Объекты всегда передаются по ссылке, даже если & не указывать. Если указывать, это будет почти то же самое.
Мануал: http://php.net/manual/ru/language.references.php
http://php.net/manual/ru/language.oop5.references.php
Чтобы скопировать объект, надо использовать оператор clone ( http://php.net/manual/ru/language.oop5.cloning.php )
> инстанс объекта это типа указатель на структуру
PHP — это не Си, и ссылка — это не совсем указатель (не адрес в памяти), хотя у них и есть что-то похожее. Если тебя интересует, как это реализовано внутри, то можешь глянуть:
http://habrahabr.ru/post/226707/
http://habrahabr.ru/post/162713/
Когда ты реализуешь сложный алгоритм, пиши в комментарии название или ссылку на википедию, чтобы тому кто читает код не надо было его разгадывать.
> foreach ($paths[$point] as $key => $val) {
> $time[$key] = $paths[$point][$key]['time'];
Этого же вроде в алгоритме не было? Ты для первой вершины сделал 1 шаг цикла вручную, а можно без этого.
> asort($paths[$key]);
Странная функция. Она сортирует массив по значению (а там хранятся вложенные массивы, непонятно как они будут сортироваться). Ты ее с другйо сортировкой не перепутал? Вот список: http://php.net/manual/ru/array.sorting.php
По какому критерию ты хотел там сортировать массив?
> Пусть v — вершина с минимальным d[v]
У тебя это не выполняется: ты берешь первую попавшуюся вершину. Из-за этого алгоритм не может работать неверно? Я правда, тут ошибки не вижу.
> $inf = 100000;
В PHP (как и в любом языке использующем IEEE 754 https://ru.wikipedia.org/wiki/IEEE_754-2008 ) есть бесконечности: http://php.net/manual/en/math.constants.php и функция проверки на бесконечность: http://php.net/manual/ru/function.is-infinite.php
Переменные лучше переименовать понятнее:
pathDone -> pathToPoint
$paths as $key => $value -> $paths as $pointName => $info
Вообще, не исплоьзуй key и value тут, так как они ничего не говорят.
Но вообще, программа работает, это хорошо.
Когда ты реализуешь сложный алгоритм, пиши в комментарии название или ссылку на википедию, чтобы тому кто читает код не надо было его разгадывать.
> foreach ($paths[$point] as $key => $val) {
> $time[$key] = $paths[$point][$key]['time'];
Этого же вроде в алгоритме не было? Ты для первой вершины сделал 1 шаг цикла вручную, а можно без этого.
> asort($paths[$key]);
Странная функция. Она сортирует массив по значению (а там хранятся вложенные массивы, непонятно как они будут сортироваться). Ты ее с другйо сортировкой не перепутал? Вот список: http://php.net/manual/ru/array.sorting.php
По какому критерию ты хотел там сортировать массив?
> Пусть v — вершина с минимальным d[v]
У тебя это не выполняется: ты берешь первую попавшуюся вершину. Из-за этого алгоритм не может работать неверно? Я правда, тут ошибки не вижу.
> $inf = 100000;
В PHP (как и в любом языке использующем IEEE 754 https://ru.wikipedia.org/wiki/IEEE_754-2008 ) есть бесконечности: http://php.net/manual/en/math.constants.php и функция проверки на бесконечность: http://php.net/manual/ru/function.is-infinite.php
Переменные лучше переименовать понятнее:
pathDone -> pathToPoint
$paths as $key => $value -> $paths as $pointName => $info
Вообще, не исплоьзуй key и value тут, так как они ничего не говорят.
Но вообще, программа работает, это хорошо.
> как она решается через рекурсию?
Ну ты был на правильном пути, можешь достать предыдущий код и попробовать доделать. Алгоритм такой:
найтиПуть(текущая-точка, цель, пройденный-путь-от-старта-до-точки) {
если (текущая-точка и цель — соседи) {
добавляем в путь последнюю точку;
возвращаем результат;
}
перебираем соседние с текущей точки, которые не входят в пройденный-путь;
для каждой такой точки-соседа {
путь = копия проуденного пути + сосед;
список[] = найтиПуть(соседняя-точка, цель, путь);
}
Из списка выбираем наиболее короткий путь;
Возврашаем его;
}
> Пусть v — вершина с минимальным d[v]
Это должно выполняться благодаря asort. Я проверил и он сортирует точки как надо, сначала идут с наименьшим временем и по возрастанию.
Для проигрыша надо эффект пострашнее, например клетка с миной мигает черным и желтым, или все поле мигает, или череп появляется, чем жутче тем лучше.
Цифры хорошо бы отцентрировать и сделать покрупнее.
Также, надо всплывающую табличку «вы выиграли/проиграли» с кнопкой «Сыграть еще».
> target.innerHTML === ''
Это надо убрать из rightClickListener и заменить на вызов метода у cell
> self.cells[target.parentNode.rowIndex][target.cellIndex];
Тут лучше бы вынести выражения в скобках в переменные, а то тяжело читать
Кстати, правый клик не работает в фаерфоксе — ничего не происходит.
Ты предотвращаешь событие mousedown. Я не уверен, но по идее, из-за этого событие click в каких-то браузерах может и не сработать, кто его знает. Я советую отказаться от click и использовать только mousedown.
> this.getNumberAroundMines(cell
Повторяется раза 3, вынеси в переменную
В рекурсии надо сделать проверку, чтобы не открывать уже открытые клетки. Иначе может получиться бесконечная рекурсия, две соседних клетки будут открывать друг друга.
Третий параметр у openCell не нужен. Зачем он? У тебя явно ошибка.
> this.cells[j][k]
Я бы писал this.getCellAt(x, y) чтобы абстрагироваться от способа хранения клеточек. Но это не обязательно.
Для проигрыша надо эффект пострашнее, например клетка с миной мигает черным и желтым, или все поле мигает, или череп появляется, чем жутче тем лучше.
Цифры хорошо бы отцентрировать и сделать покрупнее.
Также, надо всплывающую табличку «вы выиграли/проиграли» с кнопкой «Сыграть еще».
> target.innerHTML === ''
Это надо убрать из rightClickListener и заменить на вызов метода у cell
> self.cells[target.parentNode.rowIndex][target.cellIndex];
Тут лучше бы вынести выражения в скобках в переменные, а то тяжело читать
Кстати, правый клик не работает в фаерфоксе — ничего не происходит.
Ты предотвращаешь событие mousedown. Я не уверен, но по идее, из-за этого событие click в каких-то браузерах может и не сработать, кто его знает. Я советую отказаться от click и использовать только mousedown.
> this.getNumberAroundMines(cell
Повторяется раза 3, вынеси в переменную
В рекурсии надо сделать проверку, чтобы не открывать уже открытые клетки. Иначе может получиться бесконечная рекурсия, две соседних клетки будут открывать друг друга.
Третий параметр у openCell не нужен. Зачем он? У тебя явно ошибка.
> this.cells[j][k]
Я бы писал this.getCellAt(x, y) чтобы абстрагироваться от способа хранения клеточек. Но это не обязательно.
>>382283
Потому, что $a — это объект. В переменной лежит не объект, а ссылка на него. Соответственно ты копируешь эту ссылку, на тот же самый объект.
Объекты всегда передаются по ссылке (не только в PHP но и в ruby, java, python, js и других языках).
>>382364
Оно и до 5.6 было возможно, так как в PHP можно передавать больше аргументов чем указано (меньше — нельзя). То етсть пишем
function lalala() {
$args = func_get_args();
...
}
И делаем что хотим. Но с появлением синтаксиса для этого, конечно, все стало лучше и удобнее.
>>382399
Э, не. Ты сортируешь массив соседних точек. А там надо брать минимальное время из всех не обойденных точек. Это время вычисляется на каждом шаге цикла, а до цикла оно недоступно, так как все значения равны бесконечности. Ты не то сортируешь.
> Я проверил и он сортирует точки как надо
Это ненадежно, так как если мы переставим элементы в массиве местами, или доабвим новые элементы, оно перестанет работать. Для таких ситуация надо использовать uasort, и явно определить порядок сорировки:
uasort($array, function ($a, $b) {
...
});
Твой код слишком ненадежный, так писать не стоит.
>>382283
Потому, что $a — это объект. В переменной лежит не объект, а ссылка на него. Соответственно ты копируешь эту ссылку, на тот же самый объект.
Объекты всегда передаются по ссылке (не только в PHP но и в ruby, java, python, js и других языках).
>>382364
Оно и до 5.6 было возможно, так как в PHP можно передавать больше аргументов чем указано (меньше — нельзя). То етсть пишем
function lalala() {
$args = func_get_args();
...
}
И делаем что хотим. Но с появлением синтаксиса для этого, конечно, все стало лучше и удобнее.
>>382399
Э, не. Ты сортируешь массив соседних точек. А там надо брать минимальное время из всех не обойденных точек. Это время вычисляется на каждом шаге цикла, а до цикла оно недоступно, так как все значения равны бесконечности. Ты не то сортируешь.
> Я проверил и он сортирует точки как надо
Это ненадежно, так как если мы переставим элементы в массиве местами, или доабвим новые элементы, оно перестанет работать. Для таких ситуация надо использовать uasort, и явно определить порядок сорировки:
uasort($array, function ($a, $b) {
...
});
Твой код слишком ненадежный, так писать не стоит.
А, работают. Надо куда-нибудь console.log() тогда вставить, чтобы ошибку ввыводило. Там потом выскакивает ошибка jsbin'a. Так и должно быть? http://jsbin.com/lubewuqa/9/edit?js,console - попытался сделать проверку на повторную добавку, не получается. Не могу разобраться с возникающей ошибкой. Алсо, как мне постоянно пополнять объект с добавками, не обнуляя его? Через замыкание?
>>382487
> PHP Notice: Undefined variable: pecent in /home/fHDWZ1/prog.php on line
13
Опечатался в имени переменной, проверь внимательно 13 строку.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
Решал часа 3-4, привыкал к синтаксису, тяжковато к переменным добавлять доллар,в конце выражений ставить точку с запятой. BTW, спасибо ОП за проделанную работу!Начал сразу с решения бонусных задач, так как опыт программирования имеется (питон). Вот решил задачу №1, про раздачу купюр.
http://ideone.com/9Kgn03
программирования имеется (питон).
Спасибо. Я что-то не догадался посмотреть на сообщение от PHP
Вы видите копию треда, сохраненную 19 сентября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.