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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В общем, давайте начинать уже!
56 Кб, 500x644
158 Кб, 750x700
!xnn2uE3AU. #2 #416971
Эй! Прочитай сначала этот пост.

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

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

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

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

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

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

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

Подробнее: https://gist.github.com/codedokode/8759492
#3 #417021
>>416970
Задачка на палиндром: http://ideone.com/TjdOOy
#4 #417023
>>416970
Умоляю простите за нубский вопрос.
Но что состбвенно скачать, и как установить, И САМОЕ ГЛАВНОЕ ЗАПУСТИТЬ этот php. КАК?????
#5 #417024
>>416970
Задача про кредит на айпад: http://ideone.com/CZWYUO
#7 #417026
>>417023

Как установить PHP (в картинках)
https://gist.github.com/codedokode/7054af4a03865c4cc863
#8 #417027
>>416970
вот код:

<form action="" method="post" enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />

<input type="submit" value="Отправить" />
</p>
</form>

<?php

foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "D:\\photo\\$name");
}
}
?>

как сделать чтобы записывалось в несколько папок сразу, а не только в D:\\photo\\$name? я пробовал присвоить массив файлс в другой и провести этот же код с копией, но почему-то не работает.
110 Кб, 1148x414
#9 #417030
Что я не так делаю? Как-то криво данные вставляются из текстового файла. Алсо, как символы табуляции ставить не пойму? Я пробел ставлю, но данные со всей строки в одну колонку вставляются, приходится всякими символами изъебываться и командой fields terminated by. Хотя пикрелейтед скопировал с сайта и вставил в документ нормально в разные строки вставляется.
#10 #417035
>>417027

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

http://php.net/manual/ru/function.move-uploaded-file.php
http://php.net/manual/ru/features.file-upload.post-method.php

Копировать FILES нет никакого смысла, так как там не хранится файл, а только его имя и расположение.

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

>>417030

У тебя MySQL пишет

> 5 warnings


Логично прочитать их с помощью SHOW WARNINGS;

> Алсо, как символы табуляции ставить не пойму?


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

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

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

В твоем случае виноват может быть невидимый символ \r который перемещает курсор в начало строки (и затирает то, что было до этого напечатано). Чтобы от него избавиться выбери Line Endings -> Unix вместо Windows. В Windows конец строки помечается 2 символами\r\n.
#10 #417035
>>417027

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

http://php.net/manual/ru/function.move-uploaded-file.php
http://php.net/manual/ru/features.file-upload.post-method.php

Копировать FILES нет никакого смысла, так как там не хранится файл, а только его имя и расположение.

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

>>417030

У тебя MySQL пишет

> 5 warnings


Логично прочитать их с помощью SHOW WARNINGS;

> Алсо, как символы табуляции ставить не пойму?


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

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

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

В твоем случае виноват может быть невидимый символ \r который перемещает курсор в начало строки (и затирает то, что было до этого напечатано). Чтобы от него избавиться выбери Line Endings -> Unix вместо Windows. В Windows конец строки помечается 2 символами\r\n.
#11 #417036
>>416970
Оп, в первой задаче на регулярки, что про телефонный номер, надо решить только регуляркой? Или можно и функции php использовать?
#12 #417038
>>417021

У тебя там внизу

> PHP Notice: Undefined variable: palindrom in /home/cT2Ryf/prog.php on line 20



Ты обращаешься к не созданной переменной. Надо это исправить. Программа с ошибками никак не может быть праивльной.

>>417024

Все правильно

>>417023

Если тебе захочется установить еще Апач, вот помощь: https://gist.github.com/codedokode/10774100

Если ты не знаешь что такое командная строка: https://gist.github.com/codedokode/10539568
#13 #417039
>>417035
не хочу учиться, а хочу жениться!
#14 #417041
>>417036

ну вообще это задача на регулярки, но если у тебя есть другие варианты, показывай, давай посмотрим.
#15 #417042
>>417039

Не учись. Мы никого не заставляем.
#16 #417043
>>417038

>Ты обращаешься к не созданной переменной. Надо это исправить. Программа с ошибками никак не может быть праивльной.


Готово:http://ideone.com/TjdOOy
#17 #417044
>>417043

Теперь все верно.
#18 #417045
>>417025
>>417038
>>417026
Все спасибо друзья разобрался.
#19 #417046
>>417035
ага, спасибо большое. значит скопирую его куда-то с помощью move_uploaded_file, а уже оттуда размножу его по разным директориям с помощью copy.
#21 #417051
>>417046

Да, как вариант.

>>417050

Эту задачу надо бы проверить на примерах телефонов.

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

Можешь их подставить на сайт (если он это позволяет) или сделать программу, которая их переберет и проверит что они правильно распознаются.
#22 #417052
Готовлю резюме на раба без адекватной зарплаты. Спрашивают ключевые навыки для верификации, а я ведь и не умею ничего еще. Писать ли про mysql, javascript (который я, в общем то и не знаю толком, делал простейшего сапёра, аякс-подгрузку постов и ололокнопочки), про slim там. В принципе я совсем не знаю тонкостей (местами и толстостей), писать могу только с гуглом. Мне просто стыдно, что оно будет преукрашено, с другой стороны если написать НАЧАЛЬНЫЕ ЗНАНИЯ PHP, можно подумать, что уровня хеллоуворлд (читал пасты нанимателей), ну и я все-таки хочу, чтобы меня наняли там, все дела. Я конечно прикручу гитхаб с парой корявых приложений, но говорят, что их часто и не смотрят.
#23 #417054
>>417052

Пиши что знаешь. Работодатель все равно будет проверять твои знания скорее всего. И ссылки можешь добавить на гитхаб.
#24 #417059
>>417054
Так я и не знаю толком ничего. Я же и иду за еду работать. Или знания уровня чем отличается абстрактный класс от интерфейса? Ссылку на гитхаб разумеется приклею.
#25 #417062
>>417054
Я, в смысле, о том, что я не могу написать, что знаю php, и что не знаю. У меня слов совсем не хватает что-то.
#26 #417064
>>417062
Блджад, ты идешь работать пхп-макакой, логично, что ты должен написать в знаниях о пхп (даже если это не совсем так) иначе нахуя ты им нужен?
#27 #417066
>>417064
Ну вот свой код я понимаю, а вот попросят меня чужой код объяснить и хз даже. Хотя вроде когда сталкивался более-менее понимал. Вот js другое дело, там я даже свой код сразу понять не могу, вырвиглазный такой. Вообще я просто не могу найти нужные слова.
#28 #417067
>>417066
Вообще, я просто сыкую, вот.
#29 #417068
>>417067
Тут чувак за еду устроился после задачки о банкомате(!!!), а ты очкуешь со своими знаниями.
#30 #417070
Еще это хх просит в двух словах написать. А как мне написать в двух словах, что я знаю пхп но не оче.
#31 #417072
>>417070
"Базовые знания php"
Не тупи, напиши хороший кавер леттер.
#32 #417074
А еще вот что интересно было. Как вообще PHP произносят вслух, лол.
#33 #417075
>>417074

Английский алфавит не знаешь? пиэйчпи
#35 #417077
>>417075
Прям так и говорят? Тупо.
!xnn2uE3AU. #36 #417078
О, я тут старую задачку откопал:

> держи нашу любимую задачу про 2 шарика (не один взвод суровых хаскеллистов сложил на ней свои кости):



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



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

#37 #417079
>>416970
Еще вариант задачи №12 по JS: http://jsbin.com/kososupepa/9/edit?html,console
#38 #417080
Простите
Ебусь в глаза, не могу найти где прикрутить сайт в резюме, чет я совсем аутист.
#39 #417081
>>416970
Опять эта хуита. Пыхопарашники, вам самим не надоело есть это говно? Есть же хороший, годный язык haskell\erlang\сишка. Нахуя вы учите эту парашу? Непонимат.
sage #40 #417082
sage
#41 #417083
#42 #417142
>>417081

>вам самим не надоело есть это говно?


пошел нахуй :3
57 Кб, 481x640
#43 #417144
>>417081

>хороший, годный язык


>haskell\erlang\сишка


шел бы ты олимпиадные задачки решать
#44 #417147
Аноны, заранее извиняюсь за столь глупый вопрос. Я уже часа три убил, но никак не могу его осилить.
Нужно сделать что-то типа страницы модерации. Суть: на странице 1.php пользователь добавляет записи. на странице 2.php админ смотрит все добавленные записи и нажимая кнопку, изменяет значение поля Р c 0 до 1.
На странице 3.php выводятся записи со значение 1 в поле Р.

Так вот, как реализовать это изменение значение поля по нажатию кнопки?
#45 #417148
>>417147
А как ты реализовал первый два пункта?
#46 #417150
>>417147
Если через php, то, наверное, проще через GET. Ставишь на кнопку ссылку с гет переменной, а в скрипте проверяешь, если есть - то выводишь в поле 1 (для input аттрибут value)
#47 #417152
>>417148
ввод:
<?php

$name=mb_strtolower(($_POST['name']), 'utf-8');
$value= mb_strtolower(($_POST['value']), 'utf-8');
mysql_query("INSERT INTO films (name, value) VALUES ('$name', '$value')");
?>

вывод:

$result = mysql_query("SELECT FROM films ORDER BY num ;");

while($film_result = mysql_fetch_array($result))

{
echo ("$film_result[name] ") ;
echo "&nbsp - &nbsp " ;
echo "$film_result[value] <br>" ;
}
#48 #417189
>>417152
Добавь скрытый инпут с айдишниками, по нажатию кнопки делай запрос на апдейт по этим самым айдишникам.
#49 #417203
>>417152
Ну ебать, тогда в чем проблема? Очевидный UPDATE очевиден.
#50 #417227
>>417203
Спасибо. Вопрос решен.
!xnn2uE3AU. #51 #417291
Аноны, я написал большую задачу на разработку сайта для сдачи тестов c условным названием «TestHub». Задача действительно большая, месяца на 2 если не больше, хотя я старался все что можно, выкинуть. Но зато она даст вам хорошие знания того фреймворка, на котором вы будете ее делать.

Вот, держите: https://gist.github.com/codedokode/8733007

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

Еще, напомню, тут был один анон, который хотел дальше что-то изучать: >>415362

> Привет, ОП, привет падаваны. Я давно здесь не появлялся в общем-то с полгода как устроился на работу. До этого прошел учебник опа, запилил файлообменник , арканоид и бложик. Пока хикковал было время учиться и процесс обучения шел довольно быстро, но работая с 10 до 19 (хуёвый график) ничего не успеваю теперь и чувствую что не развиваюсь, ну а если и развиваюсь то очень медленно. Но со следующей недели иду в двухнедельный отпуск и хочу посвятить всё это время какому-нибудь проекту и выучить при этом что-нибудь годное и востребованное на рынке труда (yii? ) Потому как мне остопиздел этот битрикс и клепание второсортных сайтиков и дебагинг этой параши. Тащемта зачем пишу, я уже пробовал пилить штуки в одинокого но никогда не работал над чем-то в команде. Мне было бы интересно с другим аноном попробовать запилить что-нибудь. Я вот думаю, мы могли бы с кем-нибудь объединиться, Оп, бы нам придумал задачку (или мы бы сами придумали). Заодно потренировались бы использовать коллаборативный аспект гита и гитхаба (все эти бранчи мёрджи и пул реквесты) а не просто гит адд гит коммит гит пуш, как мы умеем уже. Что думаете, есть тут такие кому интересно?



Вот, что я могу предложить от себя:

- сделать клон Youtube: можно загружать, смотреть видео, писать комменты. Придется повозиться с конвертацией видео в нужный формат, подбором настроек кодировкания, ffmpeg/mencoder, gearman. Делать разумеется на фреймворке Yii1, 2 или Symfony 2
- изучить тестирование и что-нибудь потестировать:

https://gist.github.com/codedokode/a455bde7d0748c0a351a
http://habrahabr.ru/company/yandex/blog/245869/ (пост от яндекса про тестирование и еще что-то)

