Этого треда уже нет.
Это копия, сохраненная 28 ноября 2014 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
228 Кб, 420x279
63 Кб, 800x2000
693 Кб, 636x1078
Клуб любителей продолжать изучать PHP 35 !xnn2uE3AU. # OP #399059 В конец треда | Веб
Добрый день. У вас дома тепло? Тогда мы идем жить к вам

В этом ИТТ треде мы изучаем PHP (и некоторые другие языки для веба вроде JS), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то хочет изучить этот язык, кто-то хочет просто размять мозги и заняться чем-то полезным.

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

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

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

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

Есть задачки по основам JS и DOM, хорошие, многие их с ходу решить не могут, попроси, дадим ссылку. Есть задачка на 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
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
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 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.

В общем, давайте начинать уже!
55 Кб, 500x644
435 Кб, 600x900
В интернете обнаружены фото от которых !xnn2uE3AU. #2 #399062
Куда? Побежал уже писать код? Стой, прочти сначала этот пост.

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

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

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

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

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

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

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

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

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

скобки в for и if/else ставятся так (египетские скобки):

[code]
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
[/code]

у определений функций и классов так:

[code]
function bakeCookies(...)
{
// ...
}
[/code]

Официальные ссылки

В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
55 Кб, 500x644
435 Кб, 600x900
В интернете обнаружены фото от которых !xnn2uE3AU. #2 #399062
Куда? Побежал уже писать код? Стой, прочти сначала этот пост.

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

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

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

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

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

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

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

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

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

скобки в for и if/else ставятся так (египетские скобки):

[code]
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
[/code]

у определений функций и классов так:

[code]
function bakeCookies(...)
{
// ...
}
[/code]

Официальные ссылки

В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
#3 #399065
ОП, у меня кажись температура, я плохо себя чувствую.
#4 #399066
>>399063
http://jsbin.com/cufegazoje/1/edit?html,css,js,output - посомтри, у меня просто не начинает новую игру. А вообще, какой this будет у меня там? Внутри этой функции которую передаю как аргумент в showWindow
#5 #399068
Я ебусь в глаза или у вас нигде не указана такая охуенная вещь как http://sql-ex.ru/ ?
#6 #399069
>>399066

> А вообще, какой this будет у меня там?



http://learn.javascript.ru/this тут описаны возмождные варианты.

Зависит от того как ты ее вызываешь. В твоем случае внутри функции this будет указывать на глобальный объект (window) а не куда ты задумал. Почитай учебник.
#7 #399071
>>399065

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

>>399068

Интересный сайт, но сделан он конечно в традициях веб 1.0: обязательная регистрация, тесный дизайн без полей и промежутков, как-то не очень дужелюбно. Сами задачи не видел так что оценить не могу.
#8 #399072
>>399069
Так мне в showWindow надо все-таки this поля передавать?
#9 #399077
>>399069
Ну, смотри, мне же в этой функции, которую передаю как аргумент надо вызвать метод поля для начала новой игры. Так как его вызвать если там моего This нету?
#10 #399080
>>399077

Ты наверно 7-ю задачку (про функцию bind) не решал. Либо через bind, либо через дополнительную переменную.

http://learn.javascript.ru/bind

Это вообще-то основы яваскрипт.
#11 #399081
>>399059
Няшки, подкиньте задачек по JS пазязя для 9-месячнойлол веб-макаки.
#12 #399082
>>399081
Добавлю, прочитал 1/2 Флэнагана и 1/2 Кантора, задачки все что встречались решал. Но Кантора дропнул, не по мне читать с интернетов, может перечитаю с kindle pdf-ку. Флэнаган в бумаге есть.
#13 #399087
>>399081

Держи

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

уверен, что прочитав такие замечательные книги ты задачки будешь щелкать как семечки.
#14 #399102
>>399087
Спасибо, на первый взгляд не сложно.
Заметил очепятку

>Аналог из loash

#15 #399131
Котаны, вот установил я apache & php на свою убунту, а дальше то что делать с эим? Как узнать что они дружны и как запустить апач и пхп?
#16 #399144
>>399131
Насчет пыхи не помню но апач тащемта в бубунте искаропки
а вообше с такими вопросами иди нахуй
#17 #399145
>>399102

Спасибо за внимательность.

>>399131

> Как узнать что они дружны


Создай файл 1.php c текстом

<?php phpinfo( );

И положи его в веб-директорию (скорее всего /var/www/htdocs но не уверен, посмотри в httpd.conf)

Открой браузером на Убунте страницу http://localhost/1.php и если все ок то увидишь огромную синюю таблицу. Если не ок то что-то другое.

Вот справка, хотя там больше про Windows: https://gist.github.com/codedokode/10774100
#18 #399149
>>399145
Немного поправлю тебя

На убунте по если зайти на http://localhost/ будет дефолтная страничка апача и там указано куда класть файлы. По умолчанию /var/www/html
#19 #399150
>>399131

> как запустить апач и пхп


Скорее всего они установлены как сервисы, то есть запускаются при старте системы. Точнее, запускается Апач, PHP специально запускать не требуется.

Вручную остановить/запустить Апач можно командами

sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/apache2 reload

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

Команда sudo нужна чтобы скрипт выполнялся с правами администратора. Она спросит твой пароль.

/etc/init.d — это папка, где лежат скрипты управления разными службами. Там же например будет скрипт для запуска/остановки mysqld

Если у тебя установлена программа service (или upstart) то можно писать просто:

sudo service apache2 restart

Как добавить/убрать службу из автозапуска?

В Линуксе это делается (делалось раньше?) созданием символических ссылок в /etc/rc.d на те скрипты из /etc/init.d которые должны запускаться. Естественно, делать лучше не руками, а командой update-rc.d. Я не помню, как ей пользоваться, потому дам ссылку на малопонятный мануал: http://manpages.ylsoftware.com/ru/update-rc.d.8.html

Там упоминается понятие «уровень запуска» или runlevel. Это число от 0 до 5 которое показывает в какое состояние надо перевести систему:

0 — выключить
3 — загрузить без включения графического интерфейса
5 — загрузить систему полностью

Соответственно ты можешь задавать на каких runlevel служба должна запускаться или останавливаться

https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F

Вот еще информация на английском про управление сервисами в Убунту: http://askubuntu.com/questions/19320/how-to-enable-or-disable-services

Думаю, это все тебе не понадобится, но понимать как работают сервисы в линукс, полезно.
#19 #399150
>>399131

> как запустить апач и пхп


Скорее всего они установлены как сервисы, то есть запускаются при старте системы. Точнее, запускается Апач, PHP специально запускать не требуется.

Вручную остановить/запустить Апач можно командами

sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/apache2 reload

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

Команда sudo нужна чтобы скрипт выполнялся с правами администратора. Она спросит твой пароль.

/etc/init.d — это папка, где лежат скрипты управления разными службами. Там же например будет скрипт для запуска/остановки mysqld

Если у тебя установлена программа service (или upstart) то можно писать просто:

sudo service apache2 restart

Как добавить/убрать службу из автозапуска?

В Линуксе это делается (делалось раньше?) созданием символических ссылок в /etc/rc.d на те скрипты из /etc/init.d которые должны запускаться. Естественно, делать лучше не руками, а командой update-rc.d. Я не помню, как ей пользоваться, потому дам ссылку на малопонятный мануал: http://manpages.ylsoftware.com/ru/update-rc.d.8.html

Там упоминается понятие «уровень запуска» или runlevel. Это число от 0 до 5 которое показывает в какое состояние надо перевести систему:

0 — выключить
3 — загрузить без включения графического интерфейса
5 — загрузить систему полностью

Соответственно ты можешь задавать на каких runlevel служба должна запускаться или останавливаться

https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F

Вот еще информация на английском про управление сервисами в Убунту: http://askubuntu.com/questions/19320/how-to-enable-or-disable-services

Думаю, это все тебе не понадобится, но понимать как работают сервисы в линукс, полезно.
#20 #399151
>>399144

Нет ты.
#21 #399152
>>399149

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

Спасибо за пояснение.
#22 #399172
Аноны, нужно прикрутить карусель jQuery. Нашел то, что нужно http://www.bkosborne.com/jquery-feature-carousel, но надо сделать так, что бы при перезагрузке страницы картинки не двигались вообще. Т.е. не автопереключение слайдов (его я отключил), а чтобы вообще ничего не двигалось, пока не нажму стрелку (в примере левый и правый слайд автоматом разъезжаются в стороны от центрального при перезагрузке, вот это я и хочу убрать)
sage #23 #399180
ваще ахуеннный веб язек, все че хочешь можно.
sage #24 #399182
>>399180
Макака.
#25 #399201
>>399172

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

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

Для начала пару задач, которые я увидел в соседних разделах:

> Я на собеседовании не смог сделать алгоритм поиска двух наибольших элементов в массиве.


Собственно, задача, дан массив чисел, найдите 2 наибольших. Решать можно на JS или PHP, кому что роднее.

> Напишите алгоритм сортировки


Дам массив чисел, отсортируйте по возрастанию без использования стандартной функции sort( ) и подобных. на JS/PHP.

Вот еще задачки с собеседований, на JS/HTML: http://company.yandex.ru/job/vacancies/devint_kinopoisk.xml

Кто хочет может порешать, а я соответственно могу проверить или дать подсказку. Готовых решений в нашем треде ОП никогда не дает, если кто тут новенький, но зато дает подсказки.
#26 #399213
>>399201

>Готовых решений в нашем треде ОП никогда не дает


И это делает его лучшим педагогом, что я видел.
«задачи с собеседований» #27 #399214
>>399172
Не понял что куда у тебя разъезжается
>>399201
Задачки на решить/не решить или на решить наиболее оптимально?

Вот вам кое что из моего:

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

Пример входных данных:
10 10
20 10
20 15

Пример выходных данных:
5

2. Баланс весов
Дана последовательность целых чисел.
Считая их массами имеющихся в наличии предметов, определить, можно ли все эти предметы положить на весы так, чтобы весы находились в равновесии. Вывести вариант расположения.
Определить, можно ли из них отобрать какое-то количество предметов с суммарным весом 100 (вывести yes или no, в зависимости от результата).

Пример входных данных:
2 3 4 5 6

Пример выходных данных:
2 3 5 - 4 6
no
«задачи с собеседований» #27 #399214
>>399172
Не понял что куда у тебя разъезжается
>>399201
Задачки на решить/не решить или на решить наиболее оптимально?

Вот вам кое что из моего:

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

Пример входных данных:
10 10
20 10
20 15

Пример выходных данных:
5

2. Баланс весов
Дана последовательность целых чисел.
Считая их массами имеющихся в наличии предметов, определить, можно ли все эти предметы положить на весы так, чтобы весы находились в равновесии. Вывести вариант расположения.
Определить, можно ли из них отобрать какое-то количество предметов с суммарным весом 100 (вывести yes или no, в зависимости от результата).

Пример входных данных:
2 3 4 5 6

Пример выходных данных:
2 3 5 - 4 6
no
#28 #399219
>>399201

>Собственно, задача, дан массив чисел, найдите 2 наибольших.


За один проход мудило.
#29 #399238
>>399214

>1. Минимальное расстояние


>http://ideone.com/e.js/HXomn1

#30 #399243
>>399201
>>399219

> Собственно, задача, дан массив чисел, найдите 2 наибольших.


http://ideone.com/lth6pd
#31 #399295
>>399214

>2. Баланс весов


http://ideone.com/YCOMqF
Пока только так смог. Как делать перестановки я не придумал, потому выдрал функцию из какого-то урока по паскалю.
#32 #399297
>>399295
Вроде бы придумал как сделать правильнее, напишу (наверное) завтра.
#33 #399303
>>399295
>>399297
Таки переделал.
Вот так я тут сам с собой болтаю.
1044 Кб, 2560x1920
Воннаби #34 #399340
>>399214
Вот первую с утра смог осилить
http://ideone.com/sFGwHN
#35 #399394
Оп, скажи, как правильно делать взаимодействие фронтенда и бэкэнда - с фреймворком и без?
Когда мне нужно реализовать взаимодействие с бэкэндом в кол-ве больше одной функции, я начинаю клепать класс роутинга, в нем ищу в post переменную action, которая соответствует методу в втором классе, например Actions. Проверяю наличие метода $action в классе Actions, если есть - вызываю его. Если метод должен принимать параметры, я делаю массив в Actions соответствия действия и ожидаемых параметров и из роутинга проверяю. Примерно так:

http://ideone.com/DH8dUH

Это тру или как?

В случае использования фреймворков я так понимаю будет доп. проверка isAjax по обычным маршрутам со сменой лэйаута на чистые данные. Верно?
#36 #399397
Братишки, помогите со следующей задачей.
Есть текстовые файлы со следующей простыней:
[code]date time\tmm/min.\tSumm\tCurrent\tTrand\tLevel1\tLevel2\tLevel3\tFreq1\tFreq2\tFreq3
18/11/2013 00:00:00\t0.02\t101.34\t101.34\t 3\t100.65\t103.12\t100.24\t1538.178\t1545.639\t1539.689
18/11/2013 00:01:00\t0.00\t101.34\t101.34\t 3\t100.61\t103.08\t100.33\t1538.035\t1545.455\t1540.033
18/11/2013 00:02:00\t0.02\t101.36\t101.36\t 3\t100.62\t103.15\t100.32\t1538.090\t1545.729\t1539.992
18/11/2013 00:03:00\t-0.02\t101.34\t101.34\t 3\t100.59\t103.11\t100.30\t1537.977\t1545.587\t1539.927
18/11/2013 00:04:00\t-0.03\t101.31\t101.31\t 3\t100.53\t103.22\t100.19\t1537.723\t1546.019\t1539.477
18/11/2013 00:05:00\t0.07\t101.38\t101.38\t 3\t100.73\t103.19\t100.24\t1538.498\t1545.879\t1539.679
18/11/2013 00:06:00\t-0.09\t101.29\t101.29\t 3\t100.61\t103.09\t100.18\t1538.023\t1545.517\t1539.442
18/11/2013 00:07:00\t-0.01\t101.28\t101.28\t 3\t100.52\t103.10\t100.21\t1537.693\t1545.534\t1539.567
18/11/2013 00:08:00\t0.02\t101.30\t101.30\t 3\t100.60\t103.08\t100.21\t1538.009\t1545.471\t1539.558
18/11/2013 00:09:00\t0.09\t101.39\t101.39\t 3\t100.69\t103.18\t100.31\t1538.363\t1545.856\t1539.963
18/11/2013 00:10:00\t-0.07\t101.32\t101.32\t 3\t100.61\t103.08\t100.28\t1538.028\t1545.453\t1539.853
18/11/2013 00:11:00\t-0.01\t101.31\t101.31\t 3\t100.61\t103.09\t100.24\t1538.032\t1545.504\t1539.674[/code]

Подскажите, как дергать нужные данные для последующего экспорта в эскуэль?
#37 #399399
>>399397
Хуйня какая-то произошла:
date time\tmm/min.\tSumm\tCurrent\tTrand\tLevel1\tLevel2\tLevel3\tFreq1\tFreq2\tFreq3
18/11/2013 00:00:00\t0.02\t101.34\t101.34\t 3\t100.65\t103.12\t100.24\t1538.178\t1545.639\t1539.689
18/11/2013 00:01:00\t0.00\t101.34\t101.34\t 3\t100.61\t103.08\t100.33\t1538.035\t1545.455\t1540.033
18/11/2013 00:02:00\t0.02\t101.36\t101.36\t 3\t100.62\t103.15\t100.32\t1538.090\t1545.729\t1539.992
18/11/2013 00:03:00\t-0.02\t101.34\t101.34\t 3\t100.59\t103.11\t100.30\t1537.977\t1545.587\t1539.927
18/11/2013 00:04:00\t-0.03\t101.31\t101.31\t 3\t100.53\t103.22\t100.19\t1537.723\t1546.019\t1539.477
18/11/2013 00:05:00\t0.07\t101.38\t101.38\t 3\t100.73\t103.19\t100.24\t1538.498\t1545.879\t1539.679
18/11/2013 00:06:00\t-0.09\t101.29\t101.29\t 3\t100.61\t103.09\t100.18\t1538.023\t1545.517\t1539.442
18/11/2013 00:07:00\t-0.01\t101.28\t101.28\t 3\t100.52\t103.10\t100.21\t1537.693\t1545.534\t1539.567
18/11/2013 00:08:00\t0.02\t101.30\t101.30\t 3\t100.60\t103.08\t100.21\t1538.009\t1545.471\t1539.558
18/11/2013 00:09:00\t0.09\t101.39\t101.39\t 3\t100.69\t103.18\t100.31\t1538.363\t1545.856\t1539.963
18/11/2013 00:10:00\t-0.07\t101.32\t101.32\t 3\t100.61\t103.08\t100.28\t1538.028\t1545.453\t1539.853
18/11/2013 00:11:00\t-0.01\t101.31\t101.31\t 3\t100.61\t103.09\t100.24\t1538.032\t1545.504\t1539.674
#38 #399415
Настройка LAMP - стека на сервере какой-нибудь компании отличается принципиально от установки апача, пхп и мускуля дома на рабочей пекарне будь то винда или линукс?
#39 #399416
>>399214

> на решить/не решить или на решить наиболее оптимально?


Я думаю, для начала решить, а потом можно оптимизировать. Ну то есть задачу на максимальные 2 числа я бы наверно решил через sort/array_unique/array_slice но потом наверняка попросили бы сделать то же самое со сложностью O(N).

Твои задачки выглядят тоже интересно. Про точки — для начала я бы попробовал решить ее через O(N^2), полным попарным сравнением.

>>399219

Не ругайся.
#40 #399420
Блеа, аноны, слушайте мне нужно вызывать функцию каждую минуту. У меня типа на php бот для кое чего. Я знаю, это пиздец как тупо, но работать он должен постоянно.
сделал
ini_set('max_execution_time', 3000000000000);
Ну, сколько-то нулей можно убрать, да. Но вот у меня вопрос: можно как-то это более изящно сделать? Чтобы время исполнения скрипта было бесконечным. И еще вопрос надежно ли это? У меня стойкое впечатление, что нет. Типа вот ввожу я адрес скрипта в адресной строке. Нажимаю "Перейти". Нажимаю на "прервать загрузку" и ухожу. И что, все? Работать будет? А что на счет всяких мелких технических деталей, которые могут перейти в крупные проблемы? Как же мне сделать скрипт, работающий столько времени без сбоев (если сам алгоритм выполнения задачи идеален)?
#41 #399422
>>399238

Выглядит верно, хотя тут сложность O(N^2) — а мне кажется задача имеет и более оптимальное решение. Иначе выглядит слишком просто.

Но я с ходу придумать алгоритм не могу, а гуглить не хочу.

>>399243

Ужасное оформление, тяжело читать. Например, не надо писать if/esle в одну строчку. И названия переменным лучше давать более читаемые.

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

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

Вместо вложенного if лучше было использовать elseif.
#42 #399426
>>399295

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

> for ($q = 0; $q < $i; $q++) {


> $another_new_digits[] = $digits[$q];


Используй array_slice вместо цикла

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

>>399340

И у тебя оформлено так себе. Я бы вынес вот это

$dots[$i]

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

Ну и ты тоже сделал полным перебором со сложностью O (N^2), а вдруг можно сделать быстрее?
#43 #399443
>>399394

Что за странный код, явно какой-то велосипед.

> взаимодействие фронтенда и бэкэнда


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

> Когда мне нужно реализовать взаимодействие с бэкэндом в кол-ве больше одной функции, я начинаю клепать класс роутинга, в нем ищу в post переменную action, которая соответствует методу в втором классе, например Actions



Роутер не должен лезть в POST, все нужные данные ему должны передаваться явно. Давай посмотрим, как работает роутер в Симфони 2:

http://symfony.com/doc/current/components/routing/introduction.html (на наглийском но код-то ты прочесть можешь)

$context = new RequestContext($_SERVER['REQUEST_URI']);
$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match('/foo');

Как ты видишь, мы явно передаем в $matches коллекцию правил роутинга и $context который хранит информацию о параметрах запроса.

Ну и плохо что ты используешь статические методы, это делает код спутанным, и ты теряешь почти все преимущества ООП, у меня есть заметка на эту тему: https://gist.github.com/codedokode/e1d31a31b37d5f635057

> Это тру или как?


Это странный непправльно спроектированный велосипед, имхо.

> В случае использования фреймворков я так понимаю будет доп. проверка isAjax по обычным маршрутам со сменой лэйаута на чистые данные. Верно?



Я бы сделал обычные действия, которые возвращают JSON или что требуется. Зачем менять какие-то лейауты? Или тебе надо чтобы одну страницу можно было запросить через аякс и напрямую? Не очень понял. Напиши подробнее.
#43 #399443
>>399394

Что за странный код, явно какой-то велосипед.

> взаимодействие фронтенда и бэкэнда


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

> Когда мне нужно реализовать взаимодействие с бэкэндом в кол-ве больше одной функции, я начинаю клепать класс роутинга, в нем ищу в post переменную action, которая соответствует методу в втором классе, например Actions



Роутер не должен лезть в POST, все нужные данные ему должны передаваться явно. Давай посмотрим, как работает роутер в Симфони 2:

http://symfony.com/doc/current/components/routing/introduction.html (на наглийском но код-то ты прочесть можешь)

$context = new RequestContext($_SERVER['REQUEST_URI']);
$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match('/foo');

Как ты видишь, мы явно передаем в $matches коллекцию правил роутинга и $context который хранит информацию о параметрах запроса.

Ну и плохо что ты используешь статические методы, это делает код спутанным, и ты теряешь почти все преимущества ООП, у меня есть заметка на эту тему: https://gist.github.com/codedokode/e1d31a31b37d5f635057

> Это тру или как?


Это странный непправльно спроектированный велосипед, имхо.

> В случае использования фреймворков я так понимаю будет доп. проверка isAjax по обычным маршрутам со сменой лэйаута на чистые данные. Верно?



Я бы сделал обычные действия, которые возвращают JSON или что требуется. Зачем менять какие-то лейауты? Или тебе надо чтобы одну страницу можно было запросить через аякс и напрямую? Не очень понял. Напиши подробнее.
#44 #399446
>>399422

>Например, не надо писать if/esle в одну строчку.


Я подумал, что в таком коротком случае это приемлемо. Впредь буду внимательнее. Первые три попытки писать на php, в конце то концов.

>Вместо вложенного if лучше было использовать elseif.


Кк, запомню.

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


Вставить проверку на count($array)>1. Ну было бы глупо искать два максимальных элемента в массиве из одного, да?

>Выглядит верно, хотя тут сложность O(N^2)


А как вообще найти максимальный элемент, не перебрав весь массив?
>>399426

>У тебя пока не проверяются все возможные варианты.


Я сначала сделал через перестановки, но у меня там был миллиард одинаковых вариантов ответа. А как исключить их я не придумал. Т.е. 10 12 16 = 11 13 14, 12 10 16 = 11 13 14, etc.
#45 #399450
>>399397

Зачем дергать? Этот формат напоминает CSV и ты можешь этот файл напрямую в ексель импортировать.

>>399415

Отличается тем что там линукс. А так, наверно, больше ничем.

>>399420

> можно как-то это более изящно сделать? Чтобы время исполнения скрипта было бесконечным.


Можно почитать официальный мануал php по этому параметру, там написано.

> И еще вопрос надежно ли это? У меня стойкое впечатление, что нет. Типа вот ввожу я адрес скрипта в адресной строке. Нажимаю "Перейти". Нажимаю на "прервать загрузку" и ухожу. И что, все? Работать будет?



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

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

Это правильный способ решить твою задачу. Он требует знаний командной строки и линукса. Не умеешь — есть какие-то внешние сервисы которые будут заходить на твой сайт каждую минуту и дергать скрипт извне, но это костыли и они наверно платные.
#46 #399452
>>399446

> Ну было бы глупо искать два максимальных элемента в массиве из одного, да?


Ну неизвестно что будет дано тебе на вход. Массив из нуля элементов тоже массив.

> А как вообще найти максимальный элемент, не перебрав весь массив?


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

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


Есть сочетания https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D0%B5

И наверняка есть алгоритмы их генерации.
#47 #399456
>>399446

Еще

?> в конце программы писать не надо.

if оформляется как на картинке к посту: >>399062

Пробелы стоит ставить единообразно, а то у тебя

> array(10,15,18


> ($i = 2;



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

Переменные в PHP принято писать кемелКейсом, то есть $helloWorld

Вот примеры кода из стандарта PSR: http://www.php-fig.org/psr/psr-2/
#48 #399457
>>399452

>Есть сочетания


Да я уже что-то придумал. Сейчас буду делать.
#49 #399458
>>399452

>Есть сочетания


А еще они здесь не нужны.
#50 #399459
>>399450

> php может завершить скрипт принудительно.


Но у меня не завершает!

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


Ок, ладно, можно устроить, я думаю.
#51 #399466
>>399459

Это еще хуже. Ты можешь запустить несколько процессов и они там будут вечно работать мешая друг другу. Надо ставить защиту от повторного запуска.
#52 #399469
>>399466

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


Нет, не могу. Скрипт ну слишком простой, много процессов там просто не нужно. Ну, а защиту я поставлю, благо она делается в 3 строчки.
#53 #399471
>>399469

Ну в случае с кроном все запускается само после загрузки. И перезапускается, а твой скрипт упадет и не узнаешь.
#54 #399476
>>399469

>Скрипт ну слишком простой, много процессов там просто не нужно


Сегодня у тебя один скрипт, завтра сто
#55 #399478
>>399426

>У тебя пока не проверяются все возможные варианты.


Переделал. http://ideone.com/luiL5A
Моя первая попытка дружить с рекурсией, лол.
#56 #399485
Аноны, посоветуйте бесплатный хостинг и домен. Хочу иметь свой сайтик, куда буду кидать свои наработки. Пока что прошёл только первый уровень уроков из оп-поста, но немного могу и в хтмл.
#57 #399486
>>399485
dot tk
byethost
pdd yandex.ru (почта для домена + пока еще годный DNS)
#58 #399490
>>399485

https://pages.github.com/ если тебе php не нужен.
#59 #399492
>>399213

Спасибо на добром слове.
#60 #399518
Анончики, нужна помощь. Решаю следующую задачу: Есть массив из 20 элементов, каждый элемент = 1или0. Нужно вывести длину длиннейшей последовательности из нулей и индекс первого нуля в последовательности. Вот мой код - http://ideone.com/eGrtZH
На бумаге он должен работать, но в реале не работает, почему не понимаю.
#61 #399522
>>399518
http://ideone.com/oW8Vyp

foreach ($array as $value) {
if ($array{$value} == 0) {

вот тут у тебя карчое фейл. если ты хочешь обращаться к элементам напрямую через имя массива ющай for ($i=... {
$array[$i]...
и так далее и надеюсь ты понял

а когда ты используешь foreach, он у тебя итак перебирает все элементы массива и в каждой итерации цикла в переменную $value заносит следующий элемент массива $array, понимаешь?
Если ты при этом пишешь $array($value) то обращаешься к элементу массива с индексом равным значению текущего в цикле элемента массива. Звучит непонятно? Я бы и сам не понял наверное, если бы не сам это говно сформулировал, а кто-то другой мне пытался бы его объяснить.
#62 #399523
>>399518
Так ты там не последовательности считаешь, а просто нули.
#63 #399533
>>399518

>foreach ($array as $index => $value) {


>\tif ($value == 0) {


>\t\t$leng++;


>\t\tif ($leng > $memoryLeng) { //если длина окажется больше длины в памяти - сохраняем новую длину


>\t\t\t$memoryLeng=$leng;


>\t\t\t$memoryNumber=$index+1-$memoryLeng;


Ты, наверное, имел ввиду что-то такое, да?
#64 #399557
>>399522
>>399523
>>399533
Спасибо, разобрался.
#65 #399562
>>399523
Нет я считаю последовательность нулей, ещё раз код посмотри
#66 #399565
>>399562
Я посмотрел уже, да, ты просто ошибся с циклом и индексом.
#67 #399599
ОП я тут пытался макет вёрстки залить на гитхаб руководствуясь этой ссылкой https://pages.github.com/

Вроде что то даже и залилось. https://github.com/tokotun/tokotun.github.io

Но, судя по инструкции, залитая страничка, в конечном итоге, должна появится по адресу http://tokotun.github.io. Да вот только, вместо моей поделки светится заветная цифра 404.
Что я мог пропустить?

Алсо, что то меня от первого взгляда на гит немножко демотивировало. Не дружелюбный он какой-то.
Хотя скорее всего от того что, не люблю командные строки. Не очень видны действия в них.
#68 #399601
>>399486
бро, я далёк от программирования. Смогу ли я держать сайт на хостинге яндекса?
#69 #399605
>>399601
у яндекса нет хостинга. он же тебе написал: byethost
#70 #399607
ОП, ты пользуешься юнит-тестированием? Я вот учил его, всякие туториалы и консоль позадрачивал, но пока ни одной работы с ним не попадалось, а самому его тесты кажутся слишком очевидными. Можешь привести пример, когда юнит-тест оказался полезен?
#71 #399610
>>399599

На мой взгляд, все верно. Возможно, какой-то баг произошел на гитхабе? Попробуй добавить файл index.html в репозиторий, вдруг заработает?

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

> от первого взгляда на гит немножко демотивировало. Не дружелюбный он какой-то.


Наверно, ты плохо его знаешь. Почитай потом книгу про git: http://git-scm.com/book/ru/v1 - может станет понятнее. Гит сейчас везде исплоьзуется, так что тебе пригодится.

> Хотя скорее всего от того что, не люблю командные строки. Не очень видны действия в них.


Ну не сказал бы, мне кажется наоборот, в графических программах все скрыто от пользователя, а тут ты напрямую пишешь команды. Хотя для новичка может и непривычно. Но если ты хочешь стать программистом то привыкай.
#72 #399615
>>399601
Как уже сказали выше, у яндекса хостинга нет. Давай попробуем проще.
Иди на dot.tk и выбирай незанятое имя домена. Регистрацию не завершай, просто проверь, что домен не занят (т.е., нажать "Регистрация" нужно, а форму заполнять не нужно). Потом регистрируйся на hostinger.ru. После активации аккаунта тебе предложат создать хостинг (выбирай бесплатный) и спросят про тип домена. Выбери Домен (а не субдомен) и вводи тот домен, что ты подобрал на dot.tk. Когда заполнишь и отправишь форму, на почту придёт письмо, в котором будут вот такие строки (не копируй отсюда, смотри в письме!):

> Имя Сервера 1: ns1.hostinger.ru 31.170.163.241


> Имя Сервера 2: ns2.hostinger.ru 31.220.23.1


> Имя Сервера 3: ns3.hostinger.ru 173.192.183.247


> Имя Сервера 4: ns4.hostinger.ru 31.170.164.249


Возвращайся к dot.tk. На странице регистрации выбирай "Используйте DNS", вкладка "Ваш собственный DNS" и вводи любые два ns-сервера из списка в письме. Выбирай "год" в поле "Длина регистрации" (через год попросят продлить, это бесплатно), вводи капчу, тыкай ссылку "Адрес электронной почты" и заканчивай регистрацию аккаунта (если на один из серверов DNS будет ругаться, вставь какой-нибудь другой из списка). На почту придёт письмо с активацией, после активации подожди 5-10 минут, после этого по адресу твоего нового сайта уже будет отображаться заглушка hostinger (если браузер будет ругаться на неизвестный домен, может потребоваться подождать до суток, пока закэшированные NS-записи обновятся у тебя и твоего провайдера). Дальше сам разберёшься.

Из-за того, что .tk бесплатный, у него пожизненные проблемы с индексацией в поисковых системах. Возможно, имеет смысл купить платный .ru у реселлеров примерно за ~100-150 рублей в год.
#73 #399617
Поясните за новую строку. Есть какой-то универсальный символ, позволяющий сделать новую строку во всех вариантах отображения? Если я просто напишу:

>line 1


>line 2


То в браузере они будут без переноса, если поставлю тег <br>, то он отобразится там, где не нужно его отображать - в консоли, например.
#74 #399620
А зачем тебе одновременно и в браузере и в консоли? В любом случае, можешь сделать header('Content-Type: text/plain'); в начале скрипта и использовать \n при выводе. В качестве альтернативы можно оборачивать вывод в <pre> если isset($_SERVER["SERVER_PROTOCOL"]).
#75 #399622
>>399620
Ну типичная ситуация - если я в админке некоторых CMS ставлю пробел клавишей ENTER, то при выводе в браузер перенос не отображается, а <br> ставить неудобно.
#76 #399713
>>399617

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

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
#77 #399714
>>399622

Это проблема этих CMS, что они криво сделаны. Ничего не поделать. Напиши жалобу разработчикам.
#78 #399728
Если я выучу PHP я стану крутым?
#79 #399742
>>399728
Если очень хорошо выучишь.
#80 #399757
>>399478

Код у тебя по прежнему тяжеловато читать. Например, лучше делать нормальные названия функций, не perm, а например generatePermutations( ). Имя функции начинается с глагола: сделатьЧтоТо( )

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

Не надо делать бессмысленные названия переменных. Что за $array, $newArray, $q? Это ничего не значит. Нужно давать осмысленные названия, например

$weights, $permutation, $numbers

зачем ты используешь референсы тут? Они не нужны.

> &$array,


> &$newArray



$array никак не меняется в функции.

> for ($q = 0; $q+$k < count($array); $q++) {


Можно сделать проще: for ($q = $k + 1; ....) ....

> if ($k < (count($array) - 1)) {


Должно быть $q + $k. Видишь, из-за того что ты пишешь запутанный код, ты сам делаешь ошибки.

Алсо вот тут сомнительное место:

> if ($k < (count($array) - 1)) {


> perm($k + $q + 1, $array, $newArray);


> }


> checkArray($newArray, $array);



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

> foreach ($arrayOld as $index => $element) {


> if (!(isset($array[$index]))) {


Тут можно использовать array_diff_key

Зря ты не читал мой (или любой другой) урок по массивам.

Вместо чехарды с unset, лучше бы использовать массив как стек и снимать верхушку через array_pop().

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

$input = array(1, 2, 3, 4);
foreach (generatePermutations($input) as $perm) {
echo implode(",", $perm)."\n";
}

Заметь, что я не передаю в функцию значение $i и $newArray — я использую аргументы по умолчанию.

Соответственно, мы получим универсальную функцию генерации размещений, никак не привязанную к checkArray. Я советую тебе попробовать сделать через генераторы: http://habrahabr.ru/post/189796/

Алсо, ты ставишь закрывающую скобку в if c лишним отступом:

if ( ) {
...
} // вот эту вот
#80 #399757
>>399478

Код у тебя по прежнему тяжеловато читать. Например, лучше делать нормальные названия функций, не perm, а например generatePermutations( ). Имя функции начинается с глагола: сделатьЧтоТо( )

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

Не надо делать бессмысленные названия переменных. Что за $array, $newArray, $q? Это ничего не значит. Нужно давать осмысленные названия, например

$weights, $permutation, $numbers

зачем ты используешь референсы тут? Они не нужны.

> &$array,


> &$newArray



$array никак не меняется в функции.

> for ($q = 0; $q+$k < count($array); $q++) {


Можно сделать проще: for ($q = $k + 1; ....) ....

> if ($k < (count($array) - 1)) {


Должно быть $q + $k. Видишь, из-за того что ты пишешь запутанный код, ты сам делаешь ошибки.

Алсо вот тут сомнительное место:

> if ($k < (count($array) - 1)) {


> perm($k + $q + 1, $array, $newArray);


> }


> checkArray($newArray, $array);



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

> foreach ($arrayOld as $index => $element) {


> if (!(isset($array[$index]))) {


Тут можно использовать array_diff_key

Зря ты не читал мой (или любой другой) урок по массивам.

Вместо чехарды с unset, лучше бы использовать массив как стек и снимать верхушку через array_pop().

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

$input = array(1, 2, 3, 4);
foreach (generatePermutations($input) as $perm) {
echo implode(",", $perm)."\n";
}

Заметь, что я не передаю в функцию значение $i и $newArray — я использую аргументы по умолчанию.

Соответственно, мы получим универсальную функцию генерации размещений, никак не привязанную к checkArray. Я советую тебе попробовать сделать через генераторы: http://habrahabr.ru/post/189796/

Алсо, ты ставишь закрывающую скобку в if c лишним отступом:

if ( ) {
...
} // вот эту вот
#81 #399759
>>399607
Бамп вопросу.
#82 #399768
>>399478

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

>>399485

У нас кстати и задания на HTML/CSS есть, если надо. 12 простых заданий на понимание CSS (ну как простые? с небольшими подвохами разумеется) и верстка макета.

>>399599

Я еще кое-что вспомнил, у них написано если у тебя e-mail (под которым ты регистрировался на гитхабе) не подтвержден то сайт может не работать. Проверь, что все подтверждено.
#83 #399769
Я тут накатал целую пасту на тему тестов в итоге. Очевидные тесты делать нет смысла.

>>399607

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

1) юнит-тесты — тестируют только один модуль (класс или функицю). не взаимодействия с другими модулями и внешним миром (сеть, файлы, база данных). Хорошо подходят для кода с сложной логикой, например:

- функцию проверки телефона на правильность удобно тестировать на наборе правильных/неприавльных телефонов
- класс парсинга markdown-разметки удобно тестировать на образцах текста

Плохо подходят для кода без логики или активно взаимодействующего с нешним миром, например контроллер в MVC приложении.

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

Однажды я переделывал API для кое-чего, и поначалу тестировал его из командной строки, отправляя запросы программой curl (не php-библиотекой а именно утилитой, не путай). Скоро мне это стало надоедать, и я написал тесты на php, которые проходились по всем функциям API, вызвали их и проверяли что все верно. Это сэкономило время.

Другой пример: разработчики браузеров Firefox и Chrome используют тестовые html-страницы и проверяют, что движок отображает их в соответствие с образцом.

3) функциональные/приемочные тесты — тестируют приложение со стороны пользователя. То есть для веб-приложений это тесты которые имитируют браузер и заходят на странички, заполняют формы, жмут кнопки.

Ими удобно тестировать сайт целиком: регистрация, логин, и другие функции.

Есть 2 вида эмуляторов браузеров: неполноценные, пониамющий только html код (не понимают CSS и JS, не выполняют яваскрипт, не могут проверить видим ли элемент на странице с использвоанием css) и полноценные (имитируют настоящий браузер как PhantomJS либо встраиваются в настоящий браузер и контролируют его как Selenium).

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

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

4) регрессионное тестирование

Когда ты обнаружил баг (например: не удается зарегистрироваться с именем из русских букв) ты можешь написать тест проверябщий этот баг, это назвается регрессионный тест — он гарантирует что второй раз ты такой баг не пропустишь

5) тестирование производительности

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

Осторожно! В тестировании есть фанатики, они могут тебе сказать что ты обязан покрыть 100% кода юнит-тестами и тестировать даже функции из 2 строк, не стоит им верить.

В PHP для тестирования есть 2 популярных фреймворка, phpunit и codeception.

Запускать тесты руками быстро надоедает, потому обычно используют CI сервер — сервер, который сам выкачивает новый код из репозитория, прогоняет тесты и шлет письма/сообщения в чат если что-то не так, а также покаызвает красивые отчеты. Вот пример такого отчета c Travis CI для фреймворка Yii2: https://travis-ci.org/yiisoft/yii2

Вот примеры реальных проектов на PHP с тестами:

Slim: https://github.com/codeguy/Slim
Yii2: https://github.com/yiisoft/yii2

Подробнее про тестирование на практике можно прочесть на Хабре (интересно):

http://habrahabr.ru/company/badoo/blog/190572/
http://habrahabr.ru/company/badoo/blog/216255/
http://habrahabr.ru/company/yandex/blog/173769/
http://habrahabr.ru/company/yandex/blog/193918/
http://habrahabr.ru/company/yandex/blog/202020/
http://habrahabr.ru/company/yandex/blog/200968/
#83 #399769
Я тут накатал целую пасту на тему тестов в итоге. Очевидные тесты делать нет смысла.

>>399607

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

1) юнит-тесты — тестируют только один модуль (класс или функицю). не взаимодействия с другими модулями и внешним миром (сеть, файлы, база данных). Хорошо подходят для кода с сложной логикой, например:

- функцию проверки телефона на правильность удобно тестировать на наборе правильных/неприавльных телефонов
- класс парсинга markdown-разметки удобно тестировать на образцах текста

Плохо подходят для кода без логики или активно взаимодействующего с нешним миром, например контроллер в MVC приложении.

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

Однажды я переделывал API для кое-чего, и поначалу тестировал его из командной строки, отправляя запросы программой curl (не php-библиотекой а именно утилитой, не путай). Скоро мне это стало надоедать, и я написал тесты на php, которые проходились по всем функциям API, вызвали их и проверяли что все верно. Это сэкономило время.

Другой пример: разработчики браузеров Firefox и Chrome используют тестовые html-страницы и проверяют, что движок отображает их в соответствие с образцом.

3) функциональные/приемочные тесты — тестируют приложение со стороны пользователя. То есть для веб-приложений это тесты которые имитируют браузер и заходят на странички, заполняют формы, жмут кнопки.

Ими удобно тестировать сайт целиком: регистрация, логин, и другие функции.

Есть 2 вида эмуляторов браузеров: неполноценные, пониамющий только html код (не понимают CSS и JS, не выполняют яваскрипт, не могут проверить видим ли элемент на странице с использвоанием css) и полноценные (имитируют настоящий браузер как PhantomJS либо встраиваются в настоящий браузер и контролируют его как Selenium).

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

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

4) регрессионное тестирование

Когда ты обнаружил баг (например: не удается зарегистрироваться с именем из русских букв) ты можешь написать тест проверябщий этот баг, это назвается регрессионный тест — он гарантирует что второй раз ты такой баг не пропустишь

5) тестирование производительности

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

Осторожно! В тестировании есть фанатики, они могут тебе сказать что ты обязан покрыть 100% кода юнит-тестами и тестировать даже функции из 2 строк, не стоит им верить.

В PHP для тестирования есть 2 популярных фреймворка, phpunit и codeception.

Запускать тесты руками быстро надоедает, потому обычно используют CI сервер — сервер, который сам выкачивает новый код из репозитория, прогоняет тесты и шлет письма/сообщения в чат если что-то не так, а также покаызвает красивые отчеты. Вот пример такого отчета c Travis CI для фреймворка Yii2: https://travis-ci.org/yiisoft/yii2

Вот примеры реальных проектов на PHP с тестами:

Slim: https://github.com/codeguy/Slim
Yii2: https://github.com/yiisoft/yii2

Подробнее про тестирование на практике можно прочесть на Хабре (интересно):

http://habrahabr.ru/company/badoo/blog/190572/
http://habrahabr.ru/company/badoo/blog/216255/
http://habrahabr.ru/company/yandex/blog/173769/
http://habrahabr.ru/company/yandex/blog/193918/
http://habrahabr.ru/company/yandex/blog/202020/
http://habrahabr.ru/company/yandex/blog/200968/
#84 #399770
>>399728

+ HTML, CSS, SQL, JS неплохо бы выучить
!ОП #85 #399771
Аноны, если кто-то хочет позаниматься тестированием, пишите. Вам нужно иметь какой-то код или приложение, которое вы будете тестировать, и этот код должен быть открыт.
#86 #399773
>>399757

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


Я так понял рекурсии вообще сложно разбирать. И да, он генерирует все сочетания из m элементов по n, где m=count($array), а n=1,2,..,m.

>Имя функции начинается с глагола: сделатьЧтоТо( )


Об этом постоянно забываю, как и об именах переменных.

>$array никак не меняется в функции.


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

>Можно сделать проще: for ($q = $k + 1; ....) ....


Мне от нуля надо начать. Либо я не понял, что ты имел ввиду.

>из-за референса трудно понять, тот же самый массив проверяет checkArray или он поменялся в дочерних вызовах perm.


Так там сразу после чека идет

>unset($newArray[$k + $q]);


Очевидно, что из функции массив возвращается неизмененным.

>Зря ты не читал мой (или любой другой) урок по массивам.


Читал. Просто тогда я ни строчки ни написал.

>Тут можно использовать array_diff_key


А вот это круто, запомню.

>Алсо, ты ставишь закрывающую скобку в if c лишним отступом:


Всего один раз!

>Я советую тебе попробовать сделать через генераторы


Как только разберусь, что это вообще такое, обязательно попробую.

>Вместо чехарды с unset, лучше бы использовать массив как стек и снимать верхушку через array_pop().


А вставлять через array_push(), соответственно?
#87 #399781
>>399773

>> $array никак не меняется в функции.


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


У меня уже злости не хватает на таких вот диванных оптимизаторов. Кто тебе сказал, что массив там реально копируется?
#88 #399782
>>399773

>> Можно сделать проще: for ($q = $k + 1; ....) ....


> Мне от нуля надо начать. Либо я не понял, что ты имел ввиду.


Не нужно от нуля начинать. Тебе нужно начинать от k + 1. Чтобы вместо этого

$k + $q

везде писать просто

$q

> Очевидно, что из функции массив возвращается неизмененным.


Чтобы это понять надо разобрать код и проверить чему равны переменные. Это не очевидно, мне по крайней мере.

> А вставлять через array_push(), соответственно?


Можно просто через $x[] = $y;

С генераторами код выглядит проще, по моему.
#89 #399784

>Чтобы это понять надо разобрать код и проверить чему равны переменные. Это не очевидно, мне по крайней мере.


Каждый раз при попадании в функцию у нас происходит

>$newArray[$k + $q] = $array[$k + $q];


>вызов функции


>unset($newArray[$k + $q]);


Конкретно здесь достаточно просто это увидеть. Но я так понял, что твое замечание было по размещению checkArray относительно вызова функцией самой себя, так?
#90 #399785
>>399781

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

http://habrahabr.ru/post/43489/

В твоем примере если тебя интересует оптимизация, ты бы мог например останавливать рекурсию если мы набрали в сумме больше половины очков. Это может позволить сильно сократить число вызовов. Но это ты сделать не додумался, зато налепил бессмысленных усложняющих понимание и снижающих надежность ссылок. Это хороший пример вреда микрооптимизаций: вместо анализа причин почему медленно работает, ты как туземный шаман сам придумал причину и сам придумал решение.
#91 #399786
>>399784

Ну так надо еще проверить что $k + $q больше чем значение любого ключа массива иначе мы перезапишем какой-то существующий элемент.
#92 #399792
>>399785
>>399781
Да ничего я не оптимизировал, у вас просто бахает на референсы. Просто там используется один и тот же массив исходных значений, который ни разу за программу не изменяется, вот я и вставил на него ссылку. И во вторых я банально не знаю как там передаются массивы, я php третий день изучаю, вы о чем?
>>399786

>Ну так надо еще проверить что $k + $q больше чем значение любого ключа массива


Оно больше. Хотя вместо "for ($q = 0; $q+$k < count($array);" я напишу "for ($q = $k; $q < count($array);", так лучше, ты прав.
!ОП #93 #399793
Хочу показать еще такую статью как дурной пример микрооптимизаций: http://habrahabr.ru/post/11553/

99% того что там написано — абсолютная чушь. Этот человек верит что микрооптимизации чем-то помогут как туземец верит что шаман бубном может вызвать дождь.

Чтобы заниматься оптимизацией, надо иметь широкий кругозор, понимать как взаимодействуют разные элементы системы, уметь мерять и тестировать.
#94 #399795
>>399769
Спасибо, ты ответил на все мои вопросы, даже на те, которые я не задал, но хотел.
#95 #399796
>>399782

> Чтобы это понять надо разобрать код и проверить чему равны переменные.


Я НЕ УМЕЮ РАЗБИРАТЬСЯ В ЧУЖОМ КОДЕ, ПОЭТОМУ У МЕНЯ ТРЕБОВАНИЯ
#96 #399797
>>399792

> бахает на референсы


Согласен, есть такое. Потому что сегодня ты терпеливо объясняешь что это вредно, ни на что не влияет, оптимизация так не делается, и т.д, а завтра приходит второй человек и у него точно такие же «оптимизации» или пост о том как важно использовать одинарные кавычки вместо двойных. Я же тоже человек.

> я php третий день изучаю


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

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


PHP умеет оптимизировать такие вещи без твоего участия. Не используй тут референс и все.

> Оно больше.


да, верно, но если мы передаем массив не по ссылке, то и вопросов, есть ли риск перезаписать что-то, не возникает. Этим и плохи ссылки — ты обязан просмотреть функцию чтобы убедиться что она ничего не меняет. А если аргументы передаются без ссылок, то код становится надежнее — ничего с твоим массивом гарантированно не случится.
#97 #399799
>>399796

Тяжело в учении. Когда анон пойдет работать, на него вывалится тясяч 500 строк абсолютно невменяемого быдлокода и он будет жалеть что его коллеги у меня не учились.
sage #98 #399800
>>399793
НЕ ОСИЛИЛ ПОНЯТЬ, КАК РАБОТАЕТ ЯЗЫК, НА КОТОРОМ ПИШЕТ
@
ОБЗЫВАЕТ ШАМАНАМИ ТЕХ, КТО ОСИЛИЛ
#99 #399801
>>399800

Толсто
#100 #399802
Добрый вечер котаны. У меня пара вопросов, вот допустим есть такая штука как MySQL и она обычно крутится у нас на сервере вместе с апачем и пхп. Типа это СУБД, делаешь и редактируешь базы с помощью комманд, верно? У неё по сути нет клиентской части? Все через консоль или через левые программулины которые эту клиентскую часть с помощью этих же комманд эмулируют? То есть шлют вместо запросы вместо нас и выдают понятный даже для домохозяйки результат?

А что можете сказать про MS SQL? В чем отличия от MySQL? Сервер там по сути идентичен, только имеет свой гуи? И есть еще и оффициальная клиентская софтина для того что бы с этим сервером взаимодействовать?

Человек прошарившийся в MySQL сможет легко в принципе и с MS SQL работать? Останется только тонкости самой программы освоить и всё?
#101 #399804
>>399797

>не занимайся оптимизациями а просто пиши нормально


Так я это и пытаюсь делать. А вы накинулись на меня, как на тролля, который сейчас будет тут врываться с одинарными кавычками. Я же не знаю, как "нормально". Я пишу так, как я бы делал на бумаге.
Бтв, ideone на "yield $newArray;" мне говорит "PHP Parse error: syntax error, unexpected '$newArray' (T_VARIABLE)". Пойду поем, в магазин схожу и переделаю с нуля.
>>399796
Так разбираться в чужом коде всегда сложно, не?
#102 #399805
>>399801
Жирно, но еще немного, и мы придем к этому. МНЕ ЭТО ЗНАТЬ НЕ НУЖНО, У НЕГО УНУТРЯХ МАГИЯ
#103 #399816
>>399804

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

насчет ideone — там PHP старый, версии 5.4

Я сейчас попробовал несколько онлайн-сервисов — почти на всех старье стоит. Вот где есть новый PHP:

http://codepad.viper-7.com/
#104 #399818
>>399816

>насчет ideone — там PHP старый, версии 5.4


Ну, ideone ладно, но с боле новым php все равно не выходит. Косяк где-то у меня. стоит все же сначала поесть.
#105 #399822
>>399802

Хорошая новость — SQL задумывался именно как единый язык для любых БД. Плохая — каждая понимает его немного по-своему.

> Типа это СУБД, делаешь и редактируешь базы с помощью комманд, верно? У неё по сути нет клиентской части?


Ты имел в виду «у нее нет отдельного интерфейса»? Да, нет.

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

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


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

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

> А что можете сказать про MS SQL? В чем отличия от MySQL?


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

> И есть еще и оффициальная клиентская софтина для того что бы с этим сервером взаимодействовать?


ну да, там что-то такое есть.

> Человек прошарившийся в MySQL сможет легко в принципе и с MS SQL работать?


да, сможет, там на 80% язык одинаковый (SQL) только свои особенности. Вот таблица с различиями диалектов в разных SQL-серверах:

http://en.wikibooks.org/wiki/SQL_Dialects_Reference (англ)
http://troels.arvin.dk/db/rdbms/ (англ)

Одно из важных различий — в MSSQL нету LIMIT, там есть TOP но это не равноценный аналог. Также, AUTO_INCREMENT не везде есть — в некоторых БД его заменяют другие средства.

Ну и далее, набери «различия MySQL MSSQL» в гугле.

Если ты используешь доступ к БД из PHP-кода то с другим сервером может быть придется работать немного по-другому. Впрочем, если ты используешь PDO, скорее всего разницы особой нет.

>И есть еще и оффициальная клиентская софтина для того что бы с этим сервером взаимодействовать?


Да. Но для MSSQL тоже есть клиент для командной строки.
#105 #399822
>>399802

Хорошая новость — SQL задумывался именно как единый язык для любых БД. Плохая — каждая понимает его немного по-своему.

> Типа это СУБД, делаешь и редактируешь базы с помощью комманд, верно? У неё по сути нет клиентской части?


Ты имел в виду «у нее нет отдельного интерфейса»? Да, нет.

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

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


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

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

> А что можете сказать про MS SQL? В чем отличия от MySQL?


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

> И есть еще и оффициальная клиентская софтина для того что бы с этим сервером взаимодействовать?


ну да, там что-то такое есть.

> Человек прошарившийся в MySQL сможет легко в принципе и с MS SQL работать?


да, сможет, там на 80% язык одинаковый (SQL) только свои особенности. Вот таблица с различиями диалектов в разных SQL-серверах:

http://en.wikibooks.org/wiki/SQL_Dialects_Reference (англ)
http://troels.arvin.dk/db/rdbms/ (англ)

Одно из важных различий — в MSSQL нету LIMIT, там есть TOP но это не равноценный аналог. Также, AUTO_INCREMENT не везде есть — в некоторых БД его заменяют другие средства.

Ну и далее, набери «различия MySQL MSSQL» в гугле.

Если ты используешь доступ к БД из PHP-кода то с другим сервером может быть придется работать немного по-другому. Впрочем, если ты используешь PDO, скорее всего разницы особой нет.

>И есть еще и оффициальная клиентская софтина для того что бы с этим сервером взаимодействовать?


Да. Но для MSSQL тоже есть клиент для командной строки.
#106 #399823
>>399816

>если ты пришел из языков типа Си/паскаль где это имеет значение, учти что PHP совсем по-другому устроен


Ага, я прочитал около ста страниц книжки про C++. Так что я не знаю устройство ни единого языка.
#107 #399824
>>399816
BREAKING NEWS
PHP СОВСЕМ ПО-ДРУГОМУ УСТРОЕН
ВОТ ГДЕ ИННОВАЦИИ ПРЯЧУТ, СРОЧНО В СКОЛКОВО
#108 #399831
>>399823

Ну вот, тогда если интересно, можешь почитать про то как PHP устроен: http://php.net/manual/ru/internals2.php Хотя это важно больше тем, кто расширения пишет, я например это не читал целиком так как не вижу смысла.
#109 #399832

>Call to undefined function yii\web\mb_strlen()


В php.ini раскомментировано:

>extension=php_mbstring.dll


Апач перезагружен.
Сам файл лежит, где положено: C:\php\ext.
В консоли пишу php -m и вижу mbstring.
В тестовом index.php пишу phpinfo() и в выводе mbstring среди модулей нет.
Плюс:

>extension_loaded('mbstring')


выдаёт false.
Что ещё сделать?
#110 #399834
>>399832

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

Прописал ли ты PHPIniDir в конфиге Апача? Он задает папку где искать php.ini

Проверь в выводе phpinfo() пункт «loaded php.ini file»
#111 #399837
>>399834

>Прописал ли ты PHPIniDir в конфиге Апача?


Да:

>PHPIniDir "C:/php"



>>399834

>Проверь в выводе phpinfo() пункт «loaded php.ini file»


Такого нет. Зато есть такое подозрительное очень:

>Configuration File (php.ini) Path \tC:\windows



>для командной строки и для веба могут использоваться разные php.ini


Ты про php-development.ini и php-production.ini? Я и в том и в этом прописал всё одинаково, т.е. они у меня идентичные.
#112 #399839
>>399837

> Ты про php-development.ini и php-production.ini?


По моему это не конфиги, а примеры конфигов. Их не надо трогать, надо править сам php.ini
#113 #399840
>>399834
>>399837
Исчезла ошибка:

>Call to undefined function yii\web\mb_strlen()


У меня было два файла:

>php-development.ini и php-production.ini


Переименовал один из них в php.ini. Теперь нет той ошибки и phpinfo() выдаёт "loaded php.ini file".
#114 #399842
>>399839
Благодарю, всё норм.
#115 #399843
>>399837

> Зато есть такое подозрительное очень:


>>Configuration File (php.ini) Path \tC:\windows



Это у всех так, не обращай внимания. Реально важна эта строка:

> Loaded Configuration File


> c:\php\php5.4.14\php.ini

#116 #399844
Анчоусы, такой вопрос:
Вот в первом уроке сказано дописать строчку. А можно так сделать? http://pastebin.ru/Mw31AkhM
Вы уж извините за такой глупый вопрос, но я просто не понимать.
#117 #399852
>>399844

Да. все верно. Если тебе кажется что что-то можно сделать по-другому ты можешь хоть целиком все переписать.
#118 #399854
>>399852
Спасибо.
#119 #399855
>>399852
Эм, еще один вопрос: что нужно было дописать в строчку-то?
#120 #399856
>>399855

Не помню. Я думаю, имелось в виду «эту строчку надо переделать»
#121 #399857
>>399856
Спасибо еще раз.
!ОП #122 #399892
Аноны, кто изучает HTML/CSS, обратите внимание на специальные плагины которые помогут вам печатать код быстрее:

http://emmet.io/ — для HTML, демо: http://www.youtube.com/watch?v=sxW-V24MTXI#t=149

Для CSS — Hayaku ( http://hayakubundle.com/ http://habrahabr.ru/post/160057/ ) (да, название хорошее)

Emmet содержит сокращения для CSS, но в Hayaku возможностей больше.

Плагины есть под популярные IDE и редакторы. Под Sublime Text 3 тоже есть.
!ОП #123 #399895
Алсо пост про плагины к Sublime: http://habrahabr.ru/post/235901/
#124 #399899
Я не могу в генераторы. Помогите мне, пожалуйста.
http://codepad.viper-7.com/NgzGzB
Я так понял, что если в функции есть "yield", то вызвать её напрямую я не могу, а потому вся моя рекурсия рушится, так?
#125 #399909
>>399899

Если в функции есть yield то это генератор-функция и при вызове она возвращает объект-генератор. Этот объект можно раскрутить с помощью foreach или вручную:

http://habrahabr.ru/post/189796/ (не помню давал или нет)

То есть выглядеть должно так:

$generator = generateSmth(); // получаем генератор
foreach ($generator as $value) {
// каждый шаг вызывается функция и возвращается 1 значение из yield
}

Насчет рекурсии: смотри, функция возвращает генератор, который никто не раскручивает и потому при таком вызове:

genearteSmth(...)

ничего не йилдится.

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

foreach (generateSmth() ... as $value) {
yield $value;
}
#126 #399916
Короче рекурсия - пока что сложно.
http://codepad.viper-7.com/14yvzd
#127 #399921
>>399615
бро, а что писать в имени сервера? Много чего пробовал, но дот.тк не принимает.
sage #128 #399922
>>399916
чо за задачка?
122 Кб, 500x355
875 Кб, 850x1303
#129 #399923
http://ideone.com/0QUbJN

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

Алсо у меня проблема с линуксом следующего характера:
делал неспеша по мануалу https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04

и вот там есть строчка sudo nano /etc/apache2/mods-enabled/dir.conf
которая как я понял является коммандой открыть в текстовом редакторе файл dir.conf
И вот я её прописываю и у меня файл в этом nano как бы пустой. А если открываю в ГУЕ убунты другим редактором то он не пустой. Путь сверял, в чем дело???
#130 #399925
>>399922
Вторая отсюда >>399214
#131 #399926
>>399921
всё понял, дот.тк ругается на то, что скопировал имя домена как ссылку.
#132 #399936
>>399923

>Путь сверял, в чем дело???


Сверь еще раз.
#133 #399970
оп, что делать если я нихуя не понимаю?
опыт работы год, сейчас читаю про семантические ошибки инкапсуляции и понимаю что всё что я писал состоит из этих ошибок.

когда на работе я начинаю думать о том чтобы написать правильно - то процесс написания кода занимает у меня раза в 4 больше времени (чем хуяк-хуяк в продакшн), при этом скрежет ржавых шестерней в голове вызывает сильную боль.
и чем глубже я погружаюсь в это, тем дольше я делаю работу.
мне не нравится это.
соблазн быстрого хуяк-хуяк всегда побеждает, в конце концов я начинаю писать плохо лишь бы закончить задачу. (я и так пишу медленно, список задач в очереди достиг 200 и растёт, если я буду писать хорошо - я уверен начнётся бугурт уровня "почему так долго")

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

оп, поговори со мной
#134 #399979
>>399970

>если я буду писать хорошо - я уверен начнётся бугурт уровня "почему так долго"


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

Программист с годом опыта работы все равно не напишет крупный проект нормально. Осознание того что ты пишешь хуйню – это очень важный момент в профессии. От этого чувства ты уже не избавишься.
!ОП #135 #399985
>>399970

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

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

Если не на основе фреймворка, то хороший вопрос, а почему? У вас компания по производству велосипедов? Но даже если так, ты бы мог сам изучать в свободное время какой-нибудь фреймворк (Yii 2 или Symfony2) и на его примере изучать эти самые правильные способы решения задач.

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

Ну или может тебе пока просто опыта не хватает, не знаю.

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

Ну и странно, конечно, что такая большая разница между «правильно» и «неправильно» по времени. Не увлекаешься ли ты оверинжиниригом (написанием слишком сложного кода для простой задачи)? Вот есть такой интересный пост на эту тему: http://habrahabr.ru/post/153225/ и ответ http://habrahabr.ru/post/153845/ — читал?

Не увлеваешься ли ты написанием велосипедов, то есть своих реализаций того, что уже есть?

Насчет принципов, есть принципы, которых стоит всегда придерживаться: DRY (не повторяйся), KISS (не усложняй), YAGNI (не делай то, что может не понадобиться). Даже если ты пишешь как можно быстрее.
#136 #399987
>>399979

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


Не сможет. Объем и сложность кода растет обычно со временем, так что переписать его целиком будет нереально. да и смысл переписывать работающий код? Лучше уж точечный рефакторинг.
70 Кб, 1152x676
#137 #399988
Посоны, два дабла! Хоть где-то меня ждет удача.
#138 #399990
>>399916

Ты все усложняешь же. Код генерации размещений можно сделать короче:

> if ($k == 0) {


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

> generateCombination(0, array(), $input)


Чтобы не передавать 0 и пустой массив можно использовать аргументы по умолчанию: http://php.net/manual/ru/functions.arguments.php

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

А так, вижу что генераторы ты освоил, молодец. Заметь, какая удобная получилась функция: ее можно без изменений использовать в любой другой задаче.
#139 #399991
>>399988

Конечно, ждет. Впереди задача, которую аноны по 10 раз пересдавали и по 3 дня решали.
#140 #399993
>>399991
Это будет уже завтра, а сейчас я отправляюсь спать.
Спасибо ОПу и компании за уроки.
#141 #399994
>>399990

>Не нужно делать частный случай тут. Используй один и тот же код для всех случаев.


Это я что-то очень сильно протупил. Прямо ну совсем.

>А так, вижу что генераторы ты освоил


Полностью пропустив итераторы.

>Заметь, какая удобная получилась функция: ее можно без изменений использовать в любой другой задаче.


Правда я не могу представить себе практическую задачу, в которой мне сочетания пришлось бы делать.
#142 #399996
>>399990

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


Тогда нужно поменять порядок аргументов, да?
!ОП #143 #399998
>>399994

> Полностью пропустив итераторы.


Из итераторов интереснее всего рекурсивные итераторы, а из них — рекурсивный итератор по файловой системе — полезная штука: http://php.net/manual/ru/recursivedirectoryiterator.construct.php

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


Я тоже, особенно если учесть что там сложность O(N!)
#144 #399999
#145 #400000
>>399987

>да и смысл переписывать работающий код?


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

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

>Объем и сложность кода растет обычно со временем, так что переписать его целиком будет нереально


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

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

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


Какими-то жуткими словами ты меня пугаешь.
Покидайте лучше еще задач с собеседований. Вдруг я их нарешаюсь и таки рискну поискать работу!
#147 #400002
>>399991
Это ты про рулетку?

>>400000
А вот и гет, собственно.
#148 #400003
>>400002

>А вот и гет, собственно.


А я то думал гетами только в /b/занимаются.
#149 #400005
>>400003
Вы здесь недавно?
#150 #400006
>>400003
Не обращай внимания, я просто залетный.
#151 #400007
>>400001

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

>>400002

Нет, это айфон в кредит
#152 #400008
Анон, вот я писал на js змейки, саперы, игру жизнь, в канвасе и через css. Сейчас хочу что-нибудь серьезнее сделать, нужно ли в сторону фреймворков смотреть типа pixi или phaser, или в ручную продолжать все делать?
!ОП #153 #400011
>>400008

Тебе надо смотреть в сторону библиотек, в таком порядке:

jQuery — библиотека для работы с DOM
jQuery UI — библиотека-набор полезных виджетов (автокомплит, календарик, и еще что-то)
underscore/lodash — набор полезных функций для работы с коллекциями (массивами, словарями)
Backbone — фреймворк для написания клиентсайд приложений
mustache/handlebars — клиентский шаблонизатор
amd.js/requirejs — система модулей
Knockout — библиотека для реализации биндинга модели к DOM
Angular — своеобразный, но популярный фреймворк для написания приложений

Соответственно, изучать как делать сложный фронтенд и клиенсайд-приложения (SPA в том числе).
#154 #400029
>>399923

Так. вроде код работает правильно. Но есть конечно и недоработки.

> Сам понимаю что нужно как-то повторяющийся текст с написанием "тысячи/тысяч" и тп вынести в отдельную функцию и избавиться от этих громоздких огромных условий


Ну так вынес бы. Копипаста же, а это зло.

> ($remains < 20) & ($remains > 0) &


Надо использовать &&. & — это двоичное битовое И, и оно работает совсем не так.

> $remains > 0)


Вместо того чтобы раза 4 это повтрить, можно просто поставить условие «если остаток ноль, выходим из функции»

Вместо typer лучше написать spellNumber (написатьЧисло)

> if ($number == 0) {


>\t\t$typeTotal = "ноль рублей";


>\t} else {


> .... много строк ....



Не надо писать такие длинные блоки else. Можно если number == 0 сразу делать return и блок else не нужен.

> function tests($n, $k) {


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

> Хочется просто пройти учебник поскорее.


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

> Ведь я даже сам вижу слабые места


Это хорошо, если видишь.
#154 #400029
>>399923

Так. вроде код работает правильно. Но есть конечно и недоработки.

> Сам понимаю что нужно как-то повторяющийся текст с написанием "тысячи/тысяч" и тп вынести в отдельную функцию и избавиться от этих громоздких огромных условий


Ну так вынес бы. Копипаста же, а это зло.

> ($remains < 20) & ($remains > 0) &


Надо использовать &&. & — это двоичное битовое И, и оно работает совсем не так.

> $remains > 0)


Вместо того чтобы раза 4 это повтрить, можно просто поставить условие «если остаток ноль, выходим из функции»

Вместо typer лучше написать spellNumber (написатьЧисло)

> if ($number == 0) {


>\t\t$typeTotal = "ноль рублей";


>\t} else {


> .... много строк ....



Не надо писать такие длинные блоки else. Можно если number == 0 сразу делать return и блок else не нужен.

> function tests($n, $k) {


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

> Хочется просто пройти учебник поскорее.


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

> Ведь я даже сам вижу слабые места


Это хорошо, если видишь.
#155 #400039
>>399985

>типовые решения


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

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

узнаю у менеджеров про оплату, в итоге натыкаюсь КОКОКО ЭТО БУДЕТ В ВЕРСИИ ПРОГРАММЫ 2.0, МЫ ЕЩЁ НЕ ДУМАЛИ
то есть они придумывают на ходу, а адекватная оплата будет хуй знает когда.

я также не могу сесть и "спроектировать" всё целиком, потому что мне просто не говорят как что должно работать (см КОКОКО).

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

так о чём это я? вот например для оплаты через внешний сервис есть какая-либо основа?
114 Кб, 604x471
#156 #400081
>>399059
Анон, извини за нубский вопрос, я просто не знаю, как его гуглить. Прошёл курс на кодкедеми, ничего лучше не придумал, как написать гостевую книгу, ну и засел за что-то чуть масштабней и сразу задался вопросом.
Как вы мешаете хтмл и пхп? Если пхп код нужен в трёх местах так в трёз местах и оформляете <?php ?> или у вас только один большой <?php ?> и в нём весь хтмл выводится через echo? Первый вариант вроде как удобен, но тогда не понятно, что происходит с классами, которые нужно использовать во всех трёх местах. Второй понятный, но выглядит как-то странно.
Ну и под конец я совсем охренею и попрошу сбросить какой-нибудь свой код простой вещи, в которой даже я смогу разобраться, просто для примера оформления кода. Спасибо, если поможешь.
#157 #400086
>>400081
Ты на голом PHP чтоли начал делать? Не страдай фигнёй - бери фреймворк. Для начала что то типа silex или slim. Почитай к ним документацию, посморти примеры, там увидишь как код от html отделен. Если коротко - то HTML выносится в шаблоны, в которые потом из PHP вставляются только определенные параметры
#158 #400107
>>400039

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

В таком случае код на сервере состоит из кода, формирующего форму оплаты и кода взаимодействия с платежной системой.

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

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

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

Вообще, оплата — дело серьезное. Тут надо внимательно все проверять, чтобы не было ошибок, ничего не потерялось, надо работать над интерфейсом (чтобы не было лишних шагов и непонятных мест), надо решать, какие платежные системы использовать — или аггрегатор. Но судя по твоему посту, серьезного отношения у вас нет, и скорее всего это приведет к низкой конверсии (пользователи будут редко платить или вообще не будут). Непонятно, зачем тратить время на компонент, которым не будут пользоваться?
#159 #400110
>>400039

> В случае с оплатой: с счетами и биллингом и без (проще).


Имелось в виду: В случае с оплатой есть 2 варианта: ....

И насчет разделения. Поясню примером. Допустим у тебя сейчас такой код обработки коллбека от платежной системы:

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

если (все верно) {
пометить транзакцию как оплаченную;
пометить пользователя как платящего;
сделать еще что-то;
}

Вот этот код стоит разделить на 2 части.

И насчет транзакицй: обычно в случае простой оплаты делают таблицу транзакций, вида

(id транзакции) | (userid) | (сумма) | (описание заказа) | (статус) | (подробности о платеже от платежной системы)

Ну это наверно ты и сам знаешь.
#159 #400110
>>400039

> В случае с оплатой: с счетами и биллингом и без (проще).


Имелось в виду: В случае с оплатой есть 2 варианта: ....

И насчет разделения. Поясню примером. Допустим у тебя сейчас такой код обработки коллбека от платежной системы:

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

если (все верно) {
пометить транзакцию как оплаченную;
пометить пользователя как платящего;
сделать еще что-то;
}

Вот этот код стоит разделить на 2 части.

И насчет транзакицй: обычно в случае простой оплаты делают таблицу транзакций, вида

(id транзакции) | (userid) | (сумма) | (описание заказа) | (статус) | (подробности о платеже от платежной системы)

Ну это наверно ты и сам знаешь.
#160 #400114
>>400081

Это как раз подходящий вопрос для нашего треда.

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

Не надо ни в коем случае выводить HTML через echo. Не надо в одном файле смешивать php и html. Надо использовать шаблоны:

http://www.phpinfo.su/articles/practice/shablony_v_php.html

Там используется встроенный шаблонизатор PHP. Но есть и сторонние, более мощные и удобные шаблонизаторы. Я рекомендую изучить twig — это клон пиотоновского jinja, он новый и довольно популярный. Ну и мне нравится синтаксис (есть еще smarty, но он старый и мне не нравится, но тоже известен).

Когда ты делаешь вывод данных, легко сделать ошибку и оставить уязвимость XSS (все начинащие ее делают). Прочти мини-урок на эту тему чтобы не делать таких ошибок: https://gist.github.com/anonymous/52adda0113428b274c64

Насчет кода, ты мог бы выкладывать его куда-нибудь на гитхаб (для этого надо освоить гит, но гит сейчас везде используют), и вкинуть сюда ссылочку, я бы посмотрел и дал советы и замечания. Ведь наверняка там есть что улучшить. Заодно узнаешь полезные вещи.
#161 #400115
>>400086

Да, это хороший совет, микрофреймворк поможет избежать написания велосипеда.
#162 #400119
>>400081

Насчет примера для оформления — взгляни на такой код (примеры из фреймворков Slim и Silex):

https://github.com/silexphp/Silex/blob/master/src/Silex/Application.php
https://github.com/codeguy/Slim/blob/master/Slim/Slim.php

Стандарты оформления описаны в PSR-1 и PSR-2

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/

И пост на тему как автоматически выровнять код: >>399062

И если у тебя еще есть какие-то вопросы, задавай. Это как раз тред для начинающих.
#163 #400126
>>400114
>>400115
>>400119
Спасибо огромное.
#164 #400131
>>400115
А сразу лезть в дебри какого-нибудь Yii2 не стоит, да?
другой кун
#165 #400147
>>400131

проще начать с микрофреймворка. У нас кстати и задания есть на эту тему:

https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
https://gist.github.com/codedokode/9424217
#166 #400149
>>400147
А разве в первом не свой велосипед предлагается городить?
#167 #400154
>>400149

Можно и микрофреймворк, можно велосипед.
#168 #400159
>>400110
>>400107
вообще вопрос был про какие-то готовые системы
ты пишешь транзакции, вот это вот всё
сейчас "первая часть" готова и работает.

у меня боль от того что как только менеджерская фантазия закончит все теперешние дела и начнёт фантазировать про вторую версию - будет пиздец. поэтому я хочу заранее взять что-то готовое и пилить под себя, а не писать код на выброс
#169 #400160
>>399985

>Не надо ничего специально проектировать


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

а если проект дольше чем на месяц - то там таких скрытых мелочей сотни, и не продумывая их можно закончить так как заканчиваю я сейчас - любое изменение кода который писался сходу - занимает часы и пачку всплывающих багов
#170 #400164
>>399985

>в свободное время делать какой-нибудь простой проектик для себя с использованием «правильных» технологий


почему советуют заниматься чем-то своим вместо того чтобы улучшать то что я делаю сейчас?

у меня же не весь проект в одном методе.

я могу рефакторить один модуль, остальные останутся нетронутыми. и такой рефакторинг займёт ну может два-три дня, не неделю же
#171 #400174
>>400164
Если есть время и желание улучшать то что есть бесплатно (а тебе за это платить не будут, нужно же хуяк-хуяк, верно?) – то можно и улучшать то что есть. Тем более если в проекте все не так плохо и он разделен на независимые модули.

Просто судя по:

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



Проект не такой уж и модульный.
#172 #400183
>>400159

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



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

https://github.com/thephpleague/omnipay
https://github.com/Payum/Payum

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

Алсо можешь поискать в этом списке: http://phptrends.com/?q=payment

И в этом: http://pronskiy.com/php-digest/ (это поиск по материалам дайджеста php на хабре)

Это то, что тебе надо или нет?
!ОП #173 #400185
Алсо, сейчас у меня подвисал http://ajax.googleapis.com/ (с которого некоторые сайты подключют jquery и другие библиотеки). Соответственно, тормозили сайты при открытии. Например, jquery загружался 30 секунд и не с каждого раза. Неприятно.

Вот по этой причине вы не должны подключать скрипты с других серверов. Храните у себя. Выгоды никакой использовать внешний jquery нет так как он весит 100 килобайт, а вот недостатки есть.

Сколько раз я это говорю, никто не слушает.
#174 #400186
>>400174
ну там же мвц в конце концов
он по умолчанию делит модели, контроллеры друг от друга

>>400183
мне нужен не лк
мне нужно вся эта система оплаты абстрактного заказа, добавление в нескольких платных фич, вот это вот всё
#175 #400188
>>400160

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


Во-первых, почему не взять готовый интернет-магазин, и не написать (или скачать/купить) модуль интеграции с 1С?

И даже есть писать велосипед, ничего тут изобретать не надо. Товары хранить в базе с применением нормализации, возможно с EAV для характеристик если требуется, выгрузка — по протоколу 1C (там по моему как-то XML с русскими тегами передается), соответственно разбирать этот XML можно с помощью PHP DOM/Simplexml если они поддерживают русские теги.

Ошибки — смотря какие ошибки и смотря какие требования у менеджеров, как скажут так и обрабатывать.

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

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



Мне кажется, дело не в проектировании. А в стиле написания кода и подходах к разработке (я этот код не видел, потому сказать точно не могу).
#176 #400190
>>399214

>2. Баланс весов


>Дана последовательность целых чисел.


>Определить, можно ли из них отобрать какое-то количество предметов с суммарным весом 100 (вывести yes или no, в зависимости от результата).



ОП, сделал вторую часть, но никак не могу сделать её через генераторы, yield в рекурсии не выбрасывается. Генераторы с рекурсиями работают?
http://ideone.com/SGfWQ2
#177 #400191
>>400186

Ну смотри, система оплаты состоит из:

- таблицы транзакций и кода работы с ней (делается как принято в твоем фреймворке)
- кода взаимодействия с платежным шлюзом (можно посмотреть на примеры кода который я дал выше, omnipay и payum)
- фронтенда (красивый попап для оплаты) — свой
- если заказ не выполняется сразу, то нужна таблица заказов и код работы с ней, отслеживание заказов, уведомления (как принято в твоем фреймворке)
- может быть, админка/статистика для этого дела (как принято в твоем фреймворке/CMS)

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

И если речь о продаже чего-то через магазин, вопрошу в третий раз: почему пишете свой движок а не берете готовый e-commerce движок?
#178 #400192
>>400188
ты как-то так отвечаешь что я читаю и как будто ты не писал ничего

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

как лучше?
#179 #400193
>>400190

Про рекурсию и генераторы: >>399909
#180 #400194
>>400192

Лучше в общих чертах, из чего состоит и что каждый класс/компонент делает.
#181 #400195
>>400191

>почему пишете свой движок а не берете готовый e-commerce движок


потому что это не магазин

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

соответственно там нет таких как в интернет магазине витрин с товарами, там и товаров то нет, там нет корзины, и т.д.
#182 #400196
>>400195

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

Если это например статус vip на сайте, то там таблица заказов и все что с ней связано, не нужно.
#183 #400198
>>400193
Мне кажется, если нужно так странно вызывать yield в случае с рекурсией, то не лучше ли просто отказаться от генераторов в этом примере?
#184 #400202
>>400198

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

yield from func( );

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

я разделяю их на методы, и в итоге у меня получается метод

метод

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

всё ли ок с методом выше?
#186 #400207
>>400205
http://pastebin.com/r0cGCzLP

пожалуйтесь абу на стоплист
#187 #400210
>>400205

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

Лучше бы если бы это были не абстрактные вызовы без аргументов, а операции с объектами, где явно видна логика:

function doSmth($x, $y)
$a = $this->fn1($x);
if ($a->isThis( )) {
return $a;
}

return $this->fn2($y);
}

Ну то есть явно видно что один объект получается из другого, есть какая-то логика, и т.д.

А ты все делаешь над полями объекта, которых наверно много, и это затрудняет понимание.
#188 #400211
>>400207

Стоп лист не пропускает пару скобок ( )

Надо писать скобка - звездочка - пробел - звездочка - скобка
#189 #400213
ОП, у тебя есть ещё задачки, чтобы освоить новый функционал 5.4 и 5.5?
#190 #400214
>>400210

И нет ли у тебя «массиво-ориентированного программирования», то есть использование сложных структур из массивов там где подошли бы объекты?
#191 #400215
>>400210

>А ты все делаешь над полями объекта, которых наверно много, и это затрудняет понимание.


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

$hello = $this->doAThing($hello);
$hello = $this->doBThing($hello);
#192 #400216
>>400213

А какой именно?

Мне кажется, достаточно почитать статьи на том же хабре «что нового в php x.y» ну или напиши конкретно на какую тему хочешь задачку. Там нового не так много, анонимные функции, генераторы, короткий синтаксис для массивов.
#193 #400217
>>400214

>массиво-ориентированного программирования


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

погуглил МОП но слабо понял. любое использование массивов можно считать за МОП?
почему ты решил что у меня есть МОП?
#194 #400218
>>400215

А нельзя ли этот код перенести в объект hello? Сделать методы

getA(), getB() и т.д?

> тогда было бы даже уродливей


> $hello = $this->doAThing($hello);



Было бы понятнее, а если hello объект то присваивание и return не нужно.
#195 #400220
>>400217

Потому что его активное использование обычно уродует код. Пример — работа с формами в Друпал (все на сложных массивах). Но это просто предположение, высказанное наугад.
#196 #400221
>>400218

>А нельзя ли этот код перенести в объект hello?


что ты имеешь ввиду? покажи пример
#197 #400224
>>400216
В принципе ты прав, ну может у тебя на рекурсию есть ещё задачи в заначке?
#198 #400225
>>400221

Если ты что-то делаешь с объектом $hello то ты можешь код, делающий это что-то перенести в него. Вместо

$a = $this->doA($hello);

будет $a = $hello->doA( );

Причем это будет вызываться только там где нужно получить $a. Не знаю, подойдет ли это тут.
#199 #400226
>>400224

Есть. Задача про банкомат http://archive-ipq-co.narod.ru/l1/mou-ikkai.html с купюрами в 200 и 2000.
#200 #400227
>>400225
то есть я создаю класс для обработки хелло, и затем класс хелло, пишу нью хелло(), в него передаю данные, пишу в нём методы, и вызываю $a = $hello->doA( );

тогда какой смысл в первом классе?

там будет один метод рун и всё
#201 #400229
>>400224

А, вспомнил, годная задачка на рекурсию. дано имя файла, bloknot.txt и маска например (звездочка).txt

Проверить соответствет ли имя файла маске. В маске можно использовать символы:

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

Wiki: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0
571 Кб, 1024x768
#202 #400239
Ребят, а давайте проведем небольшую перепись среди тех кто тут постоянно зависает. Такая вот типа анкетка:

[0]. Сколько лет?
[1]. Как давно изучаешь пхп?
[2]. Прошел ли учебник с задачами от ОП-а, а если нет то где находишься?
[3]. Какие еще технологии начал осваивать? Или что уже знаешь/используешь если вдруг ты разработчик с опытом.
[4]. Что хочешь освоить в ближайшее время?
[5]. Какие вещи вызывают/вызывали у тебя наибольшие трудности в понимании или реализации?
[6]. Работаешь или учишься? В общем какие основные занятия в жизни.
[7]. Зарабатываешь ли на знании веб-технологий? Знаю что тут сидят как минимум джуны, может есть те кто уже ушел во фриланс.
[8]. Не могли бы вы тут описать свой примерный жизненный путь касательно программирования. Например: учил в школе паскаль, а после школы пошел в вуз на ИТ-специальность, после чего... И вот теперь я успешный синьор в компании-лидере. Или: бросил вуз и сычевал 5 лет на дваче, пока не набрел на пхп-тред в /b и вот... И теперь спустя 2 года всей вышеперечисленной хуйни я...
#203 #400249
>>400239

>[0]. Сколько лет?


25

>[1]. Как давно изучаешь пхп?


Год.

>[3]. Какие еще технологии начал осваивать? Или что уже знаешь/используешь если вдруг ты разработчик с опытом.


Всю веб-парашу.

>[4]. Что хочешь освоить в ближайшее время?


Сертификат ZEND

>[5]. Какие вещи вызывают/вызывали у тебя наибольшие трудности в понимании или реализации?


Чужой плохой код.

>[7]. Зарабатываешь ли на знании веб-технологий?


Зарплата $1к, занимаюсь разработкой интернет магазинов в офесе.

>[8]. Не могли бы вы тут описать свой примерный жизненный путь касательно программирования.


Работал маркетологом, была задачка - поправить говно на сайте, попробовал - понравилось. Очень доволен.
#204 #400252
>>400229
Я не понял в чём подвох? Почему не использовать просто strpos?
#205 #400254
>>400239
[0]. 21
[1]. Год
[2]. Прошел, кроме кошек-мышек.
[3]. Да вроде никаких.
[4]. Фреймворки.
[5]. Фреймворки же, до сих пор трудно читать чужой код. Не понимаю MVC. Ничего не понимаю.
[6]. Учусь на экономиста, последний курс. Работаю в местной конторке, ничего серьезного не делаю. Получаю 18к.
[7]. Да, зарабатываю в местной конторке. Но ничего серьезного не делаю. Сайтики, интернет магазины. Не развиваюсь, остановился на месте.
[8]. Пришел, увидел, понравилось, занялся. Где-то в 2013м примерного этого месяца все началось. Были перерывы не верил ни во что. Но вроде уже кое-какие знания есть. Еще проблемы со здоровьем очень подводят. Но я верю в лучшее. Я верю, что ОП мне поможет.
23 Кб, 373x483
#206 #400270
>>400239
[0]13. Да. Кидайте тапок.
[1]Примерно год, но опыт с пхп был до этого.
[2]Нет, находился вроде как на уроке про рулетку.
[3]СУБД естественно, css(легко вроде как) и прочее свойственное веб-разработке ерунда. Еще хочу изучить python.
[4]^^^^^^^^
[5]БД. Не могу понять логику, хотя она и проще, чем, например много непонятных кавычек и.т.д. Ну, и конечно чужой код, особенно если он написан ну ОЧЕНЬ плохо.
[6]учусь в обыкновенной школе, раньше учился в гимназии, но переехал из Севастополя в самые дальние ебеня в рашке(нет, не политота). Времени на обучение мало..
[7]Пока что нет.
[8]Играл в самп. Решил создать свой сервер. Узнал как. Начал смотреть всю эту херню с программированием. Тут и пошло, поехало. А это был, кстати 2011 год, лол. Даже форум бесплатный после меня еще лежит...
(пик рандом)
#207 #400352
>>400252

попробуй, используй. И тогда не strpos, а лучше mb_strpos так как он корректно считает русские буквы в utf-8.
#208 #400356
>>400270

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

https://gist.github.com/codedokode/10539213 (Задачка про лайки)

Пока самый лучший вариант решения был обойтись всего лишь 2 джойнами.
#209 #400357
>>400356

Решение удобно постить на сайт sqlfiddle (правда иногда он лежит)
#210 #400376
>>400356

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


А что, кто-то сделал с первого раза?
#211 #400377
>>400226
Сделал: http://ideone.com/0B4zrD

У меня вопрос к тебе: когда в цикле у меня появляется вариант для выдачи валюты, я добавляю его в статический массив. Но из-за перебора всех возможных вариантов у меня получается очень много правильных, часто дублирующихся, вариантов, а нужен только один. Как можно прекратить рекурсию, и все её родительские циклы? Если я делаю return в дочернем цикле, родительская не прерывается. И что вообще скажешь по задачке?
#212 #400388
>>400356
Спасибо за саму теорию, кстати.
#213 #400390
Есть какая-нибудь готовая вещь, упрощающая работу с mysqli?
Везде пишут, что использовать голый mysqli нифига не правильно. И действительно, писать велосипед, да еще и не имея навыков гуру.
148 Кб, 1920x1200
Воннаби #214 #400415
>>400239

>[0]. Сколько лет?


26.

>[1]. Как давно изучаешь пхп?


начал год назад, но были большие перерывы по 1-4 месяца.

>[2]. Прошел ли учебник с задачами от ОП-а, а если нет то где находишься?


Нет, на задачах из секции "Повторим?"

>[3]. Какие еще технологии начал осваивать? Или что уже знаешь/используешь если вдруг ты разработчик с опытом.


Неспешно Linux и MySQL

>[4]. Что хочешь освоить в ближайшее время?


HTML, JS, ООП.

>[5]. Какие вещи вызывают/вызывали у тебя наибольшие трудности в понимании или реализации?


Долго сидел на регулярках.

>[6]. Работаешь или учишься? В общем какие основные занятия в жизни.


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

>[7]. Зарабатываешь ли на знании веб-технологий? Знаю что тут сидят как минимум джуны, может есть те кто уже ушел во фриланс.


Ничего не заработал.

>[8]. Не могли бы вы тут описать свой примерный жизненный путь касательно программирования.


В школе ходил на факультатив по программированию, там на паскале мы сортировали массивы, писали змейку и решали всякие задачи с олимпиад. В вузе был курс программирования, но несерьезный и нам давали Delphi, так что я тащил школьными знаниями, и на фоне одногрупников-дегенератов был чуть ли не лучшим. В итоге абсолютно нихуя не учил примерно 8 лет. Ну и вот в 25 снова начал шевелиться.
#215 #400436
>>400390

PDO не хочешь попробовать? А так, не знаю.

>>400227

>Тогда какой смысл в первом классе?


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

Был код:

$this->посчитатьЗарплату(работник);
$this->посчитатьКофе(работник);
...
// в другом месте
echo "{работник->имя} заработал {работник->зарплата}\n";

А будет

echo "{работник->имя} заработал {работник->посчитатьЗарплату( )}\n";

Собственно смысл в том что код лучше получается. Но не знаю, подойдет ли тебе это.

Вообще в последовательности вызовов в нексоторых случаях нет ничего плохого. А в некоторых есть. Так трудно сказать.
#216 #400438
>>400390

Можешь тут поискать:

http://phptrends.com/?q=mysqli
http://phptrends.com/?q=database
http://phptrends.com/?q=pdo

Тебе именно mysqli принципиально использовать? PDO не пойдет?
#218 #400517
>>400190

Комментарии и замечании:

Вообще, конечно, код пока далек от идеала. Тут есть что улучшать:

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

> if(array_sum($current)>100)


Не надо вписывать число 100 прямо в функцию, передавай как аргумент. Заодно код понятнее станет.

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

Переменные в PHP не пишутся через подчеркивание, используется кемелКейс: $someVariableName

> static $matches = [];


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

> $match = $current;


> $match[] = $digit;


Этот код скопирован 2 раза, надо избавиться.

> if(empty($current)){


> return array_map("unserialize", array_unique(array_map("serialize", $matches)));



Это жуткий костыль. Тем более что есть решение: http://stackoverflow.com/a/5211985

Или можно использовать ключ чтобы не вставлять в массив одинаковые значения.

Вместо проверки empty($current) лучше это вынести в внешнюю функцию.
#218 #400517
>>400190

Комментарии и замечании:

Вообще, конечно, код пока далек от идеала. Тут есть что улучшать:

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

> if(array_sum($current)>100)


Не надо вписывать число 100 прямо в функцию, передавай как аргумент. Заодно код понятнее станет.

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

Переменные в PHP не пишутся через подчеркивание, используется кемелКейс: $someVariableName

> static $matches = [];


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

> $match = $current;


> $match[] = $digit;


Этот код скопирован 2 раза, надо избавиться.

> if(empty($current)){


> return array_map("unserialize", array_unique(array_map("serialize", $matches)));



Это жуткий костыль. Тем более что есть решение: http://stackoverflow.com/a/5211985

Или можно использовать ключ чтобы не вставлять в массив одинаковые значения.

Вместо проверки empty($current) лучше это вынести в внешнюю функцию.
#219 #400520
Коданы, не проходите мимо! Как избавиться от повторяющегося кода? Нужно окно с табами на чистом JS, чувствую, что много лишнего, вот ссыль на jsfiddle http://jsfiddle.net/4jttLoft/1/, буду рад услышать советов мудрых.
#220 #400523
>>400520
Запятая в конце ссылки лишняя, если что.
#221 #400524
>>400377

Ошибка:

- при повторном вызове считает неверно: http://ideone.com/CVAqiL
- алгоритм в принципе непраивильный так как не может выдать 11 000: http://ideone.com/ajeU6s

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

В PHP использует кемелКейс для имен переменных: $someName

> static $withdraw


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

> if ($quantity >= $needed):


> $current_quantity = $needed;


1) версия if c двоеточием используется в шаблонах, не в обычном коде. В обычном используется версия {}
2) тут if удобнее заменить на min/max

> if(!($amount - $current_summ)){


Лучше писать $a == $b, зачем запутывать код? Алсо, если остаток равен нулю, нет смысла дальше продолжать.

get_message нелогично называть get так как она ничего не возвращает. Лучше printMessage
#222 #400527
>>400041
Ответьте, пожалуйста
#223 #400543
>>400478

Вообще, код работает. Это хорошо, но тут есть что исправить: http://ideone.com/4nAnLD
#224 #400544
>>400041
Многие ко многим? Не шутишь?
#225 #400548
>>400520

Не делай как ты делаешь. Надо просто добавлять к текущему табу класс tab-active (соответственно все стили пойдут в CSS файл). Это можно сделать функциями addClass/removeClass которые ты пишешь либо сам либо используешь jQuery либо classList из HTML5 (не работает в старых браузерах)

Также, не копипасть:

> \t\tdocument.getElementById("navigation_1")\t


> document.getElementById("content_1")


Это прекрасно выносится в массив

> Show_1( )


Что это? Ты про аргументы слышал? showTab(1)

А еще лучше сделать назначение обработчика не на конкретный таб, а на ul — чтобы не писать onclick несколько раз.

Также, значения аттрибутов в HTML надо брать в двойные кавычки.

У тега li нет аттрибута href

Еще недостатки. У тебя код сейчас гвоздями прибит к HTML-разметке. Ты не можешь просто так добавить в HTML лишний таб или убрать — все сломается. Надо чтобы код был универсален и работал с любым числом табов.

Я бы сделал так: на табе c помощью data-аттрибутов подписывал к чему он относится:

<li data-for="section-1">...

<section id="section-1"> ....

Все остальные id стоит удалить и не использовать так как они не могут повторняться и ты не можешь на странице разместить 2 блока с табами — согласись, отстойно? Используй CSS классы для верстки.

> width: 170px;


Зря ты задаешь ширину таба. А что если текст будет длинный?

Ну и наконец: в новых CSS3 браузерах табы можно сделать вообще без яваскрипта: http://tympanus.net/Tutorials/CSS3ContentTabs/
#225 #400548
>>400520

Не делай как ты делаешь. Надо просто добавлять к текущему табу класс tab-active (соответственно все стили пойдут в CSS файл). Это можно сделать функциями addClass/removeClass которые ты пишешь либо сам либо используешь jQuery либо classList из HTML5 (не работает в старых браузерах)

Также, не копипасть:

> \t\tdocument.getElementById("navigation_1")\t


> document.getElementById("content_1")


Это прекрасно выносится в массив

> Show_1( )


Что это? Ты про аргументы слышал? showTab(1)

А еще лучше сделать назначение обработчика не на конкретный таб, а на ul — чтобы не писать onclick несколько раз.

Также, значения аттрибутов в HTML надо брать в двойные кавычки.

У тега li нет аттрибута href

Еще недостатки. У тебя код сейчас гвоздями прибит к HTML-разметке. Ты не можешь просто так добавить в HTML лишний таб или убрать — все сломается. Надо чтобы код был универсален и работал с любым числом табов.

Я бы сделал так: на табе c помощью data-аттрибутов подписывал к чему он относится:

<li data-for="section-1">...

<section id="section-1"> ....

Все остальные id стоит удалить и не использовать так как они не могут повторняться и ты не можешь на странице разместить 2 блока с табами — согласись, отстойно? Используй CSS классы для верстки.

> width: 170px;


Зря ты задаешь ширину таба. А что если текст будет длинный?

Ну и наконец: в новых CSS3 браузерах табы можно сделать вообще без яваскрипта: http://tympanus.net/Tutorials/CSS3ContentTabs/
#226 #400550
>>400527

Я от себя замечу что мне тяжело конечно воспринимать в таком виде, через картинки, мне гораздо понятнее SQL-код который можно получить например через SHOW CREATE TABLE bands\G

Соответствтенно, если ты запутался в графическом интерфейсе то попробуй сделать SHOW CREATE TABLE и запости сюда номальный код, так как я этот интерфейс сам не очень понимаю.

Но вроде у тебя все стоит верно.

> Вот только почему во всех трех в ограничениях внешнего ключа всё разное, по понятно.


Скорее всего это, красным подчеркнутое, имя ключа. Оно ни на что не влияет.

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


Обычно ключи ставятся так: в той таблице где есть внешний ключ, ты пишешь x_id REFERENCES table_x (id) ON UPDATE ... ON DELETE ...

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

Читал это? http://denis.in.ua/foreign-keys-in-mysql.htm

Имей в виду, кстати, у тебя указано NO AcTION - значит удалять связанные записи ты не сможешь.
#227 #400552
>>400527

Фраза «ограничения внешнего ключа» это скорее всего неуклюжий перевод FOREIGN KEY CONSTRAINT. То есть она значит что есть внешний ключ, и все.
#228 #400553
>>400548
Спасибо, возьму на заметку.
#229 #400555
>>400524
Спасибо, сейчас переработаю.
!ОП #230 #400556
Микрооптимизаторам на заметку:

http://habrahabr.ru/post/242011/

> Оптимизируем VPS за 5$ (512MB RAM / 1 CPU) так, что сайт на wordpress выдерживает нагрузку в 42,735,587 хитов в день



Пока вы меняете двойные кавычки на одинарные и пишете свой движок без ООП, человек берет Вордпресс и нехитрыми оптимизациями разгоняет до 494 запросов/сек. Конечно это скорее всего идет в кеш, но какая разница? Цель достигнута.
#231 #400559
>>400548

>Что это? Ты про аргументы слышал? showTab(1)


Так ли обязателен аргумент, если без него всё работает? Можно вкратце - в каких случаях наличие аргумента необходимо, а в каких нет?
245 Кб, 665x900
#232 #400563
А вот мы тут учим пхп, жс, а что хорошего почитать по ХТМЛ? Все равно ведь нужен он как ни крути, и для работы и если свой сайт пилить.
#233 #400566
>>400559

Дело не в аргументе.

Ты скопипастил функцию 3 раза, а это самая плохая вещь, которую можно сделать. И как у тебя добавить 4-ю, 5-ю и далее вкладки? Это очень некачетвенный код.

Если ты хочешь сделать табы, то подумай как сделать нормальные табы, которые легко подключаются на любой сайт без переделки кода. В твоем случае это вообще невозможно.
#234 #400567
>>400563

По HTML — не знаю, htmlbook может быть?

http://htmlbook.ru/samhtml

Вообще, у нас есть задания, но не число на HTML, а на HTML + CSS (так как они вместе используются). 10 заданий отсюда: http://archive-ipq-co.narod.ru/l1/reading-list.html в самом конце.

И еще 2 дополнительных задания + задание на верстку макета.
#235 #400568
>>400566
Ясно, просто там была загвоздка, что неактивированные табы имеют разный цвет по отношению к активированному, что и привело к такому некачественному коду.
#236 #400569
Кстати ОП, что у тебя с сырной снизу по странице происходит? Это же не гифка какая-то?
http://archive-ipq-co.narod.ru/ha.html
Как это сделано?
#237 #400571
>>400568

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

>>400569

Яваскрипт же + канвас. Открой инспектор (Ctrl + Shift + I) и изучи, все исходники доступны.

Как пользоваться инспектором: http://habrahabr.ru/post/143767/
#238 #400572
>>400569
js, canvas, спрайты
#239 #400587
>>400571

>Ты CSS-классы изучал?


Да, я не совсем же дно полное.
#240 #400594

>>400436
PDO
При беглом рассмотрении не заметил огромной разницы между mysqli и pdo — шанс нарваться на глупую ошибку везде одинаков, имхо, а никакой высокоуровневой прослойки ни там, ни там нет.
А вообще я сраный гуманитарий, который ничего не умеет и месяцами пилит готовые велосипеды на 50 строчек кода, а потом выясняет, что уже давно есть хорошее и готовое решение.
>>400438
Не принципиально. Нужно наиболее тривиальное и компактное решение.
#241 #400610
>>400587
оп, поясни ещё раз за МОП
мне не даёт это покоя
я везде использую массивы
например мне приходят данные, которые я ввожу в массив название_параметра - значение

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

поясни в чём суть МОП.
#242 #400625
>>400610

Само название МОП я взял из этой шуточной статьи (англ): http://www.epixa.com/2012/04/array-oriented-programming.html

> я везде использую массивы


Возможно что это плохо. Смотри, почему плохо использовать массив вместо объекта:

- у объекта определены поля, у массива нет. Сравни 2 кода:

function doSmth(array $comment) {
...

function soSmth2(Comment $comment) {
....

Во втором случае мы можем открыть класс Comment (1 клик в IDE) и увидеть какие у него есть поля и и методы. А в функции с массивом что ты будешь делать?

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

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

Преимущество массивов:
- чуть быстрее писать код (не надо тратить время на написание класса)

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

Или у тебя веские причины есть?
#242 #400625
>>400610

Само название МОП я взял из этой шуточной статьи (англ): http://www.epixa.com/2012/04/array-oriented-programming.html

> я везде использую массивы


Возможно что это плохо. Смотри, почему плохо использовать массив вместо объекта:

- у объекта определены поля, у массива нет. Сравни 2 кода:

function doSmth(array $comment) {
...

function soSmth2(Comment $comment) {
....

Во втором случае мы можем открыть класс Comment (1 клик в IDE) и увидеть какие у него есть поля и и методы. А в функции с массивом что ты будешь делать?

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

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

Преимущество массивов:
- чуть быстрее писать код (не надо тратить время на написание класса)

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

Или у тебя веские причины есть?
#243 #400626
>>400625

Естественно, в некоторых случаях использовать массивы абсолютно нормально, если они используются как коллекция. Например, набор комментариев можно прдеставить как массив объектов Comment
#244 #400627
>>400594

Я не знаю такой библиотеки, так что тебе придется самому изучить существубщие и выбрать (список можно взять по ссылкам выше на php-trends).
#245 #400628
>>400594

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


Главное, что ты осознаешь свои ошибки.
#246 #400631
>>399059
>>400007
Тред не читай - вопрос сразу задавай
Из модных молодежных уроков по РНР, задача про айфон в кредит:
http://ideone.com/jF2aRL

Я правильно понял, что пока долг не станет 5000 или меньше - будет выполняться тело цикла: ко времени уплаты прибавляется месяц, высчитывается размер выплаченных денег, за счёт процентов и комиссии пересчитывается долг. Затем пересчитывается долг с учётом платежа и дальше. Собственно, что у меня не правильно и в чём я просчитался?
#247 #400634
>>400631

Вторым внутри for идет условие продолжения цикла. То есть пока оно верно, цикл выполняется. Посмотри на свой код:

> $credit <= 5000;


У тебя в начале credit больше чем 5000, условие не выполняется и цикл не выполняется ни разу.

> что пока долг не станет 5000 или меньше


Нет. Выполняться будет пока долг меньше или равен 5000
#248 #400635
>>400634
Гхм, да, лажанулся. Поменял на $credit >= 5000, но что-то опять не то. Увы, мне скоро вставать на работу, так что на тему "почему я такой идиот" отпишусь в субботу.
#249 #400638
>>400628
…Слишком поздно.
#250 #400644
И, да, сразу по поводу PDO.
Нашел два варианта установки атрибутов:

[CODE]
//Вариант I:
<?php
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, $user, $pass);
$pdo ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); //Как еще один атрибут установить?
?>[/CODE]

//Вариант II:
<?php
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
);
$pdo = new PDO($dsn, $user, $pass, $opt);
?>[/CODE]
Собственно, два вопроса:
1. какой из вариантов надо(рекомендуется/правильно) использовать?
2. Как в первом варианте, установить несколько атрибутов?
#251 #400645
[CODE]
<p> test</p>
echo 'test';

var test ='Test Text Here'
function MakeTest(test){
alert(test);
}
[/CODE]
#252 #400646

>>400644
>>400645

А как код оформлять?
#253 #400663
>>400550
Вообщем, вот. Когда пытаюсь добавить в базу данные (http://ideone.com/hNaH46), он выводит след. ошибку:

add_albums: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`music`.`bands_albums`, CONSTRAINT `fk_band+albums_albums1` FOREIGN KEY (`album_id`) REFERENCES `albums` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

При этом в таблицу добавлены записи 1,2,3, и стопарится он на последнем, 4ом.

Вот SHOW CREATE TABLE bands_albums:
CREATE TABLE `bands_albums` (
`album_id` int(11) NOT NULL,
`band_id` int(11) NOT NULL,
PRIMARY KEY (`album_id`,`band_id`),
KEY `fk_band+albums_albums1_idx` (`album_id`),
KEY `fk_band+albums_bands1_idx` (`band_id`),
CONSTRAINT `fk_band+albums_albums1` FOREIGN KEY (`album_id`) REFERENCES `albums` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_band+albums_bands1` FOREIGN KEY (`band_id`) REFERENCES `bands` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
#254 #400666
ОП, решил задачку про палиндром, вроде костыльно. Я ебался два дня по часу и единственное, что высрал, тут:
http://ideone.com/ltDCcI
#255 #400667
>>400666
Ну бро, ну посмотри сам на вывод, разве не очевидно, что ты где-то ошибся?
#256 #400668
>>400667
Там пишет, Не палиндром, Не палиндром, если символы отличаются.
Я не пойму, как это сделать, блин. Если пишу echo "Палиндром" после if, то независимо от содержимого if, все равно выдается "Палиндром". Сейчас еще подумаю, сделаю, если не получится, подскажите.
#257 #400670
>>400668
Ты же понимаешь, как работают циклы? Так вот у тебя в теле цикла вывод этого "палиндром"/"непалиндром". Т.е. сколько букв в слове, столько раз он тебе и выводит. Если уж ты хочешь делать так, то введи какую-нибудь булевскую переменную и присваивай ей false на несовпадении, а свой иф по той переменной запихни после цикла.
#258 #400671
>>400670
Булев я еще не проходил. Насчет циклов у меня есть вопросы, нижу озвучил. Вот наговнокодил немного другой вариант, он работает:

А вот с циклами подробнее, можно? Они "шагают" одновременно? Поэтому не обязательно впихивать иф в фор, для того, чтобы пользоваться одной переменной в двух циклах, допустим, $symbol1 (в моем случае)?
То есть, допустим я в фор считаю переменную $exam с шагом в 1 по 20 раз, а снизу размещаю цикл иф, который использует переменную $exam. Даже не находясь внутри цикла фор, иф каждый раз берет функцию $exam + 1?
http://ideone.com/S3hQme
#259 #400672
>>400671

>Они "шагают" одновременно?


Нет, они выполняются по очереди. Вот в текущем варианте ты просто записал последовательно от первой до последней буквы в одну переменную, и от последней до первой во вторую, а после цикла сравнил. Т.е. твоя программа просто первую и вторую букву сравнивает. "А роза упала на лапу Азойа" она палиндромом считает.
#260 #400673
>>400672
Блять, у меня уже сил нет, она вообще работать перестала, пиздец. Ну как она делается-то, блять?
#261 #400689
>>400644

> Как еще один атрибут установить?


Очевидно, добавить еще одну строчку

$pdo->setAttribute(....)

На практике достаточно выставить ATTR_ERRMODE = EXCEPION, остальные вроде не особо нужны. Я не уверен, стоит ли ставить тут FETCH_OBJ, ведь это влияет на все приложение. Плюс, хочу предупредить что то, что возвращает FETCH_OBJ (объекты класса stdObject) не сделает твой код ООП, так как stdObject это фактически массив, а не объект.

> какой из вариантов надо(рекомендуется/правильно) использовать?


Если работает то без разницы.

>>400646

Не знаю.

`$x = $y;` тоже не рабоатет?
#262 #400691
>>400663

Сразу советы:

> try/catch (PDOException $e)


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

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

> Cannot add or update a child row: a foreign key constraint fails


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

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

Алсо, это читал? http://denis.in.ua/foreign-keys-in-mysql.htm

Из-за NO ACTION ты не сможешь удалять группы или альбомы.
#263 #400692
>>400671

> Булев я еще не проходил.


Он имел в виду положи изначально в переменную нолик, а если встретил неправильную букву то единичку. Тогда после цикла будет видно, были неправильные буквы или нет
#264 #400693
>>400673

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

http://codepad.viper-7.com/
#265 #400694
>>400663

Также, исключнеия были придуманы чтобы избавиться от этих уродливых return true/return false и кучи if и что ты делаешь? ты снова используешь return false. Ну что же ты делаешь-то.
#266 #400695
>>400663

Также, переменные можно передавать прямо в execute если хочешь:

$query->execute(array(
':band_id' => $band_id,
....
));

При этом мы не указываем что это числа через PDO_INT, и они будут подавлены в запрос скорее всего как строки в кавычках. Но MySQL это в данном случае без разницы.
#267 #400696
>>400663

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

$library->query("INSET ..." , array('band_id' => $nabd_id));

Но я с ними не знаком. Можешь поискать на php-trends сам если хочешь.
#268 #400697
>>400666

По твоим ссылкам белый экран. Запости код куда-нибудь еще. И не сдавайся. Задача может быть сложной, но тебе это только пойдет на пользу. если ты в итоге ее решишь.
3019 Кб, 2369x2000
146 Кб, 1280x720
Воннаби #269 #400711
Вот что опытный знакомый посоветовал. Сижу читаю.

http://www.w3schools.com/html/default.asp
#270 #400712
>>400711

Можешь почитать, хотя по моему это больше справочник чем туториал. Мне все же вариант самоучителя на htmlbook больше нравится.

Также есть

http://htmlacademy.ru/courses
и курс HTML на Codeacademy: http://www.codecademy.com/tracks/web

Но он там довольно базовый. Я тебе потом советую порешать задачки, про которые я писал выше и показать решения.
#271 #400713
>>400663

Так как я периодически вижу неправильное использование try/catch, я написал урок по исключениям в PHP: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
#272 #400714
>>400712

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


Обязательно порешаю.
#273 #400742
>>400697
Задача на палиндром, не работает нихуя.
http://ideone.com/DbWWw2
#274 #400759
>>400742
Так ты просто цикл прогоняешь впустую. Ты вообще как себе логику программы представляешь? Словами там объясни, или блок-схему нарисуй, если можешь в них.
#275 #400761
>>400742
У тебя проверка символов происходит вне тела цикла. То есть уже после того, как все итерации цикла прошли ты сравниваешь значения, которые остались после этого цикла, то есть которые были на последней итерации.
#276 #400762
>>400742

Ты сравниваешь только 2 буквы из всех. Так как повторяются только действия внутри цикла. А if стоит после — значит он выполянется один раз и уже после выполнения цикла:

... тут то что выполняется до цикла ...

for (....) {
.. тут тело цикла, выполняется несколько раз ...
}

... тут то что выполняется после цикла ...
#277 #400763
>>400742

Кстати, ты решал задачи про айфон и про вклад в банк? Они тоже на циклы, только проще.
#278 #400794
>>400543

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


Сделать третий шаблон и запихнуть туда повторяющиеся части или что?

>> this.cells[x] !== undefined


>Есть оператор in, зачем костыли?


Конструкция вида this.cells[x] In this.cells не работает. А in только для объектов, не?

>> Util.clearClass(td);


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


this.cells[x][y].clear(...);
То есть ты должен сказать ячейке: «очисти себя», а не лезть руками ее очищать.
Смотри, а не может этот метод clearClass быть общим, ведь и другим классам он может понадобиться?

>> target.setAttribute('oncontextmenu'


>Костыль. Используй предотвращение действия по умолчанию в обработчике mousedown, если не работает то сделай обработчик события oncontextmenu через addEventListener.


Если я отдельный обработчик для 'oncontextmenu' буду делать, то получится много копипасты.
#279 #400809
Йоу, пэханы, кто-нибудь может по хардкору пояснить по поводу этих выражений, где присутствует оператор :: ?
Например, иногда во всяких фрагментах кода вижу:
blablabla :: function bla bla. Но вот по самому этому явлению двух двоеточий нигде инфу найти не могу. Как это называется, как нагуглить про это?
#280 #400811
>>400809
Ну, короче, не знаю про пых, но в крестах это либо испорльзование чего-то из неймспейса без юзинг, либо использование статической переменной класса или типа объявленного в классе, либо при наследовании указание на один из родительских классов (вызов его иетода, использование его протектед или паблик члена итд).
#281 #400813
>>400811
я вообще думал, что это просто знак принадлежности почему-то так казалось
Спасибо за разъяснение, бро
#282 #400814
>>400794

>А in только для объектов, не?


Надо вернуться к основам языка явакрипт.

in проверяет есть ли в словаре (хеше, объекте) данный ключ. А в JS почти все, кроме примитивов, является объектами так что in применим почти ко всему.

in надо писать маленькими буквами.

> this.cells[x] In this.cells не работает.


Пожалуйста, прочитай сам описание оператора in например тут http://learn.javascript.ru/object и увидишь в чем ошибка. Также, открой в браузере консоль (Ctrl + Shift + J) и для закрепления выполни несколько примеров типа

2 in [1,2]
'apply' in (function() {})

ит.д.

Если ты пришел из какого-то другого языка, где тоже есть in, то учти что в яваскрипте он может работать по-другому.
#283 #400815
>>400809

Это оператор доступа к статическим элементам класса: http://php.net/manual/ru/language.oop5.paamayim-nekudotayim.php
#284 #400817
>>400811

В «крестах» другой синтаксис, так что твоя информация вряд ли как-то поможет анону.
#285 #400818
>>400691

> Видишь, база данных только что защитила тебя от вставки неправильных данных.


Спасибо, понял ошибку! Точнее ошибки то и нет, просто реально пропустил id'шники при заполнении таблицы

> Алсо, это читал? http://denis.in.ua/foreign-keys-in-mysql.htm


Щас буду читать
>>400695

>При этом мы не указываем что это числа через PDO_INT


На уроках расказывали, что лучше указывать тип данных
>>400696
Про них мне уже тут говорили
>>400713
Анон, ты охуенен! Прочитаю сейчас. Я вообще этот try/catch скопировал откуда-то не думая. А сейчас буду понимать
Палиндром #286 #400827
Это снова мразь с неработающим палиднромом, скажите мне уже решение, я не могу, ну весь день ебался и толку?
http://ideone.com/EpR5iL
#287 #400828
>>400827

Чтобы понимать как работает код, можно поставить echo внутрь цикла которое будет вывоить чему равны переменные $i, $symbol1, $symbol2, $number, $palindrom после каждого шага.

echo "i=$i, symbol1=$symbol1, ... \n";

Тогда я думаю ты увидишь почему не работает.
#288 #400832
>>400818

>http://denis.in.ua/foreign-keys-in-mysql.htm


Прочитал. Хочу пояснить. Сейчас у меня во всех таблицах стоит ON DELETE NO ACTION и ON UPDATE NO ACTION. Если мне, например, нужно что-бы при изменении bands.band_id так же менялось band_id в других таблицах, где оно есть, а так же при удалении в bands записи с band_id=n, так же удалялись записи в других таблицах, где band_id=n, то мне надо поставить ON DELETE CASCADE и ON UPDATE CASCADE. Так?
>>400713
Прочитал. Честно говоря, не до конца понял. Мне, в итоге так надо сделать: http://ideone.com/VnUfzJ
или так: http://ideone.com/SbsNqo
Я на сколько помню try/catch использовать начал, что бы было сразу видно в какой ф-ии ошибка (в echo её имя прописываю)
#289 #400841
>>400828
Спасибо, значение $palindrom выдавало единичку (отрицательное сравнение) в самой первой итерации и когда я сравнивал значение $palindrom вне цикла, то сравнивалось последнее значение, которое было 0 (положительно), поэтому мне выдавало, что задача - палиндром.
Сейчас я сделал так, что палиндром по умолчанию равен нулю, если символы не совпадают, то прибавляется один, выдается "результат - непалиндром" и цикл завершается. Если цикл не прервать, то не получается, блять, как сразу не заметил.
http://ideone.com/dcHTdR
#290 #400843
>>400841
Проебал ссылку.
http://ideone.com/c64Hip
#291 #400846
У меня такая идея на будущее появилась. Сейчас у меня таблица - это объект, а ее строки - свойства. Так вот, если сделать строки тоже объектами, то управлять данными таблицы будет проще
Вот как прототип: http://ideone.com/z28xZq
Лучше же этого: http://ideone.com/bB6uC9
#292 #400864
>>400846

Кажется ты скоро изобретешь TableDataGateway и RowDataGateway.

Прежде чем изобретать велосипед, почитай пожалуйста мой (или любой другой) обзор паттернов работы с БД: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

Там упоминаются конкретные фреймворки и библиотеки.

Ну и мнение можешь высказать (мне же важно знать, понятно написано или нет), вопросы задать.
#293 #400871
>>400832

> то мне надо поставить ON DELETE CASCADE и ON UPDATE CASCADE. Так?


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

Ну и никогда не меняй id. Это очень опасная операция которая несет только проблемы.
#294 #400873
>>400864

На всякий случай добавлю, что все эти паттерны описал Мартин Фаулер в книге «Шаблоны корпоративных приложений» ( Patterns of Enterprise Application Architecture ) если тебе интересен первоисточник.
#295 #400881
>>400832

> Мне, в итоге так надо сделать


Тебе не нужен try/catch и проверка

if(!$query->execute( ))

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

try/catch/echo не нужен так как PHP по умолчанию записывает в лог и выводит на экран информацию об исключении, включая файл и номер строки. Если не выводит − включи display_errors (но не делай это на боевом сервере).

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

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

$query->execute(); // этого достаточно

Ну и не забудь поставить ATTR_ERRMODE = EXCEPTION
#296 #400892
>>400864

Я не тот, к кому ты это адресовал, просто хочу сказать по поводу твоих статей.
Охуенно, пиш ещё. Особенно про храенине древовидных структур в БД и DI понравилось - хрен где еще найдешь описание таких сложных вщей таким просытм языком. В общем пиши еще.
#297 #400897
>>400794

> Сделать третий шаблон и запихнуть туда повторяющиеся части или что?


Сделай один шаблон вместо двух.

> А in только для объектов, не?


Массив — это объект.

> Смотри, а не может этот метод clearClass быть общим, ведь и другим классам он может понадобиться?


Я и не предлагаю его удалять. Я предлагаю просто перенести код очистки одной ячейки из Field в Cell.

> Если я отдельный обработчик для 'oncontextmenu' буду делать, то получится много копипасты.


Нет. Там обработчик, вызывающий только preventDefault(), не вижу где копипаста.
#298 #400898
>>400818

> лучше указывать тип данных


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

>>400841

Анон, обе этих ссылки

http://ideone.com/dcHTdR
http://ideone.com/c64Hip

дают мне белый экран. Как ты это делаешь?

Причем открыть через ideone.com/plain/xxx их тоже не получается.

Потому я не могу проверить код, но по описанию выглядит верно. Но все равно лучше показать код — там могут быть еще сомнительные моменты.
#299 #400899
>>400898

>Жаль, что PDO не умеет указывать тип в плейсхолдере.


Умеет же, даже принудительно.
#300 #400900
>>400846

С цифрами ты быстро запутаешься. Удобнее использовать объекты:

$members = $memberMapper->findByNames(array('Paul Mccartney', 'John Lennon'));

// защита от опечатки
assert(count($members) == 2);

$band = $bandMapper->findByName('Beatles');

$bandMapper->setMembers($band, $members);
#301 #400901
>>400846

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

class Band
{
private $members = array(); // массив объектов Member
...

Но тогда встают вопросы: надо ли при загрузке групп из БД загружать все связанные записи автоматически или же только если это явно запрошено? Надо ли сохранять их автоматически?

Связи хорошо реализованы в Doctrine 2 — там тебе достаточно в аннотации к полю написать, с какой сущностью и каким типом связи оно связано, а доктрина сама будет загружать их при обращении.
#302 #400902
>>400892

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

>>400899

В плейсхолдере — это в смысле в тексте запроса (а не в bindValue)? Не умеет же.
#303 #400905
>>400902

>В плейсхолдере — это в смысле в тексте запроса (а не в bindValue)? Не умеет же.


Так в чём проблема, если тебе нужно определить тип данных, почему не использовать bindValue? Зачем нужно указывать это именно в теле запроса?
#304 #400907
>>400905

Потому что писать много букв приходится, а я ленивый. Я бы лучше нашел библиотеку которая позволяет запрос сделать и данные подставить одной функцией.
#305 #400909
оп, а поясни мне зачем нужно указывать время которое ты потратил на задачу?

например: я работаю фултайм в офисе, жира, скрам, вот это всё.

я работаю 100% времени над одним проектом.

и требуется логировать в билеты время потраченное на них.

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

тогда в чём суть этого логирования?
#306 #400910
>>400909

Не знаю, мне кажется тебе такие вопросы лучше руководству задавать. Может они статистику хотят вести, может еще что-то, может это вообще не обязательно.
#307 #400911
>>400910
руководство отвечает что-то уровня "НУ ПРОСТ)))"
вот допустим я написал хуёвый код
и теперь я хочу его отрефакторить с классами, наследованием, вот этим вот всем. с одной стороны это необязательно. с другой стороны говнокод хуже чем среднекод.

вот я и не знаю мне логировать это время или нет? ведь с какой-то стороны это моя проблема что не написал нормально с самого начала
#308 #400912
оп, читаю макконела, вижу предложение:

>Если класс имеет только данные, но не формы поведения, спросите себя, действительно ли это класс.


о чём речь?
про класс без функций?
#309 #400913
>>400911

Я не знаю, за что у вас наказывают, а за что хвалят. С моей точки зрения программиста, то, что ты рефакторишь, а не бросаешь код как есть, хорошо, но у вашего руководства может быть другой взгляд на вещи. Например, ты тратишь деньги компании на бесполезное перетряхивание работающего кода. Кто их знает.
#310 #400914
>>400912

Да.

По моему, это все равно класс, так как у него могут быть определены поля, наследование, реализуемые интерфейсы, константы.
#311 #400915
>>400914
нет, не да

>Избегайте классов, имена которых напоминают глаголы Как правило, класс, имеющий только формы поведения, но не данные, на самом деле классом не является. Подумайте о превращении класса вроде DatabaseInitialization()или StringBuilder()в метод какого#нибудь другого класса


поведение это что-то другое
только я впервые сталкиваюсь с таким определением.
ты понимаешь что-нибудь?
#312 #400916
>>400915

Поведение — это методы. Главная идея ООП как раз заключается в том, что объект это данные + поведение, собранные вместе.

В том тексте просто свалены вместе разные предложения, не связанные друг с другом и речь о разных классах.
#313 #400917
>>400915

> класс, имеющий только формы поведения, но не данные


Это класс без полей, содержащий только методы. Я опять же прокомментирую, есть случай когда это уместно (методы делают статическими), это паттерн Utility Class.
#314 #400919
>>400916
кароч, помогай с рефакторингом
я вчера у тебя спрашивал про классы, ты сказал задать в одном классе всё поведение, и из него вызывать по очереди методы
например есть контроллер a, данные data и класс class:
class a{
$class = new Class(-);
$class->setData($data);
$class->validation(-);
$class->prosessData(-);
$class->doSomFing(-);
$class->helloFriend(-);

$result = $class->getResult(-);
}

раньше я делал в классе метод run(), и эту простыню писал в нём. сейчас попробую это сделать вне класса. мне кажется это некрасивым и получается что будет дохуя открытых матодов в классе, и например $class->prosessData(-); не будет работать если перед ним не вызвать $class->validation(-);
это же нарушение абстракции и вообще говнокод. тогда почему ты советуешь так делать?
#315 #400920
>>400919

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

function processData( )
{
$result = $this->validate( );
....
}

Такой код, в котором ты должен помнить последовательность вызовов, это плохо. код, который сам вызывает нужные методы — хорошо.
#316 #400921
>>400919

Более того, в твое коде вообще можно вырезать все обязатеьные методы и сократить до

$obj = new Class($data);
$obj->doSomthOptional(); // опциональные вызовы которых может и не быть
$result =$obj->geResult( );

Если я не ошибаюсь.
#317 #400923
>>400919

>почему ты советуешь так делать?


Потому что в твоем посте было мало подробностей
#318 #400924
>>400920
>>400921
вобщем смотри что мне надо

есть массив данных
у него есть поле type
которое может принимать 1 или 2

если пришло 1 - я делаю

$class->validation(-);
$class->prosessData(-);
$class->doSomFing(-);
$class->helloFriend(-);

если 2 -
$class->prosessData(-);
$class->doSomFing2(-);
$class->helloFriend(-);

и я заебался
как это сделать?
последнее до чего я дошёл - класс с методами, не помню какой это паттерн
от него наследуются классы тип1 тип2
и в каждом есть метод run() в которым напрямую перечислены методы в том порядке в каком их нужно вызывать

в контроллере я определяю тип, и через иф делаю $hello = new тип1 или $hello = new тип2
и затем $hello ->setData($data);
но мне не нравится эта часть с иф

как сделать чтобы было по ооп чтобы все охуели как я могу?
#318 #400924
>>400920
>>400921
вобщем смотри что мне надо

есть массив данных
у него есть поле type
которое может принимать 1 или 2

если пришло 1 - я делаю

$class->validation(-);
$class->prosessData(-);
$class->doSomFing(-);
$class->helloFriend(-);

если 2 -
$class->prosessData(-);
$class->doSomFing2(-);
$class->helloFriend(-);

и я заебался
как это сделать?
последнее до чего я дошёл - класс с методами, не помню какой это паттерн
от него наследуются классы тип1 тип2
и в каждом есть метод run() в которым напрямую перечислены методы в том порядке в каком их нужно вызывать

в контроллере я определяю тип, и через иф делаю $hello = new тип1 или $hello = new тип2
и затем $hello ->setData($data);
но мне не нравится эта часть с иф

как сделать чтобы было по ооп чтобы все охуели как я могу?
75 Кб, 402x604
#319 #400926
>>400689
Добра тебе.
#320 #400928
>>400924

Во-первых, почему ты используешь какие-то 1 и 2, а не константы?

Во-вторых, можно сделать например так:

if ($type == Class::SOME_TYPE) {
$this->validate( );
}

$class->prosessData(-);
$class->doSomFing(-);
$class->helloFriend(-);

Так что тебе не нравится?

Плюс моя идея выше про перенос методов.
#321 #400929
Господа, есть ли смысл заморачиваться и следовать PSR-2? Мой код разборчив, где-то я ему следую, где-то нет, но эти стандарты очень медленно для ИТ меняются, например, они полтора года назад всё же договорились, что допустили ошибку, и что вместо 4 пробелов для отступов будет использоваться всё-таки Таб, но никакого движения, насколько я понял, с тех не совершено. Меня еще раздражает вот эта идиотия, что для классов и методов открывающую скобку надо ставить на новой строке, а для управляющих конструкций — на той же самой, я всё начинаю с новой строки. Или идиотия с обрамлением пробелами условий у тех же управляющих конструкций, где-то код читабелен и без этого пробела, где-то нет, и хочется поставить пробел. Ну и так далее, там много таких, странных вещей.
#322 #400930
>>400928

А, там еще if нужен для выбора между doSomFing() и doSomFing2()

И еще один вопрос, почему data не сделать объектом и не вызвать методы на нем?

$obj = Data::createFromArray($data);
$result = $obj->process(); // вызвает что надо в зависимости от типа

Если различия в логике небольшие, проще сделать это через if.
#323 #400931
>>400929

Стоит соблюдать чтобы не увеличивать степень хаоса.

Насчет соблюдения. Там в PSR-2 в конце есть результат опроса разработчиков популярных фреймворков и CMS. Большинство из них следует одному стандарту. В том числе 4 пробелам.

Это и Симфони, и zend framework. Не вижу, в чем проблема, если Симфони следует стандартам, делать так же.

> Или идиотия


Это субъективно. Если ты переучишься, тебе идиотией будет казаться твой старый код. Мне например идиотией кажется не следовать стандарту. Кому-то другому кажется идиотией ставить 4 пробела, а не 2. И так далее.

И конечно 4 пробела лучше чем таб, так как везде отображаются корректно. Таб неотличим на вид от пробела. Табы — пережиток древних времен. Я вообще не вижу ни одного преимущества от их использования, только путаница и проблемы. Любой человек прочевший хоть одну книгу по юзабилити это поймет.
#324 #400932
>>400930>>400928
тот класс что я пишу - это и будет

>$obj = Data::createFromArray($data);


массив мне приходит снаружи программы

if ($type == Class::SOME_TYPE) {
$this->validate( );
}
ужас какой
ну ладно один класс, а потом появится второй, третий, и мне перед каждым классом писать это?
#325 #400935
>>400932
оп, напиши своё расписание.
я думал сейчас с тобой обсужу и сяду писать, а ты съебался
и часто вижу что ты по ночам отвечаешь, только непонятно ты ночью начинаешь отвечать или заканчиваешь
#326 #400936
>>400931

>Это и Симфони, и zend framework. Не вижу, в чем проблема, если Симфони следует стандартам, делать так же.


Ну, я же объяснил.

>Это субъективно. Если ты переучишься, тебе идиотией будет казаться твой старый код. Мне например идиотией кажется не следовать стандарту. Кому-то другому кажется идиотией ставить 4 пробела, а не 2. И так далее.


Ничего подобного, дело не в том, что я так привык — когда я пишу JS, я ставлю скобочку в конце строки, потому что он автоматически вставляет точку с запятой в конце строки, и весь код может пойти по пизде. Я так привык. Но когда я пишу PHP, я предпочитаю ставить скобку в начале строки всегда, потому что кода обычно в разы больше, чем JS, и мне его так удобнее читать, и если бы я мог, я бы делал то же самое и в JS. Какого чёрта какие-то непонятные мужики будут мне указывать, как мне должно быть удобно читать код, кто они такие? Да и никто, в общем-то, стандарт-то неофициальный.

>И конечно 4 пробела лучше чем таб, так как везде отображаются корректно. Таб неотличим на вид от пробела. Табы — пережиток древних времен. Я вообще не вижу ни одного преимущества от их использования, только путаница и проблемы.


Не согласен, объясню свою точку зрения. Кому-то удобнее 2 пробела, кому-то 1, кому-то 4, кому-то 8 — ну, например. Пробелами ты навязываешь всем одинаковые расстояния, которые заложены в типографическом начертании, Табы же гибкие: если кому-то удобно, он настроит себе ширину Таба в IDE на 2 пробела, если удобен 1 пробел, то Таб будет одним пробелом. И все счастливы, потому что каждый работает так, как он привык. А если я открываю файл с PSR-2, это просто deal with it, будешь блевать от 4 пробелов до конца своих дней над этим проектом. Стоит также упомянуть, что изначально Таб использовался не только для табличных данных, но и красной строки; поэтому оставьте пробелы расстоянию между слов, а Таб — красной строке. Я тут пример привел, 1 пробел, 4, 8, я понимаю, что большинство людей пользуется либо 2-мя, либо 4-мя пробелами в любом случае, но всё равно, разница ведь между 2-мя и 4-мя есть, верно?

А про корректность отображения, это какие-то городские легенды, никогда этого не встречал, все для работы уже пользуются человеческими IDE, такое просто не может произойти. И когда я у более опытных специалистов об этом спрашиваю, никто не может толком объяснить проблему корректности отображения в разных редакторах/ОС, что это такое, вообще?

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

>Любой человек прочевший хоть одну книгу по юзабилити это поймет.


Я специалист по HCI, мне не нужно ничего читать.
#326 #400936
>>400931

>Это и Симфони, и zend framework. Не вижу, в чем проблема, если Симфони следует стандартам, делать так же.


Ну, я же объяснил.

>Это субъективно. Если ты переучишься, тебе идиотией будет казаться твой старый код. Мне например идиотией кажется не следовать стандарту. Кому-то другому кажется идиотией ставить 4 пробела, а не 2. И так далее.


Ничего подобного, дело не в том, что я так привык — когда я пишу JS, я ставлю скобочку в конце строки, потому что он автоматически вставляет точку с запятой в конце строки, и весь код может пойти по пизде. Я так привык. Но когда я пишу PHP, я предпочитаю ставить скобку в начале строки всегда, потому что кода обычно в разы больше, чем JS, и мне его так удобнее читать, и если бы я мог, я бы делал то же самое и в JS. Какого чёрта какие-то непонятные мужики будут мне указывать, как мне должно быть удобно читать код, кто они такие? Да и никто, в общем-то, стандарт-то неофициальный.

>И конечно 4 пробела лучше чем таб, так как везде отображаются корректно. Таб неотличим на вид от пробела. Табы — пережиток древних времен. Я вообще не вижу ни одного преимущества от их использования, только путаница и проблемы.


Не согласен, объясню свою точку зрения. Кому-то удобнее 2 пробела, кому-то 1, кому-то 4, кому-то 8 — ну, например. Пробелами ты навязываешь всем одинаковые расстояния, которые заложены в типографическом начертании, Табы же гибкие: если кому-то удобно, он настроит себе ширину Таба в IDE на 2 пробела, если удобен 1 пробел, то Таб будет одним пробелом. И все счастливы, потому что каждый работает так, как он привык. А если я открываю файл с PSR-2, это просто deal with it, будешь блевать от 4 пробелов до конца своих дней над этим проектом. Стоит также упомянуть, что изначально Таб использовался не только для табличных данных, но и красной строки; поэтому оставьте пробелы расстоянию между слов, а Таб — красной строке. Я тут пример привел, 1 пробел, 4, 8, я понимаю, что большинство людей пользуется либо 2-мя, либо 4-мя пробелами в любом случае, но всё равно, разница ведь между 2-мя и 4-мя есть, верно?

А про корректность отображения, это какие-то городские легенды, никогда этого не встречал, все для работы уже пользуются человеческими IDE, такое просто не может произойти. И когда я у более опытных специалистов об этом спрашиваю, никто не может толком объяснить проблему корректности отображения в разных редакторах/ОС, что это такое, вообще?

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

>Любой человек прочевший хоть одну книгу по юзабилити это поймет.


Я специалист по HCI, мне не нужно ничего читать.
#327 #400951
>>400932
кароч я только что прочитал про Последовательную связность, там поясняется что вызов методов друг за другом это ок. я просто создам метод и там размещу подряд все вызовы
#328 #400954
>>400936
поддерживаю чувака,
у нас на фирме тоже были споры про табы и пробелы, но после случая когда работали с иностранной командой программеров они выдали замечательную фразу:
"таб это разметка, а пробел это символ"
потому как бы вы не извращались, отступы циклов,функций - это разметка, и должен быть именно 1 таб, а каждый уже в своей ide выставляет как ему нравится 2-4 пробела. А пробел должен применяться только как символ.
И после этого наши все споры утихли. Всем все стало понятно.
#329 #400956
>>400931

>Я вообще не вижу ни одного преимущества от их использования


почитай http://habrahabr.ru/post/118208/
куча преимуществ таба перед пробелом
sage #330 #400957
PHP настолько вонючая параша, что приходится завлекать людей в тред котиками и анимешечками.
#331 #400958
>>400957
ну а хуле делать если мы не можем в нормальные языки?
хоть как-то зарабатываем
#332 #400961
>>400956

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


Ну охуеть. Вот это боль и страдание: таб на пробел больше, чем он привык. Ай-яй-яй.
#333 #400962
>>400961

>Ну охуеть. Вот это боль и страдание: таб на пробел больше, чем он привык. Ай-яй-яй.


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

удобное для тебя форматирование - это как удобный стул и стол
#334 #400965
>>400962

>удобное для тебя форматирование - это как удобный стул и стол


Именно. Приятно сидеть на удобном стуле и за удобным столом, но это не является ни с какого бока не является необходимым требованием для написания кода.
А вот привитие всем единого стандарта - это хорошее дело, да.
#335 #400966
>>400965
ты решил поспорить о значении слова необходимый?
давай.
лично для меня удобный стул, стол, мощная пека - необходимые условия для написания кода
#336 #400989
>>400239
Бамп, хочу больше ваших кулсторей.
#338 #400992
>>400991
Алсо, при нажатии правой кнопки все равно выскакивает меню браузера.
#339 #401017
>>400936

> Табы же гибкие: если кому-то удобно, он настроит себе ширину


Ложь. Что тебе мешает настраивать ширину отступа в тексте с пробелами? Просто напиши скрипт для своего вима или емакса и настраивай так как тебе нравится.

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

95% людей этот аутизм с настраиванием отступов не нужен и они хотят видеть код как его написал автор.

> тоит также упомянуть, что изначально Таб использовался не только для табличных данных, но и красной строки; поэтому оставьте пробелы расстоянию между слов, а Таб — красной строке. Я тут пример привел, 1 пробел, 4, 8, я понимаю, что большинство людей пользуется либо 2-мя, либо 4-мя пробелами в любом случае, но всё равно, разница ведь между 2-мя и 4-мя есть, верно?



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

> А про корректность отображения, это какие-то городские легенды, никогда этого не встречал


Гитхаб или любой пастебин или команда cat в консоли. Алсо, когда ты оказываешься на чужом компьютере/устанавливаешь ос на сервер, там всегда табы отображаются как 8 пробелов и это неудобно. И ни времени ни желания это перенастраивать каждый раз у меня нету.

> Я специалист по HCI


Тогда объясни как глазами отличить табы от пробелов и увидеть например что они используются неправильно? Например, в редакторе Sublime Text или PhpStorm в стандартном режиме?

И если ты специалист, то объясни, нормально ли это когда разные символы выглядят неразличимо?
#340 #401018
>>400954

1) как отличить таб от пробела на глаз?

2) как смотреть код с табами на гитхабе, пастебинах и в консоли? там 8 пробелов выводится

3) что вам любителям табов мешает написать скрипт для емакса и выводить код с пробелами с любыми отступами?
#341 #401019
>>400956
>>400961
>>400962

Что вам аутистам мешает настроить отображение кода в своем редакторе как вам нравится, а наружу экспортировать код с 4 пробелами? Уверен, в продвинутых редакторах вроде вима и емакса это делается за 5 минут.

Мне например нравится когда код раскрашен. Но я же не требую от всех писать код в формате HTML, а просто использую редактор с подсветкой. Что вам мешает также поступать?
#342 #401020
>>400957

Дай угадаю, ты невостребованный сишник-недоучка, которому припекакет от популярности php?
104 Кб, 1366x548
#343 #401024
http://yiiframework.ru/doc/guide/ru/quickstart.first-app

>>Запускаем yiic в консоли со следующими параметрами: % YiiRoot/framework/yiic webapp WebRoot/testdrive


Сука, нет у меня ни файла yiic, ни папки framework! Помогите разобраться, хули в документации одно, а у меня на пеке другое. А то припекает. Начинать всегда так сложно. Я только что-бы скачать и понять куда консоль скачала yii потратил времени
#344 #401027
>>400936

> Какого чёрта какие-то непонятные мужики будут мне указывать


Странно что тебе не очевидно почему. Я объясню.

Мало кто пишет код для самого себя и целиком сам. Кто-то работает в команде. Кто-то подключает внешние библиотеки. Кто-то копирует примеры со стековерфлоу. Кто-то переходит из одной команды в другую. Кто-то участвует в больших open source проектах и пишет код для них.

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

Удобно, когда код везде написан в одинаковом стиле.

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

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

Для меня PSR-2 вообще ничего нового не принес, я придерживался стандартов PEAR и Zend, а они точь-в-точь как PSR-2.

Потому это не дядьки указывают, а люди сознательно стремятся к поддержанию единого стиля. Те, кто не хотят, делают это исключительно из силы привычки, их меньшинство.
#345 #401030
>>400936

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


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

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


Результаты сравнения стандартов в конце прочитай. Большинство выбрало пробелы.
#346 #401034
>>400935

Расписание такое: читаю тред за завтраком, днем обычно работаю или чем-то занят, вечером могу зайти в тред если есть время. Иногда могу и днем. если делать нечего.

С этим ничего не поделать так как есть и другие дела кроме двачевания капчи.

Ты можешь писать мне на почту. но ее я читаю с такой же периодичностью или даже реже.

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

> ну ладно один класс, а потом появится второй, третий, и мне перед каждым классом писать это?


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

А ты читал пост на хабре про выпечку хлеба? Там как раз описан принцип YAGNI — тебе это может и не понадобиться.

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

Что меня напрягает, это то, что вызовы должны идти в определенном порядке и то, что у них нет аргументов и они ничего не возвращают. Не видя кода трудно сказать, но это может быть признаком неправильного кода.
#347 #401040
>>400956

Аргументы из статьи:

> Начнём с того, что большинство людей (по крайней мере на Хабре) предпочитают табы.


В PSR-2 есть сравнения стандартов, большинство предпочло пробелы.

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


C пробелами никто не мешает тебе настраивать любую величину отступа. Просто напиши уже скрипт под вим/емакс/whatever you use

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


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

> У пробелов нету ни одного существенного преимущество по сравнению с табами


Неверно. Преимущество использования только пробелов в отстутсвии путаницы. Я веду тред для начинающих и я вижу как их код на том же ideone разъезжается и разваливается при использовании табов.

Ну и наконец статья с аргументами за пробелы: http://habrahabr.ru/company/pvs-studio/blog/118204/
#348 #401041
>>400962

Ну так настрой удобное для тебя отображение кода в своем редакторе, а наружу выдавай оформленные по стандарту файлы.
#349 #401044
>>401019
какой емакс? импорт кода?
зачем его куда-то импортировать? и как если его пишут несколько человек через репозиторий?

откуда ты взял 4 пробела? замени их табом, и у каждого это будет столько пробелов сколько нужно
#350 #401045
>>400991

Вопрос: для чего ты подключил lodash? Если его убрать, ничего не изменится.

Подсказка: в шаблон можно подставлять переменные (мануал: https://lodash.com/docs#template ), например:

consoloe.log(_.template('У вас <%= money %> р на счету', { money: 100 });

У тебя 2 шаблона различаются только текстом (выиграл/проиграл) и классом на диве. Почему бы не сделать один шаблон и не передавать в него разные значения переменных?
#351 #401056
>>400991

> Cell.prototype.showMine = function(td) {


Зачем ты передаешь td? У тебя же есть this.td. Cell и так знает к какому элементу td она относится.

> Util.clearClass(this.getTd( ));


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

> if (this.hasMine) {


> return true;


Можно просто return this.hasMine;

> oncontextmenu не работает


В addEventListener не надо писать on перед названием. И кстати если делать preventDefault() в mousedown, этого недостаточно? Может contextmenu можно и не перехватывать?

> if ( ... (y in this.cells) ) {


Неправильно то, что касается игрека.

Алсо, вместо if там можно писать просто

return (a in b) && (c in d);

Так как in возвращают true или false, а && возвращает одно из значений которые он объединяет. Ты знаком с булевым типом, что такое true/false, как работает if? Как работает оператор &&, ! и || ? Если незнаком, то я могу позже написать мини-урок по ним или ссылку найти.

> if ( contentStr == content) {


> return true;


То же самое можно писать return a == b;

Кстати, ты удалил неиспользуемые фукнции? Удали.

Если открыть просмотр результата http://jsbin.com/logozojowo то серый оверлей закрывает не все окно. Ты забыл что у html или body браузеры могут по умолчанию выставить margin/padding (чтобы текст не прилипал к краям) и если он тебе не нужен то надо его явно обнулить.

В общем, работает и хорошо. Там конечно не все идеально на 100%, ну в играх идеального кода и не бывает, я думаю, хватит мучать эту задачу, давай исправим то, что я тут написал, уберем неиспользуемые функции и если серьезных ошибок не будет, то задача будет решена. Там еще других задач немало.
#351 #401056
>>400991

> Cell.prototype.showMine = function(td) {


Зачем ты передаешь td? У тебя же есть this.td. Cell и так знает к какому элементу td она относится.

> Util.clearClass(this.getTd( ));


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

> if (this.hasMine) {


> return true;


Можно просто return this.hasMine;

> oncontextmenu не работает


В addEventListener не надо писать on перед названием. И кстати если делать preventDefault() в mousedown, этого недостаточно? Может contextmenu можно и не перехватывать?

> if ( ... (y in this.cells) ) {


Неправильно то, что касается игрека.

Алсо, вместо if там можно писать просто

return (a in b) && (c in d);

Так как in возвращают true или false, а && возвращает одно из значений которые он объединяет. Ты знаком с булевым типом, что такое true/false, как работает if? Как работает оператор &&, ! и || ? Если незнаком, то я могу позже написать мини-урок по ним или ссылку найти.

> if ( contentStr == content) {


> return true;


То же самое можно писать return a == b;

Кстати, ты удалил неиспользуемые фукнции? Удали.

Если открыть просмотр результата http://jsbin.com/logozojowo то серый оверлей закрывает не все окно. Ты забыл что у html или body браузеры могут по умолчанию выставить margin/padding (чтобы текст не прилипал к краям) и если он тебе не нужен то надо его явно обнулить.

В общем, работает и хорошо. Там конечно не все идеально на 100%, ну в играх идеального кода и не бывает, я думаю, хватит мучать эту задачу, давай исправим то, что я тут написал, уберем неиспользуемые функции и если серьезных ошибок не будет, то задача будет решена. Там еще других задач немало.
#352 #401057
>>401024
Документация там по Yii, а у тебя Yii2, вот и все.
#353 #401058
>>401040

>Ну и наконец статья с аргументами за пробелы


только в комментах автора разгромили и везде поясняют за табы
#354 #401061
>>401058

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


Поясняю тебе один раз. Хреново, когда в одной команде нет одного стиля. В данном треде хорошим тоном считается использование четырех пробелов и двойных кавычек, потому что так решил ОП, который потом разбирает код новичков. Зачем ты влезаешь сюда со своими табапроблемами?
#355 #401063
>>401024

Так, панику отставить!

Начнем с ознакомительного урока про консоль: https://gist.github.com/codedokode/10539568 — прочти его и чтобы убедиться что все понял, выполни не менее 3 команд и просмотри подсказку по любой команде на выбор (там написано как). Также, просмотри чему у тебя равна PATH, это понадобится далее. Также, советую настроить нормальный, крупный шрифт так как по умолчанию там буквы не разглядеть.

Далее, ты скачал Yii2? Молодец, но мануал про Yii1. Небось еще и качал не с официального сайта?

Кстати мануал есть на русском на официальном сайте (а у тебя как я понял ссылка на неофициальный): http://www.yiiframework.com/doc/guide/1.1/ru/index

Мануал по Yii 2 — на английском: http://www.yiiframework.com/doc-2.0/guide-index.html — но может где-то есть перевод.

Далее, папки framework действительно нет, это потому что ты либо скачал что-то левое, либо установил не так. Я сейчас скачал архив с официального сайта - папка framework там есть. Исправляй.

Если ты хочешь установить Yii2, его вообще можно ставить через композер, что удобнее так как не надо ничего руками скачивать и распаковывать. Если ты захочешь освоиить композер, вот статья: http://habrahabr.ru/post/145946/ + я готов ответить на вопросы.

Подведу итог, что надо сделать:

- скачать нормальный архив и распаковать либо установить Yii2 композером
- убедиться что php у тебя находится в PATH и что команда php -v пишет версию php а не ошибку
- запускать файл не yiic (это для линукса), а yiic.bat. Либо же запускать yiic но такой командой

php path/to/yii/yiic ....

(то есть дописать в начало php)

Вопросы? Задавай, это как раз тред для начинающих и тех кто ничего не понимает.
#355 #401063
>>401024

Так, панику отставить!

Начнем с ознакомительного урока про консоль: https://gist.github.com/codedokode/10539568 — прочти его и чтобы убедиться что все понял, выполни не менее 3 команд и просмотри подсказку по любой команде на выбор (там написано как). Также, просмотри чему у тебя равна PATH, это понадобится далее. Также, советую настроить нормальный, крупный шрифт так как по умолчанию там буквы не разглядеть.

Далее, ты скачал Yii2? Молодец, но мануал про Yii1. Небось еще и качал не с официального сайта?

Кстати мануал есть на русском на официальном сайте (а у тебя как я понял ссылка на неофициальный): http://www.yiiframework.com/doc/guide/1.1/ru/index

Мануал по Yii 2 — на английском: http://www.yiiframework.com/doc-2.0/guide-index.html — но может где-то есть перевод.

Далее, папки framework действительно нет, это потому что ты либо скачал что-то левое, либо установил не так. Я сейчас скачал архив с официального сайта - папка framework там есть. Исправляй.

Если ты хочешь установить Yii2, его вообще можно ставить через композер, что удобнее так как не надо ничего руками скачивать и распаковывать. Если ты захочешь освоиить композер, вот статья: http://habrahabr.ru/post/145946/ + я готов ответить на вопросы.

Подведу итог, что надо сделать:

- скачать нормальный архив и распаковать либо установить Yii2 композером
- убедиться что php у тебя находится в PATH и что команда php -v пишет версию php а не ошибку
- запускать файл не yiic (это для линукса), а yiic.bat. Либо же запускать yiic но такой командой

php path/to/yii/yiic ....

(то есть дописать в начало php)

Вопросы? Задавай, это как раз тред для начинающих и тех кто ничего не понимает.
#356 #401066
>>401044

> какой емакс? импорт кода?


> зачем его куда-то импортировать?


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

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

> откуда ты взял 4 пробела?


Из стандарта

> замени их табом


И будет бардак из смеси табов и пробелов, и будет разъехавшийся на гитхабе и ideone код. Плавали, знаем.
#357 #401068
>>401061
потому что оп учит людей плохому

то же самое если бы он учил писать переменные транслитом - я бы возмутился
то же самое и здесь
#358 #401069
>>401061

Добавлю, что ОП решил так не от балды, а опираясь на стандарты PSR (а до их появления — PEAR — крупнейший в то время репозиторий php-кода и Zend — фреймворк от компании-разработчика PHP). То есть ОП берет самые популярные и распространенные стандарты за основу, а свое личное мнение ставит на последнее место.
#359 #401070
>>401068

Пиши жалобу в PSR-FIG а не мне в тред.
!ОП #360 #401071
Также, я подозреваю, новичкам интересно решать задачи и писать код, а не заниматься аутизмом изучая различия между табами и пробелами и какие где использовать.
!ОП #361 #401074
Алсо, раньше, много лет назад, ОП писал в другом стиле и ставил скобки по-другому. Но потом на работе познакомился со стандартами Zend/PEAR (PSR еще не было) и переучился за несколько дней без всяких проблем. Попробуйте, у вас тоже получится.
#362 #401076
>>401071
Именно.
нюфаня
#363 #401077
>>401070
написал, приложил ссылку на этот тред и на статью на хабре
надеюсь скоро исправят
#364 #401081
Сап, программач, я прохожу уроки из ОП-поста, делаю задачку про кредиты. Накидал такой код:
[code]
<?php

function homoCredit($cost) {
\t$balance=0;
\t$total=0;
\tfor ($i=1; $balance >= 0; $i++) {
\t\t$balance=$cost1.04+500;
\t\tif ($balance >= 5000) {
\t\t\t$balance -= 5000;
\t\t\t$total += $i
5000;
\t\t}
\t\telse {
\t\t\t$total += $balance;
\t\t\t$balance = 0;
\t\t}
\t}
\treturn $total;
}

$cost=39999;
$homoCreditTotal = homoCredit($cost);
echo "homocredit - $homoCreditTotal";
[/code]
Запускаю его на ideone.com
И получаю ошибку
[code]
Time limit exceeded\ttime: 5 memory: 25800 signal:24
[/code]
ЧЯДНТ? Это функция бесконечно выполняется?
#364 #401081
Сап, программач, я прохожу уроки из ОП-поста, делаю задачку про кредиты. Накидал такой код:
[code]
<?php

function homoCredit($cost) {
\t$balance=0;
\t$total=0;
\tfor ($i=1; $balance >= 0; $i++) {
\t\t$balance=$cost1.04+500;
\t\tif ($balance >= 5000) {
\t\t\t$balance -= 5000;
\t\t\t$total += $i
5000;
\t\t}
\t\telse {
\t\t\t$total += $balance;
\t\t\t$balance = 0;
\t\t}
\t}
\treturn $total;
}

$cost=39999;
$homoCreditTotal = homoCredit($cost);
echo "homocredit - $homoCreditTotal";
[/code]
Запускаю его на ideone.com
И получаю ошибку
[code]
Time limit exceeded\ttime: 5 memory: 25800 signal:24
[/code]
ЧЯДНТ? Это функция бесконечно выполняется?
#365 #401082
>>401081
Блять, я и забыл, что абулик тег поломал.
Вот ссылка на код:
http://ideone.com/OcCoqU
#366 #401089
>>401081

> Это функция бесконечно выполняется?


да. У тебя цикл выполняется пока баланас больше или равен нулю. Если он равен нулю, то он у тебя выполняется вечно.
#367 #401090
>>401089
Спасибо. А то я понапишу хуйни и сам потом разобраться не могу.
#368 #401096

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


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

> Собственно, задача, дан массив чисел, найдите 2 наибольших. Решать можно на JS или PHP, кому что роднее.


https://github.com/FazZzuR/Learning/blob/master/2ch/smallTasks/maxInArray.php

> Дам массив чисел, отсортируйте по возрастанию без использования стандартной функции sort( ) и подобных. на JS/PHP.


https://github.com/FazZzuR/Learning/blob/master/2ch/smallTasks/sort.php

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


https://github.com/FazZzuR/Learning/blob/master/2ch/smallTasks/minDistance.php

> 2. Баланс весов


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

Еще одну задачу которую анон из б на собеседовании не смог решить я тебе уже кидал, но ты не заметил.
Задача была развернуть строку с использованием рекурсии. Собственно это мое первое использование рекурсии в жизни.
https://github.com/FazZzuR/Learning/blob/master/2ch/smallTasks/recursiveReverse.php
С кошками и мышками пока завязал, читаю Мэта Зандстру, так как сложно слишком понять что и как. Хотя про компанию вектор без напряга сделал.
#369 #401097
>>401096

>С кошками и мышками пока завязал


Тут анон как-то вбрасывал, можешь подглянуть
http://apps.perfect-skin.com.ua/cat
#370 #401102
>>401097
Спасибо, красиво, но все же буду пробовать сам до всего этого дойти. Ибо если что-то не получается надо это делать пока не начнет получатся, а не подглядывать.
#371 #401104
>>401102

>Спасибо, красиво, но все же буду пробовать сам до всего этого дойти.


Думаю, что это лучший способ обучения PHP. Но когда сделаешь - старайся смотреть best practices и совершенствоваться.
#372 #401105
>>401097

Я мельком глянул, я помню, анон вбрасывал эту ссылочку, но код там неидеальный. Кошечки конечно красивые получились, но внутри все не идеально. Так что не уверен что тянет на best practices. Хотя сделано неплохо.
#373 #401106
>>401104
Вообще, касаемо задач с какими то данными - как про компанию вектор - проблем особо не возникает. С парсерами тоже - вот данные, надо разобрать, склеить, заменить все просто и понятно. А вот когда речь заходит о вычислении путей, игрушках и прочем - В голове вообще пустота касательно того что делать. Я даже змейку фиг напишу.
#374 #401107
>>401106

Может это потому что ты никогда не писал такого.

В игрушках те же данные — только вместо кофе и зарплаты координаты кошек/мышек и алгоритм выбора хода.
#375 #401109
>>401107

Сам алгоритм выбора тоже несложный:

- составляем список возможных ходов
- назначаем каждому ходу очки в зависимости от того выгоден он или нет (например в зависимости от близости кошек, мышек, числу возможных ходов оттуда и тд)
- выбираем ход с максимальным числом очков
#376 #401110
>>401105
Да не, я про то, что если до всего доходить самому - то будет долговато. Иногда стоит начать пользоваться какой-то сложной для тебя технологией, не понимая её важности, но полагаясь на мнение тех, кто ей пользуется.
#377 #401111
>>401109
Та не, по алгоритмам поиска путей книги и диссертации пишут.
#378 #401112
>>401110
Ну по тиху въезжаю сам, если уж совсем печально будет, то конечно посмотрю как другой человек это реализовал, всяко лучше чем вообще ничего не написать. Ну а пока другие задачи по ооп пилю, попроще. Авось руку набью и с игрой проще будет.
#379 #401113
>>401111

В этой задаче хватит простого алгоритма с проверкой на 1 ход вперед. Но если ты хочешь использовать сложный - почему бы и нет.
#380 #401114
Не до конца понимаю логику видимости переменных.
Вот например:
$a=1;
function MakeSomething($a){
...
return $b;
}
$b =3;
MakeSomething($a);

Собственно, вопрос: глобальная переменная $b будет задействована в теле функции или нет?
#381 #401115
>>401112
Ну я тебе тут посоветую ещё делать что-то не только ради обучения, но и для другой пользы. Я вначале учился, пиля простое приложение для ВК. Потом сделал простенький сайт родственникам. Потом интернет-магазин запилил. Ещё и копеечку заработал. Учиться ради учёбы тяжело, часто люди дропают после месяца такого.
#383 #401117
>>401113

>Зачем на один вперед? Тут из текущей ситуации все же.

#384 #401119
>>401114

Переменные внутри функции (локальные) недоступны снаружи, глобальные переменные недотупны из функций. В твоем примере код внутри функции не видит и не имеет доступа ни к каким глобальным переменным.
#385 #401121
>>401115
Прекрасно понимаю. Сам устроился с нулевым опытом в контору которая занималась автоматизацией общепита. Намного интереснее что-то делать, зная что это кому то нужно и будет использоваться. Только вот не представляю где я найду удаленную работу для моего текущего уровня. Вот и дрочу всякие задачки с целью выйти на уровень juniorа.
#386 #401122
>>401121
Ну просто на потенциальных работах хотят чтобы ты магазины и новостные агрегаторы делал, а не задачки решал. Старайся свои задачки приближать к востребованным на рынке вещам. Не зацикливайся на задачах. Вот тут когда наберёшь по php 17-18 и освоишь какую-то CMS, можешь считать, что для juniora у тебя знаний достаточно.
#387 #401123
#388 #401124
>>401122

Работы бывают разные. Кто-то клепает однотипные сайты, кто-то делает продукт на аутсорс или даже для себя. Естественно, второй и третий вариант гораздо лучше, но чтобы на них попасть, надо гораздо больше уметь.
#389 #401125
>>401124
Ну лучше начать с говносайтов, чем год дрюкать задачки, в надежде попасть на стажировку в google.
#390 #401128
>>401125
А я тут такой могу задачки решать сутками, а сделать что-то полезное - никак. И это не касаемо программирования, а во всем. Такой склад ума. Представляешь, как мне плохо?
#391 #401132
>>401128
Это уже не касается тематики треда.
#392 #401134
>>401128
Привет, антон. У меня такая же проблема. Как ты вообще живешь?
#393 #401142
>>401134
Меня зовут Антон, кстати.
#394 #401146
>>401134
Работу найдите. Мне пол года в фирме знатно подправили мозг. Вылечился от перфекционизма, дроча на красоту и аккуратность и прочее. В хорошем смысле, а не в том что делаю все на отъебись и абы как. Просто начал понимать что некоторые вещи несущественны и они не стоят потраченного на них времени и сил.
#395 #401147
>>401132
Ну почему же, человек на пхп решает задачки, но не может сделать чего то реально полезного и чем будут пользоваться на пхп. Я думаю можно уже и посоветовать человеку устроится на нормальную работу, для излечения этого недуга.
#397 #401154
>>401147
С его слов я понял, что он не хочет устраиваться на работу. Ко мне в контору время от времени на собеседования приходят нулёвые, но стремящиеся - даём им тестовые типовые задания, даём комп и возможность постажироваться. Только один, и то я его не застал, осилил таки вёрстку и после этого устроился на полставки.
#398 #401159
>>401154
Я, например, еще как бы учусь Возьмешь на стажировку кого-то, кто ходит на работу после четырех и только?
#399 #401166
>>401154
Что за контора у вас и где находитесь?
#400 #401167
>>401166
В Киеве. Делаем интернет-магазины для мелкого и среднего бизнеса. Стажёр-верстальщик, два PHP-прогера (я), два дизайнера и менеджер.
#401 #401174
Анончики, помогите. Есть главная страница сайта, к ней подключается один цсс и один жс.

Хром дев тулз показывает, что при загрузке как главной, так и жс и цсс, три раз тратится время на поиск в днс и соединение. Разве днс и соединение не должны установиться один раз при заходе на сайт и сохраняться некоторое время?
#402 #401178
>>401174

Давай разберем по очереди.

> днс


Если js/css находятся на другом домене, то для них нужен очевидно отдельный DNS запрос. Если на том же то возможно Хром просто показывает одно и то же время первого запроса для всех? Оно одинаковое?

> соединение не должны установиться один раз


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

Например, браузер скачивает первым соединением HTMl-файл, парсит его и увидев ссылки на CSS/JS открывает еще 2 соединения чтобы скачать их.

Позже в HTTP/1.1 придумали Keep-Alive (возможность послать по одному соединению несколько запросов). Keep-Alive должен быть разрешен на сервере (сервер отдает соотв. заголовок чтобы показать это) и должна использоваться кодировка Transfer-Encoding: chunked или аналогичная чтобы клиент мог опознать конец файла.

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

Так что проверь заголовок Keep-Alive

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

Имей в виду что загрузка JS блокирующая: пока файл не загрузится, HTML дальше не парсится, так как скрипт может изменить HTML код (точнее, новые браузеры все же делают опережающий парсинг, но я не знаю подробностей).
#403 #401180
>>401081

Не сдавайся, задача сложная, на ней все спотыкаются.

>>401096

> ты бы их на своем сайтике или еще где собирал.


Это первый тред с такими задачами, так что может потом соберем и на гитхаб положим. Но я честно говоря не сторонник того, чтобы акцентировать внимание именно на таких задачах — я сторонник того чтобы хорошо изучать php чтобы человек мог решить любую задачу.
#404 #401181
>>401096

> найдите 2 наибольших


Не находит: http://ideone.com/7JUaBg

Должно быть 500, 123

Также, что касается алгоритма, я бы тоже в первый раз наверно сделал через sort/slice. Но в ответ на это скорее всего тебя попросят: а можно теперь решение со сложностью O(N)? (то есть делающее один проход по массиву, а сортировка — это уже O(N×log N))

> сортировка


Замечание: вот такой код:

if (условие) { много строк } else { return ... }

надо переворачивать:

if (!условие) { return ... } много кода

> if (!isset($min)) {


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

Само решение вполне работоспособное. Я вижу что ты используешь сортировку выбором ( https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC ) — верно? Если ты исплоьзуешь общеизвестный алгоритм, надо указывать его название в комментарии чтобы облгечить читателю разбор программы.
#405 #401182
>>401096

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


А где у тебя точки на плоскости с 2 координатами? У тебя точки на прямой. Ты задание-то внимательно читал?

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

for ($i = 0 ... last) {
for ($j = $i + 1 ... last) {
....

> if (!isset($min)) {


Не делай так. Просто присвой min заведомо большое значение (INF = бесконечность) или расстояние между первымми 2 точками.

Ну и твой алгоритм не обрабатывает хитрые ситуации, например с 1 точкой: http://ideone.com/swNEUN

Это тоже плохо. Ты должен был написать более надежный код.
#406 #401184
>>401096

> Вот зачем ньюфагам типо меня меня давать задачи по динамическому программированию без изучения оного


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

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

Мы ее выше уже решали, там можно удачно использовать генераторы из php5.5

> , но ты не заметил.


Мог и проглядеть. Ты напоминай о себе тогда.

> развернуть строку с использованием рекурсии


Неплохо, но есть советы по улучшению:

1) if надо перевернуть и избавиться от else
2) lastSymbols, startSymbols принято называть head и tail (голова/хвост списка)
3) переменная reverseString не нужна, можно сразу писать return recursiveReverse...
#407 #401185
>>401096

> С кошками и мышками пока завязал


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

>>401128

Это пройдет
#408 #401195
Это снова я >>400936.

>>401018

>1) как отличить таб от пробела на глаз?


Уточнил в ответе на другой пост от тебя.

>2) как смотреть код с табами на гитхабе, пастебинах и в консоли? там 8 пробелов выводится


https://github.com/tiimgreen/github-cheat-sheet#adjust-tab-space
Еще есть куча расширений для браузера, например, вот этот: https://github.com/sindresorhus/github-tab-size

>3) что вам любителям табов мешает написать скрипт для емакса и выводить код с пробелами с любыми отступами?


Может, это любителям пробелов что-нибудь написать? А я пока что-нибудь реально полезное сделаю.

>>401017

>Ложь.


В каком месте это была ложь?

>Любители табов ноют что им не дают настраивать отступы, при этом за 30 лет ни один из них не осилил написать простой скрипт для емакса. Дауны какие-то, честное слово. Почему большинство должно терпеть неудобства из-за меньшинства? Настрой уже свой редактор, а не пытайся навязывать неудобные стандарты.


>Почему большинство должно терпеть


Да, давай теперь цифры с потолка хватать на основе программистов, с которыми ты знаком.

>95% людей этот аутизм с настраиванием отступов не нужен и они хотят видеть код как его написал автор.


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

>Гитхаб или любой пастебин или команда cat в консоли. Алсо, когда ты оказываешься на чужом компьютере/устанавливаешь ос на сервер, там всегда табы отображаются как 8 пробелов и это неудобно. И ни времени ни желания это перенастраивать каждый раз у меня нету.


Понятно. А мне удобно, постоянно смотрю на них на Битбакете, вообще, люблю 8 пробелов, вот беда же. Ну и выше про Гитхаб.

>Тогда объясни как глазами отличить табы от пробелов и увидеть например что они используются неправильно? Например, в редакторе Sublime Text или PhpStorm в стандартном режиме?


Что значит "неправильно"?

>>401027

>>Какого чёрта какие-то непонятные мужики будут мне указывать


>Странно что тебе не очевидно почему. Я объясню.


Для меня это очевидно, я понимаю, что для командной работы нужен какой-то стандарт, и в том или ином виде он внутри команды всегда существует, просто тут слишком много "но" в вот этом эгоистичном навязывании того, как привык писать кто-то другой, там значительную часть стандарта невозможно даже объективно аргументировать. Что, мол, да, вот классы и методы относятся к ООП, поэтому скобка на новой строке, а управляющие конструкции — нет, поэтому на той же строке. Это, я не знаю, какие-то фантазии о том, как аргументированно заставить всех писать так, как хочешь ты.

>>401030

>Результаты сравнения стандартов в конце прочитай. Большинство выбрало пробелы.


А я читал, там опросили всего-то проектов-членов, давайте, может, опросим хотя бы тысячи полторы крупных/известных/преподающих специалистов, что они думают, о потом поговорим о репрезентативности?
#408 #401195
Это снова я >>400936.

>>401018

>1) как отличить таб от пробела на глаз?


Уточнил в ответе на другой пост от тебя.

>2) как смотреть код с табами на гитхабе, пастебинах и в консоли? там 8 пробелов выводится


https://github.com/tiimgreen/github-cheat-sheet#adjust-tab-space
Еще есть куча расширений для браузера, например, вот этот: https://github.com/sindresorhus/github-tab-size

>3) что вам любителям табов мешает написать скрипт для емакса и выводить код с пробелами с любыми отступами?


Может, это любителям пробелов что-нибудь написать? А я пока что-нибудь реально полезное сделаю.

>>401017

>Ложь.


В каком месте это была ложь?

>Любители табов ноют что им не дают настраивать отступы, при этом за 30 лет ни один из них не осилил написать простой скрипт для емакса. Дауны какие-то, честное слово. Почему большинство должно терпеть неудобства из-за меньшинства? Настрой уже свой редактор, а не пытайся навязывать неудобные стандарты.


>Почему большинство должно терпеть


Да, давай теперь цифры с потолка хватать на основе программистов, с которыми ты знаком.

>95% людей этот аутизм с настраиванием отступов не нужен и они хотят видеть код как его написал автор.


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

>Гитхаб или любой пастебин или команда cat в консоли. Алсо, когда ты оказываешься на чужом компьютере/устанавливаешь ос на сервер, там всегда табы отображаются как 8 пробелов и это неудобно. И ни времени ни желания это перенастраивать каждый раз у меня нету.


Понятно. А мне удобно, постоянно смотрю на них на Битбакете, вообще, люблю 8 пробелов, вот беда же. Ну и выше про Гитхаб.

>Тогда объясни как глазами отличить табы от пробелов и увидеть например что они используются неправильно? Например, в редакторе Sublime Text или PhpStorm в стандартном режиме?


Что значит "неправильно"?

>>401027

>>Какого чёрта какие-то непонятные мужики будут мне указывать


>Странно что тебе не очевидно почему. Я объясню.


Для меня это очевидно, я понимаю, что для командной работы нужен какой-то стандарт, и в том или ином виде он внутри команды всегда существует, просто тут слишком много "но" в вот этом эгоистичном навязывании того, как привык писать кто-то другой, там значительную часть стандарта невозможно даже объективно аргументировать. Что, мол, да, вот классы и методы относятся к ООП, поэтому скобка на новой строке, а управляющие конструкции — нет, поэтому на той же строке. Это, я не знаю, какие-то фантазии о том, как аргументированно заставить всех писать так, как хочешь ты.

>>401030

>Результаты сравнения стандартов в конце прочитай. Большинство выбрало пробелы.


А я читал, там опросили всего-то проектов-членов, давайте, может, опросим хотя бы тысячи полторы крупных/известных/преподающих специалистов, что они думают, о потом поговорим о репрезентативности?
#409 #401197
>>401195

> может, опросим хотя бы тысячи полторы крупных/известных/преподающих специалистов, что они думают


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

Для меня например они гораздо авторитетнее какого-нибудь никому не известного разработчика. А «преподающий специалист» у меня ассоциируется с клоуном из одноименных видеокурсов. Их мнение точно слушать не стоит.

> Может, это любителям пробелов что-нибудь написать?


Пока нас большинство и на нашей стороне стандарт, писать придется вам.
#410 #401198
>>401195

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

И объясни мне, почему программисты должны тратить время на исправление этой ерунды если можно просто всегда использовать пробелы и проблема исчезнет сама собой?
!ОП #411 #401199
Ну и наконец, ни одной убедительной причины использовать табы ты не привел.

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

Предлагаю на этом тему закрыть.
!ОП #412 #401200
Также, для аутистов хочу сообщить, что в юникоде кроме таба и пробела, есть еще немало интересных пробельных символов: полупробел, разделитель полей, невидимый пробел, неразрывный пробел и прочие. Почему бы вам и их не начать использовать для полного счастья?
#413 #401201
>>401200

Например:

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

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

Не понимаю, почему так никто не делает?
22 Кб, 676x320
#414 #401202
>>401063

>скачать нормальный архив и распаковать либо установить Yii2 композером


Я и так через композер скачал. Команды с офф. сайта, естественно брал. Скачал basic-версию.

>убедиться что php у тебя находится в PATH и что команда php -v пишет версию php а не ошибку


Всё ок

Нашёл мануал для 2 на русском. Сейчас буду разбираться
#415 #401203
>>401197

>Пока нас большинство и на нашей стороне стандарт, писать придется вам.


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

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


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

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


Да дело не только в Табе против пробелов, в стандарте очень много всего странного. А что-то хорошо, да. Но не всё. И про аргументацию некоторых вещей тоже не забывай, я об этом выше уже писал. У них открывающие скобки такие из ИСТОРИЧЕСКИХ СООБРАЖЕНИЙ, — видите ли, на C так было раньше из-за определенных характеристик языка. PHP — это не С, это не Лисп, здесь нет ограничений тех времён, зачем так делать? И в PSR много чего похожим образом объясняется; стандарт нужен, безусловно, но не такой, и не от этих людей.

>>401199

>Ну и наконец, ни одной убедительной причины использовать табы ты не привел.


Привёл, но ты же тут господин, ты не можешь быть неправ.

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


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

>>401200
>>401201
Так никто не делает, потому что в этой резервации умным должен оставаться только ты.
50 Кб, 1343x693
#416 #401215
https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/start-forms.md
Сделал всё по инсрукции, но при переходе на http://hostname/index.php?r=site/entry соответственно, у меня по другому ссылка выглядит выскакивает ошибка.
В чем может быть дело? Куда смотреть?
#417 #401223
Привет бандиты. Я тут у вас терся месяца 2 назад решал задачи на жс. Остановился на этой http://jsfiddle.net/xcLq3d48/4/ помню оп там что-то раскритиковал, а что не помню и тред уже не найти. Короче, оп посмотри еще раз пжлст, а я пока буду вспоминать и доделывать.
#418 #401225
Не совсем php, но с ним связанное.
Я хочу запилить заглушку, которая бы показывалась всем, кроме одного айпишника(моего, например 128.0.0.1)
Заглушка является file.html файлом, который имеет лишь одну внешнюю зависимость: <img src="pic.png"/> Т.е. к другим этот html не обращается.
Вот содержимое моего .htaccess:

RewriteBase /
Options -Indexes

ErrorDocument 403 /error/file.html
order deny,allow
deny from all
allow from 128.0.0.1
<Files "/error/pic.png">
Order Deny,Allow
Allow from all
</Files>


В папке /error .htaccess выглядит вот так (а без него я получаю шаблонный 403 от апача):
RewriteBase /
Options -Indexes
order allow, deny
allow from all


Но это нифига не работает, то есть, открыть картинку можно (doma.in/error/pic.png), но на file.html ее нет.
Я использую бесплатный хостинг от hostinger, но, наверное, проблемы в моем рукожопстве, помогите мне.
81 Кб, 499x529
#419 #401244
Нестандартные шрифты вообще можно подключить одним css файлом, чтобы на каждой странице сайта в шапке не городить повторно эту стену текста?
#420 #401251
Делаю задачу на кошки мышки. Буду выкладывать кода по мере продвижения, дабы ОП сразу мог сделать замечания, пока я работаю над ним.
http://ideone.com/LoRa4a

Пока сделал только поле и поместил туда мышь.
#421 #401252
>>401251
И сразу касяк невооруженным взглядом обычного хуя. У тебя мыш искривляет пространство нехило так, как маленькая черная дыра.
#422 #401254
>>401252
Исправлено. Теперь искривляет соответственно своей массе.
#423 #401276
http://ideone.com/yLGA7G итак набросал немного ИИ для кошки, и вот с какими проблемами столкнулся:
Помимо того, что символы искривляют поле (ну это несущественно) у нас кошка оставляет за собой след, получается эдакая змейка. Нужно как-то приравнивать предыдущие её позиции к точкам.
Далее, когда кошка достигает своей цели, она там так и остается навсегда. Нужно как-то удалять сожранную мышку с поля, пока не понял как.
#424 #401279
>>401276
для удаления переменных
http://php.net/manual/ru/function.unset.php
#425 #401280
>>401279
Я знаю, как удалять переменные, проблема в том, что скрипт сам не определит какую из них удалить. Я могу конечно в ручную написать unset($mouse2), но это глупо. Нужно автоматически определять какую переменную удалять, а по координатам я это сделать не могу, тупо не знаю как. Алсо, убрал следы кошки:
http://ideone.com/Cj6mRN
#426 #401283
>>401280
Нужно убирать ту мышь. Координаты которой совпадают с координатами кошки.
#427 #401284
>>401283
Хоть убей не знаю, как это реализовать.
#428 #401290
>>401284

перебрать координаты всех мышей сравнивая с координатами всех кошек
через foreach

http://php.net/manual/ru/control-structures.foreach.php

но сам бы я не хранил координаты в классе животные. Я бы хранил животных в ячейках карты. Но мне так просто кажется правильнее. ОП придет подскажет как правильнее
#429 #401305
>>401290
Все равно не понимаю, как ты с помощью координат определишь имя переменной?
#430 #401357
>>401244

Что тебе мешает положить этот CSS код в css-файл и подключать через link ? Ты про тег link rel=stylesheet знаешь?
#431 #401360
>>401244

Алсо, это кошмар когда на странице полмегабайта шрифтов подключается. С тех пор как на сайте php сделали кастомные шрифты, он открывается в разы медленнее и меня это бесит.
#432 #401371
>>401202

Я тебе еще советую шрифт покрупнее поставить, правая кнопка по заголовку консоли - свойства. А то неудобно же наверно.

Ну и пиши если еще вопросы будут.

>>401203

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

Люди тоже нормальные. Zend, PEAR, Symfony используют тот же стандарт, а это самые крупные и авторитетные фреймворки и репозиторий библиотек. Куда авторитетнее?

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


Значит ты плохо знаком с реальностью.

> умным должен оставаться только ты.


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

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

Я всегда стараюсь придерживаться общепринятых подходов. Мне может не нравиться та или иная библиотека или фреймворк, но если он/она популярен и распространен, я буду его/ее рекомендовать. Например, мне не нравится jQuery и jQuery UI, их стиль написания кода и подходы напоминает результат работы шизофреника, но это популярные и нужные библиотеки и я их естественно порекомендую изучить.
#433 #401375
>>401181
Исправленная сортировка
http://ideone.com/p8KPXw

> Замечание: вот такой код:


> if (условие) { много строк } else { return ... }


> надо переворачивать:


> if (!условие) { return ... } много кода


У меня наоборот надо было убрать ! и оставить просто условие, но суть понял.

> Само решение вполне работоспособное. Я вижу что ты используешь сортировку выбором ( https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC ) — верно? Если ты используешь общеизвестный алгоритм, надо указывать его название в комментарии чтобы облегчить читателю разбор программы.


Да я крут, сам алгоритм придумал. Я если честно думал что это тупейший из всех вариантов - банальный перебор всего и вся. Хотя это вполне логично что даже такие элементарные вещи должны как то называться, если уж названия дают даже сортировкам с помощью случайного перемешивания.
http://ideone.com/Jg8XzP

>>401182

>А где у тебя точки на плоскости с 2 координатами? У тебя точки на прямой. Ты задание-то внимательно читал?


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

Исправленный скрипт нахождения расстояния между двумя точками.
http://ideone.com/8kd3cH
Заодно вопрос - в php можно использовать $max = -INF? Для случая когда мне надо найти максимальное число. Не сильно понимаю как php вообще бесконечность воспринимает и можно ли перед ней минус ставить.

>>401184

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


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

> Мы ее выше уже решали, там можно удачно использовать генераторы из php5.5


Начал читать, а там какие то имплементации, итерации, интерфейсы. Можешь порекомендовать что бы почитать для того что бы понять что за генераторы, и каким образом их применить в данной задаче?
#433 #401375
>>401181
Исправленная сортировка
http://ideone.com/p8KPXw

> Замечание: вот такой код:


> if (условие) { много строк } else { return ... }


> надо переворачивать:


> if (!условие) { return ... } много кода


У меня наоборот надо было убрать ! и оставить просто условие, но суть понял.

> Само решение вполне работоспособное. Я вижу что ты используешь сортировку выбором ( https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC ) — верно? Если ты используешь общеизвестный алгоритм, надо указывать его название в комментарии чтобы облегчить читателю разбор программы.


Да я крут, сам алгоритм придумал. Я если честно думал что это тупейший из всех вариантов - банальный перебор всего и вся. Хотя это вполне логично что даже такие элементарные вещи должны как то называться, если уж названия дают даже сортировкам с помощью случайного перемешивания.
http://ideone.com/Jg8XzP

>>401182

>А где у тебя точки на плоскости с 2 координатами? У тебя точки на прямой. Ты задание-то внимательно читал?


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

Исправленный скрипт нахождения расстояния между двумя точками.
http://ideone.com/8kd3cH
Заодно вопрос - в php можно использовать $max = -INF? Для случая когда мне надо найти максимальное число. Не сильно понимаю как php вообще бесконечность воспринимает и можно ли перед ней минус ставить.

>>401184

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


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

> Мы ее выше уже решали, там можно удачно использовать генераторы из php5.5


Начал читать, а там какие то имплементации, итерации, интерфейсы. Можешь порекомендовать что бы почитать для того что бы понять что за генераторы, и каким образом их применить в данной задаче?
#434 #401378
>>401215

Неймспейсы. Смотри, в PHP каждый класс находится в каком-то неймспейсе. Например, класс EntryForm находится в неймспейсе \app\models и имеет полное имя:

\app\models\EntryForm

Твой файл SiteController.php расположен в неймспейсе \app\controllers и когда ты пишешь просто

EntryForm

то php думает что ты имел в виду класс

\app\controllers\EntryForm

А такого класса нет (сравни с полным именем выше) отсюда ошибка.

Прежде чем продолжать, изучи от начала до конца раздел мануала про неймспейсы: http://php.net/manual/ru/language.namespaces.php

В качестве проверки что ты все внимательно прочел, вот тебе задачка:

Дан PHP-файл, в начале которого стоит строка

<?php
namespace \app\something;

Напиши несколько (минимум 2) способов, как в этом файле обратиться к классам

\app\something\else\Class
\app\that\Class

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

Library1_Class
Library2_Class

Но в итоге получались длиннющие имена и потому решили вместо этого исплоьзовать неймспейсы. Неймспейсы есть во многих других языках программирования, например Си++, Ява. В некоторых языках, Питон, Руби, Яваскрипт для решения проблемы вместо неймспейсов используется другой подход — модули.
#434 #401378
>>401215

Неймспейсы. Смотри, в PHP каждый класс находится в каком-то неймспейсе. Например, класс EntryForm находится в неймспейсе \app\models и имеет полное имя:

\app\models\EntryForm

Твой файл SiteController.php расположен в неймспейсе \app\controllers и когда ты пишешь просто

EntryForm

то php думает что ты имел в виду класс

\app\controllers\EntryForm

А такого класса нет (сравни с полным именем выше) отсюда ошибка.

Прежде чем продолжать, изучи от начала до конца раздел мануала про неймспейсы: http://php.net/manual/ru/language.namespaces.php

В качестве проверки что ты все внимательно прочел, вот тебе задачка:

Дан PHP-файл, в начале которого стоит строка

<?php
namespace \app\something;

Напиши несколько (минимум 2) способов, как в этом файле обратиться к классам

\app\something\else\Class
\app\that\Class

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

Library1_Class
Library2_Class

Но в итоге получались длиннющие имена и потому решили вместо этого исплоьзовать неймспейсы. Неймспейсы есть во многих других языках программирования, например Си++, Ява. В некоторых языках, Питон, Руби, Яваскрипт для решения проблемы вместо неймспейсов используется другой подход — модули.
#436 #401388
>>401223

Молодец, что ставишь комментарии.

Класс AnimationOptons не обязателен. Ты мог бы просто передавать словарь опций ради простоты:

new Animation(node, css, { duration: 200 });

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

new Animation(node, css, { durararation: 200 }); // выбрасывает исключение

Вроде бы в задании написано что желательно использовать CSS3 анимацию (точнее transition я подозреваю), если это возможно.

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

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

Вместо setInterval безопаснее использовать setTimeout так как в случае ошибки функция перестанет вызываться, а при setInterval она вечно будет вызываться.

> var progressPercent =


Эту переменную надо принудительно загонять в рамки «от 0 до 100» так как если вызов таймера произойдет через час то у тебя там посчитается 10000000% . Функция «загнать в рамки» обычно называется clamp, и тебе надо написать ее самому.

> return function animationLoop() {


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

var animationLoop = this.name.bind(this);

Вообще, это задание уровня «хард», мне кажется. Ведь по сути ты делаешь примерно то же что разработчики библиотек вроде jQuery (кстати можешь посмотреть ее код анимации, он есть на гитхабе). Не боишься?
#436 #401388
>>401223

Молодец, что ставишь комментарии.

Класс AnimationOptons не обязателен. Ты мог бы просто передавать словарь опций ради простоты:

new Animation(node, css, { duration: 200 });

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

new Animation(node, css, { durararation: 200 }); // выбрасывает исключение

Вроде бы в задании написано что желательно использовать CSS3 анимацию (точнее transition я подозреваю), если это возможно.

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

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

Вместо setInterval безопаснее использовать setTimeout так как в случае ошибки функция перестанет вызываться, а при setInterval она вечно будет вызываться.

> var progressPercent =


Эту переменную надо принудительно загонять в рамки «от 0 до 100» так как если вызов таймера произойдет через час то у тебя там посчитается 10000000% . Функция «загнать в рамки» обычно называется clamp, и тебе надо написать ее самому.

> return function animationLoop() {


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

var animationLoop = this.name.bind(this);

Вообще, это задание уровня «хард», мне кажется. Ведь по сути ты делаешь примерно то же что разработчики библиотек вроде jQuery (кстати можешь посмотреть ее код анимации, он есть на гитхабе). Не боишься?
#437 #401390
>>401225

> открыть картинку можно (doma.in/error/pic.png), но на file.html ее нет.


У тебя указан относительный путь к картинке в HTML

pic.png

Таким образом, браузер получает полный путь объединив URL страницы и этот pic.png.

Если URL имеет вид

/wow/so/much/long

То путь к картинке получается

/wow/so/much/pic.png

Преобразование URL картинки происходит в браузере а не на сервере.
#438 #401393
>>401251

> у нас кошка оставляет за собой след, получается эдакая змейка



Насчет хранения картинки поля, есть 2 подхода:

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

- более сложный — кошка должна сообщать карте, что она поменяла свои координаты, дав ей старые координаты и новые. Тогда карта может стереть старую иконку и поставить новую.
#439 #401394
>>401390
Ну так ведь картинка рядом с html лежит, в одной папке.
Или я что-то не понимаю?
#440 #401395
(А еще я понял, что если .htaccess будет написан не в ANSI, а в UTF-8, то будет выкидывать 500ую ошибку. Во дела.
#441 #401396
>>401357
не работает через <link rel="stylesheet" href="css/fonts.css" />
#442 #401397
О, все.
Я, в общем, в той папке, где лежали 403.html и картинка для него, создал .htaccess и прописал там:
Satisfy Any
Allow from all
#443 #401398
>>401251

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

Маленькие советы:

> foreach($value as $dot){


имплоде же можно использовать, зачем цикл. Хотя если тебе цикл больше нравится, можно и так.

> aquireMouse


acquire

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

Так, в остальном хорошо.

>>401276

> Нужно как-то удалять сожранную мышку с поля


У тебя есть метод добавить мышку? Логично сделать метод убрать мышку.

> protected $targets = array( );


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

> foreach ($value as $dot) {


> if ($dot != " . " && $dot != $this->icon) {


Абсолютно неприемлемый код. Никогда так не делай. Логика не должна зависеть от того как выводится информация.

Ты не должен никогда пытаться «парсить» карту обратно из точек в объекты. Ты должен хранить в Field массив животных, помещенных на карту, и искать ближайшие жертвы в нем. Можно например сделать метод в Field «найтивсехмышекврадиусе» для этого.

> Определяем координаты ближайшей мыши


Это надо вынести в отдельную функцию «найти ближайший объект из массива». Не пиши код длинной простыней.

> начинаем движение к ближайшей цели


Надо сделать метод типа move( ) для движения. А не писать все длинной простыней.
#443 #401398
>>401251

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

Маленькие советы:

> foreach($value as $dot){


имплоде же можно использовать, зачем цикл. Хотя если тебе цикл больше нравится, можно и так.

> aquireMouse


acquire

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

Так, в остальном хорошо.

>>401276

> Нужно как-то удалять сожранную мышку с поля


У тебя есть метод добавить мышку? Логично сделать метод убрать мышку.

> protected $targets = array( );


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

> foreach ($value as $dot) {


> if ($dot != " . " && $dot != $this->icon) {


Абсолютно неприемлемый код. Никогда так не делай. Логика не должна зависеть от того как выводится информация.

Ты не должен никогда пытаться «парсить» карту обратно из точек в объекты. Ты должен хранить в Field массив животных, помещенных на карту, и искать ближайшие жертвы в нем. Можно например сделать метод в Field «найтивсехмышекврадиусе» для этого.

> Определяем координаты ближайшей мыши


Это надо вынести в отдельную функцию «найти ближайший объект из массива». Не пиши код длинной простыней.

> начинаем движение к ближайшей цели


Надо сделать метод типа move( ) для движения. А не писать все длинной простыней.
#444 #401399
>>401280

Надо сделать в Field массив добавленных животных и искать жертву в нем. После чего ты можешь удалить ее из этого массива тем самым удалив с карты.
#445 #401400
>>401305

Если есть массив животных то можно тупо его обойти и сравнить. Естественно, поиск житвотного по координатам должен быть реализован отдельной функцией. Естественно удалять мышку лучше до того как кошка встала на ее клетку.
#446 #401402
>>401375

Сортировка — хорошо но если дан пустой массив или массив из 1 элемента мне кажется ноль не должен возвращаться.

Насчет бесконечности, бесконечность это не изобретение PHP а часть стандарта по математическим операциям над числами с плавающей точкой IEEE_754:

http://habrahabr.ru/post/112953/
http://www.softelectro.ru/ieee754.html

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

Там еще есть такие вещи, как отрицательный ноль (-2 0 = -0): https://ru.wikipedia.org/wiki/%E2%88%920_(%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)

и не-число NaN (PHP его превращает в ошибку, а в яваскрипте с ним можно работать).

Потому если ты используешь бесконечность только для сравнения больше/меньше (на равенство сравнивать нельзя) то все ок.
#447 #401406
Привет, программач. Добрался до задачи про банкомат из ОП-поста. Решил ее вот так:
http://ideone.com/EuPA21
Оцените правильность решения.
#448 #401408
>>401375

Сортировка

> $keys = array_keys($array);


> $min = $array[$keys[0]];


Лучше переиндексировать (сделать чтобы индексы шли с нуля) массив с помощью array_values и взять элемент [0]

Так, в остальном все верно.

Насчет сортировок советую почитать обзор методов тут: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8

Известные — это bubble sort, сортировка вставкой, quick sort.

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

Расстояние между точками:

> return 'Неверные данные. Точек должно быть минимум две.';


Лучше делать return false. А то как ты будешь проверять например с помощью if нашлось рассстояние или нет?

> $distance = sqrt(pow($points[$j][0]


Это тяжело читать. Надо что-то вынести в отдельные переменные, например dx как разница координат x или a и b как две точки.

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

> Можешь порекомендовать что бы почитать для того что бы понять что за генераторы, и каким образом их применить в данной задаче?


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

Статья: http://habrahabr.ru/post/189796/

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

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

Итератор — это объект, который представляет какой-то список и который можно перебирать например через foreach (при этом список не обязательно должен быть массивом: можно написать итератор по целым числам который их генерирует на ходу и который можно перебирать бесконечно). В PHP есть удобные встроенные итераторы, например, итератор, позволяющий перебирать все файлы в папке (в том числе рекурсивно) с помощью обычного foreach.
#450 #401413
>>401394

Браузер не знает откуда сервер берет файлы и где они там хранятся и хранятся ли вообще или он их из воздуха генерирует. Он видит только URL файла и все. Он не знает где файл лежит на сервере.

Перечитай мой пост пожалуйста еще раз.

Преобразование относительного имени piс.jpg в полный URL делает браузер. Не зная как и где файлы хранятся на сервере.
#451 #401414
>>401395

500-ю ошибку скорее всего выкидывает из-за символы BOM который ты зачем-то вставил в начало файла. Надо всегда сохранять в utf-8 без BOM и никогда не использовать блокнот windows для редактирования кода.

Wiki: https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2

>>401396

Открой инспектор (Ctrl + Shift + I) и проверь на вкладке Network загружается ли твой css. Также проверь клтинув на текст на вкладке Elements, какие стили к нему применяются.
#452 #401416
>>401406

Ну здравствуй. Давай посмотрим что ты написал.

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

case ERROR_NEGATIVE:
echo "Выдача невозможна: введено отрицательное значение";
break;

Сравни, насколько код стал читаемее и понятнее. Слова ERROR_NEGATIVE говорят гораздо больше чем число -1.

В коде ты скопипастил блок if 4 раза. Что такое копипаста? Это самая плохая вещь которую может сделать программист. Попробуй от нее избавиться, например использовать цикл.

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

Вместо цикла for и выдачи одной купюры за раз, я думаю, стоит применить операцию деления.

> if ($money<0) {return -1;}


Не пиши if в одну строчку.

В общем, хорошо что код работает, но надо его улучшить. Пока что он не соответствует нашим строгим требованиям.
#453 #401421
>>401413
Я прочитал твой пост десять раз, но все равно ничего не понял.
Я понял, что нужно в моем примере добавить картинку вот так: error/pic.png
Но почему так — я не понял. Самое главное, что локально такая страница (с src="pic.png") отобразится.
Пойду читать про относительные пути.
!ОП #454 #401423
>>401421

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

Допустим

Url страницы = http://example.com/some/other/page.html
Относительный Url картинки = error/pic.jpg
Полный URL картинки = http://example.com/some/other/error/pic.jpg

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

> что нужно в моем примере добавить картинку вот так: error/pic.png


Неверно, смотри пример выше.

> Пойду читать про относительные пути.


Хорошая идея
#455 #401452
А почему переменная, созданная при инициализации цикла глобальна?
Вот, например:
\tfor($i=0; $i<4; $i++){
\t\techo "test<br>";
\t}
\tif (isset($i)) echo 'Врум-врум';

Как-то это неправильно, нет?
137 Кб, 1600x900
!ОП #456 #401477
Уф! Наконец-то я сделал давно задумываемый «путь HTML»: большой урок с ссылками на мануалы и полным набором заданий для изучения HTML/CSS

https://gist.github.com/codedokode/58ebc90bd006baf4b35c

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

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

Не буду обещать, но есть мысль сделать аналогичный «путь JS», в виде заданий на темы: (просто JS) (DOM/BOM) (jQuery) (jQuery UI) (lodash) (handlebars) (knockout) (SPA) (?) — то есть полноценный путь фронтендщика.

Но это конечно будет гораздо сложнее.
#457 #401478
>>401452

Такие правила в PHP. Область видимости переменных ограничена функциями: http://php.net/manual/ru/language.variables.scope.php
#458 #401484
>>401478
Ну ладно, спасибо.

И еще хотел спросить, а как куклоскрипт создает архив с картинками? Ну, то есть, сама реализация запаковки файлов в один архив?
Это как-то странно, в js вроде нет средств работы вне браузера, а файлы как бы создаются вне его. Или нет?
Может уже готовое решение есть для упаковки?
#459 #401489
>>401477

Очень круто, сейчас заценю. Алсо ОП, скажи с какого ты города? Просто вчера ты писал что ты утром зашел, когда на сосаче было уже около полуночи. Ты что с Тихоокеанского побережья?
#460 #401491
>>401484

Ты же можешь посмотреть исходники, не?

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

новые браузеры: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data
старые браузеры: http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html

Ну а сохранить файл пользователю можно через createObjectUrl: https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL — хотя это память будет сильно расходовать. Также есть вариант с исплоьзованием файловой системы в Хроме: https://github.com/eligrey/FileSaver.js
#461 #401492
>>401489

Я на выходных просто сплю долго.
13 Кб, 458x134
sage #462 #401498
Объясните мне НАХУЯ ЭТО, СУКА, ДЕЛАТЬ, НАХУЯ? - пикотносится.
#463 #401501
>>401498

Не знаю, спроси у авторов, это наркоманский код и делать так не стоит.
#464 #401503
>>401501
Блять, вот книга называется php_programming_3rd_edition.pdf
Вроде годная, но, блин, наркомания какая-то. Вообще стоит её дрочить?
#465 #401505
>>401498
Зачем рисовать кривые красные вопросительные знаки? Можеть мания какая-то, иди спрашивай к мамкиным психиатрам на доску.
#466 #401509
>>401505
Зачем что? Соси хуй, быдло.
#467 #401511
>>401498
Там вроде в книге описано, что делать так не надо, но это работает.

>>401505
Даун в треде?
#468 #401512
>>401511

>Клуб любителей продолжать изучать PHP


>Даун в треде?


Да, вы зашли туда.
#470 #401530
>>401514
Хуй на!
#471 #401533
>>401514
>>401530
Два дебила - это сила, хаха.
#472 #401538
>>401533
In the Internets nobody knows that you are PORVALSYA.
#473 #401541
>>399059
поясните как передаются переменные между страницами сайта. а то чето воще не понимаю. с помощью сессий?
#474 #401542
>>401538

>nobody knows


Дебилы же.
#475 #401560
>>401541
method=GET.
#476 #401568
Дня, братишки. Поясните как лучше сделать, сам я в php не шарю. Значит суть такова, есть консольное приложение, в нем вбиваются некие данные: dd/mm/yyy, dd1/mm1/yyyy1, message, hash, pubkey. Все это отправляется на удаленный хостинг, где принимается пхп-скриптом. Знач, собственно вопрос. Допустим у себя в уютном питоне я бы просто открыл сокет, принял данные, обработал как надо. А надо, в принципе, не много, распихнуть по таблицам бд, отдавать по pubkey, удалить когда придет dd1/mm1/yyyy1. Можно ли обойтись без html-форм? В смысле не заполнять питоном формы и отправлять, а отправлять на скрипт напрямую? Вот. Это все вообще реализуемое на пхп? Я спрашиваю потому, что не хочу пока тратить деньги на виртуалку. Если это нельзя сделать на пхп или же труднореализуемо, то так и быть, возьму впс и сделаю на питоне. Заранее благодарю за ответы.
289 Кб, 681x1500
#477 #401569
>>399426

http://ideone.com/i9kIc4

Привел в более читабельный вид. Как сделать другим алгоритмом я не знаю тупо.
#478 #401579
>>401568
А почему бы тебе в скрипте на пхп непринимать данные в виде GET/POST параметров? Что-то вида site.com/index.php?hash=123pubkey=456.
Или я что-то не так понял?
#479 #401584
>>401579
Спасибо за ответ, с отправкой уже разобрался. А можно ли как-то на пхп сделать так, чтобы отдавались данные без html? Ну то есть приходит такой запрос /index.php?hash=123&privatkey=456&msg_id=789
и вот на такой вопрос сформировать не html-страничку, которую нужно еще распарсить, а отправить байтики которые уже будут расшифрововаться на стороне клиента?

И еще один вопрос созрел. Как у вас в пхп вы управляете заголовками? Мне надо запилить проверку доступности сервера. То есть делаю запрос /check.php и отдавать надо только заголовки.
#480 #401591
>>401584
Сложный этот пхп. Снимаю вопросы, пока будет крутится на хероку.
#481 #401653
Доброго, анон.
Добрался я до "Айфона в кредит".
Смотрю код, который надо исправить и вижу:

> $percent = 1.03; / Банк начисляет 3% в месяц от суммы /


Чому 1,03-то? Почему не 0,03? Ведь 3% процента же.
В общем - это спец. допущенная ошибка?
#482 #401660
>>401511

Да, работает, это описанов мануале: http://php.net/manual/ru/language.variables.variable.php

>>401541

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

Чтобы передать данные между страницами, ты можешь использовать:

- подстановку их в query string, например /page.php?x=1&y=2
- куки
- сессиии
- файлы
- базу данных

Каждый из способов имеет свои особенности и используется в разных случаях.
#483 #401661
>>401584

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

PHP-скрипт может отдавать любые данные, в том числе бинарные.
#484 #401662
>>401584

> Как у вас в пхп вы управляете заголовками?


header()
#485 #401663
>>401653
Так. Я понял, что это не ошибку. Но вопрос, все же, остается - почему же 1,03 ,а не 0,03?
В школе, вроде, нормально учил математику. А вот тут что-то не понимаю.
#486 #401664
>>401584

Проверку доступности сервера можно вообще сделать за счет настройки nginx или apache, не вызывая php.
#487 #401666
>>401569

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

Но я советую тебе набрать в гугле «поиск минимального расстояния между точками» — там первой же ссылкой будет описание хитрого алгоритма, работающего за O(N × logN). Почитай хотя бы из любопытства.

Также, ты используешь массив — а это значит что твоя программа будет расходовать O(N ^ 2) памяти для хранения расстояний. В принципе, ничего особо страшного в этом нет, мне кажется, но если заменить массив на проверку через if n памяти будет уходить меньше.
#488 #401669
>>401663

Если не нравится, можешь заменить на 0.03

Вообще, идея в том что если умножить число на 1.03 то оно станет на 3% больше.
#489 #401670
>>401669
Лол, вот оно что. Спасибо.
#490 #401728
Есть еще не спящие?
Кто может пояснить - почему он просчитывает только один год?

http://ideone.com/b2Btmh
#491 #401731
>>401728
Сам подумай. У тебя в формуле баланс не меняется, то есть ты считаешь счет= (10000.1)+1000 и она на каждой итерации будет так выглядеть.
#492 #401733
>>401731

>(100000.1)+1000


фикс
#493 #401734
>>401733
>>401731
Точно. Спасибо, мил человек.
#494 #401816
Задача на лайки. 5 популярных пользователей.
http://sqlfiddle.com/#!2/2f083b/6
#495 #401830
>>401816

Неплохо для начала. Вот советы и замечания:

> name VARCHAR(30)


NULL разрешен?

> REFERENCES users(user_id),


Хорошо, что ты используешь внешние ключи, но надо бы дописать ON UPDATE/DELETE, как тут написано: http://denis.in.ua/foreign-keys-in-mysql.htm

> user_id


> name


Будь последователен. Либо id либо user_name

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

> count(likes.liked_id)


Зачем писать имя поля? Ты понимаешь чем это отличается например от COUNT(звездочка)?

> select


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

> group by users.name


По идее у 2 пользователей могут быть одинаковые имена. да и по числам удобнее группировать. У тебя же есть первичный ключ — id пользователя.

Также, ты можешь использовать алиасы таблиц чтобы писать не users.name, а просто u.name (это по желанию).
#495 #401830
>>401816

Неплохо для начала. Вот советы и замечания:

> name VARCHAR(30)


NULL разрешен?

> REFERENCES users(user_id),


Хорошо, что ты используешь внешние ключи, но надо бы дописать ON UPDATE/DELETE, как тут написано: http://denis.in.ua/foreign-keys-in-mysql.htm

> user_id


> name


Будь последователен. Либо id либо user_name

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

> count(likes.liked_id)


Зачем писать имя поля? Ты понимаешь чем это отличается например от COUNT(звездочка)?

> select


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

> group by users.name


По идее у 2 пользователей могут быть одинаковые имена. да и по числам удобнее группировать. У тебя же есть первичный ключ — id пользователя.

Также, ты можешь использовать алиасы таблиц чтобы писать не users.name, а просто u.name (это по желанию).
#496 #401833
>>401830

>Где-то я видел все эти замечания...

#497 #401873
Я проверяю наличие картинки на стороннем сервере функцией
getimagesize. Если картинки нет, то она сыплет ошибкой, но, как я понял, это наиболее шустрый вариант проверки (а файлов много).
Ну, чтобы интерпретатор не тормозил, я добавил перед функцией «@» для пропуска ошибок.
Так вот, меня за такую реализацию не побьют?
И еще, когда читал про подавление ошибок на php.net, там кто-то оставил комментарий к статье, что пхп-гуру называют эту функцию ЗАТКНИСЬСУКА, и теперь, когда пишу эту «@» начинаю истерически ржать, что делать?
#498 #401874
>>401873

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

Я бы отправлял запрос HEAD или скачивал картинку через какой-нибудь Http клиент типа Guzzle. Это правильный способ решения, а то что ты делаешь — кривой костыль.

> что делать?


Забавно. Я про такое название не слышал.
#499 #401884
vk.com/idsdfksodkf
#500 #401889
>>401874

> тут что-то с логикой не в порядке


Хм, подумал тут, действительно. Еще одно доказательство тому, что я — нубло.
Слушай, а почему guzzle, а не интегрированные средства? (Мне надо лишь проверить наличие и скопировать к себе на сервер).
#501 #401924
>>399059
Оп, я помню ты вроде говорил, что используешь пхпсторм, так вот ты не в курсе можно ли как-то сделать, чтобы в хроме плагин пхпсторма(который позволяет в реальном времени видеть изменения на странице, как только ты их вносишь в код) работал вместе с инструментами разработчика? а то стоит мне запустить инструменты - они рубят соединение с пхпстормом
#502 #401941
Тааак, анон. По поводу PSR'ов вопрос.
А звучит он так:
Какая разница между индексами ПСРов? Я что-то не догнал для чего они проиндексированы.

А еще вопрос по поводу фреймворков для новичка.
Что лучше задрачивать из фреимвоврков? Когда их стоит задрачивать?
#503 #401944
>>401924
я про хром
#504 #402007
#505 #402009
>>402007
Нет.
#507 #402046
>>402045
че..
#508 #402047
>>402045
хуй на)
#509 #402069
Собрался делать задачу по файлообменнику. Со Слимом то все понятно, а вот как реализовывать загрузку файлов на сервер?
#510 #402090
Итак, немного переработанный говнокод кошек и мышек. Логика кошки почти закончена, осталось только придумать как её усыпить и еще пару мелочей. Теперь мышки ликвидируются, когда на них наступает кошка, хотя после этого компилятор выдает какие-то предупреждения, природа которых мною пока не установлена. Алсо, надо было наверное удалить атавизм прошлого кода, в виде предыдущих координат животного, но я забыл, ну да ладно.

http://ideone.com/dpBrQc
293 Кб, 1280x853
#511 #402094
>>399059
Привет, Анонасам. Тред не читаю, дабы не погрязнуть в новых задачах и ответах. Быстрый вопрос: в задаче №4 по JS от ОПачто на гитхабе, что за функция counter()? В задаче нигде не идет речь о такой функции, а потом сразу идет речь о ней как будто она уже была ранее. Если вопрос уже был, обоссыте и ткните где ответ. Спасибо.
#512 #402133
>>401924

Ты что-то перепутал, я использую Sublime Text, а если надо на странице что-то поменять то сразу использую инструменты разработчика.

Параллельно — вряд ли, так как сама архитектура Хроме может не поддерживать больше 1 отладчика.

>>401889

Чтобы не изобретать велосипед и не писать стандартный код из кучи curl_setopt, обработку ошибок и прочее.

>>401941

> Какая разница между индексами ПСРов


Это номера, это разные стандарты на разные темы. PSR-0 и 3 про автозагрузку, PSR-1 и 2 про оформление кода и т.д.
#513 #402135
>>401941

> Фреймворки


Лучше начать с микрофреймворка Slim или Silex, потом Yii (а лучше Yii2), потом Symfony. По возрастанию сложности.

У нас как раз есть пара задачек, сделать приложение на фреймворке:

https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
https://gist.github.com/codedokode/9424217
#514 #402139
>>402069

Читал мануал? http://php.net/manual/ru/features.file-upload.php

>>402090

> PHP Notice: Undefined offset: 1


> PHP Notice: Undefined index: x i


Ты обращашься к несуществующему элементу массива, например $a['x'] которого в массиве нет.

Проверю код чуть позже, может через пару часиков.

>>402094

Исправил описание на гитхабе: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
#515 #402140
>>402094

Также обновил условие первой задачи (проверь свой код). А что решения не показываешь? Твое дело, но лучше бы показать, я в них наверняка что-нибудь найду.
#516 #402148
>>402135
Оп, я не понимаю вообще, чего от меня хотят в фреймворках и как с ними работать. Я то hello world на слиме написал, но мне как-то понимать это хочется. Что почитать можно? По фреймворкам в целом, ну и слиму в частности.
#517 #402159
>>402140
Покажу обязательно, чому нет
Только не знаю куда лучше выкладывать, пусть пока так:

1) http://jsfiddle.net/srohu6av/
2) http://jsfiddle.net/qteyt4vy/
3) http://jsfiddle.net/5518kLj1/

Четвертую пока не перепилил.
#518 #402163
>>402148

Чтобы делать задание, надо примерно представлять как работают базы данных, быть знакомым с PDO, быть знакомым с основаvи HTML/CSS.

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

> Я то hello world на слиме написал, но мне как-то понимать это хочется.


Это правильно.

Смотри, суть фреймворка в том, что он:

1) образует каркас приложения
2) предоставляет готовые классы для разных функций.

В частности, Slim предоставляет роутер (штуку которая анализирует URL запроса, извлекает из него параметры, решает какую функцию вызвать), возможность добавлять middleware, объекты request и response, и простенький view (который просто подключает указанный php-файл).

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

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

Если у тебя получается не так (кода больше и он сложнее) — ты что-то не так делаешь.

Алсо, в вики можно кое-что полезное найти: https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA

> чего от меня хотят в фреймворках и как с ними работать


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

Также, в задании предполагается что ты будешь писать код не как попало, а в соответствии с MVC. Например, сделаешь класс-сущность File, сделаешь FileMapper для загрузки/сохранения информации о файлах в БД (у меня есть статья про паттерны работы с БД: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a )

Вот пример как может выглядеть функция, покзывающая страницу с файлом (код не работает но кого это волнует):

// при обращении к странице просмотра файла с указанным id
$app->get('/files/:id', function ($id) {
// Ищем информацию о файле в БД
$file = $app->fileMapper->findById($id);

// Нет такого - 404
if (!$file) {
$app->notFound( );
return;
}

// Есть такой — выводим страницу
$app->render('file.phtml', array('file' => $file));
});

Без фреймворка скорее всего тебе придется писать свой аналог функции render например. А вместо app->get городить некрасивый if с регуляркой:

if (preg_match("!files/\d+!", $_SERVER['REQUEST_URI'])) ....

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

Что почитать: по Слиму, увы, документация на английском: http://docs.slimframework.com/ (если переводить бингом, получается что-то наполовину понятное).

Тебе может быть непонятно что-то, если так то задавай вопросы. Желательно с примерами кода.
#518 #402163
>>402148

Чтобы делать задание, надо примерно представлять как работают базы данных, быть знакомым с PDO, быть знакомым с основаvи HTML/CSS.

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

> Я то hello world на слиме написал, но мне как-то понимать это хочется.


Это правильно.

Смотри, суть фреймворка в том, что он:

1) образует каркас приложения
2) предоставляет готовые классы для разных функций.

В частности, Slim предоставляет роутер (штуку которая анализирует URL запроса, извлекает из него параметры, решает какую функцию вызвать), возможность добавлять middleware, объекты request и response, и простенький view (который просто подключает указанный php-файл).

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

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

Если у тебя получается не так (кода больше и он сложнее) — ты что-то не так делаешь.

Алсо, в вики можно кое-что полезное найти: https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA

> чего от меня хотят в фреймворках и как с ними работать


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

Также, в задании предполагается что ты будешь писать код не как попало, а в соответствии с MVC. Например, сделаешь класс-сущность File, сделаешь FileMapper для загрузки/сохранения информации о файлах в БД (у меня есть статья про паттерны работы с БД: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a )

Вот пример как может выглядеть функция, покзывающая страницу с файлом (код не работает но кого это волнует):

// при обращении к странице просмотра файла с указанным id
$app->get('/files/:id', function ($id) {
// Ищем информацию о файле в БД
$file = $app->fileMapper->findById($id);

// Нет такого - 404
if (!$file) {
$app->notFound( );
return;
}

// Есть такой — выводим страницу
$app->render('file.phtml', array('file' => $file));
});

Без фреймворка скорее всего тебе придется писать свой аналог функции render например. А вместо app->get городить некрасивый if с регуляркой:

if (preg_match("!files/\d+!", $_SERVER['REQUEST_URI'])) ....

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

Что почитать: по Слиму, увы, документация на английском: http://docs.slimframework.com/ (если переводить бингом, получается что-то наполовину понятное).

Тебе может быть непонятно что-то, если так то задавай вопросы. Желательно с примерами кода.
#519 #402168
ОП, а ОП, почитал твой gist, охуенно, запилю вот это после задач по JS: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4. А ты, коль не в лом будет, запили пожалуйста задачки на фреймворк помощнееzf2или битрикс, лол и ORMdoctrine2. А если совсем не в лом будет, пусть твои задачки будут массивные, то есть не так чтобы пердолить нагромождение технологий чтобы орудовать двумя таблицами с 10 записями. Например можно парсить какой-нибудь фотосток.

Оставлю тут ссылку на дружественный верстка-тредесли можно: https://2ch.hk/wrk/res/182656.html
#520 #402172
>>402163
Я так понимаю разные страницы - это просто разные функции (ну там $app-get(путь, чтототам)).
Т.е. у меня все это дело просто кучей в одном файле лежит или как?
#521 #402173
>>402090

Вообще, PHP считается интерпретатором. Компилятор — это когда ты сначала компилируешь свою программу в исполняемый файл, а потом запускаешь этот файл. Интерпретатор — это когда ты сразу запускаешь написанный код.

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

> $this->x = $coordinateX;


Можно писать $this->x = $x; - одинаковые вещи не стоит называть разными именами.

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


> $this->x = $this->x + 1;


Я думаю, гораздо лучше сделать функцию move($x, $y) а не менять координаты напрямую — в этом случае, перемещение будет делаться только в одном месте, и можно будет что-то там поменять если надо.

> $this->field = array_fill(0


Зачем сохранять поле в свойстве? Ты его потом где-то используешь?

> acquireAnimal($animal)


Тут нужен тайп хинт

> findAllMousesWithin(


Тут скорее findClosestMouse

Насчет хода и снятия мышки, я подумал, можно сделать это в классе кошки. Метод move( ) в кошке должен перед ходом проверять, есть ли что-то на карте в этой клетке. Если там мышка - едим ее, если там кошка — выкидываем исключение о невозможности хода, если клетка пустая — ходим. Или же, метод move( ) можно перенести в карту и делать все это там (в конце обновляя координаты животного), но я не вижу тут никакой выгоды, плюс карта должна знать кто кого ест, а это не логично. Лучше если карта вообще не разбирается в видах животных (кстати, в этом случае надо переделать и функцию findClosesMouse чтобы она принимала параметром тип животного).

> $animal->makeMove($this->findAllMousesWithin


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

Ну и сделай на карте метод удалитьСКарты(животное)
#521 #402173
>>402090

Вообще, PHP считается интерпретатором. Компилятор — это когда ты сначала компилируешь свою программу в исполняемый файл, а потом запускаешь этот файл. Интерпретатор — это когда ты сразу запускаешь написанный код.

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

> $this->x = $coordinateX;


Можно писать $this->x = $x; - одинаковые вещи не стоит называть разными именами.

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


> $this->x = $this->x + 1;


Я думаю, гораздо лучше сделать функцию move($x, $y) а не менять координаты напрямую — в этом случае, перемещение будет делаться только в одном месте, и можно будет что-то там поменять если надо.

> $this->field = array_fill(0


Зачем сохранять поле в свойстве? Ты его потом где-то используешь?

> acquireAnimal($animal)


Тут нужен тайп хинт

> findAllMousesWithin(


Тут скорее findClosestMouse

Насчет хода и снятия мышки, я подумал, можно сделать это в классе кошки. Метод move( ) в кошке должен перед ходом проверять, есть ли что-то на карте в этой клетке. Если там мышка - едим ее, если там кошка — выкидываем исключение о невозможности хода, если клетка пустая — ходим. Или же, метод move( ) можно перенести в карту и делать все это там (в конце обновляя координаты животного), но я не вижу тут никакой выгоды, плюс карта должна знать кто кого ест, а это не логично. Лучше если карта вообще не разбирается в видах животных (кстати, в этом случае надо переделать и функцию findClosesMouse чтобы она принимала параметром тип животного).

> $animal->makeMove($this->findAllMousesWithin


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

Ну и сделай на карте метод удалитьСКарты(животное)
#522 #402174
>>402090

Также, я бы не сказал что это говнокод. Конечно, не все пока идеально, но в общем пока нормально выглядит.
#523 #402175
>>402172
Функцияметод одна, просто в зависимости от того, что ты ей отдашь, она может показать разное. Что в каком случае показать, определяется в ней. То есть, скрипт дергает страницу, но понятия не имеет что там происходит. Это вероятно, пример инкапсуляции.
мимо-макак
#524 #402178
>>402175

>Функцияметод одна


Это-то понятно. Это все метод get, а в зависимости от пути у него вызываются разные функции. Если я правильно понял.
#525 #402181
>>402178
Тащемта хочешь, буду вызываться разные функции, хочешь, будет происходить что-то еще.
#526 #402184
>>402159

Первая задача.

По логике — все правильно, есть небольшие замечания к стилю кода.

> if (!start) {


> var firstArg = 0;



Одна переменная не должна объявляться словом var 2 раза. Вынеси эту переменную в начало:

var firstArg;

Нужно давать понятные имена, например start и step.

Вместо if и новой переменной тут можно использовать конструкцию step = step || 10; — такая конструкция очень часто используется, надо ее понимать. Почитай http://learn.javascript.ru/logical-ops

> return function inside


Имя тут необязательно — функция может быть анонимной. А если уж даешь имя, то надо делать его более осмысленным, например count или getNextValue

Вторая задача

> i = 0


> b = funcArg( );


Ты забыл слово var и будет создана глобальная переменная, это плохо.

Можно проверить свой код тут: http://www.jshint.com/ и он тебе покажет эти ошибки.
Я советую весь код проверять там или если к твоему редактору есть плагин jshint (к Sublime Text есть, но его надо уметь настроить), использовать его. Он очень полезен, особенно при написании больших приложений.

Начинающему однозначно стоит весь код там проверять. Заметь, кстати, что в jshint можно отключать некоторые предупреждения (но не нужно).

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

Так, в остальном все верно.

Третья

Там есть глобальная переменная — проверь код на jshint

В остальном, все правильно.
#526 #402184
>>402159

Первая задача.

По логике — все правильно, есть небольшие замечания к стилю кода.

> if (!start) {


> var firstArg = 0;



Одна переменная не должна объявляться словом var 2 раза. Вынеси эту переменную в начало:

var firstArg;

Нужно давать понятные имена, например start и step.

Вместо if и новой переменной тут можно использовать конструкцию step = step || 10; — такая конструкция очень часто используется, надо ее понимать. Почитай http://learn.javascript.ru/logical-ops

> return function inside


Имя тут необязательно — функция может быть анонимной. А если уж даешь имя, то надо делать его более осмысленным, например count или getNextValue

Вторая задача

> i = 0


> b = funcArg( );


Ты забыл слово var и будет создана глобальная переменная, это плохо.

Можно проверить свой код тут: http://www.jshint.com/ и он тебе покажет эти ошибки.
Я советую весь код проверять там или если к твоему редактору есть плагин jshint (к Sublime Text есть, но его надо уметь настроить), использовать его. Он очень полезен, особенно при написании больших приложений.

Начинающему однозначно стоит весь код там проверять. Заметь, кстати, что в jshint можно отключать некоторые предупреждения (но не нужно).

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

Так, в остальном все верно.

Третья

Там есть глобальная переменная — проверь код на jshint

В остальном, все правильно.
#527 #402187
>>402184
Спасибо за советы. Я действительно совсем не уделял внимание стилю в этих задачах.
#528 #402188
Так. Еще вопрос по слиму.
Если я правильно понял, то работает оно так: пользователь переходит на какой-то адрес, этот адрес разбирается самим слимом, в index.php у нас выбирается что конкретно с ним делать, формируется массив данных и рендерится какой-то шаблон используя эти данные. Так?
#529 #402192
>>402172

Ты в index.php c помощью app->get объявляешь какую функцию надо вызвать при обращении к такой-то странице HTTP-методом GET.

Ты сначала пишешь сколько нужно app->get, а потом в конце app->run. Этот метод смотрит на REQUEST_URI и вызывает одну из твоих функций или выдает страницу 404 если ни одна подходящая функция не нашлась.

>>402175

Ты что-то путаешь. Функция app->get просто задает какую функцию надо вызвать если REQUEST_URI совпадает с указанным шаблоном. Это назвается роутер.
#530 #402193
>>402188

Да, примерно так. Все вызовы app->get должны быть в index.php. Если код функции маленький, ты пишешь его в ней, если большой (> 10-15 строк) — вызываешь внешний класс-контроллер, но в такой простой задаче лучше бы без них.

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


Да, пользователь переходит на какой-то адрес, браузер отправляет HTTP GET запрос на сервер, запускается PHP, Слим анализирует запрос и решает какую твою функцию вызвать.

В случае Слим мы используем одну точку входа: любые обращения к любой странице перенаправляются (в помощью htaccess) на файл index.php.
#531 #402195
>>402175

Нет. Инкапсуляция — это когда у объекта некдоступны извне свойства и можно только вызывать разрешенные методы (а сама логика инкапсулирована внутри объекта). Инкапсуляция — это как автомат по продаже кофе: ты можешь нажимать кнопки, но ты не можешь залезть внутрь руками, и что-то там налить или насыпать.
#532 #402198
>>402193
А если я попытаюсь въехать в терминологию MVC, то:
в index.php у нас хранятся контроллеры, шаблоны=вьюхи, а про модель мы, пока еще, не вспоминали, но она там отдельной кучкой классов в другом файле описана будет, так?
#533 #402199
>>402198

Да, верно. Контроллерами тут являются функции в index.php.
#534 #402201
>>402198

> там отдельной кучкой классов в другом файле описана будет


В файлах. 1 класс = 1 файл
#535 #402203
>>402201

>В файлах. 1 класс = 1 файл


Хм. А зачем? Потому что большие классы будут? И да, пока что все понятно выглядит, если учесть, что я только app->get и app->render видел, но продолжу завтра.
#536 #402206
>>402203

> Хм. А зачем?


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

PSR-0: подчеркивания заменяются на слеш:

SomeClass -> SomeClass.php
My_Awesome_Class -> My/Awesome/Class.php

PSR-4: неймспейсы соответствуют именам папок:

\SomeClass -> SomeClass.php
\Models\Class -> Models/Class.php

Так как стандарты дают нам аж 2 варианта на выбор, мы используем любой из них, а не придумываем свои схемы. Сам Слим использует вторую схему, можешь убедиться посмотрев исходники на гитхабе например.
#537 #402212
>>402203

Также, соответствие имен классов и файлов важно чтобы работала автозагрузка классов (что это? узнаешь потом).
#538 #402220
>>401406
$money=6600;

$bills=array(
1\t\t=>\t3,
2\t\t=>\t3,
3\t=>\t3,
4\t=>\t3);

Сумма: 6600 рублей Выдача возможна, число купюр: 1x5000 2x1000 0x500 0x100

Выдаёт больше, чем есть.
418 Кб, 2048x1536
#539 #402225
Как узнать, что будет в новой версии php и когда планируется выход? Все говорят на php.net мол на главной прям есть, н оя в упор не вижу
#540 #402241
Оп, меня sql вымогает все больше и больше.
У меня есть таблица товаров. И есть таблица связи с характеристиками, типа код товара - характеристики. Мне нужно выбрать товары, имеющие хотя бы 1 характеристику из списка и при этом не имеющие характеристик из другого списка.
#541 #402243
>>402241
Что бы было понятнее, таблица связей -

Код товара | Код характеристики
1 1
1 2
1 3
2 1
2 2
3 1

Список нужных характеристик - 2, 1
Список характеристик, если они есть у товара - его не выводим - 3

В итоге хочу выбрать код товара - 2, 3
#542 #402264
>>402225

Обычно такой документ называется Roadmap, и там описаны планы развития проекта. Я не нашел такой на сайте PHP, но нашел такое:

http://habrahabr.ru/post/231605/

https://wiki.php.net/phpng

Похоже что такие подробности можно узнать только если читать список рассылки (или обзоры в блогах), а что касается даты — ее в PHP вроде бы не планируют, когда будет готово тогда и выпустят.
#543 #402266
>>402243

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

Тут есть вариант решения, из 2 JOIN:

товары JOIN связь
LEFT JOIN связь AS skip ON (есть плохая характеристика)
WHERE skip.id IS NULL // отсеиваем те у которых есть плохая характеристика

Но я не знаю, как он по скорости. Может быстрее через подзапрос будет

WHERE id NOT IN (SELECT id всех плохих товаров)

Или так

WHERE NOT EXISTS (SELECT id всех плохизи характеристик товара)

Учти что все эти варианты, скорее всего неоптимальны по скорости на большом числе товаров. Ну это уже твоя работа, думать как это оптимизировать, я просто хотел показать что это возможно.
#544 #402276
>>402173

>> acquireAnimal($animal)


>Тут нужен тайп хин


А если я тайп хинт сделаю на абстрактный класс, он будет принимать его предков?
#545 #402283
>>402173
И еще, я не понял, как через класс кошки можно удалить объект мышки? Массив животных то в обьекте поле находится. Ну и функция сделатьХод() без аргументов тоже мне не до конца понятно, ей ведь придется передавать поле или координаты мыши каждый раз, сама то кошка никаких данных о том, что вокруг, кроме собственных координат не имеет.
#546 #402337
>>402283
А зачем тебе вообще удалять объекты? Я бы запилил им поле со статусом активна/нет.
#547 #402352
Не пора ли запилить новый тред?
Уважаемые знатоки, что вы скажете о функции copy()? Как обстоят у нее дела с производительностью?
#548 #402367
>>402276

Да. можно вместо класса передать его наследника. Это вообще-то принцип подстановки Лисков (Лисков — это фамилия, а не название воображаемых существ):

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



https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2

Точно так же условие $x instanceof Animal сработает и на потомков Animal.
#549 #402370
>>402283

> Массив животных то в обьекте поле находится.


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

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


Значит надо сделать чтобы у кошки была ссылка на Поле на котором она находится.

>>402337

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

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

>>402352

Завтра запилим.

> что вы скажете о функции copy()? Как обстоят у нее дела с производительностью?


Померяй. Скорее всего ты упрешься в скорость работы диска. rename() для перемещения файлов в пределах 1 диска кстати будет работать гораздо быстрее, если тебе нужна скорость.
#550 #402373
>>402370

>ссылка на поле


Это как?
#551 #402376
Что-то я не понял.
Ассоциативный массив в js это объект? Хм.
#552 #402381
>>402276

Принцип подстановки Лисков — один из базовых принципов ООП. Его стоит знать и помнить.

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

Разумеется, без ООП ты такое в PHP не сделаешь.

Алсо, можешь еще почитать про SOLID (5 принципов объектно-ориентированного дизайна):

https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%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)

Хотя начинающему наверно понять это так сразу будет сложно.
#553 #402384
>>402373

function setField(Field $field = null)
{
$this->field = $field;
}

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

= null я написал чтобы можно было также передать null для обнуления ссылки.
#554 #402385
>>402376

Объект в JS — это ассоциативный массив. И почти все (обычные массивы, словари, функции) кроме примитивов является объектами.
#555 #402387
>>402384
Ну так мы передаем все равно поле как аргумент функции, не проще ли передать поле сразу функции makeMove($field)?
#556 #402389
>>402387

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

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

А с твоим подходом мы должны будем в каждую вторую функцию передавать этот field (так как ссылка на поле нужна в функции выбора хода, функции перемещения и наверно еще где-то).

А в функцию стоит передавать то, что нужно именно этой функции.
#557 #402391
>>401830
Задача на лайки.
Я залип. Как объединить несколько разных запросов в одной таблице? До сих под читаю теорию, понимание так и не приходит, может что то пропустил.

вот ещё подредактировал.
Задача на лайки. 5 самых популярных.
http://sqlfiddle.com/#!2/8a524c/22
#558 #402403
>>402391

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

Мы можем взять пользователей и приджойнить к ним 2 таблицы: полученные лайки и отданные. В этом случае мы получаем огромную таблицу, где у каждого пользователя есть все возможные пары

(кому_отдал, от кого получил)

Наример если пользователь лайкнул id = 2,3 и получил лайки от 4, 5, 6 то мы будем иметь все возможные их комбинации

2, 4
3, 4
2, 5
3, 5
2, 6
3, 6

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

Читай мануал по аггрегатным функциям:

http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html (англ)
http://phpclub.ru/mysql/doc/group-by-functions.html (рус., немного старый)
http://www.pyramidin.narod.ru/rusql/ch6.html (из учебника Пирамидина)
#559 #402404
>>402391

> ON DELETE RESTRICT


А почему restrict? Нельзя удалить пользователя если он ставил лайки? В принципе, если у тебя есть причина почему так сделано то это может быть и правильно.

Запрос на выборку популярных пользователей верных. Теперь помучайся с более сложным.

Если захочешь, можешь потом попросить дополнительную задачу на SQL.
#560 #402417
Четвертая задача по JS: http://jsfiddle.net/1saa9xre/
#561 #402420
>>402417
Упс, продолбал условие про любое количество аргументов, сейчас подправлю
#562 #402425
#563 #402427
Что ж. Благодаря треду я понял, что я — конченный даун без малейшего намека на технарский ум. У меня ничего не получается с первого раза, а после исправления ошибок — работает неправильно или не работает вовсе. Я также понял, что абсолютно не умею анализировать предстоящие задачи, и не могу находить правильные решения — вся моя деятельность лишена логики и направленна на изобретение велосипедов, но, что парадоксально, я трачу много времени на поиск специализированных решений, которые нужны только мне, которых, разумеется не существует, не говоря уже о том, что их существование попросту было бы глупым при наличии правильных решений.
Возможно, я даже решу «средние» задачки ОП’а, ведь не первый год я занимаюсь этой мерзкой, бесполезной деятельностью (мерзость и бесполезность она приобретает именно благодаря мне), но это не даст мне мозгов, не разучит мыслить шаблонно, скудно и серо.
Я думаю, пора закончить эту бесполезную трату чужого времени (ведь я уже много раз спрашивал советов), принять тот факт, что мои надежды, что я смогу научиться хоть средненькому уровню программирования, были тщетной попыткой абстрагироваться от собственной абсолютной никчемности во всевозможных сферах деятельности и больше никогда не приступать к кодингу.
#564 #402430
>>402427
Что за сопли лол, такие простыни пишут, подсознательно надеясь, что тебя разубедят в написанном. Про склад ума это вообще самая тупая херь, которую я когда-либо слышал, постоянно выбешивает, когда кто-нибудь пишет "не это не мое, у меня склад ума другой". Фейнмана читал? Он технарь, но рисовать же научился, причем неплохо. Пиздуй решать задачи.
#565 #402433
>>402427
Да всем похуй. Если ты не гений, то задротство решает.
#566 #402437
>>402427
А теперь давай по существу. Что именно у тебя не получается?
#567 #402440
>>402427

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

А вообще, если ты хочешь заниматься чем-то связанным с программированием, ты бы мог за что-то смежное взяться. Например, верстка (у меня есть путь HTML: https://gist.github.com/codedokode/58ebc90bd006baf4b35c ) или автоматическое тестирование — там тоже надо писать код, но без сложных абстракций. Ну и в случае с версткой, ты можешь сразу видеть результаты твоего труда.

Насчет шаблонных решений — программирование это во многом использование уже придуманных подходов, решений и библиотек. Обычные программисты в основном прикручиванием этих самых библиотек и занимаются. Если хочешь нешаблонные решения, тебе надо либо браться за олимпиадные задачи, либо идти в Гугл какой-нибудь.
#568 #402443
>>402425

Э, не, это не то. Смотри:

> var added = add(arguments);


Ты передаешь не N аргументов, а 1 псевдомассив arguments. То есть функция

add(a, b)

не получит 2 числа на вход, а надо чтобы код написанный в задаче работал без изменений (то есть функция add из текста задачи должна работать, а ты ее переделал зачем-то).

Также, вместо aguments[0] можно было явно написать function add(args)

Так что, увы, пока непраивльно.

Если ты не знаешь, то почитай про методы apply и call у функций.
#569 #402475
>>401666
http://ideone.com/b5fxc5

Допустим вот так. Знаю что костыль и что в перспективе может обломаться при подсчете допустим космических расстояний. Но опять же не знаю как избавиться от него. Если бы можно было в переменную записать бесконечность, то я бы запилил её туда. В мануале прочитал, есть константа такая, но чет не знаю как константу в переменную загнать. В общем надеюсь вы подскажите мне, аноны.
#570 #402494
>>402475

> как константу в переменную загнать


$x = INF;
#571 #402496
>>402475

Костыль это плохо. Лучше сразу писать нормально чем потом изучать почему что-то не работает.Надо писать туда либо бесконечность, либо расстояние между первыми 2 точками. Если вынести расчет расстояния в функцию, это 1 строчку займет (+ проверка что у нас есть хотя бы 2 точки)
#572 #402517
>>402443
Не понимаю.
Как add(a,b) может работать с количеством аргументов > 2 ? Или при любом количестве аргументов, add(a,b) должен работать с первыми двумя?
#573 #402521
>>402496
>>402494
>>402475

А если вот так?
#575 #402534
>>400226
Сделал рекурсией: http://ideone.com/OtC2Nx
Вроде обрабатывает любые данные. ОП, я не заметил преимуществ рекурсии в решении подобных задач. Как по мне рекурсия довольно сильно усложняет решение задачи, я два дня по вечерам пилил эту задачу, раздумывая про неё в обед. Может у тебя есть готовое решение, которое ты считаешь правильным и элегантным, потому что у меня получилась простыня и, мне кажется, это можно было сделать меньшим кодом.
#576 #402537
>>402404

Давай дополнительную задачу. Я в решение уже подглядел.
Если долго не могу решить проблему могу потерять интерес на неделю :(
http://sqlfiddle.com/#!2/d13b1/2

В какой главе были описаны примеры с использование нескольких джойнов? Сам бы в жизнь не догадался, что так можно.
#577 #402557
>>402517

В яваскрипте можно передать больше аргументов чем положено или меньше. Лишние отбрасываются, а недостающие заменяютя на undefined. Вернись к учебнику и почитай http://javascript.ru/basic/functions

Алсо, я не понимаю вопроса

> Как add(a,b) может работать с количеством аргументов > 2 ?


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

squareAdd(2, 3)

то эти 2 и 3 как раз передаются в add как аргументы.
#578 #402577
>>402537

> В какой главе были описаны


А ты читал мануалы? Вот этот например: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html — там объясняются джойны, ну а додуматься саггрегировать данные надо было самому.

Вот новая задача:

Есть кинотеатр, в нем идут фильмы. У фильма есть название, длительность (пусть для простоты будет 60, 90 или 120 минут), цена билета (в разное время и дни может быть разная), время начала сеанса (один фильм может быть показан несколько раз в разное время за разную цену). Также, есть информация о купленных билетах (id покупателя, на какой сеанс).

Задания:

- составь грамотную нормализованную схему хранения этих данных в БД. Внеси в нее 4-5 фильмов, расписание на один день и несколько проданных билетов.

Сделай запросы, считающие и выводящие в понятном виде:

- ошибки в расписании (фильмы накладываются друг на друга), отсортированные по возрастанию времени

- перерывы больше или равные 30 минут между фильмами, выводятся по уменьшению длительности перерыва

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

- число посетителей и кассовые сборы по времени начала фильма: с 9 до 15, с 15 до 18, с 18 до 21, с 21 до 00:00
#579 #402585
>>402557
Я очень невнимательный.
Вот вроде верный вариант: http://jsfiddle.net/sd347zdf/
#580 #402589
>>402585

>var added = add.apply(this, arguments);


fix
#581 #402593
>>402522

Можно и так. Все верно.

>>402534

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

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


Хорошо, а как ты бы хотел сделать без рекурсии?

> @$next_nominal


@ использовать нельзя. Во-первых, то 99% признак дурного кода, во-вторых, он давит все ошибки а не только те которе надо. Ну и в треьих, надо писать без ошибок, а не подавлять их.

> array_combine(array_keys($notes_available), ar....


array_fill_keys

> show_result($withdraw, $amount){


amount не используется же

> check_withdraw($notes, $nominal,


Зачем ты передаешь nominal, если она все равно никак не используется? Там переменная nominal переопределяется циклом. Это явно ошибка.

Код действительно сложно понять.

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

Причем ради оптимизации перебирать имеет смысл от больших чисел к меньшим. Например если нам надо выдать 16500 и мы сейчас рассматриваем 5000-ю купюру, то логично что мы можем рассмотреть только 4 варианта:

3×5000
2×5000
1×5000
0×5000

Варианты типа 4×5000 рассматривать смысла нет. Начинать лучше с больших чисел так как так они скорее всего окажутся приавльными.

Понимаешь идею?

Ну и также, я добавлю, это разновидность задачи о ранце и там имеется готовое (боле оптимальное чем рекурсия в худшем случае) решение: http://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке

Но ты сначала добей это решение, а потом если захочешь, можешь реализовать описанный в вики алгоритм.
#581 #402593
>>402522

Можно и так. Все верно.

>>402534

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

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


Хорошо, а как ты бы хотел сделать без рекурсии?

> @$next_nominal


@ использовать нельзя. Во-первых, то 99% признак дурного кода, во-вторых, он давит все ошибки а не только те которе надо. Ну и в треьих, надо писать без ошибок, а не подавлять их.

> array_combine(array_keys($notes_available), ar....


array_fill_keys

> show_result($withdraw, $amount){


amount не используется же

> check_withdraw($notes, $nominal,


Зачем ты передаешь nominal, если она все равно никак не используется? Там переменная nominal переопределяется циклом. Это явно ошибка.

Код действительно сложно понять.

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

Причем ради оптимизации перебирать имеет смысл от больших чисел к меньшим. Например если нам надо выдать 16500 и мы сейчас рассматриваем 5000-ю купюру, то логично что мы можем рассмотреть только 4 варианта:

3×5000
2×5000
1×5000
0×5000

Варианты типа 4×5000 рассматривать смысла нет. Начинать лучше с больших чисел так как так они скорее всего окажутся приавльными.

Понимаешь идею?

Ну и также, я добавлю, это разновидность задачи о ранце и там имеется готовое (боле оптимальное чем рекурсия в худшем случае) решение: http://neerc.ifmo.ru/wiki/index.php?title=Задача_о_рюкзаке

Но ты сначала добей это решение, а потом если захочешь, можешь реализовать описанный в вики алгоритм.
#582 #402596
>>402585

> add.apply(add,


Почему add ? Перечитай-ка учебник еще раз: http://javascript.ru/this

C помощью первого аргумента ты задаешь чему будет равно this в функции. Логично туда передать текущее значение this (в задаче этого не требуется, но так проще всего).
#583 #402597
#584 #402600
>>402585

square и add надо заменить на нейтральные названия типа a, b а то получается что у тебя функция только на работу с этими 2 функциями рассчитана.
#585 #402601
>>402589

Если так то приавльно.
#586 #402602
>>402600
Почему? Просто в объявлении функции я использовал те же названия, что и у аргументов, что буду переданы при вызове. Согласен, это ужасный стиль, но это совсем не то о чем ты говоришь.
#587 #402604
>>402602

>будут


фикс
#588 #402606
>>402602

Потому что в задании надо написать функцию fmap, которой можно передать любые функции (а не только add и square). Раз так то аргументы должны называться нейтрально, без указания на конкретные функции, иначе это сбивает с толку при чтении кода.
#589 #402608
>>402606
Я это понимаю, но ты изначально о другом говорил

>сбивает с толку при чтении кода.


!=

>функция только на работу с этими 2 функциями рассчитана

#590 #402609
>>402593

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


Но ведь это не решает ситуации, которую ты описал выше, с купюрой в 200 рублей и суммой 6600. Скрипт засунет 5000 и скажет, что выдача невозможна. Я перепробовал около 3-х вариантов, в том числе и тот, как ты описал, но они не покрывали все возможные ситуации.
#591 #402610
ОП, планирую сдать на ZEND сертификат, есть какой-то опыт в этом, будут ли на него смотреть иностранные заказчики или работодатели?
#592 #402612
>>402608

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

>>402609

> Но ведь это не решает ситуации, которую ты описал выше,


Это решает. Смотри, надо выдать 6600. Первый вызов функции пробует такие варианты:

1x5000, затем вызывает себя рекурсивно для перебора всех комбинаций всех оставшихся более мелких купюр (то есть пробует 0x2000 и комбинации более мелких)
0x5000, затем все комбинации более мелких (3x2000, 2x2000, 1x2000, 0x2000 )

То есть при таком подходе мы перебираем вообще все взможные комбинации (кроме тех которые заведомо больше например 2x5000).
#593 #402613
>>402610

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

http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=habr+%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82#newwindow=1&q=habr+%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82+zend

Как я понимаю, кто-то смотрит, кто-то нет.
#594 #402615
>>402612
Чуть более универсальный вариант 4 задачи: http://jsfiddle.net/b9tvgn70/
#595 #402618
>>402610
Один обладательс пруфами такого сертификата примерно год назад сказал мне, что в рашке всем похуй, а за бугром нет.
#596 #402623
>>402615

Ох, ты перестарался. Во-первых вместо массива можно было использовать

second.call(this, result);

Во-вторых, вторую функцию можно вообще вызывать через

return second(result);

Но так, верно.
#597 #402626
>>402612

>1x5000, затем вызывает себя рекурсивно для перебора всех комбинаций всех оставшихся более мелких купюр


Не совсем понимаю, каким образом в такой рекурсии перейти от 1x5000 до 0x5000. В такой ситуации можно начинать с ноля.
#598 #402633
>>402626

Первый раз ты вызываешь функцию, указывая ей перебирать старшую купюру. Затем она вызвает себя рекурсивно, передавая номер вида купюр на один больше, и остаток суммы и банкнот. Затем вызывает себя, передавая номер еще на один больше. И так пока не дойдет до самой мелкой или не найдет способ размена.

Главное что за один раз мы перебираем только один номинал купюры (более мелкие перебираются в рекурсивных вызовах).
#599 #402634
>>402626

> каким образом в такой рекурсии перейти от 1x5000 до 0x5000.


Это делается без рекурсии, обычным циклом от 1 до 0. И на каждом шаге цикла ты вызываешь себя рекурсивно для перебора боле мелких купюр.
#600 #402681
>>402634

> вызываешь себя рекурсивно



Пока у тебя стек не отвалится.
#601 #402687
>>402681

Стек не отвалится так как там только 6 номиналов купюр. Ты бы условие почитал что ли.

А так да, при рекурсии надо помнить что есть ограничение на глубину рекурсии, в php это то ли 100 то ли 500 вызовов.
#602 #402713
Что это за картинка с css примерами в оп посте? Где её соус?? Мне как раз надо сделать как в примере 8, хочу знать как это правильно делается.
#603 #402734
>>402713
её соус тут. http://archive-ipq-co.narod.ru/l1/reading-list.html

Делается задание при помощи ClearFix
http://ru.learnlayout.com/clearfix.html
#604 #402741
>>402734

Только вот в задаче явно запрещено исплоьзовать overflow. Это плохой способ с побочными эффектами (он обрезает все что не поместилось) и я вместо него рекомендую использовать более надежный microclearfix hack:

http://nicolasgallagher.com/micro-clearfix-hack/ (англ)
http://webknowledge.ru/novaya-mikro-versiya-haka-clearfix/ (перевод)
#605 #402742
>>402734

Вообще, сайт learnlayout хорошо офрмлен, но вот то что они overflow рекомендуют не предупреждая о последствиях, мне не нравится. Как и сам overflow. Не для этого он был придуман.
#606 #402753
Оп, а подскажи, достался мне на содержание сайтик, и вот там есть отдельно хедер, основной сайт, подвал и так далее. всё это в отдельных файлах и более менее автономно. но когда я перехожу, например, непосредственно на страничку товара то случается проблема -- в, казалось бы, автономном хедере, случается сдвиг на несколько пикселей в низ. Файл ксс ст ведь один и тот же, что на странице выбора товара, что на странице товара. почему же идет сдвиг? какие свойства могут влиять на другой элемент?
#607 #402757
>>402753

Исплоьзуй инспектор для поиска причины: http://habrahabr.ru/post/143767/

Он встроен в Хром и Фаерфокс.

Также, проверь, не выводится ли что-нибудь перед доктайпом.
#608 #402758
>>402753

Ну и в идеале хорошо бы проверить страницу w3c валидатором: http://validator.w3.org/ — если в ней ошибки то надо их исправить прежде всего.
#609 #402760
>>402753

> какие свойства могут влиять на другой элемент?


это зависит от верстки, если она табличная то вообще любые.

В твоем случае возможно что-то выводится левое перед доктайпом и из-за этого меняется режим работы браузера.
#610 #402811
>>402577
Шаг первый

Составил схему
http://sqlfiddle.com/#!2/72395
#611 #402822
Прочитал манул по Yii 2:Работа с БД. Просто ссусь кипятком, как всё просто и оптимизированно. не думал, что мануал на английском не создаст проблем с пониманием
#612 #402823
>>402811

Сама структура БД нормальная, но вот на названия больно смотреть.

> film_id


> title_film


> duration


Будь последователен и называй все в едином стиле.

Для duration разрешен NULL? Что он значит в данном случае?

Таблицу price логичнее наверно назвать как shows (сеансы) или schedule (расписание).

> DATETIME


> datatime_seance


Одно слово написано через e, другое через a. Опять же, что тут значит NULL для этой колонки?

Алсо, для билетов не указан id покупателя (хотя он тут вроде никак и не нужен).
#613 #402826
>>402822

Именно потому надо использовать фреймворки. Алсо, можешь почитать мой обзор способов работы с Бд чтобы узнать какие паттерны там использованы: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
#614 #402830
Доброго времени суток. Хочу задать вопрос, но сначала предыстория.
Несколько моих одногруппников играют в догонялки, а я хочу сделать сайт, на котором можно будет делать ставки на них. Например, кто уйдёт водой домой. Ставки будут делаться естественно, виртуальной валютой.
Мне надо организовать:
- регистрацию пользователей с разными привилегиями;
- выбор ставки и занос в память её для определённо пользователя на определённый промежуток времени;
- всё, что касается ставки, выигрыша и проигрыша;
- и кучу всего, но об этом потом.
Дело в том, что я ничего не знаю в программировании, а учить несколько месяцев всё подряд не хочется, поэтому прошу сказать, что мне понадобится выучить. То есть, например: "Для регистрации тебе понадобится выучить (например) массивы и базы данных".
Так же хочется узнать о подводных камнях. Если кто-то уже делал подобное, то скажите, что труднее всего реализовать. Да и вообще, возможно ли такое сделать на PHP или мне перекатываться в другую ветку?
Ну и естественно, мне не нужен супер-мега-крутой сайт, который должен выдерживать большой поток людей. На него буду заходить, скорее всего, только я (под разными аккаунтами). Никаких анимаций и прочих красот мне тоже не надо.
#615 #402835
>>402826
А ты мне это уже давал читать несколько дней назад ^_^
#616 #402836
>>402830

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

А так, сам язык (PHP или другой серверный язык) в любом случае нужен. Нельзя же не понимая языка на нем писать. Чтобы хранить данные, нужна база данных вроде MySQL или хранилище вроде MongoDB. Чтобы сверстать странички, надо HTML/CSS.

Быстро изучить все это не получится, наверно, если у тебя нет опыта в программировании.

Если хочешь как можно быстрее, я бы советовал обойтись без сервера и сделать чтобы все работало в браузере. Нужны HTML/CSS и JS.
#617 #402839
Анончики, новый 36 тред открывает двери, >>402831 , а этот, соответственно закрывает. Не забывайте свои вещи в вагонах и остановках.

>>402835

Ну молодец тогда, значит ты и так уже все знаешь.
#618 #402841
>>402836
Хочется ещё его показать кому-нибудь, может первое время по фану кто-то тоже ставки будет делать. Иначе бы на делфи сделал.
HTML минимум знаю. PHP знаю первые уроки из оп-поста. Если я найду пример того, как делается определённая возможность, то, думаю, смогу настроить её под себя. Мне не обязательно изучать, мне можно сделать и забыть. Или это не так просто, как мне кажется?
164 Кб, 1343x597
#619 #402958
Я установил xampp, а он выводит php содержимое файла, вместо его интерпретации.
При этом главная страница работает нормально. В чем дело?
Win8 x64.
#620 #402971
>>402958
Может быть что-то не так с самим файлом?
#621 #402972
Оп, я начал делать задачку про uppu.ru.
https://github.com/sqghub
С гитом особо не дружу, так что там может быть что-то не то.
#622 #402994
>>402971
Действительно. Но на хостингире этот файлик работает.
#623 #403041
>>402972

Зря не заметил, ведь никто не увидит твой пост и не проверит код.
Тред утонул или удален.
Это копия, сохраненная 28 ноября 2014 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски