Этого треда уже нет.
Это копия, сохраненная 17 января 2015 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
157 Кб, 1024x683
34 Кб, 650x384
47 Кб, 636x400
Клуб изучающих PHP #39 !xnn2uE3AU. # OP #411701 В конец треда | Веб
Добро пожаловать. В этом ИТТ треде мы изучаем PHP (а также MySQL, JS, CSS, HTML), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то хочет делать сайты, кто-то хочет просто размять мозги и заняться чем-то полезным.

Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.

Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).

Предыдущий тред был тут: >>408466

У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.

Есть еще у нас задачки на HTML, JS, MySQL.

Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.

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

Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

Что почитать?

Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
HTML/CSS: Путь верстальщика: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
MySQL: https://gist.github.com/codedokode/10539213

Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.

Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175

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

Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)

Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8

ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.

Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.

В общем, давайте начинать уже!
56 Кб, 500x644
53 Кб, 636x636
!xnn2uE3AU. #2 #411703
Прочитай сначала этот пост.

Как и чем отформатировать код

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

Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.

Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):

- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...

Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.

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

Подробнее: https://gist.github.com/codedokode/8759492

Основные правила

Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
56 Кб, 500x644
53 Кб, 636x636
!xnn2uE3AU. #2 #411703
Прочитай сначала этот пост.

Как и чем отформатировать код

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

Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.

Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):

- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...

Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.

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

Подробнее: https://gist.github.com/codedokode/8759492

Основные правила

Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
!xnn2uE3AU. #3 #411704
Анон который делает uppu.ru, не пропусти: >>411530\t
#4 #411745
Оп-кун, а вот смотри.

class Student

метод чека на ошибки вводе данных, которые присваивают Student-у должен быть в нем?

или StudentMapper, проверять на уникальность перед записью нужно выносить в отедельный класс или функцию?

Я просто нашел шпаргалки по SOLID-у и теперь пытаюсь код писать в соотвествии.
#5 #411751
>>411745

Есть разные мнения, где. С одной стороны конечно логично если студент умеет сам себя проверять на правильность, а маппер должен заниматься взаимодействием с БД (не очень-то логично что для проверки студента на правильность тебе надо тянуть класс работы с БД). Но с другой стороны уникальность email студент проверить не может. Так что наверно придется либо в маппер засунуть либо по 2 классам разнести.
#6 #411753
>>411751
Я пока так и впихнул, правда проверка перед сохранениям в БД в одном методе. А ты как думаешь, что лучше?
#7 #411755
>>411745

тут http://stackoverflow.com/questions/1127898/oo-design-patterns-to-use-for-validation если ты понимаешь анлийский, вообще предлагают сделать валидатор отдельной сущностью:

foreach ($validators as $validator) {
$errors += $validator->validate($staudent);
}

При таком подходе:

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

В ZF валидаторы сделаны как отдельные классы: http://framework.zend.com/manual/2.0/en/modules/zend.validator.set.html — но заметь что там еще нужен класс, который применит эти валдаторы к полям модели студента.

Я думаю, что для простой задачи отдельные классы-валидаторы наверно слишком сложно. Можно тупо функции положить в класс или вписать валидацию в маппер.
#8 #411756
>>411753

В одном методе не дложно быть. Должна быть возможность проверить студента не сохраняя в БД. Да и не надо все в один метод валить.
197 Кб, 997x2086
#9 #411764
Посоны, а вы видели эту битву петухов?
http://habrahabr.ru/post/244311/
Так охуенно, у меня аж малофья потекла.
#10 #411766
>>411764

> Исключения — фасады как в lavarel


Фанат лавареля не палится. Отстой этой фасады.
#11 #411767
>>411764

Алсо, ничего страшного в этом нет. Все новички делают ошибки. В нашем треде им помогают их исправить и объясняют почему и как надо писать правильно.
#12 #411775
>>411764

Алсо, я прокомментирую. Многих не устраивают существующие фремйоврки и в этом нет ничего плохого, может так появится новый фреймворк.

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

Ну и

> PHPT тесты — запускаются из одного файла, писать и читать тесты просто (не зря их используют в разработке самого PHP, и, например, в модифицированном виде в HHVM), в отличии от монстра PHPUnit


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

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

Если мне например надо сравнить 2 массива (ожидаемый и получившийся) или 2 объекта — там все это есть. А как это делать череp ориентированный на вывод текста phpt? да никак, какими-нибудь костылями разве что. Не очень-то и удоюно.

> Повсеместное кэширование — в подавляющем большинстве запросов ядро даже не соединяется с БД, так как кэшируется всё, что имеет смысл кэшировать.


Где кеширование там инвалидация кеша. Для какого-то сайта ок кешировать все подряд, для какого-то не ок, и получается куча проблем на отладку которых уйдет время.
#13 #411780
>>411704
Не пропустил.
>>411702
!xnn2uE3AU. #14 #411786
>>411780

>>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP


> Хм, у меня работает.


Какая версия mySQL? Можешь сделать

SHOW CREATE TABLE files\G

?

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


Браузер не знает какой шаблон или файл отвечает за вывод страницы (откуда? сервер для него черный ящик). Он видит только URL в адресной строке вроде /download/6 и от него отсчиытвает.

Если писать путь с / то он всегда идет от корня сайта:

<img src="/hello.png"

Тебе бы надо почитать про относительные URL, например:

http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm

Держи мини-задачку:

Есть страница http://example.com/test/hello/world.ext?x=2

Напиши как можно более короткие относительные (относительно этой страницы) ссылки, которые указывают на страницы:

http://example.com/test/hello/world.ext?x=1
http://example.com/test/hello/world.ext?x=2#qwerty
http://example.com/test/goodbye/world.png
http://example.com/test/hello/kitty.png?x=2
http://example.com/?x=2
http://goodbye.example.com/test

(еще хорошей задачей было бы написать функцию-преобразовывалку относительных ссылок в абсолютные. Но это наверно сложновато).

> А у меня нет таких классов. Наверное, это связано с этим


У тебя есть другие: http://getbootstrap.com/components/#navbar

> А при выключенных коротких тегах <?= работает?


Начиная с 5.4 да. Так что смело используй.

> Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?


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

> Бтв, в тексте коммента тоже.


Молодец что сам нашел.

> По хорошему и имейл стоит проверять, но можно же и не проверять?


Можно проверять что есть @ и что внутри нет пробелов. На практике люди часто опечатываются например заменяя точку на пробел или путая еще какой-нибудь символ. Кстати, насчет валидации, на клиенте браузер предоставляет HTML5 валидацию, она простенькая но у нас и проект простенький:

http://htmlbook.ru/html/input/required
http://habrahabr.ru/post/105761/
http://webformyself.com/vvedenie-v-formy-html5-i-novye-atributy/ (много рекламы но вроде статья адекватная)

Заметь что у такой валидации есть плюсы и минусы. Плюсы — простота, надежность, кроссбраузерность, graceful degradation. минусы — нет контроля над поведением и внешним видом, дизайнеры не одобрят.

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

> Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.


nl2br например погугли. Если ты хранишь перевод строки как \n то в HTML он равносилен пробелу. Ох, пробелы у тебя в знаниях HTML.

> В общем то у меня там стоит if (data == 0), что сработает, при возвращении false.


https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L26 — тут нету, может ты конечно пока не запушил на гитхаб это. Вообще сфинкс возвращает false если все плохо, например что-то неправильно настроено или непраивльн сформирован запрос. Надо либо ронять сайт исключением либо хотя бы писать в лог детали.

> Это вообще жуть. Я ни слова не понял. Но разберусь.


Если кратко. Злодей создает html-страничку с формой комментария как у тебя, уже заполненной. У этой формы в action написано

action="http://uppu.ru/comment"

То есть данные из нее отправляются на твой сайт. Злодей делает эту форму невидимой и добавляет скрипт для ее автоматической отправки при загрузке страницы.

После этого он заманивает людей на свою страничку (например поместив ее в невидимый ифрейм на посещаемом сайте) и все посетители его сайта не подозревая об этом оставляют комментарии у тебя от своего IP.

Увидеть такую ситуацию можно по заголовку referer (но ты не должен использовать его для защиты так как это ненадежно. Исплоьзуй токены).

Комметарии — это мелочь. А если бы у тебя быа платежная система, а в ней форма перевода денег?

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

По идее защита от CSRF должна была бы автоматически быть встроена в браузеры. Увы, когда делались формы, никто о таких вещах не догадывался.
!xnn2uE3AU. #14 #411786
>>411780

>>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP


> Хм, у меня работает.


Какая версия mySQL? Можешь сделать

SHOW CREATE TABLE files\G

?

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


Браузер не знает какой шаблон или файл отвечает за вывод страницы (откуда? сервер для него черный ящик). Он видит только URL в адресной строке вроде /download/6 и от него отсчиытвает.

Если писать путь с / то он всегда идет от корня сайта:

<img src="/hello.png"

Тебе бы надо почитать про относительные URL, например:

http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm

Держи мини-задачку:

Есть страница http://example.com/test/hello/world.ext?x=2

Напиши как можно более короткие относительные (относительно этой страницы) ссылки, которые указывают на страницы:

http://example.com/test/hello/world.ext?x=1
http://example.com/test/hello/world.ext?x=2#qwerty
http://example.com/test/goodbye/world.png
http://example.com/test/hello/kitty.png?x=2
http://example.com/?x=2
http://goodbye.example.com/test

(еще хорошей задачей было бы написать функцию-преобразовывалку относительных ссылок в абсолютные. Но это наверно сложновато).

> А у меня нет таких классов. Наверное, это связано с этим


У тебя есть другие: http://getbootstrap.com/components/#navbar

> А при выключенных коротких тегах <?= работает?


Начиная с 5.4 да. Так что смело используй.

> Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?


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

> Бтв, в тексте коммента тоже.


Молодец что сам нашел.

> По хорошему и имейл стоит проверять, но можно же и не проверять?


Можно проверять что есть @ и что внутри нет пробелов. На практике люди часто опечатываются например заменяя точку на пробел или путая еще какой-нибудь символ. Кстати, насчет валидации, на клиенте браузер предоставляет HTML5 валидацию, она простенькая но у нас и проект простенький:

http://htmlbook.ru/html/input/required
http://habrahabr.ru/post/105761/
http://webformyself.com/vvedenie-v-formy-html5-i-novye-atributy/ (много рекламы но вроде статья адекватная)

Заметь что у такой валидации есть плюсы и минусы. Плюсы — простота, надежность, кроссбраузерность, graceful degradation. минусы — нет контроля над поведением и внешним видом, дизайнеры не одобрят.

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

> Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.


nl2br например погугли. Если ты хранишь перевод строки как \n то в HTML он равносилен пробелу. Ох, пробелы у тебя в знаниях HTML.

> В общем то у меня там стоит if (data == 0), что сработает, при возвращении false.


https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L26 — тут нету, может ты конечно пока не запушил на гитхаб это. Вообще сфинкс возвращает false если все плохо, например что-то неправильно настроено или непраивльн сформирован запрос. Надо либо ронять сайт исключением либо хотя бы писать в лог детали.

> Это вообще жуть. Я ни слова не понял. Но разберусь.


Если кратко. Злодей создает html-страничку с формой комментария как у тебя, уже заполненной. У этой формы в action написано

action="http://uppu.ru/comment"

То есть данные из нее отправляются на твой сайт. Злодей делает эту форму невидимой и добавляет скрипт для ее автоматической отправки при загрузке страницы.

После этого он заманивает людей на свою страничку (например поместив ее в невидимый ифрейм на посещаемом сайте) и все посетители его сайта не подозревая об этом оставляют комментарии у тебя от своего IP.

Увидеть такую ситуацию можно по заголовку referer (но ты не должен использовать его для защиты так как это ненадежно. Исплоьзуй токены).

Комметарии — это мелочь. А если бы у тебя быа платежная система, а в ней форма перевода денег?

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

По идее защита от CSRF должна была бы автоматически быть встроена в браузеры. Увы, когда делались формы, никто о таких вещах не догадывался.
#15 #411787
>>411780

А еще. Для всех пришедшиз из формы данных надо делать trim. Ведь пробел с края, например после имени, невидим, его легко поставить но он не должен идти в базу.
1894 Кб, Webm
1879 Кб, Webm
коши-мыши sage #16 #411805
;зз
осталось только разобраться с колизиями животных одного типа
http://pastebin.com/gbUACdXi
#17 #411855
>>411805
А где собачка и почему происходит наложения?
#18 #411856
Последние две задачки(ответ на любой вопрос, генератор имен) из урока массивов не содержат в себе условий на принятие действий с моей стороны. Т.е. впредь мне лучше пытаться все с нуля писать и только в случае проблем обращаться к пикчам и кодам?
#19 #411859
>>411742
http://ideone.com/nglLZe
>>411728
http://ideone.com/515bd5
Вот первая, только я не понял зачем нужно указывать количество яблок если это и так исходит из строки где перечисляется вес каждого яблока
70 Кб, 918x408
#20 #411863
>>411728
В этой задаче можно самому отредактировать стартовую строчку условия? Там дохрена незаэкранорованных кавычек в условии.
#21 #411883
>>411805
Как это в 90 строк уместилось? Что за язык?
#22 #411892
>>411883
python, очевидно же
#23 #411901
>>410692
Тут вот какая проблема возникла: если у мышей убрать свойство $cats и сделать его просто возвращаемым массивом свойства findAllCats, то выдаёт фатал ерор, так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение, что он не определен, во вторых критическую ошибку, что мы пытаемся вызвать метод getCoordinateX не у объекта. Хотя со свойством $cats все работало.
134 Кб, 640x853
#24 #411911
>>411775
Ну ты же сам себе противоречишь. Причем так мерзко, как какая-нибудь вертлявая шлюха - в жопу я не даю, я ведь порядочная женщина. Делайте ребята что-нибудь новое, ломайте устои - но только следуйте стандартам. Вообще охуеть.

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

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

Хоть я и не сторонник выравнивания табами, но я считаю что этот ебаный хипстахаб, на который все так люто надрачивают, просто блядь обязан добавить нормальную их поддержку. Жавадибилам ведь уже пошли на встречу сделав схлопывающиеся каталоги, теперь настало очередь табов.
И только не надо рассказывать тут что это так и задумано, что табы так и должны отображаться. Ни для кого не секрет, что веб-технологии и фронтенд в частности это большая куча из говна и костылей в которой вообще блядь все сломано. Если нужен еще один костылик для нормального отображения табов - то говно вопрос его добавить.
#25 #411923
>>411786

>SHOW CREATE TABLE files\G


1. row
Table: files
Create Table: CREATE TABLE `files` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`size` int(11) NOT NULL,
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mediadata` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

Видимо MySQL умнее меня, лол.

>Тебе бы надо почитать про относительные URL, например:


И там мне говорят, что пути от корня - нормально. Такие дела. Мол, это локально такие пути творят какую-то фигню, а на вебсервере все хорошо.

>Держи мини-задачку:


world.ext?x=1
#qwerty
../goodbye/world.png
kitty.png?x=2
/?x=2
http://goodbye.example.com/test

>Молодец что сам нашел.


Так соседние строчки просто.

>Можно проверять что есть @ и что внутри нет пробелов.


Вроде бы есть какой-то встроенный метод. А у бутстрапа есть какой-то скрипт для проверки на стороне клиента.

>У тебя есть другие: http://getbootstrap.com/components/#navbar


Так я оттуда и взял. Не сам же я додумался туда форму вписать.

>Ох, пробелы у тебя в знаниях HTML.


Пробелы - это когда знания есть. У меня они на уровне "я в восьмом классе делал две странички".

>Исплоьзуй токены


Как только узнаю, что это. Вечером, скорее всего.
#25 #411923
>>411786

>SHOW CREATE TABLE files\G


1. row
Table: files
Create Table: CREATE TABLE `files` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`size` int(11) NOT NULL,
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mediadata` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

Видимо MySQL умнее меня, лол.

>Тебе бы надо почитать про относительные URL, например:


И там мне говорят, что пути от корня - нормально. Такие дела. Мол, это локально такие пути творят какую-то фигню, а на вебсервере все хорошо.

>Держи мини-задачку:


world.ext?x=1
#qwerty
../goodbye/world.png
kitty.png?x=2
/?x=2
http://goodbye.example.com/test

>Молодец что сам нашел.


Так соседние строчки просто.

>Можно проверять что есть @ и что внутри нет пробелов.


Вроде бы есть какой-то встроенный метод. А у бутстрапа есть какой-то скрипт для проверки на стороне клиента.

>У тебя есть другие: http://getbootstrap.com/components/#navbar


Так я оттуда и взял. Не сам же я додумался туда форму вписать.

>Ох, пробелы у тебя в знаниях HTML.


Пробелы - это когда знания есть. У меня они на уровне "я в восьмом классе делал две странички".

>Исплоьзуй токены


Как только узнаю, что это. Вечером, скорее всего.
#26 #411924
У меня трабл:
http://ideone.com/4iLVaa
Не знаю, что делать с этим
Вылетает с:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3', '5'' at line 1 in C:\wamp\www\view.php on line 14
#27 #411928
>>411924
Напиши LIMIT ? OFFSET ?
#28 #411931
>>411928
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3' OFFSET'5'' at line 1 in C:\wamp\www\view.php on line 14
#29 #411932
>>411901
http://ideone.com/SwmSzq Вообщем вот. Систему очков пока не придумал, так что тестирую на старой. Критические ошибки исправил, но все равно выдает предупреждения, когда кошка вне поле зрения мышей. Ах да, насчет изменения иконки кошки. Как мне модифицировать метод getIcon родительского класса в классе кошки?
#30 #411933
>>411931

>PHP bug: if you don't specify PDO::PARAM_INT, PDO may enclose the argument in quotes. This can mess up some MySQL queries that don't expect integers to be quoted.


>See: https://bugs.php.net/bug.php?id=44639


>If you're not sure whether the value you're passing is an integer, use the is_int() function.



Используй bind_value с PARAM_INT для лимита и оффсета, или сразу лимит с двумя параметрами.
#31 #411941
>>411933
Спасибо, помогло
1065 Кб, 1254x890
sage #32 #411944
>>411883
рнр7 + огл

>>411855
нету =(
#33 #411947
Смотрю вакансии и в печале.
#34 #411948
>>411947
Где смотришь и почему в печали?
#35 #411950
>>411948
Видимо он, как и я, далеко не из дс.
#36 #411951
>>411948
Киев/Львов.

Почти везде jQuery требуют вместе с js + из 3,5 вакансий 1,5 удаленки, которая с кидалом скорее всего и еще 1(нужно ВО).
#37 #411972
Подскажите как сделать грамотно форму логина? Нужно не просто два поля под логин и пароль и отправлять их пыхе на обработку, а какой-то скрытый обработчик?

например вот тут кто может пояснить что и зачем напихано в форму?
http://ab-w.net/HTML/html_forms.php

<title>Один из возможных вариантов HTML формы</title>
</head>
<body>
<form name="f1" method="get" action="enter_data.php">
<input name="link" type="hidden" value="index.php" />
Логин: <br />
<input name="login" type="text" size="25" maxlength="30" value="Вася" /> <br />
Пароль: <br />
<input name="pd" type="password" size="25" maxlength="30" value="" /> <br />
<input name="remember" type="checkbox" value="yes" /> Запомнить <br />
<input type="submit" name="enter" value="Вход" />
</form>
</body>
</html>

что есть enter_data.php , а что index.php в этой форме?
#38 #411980
>>411805

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

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

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

А так, конечно, хорошо, что ты решил сделать не поле из клеточек, а непрерывное пространство. Интересно смотрится.

Кстати, на Хаскелле наверно удобно моделировать и другие вещи, например движение планет в двойной или тройной звездной системе, сборку молекул и т.д (просто когда я вижу эти точечки, у меня сразу ассоциации с физикой вознимают).
#39 #411983
>>411856

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

>>411859

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


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

Если ты уже передаешь массив (а не строку) то число передавать не надо.

> замостить площадь


Правильно решено

> яблоки


2 яблока можно поделить, а пишет что нет: http://ideone.com/jDrBHm
яблоки 200 200 200 нельзя поделить, а пишет что можно: http://ideone.com/dbxv75
#40 #411988
>>411863

Поменять можно только в сторону усложнения.

> Там дохрена незаэкранорованных кавычек в условии.


И ты не можешь их вставить в строку? Ой ты бедненький. Ну-ка беги перечитывай мануал: http://php.net/manual/ru/language.types.string.php (целиком)

Есть минимум 2 способа:

— вставлять через бекслеш
— использовать heredoc/nowdoc (рекомендуется)

В общем, ты должен уметь писать любые строки с любыми символами.

>>411883

В 90 строк потому что он все сваливает в кучу.

Язык Haskell.

>>411901

> Тут вот какая проблема возникла


Проблема есть, но ты ее решаешь неприавльно. Свойства — это свойства объекта. «Кошки рядом» вряд ли является свойством мыши. Значит проблему надо решать не добавлением свойства а по-другому, например, исправить неприавльно написанный код.

> так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение


Это у тебя код неприавльный.

>>411911

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

Табы должны умереть. Почему?

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

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

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

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

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

Также хочу напомнить, что кроме таба и пробела есть другие пробельные символы: неразрывный пробел, узкий пробел пробел нулевой ширины, разделитель строк. Почему бы вам и их не начать использовать?
#40 #411988
>>411863

Поменять можно только в сторону усложнения.

> Там дохрена незаэкранорованных кавычек в условии.


И ты не можешь их вставить в строку? Ой ты бедненький. Ну-ка беги перечитывай мануал: http://php.net/manual/ru/language.types.string.php (целиком)

Есть минимум 2 способа:

— вставлять через бекслеш
— использовать heredoc/nowdoc (рекомендуется)

В общем, ты должен уметь писать любые строки с любыми символами.

>>411883

В 90 строк потому что он все сваливает в кучу.

Язык Haskell.

>>411901

> Тут вот какая проблема возникла


Проблема есть, но ты ее решаешь неприавльно. Свойства — это свойства объекта. «Кошки рядом» вряд ли является свойством мыши. Значит проблему надо решать не добавлением свойства а по-другому, например, исправить неприавльно написанный код.

> так как на первых ходах кошка далеко и в массив ничего не записывается и при обращении к 0 элементу выдает во первых предупреждение


Это у тебя код неприавльный.

>>411911

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

Табы должны умереть. Почему?

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

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

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

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

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

Также хочу напомнить, что кроме таба и пробела есть другие пробельные символы: неразрывный пробел, узкий пробел пробел нулевой ширины, разделитель строк. Почему бы вам и их не начать использовать?
#41 #411997
>>411923

> задачка на URL


Ты решил 4 из 6 пунктов.

> world.ext?x=1


Можно сделать еще раза в 2 короче

> http://goodbye.example.com/test


можно сделать на 5 символов короче

> Вроде бы есть какой-то встроенный метод.


Есть функция filter_var. Насчет бутстрапа сомневаюсь но type="email" в современных браузерах само проверяет поле, у меня в хроме работаеи. Также, указывать тип email полезно для мобильных устройств которые выдвинут соответствующую клавиатуру с значками @ и .

>>411933

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

$bindParam(':limit', intval($limit))

Но с PARAM_INT конечно надежнее выходит.

>>411951

Это реально изучить может за пару-тройку месяцев. Не хочешь мои задачки по JS помучать?

https://gist.github.com/codedokode/ce30e7a036f18f416ae0

Также если ты слабо знаешь HTML/CSS есть задачки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
#41 #411997
>>411923

> задачка на URL


Ты решил 4 из 6 пунктов.

> world.ext?x=1


Можно сделать еще раза в 2 короче

> http://goodbye.example.com/test


можно сделать на 5 символов короче

> Вроде бы есть какой-то встроенный метод.


Есть функция filter_var. Насчет бутстрапа сомневаюсь но type="email" в современных браузерах само проверяет поле, у меня в хроме работаеи. Также, указывать тип email полезно для мобильных устройств которые выдвинут соответствующую клавиатуру с значками @ и .

>>411933

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

$bindParam(':limit', intval($limit))

Но с PARAM_INT конечно надежнее выходит.

>>411951

Это реально изучить может за пару-тройку месяцев. Не хочешь мои задачки по JS помучать?

https://gist.github.com/codedokode/ce30e7a036f18f416ae0

Также если ты слабо знаешь HTML/CSS есть задачки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
#42 #412005
>>411932

> . Как мне модифицировать метод getIcon родительского класса в классе кошки?


Просто пишешь в классе кошки public function getIcon и он перекроет родительский. Родительский можно вызвать ихз него через parent::getIcon.

http://php.net/manual/ru/language.oop5.paamayim-nekudotayim.php

То есть ты пишешь примерно так

если (кошка спит) {
вернуть одно
} иначе {
вызвать родительский метод
}

таким образом дети могут переопределять или дополнять поведение родителя.

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


Это у тебя код кривой.

> if ($cats[0]) {


Это ошибка. Ты не должен обращаться к несуществующему элементу. Проверить наличие можно так:

if (count($cats)....
if (isset($cats[0])
if (!empty($cats[0]))
if (array_key_exists(....)

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

Также. вторая ошибка: если ни одной кошки нет, переменные x и у не создадутся и дальнейший код тоже работать правильно не будет.

Всю эту функцию вообще надо переписать, она кривая до невозможности.

> elseif ($this->y < $y && $this->y != 0 && !$this->field->checkTile($this->x, $this->y - 1))


Вместо того чтобы копипастить эту колбасу, надо сделать функцию и вызывать ее.

> $target = $this->findClosestMouse( );


> if ($target['x'] > $this->x) {


Незачем тут лишний массив делать. Можно в target хранить объект-мышь а не ее координаты.

В общем, давай, решись уже переделать код.
#42 #412005
>>411932

> . Как мне модифицировать метод getIcon родительского класса в классе кошки?


Просто пишешь в классе кошки public function getIcon и он перекроет родительский. Родительский можно вызвать ихз него через parent::getIcon.

http://php.net/manual/ru/language.oop5.paamayim-nekudotayim.php

То есть ты пишешь примерно так

если (кошка спит) {
вернуть одно
} иначе {
вызвать родительский метод
}

таким образом дети могут переопределять или дополнять поведение родителя.

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


Это у тебя код кривой.

> if ($cats[0]) {


Это ошибка. Ты не должен обращаться к несуществующему элементу. Проверить наличие можно так:

if (count($cats)....
if (isset($cats[0])
if (!empty($cats[0]))
if (array_key_exists(....)

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

Также. вторая ошибка: если ни одной кошки нет, переменные x и у не создадутся и дальнейший код тоже работать правильно не будет.

Всю эту функцию вообще надо переписать, она кривая до невозможности.

> elseif ($this->y < $y && $this->y != 0 && !$this->field->checkTile($this->x, $this->y - 1))


Вместо того чтобы копипастить эту колбасу, надо сделать функцию и вызывать ее.

> $target = $this->findClosestMouse( );


> if ($target['x'] > $this->x) {


Незачем тут лишний массив делать. Можно в target хранить объект-мышь а не ее координаты.

В общем, давай, решись уже переделать код.
#43 #412008
>>411972

> что есть enter_data.php


Иди читай теорию по html form: http://htmlbook.ru/html/form

> а что index.php в этой форме?


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

Также, я думаю, тебе надо пока изучать более простые вещи, например просто работу с формами. Ты берешься сразу за сложное и в итоге ничего не понимаешь.
#44 #412009
>>411997

>> world.ext?x=1


>Можно сделать еще раза в 2 короче


Очевидно ?x=1

>> http://goodbye.example.com/test


>можно сделать на 5 символов короче


Здесь не так очевидно.
#45 #412011
>>411997
Реально, но у меня остался месяц + 2-3 недели, во время, которых надо сдать сессию, что бы иметь пол года стипендию.

CSS Я вообще почти не знаю(руководствуюсь принципом, по ходу задачи разберусь), а вот html знаю.
#46 #412013
>>412009

https://ru.wikipedia.org/wiki/URI#.D0.9E.D1.82.D0.BD.D0.BE.D1.81.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_URI

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

Схему (http:) можно не указывать если она общая. Это удобно когда есть http и https версия сайта и ты хочешь чтобы ссылка использовала тот же протокол.

Заметь также что относительный URL может быть вообще пустым. То есть <a href=""> вполне рабочая ссылка на саму себя.

Стандарт описывающий относительные URL: https://tools.ietf.org/html/rfc3986#section-4.2 (англ)

>>412011

Ну может если ты будешь быстро изучать ты справишься лучше, но это вряд ли. Можешь конечно погуглить статьи по jQUery c готовыми примерами, но знать ты его от этого не станешь.
#47 #412016
>>412013

>Я советую прочесть целиком, статья небольшая и понятная.


Прочитал. Все равно не вижу там ничего похожего.
#48 #412018
>>412016

Открой еще раз

//example.org/scheme-relative/URI/with/absolute/path/to/resource.txt
#49 #412021
>>411983
http://ideone.com/Zy42wA
А так? Модифицировал слегка свое решение банкомат на выдачу яблок.
#50 #412022
>>412018
Все равно не понимаю. Как мне с example.com перейти на goodbye.example.com?
16 Кб, 544x391
#51 #412023
>>412008
Я сделал в итоге простую форму, с перекидыванием на страницу проверки. Не стал вещь которую не до конца понимаю копировать.
#52 #412026
>>412022

//goodbye.example.com

Так как схема в обоих случаях одинаковая (http:) ее можно не писать
#53 #412027
>>412021

> $apples2[$value] = count(array_keys($array, $value));


Есть же array_count_values

> if ($arg > $count) {


> $arg = $count;


Это лучше записать через функцию max или min

> $sum = $arg $mass;


> $half -= $sum;


Это лучше написать в 1 строчку

> if ($arg != 0) {


> $summary_mass += $sum;


if тут не нужен. Если arg == 0 то sum тоже равно нулю.
#55 #412052
ОП, ты в нас веришь? Думаешь аутисты которые тут не могут решать задачи с айфонами могут стать хорошими программистами?
#56 #412069
>>412052

Посмотри на современный интернет. Глючный, кривой, ненадежный, тормозит, быдлокод на быдлокоде. Ты думаешь гении эти сайты делают?
25 Кб, 1366x491
14 Кб, 444x141
Yii1 #57 #412072
Есть форма работы с таблицей albums. Но по логике при добавлении нового альбома нужно указывать группу (таблица bands), которая его написала. Связи групп и альбомов указываются в таблице bands_albums. В /views/albums/_form.php какое-либо поле указывается так:
\t<div class="row">
\t\t<?php echo $form->labelEx($model,'name'); ?>
\t\t<?php echo $form->textField($model,'name',array('size'=>45,'maxlength'=>45)); ?>
\t\t<?php echo $form->error($model,'name'); ?>
\t</div>

А как мне указать поле из другой таблицы?
подразумеваю, что надо создать контролер, модель и вид таблицы bands_albums. И как-то оттуда из вида выдернуть нужные мне поля. Правильно мыслю?
#58 #412073
>>412072

>Связи групп и альбомов указываются в таблице bands_albums.


Зачем? У альбома много групп может быть?
#59 #412075
>>412072

>что надо создать контролер,


нет

>модель


да

>и вид таблицы


маловероятно
#60 #412076
>>412073
Может
>>412075
Новичок требует больше подробностей
#61 #412077
>>412072

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

http://harvesthq.github.io/chosen/

(не будешь же ты id руками вводить, верно?)

Либо сделать связь между группами и альбомами на отдельной странице.

Связь между таблицами прописывается в activeRecord классе, ты знаешь?

http://habrahabr.ru/post/216605/
http://play-stop.ru/yii/realizovat-svyaz-mnogie-ko-mnogim-v-yii.html
#62 #412079
>>412039

> if ($arg > max($apples2)) {


> $arg = max($apples2);



Нет. Это не то. Я имел в виду, что конструкцию

if ($a > $b) {
$a = $b;
}

можно заменить на $a = min($a, $b);

Исправь это и задача будет решена.

>>412052

Ну и добавлю еще. Ты можешь подумать, что у нас тут «программирование уровня /b», но это не так. Если ты будешь решать все задания, которые я даю, включая задания на HTML, MySQL, JS, фреймворки, то у тебя будет неплохой уровень знаний и опыта в итоге и ты будешь гораздо лучше чем те кто учился по сомнительным устаревшим учебникам или на сомнительных курсах. А те технолгии, что мы изучаем (после учебника), вроде фреймворков, используют многие компании.

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

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

> не могут решать задачи с айфонами


Это задача для новичка сложная, на ней все спотыаются, не надо тут делать выводы из-за того что у тебя ничего не получится.
#63 #412080
>>412077
Спасибо. Теперь немного прояснилось
#64 #412091
>>412079
Поддвачну ОПа. Нашел работу с меньшим уровнем знаний, чем можно получить тут. Начинал тогда делать учебник опа, но не закончил, теперь вот делаю.
15 Кб, 647x427
#65 #412100
>>411701

ОП, смотри это из тестхаба. Создаем тест, добавляем необходимое количество вопросов для него. Весь функционал для этого я сделал, но возникла загвоздка. Для описания теста и для текста вопроса нужно добавить возможность форматирования, редактирования, добавления картинок в текст. Нашел такой замечательный плагин http://imperavi.com/redactor/, благо с Yii его можно юзать бесплатно.

Там, помимо редактирования текста, есть возможность добавления в него картинок http://imperavi.com/redactor/examples/upload-images/. То есть там необходимо указать путь до скрипта, результатом выполнения которого будет сохраненный файл на сервере и JSON строка типа { "filelink": "/images/img.jpg" }, которая отдается обратно плагину.

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

В общем вопрос как лучше обрабатывать и сохранять на сервер добавленные в текстовое поле картинки.
Можешь что-то посоветовать из своего опыта?
Надеюсь не очень сумбурно получилось.
#66 #412103
>>412079
http://ideone.com/8LMmSU
Наверное я зря соблазнился видимой простотой задачки.
sage #67 #412104
>>412103
чо за задача?
#69 #412112
>>412103
Там просто нужно посчить количество мелких и больших яблок. Если мелких нечетное то сразу нахуй. Если больших нечетное то мелких должно быть больше одного (при этом четное конечно).
#70 #412114
>>412112
Ты, как я вижу, тоже соблазнился видимой простотой задачи, да?
#71 #412116
>>412114
У тебя есть претензии к моему решению?
#73 #412118
>>412116
Ох лол, там только 100 и 200, не заметил.
А в чем тогда соль задачи?
#74 #412120
>>412117

>po100 = div (sum jabloki) 100


>skok200 = sum [1 | 200 <- jabloki]


переменные 10/10
#75 #412121
Оп-кун. Пожалуйста посмотри, что у меня с кодом:
https://github.com/babyba/sat

Я решаю задачу попроще и подскажи, пожалуйста, почему поиск не работает? Я не правильно понял что делает оператор LIKE?

Скажи, еще такую вещь, я безнадежен, если переписывал все это 2 или 3 раза с нуля потому, что оно не хотело работать?

P.S. Я ще не прикручивал туда css
#76 #412126
Добрый день ОП и все остальные. У меня возникла небольшая проблема, я пытаюсь написать игру в города при помощи базы данных, вот только у меня возникла одна проблема я не могу сделать так что бы компьютер не называл города которые уже были названы.

Теперь наверное надо сказать как я попробовал это реализовать.

Собственно в таблице базы данных есть два значения:

1-ое список всех городов
2-ое список уже названных городов, который постепенно пополняется

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

while($row=mysql_fetch_array($q)) {

}

И я не могу запретить добавляться элементу если я его нашёл в таблице для тех имён городов которые уже были названы.

В моём коде скорее всего много непонятного, он явно не лаконичный и не работает в Идеон, так как использует базу данных, извиняюсь если что, вот сам код http://ideone.com/lDZ8Sg
#77 #412127
>>412126
Не сильно понял твое объяснение, но первое что пришло в голову: сделай одну таблицу со всеми городами и добавь туда поле, которое будешь помечать, когда город выбран. Тогда когда ты будешь делать новую выборку, те города, что помечены как уже выбиравшиеся, не будут туда попадать, SQL это делает.
#78 #412128
>>412127
А ясно, спасибо, я кажется понял
#79 #412153
>>412126
А я бы вообще не так сделал, ну вот есть база у тебя с городами, и ты просто читай её, а не перезаписывай каждый ход, а например названные города скидывай во временным массив, который живет только во время выполнения скрипта и ищи в нем города с помощью in_array. А уж если игрок называет какой-то неведомый город для компьютера, то тот переспрашивает, точно ли это город, и тогда заносит его в свою таблицу городов, что бы самому использовать в дальнейшем. Хотя пока я писал ответ вижу что уже дали более дельный совет, прост делать пометку о том назван этот город или нет, тогда не придется компу вычислять какой город уже назван сравнивая базу с массивом.
#80 #412154

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


1. Запускаю игру в двух вкладках.
2. ?????
3. PROFIT
#81 #412161
Котаны, а за курс на codecademy что скажите? Щас прохожу, вроде норм для нуба заходит.
#82 #412172
>>412161
Это где задания в духе:
Вот пример правильного цикла -
for ($i=0; $i<10; $i++) {
echo "ti huy";
}

А вот тебе задача на циклы, допиши код до рабочего состояния

for ($i=0; $i<10; $i++) {
echo "ti huy"
}

нажми сабмит...

Теперь ты знаешь циклы! Можешь переходить к другим урокам.

Чет не очень ясно как оттуда знания получать кароче. Что ты сможешь написать сам после этой "академии"
#83 #412193
Оп тут. Аноны, я сегодня буду сильно занят, ответить смогу вечером или завтра. Решайте пока задачки, я все потом проверю.

>>412172

Ну на кодеакадеми самые основы изучаются, да.

>>412126

Тебе может через сессии надо как-то делать. Причем чтобы работало в нескольких вкладках, то не через те которые _SESSION, а через свои (так как _SESSION в нескольких вкладках будет общий).

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

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

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

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

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

Вот полезная статья: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (прочитать надо и предыдущие 2 части тоже)

Вот задачки для проверки: https://gist.github.com/codedokode/10539213

Насчет функций strtoupper, strlen, они не работает с русскими буквами в utf-8 и их лучше вообще не использовать. Вот подробное объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>412121

Я посмотрю твой код и напишу замечания (много!), но чуть позже , как будет время. Насчет LIKE, он так не работает.

Вот почитай

http://www.mysql.ru/docs/man/String_comparison_functions.html

LIKE сравнивает строки целиком. Чтобы можно было ввести только части имени или фамилии, надо использовать символ %
#83 #412193
Оп тут. Аноны, я сегодня буду сильно занят, ответить смогу вечером или завтра. Решайте пока задачки, я все потом проверю.

>>412172

Ну на кодеакадеми самые основы изучаются, да.

>>412126

Тебе может через сессии надо как-то делать. Причем чтобы работало в нескольких вкладках, то не через те которые _SESSION, а через свои (так как _SESSION в нескольких вкладках будет общий).

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

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

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

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

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

Вот полезная статья: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (прочитать надо и предыдущие 2 части тоже)

Вот задачки для проверки: https://gist.github.com/codedokode/10539213

Насчет функций strtoupper, strlen, они не работает с русскими буквами в utf-8 и их лучше вообще не использовать. Вот подробное объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>412121

Я посмотрю твой код и напишу замечания (много!), но чуть позже , как будет время. Насчет LIKE, он так не работает.

Вот почитай

http://www.mysql.ru/docs/man/String_comparison_functions.html

LIKE сравнивает строки целиком. Чтобы можно было ввести только части имени или фамилии, надо использовать символ %
#84 #412197
>>412117

Да, неплохая задачка.

>>412100

По идее хорошо бы складывать картинки в папку соответствующую id теста, чтобы не было бардака и чтобы их можно удалить было.

Но проблема в том что id нам до сохранения неизвестен.

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

Можно как вариант изначально класть во временную папку типа

/upload/temp/zfgf/...

А при сохранении переименовывать папку в постоянную. Или же создавать «временную» запись для теста в таблице чтобы получить id и сразу класть картинки в постоянную папку.

Лишние картинки можно удалять как-то сборщиком мусора, запускаемым по расписанию.

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

Также надо подумать о безопасности: а что если нам загрузят php, phtml, файл ии htaccess?
#85 #412236
>>411728
http://ideone.com/1LNOm6
Вспомнил, что не переделал программу на чтение текста и поиск длинных слов.
#86 #412247
>>412110
http://ideone.com/SoqfTx

Моар простых задачек, а то наш родной тред протух.
#87 #412259
как сделать так, чтобы var dump выводил и название переменной? можно ли настроить xdebug таким образом?
и вообще, расскажите как лучше отлаживать код, смотреть значения переменных
#88 #412263
>>412259
http://lmgtfy.com/?q=php+debuggin
php-ребенок ебаный
#89 #412266
>>412263
впервые увидел эту шютку и использует её к месту и нет.
хоть бы написал правильно
#90 #412275
>>412247
В конце предыдущего треда мне ОП кидал
#91 #412307
Поясните за циклы.

>for ($i = 1; $i <= $20; $i++) {



я непонимаю вот это

>$i++

#92 #412310
Посоветуйте книгу по php где автор рассказывает за основы и все разжевывает. Хочу немного тяжелой теории, достала практика.
В рекомменд листе в прикрепленном треде есть только книги с шаблонами и всякими рекомендациями, настоящой книги как на для других языков нет.
#93 #412311
>>412307
i=i+1 то же что и i++
Инкрементация - увеличения на одиницу.
#94 #412320
http://ideone.com/Mcucx9
Почему строка с null не работает? При отмене срабатывает else, а не else if
#95 #412324
>>412310

Мануал php: https://php.net/manual/ru/langref.php

Чем не годится?
#96 #412345
>>412324
А ну можно и так. Наверно просто за этот богомерзкий язык никто браться не хочет даже если в комментариях огромное количество примеров с неадекватным синтаксисом/поведениям пхп. Ни слишком просто уж. Думал что есть СКРЫТЫЕ МЕТОДЫ И СПОСОБЫ писать нормальный код на пхп, но говно в самой основе заложено.
Без обид.
#97 #412347
>>412345
Аргументы?
#98 #412351
>>412347
Ты что в танке? В интернет попробуй зайти, почитать там, погуглить.
Например возьмем ОСНОВЫ и посмотрим первый коммент: https://php.net/manual/ru/language.variables.basics.php
Больше ненависти и ругани методов можно загуглить на хабре, например.
Все не действует так как ожидаешь - главная проблема пхп - нет целостности.
Но работы и сайтов на нем много, так что некуда деваться. Пока что.
#99 #412352
>>412351
А если в гугле написать запрос по си, то тебя отправят на 666кулхацкер666.ру. И что теперь, си гавно?
#100 #412354
>>412352
Такое комменты пишут только неучи в стиле так слажна шопиздец))0 очень запутана как-та((9
Вместо того чтобы раз сесть и выучить. Больше с ругать не за что.
Ты мне напоминаешь пидорашку с ГОСДОЛГОМ США.
Тебе сколько лет?
#101 #412357
>>412354
Ты не понял о чем я вообще.
Я повторю, по частям.

>В интернет попробуй зайти, почитать там, погуглить.


>А если в гугле написать запрос по си, то тебя отправят на 666кулхацкер666.ру. И что теперь, си гавно?


Твой аргумент про то, что пхп - гавно - это "в комментах неучи". Мой аргумент - "неучи в комментах на всех языках". Ты же отвечаешь "пидорашка ко-ко-ко госдолг сша".
Ты сюда потроллить зашел или свои же посты забываешь за две минуты?
#102 #412358
>>412351
Как обычно. Сколько прошу аргументов про говнистость пхп, столько меня посылают в гугл.
Реквест к ОПу #103 #412360
Доброанон, помоги пожалуйста. Я никак не могу реализовать поиск кратчайшего (по числу пройденных ребер) пути в ориентированном графе. Сам граф задаю списком смежности для каждой вершины, который представляет собой класс, содержащий информацию о существовании смежности с i-ой вершиной, функцию получения первой по нумерации смежной вершины из списка смежности данной и т. д.
На этом вот моменте с поиском пути затупил жутко, даже такая статья
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83#PHP
нихера не прояснила, только ещё больше запутала. Можешь набросать какой-то пример? Поиск пути здесь означает получение списка вершин, из какой в какую надо идти для попадания из первой вершины в последнюю.
#104 #412373
>>412357
Это мое ощущения от языка тоже. Приятно что не я один их замечаю.
А ты свой анус остуди.
>>412358
Пхп-кодеры уже даже на ссылку в посте нажать и проскроллить не могут?
Специально для тебя:
print isset($a); // $a is not set. Prints false. (Or more accurately prints ''.)
$b = 0; // isset($b) returns true (or more accurately '1')
$c = array(); // isset($c) returns true
И это я рандомно ткнул на первую ссылку.

Вот подробный разбор по частям всех прелестей))
http://habrahabr.ru/post/142140/
#105 #412378
>>412373

>print isset($a); // $a is not set. Prints false. (Or more accurately prints ''.)


$b = 0; // isset($b) returns true (or more accurately '1')
$c = array(); // isset($c) returns true

Ну и что с этим не так?
Воннаби #106 #412379
А я вброшу свой пример.
Вот осваиваю я только мускуль и делаю тестовое задание одной конторки паралельно. И так как в Никсоне якобы предоставлены устаревшие инструменты работы с MySQL как функции mysql_, то я полез в гугл, а оттуда на офф-сайт за изучением mysqli_, ну и берем первую же ссылку:
http://php.net/manual/ru/function.mysqli-connect.php
первый же коммент с примером кода, находящийся в топе, с 18 лойсами, первая же строка:
$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link));

И что? Да нихуя она не работает, если передать этой функции неправильные логин и пароль или другую инфу о базе, то не будет никакой ошибки mysqli_error, а будет другая ошибка, о том что в функцию mysqli_error передан неправильный параметр. Ну ведь действительно блядь, $link еще не успел стать ресурсом или чем он там становится после успешного подключения к базе, так что он не подходит еще для передачи в функцию. Так какого хуя это не заминусовано? В общем с сегодняшнего дня я перестал доверять на 100% этому сайту, такие дела.
#107 #412381
>>412378
А это он просто не знает отличий isset от empty, вот и агрится на своё собственное невежество.
#108 #412382
>>412373

Насчет variable variable: это фича из времени PHP3. Ни в одном нормальном проекте она не используется, и никто так не пишет. Проблемы не вижу. В других языках тоже eval есть например, это же не значит что язык плохой.

> $c = array(); // isset($c) returns true


И что тут не так?

isset возвращает true если переменная существует и не равна null. Как задумано, так и работает.

Си с PHP сравнивать нельзя: эти клоуны за 50 лет не смогли ни стандарт оформдения кода принять, ни решить проблему с инклудом тысяч заголовков ради компиляции одного файла, ни от макросов избавиться, коллекций нет, ничего вообще нет, функции стандартной библиотеки не работают с utf-8 и каждая вторая содержит переполнение буфера. Си это такое болото, до которого PHP далеко.

> прочти первый коммент


Давай почитаем.

> Before a variable is used, it has no existence.


Неверно. Переменная не существует, пока ты ее не создашь (а не пока не используешь). Это логично, если ты не какой-нибудь сишник или яваскриптщик, а например питонщик или рубист — там так же. Отукда появится переменная, если ты ее еще не создал? PHP твои мысли что ли угадывать должен?

> It is unset.


Бред. Переменная не может быть «unset», она либо есть либо нет.

> With the exception of null, the value a variable holds plays no part in determining whether a variable is set.


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

> Setting an existing variable to null is a way of unsetting a variable.


Неверно. Это лишь присваивание переменной null и все.

> is_null() is an equivalent test to checking that isset() is false.


Неверно:

> $ php -r 'var_dump(is_null($sfsdfsdf));'


> PHP Notice: Undefined variable: sfsdfsdf in Command line code on line 1


> bool(true)



is_null выдает ошибку, а isset — нет. Они не эквивалентны.

> If it is used without having been given a value then it is uninitalized and it receives the default value for the type.


Неверно. Если ты исплоьзуешь несуществующую переменную ты получаешь Notice (то есть ошибку в программе) и знаечие null.

Почему PHP использует Notice а не исключение? Исторически. Превратить все нотисы в исключения можно 3 строками кода, я всегда так делаю, быдоокодеры никогда.

В общем, человек плохо понимает PHP и пишет бред. Наверно он учился по плохим западным учебникам или курсам уровня кодеакадеми, а не в нашем треде.
#108 #412382
>>412373

Насчет variable variable: это фича из времени PHP3. Ни в одном нормальном проекте она не используется, и никто так не пишет. Проблемы не вижу. В других языках тоже eval есть например, это же не значит что язык плохой.

> $c = array(); // isset($c) returns true


И что тут не так?

isset возвращает true если переменная существует и не равна null. Как задумано, так и работает.

Си с PHP сравнивать нельзя: эти клоуны за 50 лет не смогли ни стандарт оформдения кода принять, ни решить проблему с инклудом тысяч заголовков ради компиляции одного файла, ни от макросов избавиться, коллекций нет, ничего вообще нет, функции стандартной библиотеки не работают с utf-8 и каждая вторая содержит переполнение буфера. Си это такое болото, до которого PHP далеко.

> прочти первый коммент


Давай почитаем.

> Before a variable is used, it has no existence.


Неверно. Переменная не существует, пока ты ее не создашь (а не пока не используешь). Это логично, если ты не какой-нибудь сишник или яваскриптщик, а например питонщик или рубист — там так же. Отукда появится переменная, если ты ее еще не создал? PHP твои мысли что ли угадывать должен?

> It is unset.


Бред. Переменная не может быть «unset», она либо есть либо нет.

> With the exception of null, the value a variable holds plays no part in determining whether a variable is set.


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

> Setting an existing variable to null is a way of unsetting a variable.


Неверно. Это лишь присваивание переменной null и все.

> is_null() is an equivalent test to checking that isset() is false.


Неверно:

> $ php -r 'var_dump(is_null($sfsdfsdf));'


> PHP Notice: Undefined variable: sfsdfsdf in Command line code on line 1


> bool(true)



is_null выдает ошибку, а isset — нет. Они не эквивалентны.

> If it is used without having been given a value then it is uninitalized and it receives the default value for the type.


Неверно. Если ты исплоьзуешь несуществующую переменную ты получаешь Notice (то есть ошибку в программе) и знаечие null.

Почему PHP использует Notice а не исключение? Исторически. Превратить все нотисы в исключения можно 3 строками кода, я всегда так делаю, быдоокодеры никогда.

В общем, человек плохо понимает PHP и пишет бред. Наверно он учился по плохим западным учебникам или курсам уровня кодеакадеми, а не в нашем треде.
#109 #412383
>>412378
по логике иссет должна показывать тру только в случае когда переменная не просто ИНИЦИАЛИЗИРОВАНА, как $c, а в нее введены значения, но в пхп совсем не так.
А про ад с == и === я даже начинать не хочу.
#110 #412386
>>412383
По какой такой логике во первых, во вторых в переменную $b введено значение 0, чем она тебя не устроила?
#111 #412387
>>412382

> isset возвращает true если переменная существует


> set


> существует


Топкек.
Хватило чтобы далее не читать твой высер.
#112 #412388
>>412383

> по логике иссет должна показывать тру только в случае когда переменная не просто ИНИЦИАЛИЗИРОВАНА


Ты мануал по isset прочти а потом рассказывай про логику. Ты мануалы не читаешь, а приходишь и говоришь что ничего не работает.
#113 #412389
>>412387
И не равна null, жопочтец
#114 #412390
>>412383

> А про ад с == и === я даже начинать не хочу.


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

Ну и на практике если не быдлокодить то на php все нормально пишется.
#115 #412392
>>412383

> ад с == и ===


Нет там ничего адового. С приведением типов и без приведения сравнение. Типизация слабая, так что без этого никак.
!xnn2uE3AU. #116 #412394
Алсо, давайте лучше поунижаем рубиняш: http://ideone.com/wiKphe

Простая программа из одной строчки выдает адские ошибки.
#117 #412395
>>412388
Ты ебанутый? Зачем мне мануалы этого говноязыка?
Я тебе говорю про историческое значения SET в программировании и просто здоровой логики, а ты мне про нулл и мануалы этой дешевой поделки.
Зачем тогда [CODE] if ($c) [/CODE]?
Если по твой логике и этого "языка" иссет и if ($c) это одно и то же?
!xnn2uE3AU. #118 #412396
Еще, отсюда:

http://ru.wikibooks.org/wiki/Ruby/%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B

> Иногда возникает ситуация, когда при попытке вывода на экран русскоязычной строки при помощи метода p выводится непонятный код вида



> "\323\367\350\362\345 \320\363\341\350!"


> Чтобы избежать таких ситуаций следует поместить в начало программы следующий программный код:



> $KCODE = "u"



Ох лол. Объясните, почему в начале программы надо писать магический код на языке напоминающем PHP?
#119 #412397
>>412395

Это лишь твои фантазии. Расскажи мне где isset работает по-другому?

Тут «set» значит «значение задано». Во многих языках. например SQL null обозначает «неизвестно», «не указано», видимо тут логика аналогичная, если null то не задано.

> Если по твой логике и этого "языка" иссет и if ($c) это одно и то же?


Нет конечно

Ну и тебе могу сказать, что в любом другом языке елси ты не будешь читать докуметацию то получишь те же проблемы.
#120 #412398
>>412395
Чем тебя значения 0 и [] не устроили? Вполне себе SET.
#121 #412400
>>412397
Может быть он про set как set of, ака множество?
#122 #412402
>>412398
0 - сет
[] - совсем не сет, а инициализация.
#123 #412404
>>412402

Ты навыдумаывал своих каких-то правил и удивляешься что мир им не соответствует.
#124 #412408
>>412402

> [] - совсем не сет, а инициализация.


Схуяли? Я могу узнать его длину, сравнить с другим массивом, прогнать его через array_map и всё остальное что я могу сделать с массивом [1, 2, 3, 4, 5].
#125 #412411
>>412408

>Я могу узнать его длину, сравнить с другим массивом


Религия не позволяет?
#126 #412412
>>412411
Что?
#127 #412421
>>412193
Спасибо, я тот кто спрашивал насчёт игры в города. Я сейчас переделал, в принципе сейчас кажется работает всё, даже есть вероятность того когда компьютер может не найти ответ в базе данных. Но случилось так, что я построил скрипт, таким образом что он подбирает города по последней букве, а игрок может называть любые лишь бы такие существовали в базе данных, я вначале даже этого и не заметил. И сейчас немного не понимаю как это исправить, не подскажешь, для того что бы игрок имел возможность писать город только с последней буквы названного компьютером города нужно использовать только сессии? Или можно без них обойтись?
#128 #412435
Хотел спросить у вас такой момент. Я сейчас учу ПХП, с другими языками программирования вроде Делфи и Паскаль знаком только по университетской программе, но у меня складывается такое впечатление что бы писать на ПХП нормально надо знать ещё огромное количество других вещей: Базы Данных, Фреймворки, MVC, Ява Скрипт, ХТМЛ, КСС, Шаблоны, Фреймворки яваскрипт вроде jquery, PEAR, XML а также ещё масса чего другого что я не назвал. С учётом всего этого, почему этот язык считают простым? Или в других языках всего ещё больше?
#129 #412436
>>412435
Ты с с-подобными знаком?

Грубо говоря потому, что говно-код будет работать нормально, до поры до времени.

Конечно, БД не сложные, за вечер для использования можно разобрать, фреймворки нужны для любых языков. Java script - не сложный, он похож на php чем-то, кстати. html и css аналогично вечер-другой для использования.

А вообще у тебя странная логика. Если язык простой, то сопутсвующих ему технологий не должно быть что-ли?
9 Кб, 300x168
#130 #412437
>>412435
Чтобы писать на php - надо знать php, а те вещи, что ты перечислил, нужны для разработки приложений, разработка которых только с помощью одного пхп невозможна.
#131 #412443
>>412435
чуви, не путай концепты и скриптовый язык. РНР это просто скриптовый язык кажись. а ты перечислил кашу из технологий и подходов. то есть чтобы что-то на чем-то писать надо понимать что тебе нужно и как это реализовать + современные подходы. то бишь посредством рнр либ(те самые фреймворки, что есть набор либ) ты вызываешь тот самый хтмл, который в свою очередь интерпретируют современные браузеры и через функционал операционки и драйверов отрисовывают тебе котиков с порнухой. считается легким, т.к. наверно много хау-ту мануалов чтобы накодить домашнюю страницу плюс нечеткая типизация, пох на регистр и т.д. а вот чтобы что то серьезное делать, али не плодить костылей и вырвиглазного сложноподдерживаемого кода- надо разбираться в технологиях. начни с простых задач, а там потихоньку освоишся.
#132 #412455
>>411530

>Для gif не создаются превьюшки.


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

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


Сделал превью только для гиф/пнг/джпг/бмп. Я так думаю, что он бы пытался ставить как превьюшку и другие форматы, MIME-тип которых начинался бы с image/.

>При ошибке у тебя зачем-то вываливаются технические подробности ошибки поьзователю:


Да, забыл само исключение из вывода убрать.

>Если загрузить файл с очень длинным именем, оно переносится в таблице последних файлов на вторую строчку, и она разъезжается. Тут конечно надо применять table-layout: fixed и вручную заданную ширину колонок.


Ох уж эта верстка!

>Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.


Это самое сложное. Я попробовал что-то с этим сделать, но не уверен в своем решении.

Ну и проблемы с ".htaccess" решил простым переименованием его при заливании в "htaccess".
github.com/sqghub/uppu.ru
#133 #412541
Нужно ли полностью смотреть курсы по ООП чтобы понять
как работают объекты и классы в пхп? http://archive-ipq-co.narod.ru/l1/pasta.html Если сложить код в кучу в примере он не работает уже начиная со средины, там не хватает кода который бы работал, чтобы можно было бы его просмотреть и понять как это всё работает вместе. Начал читать Никсона, было всё ясно аж до момента когда началась тема с классами и объектами. Есть где-нибудь подробное разжевывание с пояснениями каждой запятой?
#134 #412544
>>412541
Особенно с инкапсуляцией пока больше всего неясностей. Вот создан класс, объявлен объект, внутри свойства описаны и методы но они приватные, какое может быть применение у объекта в этом случае если его свойства и методы нельзя вызвать снаружи? Плюс с созданием объектов внутри массива
Вот в этом участке кода из урока ОПа
http://ideone.com/rNJ1T4
разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?
И почему дважды объявляется один и тот же объект в функции
$q = new Question; ?
#135 #412549
>>412544
Что там непонятного? У опа в примерах нет ни инкапсуляции, ни приватных методов. Какой счетчик?
$var[] = добавляет в массив еще один элемент, это аналогично функции array_push.
И мы не создаем один и тот же объект дважды, мы создаем объекты одного и того же класса дважды, и перезаписываем переменную $q
#136 #412551
>>412549
Перепиши пожалуйста эту функцию из примера, чтобы она работала, не могу понять ход её выполнения пока не вижу её рабочую версию.
#138 #412553
>>412552
Спасибо.
Теперь и у меня вышло
http://ideone.com/Qe2ne5 . А с областью видимости? Если внутри объекта всё private какое применение у этого есть?
#139 #412554
>>412553
Если private или protected то как-то так:
http://ideone.com/ER23Am

ты не можешь напрямую обращаться вне класса к приватному или протектед свойству, но внутри класса ты можешь делать это любыми методами.
#140 #412555
>>412554
То-есть приватным нужно например назначить например password который может быть вызван внутри объекта только определенным методом и никак иначе? Вроде уже яснее
#141 #412557
>>412555
Оп учит, что хороший кодер все свойства делает protected
#142 #412558
>>412103

Выглядит верно. Хотя решение от анона >>412112 тоже выглядит верным, но более простым.

>>412117

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

>>412121

> все это 2 или 3 раза с нуля потому, что оно не хотело работать?


ну если ты начинающий, это вполне нормально. Только зря ты мучаешься и сам переписываешь, лучше бы вкинул в тред как можно раньше, тебе бы дали советы и бы быстрее получил результат.
#143 #412562
>>412121

Советы и замечания.

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

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

Имена могут строиться по такой схеме:

В PSR-0 на подчеркиваниях: My_Class -> My/Class.php
В PSR-4 на неймспейсах: My\Class -> My/Class.php

Чуть-чуть про них: http://zenwalker.me/2014/03/php-psr-0-vs-psr-4.html

Надо положить в репозиторий схему (дамп) базы данных в формате SQL. Как иначе я ее проверю? Не добавляй в дамп команды создания базы или пользователей — только команды создания таблиц.

> <form action = 'addToDataBase.php'


Что за странный стиль расстановки пробелов? Обычно в HTML вокруг знака равно пробелы не ставят (а в PHP ставят).

В плане верстки, верстать br'ами очень нехорошо, надо бы нормально делать. Если ты не очень разбираешься в HTML/CSS, может тебе стоит порешать простые задачки из «Пути HTML»? Они помогут разобраться: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

> Пол:<br>


> type = 'text'


Обычно для выбора пола делают радиокнопки: http://htmlbook.ru/samhtml5/formy/pereklyuchateli

(кстати, советую весь раздел про формы http://htmlbook.ru/samhtml5/formy посмотреть).

> <input name = 'email' type = 'text'


лучше использовать type=email — тогда современный браузер сам проверит его на правильность, а на мобильныхз устройствах будет выдвигаться клавиатура с значками для ввода емайла.

> <input name = 'local' type = 'text'


Тут нужен чекбокс (галочка)

> <input name = 'year' type = 'text' size = '32'>


Что-то для ввода года 32 символа слишком много, мне кажется.

Кстати, главной страницей должен быть список абитуриентов.

> LIKE :search


Конструкцию LIKE надр использовать только при поиске, а если поиск не ведется то не надо, а надо выводить всех подряд.

> ?>


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

> https://github.com/babyba/sat/blob/master/view.html


В шаблоне вместо echo надо исплоьзовать <?=

HTML-код не должен быть в кавычках внутри echo.

Также, у тебя может присутствовать уязвимость XSS, вот мини-урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64

> $view = new Pages($_GET);


Это не очень удачная идея, передавать массив, лучше явно передавать по отдельности значения page и number. Или даже делать это через методы:

$filter->setSearch($search);

Ну и название не очен удачное, мне кажется этот класс стоит назвать Filter, FilterArgs или как-то так, так как он отвечает за параметры вывода таблицы.
#143 #412562
>>412121

Советы и замечания.

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

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

Имена могут строиться по такой схеме:

В PSR-0 на подчеркиваниях: My_Class -> My/Class.php
В PSR-4 на неймспейсах: My\Class -> My/Class.php

Чуть-чуть про них: http://zenwalker.me/2014/03/php-psr-0-vs-psr-4.html

Надо положить в репозиторий схему (дамп) базы данных в формате SQL. Как иначе я ее проверю? Не добавляй в дамп команды создания базы или пользователей — только команды создания таблиц.

> <form action = 'addToDataBase.php'


Что за странный стиль расстановки пробелов? Обычно в HTML вокруг знака равно пробелы не ставят (а в PHP ставят).

В плане верстки, верстать br'ами очень нехорошо, надо бы нормально делать. Если ты не очень разбираешься в HTML/CSS, может тебе стоит порешать простые задачки из «Пути HTML»? Они помогут разобраться: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

> Пол:<br>


> type = 'text'


Обычно для выбора пола делают радиокнопки: http://htmlbook.ru/samhtml5/formy/pereklyuchateli

(кстати, советую весь раздел про формы http://htmlbook.ru/samhtml5/formy посмотреть).

> <input name = 'email' type = 'text'


лучше использовать type=email — тогда современный браузер сам проверит его на правильность, а на мобильныхз устройствах будет выдвигаться клавиатура с значками для ввода емайла.

> <input name = 'local' type = 'text'


Тут нужен чекбокс (галочка)

> <input name = 'year' type = 'text' size = '32'>


Что-то для ввода года 32 символа слишком много, мне кажется.

Кстати, главной страницей должен быть список абитуриентов.

> LIKE :search


Конструкцию LIKE надр использовать только при поиске, а если поиск не ведется то не надо, а надо выводить всех подряд.

> ?>


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

> https://github.com/babyba/sat/blob/master/view.html


В шаблоне вместо echo надо исплоьзовать <?=

HTML-код не должен быть в кавычках внутри echo.

Также, у тебя может присутствовать уязвимость XSS, вот мини-урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64

> $view = new Pages($_GET);


Это не очень удачная идея, передавать массив, лучше явно передавать по отдельности значения page и number. Или даже делать это через методы:

$filter->setSearch($search);

Ну и название не очен удачное, мне кажется этот класс стоит назвать Filter, FilterArgs или как-то так, так как он отвечает за параметры вывода таблицы.
#144 #412563
>>412549
http://ideone.com/QelX2V
Ну вот, я просто попытался воспользоваться функцией этой, но она просто перезаписывает первую ячейку, как сделать чтобы он записывал следующую ячейку массива следующим вопросом?
#145 #412564
>>412563
У тебя функция принимает всего один вопрос, зачем ей возвращать массив?
#146 #412565
>>412564
поменял начинку функции принт на вывод массива:
http://ideone.com/M26tbs
#147 #412567
>>412563
И, кстати, у тебя функция printQuestions ничего не возвращает, зачем пытаться записать её значение (которого не существует) в переменную $print? Мне кажется тебе стоит еще раз пройтись по уроку с функциями.
У тебя должно получиться что-то вроде этого.
http://ideone.com/TiGwNn
#148 #412568
>>412565
На 46ой строчке ты записываешь в переменную $questions массив из одного вопроса, который тебе вернула функция createQuestion. На 58ой ты перезаписываешь переменную $questions новым массивом, а старый теряется. В результате в переменной остается только последний вопрос, который ты в неё записал.
#149 #412569
>>412121

Дальше, насчет StudentViewer, StudentUpdater, я думаю, незачем разделять код работы с таблицей students на несколько классов, а можно поместить в один.

Классы Student и StudentUpdate это копипаста. Зачем дублировать код? Сделай один класс Student и везде его используй.

> https://github.com/babyba/sat/blob/master/addToDataBase.php#L19


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

> public $md5;


Это поле надо назвать понятнее, например, accessToken или accessCode.

> $this->md5 = md5($this->email).md5($this->lastName);


Если ты хочешь использоват это как пароль, то это плохая идея так как любой зная фамилию и email может посчитать хеш.

Лучше всего генерировать его случайно, тогда его точно не подобрать.

> if(!preg_match('/^[А-ЯA-Z][а-яa-z]$/u'


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

> echo "Введите правильное им'я.\n";


> die( );


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

Формы надо обрабатывать по-другому: при ошибке появляется заполненная форма и сообщение об ошибке.

Также, формы добавления и редактирования очень похожи. Для них можно использовать общий код, а не копипастить. Копипаста и дублирование кода — это не решение, дублирования не должно быть вообше. это называется «Don't Repeat Yourself», «не повторяйся».

Вот как обычно работают с формами:

значения = значения по умолчанию;
ошибки = пустой массив;

если (открыта страница редактирования) {
загрузить значения из базы;
}

если (форма отправлена) {
заполнить массив значений из POST/GET;
проверить все ли верно, сохранив ошибки в масссив ошибок;

если (все верно) {
сохранить данные;
делаем редирект для щащиты от повторной отпрравки формы;
завершаем скрипт;
}

}

вывести форму, возможно с ошибками;

Заметь, в моем примере «значения» это массив. Но у тебя же есть класс Student — гораздо удобнее хранить значения прямо в нем.

> if (!preg_match('/^[a-zA-Z0-9]@[a


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

> @[a-zA-Z]{1,7}


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

j.m.johnson@phys-department.cs.mit.edu - вот вполне валидный адрес

> public function checkFill($array){


Не надо передавать массив. У тебя уже есть объект со всеми нужными свойствами. Проверяй свойства объекта.

> setcookie('pass', $person->md5,


Задача маппера сохранить сущность в базу данных. Куки в нем ставиься или проверяться не должны.

> $SAT = new PDO


Лучше $pdo = new PDO

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

Если что-то непонятно, задавай вопросы. Это тред для начинающих.
#149 #412569
>>412121

Дальше, насчет StudentViewer, StudentUpdater, я думаю, незачем разделять код работы с таблицей students на несколько классов, а можно поместить в один.

Классы Student и StudentUpdate это копипаста. Зачем дублировать код? Сделай один класс Student и везде его используй.

> https://github.com/babyba/sat/blob/master/addToDataBase.php#L19


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

> public $md5;


Это поле надо назвать понятнее, например, accessToken или accessCode.

> $this->md5 = md5($this->email).md5($this->lastName);


Если ты хочешь использоват это как пароль, то это плохая идея так как любой зная фамилию и email может посчитать хеш.

Лучше всего генерировать его случайно, тогда его точно не подобрать.

> if(!preg_match('/^[А-ЯA-Z][а-яa-z]$/u'


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

> echo "Введите правильное им'я.\n";


> die( );


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

Формы надо обрабатывать по-другому: при ошибке появляется заполненная форма и сообщение об ошибке.

Также, формы добавления и редактирования очень похожи. Для них можно использовать общий код, а не копипастить. Копипаста и дублирование кода — это не решение, дублирования не должно быть вообше. это называется «Don't Repeat Yourself», «не повторяйся».

Вот как обычно работают с формами:

значения = значения по умолчанию;
ошибки = пустой массив;

если (открыта страница редактирования) {
загрузить значения из базы;
}

если (форма отправлена) {
заполнить массив значений из POST/GET;
проверить все ли верно, сохранив ошибки в масссив ошибок;

если (все верно) {
сохранить данные;
делаем редирект для щащиты от повторной отпрравки формы;
завершаем скрипт;
}

}

вывести форму, возможно с ошибками;

Заметь, в моем примере «значения» это массив. Но у тебя же есть класс Student — гораздо удобнее хранить значения прямо в нем.

> if (!preg_match('/^[a-zA-Z0-9]@[a


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

> @[a-zA-Z]{1,7}


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

j.m.johnson@phys-department.cs.mit.edu - вот вполне валидный адрес

> public function checkFill($array){


Не надо передавать массив. У тебя уже есть объект со всеми нужными свойствами. Проверяй свойства объекта.

> setcookie('pass', $person->md5,


Задача маппера сохранить сущность в базу данных. Куки в нем ставиься или проверяться не должны.

> $SAT = new PDO


Лучше $pdo = new PDO

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

Если что-то непонятно, задавай вопросы. Это тред для начинающих.
4 Кб, 617x117
#150 #412570
>>412568
Я просто скопировал строчки из урока. Думал сперва собрать из строчек код и потом уже смотреть как всё работает.
#151 #412572
>>412570
У опа в уроке подразумевается, что функция createQuestions не принимает никаких параметров, а сразу выдает массив вопросов уже заданных в функции. У тебя же переделанная функция, значит и весь остальной код нужно подстраивать под неё. Но там всего нужно было изменить пару строчек, как я уже писал выше >>412567
#152 #412574
>>412236

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


Ну нет. У тебя локаль никак не используется, и хорошо. Но у тебя словом считается все, кроме пробела, и нескольких знаков, а логично словом считать набор букв.

Чтобы найти буквы любых алфавитов, можно использовать в регулярке свойства юникодных символов: http://php.net/manual/ru/regexp.reference.unicode.php

Удобнее всего находить и сразу же заменять слова через preg_replace_callback. Ну еще можно через preg_split или preg_match_all, но не так удобно.

> foreach ($text_array as $k => &$str)


Если ты не используешь k, не надо ее писать

Переменные пишутся кемелкейсом, textArray, а не text_array

> mb_strlen($str, 'UTF-8');


Если ты задал кодировку через mb_internal_encoding то писать второй раз ее не надо.

Так, программа работает верно, но, я думаю, полезно разобраться со свойствами юникода. Ведь в мире есть огромное число букв и все их ты вряд ли сможешь перечислить вручную.
#153 #412576
>>412574
Ну я текст просто рандомный взял из документации.
#154 #412577
>>412247

> j100 = jabloki.count("1")


Ничем не опревданные костыли. Что мешает прочитать строку и превратить ее в список чисел?

Проверка по моему искуственно усложнена, это можно записать одним ифом гораздо короче.

> моар


http://codeforces.ru/problemset

>>412259
Никак.

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


Если у тебя есть IDE вроде phpstorm, eclipse, netbeans то в ней можно, если все верно настроено, и установлен xdebug, отлаживать код. Ты можешь ставить точки останова, смотреть значения переменных, выполнять код по шагам и смотреть что меняется.

PhpStorm: http://habrahabr.ru/post/209024/
http://habrahabr.ru/sandbox/77402/
https://www.jetbrains.com/phpstorm/webhelp/debugging-php-applications.html

Eslipse PDT: https://wiki.eclipse.org/Debugging_using_XDebug

Netbeans: https://netbeans.org/kb/docs/php/debugging_ru.html

Я советую тебе научиться, это полезно. В интернете такж много статей (+ видео на ютубе для ленивых). Если что-то не будет работать, можешь писать в тред только максимум подробностей сразу же указывай, а то мы читать мысли не умеем.
#155 #412579
>>412577
Действительно. Зачем одна простая операция .count когда можно прочитать строку, превратить её в список чисел, затем разделить какждое число на 100
#156 #412580
>>412307

$i++ равносильно $i = $i + 1 то есть прибавить к текущему значению единицу и записать обратно в $i.

$i += 10; равносильно $i = $i + 10;

У меня в первом или втором уроке это упомянуто.

>>412320

Браузер какой? У меня в Хроме пишет «Вход отменен». Может ты перепутал что?

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

>>412360

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


Можно взять другой алгоритм, смотри сколько их: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

> Можешь набросать какой-то пример?


Там же пример кода на PHP. В чем смысл мне набросать то же самое?

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

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

Алгоритм берет очередного ребенка первого уровня, вобходит его детей и их добавляет в очередь.

Ну и так пока не обойдет все вершины.

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

Попробуй это на листочке бумажки нарисовать.

Если тебе что-то непонятно, задавай конкретные вопросы, я поясню.
#156 #412580
>>412307

$i++ равносильно $i = $i + 1 то есть прибавить к текущему значению единицу и записать обратно в $i.

$i += 10; равносильно $i = $i + 10;

У меня в первом или втором уроке это упомянуто.

>>412320

Браузер какой? У меня в Хроме пишет «Вход отменен». Может ты перепутал что?

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

>>412360

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


Можно взять другой алгоритм, смотри сколько их: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

> Можешь набросать какой-то пример?


Там же пример кода на PHP. В чем смысл мне набросать то же самое?

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

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

Алгоритм берет очередного ребенка первого уровня, вобходит его детей и их добавляет в очередь.

Ну и так пока не обойдет все вершины.

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

Попробуй это на листочке бумажки нарисовать.

Если тебе что-то непонятно, задавай конкретные вопросы, я поясню.
#157 #412582
Господа, я успешно работаю в качестве копимакаки, но у меня освободилось время и я хочу карьерно расти.
После непродолжительных поисков по местным сайтам объявлений я увидел несколько вакансий контент-менеджера. Помимо освоенного мною ремесла копирайтинга и граф. редакторов там требуется уметь админить инет-магазины.
С чего мне начать, дабы научиться это делать? И не только магазины, а и сайты вцелом.
Имею знание английского, понимание основ программирования, небольшой опыт написания кода на C++, C#, еще меньший опыт HTML (не более, чем нужно копимакаке).
#158 #412586
>>412360

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


Там алгоритм просто перебирает всех потомков, для каждого проверяя не является ли он конечной целью.

>>412379

Ну не читай комменты, это же не я и не авторы php плюсы ставят. Молодец, что не поленился сам проверить.

Вот тут в документации пример как надо проверять ошибку соединения: http://php.net/manual/ru/mysqli.error.php

Ну и ты зря используешь процелурный стиль, он о моему устраевший и неудобный.

>>412421

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


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

> Или можно без них обойтись?


Можно в базе хранить данные.

>>412435

Другие языки еще сложнее.

>>412541

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


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

По моему у меня самое простое объяснение ООП.

>>412544

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


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

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

А объект без инкапсуляции - это автомат с открыой крышкой, в который любой мождет залезть руками.

> разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?


Нет, когда ты пишешь [] то элемент добавляется в конец массива ничего не затирая. Мануал:

http://php.net/manual/ru/language.types.array.php#language.types.array.syntax.modifying

> И почему дважды объявляется один и тот же объект в функции


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

>>412557

Или protected или private, да. Ну сам подумай, что хорошего в кофейном автомате со снятой крышкой? туда могут что-нибудь нехорошее вместо кофе залить. Или могут взять его не заплатив.
#158 #412586
>>412360

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


Там алгоритм просто перебирает всех потомков, для каждого проверяя не является ли он конечной целью.

>>412379

Ну не читай комменты, это же не я и не авторы php плюсы ставят. Молодец, что не поленился сам проверить.

Вот тут в документации пример как надо проверять ошибку соединения: http://php.net/manual/ru/mysqli.error.php

Ну и ты зря используешь процелурный стиль, он о моему устраевший и неудобный.

>>412421

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


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

> Или можно без них обойтись?


Можно в базе хранить данные.

>>412435

Другие языки еще сложнее.

>>412541

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


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

По моему у меня самое простое объяснение ООП.

>>412544

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


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

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

А объект без инкапсуляции - это автомат с открыой крышкой, в который любой мождет залезть руками.

> разве там не должен быть счетчик возле $q, он же по идее перезаписывает одну и ту же ячейку или нет?


Нет, когда ты пишешь [] то элемент добавляется в конец массива ничего не затирая. Мануал:

http://php.net/manual/ru/language.types.array.php#language.types.array.syntax.modifying

> И почему дважды объявляется один и тот же объект в функции


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

>>412557

Или protected или private, да. Ну сам подумай, что хорошего в кофейном автомате со снятой крышкой? туда могут что-нибудь нехорошее вместо кофе залить. Или могут взять его не заплатив.
#159 #412587
>>412586
Ну а по аналогии полностью приватный или защищенный объект это как кофейный автомат без кнопок просто с вилкой для розетки? Там я уже более менее с помощью анонов разобрался с ходом, ещё перечитаю Никсона по классам и попробую уже что-то из практики. Минус примера в мануале, в том что он слишком массивен и насыщен функциями, достаточно было бы 1-2 свойств и 1 метода для объекта, а так плохо воспринимается мне как новичку.
#160 #412588
>>412587
У Никсона скупо ООП описан, я вообще ничего не знал, пока Оповские уроки не прочитал.
#161 #412589
>>412563

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

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

Также, чтобы массивы не затирали друг друга, их можно поместить в разные переменные и объединить с помощью array_merge.

>>412570

Там не надо 2 раза вызывать createQustions. А достаточно вызвать ее один раз.

>>412579

Потому что твой count заставляет разгадывать зачем это написано. Явное лучше неявного.

Ну и сегодня у нас там только числа 100 и 200 а завтра добавятся 10 и 20.

Если ты хочешь посоревноваться «кто сложнее запутает код», то ты не по адресу пришел. Или ты просто не знаешь как разбить строку на массив чисел в руби?

>>412582

Найти демо-версию админки в открытом доступе или поставить себе на компьютер админку интернет-магазина и освоить, параллельно читая документацию.
#162 #412590
>>412587

>Минус примера в мануале, в том что он слишком массивен и насыщен функциями, достаточно было бы 1-2 свойств и 1 метода для объекта, а так плохо воспринимается мне как новичку.


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

> полностью приватный или защищенный объект это как кофейный автомат без кнопок просто с вилкой для розетки?


даже без вилки.
#164 #412592
>>412590

Я думаю, анон просто не очень разбирается в массивах и функциях (не решал предыдущие задачи), и немного переоценил свои силы, оттого и сложности.
#165 #412595
>>412592
Но я решал предыдущие задачки
Лиличка:
http://ideone.com/zKp8G9
Вот на поиск ближайших цифр в массиве
http://ideone.com/2j3S6k
Вот на банкомат http://ideone.com/EcepAn
Я подумал, что этого достаточно чтобы разобраться с объектами и классами :C
#166 #412599
>>412589
Как поставить ее себе на пеку? Я ума не приложу даже как составить запрос гуглу.
64 Кб, 1054x938
#167 #412603
Нормально решать задачи в лоб, прямо моделируя описанное в условиях? Подозреваю большинство подобных задач можно выполнить одной хитровыебанной формулой, но так не интересно же.
Задача http://codeforces.ru/problemset/problem/492/A
Решение http://ideone.com/eXaq4D
49 Кб, 800x671
#168 #412604
https://ideone.com/SR8Utx
Пожалуйста, решите за меня.

inb4: думай сам
#169 #412606
>>412604
https://ideone.com/elkME9 не благодари.
#171 #412612
>>412595

Видимо, надо было больше решать! Ну попробуй тогда реши задачи из урока про ООП, включая Вектор и кошки-мышки.

>>412599

ну CMS для интернет-магазинов много. Определись, какую ты хочешь изучать.

Например, на сайте разработчика CMS часто бывает выложено демо

Вот пример сайта где есть демо-версии разных CMS, можно их пробовать не устанавливая:

http://www.opensourcecms.com/scripts/show.php?catid=3&category=eCommerce

https://www.softaculous.com/demos
46 Кб, 800x671
#172 #412613
>>412606
Большое с п а с и б о!!! Ты молодой, шутливый. Не стоит так делать.
#173 #412614
>>412599

Чтобы установить себе на компьютер, надо установить Апач, MySQL, PHP, это может быть сложно.

>>412603

Так там число кубиков до 10 000 может быть, твоя программа потянет? Тут все же стоит почитать про арифместические/геометричесике прогрессии и про числа Фибоначчи, мне кажется задача с ними связана.
#174 #412615
>>412603

Вообще, на олимпиадах задания тестируются автоматически, а для защиты от решения в лоб обычно дают большие входные числа, так, что без оптимизаций не уложищься в лимит по времени.
58 Кб, 305x271
#175 #412616
>>412610
Вот это да! Я думал так решать: https://ideone.com/OCZblC Ты охуеннен.
#176 #412619
>>412614
>>412612
Спасибо. Я перепрочел фак и понял, что я мудак, простите.
Начну с основ пхп, дабы стать всесторонне развитым спецом. Cкачал NetBeans for PHP, где сам язык взять? Потому что браузер отказывается выполнять написанный в нетбинсе код.
#177 #412621
>>412615
Моя то уложилась в 0,78с (хоть это и раби), но печально, когда программирование скатывают в математику. Это как пенсионеркам-поломойкам выдать альпинисткое снаряжение и запустить соревнование по мытью небоскреба.
#178 #412622
>>412616
Нет, не подходит. Что я делаю не так?

https://ideone.com/6FbN2x
Воннаби #179 #412623
ОП, вот ты в прошлом треде сказал что мол лучше по треду учиться, чем по каким-то устаревшим курсам или гайдам. А теперь такой вопрос, а где брать современную литературу по пхп? Вот я делаю сейчас тестовое задание попутно изучая вещи в которых как раз у меня много проеблов, и как методичку использую Никсона. У меня вот собственно какой вопрос. Это правильный подход? Или там показаны устаревшие приемы? Я знаю точно что там описаны всевозможные устаревшие функции, но эта проблема решается тупо проверкой на функции php.net - там подписано если что-то устарело и на что лучше заменить это дело. Существует ли современная литература по пхп и веб-разработке?
13 Кб, 1015x155
33 Кб, 1356x234
#180 #412644
>>412569
>>412562

По поводу кнопок и радио кнопок, и полей - исправлю.

И с версткой <br> попытаюсь разобраться. Таблицами можно?

Не придумал, как реализовать поиск, кстати, он что-то не работает, когда запроса вида ... LIKE %:search%

Почему не ставить? Разве не должен быть код заключен в <?php ... ?>?

Окей, буду передавать по отдельности.

По поводу поля md5 понятно, но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?

Ух, блин, как много всего и все таки это сложно немного.

Я уберу эту регулярку. когда будет type = 'emai'.

С последними понятно. Спасибо.

P.S. Вчера во время исправления навернулся и оно опять передает строку, а почему - не знаю. Скрины:
#181 #412645
>>412619
Либо скать интерпретатор, либо использовать сборки вроде wamp, денвер(не рекомендую), либо хостинг.

Как установить интерпретатор:
https://gist.github.com/codedokode/7054af4a03865c4cc863
#183 #412651
>>412619

Заметь что если php установлен и все верно настроено, Netbeans сам умеет его вызывать и ты можешь запускать программу не выходя из IDE.

https://netbeans.org/kb/docs/php/project-setup.html#scriptCommandLine

https://netbeans.org/kb/docs/php/project-setup_ru.html

Если у тебя PHP находится в одной из папок в PATH, скорее всего даже настраивать ничего не надо.

Также, рано или поздно тебе понадобится Апач. Вот небольшой FAQ по его установке: https://gist.github.com/codedokode/10774100
#184 #412655
>>412621

Сложить числа — математика уровня 5 класса. Никто же тебя уравнения с интегралами и векторами решать не заставляет. Так что странные аналогии. И почему программист не может разбираться в математике? Я думаю, может.

>>412623

Никсон только для основ годится. Про современный PHP можно почитать например на сайте phptherightway (там есть русский перевод).

Также, 2 неплохие книги (Зандстра и Шлосснейгл) указаны в ОП-треде. Они не очень новые, но вещи типа принципов ООП не устарели.

Заметь, вся эта литература научит тебя лишь языку PHP. Дальше лучше изучать те же фреймворки, например, Slim, Silex, Yii2 , Symfony 2, потому что этого в книгах наверно нет (хотя может и есть, не знаю), а именно на фреймворках многие проекты сейчас делаются.

Не все описано в книгах. Ты вряд ли найдешь книгу например на тему «как использовать redis в php проектах».

Ну и если у тебя есть пробелы в HTML/CSS, JS, базах данных, тебе про них стоит почитать. У меня есть хорошие задачки для проверки знаний на эти темы.
#185 #412659
>>412644

> Таблицами можно?


Это еще хуже чем br. Чувак, таблицами уже 10 лет никто не верстает. Почему дивами не хочешь заверстать?

Если ты плохо разбираешься в HTML, ты можешь пока оставить на br, и заниматься php-частью. Но тогда надо параллельно осваивать HTML/CSS. У меня есть урок с ссылочками на теорию и задачками, можешь их тоже потихоньку решать, ближе к концу научишься как правильно сверстать эту форму: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

> он что-то не работает, когда запроса вида ... LIKE %:search%


У тебя и в SQL пробелы в знаниях. Смотри, то что мы подставляем через плейсхолдеры, вставляется в запрос в кавычках, напрмиер:

WHERE x = ? превратится в WHERE x = 'qwww'

Соответственно

LIKE %:search% превратится в LIKE %'abc'%

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

> Разве не должен быть код заключен в <?php ... ?>?


закрывающий маркер не обязателен: http://php.net/manual/ru/language.basic-syntax.phptags.php

> но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?


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

dgsusgt76dstf76sfdssf

> Я уберу эту регулярку. когда будет type = 'emai'.


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

Насчет ошибки, может это из-за точки с запятой?

> Ух, блин, как много всего и все таки это сложно немного.


Не беда, со временем разберешься.
#185 #412659
>>412644

> Таблицами можно?


Это еще хуже чем br. Чувак, таблицами уже 10 лет никто не верстает. Почему дивами не хочешь заверстать?

Если ты плохо разбираешься в HTML, ты можешь пока оставить на br, и заниматься php-частью. Но тогда надо параллельно осваивать HTML/CSS. У меня есть урок с ссылочками на теорию и задачками, можешь их тоже потихоньку решать, ближе к концу научишься как правильно сверстать эту форму: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

> он что-то не работает, когда запроса вида ... LIKE %:search%


У тебя и в SQL пробелы в знаниях. Смотри, то что мы подставляем через плейсхолдеры, вставляется в запрос в кавычках, напрмиер:

WHERE x = ? превратится в WHERE x = 'qwww'

Соответственно

LIKE %:search% превратится в LIKE %'abc'%

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

> Разве не должен быть код заключен в <?php ... ?>?


закрывающий маркер не обязателен: http://php.net/manual/ru/language.basic-syntax.phptags.php

> но ведь надо знать, что там зашифрована фамилия и email, иначе никак, или я ошибаюсь?


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

dgsusgt76dstf76sfdssf

> Я уберу эту регулярку. когда будет type = 'emai'.


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

Насчет ошибки, может это из-за точки с запятой?

> Ух, блин, как много всего и все таки это сложно немного.


Не беда, со временем разберешься.
#186 #412660
>>412622

Вы наркоманы регулярки на HTML использовать? Тут нужен DOM или что-то аналогичное. Если ты не понимаешь что такое DOM, то изучи сначала.
3 Кб, 1164x40
sage #187 #412671
>>412603
надо решить это уравнение для k:
2k(k+1)(k+2) = 12n
http://ideone.com/000gUS

давай ещё. мне нра олимпиадки ;з
#188 #412682
Говорят в РФ гитхаб заблочили или заблочат, это правда?
#189 #412687
>>412682
Уже, и не в первый раз.
#190 #412688
>>412682

Правда http://geektimes.ru/post/242306/

У меня пока работает.

Так как гитхаб на https то можно лишь заблокировать сайт целиком.

Если у кого-то из анонов не получается из-за этого решать задачки (например композер не может скачать библиотеку с гитхаба), вы можете попробовать использовать что-нибудь вроде этого http://antizapret.prostovpn.org/ Но советую включать эту штуку только на время, так как ее авторы получают доступ к вашему трафику, кто знает их реальные мотивы.

Алсо не понимаю, почему блокируют сайты с поддельными дипломами. Если это незаконно, можно провести операцию в реале и поймать продавцов. Если это pаконно, непонятно зачем блокировать. Видимо заблокировать все же проще чем кого-то ловить
#191 #412700
Ребзя, как писать модулями? Поделитесь мануалами, а то не могу сообразить. ОП, помоги пилиз.

Не хочу писать код, который потом буду переписывать или, в лучшем случае, пихать потом кусками. Хочу - написал регистрацию или отправлялку писем и добавляй там и сям по мере необходимости.
#192 #412701
>>412688
Хех, а я уже хотел было перебраться на руssкий vps за 200 рублей, но теперь передумал.
#193 #412705
>>412701

На VPS блокировки могут и не действовать.

>>412700

«модули» у меня ассоциируются с дурным подходом когда весь код сваливали в один файл и называли это модулем. Сейчас используется ООП и фреймворки, и боюсь, кратко это не объяснить. Посмотри например как в Сифмони 2 сделаны бандлы или расширения в Yii.
#194 #412714
>>412655
Там не сложение чисел, а поиск волшебной формулы. По твоей логике кабинетные поломойки должны иметь навыки промышленных альпинистов чтобы мыть окна в небоскребах. Нет, так не пойдет. Математик пусть решает теоремы, уравнения, ищет свои засранные формулы, а программист эти формулы программирует.
#195 #412730
Всё тот же аутист с классами и объектами на связи.
http://ideone.com/gRCXgq Почему столбики в таблице не выходят?
#196 #412735
>>412730

str_pad не поддерживает utf-8 и русские буквы. Не используй ее и прочитай вот этот мини-урок: https://gist.github.com/codedokode/ff99e357e9860ea169b8

Если гитхаб не открывается, то вот копия текста: http://ideone.com/kBwfL9
#197 #412741
>>412735
А мультибайтовой аналогичной функции я так понял не завезли ещё :C
переделал тогда функции эти http://ideone.com/gRCXgq
#198 #412742
>>412705

>«модули» у меня ассоциируются с дурным подходом когда весь код сваливали в один файл и называли это модулем.


Хуйню пишешь, при этом про ооп заикаешься, ребенок.
#199 #412756
>>411530
Я тут повторюсь.
>>412455
Я правильно понял, что делать с CSRF?
#200 #412781
>>412580
Я совершенно не понимаю, как запоминать промежуточные вершины, куда их добавлять, грубо говоря, и как удалять, если оказалось, что она никуда не ведет. Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?
33 Кб, 1359x228
10 Кб, 983x144
#201 #412782
>>412659
Абсолютно выбешивает, когда у тебя ничего не работает. Може кто-нибудь рассказать почему такая хрень происходит? Второй день уже
#202 #412803
>>412782
Начал немного разбираться с версткой?

http://jsfiddle.net/4ut95L7k/

Как сделать так что бы текст не вылазил за границы?
#203 #412811
Продублирую в новом треде

>>>411620



>Я вижу ты не очень знаешь яваскрипт. Не хочешь ли порешать наши задачки, которые помогут тебе исправить пробелы в знаниях? Я проверю решения и подскажу если ты где-то запутался: https://gist.github.com/codedokode/ce30e7a036f18f416ae0



ОП, покажи, пожалуйста, пример, где выполняется та же самая задача только с заменой классов (речь идет о той, которая в этой ссылке http://jsfiddle.net/zybs794e/1/) Я не могу присвоить элементу "x" определенный стиль с цикле.
#204 #412816
>>412811
Не могу присвоить класс с нужным стилем, я имел ввиду.
#205 #412828
>>412782
Я разобрался. Ребята, а давайте теперь будет сторонниками жесткой типизации?
#206 #412867
>>412756

Понял ты правильно, но по моему переусложнил решение.

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

Код можно получать как минимум 2 способами:

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

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

Твой вариант с сессиями — это усложненный вариант с кукой (так как id сессии хранится в куке PHPSESSID). Не очень понятно, зачем городить сессии если можно явно выставить куку. Минус в том, что неактивные сессии по умолчанию удаляются через 15 минут, а в случае с кукой мы можем выставить длительность произвольно. Также, сессии могут вызывать интересные блокировки при использовании аякс-запросов: http://habrahabr.ru/company/bitrix/blog/179803/

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

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

Ну и в случае форм, которые можно отправить заново, при несовпадении CSRF токена с правильным, не надо выводить страшные надписи типа «фатальная ошибка», ведь может пользователь просто долго не отправлял форму или очистил куки в браузере. Надо просто вывести заполненную форму с сообщением, что прошло много времени и надо отправить форму повторно. У тебя заполненную форму вывести не получится, потому надо просто вывести сообщение.

А теперь поговорим про ошибки.

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

https://github.com/sqghub/uppu.ru/blob/master/index.php#L65

В чем смысл защиты, непонятно.

В случае комментария при ошибке можно бы и выводить форму заново. Сложно ли это сделать? Для этого наверно удобно код обработки пост-запроса на добавление комментария перенести в обработчик страницы /download/:fileId, чтобы было:

....
создать пустой объект Comment;

если (отправлена форма комментария) {
— прочитать данные из POST и заполнить объект Comment
— проверить все ли правильно
— если да, добавить комментарий и сделать редирект, выйти из функции
}

вывести страницу просмотра файла.
....

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

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

Куки (и следовательно сессии) общие для всех вкладок с сайтом. Надо помнить об этом.

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

Проверку и генерацию токена лучше сделать отдельными функциями, чтобы было вроде

if (!tokenIsValid(...)) {
...
}

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

Что ты дальше хочешь делать? Какие планы?
#206 #412867
>>412756

Понял ты правильно, но по моему переусложнил решение.

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

Код можно получать как минимум 2 способами:

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

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

Твой вариант с сессиями — это усложненный вариант с кукой (так как id сессии хранится в куке PHPSESSID). Не очень понятно, зачем городить сессии если можно явно выставить куку. Минус в том, что неактивные сессии по умолчанию удаляются через 15 минут, а в случае с кукой мы можем выставить длительность произвольно. Также, сессии могут вызывать интересные блокировки при использовании аякс-запросов: http://habrahabr.ru/company/bitrix/blog/179803/

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

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

Ну и в случае форм, которые можно отправить заново, при несовпадении CSRF токена с правильным, не надо выводить страшные надписи типа «фатальная ошибка», ведь может пользователь просто долго не отправлял форму или очистил куки в браузере. Надо просто вывести заполненную форму с сообщением, что прошло много времени и надо отправить форму повторно. У тебя заполненную форму вывести не получится, потому надо просто вывести сообщение.

А теперь поговорим про ошибки.

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

https://github.com/sqghub/uppu.ru/blob/master/index.php#L65

В чем смысл защиты, непонятно.

В случае комментария при ошибке можно бы и выводить форму заново. Сложно ли это сделать? Для этого наверно удобно код обработки пост-запроса на добавление комментария перенести в обработчик страницы /download/:fileId, чтобы было:

....
создать пустой объект Comment;

если (отправлена форма комментария) {
— прочитать данные из POST и заполнить объект Comment
— проверить все ли правильно
— если да, добавить комментарий и сделать редирект, выйти из функции
}

вывести страницу просмотра файла.
....

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

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

Куки (и следовательно сессии) общие для всех вкладок с сайтом. Надо помнить об этом.

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

Проверку и генерацию токена лучше сделать отдельными функциями, чтобы было вроде

if (!tokenIsValid(...)) {
...
}

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

Что ты дальше хочешь делать? Какие планы?
#207 #412873
Можно в sql запрос вставить строку без кавычек?
#208 #412882
>>412700

Насчет отправки почты — есть тот же SwiftMailer, можно это не писать.

>>412741

> \t$count = $arg - mb_strlen($string);


> $space = str_repeat(' ', $count);


Если строка длинее чем arg то получится отрицательный count и функция str-repeat выдаст ошибку. Надо проверять что count > 0

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

>>412781

> , как запоминать промежуточные вершины,


там используется очередь. Структура данных «очередь» напоминает настоящую очередь:

https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

Очередь можно реализовать разными способами. В случае PHP может быть массив (или объект встроенного в Php класса SplQueue если ты знаком с ООП). С очередью можно делать только 2 операции: добавить объект в очередь (вставить его в начало массив через array_unshift) или снять с другого конца очереди (вынуть из конца массива через array_pop). Таким образом, объекты из очереди вынимаются всегда в том же порядке что и вставлялись.

Вот описание очереди на SplQueue: http://habrahabr.ru/post/190176/

> куда их добавлять,


Новые найденные вершины добавляются в очередь

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


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

Главное, что тебе надо понять — что такое и как работает очередь. Тогда остальной алгоритм мне кажется станет понятнее.

> Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?



Тот пример проверяет есть ли путь из вершины A в вершину В но не возвращает как его пройти. Это можно сделать, суть доработав алгоритм (надо для каждой вершины также сохранять, откуда мы в нее пришли. Тогда мы сможем найдя вершину B восстановить путь).

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

Ну и если ты хочешь получше разобраться с графами и стеками, то у меня есть задачка: дан список программ, причем некоторые из них зависят от дургих (чтобы установить A надо сначала установить B и С). Надо вывести порядок, в котором требуется устанавливать программы. Если это невозможно, надо вывести соотвествующее сообщение.

Решение: гугли топологическая сортировка.

>>412671

Держи задачку выше про порядок установки программ.
#208 #412882
>>412700

Насчет отправки почты — есть тот же SwiftMailer, можно это не писать.

>>412741

> \t$count = $arg - mb_strlen($string);


> $space = str_repeat(' ', $count);


Если строка длинее чем arg то получится отрицательный count и функция str-repeat выдаст ошибку. Надо проверять что count > 0

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

>>412781

> , как запоминать промежуточные вершины,


там используется очередь. Структура данных «очередь» напоминает настоящую очередь:

https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

Очередь можно реализовать разными способами. В случае PHP может быть массив (или объект встроенного в Php класса SplQueue если ты знаком с ООП). С очередью можно делать только 2 операции: добавить объект в очередь (вставить его в начало массив через array_unshift) или снять с другого конца очереди (вынуть из конца массива через array_pop). Таким образом, объекты из очереди вынимаются всегда в том же порядке что и вставлялись.

Вот описание очереди на SplQueue: http://habrahabr.ru/post/190176/

> куда их добавлять,


Новые найденные вершины добавляются в очередь

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


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

Главное, что тебе надо понять — что такое и как работает очередь. Тогда остальной алгоритм мне кажется станет понятнее.

> Тот пример, как я понял, просто проверяет, есть ли путь, или нет. Или нет?



Тот пример проверяет есть ли путь из вершины A в вершину В но не возвращает как его пройти. Это можно сделать, суть доработав алгоритм (надо для каждой вершины также сохранять, откуда мы в нее пришли. Тогда мы сможем найдя вершину B восстановить путь).

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

Ну и если ты хочешь получше разобраться с графами и стеками, то у меня есть задачка: дан список программ, причем некоторые из них зависят от дургих (чтобы установить A надо сначала установить B и С). Надо вывести порядок, в котором требуется устанавливать программы. Если это невозможно, надо вывести соотвествующее сообщение.

Решение: гугли топологическая сортировка.

>>412671

Держи задачку выше про порядок установки программ.
#209 #412886
>>412782

Из-за точки с запятой в конце?

>>412803

Текст выходит из-за того, что браузер по умолчанию не разливает длинные слова. Чтобы заставить его это сделать, есть такие CSS свойства:

http://htmlbook.ru/css/word-break (работает в CSS3 и в ИЕ) — грубо разбивает слова если они не влезают.

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

Вот статья: http://htmlbook.ru/blog/perenosy-slov
#210 #412908
>>412828
Нет не разобрался. Проблема все таже. Поскольку решил проблему с LIMIT, то думал что и с этим решу. Хрен там.
>>412886
Нет, просто переменные имелли тип строки, а не целого. А вот с LIKE хрень.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE 'Vasya'' at line 1 in C:\wamp\www\classes\StudentMapper.php on line 45
#211 #412911
>>412811

Точно такой же как у тебя, нет. Там есть задача на работу с CSS-классами: https://gist.github.com/codedokode/ce30e7a036f18f416ae0#1%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC%D0%B8 и в ходе ее решения надо уметь добавлять и удалять классы. По сути ты просто добваляешь/удаляешь слово из свойства className (это свойство описано например в учебнике learn.javascript.ru)

И есть задача на переключение кнопок средствами CSS3: https://gist.github.com/codedokode/58ebc90bd006baf4b35c#%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-11

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

Номер при этом передавать в функцию не обязательно, можно передавать this, который указывет на нажатый DOM элемент.

Также, ты в своем коде присваиваешь стиль выделенному элементу 5 раз подряд. Зачем? Может ты просто не понимаешь, как цикл работает? Если это так, тебе лучше сначала изучить сам яваскрипт и циклы. Вот неплохой учебник: http://learn.javascript.ru/

Вообще у тебя тебя вроде при клике все работает. Только вот код не очень хороший. Если ты его откуда-то скопировал, не понимая как он работает, и попытался подстроить под свои нужды, то это бессмысленно: в программировании такой подход не работает. Надо понимать что значит и делает каждая строчка.
#212 #412912
>>412911
Да нет, код писал сам, только в предыдущем треде спросил совета как всё в одну функцию уместить. И да, мне нужно, чтобы функция срабатывала при клике мыши.
#213 #412916
>>412873

Можно, но зачем? Это часто ведет к Sql инъекциям.

>>412908

А, понял. Ты забыл слово WHERE и т.д. Почитай про синтаксис SELECT и посмотри как там условия пишутся: http://phpclub.ru/mysql/doc/select.html

Надо писать SELECT x FROM y WHERE z LIKE t

Я вижу, ты плохо знаешь SQL. Не хочешь параллельно полезные задачки порешать? https://gist.github.com/codedokode/10539213
#214 #412917
>>412867

>Что ты дальше хочешь делать? Какие планы?


Дальше - задачи по js.
#215 #412918
Добрый день ОП и все остальные, попытался сделать задачу про выбор даты из статьи в Википедии:
http://ideone.com/USPnCu

Когда вставляю всю статью идеон отказывается обрабатывать скрипт, поэтому вставил одну лишь часть. У меня получилось выделить только дату в формате число месяц год и месяц год, в случае с выбором просто года возникла проблема, вот регулярка:

$pattern="![0-9]?[0-9]? [A-Za-z]+ [0-9]{4}!";

Я не могу поставить ? перед [A-Za-z] а по другому не знаю как сделать
#216 #412919
>>412912

Ну в любом случае 5 раз подряд присваивать не надо стиль одному элементу.

Если тебе сложно сделать с классами, оставь как есть. Но имей в виду, что это довольно-таки плохо. Гораздо удобнее когда текущему элементу просто добавляется класс и можно как угодно через CSS настраивать его вид.
#217 #412920
>>412917

Хорошо. Ссылка у тебя надеюсь уже есть? Там во второй части, где задания на DOM, я думаю добавить задания с 4-5 возможность начинать использовать jQuery, надеюсь я успею это поправить пока ты решаешь более ранние задачи.

>>412918

А почему в коде пустые строки идут через одну и нет отступов? Неудобно же читать.

Любой мусор воспринимается как дата: http://ideone.com/ZoCupA

Зачем заменять названия месяцев 2 раза? Можно же так проверять, найти месяц и посмотреть каким он по счету идет в массиве?

> $rez['0']


зачем кавычки?

> for($i=0; $i<count($rez['0']); $i++) {


Тут уместнее foreach

> $time["$c"]


зачем тут кавычки?

Для работы с кириллицей и utf-8 в регулярку надо добавить флаг u
!xnn2uE3AU. #218 #412921
Анончики, я убегу ненадолго. Не скучайте, решайте задачки.
#219 #412922
>>412919
Спасибо. Я еще поработаю над классами. Дело в том, что я перерабатываю портфолио, которое делал аж весной и за которое меня зачмырили недавно на собеседовании. Учебники, конечно, хорошо, но я потерял ОЧЕНЬ много времени с HeadFirst Lab JS и jQuery, поэтому задачи выполняю практические, которые уже смогу интегрировать в портфолио. Но, конечно, да, зубы я обломал на кодинге.
#220 #412925
>>412920

>А почему в коде пустые строки идут через одну и нет отступов?



PHPformater так выдал, я попытался исправить.

>Любой мусор воспринимается как дата



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

>Зачем заменять названия месяцев 2 раза?



Что бы в конце вывести на русском

Вот что вышло http://ideone.com/w6xamV
#221 #412930
Вот, верстку начал делать.
http://jsfiddle.net/dkvd325a/

Остальные задания будут отдельно, а то слишком много в одном месиве получается.
#222 #412933
>>412916
Приехали. WHERE же не обязательное условия.
SELECT FROM students;
Выведет к примеру все записи из таблицы, без всяких where.
#223 #412934
>>412933
Мне вчера на лекции по базам данных преподаватель рассказывал, что нужно джойнить таблицы, а условия прописывать в WHERE, а не в ON. Оп, где правда?
#224 #412936
>>412934
Оп, кстати, ушел. Выше пост. Теперь я понял в чем ошибка. Мне надо по полю искать WHERE firstName LIKE pattern.

Что значить джойнить?(прости за тупой вопрос).

Может у тебя есть идея как организовать поиск не по одному полю, а по всем?
#225 #412941
>>412936

>Что значить джойнить?(прости за тупой вопрос).


Использовать JOIN, очевидно.

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


SELECT FROM `table` WHERE ((`field1`=:param) OR (`field2` = :param) OR (`field3` = :param)) чем не устраивает?
#226 #412942
>>412941
А, извини.

>>>SELECT FROM `table` WHERE ((`field1`=:param) OR (`field2` = :param) OR (`field3` = :param)) чем не устраивает?



Хм, наверное тем, что полей может быть с десяток, лол
#227 #412943
>>412942
Впиши десяток. В чем проблема?
#228 #412945
>>412943
Запроси жи огромный.
#229 #412947
>>412945
Так а ты чего хотел, если ищешь по десяти полям?
#230 #412949
>>412947
Компактно как-то
#231 #412974
>>412882
Все равно не понимаю. С очередью более-менее разобрался, я не знал, что это просто синоним FIFO-структуры данных. Хотя я больше к стэкам привык. Но понятнее от этого не стало. Можешь вот в этом алгоритме
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83#PHP
вставить эту самую очередь, запоминающую последовательность вершин в кратчайшем пути? Без тебя, видимо, так и не разберусь.
#232 #412976
>>412974
Если у тебя ребра одинаковые, то он тебе так и так вернет кратчайший путь.
#233 #412988
Как реализовать переадресацию на другую страницу при наличии куков?
#234 #412997
Посоны, почему даже когда я пишу display: inline-block, абзацы все равно с новой строки выходят. И вообще, реквестирую помощи по шестому заданию по верстке.
http://jsfiddle.net/5t8awtk6/
#235 #413004
>>412997

Потому что div блочный элемент.

Предыдущие 5 заданий показывать будешь?
#236 #413019
>>412976
В смысле одинаковые? Вес разный, например. Количество вершин между начальной и конечной в разных возможных путях разный. Но вообще это на то и алгоритм поиска кратчайшего пути, чтобы его искать. Только он возвращает саму возможность найти путь, а не этот путь.
#237 #413021
>>413019
Если вес разный, то тебе другой алгоритм нужен.
https://ru.wikipedia.org/wiki/Неинформированный_метод_поиска#UCS
Вроде бы такой.
#238 #413028
>>413004
Но для того display и придумали, что я ставлю inline-block и он теперь обтекается. Предыдущие пять заданий чуть выше.
#239 #413052
>>413028

Неверно. display: inline-block заставляет элемент снаружи выглядеть как inline элемент (а изнутри как block). inline-элементы выстраиваются горизонтально по строками. Где ты прочел про обтекание?

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

Блочные элементы выстраиваются вертикально, а inline внутри них — гоизонтально по строчкам. При этом inline элементы из одного блока никак не влияют на другие. Ты не читал этот урок? http://softwaremaniacs.org/blog/2005/08/27/css-layout-flow/
#240 #413053
>>413028

Если тебе так будет проще, то блочные и инлайновые элементы можно сравнить с абзацами и словами в них. Абзацы выстраиваются вертикально, а слова — горизонтально и переносятся по строчкам.
#241 #413063
>>413021
Нене, не в этом смысле, мне нужен именно поиск в ширину. Кратчайший путь имеется ввиду по количеству ребер от помеченной номером 1 вершины до n-ой, а в случае наличия одинаковых путей по длине - по нумерации ближайшей различающейся в двух путях вершины.
#242 #413066
>>413063
Самое унылое, что я уже вроде бы более сложные вещи, например, поиск эйлерова цикла, реализовывал, мне казалось это простым и понятным, а вот тут застрял намертво.
ОП, бамп этому реквесту >>412974
#243 #413085
>>413066

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

Алгоритм который под пунктом «Итеративная формулировка:».

Или ты в алгоритме пока что-то не понял? Если кратко, то надо сделать такой алгоритм:

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

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

>>412922

Имей в виду, тебе надо больше заниматься JS, так как он у тебя слабенький. Почитай например learn.javascript.ru

>>412925

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

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

Также, год может быть только либо 2 либо 4 значным.

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

Пробел после года — ненадежно, так как там может идти например запятая. Лучше проверять что нет цифр и букв.
#243 #413085
>>413066

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

Алгоритм который под пунктом «Итеративная формулировка:».

Или ты в алгоритме пока что-то не понял? Если кратко, то надо сделать такой алгоритм:

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

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

>>412922

Имей в виду, тебе надо больше заниматься JS, так как он у тебя слабенький. Почитай например learn.javascript.ru

>>412925

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

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

Также, год может быть только либо 2 либо 4 значным.

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

Пробел после года — ненадежно, так как там может идти например запятая. Лучше проверять что нет цифр и букв.
#244 #413087
>>412930

1

> <div class="task1 left">


> <b>


А зачем тут b? Если ты хочешь сделать шрифт жирным во всем блоке, ты можешь это без лишнего тега сделать. Все оформление должно задаваться в CSS, в HTML мы делаем только разметку текста по смыслу: что является заголовком, что в каком блоке расположено.

Можно использовать strong чтобы выделить несколько слов, но если весь абзац жирный — это не выделение, а это такой шрифт и не надо писать лишние теги.

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

> div.task1


Нет смысла писать тут div, так как это излишне. Да и какой смысл делать класс, который применим к определенному тегу? Это по моему только запутывает ситуацию. То есть тут лучше писать просто .task1

То же относится и к другим селекторам в CSS файле.

2

Нет черной рамки, нет полей 10px над и под текстом.

> font-size: 14px


Когда задаешь размер шрифта надо тут же задавать line-height. Если не знаешь что поствить ставь 1.2 - 1.4

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

3

> span.task3


> div.task3


Не надо так, один класс ведет себя по разному на разных тегах. Это создает путаницу. Сделай 2 разных класса или тег типа em. Тем более в условии написано:

> из тегов можно использовать только <em>



Также, не хватает стрелочки вправо. Также надо задать line-height.

> font-family: Times;


Надо писать "Times New Roman", так же в конце списка шрифтов надо всегда писать один из стандартных: http://htmlbook.ru/css/font-family

4

> div.task4 {


Имена классов конечно ужасные, лучше бы писал block или как-то так, а в CSS

.task4 .block { ... }

По тегу b то же самое что и в первом задании: он тут не нужен. Тем более, внутрь инлайновых тегов нельзя вкладывать блочные (br). Тебе даже jsfiddle это красным цветом показывает.

Между желтыми блоками должно быть 10px, у тебя меньше. В задании есть ссылка на полезную статью на эту тему.

Шрифт должен быть без засечек, типа Arial или можно просто sans-serif.

Рамка должна быть тоньше, не 2px, а 1.

5

Тут только убери теги из селекторов и думаю все будет верно.
#244 #413087
>>412930

1

> <div class="task1 left">


> <b>


А зачем тут b? Если ты хочешь сделать шрифт жирным во всем блоке, ты можешь это без лишнего тега сделать. Все оформление должно задаваться в CSS, в HTML мы делаем только разметку текста по смыслу: что является заголовком, что в каком блоке расположено.

Можно использовать strong чтобы выделить несколько слов, но если весь абзац жирный — это не выделение, а это такой шрифт и не надо писать лишние теги.

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

> div.task1


Нет смысла писать тут div, так как это излишне. Да и какой смысл делать класс, который применим к определенному тегу? Это по моему только запутывает ситуацию. То есть тут лучше писать просто .task1

То же относится и к другим селекторам в CSS файле.

2

Нет черной рамки, нет полей 10px над и под текстом.

> font-size: 14px


Когда задаешь размер шрифта надо тут же задавать line-height. Если не знаешь что поствить ставь 1.2 - 1.4

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

3

> span.task3


> div.task3


Не надо так, один класс ведет себя по разному на разных тегах. Это создает путаницу. Сделай 2 разных класса или тег типа em. Тем более в условии написано:

> из тегов можно использовать только <em>



Также, не хватает стрелочки вправо. Также надо задать line-height.

> font-family: Times;


Надо писать "Times New Roman", так же в конце списка шрифтов надо всегда писать один из стандартных: http://htmlbook.ru/css/font-family

4

> div.task4 {


Имена классов конечно ужасные, лучше бы писал block или как-то так, а в CSS

.task4 .block { ... }

По тегу b то же самое что и в первом задании: он тут не нужен. Тем более, внутрь инлайновых тегов нельзя вкладывать блочные (br). Тебе даже jsfiddle это красным цветом показывает.

Между желтыми блоками должно быть 10px, у тебя меньше. В задании есть ссылка на полезную статью на эту тему.

Шрифт должен быть без засечек, типа Arial или можно просто sans-serif.

Рамка должна быть тоньше, не 2px, а 1.

5

Тут только убери теги из селекторов и думаю все будет верно.
#245 #413088
>>412933

Ты не понял. Ты либо не пишешь WHERE и не пишешь условия выборки типа LIKE либо пишешь и то и другое.

Почитай еще раз про синтаксис SELECT.

>>412934

Если используется обычный JOIN то условие в ON равносильно WHERE. Если LEFT JOIN то очевидно нет.

Я считаю, логичнее условия джойна прописывать в ON для наглядности, чтобы при чтении отделить условия объединения от условий фильтрации. Преподавателю видимо нравится по-другому писать.

Так что думаю это скорее дело вкуса.

>>412936

Объединять таблицы. В моем уроке по SQL ( https://gist.github.com/codedokode/10539213 ) есть очень хорошая ссылка вот на этот урок: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

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

Ну и потом советую решить задачки из моего урока.

> как организовать поиск не по одному полю, а по всем?


В твоем случае проще всего через OR перечисить все поля.

>>412942

Проще вписать десяток чем прикручивать сторонние поисковые движки вроде sphinx.

>>412988

если (есть кука) {
выдать заголовок location на нужную страницу;
завершить скрипт;
}

>>412997

Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.
#245 #413088
>>412933

Ты не понял. Ты либо не пишешь WHERE и не пишешь условия выборки типа LIKE либо пишешь и то и другое.

Почитай еще раз про синтаксис SELECT.

>>412934

Если используется обычный JOIN то условие в ON равносильно WHERE. Если LEFT JOIN то очевидно нет.

Я считаю, логичнее условия джойна прописывать в ON для наглядности, чтобы при чтении отделить условия объединения от условий фильтрации. Преподавателю видимо нравится по-другому писать.

Так что думаю это скорее дело вкуса.

>>412936

Объединять таблицы. В моем уроке по SQL ( https://gist.github.com/codedokode/10539213 ) есть очень хорошая ссылка вот на этот урок: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

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

Ну и потом советую решить задачки из моего урока.

> как организовать поиск не по одному полю, а по всем?


В твоем случае проще всего через OR перечисить все поля.

>>412942

Проще вписать десяток чем прикручивать сторонние поисковые движки вроде sphinx.

>>412988

если (есть кука) {
выдать заголовок location на нужную страницу;
завершить скрипт;
}

>>412997

Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.
#246 #413089
>>413028

Сразу же ошибки:

> .article div p{


> display: inline-block;


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

Во-вторых. ты применяешь правило ( margin: 10px 10px 10px 10px; ) только к абзацам, а в тексте могут быть списки, таблицы, картинки. Ты делаешь это неправильно. Если ты хочешь сделать поля справа и слева их надо делать паддингом на родителе, маргин предназначен для отталкивания элементов друг от друга.
#247 #413090
>>413066

Не расстраивайся. попробуй написать код сам, если ты алгоритм понял. Если не понял, задавай еще вопросы, будем разбирать постепенно, пока не поймем.
#248 #413125
>>413088
Можно как-то без SELECT обойтись? Я почитал, там какая-то ракетная математика.
#249 #413179
>>413088

>Подсказка: это задание на флоаты. Флоаты хорошо описаны в учебнике на softwaremaniacs.


http://jsfiddle.net/5t8awtk6/
Я тут попробовал.
#250 #413208
Мне одному кажется, что треды улетат в лимит ну очень быстро? Я даже уже боюсь открывать его просто так, ибо очень много кто пишет, и за день копится столько постов, что уже просто нереально разобраться в написанном.
#251 #413218
>>413208

>Мне одному кажется, что треды улетат в лимит ну очень быстро?


Ну так хорошо же.

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


Добавь в избранное, сразу видно сколько постов ты пропустил и при клике на тред в избранном он загружается с новых постов
#252 #413219
>>412882
http://ideone.com/W1Mhat
Доделал, ну сейчас чувствую даже некоторое облегчение когда классы для меня стали более понятны с практической точки зрения.
82 Кб, 925x114
#253 #413234
Привет, ОПмолодец! Я продолжаю делать твои задачки.

По JS остановился на задаче №10, ты говорил переделать чтобы было без for in, я переделал но не помню показывал или нет, в общем вот: http://jsfiddle.net/b3z8jtxn/1/

По php у меня была ошибка в задаче про айфон в кредит, переделал: http://ideone.com/DZiCBU
По это задаче ты сказал пикрелейтед. У меня получилось совпадение при долге в 1000, но я не понимаю почему при долге в 4000 ты говоришь что должно получится выплата в 6123. Ведь это получается что 4000(умножить)1.03+1000 = 5120. Соответственно непонятно, почему при изначальных условия задачи общие выплаты должны бытьпримерно 61270. Случайно нагугленный кредитный калькулятор показал почти ту же сумму, что вышла у меня. Такие дела.
#254 #413256
Оп, скажи, будь милостив к рабу своему, возможно ли написать скрипт, который парсил бы определенный сайт и слизывал оттуда цены в какую-то таблицу? реально ли это реализовать через регулярные выражения?
и по какому принципу я мог бы обойти все страницы сайта?
#255 #413258
>>413234
Задача по JS №11: http://jsfiddle.net/b4661fvm/1/
>>413256
Я не ОП, но делал подобное.

>Оп, скажи, будь милостив к рабу своему, возможно ли написать скрипт, который парсил бы определенный сайт и слизывал оттуда цены в какую-то таблицу?


Да

>реально ли это реализовать через регулярные выражения?


Вполне

>и по какому принципу я мог бы обойти все страницы сайта?


Ну самое простое, посмотри разметку пагинации нужной страницы, лови ее регуляркой и подставляй в file_get_contents,() ну или если количество страниц уже известной, можешь просто в цикле обходить.
#256 #413262
>>413234
У тебя задача не верно решена. Шутка в том, что у опа в формуле ошибка, ты с ней никак не посчитаешь правильно. Суть в том, что сначала ты должен начислять проценты и сервисную плату, и уже только потом проверять какой баланс и делать выплаты.
#257 #413265
>>413234
Да и сам подумай, как ты за месяц мог выплатить 5120 рублей, когда у тебя в месяц доступно лишь 5000?
#258 #413274
>>413265
>>413262
Большое спасибо, анон, за подсказку. Печально конечно что сам не дошел до этого. Переделал, теперь все вышло как ОП говорит: http://ideone.com/DZiCBU
#259 #413277
Советовали мне тут выше Chosen. http://harvesthq.github.io/chosen/#standard-select
Скачал и понял, что не знаю, как его сделать, чтоб он заработал в Yii. Куда кидать, че прописывать?
106 Кб, 1366x730
#260 #413286
И еще я так и не понял, как правильно сделать в представлении поле из другой таблици. Конкретно, когда добавляем альбом, указываем, какая группа/группы его записывали.
В модели у меня, оказывается, уже прописаны связи многие-ко-многим. Модель настраивать не нужно
#261 #413288
>>413286
Какой ужас. Не пробовал Sublime Text установить?
#262 #413384
#263 #413418
>>413288

Если анону нравится notepad++ путь пользуется, по сути огромной разницы с Sublime нет. Вот если на IDE переходить то да, разница будет.

>>413277

Chosen не написан специально для Yii и никак специально устанавливать его не надо. Все надо сделать самому.

Кинуть надо куда-то в папку для статики и подключить стандартными средствами Yii.

Чуть-чуть упомянуто тут: http://yiiframework.ru/doc/cookbook/ru/core.assets

http://habrahabr.ru/post/139166/

Ссылка на скрипт вставляется через Yii::app()->clientScript->registerScriptFile или Chtml::asset

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

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

Это было про то как установить. А как подключить, написано на сайте по ссылке. Ты создаешь например select или select multiple, вызваешь chosen и он превратит его в выпадающий список. Постарайся сделать это так, чтобы страница не прыгала при загрузке.

Соответственно если ты хочешь выбирать граппу, тебе надо сделать select multiple со списокм всех групп. А на сервере ты получишь id выбранных групп и сможешь их добавить.

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

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

Гугление по слвоам «chosen ajax autocomplete» показывает, что эта проблема уже решена и добрые
люди написали дополнение к chosen чтобы он мог брать результаты с сервера:

https://github.com/meltingice/ajax-chosen
https://github.com/ksykulev/chosen-ajax-addition

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

Искать на сервере можно запросом:

WHERE name LIKE 'текст%' — такой запрос может использовать индекс по полю name, но ищет только по началу названия.

Если ты будешь исплоьзовать условие WHERE name LIKE '%текст%' то он будет искать и по середине слова, ео без индекса, скорее всего медленно. Чтобы искать по середине названия быстро, надо подключать движки вроде Sphinx или хотя бы полнотекстовый индекс в MySQL.

Зато если ты справишься, у тебя будет удобный выбор групп.

Ну или ты можешь погуглить, может для связи многие ко многим есть готовые решения для Yii.
#263 #413418
>>413288

Если анону нравится notepad++ путь пользуется, по сути огромной разницы с Sublime нет. Вот если на IDE переходить то да, разница будет.

>>413277

Chosen не написан специально для Yii и никак специально устанавливать его не надо. Все надо сделать самому.

Кинуть надо куда-то в папку для статики и подключить стандартными средствами Yii.

Чуть-чуть упомянуто тут: http://yiiframework.ru/doc/cookbook/ru/core.assets

http://habrahabr.ru/post/139166/

Ссылка на скрипт вставляется через Yii::app()->clientScript->registerScriptFile или Chtml::asset

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

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

Это было про то как установить. А как подключить, написано на сайте по ссылке. Ты создаешь например select или select multiple, вызваешь chosen и он превратит его в выпадающий список. Постарайся сделать это так, чтобы страница не прыгала при загрузке.

Соответственно если ты хочешь выбирать граппу, тебе надо сделать select multiple со списокм всех групп. А на сервере ты получишь id выбранных групп и сможешь их добавить.

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

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

Гугление по слвоам «chosen ajax autocomplete» показывает, что эта проблема уже решена и добрые
люди написали дополнение к chosen чтобы он мог брать результаты с сервера:

https://github.com/meltingice/ajax-chosen
https://github.com/ksykulev/chosen-ajax-addition

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

Искать на сервере можно запросом:

WHERE name LIKE 'текст%' — такой запрос может использовать индекс по полю name, но ищет только по началу названия.

Если ты будешь исплоьзовать условие WHERE name LIKE '%текст%' то он будет искать и по середине слова, ео без индекса, скорее всего медленно. Чтобы искать по середине названия быстро, надо подключать движки вроде Sphinx или хотя бы полнотекстовый индекс в MySQL.

Зато если ты справишься, у тебя будет удобный выбор групп.

Ну или ты можешь погуглить, может для связи многие ко многим есть готовые решения для Yii.
#264 #413420
>>413286

> как правильно сделать в представлении поле из другой таблици.


Если групп мало, надо выводить select multiple со списком всех групп и среди них отметить выбранные, стандартными средствами html.

Изучи сначала HTML: http://htmlbook.ru/html/select

Потом изучи соотв. хелпер в Юи для генерации селекта: http://www.yiiframework.com/doc/api/1.1/CHtml#listBox-detail (заметь что там есть функция listData для генерации списка групп из модели)

Напомню, это если групп немного. Если групп много, надо разбираться с аякс версией chosen. Причем если ты хочешь отображать выбранные ранее группы, тут тоже придется разобраться как эт делать.
#265 #413423
>>413125

Нет никакой математики. Во-первых, читал ли ты все 3 урока из этого цикла постов? Если нет, иди читай: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

Во-вторых, читал ли ты это: http://www.pyramidin.narod.ru/rusql/ch3.html ? Прочитай, этот учебник написан по моему простым языком.

Если ты прочел и что-то не понял, задавай вопросы. Без умения написать SELECT можешь считать что ты вообще базы данных не знаешь.

Ну и конечно советую тебе изчать базы данных более серьезно и проверить свои знания решением задачек отсюда: https://gist.github.com/codedokode/10539213

Без знания баз данных, как ты собираешься делать сайты? Все динамические сайты используют базы данных. К тому же тебя никто не бросает один на один с мануалами: если что-то непонятно, всегда можно у меня спросить.
#266 #413437
>>413179

6

У тебя меню не слева от текста, и рамки странные, не как на картинке, и цвета не те.

Если ты рамками пытаешься определить размеры элементов, я тебе советую освоить инспектор (Ctrl + Shift + I) — он все это позволяет изучать гораздо удобнее. он показывает размеры элементов и примененные к ним CSS правила.

Насчет того, как надо сделать, посмотри примеры тут:

http://www.456bereastreet.com/lab/developing_with_web_standards/csslayout/2-col/finished.html

и тут http://www.maxdesign.com.au/articles/css-layouts/

Разберись как там сделано (инспектор тебе поможет).

> .article div p{


> display: inline-block;


Это непраивльно. Абзацы выстраиваются друг над другом ветикально и для них надо использовать display block. Ну сам подумай, в твоем варианте они должны что ли горизонтально выстраиваться? Бред же.

> .menu ul {


> display: inline-block;


Неправильно. inline-block позвляет нам выстроить 2 блока горизонтально, это верно. Мы могли бы теоретически сделать .menu (а не .menu ul) и .article (а не .article p, я не понимаю, почему ты так решил) оба инлайн-блоками и расположить так:

.menu | .article

Но тут есть один недостаток: для инлайн-блока мы не можем никак задать ширину в виде «100% - 230px» как требуется в задании. Inline-block позволяет задать ширину только 2 способами:

— по ширине содержимого (у нас там много текста и он растянет блок на 100% потому не годится)
— явно, в пикселях или процентах например. Тоже не подходит

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

Тебе надо больше решать задачек на флоаты, я вижу ты не разбираешься в этой теме.
#266 #413437
>>413179

6

У тебя меню не слева от текста, и рамки странные, не как на картинке, и цвета не те.

Если ты рамками пытаешься определить размеры элементов, я тебе советую освоить инспектор (Ctrl + Shift + I) — он все это позволяет изучать гораздо удобнее. он показывает размеры элементов и примененные к ним CSS правила.

Насчет того, как надо сделать, посмотри примеры тут:

http://www.456bereastreet.com/lab/developing_with_web_standards/csslayout/2-col/finished.html

и тут http://www.maxdesign.com.au/articles/css-layouts/

Разберись как там сделано (инспектор тебе поможет).

> .article div p{


> display: inline-block;


Это непраивльно. Абзацы выстраиваются друг над другом ветикально и для них надо использовать display block. Ну сам подумай, в твоем варианте они должны что ли горизонтально выстраиваться? Бред же.

> .menu ul {


> display: inline-block;


Неправильно. inline-block позвляет нам выстроить 2 блока горизонтально, это верно. Мы могли бы теоретически сделать .menu (а не .menu ul) и .article (а не .article p, я не понимаю, почему ты так решил) оба инлайн-блоками и расположить так:

.menu | .article

Но тут есть один недостаток: для инлайн-блока мы не можем никак задать ширину в виде «100% - 230px» как требуется в задании. Inline-block позволяет задать ширину только 2 способами:

— по ширине содержимого (у нас там много текста и он растянет блок на 100% потому не годится)
— явно, в пикселях или процентах например. Тоже не подходит

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

Тебе надо больше решать задачек на флоаты, я вижу ты не разбираешься в этой теме.
#267 #413443
>>413208

А мне это не только читать, но и отвечать надо.

>>413219

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

>>413234

Ну здравствуй. Давай посмотрим что ты там сделал.

> задаче №10


Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.

> Ведь это получается что 4000(умножить)1.03+1000 = 5120.


Ну так выплатить 5120 ты неможешь, ты платишь 5000, а за месяц на 120 добавляется еще процент и комиссия. ты думаешь банк так просто откажется от своей прибыли?

>>413256

Да, возможно. Хотя парсить HTML лучше не регулярками. а DOM и Xpath.

> и по какому принципу я мог бы обойти все страницы сайта?


Ищешь все ссылки на странице, переводишь относительные ссылки в абсолютные, добавляешь в список те, которых там еще нет. И так для каждой страницы.

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

>>413258

> var cities = {


> "Токио — Иокогама" : 37555,


Лучше бы хранить массивом, мне кажется, так:

var cities = [
{ name: "Токио", population: 3755 },
....

Так как тогда мы получаем список однотипных объектов. И вот это вот

> for(key in array) {


> arTmp.push(array[key]);


Будет не нужно.

Также, преимущество в том что тогда ты сможешь исользовать встроенную в JS функцию sort а не писать свою пузырьковую неэффективную сортировку.

Также, надо вывести результат в нормальном виде, с названиями городов.

Ну и как я написал выше, давай не будем тут изобретать велосипед и иcпользуем функцию sort.Уметь написать пузырьковую сортировку — это хорошо, но тут лучше исплоьзовать встроенную функцию.

sort умеет сортировать массивы по произвольному критерию, если ей передать функцию сравнения.

> document.getElementById("result").


Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.

> for (var k = 0; k < num; k++) {


> arResult.push(arTmp[k]);


Почитай про метод slice.

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

http://learn.javascript.ru/array-methods
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array

Ну и вообще, эта задача строчек в 5 решается на стандартных функциях.
#267 #413443
>>413208

А мне это не только читать, но и отвечать надо.

>>413219

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

>>413234

Ну здравствуй. Давай посмотрим что ты там сделал.

> задаче №10


Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.

> Ведь это получается что 4000(умножить)1.03+1000 = 5120.


Ну так выплатить 5120 ты неможешь, ты платишь 5000, а за месяц на 120 добавляется еще процент и комиссия. ты думаешь банк так просто откажется от своей прибыли?

>>413256

Да, возможно. Хотя парсить HTML лучше не регулярками. а DOM и Xpath.

> и по какому принципу я мог бы обойти все страницы сайта?


Ищешь все ссылки на странице, переводишь относительные ссылки в абсолютные, добавляешь в список те, которых там еще нет. И так для каждой страницы.

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

>>413258

> var cities = {


> "Токио — Иокогама" : 37555,


Лучше бы хранить массивом, мне кажется, так:

var cities = [
{ name: "Токио", population: 3755 },
....

Так как тогда мы получаем список однотипных объектов. И вот это вот

> for(key in array) {


> arTmp.push(array[key]);


Будет не нужно.

Также, преимущество в том что тогда ты сможешь исользовать встроенную в JS функцию sort а не писать свою пузырьковую неэффективную сортировку.

Также, надо вывести результат в нормальном виде, с названиями городов.

Ну и как я написал выше, давай не будем тут изобретать велосипед и иcпользуем функцию sort.Уметь написать пузырьковую сортировку — это хорошо, но тут лучше исплоьзовать встроенную функцию.

sort умеет сортировать массивы по произвольному критерию, если ей передать функцию сравнения.

> document.getElementById("result").


Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.

> for (var k = 0; k < num; k++) {


> arResult.push(arTmp[k]);


Почитай про метод slice.

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

http://learn.javascript.ru/array-methods
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array

Ну и вообще, эта задача строчек в 5 решается на стандартных функциях.
#268 #413445
>>413262

> у опа в формуле ошибка


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

>>413274

> \t$paymentTotal = $paymentTotal + $creditBalance;


Почему не хочешь использовать более короткую запись через += ?

> if ($creditBalance < 0) {


А если он равен нулю, а не меньше нуля? Продолжаем платить?

> if ($creditBalance < $monthlyPayment) {


Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:

выплата = меньшее из чисел (остаток долга, 5000)
уменьшаем долг на выплату;
добавляем выплату к общей сумме;

Попробуй так записать код.
#269 #413446
>>413445

>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:


Да здесь уже кто-то догадался так сделать, помню он скидывал сюда код, еще кто-то спрашивал "зачем там min".
#270 #413458
>>413446

Сделай и ты
#271 #413462
>>413458
Смысл? Я уже знаю как это реализовывать. Ну может завтра запилю от нечего делать.
#272 #413463
>>413462

А, я думал просто это ты эту задачу решал сейчас. Я обращался к тому анону, который это решение >>413274 написал
#273 #413464
>>413462

Ну и если тебе нечего делать, имей в виду, у нас много задачек на разные темы.
#274 #413466
>>413464
Неправильно выразился. Мне не нечего делать, я прокрастинирую в этом треде, занимаясь всякой ерундой и подсказывая по мелочи анонам. У меня еще даже кошки мышки не решены.
#275 #413470
>>413466

Ну ок, прокрастинируй, у нас тут никакого расписания нет, кому как удобно тот так и решает задачки.
#276 #413481
Кстати, ОП, что скажешь
https://codebabes.com/ ?
По моему забавная хрень, только курсы медленно появляются.
#277 #413493
>>413481

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

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

Ну и создание файла через touch к консоли тоже как минимум под одной ОС работать не будет. Да и непонятно начинающему, и это никак не поясняют.

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

Также, при ошибке они не пишут где в тесте ошибка и само сообщение сделано лиловым по оранжевому.

Алсо, я не понял, а там тян-ведущая будет раздеваться что ли? Это же наверно отвлекает от изучения PHP. Ну и ученицам-тянам наверно не очень интересно будет.
#278 #413572
Почему оно не работает?

$a = "ue34, 4y3, 4yt4we,";
$b = "43wt5, 235, 2v, 4y3,";
preg_match_all("/[A-Za-z_0-9]{1,10}/i", $a, $matches);
preg_match_all("/[A-Za-z_0-9]{1,10}/i", $b, $matches2);
foreach ($matches as $key => $value) {
if (in_array($value, $matches2)) {
echo $value;
}
}
#279 #413603
>>413572
http://ideone.com/uRxstK
У тебя там двумерные массивы содержались в $matches и $matches2
#280 #413607
>>413603
Большое спаcибо.
#281 #413622
Уважаемые знатоки, скажите как бы зашифровать куки? Пока что думаю хранить в куках логин в открытом виде и логин в зашифрованом. Ну и при считывании должны обе этих куки присутствовать иначе иди нах. Что скажете?
#282 #413638
Почему не хочет работать? http://ideone.com/1YtrG7
#283 #413643
>>413638
Интересно, как ты к $workers обращаешься в последней строке, когда это локальная переменная функции? И в то же время, ты вызываешь функцию doShit но результат никуда не записываешь, от того твой вызов бесполезен. С функциями у тебя пробел знаний, который нужно восполнить.
http://ideone.com/epNyPd
#284 #413646
>>413643
Упс, точно, я всё смотрел внутрь функции, что вроде и массив создан, и переменные переданы в конструктор и объект создан и массиву присвоен новый объект и возвратил значение массива и на автомате уже просто вызвал функцию :<
Спасибо
#285 #413710
Оп, а ты чем на жизнь зарабатываешь?
39 Кб, 416x604
#286 #413714
ананасы, не могу запилить выбор случайных данных из mysql.

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

Вынести это поле в отдельную таблицу тоже не катит, ибо получится миллион таблиц (полей много)

Если делать через ORDER BY RAND, то это же пиздец слоупочно получается (а быстродействие очень важно)

Есть еще вариант - делать выборку всех данных, а потом в массиве делать ранд... Но это похоже не сильно от ORDER BY RAND отличается.

Вообщем, как быть?
#287 #413717
>>413714
а что если делать order by 1 where поле без rand, заранее подсчитав количество записей для этого поля? Это самый оптимальный вариант?
#288 #413724
Сделал первую задачку с регулярками - http://ideone.com/dIgULE
Как можно лучше сделать?
45 Кб, 400x486
#289 #413734
http://ideone.com/cHBhNu

PHP Parse error: syntax error, unexpected 'if' (T_IF) in /home/DKTtvT/prog.php on line 3

Не понимаю сути ошибки, синтаксически же всё верно!
#290 #413737
>>413734
У тебя там номера строк скопировались в коде. Наверное из-за них.
#291 #413739
>>413737
Лол! Никогда не делал таких ошибок, люто проиграл.
38 Кб, 310x420
#292 #413774
Я хочу рисовать шизофракталы и прочие паттерные няшности. С чего начать? Какой язык программирования использовать? В выдаче хуйня полная.
#293 #413776
45 Кб, 500x407
#294 #413777
>>413776
Поподробней.
#295 #413778
>>413777
Канвас аштеэмэлевский на жаваскрипте. Тупой что-ли?
#296 #413781
>>413778

>Тупой что-ли?


Яснопонятно. Молодец, ЧСВ раздул за счёт меня. Гыгы ты ета распетушился.
#297 #413788
>>413778
Вот из-за таких пидарасов, как ты, сюда и заходить не хочется.
Если на хтмлях рисовать, то можно вот эту либу глянуть http://libcanvas.github.io/
1 Кб, 205x162
#298 #413807
>>413788
Слишком сложно. Обмазался turtle.
4 Кб, 215x188
#299 #413809
>>413807
Шишка встала.
1 Кб, 285x270
#300 #413813
>>413809
Хотел нарисовать зигзаг, а вышло это. Всё, ухожу.
1 Кб, 178x159
#301 #413814
>>413813
Да, бля :(
0 Кб, 309x109
#302 #413816
>>413814
Вот теперь всё. Совладал с черепашкой.
#303 #413827
>>412867
Токены унес в куки. Ну и попробовал тексты комментариев сохранять в случае ошибки. Вышло как-то сложновато.
#304 #413828
#305 #413834
>>413724
проверьте ньюфага...
#306 #413839
>>413724
а ещё, почему тут не получается ничего - http://ideone.com/2j8tek ?
#307 #413840
>>413839
даже с ссылкой проебался... Нормальный адрес - http://ideone.com/6OK75p
sage #308 #413857
>>413788
Кокой ты. Не хочешь - не заходи, кого оно ебёт, твое желание или нежелание.
28 Кб, 1264x768
35 Кб, 1264x768
62 Кб, 1264x768
84 Кб, 1280x971
#309 #413860
>>413816
Я всё. Фрактал — это цикл в цикле. Ещё можно поиграться с переменными i+1 и захуяить ещё больше циклов в цикле.
https #310 #413881
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /var/www/test.php on line 92

Warning: file_get_contents(): Failed to enable crypto in /var/www/test.php on line 92

Warning: file_get_contents(https://ya.ru/): failed to open stream: operation failed in /var/www/test.php on line 92

wtf??
#311 #413882
>>413881

>>PHP Version 5.6.3


Если важно
#312 #413884
>>413881
Подожди, ванги проснутся, посмотрят что у тебя на 92 строке и ответят.
#313 #413885
>>413884
file_get_contents('https://ya.ru/');
#314 #413886
>>413884

>>Warning: file_get_contents(https://ya.ru/): failed to open stream: operation failed in /var/www/test.php on line 92


>>Warning: file_get_contents(https://ya.ru/)

#315 #413888
Ух, и кто здесь у мамы молодец? http://ideone.com/mxvzn8
3 недели назад над банкоматом 3 дня тупил
#316 #413889
>>413888
Неплохо, а я таблицу так и не смог выравнить, хотя функцию написал и она работала в предыдущей задаче.
#317 #413890
>>413889
А ты чем пользовался? случайно не str_pad? мне тут рассказали выше в треде - что она плохо работает с мультибайтовыми кодировками, и я её переписал с помощью mb_strlen и формулы для дополнения вручную
#318 #413891
>>413890
Нет же, я же говорю сам написал. В самой первой задаче так и говорится: самому написать функцию которая выравнивает строки.
#319 #413903
http://ideone.com/pMyZgR ОП, это снова я с кошками-мышками. Нагородил я тут говнокода, но вроде что-то похожее на систему балов из себя выдавил, хотя уверен, что она не правильная. Кстати, у меня в браузере совсем другой результат: кошка так и не поймала ни одной мышки, а вот в айдеоне она одну съедает.
34 Кб, 1264x768
53 Кб, 1264x768
#321 #413912
>>413906
Шин сломался.
#323 #413923
Мне было лет 10, когда я такие картинки делал впервые :3
Помню это ощущение.
#324 #413925
>>413921
как ты это делаешь, содомит!? научи
#325 #413928
>>413925
Совладай с черепашкой. Нарисуй зигзаг, квадрат, круг, звезду, а дальше экспериментируй со значениями: https://ideone.com/rmTNQm

for i in range(1) : — количество повторов.
t.forward(Х) — делает шаг.
t.left(-45) — поворачивается. Кстати, значение ничем не отличается от t.right(45)

https://docs.python.org/2/library/turtle.html
4 Кб, 1264x768
28 Кб, 1264x768
36 Кб, 1264x768
43 Кб, 1264x768
#326 #413933
>>413928
Сначала нарисовал квадрат, а потом его сместил. https://ideone.com/nODaTQ
#327 #413935
>>413933

Я помню в школе на информатике нашел какую-то программу для детей, связанную с програмированием где надо было двигать черепаху. Это случайно не оно?
#329 #413938
>>413937
http://rutracker.org/forum/viewtopic.php?t=74036
Лютый шин. Рекомендую ИТТ.
91 Кб, 1280x995
164 Кб, 1280x995
180 Кб, 1280x995
180 Кб, 1280x995
#331 #413963
>>413937
Поигрался с умножением.
#332 #413978
>>413881
бамп
#333 #414017
Это правда, что на джаваскрипте можно бэкэнд писать? Получается пхп нинужон, ведь Жс может и во фронтенд и в бэкэнд?
#334 #414061
>>414017
Правда. Очевидно нужен, раз существует.
#335 #414113
>>413622

> Пока что думаю хранить в куках логин в открытом виде и логин в зашифрованом.


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

подпись = хеш-функция(секретный пароль . открытый логин)

В качестве хеш-функции можно взять md5 или sha1. Злоумышленние не знает секретный пароль и не может подделать подпись.

>>413710

Программированием на PHP и JS.

>>413714

Узнаешь чему равен например MAX(id). затем берешь случайное число от 1 до MAX(id) и берешь первую запись, с id равным или больше этого числа. Этот запрос пойдет по индексу если правильно написать.

Минус — распределение получается неравномерным если в id есть дыры. Если у нас id идут как 1..100, 300..400 то 300 будет выпадать очень часто.

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

Вот подробный анализ способов: http://jan.kneschke.de/projects/mysql/order-by-rand/ (англ)

Вообще, аноны, обратите внимание на этот вопрос, такие любят спрашивать на собеседовании. Никогда не используйте ORDER BY rand так как этот способ вытяивает всю таблицу в память (а если записей много то во временный файл который очеь медленный) и в памяти/файле долго сортирует.
#336 #414119
Оп, проверь задания и скажи, что не так во втором :\
https://ideone.com/dIgULE
http://ideone.com/6OK75p
https://ideone.com/YmIsO2
#337 #414120
>>413888
ОП-чик, целый день тебя жду
#338 #414126
>>413724

Сделал? Ну молодец, давай проверим код.

Я вижу что например номера вроде +79001234567 не пройдут.

Ты зря определил что код города может быть ровно 3 цифры. В маленьких городах код города может быть 4 или 5 цифр. лучше просто разрешить скобкам появляться в любом месте номера.

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

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

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

>>413774

Там ниже черепашку советуют. Но еcть и другие варианты:

— в php: gd или imagemagick (если ты под виндой то замучаешься устанавливать imagemagick)
— в JS: исопльзовать канвас: http://habrahabr.ru/post/111308/

Код на JS работает в любом современном браузере, для PHP нужен сервер например Апач, и сам PHP.

Вот люди деревья рисуют на JS: http://habrahabr.ru/post/210614/
#338 #414126
>>413724

Сделал? Ну молодец, давай проверим код.

Я вижу что например номера вроде +79001234567 не пройдут.

Ты зря определил что код города может быть ровно 3 цифры. В маленьких городах код города может быть 4 или 5 цифр. лучше просто разрешить скобкам появляться в любом месте номера.

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

Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

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

>>413774

Там ниже черепашку советуют. Но еcть и другие варианты:

— в php: gd или imagemagick (если ты под виндой то замучаешься устанавливать imagemagick)
— в JS: исопльзовать канвас: http://habrahabr.ru/post/111308/

Код на JS работает в любом современном браузере, для PHP нужен сервер например Апач, и сам PHP.

Вот люди деревья рисуют на JS: http://habrahabr.ru/post/210614/
#339 #414142
>>413807

Ничего, только что-то линии пикселизованные. Ну и если в библиотеке есть режим «исключающее или», XOR — попробуй включить, будет куда веселее так как в этом режиме на пересечении линий появляется белая точка.

>>413828

> https://github.com/sqghub/uppu.ru/blob/master/index.php#L57


Валидацию лучше сделать отдельной функцией в Comment или CommentMapper (где именно? выше уже обсуждали эту тему: >>411751 >>411755 ). Тогда легко будет добавлять новые проверки. Например что fileId не пусто, проверка на длину имени, и т.д.

Валидатор может возвращать либо true/false либо список ошибок.

> if (isset($_POST['token'])) {


> if ($app->token->valid($_POST['token'])) {


используй слимовский $app->request->post('token')

> $app->redirect("/download/{$comment->getFileId()}#comment-{$comment->getId()}");


А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?

> https://github.com/sqghub/uppu.ru/blob/master/model/Comment.php#L111


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

> https://github.com/sqghub/uppu.ru/blob/master/model/Token.php#L25


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

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

Изучи этот пример и пойми почему выводится true (если написать === то уязвимости нет). По моему где-то раньше была как раз такая уязвимость в каком-то модуле проверки капчи, и у тебя есть шанс ее повторить (вообще, капчи отдельная тема, там легко допустить ошибку).

Вот мануал: http://php.net/manual/ru/language.operators.comparison.php

Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.

https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L49
Не объявляй функции в шаблонах. Из-за этого например нельзя 2 раза его отрендерить. В данном случае можно приинклудить другой шаблон через

$this->render(....);

(в шаблоне this указывает на объект \Slim\View)

> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) {


В шаблоне надо использовать if с двоеточием.

Само условие я бы переписал, как

if (!$isCommentPosted): ...

В остальном, хорошо. У тебя вообще эта задача хорошо получается (то что касается серверной части).
#339 #414142
>>413807

Ничего, только что-то линии пикселизованные. Ну и если в библиотеке есть режим «исключающее или», XOR — попробуй включить, будет куда веселее так как в этом режиме на пересечении линий появляется белая точка.

>>413828

> https://github.com/sqghub/uppu.ru/blob/master/index.php#L57


Валидацию лучше сделать отдельной функцией в Comment или CommentMapper (где именно? выше уже обсуждали эту тему: >>411751 >>411755 ). Тогда легко будет добавлять новые проверки. Например что fileId не пусто, проверка на длину имени, и т.д.

Валидатор может возвращать либо true/false либо список ошибок.

> if (isset($_POST['token'])) {


> if ($app->token->valid($_POST['token'])) {


используй слимовский $app->request->post('token')

> $app->redirect("/download/{$comment->getFileId()}#comment-{$comment->getId()}");


А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?

> https://github.com/sqghub/uppu.ru/blob/master/model/Comment.php#L111


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

> https://github.com/sqghub/uppu.ru/blob/master/model/Token.php#L25


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

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

Изучи этот пример и пойми почему выводится true (если написать === то уязвимости нет). По моему где-то раньше была как раз такая уязвимость в каком-то модуле проверки капчи, и у тебя есть шанс ее повторить (вообще, капчи отдельная тема, там легко допустить ошибку).

Вот мануал: http://php.net/manual/ru/language.operators.comparison.php

Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.

https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L49
Не объявляй функции в шаблонах. Из-за этого например нельзя 2 раза его отрендерить. В данном случае можно приинклудить другой шаблон через

$this->render(....);

(в шаблоне this указывает на объект \Slim\View)

> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) {


В шаблоне надо использовать if с двоеточием.

Само условие я бы переписал, как

if (!$isCommentPosted): ...

В остальном, хорошо. У тебя вообще эта задача хорошо получается (то что касается серверной части).
#340 #414153
>>413840

> '8$2$3$4$5$6$7$8$9$10$11'



Что-то ты нагородил. По моему, проще заменить все не-цифры на пустую строку.

Ну и ты по моему непраивльно посчитал скобки. Вот начало регулярки:

/^(8|\\+7)[(-\\s](\\d)([-\\s](\\d)) ....

вот чему соответствуют символы:

$1 -> (8|\\+7)
$2 -> (\\d)
$3 -> ([-\\s](\\d))
$4 -> (\\d)

Считать надо по открывающим скобкам. Как видимшь у тебя одна цифра 2 раза выведется (в $3 и $4)

>>413881

HTTPS — это защищенный протокол. В ходе установки соединения клиент (в данном случае curl) получает от сервера пруф что он настоящий сервер, в виде цифровой подписи с использованием сертификата домена (в данном случае ya.ru).

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

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

В твоем коде ты скорее всего не передал curl путь к файлу с открытыми ключами, потому curl не может проверить цепочку сетификатов и отказывается соединяться (так как они вполне могут оказаться поддельными, подснунутыми злоумышленником).

Надо либо дать курлу путь к файлу с ключами через опцию CURLOPT_CAPATH/CURLOPT_CAINFO либо отключить проверку сертификатов (естественно в этом случае соединение перестает быть безопасным) опцией CURLOPT_SSL_VERIFYPEER.

Мануал: http://php.net/manual/ru/function.curl-setopt.php

Объяснение https://www.emaro-ssl.ru/blog/root-certificate/

https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8

Вот тут если что авторы curl предоставляют список открытых ключей, аналогичным используемым в фаерфоксе: http://curl.haxx.se/docs/sslcerts.html

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

Ты можешь просмотреть цепочку сертификатов на сайте браузером, например зайдя на https-сайт и кликнув на зеленый замочек.
#340 #414153
>>413840

> '8$2$3$4$5$6$7$8$9$10$11'



Что-то ты нагородил. По моему, проще заменить все не-цифры на пустую строку.

Ну и ты по моему непраивльно посчитал скобки. Вот начало регулярки:

/^(8|\\+7)[(-\\s](\\d)([-\\s](\\d)) ....

вот чему соответствуют символы:

$1 -> (8|\\+7)
$2 -> (\\d)
$3 -> ([-\\s](\\d))
$4 -> (\\d)

Считать надо по открывающим скобкам. Как видимшь у тебя одна цифра 2 раза выведется (в $3 и $4)

>>413881

HTTPS — это защищенный протокол. В ходе установки соединения клиент (в данном случае curl) получает от сервера пруф что он настоящий сервер, в виде цифровой подписи с использованием сертификата домена (в данном случае ya.ru).

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

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

В твоем коде ты скорее всего не передал curl путь к файлу с открытыми ключами, потому curl не может проверить цепочку сетификатов и отказывается соединяться (так как они вполне могут оказаться поддельными, подснунутыми злоумышленником).

Надо либо дать курлу путь к файлу с ключами через опцию CURLOPT_CAPATH/CURLOPT_CAINFO либо отключить проверку сертификатов (естественно в этом случае соединение перестает быть безопасным) опцией CURLOPT_SSL_VERIFYPEER.

Мануал: http://php.net/manual/ru/function.curl-setopt.php

Объяснение https://www.emaro-ssl.ru/blog/root-certificate/

https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BD%D1%82%D1%80_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8

Вот тут если что авторы curl предоставляют список открытых ключей, аналогичным используемым в фаерфоксе: http://curl.haxx.se/docs/sslcerts.html

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

Ты можешь просмотреть цепочку сертификатов на сайте браузером, например зайдя на https-сайт и кликнув на зеленый замочек.
#341 #414160
>>414142

>Валидацию лучше сделать отдельной функцией в Comment или CommentMapper


Ну отдельный класс я делать для валидатора не буду. Поставлю валидацию в Comment.

>А где выход из функции после редиректа? Отдаем заголовок location и выводим страницу которую никто не увидит?


Я думал, что после редиректа слим прерывает функцию, хм. И как выход из неё сделать, там же ретурна нет?

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


Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.

>Изучи этот пример и пойми почему выводится true


Строка приведется к числу и сравнится 0 и 0.

>Алсо, зачем ты все складываешь в папку model? Я бы клал туда только сущности, а тот же Token — явно не модель, а хелпер или сервис.


Кк, перенесу. Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?

>(в шаблоне this указывает на объект \Slim\View)


Не знал.

И еще, я начал задачки по js, не могу понять, как в четвертой сделать любое число аргументов. Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.
#342 #414161
>>413881

Ой, я перепутал. Я думал, ты используешь curl и написал инструкцию для него. А ты используешь file_get_contents. Для нее параметры HTTPS задаются через контекст потока:

http://php.net/manual/ru/context.ssl.php

Здесь ты видишь те же параметры verify_peer и cafile/capath

Чтобы задать эти параметры, ты создаешь контекст (http://php.net/manual/ru/function.stream-context-create.php и http://php.net/manual/ru/context.php ), задаешь их на нем и передаешь этот контекст в функцию file_get_contents (почитай мануал, там есть 3-й или 4-й параметр для этого). Так же можно например задать таймаут для соединения.

>>413888

Ошибочки:

Когда ты решаешь задачу на ООП, ты должен ответит на вопросы:

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

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

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

> /$a - 1 если 2 ранг, 0 если нет, $b - 1 (3 ранг), $c - 1 (если директор)


Ну ты думаю тут и сам догадываешься что так делать нельзя? Излишне запутанная система и имена никуда не годятся. Также вместо 0/1 лучше использовать true/false которые в программировании обозначают да/нет

> $worker = new Worker($k1, $k2, $k3, $a, $b, $c);


Невозможно ничего понять, что за k1, k2? Называй переменные нормально.

В общем, ответь сначала на 4 вопроса выше и переделай код.

Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.

Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php

«Абстрактный класс» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
#342 #414161
>>413881

Ой, я перепутал. Я думал, ты используешь curl и написал инструкцию для него. А ты используешь file_get_contents. Для нее параметры HTTPS задаются через контекст потока:

http://php.net/manual/ru/context.ssl.php

Здесь ты видишь те же параметры verify_peer и cafile/capath

Чтобы задать эти параметры, ты создаешь контекст (http://php.net/manual/ru/function.stream-context-create.php и http://php.net/manual/ru/context.php ), задаешь их на нем и передаешь этот контекст в функцию file_get_contents (почитай мануал, там есть 3-й или 4-й параметр для этого). Так же можно например задать таймаут для соединения.

>>413888

Ошибочки:

Когда ты решаешь задачу на ООП, ты должен ответит на вопросы:

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

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

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

> /$a - 1 если 2 ранг, 0 если нет, $b - 1 (3 ранг), $c - 1 (если директор)


Ну ты думаю тут и сам догадываешься что так делать нельзя? Излишне запутанная система и имена никуда не годятся. Также вместо 0/1 лучше использовать true/false которые в программировании обозначают да/нет

> $worker = new Worker($k1, $k2, $k3, $a, $b, $c);


Невозможно ничего понять, что за k1, k2? Называй переменные нормально.

В общем, ответь сначала на 4 вопроса выше и переделай код.

Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.

Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php

«Абстрактный класс» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
#343 #414168
>>414142
https://github.com/sqghub/uppu.ru/
Валидацию файлов в общем-то тоже стоило бы перенести в file, но так как я ничего кроме токена не проверяю, то оставил пока что так же.
#344 #414169
Антуаны, а подскажите как из пост запроса вытащить конкретное поле? Что-то вроде $_POST['Class']->Class_id; Если такое вообще возможно.
#345 #414171
>>413888

Также, в строках 163-169 копипаста, которая абсолютно не годится. Используй цикл.

>>413903

> getCoordinateX()


А что не getX? Ладно, пусть будет так, я не против.

> public function showCoordinates()


Можно наверно делать просто var_dump($cat); — оно выводит свойства

> field->shareHeight()


Обычно такие функции называют getSomething()

> if (($x < 0 && $this->x > 0) || ($x > 0 && $this->x < $this->field->shareHeight())) {


проверка непераивльная. Гораздо лучше проверять условием типа

if ($this->field->isXOnMap($this->x + $x))

(обрати внимание насколько лаконичнее получилось)

> public function setField(GameField $field)


При удалении животного с карты логично в field передавать null, то есть разрывать связь «животное - карта» с обеих сторон.

Ты проверяешь 4 варианта хода, но иногда надо проверять 5 (иногда выгоднее стоять на месте чем идти навстречу кошке). А если мышка в углу, у нее 3 варианта хода. А если она окружена мышками и кошками, то только один — стоять на месте. Потому тут надо не 4 переменных, а массив ходов передавать.

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


Надо передавать не 4 переменных, а массив ходов, примерно такого формата:

array(
array('dx' => 1, 'dy' => 0, 'score' => 14),
....
)

А еще лучше хранить не относительные, а сразу абсолютные координаты — проще будет.

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

Ну и давай посмотрим на функцию public function makeMove(). Согласись, выглядит пугающе? Давай попробуем ее переписать методом «водопада», то есть от высокоуровневых функций к низкоуровневым.

Как выбраь ход? Очевидно, алгоритм простой:

ходы = определитьВсеДоступныеХоды( );
ходыСОчками = посчитатьОчки(ходы);
лучшийХод = выбратьЛучшийХод(ходыСОчками);
сделать лучшийХод;

Осталось только это написать кодом. Теперь можно браться за более мелкие функции:

функция определитьВсеДоступныеХоды:

вариантыКоординатХодов = (на месте, влево, вправо, вверх, вниз);
список = пустой массив;

для каждого варианта:
посчитать координаты для варианта;
если (можноСходитьНаУказаннуюКлетку) {
добавить в список;
}

если список пуст — тревога, программа сломана.

вернуть список;

Ну и так далее. Попробуй улучшить код. По идее тут еще можно упростить код, напрмер «посчитатьЧислоОчков» можно перенести в функцию выбора лучшего хода.

Вместо «up» или «down» по моему удобнее работать с координатами.

ну и сам алгоритм расчета у тебя странный:

> if ($cat->getCoordinateX() > $this->x && $cat->getCoordinateX() - $this->x < $down) {


> $down = $cat->getCoordinateX() - $this->x;


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

В коде кошки нет проверки что клетка занята другой кошкой.

> public function shareHeight()


> {


> return $this->height - 1;


Это коварно. Я бы никогда не ожидал что функция getHeight вернет не высоту, а высоту минус один. Не делай так, иначе твой код становится похожим на минное поле. Функции должны соответсвовать своему названию. В данном случае функция должна называться getHeightMinusOne или getMaximumX.
#345 #414171
>>413888

Также, в строках 163-169 копипаста, которая абсолютно не годится. Используй цикл.

>>413903

> getCoordinateX()


А что не getX? Ладно, пусть будет так, я не против.

> public function showCoordinates()


Можно наверно делать просто var_dump($cat); — оно выводит свойства

> field->shareHeight()


Обычно такие функции называют getSomething()

> if (($x < 0 && $this->x > 0) || ($x > 0 && $this->x < $this->field->shareHeight())) {


проверка непераивльная. Гораздо лучше проверять условием типа

if ($this->field->isXOnMap($this->x + $x))

(обрати внимание насколько лаконичнее получилось)

> public function setField(GameField $field)


При удалении животного с карты логично в field передавать null, то есть разрывать связь «животное - карта» с обеих сторон.

Ты проверяешь 4 варианта хода, но иногда надо проверять 5 (иногда выгоднее стоять на месте чем идти навстречу кошке). А если мышка в углу, у нее 3 варианта хода. А если она окружена мышками и кошками, то только один — стоять на месте. Потому тут надо не 4 переменных, а массив ходов передавать.

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


Надо передавать не 4 переменных, а массив ходов, примерно такого формата:

array(
array('dx' => 1, 'dy' => 0, 'score' => 14),
....
)

А еще лучше хранить не относительные, а сразу абсолютные координаты — проще будет.

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

Ну и давай посмотрим на функцию public function makeMove(). Согласись, выглядит пугающе? Давай попробуем ее переписать методом «водопада», то есть от высокоуровневых функций к низкоуровневым.

Как выбраь ход? Очевидно, алгоритм простой:

ходы = определитьВсеДоступныеХоды( );
ходыСОчками = посчитатьОчки(ходы);
лучшийХод = выбратьЛучшийХод(ходыСОчками);
сделать лучшийХод;

Осталось только это написать кодом. Теперь можно браться за более мелкие функции:

функция определитьВсеДоступныеХоды:

вариантыКоординатХодов = (на месте, влево, вправо, вверх, вниз);
список = пустой массив;

для каждого варианта:
посчитать координаты для варианта;
если (можноСходитьНаУказаннуюКлетку) {
добавить в список;
}

если список пуст — тревога, программа сломана.

вернуть список;

Ну и так далее. Попробуй улучшить код. По идее тут еще можно упростить код, напрмер «посчитатьЧислоОчков» можно перенести в функцию выбора лучшего хода.

Вместо «up» или «down» по моему удобнее работать с координатами.

ну и сам алгоритм расчета у тебя странный:

> if ($cat->getCoordinateX() > $this->x && $cat->getCoordinateX() - $this->x < $down) {


> $down = $cat->getCoordinateX() - $this->x;


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

В коде кошки нет проверки что клетка занята другой кошкой.

> public function shareHeight()


> {


> return $this->height - 1;


Это коварно. Я бы никогда не ожидал что функция getHeight вернет не высоту, а высоту минус один. Не делай так, иначе твой код становится похожим на минное поле. Функции должны соответсвовать своему названию. В данном случае функция должна называться getHeightMinusOne или getMaximumX.
#346 #414173
>>414169
Ты не поверишь.
$_POST['Class'] и хранит поле 'Class'.
Т.е. Class_id = $_POST['Class'];
#347 #414174
>>414173
Нет, не поверю, потому что так не работает. Пост запрос у меня вся форма, в которой есть class_id. Мне нужно сделать апдейт записи. Делаю на yii.
$form = tbl_Class::model()->findByAttributes(array('class_id'=>$_POST['tbl_Class']));
#348 #414176
>>414174
Так под каким именем ты в пост это впихнул, под тем и спрашивай.
#349 #414179
>>413921

Попробуй еще цвет менять для каждой новой линии. Чтобы плавно менять цвета, удобно использовать не RGB, а цветовую модуль HSV

https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)

Питон наверняка умеет с ней работать.

Ну и попробуй поиграть с режимами наложения линий — там наверняка это есть, и будет еще интереснее.

>>414017

JS лишь один из вариантов. На PHP по моему писать удобнее, там хотя бы классы есть и нормальные фреймворки. Node.JS больше подходит для маленьких асинхронных программ.

>>414119

Первая задача: верно
Вторая: верно же сделано. Только вот насчет этого:

> $result[0] = 8;



прочитай почему не надо работать со стройкой как с массивом (строка это не массив символов. а массив байт): https://gist.github.com/codedokode/ff99e357e9860ea169b8

Третья

Во-первых для работы с utf-8 надо всегда добавлять в регулярку флаг u. Иначе русские буквы могут работать не так, как ты задумал, например вместо одной буквы будет ловиться другая. Проще всегда ставить флаг u, так как мы используем utf-8.

> $regexp = "/(^|\\s)([\\S])([A-z])([\\S])(\\s|$)/";


Тут есть подвох: регулярка захватвает пробелы до и после слова. Это значит, что если идут 2 слова подряд, то второе слово она не поймает, так как пробел перед ним захвачен предыдущим совпадением.

Чтобы этого избежать, можно использовать конструкцию

\\b

которая соответствует границе между буквой и не-буквой и не захватывает ни одного символа. Либо использовать assertions, которые проверяют совпадение, но не захватывают символы: http://php.net/manual/ru/regexp.reference.assertions.php

Также, \\S соответвует не только буквам, а всему чему угодно, цифрам, знакам, и т.д. Плохо.

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

А на полностью латинские слова типа этого: https://ideone.com/9KCOkM ругаться не должна. То есть надо искать не латинницу, а слова со смешанным алфавитом.

> \tfunction ($matches) {


> global $decryptTable;


Не используй global никогда. Для анонимных функций переменные можно передать через use: https://php.net/manual/ru/functions.anonymous.php (3-й пример)

Ну и посмотри, может там проще сначала текст на слова разбить и по ним пройтись, я не знаю. Или может можно сразу текст через preg_prelace_callback пропустить. Подумай, как удобнее.
#349 #414179
>>413921

Попробуй еще цвет менять для каждой новой линии. Чтобы плавно менять цвета, удобно использовать не RGB, а цветовую модуль HSV

https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)

Питон наверняка умеет с ней работать.

Ну и попробуй поиграть с режимами наложения линий — там наверняка это есть, и будет еще интереснее.

>>414017

JS лишь один из вариантов. На PHP по моему писать удобнее, там хотя бы классы есть и нормальные фреймворки. Node.JS больше подходит для маленьких асинхронных программ.

>>414119

Первая задача: верно
Вторая: верно же сделано. Только вот насчет этого:

> $result[0] = 8;



прочитай почему не надо работать со стройкой как с массивом (строка это не массив символов. а массив байт): https://gist.github.com/codedokode/ff99e357e9860ea169b8

Третья

Во-первых для работы с utf-8 надо всегда добавлять в регулярку флаг u. Иначе русские буквы могут работать не так, как ты задумал, например вместо одной буквы будет ловиться другая. Проще всегда ставить флаг u, так как мы используем utf-8.

> $regexp = "/(^|\\s)([\\S])([A-z])([\\S])(\\s|$)/";


Тут есть подвох: регулярка захватвает пробелы до и после слова. Это значит, что если идут 2 слова подряд, то второе слово она не поймает, так как пробел перед ним захвачен предыдущим совпадением.

Чтобы этого избежать, можно использовать конструкцию

\\b

которая соответствует границе между буквой и не-буквой и не захватывает ни одного символа. Либо использовать assertions, которые проверяют совпадение, но не захватывают символы: http://php.net/manual/ru/regexp.reference.assertions.php

Также, \\S соответвует не только буквам, а всему чему угодно, цифрам, знакам, и т.д. Плохо.

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

А на полностью латинские слова типа этого: https://ideone.com/9KCOkM ругаться не должна. То есть надо искать не латинницу, а слова со смешанным алфавитом.

> \tfunction ($matches) {


> global $decryptTable;


Не используй global никогда. Для анонимных функций переменные можно передать через use: https://php.net/manual/ru/functions.anonymous.php (3-й пример)

Ну и посмотри, может там проще сначала текст на слова разбить и по ним пройтись, я не знаю. Или может можно сразу текст через preg_prelace_callback пропустить. Подумай, как удобнее.
#350 #414181
>>414120

Если ОП занят, он заходит где-то раз в день. Не надо его ждать, решай задачки дальше.

>>414160

> там же ретурна нет?


Почему? Есть.

> Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.


Тогда ок

> Строка приведется к числу и сравнится 0 и 0.


Молодец. не создавай тогда в своем коде таких возможностей и используй ===.

> Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?


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

Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.

Алсо назвать лучше CSRFToken для ясности.

> Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.


Почитай про псевдопеременную arguments и методы call/apply у функций. Это есть на learn.javascript.ru Ну и код потихоньку показывай.

>>414174

В Yii есть объект request, изучи его и получай данные из него.
#350 #414181
>>414120

Если ОП занят, он заходит где-то раз в день. Не надо его ждать, решай задачки дальше.

>>414160

> там же ретурна нет?


Почему? Есть.

> Эта функция устанавливает значения после взятия из базы, а не перед. Так что в базе будет null.


Тогда ок

> Строка приведется к числу и сравнится 0 и 0.


Молодец. не создавай тогда в своем коде таких возможностей и используй ===.

> Бтв, в комменте будет тогда внаглую создаваться new \service\Token. Или сделать статичное свойство, которому уже присвоить готовый токен?


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

Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.

Алсо назвать лучше CSRFToken для ясности.

> Как обратиться к аргументам внутри функции, которую вернул fmap я понял, но как передать их еще внутрь - я не знаю. Т.е. два, три, пять, десять - передам, но любое - не знаю.


Почитай про псевдопеременную arguments и методы call/apply у функций. Это есть на learn.javascript.ru Ну и код потихоньку показывай.

>>414174

В Yii есть объект request, изучи его и получай данные из него.
#351 #414182
>>414168

> \model\Comment::setToken($app->token);


Comment не должен ничего знать о токене. Токен — это не свойство комментария. Токен — это система защиты подделки данных формы, и комментарий не должен о ней знать.

Сделай проверку токена просто через if в index.php (в больших фреймворках есть класс Form, от которого наследуются все формы, и соответственно проверку можно вставлять туда, у тебя маленькое приложение и наверно лепить классы для форм не стоит. Но как-нибдь потом познакомиться с тем как формы сделаны в ZF2, Yii 2 или Symfony 2, стоит).

В функции валидации наверно стоит возвращать причину ошибки, чтобы ее можно было вывести в сообщении:

if ('' === $this->text) {
return "Пожалуйста, введите текст комментария";
}

или

if ('' === $this->text) {
return array(false, "Пожалуйста, введите текст комметария");
}

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

> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) :


> if ($comment->getId() == $newComment->getParentId()) :


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

Я советую просто сделать переменную isCommentPosted
#351 #414182
>>414168

> \model\Comment::setToken($app->token);


Comment не должен ничего знать о токене. Токен — это не свойство комментария. Токен — это система защиты подделки данных формы, и комментарий не должен о ней знать.

Сделай проверку токена просто через if в index.php (в больших фреймворках есть класс Form, от которого наследуются все формы, и соответственно проверку можно вставлять туда, у тебя маленькое приложение и наверно лепить классы для форм не стоит. Но как-нибдь потом познакомиться с тем как формы сделаны в ZF2, Yii 2 или Symfony 2, стоит).

В функции валидации наверно стоит возвращать причину ошибки, чтобы ее можно было вывести в сообщении:

if ('' === $this->text) {
return "Пожалуйста, введите текст комментария";
}

или

if ('' === $this->text) {
return array(false, "Пожалуйста, введите текст комметария");
}

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

> if (is_null($newComment->getText()) or ($newComment->getParentId() == "")) :


> if ($comment->getId() == $newComment->getParentId()) :


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

Я советую просто сделать переменную isCommentPosted
#352 #414183
>>414174

Содержимое POST можно просмотреть либо var_dump($_POST) (неожиданно?) либо инспектором (Ctrl + Shift + i) на вкладке Network.
#353 #414184
>>414168

Ну наконец-то появились нормальные сообщения в коммитах: https://github.com/sqghub/uppu.ru/commits/master (упс, пока писал, опять зведочки пошли)
#354 #414185
>>414181

>Проверку токена (и любую другую работу с формами) надо делать в контроллере то есть в index.php.


Ты же наоборот сказал вынести валидацию в коммент.

>Почитай про псевдопеременную arguments


Почитал. Сделал.

>>414184

>Ну наконец-то появились нормальные сообщения в коммитах:


Ну, я так понял, что по хорошему нужно любое изменение сразу коммитить. А я, как правило, делаю коммит с целым винегретом различных исправлений, потому и комментарии там не особо полезны будут.
#355 #414186
>>414185

Валидацию коммента. А проверка CSRF это другая вещь, это защита формы. В любом случае у комментария нет такого свойства как «токен» так как он модет быть добавлен не через форму.

> то по хорошему нужно любое изменение сразу коммитить.


Да. Так удобнее историю смотреть.
#356 #414194
>>414186
Валидацию исправил.

>>414181

>и код потихоньку показывай.


https://github.com/sqghub/JavaScript
Хотя это лучше наjsfiddle выкладывать, да?
#357 #414196
>>414194

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

> наjsfiddle выкладывать,


да, там результат виден

Задачи по яваскрипт выглядят верно, давай на всякий случай их выложим на ресурс вроде jsfiddle/jsbin/codepen.
#358 #414201
>>413443

>Выглядит верно. Хотя эта задача требует ES5, то есть не заработает в старых браузерах так как в ES3 нет Object.keys. Ну да и фиг с ним.


Спасибо, я посмотрю как решить в ES3.

>Вообще, я вижу ты не знаешь про стандартные методы у массивов. Изучи-ка статьи


Читал про них, но конечно не все сходу помню. Переделаю.
>>413445

>Почему не хочешь использовать более короткую запись через += ?


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

>Попробуй так записать код.


Завтра все перепишу.
#359 #414208
>>414196

>Задачи по яваскрипт выглядят верно, давай на всякий случай их выложим на ресурс вроде jsfiddle/jsbin/codepen.


Первая:
http://jsbin.com/madokiloxo/1/edit?js,console
Вторая:
http://jsbin.com/vepejovolu/1/edit
Третья:
http://jsbin.com/gowuracema/1/edit
Четвертая:
http://jsbin.com/jefopepidu/1/edit
#360 #414209
>>414208
Ой, консоль на всех, кроме первой поехала.
#361 #414221
>>414208
Пятая:
http://jsbin.com/yigujodeba/1/edit?js,console
Шестая:
http://jsbin.com/qoxulobuxi/1/edit?js,console
Седьмая:
http://jsbin.com/boyutokaxi/1/edit?js,console
Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.
Восьмая:
http://jsbin.com/siconoyune/1/edit?js,console
Девятая:
http://jsbin.com/velowureju/1/edit?js,console
Десятая:
http://jsbin.com/pajanevocu/1/edit?js,console
Одиннадцатая:
http://jsbin.com/humutinixe/1/edit?js,console
Если задача была в том, чтобы самому написать алгоритм сортировки, то пузырьком или выбором я сделать могу легко, да.
Двенадцатая:
http://jsbin.com/pidesubipu/1/edit?js,console
#362 #414278
Как можно обойти то, что у всех ассершенов look-behind можно выставить только фиксированную длину?
Например, мне нужно найти абсолютно все появления буквы e в словах (в словах, где она встречается, нужно вывести это дважды). И когда я использую для этого регулярку типа:
[code]/\\b(\\w)(e)(\\w)\\b/ui[/code]
для текста "Where is engine?" мне выдаёт:
Wher[e]
engin[e]
Когда хотелось бы:
Wh[e]re
Wher[e]
[e]ngine
engin[e]
Если бы у ассершенов не было ограничения, о котором я уже говорил, то мне бы помогла регулярка
[code]/(?<=\\b(\\w))(a)(?=(\\w)\\b)/ui[/code]
А так я даже хз, как мне тут стоит сделать.
#363 #414283
Можно ли при объявлении дочернего класса не описывать его методы и свойства:
class Engineer extends Employee
{
}
Вот так, если класс Employee абстрактный класс и создан лишь для наследования и содержит уже все необходимые свойства и методы или вот так будет вернее:
class Engineer extends Employee
{
\tpublic function __construct($salary, $coffee, $reports)
\t{
\t\tparent::__construct($salary, $coffee, $reports);
\t}
}
?
И ещё вопрос, может ли абстрактный класс не содержать абстрактных методов?
#364 #414286
>>414283

>Можно ли при объявлении дочернего класса не описывать его методы и свойства


Можно, для этого и придумано наследование.
#365 #414289
>>414286
Как можно изменить свойства дочернего класса не напрямую вводом цифры, а с помощью расчетов?
К примеру в родительском классе $a = 2; мне надо чтобы в дочернем классе это значение было в 3 раза больше при любом значении этой переменной в родительском классе
48 Кб, 736x423
#366 #414349
В файлообменнике для прикрутки плеера/изображения стоит делать какую-то реальную проверку, или обойтись проверкой расширения? Ведь если хотят залить битое изображение, например, то зачем им мешать?
#367 #414350
Уже разобрался на этот вопрос можете не отвечать >>414289

Какой то слишком массивный код у меня вышел http://ideone.com/hRDxAh по сравнению с первым вариантом http://ideone.com/mxvzn8
#368 #414365
http://ideone.com/XZSKvc
Вот такая хрень получается. Жду советов по улучшению, моя голова уже не варит.
#369 #414388
>>414153
Добра тебе :)
49 Кб, 600x420
#370 #414434
Целый день сидел над первой задачей из "Повторим?" и вот что получилось:
$text = "привет.есть 2 функции,preg_split и explode ,не понимаю,в чем между ними разница.";
$text = preg_replace('/\s+/',' ',$text);
echo "{$text}\n";
$regexp='/([.?!])/u';
$parts=preg_split($regexp, $text, 0, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
foreach ($parts as &$value) {
\tif ($value[0]!=" ") {
\t\t$value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));
\t}
\telse {
\t\t$value=mb_strtoupper(mb_substr($value, 1, 1)).mb_substr($value, 2, mb_strlen($value));
\t}
}

$text1=implode($parts);
echo "{$text1}\n";
\t$text1=preg_replace('/\s?([,.?!])(\S)/u','$1 $2',$text1);
\techo $text1;

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

Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?
Аноним #371 #414467
>>411701
https://gist.github.com/anonymous/bf2787d38416fe2c1ae4

Вот тут непонятно что должно быть в местах где ... в функции createQuestions()
26 Кб, 483x640
#372 #414472
Аноны, у меня проблема с мотивацией. Начал смотреть 3-й уровень от специалиста, и дропнул на знакомстве с sqllite, т.к. я уже начал изучать mysql, да и вообще что-то он меня разочаровал и заебал. Синтаксис знаю, с куками и сессиями знаком, с файлами работал, с ооп в пхп знаком(<-посмотрел в видеокурсах, о которых писал). Придумайте мне задачку. Html знаю, css нет, ну скучно его изучать без привязки к чему-то. Вот думаю попробовать написать капчу. Главная проблема в том, что я истеричка и постоянно нахожусь в депрессии. Бывает время когда все окей, тогда и берусь учиться. Порешал бы ваши задачки, но хочется чего-то более объемного уже.
#373 #414481
>>414472
гостевуха
#374 #414483
>>414481
окей, пока посмотрю GD для капчи. Гостевуху на файлах я уже писал, на самом деле. Сечас попробую запилить с админкой и с бд.
#375 #414494
>>414472
Чем отличается интерфейс от абстрактного класса?
#376 #414507
>>414494
Тем, что в интерфейсе не могут описываться методы?
#377 #414514
>>414494
Это концептуально разные понятия.
На жизненном примере покажу
Вася 15лвл, он принадлежит к конкретному классу человек, который в свою очередь наследуется от абстрактного класса "живое существо".
Мы не можем создать экземпляр "живого существа", но догадываемся, что у живого существа есть возраст, хелсы, каким-то образом оно питается, каким-то размножается и так далее - это все будет абстрактными методами
А в конкретном классе "человек" будут реализованы эти методы размножения/питания и т.д.
Т.е. абстрактный класс - это обобщение над обычным классами, но по этому обобщению построить конкретный экземпляр невозможно

Интерфейс - это что-то типа "скилла". Например "умение передавать информацию".
Вот и сделаем псевдокодом

интерфейс УмениеОбщаться
публичный_метод сообщить($информацию);
публичный_метод принять($информацию);

Мы же знаем, что человек умеет общаться, дельфин умеет общаться (но при этом они делают это по разному!). Но инфузория туфелька не умеет. А общаться еще умеет например мобильный телефон (условно), робот р2д2 и так далее. Таким образом мы можем к любому классу, который нам нужен присобачить "УмениеГоворить" и миллион других умений в различных комбинациях.

Дети, пытайтесь лучше понять это как-то так, чем через повторение тупорылых фраз из говняных книжек. Как я заебался на собеседованиях слышать пургу всякую про ооп, пиздец просто. Или все кодеры такие узколобые?
#378 #414529
>>414514

>Это концептуально разные понятия.


Расскажи это c++, где нет интерфейсов, зато множественное наследование.
#379 #414531
>>414529

> c++


А теперь забирай свою парашу и катись колбасской по малой спасской
#380 #414538
>>414531

>забирай свою парашу и катись


>php тред

#381 #414540
>>414208

Первая

> Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.


Этого нету. Надо дописать что-то вроде

x = x || 100;

Задачи 2, 3, 4 решены верно.

>>414221

5

> for (var i = 0; i < arguments.length; i++)


> args = arguments;


всегда заключай тело цикла в {} даже если праила разрешают это не делать. Иначе легко допустить ошибку.

Этот цикл можно заменить на трюк с Array.prototype.slice: http://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work (англ)

> funct.apply(null,newArgs);


лучше писать this вместо null, тогда this тоже будет передаваться функции (хотя по условию этого не требуется, так что можешь не исправлять).

Так, работает верно.

6

Верно

7

> for (var i = 0; i < arguments.length; i++) {


> args.push(arguments);


В apply можно передавать всевдомассив arguments и цикл не нужен.

> Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.


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

8, 9

Верно.

10

> for (var key in inputObject)


Тут надо проверять еще принадлежит ли свойство объекту или его прототипу через hasOwnProperty. Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:

Object.prototype.x = 1;
var y = {};
count(y); // 1, а должно быть 0

В новых браузерах с ES5 есть метод Object.keys(x) который возвращает массив ключей, кстати.
#381 #414540
>>414208

Первая

> Шаг можно не указывать, тогда он будет равен одному. Начальное значение по умолчанию равно 0.


Этого нету. Надо дописать что-то вроде

x = x || 100;

Задачи 2, 3, 4 решены верно.

>>414221

5

> for (var i = 0; i < arguments.length; i++)


> args = arguments;


всегда заключай тело цикла в {} даже если праила разрешают это не делать. Иначе легко допустить ошибку.

Этот цикл можно заменить на трюк с Array.prototype.slice: http://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work (англ)

> funct.apply(null,newArgs);


лучше писать this вместо null, тогда this тоже будет передаваться функции (хотя по условию этого не требуется, так что можешь не исправлять).

Так, работает верно.

6

Верно

7

> for (var i = 0; i < arguments.length; i++) {


> args.push(arguments);


В apply можно передавать всевдомассив arguments и цикл не нужен.

> Здесь браузер с "use strict" отсылал куда подальше и не видел window.x.


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

8, 9

Верно.

10

> for (var key in inputObject)


Тут надо проверять еще принадлежит ли свойство объекту или его прототипу через hasOwnProperty. Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:

Object.prototype.x = 1;
var y = {};
count(y); // 1, а должно быть 0

В новых браузерах с ES5 есть метод Object.keys(x) который возвращает массив ключей, кстати.
#382 #414545
>>414221

Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.

11

> if (a['population'] >= b['population']) return -1;


Принято заключать действие в {} после if

Также, есть хитрость. Функция на самом деле может вернуть не ровно 1/-1, а любое положительное или отрицатльеное число. Можно писать

return x.population - y.population;

Хотя так конечно менее понятно.

Писать свой алгоритм не надо. Решено верно.

12

> const types = [


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

Hambuger.TYPE_BIG = 'big';
....

var hamburger = new Hamburger(Hamburger.TYPE_BIG);

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

А у тебя пользователю твоего класса никакие константы не доступны, приходится писать строкой "big".

Также, добавки — это необязательная вещь. Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом:

ham.add(TOPPING_CHEESE);
ham.add(TOPPING_SALAD);

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

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

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

> for (i = 0; i < types.length; i++) {


Это надо вынести в функцию/метод contains

> const types = ["small", "big"];


> const prices = [50, 100];


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

{ price: 50, calories: 100500 }

как это сделано с добавками.
#382 #414545
>>414221

Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.

11

> if (a['population'] >= b['population']) return -1;


Принято заключать действие в {} после if

Также, есть хитрость. Функция на самом деле может вернуть не ровно 1/-1, а любое положительное или отрицатльеное число. Можно писать

return x.population - y.population;

Хотя так конечно менее понятно.

Писать свой алгоритм не надо. Решено верно.

12

> const types = [


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

Hambuger.TYPE_BIG = 'big';
....

var hamburger = new Hamburger(Hamburger.TYPE_BIG);

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

А у тебя пользователю твоего класса никакие константы не доступны, приходится писать строкой "big".

Также, добавки — это необязательная вещь. Раз так, уместно не передавать их в конструктор, а добавлять отдельным методом:

ham.add(TOPPING_CHEESE);
ham.add(TOPPING_SALAD);

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

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

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

> for (i = 0; i < types.length; i++) {


Это надо вынести в функцию/метод contains

> const types = ["small", "big"];


> const prices = [50, 100];


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

{ price: 50, calories: 100500 }

как это сделано с добавками.
#383 #414549
>>414278

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

preg_match_all/replace не проходится дважды по одному слову, а ассершен не может работать с строками переменной длины.

>>414283

> может ли абстрактный класс не содержать абстрактных методов?


Да. Абстрактный класс - значит его нельзя создать через new, а абстрактный метод — значит, он обязан быть реализован в наследнике. Это разные вещи.

>>414349

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

Насчет плеера, браузер и флеш не поддерживает большинство форматов видео, по идее хорошо бы проверять прежде чем отображать плеер, это можно сделать яваскриптом с помощью метода canPlayType в который надо передать MIME-тип видео (его можно определить например библиотекой getId3).

>>414350

> switch ($isDirector) {


Ради 2 вариантов хватит ифа.

> $this->reports = 0;


А вот это плохая идея. Если мы захотим разжаловать директора в обычного сотрудника, как ты восстановишь поле? Я думаю, лучше просто хранить свойство «директор ли», а проверять его в функции вычисления зарплаты. Об этом в условии задачи не написано, но все ведь не предугадаешь.

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

> foreach ($object as $k => $v) {


> if ($k === 'salary') {


Что за наркоманство? А написать $object->salary нельзя? Не перебирай свойства объекта через foreach

> foreach ($this->workers as $object) {


as $worker

> $c = count($this->workers, 2);


Что еще за 2? Алсо, эту функцию можно записать в 1 строчку, а не в две.

> public function doCoffee()


Это принято называть getCoffee

> public function doShow()


Это должно быть не в департаменте. Может у нас есть 30 разных отчетов, что же ты будешь в Департамент 30 разных функций добавлять? Не надо.

> class Procurement extends Department


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

> doEmployeeSecondRank


> doEmployeeThirdRank


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

Также, не называй функции начиная с do. Это слово ничего не значит.

> $procurement = new Procurement(array_merge(doEmployeeFirstRank($me, 9), doEmployeeSecondRank($me, 3)


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

> $vektor = array(


$departments наверно лучше

> if ($k == 0) {


> echo padRight($str, $col1);


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

> $adv = $advertising->doShow( );


> $sal = $sales->doShow( );


тут нужна не копипаста, а цикл.

> switch ($k) {


> case 1:


> $sumWorkers += $v;



Как-то усложненно все. Не проще ли в цикле, где ты выводишь департаменты, складывать суммы?
#383 #414549
>>414278

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

preg_match_all/replace не проходится дважды по одному слову, а ассершен не может работать с строками переменной длины.

>>414283

> может ли абстрактный класс не содержать абстрактных методов?


Да. Абстрактный класс - значит его нельзя создать через new, а абстрактный метод — значит, он обязан быть реализован в наследнике. Это разные вещи.

>>414349

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

Насчет плеера, браузер и флеш не поддерживает большинство форматов видео, по идее хорошо бы проверять прежде чем отображать плеер, это можно сделать яваскриптом с помощью метода canPlayType в который надо передать MIME-тип видео (его можно определить например библиотекой getId3).

>>414350

> switch ($isDirector) {


Ради 2 вариантов хватит ифа.

> $this->reports = 0;


А вот это плохая идея. Если мы захотим разжаловать директора в обычного сотрудника, как ты восстановишь поле? Я думаю, лучше просто хранить свойство «директор ли», а проверять его в функции вычисления зарплаты. Об этом в условии задачи не написано, но все ведь не предугадаешь.

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

> foreach ($object as $k => $v) {


> if ($k === 'salary') {


Что за наркоманство? А написать $object->salary нельзя? Не перебирай свойства объекта через foreach

> foreach ($this->workers as $object) {


as $worker

> $c = count($this->workers, 2);


Что еще за 2? Алсо, эту функцию можно записать в 1 строчку, а не в две.

> public function doCoffee()


Это принято называть getCoffee

> public function doShow()


Это должно быть не в департаменте. Может у нас есть 30 разных отчетов, что же ты будешь в Департамент 30 разных функций добавлять? Не надо.

> class Procurement extends Department


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

> doEmployeeSecondRank


> doEmployeeThirdRank


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

Также, не называй функции начиная с do. Это слово ничего не значит.

> $procurement = new Procurement(array_merge(doEmployeeFirstRank($me, 9), doEmployeeSecondRank($me, 3)


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

> $vektor = array(


$departments наверно лучше

> if ($k == 0) {


> echo padRight($str, $col1);


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

> $adv = $advertising->doShow( );


> $sal = $sales->doShow( );


тут нужна не копипаста, а цикл.

> switch ($k) {


> case 1:


> $sumWorkers += $v;



Как-то усложненно все. Не проще ли в цикле, где ты выводишь департаменты, складывать суммы?
#384 #414550
>>414540

>Этого нету. Надо дописать что-то вроде


http://jsbin.com/hafokixuxi/1/edit
Вот так?

>5


http://jsbin.com/feyeyuhita/1/edit?js,console
Поправил.

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


В строгом режиме у меня писал ошибку в том что this - undefined в функции testThis, если вызывать её без apply.

>В apply можно передавать всевдомассив arguments и цикл не нужен.


http://jsbin.com/cefoxuburo/1/edit?js,console
Исправил.

>Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:


Ох уж эти прототипы. Не нравится мне такое наследование.

>Принято заключать действие в {} после if


Наглый копипаст, виноват.

>12


>Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:


Переделаю позже.

>как это сделано с добавками.


А я не знаю, почему я так и не сделал. Брейн лаг, наверное.

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


Они там из конструктора и не берутся. Это я решил, что так там делаются приватные свойства.

>Я советую переделать класс на прототипах.


Разберусь тогда позже.

>Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.


Еще четыре заданий до них.
#384 #414550
>>414540

>Этого нету. Надо дописать что-то вроде


http://jsbin.com/hafokixuxi/1/edit
Вот так?

>5


http://jsbin.com/feyeyuhita/1/edit?js,console
Поправил.

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


В строгом режиме у меня писал ошибку в том что this - undefined в функции testThis, если вызывать её без apply.

>В apply можно передавать всевдомассив arguments и цикл не нужен.


http://jsbin.com/cefoxuburo/1/edit?js,console
Исправил.

>Иначе, если кто-нибудь расширит прототип объекта, ты эти свойства тоже посчитаешь:


Ох уж эти прототипы. Не нравится мне такое наследование.

>Принято заключать действие в {} после if


Наглый копипаст, виноват.

>12


>Это только в ES6 доступно, я бы не использовал. Да и константы ты все равно сделал неправильно. Надо примерно так:


Переделаю позже.

>как это сделано с добавками.


А я не знаю, почему я так и не сделал. Брейн лаг, наверное.

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


Они там из конструктора и не берутся. Это я решил, что так там делаются приватные свойства.

>Я советую переделать класс на прототипах.


Разберусь тогда позже.

>Я там переделал раздел заданий на DOM, добавив задачи на jQuery и упростив некоторые.


Еще четыре заданий до них.
#385 #414555
>>414365

Вижу. что код ты улучшил, но пока неидельно.

> if (($this->field->isXOnMap($this->x + $x)) && !$this->field->checkTile($this->x + $x, $this->y)) {


> if ($this->field->isXOnMap($this->x + $value['x']) && $this->field->isYOnMap($this->y + $value['y']) && !$this->field->checkTile($this->x + $value['x'], $this->y + $value['y'])) {



Можно объединить в одну функцию, field->canMoveTo($x, $y)

> public function unsetField()


Можно просто в setField дописать

public function setField(GameField $field = null)

тогда можно будет передавать null. Но можно и как у тебя, конечно.

> foreach ($ways as $key => $value)


as $direction => $way сам собой напрашивается. Ну и наверно можно не хранить ключи-слова типа left, зачем?

> $previousUp = INF;


> $previousDown = INF;


Зачем 4 переменных? В таких ситуациях используют массив.

> public function calculateScore($list)


По моему ты написал как-то сложно. Тут надо использовать цикл:

для каждого хода:
очки = посчитатьОчкиДляХода(ход);

А не делать 4 переменных. А если мышь сможет ходить в 8 сторон, ты еще 8 блоков условий накопипастишь? Не надо.

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

> $turn = $this->chooseBestTurn( );


> $this->moveX($turn['x']);


У тебя chooseBestTurn может почему-то вернуть 0. И тогда будет ощибка. Так быть не должно, надо например провеять чему равно turn сначала. Ну и вместо 0 логично использовать null.

> $this->field->killMouse($tile->getCoordinateX(), $tile->getCoordinateY( ));


тут было бы проще передавать просто $tile. И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.

> public function move($x, $y)



Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

> $distance = abs($this->x - $animal->getCoordinateX()) + abs($this->y - $animal->getCoordinateY( ));


Неверно считается расстояние. Кошка же по диагонали может ходить.

> $this->field = array_fill(0,


Ты никак не используешь это свойство. Раз так, хватит просто переменной.

Искажение карты еще стоит исправить.

Мышка 1 почему-то не убегает, а идет параллельно кошке. И кошка могла бы съесть ее на ход раньше.

http://ideone.com/3R0Rbr — мышк 2 храбро идет навстречу кошке почему-то.

Алсо там

> PHP Notice: Undefined offset: 1 in /home/n46k2E/prog.php on line 370

#385 #414555
>>414365

Вижу. что код ты улучшил, но пока неидельно.

> if (($this->field->isXOnMap($this->x + $x)) && !$this->field->checkTile($this->x + $x, $this->y)) {


> if ($this->field->isXOnMap($this->x + $value['x']) && $this->field->isYOnMap($this->y + $value['y']) && !$this->field->checkTile($this->x + $value['x'], $this->y + $value['y'])) {



Можно объединить в одну функцию, field->canMoveTo($x, $y)

> public function unsetField()


Можно просто в setField дописать

public function setField(GameField $field = null)

тогда можно будет передавать null. Но можно и как у тебя, конечно.

> foreach ($ways as $key => $value)


as $direction => $way сам собой напрашивается. Ну и наверно можно не хранить ключи-слова типа left, зачем?

> $previousUp = INF;


> $previousDown = INF;


Зачем 4 переменных? В таких ситуациях используют массив.

> public function calculateScore($list)


По моему ты написал как-то сложно. Тут надо использовать цикл:

для каждого хода:
очки = посчитатьОчкиДляХода(ход);

А не делать 4 переменных. А если мышь сможет ходить в 8 сторон, ты еще 8 блоков условий накопипастишь? Не надо.

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

> $turn = $this->chooseBestTurn( );


> $this->moveX($turn['x']);


У тебя chooseBestTurn может почему-то вернуть 0. И тогда будет ощибка. Так быть не должно, надо например провеять чему равно turn сначала. Ну и вместо 0 логично использовать null.

> $this->field->killMouse($tile->getCoordinateX(), $tile->getCoordinateY( ));


тут было бы проще передавать просто $tile. И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.

> public function move($x, $y)



Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

> $distance = abs($this->x - $animal->getCoordinateX()) + abs($this->y - $animal->getCoordinateY( ));


Неверно считается расстояние. Кошка же по диагонали может ходить.

> $this->field = array_fill(0,


Ты никак не используешь это свойство. Раз так, хватит просто переменной.

Искажение карты еще стоит исправить.

Мышка 1 почему-то не убегает, а идет параллельно кошке. И кошка могла бы съесть ее на ход раньше.

http://ideone.com/3R0Rbr — мышк 2 храбро идет навстречу кошке почему-то.

Алсо там

> PHP Notice: Undefined offset: 1 in /home/n46k2E/prog.php on line 370

#386 #414556
>>414434

Код лучше постить на ideone. Смотри, как он расползается тут.

> Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?


не было, чтобы уроки не были слишком сложными. Использовать можно.

> .mb_substr($value, 1, mb_strlen($value));


Третий параметр (длина) можно не указывать, почитай мануал

> $value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));


Ты копипастишь эту строчку. Убери копипасту. Алсо, пробел можно удалить через trim.

В общем. исправь это и запости на ideone, посомтрим. Ну и через phpformatter пропусти.

>>414467

Заполнение свойств объекта, текст вопроса, варианты ответов, и тд. Этот код по моему есть выше.

>>414472

Есть хорошие задачки:

- попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
- посложнее: https://gist.github.com/codedokode/9424217

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

Также, если охота яваскрипт помучать: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
#386 #414556
>>414434

Код лучше постить на ideone. Смотри, как он расползается тут.

> Алсо путем гугления узнал о том, как менять значение массива на лету с помощью & и сохранении разделителя с помощью PREG_SPLIT_DELIM_CAPTURE, чего не встречал по ходу предыдущих разделов. Вопрос, почему их там не было - так задумано или не стоит использовать эти штуки вообще?


не было, чтобы уроки не были слишком сложными. Использовать можно.

> .mb_substr($value, 1, mb_strlen($value));


Третий параметр (длина) можно не указывать, почитай мануал

> $value=mb_strtoupper(mb_substr($value, 0, 1)).mb_substr($value, 1, mb_strlen($value));


Ты копипастишь эту строчку. Убери копипасту. Алсо, пробел можно удалить через trim.

В общем. исправь это и запости на ideone, посомтрим. Ну и через phpformatter пропусти.

>>414467

Заполнение свойств объекта, текст вопроса, варианты ответов, и тд. Этот код по моему есть выше.

>>414472

Есть хорошие задачки:

- попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
- посложнее: https://gist.github.com/codedokode/9424217

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

Также, если охота яваскрипт помучать: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
#387 #414563
>>414555

>Ну и наверно можно не хранить ключи-слова типа left, зачем?


Как же я буду добавлять очки к ходу, если у него нет своего идентификатора?

> И я бы сделал не killMouse, а removeAnimal — может потом найдется тот, кто ест кошек.


Так функция вызывается, когда двое животных в одной точке, поэтому она убивает только мышку. Я не могу сделать её универсальной, иначе она сотрёт и кошку тоже, как только та поймает мышку.
#388 #414575
Поясните за такой момент, страницы например такого типа:

http://.../.../advert.php?id=563

Которые по сути обрабатывает один файл, воспринимаются поисковиками как разные страницы? Надо ли добавлять такие страницы в карту сайта?

И ещё один вопрос, например сайт где много одинаковых страниц, допустим вконтакте, каким образом там формируется страница пользователя при регистрации? GET запрос переходит на одну страницу которая всё обрабатывает и выводит нужные данные для каждого пользователя, или же при регистрации создаётся файл с кодом индивидуально для каждого пользователя?
#389 #414602
http://ideone.com/wlc617 ОП, по моему у меня получилось.
#390 #414603
>>414575

Сервер можно настроить так, что Url не соответствует имени файла, и например любые запросы отправляются на index.php (или любой другой скрипт) независимо от того что написано в URL.

Вконакте не создает файлы для всех возможных URL, он использует возможности настройки сервера.

Гуглится по словам ЧПУ, pretty urls.

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


Это вопрос к СЕОшникам, а не к PHP программистам. Формально если URL разный, то это разные страницы. но поисковики скорее всего будут снижать им рейтинг, так как у них указан один и тот же файл. Для SEO лучше хорошие адреса типа /articles/how-to-make-something.html

>>414563

> Как же я буду добавлять очки к ходу, если у него нет своего идентификатора?


Ход это массив значений которому не нужен идентификатор. Добавляй очки в массив, в поле score.

> Я не могу сделать её универсальной, иначе она сотрёт и кошку тоже, как только та поймает мышку.


Нет. Ты же передаешь в функцию объект который надо удалить, то есть мышку. И функция должна удалять только ее. Но естественно проверь чтобы кошка не могла съесть кошку.
#391 #414608
>>414602

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

> if ($score < $direction['score']) {


> $list[$key]['score'] = $score;


Тут ошибка. Ты обновляешь исходный массив но не обновляешь его копию в direction (и сравшиваешь дальше очки со старой копией).

Ты зря все сваливаешь в одну функцию. Мне кажется, было бы удобнее еще чуть разбить:

> public function calculateScore($list)


Здесь можно добавить функцию которая считает очки для единственного хода.

Хорошо бы добавить учет числа возможных ходов при расчетет числа баллов. Чтобы мышки не забегали в углы (и клетки окруженные мышами).

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

> $score = abs($cat->getCoordinateX() - $direction['x']) + abs($cat->getCoordinateY() - $direction['y']);



Непраивльный по моему метод определения расстояния до кошки. Также, я вижу что там есть в 2 местах код, который ищет ближайшее к клетке животное — а это копипаста, нехорошо, надо бы вынести куда-нибудь.

Надо еще добавить тайпхинты, если в функцию передается массив? то дописать array.

> $this->moveX($turn['x']);


> $this->moveY($turn['y']);


Лучше наверно просто сделать функцию moveTo(x, y)

Еще тут, у кошки сомнительный код:

> $this->x = $this->x + $x;


...

> $tile = $this->field->checkTile($this->x, $this->y);


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

Дальше, есть такая функция и у кошки и у мышки, public function makeMove(). Мне кажется незачем ее копипастить, а можно переместить в базовый класс Животное, ведь любое животное сначала выбирает, а потом делает ход.

chooseBestTurn тогда надо будет сделать абстрактной функцией.

Если ты это исправишь, думаю, все будет нормально.
#391 #414608
>>414602

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

> if ($score < $direction['score']) {


> $list[$key]['score'] = $score;


Тут ошибка. Ты обновляешь исходный массив но не обновляешь его копию в direction (и сравшиваешь дальше очки со старой копией).

Ты зря все сваливаешь в одну функцию. Мне кажется, было бы удобнее еще чуть разбить:

> public function calculateScore($list)


Здесь можно добавить функцию которая считает очки для единственного хода.

Хорошо бы добавить учет числа возможных ходов при расчетет числа баллов. Чтобы мышки не забегали в углы (и клетки окруженные мышами).

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

> $score = abs($cat->getCoordinateX() - $direction['x']) + abs($cat->getCoordinateY() - $direction['y']);



Непраивльный по моему метод определения расстояния до кошки. Также, я вижу что там есть в 2 местах код, который ищет ближайшее к клетке животное — а это копипаста, нехорошо, надо бы вынести куда-нибудь.

Надо еще добавить тайпхинты, если в функцию передается массив? то дописать array.

> $this->moveX($turn['x']);


> $this->moveY($turn['y']);


Лучше наверно просто сделать функцию moveTo(x, y)

Еще тут, у кошки сомнительный код:

> $this->x = $this->x + $x;


...

> $tile = $this->field->checkTile($this->x, $this->y);


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

Дальше, есть такая функция и у кошки и у мышки, public function makeMove(). Мне кажется незачем ее копипастить, а можно переместить в базовый класс Животное, ведь любое животное сначала выбирает, а потом делает ход.

chooseBestTurn тогда надо будет сделать абстрактной функцией.

Если ты это исправишь, думаю, все будет нормально.
#392 #414613
>>414608

>абстрактной функцией


Зачем они нужны?
sage #393 #414625
>>411701
Опять говно всплыло на нулевую.
#394 #414652
у меня есть выпадающее меню, прозванное аккордеон. как сделать, чтобы в зависимости от url был раскрыт тот, или иной пункт? через get?
14 Кб, 314x300
#395 #414722
Я у мамы лебедев.

diff leb1.txt leb2.txt

110d109
< 72

118d116
< 64

123,124d120
< 59
< 58

129,130d124
< 53
< 52

137,138d130
< 45
< 44

144,145d135
< 38
< 37

150,151d139
< 32
< 31

153,154d140
< 29
< 28

158d143
< 24

160,161d144
< 22
< 21

164,166d146
< 18
< 17
< 16

169,173d148
< 13
< 12
< 11
< 10
< 9

175,181d149
< 7
< 6
< 5
< 4
< 3
< 2
< 1
14 Кб, 314x300
#395 #414722
Я у мамы лебедев.

diff leb1.txt leb2.txt

110d109
< 72

118d116
< 64

123,124d120
< 59
< 58

129,130d124
< 53
< 52

137,138d130
< 45
< 44

144,145d135
< 38
< 37

150,151d139
< 32
< 31

153,154d140
< 29
< 28

158d143
< 24

160,161d144
< 22
< 21

164,166d146
< 18
< 17
< 16

169,173d148
< 13
< 12
< 11
< 10
< 9

175,181d149
< 7
< 6
< 5
< 4
< 3
< 2
< 1
#396 #414857
http://ideone.com/jMYYKH В общем вот.

Я пытался добавить учет количества возможных ходов из новой точки, но по моему сделал еще хуже http://ideone.com/OEx7oY
#397 #414859
>>411701

>PHP


Ебать вы тут копрофилы. И говнецом в виде пхп-лапши небось обмазываетесь, быдло?
Окропил всех ИТТ,
#398 #414868
ОП, посоветуй Анимэ энтрилевельного, только без маленьких девочек и школьников.
sage #399 #414876
>>414868
Мамашу выеби свою, анимеблядь.
sage #400 #414881
>>414868
Natsuyasumi
1719 Кб, Webm
860 Кб, Webm
sage #401 #414886

незнаю чо делать при столкновениях(
#402 #414894
>>414549
http://ideone.com/xkrzIC
Я тут немного переделал свойства департаментов и стало намного проще делать вывод, добавил в свойства департамента суммарные данные по работникам.
#403 #414898
>>414886
Да у тебя там многое не так.
У тебя кошки после поедания не пропускают ход, кошка даже на десяток мышей кидается и тд.
#404 #414905
>>414529
При чем тут c++, мы же вроде про ООП говорим
sage #405 #414908
>>414898

>поедания


sage #406 #414917
>>411805

>haskell


Оче годно. Учитесь, пхпдети. Сделай, что бы кошки ебли мышек
sage #407 #414918
>>414894
Да ты знатный копрофил, я тебе должен сказать.
#408 #414921
>>414905
Вот именно. Если брать понятия "интерфейс" и "абстрактный класс" вне контекста php, то интерфейс - это подмножество абстрактного класса. Они-то и сделаны были как замена множественному наследованию. А всякие там "концептуальные" свойства им приписали уже потом.
553 Кб, Webm
sage #409 #414922
>>414917

> кошки ебли мышек

#410 #414926

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


Непоне
#411 #414929
Поделал всякие задачки вроде файлообменника и кучу своих, и кажется уже кое-что знаю.
Может есть списочек того, что хорошо бы знать, чтобы устроиться пхп-джуниором? А то листаю вакансии своего городка, а там только "знание кмс" и "знание фреймворков".
31 Кб, 450x378
sage #412 #414930
#413 #415020
>>414613

Абтрактный метод — это метод, у котрого нет тела и который обязаны реализовать потомки класса: http://php.net/manual/ru/language.oop5.abstract.php

>>414652

В шаблоне наверно надо какой-нибудь класс поставить на текущйи пункт. Почитай документацию по «аккордеону»

>>414722

Не понял о чем ты

>>414857

> $distance 2 + $extra;


А в чем смысл прибавлять extra?

> public function move($x, $y)


...

> $this->x = $this->x + $x;


...

> $tile = $this->field->checkTile($this->x, $this->y);


Ты это еще не исправил. Ты сначала кошкой встаешь на клетку, а потом ищешь кто еще на ней есть. Так кошка может не заметить мышку.

Также, в функции move у кошки надо перевернуть if. У тебя там он слишком большой. Также можно упростить if и в makeMove у кошки.

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

И посмотри тут ошибка внизу: http://ideone.com/kUycaY

> PHP Notice: Undefined offset: 0 in /home/cCChGL/prog.php on line 370



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



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

score = w1×f1 + w2×f2

Где w1, w2 — веса факторов, а f1 и f2 — сами факторы (расстояние до кошки и число вариантов хода)
#413 #415020
>>414613

Абтрактный метод — это метод, у котрого нет тела и который обязаны реализовать потомки класса: http://php.net/manual/ru/language.oop5.abstract.php

>>414652

В шаблоне наверно надо какой-нибудь класс поставить на текущйи пункт. Почитай документацию по «аккордеону»

>>414722

Не понял о чем ты

>>414857

> $distance 2 + $extra;


А в чем смысл прибавлять extra?

> public function move($x, $y)


...

> $this->x = $this->x + $x;


...

> $tile = $this->field->checkTile($this->x, $this->y);


Ты это еще не исправил. Ты сначала кошкой встаешь на клетку, а потом ищешь кто еще на ней есть. Так кошка может не заметить мышку.

Также, в функции move у кошки надо перевернуть if. У тебя там он слишком большой. Также можно упростить if и в makeMove у кошки.

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

И посмотри тут ошибка внизу: http://ideone.com/kUycaY

> PHP Notice: Undefined offset: 0 in /home/cCChGL/prog.php on line 370



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



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

score = w1×f1 + w2×f2

Где w1, w2 — веса факторов, а f1 и f2 — сами факторы (расстояние до кошки и число вариантов хода)
#414 #415025
>>415020

>А в чем смысл прибавлять extra?


Короче, когда мышка достигает потолка на поле, а мышка ниже неё, она перестаёт вообще делать телодвижения, потому-что соседние клетки имеют такое же максимальное расстояние до кошки (т.к расстояние берется по одной оси, по которой кошка дальше), как и та на которой мышь уже стоит. Единственный способ это решить, который мне пришел в голову, это добавлять к очкам еще и расстояние по второстепенной оси, предварительно увеличив в два раза очки главной оси. Сумбурно написал, но надеюсь ты понял.
http://ideone.com/PwpzXA проще показать наверное, чем объяснить. Как видишь мышка впадает в экзистенциальный кризис и решает просто стоять на месте.
#415 #415028
>>415025

>Короче, когда мышка достигает потолка на поле, а кошка ниже неё


фастфикс
#416 #415037
>>415020
И, да, чем 2 не вес расстояния, а 1 вес числа вариантов, как в моем примере здесь http://ideone.com/OEx7oY ?
#417 #415039
>>414868

Аниме без школьников? Ну не знаю, Welсome to NHK или десу ното какой-нибудь. Что-то мне в голову ничего больше не приходит.

>>414886

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

А так, видео выглядит замечательно.

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

>>414894

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


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

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

$department->coffee

будет

$department->getCoffee()

> if ($isDirector == 1) {


> $this->salary = 1.5;


Это неправильно, salary должна обозначать базовую неизменную ставку, а умножать надо в функции вычисления зарплаты. а то в твоем варианте если разжаловать из директор в обычные сотрудники, зарплата обратно не пересчитается.

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

> procurement = new Department('Procurement', array_merge(getEmployee(1, $me, 9), getEmployee(2, $me, 3), getEmployee(3, $me, 2), getEmployee(1, $ma, 2), getEmployee(2, $me, 1, 1)));


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

> global $col1;


Не используй global. Аргументы можно передать и так.

> $repSal /= 4;


тут должна быть не цифра 4, а число департаментов

>>414921

Нет.

>>414926

Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.

>>414929

Зависит от компании. Где-то будут спрашивать всякие вопросы из теории типа «чему равно 0 == "hello"» или «чем отличается 1-я, 2-я и 3-я нормальные формы в SQL» или «какие бывают уровни изоляции транзакций». Для подготовки к таким вопросам стоит просто прочесть мануал по PHP.

Бывает, что дают какое-то тестовое задание: сделать прстой сайт или страничку или написать класс.

Ну а бывает, что хотят отличников и победителей олимпиад.
#417 #415039
>>414868

Аниме без школьников? Ну не знаю, Welсome to NHK или десу ното какой-нибудь. Что-то мне в голову ничего больше не приходит.

>>414886

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

А так, видео выглядит замечательно.

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

>>414894

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


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

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

$department->coffee

будет

$department->getCoffee()

> if ($isDirector == 1) {


> $this->salary = 1.5;


Это неправильно, salary должна обозначать базовую неизменную ставку, а умножать надо в функции вычисления зарплаты. а то в твоем варианте если разжаловать из директор в обычные сотрудники, зарплата обратно не пересчитается.

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

> procurement = new Department('Procurement', array_merge(getEmployee(1, $me, 9), getEmployee(2, $me, 3), getEmployee(3, $me, 2), getEmployee(1, $ma, 2), getEmployee(2, $me, 1, 1)));


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

> global $col1;


Не используй global. Аргументы можно передать и так.

> $repSal /= 4;


тут должна быть не цифра 4, а число департаментов

>>414921

Нет.

>>414926

Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.

>>414929

Зависит от компании. Где-то будут спрашивать всякие вопросы из теории типа «чему равно 0 == "hello"» или «чем отличается 1-я, 2-я и 3-я нормальные формы в SQL» или «какие бывают уровни изоляции транзакций». Для подготовки к таким вопросам стоит просто прочесть мануал по PHP.

Бывает, что дают какое-то тестовое задание: сделать прстой сайт или страничку или написать класс.

Ну а бывает, что хотят отличников и победителей олимпиад.
#418 #415041
>>415025
Я не понимаю о чем речь, но не проще ли высчитывать для каждой соседней точки очки как длину стороны треугольника? Где координаты одной точки треугольника это координаты кошки, координаты мыши это вторая точка, а координаты третьей точки - координаты потенциальной клетки для перехода?
#419 #415043
>>415025

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


Да, это имеет смысл, но не уверен что тут надо использовать max. Лучше наверно рассчитывать второе расстояние, dx + dy или корень(dx^2 + dy^2) и добавлять его с понижающим весом.

>>415037

да, это вес, но к числу возможных ходов ты не добавил вес почему-то.
#420 #415044
>>415041

Не совсем, так как кошка ходит по клеточкам, а не по стороне треугольника. И можно посчитать неприавльно.
#421 #415047
>>415043
В смысле не добавил? Если вес 1, как я его добавлю? Умножу на 1?
#422 #415048
>>415047

Нет, погоди, почему 1? Если для числа кошек вес = 2 то получается наличие 2 лишних клеток для хода перевешивает тот факт, что рядом кошка?
#423 #415049
>>415047

Хотя, конечно может иногда 2 клеточки и важнее чем расстояние до кошки, не знаю.
#424 #415052
>>415039

>Добавляешь на таблицу класс, и пишешь в CSS условие что если на таблицу добавлен этот класс то черные клетки выводятся как белые, и наоборт.


Даже не знал что в ксс есть условия.
#425 #415054
>>415052
И даже ненагуглил, ОП ты увере?
#426 #415055
>>415052

Смотри. Допустим у нас черные клеточки имеют класс .checked, тогда мы можем написать

.checked { color: black; }
.inverted .checked { color: white; }

Если на таблицу добавить класс inverted то черные клеточки станут белыми. ты этого не знал? Может тебе стоит задачки из пути HTML/CSS порешать?
#427 #415060
>>415055

>Может тебе стоит задачки из пути HTML/CSS порешать?


Я УДАРЮ ТЕБЯ В ЛИЦО, НУ ИЛИ В ЖИВОТ, ЕСЛИ ТЫ КРАСИВЫЙ
#428 #415062
>>411701
Попробовал написать игровой автомат при помощи сессий, вот что вышло-http://ideone.com/AT5UcQ. Он конечно в Идеоне не работает, но у меня на денвере кажется работает, только вот одна проблема возникла, не могу прекратить скрипт после того как баланс станет меньше 0. Логично предположить что можно сделать выполнение скрипта при условии:

if($_session["balance"]>0) {
....
}

Но так не выходит потому что сессия у меня определяется в середине скрипта, и тогда он просто не будет работать, как ещё это можно реализовать?
#429 #415063
>>415062
Извиняюсь, вот скрипт http://ideone.com/AT5UcQ
#430 #415066
>>415062
>>415063
А всё котаны, спасибо, я уже придумал как, извиняюсь если потревожил
170 Кб, 702x1024
#431 #415104
А где почитать как юзать гитхаб, ну и про сам гит тоже? Я лох, и не могу в инглиш.
37 Кб, 653x955
#433 #415223
>>411701
Приветствую вас будущие хакеры.
У меня к вам нюфажный вопрос-задание, помогите пожалуйста.
Как создать такую херню?

1. где плюсики, чтоб можно было добавить фото.
2. товары 1 товары 2, как при нажатии их главное окно не менялось? Нужно отдельный файл создать? скажем tovari1.html, tovari2.html
Извините за ньюфажный вопрос если ответите, просто мне важнo понимание общей струткуры.
#434 #415255
>>415104

Если что-то будет непонятно, задавай вопросы в треде.

>>415223

Тебе нужен яваскрипт — язык, программы на котором выполняются на страние в браузере.

>>415060

Задачу-то решил в итоге? Кол покажешь?

>>414868

Я тут еще Nodame Cantabile вспомнил из серии «не про школьников».
#435 #415257
>>415255

> кол


код конечно
#436 #415258
Оп, а ты только на пыхе кодишь по работе?
#437 #415261
>>415258

На явакрипте еще.
#438 #415268
>>415255

>Тебе нужен яваскрипт — язык, программы на котором выполняются на страние в браузере.


Это я знаю ну разве это не в команде с html css и явой выполняется? Вариант ли такую страничку только в яваскрипте создать?
#439 #415271
>>415039
http://ideone.com/Fm386s
Перенес рассчет зарплаты из работника в департаменты, поменял способ создания департаментов (И сразу вопрос: когда я в массиве указывал "1, $ma, 15", пропуская четвертую переменную, и потом при разбивке этой строки на массив через explode() и присвоении через языковую конструкцию list() переменным $rank, $class, $count, $isDirector значения массива который получился на выходе из explode() ideone ругался на это, видимо на отсутствие четвертого элемента для переменной $isDirector, можно ли так делать если в конструкторе уже стояло $isDirector = 0 по умолчанию? Или надо делать как я сделал тут и указывал в конце "1, $ma, 15, 0" ?)
321 Кб, 1359x697
474 Кб, 1353x698
270 Кб, 1349x662
400 Кб, 1346x701
#440 #415273
Друзья просветите?
Вот начальная страничка двача.
Неужели это 571 строка кода только начальной страницы? только начальной да?
Вот код раздела /pr здесь уже 5441 строчек кода.
Интересно сколько код двача весит? и вообще сколько строчек кода у двача?
sage #441 #415278
>>415273
пробегись по всем разделам и просуммируй количества строчек
столько и будет строчек кода у двача
#442 #415279
>>415278
и не забудь в би каждый тред просмотреть
sage #443 #415280
>>415278
алсо незабудь скрытые разделы и каждый тред в каждом разделе - у них свои строчки, страницы то разные
#444 #415282
>>415279
Но в тредах всего-лишь текст, который потом через гет запрос выдаётся браузеру, нет?
#445 #415286
Другой вопрос, а вариант ли самостоятельно двач написать? сколько по времени? Может грамотно как бы скелет сайта создать.
#446 #415288
>>415286
Думаю, что не сложнее форума.
#447 #415305
Можно ли при помощи JS изменить файл с данными JSON? Тренируюсь на локальном сервере, есть файл items.json с таким содержимым:
{
\t"item_1" : [
\t\t{"name" : "Article 1"},
\t\t{"status" : 0}
\t],
\t"item_2" : [
\t\t{"name" : "Article 2"},
\t\t{"status" : 0}
\t]
}

Может ли Javascript изменить файл items.json, чтобы например у Article 1 всегда был status = 1, пока я опять его не поменяю в своём index.html? Я знаю, что для Пыха нужно создавать БД и посылать SQL-запросы для её изменения. Но интересует в данном случае JS - могу ли я использовать items.json в качестве своего рода базы данных и изменять её посредством js-скриптов.
#448 #415335
>>415305
Не в тот тред пишешь. Есть отдельный лля JS.
Отвечу, что думаю. Да, это возможно, но дело в том, что сам JSON тебе все равно придется хранить где-то отдельно, самый простой способ - в localstorage браузера.
Читаешь свой объект оттуда, изменяешь и сохраняешь обратно.
#449 #415346
>>415335
ОП и с джаваскриптом помогает. Касательно localstorage, я пробовал туда сохранять данные, но мне не удавалось одновременно их туда записывать и доставать без перезагрузки страницы браузера.
#450 #415348
Можно ли наложить один елемент поверх другого делая его ровно таким же размером, при этом задавая размер первого относительно. Первый - таблица, количество ячеек в которой может быть разное. Главный вопрос именно в указании размера.
#451 #415362
Привет, ОП, привет падаваны. Я давно здесь не появлялся в общем-то с полгода как устроился на работу. До этого прошел учебник опа, запилил файлообменник , арканоид и бложик. Пока хикковал было время учиться и процесс обучения шел довольно быстро, но работая с 10 до 19 (хуёвый график) ничего не успеваю теперь и чувствую что не развиваюсь, ну а если и развиваюсь то очень медленно. Но со следующей недели иду в двухнедельный отпуск и хочу посвятить всё это время какому-нибудь проекту и выучить при этом что-нибудь годное и востребованное на рынке труда (yii? ) Потому как мне остопиздел этот битрикс и клепание второсортных сайтиков и дебагинг этой параши. Тащемта зачем пишу, я уже пробовал пилить штуки в одинокого но никогда не работал над чем-то в команде. Мне было бы интересно с другим аноном попробовать запилить что-нибудь. Я вот думаю, мы могли бы с кем-нибудь объединиться, Оп, бы нам придумал задачку (или мы бы сами придумали). Заодно потренировались бы использовать коллаборативный аспект гита и гитхаба (все эти бранчи мёрджи и пул реквесты) а не просто гит адд гит коммит гит пуш, как мы умеем уже. Что думаете, есть тут такие кому интересно?
#452 #415364
http://ideone.com/SUda8n не могу понять, мышки эффективно двигаются или все еще не очень?
#453 #415366
>>415364
Последний ход второй мыши вообще самоубийственный, поэтому нет, не эффективно.
#454 #415410
Сделал пару заданий, проверьте -
1) Госзакупочки - http://ideone.com/BoKyTS
2) Первое из "повторим" - http://ideone.com/2HwBt2
#455 #415418
>>415366
Почему самоубийственный? Потому-что в угол идет? Ну так она не может просчитывать на два хода вперед, только на один.
18 Кб, 800x600
#456 #415451
>>415044
Ты меня не понял совсем. У тебя сначала просчитываются варианты хода для мышки? Просчитываются они относительно текущей координаты кошки, верно? Так и считай как я на картинке нарисовал.
Не очень верно выразился, тут можно даже не использовать вычисление стороны треугольника, а банально воспользоваться формулой нахождения длины отрезка из линейной алгебры.
Желтое - текущее расстояние между кошкой и мышкой (не нужно)
Зеленое - потенциальные мышиные ходы.
Синее - просчет расстояний для этих ходов.
Далее смотрим какое из этих расстояний будет наибольшим, то есть куда мышь может сходить, что бы после хода оказалась от кошки дальше всего, это я красным пометил. Вот эти синие расстояния и есть своеобразные очки. Ходим туда, где больше.
Кошка в свою очередь будет использовать тот же самый алгоритм, только она будет высчитывать на какой клетке она будет находится ближе к мышке после своего хода. Изи же?
#457 #415471
>>415362
Напиши, пожалуйста, про файлообменник, бложик, арканоид. По каким мануалам делал, где брал задание? Не хочу соснуть на след. собеседовании и показать что-то интересное.
#458 #415484
>>415451

Твой алгоритм не учитываает что кошек может быть несколько. Ну и вместо вычисления длины отрезка лучше считать число ходов нужных кошке для достижения клетки (они не совпадают, например кошка идет по диагонали за 1 ход, а длина отрезка будет 1.41).
#459 #415488
>>415471

Я думаю, на гитхабе Опа:

- файлообменник: https://gist.github.com/codedokode/9424217
- арканоид (на JS + канвас): https://gist.github.com/codedokode/9933897
- бложек — не знаю

Также, если ты слаб в знании HTML/JS у нас есть задачки:

- Путь HTML/CSS https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- Путь JS https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Задачки на SQL (и список слов которые хорошо бы знать) https://gist.github.com/codedokode/10539213

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

>>415362

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

Ну и еще для развития полезно изучить Yii2 или Symfony 2, особенно последний.

>>415348

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

Напиши подробнее, может что-нибудь придумаем.

Может быть тут яваскрипт нужен.

>>415305

Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.

>>415286

Месяц-два. У меня верстка есть кстати, правда, кривая: https://github.com/codedokode/board-markup

>>415273

Это не строчки кода, а HTML-код страницы. Посты хранятся в базе данных, и при обращении серверные скрипты берут посты из БД, подставляют в шаблон и формируют страницу которую ты видишь. Она может быть нигде не хранится, а генерируется каждй раз (а может и хранится ради ускорения отдачи ее во второй раз).

Ты слышал про динамические сайты? Это как раз сайты которые генерируют html код подставляя данные из БД в шаблон.
#459 #415488
>>415471

Я думаю, на гитхабе Опа:

- файлообменник: https://gist.github.com/codedokode/9424217
- арканоид (на JS + канвас): https://gist.github.com/codedokode/9933897
- бложек — не знаю

Также, если ты слаб в знании HTML/JS у нас есть задачки:

- Путь HTML/CSS https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- Путь JS https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Задачки на SQL (и список слов которые хорошо бы знать) https://gist.github.com/codedokode/10539213

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

>>415362

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

Ну и еще для развития полезно изучить Yii2 или Symfony 2, особенно последний.

>>415348

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

Напиши подробнее, может что-нибудь придумаем.

Может быть тут яваскрипт нужен.

>>415305

Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.

>>415286

Месяц-два. У меня верстка есть кстати, правда, кривая: https://github.com/codedokode/board-markup

>>415273

Это не строчки кода, а HTML-код страницы. Посты хранятся в базе данных, и при обращении серверные скрипты берут посты из БД, подставляют в шаблон и формируют страницу которую ты видишь. Она может быть нигде не хранится, а генерируется каждй раз (а может и хранится ради ускорения отдачи ее во второй раз).

Ты слышал про динамические сайты? Это как раз сайты которые генерируют html код подставляя данные из БД в шаблон.
#460 #415489
>>415268

> явой


ява != яваскрипт

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


Можно но это глупо так как HTML и CSS удобнее хранить в HTML и CSS файлах, а не запихивать в яваскрипт.

> как при нажатии их главное окно не менялось?


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

> Нужно отдельный файл создать? скажем tovari1.html, tovari2.html


нет

Тебе надо изучить яваскрипт, (а может и HTML подучить) я вижу ты не понимаешь совсем, как он работает. Хороший учебник есть на learn.javascript.ru, а у меня если что есть задачки.
#461 #415490
Аноны, задачки проверю часика через 2-3

>>415346

Ты что-то не так делал, для localstorage никакие перезагрузки страницы не нужны.
#462 #415493
>>415488

>Где хранится файл? На сервере? Тогда я не понимаю, зачем его менять яваскриптом если можо загрузить в массив с помощью php, внести изменения и сохранить заново. А яваскрипт в браузере работает, там это гораздо неудобнее получается. Ты должен получить файл с севрера, изменить массив и аякс-запросом или POST запросом отправить на сервер, чтобы скрипт-обработчик запроса его сохранил.



Это задание мне нужно будет выложить на гитхаб pages. Насколько я знаю, там нет возможности прикрутить PHP, а покупать хостинг ради портфолио меня смущает. Но я могу ошибаться, т.к. сталкивался с json только в старом учебнике по Javascript от Head First Lab. В общем, анончик, мне нужно запилить "эмуляцию" корзины интернет-магазина без создания БД на MySQL и пыха. Такое реально сделать на JS и захостить на гитхабе?
#463 #415497
>>415488

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



Тесты не делал, научиться хочу. Можно и опенсорс, но как найти? Как вообще влиться в какой-то проект? А вообще у меня была идея пилить некий онлайн to-do list. Я даже начал на симфонии его делать, но не смог разобраться как в доктрине привязывать сразу несколько файлов (например несколько картинок) к одному таску, расстроился и дропнул. Вообще симфонии мне очень тяжёлой показалась я думаю yii2 полегче должен быть.
94 Кб, 640x457
#464 #415501
Пасаны, вопрос к вам.

Имею достаточные знания по PHP, опыт работы 3+ лет, еще не достаточно глубоко зарылся в крутые штуки, поэтому появилась идея создать небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего): серию скринкастов + вебинары (пару раз в неделю по вечерам) + задания и некоторые фишки для быстрого запоминания всей информации. Курс будет рассчитан на почти нулевые знания.

В процессе планирую описать не только саму разработку, но и в целом подход к разработке, постараюсь привить УМЕНИЯ вместе со знаниями.
Ну и после курса, если не ебланить, можно будет без проблем устроиться на джуниорскую позицию.

Планирую брать за это небольшие деньги - около 2-3к за курс.
Основное преимущество перед книгами - вебинары и задания. Да, я не научу строить фейсбук или высоконагруженную йобу, но основная цель - научить ориентироваться во всем этом и показать верное направление.
Срок обучения - 1-2 месяца.

Да, знаю про наличие всяких обучающих центров, где так же преподают PHP - но там или дорого для учащегося (около 10к), либо мне, как автору, сложно туда попасть (уже есть свои курсы по PHP), либо же проценты они берут грабительские (70% себе, 30% - автору).

Как думаешь анон, выгорит такая затея? Ты бы записался на курс?
#465 #415504
>>415501

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


Нет. Помощь опа лучше всяких ВЕБИНАРОВ.
#466 #415506
>>415501

Покупать кота в мешке, то есть платить вперед не зная за что, вряд ли кто-то согласится. Сначала продемонстрируй свое умение учить, а потом проси деньги. Можно сделать демо-урок или что-нибудь такое.
#467 #415508
>>415497

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

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

> я думаю yii2 полегче должен быть.


Он проще, но симфони праивльнее и полезнее

>>415493

Можно взять триал, если предлагают, на платном хостинге и не платить. А можно сохранять в localstorage, почеиму бы и нет. И я не представляю как ты будешь делать корзину без магазина. А товары как тда добавлять?
#468 #415510
>>415506
Да, планирую демо-уроки в виде отрезков из скринкастов, откуда можно будет понять уровень в целом + сделать первый онлайновый урок бесплатным, чтобы можно было оценить качество.
#469 #415518
>>415484
Отлично подметил, в таком случае:

>что кошек может быть несколько.


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

>идет по диагонали за 1 ход, а длина отрезка будет 1.41).


Вот это кстати паршиво, боже как несовершенен поклеточный мир. И ведь даже квака третья в своё время этим страдала, и халфа помоему, когда по диагонали ты двигался быстрее чем прямо, лел. Распрыг во все поля. надо заставить мышку двигаться зигзагом, и её никто не догонит, лел
#470 #415520
>>415518
У мыши ттх хуже чем у кошки, она по диагонали не ходит.
#471 #415523
>>415493
Бессплатные хостинги отменили что-ли? Тебе же портфолио всего-то.
#472 #415527
А что за задачу с котами и мышами вы решаете, можно поподробней?
#474 #415537
>>415271
бамп
sage #475 #415545
>>415531
ОП уже запостил своё решение?
#476 #415560
Пхпач, быдлокодю на жаваскрипте и иногда редко пересекаюсь с пхп. Так вот, есть большой текст. В нем иногда встречается строка name: blablabla и name: blablabla2. Я регулярным выражением пытался выдернуть blablabla и blablabla2, но ничего не вышло. Хотя на жс я делал подбное и все вроде работало. Халп.
#477 #415561
>>415560

>"name: blablabla\n" и "name: blablabla2\n"


fix
Надо выдернуть все от пробела после name: и до конца строки, которая \n.
#478 #415567
>>415271

> Перенес рассчет зарплаты из работника в департаменты,


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

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

> когда я в массиве указывал "1, $ma, 15", пропуская четвертую переменную, и потом при разбивке этой строки на массив через explode() и присвоении через языковую конструкцию list() переменным $rank, $class, $count, $isDirector значения массива который получился на выходе из explode() ideone ругался на это, видимо на отсутствие четвертого элемента для переменной $isDirector, можно ли так делать если в конструкторе уже стояло $isDirector = 0 по умолчанию?



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

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

> Или надо делать как я сделал тут и указывал в конце "1, $ma, 15, 0" ?)


Либо указывать 0 в конце либо переделать list чтобы он не брал 4 переменных когда их там нет.

Вместо 0 и 1 для isDirector в программировании принято использовать true и false (и вообще для всех ситуаций когда надо сказать да/нет, включено/выключено и тд). вот мануал: http://php.net/manual/ru/language.types.boolean.php

Булевых значений не было в моем учебнике ради простоты, но на самом-то деле они есть. Может потом урок сделаю.

В остальном хорошо.
#479 #415570
>>415362

В общем, насчет фреймворков, тут есть 3 выбора: Yii1, Yii2 и Symfony 2. Symfony сложнее, Yii проще. Yii2 лучше чем Yii1 так как там отказались от многих своих велосипедов и привели код ближе к современным стандартам, но по нему меньше документации (тем более на русском) и он пока менее распространен. Но очевидно, что в будущем его доля будет расти, а Yii1 перестанут развивать.

Symfony 2 гороаздо более продвинутый, там и сложный роутер, и yaml, и dependency injection, и ORM doctrine, и замечательный twig, в общем все на ООП и паттернах, но в нем сложнее и гораздо дольше разбираться.

Плюс, еще есть тема автоматизированного тестирования. Она тоже довольно интересная, в рамках ее мы будем писать юнит- и функциональные тесты (в случае файлообменника наверно в основном функциональные), которые смогут проверять что все работает правильно. Иметь тесты — очень удобно: если ты добавил какую-то фичу или поменял код, ты можешь убедиться что ничего не сломалось (без тестов проверить большой сложный продукт вряд ли реально). Мы могли бы изучить фреймворк phpUnit, может быть посмотреть codeception и может даже PhntomJS/Selenium (c помощью которых делаются браузерные тесты). Также, мы могли бы попробоать подключить к твоему проекту на гитхаб CI сервер Travis CI (он бесплатен для открытых проектов).

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

CI (Continuous integration) сервер — это штука которая умеет сама подсоединяться к репозитоию, выкачивать новый код и прогонять по нему тесты. Таикм образом, тебе не надо запускать тесты руками, и ждать пока они выполнятся — ты всегда можешь зайти на CI сервер и увидеть историю проверок. Вот пример тестов для одного open source проекта (фреймворк Slim):

https://github.com/codeguy/Slim/tree/master/tests

А вот страница на Travis где отображаютя результаты выполнения тестов:

https://travis-ci.org/codeguy/Slim

(можно кликнуть на Job и увидеть подробности выполнения теста например https://travis-ci.org/codeguy/Slim/jobs/43590635 )

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

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

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

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

Ну и еще, если ты хочешь развиваться, ты бы мог посмотреть в сторону яваскрипт и яваскрипт-библиотек и фреймворков. У меня есть задачки на эту тему (на яваскрипт-фреймворки правда пока нету, только на jQuery и jQuery UI).
#479 #415570
>>415362

В общем, насчет фреймворков, тут есть 3 выбора: Yii1, Yii2 и Symfony 2. Symfony сложнее, Yii проще. Yii2 лучше чем Yii1 так как там отказались от многих своих велосипедов и привели код ближе к современным стандартам, но по нему меньше документации (тем более на русском) и он пока менее распространен. Но очевидно, что в будущем его доля будет расти, а Yii1 перестанут развивать.

Symfony 2 гороаздо более продвинутый, там и сложный роутер, и yaml, и dependency injection, и ORM doctrine, и замечательный twig, в общем все на ООП и паттернах, но в нем сложнее и гораздо дольше разбираться.

Плюс, еще есть тема автоматизированного тестирования. Она тоже довольно интересная, в рамках ее мы будем писать юнит- и функциональные тесты (в случае файлообменника наверно в основном функциональные), которые смогут проверять что все работает правильно. Иметь тесты — очень удобно: если ты добавил какую-то фичу или поменял код, ты можешь убедиться что ничего не сломалось (без тестов проверить большой сложный продукт вряд ли реально). Мы могли бы изучить фреймворк phpUnit, может быть посмотреть codeception и может даже PhntomJS/Selenium (c помощью которых делаются браузерные тесты). Также, мы могли бы попробоать подключить к твоему проекту на гитхаб CI сервер Travis CI (он бесплатен для открытых проектов).

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

CI (Continuous integration) сервер — это штука которая умеет сама подсоединяться к репозитоию, выкачивать новый код и прогонять по нему тесты. Таикм образом, тебе не надо запускать тесты руками, и ждать пока они выполнятся — ты всегда можешь зайти на CI сервер и увидеть историю проверок. Вот пример тестов для одного open source проекта (фреймворк Slim):

https://github.com/codeguy/Slim/tree/master/tests

А вот страница на Travis где отображаютя результаты выполнения тестов:

https://travis-ci.org/codeguy/Slim

(можно кликнуть на Job и увидеть подробности выполнения теста например https://travis-ci.org/codeguy/Slim/jobs/43590635 )

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

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

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

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

Ну и еще, если ты хочешь развиваться, ты бы мог посмотреть в сторону яваскрипт и яваскрипт-библиотек и фреймворков. У меня есть задачки на эту тему (на яваскрипт-фреймворки правда пока нету, только на jQuery и jQuery UI).
#480 #415573
>>415364

Я тут пока код проверю:

Собака прыгает на 2 клеточки, а не на 1. И она умеет прыгать по диагонали. Ну и у тебя кошка не боится собаки, может сделаем чтобы она убегала если оказывается в радиусе 5×5 вокруг собаки (и не подходила к ней ближе чем на 3 клетки соответственно)? Заметь, при использовании алгоритма подсчета очков для этого требовалось бы всего лишь немного поменять схему вычисления числа очков.

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

> if (is_object($cat)) {


Чтобы проверить на null/не null лучше писать просто

if ($cat) {

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

> $list[$key]['score'] = $distance 4 + $extra 2 + count($furtherTurns) + 1;


Зачем прибавлять 1 ко всем очкам? Не понимаю.

> return " @ ";


Ты зря так делаешь. Пробелы лучше добавлять не в 10 разных местах к каждой иконке, а один раз в функции GameField#printField.

> (abs($this->x - $animal->getCoordinateX()) <= 9


9 это непонятное число. Лучше сделать константу или переменную с говорящим именем типа mouseVision. И для квадрата 9×9 тут надо указывать не 9, а 5.

> if ($this->sleepCount > 0) {


> $this->sleepCount--;


> } else {


Здесь пожно поставить return после sleepCount-- и тогда огромный блок else будет не нужен.

Аналогично в Cat#makeMove() c помощью return можно избавиться от огромного if ($target). Огромный if размером со всю функцию — это не очень хорошо.

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

Вообще, неплохо, кроме мелких багов, программа более-менее работает.
#480 #415573
>>415364

Я тут пока код проверю:

Собака прыгает на 2 клеточки, а не на 1. И она умеет прыгать по диагонали. Ну и у тебя кошка не боится собаки, может сделаем чтобы она убегала если оказывается в радиусе 5×5 вокруг собаки (и не подходила к ней ближе чем на 3 клетки соответственно)? Заметь, при использовании алгоритма подсчета очков для этого требовалось бы всего лишь немного поменять схему вычисления числа очков.

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

> if (is_object($cat)) {


Чтобы проверить на null/не null лучше писать просто

if ($cat) {

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

> $list[$key]['score'] = $distance 4 + $extra 2 + count($furtherTurns) + 1;


Зачем прибавлять 1 ко всем очкам? Не понимаю.

> return " @ ";


Ты зря так делаешь. Пробелы лучше добавлять не в 10 разных местах к каждой иконке, а один раз в функции GameField#printField.

> (abs($this->x - $animal->getCoordinateX()) <= 9


9 это непонятное число. Лучше сделать константу или переменную с говорящим именем типа mouseVision. И для квадрата 9×9 тут надо указывать не 9, а 5.

> if ($this->sleepCount > 0) {


> $this->sleepCount--;


> } else {


Здесь пожно поставить return после sleepCount-- и тогда огромный блок else будет не нужен.

Аналогично в Cat#makeMove() c помощью return можно избавиться от огромного if ($target). Огромный if размером со всю функцию — это не очень хорошо.

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

Вообще, неплохо, кроме мелких багов, программа более-менее работает.
#481 #415574
>>415366

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

>>415410

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

Расстановка пробелов — там куча ошибок, смотри внизу cnhfybws:

> PHP Notice: Use of undefined constant makeFirstLetterUppercase - assumed 'makeFirstLetterUppercase' in /home/IrTgsF/prog.php on line 20



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

Как ты их не заметил кстати? Целых 6 ошибок.

Насчет разделения на предложения, твоя регулярка не разделит предложение в начале которого идет цифра.

Так, в остальном верно.

>>415504

Молодец, правильно пишешь. Но с другой стороны, платные курсы могут иногда предложить больше чем я — например разбор задач или индивидуальные консультации. Главное убедиться, что преподаватель облаждает нужным уровнем навыков.

Ну и тому анону, сразу скажу,

> небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего)



небольшой курс не получится. Чтобы все это изучить, нужен большой курс.

>>415518

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

>>415545

ОП не постит решения

>>415560

Если твой текст это JSON, ini или что-то такое, лучше воспользоваться json_decode или парсером для нужного формата.

Алсо, положи кусок кодана PHP на ideone, так сказать трудно.

> и до конца строки, которая \n.


Под windows конец строки кодируется как \r\n может в этом проблема? Алсо, чтобы матчить конец строки можно использовать $
#481 #415574
>>415366

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

>>415410

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

Расстановка пробелов — там куча ошибок, смотри внизу cnhfybws:

> PHP Notice: Use of undefined constant makeFirstLetterUppercase - assumed 'makeFirstLetterUppercase' in /home/IrTgsF/prog.php on line 20



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

Как ты их не заметил кстати? Целых 6 ошибок.

Насчет разделения на предложения, твоя регулярка не разделит предложение в начале которого идет цифра.

Так, в остальном верно.

>>415504

Молодец, правильно пишешь. Но с другой стороны, платные курсы могут иногда предложить больше чем я — например разбор задач или индивидуальные консультации. Главное убедиться, что преподаватель облаждает нужным уровнем навыков.

Ну и тому анону, сразу скажу,

> небольшой курс по основам PHP (+ немного JS, HTML, MySQL и сопутствующего)



небольшой курс не получится. Чтобы все это изучить, нужен большой курс.

>>415518

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

>>415545

ОП не постит решения

>>415560

Если твой текст это JSON, ini или что-то такое, лучше воспользоваться json_decode или парсером для нужного формата.

Алсо, положи кусок кодана PHP на ideone, так сказать трудно.

> и до конца строки, которая \n.


Под windows конец строки кодируется как \r\n может в этом проблема? Алсо, чтобы матчить конец строки можно использовать $
#482 #415646
>>415570

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


Т.е. джуниору в любом случае придется обмазаться какой-то CMS?
#483 #415667
Оп, ты не мог бы у себя в Гисте запилить статейку про тестирование кода? Все эти юниты-интеграционные тесты и пр.
По аналогии со статейкой про DI\IoC - чтоб даже полному идиоту стало понятно, о чем речь.
Очень желательно, чтоб сразу с простыми примерами, чтоб можно было почитать и понять, как вообще всё это начать у себя в проектах использовать.
Ато начитался твоего треда, на работу ПХП-макакой устроился. Говнокодим по черному, я уже примерно начинаю понимать, зачем вообще нужны тесты, но пока неясно с чего начать.
Заранее спасибо, ты лучший!
#484 #415714
>>415646

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

>>415667

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

Насчет с чего начать — надо подумать, где тесты тебе могут помочь. Может быть например тестами можно проверять какой-то функционал который часто ломается, может код с хитрой логикой, может вы пишете АПИ и тестируете его руками. А может тебе больше подойдет скрипт который обходит страницы сайта по заранее сделанному списку и просто проверяет что там нет никаких php (а может и js) ошибок.
#485 #415715
>>411701
Аноны, я хочу учебник скачать по PHP Дайте ссыль.
Вообще планирую после НГ поменять работу, но сначал пойти на курсы по веб-дизайну(фотошопер любительского уровня) или по PHP. Подскажите с чего начать, хочу потихоньку сегодня самостоятельно начинать, а после НГ топать на курсы.
#486 #415716
есть один код:

// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать)
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Установка полей для штампа и получение высоты/ширины штампа
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Копирование изображения штампа на фотографию с помощью смещения края
// и ширины фотографии для расчета позиционирования штампа.
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// освобождение памяти
imagedestroy($im);

как сохронить это изображение, которое получаем?
#487 #415717
>>415715
может шапку для приличия почитаешь, унтерок?
#488 #415719
>>415715

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

Насчет учебника, не знаю, для начинающих есть Никсон, но уровень там конечно так себе.
#489 #415721
>>415716

imagepng или imagejpeg
#490 #415737
>>411701
Не могу вывести записи из таблицы которых еще нет в другой таблице.
Есть две таблицы:
[CODE]couriers
{
Id
Name
Lastname
......
}
staffercoriers
{
Id
IdStaffer
IdCoriers
}[/CODE]
Нужно вывести записи из таблицы couriers, только те которых еще нет в staffercoriers по полю IdCoriers.
И что бы поле IdStaffer было равно текущему юзеру. Вернее, вывести тех курьеров которых еще нет у Стафера
#491 #415773
http://ideone.com/qjxXul Жду замечаний.
sage #492 #415800
>>415773
я заметил код на рнр
#493 #415808
Аноны, я только что испытал странное ощущение, вроде бы уже использую базы данных для разных вещей, и всё работает, но вот сейчас посмотрел, на запросы на некоторых сайтах, и обнаружил непонятную для себя вещь. Вот например таблица, с названием "PC" и столбцами с данными id cpu(MHz) memory(Mb) hdd(Gb)

Для неё есть запрос который выводит те компьютеры для которых memory(Mb)=3000

select t.id, t.cpu, t.memory from PC as t
where t.memory=3000;

Я не понимаю, что за t. перед названием столбца? Я никогда так не писал запросы.

Извините если тупой вопрос.
#494 #415810
>>415808

>select t.id, t.cpu, t.memory from PC as t where t.memory=3000;



Тут t - это обозначение для колонок из таблицы PC. Нужно в случаях с джойнами, например.

select t.id, t.cpu, m.name from PC as t
join Manufactures m on t.manufacturer = m.id
#495 #415816
>>415810
Спасибо за помощь, кажется немного понял.
#496 #415831
Проверьте задачу с йодой - http://ideone.com/qIbpBI
#497 #415833
>>415831
А нет, всё очень дерьмово, можно даже не проверять...
919 Кб, Webm
sage #498 #415837
добавил обхождения
чуть кривовато(
алсо есть идея заменить кош на головы SPJ
а мышей - на головы всяких гнидо-обоссунов и прочих динамиконяш ;з
#499 #415911
>>415574

>ОП не постит решения


Лал, т.е. ты подкидываешь задачки, на которые у тебя нет своего, эталанного решения?
Окропил тебя.
#500 #415913
>>415837
Добавь ОП-а хуесоса, что бы коты пиздили его, когда приблизятся, а мыши в этот момент устраивали хоровод и содомию.
sage #501 #415916
>>415913
ок это будет мой тебе подарок на нг
#502 #415977
>>415913
Почему все неправильно пишут "чтобы"?
#503 #415979
Накидайте задачек по ООП только не в стиле кошек-мышек, попроще немного. А то у нас по пол дня бывает инета нет, хочу проводить время с пользой, спасибо.
sage #504 #415982
>>415977
шоб
#505 #416039
>>415773

Константа MOUSEVISION относится к мышке, потому логично добавить ее в класс Mouse, а не глобальной константой.

> ($distanceToCenter × 0.1);


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

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

После учебника у нас есть 2 более сложных задачи на выбор:

— попроще https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
— посложнее https://gist.github.com/codedokode/9424217

Также, у нас есть задачки на HTML/CSS, JS, SQL. На мой взгляд, неплохие.

Что из этого ты бы хотел порешать?
#506 #416042
>>416039
Ну, думаю надо двигаться от простого к сложного. Сначала первую, а потом вторую. Только вот их уже придется выкладывать на гитхаб я так понимаю, с ним я пока не знаком.
#507 #416046
>>415808

Это алиасы (синонимы), чтобы не писать длинное название таблицы, можно создать синоним. Почитай вообещ про синтаксис SELECT например тут: http://phpclub.ru/mysql/doc/select.html

>>415831

> Use of undefined constant makeFirstLetterLowercase -


Ты кавычки забыл вокруг имени функции

>>415837

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

>>415913

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

>>415979

Здесь смотрел? http://archive-ipq-co.narod.ru/l1/pasta.html

Если интернета нет, ты можешь себе на компьютер поставить php и запускать программы

Гайд: https://gist.github.com/codedokode/7054af4a03865c4cc863
Гайд по командной строке https://gist.github.com/codedokode/10539568

Также, в некоторых IDE (netbeans, eclipse, phpstorm) можно в настройках указать путь к php и тогда можно запускать программы прямо из редактора.

>>416042

Гитхаб — это хостинг git-репозиториев. git — система управления версиями, он везде сейчас используется. git позволяет тебе сохранять код и историю его изменения (ну а гитхаб позволяет все это опубликовать). Простая книга на русском:

http://git-scm.com/book/ru/v1/

Если что-то непонятно, задавай вопросы.
#507 #416046
>>415808

Это алиасы (синонимы), чтобы не писать длинное название таблицы, можно создать синоним. Почитай вообещ про синтаксис SELECT например тут: http://phpclub.ru/mysql/doc/select.html

>>415831

> Use of undefined constant makeFirstLetterLowercase -


Ты кавычки забыл вокруг имени функции

>>415837

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

>>415913

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

>>415979

Здесь смотрел? http://archive-ipq-co.narod.ru/l1/pasta.html

Если интернета нет, ты можешь себе на компьютер поставить php и запускать программы

Гайд: https://gist.github.com/codedokode/7054af4a03865c4cc863
Гайд по командной строке https://gist.github.com/codedokode/10539568

Также, в некоторых IDE (netbeans, eclipse, phpstorm) можно в настройках указать путь к php и тогда можно запускать программы прямо из редактора.

>>416042

Гитхаб — это хостинг git-репозиториев. git — система управления версиями, он везде сейчас используется. git позволяет тебе сохранять код и историю его изменения (ну а гитхаб позволяет все это опубликовать). Простая книга на русском:

http://git-scm.com/book/ru/v1/

Если что-то непонятно, задавай вопросы.
#508 #416050
>>416046
Я те все сделал кроме кошек-мышек, я себе денвер установил, просто без инета нет доступа к поиску задач
#509 #416053
>>416050

А про вектор и 4 департамента тоже сделал? А что кошки -мышки не хочешь? Просто там более простые задачи будут повторением задачи про вектор.
#510 #416054
>>416053
Про вектор сделал, я тут позавчера выкладывал решение где-то выше. Про мышек начал, создал класс доски, создал абстрактный класс животных, наследовал кошек и мышек от него, добавил иконки, создал функция для создания кошек и мышек, добавил функцию отображения доски дальше нет пока идей как заставить их искать друг друга на доске и менять своё положение.
#511 #416056
>>416054

Менять положение — это менять координаты.

Насчет выбора хода, есть такая идея:

- создаем список всех возможных ходов
- ставим каждому очки (например для мышки чем дальше клеточка от кошек тем больше за нее очков дается, также надо убавлять очки за ход в угол, так как там меньше выходов)
- выбираем ход с наибольшим числом очков
#512 #416137
>>416056
Ну пока что у меня вот такие наброски http://ideone.com/dlBhtG , дальше пока в раздумьях
sage #513 #416179
убрать углы ёпт
#514 #416263
Доделал задачу с йодой - http://ideone.com/qIbpBI, научил пхп писать по-русски числа - http://ideone.com/MTKrvx, а ещё нашаманил простой калькулятор - http://ideone.com/HFfDLb
!xnn2uE3AU. #515 #416278
Аноны, кто-то хотел в опен сурсе поучаствовать? Я тут наткнулся на проект codeception (про который в том числе пишу сейчас урок), а там багов незакрытых — немерено: https://github.com/Codeception/Codeception/issues

Также, нет плагина для интеграции Codeception со фреймворком Slim.

Ну и еще вариант, посмотреть проекты отсюда: https://github.com/trending?l=php&since=monthly — может кому из них нужны исправления.

В общем, анон, пока просто посмотреть можешь.
!xnn2uE3AU. #516 #416312
Аноны, задачки гляну чуть позже, некогда пока.

Кто-то >>415667 просил урок про тесты. Держите, первая версия: https://gist.github.com/codedokode/a455bde7d0748c0a351a

Если есть идеи что можно потестировать, ссылки, статьи, замечания — пишите.
#517 #416313
>>411701

<form enctype="multipart/form-data" method="post">
<input type="file" min="1" accept="image/jpeg,image/jpg" max="999999" name="pictures[]" multiple="true" />

<input type="submit" name="submit" />
</form>

<?php
include 'config.php';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "D:\\photo\\$name");
}
}
?>

почему не загружает файлы больше мегабайта? настройки пхп.ини смотрел, .htaccess с параметрами добавлял
#518 #416314
перекатываться уже надо
85 Кб, 899x615
#519 #416334
>>416313
php.ini точно тот, вот скрин
#520 #416360
Не пойму, почему
http://ideone.com/1V2xyD
Не даёт такого же результата, как
http://ideone.com/ci4F8A
#521 #416373
Оп, я попробовал переделать задачу с гамбургерами.
http://jsbin.com/qaxeturizi/1/edit?js,console
Правда я сомневаюсь, что правильно понял идею с прототипами.
#522 #416459
>>416137

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

А в чем-то сложность? Или ты в принципе представляешь что писать дальеш?

Вот пока советы и замечания по коду.

> public function __construct($n, $cats, $mouses)


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

> FillTheGroundPls


Именга функций принято писать с маленькой буквы, а писать Pls, Me, The не нужно, так как они не несут никакой информации.

> foreach ($z->ground as $v) {


Тут переменной z не передано

> public $x;


> public $y;


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

Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.

Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.

> public $icon = ' @ ';


Пробелы лучше добавлять в месте вывода, а не тут.

> global $z;


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

> function getNewAnimals


Эту функцию, конечно, надо будет переделать и вообще убрать наверно.
#522 #416459
>>416137

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

А в чем-то сложность? Или ты в принципе представляешь что писать дальеш?

Вот пока советы и замечания по коду.

> public function __construct($n, $cats, $mouses)


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

> FillTheGroundPls


Именга функций принято писать с маленькой буквы, а писать Pls, Me, The не нужно, так как они не несут никакой информации.

> foreach ($z->ground as $v) {


Тут переменной z не передано

> public $x;


> public $y;


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

Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.

Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.

> public $icon = ' @ ';


Пробелы лучше добавлять в месте вывода, а не тут.

> global $z;


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

> function getNewAnimals


Эту функцию, конечно, надо будет переделать и вообще убрать наверно.
#523 #416468
>>416263

йода

Все верно.

Числа прописью

> if (($number%100-$number%10) != 10) {


Вот это мне пришлось разгадывать. Лучше бы написать просто

if ($x < 10 || $x > 19)

Ну и number % 10 там раза четыре встречается, лучше вынести в переменную.

> \t$i = floor($number/$grade);


> $result .= $spelling[$grade × $i].' ';


Умножение лучше перенести в верхнюю строчку

В строках 59-66 (разбор числа на группы по 3) мне кажется можно объединить if/elsief в просто if.

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

Калькулятор

В else/elseif скобки ставятся так:

} else {
} elseif (...) {

А так, все верно.

>>416313

А что пишет? Какое сообщение об ошибке? Чему $error равно?

Тут пишут есть еще 2 параметра, влияющих: http://stackoverflow.com/a/3263496

>>416314

Перекатимся. Ничего страшного от того, что мы день повисим на второй странице, не будет.

>>416360

Первый код неприавльный так как ты там строки через одну пропускаешь.
#523 #416468
>>416263

йода

Все верно.

Числа прописью

> if (($number%100-$number%10) != 10) {


Вот это мне пришлось разгадывать. Лучше бы написать просто

if ($x < 10 || $x > 19)

Ну и number % 10 там раза четыре встречается, лучше вынести в переменную.

> \t$i = floor($number/$grade);


> $result .= $spelling[$grade × $i].' ';


Умножение лучше перенести в верхнюю строчку

В строках 59-66 (разбор числа на группы по 3) мне кажется можно объединить if/elsief в просто if.

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

Калькулятор

В else/elseif скобки ставятся так:

} else {
} elseif (...) {

А так, все верно.

>>416313

А что пишет? Какое сообщение об ошибке? Чему $error равно?

Тут пишут есть еще 2 параметра, влияющих: http://stackoverflow.com/a/3263496

>>416314

Перекатимся. Ничего страшного от того, что мы день повисим на второй странице, не будет.

>>416360

Первый код неприавльный так как ты там строки через одну пропускаешь.
#524 #416487
>>416373

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

// конструктор
function A() { this.x = y; ... }

// добавляем методы
A.prototype.someMethod = function () { ... } ;

Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.

Теперь изучим как сделать наследование. Унаследуем класс B от A. Тут все сложнее так как нам надо сделать, чтобы в B.prototype был пустой объект с прототипом = A.prototype.

В Es5 для этого есть Object.create. В ES3 делается хак с использованием функции, погугли или почитай тут http://learn.javascript.ru/prototype .

Вот как выглядит «класс» с наследоанием:

function B () {
A.call(this, ...); // вызваем констурктор предка
....
}

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B; // исправляем св-во constructor

B.prototype.someMethod = function () {
// вызов метода предка
A.prototype.someMethod.call(this, ...);
...
};

Вот как-то так. При таком наследовании корректно работает instanceof:

var b = new B( );
b instanceof B; // true
b instanceof A; // true
b instanceof Object; true
Object.getPrototypeOf(b); // B.prototype
Object.getPrototypeOf(B.prototype); // A.prototype

Если не брать наследоване то по моему все просто и лаконично. И сравни со своим кодом где все нагорожено и усложнено.

Так что почитай где-нибудь про прототипы, хотя бы на learn.javascript.ru: http://javascript.ru/tutorial/object/inheritance

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#The_Class (англ)

https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

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

В ES6 будет синтаксис для классов, который будет настраивать те же самые прототипы: http://habrahabr.ru/post/175371/

Пока ES6 не пришел, пишутся всякие библиотеки для облегчения создания классов:

http://jsclass.jcoglan.com/classes.html
http://dkraczkowski.github.io/js.class/
http://microjs.com/#class (десятки их)

Но ты пока научись вручную прототипы настраивать.
#524 #416487
>>416373

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

// конструктор
function A() { this.x = y; ... }

// добавляем методы
A.prototype.someMethod = function () { ... } ;

Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.

Теперь изучим как сделать наследование. Унаследуем класс B от A. Тут все сложнее так как нам надо сделать, чтобы в B.prototype был пустой объект с прототипом = A.prototype.

В Es5 для этого есть Object.create. В ES3 делается хак с использованием функции, погугли или почитай тут http://learn.javascript.ru/prototype .

Вот как выглядит «класс» с наследоанием:

function B () {
A.call(this, ...); // вызваем констурктор предка
....
}

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B; // исправляем св-во constructor

B.prototype.someMethod = function () {
// вызов метода предка
A.prototype.someMethod.call(this, ...);
...
};

Вот как-то так. При таком наследовании корректно работает instanceof:

var b = new B( );
b instanceof B; // true
b instanceof A; // true
b instanceof Object; true
Object.getPrototypeOf(b); // B.prototype
Object.getPrototypeOf(B.prototype); // A.prototype

Если не брать наследоване то по моему все просто и лаконично. И сравни со своим кодом где все нагорожено и усложнено.

Так что почитай где-нибудь про прототипы, хотя бы на learn.javascript.ru: http://javascript.ru/tutorial/object/inheritance

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#The_Class (англ)

https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

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

В ES6 будет синтаксис для классов, который будет настраивать те же самые прототипы: http://habrahabr.ru/post/175371/

Пока ES6 не пришел, пишутся всякие библиотеки для облегчения создания классов:

http://jsclass.jcoglan.com/classes.html
http://dkraczkowski.github.io/js.class/
http://microjs.com/#class (десятки их)

Но ты пока научись вручную прототипы настраивать.
#525 #416492
>>416487

>Ты наверно заметил, что это все выглядит костыльно и громоздко. Это потому, что предполагалось что в JS будет прототипное программирование, то есть объекты будет создаваться не на основе классов, а на основе друг друга. Потому классы туда и не завезли.


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

>Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале.


Просто я его впихнул в функцию. Так-то можно сразу написать что-то вроде:
function Hamburger() {}
Hamburger.prototype = this;

>Заметь, что свойство prototype — это просто такое свойство у функции, это не прототип. Но когда ты создаешь объект через new то прототип нового объекта берется из свойства prototype функции-конструктора.


Это я понял.

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

>Вот как выглядит «класс» с наследоанием:


Мне вот очень не нравится, что код, относящийся к классу B, располагается после его описания. Ну правда костыль на костыле. Я совсем никакого удовольствия не получаю от написания кода.
#526 #416494
>>416487

>Прототип настраивается не каждый раз при создании объекта, а один раз в самом начале.


Вот и все отличие: http://jsbin.com/robidupaqa/1/edit?js,console
В моем случае же Creator - и есть прототип для всех будущих гамбургеров. Или я вообще не понимаю о чем речь.
#527 #416497
>>416492

> Так-то можно сразу написать что-то вроде:


> function Hamburger() {}


> Hamburger.prototype = this;


Если честно, выглядит как бессмыслица. Почитай-ка сначала статьи по ссылкам.

> Ну и вообще я просто другой паттерн выбрал.


Не, ты нагородил лишнего и переусложнил все. «Создатель» тут лишний, для этого есть уже функция-конструктор.

> что код, относящийся к классу B, располагается после его описания.


B — это не класс, а функция-конструктор. Вполне логично, что методы идут после конструктора, а не наоборот. По ркайней мере код выглядит аккуратнее, как набор методов, а не все засунуто в одну огромную функцию и свалено в кучу.

По крайней мере этот паттерн с прототипами общепринятый.
#528 #416498
>>416494

> Или я вообще не понимаю


Я тоже не понимаю. Например, зачем нам функция creator когда в явкрипте уже предусмотрена функция- конструктор. Ты по моему изобретаешь велосипед на квадратных колесах и делаешь то, что уже сделано.
#529 #416500
>>416497

>B — это не класс, а функция-конструктор.


Оу. Я почему-то вбил себе в голову, что эта функция и является вариантом класса.
sage #530 #416501
>>411701

>Клуб копрофилов PHP


Ебать. Опять параша на нулевой.
#531 #416503
>>416500

Ну вот и замечательною Настоящих классов в JS до Es6 нет. Мы просто называем конструктор + методы «классом» по привычке и потому, что так короче.

А так, объекты в JS создаются либо функцией-конструктором (причем любая функция — это конструктор, какого-то разделения нет), либо на основе другого объекта с помощью Object.create
#532 #416520
>>416503
Попытка три: http://jsbin.com/poqoqohuco/1/edit?js,console
Сейчас мои представления такие: через class.prototype. объявляются методы класса, в конструкторе делаем поля, а через class. - константы. Но, опять же, чую я, что не все так.
#534 #416524
>>416521

Вот баг: http://jsbin.com/hejuhusame/1/edit?js,console — 2 разных гамбургера стоят одинаково.

> if (this.PROPS[type] === undefined) {


Есть оператор in

> Hamburger.TYPE_BIG = "big";


> Hamburger.prototype.PROPS = {


> big: {


По идее надо бы использовать константу, а не дублировать 2 раза слово big.

> this.adds[additiveName] = true;


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

Массив — это список чего-то.
Словарь — это соответствие строка -> что-то.

Очевидно список добавок уместнее сделать массивом. Тут добавок немного и никаких оптимизаций не требуется.
#535 #416527
>>416521

Вообще, если подумать, список добавок — это множество ( структура данных, которая хранит неупорядоченный список неповторябщихся значений ) , но в JS нет множеств, а ближайшее, что есть — это массив.
#536 #416534
>>416524

>По идее надо бы использовать константу, а не дублировать 2 раза слово big.


Тогда придется переписать все в стиле
Hamburger.TYPE_BIG = "big";
Hamburger.prototype.PROPS[this.TYPE_BIG] = {};
Hamburger.TYPE_SMALL = "small";
Hamburger.prototype.PROPS[this.TYPE_SMALL] = {};
Мне показалось, что синтаксис с {} нагляднее.

>Очевидно список добавок уместнее сделать массивом.


Да, действительно. Жаль, кстати, что множеств нет.

>Вот баг: http://jsbin.com/hejuhusame/1/edit?js,console — 2 разных гамбургера стоят одинаково.


Своим же словам не следую, лол.

>в конструкторе делаем поля


Все, что объявлено в class.prototype - общее. Статичные члены, так сказать.

http://jsbin.com/fivayulucu/1/edit?js,console
#537 #416535
>>416527

>но в JS нет множеств, а ближайшее, что есть — это массив.


Я вот сейчас подумал, а ведь работу множеств проще реализовать через объекты, а не через массивы.
#538 #416543
Я не понимаю логики этого выражения While($row = $STH->fetch())
#539 #416550
>>416535

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

>>416543

while — это цикл. Он выполняется пока условие в скобках истинно (я поясню ниже что это значит). Как только условие становится ложно то цикл завершается.

Что значит ложно/истинно? Ложно = false, истинно = true. Если в скобках находится значение другого типа (число, строка, массив, объект) то оно приводится к булеву типу по правилам описанным тут: http://php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting

Если кратно:

Пустые значения null, 0, "", "0", array() приводятся к false
Все остальное приводится к true.

То есть к примеру цикл

while (1) { echo "asdasd"; }

выполняется вечно, так как 1 приводится к true/ а цикл

while (0) { ... }

не выполнится ни разу так как 0 приравнивается к false.

Теперь вернемся к твоему коду. Что делает $row = $STH->fetch() ?

Она выбиарет из базы очередную строку в виде массива либо false если данные закончились. Это значение копируется в переменную $row и возвращается дальше, циклу while для проверки.

Если данные еще есть, то в row запишется массив, который для while равносилен true и цикл продолжается.

Если данные закончились то в row запишется false и цикл завершится.

Вот алгоритм работы:

1. Выбрать строку из БД (или false если данные закончились)
2. Сохранить ее в $row
3. Приводится ли она к false? Если да, то выходим.
4. Иначе, выполняем тело цикла
5. Переходим к п.1

Задавай уточняющие вопрсоы если что-то непонятно.
#539 #416550
>>416535

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

>>416543

while — это цикл. Он выполняется пока условие в скобках истинно (я поясню ниже что это значит). Как только условие становится ложно то цикл завершается.

Что значит ложно/истинно? Ложно = false, истинно = true. Если в скобках находится значение другого типа (число, строка, массив, объект) то оно приводится к булеву типу по правилам описанным тут: http://php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting

Если кратно:

Пустые значения null, 0, "", "0", array() приводятся к false
Все остальное приводится к true.

То есть к примеру цикл

while (1) { echo "asdasd"; }

выполняется вечно, так как 1 приводится к true/ а цикл

while (0) { ... }

не выполнится ни разу так как 0 приравнивается к false.

Теперь вернемся к твоему коду. Что делает $row = $STH->fetch() ?

Она выбиарет из базы очередную строку в виде массива либо false если данные закончились. Это значение копируется в переменную $row и возвращается дальше, циклу while для проверки.

Если данные еще есть, то в row запишется массив, который для while равносилен true и цикл продолжается.

Если данные закончились то в row запишется false и цикл завершится.

Вот алгоритм работы:

1. Выбрать строку из БД (или false если данные закончились)
2. Сохранить ее в $row
3. Приводится ли она к false? Если да, то выходим.
4. Иначе, выполняем тело цикла
5. Переходим к п.1

Задавай уточняющие вопрсоы если что-то непонятно.
#540 #416552
>>416543

Аналогично работает if, потому ты можешь писать вещи типа

if ($x) { .. }

Условие выполнится если в $x непустое значение, то есть не false, null, 0, "0", "", array()
#541 #416553
>>416534

> Тогда придется переписать все в стиле


Да, если делать правильно, то так.

> Своим же словам не следую, лол.


Чтобы не допускать эту ошибку, создавай все свойства-объекты в конструкторе.

> Hamburger.prototype.add = function(additiveName) {


Нет защиты от двойной добавки

> for (var i=0; i<this.adds.length; i++) {


> if (this.adds === additiveName) {


Это надо вынгести в функцию например с названием indexOf. Кстати, в ES5 у массивов уже есть метод indexOf: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

Ты еще куда-то потерял начинку.

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

Тем не менее, примерно так обычно и пишут ООП-код на JS.

Вот пример создания «класса» в фреймворке Backbone: https://github.com/jashkenas/backbone/blob/master/backbone.js#L274

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

Заметь, что некоторые свойства начинаются с подчеркивания. Так как в JS нет private/protected то так обозначают притворимся-что-они-приватные свойства.
#541 #416553
>>416534

> Тогда придется переписать все в стиле


Да, если делать правильно, то так.

> Своим же словам не следую, лол.


Чтобы не допускать эту ошибку, создавай все свойства-объекты в конструкторе.

> Hamburger.prototype.add = function(additiveName) {


Нет защиты от двойной добавки

> for (var i=0; i<this.adds.length; i++) {


> if (this.adds === additiveName) {


Это надо вынгести в функцию например с названием indexOf. Кстати, в ES5 у массивов уже есть метод indexOf: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

Ты еще куда-то потерял начинку.

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

Тем не менее, примерно так обычно и пишут ООП-код на JS.

Вот пример создания «класса» в фреймворке Backbone: https://github.com/jashkenas/backbone/blob/master/backbone.js#L274

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

Заметь, что некоторые свойства начинаются с подчеркивания. Так как в JS нет private/protected то так обозначают притворимся-что-они-приватные свойства.
#542 #416594
>>416553

>Нет защиты от двойной добавки


Потому что там был до этого true/false и дважды присвоить true - все равно, что ничего. Забыл переделать, да.

>Ты еще куда-то потерял начинку.


Какую начинку?
http://jsbin.com/jamaxuhofa/1/edit?js,console

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


А я то думал это я так плох.

>Вот пример создания «класса» в фреймворке Backbone


>_.extend


Это у них там свой экстенд что ли? А _ - это что-то типо глобальной области видимости, объект-солянка из методов?
#543 #416599
>>416594

>Какую начинку?


Я потерял не начинку, а приправку и майонез. Ну да неважно, это три минуты делов.
#544 #416618
>>416550
Это я понял, я другого не пойму: почему $row нужно приравнивать к fetch в условии цикла, а в его теле (как тут http://ideone.com/1V2xyD) нельзя? По моему должен быть один и тот же результат, но это не так.
#545 #416661
оп, а как из формы записать файл в несколько директорий сразу? записывает только в ту, что указываю первой.
#546 #416722
Опять тред не создаёте. Оп, как проверить тип файла (музыка, видео), чтобы плеер прикрутить? Ненагуглил нихрена вообще.
#547 #416732
>>416722
Хотя проверил сейчас, ргхост для фейкового mp3 плеер создает. Может просто проверить разширение на canPlayType() и все?
#548 #416733
И еще. Я меняю имена у файлов, а на ссылке с загрузкой пишу имя в тег download, но в IE не работает это. Вроде оп писал способ, но я не могу найти где.
#549 #416738
>>416733
Разобрался. Все равно спасибо опу, я б сам не догодался даже что гуглить.
#550 #416797
>>414201
>>413443

>Лучше бы хранить массивом, мне кажется, так:


Все исправил: http://jsfiddle.net/zLqejjsx/

>Я советую исплоьзовать console.log, так по моему проще писать и код можно в инспекторе (Ctrl + Shift + J) на любой странице запустить.


Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.

Вариация задачи №12: http://jsfiddle.net/g34y347c/

>>413445

>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:


>Попробуй так записать код.


http://ideone.com/DZiCBU
#551 #416820
>>411701
Установил lamp на убунте, apach 403 бросает, что делать? Права 755

Forbidden

You don't have permission to access / on this server.
sage #552 #416826
>>411701
Эй, мочерня. Тут параша опять протекла. Удалите уже этот тред на хуй, воняет на всю нулевую сука.
#553 #416830
>>416820
Как ставил?
#554 #416834
>>416830
sudo tasksel lamp-server
#555 #416841
>>416834
Права 755 на что у тебя?
#556 #416843
>>416841
/www/ и все внутри доступно для записи и чтения
#557 #416847
>>416843
Есть ли в /www/ файл index.html? Если нет, создай и попробуй снова постучаться на локалхост
#558 #416848
>>416843
Алсо, посмотри логи апачевские же, что-то типа /var/log/apache2/
#559 #416849
>>416847
Есть конечно же.
>>416848
http://ideone.com/O6xmpX
!xnn2uE3AU. #561 #416860
>>416594

> А _ - это что-то типо глобальной области видимости


Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями: http://underscorejs.org/ (русский: http://underscorejs.ru/). Соответсвенно extend это функция из нее.

Сейчас есть lodash — это типа улучшенная версия underscore.

Жду версию с начинкой и приправой.

>>416618

Можно и в теле, но автор решил что так короче.

> По моему должен быть один и тот же результат, но это не так.


По моему нет. По моему ты не понимаешь либо как работает fetch либо как работает цикл. В примере

while ($s->fetch()) {
$row = $s->fetch( );
....
}

1-я, 3-я, 5-я, 7-я и т.д. считанные из базы строки никуда не попадают (так как они считываются внутри условия и никуда не сохраняются), а в $row попадают только 2-я, 4-я, 6-я и т.д. строки. То есть через одну. Посмотри на код внимательно сам.

>>416661

Так как код ты не показал, я ничего подсказать не могу.

>>416722

Создадим, как капча заработает.

> Оп, как проверить тип файла (музыка, видео), чтобы плеер прикрутить? Ненагуглил нихрена вообще.


Библиотекой getId3:

http://getid3.sourceforge.net/
http://www.getid3.org/demo/

(она доступна в композере: https://packagist.org/search/?q=getid3 )
!xnn2uE3AU. #561 #416860
>>416594

> А _ - это что-то типо глобальной области видимости


Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями: http://underscorejs.org/ (русский: http://underscorejs.ru/). Соответсвенно extend это функция из нее.

Сейчас есть lodash — это типа улучшенная версия underscore.

Жду версию с начинкой и приправой.

>>416618

Можно и в теле, но автор решил что так короче.

> По моему должен быть один и тот же результат, но это не так.


По моему нет. По моему ты не понимаешь либо как работает fetch либо как работает цикл. В примере

while ($s->fetch()) {
$row = $s->fetch( );
....
}

1-я, 3-я, 5-я, 7-я и т.д. считанные из базы строки никуда не попадают (так как они считываются внутри условия и никуда не сохраняются), а в $row попадают только 2-я, 4-я, 6-я и т.д. строки. То есть через одну. Посмотри на код внимательно сам.

>>416661

Так как код ты не показал, я ничего подсказать не могу.

>>416722

Создадим, как капча заработает.

> Оп, как проверить тип файла (музыка, видео), чтобы плеер прикрутить? Ненагуглил нихрена вообще.


Библиотекой getId3:

http://getid3.sourceforge.net/
http://www.getid3.org/demo/

(она доступна в композере: https://packagist.org/search/?q=getid3 )
!xnn2uE3AU. #562 #416867

>>416732

В canPlayType передается не расширение, а MIME-тип (вроде audio/mpeg). MIME можно получить у getId3. Вот примеры использования canPlayType:

https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics#canPlayType (англ)
Информация о поддерживаемых форматах https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)

Разные браузеры поддерживают разные форматы, и даже в пределах одного формата может быть разница (например браузер может поддерживать H.264 с VP8 и не поддерживать VP9 или поддерживать аудио внутри видеофайла в MP3 но не поддерживать AAC). Также, что касается видео, то например «avi» или «mkv» или «webm» — это лишь формат контейнера, а внутри может быть видео и аудиопотоки, закодированные разными кодеками и по расширению вообще сказать нельзя, поддерживается оно или нет. Аудио внутри видеофайла может быть в MP3, AAC или еще чем-то.

Заметь, что браузер может вернуть "probably", а может "maybe" (когда возможность зависи не только от браузера, а например от наличия кодеков в системе или от использованных в файле кодеков):

> probably: if the specified type appears to be playable.


> maybe: if it's impossible to tell whether the type is playable without playing it.


> The empty string: if the specified type definitely cannot be played



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

Тут http://www.w3schools.com/tags/av_met_canplaytype.asp есть примеры, где видно что кроме типа файла передаются использованные для видео кодеки:

> video/mp4; codecs="avc1.4D401E, mp4a.40.2"


> video/webm; codecs="vp8.0, vorbis"



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

>>416733

Это работает только в новых браузерах так как появилось в HTML5. Надо добавлять заголовок

Content-Disposition: attachment

Для скачивания
!xnn2uE3AU. #562 #416867

>>416732

В canPlayType передается не расширение, а MIME-тип (вроде audio/mpeg). MIME можно получить у getId3. Вот примеры использования canPlayType:

https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics#canPlayType (англ)
Информация о поддерживаемых форматах https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)

Разные браузеры поддерживают разные форматы, и даже в пределах одного формата может быть разница (например браузер может поддерживать H.264 с VP8 и не поддерживать VP9 или поддерживать аудио внутри видеофайла в MP3 но не поддерживать AAC). Также, что касается видео, то например «avi» или «mkv» или «webm» — это лишь формат контейнера, а внутри может быть видео и аудиопотоки, закодированные разными кодеками и по расширению вообще сказать нельзя, поддерживается оно или нет. Аудио внутри видеофайла может быть в MP3, AAC или еще чем-то.

Заметь, что браузер может вернуть "probably", а может "maybe" (когда возможность зависи не только от браузера, а например от наличия кодеков в системе или от использованных в файле кодеков):

> probably: if the specified type appears to be playable.


> maybe: if it's impossible to tell whether the type is playable without playing it.


> The empty string: if the specified type definitely cannot be played



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

Тут http://www.w3schools.com/tags/av_met_canplaytype.asp есть примеры, где видно что кроме типа файла передаются использованные для видео кодеки:

> video/mp4; codecs="avc1.4D401E, mp4a.40.2"


> video/webm; codecs="vp8.0, vorbis"



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

>>416733

Это работает только в новых браузерах так как появилось в HTML5. Надо добавлять заголовок

Content-Disposition: attachment

Для скачивания
!xnn2uE3AU. #563 #416868

>>416797

> Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.


Если ты программируешь на яваскрипте у тебя наверняка постоянно открыта консоль, так что проблемы нет (если не открыта, нажми Ctrl + Shift + J). А я к тому же ленивый и не люблю закрывать постоянно выскакивающие окна (попробуй работать с консолью и тоже станешь ленивым).

> Все исправил


А города скопировать забыл:

> ReferenceError: cities is not defined @ http://fiddle.jshell.net/_display/:37



Также, вместо if (a.population > b.population) { ... можно писать просто return a.population - b.population, хотя это немного менее понятно, но зато короче.

Так, сделано верно.

> Вариация задачи №12:


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

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

> return console.log("неверный размер");


Абсолютно непраивльно. Ты пишешь в консоль сообщение об ошибке. А что, если кто-то вызывает твою функцию из кода, как он проверит что ошибки нет? Никак. Надо не выводить сообщение кооторое никто не прочтет, а выкидыват исключение.

Не исплоьзуй console.log внутри Gamburger.

>>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:


>>Попробуй так записать код.


Прекрасно. Теперь решение простое и лаконичное.

>>416820

Что в логах? Написано же белым по черному:

> [Sun Dec 14 19:16:52.456755 2014] [core:error] [pid 30907] (13)Permission denied: [client 127.0.0.1:34364] AH00035: access to /index.php denied (filesystem path '/home/bully/www') because search permissions are missing on a component of the path



На папке нет разрешения на поиск в ней файлов (это опция 'x' в правах, для файлов она дает разрешение на выполнение, а для папок разрешение на просмотр списка файлов). Надо дать не 755, а 777.
!xnn2uE3AU. #563 #416868

>>416797

> Я использовал это чтобы был виден результат сразу в песочнице. Понял что не стоит.


Если ты программируешь на яваскрипте у тебя наверняка постоянно открыта консоль, так что проблемы нет (если не открыта, нажми Ctrl + Shift + J). А я к тому же ленивый и не люблю закрывать постоянно выскакивающие окна (попробуй работать с консолью и тоже станешь ленивым).

> Все исправил


А города скопировать забыл:

> ReferenceError: cities is not defined @ http://fiddle.jshell.net/_display/:37



Также, вместо if (a.population > b.population) { ... можно писать просто return a.population - b.population, хотя это немного менее понятно, но зато короче.

Так, сделано верно.

> Вариация задачи №12:


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

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

> return console.log("неверный размер");


Абсолютно непраивльно. Ты пишешь в консоль сообщение об ошибке. А что, если кто-то вызывает твою функцию из кода, как он проверит что ошибки нет? Никак. Надо не выводить сообщение кооторое никто не прочтет, а выкидыват исключение.

Не исплоьзуй console.log внутри Gamburger.

>>Я тут подумал, а ведь мы можем вместо громоздкого if использовать min:


>>Попробуй так записать код.


Прекрасно. Теперь решение простое и лаконичное.

>>416820

Что в логах? Написано же белым по черному:

> [Sun Dec 14 19:16:52.456755 2014] [core:error] [pid 30907] (13)Permission denied: [client 127.0.0.1:34364] AH00035: access to /index.php denied (filesystem path '/home/bully/www') because search permissions are missing on a component of the path



На папке нет разрешения на поиск в ней файлов (это опция 'x' в правах, для файлов она дает разрешение на выполнение, а для папок разрешение на просмотр списка файлов). Надо дать не 755, а 777.
#564 #416874
>>416868

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


Ты прав, она открыта постоянно.

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


Понял, перепилю.
#565 #416882
>>416867

>Content-Disposition: attachment


>Для скачивания


Так и делал. Перенес на хост, теперь вместо загрузки просто открывает файл браузером. В скрипте сначала:
header("Content-Disposition: attachment; filename=\"{$fileInfo['fileName']}\"");
А потом header("Location: foo/bar");
#566 #416895
>>416882
Использовал readfile() - помогло
#567 #416903
>>416882

> А потом header("Location: foo/bar");


Ну так это редирект и браузер делает новый запрос

Плюс ты делаешь ошибку используя filename, эта опция не поддерживает utf-8 и ты не можешь использовать русские буквы (если в каком-то браузере работает — это ничего не значит, так как в других может не работать)

>>416895

> Использовал readfile() - помогло


Это плохая идея так как ты грузишь php в память ради скачивания файла. Апач умеет добавлять заголовки черех htaccess, положенный в нужную папку:

Header add Content-Disposition attachment
!xnn2uE3AU. #568 #416972
Приглашаю всех в новый тред: >>416970

Это тред закрыт.
Тред утонул или удален.
Это копия, сохраненная 17 января 2015 года.

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

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