- написать плагин чтобы тестовый фреймворк codeception поддерживал Slim (требуется изучить codeception)
- может изучить что-нибудь из серии backbone/knockout/angular и поучиться писать SPA (Single page Application) на яваскрипт. Но для этого надо хорошо знать сам яваскрипт.
- может ты не очень хорошо знаешь HTML/CSS и хочешь на них задания порешать?
- изучить яваскриптовый Audio API и написать генератор всяких звуков (если ты в этой теме хоть немного разбираешься)
- сделать борду (верстка: https://github.com/codedokode/board-markup ) на фреймворке, там еще с оптмизацией наверно придется повозиться
- огромное задание на TestHub (выше) которое ты вряд ли успеешь сделать
- сложное задание: есть такая популярная ORM Doctrine 2, она довольно сложно устроена. Если ты в ней создаешь десятки тысяч сущностей и пытаешься их сохранить в БД, она может тупить минутами (по моим расчетам, это слишком много) и ест память. Кто бы поковырялся в ней профайлером и оптимизировал этот процесс? И заодно снизить потребление памяти. Но учти, что доктрину разрабатывает крупная компания, и если бы все было так просто они бы сами давно все оптимизировали.
- есть такой пакетный менеджер как композер. Он в ходе обновления/установки пакетов ест память как не в себя и долго думает. кто бы это оптимизировал? Учти, что сам разработчик знает об этой проблеме и пишет что он пока не придумал что делать, так как алгоритм сложный.

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

Ну и еще, ты бы мог сделать (и может выложить в open source) что-то для своей работы. Может, тебе приходится какие-то рутинные правки делать в CSS и это можно автоматизировать. Может можно автоматизировать работу с картинками. Может, можно написать бота который будет обходить страницы сайта и искать ошибки. В общем, это тоже вариант, уменьшить объем рутины.
!xnn2uE3AU. #51 #417291
Аноны, я написал большую задачу на разработку сайта для сдачи тестов c условным названием «TestHub». Задача действительно большая, месяца на 2 если не больше, хотя я старался все что можно, выкинуть. Но зато она даст вам хорошие знания того фреймворка, на котором вы будете ее делать.

Вот, держите: https://gist.github.com/codedokode/8733007

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

Еще, напомню, тут был один анон, который хотел дальше что-то изучать: >>415362

> Привет, ОП, привет падаваны. Я давно здесь не появлялся в общем-то с полгода как устроился на работу. До этого прошел учебник опа, запилил файлообменник , арканоид и бложик. Пока хикковал было время учиться и процесс обучения шел довольно быстро, но работая с 10 до 19 (хуёвый график) ничего не успеваю теперь и чувствую что не развиваюсь, ну а если и развиваюсь то очень медленно. Но со следующей недели иду в двухнедельный отпуск и хочу посвятить всё это время какому-нибудь проекту и выучить при этом что-нибудь годное и востребованное на рынке труда (yii? ) Потому как мне остопиздел этот битрикс и клепание второсортных сайтиков и дебагинг этой параши. Тащемта зачем пишу, я уже пробовал пилить штуки в одинокого но никогда не работал над чем-то в команде. Мне было бы интересно с другим аноном попробовать запилить что-нибудь. Я вот думаю, мы могли бы с кем-нибудь объединиться, Оп, бы нам придумал задачку (или мы бы сами придумали). Заодно потренировались бы использовать коллаборативный аспект гита и гитхаба (все эти бранчи мёрджи и пул реквесты) а не просто гит адд гит коммит гит пуш, как мы умеем уже. Что думаете, есть тут такие кому интересно?



Вот, что я могу предложить от себя:

- сделать клон Youtube: можно загружать, смотреть видео, писать комменты. Придется повозиться с конвертацией видео в нужный формат, подбором настроек кодировкания, ffmpeg/mencoder, gearman. Делать разумеется на фреймворке Yii1, 2 или Symfony 2
- изучить тестирование и что-нибудь потестировать:

https://gist.github.com/codedokode/a455bde7d0748c0a351a
http://habrahabr.ru/company/yandex/blog/245869/ (пост от яндекса про тестирование и еще что-то)

- написать плагин чтобы тестовый фреймворк codeception поддерживал Slim (требуется изучить codeception)
- может изучить что-нибудь из серии backbone/knockout/angular и поучиться писать SPA (Single page Application) на яваскрипт. Но для этого надо хорошо знать сам яваскрипт.
- может ты не очень хорошо знаешь HTML/CSS и хочешь на них задания порешать?
- изучить яваскриптовый Audio API и написать генератор всяких звуков (если ты в этой теме хоть немного разбираешься)
- сделать борду (верстка: https://github.com/codedokode/board-markup ) на фреймворке, там еще с оптмизацией наверно придется повозиться
- огромное задание на TestHub (выше) которое ты вряд ли успеешь сделать
- сложное задание: есть такая популярная ORM Doctrine 2, она довольно сложно устроена. Если ты в ней создаешь десятки тысяч сущностей и пытаешься их сохранить в БД, она может тупить минутами (по моим расчетам, это слишком много) и ест память. Кто бы поковырялся в ней профайлером и оптимизировал этот процесс? И заодно снизить потребление памяти. Но учти, что доктрину разрабатывает крупная компания, и если бы все было так просто они бы сами давно все оптимизировали.
- есть такой пакетный менеджер как композер. Он в ходе обновления/установки пакетов ест память как не в себя и долго думает. кто бы это оптимизировал? Учти, что сам разработчик знает об этой проблеме и пишет что он пока не придумал что делать, так как алгоритм сложный.

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

Ну и еще, ты бы мог сделать (и может выложить в open source) что-то для своей работы. Может, тебе приходится какие-то рутинные правки делать в CSS и это можно автоматизировать. Может можно автоматизировать работу с картинками. Может, можно написать бота который будет обходить страницы сайта и искать ошибки. В общем, это тоже вариант, уменьшить объем рутины.
#52 #417292
>>417291

Вот еще, что я вспомнил:

- кто-то предлагал сделать онлайн-редактор для одновременного редактирования файлов с кодом в несколько рук

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

- огромные крестики-нолики где надо поставить 5 знаков в ряд, с возможностью играть онлайн
#53 #417295
>>417076

Переменные названы ужасно. Вот как я угадаю, что ты обозначаешь буква i, x, y? Надо называть переменные понятно, вроде level, total, и тд.

> if ($n <= $y) {


> $i -= 2;


> }


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

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

>>417079

Ой, как все запутанно. Не, это нехорошее решение по моему. И плохо соответствует принципам ООП.

> try/catch


Ты по моему не пониамешь как используются исключения. try и throw не должны быть на одном уровне. Вот у меня есть урок про исключения в php, почитай: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a

> e.msg = "неверный размер";


Это неправльно вообще. И делать console.log из конструктора незачем — непойманные исключения и так пишутся в консоль

> if (size == "big") {


Надо использовать константы, а не строки

> this.calorificValue = 40;


> this.cost = 100;


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

> this.filling.push(....


> this.countPrice( );


А зачем вызывать countPrice? Пусть ее пользователь вызывает когда хочет узнать цену.

Нет никакой защиты от добавления одной добавки несколько раз.
#53 #417295
>>417076

Переменные названы ужасно. Вот как я угадаю, что ты обозначаешь буква i, x, y? Надо называть переменные понятно, вроде level, total, и тд.

> if ($n <= $y) {


> $i -= 2;


> }


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

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

>>417079

Ой, как все запутанно. Не, это нехорошее решение по моему. И плохо соответствует принципам ООП.

> try/catch


Ты по моему не пониамешь как используются исключения. try и throw не должны быть на одном уровне. Вот у меня есть урок про исключения в php, почитай: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a

> e.msg = "неверный размер";


Это неправльно вообще. И делать console.log из конструктора незачем — непойманные исключения и так пишутся в консоль

> if (size == "big") {


Надо использовать константы, а не строки

> this.calorificValue = 40;


> this.cost = 100;


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

> this.filling.push(....


> this.countPrice( );


А зачем вызывать countPrice? Пусть ее пользователь вызывает когда хочет узнать цену.

Нет никакой защиты от добавления одной добавки несколько раз.
#54 #417297
>>417080

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

>>417150

Нет, не делайте так. GET/HEAD запрос должен только получать информацию и ничего не менять. Такие запросы могут слать:

- поисковики
- твой браузер чтобы предзарузить страницу
- антивирус чтобы проверить нет ли вируса по ссылке

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

>>417152

Я всегда комментирую код, и тут не могу пройти мимо. Тут много ошибок и уязвимостей.

> mysql_query


Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO

> VALUES ('$name', '$value')");


Никогда не вставляй данные прямо в запрос, это SQL инъекция. Используй плейсхолдеры и PDO: http://habrahabr.ru/post/137664/

> "$film_result[value] <br>" ;


Не смешивай HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html

Ну и плюс тут XSS затесалась, вот урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64

В общем, не пиши как ты пишешь.
#54 #417297
>>417080

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

>>417150

Нет, не делайте так. GET/HEAD запрос должен только получать информацию и ничего не менять. Такие запросы могут слать:

- поисковики
- твой браузер чтобы предзарузить страницу
- антивирус чтобы проверить нет ли вируса по ссылке

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

>>417152

Я всегда комментирую код, и тут не могу пройти мимо. Тут много ошибок и уязвимостей.

> mysql_query


Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO

> VALUES ('$name', '$value')");


Никогда не вставляй данные прямо в запрос, это SQL инъекция. Используй плейсхолдеры и PDO: http://habrahabr.ru/post/137664/

> "$film_result[value] <br>" ;


Не смешивай HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html

Ну и плюс тут XSS затесалась, вот урок по ней: https://gist.github.com/anonymous/52adda0113428b274c64

В общем, не пиши как ты пишешь.
!xnn2uE3AU. #55 #417298
Аноны, я прочел вот этот пост http://habrahabr.ru/post/245927/ (да, что-то я много читаю хабр) и мне пришла в голову идея еще одного полезного сервиса:

Заполнятор

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

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

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

Для решения требуется уметь писать расширения для браузера, то есть знать HTML/CSS/JS.
Шестое на верстку. #56 #417302
#57 #417303
>>416970
Я вижу ты убрал Никсона из ОП-поста из-за многочисленных прецедентов.
#58 #417309
>>417303

Да, я и сам ее критиковал, а когда еще пара анонов нелестно отозвались, решил что лучше убрать. Там код кривой, уязвимости, функции mysql и прочий ужас.
#59 #417310
>>416860

>Это объект библиотеки Underscore, которая содержит функции для работы с коллекциями


>объект-солянка из методов?


Я угадал!

>Жду версию с начинкой и приправой


http://jsbin.com/huxapohabe/1/edit?js,console
#60 #417318
>>417295

>И плохо соответствует принципам ООП


Почему?

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


Почему?

>А зачем вызывать countPrice?


Ну я вызвал просто чтобы показать что оно работает.

>Нет никакой защиты от добавления одной добавки несколько раз.


В условии задачи об этом речи и не идет.

Остальное понял, перепилю.
#61 #417321
наверное, тупой вопрос, но подскажите как мне элемент сделать всегда строго по центру, вне зависимости от размера экрана?(т.е чтобы на разных устройствах он тоже был по центру) и ещё чтобы размер его уменьшался в зависимости от размера экрана. т.е на большом экране он больше, на маленьком -- меньше. пробовал в процентах указывать, разные типы позиционирования. чето нихуя.
#62 #417324
>>417295
Сори за названия переменных.
Вот ещё попробовал сделать задачку на круговой текст: http://ideone.com/y2kp7b
Не знаю только почему не заполняется полностью круг, а лишь 80-85% дуги. В браузере получше выглядит чем в идеван.
#63 #417325
>>417321
Недавно была похожая задача.
Помог этот гайд: http://css-tricks.com/centering-css-complete-guide/
Я бы сделал абсолютное позиционирование по центру + transition(-50%, 50%). При этом элемент может иметь произвольный размер, ставишь в процентах, что нужно.
#64 #417326
>>417324

>Сори за названия переменных.


>$probels


насмешил
#65 #417329
Можете помочь установить Гентуу?
#66 #417333
>>417310
И четырнадцатая в кучу:
http://jsbin.com/jafamijidi/1/edit?js,console
#67 #417334
>>417325
спасибо, друг.
#68 #417335
>>417321
margin: 0, auto
чтобы узнать размеры экрана - screen.width screen.height, ну а там посчитать можно.
#70 #417338
>>417336
Её обязательно на диск записывать?
Я думал с флехи можно.
#71 #417342
>>417338
Я ставил с flash-накопителя. А вообще таким вопросам место в /s/.
#72 #417343
>>417342
Можешь пояснить как в кратце?
#73 #417345
>>417343
Это давно было, сейчас процесс установки немного другой, но возможность установить с чего угодно, хоть с утюга, хоть с Аллаха, никуда не пропала. Читай Gentoo Handbook, там всё расписано до мельчайших деталей.
#74 #417367
ОП, а почему задачки после ООП лежат на гитхабе? Разрозненно и не структурированно, там ведь у тебя добра на целый l2 хватает.
#76 #417397
А откуда вычитать часто попадающиеся задачи и алгоритмы их решения? Всякие "задачи о рюкзаке" и прочее.
#77 #417401
>>417326
У меня с фантазией плохо :<
#78 #417405
>>417401
Хотя бы называй переменный английскими словами
#79 #417418
>>417318

>>И плохо соответствует принципам ООП


> Почему?


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

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


> Почему?


Потому, что константы делают код понятнее, а магические строки/числа — запутаннее.

Hamburger.SIZE_BIG — понятно что речь идет о размере гамбургера. Понятно, какие размеры в принципе бывают (можно посмотреть на список констант).

'big' — менее понятно, что это. Может размер, а может название какое-нибудь. Само по себе оно ничего не говорит. Более того, в одном месте оно может означать размер гамбургера, а в другом например что-то еще. В случае констант — это будет 2 разных константы.

Вот еще объяснение на английском: http://stackoverflow.com/a/4351110

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

> Ну я вызвал просто чтобы показать что оно работает.


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

> В условии задачи об этом речи и не идет.


Ну как же?

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



Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса. Да и сам подумай, какой код лучше — который говорит об ошибке или который молча делает неправильно действие?
#79 #417418
>>417318

>>И плохо соответствует принципам ООП


> Почему?


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

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


> Почему?


Потому, что константы делают код понятнее, а магические строки/числа — запутаннее.

Hamburger.SIZE_BIG — понятно что речь идет о размере гамбургера. Понятно, какие размеры в принципе бывают (можно посмотреть на список констант).

'big' — менее понятно, что это. Может размер, а может название какое-нибудь. Само по себе оно ничего не говорит. Более того, в одном месте оно может означать размер гамбургера, а в другом например что-то еще. В случае констант — это будет 2 разных константы.

Вот еще объяснение на английском: http://stackoverflow.com/a/4351110

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

> Ну я вызвал просто чтобы показать что оно работает.


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

> В условии задачи об этом речи и не идет.


Ну как же?

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



Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса. Да и сам подумай, какой код лучше — который говорит об ошибке или который молча делает неправильно действие?
#80 #417422
>>417302

Черных рамок на картинке нет

У тебя ширина текста жестко зафиксирована и равна 230px а он должен тянуться и занимать свободное место.

Вот примеры резиновых лейаутов:

http://blog.html.it/layoutgala/
http://alistapart.com/article/holygrail
http://chikuyonok.ru/2009/06/float-columns/
http://chikuyonok.ru/2010/01/liquid-site-markup/

> ul {


> list-style-type: none;


Этим ты удаляешь точки у всех списков на странице, включая например списки в тексте. А надо удалять только у меню.

> font-family: "Trebuchet MS";


Надо писать в конце списка шрифтов стандартный шрифт: http://htmlbook.ru/css/font-family

> font-size: 20px;


Когда задаешь font-size надо переопределять line-height

Меню выглядит не как на картинке: не тот цвет, нет подчеркивания, пункты прижаты слишком тесно.

Заголовок должен быть нежирным шрифтом
#80 #417422
>>417302

Черных рамок на картинке нет

У тебя ширина текста жестко зафиксирована и равна 230px а он должен тянуться и занимать свободное место.

Вот примеры резиновых лейаутов:

http://blog.html.it/layoutgala/
http://alistapart.com/article/holygrail
http://chikuyonok.ru/2009/06/float-columns/
http://chikuyonok.ru/2010/01/liquid-site-markup/

> ul {


> list-style-type: none;


Этим ты удаляешь точки у всех списков на странице, включая например списки в тексте. А надо удалять только у меню.

> font-family: "Trebuchet MS";


Надо писать в конце списка шрифтов стандартный шрифт: http://htmlbook.ru/css/font-family

> font-size: 20px;


Когда задаешь font-size надо переопределять line-height

Меню выглядит не как на картинке: не тот цвет, нет подчеркивания, пункты прижаты слишком тесно.

Заголовок должен быть нежирным шрифтом
#81 #417428
>>417310

> function indexOf(


> return undefined;


Обычно такая функция возвращает -1 так как undefined легко спутать с 0 при сравнени через ==

> function Hamburger(type, stuff) {


Не проверяется правильность stuff

> if (this.ADDS_PROPS[additiveName] === undefined) {


Исплоьзуй оператор in

> if (indexOf(additiveName, this.adds) === undefined) {


Если такая добавка уже есть то лучше выкинуть исключение

> } catch (e) {


try|catch по моему лишний так как ошибки и так по умолчанию идут в консоль

Так, в остальном верно.

>>417321

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

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

Также, можно использовать таблицу (не в html, а в css display: table) растянутую на 100%.

Также, можно попробовать абсолютное позиционирование.

2 последних способа поддерживают прокрутку если контент больше высоты экрана.

> и ещё чтобы размер его уменьшался в зависимости от размера экрана. т.е на большом экране он больше, на маленьком -- меньше.


В 99% это смотрится глупо, имей в виду. Большой экран покупают чтобы на него помещалось больше информации.

>>417324

> $corner = number_format(360 / $len, 2);


number_format предназаначен для преобразования числа в строку. Для округления есть round, floor, ceil

В строках 15-25 какие-то лишние циклы по моему. Что мешает сразу строку разбить на буквы?

> почему не заполняется полностью круг


Потому что ты зачем-то все пробелы вырезал, а длину строки брал с пробелами

> foreach ($v as $val) {


Это можно заменить на implode

Насчет переменных, если плохо знаешь английский просто испоьзуй slovari.yandex.ru или google translate.

Круг не круглый, так как надо домножать не на 2, а на чуть больший коэффициент.
#81 #417428
>>417310

> function indexOf(


> return undefined;


Обычно такая функция возвращает -1 так как undefined легко спутать с 0 при сравнени через ==

> function Hamburger(type, stuff) {


Не проверяется правильность stuff

> if (this.ADDS_PROPS[additiveName] === undefined) {


Исплоьзуй оператор in

> if (indexOf(additiveName, this.adds) === undefined) {


Если такая добавка уже есть то лучше выкинуть исключение

> } catch (e) {


try|catch по моему лишний так как ошибки и так по умолчанию идут в консоль

Так, в остальном верно.

>>417321

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

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

Также, можно использовать таблицу (не в html, а в css display: table) растянутую на 100%.

Также, можно попробовать абсолютное позиционирование.

2 последних способа поддерживают прокрутку если контент больше высоты экрана.

> и ещё чтобы размер его уменьшался в зависимости от размера экрана. т.е на большом экране он больше, на маленьком -- меньше.


В 99% это смотрится глупо, имей в виду. Большой экран покупают чтобы на него помещалось больше информации.

>>417324

> $corner = number_format(360 / $len, 2);


number_format предназаначен для преобразования числа в строку. Для округления есть round, floor, ceil

В строках 15-25 какие-то лишние циклы по моему. Что мешает сразу строку разбить на буквы?

> почему не заполняется полностью круг


Потому что ты зачем-то все пробелы вырезал, а длину строки брал с пробелами

> foreach ($v as $val) {


Это можно заменить на implode

Насчет переменных, если плохо знаешь английский просто испоьзуй slovari.yandex.ru или google translate.

Круг не круглый, так как надо домножать не на 2, а на чуть больший коэффициент.
#82 #417429
>>417325

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

>>417333

4 уровня отступов в учебной задаче???? надо упростить.

------------

Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

-----------

> if (variable === undefined) {


Чтобы проверить наличие элемента в объекте есть оператор in. Что за костыли? И почему у нас в массиве не может храниться undefined? Конечно, может, от этого он псевдомассивом быть не перестанет.

> arrayLike = false;


Тут незачем продолжать цикл

> if (toString.call


А где определение toString?

В остальном, верно.

>>417335

Зачем яваскрипт тащить? На CSS делается

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

>>417367

Потому что я пока не структурировал, некогда.
#82 #417429
>>417325

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

>>417333

4 уровня отступов в учебной задаче???? надо упростить.

------------

Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

-----------

> if (variable === undefined) {


Чтобы проверить наличие элемента в объекте есть оператор in. Что за костыли? И почему у нас в массиве не может храниться undefined? Конечно, может, от этого он псевдомассивом быть не перестанет.

> arrayLike = false;


Тут незачем продолжать цикл

> if (toString.call


А где определение toString?

В остальном, верно.

>>417335

Зачем яваскрипт тащить? На CSS делается

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

>>417367

Потому что я пока не структурировал, некогда.
#83 #417432
>>417429
http://jsbin.com/zexicomehu/1/edit

>А где определение toString?


Эм, а оно нужно? Работает ведь. Я так понимаю, оно есть где-то в базовом объекте.
#84 #417434
>>417381

15

> if (!typeof(object) === "object") {


!==

> for (var field in object) {


Надежнее проверять еще свойства через hasOwnproperty, а то скоипируешь заодно все методы с прототипа

В остальном, верно

16

Не работает для массива: http://jsbin.com/sobejitivu/1/edit?console,output

>>417397

ну про задачу о рюкзаке отдельная страница: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5

А так, надо читать книжки по алгоритмам и по решению олимпиадных заадч.

Вот тут что-то есть http://algolist.manual.ru/olimp/

http://www.intuit.ru/studies/courses/2293/593/info

Книги вроде такой

> Решение сложных и олимпиадных задач по программированию. Долинский М.С.



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

В общем гугли по словам «алгоритмы», «олимпиадные задачи по программированию», «разбор задач по программированию».

Если есть какие-то вопросы, задавай.

Порешать задачки можно на codeforces.
#84 #417434
>>417381

15

> if (!typeof(object) === "object") {


!==

> for (var field in object) {


Надежнее проверять еще свойства через hasOwnproperty, а то скоипируешь заодно все методы с прототипа

В остальном, верно

16

Не работает для массива: http://jsbin.com/sobejitivu/1/edit?console,output

>>417397

ну про задачу о рюкзаке отдельная страница: http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5

А так, надо читать книжки по алгоритмам и по решению олимпиадных заадч.

Вот тут что-то есть http://algolist.manual.ru/olimp/

http://www.intuit.ru/studies/courses/2293/593/info

Книги вроде такой

> Решение сложных и олимпиадных задач по программированию. Долинский М.С.



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

В общем гугли по словам «алгоритмы», «олимпиадные задачи по программированию», «разбор задач по программированию».

Если есть какие-то вопросы, задавай.

Порешать задачки можно на codeforces.
#85 #417435
Все, я спать.

>>417432

Оно где-то в коде jsbin и делать программу зависимой от jsbin непраивльно.

> if (!(type === "object")) {


!==

> if (variable.length >= 0) {


Этот if можно перевернуть и еще уменьшить отступ. Плюс, условие «length >= 0» лучше бы дополнить проверкой что свойство существует.
#86 #417436
>>417435
Так я в опере проверяю своей.
И да
http://jsbin.com/litifokawa/1/edit?js,console
Теперь и с массивами объектов!
#87 #417437
>>417435

>Плюс, условие «length >= 0» лучше бы дополнить проверкой что свойство существует.


Если его нет, то вернет undefined, что при сравнении с нулем должно дать false, Не?
#88 #417447
>>417422
http://jsfiddle.net/02Lfe87c/
Чет не помогли мне твои ссылки, я их полистал, сделал как в четвертой, но почему-то так вышло. Реквестирую помощь.
#89 #417448
Проблема возникла, может кто подскажет. Мне надо на странице работать с сессиями, в них записываются математические результаты, после чего можно перейти на следующую страницу нажав кнопку. Но если перезагрузить страницу в сессию вновь записываются данные, как этого избежать?
#90 #417449
>>417448
Причём результаты зависят от данных введёных в поля формы.
#91 #417452
>>417449
Куки?
#92 #417457
>>417448
Перезапроси страницу гетом, после обработки формы.
#93 #417462
Доброй ночи. Суть такова:
есть, например, 10 пользователей, которым выдали пароль. Есть таблица с именами этих пользователей и их паролями. Есть еще одна таблица, в которой хранятся данные, и user_id. Пользователи вводят данные в один инпут, и пароль в другой. после этого должно отображаться $user ввел $text. Я могу вывести все данные, которые вводились, могу вывести так $user_id ввел $text. А нужно чтобы $user ввел $text. Короче, как соотнести user_id из одной таблицы с user из другой?
#94 #417463
>>417462
У тебя все это дело в бд хранится, так?
#95 #417464
#96 #417465
>>417462
Очевидно в таблице с именами и паролями должны быть и user id
#97 #417466
>>417465
>>417463
Сейчас постараюсь все наглядно объяснить.
#98 #417467
>>417466
Я бы на твоем месте пошел читать про join. А затем решать здешние задачки по sql.
#100 #417475
>>417472
Всё, я сам разобрался, всем спасибо.
#101 #417476
>>417475
Я повторюсь: иди почитай уроки по sql. А еще у тебя там sql-инъекция пройдет.
#102 #417477
>>417476
Да, про join обязательно почитаю, спасибо. Но свою проблему я решил без этого.
#103 #417478
>>417477
Два запроса сделал?
#105 #417480
>>417479
А что будешь делать, если у двух юзеров пароль одинаковы?
И начни использовать PDO.
#106 #417481
>>417480
Регулярки?
Что это такое? В двух словах
#107 #417482
>>417481
В двух словах - встроенный класс для работы с базами данных.
http://php.net/manual/ru/book.pdo.php
Заодно https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a почитай.
#108 #417484
>>417482
Спасибо, завтра почитаю.
#109 #417495
Оп, я тут попробовал сапера сделать, но у меня все плохо.
http://jsbin.com/wecedejota/1/edit?html,js,output
Код немного в хаосе.
sage #110 #417517
>>417298
Уже есть
#111 #417522
>>417495
Ты кроме этих задачек вообще днями ничем не занимаешься?
#112 #417525
>>417522
Нет, я еще в универ хожу. Как сейчас. Да и за js задачами я мало сижу, он мне не нравится.
#113 #417540
>>417525
Видимо не напряжный у тебя универ, лол
9 Кб, 671x100
#114 #417547
Не могу кирилицу добавлять в бд, погуглил, пишут нужно устанавливать шрифт cp1251, но это не помогло.
#115 #417554
>>417547

Надо ставить SET NAMES cp866 в MySQL так как в консоли рабоатет именно 866 кодировка.

Для таблиц надо ставить utf8 (именно так. без дефиса). 1251 советую вообще закопать подальше.
31 Кб, 822x503
#117 #417557
>>417556
Всё это читал, везде всё стоит utf8 в my.cnf, не помогло нисколько.
#118 #417559
>>417557

SET NAMES cp866 ввел? Если нет то плохо читал.

Виндовая консоль не умеет utf8, только в архаичные кодировки вроде cp866
sage #119 #417561
>>416970
Ебать, да тут коллектор быдлокодеров. Обоссал всех.

Мимо_хаскеле_бог
#120 #417562
>>417559
>>417554
Да, после cp866 все работает. Её нужно при каждом запуске командной строки вводить?
#121 #417566
>>417561
Да ты здесь больше всех быдлокодеров пишешь.
#123 #417586
Привет, читаю сейчас секреты javascript-нинздзя, хочу параллельно парктиковать. Учебника кантора пройден уже, есть у вас задачки по JS интересные и сложные? (не jQuery)
#124 #417587
>>417586
Ох, что же у меня столько опечаток-то в двух предложениях.
#126 #417665
Сосоны, я не туда пишу, но кого еще спрашивать хиккану? В общем, начал изучать CSS, решил сделать страничку бложика. Как-то разобрался, итд итп, но есть вопрос:
<span class="tag-date"><span class="tag">Теги:<span class="tag-list"><a href="#">тег-1</a>, <a href="#">тег-2</a>, <a href="#">тег-3</a></span></span><span class="date">Дата Поста</span></span>
Вот такой спан стоит под записью в бложике. Находится он в диве с это записью. Для записи заданы размеры. Мне нужно подвинуть Дату Поста вправо что-бы находилась она в правой стороне записи. Как это сделать?
#127 #417672
>>417665
Я уже сам додумал, оказалось очень прсто, хоть и через жопу.
#128 #417677
Анон, ай нид ёр хелп. Кто может помочь с заданием. В моем пту завтра зачет, а т.к. я нихуя не программист и препод нихуя не учит, то надо как-то выкручиваться.
Вот само задание : https://gist.github.com/anonymous/1ebcc8f7a3c8047b7d1a
Кто сможет сделать с комментариями за разумную цену?
#129 #417678
>>417677
И ты решил вкинуть задание за один день до зачета, причем вечером?
#130 #417679
>>417678
обещал сделать другой человек, он не смог
есть еще неделя в запасе, завтра предпоследняя пара, такие дела.
#131 #417687
>>417650
Спасибо!
92 Кб, 640x853
#132 #417724
>>417677
Ну ладно, придется идти на сриланс.
sage #133 #417727
>>417724
Задачка-то хуйня. Знал бы php, сделал бы за тортик.
Сам попробуй. Недели более чем достаточно.
#134 #417728
>>417727
приклеилась
#135 #417730
>>417727
да знаю я, что хуйня так-то, думаю вряд ли я разберусь в этом за неделю.
#136 #417744
>>417436

> Так я в опере проверяю своей.


Хорошо, тогда объясни откуда эта функция взялась в глобальной области видимости. В стандарте яваскрипта такой глобальной функции нет и в описании свойств window тоже нет: https://developer.mozilla.org/en-US/docs/Web/API/Window

>>417437

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

>>417447

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

Насчет подсказки, вот: http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/

Там есть примеры.

Вот еще дополнительно пояснение про отрицательные маргины на флоатах: https://gist.github.com/codedokode/3f6063edf0a2227eb313

>>417448

Редиректи после обработки формы

>>417472

Я не могу пройти мимо. Код ужасен. Так писать нельзя.

Нельзя вставлять переменнеы прямо в SQL код надо использовать плейсхолдеры иначе получается либо sql инъекция либо просто быдлокод. Вот полезная статья: http://habrahabr.ru/post/137664/

Также, mysql функции устарели, переходи на PDO.

Ну и не надо в одном файле смешивать HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
#136 #417744
>>417436

> Так я в опере проверяю своей.


Хорошо, тогда объясни откуда эта функция взялась в глобальной области видимости. В стандарте яваскрипта такой глобальной функции нет и в описании свойств window тоже нет: https://developer.mozilla.org/en-US/docs/Web/API/Window

>>417437

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

>>417447

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

Насчет подсказки, вот: http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/

Там есть примеры.

Вот еще дополнительно пояснение про отрицательные маргины на флоатах: https://gist.github.com/codedokode/3f6063edf0a2227eb313

>>417448

Редиректи после обработки формы

>>417472

Я не могу пройти мимо. Код ужасен. Так писать нельзя.

Нельзя вставлять переменнеы прямо в SQL код надо использовать плейсхолдеры иначе получается либо sql инъекция либо просто быдлокод. Вот полезная статья: http://habrahabr.ru/post/137664/

Также, mysql функции устарели, переходи на PDO.

Ну и не надо в одном файле смешивать HTML и PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
#137 #417745
>>417479

Тебе праивльно советуют, пользователя надо искать не по паролю, а по паре логин/пароль.

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

У меня есть хорошие задчки и ссылки для изучения: https://gist.github.com/codedokode/10539213

>>417495

> if (event.button === 1) {


Я не вижу где определеяется переменная event

У тебя из-за этого ошибка

> "ReferenceError: event is not defined (line 119)"



Ты это читал? Почитай.

http://learn.javascript.ru/events

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

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

>>417672

У меня если что есть очень полезные задачки по HTML/CSS и ссылочки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

>>417730

У меня есть урок по ООП http://archive-ipq-co.narod.ru/l1/pasta.html
#137 #417745
>>417479

Тебе праивльно советуют, пользователя надо искать не по паролю, а по паре логин/пароль.

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

У меня есть хорошие задчки и ссылки для изучения: https://gist.github.com/codedokode/10539213

>>417495

> if (event.button === 1) {


Я не вижу где определеяется переменная event

У тебя из-за этого ошибка

> "ReferenceError: event is not defined (line 119)"



Ты это читал? Почитай.

http://learn.javascript.ru/events

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

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

>>417672

У меня если что есть очень полезные задачки по HTML/CSS и ссылочки: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

>>417730

У меня есть урок по ООП http://archive-ipq-co.narod.ru/l1/pasta.html
!xnn2uE3AU. #138 #417746
Все, до завтра, решайте задачки.
#139 #417752
Оп, я решил завтра утром начать задачу про TestHub, но, честно говоря, я не знаю с чего начать. Я скачал yii2 basic app и смотрю на него, как баран на новые ворота. Для начала я разобрался, как там делать няшные пути, но это явно не то, с чего надо начинать. Можешь посоветовать?
#140 #417762
>>417752
Наиболее последняя версия доккументации http://stuff.cebe.cc/yii2docs/guide-README.html .

Есть перевод на русский https://github.com/yiisoft/yii2/tree/master/docs/guide-ru , но если можешь, то читай английскую версию.

Вообще, читай что там написано сверху вниз.
#141 #417796
Прочитал я про шаблоны. Это что, действительно удобнее читается, когда каждую строчку кода мы начинаем с <?php> ?
Аноним #142 #417797
>>416970
ОП, было бы очень здорово увидеть от тебя задачки на backbone.js.
#143 #417800
>>417418

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


Хорошо, в этом есть логика.

>Естественно, попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.


Почему?
#144 #417805
Посоветуете годную книжку или материал по SQL и MySQL? На русском. От и до, интенсивно, но подробно. Чтобы уметь руками таблицы пилить, ключи задавать, связи. Чтобы знать, зачем там всякие макросы, как работают оптимизации, разбираться в типах таблиц, уметь проектировать оптимально и так далее? Читать офф-доки не хочу совершенно, они несравнимо хуже пхпшных и часто без нормальных примеров.
16 Кб, 642x283
#145 #417809
Это нормально, что таблица вот так отображается, или я накосячил где-то?
#146 #417825
>>417805
sql-ex.ru
#147 #417826
>>417809
Да, нормально. Вероятно ты не это ожидал увидеть, а то что выводит SELECT FROM students;
#148 #417827
>>417826
Бля, там звездочка между SELECT и FROM
#149 #417831
>>417809

Я проверил, у меня то же самое - ширина колонок считается неправильно под Windows с cp866 (под linux c utf8 проблем нет).

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

Один из варианто решения использовать в конце запроса не ; а \G который выводит результат вертикально (это удобно при работе с большими таблицами):

mysql> SELECT 'тест' AS field1, 'Проверка' as f2\G

field1: тест
f2: Проверка

Писать SET NAMES необяхательно, можно в my.ini в разделе client прописать нужную кодировку: http://gahcep.github.io/blog/2013/01/05/mysql-utf8/

>>417805

Посмотри ссылки отсюда, например: https://gist.github.com/codedokode/10539213

Там есть хороший гайд по MySQL для начинабщих + учебник Пирамидина по языку SQL. Оптимизации там нет, так как это отдельная тема, и про нее можно погуглить по словам «индексы», «EXPLAIN», «тюнинг».

Оптимизация заключается в нескольких вещах:

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

Вот например:

- http://habrahabr.ru/post/211022/
- http://habrahabr.ru/post/31129/
- http://www.mysql.ru/docs/man/MySQL_indexes.html
- http://habrahabr.ru/post/154167/
#149 #417831
>>417809

Я проверил, у меня то же самое - ширина колонок считается неправильно под Windows с cp866 (под linux c utf8 проблем нет).

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

Один из варианто решения использовать в конце запроса не ; а \G который выводит результат вертикально (это удобно при работе с большими таблицами):

mysql> SELECT 'тест' AS field1, 'Проверка' as f2\G

field1: тест
f2: Проверка

Писать SET NAMES необяхательно, можно в my.ini в разделе client прописать нужную кодировку: http://gahcep.github.io/blog/2013/01/05/mysql-utf8/

>>417805

Посмотри ссылки отсюда, например: https://gist.github.com/codedokode/10539213

Там есть хороший гайд по MySQL для начинабщих + учебник Пирамидина по языку SQL. Оптимизации там нет, так как это отдельная тема, и про нее можно погуглить по словам «индексы», «EXPLAIN», «тюнинг».

Оптимизация заключается в нескольких вещах:

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

Вот например:

- http://habrahabr.ru/post/211022/
- http://habrahabr.ru/post/31129/
- http://www.mysql.ru/docs/man/MySQL_indexes.html
- http://habrahabr.ru/post/154167/
#150 #417835
Аноны, я никого не пропустил? Напомните о себе тогда.

>>417580

> for ($k = 0; $k <= $len 4; $k++) {


> $screen[$i][$k] = ' ';


Этот цикл можно заменить на array_fill. Второй цикл, кстати, тоже.

> ?>


> <?php


Не очень понятно зачем они тут

В остальном, хорошо.

>>417752

А в задаче все понятно? Вайрфреймы страниц посмотрел?

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

Начать наверно стоит с модели. Спроектируй таблицы для хранения теста и вопросов, добавь SQL код как миграцию, сделай на их основе модели в Yii (там есть генератор, если что, но может тебе лучше их руками писать). После этого попробуй сделать страницу создания теста, пока без регистрации, пользователей и всего прочего. Для создания страницы нужен контроллер и HTML-шаблон.

В качестве шаблонизатора крайне рекомендую twig.

Устанавливать все стоит через композер — ты с ним работал?

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

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

Если что задавай вопросы.

Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?

>>417762

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

>>417796

В шаблонах обычно находится только HTML код с редкими вставками переменных или вызовов функций:

<h1><?= html($title) ?></h1>

<p>Имя: <?= html($name) ?></p>

Потому проблемы о которой ты говоришь, нет. PHP код с логикой не должен быть в шаблоне, а должен быть в php-файле, примерно так:

index.php
--------

(логика на php)
require 'templates/index.phtml';

templates/index.phtml
-------------

(html-шаблон для отображанения данных)

То есть в одном файле логика в другом шаблон для отображения. По моему, удобно. Если тебе кажется что нет, покажи код, посмотрим.
#150 #417835
Аноны, я никого не пропустил? Напомните о себе тогда.

>>417580

> for ($k = 0; $k <= $len 4; $k++) {


> $screen[$i][$k] = ' ';


Этот цикл можно заменить на array_fill. Второй цикл, кстати, тоже.

> ?>


> <?php


Не очень понятно зачем они тут

В остальном, хорошо.

>>417752

А в задаче все понятно? Вайрфреймы страниц посмотрел?

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

Начать наверно стоит с модели. Спроектируй таблицы для хранения теста и вопросов, добавь SQL код как миграцию, сделай на их основе модели в Yii (там есть генератор, если что, но может тебе лучше их руками писать). После этого попробуй сделать страницу создания теста, пока без регистрации, пользователей и всего прочего. Для создания страницы нужен контроллер и HTML-шаблон.

В качестве шаблонизатора крайне рекомендую twig.

Устанавливать все стоит через композер — ты с ним работал?

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

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

Если что задавай вопросы.

Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?

>>417762

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

>>417796

В шаблонах обычно находится только HTML код с редкими вставками переменных или вызовов функций:

<h1><?= html($title) ?></h1>

<p>Имя: <?= html($name) ?></p>

Потому проблемы о которой ты говоришь, нет. PHP код с логикой не должен быть в шаблоне, а должен быть в php-файле, примерно так:

index.php
--------

(логика на php)
require 'templates/index.phtml';

templates/index.phtml
-------------

(html-шаблон для отображанения данных)

То есть в одном файле логика в другом шаблон для отображения. По моему, удобно. Если тебе кажется что нет, покажи код, посмотрим.
#151 #417839
>>417835

>Начать наверно стоит с модели.


Вот это я и хотел узнать.

>там есть генератор, если что, но может тебе лучше их руками писать


Определенно руками.

>В качестве шаблонизатора крайне рекомендую twig.


Можно в двух словах в чем его функция?

>Устанавливать все стоит через композер — ты с ним работал?


Да, я там uppu.ru пытался делать.

>Гайд, который дал анон ниже, вполне хорош, но на английском, ты как с ним?


Думаю, что достаточно для чтения документации.
#152 #417842
>>417805

Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).

>>417809

Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G

>>417800

Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.

>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.


> Почему?


Потому что по условиям задачи

> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).



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

Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/

Это делает твой код более надежным.

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

>>417797

Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.

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

Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
#152 #417842
>>417805

Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).

>>417809

Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G

>>417800

Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.

>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.


> Почему?


Потому что по условиям задачи

> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).



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

Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/

Это делает твой код более надежным.

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

>>417797

Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.

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

Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
#153 #417845
>>417805

Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).

>>417809

Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G

>>417800

Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.

>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.


> Почему?


Потому что по условиям задачи

> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).



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

Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/

Это делает твой код более надежным.

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

>>417797

Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.

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

Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
#153 #417845
>>417805

Я тебе еще советую решить 3 задачи по моей ссылке. Для начинающего они полезны. А потом, если тебе этого будет мало, позанимаемся оптимизиацией запросов на таблицах из миллионов строк (на маленьких неинтересно).

>>417809

Кстати чтобы посмотреть структуру таблицы иногда удобнее писать SHOW CREATE TABLE students\G

>>417800

Ты правильно делаешь, что задаешь вопросы. Я ведь мог и напутать что-то.

>> попытка добавить 2 одинаковых добавки это тоже непраивльное испльзование класса.


> Почему?


Потому что по условиям задачи

> Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).



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

Вообще, лучше на любое подозрительное действие выдавать ошибку, а не игнорировать. Это называется принцип fail fast: http://habrahabr.ru/post/218325/

Это делает твой код более надежным.

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

>>417797

Ох, надо подумать. Backbone — фреймворк, предоставляющий роутер и модели для написания SPA, правда он не предаставляет шаблонизатор, и надо подключать сторонний, вроде mustache или knockout.

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

Такие задачки, кстати, придумывать не так просто, надо рыться в документации, искать разные плагины и библиотеки, прикидывать, сложно ли это будет сделать, и т.д. Но она конечно нужна тем, кто хочет хорошо разбираться в фронтенде.
!xnn2uE3AU. #154 #417846
>>417839

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

<?php foreach ($files as $file): ?>
<tr>
<td>Файл: <?= html($file->name) ?></td>
....

Twig позволяет делать то же самое, только удобнее:

{% for file in files %}
<tr>
<td>Файл: {{file.name}}</td>
....

Twig — это порт питоновской Jinja. Разработан он той же компанией что делает Symfony. Он поддерживает разные фильтры для обработки переменных, макросы, наследование шаблонов и другие интересные фичи. Он также автоматически экранирует выводимые данные в формате HTML, и тебе не надо с ним писать htmlspecialchars вокруг каждой переменной как в php. Twig написан с применением ООП и хорошо расширяем.

Twig довольно популярен, распространен, не старый, содержит много возможностей. Документация на оф сайте вполне хороша и подробна, ознакомься: http://twig.sensiolabs.org/

Вот русский, урезанный перевод неизвестной степени актуальности: http://twig.kron0s.com/
#155 #417848
>>417842

>Потому что по условиям задачи


>Дополнительно, гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).



Может я придираюсь, но тот факт что

>гамбургер можно посыпать приправой (+ 15 тугриков, 0 калорий) и полить майонезом (+ 20 тугриков, + 5 калорий).


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

Самое простое что можно придумать про backbone это каталог товароа
#156 #417853
>>417848

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

> Самое простое что можно придумать про backbone это каталог товароа


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

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

SPA — это для разработки приложений, а каталог товаров на мой взгляд обычный сайт с контентом и лучше делается на старых добрых html технологиях.
#157 #417856
>>417853

>то найдется желающий 10 раз полить гамбургер майонезом. Что продавцу делать?


Ну, добавлять. В том же макдаке можно попросить добавить побольше того или иного ингридиента или убрать какой-то.
#158 #417860
>>417856

Но от 10 добавок весь этот майонез разольется. Ограничение все же должно быть (ну и видимо кому-то надо более внятно формулировать условия задачи).
!xnn2uE3AU. #159 #417886
Аноны, вот вы любите говорить «не получится, не получится», а почитайте историю как человек в Эппл пробивался: http://siliconrus.com/2014/12/apple-long-story/
#160 #417888
>>417886

>Несколько лет назад с ним через сеть LinkedIn связался рекрутер Apple.


Угу-угу.
Шестое на верстку. #161 #417892
http://jsfiddle.net/jvh3kpwk/
Ну так короче.
#162 #417896
>>417886
Ну судя по тексту, он не пробивался, а просто попробовал несколько(2) раз.
#163 #417898
>>417892
Мне кажется в задании требуется что то такое: http://jsfiddle.net/jvh3kpwk/1/
Верстка 7 #164 #417902
Быстренько заделал.
А в шестом я похоже не то прислал.
http://jsfiddle.net/1wx8wng2/
#165 #417918
>>417835

>добавь SQL код как миграцию


Что это значит?
#166 #417921
Продолжаю пытать задачу нумер 12:
http://jsbin.com/gofotisace/46/edit?html,console

Не могу понять почему

>size != Hamburger.prototype.BIG_TYPE


при size = "small"
возвращает false, как и при использовании !==
И там и там пишу в английской раскладке.

Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.

В остальном вроде разобрался.
#167 #417923
>>417921

>возвращает false, как и при использовании !==


А почему должно быть иначе?
#168 #418033
>>417902
Ну я опять ступил. Вот седьмое.
http://jsfiddle.net/exrowjbp/
46 Кб, 915x477
#169 #418038
Добрый вечер, пишу стандартную админку для какого-нибудь сайта в вакууме, и вот у меня есть таблица юзеров например. Как мне сделать её интерактивной? Что бы строчки id, login например были ссылками/кнопками и при нажатии на них у меня таблица сортировалась по этим самым id или username? А рядом например как сделать что бы с юзером была ссылка на его удаление? Я понимаю как написать функцию которая бы делала удаление пользователя по его юзернейму или , или кусок кода выводящий саму таблицу в другом порядке, но как это грамотно реализовать в плане общения с пользователем?
63 Кб, 566x770
Тема для диплома. Беларецкий #170 #418040
Анон день добрый или не день.
Заканчиваю универ, скоро предстоит преддипломная практика, а в последствии и написание диплома. Всем известная штука.
Немного о себе. С самого рождения нет смысла рассказывать. Начну с того момента, когда первый раз сделал "привет мир". Первый раз "привет мир" было сделано на первом курсе, когда по программе изучали C++. По началу маленькие победы и большие проблемы, из-за свой туполобости, меня подстеригали. Но данные проблемы не останавливали, а наоборот мотивировали, что-то делать. Спустя какое-то время, примерно один семестр, заметил, что не все ребята тянут программу и решил помогать советами и делом. Под конец семестра на горизонте появились парни с заочного отделения, которым было трудно осваивать данное ремесло и решено было им помочь - начал делать их лабораторные работы за какое-то мелкого денежное довольстие. Спустя пару месяцев мне написал хороший знакомый, девушке которого необходимо было сделать лабораторные работы по программированию. Как в последствии оказалось лабораторные работы предстояло делать на PHP. Немного подумав, решил попробовать. Спустя пару дней лабораторные работы были выполнены. Так был получен первый опыт в PHP. Вспомнив детские забавы с некрасивой версткой в возрасте четырнадцати лет, захотел попробовать сделать хоть какой-нибудь сайтик. Далее методом проб и ошибок учился. Летом после третьего курса нашел заказчика и продал ему сайт визитку. Потом мелкий фриланс, работа в которе. Мэтт Зандстра.
На сегодняшний день реальный опыт работы в вэбе больше, чем полтора года. Последних месяца два использую Laravel. Классная документация, очень доставляет работа с ним). Хочу развиваться дальше. Дальше вижу перспективу в Symfony. И параллельно со всем этим углублять знания английского языка.
По специальности совсем не программист, а инженер по телекоммуникациям.
"Такой инженер помимо инженерии должен и программировать" (С) Хороший преподаватель с кафедры.
Как ты мог понять из моего маленького рассказа - еще на втором курсе мой выбор пал на программирование, а не на инженерию. Хотя в рамках свой специальности, умею что-то делать.
Суть моего вопроса сводится к следующему. Необходима годная тема диплома. Планирую написать веб-сервис. Например банкинг (работа с какой-нибудь отечественной платежной системой) или что-то в духе booking.com. Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах и распределении вызовов между операторами. Как-то так. С меня девочки)
63 Кб, 566x770
Тема для диплома. Беларецкий #170 #418040
Анон день добрый или не день.
Заканчиваю универ, скоро предстоит преддипломная практика, а в последствии и написание диплома. Всем известная штука.
Немного о себе. С самого рождения нет смысла рассказывать. Начну с того момента, когда первый раз сделал "привет мир". Первый раз "привет мир" было сделано на первом курсе, когда по программе изучали C++. По началу маленькие победы и большие проблемы, из-за свой туполобости, меня подстеригали. Но данные проблемы не останавливали, а наоборот мотивировали, что-то делать. Спустя какое-то время, примерно один семестр, заметил, что не все ребята тянут программу и решил помогать советами и делом. Под конец семестра на горизонте появились парни с заочного отделения, которым было трудно осваивать данное ремесло и решено было им помочь - начал делать их лабораторные работы за какое-то мелкого денежное довольстие. Спустя пару месяцев мне написал хороший знакомый, девушке которого необходимо было сделать лабораторные работы по программированию. Как в последствии оказалось лабораторные работы предстояло делать на PHP. Немного подумав, решил попробовать. Спустя пару дней лабораторные работы были выполнены. Так был получен первый опыт в PHP. Вспомнив детские забавы с некрасивой версткой в возрасте четырнадцати лет, захотел попробовать сделать хоть какой-нибудь сайтик. Далее методом проб и ошибок учился. Летом после третьего курса нашел заказчика и продал ему сайт визитку. Потом мелкий фриланс, работа в которе. Мэтт Зандстра.
На сегодняшний день реальный опыт работы в вэбе больше, чем полтора года. Последних месяца два использую Laravel. Классная документация, очень доставляет работа с ним). Хочу развиваться дальше. Дальше вижу перспективу в Symfony. И параллельно со всем этим углублять знания английского языка.
По специальности совсем не программист, а инженер по телекоммуникациям.
"Такой инженер помимо инженерии должен и программировать" (С) Хороший преподаватель с кафедры.
Как ты мог понять из моего маленького рассказа - еще на втором курсе мой выбор пал на программирование, а не на инженерию. Хотя в рамках свой специальности, умею что-то делать.
Суть моего вопроса сводится к следующему. Необходима годная тема диплома. Планирую написать веб-сервис. Например банкинг (работа с какой-нибудь отечественной платежной системой) или что-то в духе booking.com. Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах и распределении вызовов между операторами. Как-то так. С меня девочки)
#171 #418041
>>417923
Ну потому что Hamburger.prototype.BIG_TYPE = "big"
Впрочем уже неважно, сделал перерыв, написал вроде тоже самое, но теперь все работает:
http://jsbin.com/wocugidiqu/1/edit?html,console
Видимо глаз замылился.
#172 #418044
>>418040
Совсем забыл. Так же имею опыт работы c MySQL, JS, jQuerry, git, svn.
#173 #418046
>>418040
А сколько всего времени ушло?
4 года?
#174 #418047
>>418040
А ты у преподов спросил, прокатит ли? Не совсем по специальности вроде же.
>>418038
Тебе нужен JS для сортировки. Удаление можно сделать на пыхе. Оберни таблицу в форму и добавь кнопки, чтобы кнопка соотносилась со строкой, а потом обрабатывай отправленные из формы данные и удаляй.а вообще, то что ты делаешь, больше похоже на adminer
#175 #418049
>>418047
Нашел на кафедре преподавателя, у которого в данном направлении можно писать диплом.
>>418046
Если имеешь ввиду времени на изучение PHP, то где-то 3,5 года, включая некоторые перерывы в изучении.
#176 #418051
>>418044

> имею опыт работы


> jQuerry


ну-ну
#177 #418056
>>418047
Да, именно как в phpMyAdmin я и хочу сделать примерно, скачал этот adminer, и для меня там просто полная жесть внутри этих файликов, хаос какой-то просто. Понимаю что там функционала зашито вагон целый, а мне бы нужно всего 2 вещи для начала: удалить юзера, отосортировать таблицу. Без js никак это не сделать средствами php и html? Пусть страничка перезагружается каждый раз при любом действии - это не страшно? Есть идеи? Куда копать?
#178 #418058
>>418038
Думаю можно сделать и с помощью пхп, просто каждое поле должно быть с ссылкой на ту же страницу, но со своим параметром $_GET по которому таблица будет сортироваться.
#179 #418060
>>418058
Ну и изврат.
#180 #418061
>>418058
Напиши пожалуйста список вещей которые мне нужно завтра прочитать, что бы понять как это реализовать? По твоим словам мне не понятно пока.
#181 #418062
>>418060
Ну а ты бы как сделал?
#182 #418063
>>418056
Ну можно, но это я это вижу только если делать отдельный запрос к базе для каждой сортировки.
#183 #418064
>>418061
http://php.net/manual/ru/reserved.variables.get.php
Все, что тебе нужно знать.
>>418060
Это единственный способ, который пришел мне в голову. Сам собираюсь так сделать, т.к жс не знаю пока.
#184 #418066
>>418062
Яваскрипт?
#185 #418069
>>418066
я не касался его пока, так как нуб еще.
#187 #418091
#188 #418093
>>417147
с такими задачками хорошо какой-нибудь фреймверк ковырять, например, YII.
#189 #418094
>>417462
JOINы не?
#190 #418137
>>418075
Ну хуй знает, для удаление все равно придется на гет вешать параметр.
#191 #418180
У js есть "document.write". Есть что подобное у php? Задача такая, что в зависимости от условия на странице должна выводиться ссылка.
#192 #418182
>>418180
document.write устаревший и не рекомендуется, лучше innerHTML.
http://learn.javascript.ru/document-write

>Есть что подобное у php?


http://php.net/manual/ru/function.echo.php ?
28 Кб, 331x500
#193 #418188
>>418182

>echo


Спасибо. Я-то, натыкаясь на него, думал, он просто текст выводит.
60 Кб, 700x906
#194 #418190
>>417892

По моему это совсем не похоже.

>>417898

Ширина текста не 80% а сколько останется от меню, то есть 100% - 230px

>>417902

> font-family: "Trebuchet MS", Times, sans-serif;


Times тут лишний. Во-первых, он с засечками, во-вторых в Windows идет "Times New Roman", а не Times.

Вот пикрелейтед с виндошрифтами.

> font-size: 20px;


Когда задаешь font-size надо рядом задавать line-height.

В остальном, сам лейаут сделан верно.
#195 #418195
>>417918

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

Миграция — это скрипт, вносящий изменения в структуру базы данных.

В Yii есть поддержка миграций.

http://stuff.cebe.cc/yii2docs/guide-db-migrations.html (англ)
http://yiiframework.ru/doc/guide/ru/database.migration (русский, из Yii 1)

>>417921

> почему


>> size != Hamburger.prototype.BIG_TYPE


> при size = "small"


Так и должно быть

> Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.


напиши как выглядит вывод цены в консоль с объединенными и раздельными методами и сравни.

Писать код лучше не в HTML создавая смесь языков, а в вкладке Javascript.

> if (size == Hamburger.prototype.BIG_TYPE) {


Что за пустые ифы?
if (size != ... && size != ...) { ...

> Hamburger.prototype = {


> BIG_TYPE: "big",


Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?

> new Hamburger("small","cheese");


Ты не используешь константы тут, а надо бы использовать.

> switch (fill) {


> case "cheese":


Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?

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

> } catch (e) {


> console.log(e);


Можешь объяснить зачем try/catch? Что изменится если их убрать?
#195 #418195
>>417918

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

Миграция — это скрипт, вносящий изменения в структуру базы данных.

В Yii есть поддержка миграций.

http://stuff.cebe.cc/yii2docs/guide-db-migrations.html (англ)
http://yiiframework.ru/doc/guide/ru/database.migration (русский, из Yii 1)

>>417921

> почему


>> size != Hamburger.prototype.BIG_TYPE


> при size = "small"


Так и должно быть

> Еще думаю надо методы countPrice() и countCalorificValue() объединить в один.


напиши как выглядит вывод цены в консоль с объединенными и раздельными методами и сравни.

Писать код лучше не в HTML создавая смесь языков, а в вкладке Javascript.

> if (size == Hamburger.prototype.BIG_TYPE) {


Что за пустые ифы?
if (size != ... && size != ...) { ...

> Hamburger.prototype = {


> BIG_TYPE: "big",


Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?

> new Hamburger("small","cheese");


Ты не используешь константы тут, а надо бы использовать.

> switch (fill) {


> case "cheese":


Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?

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

> } catch (e) {


> console.log(e);


Можешь объяснить зачем try/catch? Что изменится если их убрать?
#196 #418196
Накидайте пожалуйста задачек на регулярки, чувствую что надо лучше разобраться
#197 #418199
>>418033

Расстояние между input и кнопкой не равно 10px. Там есть ссылка полезная: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html

ПРо box-sizing знаешь? Это не потому, что оно тут нужно, а просто спрашиваю.

>>418038

Удаление должно делаться методом POST то ест формой с кнопкой.

> Что бы строчки id, login например были ссылками/кнопками и при нажатии на них у меня таблица сортировалась по этим самым id или username?


Ну так поставь туда ссылку и сделай чтобы она передавала имя поля для сортировки в query string

> удаление пользователя по его юзернейму


Лучше по id

>>418040

> Дальше вижу перспективу в Symfony.


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

> Необходима годная тема диплома.


Самое выгодное для тебя будет писать сервис за который тебе заплатят и заодно диплом по нем у написать (хотя имхо это на диплом не тянет — слишком примитивно).

> Например банкинг (работа с какой-нибудь отечественной платежной системой)


А платежная система тебе даст достиуп к своим данным?

> в духе booking.com.


А как организации будешь заманивать?

> Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах


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

>>418041

Прочитай пожалуйста замечания >>418195\t

>>418044

Норм для начала.

>>418047

А как ты с jS будешь сортировать при постраничной навигации? Аяксом? Лишнее усложнение имхо. Тут проще наверно на сервере сортировать, без яваскрипта.

>>418056

Сделай на заголовках колонок ссылки вида

index.php?sort=+name
index.php?sort=-date

и т.д.

И если честно у меняи ощущение что ты плохо знаешь php, может тебе стоит задачку какую-нибудь решить? У нас есть похожая: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
#197 #418199
>>418033

Расстояние между input и кнопкой не равно 10px. Там есть ссылка полезная: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html

ПРо box-sizing знаешь? Это не потому, что оно тут нужно, а просто спрашиваю.

>>418038

Удаление должно делаться методом POST то ест формой с кнопкой.

> Что бы строчки id, login например были ссылками/кнопками и при нажатии на них у меня таблица сортировалась по этим самым id или username?


Ну так поставь туда ссылку и сделай чтобы она передавала имя поля для сортировки в query string

> удаление пользователя по его юзернейму


Лучше по id

>>418040

> Дальше вижу перспективу в Symfony.


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

> Необходима годная тема диплома.


Самое выгодное для тебя будет писать сервис за который тебе заплатят и заодно диплом по нем у написать (хотя имхо это на диплом не тянет — слишком примитивно).

> Например банкинг (работа с какой-нибудь отечественной платежной системой)


А платежная система тебе даст достиуп к своим данным?

> в духе booking.com.


А как организации будешь заманивать?

> Так же вариант написать большую систему для колл-центра, по сбору информации о входящих вызовах


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

>>418041

Прочитай пожалуйста замечания >>418195\t

>>418044

Норм для начала.

>>418047

А как ты с jS будешь сортировать при постраничной навигации? Аяксом? Лишнее усложнение имхо. Тут проще наверно на сервере сортировать, без яваскрипта.

>>418056

Сделай на заголовках колонок ссылки вида

index.php?sort=+name
index.php?sort=-date

и т.д.

И если честно у меняи ощущение что ты плохо знаешь php, может тебе стоит задачку какую-нибудь решить? У нас есть похожая: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
#198 #418200
>>418060

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

>>418066

Зачем яваскрипт если можно без него, быстрее и проще?

>>418180

Ты по моему не знаешь php. PHP работает на сервере и в нем есть команда для вывода текста. Начни с учебника: https://php.net/manual/ru/language.basic-syntax.php

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

>>418196

В моем учебнике все решил? Хорошо, давай помучаем регулярки.

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

<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается

выведет

b
div

Усложнение: все что находится внутри тегов script, style, textarea считается текстом и как теги не рассматривается.
#198 #418200
>>418060

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

>>418066

Зачем яваскрипт если можно без него, быстрее и проще?

>>418180

Ты по моему не знаешь php. PHP работает на сервере и в нем есть команда для вывода текста. Начни с учебника: https://php.net/manual/ru/language.basic-syntax.php

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

>>418196

В моем учебнике все решил? Хорошо, давай помучаем регулярки.

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

<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается

выведет

b
div

Усложнение: все что находится внутри тегов script, style, textarea считается текстом и как теги не рассматривается.
#199 #418206
>>418199

>Прочитай пожалуйста замечания >>418195\t


>>418195

>Так и должно быть


"small" != "big" возвращает false, почему так и должно быть?

>Что за пустые ифы?


Исправил вот тут >>418041

>Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?


Зачем обращаться к ней вне класса?

>Ты не используешь константы тут, а надо бы использовать.


Почему? Я видел у анона, решавшего эту задачу запись

>var test = new Hamburger(Hamburger.TYPE_BIG, Hamburger.STUFF_POTATO);


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

>Не удобнее будет сделать словарь вида (тип -> стоимость и калории) ?


Можно.

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


Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.

>Можешь объяснить зачем try/catch? Что изменится если их убрать?


Да ничего
#200 #418207
>>418206

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


фикс
не дописал
#201 #418211
>>418206

>"small" != "big" возвращает false, почему так и должно быть?


А что по-твоему значит "!="?
#202 #418218
>>418211
Я другой анон, но "small" не равен "big" и это правда - значит true должно быть. В консоли true возвращает, кстати.
#203 #418219
>>418211
Не равно.
#204 #418220
Спешите видеть! JS петушки не могут в элементарнейшую логику.
140 Кб, 683x1024
#205 #418226
>>418199
Спасибо друг, что поддержал идею колл-центра. За сегодня думал над вариантом примитивного облочного сервиса - аля dropbox. Но уперся в реализацию клиента для компьютера. Надо еще подумать.
#206 #418230
>>418226
Лол - узнал Левита, а шлюху не узнал
#207 #418233
>>418230
клаудия шифер
#208 #418235
>>418230
Не могу представить человека, незнающего Клаву. Ещё лет десять назад она была мокрой фантазией любого, у кого писюн мог стоять хоть как-то.
#209 #418236
>>418233
это понятно, просто не хотел ломать интригу
#210 #418237
>>418235
Лет десять назад мой писюн не стоял ни на кого, я даже не знал что с ним делать.
#211 #418238
>>418237
Блять, сколько тебе лет?
#212 #418239
#213 #418241
>>418200

>В моем учебнике все решил? Хорошо, давай помучаем регулярки.



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

<b><!-- <i> это комментарий --><div class="1"><x это битый тег и он не считается

http://ideone.com/F5XJr6
#214 #418243
Делаю ту рулетку со второго урока.
На семёрке застопорилось. Пишет, что анекспектед ЭЛСиф а я хз чего оно так.
http://ideone.com/bVyjB1
#215 #418244
>>418243
Ладно, сам нашел ошибку.
3 Кб, 655x89
#216 #418245
>>418244
И сразу-же... ЧТо это?
#217 #418247
>>418243
Для сравнения нужно использовать "==" или "===" (строгое сравнение), а вот это "=" присваивает значение.
#218 #418248
>>418247
Я уже понял. А как оно узнало последнюю цифру-то?
#219 #418249
>>418248
Выполнилось то, что в первом if, $lastDigit = 1 и дальше проверки не было, отсюда и результат единица.
#220 #418250
>>418249
Суть совершения ошибки я понял уже. Хотел узнать зачем именно остаток от деления ему нужен был, но и это понял.
#221 #418251
>>418250
Да ну что такое? Только что всё считало, а потом перестало, и эррор пишет.
#222 #418266
Как вы справляетесь с бугуртом, когда в вашей команде кто-то находит ошибку в вашем коде и с космическим сарказмом ее вам предъявляет?
#223 #418267
>>418266
Никак, я же безработный.
#224 #418269
>>418243
Сосоны, поясните, таки, где ошибка, хули считать перестало. Я хочу другие уроки пройти, но на этом застрял.
#225 #418274
>>418269
Айдеон опять мозги ебёт. Ставь свой сервер.
#226 #418276
>>418266
Если бы мне предъявляли с космическим сарказмом, я бы задумался о том стоит ли продолжать работать в такой компании.
#227 #418284
>>418276
Мухосрань, сэр. Лучше ничего не найти.
Как у вас доводят сведения об ошибках?
#228 #418290
>>418284
Просто говорят где ошибка и если я не знаю что делать, говорю и мне помогают. Но я плохо переношу критику и даже в этой ситуации моя жопа в огне. Не представля какого тебе.
#229 #418300
<?php

$credit = 40000;
$proc = 1.03;
$komis = 1000;
$platez = 5000;
$summa = 0;

for ($month = 1; $month <= 20; $month++) {
$credit = ($credit + $proc) + $komis - $platez;
$summa = $summa + $platez;
echo "На {$month} месяц долг: {$credit} руб, выплачено: {$summa} \n";

if ($credit < 0) {
echo "Всё\n";
break;
}
}
?>

Переписал ту задачу, вроде как осмыслил. Почему у меня результат другой, что я не так сделал-то?
#230 #418301
>>418300
И сразу-же понял ошибку.
#231 #418304
Делаю второй пункт задачи. Хочу полную сумму узнать, а что-то не придумаю, как её задать.
http://ideone.com/J3g3Tg - вот додумал покамест. Как полную сумму задать?
someApprentice #232 #418305
Ну я в жесткую же я прострацию попал

У меня возникла странная проблема при работе с ООП.
Файл загружается через форму и вызывается upload.php. Далее имя файла преобразуется из кириллицы в латиницу. Проблема заключается в том, что когда я вызываю этот метод из другого метода, то метод преобразования в латиницу начинает работать не правильно, а если я вызову этот метод где-то по среди кода, то все работает нормально.

Вот собственно код:
upload.php: http://pastebin.com/yhfgrEAT
Upload.php: http://pastebin.com/mAPNzAxg
Database.php: http://pastebin.com/b8pCZi9k

Скоро доделаю REST-service, если не попаду в прострацию, бгг
someApprentice #233 #418306
>>418305
Санная макака
#234 #418322
>>417835

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


https://github.com/sqghub/TestHub
Очень неспешно таки начал. Пока что вожусь с формой.
#235 #418337
>>418305
Чому ты обращаешься к методу через имя класса, будто бы он статический?
#236 #418338
[code]<ul id="menu-%d0%bc%d0%b5%d0%bd%d1%8e" class="nav-menu">
<li id="menu-item-224" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-194 current_page_item menu-item-has-children menu-item-224"><a href="http://localhost/site/?page_id=194">Страничка</a
[/code]
Как грамотно обратиться к "Старничке"? Пробовал разное, но безрузальтативно. Нужно поменять, например, её цвет.
#237 #418340
>>418338
Для начала неплохо было постить код через песочницы
#238 #418345
>>418338
Разобрался.
>>418340
Тысяча извинений.
#239 #418346
>>418304
Охуеть у вас здесь клуб похапэ. По вашим-же задачкам вопросы спрашиваю - игнор получаю.
Ну да ладно, сам додумал, понял, что в циклы можно новые значения переменных добавлять.
http://ideone.com/CZReIO - Вышло в конце. Больше, вроде, ничего и не надо.
62 Кб, 265x387
#240 #418347
Начал решать задачки ОПа, ну и решил заодно попробовать методику TDD. Сначала выбирал между двумя самыми популярными инструментами тестирования js - мока.js и jasmine, выбрал jasmine. В итоге для первой задачки решение в 11 строк, тесты к ней - 48 строк. А вообще это оказалось очень весело. Намерен продолжать.
[code]
"use strict";
function sequence(start, step) {
\tvar start = start || 0,
\t\tstep = step || 1;
\tvar cur = start;
\treturn function() {
\t\tvar old = cur;
\t\tcur += step;
\t\treturn old;
\t}
}
[/code]
#241 #418351
Помогите установить генту, в /s меня игнорируют.
Не могу настроить подключение к сети.
ping -c 3 www.gentoo.org выдает unknown host
Пробовал через net-setup и pppoe-setup, все равно не работает.
#242 #418352
>>418241
Бамп
#244 #418361
>>418347

> тесты к ней - 48 строк


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

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

Код решения лучше постить на jsbin, jsfiddle, codepen или аналогичный сервис где он выполняется.

Так, твой код выглядит верным.

>>418206

> "small" != "big" возвращает false, почему так и должно быть?


А, значит я не так тебя понял. Вот я сейчас проверил: возвращает true http://jsbin.com/selureqota/2/edit?js,console

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

>> Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?


> Зачем обращаться к ней вне класса?


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

Это общепринятый подход.

Есть константа Math.PI которая хранит догадайся сам какое число. Есть константы для типов узлов в DOM (дереве объектов которые представляют старницу в браузере) вроде Node.ELEMENT_NODE, Node.TEXT_NODE и другие. Например document.nodeType == Node.DOCUMENT_NODE, а document.body.nodeType == Node.ELEMENT_NODE. Есть константы для обозначения разных типов CSS-правил: https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants

Вот еще константы для названий клавиш: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Constants_for_keyCode_value

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

> И по-моему это не очень,


Это общепринятый способ. Он больше информации несет, то есть по «Haburger.SIZE_SMALL» понятно что речь о маленьком размере гамбургера, а не чем-то еще.

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


Тут ты не прав. Это все должно быть в коде, а не в документации, потому что:

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

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

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

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


> Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.


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

>>Можешь объяснить зачем try/catch? Что изменится если их убрать?


>Да ничего


Ну так тогда наверно незачем их и писать?

По твоему коду тут http://jsbin.com/wocugidiqu/1/edit?html,console — надо добавить ограничение на добавки и начинки. У меня в задаче начинку можно выбрать только одну из трех. И с константами разобраться. В остальном, норм.

Вообще, я смотрю, что идея про константы не нравится почти всем, кто решает эту задачу, и все пытаются там использовать просто строки. Почему, интересно.
#244 #418361
>>418347

> тесты к ней - 48 строк


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

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

Код решения лучше постить на jsbin, jsfiddle, codepen или аналогичный сервис где он выполняется.

Так, твой код выглядит верным.

>>418206

> "small" != "big" возвращает false, почему так и должно быть?


А, значит я не так тебя понял. Вот я сейчас проверил: возвращает true http://jsbin.com/selureqota/2/edit?js,console

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

>> Как к такой константе обращаться извне класса? Не лушче ли писать Ham.XX = yy ?


> Зачем обращаться к ней вне класса?


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

Это общепринятый подход.

Есть константа Math.PI которая хранит догадайся сам какое число. Есть константы для типов узлов в DOM (дереве объектов которые представляют старницу в браузере) вроде Node.ELEMENT_NODE, Node.TEXT_NODE и другие. Например document.nodeType == Node.DOCUMENT_NODE, а document.body.nodeType == Node.ELEMENT_NODE. Есть константы для обозначения разных типов CSS-правил: https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants

Вот еще константы для названий клавиш: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Constants_for_keyCode_value

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

> И по-моему это не очень,


Это общепринятый способ. Он больше информации несет, то есть по «Haburger.SIZE_SMALL» понятно что речь о маленьком размере гамбургера, а не чем-то еще.

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


Тут ты не прав. Это все должно быть в коде, а не в документации, потому что:

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

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

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

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


> Как уже обсуждалось, это спорный вопрос. Но добавлю, ок.


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

>>Можешь объяснить зачем try/catch? Что изменится если их убрать?


>Да ничего


Ну так тогда наверно незачем их и писать?

По твоему коду тут http://jsbin.com/wocugidiqu/1/edit?html,console — надо добавить ограничение на добавки и начинки. У меня в задаче начинку можно выбрать только одну из трех. И с константами разобраться. В остальном, норм.

Вообще, я смотрю, что идея про константы не нравится почти всем, кто решает эту задачу, и все пытаются там использовать просто строки. Почему, интересно.
#245 #418363
>>418351

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

В дебиане сеть описывается в /etc/network, может и в генте аналогично?
#246 #418364
>>418351

А ping 8.8.8.8 работает? Если да то у тебя просто DNS не настроен.
52 Кб, 694x612
#247 #418365
Аноны, выручайте. Я тот чел, который тут за локальное хранилище спрашивал. Вкратце суть - на сайте есть 4 товара (Article 1, Article 2, Article 3, Article 4). Нужно любой из них добавить в локальное хранилище, перезагрузить страницу, и отобразить в DOM (пикрилейтед). Это я сделал. А дальше идет загвоздка - нажимая на серый квадрат, мне нужно удалить данный ряд из DOM а так же из локального хранилища (в моем случае пока надо только из DOM). Проблема в том, функция deleteFromDOM() срабатывает всего один раз. Ссылка на код http://jsfiddle.net/vw5d11r1/ Буду рад, если найдется анон, который по хардкору объяснит в чем ошибка, советы по типу "используй замыкание" и т.п. к сожалению мне не помогут, т.к. с такими вещами я сталкивался поверхностно лишь в теории. Да, по поводу задач ОПа, я их смотрел, но не могу за них взяться, пока не закончил это задание, т.к. оно является основой портфолио одного из моих быдлосайтов.
#248 #418370
>>418365
.onclick может повесить только один обработчик. А ты их все вешаешь на newDiv.childNodes[5], соответственно один, тот что повешен последним отрабатывает и все, свободен. Юзай addEventListener() или вместо newDiv.childNodes[5] втыкай document.getElementById(%тут id%).childNodes[5].
а лучше книжки почитай умные
#249 #418371
>>418241

Она выводит лишнее. В примере тут она должна вывести только b и div, а выводит еще и i, который является частью комментария: http://ideone.com/qDgiWw

Надо улучшить код.

И да, HTML действительно не стоит разбирать регулярками, надо использовать DOM парсер. Но ради изучения регулярок можно отойти от этого правила.

>>418243

Код выглядит верно. Насчет ideone, это у них баг. Установи PHP себе, как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863 и запускай в консоли (гайд по консоли: https://gist.github.com/codedokode/10539568 )

Если ты используешь IDE (Eclipse, Netbeans, PhpStorm) то можно указать путь к PHP в настройках и запускать программы одной кнопкой из IDE.

>>418266

Если тебе предъявляют ошибку с сарказмом, то это человек невопитанный или невежливый. Ничего плохого в том, чтобы сделать ошибку нет — любой может ошибиться. Я тоже делаю ошибки в коде (но бугурта не испытываю). Важно оперативно ее исправить, а в идеале наладить тестирование − чтобы программисты тестировали свои изменения, а тестеры - сам продукт перед релизом, чтобы ошибки отлавливались как можно раньше. Увы, автоматизированным тестированием во многих компаниях не занимаются.

>>418276

Но это же человек виноват что он невоспитанный или асоциальный, а не компания.

>>418284

Мне об ошибках пишут в скайп (либо я сам их вижу в логах ошибок и исправляю).

>>418300

У тебя долг в минус уходит по моему.
#249 #418371
>>418241

Она выводит лишнее. В примере тут она должна вывести только b и div, а выводит еще и i, который является частью комментария: http://ideone.com/qDgiWw

Надо улучшить код.

И да, HTML действительно не стоит разбирать регулярками, надо использовать DOM парсер. Но ради изучения регулярок можно отойти от этого правила.

>>418243

Код выглядит верно. Насчет ideone, это у них баг. Установи PHP себе, как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863 и запускай в консоли (гайд по консоли: https://gist.github.com/codedokode/10539568 )

Если ты используешь IDE (Eclipse, Netbeans, PhpStorm) то можно указать путь к PHP в настройках и запускать программы одной кнопкой из IDE.

>>418266

Если тебе предъявляют ошибку с сарказмом, то это человек невопитанный или невежливый. Ничего плохого в том, чтобы сделать ошибку нет — любой может ошибиться. Я тоже делаю ошибки в коде (но бугурта не испытываю). Важно оперативно ее исправить, а в идеале наладить тестирование − чтобы программисты тестировали свои изменения, а тестеры - сам продукт перед релизом, чтобы ошибки отлавливались как можно раньше. Увы, автоматизированным тестированием во многих компаниях не занимаются.

>>418276

Но это же человек виноват что он невоспитанный или асоциальный, а не компания.

>>418284

Мне об ошибках пишут в скайп (либо я сам их вижу в логах ошибок и исправляю).

>>418300

У тебя долг в минус уходит по моему.
#250 #418372
>>418370
Спасибо!
#251 #418373
>>418304

Что-то идеон сломался. Вот, я перепостил решение (fork + run): http://ideone.com/RMxEy6

Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.

Проверь также программу на других суммах: кредит = 1000, выплата = 2030, кредит = 4000, выплата должна быть около 6123.

Мне кажется, лучше алгоритм сделать так:

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

> Хочу полную сумму узнать, а что-то не придумаю, как её задать.


Сделай переменную и в нее добавляй каждую выплату. По моему, ты это уже сделал.

>>418305

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


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

> class Database {


> public function newName($originalname) {



> $replace = Database::newName($name);


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

> $db = new Database( );


> $replace = $db->newName($name);



PHP должен был вывести сообщение об ошибке. Если он не выводит - у тебя отключен вывод ошибок и надо его включить (я могу написать как).

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

У тебя есть еще одна ошибка. Ты исплоьзуешь регулярки без флага u для работы с русскими буквами. Они работать не будут, по причинам описанным тут: https://gist.github.com/codedokode/ff99e357e9860ea169b8 Из-за этого замена идет некорректно.

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

> $ruExplode = explode(' ' , $ru);


Я подумал, это плохая идея так как при такой записи легко допустить ошибку. Посмотри на свой код, и ответь, какой букве соответствует русская «П»? Чтобы это определить, тебе надо вручную отсчитывать пробелы и это долго и легко что-то перепутать. Такого быть не должно, код должен быть понятен, я думаю лучше записать пары в виде массива array("Ш" => "Sch"). Сам массив можно нагуглить.

> $originalname = preg_replace($ruExplode, $engExplode, $originalname);


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

> $originalname = explode('.', $originalname);


> $extension = array(end($originalname));


> $originalname = array_diff($originalname, $extension);


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

Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.
#251 #418373
>>418304

Что-то идеон сломался. Вот, я перепостил решение (fork + run): http://ideone.com/RMxEy6

Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.

Проверь также программу на других суммах: кредит = 1000, выплата = 2030, кредит = 4000, выплата должна быть около 6123.

Мне кажется, лучше алгоритм сделать так:

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

> Хочу полную сумму узнать, а что-то не придумаю, как её задать.


Сделай переменную и в нее добавляй каждую выплату. По моему, ты это уже сделал.

>>418305

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


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

> class Database {


> public function newName($originalname) {



> $replace = Database::newName($name);


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

> $db = new Database( );


> $replace = $db->newName($name);



PHP должен был вывести сообщение об ошибке. Если он не выводит - у тебя отключен вывод ошибок и надо его включить (я могу написать как).

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

У тебя есть еще одна ошибка. Ты исплоьзуешь регулярки без флага u для работы с русскими буквами. Они работать не будут, по причинам описанным тут: https://gist.github.com/codedokode/ff99e357e9860ea169b8 Из-за этого замена идет некорректно.

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

> $ruExplode = explode(' ' , $ru);


Я подумал, это плохая идея так как при такой записи легко допустить ошибку. Посмотри на свой код, и ответь, какой букве соответствует русская «П»? Чтобы это определить, тебе надо вручную отсчитывать пробелы и это долго и легко что-то перепутать. Такого быть не должно, код должен быть понятен, я думаю лучше записать пары в виде массива array("Ш" => "Sch"). Сам массив можно нагуглить.

> $originalname = preg_replace($ruExplode, $engExplode, $originalname);


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

> $originalname = explode('.', $originalname);


> $extension = array(end($originalname));


> $originalname = array_diff($originalname, $extension);


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

Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.
#252 #418374

>>418322

> https://github.com/sqghub/TestHub/blob/master/config/web.php#L31


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

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

Еще, включи строгий режим в MySQL чтобы она показывала больше ошибок. Для этого надо после соединения сделать SET sql_mode = 'STRICT_ALL_TABLES': http://dev.mysql.com/doc/refman/5.1/en/sql-mode.html#sql-mode-setting

Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:

create_table :products do |t|
t.string :name
t.text :description
t.timestamps null: false
end

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

> $command = $this->db->createCommand("DROP TABLE IF EXISTS `questions`");


Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.

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

> `name` TEXT NOT NULL,


Хватит и VARCHAR, он до 65000 символов вроде поддерживает (но размер одной строки таблицы не может быть больше 65000 байт так что юникодных символов туда влезет меньше, инфа: http://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html ).

> `author` VARCHAR(255),


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

> `text` TEXT,


Название плохое. Что такое «текст»? Предисловие? Содержимое? Послесловие? Правила?

> `time`


> `date`


Название плохое. Время чего? Обычно называют created, added, edited, deleted и тд. Если это ограничение то timeLimit.

Также, ты можешь (то есть требуется так делать) добавлять комментарии когда смысл не очень ясен:

rabbitPerTree INT (10) COMMENT 'Максимальное число зайцев, сидящих под одним деревом'

Эти комментарии сохраняются в БД и отображаются в разных программах для работы с ней.

> `questions` INT(11) UNSIGNED NOT NULL,


> `points` INT(11) UNSIGNED NOT NULL,


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

> Question.php


> QuestionMapper.php


Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать? http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

ActiveRecord — это когда модель сама себя сохраняет и достает из базы. Вот моя паста про мапперы: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

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

Отдельная тема — что делать с разными классами вопросов? Как хранить в БД наследующиеся сущности? Для этого есть 3 паттерна и их надо знать (это могут спросить на собеседовании, к слову):

http://martinfowler.com/eaaCatalog/singleTableInheritance.html
http://martinfowler.com/eaaCatalog/classTableInheritance.html
http://martinfowler.com/eaaCatalog/concreteTableInheritance.html
http://martinfowler.com/eaaCatalog/inheritanceMappers.html

(русский перевод если что есть на http://design-pattern.ru/ )

В Yii реально реализовать STI с полем type, один из анонов это ранее делал, насчет других подходов не знаю, но предупрежу что искать вопросы в 3 таблицах сложнее чем в одной.

> public function getAllTests()


Если у тебя есть сущность Test то логично возвращать массив этих Test, а не «глупый» массив с сырыми данными. Но если ты решишь использовать ActiveRecord. Также, по идее в эти Test должны быть вбиты вопросы. Если ты захочешь это написать, ты скоро увидишь что приходится писать кучу кода для маппинга между сущностями и таблицами. Гораздо умнее в такой ситуации не изобретать велосипед, а использовать библиотеку-маппер вроде Doctrine 2 (или activeRecord).

> https://github.com/sqghub/TestHub/tree/master/tests


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

> TestHub/views/test/createTest.php


Почему twig не используешь, а на PHP пишешь?

> {!{questionNumber}!}


Не очень удачный выбор, печатать тяжело. Я думаю, можно либо шаблон вынести в отдельных файл (чтобы не было конфликта с twig), либо использовать 2 знака процента например или [[ .

https://github.com/sqghub/TestHub/blob/master/views/test/createTest.php#L41 слишком длинная строка

Ну и я бы советовал использовать тут jQuery, если ты с ним знаком. Ну или сделать свои функции, например, var div = create('div', { id: 'xyz' }) вместо ручной возни с DOM методами.

Насчет формы, почитай что есть в Yii для этого: http://www.yiiframework.com/doc-2.0/guide-input-forms.html
#252 #418374

>>418322

> https://github.com/sqghub/TestHub/blob/master/config/web.php#L31


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

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

Еще, включи строгий режим в MySQL чтобы она показывала больше ошибок. Для этого надо после соединения сделать SET sql_mode = 'STRICT_ALL_TABLES': http://dev.mysql.com/doc/refman/5.1/en/sql-mode.html#sql-mode-setting

Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:

create_table :products do |t|
t.string :name
t.text :description
t.timestamps null: false
end

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

> $command = $this->db->createCommand("DROP TABLE IF EXISTS `questions`");


Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.

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

> `name` TEXT NOT NULL,


Хватит и VARCHAR, он до 65000 символов вроде поддерживает (но размер одной строки таблицы не может быть больше 65000 байт так что юникодных символов туда влезет меньше, инфа: http://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html ).

> `author` VARCHAR(255),


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

> `text` TEXT,


Название плохое. Что такое «текст»? Предисловие? Содержимое? Послесловие? Правила?

> `time`


> `date`


Название плохое. Время чего? Обычно называют created, added, edited, deleted и тд. Если это ограничение то timeLimit.

Также, ты можешь (то есть требуется так делать) добавлять комментарии когда смысл не очень ясен:

rabbitPerTree INT (10) COMMENT 'Максимальное число зайцев, сидящих под одним деревом'

Эти комментарии сохраняются в БД и отображаются в разных программах для работы с ней.

> `questions` INT(11) UNSIGNED NOT NULL,


> `points` INT(11) UNSIGNED NOT NULL,


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

> Question.php


> QuestionMapper.php


Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать? http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

ActiveRecord — это когда модель сама себя сохраняет и достает из базы. Вот моя паста про мапперы: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

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

Отдельная тема — что делать с разными классами вопросов? Как хранить в БД наследующиеся сущности? Для этого есть 3 паттерна и их надо знать (это могут спросить на собеседовании, к слову):

http://martinfowler.com/eaaCatalog/singleTableInheritance.html
http://martinfowler.com/eaaCatalog/classTableInheritance.html
http://martinfowler.com/eaaCatalog/concreteTableInheritance.html
http://martinfowler.com/eaaCatalog/inheritanceMappers.html

(русский перевод если что есть на http://design-pattern.ru/ )

В Yii реально реализовать STI с полем type, один из анонов это ранее делал, насчет других подходов не знаю, но предупрежу что искать вопросы в 3 таблицах сложнее чем в одной.

> public function getAllTests()


Если у тебя есть сущность Test то логично возвращать массив этих Test, а не «глупый» массив с сырыми данными. Но если ты решишь использовать ActiveRecord. Также, по идее в эти Test должны быть вбиты вопросы. Если ты захочешь это написать, ты скоро увидишь что приходится писать кучу кода для маппинга между сущностями и таблицами. Гораздо умнее в такой ситуации не изобретать велосипед, а использовать библиотеку-маппер вроде Doctrine 2 (или activeRecord).

> https://github.com/sqghub/TestHub/tree/master/tests


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

> TestHub/views/test/createTest.php


Почему twig не используешь, а на PHP пишешь?

> {!{questionNumber}!}


Не очень удачный выбор, печатать тяжело. Я думаю, можно либо шаблон вынести в отдельных файл (чтобы не было конфликта с twig), либо использовать 2 знака процента например или [[ .

https://github.com/sqghub/TestHub/blob/master/views/test/createTest.php#L41 слишком длинная строка

Ну и я бы советовал использовать тут jQuery, если ты с ним знаком. Ну или сделать свои функции, например, var div = create('div', { id: 'xyz' }) вместо ручной возни с DOM методами.

Насчет формы, почитай что есть в Yii для этого: http://www.yiiframework.com/doc-2.0/guide-input-forms.html
#253 #418376
>>418374

Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.

> <label class=""


зачем пустой класс?

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

{% macro question(text) %}
<div>{{text}}</div>
{% endmacro %}

Использование макроса, для вывода существующего вопроса:

{{ question('Кто открыл закон Ньютона?') }}

Для генерации шаблона:

{{ question('%TEXT%') }}
#254 #418377
Пасаны, я хочу освоить PHP и JS. Кто что может сказать за курсы на codeacademy? Годнота или лучше что-то другое взять?
#255 #418378
>>418322

Для вывода списк всех тестов в Yii есть грид:

http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#listview
http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#gridview

(и да, меня напрягает использование use в шаблонах которое они там предлагают. И да, я не знаю, как этот грид вызвать из твига так что будем считать это дополнительной задачей, разобраться с этим).
#256 #418379
>>418377
Я тебе в одеск-треде пояснил, лол.
#257 #418380
А как выкладывать бд на гитхаб?
#258 #418381
>>418380
Никак?
#259 #418382
>>418381
Нахуй он нужен тогда? Получается, Опу или кому угодно придется создавать идентичную БД под мой проект, если он захочет проверить работоспособность?
#260 #418385
>>418365

> Нужно любой из них добавить в локальное хранилище, перезагрузить страницу, и отобразить в DOM (пикрилейтед).


Не очень понимаю, зачем перезагружать страницу

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


Зря. У тебя пока что очень слабые знания JS, а задачи подняли бы его до хорошего. И ведь это видно по коду.

> for (i=0; i<articles.length; i++) {


> if (localStorage.getItem(articles[a]) == articles[a])


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

> <a href = "#"


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

> //Удаляем пустые элементы из массива


Их проще было в него не добавлять

> deleteFromDOM(newDiv.id = "article_1")


Так писать неправильно. Зачем тут менять id у одного из элементов? Из-за замыканий он меняется не у того элемента о котором ты думаешь.

Плюс, ты зачем-то скопипастил большой кусок кода 4 раза. А если надо еще 4 товара добавить, ты еще 4 куска скопипастишь?

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

Для портфолио лучше найди готовый код или плагин.

>>418370

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

>>418377

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

>>418380

В дампе в формате SQL. Сделать дамп в консоли можно командой mysqldump, а в других программах обычно есть кнопка или опция.
#260 #418385
>>418365

> Нужно любой из них добавить в локальное хранилище, перезагрузить страницу, и отобразить в DOM (пикрилейтед).


Не очень понимаю, зачем перезагружать страницу

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


Зря. У тебя пока что очень слабые знания JS, а задачи подняли бы его до хорошего. И ведь это видно по коду.

> for (i=0; i<articles.length; i++) {


> if (localStorage.getItem(articles[a]) == articles[a])


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

> <a href = "#"


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

> //Удаляем пустые элементы из массива


Их проще было в него не добавлять

> deleteFromDOM(newDiv.id = "article_1")


Так писать неправильно. Зачем тут менять id у одного из элементов? Из-за замыканий он меняется не у того элемента о котором ты думаешь.

Плюс, ты зачем-то скопипастил большой кусок кода 4 раза. А если надо еще 4 товара добавить, ты еще 4 куска скопипастишь?

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

Для портфолио лучше найди готовый код или плагин.

>>418370

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

>>418377

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

>>418380

В дампе в формате SQL. Сделать дамп в консоли можно командой mysqldump, а в других программах обычно есть кнопка или опция.
#261 #418386
>>418380

Не выкладывай команды создания БД и юзеров типа

CREATE DATABASE
USE
GRANT

Должны быть только команды создания таблиц, и может быть INSERT для вставки данных.
#262 #418387
>>418322

И еще. Я вижу у тебя там файл bowerrc? Молодец, тогда js библиотеки добавляй через bower

bower — это аналог композера для JS библиотек (на мой взгляд, более слабый кстати). По идее его надо скачивать через npm (и установить Node.js для npm), но там в Yii есть какая-то хрень чтобы это работало за счет композера, без самого bower. Надо разобраться, в общем.

Еще, удали неисплоьзуемые папки и файлы, чтобы не мешались. Потом если что создашь ручками.

По твигу, я нашел ответ тут, как в нем вызывать стандартные классы и функции: http://www.yiiframework.com/doc-2.0/guide-tutorial-template-engines.html#twig

Вот тут про работу с bower-пакетами в Юи: http://www.yiiframework.com/doc-2.0/guide-structure-assets.html#bower-and-npm-assets

Вот тут про то как работает настоящий bower: http://bower.io/
#263 #418388
>>418374

>Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:


В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.

>Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.


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

>Автора пока не надо делать, если пользователей нет.


Это я оставил как просто имя автора.

>Не очень понятен смысл этих полей если их значение легко считается.


Баллы там вообще не нужны, я их хотел в Question добавить, но, видимо, засыпая уже совсем куда попало писал. С числом вопросов - все же считать?

>Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать?


Мне как-то мапперы больше понравились, чем AR. Но в doctrine 2 я лезть пока что побаиваюсь. Попробую смочь в ar.

>Отдельная тема — что делать с разными классами вопросов?


Ну я изначально планировал общие поля, которые в базовом классе есть, хранить полями таблицы, а специфичное для класса, в том числе и сам класс, хранить в json строке. Другой вариант, о котором я думал, это создать таблицу для общих данных и по таблице на каждый специфичный класс. В первой же хранить и имя класса, чтобы знать в какие таблицы ломиться. Я как-то забыл, что все придумано до меня. Почитаю ссылки чуть позже.

>Если у тебя есть сущность Test то логично возвращать массив этих Test


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

>Насчет формы, почитай что есть в Yii для этого


Я еще не читал особо, но думал, что формы там для работы с полученными данными, а не для вывода. Почитаю еще.

>Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.


Пока что буду править старую.

>>418378

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


Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.
#263 #418388
>>418374

>Насчет миграций, я вижу ты down не делал, хорошо, это обычно не требуется. Но в других фреймвокрках, вроде Ruby On Rails, миграции сделаны интереснее. Там ты не пишешь SQL код, а команды вроде таких:


В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.

>Этого в миграции быть не должно. Система миграций никогда не выполнит ее повторно.


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

>Автора пока не надо делать, если пользователей нет.


Это я оставил как просто имя автора.

>Не очень понятен смысл этих полей если их значение легко считается.


Баллы там вообще не нужны, я их хотел в Question добавить, но, видимо, засыпая уже совсем куда попало писал. С числом вопросов - все же считать?

>Ты знаешь что в Yii есть базовый класс для моделей с ActiveRecord? Или ты по каким-то причинам не хочешь его использовать?


Мне как-то мапперы больше понравились, чем AR. Но в doctrine 2 я лезть пока что побаиваюсь. Попробую смочь в ar.

>Отдельная тема — что делать с разными классами вопросов?


Ну я изначально планировал общие поля, которые в базовом классе есть, хранить полями таблицы, а специфичное для класса, в том числе и сам класс, хранить в json строке. Другой вариант, о котором я думал, это создать таблицу для общих данных и по таблице на каждый специфичный класс. В первой же хранить и имя класса, чтобы знать в какие таблицы ломиться. Я как-то забыл, что все придумано до меня. Почитаю ссылки чуть позже.

>Если у тебя есть сущность Test то логично возвращать массив этих Test


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

>Насчет формы, почитай что есть в Yii для этого


Я еще не читал особо, но думал, что формы там для работы с полученными данными, а не для вывода. Почитаю еще.

>Изменения в БД наверно надо будет сделать новой миграцией, либо исправить старую.


Пока что буду править старую.

>>418378

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


Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.
#264 #418389
>>418387

>Считает неверно. Там не 60262 получается, а около 61270. Потому что анон, который только что выплатил 5000 не может заплатить 262 и должен подождать месяц, за который набегут проценты.



А как это провернуть?
#266 #418394
>>418385
Что ж, тогда, пожалуй, берусь за задачи...Спасибо за разъяснение.
#267 #418395
>>418388

> В yii2 тоже есть что-то подобное, но я не захотел этим пользоваться.


Я советую попробовать, чтобы научиться, ну и заодно проверить, заработает ли?

Также, там упоминается возможность завернуть миграцию в транзакцию. В MYSQL DML команды (создание/изменение/удаление таблиц и баз) вызвыают неявный коммит и в транзакцию их положить нельзя (увы).

Кстати, я поймал себя на мысли, что можно было заставить тебя использовать PostgreSQL вместо MySQL, если ты последнюю уже хорошо изучил.

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


Тогда сделай метод down и откатывай миграции нормальными стандартными средствами.

А вообще, лучше писать миграции так чтобы в одной была только одна команда. Тогда, если она не срабоатет, то в БД ничего не изменится и ты можешь исправить ее (если бы в MySQL были транзакции для DML очевидн опроблем бы не было).

Ну и еще, я подумал, править миграции неправльно. Ведь миграция связана с изменениями в коде (в том же коммите в котором ты добавил обращение к новому полю, ты должен сделать миграцию добавляющую это поле). Если ты закоммитил миграцию, то отменить ее можно только новой миграцией.
#268 #418397
>>418388

> С числом вопросов - все же считать?


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

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


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

> Попробую смочь в ar.


Мне доктрина нравится больше, но AR это чуть ли не основа Yii так что ее надо знать, в том числе как строить в ней отношения между сущностями.

> что формы там для работы с полученными данными, а не для вывода.


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

> Я там просто пропускаю сначала через render от Yii, а затем результат отправляю в Twig. Не знаю, насколько это адекватное решение.


Там я где-то дал ссылку, описано как это делать.
#269 #418398
>>418388

А, на случай если ты не знаешь что такое «DML команды», «DDL», ссылка: http://webadequate.ru/rabota-s-bd-mysql/43-grading_sql_commands.html

Это общепринятые термины из SQL (то есть не только к MySQL относятся) и хорошо бы их знать.
#270 #418399
>>418388

Алсо, я хотел сказать «DDL команды взывают неявный коммит», а не DML конечно же.
#271 #418400
>>418389
>>418391

Вот так вывернулся http://ideone.com/CZReIO.
Как сделать, что-бы оно просто месяц еще один отсчитало, и потом всё считало, что осталось?
#272 #418401
>>418400
Разбить формулу на несколько частей, а не считать все сразу до проверки остатка?
#273 #418402
>>418397

>Если надо вывести список тестов + число вопросов не в админке, а на сайте, стоит сделать поле ради скорости.


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

>>418395

>Также, там упоминается возможность завернуть миграцию в транзакцию.


Для этого надо использовать saveUp и saveDown вроде бы, а в них использовать команды, а не sql код.
В общем я дострадаю с формой добавления вопроса и полезу копаться в бд.
#274 #418404
>>418402

> делать 50 запросов для вывода инфорации по 50 тестам - это как-то круто.


Вообще-то можно сделать JOIN + GROUP BY + COUNT и получить число вопросов одним запросом. Это конечно тоже создает нагрузку, но быстрее чем 50 запросов. Может тебе задачки на SQL потом порешать еще стоит?

> Для этого надо использовать saveUp и saveDown вроде бы, а в них использовать команды, а не sql код.


да, но в MySQL это все равно не работает, так что можешь не мучаться.
236 Кб, 1920x1080
#275 #418405
>>418361

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



Пожалуйста: http://ideone.com/rgNOkb, тут сама библиотека не подключается, поэтому ошибка.

Запускаются они в браузере, на пике видно, как это выглядит. Просто пустой html файлик, в нем подключаю библиотеку, свои файлы с кодом, который надо протестировать, и файлы с тестами.
#276 #418406
>>418404

>да, но в MySQL это все равно не работает


Почему?
#277 #418408
>>418405

О, да это же отличные тесты! Ты правильно делаешь, что их пишешь. И отчет симпатичный получается.

Насчет скорости, ты бы мог найти или сделать сниппеты для саблайма, чтобы при вводе например it(tab) он раскрывался в полноценную функцию. Если у тебя таких нет, то гугл выдает первой же ссылкой https://github.com/caiogondim/jasmine-sublime-snippets

Я думаю, на более сложных задачах соотношение будет лучше.

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

>>418406

Потому что DDL команды (вроде CREATE TABLE) делают неявный коммит и тем самым транзакция коммитится на первой же команде (а должна только если все команды выполнились): http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

В MySQL транзакции работают только для DML команд, и то с исключениями. Транзакции работают только с InnoDB таблицами.
#278 #418409
>>418400

Не, давай лучше сделаем как я посоветовал тут:

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

А то код слишком сложный будет.
#279 #418410
>>418401
Считает теперь правильно, но всёравно с костылём.
И хрен знает, как сделать, что-бы считало нормально.
#280 #418411
>>418408
Читаю не глазами, видимо.

>Note: Not all DBMS support transactions. And some DB queries cannot be put into a transaction. In this case, you will have to implement up() and down(), instead. In the case of MySQL, some SQL statements may cause implicit commit.

#281 #418412
>>418409

>- если остаток маленький, выплачиваем сколько осталось и уходим.


Это и так есть.
#282 #418413
>>418412

> if (($credit + $proc + $komis) < $platez) {


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

Ну и посмотри, у тебя формула из $credit + $proc + $komis аж 3 раза скопирована. Нехорошо ведь копипастить. Надо вынести это куда-то в переменную, чтобы повторов не было.
#283 #418414
>>418412

Если дать маленькую сумму вроде 1000, то считает неверно и уходит в минус: http://ideone.com/sujrHy

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

Также, отформатируй свой код на phpformatter.com
#284 #418415
Аноны, на хабре переводят большой цикл статей по JS/DOM/Canvas/Ajax/Node.JS. Он вроде бы неплох. Если ты начинающий то можешь его почитать (наравне с learn.javascript.ru), а я могу подсказать если что-то непонятно и проверить код.

Ссылка: http://habrahabr.ru/post/246331/
#285 #418416
>>418408

>А ты не хочешь выкладывать код тестов куда-нибудь на гитхаб например?



без проблем, потом кину ссылку на репозиторий.

>Насчет скорости, ты бы мог найти или сделать сниппеты для саблайма, чтобы при вводе например it(tab) он раскрывался в полноценную функцию. Если у тебя таких нет, то гугл выдает первой же ссылкой https://github.com/caiogondim/jasmine-sublime-snippets



О, вот это полезно, возьму на вооружение.
Тесты в наборе, кстати, можно запускать, как все вместе, так и по одному. Если хоть один не проходит, весь набор не проходит.
#286 #418417
>>418415
У тебя трипкод отвалился
#287 #418419
>>418413
Это исправил.
>>418414
А как этого избежать? Я не знаю как задать, что остаток маленький.
#288 #418422
>>418416

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

>>418417

Трип код не выводится при отправке из всплывающего окна почему-то, и стирается при очистке кук, я иногда ленюсь его вводить.
#289 #418423
>>418419

Ты команду if знаешь?

Надо проверить что остаток меньше 5000.

Если (долг мень чем максимальная выплата) {
то выплачиваем остаток и уходим;
}
#290 #418425
>>418423
Так я писал это - мне считало неправильно, ведь выплату нельзя делать по-своему. Нужно, чтобы еще один месяц посчитало, и потом выплату делать.
#291 #418427
>>418425

Ты просто в этой строчке

> $credit = ($credit $proc) + $komis - $platez;


Выплачиваешь сразу 5000. А если долг всего 1000, зачем платить 5000? Надо выплатиь сколько осталось. Это неправильно же. Надо эту строчку переделать.
#292 #418436
>>418427
http://ideone.com/CZReIO
Cделал заново.
Правильно ведь?
#293 #418442
Объясните пожалуйста, зачем нужно разделение на фронтенд и бекенд на сервере?
Вот, в yii2 при создании из расширенного шаблона получаются 2 этих модуля. Если считать бекендом в данном случае админку, а фронтендом всё остальное, то не слишком ли жирно админку выделять в отдельную штуку? Ведь можно просто создать какой-нибудь AdminController. Или я что-то не так понял?
#294 #418445
>>418442
Фронтенд это все что выполняется на клиенте, то есть в браузере, бекенд это все что выполняется на сервере. yii написан на php, следовательно это бекенд.
#295 #418447
>>418442

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

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

>>418436

> 1 месяц спустя: долг = -2970 руб, выплачено всего 5000 руб.


> выплачено 2940.9


Я бы не сказал, что правильно. Во-первых, получается 2030, а не 2490, во-вторых попробуй сам перечитать то что твоя программа пишет — тут вообще логики нет. Например зачем выплачивать 5000 когда долг составляет гораздо меньше?
#296 #418448
>>418445

Не, не обязательно, иногда бекендом называют админку. Ну и вообще, если система состоит например из нескольких слоев, то фронтендом и бекендом могут называть их.
#297 #418451
>>418447

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



Я слаб в таких вещах, подстраивал под условия задачи.

>Например зачем выплачивать 5000 когда долг составляет гораздо меньше?


А как это сделать?
#298 #418453
>>418451

> А как это сделать?


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

- прибавляем проценты и комиссию к остатку долга. Не вычитаем 5000 как это сделано у тебя.
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
#299 #418454
>>418453

>- если остаток маленький, выплачиваем сколько осталось и уходим



Я уже три раза не понял этот пункт.
#300 #418455
>>418454
If($creditBalance < $monthlyPayment){
$monthlyPayment = $creditBalance;
}

Что тут непонятного?
#301 #418456
>>418454

Если ты не понял, надо было в первый раз и задавать вопросы.

Ну «уходим» — это очевидно команда break которая завершает цикл и выходит из него.

«выплачиваем сколько осталось» — это значит смотрим чему сейчас равен остаток долга, и уменьшаем остаток долга на это значение. Если осталось 300 — платим 300, если осталось 400 — платим 400 и т.д. Ну и конечно учитываем эту сумму в общей выплате.
#302 #418457
>>418454

А, и не беспокойся, эта задача практически у всех сложность вызывает. Потому что там в примере специально дан неправильный код и почти никто не догадывается его изменить почему-то.
#303 #418458
>>418455

>If($creditBalance < $monthlyPayment)


В такой конструкции оно 11 месяцев считает, а мне 13 надо. 13й - месяц, на котором долг уходит в минус.

>>418456
Я уже пятью способами пришел к одному и тому-же результату. Либо маленькую сумму считает, либо большую. Как объединить-то?
>>418457
Отлично...
#304 #418462
>>418458
Попробуй сначала высчитывать сумму баланса, затем проверять не меньше ли он наших регулярных выплат, и лишь затем вычитать из него выплату.
#305 #418466
>>418462
Но сумма баланса высчитывается каждый месяц и автоматически проверятся же. Блин, я вообще не понимаю, что делать надо.
#306 #418467
>>418466
Да, но она не только высчитывается, с неё сразу же снимается сумма выплаты. А так делать нельзя, ведь мы можем переплатить и долг уйдет в минус. Сначала проверяй остаток, затем плати, вот такой должен быть алгоритм.
#307 #418470
>>418467
А как проверку делать?
Она должна быть в середине выполнения цикла.
#308 #418472
>>418470

>А как проверку делать?


http://php.net/manual/ru/control-structures.if.php
#309 #418473
>>418472
Это в прошлом уроке было. А как проверку запихнуть в середину цикла?
#310 #418474
>>418473
Точнее, в середину его выполнения.
#311 #418475
>>418473
Что значит в середину цикла? Я не понимаю вопроса. Ты можешь куда угодно эту проверку засунуть, тебе никто не запрещает.
3 Кб, 645x62
#312 #418476
>>418475
Попытался засунуть в 13 строку, как условие, при котором будет то, что ниже считаться.
Скрипт вообще ничего не выдал мне.
#313 #418478
>>418476
Извини, но я не вижу на скриншоте ни 13 строку, ни проверку. Скидывай тогда уж весь код на айдеоне, чтобы я мог понять что не так.
#315 #418480
>>418479
У тебя проверка выглядит так:
Если баланс меньше или равно выплатам то мы считаем.
А так как у нас баланс изначально больше, мы вообще ничего не делаем.
14 Кб, 682x214
#316 #418486
>>418480
Теперь ошибка.
#317 #418487
>>418486
Там внизу написано в чем ошибка. Ты с маленькой буквы написал переменную. $creditbalance не равно $creditBalance.
#318 #418488
>>418487
Сменил, считает до 6го месяца, почему-то.
#319 #418489
>>418488

> if ($creditBalance < $paymentTotal)


Что это за условие? Зачем тебе сравнивать кредитный баланс с выплаченной суммой?
#320 #418490
>>418488
>>418489
Опять увидел ошибку, исправил. Программа считает 11 месяцев. Если исправлять - опять выйдет та-самая фигня.
#321 #418491
>>418490
Два условия не нужно. У тебя за один месяц может быть две выплаты: сначала кредит проходит первую проверку и от него отнимается монсли пеймент, затем кредит становится меньше месячной выплаты и когда доходит до второй проверки от него отнимается еще раз уже оставшаяся сумма. Намного проще убрать второй if а в первом просто убрать рассчет баланса (поставить его после проверки). Все, что нам нужно это лишь поменять переменную MonthlyPayment, чтобы она платила не 5к, а столько, сколько нам нужно (то есть то, что ты сделал во втором блоке if).
Сумбурно объяснил, но надеюсь ты понял. Ну если нет, дождись опа, он то уж точно все по полочкам разложит.
#322 #418492
>>418491
А как в одно условие две проверки впихнуть?
#323 #418493
>>418492
>>418491
Ну серьезно, я мало того, что пхп только учу, и дальше второго урока не двигался, так еще и в математике слабый. Я элементарные для вас вещи могу не понять, например.
#324 #418494
>>418491
>>418492
Короче, я все усложнил, лол. У тебя уже есть правильное условие, то которое последнее. Просто поставь второй if На место первого, а первый удаляй к хуям (только расчет баланса вынеси за скобки сначала). Ну и break убери оттуда.
#325 #418495
>>418494
Хотя не, break можно оставить.
#326 #418496
>>418494
http://ideone.com/c8xakQ
Не считает 12й месяц. Если поставить чтобы считало - не будет 13й считать. Если и его сделать - не будет работать на мелкие суммы.
#327 #418497
>>418496
Мы опять вернулись к этому >>418462
Ты уже сделал проверку, а вот расчет баланса и вывод информации о нем не в том месте стоит.
#328 #418498
>>418497
Точнее не расчет баланса, а вычет из него месячной выплаты боже, что со мной, я уже не могу выражать свои мысли
7 Кб, 489x96
#329 #418499
>>418498

19я строка вычитывает из баланса выплату.
#330 #418500
Аноны, можете посоветовать какую-нибудь книгу по ПХП где много реальных примеров, вроде написания блогов, интернет-магазинов и прочего.
#331 #418501
>>418499
В том то и дело, ты вычитаешь из баланса выплату, а потом проверяешь, сколько какой у тебя баланс. Хотя логика должна быть такая:
1.Проверяем сколько осталось.
2. Платим.
У тебя логика такая:
1.Платим
2. Проверяем сколько осталось.
#332 #418504
>>418501
>>418501
Что-то я вообще не понимаю. У меня уже бомбит от всего этого.
#333 #418505
>>418504
Ложись спать тогда, завтра поймешь.
#334 #418506
>>418505
Третий день уже. Серьезно.
#335 #418507
>>418506
Я, конечно, мог бы скинуть тебе решение. Но тебе от этого легче не станет, поверь. Лучше реши всё сам завтра.
#336 #418509
>>418506

> $creditBalance = $servicePayment - ($creditBalance $percent);


Что делает эта строка? Зачем ты из комиссии вычитаешь долг?

По моему, ты запутался. Надо наверно написать код заново.

Давай писать по частям:

- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
someApprentice #337 #418533
>>418373
Мне даже стыдно заливать на гитхаб свой гавнокод. Тут много не моего кода, но то что скопировал - я понял как работает, осталось только это закрепить :3

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

https://github.com/someApprentice/ThumbnailService

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

Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.

> $db = new Database( );


> $replace = $db->newName($name);


Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.

>Ну и конечно «определить расширение файла» — это отдельная задача и она должна быть вынесена в отдельную функцию.


А у меня есть и такая функция :3 У меня просто здесь возникала надобность отделить расширение от имени чтобы точка не заменялась знаком подчеркивания.

Остальные твои замечания исправлю завтра, сейчас уже поздно. И хочу извинится за то что у меня возникают такие ошибки, самому хочется писать красивый няшный код, но не получается. Чувствую себя поганым троичнеком
#338 #418537
Добрался до первой регулярной задачи. В чем моя ошибка, почему данным способом мне не удается заставить игнорировать скобочки, пробелы на протяжении всего номера?
http://ideone.com/x2tnBc
#339 #418588
>>418537

Давай разберем что написано в твоем регулярке, какие номера она ищет?

> "/^8[()-\\s]9115065656$/";



- в начале должна идти цифра 8
- после нее может идти любое количество скобок, минусов, пробелов
- после них должны идти цифры 9115065656, без посторонних символов между ними
- цифра 6 примыкает к концу строки, и после нее ничего идти не должно

По моему, ты что-то напутал. Ты наверно хотел сделать по-другому?

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

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

Руками их проверять по одному не надо. Сделай потом цикл, чтобы он перебирал все эти номера и проверял каждый регуляркой.
#339 #418588
>>418537

Давай разберем что написано в твоем регулярке, какие номера она ищет?

> "/^8[()-\\s]9115065656$/";



- в начале должна идти цифра 8
- после нее может идти любое количество скобок, минусов, пробелов
- после них должны идти цифры 9115065656, без посторонних символов между ними
- цифра 6 примыкает к концу строки, и после нее ничего идти не должно

По моему, ты что-то напутал. Ты наверно хотел сделать по-другому?

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

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

Руками их проверять по одному не надо. Сделай потом цикл, чтобы он перебирал все эти номера и проверял каждый регуляркой.
#340 #418641
>>418588
С помощью [()-\\s] я пытался принимать правильные номера c любым количеством пробелов и т.д., а это не сработало.
#341 #418650
Что-то я запутался в печеньках, у меня уже мозг кипит. Вот я сделал setcookie("studentscookie[name]", $name)
Как мне обратиться к name нему через $_COOKIE? Я уже по разному перепробовал, ничего не работает.
#342 #418651
>>418650

Сделай var_dump($_COOKIE) и посмотри что выведется. Это же обычный массив.
#343 #418655
>>418509

>напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)


Написал.

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



Если большой долг - нужно условие дописать, под первый пункт, ведь так?
А если маленький долг? Написать, "меньше или равно"?

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


А тут я вообще не понимаю. В случае, если сумма кредита выше суммы выплаты - то сумма выплаты будет 5000, что есть ежемесячная выплата.
Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?
#344 #418658
Так, с куками разобрался более менее, теперь другой вопрос. Как мне сделать, чтобы после сабмита формы, при успешной регистрации пользователя редиректило на страницу его профиля?
#345 #418663
>>418655

> Если большой долг - нужно условие дописать, под первый пункт, ведь так?


А если маленький долг? Написать, "меньше или равно"?

Ну суть в том что школьник может заплатить за раз не больше 5000. Потому если долг <= 5000 то он маленький, а если больше то большой. Программа должна каждый месяц писать примерно такое:

Прошел месяц 1, долг = 42000
Долг большой
Прошел месяц 2, долг = 44000
Долг большой
....

> Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?


Да. к примеру это может выглядеть так:

Прошел месяц 1, долг = 42000
Долг большой
Могу заплатить 5000
Прошел месяц 2, долг = 44000
Долг большой
Могу заплатить 5000
....

А если долг маленький то так:

Прошел месяц 1, долг = 2030
Долг маленький
Могу заплатить 2030
Прошел месяц 1, долг = 4030
Долг маленький
Могу заплатить 4030
....

(пока платить не надо, просто написать сколько бы заплатил)
#345 #418663
>>418655

> Если большой долг - нужно условие дописать, под первый пункт, ведь так?


А если маленький долг? Написать, "меньше или равно"?

Ну суть в том что школьник может заплатить за раз не больше 5000. Потому если долг <= 5000 то он маленький, а если больше то большой. Программа должна каждый месяц писать примерно такое:

Прошел месяц 1, долг = 42000
Долг большой
Прошел месяц 2, долг = 44000
Долг большой
....

> Если сумма ниже - заплатить остаток? Тоесть сумма выплаты будет такая-же как оставшийся баланс кредита?


Да. к примеру это может выглядеть так:

Прошел месяц 1, долг = 42000
Долг большой
Могу заплатить 5000
Прошел месяц 2, долг = 44000
Долг большой
Могу заплатить 5000
....

А если долг маленький то так:

Прошел месяц 1, долг = 2030
Долг маленький
Могу заплатить 2030
Прошел месяц 1, долг = 4030
Долг маленький
Могу заплатить 4030
....

(пока платить не надо, просто написать сколько бы заплатил)
#346 #418667
>>418658

header("Location ....");

Погугли про HTTP редирект. Если кратко, то сервер может отдать вместо страницы заголовок с указанием URL и браузер перейдет по нему.

Вот что стоит почитать:

http://portscan.ru/article-protocol-http.html
http://habrahabr.ru/post/215117/
https://ru.wikipedia.org/wiki/HTTP

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

Для редиректа используется код ответа 3xx и заголовок Location c адресом. PHP сам выставит нужный код при передаче этого хзаголовка, потому тебе хватит команды header. Ознакомься с мануалом по ней:

http://php.net/manual/ru/function.header.php

>>418533

Анон, я проверю твой код и все подробно напишу, но попозже, вечером наверно, сейчас некогда.
#347 #418668
>>418663
Это я написал.
А что дальше писать?
#348 #418669
>>418641

Это не сработало потому что твой шаблон выглядит так:

8 (доп. символы) 9115065656

То есть у тебя символы могут находиться только между 8 и 9 а не между любыми цифрами.

Если хочешь, можно пока решить задачку на регулярки попроще:

Дан текст. Определи, есть ли в нем автомобильный номер, и если да, то выведи его. Автомобильный номер имеет вид:

(русская буква) (3 цифры) (2 русских буквы)

Пример текста:

$text = "это не номер ааааа123ррррр а это номер у123уу"

Программа должна вывести:

Номер есть в тексте: у123уу
#349 #418671
>>418668
Заплатил даже за большой долг.
А что с маленьким долгом делать?
#350 #418673
>>418668

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

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

Также, надо добавить условие: если после выплаты долг стал меньше или равен нулю — выходим из цикла и пишем общую сумму выплаченных денег.
#351 #418674
>>418671

Тоже платить, только не 5000,а сколько осталось.

Алсо, покажи код, надо проверить.
#353 #418678
>>418675

> \tif ($creditBalance >= $monthlyPayment) {


> if ($creditBalance <= $monthlyPayment) {


Эти условия не взаимоисключающие. Если долг равен ровно 5000 то сработают оба ифа. Чтобы такого не было, используй else (иначе):

Если (долг >= максимума) {
делаем что-то одно;
} иначе {
делаем что-то другое;
}

В остальном, хорошо пока что.

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

И добавь проверку отдельно после всего этого, что если долг дошел то нуля после выплаты то выходим из цикла.
#354 #418683
>>418678
Вроде-бы написал. Проверь еще раз, позя.
#355 #418691
>>418678
А правда, что переменная, записанная в одном условии не переносится в другое?
А то у меня нестыковочки.
#356 #418693
>>418669
Решение автомобильного номера я помню, его уже проходили в примерах. Проблема ведь остается, решение мне не помогло.
#357 #418694
>>418683

>\tif ($creditBalance >= $monthlyPayment) {


>$creditBalance = ( $creditBalance $percent ) + $servicePayment;



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

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

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

> \techo "На $month месяц. Кредит: $creditBalance. Долг маленький. Могу заплатить $sumToPay Уплачено: $paymentTotal \n";


....

> $paymentTotal = $paymentTotal + $sumToPay;



Почему ты в таком пояркде делаешь? Разве не логично общую суммы уплаченного писать после того как ты ее увеличил, а не до?
#358 #418695
>>418691

Не понял вопрос.

>>418693

Покажи код для начала. Если оно не помогло, придумаем задачу посложнее. Надо идти от простого к сложному.
#359 #418696
>>418691

переменная существует с того момента как ты ее создал командой

$x = ....

и до конца выполнения программы
#360 #418704
>>418694
if (($creditBalance $percent) + $servicePayment) >= $monthlyPayment) {
Вот так нужно?

> \techo "На $month месяц. Кредит: $creditBalance. Долг маленький. Могу заплатить $sumToPay Уплачено: $paymentTotal \n";


....

> $paymentTotal = $paymentTotal + $sumToPay;



Это я >>418509 по этому образцу делал, что-бы видеть, сколько было до уплаты и после уплаты стало.
#361 #418708
>>418704
вот только ошибка какая-то там.
#362 #418714
>>418704

> Вот так нужно?


Нет, неверно.

Надо сделать 2 отдельных действия:

- прибавить проценты
- проверить блоьшой ли долг если да то одно, если нет то другое

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

Именно в таком порядке. Не стоит прибавление процентов внутрь if засовывать.
#363 #418715
>>418714
>>418714
Всё сошлось, и на больших и на маленьких кредитах.

А теперь, если не влом, поясни, что мы сделали-то.
#364 #418717
>>418715
http://ideone.com/p3QTCm вот ссылка, вдруг что.
#365 #418722
>>418695
И я опять застрял. Код выдает а123рр, когда должен выдавать у123уу. Не понял каким образом нужно обходить повторяющиеся буквы вроде аааааа.
http://ideone.com/c7pdEe
#366 #418724
>>418715

Мы сделали решение задачи? А что иименно тебе непонятно, какая-то строчка или все в общем?

Но оно пока не окончательно. Есть одна вещь, которая мне не нравится, а именно почти похожие строчки тут:

$creditBalance = $creditBalance - $monthlyPayment;
$paymentTotal = $paymentTotal + $monthlyPayment;

и тут

$creditBalance = $creditBalance - $sumToPay;
$paymentTotal = $paymentTotal + $sumToPay;

Ну и echo повторяется. Попробуй избавитьяс от повторов.

Также, вместо

a = a + b

можно писать

a += b

Аналогично с вычитанием.
#367 #418725
>>418722

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


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

В регулярках для этого есть простые условия, а также assertions ( http://php.net/manual/ru/regexp.reference.assertions.php ).

Вот простые условия:

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

$ значит что примыкает к концу строки то есть xyz$ значит что xyz должно находиться в самом конце строки

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

Например abc\b найдет "abc" в фразе "abc def" но не найдет в "abcdef" так как тут условие «справа от с должна быть не буква» не выполняется

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

Например abc\B найдет "abc" в строке "abcdef" и не найдет в "abc def" так как тут условие не выполняется.

Также, ест более сложные условия вида «справа/слева должно быть/не должно быть этих символов». Например

abc(?!def)

ищет слово abc справа от которого нет букв def. То есть оно найдет abc в строках "abcxzy", "abcdfe", "abc def" и не найдет в "abcdef"

Подробнее:

http://php.net/manual/ru/regexp.reference.escape.php
http://php.net/manual/ru/regexp.reference.assertions.php

Думаю, одно из этих условий поможет тебе решить задачу.
#367 #418725
>>418722

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


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

В регулярках для этого есть простые условия, а также assertions ( http://php.net/manual/ru/regexp.reference.assertions.php ).

Вот простые условия:

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

$ значит что примыкает к концу строки то есть xyz$ значит что xyz должно находиться в самом конце строки

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

Например abc\b найдет "abc" в фразе "abc def" но не найдет в "abcdef" так как тут условие «справа от с должна быть не буква» не выполняется

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

Например abc\B найдет "abc" в строке "abcdef" и не найдет в "abc def" так как тут условие не выполняется.

Также, ест более сложные условия вида «справа/слева должно быть/не должно быть этих символов». Например

abc(?!def)

ищет слово abc справа от которого нет букв def. То есть оно найдет abc в строках "abcxzy", "abcdfe", "abc def" и не найдет в "abcdef"

Подробнее:

http://php.net/manual/ru/regexp.reference.escape.php
http://php.net/manual/ru/regexp.reference.assertions.php

Думаю, одно из этих условий поможет тебе решить задачу.
Воннаби #368 #418726
Добрый вечер. Уже некоторое время на досуге аутирую в эту "игру" http://www.clickerheroes.com/
Суть её очень проста: покупаешь героев, фармишь мобов, убиваешь боссов. И можно сказать, что у меня возникло сильное желание запилить нечто подобное, и я уже даже знаю что там будет. Но так как я простая воннаби-макака из пхп треда, то понимаю, что с инструментами которыми я сейчас владею, я ничего такого сделать не смогу. Собственно у меня вопрос. Можно ли нечто подобное реализовать на JS? Причем меня абсолютно не интересует крутизна векторного графона и прочих ништяков. Могу хоть палочками и кружочками визуальную часть для начала сделать. А интересует именно сможет ли всё это дело вертеться на скриптовом языке? Как я понимаю JS как и пхп выполняется по мере чтения интерпритатором? Или все начнет дико тупить когда дело дойдет до просчета больших чисел? Не хочется бросаться в изучения флеша например, если можно сделать на том, что в перпективе всё равно собирался изучать. А еще такой вопрос: JS всегда с открытым кодом, и никак нельзя будет защитить свою поделку от чужих глаз? Любой сможет посмотреть мой говномакакинг и поливать меня говном?

Ну и вдруг кого-то заинтересовала подобная фигня, и он хочет совместно запилить клико-дрочильню в браузере?
#369 #418727
>>418722
http://ideone.com/OxC7Uy вот так вот можно попробовать. До этого пытался поставить вначале и в конце регулярки [^а-яА-Я]? но он все равно находил а123рр хотя по логике не должен, ведь перед ним стоят буквы, которые мы исключаем [^]. Что-то я позабыл регулярки.
#370 #418735
>>418726
Обосрался с игры, реально для аутистов. Могу посоветовать пройти задачки ОПа а потом сходить на гитхаб и посмотреть там игровые движки на JS.
#371 #418736
>>418726
Задачку на "кошки-мышки" делал в учебнике ОПа?
#372 #418745
>>418727

> До этого пытался поставить вначале и в конце регулярки [^а-яА-Я]? но он все равно находил а123рр хотя по логике не должен, ведь перед ним стоят буквы, которые мы исключаем [^]. Что-то я позабыл регулярки.



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

Я тебе дал список условий — они могут решить эту задачу.

также, у тебя идет повторение:

[0-9] повторено 3 раза. Избавься от повторов. Для этого пригодится одна из этих коснтрукций: http://php.net/manual/ru/regexp.reference.repetition.php
#373 #418746
>>418745

Ну так у тебя там знак вопроса, то есть после номера не-буква может быть, а может и не быть. Эта проверка ничего не проверяет.
#374 #418749
>>418735
Ну я хотел что-то с большим количеством механик реализовать, что бы суть осталась та же примерно, типа грейдишь героев и они сами дерутся, а ты изредко прожимаешь абилки, но что бы монстры тоже дрались в ответ и был шанс соснуть у них, и пати была не просто набор одинаковых дамагеров, а танк, хиллер и тп.
>>418736
Не дошел еще. Как я понимаю ты клонишь к тому, что мне нужно постичь основы ООП, для реализации подобных вещей? Что бы прописать грамотно всевозможные классы как герои, монстры, боссы и их взаимодействие?
#375 #418750
>>418749

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


Не совсем, хотя и это тоже. Просто у тебя будет представление о том, как писать что-то подобное играм и надо ли оно тебе вообще. Без готового движка писать придется очень дохуя, проще файлообменник запилить.
#376 #418752
>>418727
>>418725
Спасибо, подставил \b с обеих сторон регулярки. Возвращаясь к первой задаче, мне так и не открылась истина, каким образом пробелы отделяются от текста.
>>418745
Исправил.
#377 #418753
>>418752

Код покажи?

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


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

1 000 000
123456
1.000.000
2.000 345

Надо вывести есть ли в строке число и если есть то вывести его без лишних символов, только цифры.
#378 #418755
>>418753
Вот исправленная версия.
http://ideone.com/c7pdEe
#379 #418758
>>418755

Все верно. Давай теперь задачу на числа.
#380 #418768
>>418750
там смысл игры очень прост же? Если бы ты поиграл малость, то ты понял, что все монстры имеют только 2 параметра: хп и бабло, которые не нужно прописывать под каждый левел, а расчитывается по фромуле. Всё так же и с героями. Я бы думаю что смог даже что-то подобное запилить на паскале, на школьных знаниях, вопрос только в том, что там я не смогу реализовать несколько независимых процессов как например "бой" и прокачка героев, да и вообще там нет мышки и всё кастыльно. Плюс начать можно же с очень простой игры, а потому уже допиливая функционал обвешивать её вкусностями и механиками.

>проще файлообменник запилить.


На это у меня не стоит, отношусь к файлообменнику как к тестовому заданию какому-то. А от идей для игры в моей голове у меня аж зуд и дикое желание их воплотить, понимаешь?
#381 #418782
>>418768

Тебе нужен яваскрипт + php или node.js если хочешь сохранять данные на сервере и обеспечить мультиплеер.

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

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

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

Насчет производительности — если не будет сотни тысяч объектов и не будешь пытаться сделать сложный графон то проблем не будет, яваскрипт не такой и медленный.
#382 #418785
>>418782

>Тебе нужен яваскрипт + php или node.js если хочешь сохранять данные на сервере и обеспечить мультиплеер.


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

>У меня есть задачи на яваскрипт, хорошие.


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


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

>Чтобы рисовать игру, можно испльзовать DOM когда объектов немного, а еще лучше освоить канвас.


Не понял ничего отсюда.

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


Графон как я сказал меня устроит из точек и палчек для начала, про производительность скорее интересует не куча объектов на экране / в памяти, а не станет ли все тупить когда хп у мобов дойдут до 999999999999999999999999999999999999, а дамаг у героя станет 45766794534678674345356732423243 и все это будет по многу раз в секунду суммироваться и параллельно будут происходить другие штуки.
#383 #418787
>>418785

> росто аутичная кликалка в браузере


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

Яваскрипт имхо лучше флеша так как флеш умирает — на эппловских устройствах его нет и не будет.

> по многу раз в секунду суммироваться


Ты вряд ли способен с такой скоростью кликать чтобы там «много» получилось.

> хп у мобов дойдут до 999999999999999999999999999999999999


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

> По этой ссылке есть вся нужная ньюфагу инфа для решения


Там есть ссылки на учебники
#384 #418798
>>418724
http://ideone.com/p3QTCm
Слегка исправил.
Насчёт объяснений: интересует, почему мой способ не работал, а этот - работает, хотя, на мой взгляд, они одинаковы? В чём их различие?
#385 #418799
>>418798
НеТ, хотя это пофигу. Больше всего интересует - чего оно именно здесь посчитало 13й месяц, и всё это без костылей сработало?
#386 #418800
>>418799
Я для себя немного понял.
Суть же в том, что считает оно как и считает, ему пофигу.
Но, если сумма кредита больше суммы платежа, именно тогда оно платит ему сумму платежа. А если меньше - то платит ровно остаток.

Только непонятки, таки, с 13м месяцем. Блин, я поспешил, когда старые ЭХО удалял.
#387 #418805
>>418800
Под шумок сделал последнюю задачу из примера.
Можешь и её проверить?
#388 #418807
>>418805
Ой я дурак, вот ссылка:
http://ideone.com/NKyMYA

Надеюсь, правильно условие понял.
60 Кб, 600x449
#389 #418813
Поясните за экранирование переменных, почему я должен писать именно с s, а потом экранировать
#390 #418815
>>418813
И ОТКРЫВАЕШЬ IDEONE.COM
@
И ПРОБУЕШЬ ТАМ ПРИМЕРЫ
@
И ПОНИМАЕШЬ В ЧЕМ РАзНИЦА
#391 #418830
>>418813

> почему я должен писать именно с s


потому что множественное число.
#392 #418840
>>418813
Ты что, сфоткал экран на телефон?
#393 #418841
Что за функция outputVal? Нигде не могу значение найти
#394 #418843
>>418841
Вероятно, она выводит какое-то значение. Где ты ее нашел?
#395 #418844
>>418843
разобрался, спасибо
#396 #418858
http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication
хорошие статьи и мысли по аутентификации.
#397 #418859
>>418813
Если ты захочешь вставить переменную $cat в строку "My $catalog.", то пхп будет искать вместо переменной $cat переменную $catalog, т.к. он не сможет понять где кончается название твоей переменной и продалжается строка.
Чтобы было правильно, придётся написать так "My {$cat}alog.".

http://php.net/manual/ru/language.types.string.php

Официальная доккументация написана очень просто и понятно, попробуй почитать её. http://php.net/manual/ru/
106 Кб, 466x350
#398 #418864
Зачем начинающему изучать в конце 2014 года PHP, когда только на JavaScript (Node.js) можно в несколько строк кода поднять сервер без всяких апачей и нгинксов, найти все необходимые модули на все случаи жизни, подтянуть все зависимости самым передовым пакетным менеджером, получить преимущества от самого большого на текущий момент коммьюнити и т.д.?

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

Какие преимущества может дать мне PHP?
#399 #418866
>>418864

Потому что на JS писать невозможно. Там даже классов нет. Ты наверно ничего сложнее todo не писал.
#400 #418867
>>418864

На PHP тоже можно поднять простой сервер без Апача или нгинкс, тоже есть менеджер зависимостей.
#401 #418884
>>418864
И тут все бросились переписываты тонны php легаси на js, ага
23 Кб, 429x600
#402 #418887
>>418866

> Там даже классов нет.


Прототипы ничем не хуже классов. И в JS хоть и есть всем известные ошибки, но нет многих нелепостей, которые есть в php (пример: http://ideone.com/55xaIa — слишком сложно для меня). Если так повёрнут на классах, есть ES6 (на сервере можно), ну или CoffeeScript, TypeScript и пр. Преимущества будут те же, что и от JS.

> Ты наверно ничего сложнее todo не писал.


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

>>418867
Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?
#403 #418897
Странно, я не могу куки удалить.
setcookie("studentscookie","", time()-3600); поставил, но на странице все равно залогинен.
#404 #418900
>>418859
Добрачую тебе антуанчик
#405 #418914
>>418897
Добавь ключ для studentscookie, это массив у тебя вроде. Хотя лучше бы ты его сериализовал и ебнул куки один раз одной строкой.
#406 #418916
ОП, решаю твои задачки по джаваскрипт, на третьей задачке у меня возник вопрос. Ты пишешь, что

>функция не должна изменять переданный ей массив



и тут как быть? Если это массив простых значений, то всё просто. А что, если нет? В этом случае надо клонировать каждый элемент, и над ним уже производить операции? Если да, то как глубоко надо клонировать? В смысле, каждый из этих объектов может хранить ссылки на другие объекты и таких уровней может быть очень глубоко. Что понимать, под "функция не должна изменять переданный ей массив"?
#407 #418918
>>418916

Функция должна создать и вернуть новый массив.

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


Значит он должен остаться неизменным, также как и объекты на которые ссылается. Их клонировать не надо, просто надо создать новый массив, ссылающийся на те же самые объекты.
#408 #418925
>>418918

>Функция должна создать и вернуть новый массив



в этом нет сомненья, а вот это

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



Аа, то есть если после вызова map(fn, arr) изменятся объекты внутри arr, то сам массив как бы неизменился?
#409 #418932
http://ideone.com/eKxTI1 Сделал сортировку по полям таблицы (извиняюсь заранее за айдеон, свой репозиторий я пока еще не создал). Как сделать, чтобы при повторном нажатии на поле происходила сортировка в обратном порядке?
#410 #418933
>>418925

Массив это лишь набор ссылок на объекты. Если сами объекты поменялись кем-то другим то это не наша проблема.
#411 #418934
>>418932

Добавить условие «если сейчас вклбчена сортировка по жтому полю то выводим ссылку на обратную сортировку»

И не пиши html внутри echo. Читай про шаблоны http://www.phpinfo.su/articles/practice/shablony_v_php.html
#412 #418936
>>418933
а если они поменялись как раз той функцией, которую мы передали?
#413 #418940
>>418807
Бамп.
#414 #418946
>>418936
окей, не будем дальше тянуть кота за яйца.
function map(fn, arr) {
\tvar res = [];
\tfor (var i=0; i<arr.length; i++) {
\t\tres = fn(arr);
\t}
\treturn res;
}

Правильно?
#416 #418950
>>418753
Почему такой вариант исключения [^.] не работает? Число нужно вывести без пробелов?
http://ideone.com/xaRkTs
#417 #418982
>>418500

Увы, нет. Я не знаю такой книги. Но знаю цикл уроков где например учат как сделать сайт на Симфони 2: http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html

Но чтобы понять этот цикл уроков, надо иметь хороший начальный уровень: нужно знать PHP, ООП, MVC, HTML/CSS, базы данных.

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

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

>>418533

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

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

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

> spl_autoload_register(function ($className) {


> if(file_exists('Classes/' . $className . '.php')) {


Не надо так делать. Копипаста — зло, она раздувает код, затрудняет его понимание и поддержку. Надо соблюдать принцип «DRY» = Don't Repeat Yourself = Не повторяйся.

Потому почитай статью где упоминается этот принцип http://habrahabr.ru/post/144611/ и попробуй придумать, как сделать чтобы повторяющегося кода у тебя не было. Если не сможешь догадаться, попроси подсказку. Ну и больше не копипасти.

> Т.е принцип его работы я понял, а чем отличается от процедурного способа не очень. Я бы мог сделать тоже самое процедурно.


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

Насчет ООП, он появился как решение проблемы «как не запутаться в огромной программе». Чтобы не запутаться, программа раскладывается на отдельные компоненты — классы, каждый из которых выполняет свою роль. Конечно, так это трудно понять и я попробую на примере твой программы объяснить как тут можно сделать эти компоненты.

> Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.


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

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


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

-----

Теперь давай по коду пройдемся.

> if (Upload::extension($_FILES, $extension, $extensions)) {


> public function extension($files, $extension, $extensions) {


Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:

$upload = new Upload( );
$upload->extension(...);

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

> if (


> ($files["file"]["type"] == "image/jpeg")


> || ($files["file"]["type"] == "image/jpg")


> || ($files["file"]["type"] == "image/pjpeg")


Это некрасивая копипаста. Тут можно написать короче за счет функции in_array.

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

Название функции extension надо поменять. Название должно выглядеть как сделайЧтоТо() то есть начинаться с глагола. Придумай нормальное название.

Вот тут https://github.com/someApprentice/ThumbnailService/blob/master/upload.php#L12 у тебя пример плохого if-монстра. Неправильно, когда почти весь файл занимает один огромный if. Надо перевернуть этот if так, чтобы код был не в нем, а после или перед ним.

Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
#417 #418982
>>418500

Увы, нет. Я не знаю такой книги. Но знаю цикл уроков где например учат как сделать сайт на Симфони 2: http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html

Но чтобы понять этот цикл уроков, надо иметь хороший начальный уровень: нужно знать PHP, ООП, MVC, HTML/CSS, базы данных.

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

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

>>418533

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

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

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

> spl_autoload_register(function ($className) {


> if(file_exists('Classes/' . $className . '.php')) {


Не надо так делать. Копипаста — зло, она раздувает код, затрудняет его понимание и поддержку. Надо соблюдать принцип «DRY» = Don't Repeat Yourself = Не повторяйся.

Потому почитай статью где упоминается этот принцип http://habrahabr.ru/post/144611/ и попробуй придумать, как сделать чтобы повторяющегося кода у тебя не было. Если не сможешь догадаться, попроси подсказку. Ну и больше не копипасти.

> Т.е принцип его работы я понял, а чем отличается от процедурного способа не очень. Я бы мог сделать тоже самое процедурно.


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

Насчет ООП, он появился как решение проблемы «как не запутаться в огромной программе». Чтобы не запутаться, программа раскладывается на отдельные компоненты — классы, каждый из которых выполняет свою роль. Конечно, так это трудно понять и я попробую на примере твой программы объяснить как тут можно сделать эти компоненты.

> Было бы тебе проще если бы, я комментировал код? Раньше не разу не делал, но думаю делать это полезно.


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

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


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

-----

Теперь давай по коду пройдемся.

> if (Upload::extension($_FILES, $extension, $extensions)) {


> public function extension($files, $extension, $extensions) {


Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:

$upload = new Upload( );
$upload->extension(...);

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

> if (


> ($files["file"]["type"] == "image/jpeg")


> || ($files["file"]["type"] == "image/jpg")


> || ($files["file"]["type"] == "image/pjpeg")


Это некрасивая копипаста. Тут можно написать короче за счет функции in_array.

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

Название функции extension надо поменять. Название должно выглядеть как сделайЧтоТо() то есть начинаться с глагола. Придумай нормальное название.

Вот тут https://github.com/someApprentice/ThumbnailService/blob/master/upload.php#L12 у тебя пример плохого if-монстра. Неправильно, когда почти весь файл занимает один огромный if. Надо перевернуть этот if так, чтобы код был не в нем, а после или перед ним.

Если у тебя есть код

if (условие) {
50 строк
} else {
2 строки
}

То его надо попробовать перевернуть, чтобы было

if (не выполняется условие) {
2 строки
} else {
50 строк
}

А еще лучше

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

Придумай способ или попроси подсказку, как избавиться от гигантских ифов.
SomeAprentice #418 #418985
>>418533

>> $db = new Database( );


>> $replace = $db->newName($name);


> Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.


А что нелогичного? Мы создали объект для работы с базой данных, а потом воспользовались им по назначению. Разве что в программах обычно не пишут new везде, а получают объект из какой-нибудь функции:

$db = $app->getDb( );
$db->doSomething( );

> Чувствую себя поганым троичнеком


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

Вернемся к коду.

> public function test($name) {


Функции для тестирования не надо засовывать в основной код. Сделай папочку test и туда клади код для проверки.

Кстати, я вижу, ты проверяешь правильно ли работает код вручную, запуская и глядя на результат. А вообще, существует еще автоматизированное тестирование, когда ты пишешь что код получает и что он должен выдать, а программа проверяет соответствует код требованиям или нет. Вот у меня огромный (правда сложный) урок на тему: https://gist.github.com/codedokode/a455bde7d0748c0a351a

Тут https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 аж 3 вложенных ифа. Избавься от вложенности. Чтобы была не лапша вида

Если (условие выполняется) {
Если (услвие выполняется) {
Если (выполняется) {
сделать что-то;
}
}
}

А было примерно так:

Если (не выполняется) {
то выходим;
}

Если (не выполняется) {
то выходим;
}

делаем что-то;

--------------------

> $temp = explode(".", $_FILES["file"]["name"]);


> $extension = end($temp);


Это надо вынести в отдельную функцию. Вот смотри, твой пример читается так:

> Разбить имя файла по точкам на массив из нескольких кусков;


> Взять последний кусок;



А c функцией читается так:

> Взять расширение файла;



Согласись, лучше и понятнее?

> echo "Invalid file";


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

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

------------

$values = значения по умолчанию (пустые);
$errors = пустой массив;

Если (форма отправлена через POST) {
Читаем значения полей в $values;

Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}

Кладем ошибки в $errors;
}

Выводим форму($values, $errors);

-------------
SomeAprentice #418 #418985
>>418533

>> $db = new Database( );


>> $replace = $db->newName($name);


> Так же не красиво писать... Ладно, понимаю что не в красоте дело, но может быть есть какие-нибудь другие лаконичные способы вызвать отдельно метод? Совсем ни черта не понимаю это ООП.


А что нелогичного? Мы создали объект для работы с базой данных, а потом воспользовались им по назначению. Разве что в программах обычно не пишут new везде, а получают объект из какой-нибудь функции:

$db = $app->getDb( );
$db->doSomething( );

> Чувствую себя поганым троичнеком


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

Вернемся к коду.

> public function test($name) {


Функции для тестирования не надо засовывать в основной код. Сделай папочку test и туда клади код для проверки.

Кстати, я вижу, ты проверяешь правильно ли работает код вручную, запуская и глядя на результат. А вообще, существует еще автоматизированное тестирование, когда ты пишешь что код получает и что он должен выдать, а программа проверяет соответствует код требованиям или нет. Вот у меня огромный (правда сложный) урок на тему: https://gist.github.com/codedokode/a455bde7d0748c0a351a

Тут https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 аж 3 вложенных ифа. Избавься от вложенности. Чтобы была не лапша вида

Если (условие выполняется) {
Если (услвие выполняется) {
Если (выполняется) {
сделать что-то;
}
}
}

А было примерно так:

Если (не выполняется) {
то выходим;
}

Если (не выполняется) {
то выходим;
}

делаем что-то;

--------------------

> $temp = explode(".", $_FILES["file"]["name"]);


> $extension = end($temp);


Это надо вынести в отдельную функцию. Вот смотри, твой пример читается так:

> Разбить имя файла по точкам на массив из нескольких кусков;


> Взять последний кусок;



А c функцией читается так:

> Взять расширение файла;



Согласись, лучше и понятнее?

> echo "Invalid file";


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

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

------------

$values = значения по умолчанию (пустые);
$errors = пустой массив;

Если (форма отправлена через POST) {
Читаем значения полей в $values;

Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}

Кладем ошибки в $errors;
}

Выводим форму($values, $errors);

-------------
#419 #419006
ОП и аноны, пытаюсь научиться писать парсеры, но не могу придумать нормальное задание, кроме как вывода всех ссылок сайта. Может кому не сложно можете дать какое-нибудь задание на написание парсера?
#420 #419008
>>418946
вместо res = fn(arr)

res = fn(arr);

Правильно, ОП?
#421 #419010
>>418371
http://ideone.com/AsBa3T
Не пойму как битый тег искать, парсер находит открывающую скобку < дальше идут символы, дальше он находит ещё один тег <> и последний символ > считает как закрывающий тег в этом теге, и не расценивает его как часть следующего
#422 #419015


>>418533

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

> $ru = "А а Б б В в Г г Д д Е е Ё ё Ж ж З з И и Й й К к Л л М


> $eng = "A a B b V v G g D d E e Yo yo Zh zh Z z I i Y y K k L


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

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

Чтобы писать в ООП-стиле, надо делать именно классы и создавать объекты. Прежде чем писать классы, надо ответить на такие вопросы:

- какие сущности есть в программе? Ну у нас может быть например ЗагрузчикФайлов, УменьшательКартинок, и может быть можно картинку представить в виде объекта (а можно и не представлять).
- какие у них есть свойства? Ну у загрузчика свойством может быть например название папки куда складывать картинки, разрешенные расширения, разрешенный размер. А можно не делать их свойствами, а просто жестко прописать к коде. Но со свойствами гибче получается
- что мы хотим от объектов получить? какую задачу решить (и соответственно какие методы нам нужны)? Ну например ЗагрузчикФайлов должен уметь загружать файлы, а УменьшательКартинок — умеьшать картинки.

Вот примеры библиотек для работы с картинками в ООП-стиле:

http://phpimagemagician.jarrodoberto.com/
http://image.intervention.io/

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

> $connect = Connect::getPdo( );

Мы не можем никак в этот класс передать другой объект БД. Лучше передавать PDO через конструктор:

$database = new Database($pdo);
$database->addImage(...);

Вот урок на эту тему (может быть сложным для начинающего): https://gist.github.com/codedokode/e1d31a31b37d5f635057

А вот про работу с БД в ООП-стиле: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

https://github.com/someApprentice/ThumbnailService/blob/master/Classes/Database.php#L14 — это что-то сложное, надо упростить и вынести в функции.

В общем, давай пока с этими ошибками разберемся, а я пока подумаю над задачей на ООП.

>>418798

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


Не очень понимаю, какой «твой» способ?

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

> $creditBalance -= $monthlyPayment;


> $creditBalance -= $sumToPay;



Эти 2 строчки делают одно и то же и значит можно их вынести из ифа и вместо них написать одну строчку.

Ну и дальше, if можно будет заменить на min или max.
#422 #419015


>>418533

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

> $ru = "А а Б б В в Г г Д д Е е Ё ё Ж ж З з И и Й й К к Л л М


> $eng = "A a B b V v G g D d E e Yo yo Zh zh Z z I i Y y K k L


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

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

Чтобы писать в ООП-стиле, надо делать именно классы и создавать объекты. Прежде чем писать классы, надо ответить на такие вопросы:

- какие сущности есть в программе? Ну у нас может быть например ЗагрузчикФайлов, УменьшательКартинок, и может быть можно картинку представить в виде объекта (а можно и не представлять).
- какие у них есть свойства? Ну у загрузчика свойством может быть например название папки куда складывать картинки, разрешенные расширения, разрешенный размер. А можно не делать их свойствами, а просто жестко прописать к коде. Но со свойствами гибче получается
- что мы хотим от объектов получить? какую задачу решить (и соответственно какие методы нам нужны)? Ну например ЗагрузчикФайлов должен уметь загружать файлы, а УменьшательКартинок — умеьшать картинки.

Вот примеры библиотек для работы с картинками в ООП-стиле:

http://phpimagemagician.jarrodoberto.com/
http://image.intervention.io/

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

> $connect = Connect::getPdo( );

Мы не можем никак в этот класс передать другой объект БД. Лучше передавать PDO через конструктор:

$database = new Database($pdo);
$database->addImage(...);

Вот урок на эту тему (может быть сложным для начинающего): https://gist.github.com/codedokode/e1d31a31b37d5f635057

А вот про работу с БД в ООП-стиле: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

https://github.com/someApprentice/ThumbnailService/blob/master/Classes/Database.php#L14 — это что-то сложное, надо упростить и вынести в функции.

В общем, давай пока с этими ошибками разберемся, а я пока подумаю над задачей на ООП.

>>418798

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


Не очень понимаю, какой «твой» способ?

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

> $creditBalance -= $monthlyPayment;


> $creditBalance -= $sumToPay;



Эти 2 строчки делают одно и то же и значит можно их вынести из ифа и вместо них написать одну строчку.

Ну и дальше, if можно будет заменить на min или max.
#423 #419017
>>418807

Задача про миллион — сделана верно. Ну, она и проще чем кредит.

>>418813

Чтобы отделить имя переменной от окружающего текста

>>418858

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

>>418864

> Какие преимущества может дать мне PHP?


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

> найти все необходимые модули на все случаи жизни,


И они будут кривые, тормозящие, неподдерживаемые и т.д. в то время как в PHP расширения пишутся на Си.

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


В продакшене ты все равно спереди нгинкс поставишь

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


Только если ты используешь специально заточенный под это фреймворк. Валидация же это не только проверка что x > 2, там и в базу может понадобиться залезть.

В общем, я не столько нахвативаю PHP сколько хочу сказать что JS выглядит очень несерьезно для больших приложений. Нода хорошо подходит для написания небольших асинхронных демонов на вебсокете, это у нее получается лучше всего. Но серверные приложения на ней мне кажется можно писать только из фанатизма. Не нравится PHP — возьми Питон, Руби, Яву, Моно — все лучше будет.

Ну и как аноны замечают, на PHP есть куча проектов, Симфони, Вордпресс, разные CMS для интернет-магазинов и блогов. Всего этого на ноде нет.

Ну и еще, у вас в JS средства сборки — это насмешка над нормальными средствами сборки. grunt и gulp выглядят как наспех слепленные поделки: они даже конфиг не осилили сделать, и надо писать код (аналогичные вещи - код вместо конфига — я пока видел только в JS и ruby, видимо там много альтернативно одаренных разработчиков). Соответственно никакими автоматизированными средствами например с их конфигами работать нельзя.
#423 #419017
>>418807

Задача про миллион — сделана верно. Ну, она и проще чем кредит.

>>418813

Чтобы отделить имя переменной от окружающего текста

>>418858

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

>>418864

> Какие преимущества может дать мне PHP?


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

> найти все необходимые модули на все случаи жизни,


И они будут кривые, тормозящие, неподдерживаемые и т.д. в то время как в PHP расширения пишутся на Си.

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


В продакшене ты все равно спереди нгинкс поставишь

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


Только если ты используешь специально заточенный под это фреймворк. Валидация же это не только проверка что x > 2, там и в базу может понадобиться залезть.

В общем, я не столько нахвативаю PHP сколько хочу сказать что JS выглядит очень несерьезно для больших приложений. Нода хорошо подходит для написания небольших асинхронных демонов на вебсокете, это у нее получается лучше всего. Но серверные приложения на ней мне кажется можно писать только из фанатизма. Не нравится PHP — возьми Питон, Руби, Яву, Моно — все лучше будет.

Ну и как аноны замечают, на PHP есть куча проектов, Симфони, Вордпресс, разные CMS для интернет-магазинов и блогов. Всего этого на ноде нет.

Ну и еще, у вас в JS средства сборки — это насмешка над нормальными средствами сборки. grunt и gulp выглядят как наспех слепленные поделки: они даже конфиг не осилили сделать, и надо писать код (аналогичные вещи - код вместо конфига — я пока видел только в JS и ruby, видимо там много альтернативно одаренных разработчиков). Соответственно никакими автоматизированными средствами например с их конфигами работать нельзя.
#424 #419018

>>418887

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


Хуже ибо выглядят как костыли

> пример: http://ideone.com/55xaIa — слишком сложно для меня


Ни разу не видел такой код на практике. Он только в учебнике и в вопросах к собеседованию используется. И сложного там ничего нет − оператор инкремента, примененный к строке, увеличивает цифры и буквы на одну по моему, то есть "aa"++ дает "ab". Это в мануале описано.

Ну а говоря про JS там еще хуже:

var data = { hello: 'world' };
data.helo; // ошибка в написании молча игнорируется
data.x = 1 + data.helo; // исключения здесь выброшено не будет, оно будет намного позже когда ты попытаешься поспользоваться данными. В большой программе это может быть очень далеко от места где реальная причина ошибки (я сталкивался)

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

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


Ну хорошо, пиши.

> Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?


Ничего такого нет. Если алгоритм можно реализовать на JS, то можно и на PHP, и наоборот.

>>418897

Может надо удалять student[name] или что там у тебя?

>>418948

Да, верно, хотя мне больше нравится res.push( ) писать.

>>418950

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

> Число нужно вывести без пробелов?


Да. Ты можешь удалить их дополнительными командами.
#424 #419018

>>418887

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


Хуже ибо выглядят как костыли

> пример: http://ideone.com/55xaIa — слишком сложно для меня


Ни разу не видел такой код на практике. Он только в учебнике и в вопросах к собеседованию используется. И сложного там ничего нет − оператор инкремента, примененный к строке, увеличивает цифры и буквы на одну по моему, то есть "aa"++ дает "ab". Это в мануале описано.

Ну а говоря про JS там еще хуже:

var data = { hello: 'world' };
data.helo; // ошибка в написании молча игнорируется
data.x = 1 + data.helo; // исключения здесь выброшено не будет, оно будет намного позже когда ты попытаешься поспользоваться данными. В большой программе это может быть очень далеко от места где реальная причина ошибки (я сталкивался)

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

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


Ну хорошо, пиши.

> Это хорошо, что уже можно, но я интересовался, что может мне дать PHP, чего нет в экосистеме JavaScript. Или всё сводится к языковым предпочтениям?


Ничего такого нет. Если алгоритм можно реализовать на JS, то можно и на PHP, и наоборот.

>>418897

Может надо удалять student[name] или что там у тебя?

>>418948

Да, верно, хотя мне больше нравится res.push( ) писать.

>>418950

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

> Число нужно вывести без пробелов?


Да. Ты можешь удалить их дополнительными командами.
#425 #419020
>>419006

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


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

http://www.nyaa.se/

Распарсь список торрентов в массив объектов. Решать надо с исопльзованием DOM или аналогичного парсера, код должен быть краток и минималистичен, легко исправляться при изменениях в верстке.
#426 #419022
>>419008

мне нравится res.push(...);

>>419010

> парсер находит открывающую скобку < дальше идут символы, дальше он находит ещё один тег


Надо не разрешать < внутри тега. Тег выглядит (в нашем варианте) как

< (не <>) >

http://ideone.com/oGpJvq — теги между 2 комментариями не распознаются. Тег внутри многострочного комментария распознается.

Почитай

http://php.net/manual/ru/regexp.reference.repetition.php про жадность
http://php.net/manual/ru/reference.pcre.pattern.modifiers.php про PCRE_DOTALL
#427 #419023
>>419006

Задача 2: скачать все картинки крупнее 50×50 в папку.
#428 #419040
Это опять >>418807 - кун.
Делаю вторую задачу по массивам.
Хочу уточнить, это мне нужно в середине массива сделать цикл, который будет отбирать учеников, что выше анона и за каждовать плюсовать $number?
#429 #419041
>>419040
Тьфу, что-то мудрил, а оказалось так просто.
#430 #419045
>>419041
А тут кто-то есть?

Я делаю 4ю задачу с генератором имён. Спросить хочу:
$random = mt_rand(1, count($letters));
Эта строка делает число от 1 до кол-ва пунктов в массиве, или же от одного, до определённого пункта массива, который сама и рандомит? пока писал, понял очевидность ответа, но хочется уточнить.
#431 #419046
>>419045
count возвращает число, соответственно и рандом будет работать как с числом.
26 Кб, 632x580
#432 #419049
Зачем нужна эта переменная?
#433 #419050
>>419049
Точнее, ясно, что нужна. А зачем её записали именно там?
Я её удалял - и ничего не произошло.
#434 #419052
>>419050

>я её удалял - и ничего не произошло


Уверен? Notice undefined variable не появилось внизу?
#435 #419053
>>419052
Ничего не появилось.
Правда, я два массива писал. На рандомные буквы и окончание. Сейчас над вторым работаю. Может по завершению всплывёт.
#436 #419054
>>419053
http://ideone.com/iLIKFl
А что здесь не так сделано, что рандом по второму арраю срабатывает через раз?
#437 #419055
>>419054
Понял, теперь что.
Переменную с первой поставил во вторую, вот оно и считает несуществующие пунты второго аррая.
#438 #419056
>>419054

>PHP Notice: Undefined variable: name in


Ну я же говорил.

>PHP Notice: Undefined offset: 5


Неопределенный индекс 5, у тебя в первом массиве идет 4, а затем сразу 6. Если у тебя не асоциативный массив, индексы не обязательно прописывать, можно записывать только значения, а индексы автоматически расставятся. ,
#439 #419057
>>419056

>>PHP Notice: Undefined variable: name in


Но ведь она назначается уже внутри цикла. Без него она не нужна.

>PHP Notice: Undefined offset: 5


Виноват, лол. Копипастил числа - пропустил пятерку.

А еще вопрос - как сделать первую букву большой?
#440 #419059
>>419057

>А еще вопрос - как сделать первую букву большой?


Есть специальная функция, но с многобайтными кодировками (то бишь с кириллицей) она не работает.
http://php.net/manual/ru/function.ucfirst.php
Там в комментах ниже люди пишут свою реализацию этой функции для многобайтных кодировок, с помощью

http://php.net/manual/ru/function.mb-substr.php в сочетании с http://php.net/manual/ru/function.mb-strtoupper.php

можешь подглядеть и так-же сделать.
someApprentice #441 #419072
>>418985

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


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

>Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:



>$upload = new Upload( );


>$upload->extension(...);



>Я думаю, ты просто забыл слово static вписать.


А как будет правильнее: добавить слово static или переписать вызовы методов?

>Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?


Нет, не выводит. Я вроде сам отключил это. Точно не могу вспомнить.

>Придумай способ или попроси подсказку, как избавиться от гигантских ифов.


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

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

>А что нелогичного?


Лаконично же! Т_Т

Какие-то зачатки понимания ООП в голове начинают появляться. Давай я сначала исправлю твои замечания по коду, а потом попробую что-нибудь сделать с ООП
someApprentice #441 #419072
>>418985

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


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

>Это ошибка. Через двоеточие можно обращаться только к статическим функциям и свойствам. У тебя нет слова static в определении и такую функцию можно вызывать только на объекте:



>$upload = new Upload( );


>$upload->extension(...);



>Я думаю, ты просто забыл слово static вписать.


А как будет правильнее: добавить слово static или переписать вызовы методов?

>Кстати, PHP в таких случаях выводит предупреждение — ты его видел или у тебя отключен вывод предупреждений?


Нет, не выводит. Я вроде сам отключил это. Точно не могу вспомнить.

>Придумай способ или попроси подсказку, как избавиться от гигантских ифов.


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

if (не выполняется условие) {
2 строки;
return;
}

50 строк;

>А что нелогичного?


Лаконично же! Т_Т

Какие-то зачатки понимания ООП в голове начинают появляться. Давай я сначала исправлю твои замечания по коду, а потом попробую что-нибудь сделать с ООП
#442 #419095
>>416970
ОП, какие планы на праздники? Треды будут жить или будет перерыв?
#444 #419158
>>416970
Это тот новенький анон, который уже заебал здесь всех.
Накидайте задачек по массивам, что-бы укрепить знания.
396 Кб, 1920x1080
#445 #419184
ОП, я как и обещал создал репу для тестов твоих задачек по джваскрипту. Алсо, ты был прав, их можно запускать из консоли (пикрелейтед). В связи с этим у меня появилась смелая идея, с реализицей которой я скорей обосрался бы, возьмись я за неё. Если тесты можно запускать из консоли, то можно сделать небольшой интерактивный курс из этих задачек, где анон сабмитил вы свои решения в формочку, они бы тестировались, и возвращался бы ответ (правильно решено или нет).
Пока написал тесты к первым 4 задачкам, посмотри, скажи, что думаешь.
#447 #419209
>>419184

Я тут на секунду забежал в тред. Вот ты пишешь

expect(prototype.что то там).shouldEqual('[Function function]')

у тебя не возникало желания заменить эту нечитаемую портянку на

expect(x).toBeFunction() ?
#448 #419211
>>416970
Суп, /pr/.
У меня тут ебанутая идея - создать обычный форум. Что почитать, с чего начать?
#449 #419212
>>419184

А в остальном ты конечно молодец, что делаешь эти тесты, я думаю ты хорошо сможешь осилить не только простые задачки, но и написание приложений на клиенте, надеюсь я все же успею придумать хорошую задачку на эту тему.
#450 #419213
>>419211

Ты хочешь с нуля создать или готовый форум годится?

Во втором случае тебе надо лишь скачать, установить его на локалхост себе или на хостинг и настроить.
#451 #419218
>>419213
С нуля. Про локалхост я уже догадался, зопелил себе сервер на пеке, а вот что дальше делать?
#452 #419223
>>419218

Что из этого ты знаешь?

- HTML/CSS
- PHP
- ООП в PHP
- SQL и базы данных
- какой-нибудь фреймворк вроде Slim, Yii, Symfony 2

Если ты хочешь сделать форум, то тебе надо знать все это хотя бы на четверку.
#453 #419224
>>419223

Если ты чего-то не знаешь, я могу дать ссылочки и задачки для проверки знаний.
#454 #419227
>>419224
Если не лень, то можешь скинуть ссылки по всем пунктикам?
Всё, что ниже ООП в PHP мне неизвестно вообще.
#455 #419240
>>419227

У меня есть задачи на HTML/CSS, в них есть ссылки на самоучитель: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

По PHP я могу посоветовать свой сайт с уроками (в ОП-посте), сайт phptherightway, 2 книги которые указаны в Оп-посте.

По ООП, есть урок на моем сайте, и ООП описан в упомынутых выше 2 книгах (Зандстра и Шлосснейгл).

По SQL, есть задачки и ссылки тут: https://gist.github.com/codedokode/10539213

Там есть ссылка на эту статью: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html — это цикл из 3 статей, их надо прочесть обязательно, а потом можно еще учебник Пирамидина почитать.

По фреймворкам:

- по Slim есть докуменатция на англ. языке на его сайте: http://docs.slimframework.com/
- По Yii есть документация на русском и английском, официальный сайт

http://www.yiiframework.com/

русский частичный перевод yii 2 https://github.com/yiisoft/yii2/tree/master/docs/guide-ru

русская дока по yii 1 есть на оф. сайте

- По Симфони 2 есть много учебников вроде такого http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html

Если тебе там что-то непонятно, можешь задавать вопрсоы. Также. если ты решаешь задачки, советую постить решения в тред для проверки и получения полезных советов.
#455 #419240
>>419227

У меня есть задачи на HTML/CSS, в них есть ссылки на самоучитель: https://gist.github.com/codedokode/58ebc90bd006baf4b35c

По PHP я могу посоветовать свой сайт с уроками (в ОП-посте), сайт phptherightway, 2 книги которые указаны в Оп-посте.

По ООП, есть урок на моем сайте, и ООП описан в упомынутых выше 2 книгах (Зандстра и Шлосснейгл).

По SQL, есть задачки и ссылки тут: https://gist.github.com/codedokode/10539213

Там есть ссылка на эту статью: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html — это цикл из 3 статей, их надо прочесть обязательно, а потом можно еще учебник Пирамидина почитать.

По фреймворкам:

- по Slim есть докуменатция на англ. языке на его сайте: http://docs.slimframework.com/
- По Yii есть документация на русском и английском, официальный сайт

http://www.yiiframework.com/

русский частичный перевод yii 2 https://github.com/yiisoft/yii2/tree/master/docs/guide-ru

русская дока по yii 1 есть на оф. сайте

- По Симфони 2 есть много учебников вроде такого http://symfony.in.ua/creating-blog-symfony2-symblog-tutorial.html

Если тебе там что-то непонятно, можешь задавать вопрсоы. Также. если ты решаешь задачки, советую постить решения в тред для проверки и получения полезных советов.
#456 #419249
Пост про некоторые хитрые особенности хромовского отладчика: http://habrahabr.ru/company/2gis/blog/246557/

Почитайте, кто JS/DOM изучает, может пригодится.
#457 #419259
>>419240
Спасибо, няша! Буду отписываться тут в течение выполнения моей "миссии".
#458 #419263
Сделал задачу из "строк" со стишком.
Я правильно, хоть, сделал?
http://ideone.com/yE41CF
#459 #419287
>>419263
Делаю палиндром. Убрал пробелы, уменьшил все буквы...дальше полный ступор.
#460 #419289
>>419049

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

>>419050

> Я её удалял - и ничего не произошло.


Если ее удалить то эта команда вызовет ошибку:

$name = $name . $randomText;

Так как при вычислении правой части идет обращение к несуществующей еще на тот момент переменной $name.

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

>>419054

Ну вот тут как раз эта ошибка:

> PHP Notice: Undefined variable: name in /home/3MtXRS/prog.php on line 33



> $random = mt_rand(1, count($letters));


Взять случайный ключ кстати можно проще, через

$random = array_rand($letters);

Также, ты зря исплоьзуешь ucfirst. Она не работает с utf-8. Подробнее: https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>419057\t

> Но ведь она назначается уже внутри цикла. Без него она не нужна.



Чтобы выполнить команду

$name = ...

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

> как сделать первую букву большой?


mb_substr + mb_strtoupper
#460 #419289
>>419049

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

>>419050

> Я её удалял - и ничего не произошло.


Если ее удалить то эта команда вызовет ошибку:

$name = $name . $randomText;

Так как при вычислении правой части идет обращение к несуществующей еще на тот момент переменной $name.

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

>>419054

Ну вот тут как раз эта ошибка:

> PHP Notice: Undefined variable: name in /home/3MtXRS/prog.php on line 33



> $random = mt_rand(1, count($letters));


Взять случайный ключ кстати можно проще, через

$random = array_rand($letters);

Также, ты зря исплоьзуешь ucfirst. Она не работает с utf-8. Подробнее: https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>419057\t

> Но ведь она назначается уже внутри цикла. Без него она не нужна.



Чтобы выполнить команду

$name = ...

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

> как сделать первую букву большой?


mb_substr + mb_strtoupper
#461 #419338
Если я буду писать

foreach(foo() as $bar) { ... }

будет ли foo() высчитываться при каждом шаге цикла или он её закеширует?
sage #462 #419340
>>419338
если foo функция, то глупо не закешировать
#463 #419347
>>419287
Колупаю тот палиндром. Переписал с примера цикл. Вроде как слово в слово.
http://ideone.com/7ttSmb результат - линк-рилейтед.

Откуда там целая куча пуыстых символов?
#464 #419353
>>419347
Пробелы убирать нужно.

>Откуда там целая куча пуыстых символов?


Для русских слов нужно использовать mb_strlen.
strlen принимает каждую русскую букву за 2 символа, отсюда у тебя цикл в два раза дольше продолжается, чем должен.
14 Кб, 350x262
sage #465 #419354
свежая задачка о палиндромах, прямо с интервью
дана строка, найти самую длинную подстроку являющуюся палиндромом
#467 #419373
>>419287
Вперёд я посчитал, а как назад считать? Можно тем-же циклом, или надо как-то по-другому делать?
sage #468 #419374
>>419372
нет, а произвольная
#469 #419379
>>419373
Я даже посчитал назад, но есть один лишний символ. Яхз как он появился. И что с ним делать, ничего не хочет делать.
#470 #419380
>>419072

> Давай я возьмусь за них как закончу текущую?


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

> А как будет правильнее: добавить слово static или переписать вызовы методов?


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

> Нет, не выводит. Я вроде сам отключил это.


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

- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть

- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.

Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.

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


Можно перенести код из файла в функцию. Тогда, если какое-то условие не выполняется, можно выйти из нее с помощью return.

Вот этот код например https://github.com/someApprentice/ThumbnailService/blob/master/delete.php#L14 можно без проблем перенести.

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


Давай.
4 Кб, 360x75
#471 #419381
>>419379
Этот цикл считает 21 символ. 21й - пустой, откуда он взялся?
#472 #419382
>>419374
хорошо.
a^2 - a^2 = ab - b^2, то есть 0 = 0
но я не остановлюсь, т.к. знаю формулку
(a+b)(a-b) = b(a-b)
a ведь равна b, тогда (a-b) = 0. доказал. возьмете меня на работу?
#473 #419383
>>419381
Ты бы код весь скидывал, здесь не экстрасенсы сидят, которые по куску на скриншоте угадывают.
#474 #419385
>>419383
Проблема в этом куске, на самом деле.
http://ideone.com/czcbId, а код я по 10 раз меняю, что-бы результат посмотреть.
sage #475 #419387
>>419382
неправильно
перезвоним через неделю
84 Кб, 832x624
#476 #419389
>>419095

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

>>419100



> 2ch


> выложи фотку


Ну ок, выложил, пикрелейтед.

>>419107

Многострочный комментарий не вырезался http://ideone.com/kgsMKK

Почитай про флаг PCRE_DOTALL в мануале

>>419108



Лучший способ отметить праздник - решить несколько задачек на PHP

>>419158

1) Дано 2 массива: первый содержит список оценок учеников за 2013 год в виде array("Иванов" => 4, "Петров" => 3, ...), а второй — аналогичные оценки за 2014 год. Напиши программу, которая выведет сначала список учеников с ухудщившимися оценками, а потом с улучшившимися в таком виде:

Иванов: было 4, стало 3
....

2) Дан список фамилий вида

$list = array('Иванов', 'Иванов', 'Петров', ..);

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

Иванов: 3
Петров: 2
....

3) дан список пользователей такого вида

$users = array(
array('Ivan', 'ivan@example.ru'),
array('Petr', 'peter@example.ru'),
...
);

И в нем у некотрых пользователей указан одинаковый email. Выведи такие email, которые исплоьзуются некоторыми пользователями, в виде:

Адрес ivan@example.ru используют Ivan, Ivan2, Ivan-tsar, Ivanov
...
84 Кб, 832x624
#476 #419389
>>419095

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

>>419100



> 2ch


> выложи фотку


Ну ок, выложил, пикрелейтед.

>>419107

Многострочный комментарий не вырезался http://ideone.com/kgsMKK

Почитай про флаг PCRE_DOTALL в мануале

>>419108



Лучший способ отметить праздник - решить несколько задачек на PHP

>>419158

1) Дано 2 массива: первый содержит список оценок учеников за 2013 год в виде array("Иванов" => 4, "Петров" => 3, ...), а второй — аналогичные оценки за 2014 год. Напиши программу, которая выведет сначала список учеников с ухудщившимися оценками, а потом с улучшившимися в таком виде:

Иванов: было 4, стало 3
....

2) Дан список фамилий вида

$list = array('Иванов', 'Иванов', 'Петров', ..);

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

Иванов: 3
Петров: 2
....

3) дан список пользователей такого вида

$users = array(
array('Ivan', 'ivan@example.ru'),
array('Petr', 'peter@example.ru'),
...
);

И в нем у некотрых пользователей указан одинаковый email. Выведи такие email, которые исплоьзуются некоторыми пользователями, в виде:

Адрес ivan@example.ru используют Ivan, Ivan2, Ivan-tsar, Ivanov
...
#477 #419391
>>419387
Кто-то еще ведется на деление на ноль?
#478 #419394
>>419184

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

Но это все равно костыль. Чтобы проверить JS функцию незачем поднимать полноценный браузер, достаточно Node.JS. Судя по докам, http://jasmine.github.io/2.1/node.html жасмин это умеет.

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

Node.JS — это платформа, которая позволяет писать консольные и серверные приложения на яваскрипте (без браузера). Node.JS использует v8, тот же движок что используется для выполнения явакрипта в Chrome. Для Node.JS написано большое число библиотек, которые доступны через менеджер пакетов npm.

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

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


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

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

Более того, так как сервер не нужен, это можно выложить на github-pages (для этого достаточно в репозитории создать дополнительную ветку).

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


https://github.com/dKab/jasmine-tests/blob/master/1.js#L24 тут ты забыл var и создаешь глобальную переменную что плохо для теста. Если бы ты использовал strict mode в начале файла, JS выдал бы исключение.

Кстати, ты не используешь JSHint? Он тоже обнаруживает такие вещи. Для Sublime есть плагин JSHintGutter, который подчеркивает ошибки. Только советую поставить режим проверки On Save (при сохранении файла), а не при любом редактировании так как для проверки запускается node.js и это может притормаживать. JSHint — наследник известного JSLint, с возможностью более тонкой настройки. Опции для JSHint можно задать как комментарием, так и файлом .jshintrc в папке проекта. JSHint поможет тебе исправить ошибки еще до запуска кода.

Познакомиться с ним можно без установки на сайте http://jshint.com/

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

> expect(res.constructor).toBe(Array);


Плохая проверка на массив. Лучше через (x instanceof Array), ну и написать свой матчер для этого (expect.toBeArray или expect.toBeInstanceOf), как описано тут: http://jasmine.github.io/2.1/custom_matcher.html

Также, имей в виду проверка через instanceof не обнаружит массив если он создан в другом окне или фрейме так как там свой Array: window.Array !== window.frames[x].Array. Универсально проверить можно через toString, погугли, или через Array.isArray в ES5-браузерах.

Проверить на функцию можно проще чем ты делал, через typeof x == 'function', это работает для всех функций включая экзотическую Function: typeof (new Function()) == 'function'

> var rand = Math.random( );


В тестах не стоит использовать эту функцию, чтобы они были повторяемыми. Лучше создать массив руками то есть expect.toReturn([1, 1, 1]); Это еще и проще (тесты должны быть еще и максимально простыми).

То же самое с var curtime = new Date().getTime().toString()

> https://github.com/dKab/jasmine-tests/blob/master/3.js#L31


По моему, ты не так понял «не изменяет исходный массив» (или я плохо объяснил). Если мы даем массив объектов [ {a:1, ..}] и функция меняет объекты в массиве это ок. В данном случае можно написать тест как у меня в задаче:

var arr = [1, 2, 3];
map(square, arr);
expect(arr).toEqual([1, 2, 3]);

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

Например этот тест https://github.com/dKab/jasmine-tests/blob/master/2.js#L17 слишком сложный. Я бы сделал тестовую функцию вида { return i++; } и массив [1, 2, 3] для проверки. Пиши короче и проще.

Заметь также что необязательно создавать свою функцию-пустышку, можно использовать jasmine.createSpy.

В этом тесте https://github.com/dKab/jasmine-tests/blob/master/2.js#L9 незачем использовать функцию sequence, так как это без надобности усложняет тест (мы теперь зависим от правильности этой функции) — тут хватит пустышки jasmine.createSpy.and.returnValue

> https://github.com/dKab/jasmine-tests/blob/master/4.js#L33


Честно говоря имена типа bar, quuux трудно понять, лучше использовать осмысленные названия типа fmappedFunction.

> https://github.com/dKab/jasmine-tests/blob/master/4.js#L34


думаю тест должен проверять конечный, а не промежуточный результат. А если проверять массив, то лучше не через shift, а через ToEqual([0])

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

> посмотри, скажи, что думаешь.


Думаю, что у тебя хорошо получается и надо дальше решать задачки на JS, и потом сделать на нем какое-нибудь приложение, а заодно может и ноду изучить.
#478 #419394
>>419184

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

Но это все равно костыль. Чтобы проверить JS функцию незачем поднимать полноценный браузер, достаточно Node.JS. Судя по докам, http://jasmine.github.io/2.1/node.html жасмин это умеет.

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

Node.JS — это платформа, которая позволяет писать консольные и серверные приложения на яваскрипте (без браузера). Node.JS использует v8, тот же движок что используется для выполнения явакрипта в Chrome. Для Node.JS написано большое число библиотек, которые доступны через менеджер пакетов npm.

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

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


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

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

Более того, так как сервер не нужен, это можно выложить на github-pages (для этого достаточно в репозитории создать дополнительную ветку).

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


https://github.com/dKab/jasmine-tests/blob/master/1.js#L24 тут ты забыл var и создаешь глобальную переменную что плохо для теста. Если бы ты использовал strict mode в начале файла, JS выдал бы исключение.

Кстати, ты не используешь JSHint? Он тоже обнаруживает такие вещи. Для Sublime есть плагин JSHintGutter, который подчеркивает ошибки. Только советую поставить режим проверки On Save (при сохранении файла), а не при любом редактировании так как для проверки запускается node.js и это может притормаживать. JSHint — наследник известного JSLint, с возможностью более тонкой настройки. Опции для JSHint можно задать как комментарием, так и файлом .jshintrc в папке проекта. JSHint поможет тебе исправить ошибки еще до запуска кода.

Познакомиться с ним можно без установки на сайте http://jshint.com/

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

> expect(res.constructor).toBe(Array);


Плохая проверка на массив. Лучше через (x instanceof Array), ну и написать свой матчер для этого (expect.toBeArray или expect.toBeInstanceOf), как описано тут: http://jasmine.github.io/2.1/custom_matcher.html

Также, имей в виду проверка через instanceof не обнаружит массив если он создан в другом окне или фрейме так как там свой Array: window.Array !== window.frames[x].Array. Универсально проверить можно через toString, погугли, или через Array.isArray в ES5-браузерах.

Проверить на функцию можно проще чем ты делал, через typeof x == 'function', это работает для всех функций включая экзотическую Function: typeof (new Function()) == 'function'

> var rand = Math.random( );


В тестах не стоит использовать эту функцию, чтобы они были повторяемыми. Лучше создать массив руками то есть expect.toReturn([1, 1, 1]); Это еще и проще (тесты должны быть еще и максимально простыми).

То же самое с var curtime = new Date().getTime().toString()

> https://github.com/dKab/jasmine-tests/blob/master/3.js#L31


По моему, ты не так понял «не изменяет исходный массив» (или я плохо объяснил). Если мы даем массив объектов [ {a:1, ..}] и функция меняет объекты в массиве это ок. В данном случае можно написать тест как у меня в задаче:

var arr = [1, 2, 3];
map(square, arr);
expect(arr).toEqual([1, 2, 3]);

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

Например этот тест https://github.com/dKab/jasmine-tests/blob/master/2.js#L17 слишком сложный. Я бы сделал тестовую функцию вида { return i++; } и массив [1, 2, 3] для проверки. Пиши короче и проще.

Заметь также что необязательно создавать свою функцию-пустышку, можно использовать jasmine.createSpy.

В этом тесте https://github.com/dKab/jasmine-tests/blob/master/2.js#L9 незачем использовать функцию sequence, так как это без надобности усложняет тест (мы теперь зависим от правильности этой функции) — тут хватит пустышки jasmine.createSpy.and.returnValue

> https://github.com/dKab/jasmine-tests/blob/master/4.js#L33


Честно говоря имена типа bar, quuux трудно понять, лучше использовать осмысленные названия типа fmappedFunction.

> https://github.com/dKab/jasmine-tests/blob/master/4.js#L34


думаю тест должен проверять конечный, а не промежуточный результат. А если проверять массив, то лучше не через shift, а через ToEqual([0])

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

> посмотри, скажи, что думаешь.


Думаю, что у тебя хорошо получается и надо дальше решать задачки на JS, и потом сделать на нем какое-нибудь приложение, а заодно может и ноду изучить.
#479 #419395
>>419385
в mb_substr нумерация начинается с нуля, соответственно в слове из 5 букв, индекс последней буквы будет 4, если попытаться вернуть 5ую, тебе выдаст пустой символ.
#480 #419400
>>419263

Программа работает правильно, но тут вот нехорошо написано:

> $r1 = mt_rand(0, 3);


Если мы поменяем исходные массивы, надо вручную пересчитывать все цифры. Сделай, чтобы они считались автоматически. Кстати, для выбора случайного ключа есть функция array_rand.

>>419287

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

>>419338

Она вызывается только один раз, перед началом цикла (кстати ты бы мог легко проверить это и сам с помощью echo).

>>419347

> Откуда там целая куча пуыстых символов?


strlen не работает с русскими буквами, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>419354

Он домножает обе стороны на (a-b) то есть на 0.

>>419372

Не a равно нулю, а a - b равно нулю.

>>419373

Отдельным циклом, хоят не думаю что это надо для решения задачи.

>>419385

Выведи чему равно $length.

>>419395

Он там strlen использует
#480 #419400
>>419263

Программа работает правильно, но тут вот нехорошо написано:

> $r1 = mt_rand(0, 3);


Если мы поменяем исходные массивы, надо вручную пересчитывать все цифры. Сделай, чтобы они считались автоматически. Кстати, для выбора случайного ключа есть функция array_rand.

>>419287

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

>>419338

Она вызывается только один раз, перед началом цикла (кстати ты бы мог легко проверить это и сам с помощью echo).

>>419347

> Откуда там целая куча пуыстых символов?


strlen не работает с русскими буквами, почитай урок https://gist.github.com/codedokode/ff99e357e9860ea169b8

>>419354

Он домножает обе стороны на (a-b) то есть на 0.

>>419372

Не a равно нулю, а a - b равно нулю.

>>419373

Отдельным циклом, хоят не думаю что это надо для решения задачи.

>>419385

Выведи чему равно $length.

>>419395

Он там strlen использует
#481 #419403
>>419400

>Выведи чему равно $length.


А где оно увидело столько символов?
Как с этим бороться?

>Отдельным циклом, хоят не думаю что это надо для решения задачи.


А как ещё решить можно?
#483 #419408
>>419405
Разобрался с этим, теперь считает на 1 символ меньше.
http://ideone.com/czcbId
#484 #419409
>>419403

> Как с этим бороться?


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

> А как ещё решить можно?


Одним циклом
#485 #419418
>>419409

>Одним циклом


Божественная подсказка.
В принципе, я так и поступил, и выполнил задачу, надеюсь, что правильно. Хотя, букву "Н" мне так и не показало.
http://ideone.com/czcbId
#486 #419420
>>419418

Непраивльно пока что: http://ideone.com/l4pa3m

Посмтри внимательно: ты сравниваешь не все пары букв, а только последнюю.
#487 #419421
>>419420
Что-то не понял тебя.
У меня сам цикл неправильный, или условие?
#488 #419423
>>419421

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

if ($symbol1 == $symbol2) {

?

И почему он считает слово «сказка» палиндромом?
#489 #419427

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



Однако.
А сейчас?
sage #491 #419432
>>419428
estjPalindrom = reverse >>= (==)
#492 #419433
>>416970

Начал делать простую задачу на сайт про абитуриентов

Укажи основные ошибки.

https://github.com/tokotun/matriculant
#493 #419435
>>419433
Какой аккуратный код. У меня регистрация, редактирование профиля по 80 строк и файл класса больше сотни.
#494 #419436
>>419432
ЯННП
#496 #419450
Оп, у меня все плохо. Ничего не получается.
https://github.com/sqghub/TestHub
Я боюсь дальше хоть что-то писать.
#497 #419497
http://ideone.com/qEzrWt (условие внутри задачи)
#499 #419506
>>419497

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

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

Вот список номеров:

Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');

Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);

Также. если номер непраильный, например, содержит буквы, не надо его приводить ни к какому формату, а надо написать что он неприальный.
#500 #419508
>>419389
Решаю придуманые задачки, пока на первой сижу.
В общем, решил идти через перечисление 1го массива, и второго массива. Потом сравнение по одинаковой фамилии и увеличившейся или уменьшившейся оценки. Но для этого, нужно, чтобы считало два массива одновременно. Тут-то я и остановился.
#501 #419518
>>419508

Обходишь первый массив циклом и для каждого элемента проверяешь чему равна оценка эттго же ученика в другом массиве. Также, показывай код если зашел в тупик, так как по словам не всегда можно угадать что ты написал.
#503 #419554
>>419552
немного конечно по каличному условия поставил, надо было наверное в начале проверку сделать на +7 либо 8 в самом начале, если нет - то сразу к следующему элементу, если подходит то уже через preg_replace удалить все спецсимволы и пробелы, дальше проверить на длину и наличие букв, у меня как то всё в другом порядке вышло
#504 #419575
Прохожу курс по пыху на codecademy, а у них там парсер кривой, вот так:
$fuck = substr(blahblahblah);
не видит и требует переделывать, а вот так:
$fuck=substr(blahblahblah); //без пробелов
видит. Нахуй так жить? Может, им написать куда-нибудь?
6 Кб, 645x63
#505 #419608
Ну вот какого хуя тут ошибка синтаксиса? Везде во всех книжках, где я не искал, дамп делается так.
#506 #419610
>>419608
Ебать даун, попробуй ещё в питоновском интерпретаторе запустить.
#507 #419611
>>419608

В косноли MySQL клиента надо писать SQL запросы и дамп сделать нельзя.

Надо выйти из клиента в обычную консоль и там набирать mysqldump

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

Прочти заодно мой урок по командной строке, думаю пригодится: https://gist.github.com/codedokode/10539568
#508 #419612
>>419610

Ругаться иди в другой тред. Сам ты даун.
#509 #419613
Пишу гостевую книгу, решил сделать две таблички(название колонок и типы на картинке). Планирую хранить логин, пароль, соль от админки в нижней. Читаю о функции crypt, и не могу понять зачем она приклеивает соль спереди к полученному результату. Даже если бы я не хранил соль в бд, по такому результату сразу видно какой алгоритм используется и что это за соль. Например $2a$07$1....22yobageneratestring. $2a$07$ - алгоритм, 1..22 - 22 символа соли, yobageneratestring - сгенерированная строка. Что мешает хакеру использовать свои "радужные таблицы" как прежде, просто генерируя их с моей солью? Каков смысл в этой соли тогда? Как правильно хранить пароли?
30 Кб, 530x416
#510 #419614
>>419613
Забыл картинку
#511 #419615
Не могу прикрепить, пишет "такая уже есть на сервере" http://s005.radikal.ru/i210/1412/ce/c8974666a0b5.png
#512 #419616
>>419614
черт
#513 #419617
>>419613

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

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

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


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

Соль добавляет уникальности паролю (даже пароль 123456 станвится сложнее), а также добавляет хитрые символы которых может не быть в радужных таблицах.

> Как правильно хранить пароли?


C солью.

Вот мой урок на тему:

> Как солить и хешировать пароли.md


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

Вот еще полезная инфа на английском http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication
#514 #419618
>>419614

PASSWORD(20)

Ну а теперь посчитай влезет ли туда хеш.

Кстати ограничение длины VARCHAR не 255, а 65535 (правда там еще есть ограничение на длину строки так что в реальности около 22000 символов
).
#515 #419621
>>419618

>Ну а теперь посчитай влезет ли туда хеш


Это просто набросок
#516 #419661
>>419552
бумп
#517 #419674
>>419518
http://ideone.com/i9WCGb

Пока до такого додумал. Дальше знаний не хватает. Хочу завтра что-то новое почитать.
#518 #419678
Господа, а какая сейчас хорошая практика для сравнения двух файлов? Вот как здесь, на Дваче, если загружаешь тот же самый файл, пусть и с другим названием, он всё равно выкинет, что такой файл на сервере уже существует. MD5, только он, или еще сравнение по размеру файлов, разрешению, не знаю, как лучше всего к этому подойти?
#519 #419687
>>419678

Если 2 файла на диске то можно сравнить содержимое или md5 от содержимого. В базе удобнее хранить просто md5
254 Кб, 1024x768
снова про соль #520 #419688
Я сегодня у мамы дурачок. Okey, я выбрал blowfish. 1)Алфавиты указанные для солей алгоритмов относятся только к соли или к параметру str тоже? Здается мне что первое. Если так, то если я захочу проверить поле на допустимые символы, то мне придется парсить эту строку на случай запрещенных символов, в моем случае на пхп, т.к. js я пока не знаю. 2)Ну и зачем на сайтах запрещают использовать например ./&# ? ведь это по идее только сделает пароль надежнее.
#521 #419689
>>419688
в первом вопросе я имел ввиду ф-ю crypt
#522 #419690
>>419678
Сравнение побайтно.
#523 #419701
>>419690
Так xor==0!
#524 #419702
>>419428

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

>>419433

> `name` text NOT NULL


Обычно TEXT используют для огромных полей (до 65535 символов), а для имени лучше VARCHAR(50)

> `sex` text NOT NULL,


> `location` text NOT NULL,


Иди-ка погугли по словам «mysql ENUM»

> `numberGroup` int(11) NOT NULL,


Номер группы не стоит делать числом, а то вдруг группа наызвается 2106M например? Или 0012?

Аналогично, телефон нельзя хранить числом иначе получится как тут описано: http://habrahabr.ru/post/113435/

Шаблоны лучше положить в отдельную папку, например templates. И дать им расширение php или phtml чтобы отличить от обычных статических HTML-файлов.

> connectvars.php


Обычно такой файл называют config.php. Я не советую использовать константы, лучше переменные, а то их например нельзя переопределить.

https://github.com/tokotun/matriculant/blob/master/dataMapper.php

В одно файле должен быть ровно один класс. Название файла должно совпадать с названием класса.

MyClass => MyClass.php

> (Matriculant &$matriculant)


Объекты и так передаются по ссылке (точнее, они передаются без копирования, и функция работает с оригиналом), & не нужен: http://php.net/manual/ru/language.oop5.references.php

> https://github.com/tokotun/matriculant/blob/master/dataMapper.php#L29


Тут лучше бы разбить эту длинную портянку на функции insert и update. Также, чтобы не копипастить код bind 2 раза, можно сделать отдельный метод toArray, который по объекту создаст массив аргументов или же метод который делает нужные bindParam.

Также, DataMapper не должен ставить куки. Его задача — только сохранять и загружать объекты из БД

> public function viewMatriculant(Matriculant &$matriculant)


Такая функция обычно используется так:

$m = $mapper->getMatriculantById($id);

То есть она сама создает и возвращает объект (а при неправильном id выбрасывет исключение либо возвращает null. Исключение наверно лучше).

Классы типа DataMapper тоже стоит убрать в папку, например, app, lib.

> https://github.com/tokotun/matriculant/blob/master/main.html


Не используй echo в шаблонах. Используй <?=

Не копипасть. У тебя в шаблонах скопирована шапка — это надо исправить. Копипаста — зло, есть специальный принцип DRY (не повторяйся) которого стоит придерживаться.

> value="<?php if (!empty($name)) echo $name;?>">


Почему не <?= $name ?> ?

А, и кстати, почитай урок про уязвимость XSS: https://gist.github.com/anonymous/52adda0113428b274c64

Также, в шаблонах надо применять версии if, for с двоеточием: http://php.net/manual/ru/control-structures.alternative-syntax.php Он лучше читается среди HTML тегов.

> <label>Год рождения</label>


> <input type="text" placeholder="Введите текст…"


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

Ну и если ты хранишь только год то в базе надо вместо DATE использовать тип YEAR (да, такой тип есть, гугли. Вообще, почитай про то какие типы есть, я вижу ты слабо их знаешь: http://www.mysql.ru/docs/man/Column_types.html ).

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

------------

$values = значения по умолчанию (пустые);
$errors = пустой массив;

Если (форма отправлена через POST) {
Читаем значения полей в $values;

Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}

Кладем ошибки в $errors;
}

Выводим форму($values, $errors);

-------------

Ну а так, в целом, неплохо.
#524 #419702
>>419428

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

>>419433

> `name` text NOT NULL


Обычно TEXT используют для огромных полей (до 65535 символов), а для имени лучше VARCHAR(50)

> `sex` text NOT NULL,


> `location` text NOT NULL,


Иди-ка погугли по словам «mysql ENUM»

> `numberGroup` int(11) NOT NULL,


Номер группы не стоит делать числом, а то вдруг группа наызвается 2106M например? Или 0012?

Аналогично, телефон нельзя хранить числом иначе получится как тут описано: http://habrahabr.ru/post/113435/

Шаблоны лучше положить в отдельную папку, например templates. И дать им расширение php или phtml чтобы отличить от обычных статических HTML-файлов.

> connectvars.php


Обычно такой файл называют config.php. Я не советую использовать константы, лучше переменные, а то их например нельзя переопределить.

https://github.com/tokotun/matriculant/blob/master/dataMapper.php

В одно файле должен быть ровно один класс. Название файла должно совпадать с названием класса.

MyClass => MyClass.php

> (Matriculant &$matriculant)


Объекты и так передаются по ссылке (точнее, они передаются без копирования, и функция работает с оригиналом), & не нужен: http://php.net/manual/ru/language.oop5.references.php

> https://github.com/tokotun/matriculant/blob/master/dataMapper.php#L29


Тут лучше бы разбить эту длинную портянку на функции insert и update. Также, чтобы не копипастить код bind 2 раза, можно сделать отдельный метод toArray, который по объекту создаст массив аргументов или же метод который делает нужные bindParam.

Также, DataMapper не должен ставить куки. Его задача — только сохранять и загружать объекты из БД

> public function viewMatriculant(Matriculant &$matriculant)


Такая функция обычно используется так:

$m = $mapper->getMatriculantById($id);

То есть она сама создает и возвращает объект (а при неправильном id выбрасывет исключение либо возвращает null. Исключение наверно лучше).

Классы типа DataMapper тоже стоит убрать в папку, например, app, lib.

> https://github.com/tokotun/matriculant/blob/master/main.html


Не используй echo в шаблонах. Используй <?=

Не копипасть. У тебя в шаблонах скопирована шапка — это надо исправить. Копипаста — зло, есть специальный принцип DRY (не повторяйся) которого стоит придерживаться.

> value="<?php if (!empty($name)) echo $name;?>">


Почему не <?= $name ?> ?

А, и кстати, почитай урок про уязвимость XSS: https://gist.github.com/anonymous/52adda0113428b274c64

Также, в шаблонах надо применять версии if, for с двоеточием: http://php.net/manual/ru/control-structures.alternative-syntax.php Он лучше читается среди HTML тегов.

> <label>Год рождения</label>


> <input type="text" placeholder="Введите текст…"


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

Ну и если ты хранишь только год то в базе надо вместо DATE использовать тип YEAR (да, такой тип есть, гугли. Вообще, почитай про то какие типы есть, я вижу ты слабо их знаешь: http://www.mysql.ru/docs/man/Column_types.html ).

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

------------

$values = значения по умолчанию (пустые);
$errors = пустой массив;

Если (форма отправлена через POST) {
Читаем значения полей в $values;

Если (все заполнено верно) {
Делаем требуемое действие (например вставляем запись в БД);
Редиректим куда-нибудь;
Выходим;
}

Кладем ошибки в $errors;
}

Выводим форму($values, $errors);

-------------

Ну а так, в целом, неплохо.
#525 #419707
>>419450

Не бойся. Мы же не наказываем никого за ошибки.

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

Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).

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

Очевидно, есть Тест. Тест содержит много Вопросов. Вопрос бывает разный: ВопросСОдиночнымВыбором, ВопросСЧисловымОтветом, итд. Ну и некоторые Вопросы могут иметь несколько ВариантовОтвета. Тут есть несколько вариантов релизации:

- сделать абстрактный класс Вопрос и 4 конкретных класса-наследника
- сделать один класс Вопрос с полем типВопроса

Первый вариант более удобным с точки зрения того, что разный функционал будет разнесе по разным классам. Вариант 2 проще в реализации. Я советую тебе взять более сложный, чтобы лучше разобраться с наследвоанием моделей в Юи.

Итак, нам надо решить 2 задачи:

- сделать наследование моделей
- сделать связи

гуглим и находим:

- https://github.com/samdark/yii2-cookbook/blob/master/book/ar-single-table-inheritance.md (я бы там type сделать через ENUM а не string). Это мануал от автора Yii как я понимаю.

Заметь, там за счет метода instantiate мы при загрузке из БД создаем объект нужного класса.

- связи описаны в мануале http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#working-with-relational-data (кстати я советую прочесть весь этот раздел, а не только про связи)

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

И еще. Я советую вот это откючить в настройках IDE:

> Created by PhpStorm.


Этот комментарий не несет никакой ценности так как дату создания и автора видно в гите. Раз так, незачем его добавлять. Лучше в начале файла кратко описать что это за класс и зачем он нужен.
#525 #419707
>>419450

Не бойся. Мы же не наказываем никого за ошибки.

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

Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).

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

Очевидно, есть Тест. Тест содержит много Вопросов. Вопрос бывает разный: ВопросСОдиночнымВыбором, ВопросСЧисловымОтветом, итд. Ну и некоторые Вопросы могут иметь несколько ВариантовОтвета. Тут есть несколько вариантов релизации:

- сделать абстрактный класс Вопрос и 4 конкретных класса-наследника
- сделать один класс Вопрос с полем типВопроса

Первый вариант более удобным с точки зрения того, что разный функционал будет разнесе по разным классам. Вариант 2 проще в реализации. Я советую тебе взять более сложный, чтобы лучше разобраться с наследвоанием моделей в Юи.

Итак, нам надо решить 2 задачи:

- сделать наследование моделей
- сделать связи

гуглим и находим:

- https://github.com/samdark/yii2-cookbook/blob/master/book/ar-single-table-inheritance.md (я бы там type сделать через ENUM а не string). Это мануал от автора Yii как я понимаю.

Заметь, там за счет метода instantiate мы при загрузке из БД создаем объект нужного класса.

- связи описаны в мануале http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#working-with-relational-data (кстати я советую прочесть весь этот раздел, а не только про связи)

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

И еще. Я советую вот это откючить в настройках IDE:

> Created by PhpStorm.


Этот комментарий не несет никакой ценности так как дату создания и автора видно в гите. Раз так, незачем его добавлять. Лучше в начале файла кратко описать что это за класс и зачем он нужен.
#526 #419710
>>419707

>Я вижу, что у тебя сделано довольно странно: у тебя есть 4 класс-опций (вариантов ответа?) в то время как у нас 4 варианта Вопросов (а не ответов).


Я посчитал, что типы у нас как раз у ответов. Я их и хранить в разных таблицах собирался.

>- связи описаны в мануале


Читал.

>И еще. Я советую вот это отключить в настройках IDE:


Я обычно удаляю, это пропустил видимо.
#527 #419713
>>419450

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

Ну и я советую реализовать наследование на STI так как оно описано в официальном гайде.

>>419504

Ок, верно.

>>419552

Ой, форматировние ужасное, в следующий раз пропусти код через phpformatter.com ибо читать очень тяжело без отступов.

> \tif (preg_match('/^\s?[+]?\s?(7|8)/', $number))


> if (strlen($number) != 11 OR !is_numeric($number)


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

Ну и телефон — это не число, а строка из цифр. К нему неприавильно примерять функции типа is_numeric.

>>419575

Ну там вроде есть форум для обратной связи.

>>419674

Вот смотри, у тебя есть первый цикл. Внутри него на каждом шаге в $pupil записывается фамилия, а в $grage — оценка за 2013 год. Сделай чтобы тут же с помощью echo выводилась оценка этого же ученика за 2014 год. Для этого тебе надо взять из второго массива элемент с нужным ключом (и тебе тут помогут квадратные скобки).

>>419688

Обрти внимание, в php 5.5 добавили новые готовые функции для хеширования и проверки пароля: http://habrahabr.ru/post/194972/

> Ну и зачем на сайтах запрещают использовать например ./&# ?


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

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

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

> Алфавиты указанные для солей алгоритмов относятся только к соли или к параметру str тоже?


Только к соли.
#527 #419713
>>419450

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

Ну и я советую реализовать наследование на STI так как оно описано в официальном гайде.

>>419504

Ок, верно.

>>419552

Ой, форматировние ужасное, в следующий раз пропусти код через phpformatter.com ибо читать очень тяжело без отступов.

> \tif (preg_match('/^\s?[+]?\s?(7|8)/', $number))


> if (strlen($number) != 11 OR !is_numeric($number)


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

Ну и телефон — это не число, а строка из цифр. К нему неприавильно примерять функции типа is_numeric.

>>419575

Ну там вроде есть форум для обратной связи.

>>419674

Вот смотри, у тебя есть первый цикл. Внутри него на каждом шаге в $pupil записывается фамилия, а в $grage — оценка за 2013 год. Сделай чтобы тут же с помощью echo выводилась оценка этого же ученика за 2014 год. Для этого тебе надо взять из второго массива элемент с нужным ключом (и тебе тут помогут квадратные скобки).

>>419688

Обрти внимание, в php 5.5 добавили новые готовые функции для хеширования и проверки пароля: http://habrahabr.ru/post/194972/

> Ну и зачем на сайтах запрещают использовать например ./&# ?


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

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

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

> Алфавиты указанные для солей алгоритмов относятся только к соли или к параметру str тоже?


Только к соли.
#528 #419714
>>419710

Нет, у нас есть именно 4 типа вопросов и некоторые вопросы имеют ВариантыОтветов, а некоторые нет (ответ тогда удобно хранить прямо в самом вопросе). То есть у класса ВопросСЧислом могут быть свойства Ответ и Погрешность.

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

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

> Я обычно удаляю, это пропустил видимо.


Это в настройках удаляется, зачем каждый раз руками удалять?
#529 #419715
>>419710

Кстати, ты не решал мои задачки на SQL? Будет время - глянь: https://gist.github.com/codedokode/10539213 будет над чем поломать голову.
#530 #419717
>>419715
Только про лайки. Я решил, что пока что мне их хватит. Сейчас с сессией разберусь и смогу уделить больше внимания тестхабу.
#531 #419731
ОПик, тоже пилю тестхаб, хочу спросить об одной штуке.

У меня есть тест, который имеет много вопросов, которые имеют много ответов. При создании делаю примерно такую обработку: http://pastebin.com/SGmpS8WZ .

Но так ведь не совсем правильно, да?
Например, у нас есть человек, который оставил название теста пустым, а в правилах валидации он должен быть заполнен. Если у него отключен js, то и клиентская валидаци, и мы сможем проверять только на сервере, а в этом случае $test->validate() вернёт false и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.

Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?

Допустим, мы их не игнорируем, и делаем что-то вроде http://pastebin.com/dHfdnmKe . А стоит ли в таком случае вообще проверять результат подгрузки данных в модель через load? Получится, что если данные через load не загрузятся, то валидация не запустится и пользователь не поймёт где ошибка. С другой стороны, это случится только если явно менять post параметры, а для этого нужно будет менять форму.

Вообще, на вики по yii часто вижу код как в первом пастебине или http://pastebin.com/unQB6UBh . Может тоже не стоит заморачиваться и писать так же?
#532 #419741
>>419714

>Нет, у нас есть именно 4 типа вопросов и некоторые вопросы имеют ВариантыОтветов, а некоторые нет (ответ тогда удобно хранить прямо в самом вопросе).


Так-то да, но у нас на четыре типа у одного нет вариантов.

>То есть у класса ВопросСЧислом могут быть свойства Ответ и Погрешность.


А с остальными что делать? Все равно на каждый тип придется по таблице делать. У меня же в любом вопросе может быть 1-∞ вариантов ответа.
62 Кб, 927x636
#533 #419745
>>419731
И глянь схему, пожалуйста.
#534 #419748
>>419731

> Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?


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

> и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.


Это баг твоего алгоритма работы с формами. По идее все что вводится, должно быть вписано в поля формы и отправляться на сервер. А на сервере должно быть примерно так:

------------

Если (мы создаем тест) {
модель = создать новую пустую модель теста;
} иначе если (мы редактируем тест) {
модель = загрузить из базы модель теста со всеми вопросами;
}

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

если (все правильно) {
вставляем все это в Бд ;
редиректим;
}
}

// если есть ошибки или мы только открыли форму
показать форму с данными из модели;

------------------

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

Я в этом подходе не учел аякс-валидацию. В Юи при аякс-валидации по моему вызывается то же самое децствие в констроллере, но результаты валидации отдаются в нужном формате. Надо проверить что аякс- или JS-валидация не сломалась, если она используется.

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

> Вообще, на вики по yii часто вижу код как в первом пастебине


Он неправильный.
#534 #419748
>>419731

> Может я слишком заморачиваюсь и стоит игнорировать людей с выключенным js?


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

> и мы не подгрузим вопросы через Model::loadMultiple(), и из-за этого то, что пользователь вводил в вопросах исчезнет.


Это баг твоего алгоритма работы с формами. По идее все что вводится, должно быть вписано в поля формы и отправляться на сервер. А на сервере должно быть примерно так:

------------

Если (мы создаем тест) {
модель = создать новую пустую модель теста;
} иначе если (мы редактируем тест) {
модель = загрузить из базы модель теста со всеми вопросами;
}

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

если (все правильно) {
вставляем все это в Бд ;
редиректим;
}
}

// если есть ошибки или мы только открыли форму
показать форму с данными из модели;

------------------

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

Я в этом подходе не учел аякс-валидацию. В Юи при аякс-валидации по моему вызывается то же самое децствие в констроллере, но результаты валидации отдаются в нужном формате. Надо проверить что аякс- или JS-валидация не сломалась, если она используется.

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

> Вообще, на вики по yii часто вижу код как в первом пастебине


Он неправильный.
#536 #419751
>>419731

Насчет вопросов, а где ты хранишь варианты ответов в вопросах с выбором?

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

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

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

А потом реализовал это в Yii. Там есть вариант для реализации STI: http://rmcreative.ru/blog/post/nasledovanie-s-odnoy-tablitsey-v-yii

Ну и советую код показывать так как чем раньше мы увидим ошибки тем меньше переделывать придется.
#537 #419752
Оп, как ни крути, я считаю, что вопросы и ответы - разные классы. Их все равно придется делить. Либо в наглую в json строку в вопрос записывать массивом.
#538 #419754
>>419741

> Так-то да, но у нас на четыре типа у одного нет вариантов.


Даже у двух: у вопроса на число и на текст. У них не должно быть связи с ВариантамиОтветов.

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

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

> А с остальными что делать? Все равно на каждый тип придется по таблице делать. У меня же в любом вопросе может быть 1-∞ вариантов ответа.


Не придется делать. Изучи паттерн STI: http://design-pattern.ru/patterns/single-table-inheritance.html

Там все поля всех классов отображаются на одну общую таблицу. Ну а для вариантов ответов делаем вторую таблицу.
#539 #419755
>>419754

>Даже у двух: у вопроса на число и на текст.


Неправда. У текста может быть несколько вариантов.

>Не придется делать. Изучи паттерн STI


Не нравится мне он.

>Ну а для вариантов ответов делаем вторую таблицу.


Все равно же для двух классов из четырех пилим отдельную таблицу. Даже для трех: у нас в тексте тоже несколько ответов может быть.
#540 #419756
>>419745

А, answer это и есть вариант ответа? Тогда все ок.

>>419749

Решено верно.

>>419752

Я тоже.

> Либо в наглую в json строку в вопрос записывать массивом.


Не надо. Это делают ради каких-то оптимизаций, а у нас пока никаких проблем с производиетльностью не видно.
#541 #419758
https://github.com/MindiMakridi/Students
после многочисленных танцев с бубном я таки создал репозиторий и добавил в него файлы. Вроде все сделал, кроме одного: отображение по 50 записей на странице. Не совсем представляю как это сделать. Ясно, что с помощью LIMIT, а вот как создавать динамически страницы, в зависимости от количества записей?
#542 #419760
>>419755

> Неправда. У текста может быть несколько вариантов.


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

> Не нравится мне он.


Чем? Поясни. И какой паттерн нравится больше?

Мне он нравится тем что он поддерживается в Юи, позволяет организоваь в БД связь от ВариантаОтвета к Вопросу через FOREIGN KEY, позволяет легко искать несколько типов вопросов в Бд в одной таблице без использования UNION. Например, выбрать все вопросы к тесту одним простым SELECT.

Напиши, какой вариант тебе нравится, какие у него плюсы и минусы.

> Все равно же для двух классов из четырех пилим отдельную таблицу. Даже для трех: у нас в тексте тоже несколько ответов может быть.


Если используем STI то пилится только одна таблица так как это Single Table INheritance.
#543 #419761
>>419758

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

index.php?page=3

или

/students/page/3

(если ты используешь rewrite для URL). И потом по этому номеру выссчитываешь OFFSET для LIMIT.

Код проверю, но попозже, прямо сейчас некогда, а кода много. Сразу могу сказать что надо будет файлы типа такого https://github.com/MindiMakridi/Students/blob/master/profile.php разбить на несколько: сваливать все в одну кучу не надо. Также не выводи HTML через echo, используй отдельные файлы-шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html

Также, код вставки студента в БД надо будет сделать с применением паттерна вроде DataMapper (или хотя бы на функциях если ты не знаешь ООП, но я советую его изучить так как он везде требуется и без него тебя никуда не возьмут, у меня есть простой урок по ООП если что). Вот урок про работу с БД с использованием ООП: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

То, что у тебя все написано длинной портянкой это нехорошо конечно.

По базе данных

> `sex` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,


Погугли по слвоам MySQL ENUM

Также, почитай какие есть типы колонок в MySQL:

http://phpclub.ru/mysql/doc/column-types.html (рус, кратко)
http://dev.mysql.com/doc/refman/5.6/en/data-types.html (англ, подробно)

> `groupindex` int(11) DEFAULT NULL,


Номер группы не надо делать числом, вдруг будет группа 2106M или 212-20?

> `birthdate` int(11) DEFAULT NULL,


Тут надо использовать более подходящий тип

Для шаблонов стоит сделать отдельную папку вроде templates, для функций/классов папку lib или app.
#543 #419761
>>419758

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

index.php?page=3

или

/students/page/3

(если ты используешь rewrite для URL). И потом по этому номеру выссчитываешь OFFSET для LIMIT.

Код проверю, но попозже, прямо сейчас некогда, а кода много. Сразу могу сказать что надо будет файлы типа такого https://github.com/MindiMakridi/Students/blob/master/profile.php разбить на несколько: сваливать все в одну кучу не надо. Также не выводи HTML через echo, используй отдельные файлы-шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html

Также, код вставки студента в БД надо будет сделать с применением паттерна вроде DataMapper (или хотя бы на функциях если ты не знаешь ООП, но я советую его изучить так как он везде требуется и без него тебя никуда не возьмут, у меня есть простой урок по ООП если что). Вот урок про работу с БД с использованием ООП: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

То, что у тебя все написано длинной портянкой это нехорошо конечно.

По базе данных

> `sex` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,


Погугли по слвоам MySQL ENUM

Также, почитай какие есть типы колонок в MySQL:

http://phpclub.ru/mysql/doc/column-types.html (рус, кратко)
http://dev.mysql.com/doc/refman/5.6/en/data-types.html (англ, подробно)

> `groupindex` int(11) DEFAULT NULL,


Номер группы не надо делать числом, вдруг будет группа 2106M или 212-20?

> `birthdate` int(11) DEFAULT NULL,


Тут надо использовать более подходящий тип

Для шаблонов стоит сделать отдельную папку вроде templates, для функций/классов папку lib или app.
#544 #419762
>>419758

И еще. Обычно в базе с помощью NOT NULL помечают обязательные поля, а DEFAULT NULL - те, которые можно не заполнять. У тебя все почему-то помечены как необязательные.
#545 #419770
>>419751

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


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

Про паттерны почитаю, а когда ещё чуток доделаю покажу код, хорошо?
#546 #419771
>>419770

>Все они хранятся в answer


>Все ответы на любые вопросы хранятся в answer.

#547 #419776
>>419770

Ага, я просто сначала подумал что answer — это результат ответа на вопрос студентом. Теперь разобрался.

> а когда ещё чуток доделаю покажу код, хорошо?


Хорошо.
#548 #419792
Слющайте, а можно ведь писать на PHP под десктоп, ну там GUI и вся хуйня. Кто-нибудь делал так? Можете рассказать как мне тоже начать?
#549 #419793
>>419792
троллейбус из хлеба.жпг
#550 #419794
>>419793
Не хочу окунаться в другие языки. Я лучше подтяну ООП в своем любимом пыхе. Все равно не планирую работать на работе никогда.
#551 #419795
>>419792

Есть PHP-GTK но в общем это плохая идея, лучше C++/Qt.
7 Кб, 90x90
#552 #419804
>>419792

То что ты ищешь называется Web Desktop Application. Есть несколько проектов.
Для рисования GUI они используют встроенный браузер который выглядит как обычное окошко. А внутри обычный сервер. Т.е. нужно знать PHP, JS, CSS, HTML.

Вот например

TideSDK http://www.tidesdk.org/ , https://github.com/TideSDK/TideSDK

PhpDesktop https://code.google.com/p/phpdesktop/
#553 #419820
>>419792
Не хочешь юзать крестопарашу? Как я тебя понимаю, друг.
#554 #419821
Пора пилить перекат?
#555 #419823
>>419821
пора бы уже
#556 #419841
>>419760

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


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

>Чем? Поясни. И какой паттерн нравится больше?


Concrete Table Inheritance меня привлекает больше. И с ним будет легче, если я, например, завтра захочу добавить сверху вопросы на восстановление порядка / на соответствие.
А все дерево Тест-Вопрос-Ответы у нас в Yii же легко берется с помощью hasMany/hasOne методов.
Class Table Inheritance тоже катит. Я подумывал запихнуть id ответа, его тип и id вопроса в одну таблицу (и в базовый класс), а все связанное с типом по отдельным таблицам по 1-к-1 связи. Так у нас будет сплошная нумерация айди ответов и будет легко проверять в будущем тесты. Да и варианты ответов можно будет тасовать как угодно, в итоге придется просто сравнить айди выбранных ответов с ответом, а метод для этого запилить, собственно, в родительском абстрактном классе.
#557 #419845
>>419794

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

Вот например только неьольшой с++ faq который стоит знать: http://www.parashift.com/c++-faq/

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

>>419804

Глупо засовывать туда сервер, тем более с PHP. Если уж делать на веб-браузере, то без сервера и PHP, например с помощью Single Page App + прокинуть нужные функции снаружи (и все равно, будет есть память и тормозить если попробуешь сделать что-то сложное). Ты плохие советы даешь.

Разные языки лучше подходят для разных целей. PHP для разработки сайтов, а не десктопных приложений.

>>419821

запилим. Все равно тред весь день висел на главной. Повисим немного на второй странице.

>>419841

> Я для этого и наследую все типы вариантов ответа от абстрактного класса.


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

Насчет выбора схемы — я не наставиваю, ты можешь выбрать любую. Но сначала надо понять ее плюсы/минусы и как ты собираешься с ними бороться. Вообще, ты должен представлять себе плюсы/минусы всех этих 3 схем, иначе как ты можешь сделать выбор?

> Concrete Table Inheritance меня привлекает больше.


Вот ты не пишешь плюсы и минусы. Сложные моменты:

— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION
— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?
— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?

> Class Table Inheritance тоже катит.


Сложные моменты:

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

Варианты решения есть конечно, но я хочу увидеть понимаешь ли ты как это сделать или нет.

> Так у нас будет сплошная нумерация айди ответов


Вот это я не понял. По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.
#557 #419845
>>419794

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

Вот например только неьольшой с++ faq который стоит знать: http://www.parashift.com/c++-faq/

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

>>419804

Глупо засовывать туда сервер, тем более с PHP. Если уж делать на веб-браузере, то без сервера и PHP, например с помощью Single Page App + прокинуть нужные функции снаружи (и все равно, будет есть память и тормозить если попробуешь сделать что-то сложное). Ты плохие советы даешь.

Разные языки лучше подходят для разных целей. PHP для разработки сайтов, а не десктопных приложений.

>>419821

запилим. Все равно тред весь день висел на главной. Повисим немного на второй странице.

>>419841

> Я для этого и наследую все типы вариантов ответа от абстрактного класса.


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

Насчет выбора схемы — я не наставиваю, ты можешь выбрать любую. Но сначала надо понять ее плюсы/минусы и как ты собираешься с ними бороться. Вообще, ты должен представлять себе плюсы/минусы всех этих 3 схем, иначе как ты можешь сделать выбор?

> Concrete Table Inheritance меня привлекает больше.


Вот ты не пишешь плюсы и минусы. Сложные моменты:

— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION
— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?
— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться
— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?

> Class Table Inheritance тоже катит.


Сложные моменты:

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

Варианты решения есть конечно, но я хочу увидеть понимаешь ли ты как это сделать или нет.

> Так у нас будет сплошная нумерация айди ответов


Вот это я не понял. По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.
#558 #419849
>>419845

>По моему в любом из 3 вариантов наследования варианты ответа хранятся в отдельной таблице и нумерация у них и так сплошная.


Ну нет, так как у меня сейчас - нет.

>— для выборки всех вопросов к тесту надо делать либо несколько запросов либо сложный запрос с UNION


Так мы же решили воевать с AR? А там полно методов.

>— как ты будешь хранить порядок следования вопросов? Как изменять его при перестановке вопросов местами и вставке новых?


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

>— не будет единой нумерации id вопросов, id будут в каждой из 4 таблиц свои и будут повторяться


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

>— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?


В таблице из вопроса выше.

>— как будет выглядеть запрос для выборки всех вопросов к тесту?


hasmany(Questions::ClassName(), "id => test_id") как-то так. И соответственно $test->questions.

>— как ты собираешься в такой схеме реализовать связь «вопрос — вариант ответа» на внешних ключах?


Наверное что-то вроде предыдуего.
#559 #419851
>>419849

> Ну нет, так как у меня сейчас - нет.


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

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


На странице редактирования теста есть порядок вопросов и их можно переставлять местами. Не знаю, можно сделать и случайный порядок при прохождении, но все равно, при редактировании теста желательно сохранять порядок, а не перемешивать их случайно каждый раз. Ну и плюс. мы можем захотеть завтра сделать переключение «выводить вопросы случайно/последовательно». Так что порядок, думаю, нужен.

> кк, пилим таблицу для вариантов, в которой будут три поля: id, id вопроса, тип ответа.


А почему «тип ответа» хранится не в вопросе? У нас же вроде есть разные типы вопросов, а не ответов: вопрос с одиночным выбором, вопрос с множественным выбором, вопрос с вводом ответа и т.д.
#560 #419853
>>419851

>Ты не можешь, чтобы не было разногласий, объяснить какие у тебя сейчас (или планируется сделать) сущности, таблицы и как они связаны?


Позже.
#561 #419914
>>419845

>будет есть память



Там же будет лишь один клиент (каждой программой будет пользоваться один юзер). 4 гига памяти и 4 ядра процессора будут доступны одному клиенту. Чему там тормозить ?

> тормозить



Чтобы не тормозил интерфейс с тысячью дивами есть библиотека react.js. Но тысяча дивов это редкость.
#563 #419941
Помню в разделе появлялся кодер, который говорил что отвечает за написание движка борды, где искать его или их? Кто-то тут еще появлялся?
#564 #419942
Есть значит задание тестовое написать блог. Стало быть есть пользователи, посты, и комментарии к постам. Правильно я понимаю, что под все это нужны отдельные таблицы? Пользователи имеют Допустим имя и id, по id пользователя идет привязка к посту, далее по id поста и id пользователя идет привязка к комментариям?
#565 #419959
>>419941

В JS треде вроде

>>419939

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

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

Как в твоей схеме например определить тип вопроса? Он нигде не указан.

Как реализовать вопрос со свободным ответом вроде «напишите свое мнение о творчестве Пушкина»?

Каким запросом можно выбрать все варианты ответа к вопросу?

По моему, ты сделал не очень удобную систему. И запросы к ней получаются сложные, потому непонятно получится ли это реализовать в Юи и не станет ли он все это выбирать запросами в цикле по одному. Да и вручную если надо написать запрос, неудобно.
#566 #419961
>>419939

И как ты планируешь в Yii связи вопрос — ответы прописывать?
!test #567 #419967
Test
!.CzKQna1OU #568 #419968
Test 2
#569 #419978
Создал новый тред, давайте туда переходить: >>419972

Этот тред закрыт.
Eclipse Mymik #570 #420912
Чуваки обьясните что такое eclipse эта штука вроде бы для java
#571 #426731
Аноны поясните за setlocale.
Использую сборку open server самую расширеную, при попытке вывода даты на кириллице, выводится в виде кракозябр, как исправить? Гугл говорит, что нужно с локалью что-то делать, как решить проблему? Заранее благодарю
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 24 января 2015 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски