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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
33 Кб, 500x500
Клуб любителей изучать PHP #29 !xnn2uE3AU. #373424 В конец треда | Веб
Привет. В этом ИТТ треде мы все еще изучаем PHP (и некоторые другие языки для веба), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то хочет изучить этот язык, кто-то хочет просто размять мозги и заняться чем-то полезным.

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

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

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

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

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

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

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

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

Мануал по PHP — http://www.php.net/manual/ru/langref.php
Начинающим: Никсон Р. - Создаем динамические веб-сайты с помощью PHP (аноны говорят, она не очень хорошая)
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213

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

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

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

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

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

В общем, давайте начинать уже!
56 Кб, 500x644
Пиши красиво !xnn2uE3AU. #2 #373425
Побежал писать код? Стой, прочти сначала этот пост.

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

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

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

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

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

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

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

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

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

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


if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}


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


function bakeCookies(...)
{
// ...
}


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

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

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
56 Кб, 500x644
Пиши красиво !xnn2uE3AU. #2 #373425
Побежал писать код? Стой, прочти сначала этот пост.

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

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

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

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

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

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

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

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

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

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


if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}


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


function bakeCookies(...)
{
// ...
}


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

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

http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
#3 #373440
Очень показательный тред. Сколько он уже живёт?
#4 #373441
http://ideone.com/4a4nhp
ОП, зацени задачу на цифры прописью. Я ожидал что она займет у меня пару дней, но вроде справился довольно быстро.
#5 #373443
>>373441
Пока что особо не смотрел, но сразу отмечу:
/* Вызовем функцию несколько раз */
$amount1 = 51111111;
$text1 = numberToText($amount1);

echo "На вашем счету {$text1}\n";

$amount2 = mt_rand(1, 99999999);
$text2 = numberToText($amount2);

echo "На вашем счету {$text2}\n";

$amount3 = mt_rand(1, 99999999);
$text3 = numberToText($amount3);

echo "На вашем счету {$text3}\n";

$amount4 = mt_rand(1, 99999999);
$text4 = numberToText($amount4);

echo "На вашем счету {$text4}\n";

Будь ты проклят, блядь.
#6 #373444
>>373443
Что??? Я не уловил ход твоих мыслей.
#8 #373447
>>373446
Я этот код не менял вообще, кроме переменной amount1, всё это было в первоначальном коде.
#9 #373464
Оп, есть вопрос. Пилю по-тихонечку многопользовательский сервис менеджер задач. Есть юзеры,юзер может создавать задачи, у задач есть категории. Очевидно у сущностей юзер - задача должна быть связь 1 ко многим. Кроме того у сущностей категория - задача то же самое. А как быть с отношением категория - юзер? Здесь я вижу два варианта:
1) связь many to many то есть, например, категория "Работа" может быть у многих юзеров. У юзера может быть несколько категорий задач.

2) Каждая категория в таблице категорий привязана к конкретному юзеру т.е. связь юзер - категория 1 - много.

Какой вариант лучше?
#11 #373474
#12 #373501
Сап, делаю Grammar Nazi задачу, как в сообщение об ошибке вывести именно слово в котором ошибка, а не всю фразу ? http://ideone.com/XWOgIa
#13 #373506
>>373501
Прочитай "Проверка на соответствие шаблону и выделение частей", это прямо над текстом задачи.
#14 #373510
http://jsbin.com/harira/7/edit?js,console

Только мне тут константы опять не нужны.
#15 #373514
Оп, привет. Ты давал мне макет сверсать (>>372518), сверстал тот, который первый. Говорил на github pages залить, я попробовал. Но, судя по всему, что-то не так сделал. В общем, вот ссылка: https://github.com/infinitecats/infinitecats
#16 #373515
>>373506
Сделал, но теперь, если в тексте больше чем одна ошибка, код выдаёт только одну
#17 #373516
>>373515
preg_match_all
я кстати так и не разобрался в чем там у тебя была ошибка, хотя сам давно сделал эту задачу. Весьма странно
#18 #373518
>>373516
Спасибо. То что получается куча пустых элементов в массиве нормально или их нужно убрать ?
#19 #373519
>>373518
Все скобки убери, кроме первой и последней. Ну или можешь не убирать, хотя лучше наверное убрать, очень уж огромный массив.
#20 #373539
PHPняши, смотрю вакансии своего мухосранска, и в части из них требуется "знание cms". Что они от меня хотят? Понимание структур популярных кмс вроде друпала, вордпресса, джумлы?
#21 #373543
Спалил в прошлом треде простенькие задачки на js http://jsfiddle.net/VJvw4/ задача с 1 по 6. Рейтаните что ли.
#22 #373548
Блиц-вопрос http://ideone.com/MUJx31 Откуда берется undefined?
#23 #373550
>>373543
var test1_3 = partial(test, undefined, 5);
alert(test1_3(1, 3)); // a=1,b=5,c=3

А вот так-то не работает, c = undefined получается. Чтобы работало приходится дописывать partial(test, undefined, 5, undefined).
#24 #373551
>>373548
Внутри функции выполняется console.log(this.x), а потом ты еще раз запускаешь console.log(testThis());

Два console.log
#26 #373560
>>373551>>373552
Спасибо, от души.
#27 #373563
>>373550
https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>пропущенные аргументы обозначаются с помощью undefined


Вроди так и нужно? Или нет? Ты ОП?
#28 #373564
>>373563
хуёп
#29 #373566
>>373563
В пятой задаче пропущенные с конца аргументы не обозначаются как undefined. Ну я и в шестой задаче так и оставил, а если пропущены аргументы в середине, то соответственно undefined.

неОП
#30 #373570
Тогда такой вариант http://jsfiddle.net/S2tMh/
#31 #373572
>>373570
Нормально. По коду ОП посмотрит.
150 Кб, 1200x793
#32 #373577
Загрузка страничек с двача.
CURL возвращает checking your browser, а дальше как попасть?
sage #33 #373581
кто закрепляющий?
#34 #373593
Оп, я тут подумал, зачем пробельные узлы? Если правильно форматировать код, то firstChild и lastChild всегда будут пробельными узлами. Это явно мешает.
#35 #373594
Как решить задачку про кредит и айфоны, не понимаю.
if ($creditBalance < 5000) {
$monthlyPayment = $creditBalance;
}
Вот это дописал, но там постоянно тысяча лишняя.
sage #36 #373595
>>373594
так ты отнимай эту тысячу в конце
рнр-девелопмент же
#37 #373597
>>373594
там на сколько я помню сначала прибавляются проценты, потом вычитается выплата, следовательно проверку надо делать после надбавки процентов.
1 Кб, 385x23
#38 #373601
Каким образом собирать карту ответов?
При выводе постов регулярным выражением собирать ответы в массив, а затем использовать функцию array_unique()?

И вообще. Разметку накладывать на вводе в БД или на выводе?
#39 #373627
Нужна помощь, аноны

$select = mysql_query("SELECT title FROM albums WHERE user_id=".$_SESSION['id']);

$nv = "albumname";
if($nv==$select){
do_action();
}

Есть простой способ осуществить это? Мне нужно сравнить $nv с данными, полученными из $select, как это осуществить быстро и без смс?
#40 #373637
ну почему я такой тупой. то парился что-бы mysql работала, теперь phpMyAdmin не пойму как поставить. Там видимо так все просто, что даже не написано ничего.
#41 #373638
>>373627
Я нихуя не понял.жпг
Тебе что ли надо выбрать данные по имени альбума?
Ну так и юзай что-то типа "SELECT * FROM albums WHERE user_id=".$_SESSION['id']." and title=".$nv
#42 #373639
>>373638
$rs = mysql_query("SELECT * FROM albums WHERE user_id=".$_SESSION['id']);
while($row = mysql_fetch_array($rs)) {
echo"<td><a href='albums.php?album_name=".$row['title']."' >".$row['title']."</a></td>";
}
$select = mysql_query("SELECT title FROM albums WHERE user_id=".$_SESSION['id']);
print_r(mysql_fetch_array($select));

if (isset($_GET['album_name'])&&($_GET['album_name']==$select)){
$opk = mysql_query("запрос который я еще не придумал");

}

Суть проблемы в том, что я хочу получить картинки из одного конкретного альбома, в который я захожу, переходя по одной из ссылок в списке альбомов.
Надеюсь, я понятно объясняю
#43 #373640
Хуйня какая-то у тебя выходит, бро.
Во-первых, title - это unique или нет?
Во-вторых, сравнивать тебе надо не с $select, а как-то так:

$r = mysql_query("SELECT title FROM albums WHERE user_id=".$_SESSION['id']);

$row = mysql_fetch_assoc($r);

if($row['title'] === "huita") ....
#44 #373641
ПС: если есть втентаклик - скинь, могу дать пару полезных или не оче советов. Всё равно скучно.
#45 #373642
>>373641
Отличная идея, то что нужно, спасибо бро.
id179633287
#46 #373661
>>373642
аноны я задам тупой вопрос, но без этого никак
Вот скажите как вы запоминаете столько символов?
Как вы запоминаете где и как их ставить?
Ну например где какую скобочку ставить где нет, где перед словом ставить апостроф где нет, где применять равно, нижний пробел, где просто слово написать
Хоть убей я не могу понять как вы это помните, это же нереально знать. Вы что гении?
820 Кб, 1024x768
#47 #373663
>>373661
сублимайн подсказывает
#48 #373665
>>373661
пиши код немного подглядывая где что ставить, со временем запомнится
#49 #373666
>>373665
Сколько слов, кодов, символов нужно выучить, чтобы писать на пхп?
Можно ли на пхп написать оконную программу?
Можно ли написать программу, которая на сайте делает дополнительное окошко с тема вариантами, каждый из которых делает определённое действие?
Если я средний человек, то долго ли нужно учить пхп, чтоб хоть 100долларов в месяц нафрилансить?
#50 #373667
>>373666
Это весьма относительное понятие, ты можешь выучить, к примеру, синтаксис команды echo и уже написать приложение, выводящее текст на экран. Думаю, стоит разобраться в базовых вещах вроде переменных, циклов, условий, а потом осваивать базовый функционал стандартной библиотеки php. И , конечно же, одновременно с этим писать код, чтобы всё в голове усвоилось. Попробуй для начала посмотреть http://archive-ipq-co.narod.ru .

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

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

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

>1) PHP


>2) Ставим Апач, изучаем основы HTML (HTML — язык разметки, который позволяет добавлять в текст теги. Веб-страницы пишутся на HTML), и как PHP можно использовать на сервере


>3) Изучаем основы CSS (CSS — язык стилей, задающий оформление и внешний вид элементов на странице), решаем простые задачки на CSS из моего учебника или любого другого


>4) Изучаем основы баз данных, например MySQL


>5) Делаем задание на файлообменник ( https://gist.github.com/codedokode/9424217 ), заодно изучаем микрофреймворк Slim


>5) Изучаем основы JS


>6) Если есть пробелы в знаниях, делаем дополнительные задания


>7) Изучаем twig


>8) Изучаем какой-нибудь большой фреймворк, вроде Symfony 2 или Yii


>


>Вот как-то так. Тебе этого минимум на полгода хватит.

#51 #373668
>>373666
>>373667
Есть различные компиляторы (http://php-compiler.net/, например), но зачем? Лучше уж тот же C# использовать.
102 Кб, 766x936
#52 #373678
Здравствуйте анонимусы.

ОП, можно ли данную конструкцию запихнуть в switch лаконичности ради?
http://ideone.com/w4eGOB

Интуиция говорит - да, можно. Но ума не хватает, чтобы сообразить как это сделать. А если нельзя, то как сократить так чтобы быстрее выполнялось? А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.
#53 #373679
>>373678
А не легче ли сразу http://ideone.com/n8BQ2Q?
#54 #373680
>>373679
Если что-то не указано - будет дырка. Обязательные поля - улица и дом, остальное может быть пропущено.
#55 #373681
>>373680
Можешь сделать пару условий, а в случае успеха интерполировать.
#56 #373682
>>373681
Атъебись. Твой код - говно, а ты мудак, потому что нихуя не понимаешь, но лезешь. Интерполировать блять ему.
#57 #373684
>>373678
Попробуй как-то так http://ideone.com/HKH9QX
#58 #373685
>>373682
а ты знаешь что у тебя будет если скрипт не найдёт какой-нибудь ключ?
#59 #373688
>>373684
Круто! Спасибо. Пойду осиливать такой способ.
#60 #373705
>>372506

№1
Я перечитал две главы в учебнике(http://learn.javascript.ru/closures, http://learn.javascript.ru/closures-usage), но что-то все равно не осиливаю это задание. Вот объясни, во второй ссылке в самом первом коде, почему переменная currentCount не обнуляется? Там же в начале функции стоит var currentCount = 0.

№2
jsbin.com/cehaqigo/1/edit?js,console, теперь вроде работает.

№3
jsbin.com/dodeqese/1/edit?js,console, поправил.

5, 6, 7 - вообще не знаю как делать.

№8
jsbin.com/noxiguvi/3/edit?js,console, поправил.

№9
jsbin.com/mefeholu/1/edit?js,console, поправил.

№11
jsbin.com/sutoxaje/1/edit?js,console, поправил.

С объектами вообще не представляю что делать. Хотя в твоем учебнике я вроде бы делал пару заданий. И в js пару глав об объектах прочитал.
78 Кб, 500x557
!xnn2uE3AU. #61 #373709
>>373440

Больше года уже

>>373441

> $lastd < 10 || $lastd > 20)


Проще это было первой веткой сделать в if, чем постоянно проверять

> $words = $word1;


Можно сразу писать return $word1;

> $hund1 =


Чичло десятков логично назать tens, а то читать код очень тяжело с такими именами как hund, hund1, hund2. Вместо hund лучше кстати писать hundreds, вместо tho — thousands. Если ты используешь редактор кода, то там обычно есть автодополнение и длинные имена не надо писать вручную.

> if ($mod == 1 && ($last2d < 11 || $last2d > 20)) {


> $mod = 1;


> $word = "тысяча";


> } elseif ($mod == 2 && ($last2d < 11 || $last2d > 20)) {


Ты дублируешь тут код из inclineWord(). Не надо этого делать.

> $text = smallNumberToText($thou, $mod) . " $word " . smallNumberToText($number, 0) . " " . inclineWord($number, "рубль", "рубля", "рублей");



Вместо этой длинной строки удобнее добавлять слова по частям:

если (в слове есть миллионы) {
добавить число миллионов;
}

Также, можно добавлять слова не в строку, а в массив, а в конце склеивать в строку.
78 Кб, 500x557
!xnn2uE3AU. #61 #373709
>>373440

Больше года уже

>>373441

> $lastd < 10 || $lastd > 20)


Проще это было первой веткой сделать в if, чем постоянно проверять

> $words = $word1;


Можно сразу писать return $word1;

> $hund1 =


Чичло десятков логично назать tens, а то читать код очень тяжело с такими именами как hund, hund1, hund2. Вместо hund лучше кстати писать hundreds, вместо tho — thousands. Если ты используешь редактор кода, то там обычно есть автодополнение и длинные имена не надо писать вручную.

> if ($mod == 1 && ($last2d < 11 || $last2d > 20)) {


> $mod = 1;


> $word = "тысяча";


> } elseif ($mod == 2 && ($last2d < 11 || $last2d > 20)) {


Ты дублируешь тут код из inclineWord(). Не надо этого делать.

> $text = smallNumberToText($thou, $mod) . " $word " . smallNumberToText($number, 0) . " " . inclineWord($number, "рубль", "рубля", "рублей");



Вместо этой длинной строки удобнее добавлять слова по частям:

если (в слове есть миллионы) {
добавить число миллионов;
}

Также, можно добавлять слова не в строку, а в массив, а в конце склеивать в строку.
!xnn2uE3AU. #62 #373711
>>373443

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

>>373464

> А как быть с отношением категория - юзер?


Оно не нужно. зачем?

>>373501

> как в сообщение об ошибке вывести именно слово в котором ошибка, а не всю фразу


preg_match_all заполняет массив $matches найденными фразами, надо в нем разобраться и выводить строки из него. как именно заполняется массив, написано в мануале: http://php.net/manual/ru/function.preg-match-all.php

> \\[а-я]


Что это \\[ экранирует скобку и лишает ее специального значения. Вместо этого она теперь значит «ищи квадратную скобку в тексте».

> зделал|зделаю|зделан


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

> [а-я][А-Я]


Почему ты хочешь чтобы сначала шли маленькие буквы, а за ними большие? Если ты хотел написать «любые буквы» то надо писать [а-яА-Я] или добавить в конце регулярки флаг i (игнорировать регистр символов)

> [а-я][А-Я]


Это постоянно повторяется — подумай, как вынести отдельно, чтобы повторов не было
!xnn2uE3AU. #62 #373711
>>373443

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

>>373464

> А как быть с отношением категория - юзер?


Оно не нужно. зачем?

>>373501

> как в сообщение об ошибке вывести именно слово в котором ошибка, а не всю фразу


preg_match_all заполняет массив $matches найденными фразами, надо в нем разобраться и выводить строки из него. как именно заполняется массив, написано в мануале: http://php.net/manual/ru/function.preg-match-all.php

> \\[а-я]


Что это \\[ экранирует скобку и лишает ее специального значения. Вместо этого она теперь значит «ищи квадратную скобку в тексте».

> зделал|зделаю|зделан


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

> [а-я][А-Я]


Почему ты хочешь чтобы сначала шли маленькие буквы, а за ними большие? Если ты хотел написать «любые буквы» то надо писать [а-яА-Я] или добавить в конце регулярки флаг i (игнорировать регистр символов)

> [а-я][А-Я]


Это постоянно повторяется — подумай, как вынести отдельно, чтобы повторов не было
!xnn2uE3AU. #63 #373713
>>373539

Зависит от компании, это может значить умение:

— пользоваться этими ЦМС и жать мышкой в админке
— делать под эти CMS шаблоны и устанавливать плагины
— писать свои плагины или дорабатывать существуюшие

В общем-то решается установкой этих CMS и чтением документации. Там обычно 2 вида документации — для пользователей и для разработчиков.

>>373543

> var result = start;


> start += step;


> return result;


Зачем используется переменная result?

> var start = arguments[0] || 0;


Абсолютно нечитабельно. Лучше тут использовать нормальный аргумент функции вместо arguments[0].

> for(var arg in arg_closure){


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

Я советую тебе внимательно прочитать про устройство массивов и словарей (объектов) в JS. В частности, массив — это объект, у которого поля имеют имена 0, 1, 2 ... и у которого особым образом обрабатывается свойство length.

> if(arg_closure[arg] == undefined){


> arg_closure[arg] = arguments[index++];


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

> arg_closure[arg] == undefined


Равенство надо переделать на ===. Прочти почему: http://javascript.ru/basic/operators#sravnenie

>>373548

Если в функции нет return то по умолчанию она возвращает undefined:

function t() {}
console.log(t()); // undefined
!xnn2uE3AU. #63 #373713
>>373539

Зависит от компании, это может значить умение:

— пользоваться этими ЦМС и жать мышкой в админке
— делать под эти CMS шаблоны и устанавливать плагины
— писать свои плагины или дорабатывать существуюшие

В общем-то решается установкой этих CMS и чтением документации. Там обычно 2 вида документации — для пользователей и для разработчиков.

>>373543

> var result = start;


> start += step;


> return result;


Зачем используется переменная result?

> var start = arguments[0] || 0;


Абсолютно нечитабельно. Лучше тут использовать нормальный аргумент функции вместо arguments[0].

> for(var arg in arg_closure){


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

Я советую тебе внимательно прочитать про устройство массивов и словарей (объектов) в JS. В частности, массив — это объект, у которого поля имеют имена 0, 1, 2 ... и у которого особым образом обрабатывается свойство length.

> if(arg_closure[arg] == undefined){


> arg_closure[arg] = arguments[index++];


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

> arg_closure[arg] == undefined


Равенство надо переделать на ===. Прочти почему: http://javascript.ru/basic/operators#sravnenie

>>373548

Если в функции нет return то по умолчанию она возвращает undefined:

function t() {}
console.log(t()); // undefined
!xnn2uE3AU. #64 #373715
>>373563

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

var fn = partial(test, undefined, 2);
fn(1, 3, 4, 5, 6, 7);// все вместе должно передаваться как 1, 2, 3, 4, 5, 6, 7

>>373570

> for(var arg in arguments){


Неандежно. for in не гарантирует порядок перебора (так как в объекте поля могут храниться в любом порядке, это тебе не PHP).

не пропускай точку с запятой после команд.

> for(var arg in arguments){


> fu_arg.push(arguments[arg])


Тут так же можно исплоьзовать трюк со [].slice

> return fu.apply(null,


Лучше fu.apply(this, ... чтобы this передавался в функцию

> function bind(fu, obj)


> return function()


> return fu.apply(obj);


В функцию fu не передаются аргументы.
!xnn2uE3AU. #64 #373715
>>373563

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

var fn = partial(test, undefined, 2);
fn(1, 3, 4, 5, 6, 7);// все вместе должно передаваться как 1, 2, 3, 4, 5, 6, 7

>>373570

> for(var arg in arguments){


Неандежно. for in не гарантирует порядок перебора (так как в объекте поля могут храниться в любом порядке, это тебе не PHP).

не пропускай точку с запятой после команд.

> for(var arg in arguments){


> fu_arg.push(arguments[arg])


Тут так же можно исплоьзовать трюк со [].slice

> return fu.apply(null,


Лучше fu.apply(this, ... чтобы this передавался в функцию

> function bind(fu, obj)


> return function()


> return fu.apply(obj);


В функцию fu не передаются аргументы.
!xnn2uE3AU. #65 #373716
>>373577

Это защита cloudflare от ботов, которая видимо яваскриптом, а может как-то еще, проверяет что это браузер. Один из вариантов — использовать чистый Ip-адрес который клаудфлер не считает подозрительным. Другой вариант, с помощью браузера пройти проверку, сохранить куки и прописать их с твой скрипт.

>>373593

1) чтобы текст не слипался, например в случае <span>hello</span> <span>world</span>

2) чтобы можно было загрузить HTML в DOM, а потом выгрузить и не потерять форматирование

> Это явно мешает.


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

>>373594

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

>>373601

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

> Разметку накладывать на вводе в БД или на выводе?


С т.з. производительности выгоднее при вставке вставлять исходный пост и HTML-версию.

>>373627

Какой страшный код.

1) mysql устарел
2) не подставляй переменные прямо в запрос, используй плейсхолдеры как описано тут например: http://habrahabr.ru/post/137664/ (да, это PDO но суть-то та же).

> Мне нужно сравнить $nv с данными, полученными из $select,


Не надо, поставь это в WHERE и выбирай сразу нужные данные

>>373637

adminer поставь, он из 1 файла состоит. Или вообещ программу типа sqlYog

>Там видимо так все просто, что даже не написано ничего.


На сайте или в архиве должен быть раздел Installation или файл INSTALL и в нем все описано. Ты же и не искал. Естсевтенно, я говорю про официальный сайт, а не левую файлопомойку, где он тоже выложен. Вот я с первой попытки нашел набрав в гугле «phpmyadmin installation»: http://docs.phpmyadmin.net/en/latest/setup.html
!xnn2uE3AU. #65 #373716
>>373577

Это защита cloudflare от ботов, которая видимо яваскриптом, а может как-то еще, проверяет что это браузер. Один из вариантов — использовать чистый Ip-адрес который клаудфлер не считает подозрительным. Другой вариант, с помощью браузера пройти проверку, сохранить куки и прописать их с твой скрипт.

>>373593

1) чтобы текст не слипался, например в случае <span>hello</span> <span>world</span>

2) чтобы можно было загрузить HTML в DOM, а потом выгрузить и не потерять форматирование

> Это явно мешает.


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

>>373594

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

>>373601

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

> Разметку накладывать на вводе в БД или на выводе?


С т.з. производительности выгоднее при вставке вставлять исходный пост и HTML-версию.

>>373627

Какой страшный код.

1) mysql устарел
2) не подставляй переменные прямо в запрос, используй плейсхолдеры как описано тут например: http://habrahabr.ru/post/137664/ (да, это PDO но суть-то та же).

> Мне нужно сравнить $nv с данными, полученными из $select,


Не надо, поставь это в WHERE и выбирай сразу нужные данные

>>373637

adminer поставь, он из 1 файла состоит. Или вообещ программу типа sqlYog

>Там видимо так все просто, что даже не написано ничего.


На сайте или в архиве должен быть раздел Installation или файл INSTALL и в нем все описано. Ты же и не искал. Естсевтенно, я говорю про официальный сайт, а не левую файлопомойку, где он тоже выложен. Вот я с первой попытки нашел набрав в гугле «phpmyadmin installation»: http://docs.phpmyadmin.net/en/latest/setup.html
!xnn2uE3AU. #66 #373717
>>373639

Ты делаешь все неправильно. Какой смысл 2 раза выбирать одни и те же данные? Можно сохранить то, что тебе надо, в массив.

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

Алсо, эта проверка не имеет никакого смысла:

> ($_GET['album_name']==$select)


$select это не строка, а ресурс (условный идентификатор или число), который указывает на определенный запрос. Его нет смысла с чем-то сравнивать. Его можно только передать в функцию вроде mysql_fetch_array. Ты должен сначала выбрать строку через mysql_fetch... и то, что получишь уже сравнивать.

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


SELECT * FROM images WHERE album_id = ?

Алсо, какой смысл передавать название альбома когда удобнее работать с его id?

>>373640

Не подставляйте переменные в запрос, используйте плейсхолдеры, сколько раз вам объяснять. Это быдлокодский быдлокод, так писать.

>>373661

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

Начинай проходить мой учебник, пости сюда решения задач — и ты тоже научишься со временем.
237 Кб, 1182x887
#67 #373718

>Больше года уже


Добра, ОП.
!xnn2uE3AU. #68 #373719
>>373666

> Сколько слов, кодов, символов нужно выучить, чтобы писать на пхп?


От полгода до года

> Можно ли на пхп написать оконную программу?


По идее можно, но очень неудобно, он не для этого. Оконные программы пишутся на C#/C++/Java (простите меня пользователи его будущей проограммы)/Python + Qt (и вы тоже простите).

Но если «окошко» ты имеешь в виду не то, что на рабочем столе, а то что на сайте, то можно конечно.

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


Конечно. Но это надо не только PHP, а PHP + HTML + JS + CSS

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


Полгода-год. Но это надо не только PHP, а PHP + HTML + JS + CSS + SQL так что скорее год.

>>373667

Он видимо имел в виду окошко на сайте.
#69 #373722
>>373424
Опять говно всплыло. Есть же хаскель и прочие радости жизни, зачем вы учите эту парашу?
!xnn2uE3AU. #70 #373723
>>373678

Нет. Разве что как-то массив с шаблонами фраз прикрутить и по нему циклом пройтись.

> А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.


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

>>373682

Вон отсюда, убогий

>>373684

> PHP Notice: Undefined variable: result


Это бы еще исправить.

>foreach(array_keys($address) as $key)


foreach ($prefixes as $key => $prefix) по моему будет проще
!xnn2uE3AU. #70 #373723
>>373678

Нет. Разве что как-то массив с шаблонами фраз прикрутить и по нему циклом пройтись.

> А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.


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

>>373682

Вон отсюда, убогий

>>373684

> PHP Notice: Undefined variable: result


Это бы еще исправить.

>foreach(array_keys($address) as $key)


foreach ($prefixes as $key => $prefix) по моему будет проще
!xnn2uE3AU. #71 #373724
>>373722

Ну так возвращайся в свой уютный гадюшник и радуйся жизни, что ты тут забыл?

>>373705

> Вот объясни, во второй ссылке в самом первом коде, почему переменная currentCount не обнуляется? Там же в начале функции стоит var currentCount = 0.


Ну так в самом начале она равна нулю. А потом увеличивается на один командой currentCount++; при каждом вызове внутренней функции.

> };


Тут не надо ставить точку с запятой. То есть если у нас определение функции, for, if, то после блока кода в {} скобках не надо ставить точку с запятой.

> №2


> arr[i - 1] = func();


Не надо так, используй arr.push()

> №3


> arr =


Используй push()

> 5, 6, 7 - вообще не знаю как делать.


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

Для задачи 7 почитай про Function#apply и Function#call

!xnn2uE3AU. #71 #373724
>>373722

Ну так возвращайся в свой уютный гадюшник и радуйся жизни, что ты тут забыл?

>>373705

> Вот объясни, во второй ссылке в самом первом коде, почему переменная currentCount не обнуляется? Там же в начале функции стоит var currentCount = 0.


Ну так в самом начале она равна нулю. А потом увеличивается на один командой currentCount++; при каждом вызове внутренней функции.

> };


Тут не надо ставить точку с запятой. То есть если у нас определение функции, for, if, то после блока кода в {} скобках не надо ставить точку с запятой.

> №2


> arr[i - 1] = func();


Не надо так, используй arr.push()

> №3


> arr =


Используй push()

> 5, 6, 7 - вообще не знаю как делать.


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

Для задачи 7 почитай про Function#apply и Function#call

!xnn2uE3AU. #72 #373729
>>373705

> №8


То же самое, исплоьзу push, а то будут дырки в массиве

> 9


> if ( func(input) ) { res.push(input) };


Не надо экономить место на переносах строк. А так, сделано верно.

> №11



> if (x[1] > y[1]) {


Лучше наверно исплоьзовать ключи с названием, вроде x.population, будет гораздо читабельнее.

Программа просто выводит первые несколько записей из списка, не проверяя население города.

Вместо prompt наверно лучше просто переменную в код вписать, а то замучаешься вводить числа.

> С объектами вообще не представляю что делать. Хотя в твоем учебнике я вроде бы делал пару заданий. И в js пару глав об объектах прочитал.



Про прототипы читал? Про ООП тут: http://javascript.ru/tutorial/Object читал?

#73 #373733
Кстати, ОП, у тебя в гайде что-то говорится про второй уровень, но там всего 1 уровень.
!xnn2uE3AU. #74 #373742
>>373733

Он пока не сделан. Если ты прошел учебник, то попроси дополнгительные задачки. Вон у нас их сколько разных есть: https://gist.github.com/codedokode/
#75 #373772
Анон, выручай.
Есть небольшой опыт на пыхе, думал даже в свое время угореть по yii, но как-то не взлетело.
Сейчас стоит задача переписать одну вьюшечку(не знаю, как это по-другому назвать) MVC-пыха-приложения, так чтобы бы она стала МАКСИМУМ интерактивной.

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

Из того что нашел в этих ваших интерентах: http://webix.com/ http://www.jqwidgets.com/ http://qooxdoo.org/ Но я не могу оценить их сложность в освоении. Хотя webix пока что выглядит самым няшным.
#76 #373774
Котоны, что лучше выводить каждый раз эцхо или накапливать в строковой переменной и потом один раз на блок ее вывести?
Со строками, мне кажется, гораздо читабельней.
sage #77 #373776
>>373774

> php


> читабельней


manya, pls
#78 #373779
Оп посмотри пожалуйста задачку для продвинутых.
Более простого я придумать не смог.
http://ideone.com/gshZBC
#79 #373791
>>373776
По делу есть чо?
sage #80 #373792
>>373791

> php


> делo


manya, pls
#81 #373793
>>373510
ОП, ведь пропустил.
#82 #373795

>Клуб любителей изучать PHP


звучит как "Клуб любителей пощекотать очко"
#83 #373796
>>373795
Педрильный клуб любителей пощекотать очко
sage #85 #373807
sage #86 #373817
>>373802
((
закрывай скобки , сукаа
sage #87 #373838
>>373817
да эт смайлики)))
170 Кб, 453x459
#88 #373845
Доброанон, расскажи пожалуйста для глупого как работает __autoload. Откуда он подгружает классы, по каким директориям ищет и вообще как это все устроено, не понимаю
#89 #373847
>>373577
Парси с мобильной версии двача
59 Кб, 800x434
#90 #373876
Я опять выхожу на связь...Вся суть на пике - пользователь вводит в поле textarea больше 3-х параграфов, эта инфа обрезается, заносится в БД и на выходе отображается максимум 3 параграфа. Как на PHP или JS подсчитать кол-во параграфов до отправки в БД а потом обрезать лишнее? А вообще в идеале было бы сразу ввести ограничение на стороне клиента, по типу атрибута maxlength. Инбифо: юзай регулярки
sage #91 #373877
>>373876
take 3
#92 #373878
Сап, пр, вопрос такой:
Как подключить API drupal к стороннему файлу?
#93 #373882
>>373793
Давай уже закончим задачи на ООП, потому что я уже про DOM прочитал. В принципе после TinyDOM читается на одном дыхании. Но боюсь, что долго в памяти не удержу без практики.
!xnn2uE3AU. #94 #373893
>>373772

Angular если оcилишь, или jquery UI? он проще вроде.

>>373774

Каждый раз эхо.

>>373779

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

>>373793

Действительно, пропустил.

> Hamburger.TYPE_SMALL = 'small';


У тебя константа неедоступна до первого вызова функции. Как ее передать в функцию, если ее, константы, изначально нету?

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


Что это за волшебные строки? Тут должны быть константы.

> this.prices = {


> 'small': 50,


> 'big': 100,


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

this.prices нет смысла делать полем объекта так как цены всегда одинаковы. Значит, это должно быть чем-т вроде статического свойства, то есть полем функции Hamburger.

> this.getCost = function() {


> console.log(this


Функция должна возвращать значение, а не выводить что-то.

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

- конструктор получается огромный так как фактиечски все поля и методы создаются в нем. Огромные функции — плохо.
- методы создаются для каждого объекта отдельно, и это нелогично, так как метод вроде getСost общий для всех объектов. Зачем создавать его каждый раз заново? Логичнее создать его на прототипе объекта Hamburger.

Там в учебнике вроде есть статья про прототипный ООП:

http://javascript.ru/tutorial/object/inheritance
http://designformasters.info/posts/objectifying-javascript/
http://bonsaiden.github.io/JavaScript-Garden/ru/
http://habrahabr.ru/post/132698/
http://habrahabr.ru/post/150730/
http://habrahabr.ru/post/151070/

>>373882

Я бы и не против, но в JS с ООП ты явно не разобрался еще, даже задачу про гамбургер не сделал. Или ты про PHP?

Кстати, если ты доделал TinyDOM, то покажи его на проверку. И переходи к XPAth, с помощью которого можно искать элементы в DOM (например для скрейпинга данных из веб-страниц).

Мануал по основам Xpath: http://zvon.org/xxl/XPathTutorial/General_rus/examples.html
!xnn2uE3AU. #94 #373893
>>373772

Angular если оcилишь, или jquery UI? он проще вроде.

>>373774

Каждый раз эхо.

>>373779

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

>>373793

Действительно, пропустил.

> Hamburger.TYPE_SMALL = 'small';


У тебя константа неедоступна до первого вызова функции. Как ее передать в функцию, если ее, константы, изначально нету?

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


Что это за волшебные строки? Тут должны быть константы.

> this.prices = {


> 'small': 50,


> 'big': 100,


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

this.prices нет смысла делать полем объекта так как цены всегда одинаковы. Значит, это должно быть чем-т вроде статического свойства, то есть полем функции Hamburger.

> this.getCost = function() {


> console.log(this


Функция должна возвращать значение, а не выводить что-то.

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

- конструктор получается огромный так как фактиечски все поля и методы создаются в нем. Огромные функции — плохо.
- методы создаются для каждого объекта отдельно, и это нелогично, так как метод вроде getСost общий для всех объектов. Зачем создавать его каждый раз заново? Логичнее создать его на прототипе объекта Hamburger.

Там в учебнике вроде есть статья про прототипный ООП:

http://javascript.ru/tutorial/object/inheritance
http://designformasters.info/posts/objectifying-javascript/
http://bonsaiden.github.io/JavaScript-Garden/ru/
http://habrahabr.ru/post/132698/
http://habrahabr.ru/post/150730/
http://habrahabr.ru/post/151070/

>>373882

Я бы и не против, но в JS с ООП ты явно не разобрался еще, даже задачу про гамбургер не сделал. Или ты про PHP?

Кстати, если ты доделал TinyDOM, то покажи его на проверку. И переходи к XPAth, с помощью которого можно искать элементы в DOM (например для скрейпинга данных из веб-страниц).

Мануал по основам Xpath: http://zvon.org/xxl/XPathTutorial/General_rus/examples.html
!xnn2uE3AU. #95 #373896
>>373845

Когда происходит обращение к несуществущему классу, например:

$x = new SomeClass();
$x = SomeClass::CONSTANT;
if (class_exists('SomeClass')) { ...

то PHP проверяет: есть ли функция _ _ autoload? Если нет, то он падает с ошибкой («обращение к несущесвтующему классу»). Если есть, то он сначала вызываает эту функцию и передает ей имя класса, чтобы она его загрузила. Если она его загрузит, то выполнение программы продолжается, если нет то вываливается ошибка.

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

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

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

> Откуда он подгружает классы, по каким директориям ищет и


Как ты напишешь, так и будет искать.

>>373876

Регялярками или explode + array_slice() + implode()

>>373878

Как вызвать функции Друпала из стороннего файла? Для этого надо подгрузить его ядро как описано тут: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_bootstrap/7 — там же есть и пример кода
!xnn2uE3AU. #95 #373896
>>373845

Когда происходит обращение к несуществущему классу, например:

$x = new SomeClass();
$x = SomeClass::CONSTANT;
if (class_exists('SomeClass')) { ...

то PHP проверяет: есть ли функция _ _ autoload? Если нет, то он падает с ошибкой («обращение к несущесвтующему классу»). Если есть, то он сначала вызываает эту функцию и передает ей имя класса, чтобы она его загрузила. Если она его загрузит, то выполнение программы продолжается, если нет то вываливается ошибка.

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

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

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

> Откуда он подгружает классы, по каким директориям ищет и


Как ты напишешь, так и будет искать.

>>373876

Регялярками или explode + array_slice() + implode()

>>373878

Как вызвать функции Друпала из стороннего файла? Для этого надо подгрузить его ядро как описано тут: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_bootstrap/7 — там же есть и пример кода
820 Кб, 1024x768
#96 #373916
Не пойму. Вчера пользовался mysql, сегодня не могу включить сервер через воркбенч. Могу включить через msqld, но входит под пользователем рут без пароля (пароль был) и базы данных не те. Че ж я валенок такой.
#97 #373922
>>373893

>Что это за волшебные строки? Тут должны быть константы.



Да, только если писать так new Hamburger(TYPE_SMALL, FILLING_CHEESE), то выводит ошибку.

>У тебя константа неедоступна до первого вызова функции. Как ее передать в функцию, если ее, константы, изначально нету?



Сделать функцию по типу (function() {})() ?

>Опять же, тут какие-то волшебные строки, а должны быть константы.



Опять же ошибки выдает TYPE_SMALL: 50,..

>доделал TinyDOM



Не доделал. Очень мало времени стало. Только вечером успеваю порешать задачи. Мы же решили пока на js остановиться.
#98 #373926
>>373514
Не знаю, ОП, может ты не заметил, а может у тебя много работы, на всякий случай бамп.
#99 #373930
>>373893

>Каждый раз эхо.


Обосновать сможешь?
#100 #373938
>>373729

>Ну так в самом начале она равна нулю. А потом увеличивается на один командой currentCount++; при каждом вызове внутренней функции.


Я не понимаю, там, когда вызывается функция makeCounter() в начале происходит же обнуление currentCount, а потом увеличение на 1. И как получается так, что переменная currentCount не обнуляется, а сохраняется?

№2. http://jsbin.com/cehaqigo/3/edit

№3. http://jsbin.com/dodeqese/2/edit

№8. http://jsbin.com/noxiguvi/4/edit

№11. Надо переделать как-то?
#101 #373947
ОП, напиши пожалуйста мне задание на php без использования фреймворков, но чтобы была необходимость использовать ООП. Хочу попробовать MVC использовать.
#103 #373956
>>373954

/* Делает первую букву в строке заглавной */
function makeFirstLetterUppercase($text) {
$array = preg_split("/ *[.] */", $text, null, PREG_SPLIT_NO_EMPTY);
foreach($array as $key => $value){
$firstLetter = mb_strtoupper(mb_substr($value, 0, 1));
$txt = $txt.$firstLetter.mb_substr($value, 1).". ";
}
return $txt;
}


Ссу в рот PHP-питухам.
http://ideone.com/rDI3CK
#104 #373959
>>373956
Нахер ты сюда притащил говно не могущее в кириллицу?
http://ideone.com/BE8Iu4
#105 #373961
>>373956
И да петушок, http://ideone.com/Zv4ozy
#106 #373970
$user = new User();
$user->personal_no = 1234;
$user->login = 'somelogin';
$user->email = 'email@example.com';
$user->save();

Это же должно быть в контроллере?
Просто обычно у меня в нем получается еще куча условий, всякие $_GET и $_POST и выходит многобукаф. А я читал, что контроллеры не должны быть толстыми. Или это еще не толстые?
#107 #373972
>>373954
И следующая.
http://ideone.com/Ve04Si
42 Кб, 1115x684
#108 #373973
>>373424
Я не могу, я установил по руководству пхп, нажал старт денвер. Зашел в папку с пхп, вбил туда простую команду, открыл этот файл в фаерфоксе, а оно не работает. Я настолько безрукая бездарность. что даже пхп не могу запустить. Сижу и плачу.
#109 #373975
>>373973

>открыл этот файл в фаерфоксе


Прям взял и открыл файл? Нажал на кнопку "открыть с помощью"? Тогда не мудрено, что он не работает.
#110 #373976
>>373973
Открывай через http://localhost а не через file://
#111 #373977
>>373976
а ну да, заработало. но я все равно уже поплакал и пришел к выводу, что бездарность.
#112 #373978
>>373977
Хочешь, чтобы мы тебя пожалели? Ну хорошо:
я так же объебался в свой первый раз
#113 #373979
>>373977
Жизнь-боль
#114 #373981
>>373938
Потому что мы уже сразу имеем доступ к вложенной функции, проходя мимо currentCount = 0;
#115 #373983
Не могу понять, как в задании с калькулятором мне из переменной извлечь её действие, например умножение и совершить его над другими переменными?
#116 #373991
>>373983
Всё, разобрался.
http://ideone.com/46VDb3 думал калькулятор займет у меня гораздо больше времени чем любое другое задание, но пока самым сложным остаётся задачка на грамматику.
#117 #374001
Спрошу здесь. Как организовать защищенный обмен данными между серверами? Есть мастер-нода, которая раздает подчиненным таски. Дочерние ноды по таскам несколько часов собирают информацию и потом разом отдают на мастер-ноду. Пока я ипользую cron/scp/rsync. Это решение кажется костыльным, но, похоже, самым легковесным. Ноды не слишком мощные, они могут быть, к примеру, дешеыми вдсками или ембеддед сборщиками промышленной телеметрии. За раз (в половину суток) нужно передавать около 50 Мб. Хочу легкого деплоймента с минимумом зависимостей.
#118 #374003
Потсыки, такой вопрос: "Как реализовать роутинг гет запроса?" Имеется простая система подобная этому: http://habrahabr.ru/post/150267/.
Как я понимаю, придется переписывать? Как сделать работающий не кривой вариант? Сейчас лезет в голову идея через if'ы, которая ни к чему хорошему не приведет. Собственно, если есть гет, то вывод (но, блядь, вывод чего? контроллера? какого? или создать файл с отдельным классом где будут правила?)

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

И да, извините, если я совсем дубовый.
#119 #374016
>>373876
Лал. Ты это я. Решал подобную задачу. Прям нарисовал как я. Юзай регулярки.
#120 #374017
>>374016
Кстати, загугли, что такое ТРИЗ. Базарю, ещё захочешь.
#121 #374018
>>373838
((('не ври, липсичка'))) ))
#122 #374041
Я решал задачку с перебором слов. Тестировал регулярки. Браузир от этой хуйни начал зависать. Попробовал прикрутить file_put_contents, чтобы вывод всего говна записывался в файл, но вышел фейл из-за for. Потом вспомнил о консолечке. И, бля, получилось простой командой php5 'yoba.php' < yoba.txt. Я крутой кароч. Ну вы понели.
69 Кб, 1749x370
sage #123 #374044
символично что на рнр больше всего говнокода
29 Кб, 500x375
#124 #374053
>>374044
Обосравшийся с руби мудак, ты опять выходишь на связь?
1094 Кб, 786x515
#125 #374057
>>374053
нет. я мирно учу пхп у вас тут.
#126 #374075
JS задачи 8 9 10 http://jsfiddle.net/SEAyL/ По 11 задаче я не понял как должны выглядеть входные данные - типа список словарей?
#127 #374130
Решил читать вброшенную аноном книгу, Jump Start PHP. Половину вещей опущено, когда говорится, что теперь можно запускать файл, и на картинке так все красиво, когда мы многое еще и не сделали. На картинке это уже сделано. Я тупой и хз как заставить работать. Ну и в книге полно опечаток, то переменные названы неправильно, то скобка пропущена и т.п. Вроде пару дней потратил всего, а чет расстроился, ожидал сейчас проясню многие вопросы, а только запуталось все.
sage #128 #374131
>>374053
второе пришествие шоле?
окрoпил уринoй исускин рoтешник
#129 #374138
>>374044
Символично, что прыщеблядки пресытившись срачами между собой теперь засирают этот раздел на свой убогий манер.
#130 #374179
var_dump($posts);
$posts[0]['content'] = $posts[0]['content'];
var_dump($posts);

Результат:
array(0) { }
array(1) { [0]=> array(1) { ["content"]=> NULL } }

как такое может быть?
#131 #374192
Оп, я тот хер что оптимизирует функцию удаления повторов в скрипте поиска словосочетаний. В общем как то так.
http://ideone.com/RzvMQ5
Правда есть один момент, раньше я перед удалением слова/словосочетания делал проверку на то что оно встречается ровно столько же раз, сколько всего больших словосочетаний частью которого оно является. Типо если оно встречается больше раз, то это уже самостоятельное слово/словосочетание и его надо выводить. Не совсем понятно как организовать такую проверку при данном алгоритме.

>> $canIssue[$sum][0] = $canIssue[$sum - $bill][0] + 1;


>> $billsTmp[$bill] = $canIssue[$sum - $bill][1][$bill];


>Если мы находим более выигрышный вариант, мы меняем элемент 0 в массиве (число купюр), а элемент 1 (остаток) пока не меняем, а меняем число одной-единственной >купюры в billsTmp. Почему? Разве мы не должны взять billsTmp из элемента $canIssue[$sum - $bill][1], вычесть из него 1 купюру и записать в $canIssue[$sum][0]?


>


>Ты уверен, что эта часть написана верно? Я явно вижу, что подход к элементу 0 (число купюр) и 1 (остаток купюр) применяется разный, непонятно почему, так как >они взаимосвязаны и должны менять одновременно.


Да не, проблема тут не в этом, сама идея мне кажется плохой.
http://ideone.com/I65ee9
Взять например такую ситуацию. Сумма 700, 1 - 500 купюра и 1 -200. Алгоритм выдаёт что сумму можно выдать 500 и 200 рублей и вроде все ок, но в переменной $canIssue после завершения работы цикла создающего массив со всеми вариантами находится такая информация - при выдаче 700 рублей у нас остается 0 - 500 купюр и 1 - 200, тогда как обоих должно быть по нулям. На других суммах тоже черт пойми что творится в массиве с остатком купюр. ТАкое ощущения что верно высчитывается только 1 купюра из всех, и фиг знает что с этим делать.
#132 #374194
>>374192
Вот еще ответы по html, css в процессе.
Основы html

1. Стандарт html был создан для удобного хранения и представления информации. С помощью тегов текст можно структурировать не только внешне <p> <pre> <h1> тысячи их, но и эмоционально <strong> <em>.
2. 4.01 и 5
3. ctrl+u
4. Что бы дать понять браузеру на основе какого стандарта ему отображать страницу, фреймы там, xhtml, html5, html4
5. <tag name="value"...></tag> - где tag - имя тега, и некоторое количество параметров - имя = значение, хотя их может и не быть. Открывающий тег <tag>, тег после которого и начинается изменения текста до закрывающего тега </tag>. Самозакрывающийся это например <br> - для него просто нет нужды в закрытии
6. Например цвет color="red" или толщина линии, или размер поля, рамки, отступа и т.д.
7. <!-- --> Комментарии нужны для того что бы проще было понять что черт возьми тут происходит.
8. Какое слово то страшное, а оказывается это аналоги управляющих символов. Нужны для ситуаций когда как текст нужно отобразить какой то спецсимвол используем для разметки, начинается всегда с амперсанда &. & - &amp, < - &lt, > - &gt и т.д.
9. Любое количество пробелов и переносов строки в браузере станет одним пробелом. Для переноса строк надо использовать <br>. Пробелы же вставить с помощью html сущности &nbsp либо использовать тег <pre> который сохранит и переносы и пробелы
if ($a > 0 && $b < 10) {}
(У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно http://jsfiddle.net/W3ZAj/)
if ($a &gt; 0 &amp;&amp; $b &lt; 10) {}
Вроде так. Не припоминаю для каких целей используются {}()$ символы в html. Вроде можно их просто так писать?
10. <a title="&apos;&quot;&lt;test&gt;&quot;&apos;">
11. <b> - жирный текст, <p> - абзац, <h1> - заголовок первого уровня(всего 6), <font> - если нужно например покрасит текст.
12
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>html</title>
</head>
<body>
Me &amp; You
</body>
</html>

13. h1 - заголовок первого уровня, самый большой
p - абзац. Текст отделяется от предыдущего одной строкой
blockqoute - ни разу не сталкивался но и без гугления понял что связан с цитированием.
table - создает таблицу
img - для вставки изображений
ul - unordered list список со всякими кружочками
ol - ordered list - с буковками и циферками(Вот почему я за всю жизнь встречал только один учебник по html где расшифровывались все эти бессмысленные наборы букв типо tr - table row т.д. Вымораживает, ни на htmlbook хваленом, нигде мать его нету нормальной расшифровки. Неужели мне одному кажется намного более простым запомнить сокращение слов имеющих смысл а не непонятный набор букв - tr ol ul, когда вижу такое без расшифровки - хочется автору больно сделать. Ладно побатхертил и пошли дальше отвечать).
14. code - для вставки кода, abbr - для вставки аббревиатур, a - ссылка, sup - верхний индес, sub - нижний индекс, em - курсив(хотя это тег не физической, а логической разметки, можно будет использовать его в речевых браузерах для слепых например), strong - опять же тег логический разметки выражающий ударение на тексте, браузеры отображают так же как и тег b, del - перечеркнутый текст, служит для обозначений удаленного текста, ins - del наоборот, q - первый незнакомый мне тег, но по букве легко угадывается его отношение к цитатам.
15. Вот тут все теги вижу в первые. article - опять же, название и без документации отлично говорит о том для каких целей этот тег - для вставки статей. aside - тег для создания боковой менюшки. dialog - тег который почему то не ищется на htmlbook. Как я понял он нужен для вставки диалогов, хотя выглядит как самый обычный текст, разве что он нужен для логической разметки. section для разбиения статьи на секции. header и footer - теги для оформления в них шапки и подвала страницы. figure - мутный тег какой, групирует элементы внутри себя.
16. Про ol и ul уже рассказывал. li - используется внутри этих тегов для обозначения нового пункта. dt dl dd - используется для создания определений. dl говорит о начале, dt о самом термине, dd - расшифровывает и объясняет термин.
17. table - таблица, как в экселе например. tr - table row создает строку, в которую при помощи td можно напихать сколько угодно яйчеек
18. В теории да. И при обучении - что бы научится создавать страницы в соответствии со стандартами. Но на деле мало какие сайты пройдут валидацию(тот же vk ее не проходит) Связано это с тем что для того что бы страница выглядила так как хочет верстальщик в разных браузерах приходится использовать всякие хаки и костыли.
#132 #374194
>>374192
Вот еще ответы по html, css в процессе.
Основы html

1. Стандарт html был создан для удобного хранения и представления информации. С помощью тегов текст можно структурировать не только внешне <p> <pre> <h1> тысячи их, но и эмоционально <strong> <em>.
2. 4.01 и 5
3. ctrl+u
4. Что бы дать понять браузеру на основе какого стандарта ему отображать страницу, фреймы там, xhtml, html5, html4
5. <tag name="value"...></tag> - где tag - имя тега, и некоторое количество параметров - имя = значение, хотя их может и не быть. Открывающий тег <tag>, тег после которого и начинается изменения текста до закрывающего тега </tag>. Самозакрывающийся это например <br> - для него просто нет нужды в закрытии
6. Например цвет color="red" или толщина линии, или размер поля, рамки, отступа и т.д.
7. <!-- --> Комментарии нужны для того что бы проще было понять что черт возьми тут происходит.
8. Какое слово то страшное, а оказывается это аналоги управляющих символов. Нужны для ситуаций когда как текст нужно отобразить какой то спецсимвол используем для разметки, начинается всегда с амперсанда &. & - &amp, < - &lt, > - &gt и т.д.
9. Любое количество пробелов и переносов строки в браузере станет одним пробелом. Для переноса строк надо использовать <br>. Пробелы же вставить с помощью html сущности &nbsp либо использовать тег <pre> который сохранит и переносы и пробелы
if ($a > 0 && $b < 10) {}
(У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно http://jsfiddle.net/W3ZAj/)
if ($a &gt; 0 &amp;&amp; $b &lt; 10) {}
Вроде так. Не припоминаю для каких целей используются {}()$ символы в html. Вроде можно их просто так писать?
10. <a title="&apos;&quot;&lt;test&gt;&quot;&apos;">
11. <b> - жирный текст, <p> - абзац, <h1> - заголовок первого уровня(всего 6), <font> - если нужно например покрасит текст.
12
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>html</title>
</head>
<body>
Me &amp; You
</body>
</html>

13. h1 - заголовок первого уровня, самый большой
p - абзац. Текст отделяется от предыдущего одной строкой
blockqoute - ни разу не сталкивался но и без гугления понял что связан с цитированием.
table - создает таблицу
img - для вставки изображений
ul - unordered list список со всякими кружочками
ol - ordered list - с буковками и циферками(Вот почему я за всю жизнь встречал только один учебник по html где расшифровывались все эти бессмысленные наборы букв типо tr - table row т.д. Вымораживает, ни на htmlbook хваленом, нигде мать его нету нормальной расшифровки. Неужели мне одному кажется намного более простым запомнить сокращение слов имеющих смысл а не непонятный набор букв - tr ol ul, когда вижу такое без расшифровки - хочется автору больно сделать. Ладно побатхертил и пошли дальше отвечать).
14. code - для вставки кода, abbr - для вставки аббревиатур, a - ссылка, sup - верхний индес, sub - нижний индекс, em - курсив(хотя это тег не физической, а логической разметки, можно будет использовать его в речевых браузерах для слепых например), strong - опять же тег логический разметки выражающий ударение на тексте, браузеры отображают так же как и тег b, del - перечеркнутый текст, служит для обозначений удаленного текста, ins - del наоборот, q - первый незнакомый мне тег, но по букве легко угадывается его отношение к цитатам.
15. Вот тут все теги вижу в первые. article - опять же, название и без документации отлично говорит о том для каких целей этот тег - для вставки статей. aside - тег для создания боковой менюшки. dialog - тег который почему то не ищется на htmlbook. Как я понял он нужен для вставки диалогов, хотя выглядит как самый обычный текст, разве что он нужен для логической разметки. section для разбиения статьи на секции. header и footer - теги для оформления в них шапки и подвала страницы. figure - мутный тег какой, групирует элементы внутри себя.
16. Про ol и ul уже рассказывал. li - используется внутри этих тегов для обозначения нового пункта. dt dl dd - используется для создания определений. dl говорит о начале, dt о самом термине, dd - расшифровывает и объясняет термин.
17. table - таблица, как в экселе например. tr - table row создает строку, в которую при помощи td можно напихать сколько угодно яйчеек
18. В теории да. И при обучении - что бы научится создавать страницы в соответствии со стандартами. Но на деле мало какие сайты пройдут валидацию(тот же vk ее не проходит) Связано это с тем что для того что бы страница выглядила так как хочет верстальщик в разных браузерах приходится использовать всякие хаки и костыли.
#133 #374216
Котаны, если я нулевой, за сколько можно пыху задрочить и насколько устроиться можно в ДС? Алсо, мне почти 30, так что джуниором не возьмут, буду врать про фриланс и работу без оф. трудоустройства.
#134 #374218
>>374216

>мне почти 30, так что джуниором


Лол, я всегда думал что джуниор это твой опыт работы а не возраст.
#135 #374222
>>374216
Я решил совершить марш-бросок за два месяца.
С переменным успехом пока что, лол.
#136 #374243
>>373424
Не подскажите, как вызвать эту функцию? Надо создавать отдельный класс или можно вызвать из другого пхп файла?


private function read_doc() {
$fileHandle = fopen($this->filename, "r");
$line = @fread($fileHandle, filesize($this->filename));
$lines = explode(chr(0x0D),$line);
$outtext = "";
foreach($lines as $thisline)
{
$pos = strpos($thisline, chr(0x00));
if (($pos !== FALSE)||(strlen($thisline)==0))
{
} else {
$outtext .= $thisline." ";
}
}
$outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
return $outtext;
}
#137 #374245
Господа, есть задача: "Спроектировать иерархию классов пассажирского лифта на базе его
основных составляющих и общих принципов их взаимодействия"
Что вы можете посоветовать? Пока из идей есть только мысль сделать два класса: пассажир и лифт.
#138 #374255
>>374245

>иерархию классов пассажирского лифта


Проиграл. Класс "Кабина" с вложеными класами "двери" и "панель с кнопочками" . В "панели с кнопочками" куча вложеных классов "кнопочка" и "динамик". Класс "подъемный механизм", в который также вложены куча "панелек" с "кнопочками" (на каждом этаже).
#139 #374256
>>374255
Да я сам на хую вертел в такой задаче ООП применять, но тестовое есть тестовое.
196 Кб, 595x893
#140 #374335
Анон, помоги пожалуйста. Начал читать Ларри Ульман Основы программирования на РНР 2001 года.
На пике задание, но если лень читать, то я сам могу объяснить. Пишем код:
<Html>
<head>
<title>asd</title>
</head>
<body>
<?php
print "Hello, $Name";
?>
</body>
</html>

Открываем в браузере и видим Hello, . Суть в том, что бы задать переменную $Name в задаче $FirstName, но не суть с помощью метода GET. Добавляем к адресу страницы ?Name=Andrey и должно появиться Hello, Andrey.
Но у меня так и остаётся Hello, . Что я делаю не так? Или же это из-за того, что в книге используют PHP 4.0 и в новых версиях что-то поменялось?
#141 #374338
>>374335
"Hello, {$_GET['name']}";

неоп
#142 #374339
>>374335
Ты ебанутый? Нахуя читать про 4 пых?
#143 #374340
>>374338
Это из-за того, что книжка старая, да?
Перед этим задание тоже похожее было, но там с формой. Я тоже с $_POST['name'] решил, но без {}.
Спасибо.
#144 #374341
>>374340
я не знаю, я третью неделю пых учу, знаю что это делается через супервариаблы. А как работал пых раньше я не знаю
#145 #374342
>>374339
Если коротко, то да, я ебанутый. Я не знал, что они сильно отличаются. Пойду искать что-нибудь поновее.
#146 #374350
Подскажите годный сайт для изучения javascript?
Я уже пхп неплохо знаю, и чувствую острую потребность в изучении джэйэй.
!xnn2uE3AU. #147 #374359
>>373916

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

Насчет пользователей — там вроде может быть несколько пользователей с одним именем и разными паролями. Разберись, сделай например SELECT * FROM mysql.users;

Ну и ты судя по посту начинающий, почему ты начинаешь с ГУИ программы? может, сначала надо консольку освоить, а потом к визуальным средствам переходить, не? Вот тут есть мануал:

http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-2.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

>>373922

> Да, только если писать так new Hamburger(TYPE_SMALL, FILLING_CHEESE), то выводит ошибку.


Конечно, ведь переменной TYPE_SMALL не существует. Ты делаешь неправильно. Константы надо определять как поля функции-конструктора:

function Hamburger(....) {.....}
Hamburger.CONSTANT = 'value';

> Сделать функцию по типу (function() {})() ?


Конечно нет.

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


Ну тогда, конечно, ничего не поделать, потом как-нибудь доделаешь может быть.
#148 #374361
>>374359
переустановил без гуи, все нормально заработало. Тогда реально хрень какая-то была. Под мои пользователем не заходил, анонимно только. В любом случае, уже все норм.
#149 #374364
>>374359

>function Hamburger(....) {.....}


>Hamburger.CONSTANT = 'value';



http://jsbin.com/buzade/2/edit?js,console

Ничего же не изменится, если вынести создание констант вне функции. Просто мысль не могу уловить, что не так.
!xnn2uE3AU. #150 #374368
>>373926
>>373514

Пропустил видимо.

Насчет GH pages, все описано тут: https://help.github.com/articles/user-organization-and-project-pages

Ты можешь создать либо репозиторий с именем username.github.io ,либо в своем существующем репозитории сделать ветку gh-pages, закоммитить туда файлы и обращаться к сайту через username.github.io/projectname. Первый способ наверно проще.

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

forIndex.css − странное название, обычно назают style.css или webpaint.css

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

http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations
http://ianlunn.github.io/Hover/
http://www.inserthtml.com/demos/css/button-styles/
http://www.freshdesignweb.com/css3-buttons.html

Для плоских кнопок подойдет например эффект легкого «вдавливания», «выдавливания», изменение яркости, свечение, может еще что-то.

Для кнопок ALL / GRAPHIC / ILLUSTRATION / MOTION надо сделать чтобы работало переключение, средствами CSS3, например как описано тут: http://habrahabr.ru/post/138020/

> portfolio-pics-sprite.jpg


Использование css-спрайтов — это хорошо. Но этот файл не имеет смысла объединять в спрайт, так как картинки работ скорее всего хранятся по отдельности, а порядок их вывода берется из БД, а не прописан в макете. То есть это часть контента и там логично использовать img src=.... или div + background-image без спрайтов.

> .capabilities:after {


тут по моему лучше сделать класс clearfix и добавить его в html-разметку.

> //специально для пробелов после инлайн-блоков в Safari


В CSS нельзя использовать такие комментарии

> .portfolio .nav {


> display: table;


А ты уверен, что тут нельзя использовать display: block; text-align: center; ? И насчет удаления пробелов, хак с font-size 0 очень плохой, так как работает не везде. Вот статья с описанием других способов: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html

Также, мне кажется тут семантичнее использовать ul/li, а не дивы.

> digital & branding


Надj по моему писать & amp; — http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML

> first-pic


Я бы писал pic-1, pic-2 и т.д, так нагляднее по моему. Но в этом случае индивидуальные классы ни к чему, так как портфолио надо сделать без спрайтов.

> <div class="title">Get in Touch</div>


Тут нужен заголовок <hX>. И в других местах тоже.

> <div class="capabilities">


Тут наверно уместнее сделать списком ul/li, нет?

Слово большими буквами «Webpaint» должно иметь вес 900, а не 700 по моему. Сравни с макетом. «based in Jupiter» должно быть не курсивом, а прямым начертанием. Слово «Fermentum» по моему недостаточно жирное. Блок «Our Featured Works» должен быть на белом фоне, не на бледно-сером. Если сделать окно чуть поуже, например 1024px, то страница не сужается — печалька.

Алсо, валидатор пишет тег title обязателен внутри head.

В ИЕ тестировал? для проверки открыл например в ИЕ8 (знаю, что старый, но CSS2.1 он поддерживает неплохо), и кнопки в портфолио разъезжаются, блоки «capabilities» переносятся на вторую строку, я понимаю, что там круглых уголков нет, но макет-то простой, можно сделать чтобы он не разваливался хотя бы. вот паста в помощь: https://gist.github.com/codedokode/855e3970124687b26a1c
!xnn2uE3AU. #150 #374368
>>373926
>>373514

Пропустил видимо.

Насчет GH pages, все описано тут: https://help.github.com/articles/user-organization-and-project-pages

Ты можешь создать либо репозиторий с именем username.github.io ,либо в своем существующем репозитории сделать ветку gh-pages, закоммитить туда файлы и обращаться к сайту через username.github.io/projectname. Первый способ наверно проще.

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

forIndex.css − странное название, обычно назают style.css или webpaint.css

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

http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations
http://ianlunn.github.io/Hover/
http://www.inserthtml.com/demos/css/button-styles/
http://www.freshdesignweb.com/css3-buttons.html

Для плоских кнопок подойдет например эффект легкого «вдавливания», «выдавливания», изменение яркости, свечение, может еще что-то.

Для кнопок ALL / GRAPHIC / ILLUSTRATION / MOTION надо сделать чтобы работало переключение, средствами CSS3, например как описано тут: http://habrahabr.ru/post/138020/

> portfolio-pics-sprite.jpg


Использование css-спрайтов — это хорошо. Но этот файл не имеет смысла объединять в спрайт, так как картинки работ скорее всего хранятся по отдельности, а порядок их вывода берется из БД, а не прописан в макете. То есть это часть контента и там логично использовать img src=.... или div + background-image без спрайтов.

> .capabilities:after {


тут по моему лучше сделать класс clearfix и добавить его в html-разметку.

> //специально для пробелов после инлайн-блоков в Safari


В CSS нельзя использовать такие комментарии

> .portfolio .nav {


> display: table;


А ты уверен, что тут нельзя использовать display: block; text-align: center; ? И насчет удаления пробелов, хак с font-size 0 очень плохой, так как работает не везде. Вот статья с описанием других способов: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html

Также, мне кажется тут семантичнее использовать ul/li, а не дивы.

> digital & branding


Надj по моему писать & amp; — http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_HTML

> first-pic


Я бы писал pic-1, pic-2 и т.д, так нагляднее по моему. Но в этом случае индивидуальные классы ни к чему, так как портфолио надо сделать без спрайтов.

> <div class="title">Get in Touch</div>


Тут нужен заголовок <hX>. И в других местах тоже.

> <div class="capabilities">


Тут наверно уместнее сделать списком ul/li, нет?

Слово большими буквами «Webpaint» должно иметь вес 900, а не 700 по моему. Сравни с макетом. «based in Jupiter» должно быть не курсивом, а прямым начертанием. Слово «Fermentum» по моему недостаточно жирное. Блок «Our Featured Works» должен быть на белом фоне, не на бледно-сером. Если сделать окно чуть поуже, например 1024px, то страница не сужается — печалька.

Алсо, валидатор пишет тег title обязателен внутри head.

В ИЕ тестировал? для проверки открыл например в ИЕ8 (знаю, что старый, но CSS2.1 он поддерживает неплохо), и кнопки в портфолио разъезжаются, блоки «capabilities» переносятся на вторую строку, я понимаю, что там круглых уголков нет, но макет-то простой, можно сделать чтобы он не разваливался хотя бы. вот паста в помощь: https://gist.github.com/codedokode/855e3970124687b26a1c
!xnn2uE3AU. #151 #374370
>>373930

Проще код получается. Алсо, если ты выводишь HTML-код то надо использовать шаблоны, а не echo.

>>373938

> И как получается так, что переменная currentCount не обнуляется, а сохраняется?


Давай разберем как работает этот код по шагам:


1 function makeCounter() {
2 var currentCount = 0;

3 return function() {
4 currentCount++;
5 return currentCount;
6 };
7 }

8 var counter = makeCounter();
9 counter();


- интерпретатор яваскрипт разбирает текст программы и видит что он состоит из функции (строки 1-7), объявления переменной (var counter = ...) и 2 команд вне функции (8, 9)
- интерпретатор создает функцию makeCounter (строки 1-7)
- интерпретатор создает переменную counter и кладет в нее undefined
- далее, интерпретатор начинает выполнять код. Он видит строку 8, а в ней вызов makeCounter(), потому он начинает выполнять эту функцию
- зайдя в функцию makeCounter, он создает переменную currentCount и присваивает ей 0.
- затем он видит return function () { ... } то есть создание новой функции
- он создает анонимную функцию, описанную в строках 3-7. В момент создания эта функция привязывается к variable object (объекту переменных) родительской функции. В VO как раз хранится переменная currentCount.
- новая анонимная функция создана, и она возвращается с помощью return
- так как перед makeCounter() стоит присваивание, то эта новая функция (точнее, ссылка на нее) записывается в переменную counter.
- в строке 9 есть вызов функции, на которую ссылается counter(). Мы заходим внутрь этой функции, на строку 4
- тут стоит команда увеличения переменной currentCount. Это переменная из родительской функции, она хранится в VO, созхданном при вызове makeCounter, и как мы помним, последний раз ее значение было равно 0. Теперь оно увеличивается до 1.
- в строке 5 мы возвращаем эту единицу
- если мы сделаем еще один вызов counter() то он вернет 2. И так далее.

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

var x = function() {...}
return function() { ...}
function test() { ...}

То к ней привязывается VO родительской функции и она видит переменные, хранящиеся в нем.
!xnn2uE3AU. #151 #374370
>>373930

Проще код получается. Алсо, если ты выводишь HTML-код то надо использовать шаблоны, а не echo.

>>373938

> И как получается так, что переменная currentCount не обнуляется, а сохраняется?


Давай разберем как работает этот код по шагам:


1 function makeCounter() {
2 var currentCount = 0;

3 return function() {
4 currentCount++;
5 return currentCount;
6 };
7 }

8 var counter = makeCounter();
9 counter();


- интерпретатор яваскрипт разбирает текст программы и видит что он состоит из функции (строки 1-7), объявления переменной (var counter = ...) и 2 команд вне функции (8, 9)
- интерпретатор создает функцию makeCounter (строки 1-7)
- интерпретатор создает переменную counter и кладет в нее undefined
- далее, интерпретатор начинает выполнять код. Он видит строку 8, а в ней вызов makeCounter(), потому он начинает выполнять эту функцию
- зайдя в функцию makeCounter, он создает переменную currentCount и присваивает ей 0.
- затем он видит return function () { ... } то есть создание новой функции
- он создает анонимную функцию, описанную в строках 3-7. В момент создания эта функция привязывается к variable object (объекту переменных) родительской функции. В VO как раз хранится переменная currentCount.
- новая анонимная функция создана, и она возвращается с помощью return
- так как перед makeCounter() стоит присваивание, то эта новая функция (точнее, ссылка на нее) записывается в переменную counter.
- в строке 9 есть вызов функции, на которую ссылается counter(). Мы заходим внутрь этой функции, на строку 4
- тут стоит команда увеличения переменной currentCount. Это переменная из родительской функции, она хранится в VO, созхданном при вызове makeCounter, и как мы помним, последний раз ее значение было равно 0. Теперь оно увеличивается до 1.
- в строке 5 мы возвращаем эту единицу
- если мы сделаем еще один вызов counter() то он вернет 2. И так далее.

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

var x = function() {...}
return function() { ...}
function test() { ...}

То к ней привязывается VO родительской функции и она видит переменные, хранящиеся в нем.
!xnn2uE3AU. #152 #374372
>>373938

В учебнике VO называется Lexical Environment.

> №2.


Теперь верно

> №3


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

> №8.


> res.push(arr[property])


Пропущена точка запятой. В JS есть механизм автоматической подстановки точки с запятой, но он сложен и может привести к ошибкам. Лучше ставить этот символ явно.

А так, все верно.

> №11.


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

[
{ name: "Токио", population: 35000000 },
{ name: "xxx", population: NNNN },
....
]

для лучшей читаемости кода ибо city[1] это кошмар.

>>373947

Странное конечно желание избегать фреймворки, но ладно. Итак, вот верстка текстового форума: https://github.com/codedokode/board-markup

Сделай бекенд, чтобы работала отправка постов и создание тредов.

Для работы с БД стоит использовать PDO. Стоит создать объект Пост, стоит создать объект, реализующий паттерн DataMapper, который сможет искать/вставлять посты в БД. Ну и конечно контроллеры и представления для отображения всего этого, роутер для анализа URL запроса.

Потом можно будет, если есть желание, добавить другие фичи:

- постинг картинок и файлов-приложений
- быстрый ответ
- древовидные ответы
- разметка
- модераторские функции
- автообновление треда
!xnn2uE3AU. #152 #374372
>>373938

В учебнике VO называется Lexical Environment.

> №2.


Теперь верно

> №3


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

> №8.


> res.push(arr[property])


Пропущена точка запятой. В JS есть механизм автоматической подстановки точки с запятой, но он сложен и может привести к ошибкам. Лучше ставить этот символ явно.

А так, все верно.

> №11.


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

[
{ name: "Токио", population: 35000000 },
{ name: "xxx", population: NNNN },
....
]

для лучшей читаемости кода ибо city[1] это кошмар.

>>373947

Странное конечно желание избегать фреймворки, но ладно. Итак, вот верстка текстового форума: https://github.com/codedokode/board-markup

Сделай бекенд, чтобы работала отправка постов и создание тредов.

Для работы с БД стоит использовать PDO. Стоит создать объект Пост, стоит создать объект, реализующий паттерн DataMapper, который сможет искать/вставлять посты в БД. Ну и конечно контроллеры и представления для отображения всего этого, роутер для анализа URL запроса.

Потом можно будет, если есть желание, добавить другие фичи:

- постинг картинок и файлов-приложений
- быстрый ответ
- древовидные ответы
- разметка
- модераторские функции
- автообновление треда
!xnn2uE3AU. #153 #374373
>>373954

> foreach($array as $k => $rE){


> $text = preg_replace("/ *[$rE] */", "$rE ", $text);


Неприавльно. Можно же использовать квадратные скобки: [.,!?\\-] чтобы сказать «любой из указанных символов». Чувствую, тебе надо побольше задачек на регулярки порешать.

> $text = preg_replace("/ *$value */u", $replace, $text);


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

Если ты хочешь удалить лишние пробелы, то это достаточно сделать в одном месте в конце или в начале. А не в 3 местах в коде.

>>373959

Оно вроде может, только надо что-то дописать.

>>373970

Это еще не много кода.

> Просто обычно у меня в нем получается еще куча условий, всякие $_GET и $_POST и выходит многобукаф.


Ну так может можно использовать дополнительные функции?

$values = $request->getValues('login', 'email', 'personal_no');
$user->setAttributes($values);

> А я читал, что контроллеры не должны быть толстыми. Или это еще не толстые?


Ты правильно читал. Но под «тостотой» понимается не число строк кода, а объем логики. В этом коде

$user->personal_no = 1234;
$user->login = 'somelogin';
$user->email = 'email@example.com';

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

if (preg_match("/@/ui", $email)) {
$error['email'] = ...;
}

if (empty($name)) {
$error['name'] = 'Не указано имя';
}

надо писать:

if (!$validator->isValid($user)) {
$errors = $validator->getErrors();
...
}
!xnn2uE3AU. #153 #374373
>>373954

> foreach($array as $k => $rE){


> $text = preg_replace("/ *[$rE] */", "$rE ", $text);


Неприавльно. Можно же использовать квадратные скобки: [.,!?\\-] чтобы сказать «любой из указанных символов». Чувствую, тебе надо побольше задачек на регулярки порешать.

> $text = preg_replace("/ *$value */u", $replace, $text);


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

Если ты хочешь удалить лишние пробелы, то это достаточно сделать в одном месте в конце или в начале. А не в 3 местах в коде.

>>373959

Оно вроде может, только надо что-то дописать.

>>373970

Это еще не много кода.

> Просто обычно у меня в нем получается еще куча условий, всякие $_GET и $_POST и выходит многобукаф.


Ну так может можно использовать дополнительные функции?

$values = $request->getValues('login', 'email', 'personal_no');
$user->setAttributes($values);

> А я читал, что контроллеры не должны быть толстыми. Или это еще не толстые?


Ты правильно читал. Но под «тостотой» понимается не число строк кода, а объем логики. В этом коде

$user->personal_no = 1234;
$user->login = 'somelogin';
$user->email = 'email@example.com';

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

if (preg_match("/@/ui", $email)) {
$error['email'] = ...;
}

if (empty($name)) {
$error['name'] = 'Не указано имя';
}

надо писать:

if (!$validator->isValid($user)) {
$errors = $validator->getErrors();
...
}
!xnn2uE3AU. #154 #374375
>>373972

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

> foreach($sentences as $key => $sentence){


Ты не используешь key, потому пиши foreach($sentences as $sentence)

> foreach($words as $key => $word){


> $result = $result." ".$word;


Используй implode() (а заодно прочти и про explode())

> HP Notice: Undefined variable: result in /home/84LAYH/prog.php on line 30


Это надо исправить -— обращение к несуществующей переменной

> function makeFirstLetterUppercase($text) {


Лучше сделать чтобы эта функция работала только с одним предложеием, тогда preg_split и цикл будут не нужны

> $text = preg_replace("/ *$value */u", $replace, $text);


Тут нельзя использовать preg-replace так как символы вроде ( * или ? в тексте будут поняты как спецсимволы. Надо использовать str_replace или strtr().

>>373973

Открывай через сервер и http:, а не одним браузером. Браузер не умеет выполнять PHP код.

>>373981

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

>>373983

if ($op == '*') {
умножаем
} elseif ($op == '+') {
складываем
} ....

>>373991

> $result=$result*$number;


Ставь пробелы вокруг математических занков, алсо это можно щаписать короче как

$result *= $number;

> }


> elseif(is_numeric($char)){


Пишется в одну строку:

} else {

А так, сама логика верная.
!xnn2uE3AU. #154 #374375
>>373972

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

> foreach($sentences as $key => $sentence){


Ты не используешь key, потому пиши foreach($sentences as $sentence)

> foreach($words as $key => $word){


> $result = $result." ".$word;


Используй implode() (а заодно прочти и про explode())

> HP Notice: Undefined variable: result in /home/84LAYH/prog.php on line 30


Это надо исправить -— обращение к несуществующей переменной

> function makeFirstLetterUppercase($text) {


Лучше сделать чтобы эта функция работала только с одним предложеием, тогда preg_split и цикл будут не нужны

> $text = preg_replace("/ *$value */u", $replace, $text);


Тут нельзя использовать preg-replace так как символы вроде ( * или ? в тексте будут поняты как спецсимволы. Надо использовать str_replace или strtr().

>>373973

Открывай через сервер и http:, а не одним браузером. Браузер не умеет выполнять PHP код.

>>373981

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

>>373983

if ($op == '*') {
умножаем
} elseif ($op == '+') {
складываем
} ....

>>373991

> $result=$result*$number;


Ставь пробелы вокруг математических занков, алсо это можно щаписать короче как

$result *= $number;

> }


> elseif(is_numeric($char)){


Пишется в одну строку:

} else {

А так, сама логика верная.
#155 #374376
А есть ли какой-нибудь простой способ заставить ссылку (<a>) отправлять пост-запрос, не оборачивая её в форму?
!xnn2uE3AU. #156 #374377
>>374001

От чего ты защищается? Используй SSL или HTTPS если защищается от перехвата данных.

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

Также, есть системы вроде puppet: http://ru.wikipedia.org/wiki/Puppet

>>374003

Это называется роутер. Обычно роутер делается на основе шаблонов URL. Вот вариант, как оно сделано в Slim:

http://docs.slimframework.com/#GET-Routes

Вот как оно сделаено в Symfony Router с использованием YAML файла:

http://symfony.com/doc/current/book/routing.html

Есть еще такие библиотеки для роутинга:

https://github.com/nikic/FastRoute
https://github.com/c9s/Pux

В примитивном случае, роутер обходит все шаблоны в конфиге и проверяет URL на соответствие им. В более сложном случае применяется автоматическая генерация кода, например Симфони по конфигу генерирует php-файл с if и preg_match, ради большей скорости.
#157 #374378
>>374376
в чем вообще смысл использования пост в ссылке может быть. Это перестанет быть пост-запросом. Гет используй.
#158 #374379
>>374378
Красноречивый, я хотел сказать что пост специально нужен чтобы предотвратить его использование в ссылках.
!xnn2uE3AU. #159 #374380
>>374041

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

>>374044

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

>>374075

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


Да, вполне подойдет

> for(var some_prop in value){


> if(some_prop == property){


Зачем перебирать все свйоства когда можно сразу сделать if (prop in value) ?

> objects_array.forEach


Разные стили написания идентификаторов плохо сочетаются

> return Object.keys(obj).length


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

Так, в общем верно, кроме функции pluck().

>>374130

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

>>374179

> как такое может быть?


А что тут не так? PHP автоматически создает вложенные массивы при использовании

$x['a']['b']['c'] = 1;

Алсо, если выполнить твой код то выведется:

> PHP Notice: Undefined offset: 0 in Command line code on line 1


У тебя ошибки что ли отключены, что ты не заметил? Php при обращении к несуществуюшему элементу выводит варнинг и возвращат null.
!xnn2uE3AU. #159 #374380
>>374041

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

>>374044

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

>>374075

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


Да, вполне подойдет

> for(var some_prop in value){


> if(some_prop == property){


Зачем перебирать все свйоства когда можно сразу сделать if (prop in value) ?

> objects_array.forEach


Разные стили написания идентификаторов плохо сочетаются

> return Object.keys(obj).length


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

Так, в общем верно, кроме функции pluck().

>>374130

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

>>374179

> как такое может быть?


А что тут не так? PHP автоматически создает вложенные массивы при использовании

$x['a']['b']['c'] = 1;

Алсо, если выполнить твой код то выведется:

> PHP Notice: Undefined offset: 0 in Command line code on line 1


У тебя ошибки что ли отключены, что ты не заметил? Php при обращении к несуществуюшему элементу выводит варнинг и возвращат null.
#160 #374381
>>374380

> А что тут не так? PHP автоматически создает вложенные массивы при использовании



> $x['a']['b']['c'] = 1;



> Алсо, если выполнить твой код то выведется:



> > PHP Notice: Undefined offset: 0 in Command line code on line 1


> У тебя ошибки что ли отключены, что ты не заметил? Php при обращении к несуществуюшему элементу выводит варнинг и возвращат null.



до меня дошло, я ж пресвоил нулл, вот он и появился. А вот как ошибки включить? В ини-файле поставил display_errors: On display_startup_errors: On. Или куда он вообще ошивки выводит?
#161 #374382
>>374378
Я хотел сделать ссылку, что-то вроде "удалить", а гет же обычно только для чтения советуют использовать.
!xnn2uE3AU. #162 #374383
>>374192

> arsort($countWords, SORT_NUMERIC);


Какой смысл сортировать, если мы потом делаем merge и новую сортировку? Или ты как-то используешь факт что они отсортированы, для оптимизации?

> if (preg_match('/\w+ \w+/u', $key)) {


Я бы проверку сделал через if (false != mb_strpos($key, ' ')) то есть проверить есть ли пробел там.

> foreach ($words as $key => $value) {


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

foreach ($phrases as $phrase => $frequency)

От этих key и value только пуатница.

> Не совсем понятно как организовать такую проверку при данном алгоритме.


У нас в индексе есть номер словосочетания. По нему можно найти саму фразу и ее частоту употребления:

$frequencies = array_values($moreWords);
$freq = $frequencies[$number];

Размен

> у нас остается 0 - 500 купюр и 1 - 200, тогда как обоих должно быть по нулям.


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

> $canIssue[$sum][1][$bill] = $canIssue[$sum - $bill][1][$bill] - 1;


Это неправильный код. Ты должен заменять весь массив купюр $canIssue[$sum][1] а не один из элементов в нем. Иначе у тебя эти массивы с остатками перемешиваются.
!xnn2uE3AU. #162 #374383
>>374192

> arsort($countWords, SORT_NUMERIC);


Какой смысл сортировать, если мы потом делаем merge и новую сортировку? Или ты как-то используешь факт что они отсортированы, для оптимизации?

> if (preg_match('/\w+ \w+/u', $key)) {


Я бы проверку сделал через if (false != mb_strpos($key, ' ')) то есть проверить есть ли пробел там.

> foreach ($words as $key => $value) {


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

foreach ($phrases as $phrase => $frequency)

От этих key и value только пуатница.

> Не совсем понятно как организовать такую проверку при данном алгоритме.


У нас в индексе есть номер словосочетания. По нему можно найти саму фразу и ее частоту употребления:

$frequencies = array_values($moreWords);
$freq = $frequencies[$number];

Размен

> у нас остается 0 - 500 купюр и 1 - 200, тогда как обоих должно быть по нулям.


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

> $canIssue[$sum][1][$bill] = $canIssue[$sum - $bill][1][$bill] - 1;


Это неправильный код. Ты должен заменять весь массив купюр $canIssue[$sum][1] а не один из элементов в нем. Иначе у тебя эти массивы с остатками перемешиваются.
!xnn2uE3AU. #163 #374386
>>374194

HTML в первую очередь придуман для разметки текста тегами. Для хранения произвольной информации скорее XML подходит. Для представления, да, HTML вполне подходит.

Доктайп нужен в первую очередь чтобы отличить старницы, созданные по стандартам, от древних страниц. Браузер видя отсутсвие доктайпа может перейти в quirks mode — режим поддержки древних страниц.

Аттрибуты бывают без значений, например

<option value="x" selected>...

> Например цвет color="red" или толщина линии, или размер поля, рамки, отступа и т.д.


лучше приводить пример со ссылкой и href. Так как то, что ты описал, должно быть в CSS а не HTML.

> & amp


Точку с запятой забыл: & amp ;

Также, есть еще & quot ; и & # 039 ; чтобы вставить каавычки в значение аттрибута.

> У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно


Потому, что браузер всегда пытается исправить ошибки и например видя одиночный < выводит его как текст. Но особо полагаться не стоит: если убрать пробел после «меньше» и чуть поменять выражение, то это не пройдет: http://jsfiddle.net/nyL45/1/

> Вроде можно их просто так писать?


Да, спецсимволов всего 5: < > & и кавычки " ' внутри аттрибутов тегов.

> & apos;


Что-то я не уверен что это сработает везде. Обычно пишут & # 039 ; Тут написано:

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML

Что apos есть только в XHTML и его нет в HTML и его поддержка не гарантируется.

<font> считается устаревшим и вредным так как оформление должно описываться только с помощью CSS.

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


Согласен, без знания английского тяжеловато, но я как-то сам догадываюсь, что они значат:

h1 = heading level 1
p = paragraph
li = List Item
a = ? может быть anchor?
href = HyperREFerence = гиперссылка
src = source
pre = preformatted text
hr = horizontal ruler (когда я изучал html, я искал еще тег vr но так и не нашел)

В принципе, в стандарте для каждого тега написано его обозначение по-ангийски и можно догадаться:

> http://www.w3.org/TR/html5/text-level-semantics.html#the-a-element


> If the a element has an href attribute, then it represents a hyperlink (a hypertext Anchor) labeled by its contents.



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


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

> figure - мутный тег какой, групирует элементы внутри себя.


Типичный пример использования — обертывает картинку + подпись к ней. Или график + пояснения.

> table - таблица, как в экселе например


Еще есть th, table heading, для заголовков. Есть thead, tbody, tfoot. Есть colgroup и col. Есть caption.
!xnn2uE3AU. #163 #374386
>>374194

HTML в первую очередь придуман для разметки текста тегами. Для хранения произвольной информации скорее XML подходит. Для представления, да, HTML вполне подходит.

Доктайп нужен в первую очередь чтобы отличить старницы, созданные по стандартам, от древних страниц. Браузер видя отсутсвие доктайпа может перейти в quirks mode — режим поддержки древних страниц.

Аттрибуты бывают без значений, например

<option value="x" selected>...

> Например цвет color="red" или толщина линии, или размер поля, рамки, отступа и т.д.


лучше приводить пример со ссылкой и href. Так как то, что ты описал, должно быть в CSS а не HTML.

> & amp


Точку с запятой забыл: & amp ;

Также, есть еще & quot ; и & # 039 ; чтобы вставить каавычки в значение аттрибута.

> У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно


Потому, что браузер всегда пытается исправить ошибки и например видя одиночный < выводит его как текст. Но особо полагаться не стоит: если убрать пробел после «меньше» и чуть поменять выражение, то это не пройдет: http://jsfiddle.net/nyL45/1/

> Вроде можно их просто так писать?


Да, спецсимволов всего 5: < > & и кавычки " ' внутри аттрибутов тегов.

> & apos;


Что-то я не уверен что это сработает везде. Обычно пишут & # 039 ; Тут написано:

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML

Что apos есть только в XHTML и его нет в HTML и его поддержка не гарантируется.

<font> считается устаревшим и вредным так как оформление должно описываться только с помощью CSS.

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


Согласен, без знания английского тяжеловато, но я как-то сам догадываюсь, что они значат:

h1 = heading level 1
p = paragraph
li = List Item
a = ? может быть anchor?
href = HyperREFerence = гиперссылка
src = source
pre = preformatted text
hr = horizontal ruler (когда я изучал html, я искал еще тег vr но так и не нашел)

В принципе, в стандарте для каждого тега написано его обозначение по-ангийски и можно догадаться:

> http://www.w3.org/TR/html5/text-level-semantics.html#the-a-element


> If the a element has an href attribute, then it represents a hyperlink (a hypertext Anchor) labeled by its contents.



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


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

> figure - мутный тег какой, групирует элементы внутри себя.


Типичный пример использования — обертывает картинку + подпись к ней. Или график + пояснения.

> table - таблица, как в экселе например


Еще есть th, table heading, для заголовков. Есть thead, tbody, tfoot. Есть colgroup и col. Есть caption.
#164 #374387
При использовании апаче супервариабл $_SERVER ничего не содержит? Потому что var_dump($_SERVER) ничего не выводит, и с ключем ['SERVER_NAME'] в частности.
!xnn2uE3AU. #165 #374388
>>374216

Полгода, скорее даже год, так как еще надо верстка (HTML/CSS), яваскрипт, MySQL, ООП, фреймворки. У нас в треде кстати всему этому учат.

>>374243

Метод можно создать только внутри класса. Отдельно его написать нельзя.

А так, вызвать через -> на объекте классса: $obj->method()

У меня если что есть простой урок по ООП: http://archive-ipq-co.narod.ru/l1/pasta.html

>>374245

Удачи. Задача выглядит дурной, так как тут вполне хватит 1 класса Лифт. Алсо, тестовое задание должно проверять твои знания, а не мои.

>>374335

2014 - 2001 = 13 лет. PHP за жто время офигенно изменился.

> Или же это из-за того, что в книге используют PHP 4.0 и в новых версиях что-то поменялось?


В старом PHP параметры из адресной строки превращались сами в перменные. Это неприавльно и опасно потмоу сейчас используют массив $_GET для их получения: $_GET['name']. Алсо, найди нормальный учебник. Алсо, включи отображение ошибок (display_errors = On) так как у тебя должно выводиться предупреждение при выполнении этого кода.

>>374341

Раньеш автоматически создавались глобальные переменные из GET/POST/COOKIE и это была дыра: можно было написать

script.php?_SERVER[REMOTE_IP]=0.0.0.0

И перезаписывать что угодно.

>>374350

learn.javascript.ru

Плюс книги типа JS: The Good Parts

А у нас есть задачки для начинающих: https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>>374364

> Ничего же не изменится, если вынести создание констант вне функции


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

> new Hamburger(TYPE_SMALL, FILLING_CHEESE);


new Hamburger(Hamburger.TYPE_SMALL, Hamburger.FILLING_CHEESE);

> this.prices = {


> 'small': 50,


> 'big': 100,


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

> this.getCost = function() {


> console.log


Тут return должен быть а не log()
!xnn2uE3AU. #165 #374388
>>374216

Полгода, скорее даже год, так как еще надо верстка (HTML/CSS), яваскрипт, MySQL, ООП, фреймворки. У нас в треде кстати всему этому учат.

>>374243

Метод можно создать только внутри класса. Отдельно его написать нельзя.

А так, вызвать через -> на объекте классса: $obj->method()

У меня если что есть простой урок по ООП: http://archive-ipq-co.narod.ru/l1/pasta.html

>>374245

Удачи. Задача выглядит дурной, так как тут вполне хватит 1 класса Лифт. Алсо, тестовое задание должно проверять твои знания, а не мои.

>>374335

2014 - 2001 = 13 лет. PHP за жто время офигенно изменился.

> Или же это из-за того, что в книге используют PHP 4.0 и в новых версиях что-то поменялось?


В старом PHP параметры из адресной строки превращались сами в перменные. Это неприавльно и опасно потмоу сейчас используют массив $_GET для их получения: $_GET['name']. Алсо, найди нормальный учебник. Алсо, включи отображение ошибок (display_errors = On) так как у тебя должно выводиться предупреждение при выполнении этого кода.

>>374341

Раньеш автоматически создавались глобальные переменные из GET/POST/COOKIE и это была дыра: можно было написать

script.php?_SERVER[REMOTE_IP]=0.0.0.0

И перезаписывать что угодно.

>>374350

learn.javascript.ru

Плюс книги типа JS: The Good Parts

А у нас есть задачки для начинающих: https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>>374364

> Ничего же не изменится, если вынести создание констант вне функции


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

> new Hamburger(TYPE_SMALL, FILLING_CHEESE);


new Hamburger(Hamburger.TYPE_SMALL, Hamburger.FILLING_CHEESE);

> this.prices = {


> 'small': 50,


> 'big': 100,


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

> this.getCost = function() {


> console.log


Тут return должен быть а не log()
!xnn2uE3AU. #166 #374390
>>374376

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

<button type="button" onclick="..."></button>

Еще есть вариант сделать форму + кнопку, но по моему яваскриптом проще.

>>374381

Всегда ошибки идут в лог.

А на экран только если display_errors = On

Не забудь перезапустить Апач.

Также, если error_reporting не равно E_ALL то часть ошибок может скрываться (потому поставь просто E_ALL или -1).

>>374387

Ты что-то делаешь не так. Этот массив всегда заполнен. Покажи код и что ты в браузеер открываешь.
#167 #374393
Смотри оп, есть код сверху:
<?php #require_once "http://{$_SERVER['SERVER_NAME']}/kickstart/includes/temps/header.php"; 
?>

и снизу:
<?php #require_once "http://{$_SERVER['SERVER_NAME']}/kickstart/includes/temps/footer.php"; 
?>

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

И я включил:
display_errors = On
error_reporting = -1
Ошибки на экран не вылезают все-равно. Пустой бланк просто. Апаче перезапускал, и через службы и через монитор.
#168 #374395
>>374393
да, если скопировать путь и открыть в адресной строке, то хедер и футер открываются, т.е. пути верные.
!xnn2uE3AU. #169 #374402
>>374393

> Ошибки на экран не вылезают все-равно. Пустой бланк просто.


# значит комментарий вообще то. У тебя код закомментирован.

Что за наркоманство с SERVER_NAME? Пиши просто

require_once _ _ DIR _ _ .'/lalala/lololo.php';
#170 #374403
>>374402
комментарии ставил чтобы код запускался, забыл убрать. Я же говорю пишу localhost вместо переменной - все-равно. Абсолютный адрес, т.к. например, код может быть вызван с разных мест. Require же поддерживает абсолютные ссылки, в мануале написано. так вот у меня нихера не пашет.
#171 #374404
>>374403
и еще: вроде же абсолютный путь, начинающийся с / означает с корневой дериктории, т.е. localhost нет?
<?php require_once "../../../kickstart/includes/temps/header.php"; 
?>

работает, а
<?php require_once "/kickstart/includes/temps/header.php"; 
?>

нет.
Выше папки kickstart у меня ничего нет, localhost там.
#172 #374405
>>374404
Разве корневой директорией не считается корень диска?
#173 #374406
>>374405
как тогда сделать релативную ссылку от корня сайта? Это самый лучший вариант. Хотя почему не работают абсолютные ссылки тоже интересно.
#174 #374407
>>374406

> от корня сайта


$_SERVER['DOCUMENT_ROOT']
!xnn2uE3AU. #175 #374409
>>374406

Делай ссылку от текущего файла через _ _ DIR _ _ : http://php.net/manual/ru/language.constants.predefined.php
#176 #374410
>>374409
говорю же не от текущего надо. допустим есть подключаемый файл, который может быть вызван с разных мест. Он подключает еще один файл. соответственно ссылка должна быть или относительно корня или обсолютная. Как я нагуглил в пхп / значит самый коренной корень, а $_SERVER['DOCUMENT_ROOT'] дает абсолютную ссылку, которые у меня не работают. почему не работают, не понятно.
#177 #374411
>>374410
собственно DIR возратит абсолютную ссылку, которые я не могу заставить работать. Какого вообще хрена они не работают, когда должны.

Так же, я правильно сделал тут? >>374393

> И я включил:


display_errors = On
error_reporting = -1
он же должен выдавать ошибку вместо пустого бланка в таком случае? Я и тут что-то неправильно сделал.
#178 #374412
Я даун, забыл http:// убрать когда $_SERVER['DOCUMENT_ROOT'] использовал. Заработало. А юрл не пахали из-за того что отключена возможность в пхп.ини Как обычно по диогонали все читал. Остался вопрос с выводом ошибок.
#179 #374413
>>374412
Я даун в php.ini помимо закомментенных опций были еще и уже указанные с середине кода. Заработало. Хвала аллаху. наконецто не эти сраные белые бланки. Не надо гадать где ты скобочку пропустил.
#180 #374414
>>374412

> А юрл не пахали из-за того что


Не важно из-за чего они не пахали. Вот так:

> require_once "http://


никогда и ни в коем случае не делай.
!xnn2uE3AU. #181 #374415
>>374410

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

>>374411

Код покажи

>>374412

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

>>374413

Ура!
#182 #374416
>>374415

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


Как-так может, что она не туда покажет? Ей рандом что-ли управляет? Как иначе тогда от корня ссылку делать. Ведь относительно файла делать ссылку это очень негибко. Кстати, а зачем _ _DIR_ _ использовать, когда просто относительная ссылка тот же результат даст?
!xnn2uE3AU. #183 #374417
>>374416

> Ей рандом что-ли управляет?


Ей управляют особенности настройки веб-сервера. Если например в Апаче использовать VirtualDocumentRoot то DOCUMENT_ROOT не указывает на корень сайта: http://httpd.apache.org/docs/current/vhosts/mass.html#overview

> Neither of these modules is responsible for setting the DOCUMENT_ROOT environment variable so if any CGIs or SSI documents make use of it, they will get a misleading value.



Хотя такая конфигурация не часто встречается, но все же.
67 Кб, 658x972
#184 #374423
Двощовые куки.
Верхняя картинка это результат javascript:alert(document.cookie);
Нижняя - мнение браузера (Опера).
Почему вот эти **__cfduid** и cl_clearance не достаются скриптом?
#185 #374425
>>374370
>>374372
Спасибки, с замыканиями вроде разобрался.
#186 #374426
>>374370
Я ж зеленый еще, какие шаблоны.
#187 #374430
>>374426
require_once 'temps/SHABLON.php';

в нем рисуешь хтмл страницу с внедренным пхп, там где переменные. На подобии:
<h2>Post #<?php echo $postId; ?></h2>
<p><?php echo $postContent; ?></p>

Вроде это оп имел ввиду.
#188 #374431
В мануале написано что на использование fetchAll() нужно много ресурсов. Лучше ли будет тогда сделать цикл через все fetch()? Или наоборот хуже? Какой вообще самый адекватный способ вытащить все строки из таблицы?
#189 #374434
>>374373

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


Это чтобы знаки препинания не потерять, по-другому все превращаются в один.
#190 #374436
>>374431

> Лучше ли будет тогда сделать цикл через все fetch()


Если один хер будешь собирать их в массив и что-то потом с ним делать - лучше fetchAll().

Если будешь сразу выводить - лучше fetch() в цикле.
#191 #374450
Объясните про кодировки, няши.
PHP всё-равно в какой кодировке я храню строки в скрипте, главное на выходе в html поставить какой-нибудь <meta charset>, так?
Т.е. использовать mb_internal_encoding нужно только если я захочу обработать их средствами php?
#192 #374451
>>374450
Ага, пых вываливает текст дословно. Кодировка, емнип, влияет только на mb_* функции.
#193 #374479
Core_Page::instance()->execute();

Что здесь, метод, что класс, что объект?
#194 #374496
Задача про компанию «Вектор»: http://ideone.com/sZfBKT. Всё правильно?
#195 #374519
Задача на сдачу http://ideone.com/MFUDGS
Кто-нибудь делал по другому?
#196 #374528
Пишу свою мини-вакабу, пока без всяких фреймворков.
Как лучше организовать валидацию сообщения? Пока реализована проверка на наличие текста в полях. Сообщение отправляется при условии, что все поля заполнены.
Нужно сделать так, что если человек заполнил только часть полей, то он получит обратно эту же страницу с формой, но с теми данными в полях, что он уже заполнял и сообщением "заполните все поля". Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?
#197 #374530
Анон, у меня что-то нихера не работает match against. Ищу по одному полю в БД, индекс на него поставлен. Ищу, например, по тексту "один два". Дак вот, по каким-то странным причинам, текст, например, "два", "три два", "два два" находится, а текст "один пять" - нет. wtf?
#198 #374533
>>374479
Core_Page - класс
*Core_Page::instance() - объект
instance, execute - методы
мимо-крестопетух
#199 #374535
>>374530
специально сейчас проверил. Надо выбрать match с помощью against по одному кортежу все остальные. Итак, в первом содержание "слово1 слово2", во втором "слово1 слово2" - работает. Во втором "слово2 слово1" - работает. Во втором "слово2 слово3" - работает, во втором "слово3 слово2" - работает. А вот если во втором "слово1" или "слово1 слово3" - не работает. ПОЧЕМУ БЛДЖАД? И как это можно отладить?
#200 #374542
Вариант 12 жс задачи http://jsfiddle.net/72MR5/ Блиц вопрос: переменная burger_type это полноценный объект? Она очень похожа на словарь, даже попытался в кач-ве ключа использовать другую переменную, но не взлетело. Если что пишу на ноде вот такой я странный
#201 #374569
>>373424
Начал решать задачки.
Доброанон, покритикую

Про айфон в кредит - http://codepad.org/EwrDcjCS
Следующая задача из урока по циклам - http://ideone.com/xmMCxC
#202 #374576
>>374569
А разве в задачке про айфон в последнем месяце так высчитывается последняя выплата?
#203 #374578
>>374569

>$persent

#204 #374619
>>374388
http://jsbin.com/buzade/4/edit?js,console

Ошибки я умею читать, просто пытаюсь сделать по твоим словам:

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



>этот массив надо создавать один раз, например добавив его как свойство Hamburger, а не в конструкторе.



Добавить свойство, создать константу - созвучные вещи? Различие в регистре букв?

Кстати, ОП, начал почитывать вот это:
http://blog.contra.lv/category/joomla/creating-own-mvc-component/page/2/

Правда много устаревшей информации касательно синтаксиса. Но мне думается будет полезно, ведь я работаю с джумлой. А MVC вообще по сути интересная вещь, когда-нибудь надо будет углубиться.
#205 #374676
>>374619
Пока рылся в джумле и гуглил, нашел статью про класс Наблюдатель. Вот тут http://allineed.ru/articles-joomla/j15dev/58-composing-joomla15-plugin.html я вычитал его реализацию на примере с клоуном и зрителями. Только интересно можно ли наблюдателя сделать более гибким, с множеством вариантов выбора и обучением по ходу. И вот я вышел на новый уровень: начал гуглить про перцептрон (нейронная сеть со слоями). И по ходу перцептрон и есть наблюдатель, который обучается и реагирует соответственно на различные изменения объектов. А обучение подразумевает собой дописывание кода? Может какой-нибудь объект одного класса дописывать код для другого класса в соответствии с условиями? А создавать новые php файлы? Можно например написать код, который по запросам пользователя обучится и сам допилит движок cms или хотя бы увеличит функционал готовой?
#206 #374691
>>374676
Отсыпь, пожалуйста.
#207 #374708
>>374372
Снова задачки по js.

№1
http://jsbin.com/recegita/1/edit?js,console

№2
http://jsbin.com/gewuvibo/1/edit?js,console

№4
http://jsbin.com/zoqevino/1/edit?js,console - не пойму, почему не работает

№5
http://jsbin.com/gipocuna/1/edit?js,console - щитоу дальше делать? не смог до конца решить

№7
http://jsbin.com/setawaca/1/edit?js,console - как-то криво работает

№11
http://jsbin.com/sutoxaje/2/edit?js,console
#208 #374741
Помогите в терминологии. Callback-функцией называется функция, которую мы передаём как параметр другой функции или функция, принимающая через параметры другие функции?
#209 #374762
>>374741
Обычно второе, мимокрокодил.
#210 #374771
>>374741

> функция, которую мы передаём как параметр другой функции


this

>>374762

> Обычно второе


Авотхуй.
#211 #374802
Оцените чтоли
http://ideone.com/gLr2QK
#212 #374806
>>374802
Отступы в стиле "я упала с сеновала".
Пробелы по талонам получаешь?
max неправильно юзаешь. Он не самую длинную строку ищет, а самую большую в лексикографическом порядке.
И 28-29 строки как-то странно смотрятся. Я бы сделал примерно так:

$c = mb_substr($text[$b],$i,1);
echo $c ? $c : " ";

http://ideone.com/7XD6mD
!xnn2uE3AU. #213 #374815
>>374423

У них httpOnly стоит: http://en.wikipedia.org/wiki/HTTP_cookie#HttpOnly_cookie

>>374431

Много ресурсов нужно если ты по 100 000 строк выбираешь.

>>374434

Все равно нельзя так. Давай я повторю: если в тексте есть символы вроде ? * ( и тд, они будут интерпретированы как спецсимволы. Используй strtr или str_replace.

>>374450

mb_internal_encoding влияет только на работу mb_... функций.

>>374479

Класс Сore_Page, instance() — статический метод, возвращающий объект, execute() — обычный.
!xnn2uE3AU. #214 #374817
>>374496

> public $coffeeAmount;


> public $salary;


> public $reportPages;


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

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

> $array[$last+$i] =


Чтобы добавить что-то в массив нужно писать $array[] = ....

Не используй бессмысленные названия вроде $array. Используй напрмиер $workers.

Код перебора департаментов плохой. Представь, что нам надо добавить еще пару департаментов, ты будешь вынужден дописать много строк с кодом. Надо вместо этого сложить депариаменты в массив и обходить циклом.

То, что в строках 152-200 — унылая копипаста, от нее надо избавиться.

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


> echo " ";


Исплоьзуй функцию str_repeat. Также, padLeft/Right не должны ничего выводить, а должны только возвращать строку. Иначе мы не можем использовать их например для вывода данных в файл.

> switch ($this->occupation) {


> case 'me':


> $coffeeAmount += 20;


Вместо switch надо сделать 4 класса, для каждой профессии свой. Тогда switch будет не нужен. Классы пофессий должны наследоваться от абстрактного класса Работник. Абстрактный класс — значит, что нельзя создать объект такого класса, можно только наследоваться от него.

Вместо публичный свйоств надо сделать их private или protected.

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

http://php.net/manual/ru/language.oop5.inheritance.php
http://php.net/manual/ru/language.oop5.visibility.php

А также в книге Зандстры (название в ОП-посте). Попроьуй изучить это самостоятельно, если есть вопросы — задавай.
!xnn2uE3AU. #214 #374817
>>374496

> public $coffeeAmount;


> public $salary;


> public $reportPages;


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

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

> $array[$last+$i] =


Чтобы добавить что-то в массив нужно писать $array[] = ....

Не используй бессмысленные названия вроде $array. Используй напрмиер $workers.

Код перебора департаментов плохой. Представь, что нам надо добавить еще пару департаментов, ты будешь вынужден дописать много строк с кодом. Надо вместо этого сложить депариаменты в массив и обходить циклом.

То, что в строках 152-200 — унылая копипаста, от нее надо избавиться.

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


> echo " ";


Исплоьзуй функцию str_repeat. Также, padLeft/Right не должны ничего выводить, а должны только возвращать строку. Иначе мы не можем использовать их например для вывода данных в файл.

> switch ($this->occupation) {


> case 'me':


> $coffeeAmount += 20;


Вместо switch надо сделать 4 класса, для каждой профессии свой. Тогда switch будет не нужен. Классы пофессий должны наследоваться от абстрактного класса Работник. Абстрактный класс — значит, что нельзя создать объект такого класса, можно только наследоваться от него.

Вместо публичный свйоств надо сделать их private или protected.

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

http://php.net/manual/ru/language.oop5.inheritance.php
http://php.net/manual/ru/language.oop5.visibility.php

А также в книге Зандстры (название в ОП-посте). Попроьуй изучить это самостоятельно, если есть вопросы — задавай.
!xnn2uE3AU. #215 #374821
>>374519

Код в строках 11-30 — копипаста, плюс в нем жестко фиксированы номиналы и число видов купюр. Надо переделать его на использование цикла, чтобы число видов купюр и номиналы можно было легко поменять.

> if($fivek>$bills[5000]){


> $fivek=$bills[5000];


Такие вещи гораздо удобнее писать через min()/max()

>>374528

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



Лучше конкретно написать что именно надо заполнить. Также, стоит сделать проверку на максимальную длину полей.

> Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?


В массиве или переменной.

>>374530

> а текст "один пять" - нет. wtf?


Может, «два» — это стоп-слово? А вообще, начни с изучения документации (желательно на английском, если можешь):

(англ) http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html
(рус) http://habrahabr.ru/post/40218/
(рус) http://www.mysql.ru/docs/man/Fulltext_Search.html

> Любое ``слово'', присутствующее в стоп-списке (stopword) или просто слишком короткое (3 символа или меньше), игнорируется.

!xnn2uE3AU. #215 #374821
>>374519

Код в строках 11-30 — копипаста, плюс в нем жестко фиксированы номиналы и число видов купюр. Надо переделать его на использование цикла, чтобы число видов купюр и номиналы можно было легко поменять.

> if($fivek>$bills[5000]){


> $fivek=$bills[5000];


Такие вещи гораздо удобнее писать через min()/max()

>>374528

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



Лучше конкретно написать что именно надо заполнить. Также, стоит сделать проверку на максимальную длину полей.

> Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?


В массиве или переменной.

>>374530

> а текст "один пять" - нет. wtf?


Может, «два» — это стоп-слово? А вообще, начни с изучения документации (желательно на английском, если можешь):

(англ) http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html
(рус) http://habrahabr.ru/post/40218/
(рус) http://www.mysql.ru/docs/man/Fulltext_Search.html

> Любое ``слово'', присутствующее в стоп-списке (stopword) или просто слишком короткое (3 символа или меньше), игнорируется.

!xnn2uE3AU. #216 #374822
>>374542

> Она очень похожа на словарь,


Так в яваскрипт и словари и массивы — тоже объекты. А вообще, если я понял твой вопрос то да, полноценный объект «класса» Hamburger (в Js нет классов потому правильно писать «объект созданный конструктором Hamburger», но так длинно выходит).

> if(!burger_type.hasOwnProperty(type)


Логичнее использовать просто in или даже if (!burger_type[type])

> throw 'Evil burger';


Надо делать нормальные сообщения вроде "Invalid burger type: '" + type + "'"

> this.price = 0;


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

> var BIG_BURGER = 'big_burger';


Логичнее сделать «константу» не болтающейся где-то в пространстве переменной, а свойством функции (аналог константы класса в PHP):

Hamburger.SIZE_BIG = 'big';

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

> var burger_type = {


> 'big_burger' : {'price' : 100, 'nutrients' : 40},


Тут нельзя писать big_burger, надо исплоьзовать константу. Иначе нет никакой логики: почему в одном месте кода используется константа, а в другой простой строка.

> this.add_flavoring = function(){


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

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

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

Hamburger.prototype.addFlavouring = function (...) { ... };

> Если что пишу на ноде


Я вызовов функций ноды не вижу тут, так что правильнее сказать что пишешь на яваскрипте.
!xnn2uE3AU. #216 #374822
>>374542

> Она очень похожа на словарь,


Так в яваскрипт и словари и массивы — тоже объекты. А вообще, если я понял твой вопрос то да, полноценный объект «класса» Hamburger (в Js нет классов потому правильно писать «объект созданный конструктором Hamburger», но так длинно выходит).

> if(!burger_type.hasOwnProperty(type)


Логичнее использовать просто in или даже if (!burger_type[type])

> throw 'Evil burger';


Надо делать нормальные сообщения вроде "Invalid burger type: '" + type + "'"

> this.price = 0;


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

> var BIG_BURGER = 'big_burger';


Логичнее сделать «константу» не болтающейся где-то в пространстве переменной, а свойством функции (аналог константы класса в PHP):

Hamburger.SIZE_BIG = 'big';

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

> var burger_type = {


> 'big_burger' : {'price' : 100, 'nutrients' : 40},


Тут нельзя писать big_burger, надо исплоьзовать константу. Иначе нет никакой логики: почему в одном месте кода используется константа, а в другой простой строка.

> this.add_flavoring = function(){


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

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

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

Hamburger.prototype.addFlavouring = function (...) { ... };

> Если что пишу на ноде


Я вызовов функций ноды не вижу тут, так что правильнее сказать что пишешь на яваскрипте.
#217 #374825
>>374822

>Тут нельзя писать big_burger, надо исплоьзовать константу. Иначе нет никакой логики: почему в одном месте кода используется константа, а в другой простой строка.



В том-то и фищка, что у меня не получилось использовать константу для обозначения ключа словаря. В пыхе ведь нельзя для обозначения св-ва класса использовать переменную или константу. Поэтому и просил про объект.

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



Это как-то непривычно описывать методы класса вне класса.
#218 #374826
>>374821

>> Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?


>> В массиве или переменной.


Это можно, если сразу после пост запроса отображать предыдущую страницу. Но тогда если пользователь захочет обновить страницу, браузер будет говорить мол, "данные опять через пост передаёшь". Не будет ли человеку неприятно от этого?
!xnn2uE3AU. #219 #374828
>>374569

> $paymentTotal += $monthlyPayment - $creditBalance;


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

> /* Если баланс отрицательный — хватит считать */


А как он может стать отрицательным?

> echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";


Скопировано 2 раза. Попробуй изабвится от повторов.

Следующая задача из урока по циклам

Ок, тут все верно. Только название надо писать perCent, а не perSent.

>>374619

> Добавить свойство, создать константу - созвучные вещи? Различие в регистре букв?


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

Потому в данном случае «создать константу» значит «добавить к функции свойство из больших букв». Теперь это сделано верно.

> Hamburger.prices = {


Hamburger.TYPE_SMALL: 50,

Так нельзя писать. Почитай про синтаксис объектов: http://learn.javascript.ru/object#доступ-через-квадратные-скобки

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

prices[Hamburger.LALALA] = 100500;

> Ошибки я умею читать, просто пытаюсь сделать по твоим словам:


Ну может я непонятно объяснил что-то, конечно.

> Кстати, ОП, начал почитывать вот это:


Действительно, статья старовата. А в официальной документации всего этого разве нету?

Зря они не пишут названия паттернов. Например Jtable явно реализует паттерн ActiveRecord. Jdate — аналог php-ного класса DateTime, а Jdatabase — велосипед-аналог PDO.

> А MVC вообще по сути интересная вещь, когда-нибудь надо будет углубиться.


Да ничего там особо сложного нет, просто разделение кода на 3 части.
!xnn2uE3AU. #219 #374828
>>374569

> $paymentTotal += $monthlyPayment - $creditBalance;


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

> /* Если баланс отрицательный — хватит считать */


А как он может стать отрицательным?

> echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";


Скопировано 2 раза. Попробуй изабвится от повторов.

Следующая задача из урока по циклам

Ок, тут все верно. Только название надо писать perCent, а не perSent.

>>374619

> Добавить свойство, создать константу - созвучные вещи? Различие в регистре букв?


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

Потому в данном случае «создать константу» значит «добавить к функции свойство из больших букв». Теперь это сделано верно.

> Hamburger.prices = {


Hamburger.TYPE_SMALL: 50,

Так нельзя писать. Почитай про синтаксис объектов: http://learn.javascript.ru/object#доступ-через-квадратные-скобки

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

prices[Hamburger.LALALA] = 100500;

> Ошибки я умею читать, просто пытаюсь сделать по твоим словам:


Ну может я непонятно объяснил что-то, конечно.

> Кстати, ОП, начал почитывать вот это:


Действительно, статья старовата. А в официальной документации всего этого разве нету?

Зря они не пишут названия паттернов. Например Jtable явно реализует паттерн ActiveRecord. Jdate — аналог php-ного класса DateTime, а Jdatabase — велосипед-аналог PDO.

> А MVC вообще по сути интересная вещь, когда-нибудь надо будет углубиться.


Да ничего там особо сложного нет, просто разделение кода на 3 части.
#220 #374830
>>374676
Оп, еще такой вопрос:

есть абстрактный класс JLoader,
в нем есть метод public static function import(), в котором используется тот же include_once.

Далее в этом же классе вижу:

function jimport($path)
{
return JLoader::import($path);
}

Для чего так делается? Почему нельзя везде просто JLoader::import использовать?

И почему в любом файле .php я просто пишу <?php jimport('joomla.application.component.controller'); ?> и все работает? Где же этот object->jimport(...)?
#221 #374831
>>374828
Про joomla 3 в официальной документации мало чего есть. Установил себе 2.5, чтобы не заморачиваться. Но если честно сложно разобраться в оф. документации. Я хочу понять суть работы движка.
#222 #374835
>>374831
Хотя может мне просто написать с помощью mvc простой сайт визитку по какому-нибудь мануалу для чайников? В дебрях joomla я теряюсь.
#223 #374836
Не ожидал, что считалка про чай с тортиком окажется для меня непосильной. Она через массив решается?
!xnn2uE3AU. #224 #374838
>>374676

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

В PHP кстати в SPL есть классы для реализации этого паттерна: http://php.net//manual/ru/class.splobserver.php — можно не писать свои велосипеды.

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

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

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


Это будет совсем не то, а что-то странное. Не думаю, что в этом есть смысл.

> И по ходу перцептрон и есть наблюдатель, который обучается


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

> А обучение подразумевает собой дописывание кода?


Обучение подразумевает подбор правильных коффициентов у входов нейронов. Допустим, у нашей сети есть 4 входа и 4 выхода. Мы хотим, чтобы при подаче на входы сигналов

1 0.5 0.2 0

на выходе было:

1 0 0 0

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

http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4_.D0.BE.D0.B1.D1.80.D0.B0.D1.82.D0.BD.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D1.81.D0.BF.D1.80.D0.BE.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D1.88.D0.B8.D0.B1.D0.BA.D0.B8

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

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



Наверно может, но это уже будет не перцептрон. В перцептроне мы просто подбираем значения весов (коэффициентов) у входов нейронов, почитай вики например.

> Можно например написать код, который по запросам пользователя обучится и сам допилит движок cms или хотя бы увеличит функционал готовой?


Наверно можно в теории, но это очень сложно. Пока никто вроде такого не сделал.
!xnn2uE3AU. #224 #374838
>>374676

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

В PHP кстати в SPL есть классы для реализации этого паттерна: http://php.net//manual/ru/class.splobserver.php — можно не писать свои велосипеды.

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

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

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


Это будет совсем не то, а что-то странное. Не думаю, что в этом есть смысл.

> И по ходу перцептрон и есть наблюдатель, который обучается


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

> А обучение подразумевает собой дописывание кода?


Обучение подразумевает подбор правильных коффициентов у входов нейронов. Допустим, у нашей сети есть 4 входа и 4 выхода. Мы хотим, чтобы при подаче на входы сигналов

1 0.5 0.2 0

на выходе было:

1 0 0 0

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

http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4_.D0.BE.D0.B1.D1.80.D0.B0.D1.82.D0.BD.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D1.81.D0.BF.D1.80.D0.BE.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D1.88.D0.B8.D0.B1.D0.BA.D0.B8

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

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



Наверно может, но это уже будет не перцептрон. В перцептроне мы просто подбираем значения весов (коэффициентов) у входов нейронов, почитай вики например.

> Можно например написать код, который по запросам пользователя обучится и сам допилит движок cms или хотя бы увеличит функционал готовой?


Наверно можно в теории, но это очень сложно. Пока никто вроде такого не сделал.
!xnn2uE3AU. #225 #374840
>>374708

№1

> var currentCount = newStart ? newStart : 0;


В JS обычно пишут newStart || 0. Оператор || возвращает первое непустое значение, или false если таких нет.

> currentCount = newStep ? currentCount + newStep : ++currentCount;



Лучше в начале значение для step через || определить

Алсо, отсчет должен с 10 начинаться а у тебя с 13.

№2

> arr = func();


Используй arr.push. Алсо, вместо arr лучше писать result или values, arr — бессмысленное название. Вместо numOf принято писать count.

№4

> var squareGen = fmap(square gen;


Ты запятые и скобки потерял

№5

> a = arguments;


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

В этой задаче надо использовать Funсtion.apply(). Погугли.

№7

> function bind(func, ctx) {


> return func.call(ctx);


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

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

№11

> var n = +prompt("Сколько городов вывести?", "")


Вместо + лучше использовать явный parseInt(x, 10), также ты забыл точку с запятой. Также, удобнее мне кажется просто записать var n = 3; чтобы не надо было ничего жать или вводить.

Также, расскажу хитрость. Функция сортировки может возвращать любые числа, потому ее можно записать как:

return y.population - x.population;

Но твой вариант конечно читабельнее и понятнее.

Тут стоило использовать анонимную функцию:

...sort(function (...) {
....
});

> for (var i = 0; i < n; i++) {


> console.log(populated.name);


тут можно было бы исплоьзовать Array.slice(), pluck() и Array.join() и обойтись без цикла.

!xnn2uE3AU. #225 #374840
>>374708

№1

> var currentCount = newStart ? newStart : 0;


В JS обычно пишут newStart || 0. Оператор || возвращает первое непустое значение, или false если таких нет.

> currentCount = newStep ? currentCount + newStep : ++currentCount;



Лучше в начале значение для step через || определить

Алсо, отсчет должен с 10 начинаться а у тебя с 13.

№2

> arr = func();


Используй arr.push. Алсо, вместо arr лучше писать result или values, arr — бессмысленное название. Вместо numOf принято писать count.

№4

> var squareGen = fmap(square gen;


Ты запятые и скобки потерял

№5

> a = arguments;


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

В этой задаче надо использовать Funсtion.apply(). Погугли.

№7

> function bind(func, ctx) {


> return func.call(ctx);


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

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

№11

> var n = +prompt("Сколько городов вывести?", "")


Вместо + лучше использовать явный parseInt(x, 10), также ты забыл точку с запятой. Также, удобнее мне кажется просто записать var n = 3; чтобы не надо было ничего жать или вводить.

Также, расскажу хитрость. Функция сортировки может возвращать любые числа, потому ее можно записать как:

return y.population - x.population;

Но твой вариант конечно читабельнее и понятнее.

Тут стоило использовать анонимную функцию:

...sort(function (...) {
....
});

> for (var i = 0; i < n; i++) {


> console.log(populated.name);


тут можно было бы исплоьзовать Array.slice(), pluck() и Array.join() и обойтись без цикла.

!xnn2uE3AU. #226 #374843
>>374741

Функция, которую передаем. Callback = «функция обратного вызова».

>>374802

Да, код бы не мешало через phpformatter пропустить ( >>373425 )

> $length=mb_strlen(max($text));


Это не найдет максимальную длину. Когда ты сравниваешь 2 строки, они сравниваются по алфавиту, а не по длине. max(массив строк) вернет строку, начинающуюся с последних букв алфавита вроде «я», а не самую длинную. И то, сравнение работает надежно только для латинских букв одного размера, в случае с русскими ничего не гарантируется и можно считать что сравниваются строки случайно.

У тебя так и вышло:

> В мутной передней долго не вле...



Тут нужен max + array_map.

> for($b=0; $b<count($text); ++$b){


Тут надо использовать foreach

> if(mb_substr($text[$b],$i,1)==""){


Лучше наверно сделать сравнение $i и длины строки.
!xnn2uE3AU. #227 #374848
>>374825

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



dict[KEY] = value;

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



Вообще можно, я покажу как, но никогда так не делай:

$obj->$key = 1;
$obj->{'oh you!'} = 1;
$obj->{CONSTANT} = 1;

Читал ли ты мануал? http://php.net//manual/ru/language.variables.variable.php

В JS другие правила, ты не должен смотреть на PHP. Тут имя свойства — любая строка:

obj['oh you!'] = 1;

> Это как-то непривычно описывать методы класса вне класса.


Hamburger — функция-конструктор, а не класс. В JS вообще классов нет. То есть описывать методы внутри одной функции для тебя логичнее?

Есть много JS библиотек, которые пытаются избавить от вознис prototype и предлагают свои функции объявления классов, но ты их пока не трогай, изучи как вручную это делать сначала.

А вообще, в ES6 наконец-то сделают классы и будет такой синтаксис:

http://habrahabr.ru/post/175371/
http://h3manth.com/content/classes-javascript-es6 (англ) — обрати внимание, здесь приводятся примеры создания классов с помощью библиотек
!xnn2uE3AU. #227 #374848
>>374825

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



dict[KEY] = value;

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



Вообще можно, я покажу как, но никогда так не делай:

$obj->$key = 1;
$obj->{'oh you!'} = 1;
$obj->{CONSTANT} = 1;

Читал ли ты мануал? http://php.net//manual/ru/language.variables.variable.php

В JS другие правила, ты не должен смотреть на PHP. Тут имя свойства — любая строка:

obj['oh you!'] = 1;

> Это как-то непривычно описывать методы класса вне класса.


Hamburger — функция-конструктор, а не класс. В JS вообще классов нет. То есть описывать методы внутри одной функции для тебя логичнее?

Есть много JS библиотек, которые пытаются избавить от вознис prototype и предлагают свои функции объявления классов, но ты их пока не трогай, изучи как вручную это делать сначала.

А вообще, в ES6 наконец-то сделают классы и будет такой синтаксис:

http://habrahabr.ru/post/175371/
http://h3manth.com/content/classes-javascript-es6 (англ) — обрати внимание, здесь приводятся примеры создания классов с помощью библиотек
#228 #374849
>>374848

>Вообще можно, я покажу как, но никогда так не делай:



$obj->$key = 1;
$obj->{'oh you!'} = 1;
$obj->{CONSTANT} = 1;

Вообще ты сделал это для инстанса, а не для класса. В классе сво-во можно объявить переменной, но не константой же http://ideone.com/SWlb9X
!xnn2uE3AU. #229 #374851
>>374826

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


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

>>374830

> Для чего так делается? Почему нельзя везде просто JLoader::import использовать?



- так короче?
- совместимость? в старых версиях может быть была только функция?

> Где же этот object->jimport(...)?


Так jimport — обычная функция, не метод объекта. А JLoader::import — вызов статической функции (функции, которая вызвыается на классе, а не на объекте).

>>374831

Если документации мало, придется исходники читать + API docs (http://api.joomla.org/ ). Обрати внимание, там какой то Joomla Framework упоминается, на котором видимо новые версии основаны.

Тут кстати написано http://docs.joomla.org/What_are_the_major_differences_between_Joomla!_2.5_and_3.x%3F что разница небольшая.

>>374835

на это время уйдет. Попробуй код почитать.

>>374836

Да.
!xnn2uE3AU. #229 #374851
>>374826

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


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

>>374830

> Для чего так делается? Почему нельзя везде просто JLoader::import использовать?



- так короче?
- совместимость? в старых версиях может быть была только функция?

> Где же этот object->jimport(...)?


Так jimport — обычная функция, не метод объекта. А JLoader::import — вызов статической функции (функции, которая вызвыается на классе, а не на объекте).

>>374831

Если документации мало, придется исходники читать + API docs (http://api.joomla.org/ ). Обрати внимание, там какой то Joomla Framework упоминается, на котором видимо новые версии основаны.

Тут кстати написано http://docs.joomla.org/What_are_the_major_differences_between_Joomla!_2.5_and_3.x%3F что разница небольшая.

>>374835

на это время уйдет. Попробуй код почитать.

>>374836

Да.
!xnn2uE3AU. #230 #374852
>>374831

Изучать код удобно в нормальном редакторе, который умеет по Ctrl + клику на функцию/класс переходить к определению. Это умеют Eclipse PDT, PhpStorm и наверно другие IDE. Sublime Text 3 по F12 тоже умеет, если папку с проектом на левую панель добавить.

Ну и на листочек выписывай все что нужно, а то забудешь.
#231 #374854
>>374851

>Так jimport — обычная функция, не метод объекта.



И правда, плохо код прочитал. Хорошо условились. Но как мы запускаем функцию jimport без include того файла, где есть эта функция?
#232 #374855
Охуеть. Я просто обезумел от простоты питона.
!xnn2uE3AU. #233 #374860
>>374854

Она может быть уже ранее приинклюжена в каком-нибудь из файлов джумлы при инициализации.
#234 #374863
>>374860
http://jsbin.com/buzade/11/edit?js,console

Если так, то код некрасивый получается.
!xnn2uE3AU. #235 #374864
>>374863

Жизнь яваскрипт-программиста — боль, что поделать.

Скобки после return не нужны

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

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

Методы надо вынести из конструктора в прототип.
#236 #374869
>>374855

>простоты питона


Это пока. Скоро ты доберешься до декораторов, генераторов, множественного наследования и костылей с приватными методами, тогда по-другому запаешь.
#237 #374872
Переделываю задачу на сдачу из банкомата. Возникла проблема, при нулевых или других значениях кол-ва купюр определенного номинала функция array_flip отбрасывает элемент массива, потому-что элемент под таким номером уже есть. Допустим у нас в массиве
100 => 0
Тогда array_flip выбросит его, так как нулевой элемент в массиве уже есть.
#238 #374873
>>374851

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


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

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


Получается, что если у меня много значений "Аноним" столбца "Имя", то мне столбец "Имя" вынести в отдельную таблицу и хранить только его id в таблице постов? Получится же куча мелких таблиц и будет неудобно манипулировать данными.
#239 #374874
>>374869

>запаешь

#240 #374875
>>374874
Это акроним.
!xnn2uE3AU. #241 #374879
>>374872

Не делай array_flip

>>374873

> Получается, что если у меня много значений "Аноним" столбца "Имя", то мне столбец "Имя" вынести в отдельную таблицу и хранить только его id в таблице постов? Получится же куча мелких таблиц и будет неудобно манипулировать данными.



Если у тебя есть пользователи (например через регистрацию или как-то еще) то должна быть отдельная таблица, так как пользователь — отдельная сущность. Для анонима можно вписывать NULL вместо id пользователя.

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

Принцип простой: одна сущность — одна таблица.

Алсо, полезная статья про связи в БД: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
#242 #374880
>>374879
http://ideone.com/w4R34G сделал без флипа.
#243 #374884
как работает поле action в формах? у меня есть две формы на странице, одна action='', другая на другую страницу. Так вот у меня остается на странице. Там логин, возможно ошибка в скрипте, но все равно должна же страница меняться? Вполне даже возможно что у меня выводит хедерами снова на эту страницу, но просто скажите мне action работает как ссылка? Открывается скрипт с нуля с заданными POST параметрами? Ну или Get.
#244 #374887
>>374884
Action - адрес. action="" кидает на текущую страницу, но думаю лучше явно указать. method="post" указывает совершить пост-запрос по заданному action.
#245 #374890
>>374887
где же я обосрался то. Форма закрыта, action указан. по ссылке в ней или будет еще один переход или ничего не будет. НА еще одном переходе только текст тестовый. А он почему остается на текущей странице, да еще и ей пост-запрос передает по ходу. не пойму. закрыл же обе формы, они никак не пересекаются. В сабмит кнопке не надо же явно указывать к какой она форме, если она в форме, собственно?
#246 #374898
>>374890
сейчас попробовал путь заменить, все равно остается. значит или он не переходит по битой ссылке или ошибка в шаблоне.
<form method="POST" atcion="/chatbox/includes/logon.php">
<input name="loginUser" placeholder="Username" type="text" /> <input name="loginPass" placeholder="Password" type="password" /> <input type="submit">
</form>

еще попробовал заменить путь во фторой форме на нужный (для первой). Итог отправка второй формы поменялась, отправка первой все равно не редиректит. Значит пересечений форм нет, значит я вообще не знаю.
гребаный вагон. пока читал че написал понял в чем проблема. кривоглазое чмо
#247 #374899
>>374864
http://jsbin.com/buzade/14/edit?js,console

Не нравится мне, что приходится добавлять свойства и константы вне конструктора объекта. А если код большой? Запутаться тут проще простого. Ну и как обычно ошибка. JSbin выводит что-то непонятное при ошибке:

>"@http://run.jsbin.com/runner:31:2


>k</b.render/<@http://static.jsbin.com/js/prod/runner-3.17.13.min.js:1:13466


>j</a.use/<@http://static.jsbin.com/js/prod/runner-3.17.13.min.js:1:10519


>"



В консоли отладчика браузера хоть пишет prices is undefined.
#248 #374905
>>374898

> atcion

#249 #374906
>>374898
И в html5 не нужно закрывать одиночные теги вот так <img/>. Пиши <img>
!xnn2uE3AU. #250 #374907
>>374899

> Hamburger.prices[Hamburger.TYPE_SMALL] = 50;


Habgurger.prices не существует, потому оно возвращает undefined. ты пытаешься добавить поле в undefined и закономерно получешь ошибку так как поля можно добавлять только к объектам.
#251 #374911
>>374907
А как я тогда добавил Hamburger.TYPE_SMALL = 'small'; например? Я ведь в undefined добавил?
!xnn2uE3AU. #252 #374912
>>374911

В объект Hamburger (функции являются объектами в JS)
#253 #374913
>>374912
http://jsbin.com/buzade/16/edit?js,console

А теперь prices должен быть. Но ошибка вот какая:

ReferenceError: prices is not defined
#254 #374915
Пароли хранятся в базе, с помощью crypt(). чтобы раскриптить их, как я понял нужен этот пароль. То бишь $cryptPass == crypt($pass, $cryptPass);
мне надо извлечь prepare'd строки с помощью execute(array($login, crypt($userInput, $cryptedPass)) Но как мне узнать $cryptedPass? Извлекать все строки, вместо нужных, а затем сравнивать поле через цикл while ($fetched[] = $dbPrepared->fletch()) {...}?
!xnn2uE3AU. #255 #374937
>>374880

> $comb=array_combine($b, $bills);


Что это? Это ты пытаешься изобрести array_keys() и array_values()?

> for ($i = $n; $i >= 0; --$i) {


Вместо for лучше использовать тут foreach. Чтобы перебор шел в нужном порядке, массив можно отсортировать по ключам с помощью ksort/krsort

> if ($money > $comb[$i]) {


> $money = $comb[$i];


Это условие удобно переписать через max()/min()

\t создает дырки в тексте, лучше наверно через пробелы записать

>>374884

Форма отправляется на указанный в action URL

> Так вот у меня остается на странице.


Может там яваскрипт работает?

> action работает как ссылка? Открывается скрипт с нуля с заданными POST параметрами?


Браузер отправляет на сервер запрос с данными и при получении ответа обновляет страницу

>>374890

Зачем гадать? Открой в хроме или ФФ черех Ctrl + Shift + I отладчик, там вкладку «Сеть/Network», надми красный кружочек чтобы запросы записывались и отправь форму. И посомтри что и куда отправляется.

>>374899

> Не нравится мне, что приходится добавлять свойства и константы вне конструктора объекта. А если код большой?


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

> А если код большой?


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

>>374913

> return prices[size]


А ты видишь где-то объявление черех var переменной prices? Я не вижу.

>>374915

Всегда стоит начать с чтения мануала, а не с гадания. http://php.net/manual/ru/function.crypt.php

> crypt — Необратимое хэширование строки



Можно только аналогично зашифровать пароль введенный пользователем и сравнить хеши.

> Но как мне узнать $cryptedPass? Извлекать все строки, вместо нужных,


По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.
!xnn2uE3AU. #255 #374937
>>374880

> $comb=array_combine($b, $bills);


Что это? Это ты пытаешься изобрести array_keys() и array_values()?

> for ($i = $n; $i >= 0; --$i) {


Вместо for лучше использовать тут foreach. Чтобы перебор шел в нужном порядке, массив можно отсортировать по ключам с помощью ksort/krsort

> if ($money > $comb[$i]) {


> $money = $comb[$i];


Это условие удобно переписать через max()/min()

\t создает дырки в тексте, лучше наверно через пробелы записать

>>374884

Форма отправляется на указанный в action URL

> Так вот у меня остается на странице.


Может там яваскрипт работает?

> action работает как ссылка? Открывается скрипт с нуля с заданными POST параметрами?


Браузер отправляет на сервер запрос с данными и при получении ответа обновляет страницу

>>374890

Зачем гадать? Открой в хроме или ФФ черех Ctrl + Shift + I отладчик, там вкладку «Сеть/Network», надми красный кружочек чтобы запросы записывались и отправь форму. И посомтри что и куда отправляется.

>>374899

> Не нравится мне, что приходится добавлять свойства и константы вне конструктора объекта. А если код большой?


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

> А если код большой?


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

>>374913

> return prices[size]


А ты видишь где-то объявление черех var переменной prices? Я не вижу.

>>374915

Всегда стоит начать с чтения мануала, а не с гадания. http://php.net/manual/ru/function.crypt.php

> crypt — Необратимое хэширование строки



Можно только аналогично зашифровать пароль введенный пользователем и сравнить хеши.

> Но как мне узнать $cryptedPass? Извлекать все строки, вместо нужных,


По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.
#256 #374938
>>374937

> По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.


сделал уже так. Оказалось даже короче чем, если можно было бы при указании параметров в execute() указывать переменную для значения ячейки, чтоб проверить пароль. Кстати я соль использую случайную crypt() это вроде как ненадежно, как лучше генерировать соль?
#257 #374939
>>374938

> случайную


стандартную, т.е. не указанную
#258 #374940
>>374937
http://jsbin.com/buzade/18/edit?js,console

А так?

Не понял зачем тут var. Нам же нужен контекст объекта Hamburger.
!xnn2uE3AU. #259 #374943
>>374940

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

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

>>374938

> Кстати я соль использую случайную crypt() это вроде как ненадежно, как лучше генерировать соль?


Там в мануале есть описание. Если есть возможность, лучше делать соль подлинее.
#260 #374983
>>373424
Оп, проверь считалку, пожалуйста:
http://ideone.com/8cxQ04
#262 #374987
Не пойму ничего, откуда и для чего все эти переменные.
$fromangle=-80
$toangle=260
Откуда мы взяли их значения? Я сначала думал, что это углы до оси х и у, но очевидно, что это не так.
Дальше, что за $centerX и $centerY, центр, он как бы по определению один. Далее мы создаём массив из 30 подмассивов, чтобы у нас был круг в 30 строк высоток. Но элементов в подмассивах 80, а не 30. Разве не должно количество элементов в подмассивах совпадать с колличеством элементов в массиве?
#264 #374993
>>374987
Ты очень интересно объясняешь! Но правила в последнем предложении не существует.
#265 #374994
>>374993
Это правило для круга.
#266 #375006
http://ideone.com/XhD0tI
Я сдаюсь. Я понятия не имею, что делать дальше. И для чего нужны centerX с centerY.
#267 #375007
>>374860
Но я не понимаю как можно инклудить файл где-то в другом месте, а потом писать jimport в другом файле. Для меня это пока выглядит как: создал файл .php на одном диске, а приинклудил совсем в другом. А потом в этом .php используются каким-то образом какие-то методы.

Может например в каком-нибудь файле типа loader.php осуществляется "прослушка" на новые созданные файлы index.php в шаблоне? А потом вытаскивается код из них как-то? В общем мне непонятно.
#268 #375008
>>374943
А зачем? Какой профит будет от того, что я методы перенесу в прототип? Допустим я прототипы изучил, но где они применяются мне не понятно.
89 Кб, 742x882
#269 #375021
Короче, я не знаю, куда, но у меня проебалась папка Z. Денвер уже есть, сейчас скачал пхп 5.5.15 тар. Что дальше делать, где файл с тестингом, отрывающийся через локалхост?
#270 #375022
>>375021
сука, когда выбирал папку для распаковки нашло архив Z. куда он делся блять?
#271 #375023
>>375022
а, все нашел методом копирования на раб стол
#272 #375035
У меня есть ссылка вида <a href="/kokoko.php" onclick="post('/kukarek.php')">Ссылка</a>

post('/kukarek.php') выполняет POST-запрос на скрипт kukarek.php. Внутри kukarek.php одна строчка - echo "kukarek".

Когда я нажимаю на ссылку, сначала выполняется kukarek.php, а потом переходит в kokoko.php. Так во всех браузерах работает (сначала onclick, а потом href) и на это можно полагаться или только в моём?
#273 #375045
>>375035
onclick всегда выполнялся раньше самого действия тега, но в твоем случае на это надеяться не стоит, т.к. твой пост может занимать больше времени чем браузер перейдет к загрузки самой страницы по href и твой пост просто не дойдет до получателя...
#274 #375049
>>375008
Оп, я никак не могу понять как работает функция:


function extend(Child, Parent) {
var F = function() { }
F.prototype = Parent.prototype
Child.prototype = new F()
Child.prototype.constructor = Child
Child.superclass = Parent.prototype
}


Можешь объяснить построчно? Здесь http://javascript.ru/tutorial/object/inheritance#pervaya-stroka-vspomogatelnyy-obekt-f не очень понятно.
#275 #375058
>>375049
http://jsbin.com/buzade/21/edit?js,console

Так нормально? Или можно сделать лучше?
#276 #375062
11 задача http://ideone.com/yhO6kG
989 Кб, 1680x1050
#277 #375066
ОП! Посмотри пожалуйста почту.
!xnn2uE3AU. #278 #375076
>>374983

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


> array_push($array, $i);



используй range()

> PHP Notice: Undefined variable: char in /home/NyWDoG/prog.php on line 25


> PHP Notice: Undefined variable: last in /home/NyWDoG/prog.php on line 25


Эти ошибки надо исправить

Алгоритм излишне усложнен. Думаю, лучше сделать так:

Заводим переменную-счетчик, записываем туда например 0
Обходим массив, увеличивая каждый раз переменную-счетчик, если она дошла до порога, то удаляем текущий элемент и сбрасываем счетчик. И так пока в массиве не останется нужное число элементов.
!xnn2uE3AU. #279 #375078
>>374985

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

>>374987

Это начальный и конечный угол для расстановки букв. В комп. графике углы традиционно отсчитываются от оси X против часовой. то есть 0° = точка справа от центра, 90° — сверху, 180° — слева.

> Дальше, что за $centerX и $centerY, центр, он как бы по определению один.


Центр — это точка, а координаты-то у точки две: x и y

> Но элементов в подмассивах 80, а не 30. Разве не должно количество элементов в подмассивах совпадать с колличеством элементов в массиве?


Нет. Мы как бы разбиваем экран на строки, а строки на ячейки. Полчуается что-то вроде листа бумаги в клеточку, и в каждую клеточку мы можем вписать какой-то символ или пробел. Соответственно большой массив содержит подмассивы-строки, которые содержат отдельные ячейки-элементы.
!xnn2uE3AU. #280 #375081
>>374989

Все верно.

>>375006

Смотри, если считать x и y по формулам синуса/косинуса то мы получаем полложительные и отрицательные числа. Если радиус = 15 то x и y будут от -15 до 15 (так как sin/cos возвращает число от -1 до 1, это даже в школе изучают так что ты должен знать).

Но у нас в массиве индексы идут от 0 до N. Там нет отрицательных индексов. Потому мы переносим центр круга из точки (0; 0) в точку например (20; 20). Тогда x и y будут принимать значения от (20 - 15) = 5 до (20 + 15) = 35.

Соответственно centerX/Y — координаты центра круга, надо их просто прибавлять к x/y и задать таким образом, чтобы не было отрицательных чисел.

Вот это вот:

if ($x > 0) {
$x = $x * 2;
} else {
$x = $x * (-1);
}

Не годится так как искажает форму круга.
!xnn2uE3AU. #281 #375083
>>375007

Посмотри код Джумлы уже. Там начинается все с файла index.php. И вполне возможно там сделано так:

require 'файл с определениям функций в том числе jimport';
.... код ....
require 'твой файл';

Тогда к моменту когда Джумла запустит твой файл, функция jimport будет уже создана.

> Но я не понимаю как можно инклудить файл где-то в другом месте, а потом писать jimport в другом файле.


Что тут непонятного? Если ты инклудишь файл, в котором есть определения функций, то PHP создает эти функции и они доступны потом в любых других файлах. Функции в PHP глобальные, один раз создал и она доступна из любого места кода.

Ну давай экперимент проведем. Сделай 3 файла:

1.php:

<?php
function test($x) { var_dump($x); }

2.php:

<?php
test(100);

index.php:

<?php
require '1.php';
require '2.php';

Если ты запустишь index.php то увидишь что все рабоает. а если преставишь местами require то перестанет работать.
!xnn2uE3AU. #281 #375083
>>375007

Посмотри код Джумлы уже. Там начинается все с файла index.php. И вполне возможно там сделано так:

require 'файл с определениям функций в том числе jimport';
.... код ....
require 'твой файл';

Тогда к моменту когда Джумла запустит твой файл, функция jimport будет уже создана.

> Но я не понимаю как можно инклудить файл где-то в другом месте, а потом писать jimport в другом файле.


Что тут непонятного? Если ты инклудишь файл, в котором есть определения функций, то PHP создает эти функции и они доступны потом в любых других файлах. Функции в PHP глобальные, один раз создал и она доступна из любого места кода.

Ну давай экперимент проведем. Сделай 3 файла:

1.php:

<?php
function test($x) { var_dump($x); }

2.php:

<?php
test(100);

index.php:

<?php
require '1.php';
require '2.php';

Если ты запустишь index.php то увидишь что все рабоает. а если преставишь местами require то перестанет работать.
!xnn2uE3AU. #282 #375087
>>375008

> Какой профит


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

> Допустим я прототипы изучил, но где они применяются мне не понятно.


На прототипах в JS делаются «классы» и наследование. Без их знания ты не сможешь писать классический ООП-код на JS и понимать его, использовать ООП-библиотеки.

>>375021

Это вроде бы не папка, а диск z:, который замаплен на папку в денвере. Алсо, полезнее ставить все по частям, у меня даже паста есть: https://gist.github.com/codedokode/10774100

>>375035

Это ненадежно, так как все выполняется параллельно и в момент загрузки новой страницы kokoko.php старые запросы (в том числе post(...)) отменяются. То есть это все работает на честном слове и в зависимости от скорости интернета, загруженности сервера и других факторов может не работать. Так конечно же делать не стоит.
!xnn2uE3AU. #283 #375095
>>375049

Начать стоит с изучения функции Object.create(). Object.create() доступна только в стандарте ES5 ( http://es5.javascript.ru/x15.2.html#x15.2.3.5 ), появившемся не так давно и поддерживаемом только в новых браузерах ( http://kangax.github.io/compat-table/es5/ )

Ты знаешь, что делает Object.create()? создает новый пустой объект, прототипом которого становится переданный объект Ну вот, а нам надо сделать то же самое без использования ES5, чтобы работало везде.

Итак, как можно без Object.create() создать пустой объект с заданным прототипом? Только одним способом — через new SomeFunc, при этом прототипом нового объекта будет то, что хранилось в SomeFunc.prototype

Собственно, вот и решение — создаем новую пустую функцию-конструтор, в ее свойство prototype записываем переданный объект, и создаем новый объект черех new. Чтобы убедиться, что ты это понял, давай ты сам напишешь аналог функции Object.create() под названием create(). Он должен работать так:

var pr = { a: 1, b: 2 }; // объект который станет прототипом
var newObj = create(pr);
newObj.a = 10;

console.log(newObj); // отладчиком убедись что у newObj есть прототип
console.log(newObj.a); // 10
console.log(newObj.b); // 2
console.log(pr.isPrototypeOf(newObj)); // true

Метод a.isPrototypeOf(b) который есть у всех объектов (так как все объекты в JS унаследованы от Object) проверяет, создержится ли объект a в цепочке прототипов объекта b.

Теперь вернемся к наследованию и указанному коду.

Итак, допустим у нас есть «класс» A, с конструктором, свойствами и методами и мы хотим как-то унаследовать от него класс B. Как это сделать?

function A(...) { ... };
A.prototype.method1 = function (..) { ... };

function B(...) {
A.call(this, ....); // вызваем сначала родительский конструктор иначе какое это наследование?
.... // а только потом уже делаем что-то свое с объектом
};

// ??? тут должен быть код наследования

B.prototype.method2 = function (...) { ... };

Очевидно, что объект «класса» B должен в качестве прототипа иметь B.prototype (чтобы работали свойства вроде method2), а вот прототипом B.prototype должен быть не Object.prototype (как это происходит по умолчанию), а A.prototype — тогда методы вроде method1 станут доступны в объекте класса B. Как это сделать?

Если есть ES5 и поддержка Object.create то довольно просто:

function B (...) { ... }
B.prototype = Object.create(A.prototype); // созадем новый пустой объект, с заданным прототипом
B.prototype.constructor = B; // Если этого не сделать то свойство constructor возьмется из A.prototype, а там хранится A.prototype.constructor = A
B.prototype.method2 = ...

// все!

Чтобы не писать каждый раз при наследовании объектов эту портянку, мы можем вынести ее в функцию и писать:

function B (...) { ... }
extend(B, A); // унаследовать прототипы

Собственно, это задание 2 для тебя: напиши extend() на основе Object.create(). Пруфом того, что наследование работает будет проверка через instanceof:

var b = new B(...);
b instanceof B; // true
b instanceof A; // true
b.constructor === B; // true
b.constructor === A; // false
'method1' in b; // true
'method2' in b; // true

После того, как ты это сделаешь, замени Object.create() на самописную функицю create() из первого задания — и ты получишь тот же код, что и в твоем посте.
!xnn2uE3AU. #283 #375095
>>375049

Начать стоит с изучения функции Object.create(). Object.create() доступна только в стандарте ES5 ( http://es5.javascript.ru/x15.2.html#x15.2.3.5 ), появившемся не так давно и поддерживаемом только в новых браузерах ( http://kangax.github.io/compat-table/es5/ )

Ты знаешь, что делает Object.create()? создает новый пустой объект, прототипом которого становится переданный объект Ну вот, а нам надо сделать то же самое без использования ES5, чтобы работало везде.

Итак, как можно без Object.create() создать пустой объект с заданным прототипом? Только одним способом — через new SomeFunc, при этом прототипом нового объекта будет то, что хранилось в SomeFunc.prototype

Собственно, вот и решение — создаем новую пустую функцию-конструтор, в ее свойство prototype записываем переданный объект, и создаем новый объект черех new. Чтобы убедиться, что ты это понял, давай ты сам напишешь аналог функции Object.create() под названием create(). Он должен работать так:

var pr = { a: 1, b: 2 }; // объект который станет прототипом
var newObj = create(pr);
newObj.a = 10;

console.log(newObj); // отладчиком убедись что у newObj есть прототип
console.log(newObj.a); // 10
console.log(newObj.b); // 2
console.log(pr.isPrototypeOf(newObj)); // true

Метод a.isPrototypeOf(b) который есть у всех объектов (так как все объекты в JS унаследованы от Object) проверяет, создержится ли объект a в цепочке прототипов объекта b.

Теперь вернемся к наследованию и указанному коду.

Итак, допустим у нас есть «класс» A, с конструктором, свойствами и методами и мы хотим как-то унаследовать от него класс B. Как это сделать?

function A(...) { ... };
A.prototype.method1 = function (..) { ... };

function B(...) {
A.call(this, ....); // вызваем сначала родительский конструктор иначе какое это наследование?
.... // а только потом уже делаем что-то свое с объектом
};

// ??? тут должен быть код наследования

B.prototype.method2 = function (...) { ... };

Очевидно, что объект «класса» B должен в качестве прототипа иметь B.prototype (чтобы работали свойства вроде method2), а вот прототипом B.prototype должен быть не Object.prototype (как это происходит по умолчанию), а A.prototype — тогда методы вроде method1 станут доступны в объекте класса B. Как это сделать?

Если есть ES5 и поддержка Object.create то довольно просто:

function B (...) { ... }
B.prototype = Object.create(A.prototype); // созадем новый пустой объект, с заданным прототипом
B.prototype.constructor = B; // Если этого не сделать то свойство constructor возьмется из A.prototype, а там хранится A.prototype.constructor = A
B.prototype.method2 = ...

// все!

Чтобы не писать каждый раз при наследовании объектов эту портянку, мы можем вынести ее в функцию и писать:

function B (...) { ... }
extend(B, A); // унаследовать прототипы

Собственно, это задание 2 для тебя: напиши extend() на основе Object.create(). Пруфом того, что наследование работает будет проверка через instanceof:

var b = new B(...);
b instanceof B; // true
b instanceof A; // true
b.constructor === B; // true
b.constructor === A; // false
'method1' in b; // true
'method2' in b; // true

После того, как ты это сделаешь, замени Object.create() на самописную функицю create() из первого задания — и ты получишь тот же код, что и в твоем посте.
!xnn2uE3AU. #284 #375096
>>375058

> Hamburger.prototype = {


Это не очень хорошо, так как ты перезаписал объект который раньше был в prototype, а именно объект вида { constuctor: Hamburger } который хранится в prototype у любой функции. То есть перезаписав его, ты затер свойство constructor, что нехорошо. Традиционно методы добавляют так, не затирая исходный объект:

Hamburger.prototype.method = function () { .. }

Так что лучше сделать либо через траздиционную форму записи, либо задать свойство constructor в prototype.

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

>>375062

Хорошо, только исключение лучше делать более информативным, и не выбрасывать строки, а выбрасывать объект:

throw new Error("You cannot get" + count + " top cities beacause there are only " + cityCount);

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

Ну и переменные/методы в JS традиционно называются кемелкейсом, посмотри cам:

isPrototypeOf()
hasOwnProperty()
!xnn2uE3AU. #286 #375100
>>375098

А тесты кто писать будет, Пушкин? Не проходит твой код тесты: http://jsbin.com/bicaveti/1/edit

Ты не создаешь новый объект, а возвращаешь тот, что передан в функцию, смотри внимательно.
!xnn2uE3AU. #287 #375101
>>375098

http://jsbin.com/bicaveti/2/edit — добавил еще 1 тест
#288 #375108
>>375101
http://jsbin.com/voyam/2/edit?js,console

>var pr = { a: 1, b: 2 }; // объект который станет прототипом



Мне кажется newObj прототип pr?
!xnn2uE3AU. #289 #375112
>>375108

Нет, неверно. Функция create() должна создавать новый, пустой объект, прототипом котрого будет pr.
!xnn2uE3AU. #290 #375113
>>375108

Теперь все верно. делай дальше задание.
#291 #375114
>>375113
Нет, я не понимаю опять. Объект родитель (главный объект) и объект прототип родителя (наследуемый объект от главного объекта)?

Или все наоборот?
!xnn2uE3AU. #292 #375116
>>375114

Наоборот же. Прототип — это как бы предок. Свойство ищется сначала в самом объекте а только потом в прототипах.
#293 #375117
>>375116
То есть я пишу:

Rabbit.prototype = animal;

Rabbit - прототип, предок? А animal наследует?
#294 #375120
>>375117
Я все понял. Разобрался. Спасибо, ОП.
#295 #375122
>>375120
Нет.

Rabbit.prototype = animal;

Прототипом Rabbit будет Rabbit.prototype, а прототипом Rabbit.prototype будет animal? Так?
Rabbit -> Rabbit.prototype -> animal

Я сужу по этим словам:

>Очевидно, что объект «класса» B должен в качестве прототипа иметь B.prototype (чтобы работали свойства вроде method2), а вот прототипом B.prototype должен быть не Object.prototype (как это происходит по умолчанию), а A.prototype — тогда методы вроде method1 станут доступны в объекте класса B.



B -> B.prototype -> A.prototype
То есть в цепочке три звена всегда как минимум?
!xnn2uE3AU. #296 #375131
>>375117

Наоборот. У объекта созданного через

var o = new Rabbit();

прототипом будет являться animal. Rabbit — потомок, а не предок.

>>375122

> Прототипом Rabbit будет Rabbit.prototype, а прототипом Rabbit.prototype будет animal? Так?



У объекта созданного через new Rabbit() (а не у функции Rabbit) прототипом будет Rabbit.prototype или animal, что одно и то же так как у тебя написано «Rabbit.prototype = animal».

То есть цепочка прототипов такая:

new Rabbit -> (Rabbit.prototype или animal) -> ?

Что дальше в цепочке сказать нельзя так как непонятно что такое Animal. Цепочка прототипов может быть любой длины. Цепочка всегда заканчивается Object.prototype так как все объекты в JS унаследованы от Object.

Не путай свойства prototype и прототип — это разные вещи. Получить прототип объекта можно через Object.getPrototypeOf(x).

Давай начнем с простых примеров (делать удобнее в Хроме, там лучше выводятся результаты):

var o = {}; // пустой объект
o instanceof Object; // true
Object.prototype.isPrototypeOf(o); // true
Object.getPrototypeOf(o) === Object.prototype; // true У пустого объекта единственный прототип — Object.prototype
Object.getPrototypeOf(Object.prototype); // null — у Object.prototype нет прототипа, он всегда последний в цепочке

То есть цепочка такая:

o -> Object.prototype -> null

Теперь попробуем проверить, чему равно свойство prototype (не прототип) у функции:

function Test() {}
Test.prototype; // { constructor: Test } — объект с единственным свойством, указывающим на саму функцию

Пруф что прототип и prototype разные вещи:

Test.prototype === Object.getPrototypeOf(Test); // false

Прототипы функции — это Funсtion.prototype и Object.prototype:

Object.getPrototypeOf(Test) === Function.prototype; // true
Object.getPrototypeOf(Function.prototype) === Object.prototype; // true

Цепочка имеет вид:

Test -> Function.prototype -> Object.prototype -> null

Когда ты создаешь объект через new Func, его прототипом становится объект который был в Func.prototype:

Object.getPrototypeOf(new Test()) === Test.prototype; // true
Object.getPrototypeOf(Test.prototype) === Object.prototype; // true

Цепочка имеет вид:

new Test() -> Test.prototype -> Object.prototype -> null
!xnn2uE3AU. #296 #375131
>>375117

Наоборот. У объекта созданного через

var o = new Rabbit();

прототипом будет являться animal. Rabbit — потомок, а не предок.

>>375122

> Прототипом Rabbit будет Rabbit.prototype, а прототипом Rabbit.prototype будет animal? Так?



У объекта созданного через new Rabbit() (а не у функции Rabbit) прототипом будет Rabbit.prototype или animal, что одно и то же так как у тебя написано «Rabbit.prototype = animal».

То есть цепочка прототипов такая:

new Rabbit -> (Rabbit.prototype или animal) -> ?

Что дальше в цепочке сказать нельзя так как непонятно что такое Animal. Цепочка прототипов может быть любой длины. Цепочка всегда заканчивается Object.prototype так как все объекты в JS унаследованы от Object.

Не путай свойства prototype и прототип — это разные вещи. Получить прототип объекта можно через Object.getPrototypeOf(x).

Давай начнем с простых примеров (делать удобнее в Хроме, там лучше выводятся результаты):

var o = {}; // пустой объект
o instanceof Object; // true
Object.prototype.isPrototypeOf(o); // true
Object.getPrototypeOf(o) === Object.prototype; // true У пустого объекта единственный прототип — Object.prototype
Object.getPrototypeOf(Object.prototype); // null — у Object.prototype нет прототипа, он всегда последний в цепочке

То есть цепочка такая:

o -> Object.prototype -> null

Теперь попробуем проверить, чему равно свойство prototype (не прототип) у функции:

function Test() {}
Test.prototype; // { constructor: Test } — объект с единственным свойством, указывающим на саму функцию

Пруф что прототип и prototype разные вещи:

Test.prototype === Object.getPrototypeOf(Test); // false

Прототипы функции — это Funсtion.prototype и Object.prototype:

Object.getPrototypeOf(Test) === Function.prototype; // true
Object.getPrototypeOf(Function.prototype) === Object.prototype; // true

Цепочка имеет вид:

Test -> Function.prototype -> Object.prototype -> null

Когда ты создаешь объект через new Func, его прототипом становится объект который был в Func.prototype:

Object.getPrototypeOf(new Test()) === Test.prototype; // true
Object.getPrototypeOf(Test.prototype) === Object.prototype; // true

Цепочка имеет вид:

new Test() -> Test.prototype -> Object.prototype -> null
#297 #375168
>>373424

http://ideone.com/3x5lal

смотрите что накидал.
#298 #375169
>>374840

№1, №2
http://jsbin.com/recegita/2/edit?js,console
http://jsbin.com/gewuvibo/2/edit?js,console
Все поисправлял, но не знаю как сделать так, чтобы сначала выводил новое стартовое значение.

№4
http://jsbin.com/zoqevino/3/edit?js,console - чего-то не работает

№5
http://jsbin.com/gipocuna/2/edit?js,console

№6
http://jsbin.com/labozapa/2/edit?js,console

№7
http://jsbin.com/setawaca/3/edit?js,console

№11
http://jsbin.com/sutoxaje/4/edit?js,console

>тут можно было бы исплоьзовать Array.slice(), pluck() и Array.join() и обойтись без цикла.


Получится же намного сложнее, не?
#299 #375171
Жиесеры, хочу вопрос спросить. http://ideone.com/APnUx6 Как мне внутри форычевского коллбека обратиться к классу? this ссылается на функцию.
#300 #375177
13 задача, которая почему-то обозначена 1 http://jsfiddle.net/rr7B5/ и вялый бамп вопросу >>375171
#301 #375180
>>375131

>У объекта созданного через new Rabbit() (а не у функции Rabbit) прототипом будет Rabbit.prototype или animal, что одно и то же.



Почему одно и то же?

>Не путай свойства prototype и прототип



Я путаю. В свойстве prototype хранится прототип?

>Object.prototype.isPrototypeOf(o); // true



Почему не Object? Получается Object.prototype - это прототип o и Object? Почему мы сразу бежим к свойству prototype в объекте Object?
#302 #375185
Что-то пока круг не получается, даже отдаленно его не напоминает.
http://ideone.com/XhD0tI
#303 #375188
>>375180
У объектов есть внутреннее свойство [[Prototype]] (встречается как proto), а обычное свойство prototype есть только у функций.

Они связаны? Как они связаны? Ничего не понимаю.
#304 #375193
>>375188

>Есть родитель(функция-конструктор), у которой есть ссылка в свойстве prototype на некий объект где хранятся все методы и свойства к которым потомок должен иметь доступ. И есть, собственно, потомок которому при создании через вызов new от родителя передаётся ссылка в свойство proto на тот самый объект с общими свойствами и методами.


Источник: http://habrahabr.ru/post/151070/

Это меня запутало полностью. Тут верно написано?

Родитель со свойством prototype, в котором ссылка на некий объект с методами и свойствами. Это не бред? Может правильнее будет, потомок со свойством prototype, в котором лежит ссылка на некий объект-родитель, в котором лежат свойства и методы?
#305 #375205
>>375169
Вот еще №12: http://jsbin.com/jekinido/1/edit?js,console
Сделал не полностью(даже не пробовал пока добавлять приправу и майонез) и наговнокодил.Но рад, оче рад, для меня это оче сложная тема. Надеюсь, что правильно применял ООП-принципы.
#306 #375212
>>375188
Объект из свойства prototype функции-конструктора записывается в свойство proto каждого созданного объекта. Прототипом является именно то, что лежит в proto
316 Кб, 720x400
#307 #375214
Размен
Кажется я понял что было не так. В моем алгоритме часть информации о купюрах была взята из предыдущей суммы, а часть из количества по умолчанию, поэтому и получалась такая путаница. И в результате одну купюру высчитывало верно, а другие фиг пойми как.
http://ideone.com/6Kz9uE

Словосочетания
http://ideone.com/htytkF
#308 #375215
ОП, я спросил в /s, но там меня что-то хуями покрыли, репостну сюда, может ты что подскажешь:
У меня проблема. Очень скоро мне надо будет админить сервер на линуксе, а знания о последнем у меня заканчиваются где-то на уровне умения ставить пакеты и пользоваться простейшими консольными утилитами. Как, например, привязать домен к апачу, настроить почту на домене, поставить ту же cPanel, да даже сменить стандартные пароли у веб-служб - я вообще не представляю. Это не говоря уже о том, чтобы обеспечить оптимальные по безопасности, стабильности и скорости работы настройки веб-сервера и сопутствующих служб, тут я даже не знаю, что именно я должен делать. А админить уже скоро, сервер важный. Что делать? Что читать? Что гуглить? Есть какие-то книжки (хорошо, если на русском) с экспресс-курсами? Есть какие-нибудь хендбуки по линуксу, фре, не важно, с упором именно на разворачивание и админство веб-сервера? Что читать вообще фундаментального и отвечающего на большинство вопросов начинающего админа веб-сервера?
#309 #375222
>>375212
В proto же ссылка лежит на прототип.
#310 #375223
>>375222
Хотя вот, что интересно:

>Однако, изменение свойства prototype в конструкторе, никак не влияет на прототип уже порождённых объектов. Меняется только (и именно) свойство prototype конструктора. Это означает, что новые порождаемые объекты, будут иметь новый прототип. Порождённые же уже (до смены свойства prototype) объекты, имеют связь со своим старым прототипом, и эта связь уже неизменна.



То есть получается и конструктор, и объекты имеют свой прототип. Но объекты наверное имеют копию прототипа, а в prototype функции-конструктора лежит ссылка на оригинальный прототип. То есть при изменении прототипа функции-конструктора, прототип созданных объектов не изменится.
#311 #375225
Как сделать в php, чтобы на сайт загружалась определенная папка?
Т.е. я бы мог её загрузить через файлзилла, а как сделать так, чтобы это происходило автоматически, через php?
#312 #375227
http://jsbin.com/yicup/3/edit?js,console

Я пытаюсь реализовать так называемый инициализирующий контекст, чтобы в итоге получился автовызов функций и вывод необходимых данных при создании объекта. Это реально? У меня пока не получается.
#313 #375230
http://jsbin.com/buzade/24/edit?js,console

Зачем мне дополнительный метод для добавок? Хотя, если их будет много, то да, наверное стоит. Но я все равно не знаю как сделать метод, чтобы он вычислял откуда нужно брать значение из prices или calories. Вообще реально узнать какому объекту принадлежит свойство?
#314 #375237
>>375223
Конструктор - это функция. Функция - это объект. Прототип функции-конструктора - это SomeFunction.proto, никакого отношения к прототипам порожденных объектов это поле не имеет. В цепочку прототипов попадет SomeFunction.prototype, SomeFunction.prototype.proto, итд.
Причем SomeFunctionObject.proto - это копия SomeFunction.prototype, а не ссылка, потому и прототип уже порожденных объектов и не меняется. По сути при создании нового объекта перед выполнением всего, что есть в функции-конструкторе, делается:
this = {};
this.proto = SomeFunction.prototype;
#315 #375252
>>375237

>мы имеем следующую структуру с двумя явными собственными (own) свойствами и одним неявным (внутренним) свойством proto, которое является ссылкой на прототип объекта foo



proto, которое является ссылкой

http://dmitrysoshnikov.com/ecmascript/ru-javascript-the-core/#obyekt
#316 #375254
>>375252
Окей, поправлюсь. В proto попадает ссылка. Но в SomeFunction.prototype тоже ссылка. Замена свойства SomeFunction.prototype.someField повлияет на уже созданные объекты, а замена SomeFunction.prototype - нет.
39 Кб, 550x486
#317 #375263
>>375214
Еще начал делать задачку на поиск пути. Вроде бы норм написал вариант для возвращения маршрута только для одной точки, но вот с рекурсией не могу разобраться. Как сохранять и куда сохранять результаты вызова функции в функции, да и как вообще этим пользоваться не понимаю.
http://ideone.com/W7f33e
#318 #375264
>>375263
Погугли алгоритмы поиска кратчайшего пути в графе. Там ни к чему рекурсия.
#319 #375266
>>375264
Это я уже в задаче про банкомат разбираю. A*. Хотелось бы рекурсию осилить.
#320 #375267
>>375264
Хотя для закрепления возможно попробую этот алгоритм к этой задаче тоже применить, ибо с большим трудом осилил его.
#321 #375273
>>373424
Установил EasyPHP DevServer 14.1 VC11
с сайта easyphp.org

В итоге у меня не запускается Апач, ругается на отстутствие каких-то файлов. Винда 8 свежая. В чем может быть проблема?
#322 #375280
>>375273
В отсутствии каких-то файлов.
#323 #375287
>>375280
Какой вопрос, такой и ответ. Если ругается, значит говорит их имена. Начать изучение php да и вообще чего либо, стоит с заведения привычки внимательно читать и вникать во все предупреждения и ошибки. И искать файл логов конкретной программы для того что бы понять что не так, а не бежать на двачи и форумы и сразу спрашивать. 99% ошибок уже давно обмусолены 1000 раз и легко ищутся в гугле.
#324 #375288
>>375280
Ты уверен?
#325 #375289
>>374828
Спасибо ОП, я кун, который начал решать твои задачи. про айфон поправил. Буду занимаься дальше
#328 #375302
>>375299
Потому что у B пустой конструктор. Замени его на
function B(a, b) {
this.a = a;
this.b = b;
}
#329 #375303
>>375302
А если я хочу те же аргументы, что и у класса A, не делая копии?
#330 #375305
>>375303
Ну не знаю, вызови конструктор A внутри конструктора B. Зачем тебе это? Кстати, у тебя в коде конструктор A не используется вовсе. Его можно сделать пустым.
#331 #375309
>>375305
В оригинале в конце функции extend зачем-то приписывается:

child.superclass = parent.prototype

а внутри конструктора B прописывается A.superclass.constructor.apply(this, arguments), но у меня это не работает.

>Зачем тебе это?



Пытаюсь понять работу extend. Кстати погуглил, для копирования свойств пишут миксин. А вообще есть фреймворк http://learn.javascript.ru/files/tutorial/js/class-extend.js
#332 #375312
Пхпач, дай совет по MVC. Насколько это круто, насколько важно придерживаться всех канонов. Видел кучу гайдов, вроде понятно, но так банально, что как-то размыто. Дай какой-то гайд, который по твоему мнению самый каноничный, чтобы я мог целенаправленно залипнуть в него.
мой монстр вроде и работает, но явно это неправильно, хочу порефакторить в канон
#333 #375318
>>375309

> A.superclass.constructor.apply(this, arguments)


Вот это - вызов конструктора объекта, лежащего в поле A.superclass с переданными в функцию аргументами.

>child.superclass = parent.prototype


А вот тут ты сохраняешь в это поле объект-прототип для класса parent.
В функции extend ты по сути делаешь следующие вещи:
1) Сначала создаешь новую функцию-конструктор F и записываешь ей в prototype объект из Parent.prototype
2) Затем создаешь экземпляр F и записываешь его в Child.prototype, заменяя то, что там раньше было. В итоге любой объект, созданный через new Child будет иметь в proto этот экземпляр F, а он имеет в proto экземпляр Parent.
3) Чтобы не потерялся указатель на конструктор, записываешь его в Child.prototype.constructor Теперь каждый объект, созданный через new Child будет знать, какой функцией его создали, через childObject.constructor
4) Для ништяков сохраняем в Child.superclass объект Parent.prototype Теперь мы например можем взять любой объект, созданный через new Child и посмотреть childObject.constructor.superclass - это и будет ссылка на Parent.prototype
Два последних шага для собственно наследования не важны, но они позволяют провернуть следующий трюк: если A уже был расширен другим классом C, то у него уже есть поле superclass. В итоге мы можем в конструкторе B вызвать и конструктор A, через A.apply(this, arguments) и конструктор C, через A.superclass.constructor.apply(this, arguments), даже не зная, что именно это за функция - С.
#334 #375334
Доброанон, я тот чел, который в истерике спрашивал про match against. Вроде бы подразобрался, спасибо, но вот беда: у меня всё как надо работает на тестовом сервере на моем компьютере, но не работает на купленном хостинге. То есть там вообще всё работает как надо, кроме этого самого match against, который там всё время дает 0 результатов. Тот же код у меня на компе работает. В какую сторону копать? Это может быть отключено у хостера?
#335 #375343
Смотри, ОП, появился черновой вариант спецификации PHP
http://hhvm.com/blog/5723
https://github.com/php/php-langspec/blob/master/spec/php-spec-draft.md
Но там еще HHVM встречается, который мне кажется никому не нужен. Слышу впервые о нем, и думаю, что его никто не использует.
#336 #375352
Есть 2 файла - скрипт и его шаблон с вёрсткой, а также метод, значение которого нужно показать в шаблоне.
Посоветуйте как более правильнее будет: присваивать в скрипте значение метода переменной, а потом эту переменную использовать в шаблоне или сразу использовать метод в шаблоне?
А то у меня подобных штук (вызовов методов из стороннего класса) много и с одной стороны засоряется скрипт, если понаприсваивать многим переменным значения, а с другой шаблон, если без промежуточных переменных.
!xnn2uE3AU. #337 #375354
>>375168

О, офигенно. Колокол внизу по моему называется кривой Гаусса (или нормальным распределением): http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

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

Но вот код можно было бы и улучшить:

> $storage=array(0,0,0,0,0,0,0,0,0,0,0,0,0


есть array_fill

> $dice1=mt_rand(1,6);


> $dice2=mt_rand(1,6);


> $dice3=mt_rand(1,6);


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

> +$dice6-6;


По моему лучше убрать тут -6 и +6 при выводе, и просто выводить чеерз for ($i = 6; ....)

> foreach ($storage as $index => $number) {


Тут есть подвох. Значения в массиве в PHP не сортируются автоматически по ключу, а хранятся в том порядке, в котором добавились. То есть

$x = array();
$x[1] = 1;
$x[0] = 0;
var_dump($x); // array(1 => 1, 0 => 0)

Чтобы это исправить, надо либо изначально заполнить массив по порядку, как ты это сделал, либо отсортировать по ключу через ksort/krsort, либо выводить через for, а не foreach. Лучше изначально заполнить, чтобы гарантированно везде были значения и использовать for для вывода.

> echo "0",$index+6;


Используй str_pad (учти только что он не работает с русскими буквами, только с цифрами и латинницей, а mb_str_pad не существует).

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


> echo "|";


str_repeat
!xnn2uE3AU. #337 #375354
>>375168

О, офигенно. Колокол внизу по моему называется кривой Гаусса (или нормальным распределением): http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

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

Но вот код можно было бы и улучшить:

> $storage=array(0,0,0,0,0,0,0,0,0,0,0,0,0


есть array_fill

> $dice1=mt_rand(1,6);


> $dice2=mt_rand(1,6);


> $dice3=mt_rand(1,6);


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

> +$dice6-6;


По моему лучше убрать тут -6 и +6 при выводе, и просто выводить чеерз for ($i = 6; ....)

> foreach ($storage as $index => $number) {


Тут есть подвох. Значения в массиве в PHP не сортируются автоматически по ключу, а хранятся в том порядке, в котором добавились. То есть

$x = array();
$x[1] = 1;
$x[0] = 0;
var_dump($x); // array(1 => 1, 0 => 0)

Чтобы это исправить, надо либо изначально заполнить массив по порядку, как ты это сделал, либо отсортировать по ключу через ksort/krsort, либо выводить через for, а не foreach. Лучше изначально заполнить, чтобы гарантированно везде были значения и использовать for для вывода.

> echo "0",$index+6;


Используй str_pad (учти только что он не работает с русскими буквами, только с цифрами и латинницей, а mb_str_pad не существует).

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


> echo "|";


str_repeat
!xnn2uE3AU. #338 #375356
>>375169

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


Сохраняем текущее занчение, увеличиваем счетчик, возвращаем сохраненное значение.

№1, №2

Там внизу пишется что надо после return function () [ ... } поставить точку с запятой. Как я понимаю, точка с запятой не ставится после } в for/while/if/определении функции, но в случаях типа:

var x = function () { .. };
return function () { .. };

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

№2 — верно, №1 надо доделать.

> №4


Ты gen и action местами перепутал

> №5



> for (var i = 1; i < arguments.length; i++) {


> a.push(arguments);


Тут есть интересный хак: var a = Array.prototype.slice.call(arguments, 1); — делает то же самое в 1 строку.

> for (i = a.length; i > lengthA; i--) {


> a.splice(i - 1, 1);


Слишком усложненно и ненадежно: удалять лишние аргументы (кстати убрать их можно было 1 вызововом splice, без цикла, а удалить последний элемент можно через x.pop()). Лучше делать по-другому, объединять аргументы в новый массив:

var allArgs = a.concat(newArgs);

№6

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

№7

Все верно, молодец. В браузерах поддерживающих ES5, метод bind() кстати сеть у всех функций.

№11

Все верно.

> олучится же намного сложнее, не?


Ну вообще да, может быть.
!xnn2uE3AU. #338 #375356
>>375169

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


Сохраняем текущее занчение, увеличиваем счетчик, возвращаем сохраненное значение.

№1, №2

Там внизу пишется что надо после return function () [ ... } поставить точку с запятой. Как я понимаю, точка с запятой не ставится после } в for/while/if/определении функции, но в случаях типа:

var x = function () { .. };
return function () { .. };

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

№2 — верно, №1 надо доделать.

> №4


Ты gen и action местами перепутал

> №5



> for (var i = 1; i < arguments.length; i++) {


> a.push(arguments);


Тут есть интересный хак: var a = Array.prototype.slice.call(arguments, 1); — делает то же самое в 1 строку.

> for (i = a.length; i > lengthA; i--) {


> a.splice(i - 1, 1);


Слишком усложненно и ненадежно: удалять лишние аргументы (кстати убрать их можно было 1 вызововом splice, без цикла, а удалить последний элемент можно через x.pop()). Лучше делать по-другому, объединять аргументы в новый массив:

var allArgs = a.concat(newArgs);

№6

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

№7

Все верно, молодец. В браузерах поддерживающих ES5, метод bind() кстати сеть у всех функций.

№11

Все верно.

> олучится же намного сложнее, не?


Ну вообще да, может быть.
!xnn2uE3AU. #339 #375358
>>375171

Это логично так как this при вызове функции переопределяется и не передается через замыкание. Зато можно передать переменную:

var self = this;

и использовать ее.

>>375177

В общем, неплохо решено, но есть советы и замечания.

> почему-то обозначена 1


Это мои mad skills в markdown-разметке

> IPowerElement


C I обычно обозначают интерфейсы, так что не очень удачное название.

> IPowerElement.Consumenr


Константы принято писать большими буквами и пояснять к чему они относятся (TYPE): PowerUnit.TYPE_CONSUMER

> IPowerElement.apply(this, [IPowerElement.Producent])


Можно поставить call и массив будет не нужен

> PowerPlant.prototype = Object.create(IPowerElement.prototype);


Наследование лучше вынести в отдельную функцию (и заодно сделать чтобы свойство constructor там правильно проставлялось, чтобы лбыло (new Test()).constructor === Test):

extend(IPowerElement, PowerPlant);

так будет гораздо поще читать код.

> this.day = false;


Я думаю, «деньЛиСейчас» не является свойством города, а должно передаватся в функции расчета баланса как аргумент.

> this.total_balace = 0;


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

> this.power_element = energy_schema;


Лучше называть одно и то же одинаково

> switch (element.type) {


> case IPowerElement.Consumenr:


Тут наверно лучше просто возвращать отрицательное или положительное число в calc_balance

Использование этой штуки лучше бы сделать так:

var city = new City(....);
city.buyEnergy(100); // Покупаем энергию до расчета баланса, логично?
var balance = city.calcBalance(); // а теперь считаем и смотрим что вышло

if (banance > 0) {
...
} else {
...
}

Ну и написание через подчеркивание, конечно, режет глаз. Ведь никто вроде не использует такой стиль: методы DOM в JS (createElement), jQuery ($.addClass), Backbone, Angular — все используют кемелкейс.

Ну и я там еще чуть подправил условие, чтобы был смысл исплоьзовать несколько линий передачи.
!xnn2uE3AU. #339 #375358
>>375171

Это логично так как this при вызове функции переопределяется и не передается через замыкание. Зато можно передать переменную:

var self = this;

и использовать ее.

>>375177

В общем, неплохо решено, но есть советы и замечания.

> почему-то обозначена 1


Это мои mad skills в markdown-разметке

> IPowerElement


C I обычно обозначают интерфейсы, так что не очень удачное название.

> IPowerElement.Consumenr


Константы принято писать большими буквами и пояснять к чему они относятся (TYPE): PowerUnit.TYPE_CONSUMER

> IPowerElement.apply(this, [IPowerElement.Producent])


Можно поставить call и массив будет не нужен

> PowerPlant.prototype = Object.create(IPowerElement.prototype);


Наследование лучше вынести в отдельную функцию (и заодно сделать чтобы свойство constructor там правильно проставлялось, чтобы лбыло (new Test()).constructor === Test):

extend(IPowerElement, PowerPlant);

так будет гораздо поще читать код.

> this.day = false;


Я думаю, «деньЛиСейчас» не является свойством города, а должно передаватся в функции расчета баланса как аргумент.

> this.total_balace = 0;


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

> this.power_element = energy_schema;


Лучше называть одно и то же одинаково

> switch (element.type) {


> case IPowerElement.Consumenr:


Тут наверно лучше просто возвращать отрицательное или положительное число в calc_balance

Использование этой штуки лучше бы сделать так:

var city = new City(....);
city.buyEnergy(100); // Покупаем энергию до расчета баланса, логично?
var balance = city.calcBalance(); // а теперь считаем и смотрим что вышло

if (banance > 0) {
...
} else {
...
}

Ну и написание через подчеркивание, конечно, режет глаз. Ведь никто вроде не использует такой стиль: методы DOM в JS (createElement), jQuery ($.addClass), Backbone, Angular — все используют кемелкейс.

Ну и я там еще чуть подправил условие, чтобы был смысл исплоьзовать несколько линий передачи.
!xnn2uE3AU. #340 #375359
>>375180

> Почему одно и то же?


Потому что у тебя написано: Rabbit.prototype = animal;

> Я путаю. В свойстве prototype хранится прототип?


Нет, это просто свойство с именем «prototype».

Прототип обычно обозначается как obj.[[proto]] и в коде так написать нельзя, это условное обозначение. В коде можно только написать Object.getPrototypeOf(obj)

> Почему не Object? Получается Object.prototype - это прототип o и Object?


Object.prototype — это свойство с именем «prototype» у Object
Object.prototype — это прототип для o

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

То есть:

function Test() {}
var t = new Test(); // t.[[proto]] = Test.prototype

> Почему мы сразу бежим к свойству prototype в объекте Object?


Потому что смотри предыдущий абзац

>>375185

> unction rad($degree)


Есть deg2rad и rad2deg в PHP

> 3.14


Есть pi() и M_PI

> foreach($screen as $y){


> echoimplode("", $y);


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

> for ($i = 0, $number = $fromangle; $number < $toangle; ++$i, $number+=$rotation) {


Лучше конечно вычислять угол как $i / $maxI * ($to - $from) + $from — тогда не накапливаются ошибки округления (при сложении они накапливаются, тут это не важно, но когда шагов много, тысячи и миллионы, ошибка может стать значительной).
!xnn2uE3AU. #340 #375359
>>375180

> Почему одно и то же?


Потому что у тебя написано: Rabbit.prototype = animal;

> Я путаю. В свойстве prototype хранится прототип?


Нет, это просто свойство с именем «prototype».

Прототип обычно обозначается как obj.[[proto]] и в коде так написать нельзя, это условное обозначение. В коде можно только написать Object.getPrototypeOf(obj)

> Почему не Object? Получается Object.prototype - это прототип o и Object?


Object.prototype — это свойство с именем «prototype» у Object
Object.prototype — это прототип для o

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

То есть:

function Test() {}
var t = new Test(); // t.[[proto]] = Test.prototype

> Почему мы сразу бежим к свойству prototype в объекте Object?


Потому что смотри предыдущий абзац

>>375185

> unction rad($degree)


Есть deg2rad и rad2deg в PHP

> 3.14


Есть pi() и M_PI

> foreach($screen as $y){


> echoimplode("", $y);


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

> for ($i = 0, $number = $fromangle; $number < $toangle; ++$i, $number+=$rotation) {


Лучше конечно вычислять угол как $i / $maxI * ($to - $from) + $from — тогда не накапливаются ошибки округления (при сложении они накапливаются, тут это не важно, но когда шагов много, тысячи и миллионы, ошибка может стать значительной).
!xnn2uE3AU. #341 #375362
>>375188

> Они связаны? Как они связаны? Ничего не понимаю.


При создании объекта его прототипом становится то, что было в свойстве prototype у функции-конструктора.

>>375193

> Может правильнее будет, потомок со свойством prototype, в котором лежит ссылка на некий объект-родитель, в котором лежат свойства и методы?


Тут плохие слова, «потомок» и «родитель», так как они ассоциируются с начледованием. Лучше «объект» и «конструктор». Прототипом объета становится то, что было записано в свойсте prototype у конструктора.

>>375205

Хорошо, что работает, но теперь давай переделывать на нормальный ООП.

> Hamburger._ _ proto _ _ =


Это не работает в Хроме и не соответствует стандартам. Прототип объекту задается через определение свойства prototype у функции-конструктора. Это вообще никакого смысла не имеет, так как ты потом перезаисываешь этой свойство несколько раз.

> SMALL_HAMBURGER = {


Константа должна не болтаться в пространстве сама по себе, а принадлежать Hamburger то есть Hamburger.SIZE_SMALL = 'small'. В константе можно хранить только число или строку, а не свйоства гамбургера. Для свойств заведи отдельный массив или словарь.

> (arguments[0]


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

Внутри Hamburger и его методов не должно быть console.log

> newOrder.makeSelection('smallHamburger', 'salad');



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

> newOrder = new Hamburger();


Что ж ты переменные-то экономишь? Новый гамбургер — новая переменная.

Еще. А что будет, если мы вызовем newOrder.calcPrice() ДО того как вызвали makeSelection? Должна быть либо защита от этого, либо надо параметры заказа передавать в конструктор чтобы нельзя было создать объект не указав обязательные свойства.

Алсо, допиcал в условие:

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

!xnn2uE3AU. #341 #375362
>>375188

> Они связаны? Как они связаны? Ничего не понимаю.


При создании объекта его прототипом становится то, что было в свойстве prototype у функции-конструктора.

>>375193

> Может правильнее будет, потомок со свойством prototype, в котором лежит ссылка на некий объект-родитель, в котором лежат свойства и методы?


Тут плохие слова, «потомок» и «родитель», так как они ассоциируются с начледованием. Лучше «объект» и «конструктор». Прототипом объета становится то, что было записано в свойсте prototype у конструктора.

>>375205

Хорошо, что работает, но теперь давай переделывать на нормальный ООП.

> Hamburger._ _ proto _ _ =


Это не работает в Хроме и не соответствует стандартам. Прототип объекту задается через определение свойства prototype у функции-конструктора. Это вообще никакого смысла не имеет, так как ты потом перезаисываешь этой свойство несколько раз.

> SMALL_HAMBURGER = {


Константа должна не болтаться в пространстве сама по себе, а принадлежать Hamburger то есть Hamburger.SIZE_SMALL = 'small'. В константе можно хранить только число или строку, а не свйоства гамбургера. Для свойств заведи отдельный массив или словарь.

> (arguments[0]


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

Внутри Hamburger и его методов не должно быть console.log

> newOrder.makeSelection('smallHamburger', 'salad');



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

> newOrder = new Hamburger();


Что ж ты переменные-то экономишь? Новый гамбургер — новая переменная.

Еще. А что будет, если мы вызовем newOrder.calcPrice() ДО того как вызвали makeSelection? Должна быть либо защита от этого, либо надо параметры заказа передавать в конструктор чтобы нельзя было создать объект не указав обязательные свойства.

Алсо, допиcал в условие:

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

#342 #375365
Нужно хранить настройки сайтика. Чем лучше сереализовать - JSON, YAML или serialize?
!xnn2uE3AU. #343 #375371
>>375214

> ажется я понял что было не так.


Ну наконец-то!

> // Удаляем из массива купюры которых нет в наличии


Это лучше сделать через array_filter (если он не ломает ключи)

> $billsTmp = $canIssue[$sum - $bill][1];


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

А так, теперь вроде все верно рещено.

Про словосочетания - тоже все ок.

>>375215

Каких-то книг на тему не знаю.

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

Алсо, у программ вроде Апача обычно есть раздел в правке под названием «Configuration».

>>375223

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

После этого ты можешь менять свойство prototype у конструктора − но это уже никак на исходный объект не повлияет. Правда, если ты его не заменяешь, а добавляешь в него новые методы, то они станут доступны и объекта.

>>375225

Тебе нужен ftp-клиент на PHP

>>375227

Это не имеет никакого смысла, только код усложняет.

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


self-invoked function используется только для того, чтобы не засорять глобальную область переменными, сравни:

var a = 1, b = 2, с = 3; // мы создали 3 глобальных переменных

(function () {
var a = 1, b = 2, с = 3; // это локлаьгые переменные, которые не попадают в глобальную область видимости и не видны за пределами функции
....
})();

У тебя там никаких переменных нет — значит то, что ты написал, не нужно.

В ES6 это можно будет сделать проще:

{
let a = 1, b = 2, с = 3; // эти переменные существуют только внутри блока
...
}

>>375230

> Зачем мне дополнительный метод для добавок?


Потому что не надо все в конструктор сваливать.

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


Тебе не надо это делать. Тебе надо сделать 3 свойства у объекта Hamburger:

- тип
- начинка
- добавки

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

> Вообще реально узнать какому объекту принадлежит свойство?


Если ты пишешь код не наугад, а осмысленно, то ты должен это знать.

> this.extended1 = extended1;


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

Обрати внимание, я там в условие задачи добавил пункт про защиту от ошибок.
!xnn2uE3AU. #343 #375371
>>375214

> ажется я понял что было не так.


Ну наконец-то!

> // Удаляем из массива купюры которых нет в наличии


Это лучше сделать через array_filter (если он не ломает ключи)

> $billsTmp = $canIssue[$sum - $bill][1];


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

А так, теперь вроде все верно рещено.

Про словосочетания - тоже все ок.

>>375215

Каких-то книг на тему не знаю.

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

Алсо, у программ вроде Апача обычно есть раздел в правке под названием «Configuration».

>>375223

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

После этого ты можешь менять свойство prototype у конструктора − но это уже никак на исходный объект не повлияет. Правда, если ты его не заменяешь, а добавляешь в него новые методы, то они станут доступны и объекта.

>>375225

Тебе нужен ftp-клиент на PHP

>>375227

Это не имеет никакого смысла, только код усложняет.

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


self-invoked function используется только для того, чтобы не засорять глобальную область переменными, сравни:

var a = 1, b = 2, с = 3; // мы создали 3 глобальных переменных

(function () {
var a = 1, b = 2, с = 3; // это локлаьгые переменные, которые не попадают в глобальную область видимости и не видны за пределами функции
....
})();

У тебя там никаких переменных нет — значит то, что ты написал, не нужно.

В ES6 это можно будет сделать проще:

{
let a = 1, b = 2, с = 3; // эти переменные существуют только внутри блока
...
}

>>375230

> Зачем мне дополнительный метод для добавок?


Потому что не надо все в конструктор сваливать.

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


Тебе не надо это делать. Тебе надо сделать 3 свойства у объекта Hamburger:

- тип
- начинка
- добавки

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

> Вообще реально узнать какому объекту принадлежит свойство?


Если ты пишешь код не наугад, а осмысленно, то ты должен это знать.

> this.extended1 = extended1;


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

Обрати внимание, я там в условие задачи добавил пункт про защиту от ошибок.
!xnn2uE3AU. #344 #375372
>>375263

Тут лучше для начала в википедии например про алгоритмы поиска пути почитать: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

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

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



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

foreach ($paths[$point] as $variant => $byAndTime) {
makeOneStep($paths, $pathDone, $time, $point, $variant);
}

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

> Как сохранять и куда сохранять результаты вызова функции в функции


В переменную или массив: $x = func(....) — ты с такой коснтрукцией не сталкивался что ли?

>>375273

Не знаю, а какие файлы?

>>375290

Ок, все верно.

>>375299

> var b = new B(12, 5);


Ты вызваешь функицю B и что-то ей передаешь. А что она делает с этими данными?

> function B() {


> }


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

function B(...) {
A.call(this, ....);
...
}

То есть мы при создании объекта, когда вызвается уонструктор B, вручную вызваем A, передаем ему this (указывающий на объект) и аргументы, а только потом делаем что-то свое.

>>375309

> а внутри конструктора B прописывается A.superclass.constructor.apply(this, arguments), но у меня это не работает.


Покажи код

А вообеще, в JS нельзя (без хитростей) так просто вызывать родительский метод с тем же именем. В PHP это делается так:

parent::method(...);

А в JS приходится писать:

ParentClass.prototype.method.call(this, ....);

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


Все эти миксины — фигня, так как занимаются именно копированием (а не используют прототипы), не определяются через instanceof и имеют множество несдостатков.

> А вообще есть фреймвор


Вообще, есть много библиотек для этого:

http://ejohn.org/blog/simple-javascript-inheritance/
http://code.google.com/p/jsclassextend/
http://bladerunnerjs.org/blog/topiarist/
http://prototypejs.org/learn/class-inheritance
http://jsclass.jcoglan.com/classes.html
https://github.com/EvanHahn/MiniClass

Можешь поизучать на досуге. Я советую взять ту, что попроще и разобрать исходный код.
!xnn2uE3AU. #344 #375372
>>375263

Тут лучше для начала в википедии например про алгоритмы поиска пути почитать: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

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

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



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

foreach ($paths[$point] as $variant => $byAndTime) {
makeOneStep($paths, $pathDone, $time, $point, $variant);
}

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

> Как сохранять и куда сохранять результаты вызова функции в функции


В переменную или массив: $x = func(....) — ты с такой коснтрукцией не сталкивался что ли?

>>375273

Не знаю, а какие файлы?

>>375290

Ок, все верно.

>>375299

> var b = new B(12, 5);


Ты вызваешь функицю B и что-то ей передаешь. А что она делает с этими данными?

> function B() {


> }


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

function B(...) {
A.call(this, ....);
...
}

То есть мы при создании объекта, когда вызвается уонструктор B, вручную вызваем A, передаем ему this (указывающий на объект) и аргументы, а только потом делаем что-то свое.

>>375309

> а внутри конструктора B прописывается A.superclass.constructor.apply(this, arguments), но у меня это не работает.


Покажи код

А вообеще, в JS нельзя (без хитростей) так просто вызывать родительский метод с тем же именем. В PHP это делается так:

parent::method(...);

А в JS приходится писать:

ParentClass.prototype.method.call(this, ....);

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


Все эти миксины — фигня, так как занимаются именно копированием (а не используют прототипы), не определяются через instanceof и имеют множество несдостатков.

> А вообще есть фреймвор


Вообще, есть много библиотек для этого:

http://ejohn.org/blog/simple-javascript-inheritance/
http://code.google.com/p/jsclassextend/
http://bladerunnerjs.org/blog/topiarist/
http://prototypejs.org/learn/class-inheritance
http://jsclass.jcoglan.com/classes.html
https://github.com/EvanHahn/MiniClass

Можешь поизучать на досуге. Я советую взять ту, что попроще и разобрать исходный код.
!xnn2uE3AU. #345 #375374
>>375312

Круто и важно.

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


Ну не знаю, вот например тут посмотри: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=habr+mvc+php

Сама идея MVC в разделении кода на 3 части:

- модель, которая не взаимодействует со внешним миром, но включает в себя всю бизнес-логику. В PHP это значит что модель ни в коем случае не лезет в GET/POST/COOKIE, это все забота контроллера. И никогда ничего не выводит через echo или аналогичный метод. Зато модель может взаимодействовать с БД.
- вью, которое обычно вызвается контроллером и которое отображает переданные ему данные.
- контроллер, который принимает запросы от пользователя, вызвает нужные методы модели для их обработки и вью для отображения ответа. Контроллер никогда не лезет в базу данных сам, а просит сделать это модель. Контроллер ничего не выводит сам, а вызвает вью.

Заметь, нигде не написано что это должно делаться на ООП, но обычно используют именно его — так удобнее.

>>375318

Лучше писать [[proto]] а то вызвает ощущение что к прототипу можно обратиться напрямую.

>>375334

Может там другой тип таблицы MyISAM/InnoDB? Или кодировка не настроена?

>>375343

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


HHVM — это виртуальная машина от фейсбука (который ее внезапно использует), которая умеет выполнять php-код. Зачем она? Ради повышения производительности.

Первоначально фейсбук пытался ускорить PHP, преобразуя код на нем в Си++ (который выполняется быстрее, так как это компилируемый, а не интерпретируемый язык и Си++ компилируется напрямую в машинный код который понимает процессор). Этот компилятор назывался HipHop, он работал но не очень круто. Дело в том, что для ускорения надо четко знать типы используемых переменных (строка там будет или число, или массив), классы, к которым отноится тот или иной объект, а глядя на исходный код, понять это трудно.

Потому фейсбук решил применить другой подход, который успешно применяется в Java и в Гугл Хроме для ускорения яваскрипта. Это JIT, то есть компиляция кусков кода во время выполнения программы. Во время выполнения программы HHVM записывает, какие функции часто вызываются, какого типа переменные в них передаются и самые частоисопльзуемые компилируются в машинный код с учтом информации о типах переменных (знание этой информации и позволяет оптимизировать код). Собственно, такой подход работает эффективнее так как во время выполенния кода мы можем анализировать, что хранится в переменных.

Логика тут примерно такая. Допустим, есть функция

doDomething($var)

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

doSomethingInteger($var)

И вызываеть ее по такому принципу:

Если (вызвается функция doSomething и в $var целое число) {
вызвать вместо нее более эффективную doSomethingInteger($var)
} иначе {
вызваем исходую функцию
}

Ну и другие оптимизации. Например, у нас есть обращение к методу какого-то объекта:

$obj->method1();

Интерпретатор PHP не знает, какой объект будет в $obj потому вынужден делать так каждый раз:

- определить к какому классу относится $obj
- взять список методов этого класса и найти в нем 'method1' и его адрес в памяти
- выполнить код по этому адресу

А HHVM может сделать оптимизацию. Допустим, он заметил что в этом месте в $obj всегда приходит объект класса ClassX. Тогда он может заранее найти адрес метода method1 в таблице методов ClassX (сохранив его например в переменную addressMethod1) и сделать так:

Если ($obj относится к классу ClassX) {
вызвать метод по адресу addressMehod1 (эконоим время на поиск метода в таблице методов)
} иначе {
работаем по стандартному, медленному алгоритму
}

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

Подробнее: http://hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit (англ)
!xnn2uE3AU. #345 #375374
>>375312

Круто и важно.

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


Ну не знаю, вот например тут посмотри: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=habr+mvc+php

Сама идея MVC в разделении кода на 3 части:

- модель, которая не взаимодействует со внешним миром, но включает в себя всю бизнес-логику. В PHP это значит что модель ни в коем случае не лезет в GET/POST/COOKIE, это все забота контроллера. И никогда ничего не выводит через echo или аналогичный метод. Зато модель может взаимодействовать с БД.
- вью, которое обычно вызвается контроллером и которое отображает переданные ему данные.
- контроллер, который принимает запросы от пользователя, вызвает нужные методы модели для их обработки и вью для отображения ответа. Контроллер никогда не лезет в базу данных сам, а просит сделать это модель. Контроллер ничего не выводит сам, а вызвает вью.

Заметь, нигде не написано что это должно делаться на ООП, но обычно используют именно его — так удобнее.

>>375318

Лучше писать [[proto]] а то вызвает ощущение что к прототипу можно обратиться напрямую.

>>375334

Может там другой тип таблицы MyISAM/InnoDB? Или кодировка не настроена?

>>375343

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


HHVM — это виртуальная машина от фейсбука (который ее внезапно использует), которая умеет выполнять php-код. Зачем она? Ради повышения производительности.

Первоначально фейсбук пытался ускорить PHP, преобразуя код на нем в Си++ (который выполняется быстрее, так как это компилируемый, а не интерпретируемый язык и Си++ компилируется напрямую в машинный код который понимает процессор). Этот компилятор назывался HipHop, он работал но не очень круто. Дело в том, что для ускорения надо четко знать типы используемых переменных (строка там будет или число, или массив), классы, к которым отноится тот или иной объект, а глядя на исходный код, понять это трудно.

Потому фейсбук решил применить другой подход, который успешно применяется в Java и в Гугл Хроме для ускорения яваскрипта. Это JIT, то есть компиляция кусков кода во время выполнения программы. Во время выполнения программы HHVM записывает, какие функции часто вызываются, какого типа переменные в них передаются и самые частоисопльзуемые компилируются в машинный код с учтом информации о типах переменных (знание этой информации и позволяет оптимизировать код). Собственно, такой подход работает эффективнее так как во время выполенния кода мы можем анализировать, что хранится в переменных.

Логика тут примерно такая. Допустим, есть функция

doDomething($var)

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

doSomethingInteger($var)

И вызываеть ее по такому принципу:

Если (вызвается функция doSomething и в $var целое число) {
вызвать вместо нее более эффективную doSomethingInteger($var)
} иначе {
вызваем исходую функцию
}

Ну и другие оптимизации. Например, у нас есть обращение к методу какого-то объекта:

$obj->method1();

Интерпретатор PHP не знает, какой объект будет в $obj потому вынужден делать так каждый раз:

- определить к какому классу относится $obj
- взять список методов этого класса и найти в нем 'method1' и его адрес в памяти
- выполнить код по этому адресу

А HHVM может сделать оптимизацию. Допустим, он заметил что в этом месте в $obj всегда приходит объект класса ClassX. Тогда он может заранее найти адрес метода method1 в таблице методов ClassX (сохранив его например в переменную addressMethod1) и сделать так:

Если ($obj относится к классу ClassX) {
вызвать метод по адресу addressMehod1 (эконоим время на поиск метода в таблице методов)
} иначе {
работаем по стандартному, медленному алгоритму
}

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

Подробнее: http://hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit (англ)
!xnn2uE3AU. #346 #375375
>>375352

> или сразу использовать метод в шаблоне?


Это

>>375365

Лучше всего в базу данных, а если в файл то JSON или XML с форматированием.
#347 #375385
>>375371
Когда уже ES6 появится? Там вроде классы будут, как в php например.
#348 #375386
>>375354
Спасибо большое что ответил, думал меня проигнорируют. Я просто учил пхп зимой, а потом как устроился на работку то забил. Сейчас я нахожусь в относительном отдыхе и решил возобновить. Начал с повторения твоего учебника. Но делать одни и те же задания про айфон немного скучно вот и решил. Сейчас поправлю код. И да, для меня главное интерактивность в обучении, ибо хочу научиться писать качественный код.
#350 #375390
>>375374
У меня такая проблема с MVC.
Вью отобразил данные которые в него пришли из контроллера, произошло это методом вью, в котором он реквайрит шаблон.
Мне нужно сделать кнопку, по нажатии которой, отобразится еще что-то. Для этого контроллер должен выдать нужные мне данные.
Обратится к контроллеру как из начальной точки я не могу, так как scope стоит на вью, потому что мы его методом отобразились.
Сначала, я смешал методы вью в контроллер, и тогда я через $this мог вызывать нужные мне методы. Но это ломает MVC.
Теперь я подумал, что можно сделать контроллер глобальной переменной, и на отображенных страницах обращаться к нему через $GLOBALS['ctrl'] например.
И вот вопрос, это приемлемо или я должен с самого начала продумать абсолютно все, что может мне понадобиться и передать его во вью?
#351 #375398
>>375390

>Данные пришли из контроллера

#352 #375400
>>375398
Ну передал во вью те данные, которые пришли из модели.
#353 #375405
>>375374

>Может там другой тип таблицы MyISAM/InnoDB? Или кодировка не настроена?


что это значит и как проверить? В обеих MyISAM (и у меня на тестовом, и на хостинге), кодировка одна и та же вроде (utf8_general_ci)
Куда еще можно копнуть?
#354 #375421
http://ideone.com/NwTUGb
Как-то так. Получился овал, но если увеличивать коэффициент х и дальше, то правая половина круга сплющивается и получается полукруг.
#355 #375423
>>375421
А можешь коменты сделать? А то что-то мне тяжело въехать.
#356 #375424
>>375423
Теперь понятнее?
#357 #375427
>>375424
То, что ты подписал я и так понял, ты расскажи каким образом построение идет.
#358 #375428
>>375427
Вычисляются координаты буквы по Х через синус и по У через косинус и заносятся в соответствующий элемент пустого массива, который мы выводим на экран. В подсказке к задачке написано.
#359 #375430
>>375356

№1
http://jsbin.com/recegita/3/edit?js,console

№4
http://jsbin.com/zoqevino/4/edit?js,console

№5
http://jsbin.com/gipocuna/3/edit?js,console

№6
http://jsbin.com/labozapa/3/edit?js,console

№12
Вот мой отдельный пост - >>375205
Вот твой ответ - >>375362
Вот исправления - http://jsbin.com/bumukoso/1/edit?js,console

Я, наверное, неправильно использую константы? Эти глобальные константы наверное лишние? Может надо не так: console.log(order1.makeSelection(SIZE_BIG, SALAD)), а так:
console.log(order1.makeSelection(Hamburger.SIZE_BIG, Hamburher.SALAD)) ?
#360 #375432
>>375405
проблема вроде решилась, ухожу.
#361 #375497
>>373424
не хочеш стать модератором веб?

--мм
#362 #375545
>>373719

>Полгода-год. Но это надо не только PHP, а PHP + HTML + JS + CSS + SQL так что скорее год.



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

Если на обучение тратить пару часов после основной работы? Сколько времени займёт?

А если не иметь работы и учить по 8 часов в сутки? Тогда сколько займёт?
#363 #375549
>>375497
щас забаню

--мм
#364 #375556
>>375371
http://jsbin.com/buzade/26/edit?js,console

Не знаю как доступ к аргументам получить.
#365 #375560
>>375545
Я вот раньше тоже такие вопросы когда-то задавал, но потом пошел играть в доту понял, что у всех разные мозги и обучаемость, так что такие вопросы не оче
#366 #375590
Оп, у меня появился следующий вопросы:

1.

if (file_exists(dirname(FILE) . '/defines.php')) {
include_once dirname(FILE) . '/defines.php';
}

if (!defined('_JDEFINES')) {
define('JPATH_BASE', dirname(FILE));
require_once JPATH_BASE.'/includes/defines.php';
}


Почему в одном случае include, а в другом require? Я слышал, что require с if не работает, но похоже, что это неверное утверждение. Мануал говорит, что они идентичны, только require работает быстрее, но при отсутствии файла выдаст фатальную ошибку, а include выдаст предупреждение и продолжит исполнение кода.

На хабре натыкался на то, что для версий PHP < 4.0.2 они были различны, а теперь они полностью взаимозаменяемые.

В коде есть смысл в двух идентичных функциях? Приведи примеры, когда require со своей фатальной ошибкой нужен, а когда include.

2. define('DS', DIRECTORY_SEPARATOR);

Интересно про сепаратор от тебя услышать еще.

3. Если я пишу chdir(public.html), то мы переходим в указанный каталог. Но что это значит? Что значит переходим? Не инклудим же его.

4. realpath(../../index.php) выведет полный путь без точек, начиная с корня файловой системы?

5. $segments = explode(DIRECTORY_SEPARATOR, realpath(FILE));
Зачем писать realpath, если можно указать просто FILE. По мануалу он возвращает абсолютный путь.
#366 #375590
Оп, у меня появился следующий вопросы:

1.

if (file_exists(dirname(FILE) . '/defines.php')) {
include_once dirname(FILE) . '/defines.php';
}

if (!defined('_JDEFINES')) {
define('JPATH_BASE', dirname(FILE));
require_once JPATH_BASE.'/includes/defines.php';
}


Почему в одном случае include, а в другом require? Я слышал, что require с if не работает, но похоже, что это неверное утверждение. Мануал говорит, что они идентичны, только require работает быстрее, но при отсутствии файла выдаст фатальную ошибку, а include выдаст предупреждение и продолжит исполнение кода.

На хабре натыкался на то, что для версий PHP < 4.0.2 они были различны, а теперь они полностью взаимозаменяемые.

В коде есть смысл в двух идентичных функциях? Приведи примеры, когда require со своей фатальной ошибкой нужен, а когда include.

2. define('DS', DIRECTORY_SEPARATOR);

Интересно про сепаратор от тебя услышать еще.

3. Если я пишу chdir(public.html), то мы переходим в указанный каталог. Но что это значит? Что значит переходим? Не инклудим же его.

4. realpath(../../index.php) выведет полный путь без точек, начиная с корня файловой системы?

5. $segments = explode(DIRECTORY_SEPARATOR, realpath(FILE));
Зачем писать realpath, если можно указать просто FILE. По мануалу он возвращает абсолютный путь.
#367 #375619
>>375590
1. Очевидно, include не слишком критичные файлы (настройки например, когда есть дефолтный набор настроек)
3. Переходиш chdir, используешь функции, которые работают с текущей директорией. Перечисление файлов, например.
4. Да.
5. Щито?
#368 #375627
>>373424
http://ideone.com/wI6Gvl

Задача на кредит. Не мог запустить её час наверное, все перепроверил, а в итоге ушел перекусить, и через 40 минут она сама запустилась. Мог Идеон тупить?
#369 #375641
>>375627
Вот на оценки. http://ideone.com/h2NvmE
заебал идеон, сильно напрягает когда он тебе выдает ошибку, и ты не знаешь ты ли где тупанул или он не работает.
#370 #375657
Посаны, объясните, а че сложного в пхп? Вот я вялотекуще пролистываю самоучитель. Да ведь для того, чтобы сделать любую задачу, достаточно лишь по памяти залезть в нужный раздел.
#371 #375658
>>375657
Сколько уже задач сделал?
#372 #375663
>>375658
Сейчас остановился на Порязрядных операторах пхп.
?>
<br>
<?php
$test_var=15;
echo gettype($test_var);// выводит интегер
echo "<br>";
$test_var=15.33;
echo gettype($test_var);
echo "<br>";
$test_var=TRUE;
echo gettype($test_var);
echo "<br>";
$test_var="hi";
echo gettype($test_var);
?>
<br>
<?php
$a=1;
$b=$a;
$c=&$a;
$a=5;
echo $a;
echo "<br>";
echo $b;
echo "<br>";
echo $c;
?>
<br>
<?php
define("Admin_name", "Pupkin");
echo Admin_name;
?>
<br>
<?php
echo PHP_VERSION;
echo "<br>";
echo PHP_OS;
?>
<br>
<?php
echo (10&2);
echo "<br>";
echo 1;

?>
#372 #375663
>>375658
Сейчас остановился на Порязрядных операторах пхп.
?>
<br>
<?php
$test_var=15;
echo gettype($test_var);// выводит интегер
echo "<br>";
$test_var=15.33;
echo gettype($test_var);
echo "<br>";
$test_var=TRUE;
echo gettype($test_var);
echo "<br>";
$test_var="hi";
echo gettype($test_var);
?>
<br>
<?php
$a=1;
$b=$a;
$c=&$a;
$a=5;
echo $a;
echo "<br>";
echo $b;
echo "<br>";
echo $c;
?>
<br>
<?php
define("Admin_name", "Pupkin");
echo Admin_name;
?>
<br>
<?php
echo PHP_VERSION;
echo "<br>";
echo PHP_OS;
?>
<br>
<?php
echo (10&2);
echo "<br>";
echo 1;

?>
#373 #375664
>>375663
Так это еще не задачи. Ты просто изучаешь синтаксис.
#374 #375671
>>375664
ну так любые задачи можно решить, зная сей синтаксис.
#375 #375678
Что с айдеоном? Он рандомно выдаёт ошибки сегодня. Один и тот же код может как успешно выполниться, так и выдать ошибку (никаких рандомных значений в коде нет если что).
38 Кб, 801x556
#376 #375682
#377 #375692
>>375678
установи себе пхп, что ты как негр?
#378 #375693
>>375692
У меня стоит апач, но я просто привык уже к айдеону.
#379 #375702
>>375693
не понимаю, как можно учить какой-то язык не на специально для этого установленной программе.
#380 #375703
>>375702
Какая разница? Результат то один и тот же. Да и я начинал его учить на апаче, через сублайм текст, это уже после книжки Никсона пришел сюда решать задачки.
#381 #375706
>>375703
Лишний интерфейс, задержка, логи вебсервера не посмотреть
#382 #375722
>>375702
херачил на нотпаде всю свою учёбу, даже не знал про СР
#383 #375725
>>375703
Но ты же не понимаешь самой сути, для чего этот язык, если сразу его в локалхосте не испробуешь. Я вот сейчас доделаю задачки из мануала и буду его с хтмл и сss связывать.
#384 #375728
Анон а ты не страдаешь чувством стыда из-за общепринятого мнения тип пэхапэ для индусов?
#385 #375729
>>375725
Я же написал, что учил его по Никсону. С чего ты взял, что я не испробовал пхп на локалхосте? Как же еще я мог это делать? И мускул ставил, и соц.сеть сделал. Вернее скопипастил с учебника. Это сейчас я айдеон юзаю, чисто для задачек ОПа.
#386 #375730
>>375671
Сделай MVC-фреймворк.
#387 #375732
>>375728
Общественное мнение не нужно
#388 #375733
>>375729
Но что тебе сейчас мешает скачать пхп и денвер и делать все в блокнотике и на сайте, как белый человек?
#389 #375736
>>375728
Я страдаю от того, что из довольно простого и удобного скриптоязычка для веба пытаются сделать какого-то франкенштейна.
#390 #375737
>>375733
Ничего. Мне даже качать ничего не надо, все итак на харде осталось.
#391 #375740
>>375737
ну и делай в локалхосте тада.
#392 #375741
>>375730
сначала объясни что это.
#393 #375742
>>375740
Не указывай что мне делать, ты мне не мать!
#394 #375743
>>375736
подожди пхп7, там ты охубеешь
#395 #375745
>>375742
Фу, какой даже локалхост ленится открыть, вы посмотрите на него! Какой вообще от тебя, бездаря, толк, тьху, вырастила на свою голову!
#396 #375760

> HTML + JS + CSS


Как вот это лучше учить?
#397 #375761
>>375760

>> HTML + CSS + JS


лучше в такой последовательности. по мануалам.
#398 #375765
>>375760
На codecademy есть соответствующие курсы.
!xnn2uE3AU. #399 #375777
>>375385

http://kangax.github.io/compat-table/es6/

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

>>375386

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

>>375389

> echo "0",$index;


str_pad же есть

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


> echo "|";


str_repeat

> 480


Тут пробел нужен: 48 0

>>375390

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


Должен продумать заранее. Но там обычно много не бывает, максимум 10 переменных. Если у тебя больше, то надо подумать, не пора ли переходить на ООП и передавать объект-пользователя вместо отдельных его полей. Ну или массив хотя бы.

>>375421

Чтобы был круг, нужен коэффициент больше, не 1.5 а может 2 или 2.2 или еще больше.

А так, норм сделано.
!xnn2uE3AU. #399 #375777
>>375385

http://kangax.github.io/compat-table/es6/

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

>>375386

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

>>375389

> echo "0",$index;


str_pad же есть

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


> echo "|";


str_repeat

> 480


Тут пробел нужен: 48 0

>>375390

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


Должен продумать заранее. Но там обычно много не бывает, максимум 10 переменных. Если у тебя больше, то надо подумать, не пора ли переходить на ООП и передавать объект-пользователя вместо отдельных его полей. Ну или массив хотя бы.

>>375421

Чтобы был круг, нужен коэффициент больше, не 1.5 а может 2 или 2.2 или еще больше.

А так, норм сделано.
!xnn2uE3AU. #400 #375782
Аноны, а что это вы в яваскрипт-задачках пропускаете некоторые? Лучше бы все решить.

>>375430

№1 — верно
№4 — выводит 4, 9, 16... а должно выводить 1, 4, 9
№5

> if (allArgs.length > a.length) {


В чем смысл этого условия? У тебя строчкой выше делается allArgs = [] то есть его длину будет 0

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

№6 — не рабоатет

Делаем такой код:

function testArgs() { return [].slice.call(arguments); }
var partial1 = partial(testArgs, 1, undefined, undefined, 4);
console.log(partial1(2, 3, 5, 6)); // [1, 2, 3, 4, 5, 6]

И получаем совсем не то в итоге: http://jsbin.com/lunihowa/1/edit

№12

> Эти глобальные константы наверное лишние?


Конечно. Константа должна в данном случае относиться к «классу» Hamburger а не болтаться где-то в пространстве. И конечно по 2 копии каждой контанты не надо делать.

> Hamburger.properties = {


> small: { price: 50, calor: 20 },


тут тоже надо использовать константу, а не строку small.

Также, надо бы сделать нормально свойства. Какие свойства у гамбургера? Очеивдно:

- тип
- начинка
- добавки

Логичнее сделать 3 отделбных свойства, а не валить все в один массив.

Также, не вижу как добавить добавку. Для этого стоит сделать отдельнй метод.

При ошибке лучше выбрасывать исключение, а то ошибку сразу можно не заметить (если в программе есть еще куча других действий).
!xnn2uE3AU. #400 #375782
Аноны, а что это вы в яваскрипт-задачках пропускаете некоторые? Лучше бы все решить.

>>375430

№1 — верно
№4 — выводит 4, 9, 16... а должно выводить 1, 4, 9
№5

> if (allArgs.length > a.length) {


В чем смысл этого условия? У тебя строчкой выше делается allArgs = [] то есть его длину будет 0

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

№6 — не рабоатет

Делаем такой код:

function testArgs() { return [].slice.call(arguments); }
var partial1 = partial(testArgs, 1, undefined, undefined, 4);
console.log(partial1(2, 3, 5, 6)); // [1, 2, 3, 4, 5, 6]

И получаем совсем не то в итоге: http://jsbin.com/lunihowa/1/edit

№12

> Эти глобальные константы наверное лишние?


Конечно. Константа должна в данном случае относиться к «классу» Hamburger а не болтаться где-то в пространстве. И конечно по 2 копии каждой контанты не надо делать.

> Hamburger.properties = {


> small: { price: 50, calor: 20 },


тут тоже надо использовать константу, а не строку small.

Также, надо бы сделать нормально свойства. Какие свойства у гамбургера? Очеивдно:

- тип
- начинка
- добавки

Логичнее сделать 3 отделбных свойства, а не валить все в один массив.

Также, не вижу как добавить добавку. Для этого стоит сделать отдельнй метод.

При ошибке лучше выбрасывать исключение, а то ошибку сразу можно не заметить (если в программе есть еще куча других действий).
!xnn2uE3AU. #401 #375786
>>375545

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

>>375556

> for (var i = 2; i < arguments.length; i++) {


Это аргументы текущей функции, ты ее вызваешь как this.addExtended(); потому там ничего нету.

Не надо так делать. Надо сделать метод вроде

добавитьДобавку(тип);

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

>>375590

Вместо dirname(FILE) лучше писать _ _ DIR _ _

> только require работает быстрее, но при отсутствии файла выдаст фатальную ошибку, а include выдаст предупреждение и продолжит исполнение кода.


Разница именно в этом

> Почему в одном случае include, а в другом require?


Не знаю, мб это писали разные программисты, каждый в своем стиле?

> require с if не работает


Неправда

> Приведи примеры, когда require со своей фатальной ошибкой нужен, а когда include.


Всегда пишу require

> Интересно про сепаратор от тебя услышать еще.


Под Windows он равен \ под Линукс /. Я лично пишу всегда / так как оно работает везде и не надо код уродовать этой константой.

> то мы переходим в указанный каталог. Но что это значит? Что значит переходим?


В операционной системе у каждого процесса (программы) есть «текущий/рабочий каталог» (в Windows их несколько — для каждого диска свой). От него отсчитываются относительные пути, то есть те, которые не начинаются с / или \ или имени диска:

dir/file.txt
.
./x/y/z
../../x

Подробнее: https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3

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


да

> Зачем писать realpath, если можно указать просто FILE


Не знаю. Может автор не знает этого, а може FILE иногда содержит точки. Или нет?
!xnn2uE3AU. #401 #375786
>>375545

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

>>375556

> for (var i = 2; i < arguments.length; i++) {


Это аргументы текущей функции, ты ее вызваешь как this.addExtended(); потому там ничего нету.

Не надо так делать. Надо сделать метод вроде

добавитьДобавку(тип);

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

>>375590

Вместо dirname(FILE) лучше писать _ _ DIR _ _

> только require работает быстрее, но при отсутствии файла выдаст фатальную ошибку, а include выдаст предупреждение и продолжит исполнение кода.


Разница именно в этом

> Почему в одном случае include, а в другом require?


Не знаю, мб это писали разные программисты, каждый в своем стиле?

> require с if не работает


Неправда

> Приведи примеры, когда require со своей фатальной ошибкой нужен, а когда include.


Всегда пишу require

> Интересно про сепаратор от тебя услышать еще.


Под Windows он равен \ под Линукс /. Я лично пишу всегда / так как оно работает везде и не надо код уродовать этой константой.

> то мы переходим в указанный каталог. Но что это значит? Что значит переходим?


В операционной системе у каждого процесса (программы) есть «текущий/рабочий каталог» (в Windows их несколько — для каждого диска свой). От него отсчитываются относительные пути, то есть те, которые не начинаются с / или \ или имени диска:

dir/file.txt
.
./x/y/z
../../x

Подробнее: https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3

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


да

> Зачем писать realpath, если можно указать просто FILE


Не знаю. Может автор не знает этого, а може FILE иногда содержит точки. Или нет?
623 Кб, 800x3639
!xnn2uE3AU. #402 #375787
>>375627

> /spoj/php_run: line 1: exec: php: not found


Это явно у них проблема. Сегодня и jsbin что-то глючит.

Вокруг знаков +, -, = надо ставить пробелы для читабельности:

$credit = $credit + ($credit * $percent) + $fee;

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

>>375641

> сильно напрягает когда он тебе выдает ошибку


Ну можешь себе PHP поставить и запускать в консоли — пик.

Выводить оценки из массива, кстати, гораздо удобнее через implode:

echo implode(', ', $marks);

Решено верно.
184 Кб, 800x975
!xnn2uE3AU. #403 #375798
>>375657

Не все описано в самоучителе.

>>375678

Проблемы видимо какие-то.

>>375702

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

>>375706

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

>>375722

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

>>375725

Норм, сначала язык изучать а потом уже вывод html. Мне например не нравится, когда в учебниках вокруг любой задачи пишется html, body и прочий мусор.
#404 #375843
>>373424
Нахуя вы это учите? Попробуйте хаскель - базарю.
#406 #375905
Что значит канонизированный абсолютный путь к файлу?
sage #407 #375909
Программист постоянно использует в своей работе множество математических концепций. Ниже мы приводим минимальный список материала, которым должен твердо владеть любой программист, претендующий на место интерна в аутсорсинговой компании, делающей веб-сайты. А если вы хотите попасть на место джуниора, то прибавьте к этому доклад на конференции или опубликованную статью в реферируемом математическом журнале. Повторяем, что этот список содержит только элементарные знания, которые, наряду с оператором цикла и условным оператором, ежедневно применяет в работе каждый программист на PHP.

Теория категорий, определение, функторы, эквивалентности, сопряженные функторы (Маклэйн, Categories for working mathematician, Гельфанд-Манин, первая глава).
Группы и алгебры Ли. Группы Ли. Алгебры Ли как их линеаризации. Универсальная обертывающая алгебра, теорема Пуанкаре-Биркгоффа-Витта. Свободные алгебры Ли. Ряд Кэмпбелла-Хаусдорфа и построение группы Ли по ее алгебре (желтый Серр, первая половина).
Алгебраическая топология (Фукс-Фоменко). Когомологии (симплициальные, сингулярные, де Рама), их эквивалентность, двойственность Пуанкаре, гомотопические группы. Размерность. Расслоения (в смысле Серра), спектральные последовательности (Мищенко, "Векторные расслоения..."). Вычисление когомологий классических групп Ли и проективного пространства.
Векторные расслоения, связность, формула Гаусса-Бонне, классы Эйлера, Черна, Понтрягина, Штифеля-Уитни. Мультипликативность характера Черна. Классифицирующие пространства ("Характеристические Классы", Милнор и Сташеф).
Дифференциальная геометрия. Связность Леви-Чивита, кривизна, алгебраическое и дифференциальное тождество Бьянки. Поля Киллинга. Кривизна Гаусса двумерного риманова многообразия. Клеточное разбиение пространства петель в терминах геодезических. Теория Морса на пространстве петель (по книге Милнора "Теория Морса" и Артура Бессе "Эйнштейновы Многообразия"). Главные расслоения и связности в них.
Коммутативная алгебра (Атья-Макдональд). Нетеровы кольца, размерность Крулля, лемма Накаямы, адическое пополнение, целозамкнутость, кольца дискретного нормирования. Плоские модули, локальный критерий плоскости.
Начала алгебраической геометрии. (первая глава Хартсхорна либо Шафаревич либо зеленый Мамфорд). Афинное многообразие, проективное многообразие, проективный морфизм, образ проективного многообразия проективен (через результанты). Пучки. Топология Зариского. Алгебраическое многообразие как окольцованное пространство. Теорема Гильберта о нулях. Спектр кольца.
Начала гомологической алгебры. Группы Ext, Tor для модулей над кольцом, резольвенты, проективные и инъективные модули (Атья-Макдональд). Построение инъективных модулей. Двойственность Гротендика (по книжке Springer Lecture Notes in Math, Grothendieck Duality, номера примерно 21 и 40).
К-теория как когомологический функтор, периодичность Ботта, алгебры Клиффорда. Спиноры (книжка Атьи "К-Теория" либо А.С.Мищенко "Векторые расслоения и их применение"). Спектры. Пространства Эйленберга-Маклейна. Бесконечнократные пространства петель (по книжке Свитцера либо желтой книжке Адамса либо Адамса "Lectures on generalized cohmology", 1972).
Дифференциальные операторы, псевдодифференциальные операторы, символ, эллиптические операторы. Свойства оператора Лапласа. Самосопряженные операторы с дискретным спектром. Оператор Грина и приложения к теории Ходжа на римановых многообразиях. Квантовая механика. (книжка Р.Уэллса по анализу либо Мищенко "Векторые расслоения и их применение").
Гомологическая алгебра (Гельфанд-Манин, все главы проме последней). Когомологии пучков, производные категории, триангулированные категории, производный функтор, спектральная последовательность бикомплекса. Композиция триангулированных функторов и соответствующая спектральная последовательность. Двойственность Вердье. Формализм шести функторов и превратные пучки.
Схемная алгебраическая геометрия, схемы над кольцом, проективные спектры, производные функции, двойственность Серра, когерентные пучки, замена базы. Собственные и отделимые схемы, валюативный критерий собственности и отделимости (Хартсхорн). Функторы, представимость, пространства модулей. Прямые и обратные образы пучков, высшие прямые образы. При собственном отображении высшие прямые образы когерентны.
Когомологические методы в алгебраической геометрии, полунепрерывность когомологий, теорема Зариского о связности, теорема Штейна о разложении.
Голономии, теорема Амброза-Зингера, специальные голономии, классификация голономий, многообразия Калаби-Яу, гиперкэлеровы, теорема Калаби-Яу.
Спиноры на многообразии, оператор Дирака, кривизна Риччи, формула Вейценбека-Лихнеровича, теорема Бохнера. Теорема Богомолова о разложении многообразий с нулевым каноническим классом (Артур Бессе, "Эйнштейновы многообразия").
Когомологии Тэйта и теория полей классов (Касселс-Фрелих, синяя книжка). Вычисление фактора группы Галуа числового поля по коммутанту. Группа Брауэра и ее приложения.
Эргодическая теория. Эргодичность бильярдов.
Комплексные кривые, псевдоконформные отображения, пространства Тейхмюллера, теория Альфорса-Берса (по книжке Альфорса тоненькой).
Рациональный и проконечный гомотопический тип Нерв этального покрытия клеточного пространства гомотопически эквивалентен его проконечному типу. Топологическое определение этальных когомологий. Действие группы Галуа на проконечном гомотопическом типе (Сулливан, "Геометрическая топология").
Этальные когомологии в алгебраической геометрии, функтор сравнения, гензелевы кольца, геометрические точки. Замена базы. Любое гладкое многообразие над полем локально в этальной топологии изоморфно $A^n$. Этальная фундаментальная группа (Милн, обзор Данилова из ВИНИТИ и SGA 4 1/2, первая статья Делиня).
Эллиптические кривые, j-инвариант, автоморфные формы, гипотеза Таниямы-Вейля и ее приложения к теории чисел (теорема Ферма).
Рациональные гомотопии (по последней главе книжки Гельфанда-Манина либо статье Гриффитса-Моргана-Длиня-Сулливана). Операции Масси и рациональный гомотопический тип. Зануление операций Масси на кэлеровом многообразии.
Группы Шевалле, их образующие и соотношения (по книжке Стейнберга). Вычисление группы K_2 от поля (Милнор, Алгебраическая К-Теория).
Алгебраическая К-теория Квиллена, $BGL^+$ и $Q$-конструкция (обзор Суслина в 25-м томе ВИНИТИ, лекции Квиллена - Lecture Notes in Math. 341).
Теорема Хартогса о продолжении аналитической функции. Многомерная формула Коши и ее приложения (равномерный предел голоморфных функций голоморфен).
Теория Кодаиры-Спенсера. Деформации многообразия и решения уравнения Маурера-Картана. Разрешимость Маурера-Картана и операции Масси на DG-алгебре Ли когомологий векторных полей. Пространства модулей и их конечномерность (см. лекции Концевича, либо собрание сочинений Кодаиры). Теорема Богомолова-Тиана-Тодорова о деформациях Калаби-Яу.
Симплектическая редукция. Отображение моментов. Теорема Кемпфа-Несс.
Деформации когерентных пучков и расслоений в алгебраической геометрии. Геометрическая теория инвариантов. Пространство модулей расслоений на кривой. Стабильность. Компактификации Уленбек, Гизекера и Маруямы. Геометрическая теория инвариантов это симплектическая редукция (третье издание Геометрической Теории Инвариантов Мамфорда, приложения Фрэнсис Кирван).
Инстантоны в четырехмерной геометрии. Теория Дональдсона. Инварианты Дональдсона. Инстантоны на кэлеровых поверхностях.
Псевдоголоморфные кривые на симплектическом многообразии. Инварианты Громова-Уиттена. Квантовые когомологии. Зеркальная гипотеза и ее интерпретации. Структура группы симплектоморфизмов (по статье Концевича-Манина, книжке Полтеровича "Симплектическая геометрия", зеленой книжке о псевдоголоморфных кривых и запискам лекций МакДафф и Саламона).
Комплексные спиноры, уравнение Зайберга-Уиттена, инварианты Зайберга-Уиттена. Почему инварианты Зайберга-Уиттена равны инвариантам Громова-Уиттена.
sage #407 #375909
Программист постоянно использует в своей работе множество математических концепций. Ниже мы приводим минимальный список материала, которым должен твердо владеть любой программист, претендующий на место интерна в аутсорсинговой компании, делающей веб-сайты. А если вы хотите попасть на место джуниора, то прибавьте к этому доклад на конференции или опубликованную статью в реферируемом математическом журнале. Повторяем, что этот список содержит только элементарные знания, которые, наряду с оператором цикла и условным оператором, ежедневно применяет в работе каждый программист на PHP.

Теория категорий, определение, функторы, эквивалентности, сопряженные функторы (Маклэйн, Categories for working mathematician, Гельфанд-Манин, первая глава).
Группы и алгебры Ли. Группы Ли. Алгебры Ли как их линеаризации. Универсальная обертывающая алгебра, теорема Пуанкаре-Биркгоффа-Витта. Свободные алгебры Ли. Ряд Кэмпбелла-Хаусдорфа и построение группы Ли по ее алгебре (желтый Серр, первая половина).
Алгебраическая топология (Фукс-Фоменко). Когомологии (симплициальные, сингулярные, де Рама), их эквивалентность, двойственность Пуанкаре, гомотопические группы. Размерность. Расслоения (в смысле Серра), спектральные последовательности (Мищенко, "Векторные расслоения..."). Вычисление когомологий классических групп Ли и проективного пространства.
Векторные расслоения, связность, формула Гаусса-Бонне, классы Эйлера, Черна, Понтрягина, Штифеля-Уитни. Мультипликативность характера Черна. Классифицирующие пространства ("Характеристические Классы", Милнор и Сташеф).
Дифференциальная геометрия. Связность Леви-Чивита, кривизна, алгебраическое и дифференциальное тождество Бьянки. Поля Киллинга. Кривизна Гаусса двумерного риманова многообразия. Клеточное разбиение пространства петель в терминах геодезических. Теория Морса на пространстве петель (по книге Милнора "Теория Морса" и Артура Бессе "Эйнштейновы Многообразия"). Главные расслоения и связности в них.
Коммутативная алгебра (Атья-Макдональд). Нетеровы кольца, размерность Крулля, лемма Накаямы, адическое пополнение, целозамкнутость, кольца дискретного нормирования. Плоские модули, локальный критерий плоскости.
Начала алгебраической геометрии. (первая глава Хартсхорна либо Шафаревич либо зеленый Мамфорд). Афинное многообразие, проективное многообразие, проективный морфизм, образ проективного многообразия проективен (через результанты). Пучки. Топология Зариского. Алгебраическое многообразие как окольцованное пространство. Теорема Гильберта о нулях. Спектр кольца.
Начала гомологической алгебры. Группы Ext, Tor для модулей над кольцом, резольвенты, проективные и инъективные модули (Атья-Макдональд). Построение инъективных модулей. Двойственность Гротендика (по книжке Springer Lecture Notes in Math, Grothendieck Duality, номера примерно 21 и 40).
К-теория как когомологический функтор, периодичность Ботта, алгебры Клиффорда. Спиноры (книжка Атьи "К-Теория" либо А.С.Мищенко "Векторые расслоения и их применение"). Спектры. Пространства Эйленберга-Маклейна. Бесконечнократные пространства петель (по книжке Свитцера либо желтой книжке Адамса либо Адамса "Lectures on generalized cohmology", 1972).
Дифференциальные операторы, псевдодифференциальные операторы, символ, эллиптические операторы. Свойства оператора Лапласа. Самосопряженные операторы с дискретным спектром. Оператор Грина и приложения к теории Ходжа на римановых многообразиях. Квантовая механика. (книжка Р.Уэллса по анализу либо Мищенко "Векторые расслоения и их применение").
Гомологическая алгебра (Гельфанд-Манин, все главы проме последней). Когомологии пучков, производные категории, триангулированные категории, производный функтор, спектральная последовательность бикомплекса. Композиция триангулированных функторов и соответствующая спектральная последовательность. Двойственность Вердье. Формализм шести функторов и превратные пучки.
Схемная алгебраическая геометрия, схемы над кольцом, проективные спектры, производные функции, двойственность Серра, когерентные пучки, замена базы. Собственные и отделимые схемы, валюативный критерий собственности и отделимости (Хартсхорн). Функторы, представимость, пространства модулей. Прямые и обратные образы пучков, высшие прямые образы. При собственном отображении высшие прямые образы когерентны.
Когомологические методы в алгебраической геометрии, полунепрерывность когомологий, теорема Зариского о связности, теорема Штейна о разложении.
Голономии, теорема Амброза-Зингера, специальные голономии, классификация голономий, многообразия Калаби-Яу, гиперкэлеровы, теорема Калаби-Яу.
Спиноры на многообразии, оператор Дирака, кривизна Риччи, формула Вейценбека-Лихнеровича, теорема Бохнера. Теорема Богомолова о разложении многообразий с нулевым каноническим классом (Артур Бессе, "Эйнштейновы многообразия").
Когомологии Тэйта и теория полей классов (Касселс-Фрелих, синяя книжка). Вычисление фактора группы Галуа числового поля по коммутанту. Группа Брауэра и ее приложения.
Эргодическая теория. Эргодичность бильярдов.
Комплексные кривые, псевдоконформные отображения, пространства Тейхмюллера, теория Альфорса-Берса (по книжке Альфорса тоненькой).
Рациональный и проконечный гомотопический тип Нерв этального покрытия клеточного пространства гомотопически эквивалентен его проконечному типу. Топологическое определение этальных когомологий. Действие группы Галуа на проконечном гомотопическом типе (Сулливан, "Геометрическая топология").
Этальные когомологии в алгебраической геометрии, функтор сравнения, гензелевы кольца, геометрические точки. Замена базы. Любое гладкое многообразие над полем локально в этальной топологии изоморфно $A^n$. Этальная фундаментальная группа (Милн, обзор Данилова из ВИНИТИ и SGA 4 1/2, первая статья Делиня).
Эллиптические кривые, j-инвариант, автоморфные формы, гипотеза Таниямы-Вейля и ее приложения к теории чисел (теорема Ферма).
Рациональные гомотопии (по последней главе книжки Гельфанда-Манина либо статье Гриффитса-Моргана-Длиня-Сулливана). Операции Масси и рациональный гомотопический тип. Зануление операций Масси на кэлеровом многообразии.
Группы Шевалле, их образующие и соотношения (по книжке Стейнберга). Вычисление группы K_2 от поля (Милнор, Алгебраическая К-Теория).
Алгебраическая К-теория Квиллена, $BGL^+$ и $Q$-конструкция (обзор Суслина в 25-м томе ВИНИТИ, лекции Квиллена - Lecture Notes in Math. 341).
Теорема Хартогса о продолжении аналитической функции. Многомерная формула Коши и ее приложения (равномерный предел голоморфных функций голоморфен).
Теория Кодаиры-Спенсера. Деформации многообразия и решения уравнения Маурера-Картана. Разрешимость Маурера-Картана и операции Масси на DG-алгебре Ли когомологий векторных полей. Пространства модулей и их конечномерность (см. лекции Концевича, либо собрание сочинений Кодаиры). Теорема Богомолова-Тиана-Тодорова о деформациях Калаби-Яу.
Симплектическая редукция. Отображение моментов. Теорема Кемпфа-Несс.
Деформации когерентных пучков и расслоений в алгебраической геометрии. Геометрическая теория инвариантов. Пространство модулей расслоений на кривой. Стабильность. Компактификации Уленбек, Гизекера и Маруямы. Геометрическая теория инвариантов это симплектическая редукция (третье издание Геометрической Теории Инвариантов Мамфорда, приложения Фрэнсис Кирван).
Инстантоны в четырехмерной геометрии. Теория Дональдсона. Инварианты Дональдсона. Инстантоны на кэлеровых поверхностях.
Псевдоголоморфные кривые на симплектическом многообразии. Инварианты Громова-Уиттена. Квантовые когомологии. Зеркальная гипотеза и ее интерпретации. Структура группы симплектоморфизмов (по статье Концевича-Манина, книжке Полтеровича "Симплектическая геометрия", зеленой книжке о псевдоголоморфных кривых и запискам лекций МакДафф и Саламона).
Комплексные спиноры, уравнение Зайберга-Уиттена, инварианты Зайберга-Уиттена. Почему инварианты Зайберга-Уиттена равны инвариантам Громова-Уиттена.
4 Кб, 259x194
#408 #375919
#409 #375948
>>375777

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


Решил начать с простого, в этот раз обязательно планирую дойти и до сложного.

>str_pad же есть


>str_repeat


>Тут пробел нужен: 48 0



http://ideone.com/kTkT98

Вот исправил и доделал
#410 #375950
>>374368

>Для кнопок ALL / GRAPHIC / ILLUSTRATION / MOTION надо сделать чтобы работало переключение, средствами CSS3


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

>, например как описано тут: http://habrahabr.ru/post/138020/


Я прочитал статью, стал делать как там, но что-то не выходит, наверное, потому что я что-то не понимаю. Можешь объяснить, что там в CSS-коде происходит?

>А ты уверен, что тут нельзя использовать display: block; text-align: center; ?


Что-то не понял - display: block; и text-align: center; для чего?

>И насчет удаления пробелов, хак с font-size 0 очень плохой, так как работает не везде. Вот статья с описанием других способов:


Какой посоветуешь?
#411 #375965
>>375905
Полный путь, в котором разрешили все симлинки и убрали все "..", емнип.
#412 #375973
>>375909

>программирование


>математика


>1984



>программирование


>решение задач


>2014



гыгы))
#413 #375993
Пытаюсь загрузить изображения по средствам формы и move_uploaded_file
На денвере изображения сохраняются относительно подключенного диска, в моем случае Y, создавать каталоги нельзя. В иксах же вообще ничего не пишет и не сохроняет, в чем может быть проблема такого поведения, что включить подкрутить надо для сохранения в созданные мной каталоги файлов?
#414 #376013
>>375787

http://ideone.com/umskKe

Сделал вывод через имплод. Спасибо за подобные хинты. В принципе у меня цикл нужен тут так и так для заполнения массива, но если бы его не было, то вместо запуска полного цикла для вывода значений действительно куда лучше делать вот так 1-й строкой.
#415 #376033
>>375786
http://jsbin.com/buzade/31/edit?js,console

Оп, посмотри.

А можешь какие-нибудь короткие задачи на определении директории написать? Вообще работа с каталогами, а то я путаюсь.
#416 #376047
А между тем я уже вальяжно делают циклы.
#417 #376048
Костыльное решение 14 жс задачи. Блиц-вопрос: как работает Object.prototype.toString.call(variable). Я понимаю если variable Array, это объект все же, но как это работает с int например? Это же простой тип, какой там может быть контекст?
#418 #376051
>>374368
Вот, кстати, мне тоже интересно, как сделать, чтобы кнопочки вдавливались при нажатии. Ну ховер понятно, а дальше.
#419 #376053
Можно в базе данных сделать пересчет AUTO_INCREMENT столбца? Т.е. есть id столбец ведущий отсчет с единицы, какие-то записи были удалены, нужно чтобы заного все пересчиталось по порядку, естественно не перепутываясь.
#420 #376055
А как вообще самостоятельно делать анимированные кнопки? Надо гифку пилить в фш или как?
#421 #376058
>>376055
Можно с помощью css, а можно и с помощью javascript.
#422 #376059

function inherit_A(Child, Parent)
{
var F = function () { };
F.prototype = Parent.prototype;

Child.prototype = new F();
Child.prototype.constructor = Child;
Child.super = Parent.prototype;
}


Оп, я все равно не могу понять почему я не могу записать так:

Child.prototype = Parent.prototype;
Child.prototype.constructor = Child;

Я проверял, не работает, но почему?
#423 #376060
>>376058
Нет, нет, меня эти транзикшн не устраивают. Я хочу знать, как сделать, если я лично нарисовал в фотошопе анимацию кнопочки. Надо ее как гифку на бэкграунд поставить кнопке? И как чтобы не повторялась?
#424 #376062
Оп, как делать 13-ю задачу? В js можно эмулировать множественное наследование? Например в prototype массив объектов засунуть или объект с свойствами-объектами?
1805 Кб, 3000x2000
#425 #376101
Аноны, подскажите с таким вопросом - есть поле textarea, которое отслеживает определенное кол-во символов, указанных в регулярном выражении (в моем упрощенном примере ищет английскую букву z, вне зависимости от того, окружена ли она пробелами или является частью слова). Нужно заблокировать дальнейший ввод символов, когда кол-во "z" достигает максимального значения (5 штук). Если я ставлю в JS-коде textarea.disabled = "disabled"; то поле блокируется вместе с введенным текстом и его уже нельзя редактировать без перезагрузки страницы. А нужно чтобы каретка ввода текста просто не двигалась дальше - так же, как при достижении условия в атрибуте maxlength тега textarea. Ссылка прилагается http://codepen.io/anon/pen/Ilprx
#426 #376102
>>376101
переопределяй длину поля ввода
#427 #376109
>>376102
Спасибо, Анон. использовал setAttribute('maxlength', note_text.length)
Воннаби #428 #376152
Полез делать задачу на шифрование, хотел вычислить каким символам соответствуют какие значения в кодировке, в итоге соснул. во первых почему функция chr(); выводит значения только в диапазоне от 32 до 127? http://ideone.com/rHCSjw я понимаю что нельзя вывести то что там до 32 в таблице http://www.asciitable.com/ но то что после 127 то чем плохо?

Ща продолжу ковыряться и докопаюсь до русских символов таки.
Воннаби #429 #376156
>>376152
http://ideone.com/hSSnZ2
Ок, видимо просто так получить русские символы нельзя. Многобайтовость видимо и вся хуйня.

И опять штырит идеон сегодня или как?
#430 #376158
функция mkdir с правами 0777 создает папку которая доступна только для чтения, какие права прописать что бы еще и записывать можно было в эту папку?
#431 #376162
>>376158
chmode 777 -R папка/
#432 #376165
>>376162

> chmod


slowfix
#433 #376168
>>375782
Я все задачи до 12 сделал
4. http://jsbin.com/zoqevino/5/edit?js,console
5. http://jsbin.com/gipocuna/4/edit?js,console
6. http://jsbin.com/labozapa/6/edit?js,console

12
http://jsbin.com/lubewuqa/1/edit - исключения пока не сделал, но исключения должны быть в методе для заказа?
Что-то я перестал понимать тебя.

>тут тоже надо использовать константу, а не строку small.


в объекте же вроде бы не нельзя использоваться переменные, у объекта свойство - это строка же, не?
#434 #376198
>>376162
mkdir("/one");
chmod("/one", 777);
mkdir("/one/two");
chmod("/one/two", 777);
mkdir("/one/two/three");
chmod("/one/two/three", 777);
Не слишком гибко делать деревья, а уж если говорить про файлы. Неужели другого решения нету?
#435 #376201
http://ideone.com/6HJS0O
Написал функцию для одного и двух шагов. Дальше хз как её модифицировать.
#436 #376217
>>376198
А, так ты про пхп
Если я правильно понял, то передавай третьим параметром true в mkdir, тогда сразу сможешь создавать "/one/two/three"
http://php.net/manual/en/function.mkdir.php
Воннаби #437 #376224
Так кароче, опять я со своей проблемой. Установил c http://www.easyphp.org/easyphp-devserver.php типа wamp сборку, после установки и попытки запуска у меня ругается на отсутствие библиотек. Погуглил что за библиотеки, оказалось что-то от visual C++ и лечится соответственно установкой. Скачал с офф сайта пакет, установил, и ничего.
#438 #376226
>>376048
Чертова ссылка http://ideone.com/Kq8LRa
#439 #376227
>>376217
Спасибо, все получилось, раньше пытался через true не получалось. Да и в документации об этом ничего не написано.
Воннаби #440 #376245
#441 #376256
а где MySQL можно скачать без регистрации и смс?
#442 #376260
>>376256
sudo apt-get install mysql-server
#443 #376262
посоны, что такое salt для пароля?
и еще, как происходит процесс регистрации юзера? он заполняет поля, я ему на мыло присылаю ссылку с кодом, он по нему переходит и регистрация оконччена. Так вот, какой код ему присылать и куда сохранять инфу о нем пока он не авторизировался?
#444 #376283
>>376217
Хмм, если например папка one была создана и я пишу
mkdir("one/two", 0777, true);
то папка не создается/
Папка создана ранее через саму ОС.
Владелец не www-data, а пользователь.
#445 #376286
>>376262
Если у тебя украли базу, и в ней логины и пароли хранятся в виде "как есть", то злоумышленник сразу получает доступ ко всем аккаунтам.
Если же в базе вместо паролей были хеши (штука, принимающая на вход данные и возвращающая строку фиксированной длины, у одних и тех же данных один и тот же хеш), к примеру результаты md5(пароль), то злоумышленник может узнать пароли по готовым таблицам md5(пароль), которые есть в сети (радужные таблицы).
Если же хранить в базе пароли в виде md5(пароль + случайная строка), то злоумышленник не сможет найти пароль по стандартным радужным таблицам (хеши для таких паролей не сгенерированы) и ему придётся генерировать свою радужную таблицу, а это обычно долго и много места занимает на диске. Так вот, случайная строка - соль.
#446 #376290
>>376286
Чем медленный алгоритм хеширования, тем медленнее генерация таблиц в случае взлома. Соль обычно уникальна для каждого пользователя и хранится в соседней колонке.
#447 #376291
>>376283
Я не очень в этом разбираюсь, но может у директории one нет прав на изменение для других пользователей?
#448 #376311
ОП, делаю задачку про файлообменник через slim.
Хочу сделать вложенные комментарии. Для этого у каждого комментария храню id родительского комментария в отдельном столбце.
Не понимаю как вывести сформировать это и вывести представление. Сформировать как массив массивов массивов массивов массивов массивов, а как его распарсить потом?
#449 #376314
>>376283
sudo chown www-data:www-data -R one/
Вроде так по памяти рекурсивно меняется владелец папки
#450 #376340
Ананасы, я немного туп, но ваши ответы могут это исправить.
Что актуально использовать для sql-запросов в PHP? mysqli или mysql?
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
или
$dbh = mysql_connect("127.0.0.1", "user", "password");
#451 #376343
>>376340
mysql теперь не рекомендован к использованию.
Либо mysqli, если только MySQL либо PDO, если универсальность. Мне больше PDO нравится, он удобней.
#452 #376344
306 Кб, 460x633
Преобразование url #453 #376402
Коданы, прошу помочь очень: нужен простой проксирующий скрипт на php, цель которого заменить пару символов на другие и отправить юзера дальше на 'замененный url' (например, заменить "%26" на "&"). Пока ковыряю так, нифига не выходит:



$url = $_REQUEST['url'];
$content = file_get_contents($url);

$content = str_replace("%26", "&", $content);

file_put_contents('correct_url.txt', $content , FILE_APPEND | LOCK_EX);

С ЧЕГО НАЧАТЬ ИЗУЧАТЬ PHP #454 #376411
Сап, аноны! Я никогда в жизни не подходил к этому, или к какому угодно другому языку программирования. Но с первой же строчки учебника понял, что PHP исполняется на стороне сервера, а пользователю выдаётся лишь готовые html страницы. Значит ли это, что чтобы проверить на работоспособность свои скрипты, мне придется сперва закачивать на сервер с поддержкой PHP?
#455 #376415
http://ideone.com/9OLeNu

Похоже ОП нас покинул.
#456 #376425
>>376411
Да. Можешь скачать например OpenServer. Там есть все самое необходимое и он уже готов к работе, вообще сборок разных куча. Можешь и просто apache+php поставить. В гугле почитай про то как.
17 Кб, 280x224
#457 #376427
Первая задачка по ООП
http://ideone.com/EPICNZ
(url на что то намекает)
Вторая задачка
http://ideone.com/a5H95S

>компания «Вектор» строго соблюдает закон


>"Вектор"


тонко
>>376415

>Вопрос: Сегодня у меня будет секс?


>Ответ: Нет


Пикритейлед
#458 #376429
>>376415
Почему он всегда выдаёт нет?
#459 #376431
>>376429
>>376427
Потому что он показывает результаты последнего запуска.

Сами откройте программу через fork и нажмите run

http://ideone.com/BnbbdD
вот генератор паролей накидал.
!xnn2uE3AU. #460 #376435
>>375948

Ок, теперь все верно.

>>375950

> Но это же будет не кроссбраузерно?


Действительно. Но без этого, как мы научим тебя особенностям CSS3? Давай ты сначала сделаешь на чистом CSS3, а потом прикрутишь простейший яваскрипт, который будет менять классы при клике, чтобы работало на CSS2 и везде.

> Можешь объяснить, что там в CSS-коде происходит?


Что именно непонятно?

Есть псевдокласс :checked http://htmlbook.ru/css/checked
Есть операторы «~» и «+»: http://htmlbook.ru/css/selector/adjacent и http://htmlbook.ru/css/selector/sibling

Кладем внутрь нашиш кнопок input type-radio и с помощью CSS делаем чтобы кнопка, которая нажата, подсвечивалась цветом.

>>А ты уверен, что тут нельзя использовать display: block; text-align: center; ?


> Что-то не понял - display: block; и text-align: center; для чего?


Не для чего, а вместо чего. Вместо вот этого сомнительного кода:


.portfolio .nav {
display: table; //специально для пробелов после инлайн-блоков в Safari
....


> Какой посоветуешь?


C незакрывающимися тегами либо с вставкой комментария между тегами.
!xnn2uE3AU. #460 #376435
>>375948

Ок, теперь все верно.

>>375950

> Но это же будет не кроссбраузерно?


Действительно. Но без этого, как мы научим тебя особенностям CSS3? Давай ты сначала сделаешь на чистом CSS3, а потом прикрутишь простейший яваскрипт, который будет менять классы при клике, чтобы работало на CSS2 и везде.

> Можешь объяснить, что там в CSS-коде происходит?


Что именно непонятно?

Есть псевдокласс :checked http://htmlbook.ru/css/checked
Есть операторы «~» и «+»: http://htmlbook.ru/css/selector/adjacent и http://htmlbook.ru/css/selector/sibling

Кладем внутрь нашиш кнопок input type-radio и с помощью CSS делаем чтобы кнопка, которая нажата, подсвечивалась цветом.

>>А ты уверен, что тут нельзя использовать display: block; text-align: center; ?


> Что-то не понял - display: block; и text-align: center; для чего?


Не для чего, а вместо чего. Вместо вот этого сомнительного кода:


.portfolio .nav {
display: table; //специально для пробелов после инлайн-блоков в Safari
....


> Какой посоветуешь?


C незакрывающимися тегами либо с вставкой комментария между тегами.
!xnn2uE3AU. #461 #376437
>>375993

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



Включи отображение ошибок в php.ini (display_errors = On) либо открой логи Апача и поищи ошибку там. Без текста ошибок и примера кода трудно что-то сказать.

>>376013

Не скупись на пробелы:

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


for ($i = 1; $i <= $numberOfMarks; $i++) {

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

В остальном, кроме оформления кода, все приавльно.

>>376033

> function Hamburger(size, filling, extended) {


аргумент extended никак не используется — зачем его тогда указывать?

> arguments in this.extended


Так можно проверить наличие ключа в массиве, но не значение. То есть написать (1 in array) можно, а ("value" in array) нет смысла — не сработает.

Для поиска элемента в массиве в ES5 (новой версии JS) есть array.indexOf(value), в ES3 надо написать свою функцию.

В коде нет проверок на ошибки — что если я в size передам что-то непраивльное? Надо выбрасывать исключение (я дописал это в условие задачи).

> getCaloriesOfExtended: function() {


> this.addExtended();


Зачем здесь this.addExetnded() ?

!xnn2uE3AU. #461 #376437
>>375993

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



Включи отображение ошибок в php.ini (display_errors = On) либо открой логи Апача и поищи ошибку там. Без текста ошибок и примера кода трудно что-то сказать.

>>376013

Не скупись на пробелы:

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


for ($i = 1; $i <= $numberOfMarks; $i++) {

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

В остальном, кроме оформления кода, все приавльно.

>>376033

> function Hamburger(size, filling, extended) {


аргумент extended никак не используется — зачем его тогда указывать?

> arguments in this.extended


Так можно проверить наличие ключа в массиве, но не значение. То есть написать (1 in array) можно, а ("value" in array) нет смысла — не сработает.

Для поиска элемента в массиве в ES5 (новой версии JS) есть array.indexOf(value), в ES3 надо написать свою функцию.

В коде нет проверок на ошибки — что если я в size передам что-то непраивльное? Надо выбрасывать исключение (я дописал это в условие задачи).

> getCaloriesOfExtended: function() {


> this.addExtended();


Зачем здесь this.addExetnded() ?

#462 #376438
Лень гуглить@Спрошу у анона. Как можно запилить в похапе считывание данных из какого-нибудь стороннего файла? Хотя-бы из txt. В качестве компилятора юзаю Geany.
!xnn2uE3AU. #463 #376440
>>376033

1) Дан относительный или абсолютный путь вида somedir/././../../file.txt и рабочий каталог вида /usr/lalala/../xxx (относительно которого отсчитывается путь если он ее абсолдютный). Получить абсолютный путь к файлу без всяких там «..» .

2) Сделать функцию, которая получает на вход абсолютный путь вида /a/b/c и возвращает каталог на N уровней выше (N тоже передается как аргумент)

3) Дано 2 абсолютных пути к каталогам: /a/b/c и /a/b/e/f. Найти относительный путь для перехода из первого каталога во второй (в данном примере это ../e/f)

4) Дан путь к каталогу, например '/a/b/c' и маска имени файла, напрмиер '*.txt'. Найти в каталоге и всех подкаталогах файлы соответствующие маске:

/a/b/c/file.txt
/a/b/c/d/e/x.txt

Это будет аналог линуксовой find /a/b/c -name '*.txt'

5) Дан каталог например /a/b/c. Вывести кулятивный объем (то есть по всем подкаталогам) файлов в его подкаталогах и файлов вне подкаталогов:

/a/b/c/d 12 Mb
/a/b/c/e 30 Mb
/a/b/c/f 40 Mb
/a/b/c/file.txt 100 Kb

Это будет аналог линуксовой команды du -sh *
#464 #376442
Хорошо что оп пришел, ща ответит всем по хардкору.
!xnn2uE3AU. #465 #376443
>>376047

да ты крут

>>376048

> Я понимаю если variable Array, это объект все же, но как это работает с int например? Это же простой тип, какой там может быть контекст?


Тут есть хитрость. Например, выполни такой код в консоли Хрома или Фаерфокса:

function testMe() { console.log(this); console.log(typeof this); }
testMe.call(100);

http://jsbin.com/pobafolo/1/edit?js,console

Заметь, что 100 передалось, но typeof выводит не «number», а «object» —
то значит, что произошел так называемый боксинг и 100 превратилось в new Number(100), то есть объект класса Number. То есть this — это ссылка на объект.

Боксинг — это преобразование примитивного типа (boolean/number/string) в объект класса Boolean/Number/String.

В строгом режиме (use strict) боксинг для this отключается и this будет равно строго тому, что передано. Даже если это не объект.

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

var s = "xyz";
var a = s.length

равносильно:

var s = "xyz";
var tmp = new String(s);
var a = tmp.length;

Посмотри примеры кода тут: http://princepthomas.blogspot.ru/2011/07/auto-boxing-javascript-primitive-types.html — особенно пример с добавлением к строке свойства (коттрое фактически добавляется не к ней, а к временному объекту):

var s = "string";
s.x = 1;
console.log(s.x); // undefined

К сожалению, на русском не могу ничего найти.

Заметь что объекты Number/Boolean не равносильны примитивам. Пруф ( http://jsbin.com/dijukipi/1/edit?js,console ):

var bool = false;
var boolObj = new Boolean(false);

console.log(bool ? 'Y' : "N"); // N
console.log(boolObj ? 'Y' : "N"); // Y
!xnn2uE3AU. #465 #376443
>>376047

да ты крут

>>376048

> Я понимаю если variable Array, это объект все же, но как это работает с int например? Это же простой тип, какой там может быть контекст?


Тут есть хитрость. Например, выполни такой код в консоли Хрома или Фаерфокса:

function testMe() { console.log(this); console.log(typeof this); }
testMe.call(100);

http://jsbin.com/pobafolo/1/edit?js,console

Заметь, что 100 передалось, но typeof выводит не «number», а «object» —
то значит, что произошел так называемый боксинг и 100 превратилось в new Number(100), то есть объект класса Number. То есть this — это ссылка на объект.

Боксинг — это преобразование примитивного типа (boolean/number/string) в объект класса Boolean/Number/String.

В строгом режиме (use strict) боксинг для this отключается и this будет равно строго тому, что передано. Даже если это не объект.

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

var s = "xyz";
var a = s.length

равносильно:

var s = "xyz";
var tmp = new String(s);
var a = tmp.length;

Посмотри примеры кода тут: http://princepthomas.blogspot.ru/2011/07/auto-boxing-javascript-primitive-types.html — особенно пример с добавлением к строке свойства (коттрое фактически добавляется не к ней, а к временному объекту):

var s = "string";
s.x = 1;
console.log(s.x); // undefined

К сожалению, на русском не могу ничего найти.

Заметь что объекты Number/Boolean не равносильны примитивам. Пруф ( http://jsbin.com/dijukipi/1/edit?js,console ):

var bool = false;
var boolObj = new Boolean(false);

console.log(bool ? 'Y' : "N"); // N
console.log(boolObj ? 'Y' : "N"); // Y
!xnn2uE3AU. #466 #376450
>>376051

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

>>376053

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

>>376059

> Child.prototype = Parent.prototype;


А почему оно должно работать?

Этим ты копируешь ссылку, то есть Child.prototype и Parent.prototype указывают на один и тот же объект. И где тут наследование? Если ты заменишь что-то (например метод) в Child.prototype оно заменится и в Parent:

Parent.prototype.method1 = ...;
...
Child.prototype.method1 = ...; // затерли method1 в Parent

>>376060

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

>>376062

> В js можно эмулировать множественное наследование?


Нельзя, но тут это и не надо.

>>376101

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

>>376152

Потому что эта функция работает с байтами, а не символами. То есть она возвращает строку из 1 байта (не символа). Байт может иметь всего 256 значений, от 0 до 255. В utf-8 русские буквы состоят из 2 байт, потому русскую букву надо генерировать за 2 вызова:

$russianA = chr(0xd0).chr(0x90); // А

Коды для байтов я взял тут: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024

А вот латинница относится к ASCII и она кодируется в utf-8 так же как и почти в любой другой кодировке — одним байтом от 32 до 127 — потому и работает без лишних усилий.

Некоторые более редкие символы могут кодироваться не 1 или 2, а аж 6 байтами.

Подробнее про систему кодирования utf-8: https://ru.wikipedia.org/wiki/UTF-8 (для понимания надо иметь представление о 16-чной и 2-чной системе счисления).

Таблица символов которые есть в юникоде: http://unicode-table.com/ru/

Обрати внимание, что коды которые там приведены (вроде U+0410) — это не utf-8, а utf-16 коды и их нельзя подставлять в chr. Из них по идее можно получить utf-8 коды так:

$russianA = iconv("utf-16be", "utf-8", "\x04\x10");
var_dump($russianA); // А
var_dump(bin2hex($russianA)); // d090

http://ideone.com/LEfJRL

То есть символ с кодом U+0410 (русская А) который в utf16-be кодируется как 04 10 (16-чные), в utf-8 кодируется как d0 90 или в десятичной системе, 208 144.

Функция bin2hex преобразует строку в набор байт в шестнадцатеричном виде, например: echo bin2hex("Hello привет"); — ей удобно смотреть как закодированы разные символы.

Преобразовать шестнадцатеричное число например d0 в десятичное можно через dechex/hexdec.
!xnn2uE3AU. #466 #376450
>>376051

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

>>376053

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

>>376059

> Child.prototype = Parent.prototype;


А почему оно должно работать?

Этим ты копируешь ссылку, то есть Child.prototype и Parent.prototype указывают на один и тот же объект. И где тут наследование? Если ты заменишь что-то (например метод) в Child.prototype оно заменится и в Parent:

Parent.prototype.method1 = ...;
...
Child.prototype.method1 = ...; // затерли method1 в Parent

>>376060

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

>>376062

> В js можно эмулировать множественное наследование?


Нельзя, но тут это и не надо.

>>376101

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

>>376152

Потому что эта функция работает с байтами, а не символами. То есть она возвращает строку из 1 байта (не символа). Байт может иметь всего 256 значений, от 0 до 255. В utf-8 русские буквы состоят из 2 байт, потому русскую букву надо генерировать за 2 вызова:

$russianA = chr(0xd0).chr(0x90); // А

Коды для байтов я взял тут: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024

А вот латинница относится к ASCII и она кодируется в utf-8 так же как и почти в любой другой кодировке — одним байтом от 32 до 127 — потому и работает без лишних усилий.

Некоторые более редкие символы могут кодироваться не 1 или 2, а аж 6 байтами.

Подробнее про систему кодирования utf-8: https://ru.wikipedia.org/wiki/UTF-8 (для понимания надо иметь представление о 16-чной и 2-чной системе счисления).

Таблица символов которые есть в юникоде: http://unicode-table.com/ru/

Обрати внимание, что коды которые там приведены (вроде U+0410) — это не utf-8, а utf-16 коды и их нельзя подставлять в chr. Из них по идее можно получить utf-8 коды так:

$russianA = iconv("utf-16be", "utf-8", "\x04\x10");
var_dump($russianA); // А
var_dump(bin2hex($russianA)); // d090

http://ideone.com/LEfJRL

То есть символ с кодом U+0410 (русская А) который в utf16-be кодируется как 04 10 (16-чные), в utf-8 кодируется как d0 90 или в десятичной системе, 208 144.

Функция bin2hex преобразует строку в набор байт в шестнадцатеричном виде, например: echo bin2hex("Hello привет"); — ей удобно смотреть как закодированы разные символы.

Преобразовать шестнадцатеричное число например d0 в десятичное можно через dechex/hexdec.
#467 #376454
>>376450

>аботает с байтами, а не символами. То есть она возвращает строку из 1 байта (не символа). Байт может иметь всего 256 значений, от 0 до 255. В utf-8 русские буквы состоят из 2 байт, потому русскую букву надо генерировать за 2 вызова:



Спасибо большое и мне даже вроде всё понятно в теории, но как с этим работать не ясно. Я ведь просто хотел сделать годный шифровальщик. При том что бы не забивать в ручную массив со значениями: 1 => 'А', 2 => 'Б' и т.д. Я хотел заполнить его выдергивая символы по их коду в асски, а оказалось что я соснул с этим, вот и всё.

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

Вот генератор имен.
http://ideone.com/KiwM5N
#468 #376455
>>376438
Прост)) Я даже доброкуну писал на почту))))) Кароче, нужен if и fopen fread fwrite fclose.
14 Кб, 271x233
#469 #376459
>>376455
Правильно, немогущие в гугол должны страдать.
!xnn2uE3AU. #470 #376461
>>376156

> echo ord($alpha[$i]);


Это ты выводишь $i-й байт, а не символ. Каждая русская буква в utf-8 — это 2 байта.

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


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

>>376158

Есть такая штука как umask. При создании папки или файла из разрешений вычитаются те, которые есть в umask. Например, по умолчанию umask = 0022 (запретить запись для группы и для всех) и твои 0777 превращаются в 0744 (только владелец может записывать). Задать umask можно одноименной функцией: http://php.net/manual/ru/function.umask.php

Подробнее: https://ru.wikipedia.org/wiki/Umask

В мануале по mkdir кстати umask упомянут. Почему не читал? http://php.net/manual/ru/function.mkdir.php

>>376168

№4 — все верно

№5

> var newArgs = [], allArgs = [];


Тут не надо класть пустые массивы, достаточно просто var newArgs, allArgs;

№6 — не работает если вызывать функцию второй раз: http://jsbin.com/labozapa/8/edit?js,console

№12

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

Также при попытке вызвыать calcPrice/calories если заказ не сформирован.

Ты нигде не хранишь список добавок. Что, если завтра мы захотим сделать методы «убратьДобавку», «получитьСписокДобавок»?

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

Функция Hamburger.prototype.makeAddative написана нехорошо — если мы сделаем еще 5 видов добавок, ты накопипастишь еще 5 if?

> Hamburger.type = {


> SMALL: { price: 50, calor: 20 },


Это не константа, а строка 'SMALL'. Надо использовать именно константу:

Hamburger.type[Hamburger.SIZE_SMALL] = ....;

> Hamburger.CHEESE


Лучше Hamburger.FILLING_CHEESE

Вообще, ООП реализован неправильно. Все свойства сделаны неправильно. Вот, как должно быть:

Объект Гамбургер, у него свойства:

- размер
- тип начинки
- массив добавок

Все. А ты вместо этого изобрел что-то странное: хранишь цену добавки вместо ее типа, хранишь какое-то selection[0]. Вот представь, весь код в таком стиле написан:

var price = this.data[0] * this.properties[12] + this.data[6] * this.properties[3] + getDiscount(discount[2], discount[5]);

Согласись, понятным его назвать трудно. Надо писать:

this.size = ...
this.filling = ...
this.additions.push(...);

И все будет нормально.
!xnn2uE3AU. #470 #376461
>>376156

> echo ord($alpha[$i]);


Это ты выводишь $i-й байт, а не символ. Каждая русская буква в utf-8 — это 2 байта.

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


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

>>376158

Есть такая штука как umask. При создании папки или файла из разрешений вычитаются те, которые есть в umask. Например, по умолчанию umask = 0022 (запретить запись для группы и для всех) и твои 0777 превращаются в 0744 (только владелец может записывать). Задать umask можно одноименной функцией: http://php.net/manual/ru/function.umask.php

Подробнее: https://ru.wikipedia.org/wiki/Umask

В мануале по mkdir кстати umask упомянут. Почему не читал? http://php.net/manual/ru/function.mkdir.php

>>376168

№4 — все верно

№5

> var newArgs = [], allArgs = [];


Тут не надо класть пустые массивы, достаточно просто var newArgs, allArgs;

№6 — не работает если вызывать функцию второй раз: http://jsbin.com/labozapa/8/edit?js,console

№12

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

Также при попытке вызвыать calcPrice/calories если заказ не сформирован.

Ты нигде не хранишь список добавок. Что, если завтра мы захотим сделать методы «убратьДобавку», «получитьСписокДобавок»?

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

Функция Hamburger.prototype.makeAddative написана нехорошо — если мы сделаем еще 5 видов добавок, ты накопипастишь еще 5 if?

> Hamburger.type = {


> SMALL: { price: 50, calor: 20 },


Это не константа, а строка 'SMALL'. Надо использовать именно константу:

Hamburger.type[Hamburger.SIZE_SMALL] = ....;

> Hamburger.CHEESE


Лучше Hamburger.FILLING_CHEESE

Вообще, ООП реализован неправильно. Все свойства сделаны неправильно. Вот, как должно быть:

Объект Гамбургер, у него свойства:

- размер
- тип начинки
- массив добавок

Все. А ты вместо этого изобрел что-то странное: хранишь цену добавки вместо ее типа, хранишь какое-то selection[0]. Вот представь, весь код в таком стиле написан:

var price = this.data[0] * this.properties[12] + this.data[6] * this.properties[3] + getDiscount(discount[2], discount[5]);

Согласись, понятным его назвать трудно. Надо писать:

this.size = ...
this.filling = ...
this.additions.push(...);

И все будет нормально.
!xnn2uE3AU. #471 #376463
>>376201

Надо исплоьзовать рекурсию, то есть если шага больше одного, то функция вызвыает саму себя для проверки вариантов:

Если (остался один шаг до финиша) {
добавляем его и возвращаем получившийся путь;
}

// иначе же
Берем все соседние точки, которых нет в пути;
Для каждой точки вызываем себя, чтобы попробовать найти путь к финишу через эту точку, получаем в итоге массив путей
Из всех полученных путей берем самый короткий;
Возвращаем его;

Также, стоит посмотреть на алгоритмы из википедии, там есть и более простые варианты: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

>>376224

> Погуглил что за библиотеки, оказалось что-то от visual C++ и лечится соответственно установкой. Скачал с офф сайта пакет, установил, и ничего.


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

> оказалось что-то от visual C++ и лечится соответственно установкой


Это только рантайм, сам С++ ставить не надо.

>>376226

> if(type in ['Boolean', 'Null', 'Number', 'String', 'Function', 'Array', 'Object']){


in ищет в ключах (то есть в 0, 1, 2, 3) а не в значениях элементов

> count(variable) == 0 |


Что это за ерунда?

В общем, код нерабочий. Залей-ка его на jsbin, чтобы можно было выполнить и проверить.

>>376245

Ок, все верно, только не скупись на пробелы.
!xnn2uE3AU. #471 #376463
>>376201

Надо исплоьзовать рекурсию, то есть если шага больше одного, то функция вызвыает саму себя для проверки вариантов:

Если (остался один шаг до финиша) {
добавляем его и возвращаем получившийся путь;
}

// иначе же
Берем все соседние точки, которых нет в пути;
Для каждой точки вызываем себя, чтобы попробовать найти путь к финишу через эту точку, получаем в итоге массив путей
Из всех полученных путей берем самый короткий;
Возвращаем его;

Также, стоит посмотреть на алгоритмы из википедии, там есть и более простые варианты: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8

>>376224

> Погуглил что за библиотеки, оказалось что-то от visual C++ и лечится соответственно установкой. Скачал с офф сайта пакет, установил, и ничего.


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

> оказалось что-то от visual C++ и лечится соответственно установкой


Это только рантайм, сам С++ ставить не надо.

>>376226

> if(type in ['Boolean', 'Null', 'Number', 'String', 'Function', 'Array', 'Object']){


in ищет в ключах (то есть в 0, 1, 2, 3) а не в значениях элементов

> count(variable) == 0 |


Что это за ерунда?

В общем, код нерабочий. Залей-ка его на jsbin, чтобы можно было выполнить и проверить.

>>376245

Ок, все верно, только не скупись на пробелы.
!xnn2uE3AU. #472 #376467
>>376256

Ось какая? По идее на официальном сайте http://dev.mysql.com/downloads/

Под Windows надо качать MySQL Community Server (GPL) далее MSI Installer

>>376262

> что такое salt для пароля?


Соль, чтобы хеш был соленый то есть хеш = md5($password . $salt)

> Так вот, какой код ему присылать и куда сохранять инфу о нем пока он не авторизировался?


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

>>376283

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

>>376311

> Не понимаю как вывести сформировать это и вывести представление.


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

https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0

http://acm.mipt.ru/twiki/bin/view/Algorithms/TopologicalSort

http://habrahabr.ru/post/100953/

(я согласен что объяснение так плохое, так что может тебе самому придется еще подумать. Например, можно сначала пронумеровать записи верхнего уровня как 1, 2, 3, 4, потом их детей как 1.1, 1.2, 1.3 и так далее, а имея номера уже отсортировать).

Также, почитай мою пасту про хранение древовидных данных: https://gist.github.com/codedokode/10539720 — эти вопросы любят на собеседованиях
!xnn2uE3AU. #472 #376467
>>376256

Ось какая? По идее на официальном сайте http://dev.mysql.com/downloads/

Под Windows надо качать MySQL Community Server (GPL) далее MSI Installer

>>376262

> что такое salt для пароля?


Соль, чтобы хеш был соленый то есть хеш = md5($password . $salt)

> Так вот, какой код ему присылать и куда сохранять инфу о нем пока он не авторизировался?


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

>>376283

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

>>376311

> Не понимаю как вывести сформировать это и вывести представление.


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

https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0

http://acm.mipt.ru/twiki/bin/view/Algorithms/TopologicalSort

http://habrahabr.ru/post/100953/

(я согласен что объяснение так плохое, так что может тебе самому придется еще подумать. Например, можно сначала пронумеровать записи верхнего уровня как 1, 2, 3, 4, потом их детей как 1.1, 1.2, 1.3 и так далее, а имея номера уже отсортировать).

Также, почитай мою пасту про хранение древовидных данных: https://gist.github.com/codedokode/10539720 — эти вопросы любят на собеседованиях
#473 #376472
>>376450

>Функция bin2hex преобразует строку в набор байт в шестнадцатеричном виде, например: echo bin2hex("Hello привет"); — ей удобно смотреть как закодированы разные символы.



Преобразовать шестнадцатеричное число например d0 в десятичное можно через dechex/hexdec.

http://ideone.com/NCoFLe

Ну вот уже лучше, но я вот хотел для своего ЙоБа_ШиФрОвАлЬщИкА получить сначала табличку (массив) десятичных чисел, для использования его как ключ, а потом уже его "шаффлить", но видимо придется работать и с десятичными. Бтв попробовал вместо:
for ($i=0; $i<mb_strlen($alpha); $i++){
echo bin2hex($alpha[$i]);

echo " ";
}
сделать:
for ($i=0; $i<mb_strlen($alpha); $i++){
echo hexdec(bin2hex($alpha[$i]));

echo " ";
}
и в ответ получил ровно то же, что было через ord в http://ideone.com/hSSnZ2
!xnn2uE3AU. #474 #376473
>>376340

PDO

>>376314

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

>>376402

Зачем тут file_get_contents например? Ты можешь вообще объяснить что твой скрипт по задумке должен делать?

>>376411

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

В большинстве других учебников да, надо сервер, и надо знать HTML.

Говорить что «php выполняется только на сервере» — точно неверно. Никто не хзапрещает тебе поставить PHP на компьютер и запускать программы из консоли.

>>376415

Ок, все верно.

>>376427

Первая задача по ООП: все правильно

Вторая задача:

> if ($hours > 40) {


> $total += 40;


тут лучше использовать функции min/max вместо if

> public function getOverTimeHours()


Проще посчитать как (общее число часов - число нормальных)

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


> $string = preg_replace('/^/', ' ', $string);


Да у вас регулярность головного мозга. Тут надо использовать str_repeat и оператор склеивания строк.
!xnn2uE3AU. #474 #376473
>>376340

PDO

>>376314

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

>>376402

Зачем тут file_get_contents например? Ты можешь вообще объяснить что твой скрипт по задумке должен делать?

>>376411

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

В большинстве других учебников да, надо сервер, и надо знать HTML.

Говорить что «php выполняется только на сервере» — точно неверно. Никто не хзапрещает тебе поставить PHP на компьютер и запускать программы из консоли.

>>376415

Ок, все верно.

>>376427

Первая задача по ООП: все правильно

Вторая задача:

> if ($hours > 40) {


> $total += 40;


тут лучше использовать функции min/max вместо if

> public function getOverTimeHours()


Проще посчитать как (общее число часов - число нормальных)

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


> $string = preg_replace('/^/', ' ', $string);


Да у вас регулярность головного мозга. Тут надо использовать str_repeat и оператор склеивания строк.
!xnn2uE3AU. #475 #376476
>>376429

Потому что «нет».

>>376431

> $password = "";


Надо писать array() а не ""

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

>>376438

file_get_contents

>>376472

Если ты хотел взять и вывести код отдельной буквы то надо брать не $i-й байт через $alpha[$i], а $i-ю букву через mb_substr(...) а уже с этой буквой делать bin2hex (будет 1 или больше байт, каждые две 16-х цифры = 1 байт).

Например,

d0 b0 — это буква «а» в utf-8
d0 b1 — это «б»

И так далее.

> и в ответ получил ровно то же, что было через ord в http://ideone.com/hSSnZ2


А так и должно быть. Ты берешь $i-й байт из строки, преобразуешь его в 10-ное число, а ord() делает то же самое.
!xnn2uE3AU. #475 #376476
>>376429

Потому что «нет».

>>376431

> $password = "";


Надо писать array() а не ""

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

>>376438

file_get_contents

>>376472

Если ты хотел взять и вывести код отдельной буквы то надо брать не $i-й байт через $alpha[$i], а $i-ю букву через mb_substr(...) а уже с этой буквой делать bin2hex (будет 1 или больше байт, каждые две 16-х цифры = 1 байт).

Например,

d0 b0 — это буква «а» в utf-8
d0 b1 — это «б»

И так далее.

> и в ответ получил ровно то же, что было через ord в http://ideone.com/hSSnZ2


А так и должно быть. Ты берешь $i-й байт из строки, преобразуешь его в 10-ное число, а ord() делает то же самое.
!xnn2uE3AU. #476 #376482
Всем ответил, вроде никого не пропустил, если пропустил, напомните о себе.
#477 #376483
>>376482
Мне ответил везде, пойду раскритикованный генератор паролей менять, плюс делать шифровальщика. Ты уходишь опять надолго?
!xnn2uE3AU. #478 #376489
>>376483

Не знаю, раз в день-два я обязательно захожу.
!xnn2uE3AU. #479 #376491
>>376483

Сегодня наверно еще вечером буду.
#480 #376496
>>376482

>http://ideone.com/KiwM5N


Вот посмотри.
#481 #376500
>>376476

>> $password = "";


>>Надо писать array() а не ""



Просто сначала я хотел сделать его переменной типа string

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



переделал, в итоге пароль получается более омский и скрипт получился короче, еще будут замечания или ограничения?
http://ideone.com/BnbbdD
#482 #376503
>>376482

http://ideone.com/NCoFLe

почему не дампится новый массив?
#483 #376505
>>376473

>>Зачем тут file_get_contents например? Ты можешь вообще объяснить что твой скрипт по задумке должен делать?



Я вообще на stackoverflow нашел это решение. Хз, я плохо понимаю механику, как именно нужно 'поймать url', не обессудьте.
#485 #376510
>>376500
shuffle зачем?
#486 #376513
>>376510
перешел по наследству из предыдущей версии, когда я сначала генерировал несколько букв, несколько цифр, а потом перемешивал их, что бы не шли подряд.
28 Кб, 799x569
#487 #376522
С первого раза джва дабла или нужно было два одинаковых лел?
#488 #376524
>>376522
Да думаю как тебе удобно, я что бы затестить на два дабла аж урезал кости до 3 вместо шести, а то никак не выпадали.
#489 #376525
>>373424
ну и сколько можно зарабатывать пхп макакой и версткой?
#490 #376528
>>376482

Не пропустил, но не ответил на вопрос. >>376062

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

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

Как это реализовать? Наследование классов мне тут понадобится видимо. Но проблема не в этом, а в том, что один класс должен наследовать от двух классов.
#491 #376536
ОП, как загружать файлы через ФТП на сервер?
Ты говорил через какие-то библиотеки?
Я пробовал ftp_put, но там только сохраняет уже в готовые файле на сервере. Подскажи годный загрузчик.
#492 #376554
http://www.php-s.ru/self-teacher/6_8/
В этом самоучителе столько ошибок в примерах. Пиздец просто.
#493 #376565
>>376440

1) Не понял
2) http://codepad.org/eGL9qy06
3) http://codepad.org/JBa7WgtR
Ну еще вот так: http://codepad.org/YcwiP0IE
4) http://codepad.org/K8kFeBu7 (правильный ход мыслей?)
5) http://codepad.org/M9qwYRTr (правильный ход мыслей?)
#495 #376573
"$this->module/list"
Можно ли так делать? И вообще как заключать объекты и классы в кавычки?
!xnn2uE3AU. #496 #376596
>>376496

Вместо mt_rand(0,count($kana) может будет короче писать array_rand($kana) ? А так, все верно.

>>376500

Вполне пойдет. Хотя некоторые символы вроде ' " \ & < > — я бы поостерегся использовать так как они обрабатываются функциями addslashes/htmlspecialchars которые криворукие программисты ставят куда не попадя и могут из-за этого не работать.

>>376503

Потому что в нем битые последовательности utf-8, а хрупкий ideone не выдерживает такого насилия и падает. Посмотри сам:

> $key[$i] = $alpha[$i]; // берем 1 байт из строки, возможно часть 2-байтовой последователности



...

> var_dump($cifer); // дампим эти битые последовательности



Если бы ты запускал в консоли с поддержкой utf-8 (на линуксе или маке), там бы был массив с вопросиками вместо букв.

>>376505

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

>>376506

Неплохо, но есть места, которые мне не нравятся — вот это вот

split(' ')[1].slice(0, -1);

выглядит очень хлипко. Лучше наверно сравнивать с [object Number] или как-то так.

Array-like определяется неверно:

{a: 1, b: 2, length: 2} — не array-like
{0: 1, 1: 1, 2: 1, length: 3} — array-like

То есть в объекте должны быть цифровые свойства от 0 до length - 1
!xnn2uE3AU. #496 #376596
>>376496

Вместо mt_rand(0,count($kana) может будет короче писать array_rand($kana) ? А так, все верно.

>>376500

Вполне пойдет. Хотя некоторые символы вроде ' " \ & < > — я бы поостерегся использовать так как они обрабатываются функциями addslashes/htmlspecialchars которые криворукие программисты ставят куда не попадя и могут из-за этого не работать.

>>376503

Потому что в нем битые последовательности utf-8, а хрупкий ideone не выдерживает такого насилия и падает. Посмотри сам:

> $key[$i] = $alpha[$i]; // берем 1 байт из строки, возможно часть 2-байтовой последователности



...

> var_dump($cifer); // дампим эти битые последовательности



Если бы ты запускал в консоли с поддержкой utf-8 (на линуксе или маке), там бы был массив с вопросиками вместо букв.

>>376505

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

>>376506

Неплохо, но есть места, которые мне не нравятся — вот это вот

split(' ')[1].slice(0, -1);

выглядит очень хлипко. Лучше наверно сравнивать с [object Number] или как-то так.

Array-like определяется неверно:

{a: 1, b: 2, length: 2} — не array-like
{0: 1, 1: 1, 2: 1, length: 3} — array-like

То есть в объекте должны быть цифровые свойства от 0 до length - 1
!xnn2uE3AU. #497 #376597
>>376522

Проверка на даблы сделана верно.

>>376524

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

>>376525

Пачку зеленого чая и коробку печенек. А вообще, походи по hh.ru, geekjob, зайди в /wrk, поищи зарплата-тред в /pr, в общем изучи состояние рынка.

>>376528

Не, ты не так понимаешь концепцию наследования.

Если B наследуется от A то это значит одно из двух:

A — это улучшенная/переделанная версия B. Например, B — это Самолет, а A — это СамолетСВертикальнымВзлетом. И соответственно, B можно использовать вместо A (это называется принцип подстановки Лисков: вместо базового класса можно подставить его наследника и все должно работать. Кстати, Лисков — это не название иноплатнетных существ, а фамилия).

Или же A — это какая-то асбтрактная штука, а B — ее реализация. Например, A — это СредствоПередвижения, а B — Автомобиль.

Здесь мы имеем именно второй случай. Базовым классом у нас должно быть ЭлементЭлектросети, а от него наследуются Дом, Панели, ЛЭП и что там еще есть.

> Я думаю, что линии электропередач должны наследовать и от электростанций, и от солнечных панелей, а жилые дома от линий электропередач.


Бред же. Жилой дом — это усовершенствованная версия ЛЭП? Его можно поставить вместо ЛЭП?

Множественное наследование тут (и в 99% других случаев) не нужно.
!xnn2uE3AU. #497 #376597
>>376522

Проверка на даблы сделана верно.

>>376524

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

>>376525

Пачку зеленого чая и коробку печенек. А вообще, походи по hh.ru, geekjob, зайди в /wrk, поищи зарплата-тред в /pr, в общем изучи состояние рынка.

>>376528

Не, ты не так понимаешь концепцию наследования.

Если B наследуется от A то это значит одно из двух:

A — это улучшенная/переделанная версия B. Например, B — это Самолет, а A — это СамолетСВертикальнымВзлетом. И соответственно, B можно использовать вместо A (это называется принцип подстановки Лисков: вместо базового класса можно подставить его наследника и все должно работать. Кстати, Лисков — это не название иноплатнетных существ, а фамилия).

Или же A — это какая-то асбтрактная штука, а B — ее реализация. Например, A — это СредствоПередвижения, а B — Автомобиль.

Здесь мы имеем именно второй случай. Базовым классом у нас должно быть ЭлементЭлектросети, а от него наследуются Дом, Панели, ЛЭП и что там еще есть.

> Я думаю, что линии электропередач должны наследовать и от электростанций, и от солнечных панелей, а жилые дома от линий электропередач.


Бред же. Жилой дом — это усовершенствованная версия ЛЭП? Его можно поставить вместо ЛЭП?

Множественное наследование тут (и в 99% других случаев) не нужно.
#498 #376598
>>376566
FILE на локальном сервере возвращает путь, начиная с раздела жесткого диска и заканчивая папкой с файлом, в котором исполняется код. Как оно выводится на удаленном сервере? В случае с joomla будет что-то вроде /templates/someTemplate/index.php или будет что-то наподобии /var/www/site/templates/someTemplate/index.php?

Не могу разобраться в этих константах. Функции типа realpath и dirname меня вводят в тупик.

Должен в них разобраться, как недавно разобрался в прототипах на js. Кстати по привычке забываю писать знак $ после js. Немного подзабыл названия функций из стандартного набора, ползал в мануал и искал то, что нужно.
!xnn2uE3AU. #499 #376604
>>376536

Набираем в Гугле «php ftp client library» и видим:

Расширение ftp: http://php.net/manual/ru/book.ftp.php
https://github.com/suin/php-ftp-client
https://github.com/melihucar/ftpclient

> Я пробовал ftp_put, но там только сохраняет уже в готовые файле на сервере.


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

Ну есть еще такие комбайны: http://www.monstaftp.com/ — там и загружать и просматривать можно, и что угодно.

>>376554

Может копипаста из какой-нибудь старой книги.

>>376565

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

resolve("/a/b/c", "что угодно") => /a/b/c
resolve("/a/b/./../d", "что угодно") => /a/d
resolve("f/g", "/usr") => /usr/f/g
resolve("../g", "/a/b/c") => /a/b/g

2) Надо возвращать путь к этому каталогу, то есть /a/b/c/d. Алсо, погугли функции dirname() и basename()

3) Не работает: http://codepad.org/PVHzlvj8
Второй вариант тоже не работает: http://codepad.org/I0Yh69Uw

4) Это не работает рекурсивно. А что работает рекурсивно? RecursiveDirectoryIterator. Беги мануал читать.

5)

> if ($handle = opendir($path)) {


Есть же scandir

В общем верно, но нельзя ли тут обойтись тем же самым RecursiveDirectoryIterator, код-то наверно проще станет?
!xnn2uE3AU. #499 #376604
>>376536

Набираем в Гугле «php ftp client library» и видим:

Расширение ftp: http://php.net/manual/ru/book.ftp.php
https://github.com/suin/php-ftp-client
https://github.com/melihucar/ftpclient

> Я пробовал ftp_put, но там только сохраняет уже в готовые файле на сервере.


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

Ну есть еще такие комбайны: http://www.monstaftp.com/ — там и загружать и просматривать можно, и что угодно.

>>376554

Может копипаста из какой-нибудь старой книги.

>>376565

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

resolve("/a/b/c", "что угодно") => /a/b/c
resolve("/a/b/./../d", "что угодно") => /a/d
resolve("f/g", "/usr") => /usr/f/g
resolve("../g", "/a/b/c") => /a/b/g

2) Надо возвращать путь к этому каталогу, то есть /a/b/c/d. Алсо, погугли функции dirname() и basename()

3) Не работает: http://codepad.org/PVHzlvj8
Второй вариант тоже не работает: http://codepad.org/I0Yh69Uw

4) Это не работает рекурсивно. А что работает рекурсивно? RecursiveDirectoryIterator. Беги мануал читать.

5)

> if ($handle = opendir($path)) {


Есть же scandir

В общем верно, но нельзя ли тут обойтись тем же самым RecursiveDirectoryIterator, код-то наверно проще станет?
#500 #376605
>>376604
Это с помощью SPL? Но почему-то нигде не наблюдал его использование, неужели он настолько непопулярен?

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

В чем разница, если я напишу is_dir ( string $filename ) или DirectoryIterator::isDir? В производительности?

А вот есть еще Direct IO, он для чего? Вроде у него встречаются такие же функции, как и обычные встроенные.
!xnn2uE3AU. #501 #376606
>>376573

"{$this->module}/list"

Иди читай http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>376566

> } elseif (filetype($fullPath) == 'dir') {


Есть is_dir, is_file

>>376598

> В случае с joomla будет что-то вроде /templates/someTemplate/index.php или будет что-то наподобии /var/www/site/templates/someTemplate/index.php?


Второе. ОС ничего не знает про Джумлу. В Линуксе нет дисков, а у всей файловой системы один корень - / . Дополнительные устройства вроде usb-накопителей монтируются в одну из папок (обычно /mnt/something) файловой системы.

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


Я тоже иногда в мануал лазаю. Кстати, IDE вроде PhpStorm умеют автодоплнять имена стандартных функций и выводить по ним подсказки.

>>376605

> неужели он настолько непопулярен?


В «PHP за 24 часа» про него не рассказано. Да и плюс там ООП, а его (внезапно) не ве знают, опять же из-за плохих учебников и курсов.

> Ты упоминал, что там можно мозг сломать.


Ну там есть примеры в мануале и в комментах. Можешь начать с DirectoryIterator (нерекурсивного), он проще.

> В чем разница, если я напишу is_dir ( string $filename ) или DirectoryIterator::isDir? В производительности?


В использовании Ооп-подхода

> А вот есть еще Direct IO, он для чего? Вроде у него встречаются такие же функции, как и обычные встроенные.



Судя по описанию, http://php.net/manual/ru/intro.dio.php там используется напрямую обращение к системным вызовам ОС и не используется например буферизация (буферизация — это когда ты делаешь много маленьких fwrite, а они объединяются в буфер и отдаются на запись одним блоком — это повышает производительнсоть когда идет вывод небольшими блоками, например вывод текста по буквам). Не встречал, чтобы оно использовалось.
!xnn2uE3AU. #501 #376606
>>376573

"{$this->module}/list"

Иди читай http://php.net/manual/ru/language.types.string.php#language.types.string.parsing

>>376566

> } elseif (filetype($fullPath) == 'dir') {


Есть is_dir, is_file

>>376598

> В случае с joomla будет что-то вроде /templates/someTemplate/index.php или будет что-то наподобии /var/www/site/templates/someTemplate/index.php?


Второе. ОС ничего не знает про Джумлу. В Линуксе нет дисков, а у всей файловой системы один корень - / . Дополнительные устройства вроде usb-накопителей монтируются в одну из папок (обычно /mnt/something) файловой системы.

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


Я тоже иногда в мануал лазаю. Кстати, IDE вроде PhpStorm умеют автодоплнять имена стандартных функций и выводить по ним подсказки.

>>376605

> неужели он настолько непопулярен?


В «PHP за 24 часа» про него не рассказано. Да и плюс там ООП, а его (внезапно) не ве знают, опять же из-за плохих учебников и курсов.

> Ты упоминал, что там можно мозг сломать.


Ну там есть примеры в мануале и в комментах. Можешь начать с DirectoryIterator (нерекурсивного), он проще.

> В чем разница, если я напишу is_dir ( string $filename ) или DirectoryIterator::isDir? В производительности?


В использовании Ооп-подхода

> А вот есть еще Direct IO, он для чего? Вроде у него встречаются такие же функции, как и обычные встроенные.



Судя по описанию, http://php.net/manual/ru/intro.dio.php там используется напрямую обращение к системным вызовам ОС и не используется например буферизация (буферизация — это когда ты делаешь много маленьких fwrite, а они объединяются в буфер и отдаются на запись одним блоком — это повышает производительнсоть когда идет вывод небольшими блоками, например вывод текста по буквам). Не встречал, чтобы оно использовалось.
#502 #376616
>>373424
https://github.com/Purplepeak/TestHub
Бампану, вдруг забыл про меня. Глянь хотя бы регистрацию, очень интересно твое мнение.
#503 #376624
>>376473
http://ideone.com/J9hong
Вторую задачу пофиксил, ideone опять правда лежит.
Еще такой вопрос возник - начинаю делать задачу номер 3, про департаменты. И как я понимаю самое главное тут правильно думать и составить алгоритм. Всякие там наследования и еще куча непонятных вещей. Подскажите кто как вообще правильно в ооп сформулировать эту задачу и её решение.
97 Кб, 861x1000
#504 #376632
Врываюсь в тред. Где почитать годное сравнение CMS для средних сайтов?
Когда не визитка но и не ХАЙЛОАД_КРОВЬ_КИШКИ.
Не знаю какую задрочить.
#505 #376640
http://ideone.com/KpwipQ

Сделал задачку на палиндром
Сам дам замечание, которое сам же исправил в процессе. Сначала использовал при подсчете длины строки strlen, который возвращал мне количество байт, а не символов, поэтому даже это число поделенное на пополам давало в целом длину строки и цикл проходил от начала до конца, а не до середины.Что не мешало скрипту правильно выявлять панлиндромы Когда заменил на mb_strlen то всё стало как в подсказке.
#506 #376641
Оп, можно сказать, что DOMNode - это двусвязный список узлов? То есть есть previousSibling и nextSibling? И вроде бы циклический?
#507 #376643
Корректно так делать с точки зрения ООП? http://ideone.com/WSKOVr
То есть у меня есть некий базовый контроллер который обеспечивает функционал для всех компонентов, но некоторые данные в них отличаются, и нужна кастомная функция которая будет вызываться из родителя.
#508 #376644
>>376604

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


Ну смотри, вот код:
http://ideone.com/ZVtgNF
Выводит ошибку:
Установлено соединение с FTP сервером *** под именем ***
Warning: ftp_put(): Could not create file. in C:\Apache24\htdocs\localhost\Test\File\Load.php on line 28
Не удалось закачать файл!
НО! Если в $destination_file = 'test'; указать не папку, а файл, допстим ридми.тхт, то инфа из тест.тхт запишется в файл и все работает.
А как закачать этот файл на сервер? А не записать его в существующий уже на сервере?
#509 #376646
Читаю про структуру данных в SPL.

Итак, я понял, что SplStack ну ни чем не отличается от SplDoublyLinkedList. От сюда вывод, что стек и двусвязный список - это одно и то же?

Дальше SplQueue. У него появились новые методы enqueue и dequeue, которые ничем не отличаются от SplDoublyLinkedList::push() и SplDoublyLinkedList::shift(). Опять приходим к выводу, пока три класса идентичны, но с разными названиями.

Далее SplMaxHeap и SplMinHeap наследуются от SplHeap. Используются для сортировки значений. Что такое куча?

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

SplFixedArray. Создаем массив с фиксированной длиной. Я могу забыть о стандартных массивах php и использовать SplFixedArray с ее методами? И кстати по индексу я могу обращаться и в SplDoublyLinkedList.

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

SplObjectStorage. Хранит массив объектов и ассоциирует указанные данные с объектами. Мне интересно, что может быть в тех данных? Описание объекта?

Оп, расскажи подробнее. Вот где грань между использованием SPL и встроенных функций php?
#510 #376651
>>376646
лол очередь и стек одно и тоже? почитай про них в гуле
#511 #376657
>>376651
LIFO и FIFO?

А вот SplDoublyLinkedList может использовать любой из этих методов.
#512 #376658
Пыхонасики, у меня парочка вопросов по MySQL и БД в целом.
1) Какой "движок" для сайтиков с MySQL использовать?
Книжки вроде советуют InnoDB.
2) К каким аттрибутам ставить индексы в таблицах?
Гугл говорит, что индекс ускоряет чтение столбца и замедляет запись, т. е если у меня есть таблица с информацией о книгах и я выбираю всегда только их названия, то мне ставить индекс у столбца с названием книги?
А если для этой же таблицы я постоянно выбираю информацию из всех столбцов, то и индексы не нужны или, наоборот, их ставить у всех столбцов?
#513 #376669
>>376658
индексы ставятся на поля по которым идет выборка или сортировка. primary как правило на id.
#514 #376676
А где тут кнопки скидывали красивого дизайна для бесплатного скачивания?
#515 #376679
Вот подглядел в соседнем треде простую задачку https://projecteuler.net/problem=1
Вот решение.
http://ideone.com/07tPq2
#516 #376683
>>376435
Вроде разобрался с операторами селекторов и разобрался в коде с хабра. Ну вот смотри, селекторы + и ~ используются, когда находятся в одном и том же блоке, а у меня там отдельно блок для кнопок(навигация) и блок с картинками. Попробовал вот так сделать: #tab1:checked .portfolio.pics.all { display: block; } - что-то не работает. Не пойму input:checked только с "+" и "~" работает?
34 Кб, 944x344
#517 #376707
Бро, подскажи, у меня примеры с твоего сайта, если их в phpstorm копипастить, ведут себя странно. В частности не работает "/n". В чем может быть проблема? Пикрелейтед код.
53 Кб, 1868x566
#518 #376708
>>376707
Результат пикрелейтед.
#519 #376713
>>376708
>>376707
У меня в браузере тоже не работает \n, вроде бы уже сталкивался с этим и тут объясняли.
#520 #376717
!xnn2uE3AU. #521 #376725
>>376616

Ок, гляну. Кстати, что касается тестхаба, я наконец-то придумал новую, упрощенную версию, без групп и студентов, и даже смог на листочке нарисовать все страницы (впервые) надо будет потом обновить задачу.
!xnn2uE3AU. #522 #376726
>>376641

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

Он не циклический, у крайних нод там стоит null.

>>376707

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

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

Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
111 Кб, 1366x768
#523 #376727
>>376708
Во первых в phpstorm можно запускать и дебажить скрипты, что очень удобно. Не надо браузеров и прочего - просто нажми ctrl+alt+f10 и снизу будет результат работы. В этом окошечке и просто \n работает. А так да, есть фишка - в линупсах символ перевода строки \n в виндовсах \r\n. Надо учитывать этот момент когда будешь работать с текстом.

Интересно, почему у тебя в firefox все окей отображается, в то время как у меня без тега <meta charset="UTF-8"> в странице кракозябры. Заставил меня задуматься, я был уверен что это норма. Ide та же, браузер тот же.
#524 #376733
>>376596

>{0: 1, 1: 1, 2: 1, length: 3} — array-like


Но ведь это Object. Т.е проверка на array-like должна быть до проверки на Object?
!xnn2uE3AU. #525 #376747
Добавил 10 задач на DOM/CSSOM/Events в задачи на яваскрипт, всех приглашаю порешать: https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>>376733

ну так функции и массивы это тоже Object.
!xnn2uE3AU. #526 #376751
>>376727

В Windows \n прекрасно работает в консоли (но не в блокноте, но кто им пользуется?), так что можно использовать его.
#527 #376755
>>376751
Ну моя phpstorm например при нажатии на enter вставляет \r\n. Так что я когда делал задачки на текст с регулярками писал исходя из того что может быть либо \n либо \r\n
!xnn2uE3AU. #528 #376801
Уф, я сделал мокапы для новой версии TestHub: https://gomockingbird.com/mockingbird/#l0bk13j (мокапы — отличная вещь, отсноительно быстро можно продумать всю структуру сайта, хотя я обычно рисую на листочке, а потом только переношу то, что есть).

Потом обновлю текст задачи на гитхабе.

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

>>376624

> Подскажите кто как вообще правильно в ооп сформулировать эту задачу и её решение.



Решать надо так:

- Определяем, какие сущности есть в задаче (очевидно, Департаменты и Работники)
- Определяем, какие у них есть свойства
- Определяем что можно с ними делать, то есть какие у них есть методы
- Определяем, как они свзяаны (Работники относятся к какому-то департаменту)
- Пишем код

> Вторую задачу пофиксил



> str_repeat(' ', $length - mb_strlen($string));


Тут отрицательное число выйти не может?

А так, все верно.
!xnn2uE3AU. #529 #376802
>>376632

Не знаю, может тебе рейтинг CMS поможет?

http://www.cmsmagazine.ru/catalogue/
http://2012.tagline.ru/cms/

>>376640

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


> if ($string[$i] != " ") {


Используй strtr или str_replace

> $string[$i]


Это берет $i-й байт, а не букву. Соответственно, это работает с латиннцией и пробелом, но не будет работать с другими буквами, потому лучш вообще не использовать этот способ.

> strlen($test);


зачем эта строчка если она не используется

> $i < floor((mb_strlen($test))/2)


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

Неприавльно определяет слово: http://ideone.com/Fg3qo8
!xnn2uE3AU. #529 #376802
>>376632

Не знаю, может тебе рейтинг CMS поможет?

http://www.cmsmagazine.ru/catalogue/
http://2012.tagline.ru/cms/

>>376640

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


> if ($string[$i] != " ") {


Используй strtr или str_replace

> $string[$i]


Это берет $i-й байт, а не букву. Соответственно, это работает с латиннцией и пробелом, но не будет работать с другими буквами, потому лучш вообще не использовать этот способ.

> strlen($test);


зачем эта строчка если она не используется

> $i < floor((mb_strlen($test))/2)


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

Неприавльно определяет слово: http://ideone.com/Fg3qo8
!xnn2uE3AU. #530 #376804
>>376643

Базовый класс и функцию m2 надо сделать абстрактной (abstract).

>>376644

Почитай описание http://php.net/manual/ru/function.ftp-put.php и что надо передать этой функции и сравни с тем, что ты передаешь, особенно в $destination_file

Подсказка: надо передавать не имя папки.

>>376646

> От сюда вывод, что стек и двусвязный список - это одно и то же?


Нет. Стек может быть сделан на основе списка, а может например на основе массива. Что и видно из определения:

> SplStack extends SplDoublyLinkedList



Также, обычно для стека определено только несколько операций:

- добавить данные в верх стека (push)
- снять данные сверху (pop)
- проверить, не пуст ли стек
- подсмотреть значение на верху стека, не снимая

Остальные операции могут и отсутсвовать.

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

https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA
http://informatics.mccme.ru/mod/book/view.php?id=580

Впрочем, в комментариях там пишут

> the SplStack is simply a SplDoublyLinkedList with an iteration mode IT_MODE_LIFO and IT_MODE_KEEP



Что действительно, он несильно отличается от списка.

> Дальше SplQueue.


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

Еще есть deque = double-ended queue — это очередь, в которую можно вставлять и брать данные с обеих сторон (заметь, что это не то же, что и список, так как в списке можно брать и менять данные в середине).

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

> Что такое куча?



https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D1%87%D0%B0_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)

http://habrahabr.ru/post/112222/

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

> SplFixedArray. Создаем массив с фиксированной длиной.


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

> И кстати по индексу я могу обращаться и в SplDoublyLinkedList.


Это очень неэффективно, так как php вынужден будет обойти N узлов по очереди прежде чем дойдет до нужного. В отличие от массива, где доступ по ключу быстрый и занимает O(1), в списке он долгий и занимает O(N). Зато вставка в середину в списке быстрая (а в массиве тебе придется менять кучу индексов и это медленно).

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

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


Нет. Это просто в PHP массив объединяет в себе несколько структур данных:

- словарm или карта (dictionary или map): структура, позволяющая хранить элементы под индексами, быстро их искать и вставлять/удалять, но без сохранения порядка следования
- двусвязный список: структура, которая добавляет массивам возможность помнить порядок встаки элементов

И может имитировать стек (эффективно так как вставка происходт в конец), очередь (неэффективно, так как при вставке в начало надо перенумеровывать и переставлять все остальные элементы, а это O(N)).

В других языках эти структуры сделаны отдельно:

- вектор (массив в котором цифровые ключи от 0 до N, хранятся по возрастанию номеров)
- список и двусвязный список
- стек, очередь, deque
- множество (set), позволяет хранить элементы, добавлять/удалять, проверять наличие элемента в нем, но нельзя получить эти элементы обратно.
- multiset, множество в котором одинаковый элемент может встретиться несколько раз
- словарь/карта/ассоциативный массив, который позволяет сохранять данные с произвольными ключами, но не позволяет запомнить порядок
- мешок (bag), то же самое, но можно добавить несколько элементов с одинаковым ключом

И может еще что-то. Хорошо бы кстати, в них разбираться.
!xnn2uE3AU. #530 #376804
>>376643

Базовый класс и функцию m2 надо сделать абстрактной (abstract).

>>376644

Почитай описание http://php.net/manual/ru/function.ftp-put.php и что надо передать этой функции и сравни с тем, что ты передаешь, особенно в $destination_file

Подсказка: надо передавать не имя папки.

>>376646

> От сюда вывод, что стек и двусвязный список - это одно и то же?


Нет. Стек может быть сделан на основе списка, а может например на основе массива. Что и видно из определения:

> SplStack extends SplDoublyLinkedList



Также, обычно для стека определено только несколько операций:

- добавить данные в верх стека (push)
- снять данные сверху (pop)
- проверить, не пуст ли стек
- подсмотреть значение на верху стека, не снимая

Остальные операции могут и отсутсвовать.

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

https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA
http://informatics.mccme.ru/mod/book/view.php?id=580

Впрочем, в комментариях там пишут

> the SplStack is simply a SplDoublyLinkedList with an iteration mode IT_MODE_LIFO and IT_MODE_KEEP



Что действительно, он несильно отличается от списка.

> Дальше SplQueue.


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

Еще есть deque = double-ended queue — это очередь, в которую можно вставлять и брать данные с обеих сторон (заметь, что это не то же, что и список, так как в списке можно брать и менять данные в середине).

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

> Что такое куча?



https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D1%87%D0%B0_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)

http://habrahabr.ru/post/112222/

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

> SplFixedArray. Создаем массив с фиксированной длиной.


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

> И кстати по индексу я могу обращаться и в SplDoublyLinkedList.


Это очень неэффективно, так как php вынужден будет обойти N узлов по очереди прежде чем дойдет до нужного. В отличие от массива, где доступ по ключу быстрый и занимает O(1), в списке он долгий и занимает O(N). Зато вставка в середину в списке быстрая (а в массиве тебе придется менять кучу индексов и это медленно).

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

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


Нет. Это просто в PHP массив объединяет в себе несколько структур данных:

- словарm или карта (dictionary или map): структура, позволяющая хранить элементы под индексами, быстро их искать и вставлять/удалять, но без сохранения порядка следования
- двусвязный список: структура, которая добавляет массивам возможность помнить порядок встаки элементов

И может имитировать стек (эффективно так как вставка происходт в конец), очередь (неэффективно, так как при вставке в начало надо перенумеровывать и переставлять все остальные элементы, а это O(N)).

В других языках эти структуры сделаны отдельно:

- вектор (массив в котором цифровые ключи от 0 до N, хранятся по возрастанию номеров)
- список и двусвязный список
- стек, очередь, deque
- множество (set), позволяет хранить элементы, добавлять/удалять, проверять наличие элемента в нем, но нельзя получить эти элементы обратно.
- multiset, множество в котором одинаковый элемент может встретиться несколько раз
- словарь/карта/ассоциативный массив, который позволяет сохранять данные с произвольными ключами, но не позволяет запомнить порядок
- мешок (bag), то же самое, но можно добавить несколько элементов с одинаковым ключом

И может еще что-то. Хорошо бы кстати, в них разбираться.
!xnn2uE3AU. #531 #376806
>>376646

> SplObjectStorage. Хранит массив объектов и ассоциирует указанные данные с объектами.


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

Ну например, ты что-то делаешь с деревом DOM и не хочешь обрабатывать один и тотже узел дважды. Для жтого ты можешь добавлять обработанные узлы в storage и потом проверять, нет ли его уже в списке обработанных. Как ты иначе сделаешь это (способы есть, но они не такие аккуратные выходят)?

> Вот где грань между использованием SPL и встроенных функций php?


Я написал выше, что у структур есть сильные и слабые стороны. Например, очередь: если ты будешь имитировать ее массивом, вставляя данные через array_unshift, и снимая через array_pop() то ты получаешь сложность O(N) на вставку. А с настоящей очередью - O(1). Разница будет явно видна когда у тебя будет очередь на тысячи-миллионы элементов и миллионы вставок. Разница может выйти очень большой, по времени выполнения.

Ну или другой пример, бинарное дерево. Оно хранит данные в отсортированном виде, и позволяет делать выборки вроде «найти все элементы с ключами от 16 до 150 в порядке возрастания». Ты, конечно, можешь использовать массив, но это будет медленнее, опять же на больших объемах данных разница может быть огромной.

Вот в вики например есть список интересный: https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

Из них более-менее часто вспоминаются Битовые поля, Связный список, Ассоциативный массив, Хеш-таблица, Стек, Очередь, Очередь с приоритетом, Дек, Граф, Деревья, Двоичное дерево поиска.

http://algolist.manual.ru/ds/

http://habrahabr.ru/post/156361/

http://kvodo.ru/data-structures-introduction.html

Не хочешь получить задачку реализовать все эти замечательные структуры данных?
!xnn2uE3AU. #532 #376807
>>376657

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

>>376658

1 InnoDB
2 По которым ищешь или сортируешь записи. Вообще, это большая тема:

http://phpclub.ru/mysql/doc/mysql-indexes.html
http://phpclub.ru/mysql/doc/mysql-optimisation.html
http://habrahabr.ru/post/31129/
http://habrahabr.ru/post/211022/
http://habrahabr.ru/post/154167/

Почитай, этого наверно мало, так что погугли еще потом.

>>376676

Не знаю. Может это:

http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations
http://ianlunn.github.io/Hover/
http://www.inserthtml.com/demos/css/button-styles/
http://www.freshdesignweb.com/css3-buttons.html

Я их ищу по «css3 buttons».
!xnn2uE3AU. #532 #376807
>>376657

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

>>376658

1 InnoDB
2 По которым ищешь или сортируешь записи. Вообще, это большая тема:

http://phpclub.ru/mysql/doc/mysql-indexes.html
http://phpclub.ru/mysql/doc/mysql-optimisation.html
http://habrahabr.ru/post/31129/
http://habrahabr.ru/post/211022/
http://habrahabr.ru/post/154167/

Почитай, этого наверно мало, так что погугли еще потом.

>>376676

Не знаю. Может это:

http://www.sanwebe.com/2014/02/css3-buttons-examples-with-effects-animations
http://ianlunn.github.io/Hover/
http://www.inserthtml.com/demos/css/button-styles/
http://www.freshdesignweb.com/css3-buttons.html

Я их ищу по «css3 buttons».
!xnn2uE3AU. #533 #376808
>>376679

Верно.

>>376683

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

>>376727

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

>>376733

да, до.

>>376755

Ну ок тогда. Но это переключается настройкой «line endings -> unix» в настройках.
!xnn2uE3AU. #534 #376809
>>376616

Так, твой код я гляну, но не сегодня, а может завтра, а то уже поздно. Вот, можешь пока посмотреть новые (очередные) наброски по тестхабу: https://gomockingbird.com/mockingbird/#l0bk13j
#535 #376815
>>376802

>Используй strtr или str_replace


>Это берет $i-й байт, а не букву. Соответственно, это работает с латиннцией и пробелом, но не будет работать с другими буквами, потому лучш вообще не использовать этот способ.


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



>Неприавльно определяет слово: http://ideone.com/Fg3qo8



переделал: http://ideone.com/pR7oEH
#537 #376834
>>376801

> - Определяем, какие сущности есть в задаче (очевидно, Департаменты и Работники)


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


> Тут отрицательное число выйти не может?


Случайно потер, изначально там была проверка. Вот вернул обратно, теперь в случае если слово больше то ставиться 1 пробел дабы не слипалось и слово обрезается до нужной длины с точкой на конце.
http://ideone.com/EmSs10
78 Кб, 1224x672
#538 #376851
Ребзя, есть какой-нибудь гайд для по Github for Windows? В первый раз залил файлы без проблем, теперь что-то не получается. Ошибка - пикрилейтед. Все гайды, которые находил на английском. Я, наверное, немного аутист
#539 #376881
>>376851
Используй git shell. Во первых это правильно, а во вторых без багов, как в том же Github for Windows.
Туториал по работе с консолью: https://try.github.io/levels/1/challenges/1
На английском, да, зато очень годно для новичка.
#540 #376884
>>376881
И консоль, на мой взгляд, удобней и понятней, если разобраться с командами.
#541 #376890
>>376881
Спасибо, думаю что на перевес с гугл-транслейтом таки разберусь.
#542 #376921
>>376461
6. http://jsbin.com/labozapa/10/edit

12. http://jsbin.com/labozapa/10/edit - как-то тяжко. Код пока полностью нерабочий, так как сначала надо нормально сформировать класс. Так что смотри только свойства, к методам я пока не прикасался.

Правильно ли я понимаю, когда мы пишем что-то подобное: Hamburger.type[Hamburger.SIZE_SMALL] у конструктора Hamburger появляется объект type с свойством-объектом SIZE_SMALL?

Не могу понять, как создать массив у конструктора?(покажи на примере) Там же все индексы будут числовыми, а ты говоришь что так будет непонятно.
54 Кб, 1333x502
#543 #376947
Оп, подскажи, делаю задачку с твоего сайта, массивы. Иногда выполняется норм.
68 Кб, 1479x619
#544 #376950
>>376947
А иногда - пикрелейтед. Чому так?
70 Кб, 1321x891
#545 #376952
И вдогонку задачка на циклы. Все правильно сделал?
#546 #376953
>>376952
Уже вижу что обосрался. Бля.
#547 #376954
>>376950
Есть массив из 3 элементов: [a, b, c]. Элемент a иммет индекс 0, b - 1, c - 2.
Другими словами, максимальный элемент массива = длина - 1.
И читай ошибки, где PHP Notice.
#548 #376956
>>376954
Спасибо бро. Получается надо так:
$word1[rand(0, (count($word1)-1))]
?
#549 #376976
>>376604
2) http://codepad.org/HKx6VrGx как тут с dirname и basename сделать?
3) http://codepad.org/PVHzlvj8 - по мне он работает, в чем дело?
http://codepad.org/9PpOdd15 - этот поправил
#550 #377007
>>376804
Ох лол, а я столько мучился.
Спасибо, ОП.
Кстати, собираетесь пилить перекат:
#551 #377010
>>377007
Недолгой была радость.
Почему, если я загружаю файл, то все ок, он загружается. Но, стоит мне попробовать загрузить папку, выдает ошибку:
Warning: ftp_put(Attachment): failed to open stream: Permission denied in C:\Apache24\htdocs\localhost\File\Load.php on line 28
Вот 28 строка:
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);
Хотя, файлы загружает окей.
#552 #377013
>>377007>>377010
Хотя, я сделал чтоы не в папку кидало на сайт, а в корневую директорию.
#553 #377020
Костыльное решение задачи про неглубокое копирование http://jsfiddle.net/8ne7gq6u/ Алсо, ОП у тебя небольшая очепятка в пасте

>d.setYear(2015);


>console.log(c.getYear()); // 2014


Функция Date::getYear() deprecated, возвращает значение года минус 1900. Для того чтобы получить год в нормальном виде нужно использовать getFullYear. Пруф https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getYear
#554 #377025
>>376437
http://jsbin.com/buzade/34/edit?js,console

Hamburger.prices is not a function. Что я делаю не так?
#555 #377043
У меня часто возникают ситуации вроде: либо хранить больше информации в бд, либо хранить меньше, но остальную получать во время работы скрипта.

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

Сам думаю, что пока записей в бд не миллионы лучше хранить 2 варианта. Поделитесь советом мудрым, пожалуйста.
#556 #377056
>>377025
IndexOf работает только с чистыми массивами.

In же работало, зачем убирать его?
#557 #377069
>>376435
Переделал - https://github.com/infinitecats/infinitecats. Блок навигации в ие8 починить не удалось. Там чего-то длина кнопок увеличивается само по себе.
#558 #377072
>>377069
И да, почему-то в портфолио в блоке навигации не получается переключиться на вкладку "ALL". Почему?
#559 #377081
Уже неделю не даёт покоя эта задача.
http://ideone.com/hqlOMT
Функция работает для двух шагов, но если их там больше двух, ничего не возвращается. Как я понял она зацикливается на остановке спортивной и чикаловской, так как первые элементы их массивов обращаются друг-другу. Чего я только не перепробовал, ставил unset Везде, но это не помогло, т.к цикл даже не доходит до конца, сделал специальный массив, для проверки на повторяющиеся ключи, но всё бестолку.
#560 #377199
Последнее из простых жс-заданий http://jsfiddle.net/qejg7ewy/ Вопрос по второй части: почему без жквери? Во всех же вакансиях когда пишут про js подразумевают именно jQuery, мне во всяком случае так казалось.
#561 #377200
>>377199
Чтобы понимать jQuery, нужно изучить "чистый javascript". jQuery - всего лишь библиотека, которая упрощает жизнь, и которая написано на "чистом javascript", который ты сейчас и изучаешь.
#563 #377276
>>377207
http://jsbin.com/hekole/6/edit?js,console

В правильном направлении иду? Куда дальше смотреть?
#564 #377429
>>373424
Доброанон, проверь задачи из урока по строкам
Задачи про стихи - http://codepad.org/h8AP0wYp
Задача про палиндром - http://ideone.com/2y7o1L
#565 #377437
>>377429
На будущее: пробелы, да и любые символы можно заменять функцией str_replace или preg_replace.
!xnn2uE3AU. #566 #377439
>>376616

Анон, я посмотрел код, вот мысли по этому поводу, писать постараюсь кратко.

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

Почему ты assets и runtime в гитигнор не добавишь?

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

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

Оформление получилось аккуратное, норм.

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

Работу с HTTP в soauth надо выносить в отдельный класс (может в Юи что-то для этого есть?) — иначе твое расширение невозможно протестировать (при автотестах взаимодействие с сетью подменяется заглушкой — а у тебя там жестко вписан curl_exec в makeRequest).

CSLinkPager, SReCaptchaValidator — твое или сторонее? Ты бы хоть комментарий с указанием авторства туда вписал что ли.

Кстати, как залогиниться под админом? Я менял пользователю тип на admin, но этого недостаточно видимо.

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

Также, есть такая вещь как локальный конфиг, то есть когда конфиг состоит из 2 файлов (config.php и config.local.php), один коммитится в репозиторий, другой кладется в гитигнор. Тогда я, например, склонировав твой репозиторий, могу создать локальный конфиг, в него вписать мои настройки БД, почты и прочего, которые перекроют настройки из дефолтного конфига, и этот мой конфиг не будет никуда коммититься и мешаться.

Капча у меня не работает, пишет «nput error: Invalid referer». Видимо, из-за URL. Печалька, пришлось отключить.

Для почты

> $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls');


вот это надо выносить в конфиг — так как я может быть хочу другой сервер использовать. Более того, для отладки в Swiftmailer есть возможность класть письма в папочку вместо отправки. В Yii2 для этого есть настройка useFileTransport: http://www.yiiframework.com/doc-2.0/yii-swiftmailer-mailer.html — не знаю, есть ли она в Yii 1, но если есть было бы неплохо включать ее в dev-окружении — тогда письма складываются в формате .eml в папочку и открываются например Цундербердом или любым другим почтовым клиентом.

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

В качестве шаблона письма удобно использовать тот же шаблонизатор, что и для обычных шаблонов — PHP или twig. не надо писать свой недошаблонизатор (прочти почему: http://habrahabr.ru/post/230737/ )

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

> background="img/welcome_header.gif"


В письмах это не работает, там можно ссылаться либо на внешнюю картинку (http://...), причем часть клиентов блокирует по умолчанию внешние картинки, либо, что лучше, на вложенную в письмо картинку (cid:XXXX): http://phpclub.ru/detail/article/mail#part_3 http://habrahabr.ru/post/172269/ — такая будет работать надежнее.

При ошибке активации не надо редиректить на главную — надо написать об ошибке и что делать пользователю. Вообще, молча редиректить куда-то — плохая идея.
!xnn2uE3AU. #566 #377439
>>376616

Анон, я посмотрел код, вот мысли по этому поводу, писать постараюсь кратко.

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

Почему ты assets и runtime в гитигнор не добавишь?

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

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

Оформление получилось аккуратное, норм.

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

Работу с HTTP в soauth надо выносить в отдельный класс (может в Юи что-то для этого есть?) — иначе твое расширение невозможно протестировать (при автотестах взаимодействие с сетью подменяется заглушкой — а у тебя там жестко вписан curl_exec в makeRequest).

CSLinkPager, SReCaptchaValidator — твое или сторонее? Ты бы хоть комментарий с указанием авторства туда вписал что ли.

Кстати, как залогиниться под админом? Я менял пользователю тип на admin, но этого недостаточно видимо.

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

Также, есть такая вещь как локальный конфиг, то есть когда конфиг состоит из 2 файлов (config.php и config.local.php), один коммитится в репозиторий, другой кладется в гитигнор. Тогда я, например, склонировав твой репозиторий, могу создать локальный конфиг, в него вписать мои настройки БД, почты и прочего, которые перекроют настройки из дефолтного конфига, и этот мой конфиг не будет никуда коммититься и мешаться.

Капча у меня не работает, пишет «nput error: Invalid referer». Видимо, из-за URL. Печалька, пришлось отключить.

Для почты

> $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls');


вот это надо выносить в конфиг — так как я может быть хочу другой сервер использовать. Более того, для отладки в Swiftmailer есть возможность класть письма в папочку вместо отправки. В Yii2 для этого есть настройка useFileTransport: http://www.yiiframework.com/doc-2.0/yii-swiftmailer-mailer.html — не знаю, есть ли она в Yii 1, но если есть было бы неплохо включать ее в dev-окружении — тогда письма складываются в формате .eml в папочку и открываются например Цундербердом или любым другим почтовым клиентом.

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

В качестве шаблона письма удобно использовать тот же шаблонизатор, что и для обычных шаблонов — PHP или twig. не надо писать свой недошаблонизатор (прочти почему: http://habrahabr.ru/post/230737/ )

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

> background="img/welcome_header.gif"


В письмах это не работает, там можно ссылаться либо на внешнюю картинку (http://...), причем часть клиентов блокирует по умолчанию внешние картинки, либо, что лучше, на вложенную в письмо картинку (cid:XXXX): http://phpclub.ru/detail/article/mail#part_3 http://habrahabr.ru/post/172269/ — такая будет работать надежнее.

При ошибке активации не надо редиректить на главную — надо написать об ошибке и что делать пользователю. Вообще, молча редиректить куда-то — плохая идея.
!xnn2uE3AU. #567 #377440
>>376616

Насчет таблицы и модели account_interaction — это с какой-то хитрой целью сделано? Что-то я не понимаю, зачем там отдельная таблица. По идее ведь подтверждение можно сделать и в основной таблице users. Тем более, она еще и не связана внешним ключом с users — почему?

Также, странная страница /site/index, чем она отличается от главной? Если ничем то зачем она нужна?

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

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

Поле active в users надо было делать не binary, а tinyint(1).

Не используй DOCUMENT_ROOT, используй http://www.yiiframework.com/doc/api/1.1/CApplication#basePath-detail

> Users::model()->deleteNotActivated();


Такие вещи обычно по крону делаются.

> Yii::app()->session['regModel'] = $model;


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

> $criteria->addSearchCondition('teacher.surname', $this->teacher_id);


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

> // Через сколько дней удалять неактивированные аккаунты


Это в конфиг лучше класть

> 'value' => Yii::app()->request->baseUrl . Yii::app()->params['defaultAvatar']


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

> 'type',


> 'default',


> 'value' => "{$this->_type}"


Нет ли тут риска, что можно передать любое значение type?

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


Ну вот, а фейсбук сделал десятки вариантов на все случаи жизни: http://habrahabr.ru/post/227917/

> 'active', 'in', 'range' => array(


А это нельзя ли через boolean сделать?
!xnn2uE3AU. #567 #377440
>>376616

Насчет таблицы и модели account_interaction — это с какой-то хитрой целью сделано? Что-то я не понимаю, зачем там отдельная таблица. По идее ведь подтверждение можно сделать и в основной таблице users. Тем более, она еще и не связана внешним ключом с users — почему?

Также, странная страница /site/index, чем она отличается от главной? Если ничем то зачем она нужна?

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

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

Поле active в users надо было делать не binary, а tinyint(1).

Не используй DOCUMENT_ROOT, используй http://www.yiiframework.com/doc/api/1.1/CApplication#basePath-detail

> Users::model()->deleteNotActivated();


Такие вещи обычно по крону делаются.

> Yii::app()->session['regModel'] = $model;


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

> $criteria->addSearchCondition('teacher.surname', $this->teacher_id);


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

> // Через сколько дней удалять неактивированные аккаунты


Это в конфиг лучше класть

> 'value' => Yii::app()->request->baseUrl . Yii::app()->params['defaultAvatar']


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

> 'type',


> 'default',


> 'value' => "{$this->_type}"


Нет ли тут риска, что можно передать любое значение type?

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


Ну вот, а фейсбук сделал десятки вариантов на все случаи жизни: http://habrahabr.ru/post/227917/

> 'active', 'in', 'range' => array(


А это нельзя ли через boolean сделать?
!xnn2uE3AU. #568 #377441
>>376616

> if($this->_type == 'student') {


> if(isset($this->searchGroup)) {


По идее такие вещи можно через наследование делать: делаем метод $this->addSearchConditions() и в студенте вписываем туда код поиска по группе

> $criteria->condition = 'group_id=' .$this->searchGroup;


...

> $criteria->condition = 'active=1';


Ты этим не перекрываешь предыдущее условие?

> $criteria->addSearchCondition('name', $this->fullname, true, 'OR');


Тут не получается (active = 1 AND surname LIKE '...') OR name LIKE '...' ?

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

> Height hack for float wrappers


Этот хак вреден, так как обрезает то, что не поместилось в блок. Используй micro clearfix hack вместо него.

> $urlString = explode('?', $this->redirectUrl);


Лучше parse_url

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

Ты что по поводу написания тестов думаешь? Я в течение недели в любом случае постараюсь пасту-инструкцию на эту тему написать.
!xnn2uE3AU. #568 #377441
>>376616

> if($this->_type == 'student') {


> if(isset($this->searchGroup)) {


По идее такие вещи можно через наследование делать: делаем метод $this->addSearchConditions() и в студенте вписываем туда код поиска по группе

> $criteria->condition = 'group_id=' .$this->searchGroup;


...

> $criteria->condition = 'active=1';


Ты этим не перекрываешь предыдущее условие?

> $criteria->addSearchCondition('name', $this->fullname, true, 'OR');


Тут не получается (active = 1 AND surname LIKE '...') OR name LIKE '...' ?

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

> Height hack for float wrappers


Этот хак вреден, так как обрезает то, что не поместилось в блок. Используй micro clearfix hack вместо него.

> $urlString = explode('?', $this->redirectUrl);


Лучше parse_url

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

Ты что по поводу написания тестов думаешь? Я в течение недели в любом случае постараюсь пасту-инструкцию на эту тему написать.
!xnn2uE3AU. #569 #377444
Аноны, остальным постараюсь сегодня попозже ответить. А потом решим куда перекатываться.
#570 #377470
>>377444
http://jsbin.com/zahov/2/edit?js,console

Оп, заждался я тебя, не могу сидеть без дела.
!xnn2uE3AU. #572 #377537
Ок, я вернулся, продолжаем изучать PHP.

>>376815

Ок, теперь верно.

>>376816

> , find the sum of the even-valued terms.


надо складывать только нечетные числа. А ты складываешь все (я проверил твой ответ на сайте — неверно).

>>376834

Частично правильно.

> Свойство - кол-во менеджеров


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

Лучше свойством сделать «работники». То есть в департаменте есть массив его работников. Ну и шеф тоже должен быть свойством департамента.

> Свойство - зарплата


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

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

Если ты не знаешь что такое наследование, то это создание класса на основе существующего. Ты можешь взять класс за основу и добавить или переопределить свойства и методы. Абстрактный класс обозначает что объект класса нельзя создать, но от этого класса можно наследоваться. Подробнее ты можешь прочесть в маунале, гугле или книге Мэтта Зандстры из ОП-поста.
!xnn2uE3AU. #572 #377537
Ок, я вернулся, продолжаем изучать PHP.

>>376815

Ок, теперь верно.

>>376816

> , find the sum of the even-valued terms.


надо складывать только нечетные числа. А ты складываешь все (я проверил твой ответ на сайте — неверно).

>>376834

Частично правильно.

> Свойство - кол-во менеджеров


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

Лучше свойством сделать «работники». То есть в департаменте есть массив его работников. Ну и шеф тоже должен быть свойством департамента.

> Свойство - зарплата


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

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

Если ты не знаешь что такое наследование, то это создание класса на основе существующего. Ты можешь взять класс за основу и добавить или переопределить свойства и методы. Абстрактный класс обозначает что объект класса нельзя создать, но от этого класса можно наследоваться. Подробнее ты можешь прочесть в маунале, гугле или книге Мэтта Зандстры из ОП-поста.
#573 #377544
>>377507
http://jsbin.com/kamiy/2/edit?js,console

С removeClass надо еще подумать.
#574 #377545
>>377544
Сам атрибут class="" надо удалять?
!xnn2uE3AU. #575 #377546
>>376851

Есть клиент для командной строки и учебник на русском, официальный: http://git-scm.com/book/ru — он простой и понятный. Начни с него.

Возможно тобы выполнять команды тебе придется установить msys git (git клиент для командной строки под windows).

Не умеешь пользоваться командной строкой или слабо в ней ориентируешься?Ддержи краткий курс молодого бойца, который вправит тебе мозги: https://gist.github.com/codedokode/10539568

А потом, освоив сам гит, ты легко сможешь пользоваться клеинтом с кнопочками и окошками.

>>376881

Есть git book же на русском. Там хоть объяснения есть.

>>376921

> var cloneArray = a.concat();


Это какой-то костыль. Зачем делать копию, если просто можно не менять массив a, а класть все в новый?

В остальном, логика верная, только написать это можно проще.

> #12



> Правильно ли я понимаю, когда мы пишем что-то подобное: Hamburger.type[Hamburger.SIZE_SMALL] у конструктора Hamburger появляется объект type с свойством-объектом SIZE_SMALL?



Нет. Ничего само не появляется. Если ты ранее явно не создал свойство type то Hamburger.type вернет undefined, и при попытке выполнить

(undefined)[Hamburger.SIZE_SMALL] = ...;

вылетит ошибка (нельзя добавить свойство в undefined).

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



Я имел в виду словарь:

Hamburger.prices = {};
Hanburger.prices[...] = ...;

По твоей ссылке код от 6-й задачи.
!xnn2uE3AU. #575 #377546
>>376851

Есть клиент для командной строки и учебник на русском, официальный: http://git-scm.com/book/ru — он простой и понятный. Начни с него.

Возможно тобы выполнять команды тебе придется установить msys git (git клиент для командной строки под windows).

Не умеешь пользоваться командной строкой или слабо в ней ориентируешься?Ддержи краткий курс молодого бойца, который вправит тебе мозги: https://gist.github.com/codedokode/10539568

А потом, освоив сам гит, ты легко сможешь пользоваться клеинтом с кнопочками и окошками.

>>376881

Есть git book же на русском. Там хоть объяснения есть.

>>376921

> var cloneArray = a.concat();


Это какой-то костыль. Зачем делать копию, если просто можно не менять массив a, а класть все в новый?

В остальном, логика верная, только написать это можно проще.

> #12



> Правильно ли я понимаю, когда мы пишем что-то подобное: Hamburger.type[Hamburger.SIZE_SMALL] у конструктора Hamburger появляется объект type с свойством-объектом SIZE_SMALL?



Нет. Ничего само не появляется. Если ты ранее явно не создал свойство type то Hamburger.type вернет undefined, и при попытке выполнить

(undefined)[Hamburger.SIZE_SMALL] = ...;

вылетит ошибка (нельзя добавить свойство в undefined).

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



Я имел в виду словарь:

Hamburger.prices = {};
Hanburger.prices[...] = ...;

По твоей ссылке код от 6-й задачи.
!xnn2uE3AU. #576 #377547
>>376952

Всего получается около 61270, а не 55 000.

>>376956

Да. И еще есть функция array_rand возвращающая случайный ключ:

$x = $arr[array_rand($arr)];

>>376976

> как тут с dirname и basename сделать?


N раз вызвать dirname($x)

> по мне он работает, в чем дело?


Расмотрим пример:

var_dump( getRelativePath('/a/b/g/h/i', '/a/b/e/f')); // ../../../e/f

Чтобы перейти из первого каталога (/a/b/g/h/i) во второй (/a/b/e/f), надо 3 раза подняться наверх (../../../) затем спуститься в /e/f. А твой код пишет:

> "../e/f"


Что неверно.

> этот поправил


Не работает: http://codepad.org/hGusmrdF — дает неприавильный ответ
!xnn2uE3AU. #576 #377547
>>376952

Всего получается около 61270, а не 55 000.

>>376956

Да. И еще есть функция array_rand возвращающая случайный ключ:

$x = $arr[array_rand($arr)];

>>376976

> как тут с dirname и basename сделать?


N раз вызвать dirname($x)

> по мне он работает, в чем дело?


Расмотрим пример:

var_dump( getRelativePath('/a/b/g/h/i', '/a/b/e/f')); // ../../../e/f

Чтобы перейти из первого каталога (/a/b/g/h/i) во второй (/a/b/e/f), надо 3 раза подняться наверх (../../../) затем спуститься в /e/f. А твой код пишет:

> "../e/f"


Что неверно.

> этот поправил


Не работает: http://codepad.org/hGusmrdF — дает неприавильный ответ
!xnn2uE3AU. #577 #377551
>>377007

Собираемся.

>>377010

Открой мануал и узри:

> ftp_put — Загружает файл на FTP-сервер



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

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

>>377020

> Алсо, ОП у тебя небольшая очепятка в пасте


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

> Костыльное решение задачи


Действительно, оно костыльное. Например, с чего ты взял что можно копировать Date по свойствам? У Date все свойства спрятаны внутри и недоступны через for .. in, потому ничего не копируется:

http://jsfiddle.net/m2bwjc0n/1/

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

new Date(d.getTime())

или

new Date(+d); // используем трюк что при преобразовании даты к числу она возвращает то же что и getTime()

Массив лучше копировать циклом от 0 до length - 1. А вот для объектов делать for .. in, да еще и с проверкой на hasOwnProperty — а то можно накопировать свойств из прототипов.
!xnn2uE3AU. #577 #377551
>>377007

Собираемся.

>>377010

Открой мануал и узри:

> ftp_put — Загружает файл на FTP-сервер



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

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

>>377020

> Алсо, ОП у тебя небольшая очепятка в пасте


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

> Костыльное решение задачи


Действительно, оно костыльное. Например, с чего ты взял что можно копировать Date по свойствам? У Date все свойства спрятаны внутри и недоступны через for .. in, потому ничего не копируется:

http://jsfiddle.net/m2bwjc0n/1/

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

new Date(d.getTime())

или

new Date(+d); // используем трюк что при преобразовании даты к числу она возвращает то же что и getTime()

Массив лучше копировать циклом от 0 до length - 1. А вот для объектов делать for .. in, да еще и с проверкой на hasOwnProperty — а то можно накопировать свойств из прототипов.
!xnn2uE3AU. #578 #377555
>>377025

indexOf работает на массивах: [1, 2, 3].indexOf(2)
in — для поиска ключей в объекте: 5 in { 3: 300, 5: 500 }

Аргумент extended у конструктора не используется.

>>377043

Хранить меньше

>>377069

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

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

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

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

Если переключить разделы портфолио, то кнопка «All» уже обратно не включается (ты перепутал tab1 и tabL).

В блоке «Consectetur, Tristiquet» у тебя снизу слишком большое поле. Сравни с макетом — раза в 2 больше чем надо. А вот над «Our Featured Works» наоборот, не хватает белого цвета. А почему? А потому, что margin-top не закрасит эту область белым. Это всего лишь отступ между блоками.

> pic-4 reset-margin


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

Список социальных кнопок, список разделов и список картинок в портфолио — все это семантичнее делать через ul/li а не div.

Насчет IE — а ты использовал средства отладки вызываемые по F12? у меня есть большая паста про особенности ИЕ, рекомендую, верстальщик должен это знать: https://gist.github.com/codedokode/855e3970124687b26a1c

Прочти пасту, потом открой отладчик по F12 и посмотри на графу «Document Mode». Там написано «IE7 Standarts». То есть ИЕ думает что перед ним древнее старье, и это старье надо отображать не по стандартам, а имитировать все баги бажного ИЕ7. Неудивительно, что все разваливается. Почитай мою пасту и исправь для начала проблему с режимом совместимости. Думаю, после этого исправлить оставшиеся баги будет не сложно.

Останутся такие проблемы:

- IE8 не умеет ни transition, ни animation. Надо для него будет прописать другой эффект при наведении на CSS2.1, без CSS3
- IE8 не понимает селектор + который использован в переключателе. Надо либо найти решение средствами CSS2.1 либо дописать простой яваскрипт, который будет выполняться только в IE8 и ниже:

// подключаем jQuery только для IE8 и ниже
var btns = $('.portfolio-selector label'); // список кнопок в переключалке
$('.portfolio-selector').on('change', 'input', function () { // при изменении состояния радиокнопки
btns.removeClass('active'); // убираем класс active со всех кнопок
var checkedId = btns.find('input:checked').attr('id'); // находим id активной кнопки
var activeButton = btns.filter('[for="' + checkedId + '"]'); // находим кнопку с таким же for
activeButton.addClass('active'); // добавляем ей css-класс
});

Если скрипт не заработает — пиши. Там можт надо имена классов еще подправить.
!xnn2uE3AU. #578 #377555
>>377025

indexOf работает на массивах: [1, 2, 3].indexOf(2)
in — для поиска ключей в объекте: 5 in { 3: 300, 5: 500 }

Аргумент extended у конструктора не используется.

>>377043

Хранить меньше

>>377069

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

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

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

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

Если переключить разделы портфолио, то кнопка «All» уже обратно не включается (ты перепутал tab1 и tabL).

В блоке «Consectetur, Tristiquet» у тебя снизу слишком большое поле. Сравни с макетом — раза в 2 больше чем надо. А вот над «Our Featured Works» наоборот, не хватает белого цвета. А почему? А потому, что margin-top не закрасит эту область белым. Это всего лишь отступ между блоками.

> pic-4 reset-margin


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

Список социальных кнопок, список разделов и список картинок в портфолио — все это семантичнее делать через ul/li а не div.

Насчет IE — а ты использовал средства отладки вызываемые по F12? у меня есть большая паста про особенности ИЕ, рекомендую, верстальщик должен это знать: https://gist.github.com/codedokode/855e3970124687b26a1c

Прочти пасту, потом открой отладчик по F12 и посмотри на графу «Document Mode». Там написано «IE7 Standarts». То есть ИЕ думает что перед ним древнее старье, и это старье надо отображать не по стандартам, а имитировать все баги бажного ИЕ7. Неудивительно, что все разваливается. Почитай мою пасту и исправь для начала проблему с режимом совместимости. Думаю, после этого исправлить оставшиеся баги будет не сложно.

Останутся такие проблемы:

- IE8 не умеет ни transition, ни animation. Надо для него будет прописать другой эффект при наведении на CSS2.1, без CSS3
- IE8 не понимает селектор + который использован в переключателе. Надо либо найти решение средствами CSS2.1 либо дописать простой яваскрипт, который будет выполняться только в IE8 и ниже:

// подключаем jQuery только для IE8 и ниже
var btns = $('.portfolio-selector label'); // список кнопок в переключалке
$('.portfolio-selector').on('change', 'input', function () { // при изменении состояния радиокнопки
btns.removeClass('active'); // убираем класс active со всех кнопок
var checkedId = btns.find('input:checked').attr('id'); // находим id активной кнопки
var activeButton = btns.filter('[for="' + checkedId + '"]'); // находим кнопку с таким же for
activeButton.addClass('active'); // добавляем ей css-класс
});

Если скрипт не заработает — пиши. Там можт надо имена классов еще подправить.
!xnn2uE3AU. #579 #377557
Аноны, а почему вы не делаете задачки по яваскрипту на DOM? Я старался, придумывал

>>377072

Опечатка в for/id

>>377081

> if(!array_search($key1, $check)){


Так нельзя проверять наличие элемента так как может вернуться 0, а это значит что элемент найден. Но if (!0) сработает.

Используй in_array

Искать надо не в check, а в накопленном к данному моменту пути, то есть видимо path.

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

>>377199

> Вопрос по второй части: почему без жквери? Во всех же вакансиях когда пишут про js подразумевают именно jQuery, мне во всяком случае так казалось


Потому, что jQuery — обертка над DOM/Events. Как можно эффективно пользоваться jQuery если ты не понимаешь что внутри и что он делает? Сначала надо ДОМ изучить, ручками виджеты пописать, а потом уже будем к джейквери переходить. Мы готовим хороших специалистов, а не кое-как кодеров, которые не понимают что они пишут.

А вот когда ты ДОМ выучишь, я может задания на Jquery и jQuery UI придумаю. Все по порядку.

> Во всех же вакансиях когда пишут про js подразумевают именно jQuery,


Подразумевают знание js + DOM + jQuery + плагины к нему.

> function getType(variable)


Чтобы проверить является ли variable примитивным значением, можно использовать typeof + проверку на null/undefined.

Та же ошибка что и в прошлой задаче, Date не копируется.
!xnn2uE3AU. #579 #377557
Аноны, а почему вы не делаете задачки по яваскрипту на DOM? Я старался, придумывал

>>377072

Опечатка в for/id

>>377081

> if(!array_search($key1, $check)){


Так нельзя проверять наличие элемента так как может вернуться 0, а это значит что элемент найден. Но if (!0) сработает.

Используй in_array

Искать надо не в check, а в накопленном к данному моменту пути, то есть видимо path.

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

>>377199

> Вопрос по второй части: почему без жквери? Во всех же вакансиях когда пишут про js подразумевают именно jQuery, мне во всяком случае так казалось


Потому, что jQuery — обертка над DOM/Events. Как можно эффективно пользоваться jQuery если ты не понимаешь что внутри и что он делает? Сначала надо ДОМ изучить, ручками виджеты пописать, а потом уже будем к джейквери переходить. Мы готовим хороших специалистов, а не кое-как кодеров, которые не понимают что они пишут.

А вот когда ты ДОМ выучишь, я может задания на Jquery и jQuery UI придумаю. Все по порядку.

> Во всех же вакансиях когда пишут про js подразумевают именно jQuery,


Подразумевают знание js + DOM + jQuery + плагины к нему.

> function getType(variable)


Чтобы проверить является ли variable примитивным значением, можно использовать typeof + проверку на null/undefined.

Та же ошибка что и в прошлой задаче, Date не копируется.
#580 #377559
>>377440
>>377441

>soauth — это ты сам расширение целое написал?


По факту там 80% моего кода. Но саму структуру и некоторые методы я заимствовал и переделывал под себя из похожего, но не подходящего мне по ряду причин, расширения.

>CSLinkPager, SReCaptchaValidator — твое или сторонее?


CSLinkPager это мой переделанный код из парента yii CLinkPager. SReCaptchaValidator, тут допиленный код найденный в интернетах.

>Кстати, как залогиниться под админом?


Создаешь админа в базе, переходишь по экшену admin/login и логинишься, вроде нет там подводных камней.

>Ключи от всяких приложений или пароли не надо коммитить в репозиторий


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

>Капча у меня не работает, пишет «nput error: Invalid referer». Видимо, из-за URL.


Скорее всего, oath и капча прописаны под http://local.testhub.com/.

>вроде есть класс SMailer — но он не используется.


Да, я хотел это в класс вынести, потом передумал, класс остался.

>Насчет таблицы и модели account_interaction — это с какой-то хитрой целью сделано?


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

>Тем более, она еще и не связана внешним ключом с users — почему?


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

>Также, странная страница /site/index, чем она отличается от главной? Если ничем то зачем она нужна?


Это и есть главная страница, просто я urlManager не до конца настроил, потому site/index не убиралась из url при переходе по ссылке.

>Я тут еще подумал, а в чем смысл в раздельном логине для студентов и преподавателей?


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

>Такие вещи обычно по крону делаются.


Да, знаю. А так совсем не годится или для мелких проектов сгодится?

>Вот это место немного странное. Почему поле называется teacher_id, а хранится в нем отнюдь не id? Тут нет ошибки?


Угу, исправлю.

>Нет ли тут риска, что можно передать любое значение type?


Хм, надо подумать.

>Ты что по поводу написания тестов думаешь?


Думаю, что идея хорошая, но не знаю как по времени у меня получится. Инструкция в любом случае не помешает.
#580 #377559
>>377440
>>377441

>soauth — это ты сам расширение целое написал?


По факту там 80% моего кода. Но саму структуру и некоторые методы я заимствовал и переделывал под себя из похожего, но не подходящего мне по ряду причин, расширения.

>CSLinkPager, SReCaptchaValidator — твое или сторонее?


CSLinkPager это мой переделанный код из парента yii CLinkPager. SReCaptchaValidator, тут допиленный код найденный в интернетах.

>Кстати, как залогиниться под админом?


Создаешь админа в базе, переходишь по экшену admin/login и логинишься, вроде нет там подводных камней.

>Ключи от всяких приложений или пароли не надо коммитить в репозиторий


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

>Капча у меня не работает, пишет «nput error: Invalid referer». Видимо, из-за URL.


Скорее всего, oath и капча прописаны под http://local.testhub.com/.

>вроде есть класс SMailer — но он не используется.


Да, я хотел это в класс вынести, потом передумал, класс остался.

>Насчет таблицы и модели account_interaction — это с какой-то хитрой целью сделано?


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

>Тем более, она еще и не связана внешним ключом с users — почему?


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

>Также, странная страница /site/index, чем она отличается от главной? Если ничем то зачем она нужна?


Это и есть главная страница, просто я urlManager не до конца настроил, потому site/index не убиралась из url при переходе по ссылке.

>Я тут еще подумал, а в чем смысл в раздельном логине для студентов и преподавателей?


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

>Такие вещи обычно по крону делаются.


Да, знаю. А так совсем не годится или для мелких проектов сгодится?

>Вот это место немного странное. Почему поле называется teacher_id, а хранится в нем отнюдь не id? Тут нет ошибки?


Угу, исправлю.

>Нет ли тут риска, что можно передать любое значение type?


Хм, надо подумать.

>Ты что по поводу написания тестов думаешь?


Думаю, что идея хорошая, но не знаю как по времени у меня получится. Инструкция в любом случае не помешает.
!xnn2uE3AU. #581 #377561
>>377207

try ... catch — это абсолютно неправильно. Ты не должен ловить свои же исключения. Ловить их будет, если захочет тот, кто пользуется твоим классом. А то, что твой класс сам что-то без просьбы может в консоль вывести — это очень плохо (не говоря о том, что в некоторых браузерах с выключенным отладчиком console.log вообще не существует). try/catch необходимо убрать. Плюс, выводя сообщение ты теряешь стектрейс.

> function BadValueError(message) {


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

[02:48:13.737] uncaught exception: [object Object]

Какая ценная информация!

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

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

throw new Error("lalala");

Хотя правила JS позволяют и просто написать throw "lalala";

Унаследовать исключение от Error не получится, так как вызов Error.call(this, ...) не вызвовет конструктор на текущем объекте, а создаст новый объект исключения. Так как в JS Error(x) делает new Error(x).

Вот примеры вопросов на SO:

http://stackoverflow.com/questions/464359/custom-exceptions-in-javascript
http://stackoverflow.com/questions/8802845/inheriting-from-the-error-object-where-is-the-message-property
http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript
!xnn2uE3AU. #581 #377561
>>377207

try ... catch — это абсолютно неправильно. Ты не должен ловить свои же исключения. Ловить их будет, если захочет тот, кто пользуется твоим классом. А то, что твой класс сам что-то без просьбы может в консоль вывести — это очень плохо (не говоря о том, что в некоторых браузерах с выключенным отладчиком console.log вообще не существует). try/catch необходимо убрать. Плюс, выводя сообщение ты теряешь стектрейс.

> function BadValueError(message) {


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

[02:48:13.737] uncaught exception: [object Object]

Какая ценная информация!

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

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

throw new Error("lalala");

Хотя правила JS позволяют и просто написать throw "lalala";

Унаследовать исключение от Error не получится, так как вызов Error.call(this, ...) не вызвовет конструктор на текущем объекте, а создаст новый объект исключения. Так как в JS Error(x) делает new Error(x).

Вот примеры вопросов на SO:

http://stackoverflow.com/questions/464359/custom-exceptions-in-javascript
http://stackoverflow.com/questions/8802845/inheriting-from-the-error-object-where-is-the-message-property
http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript
!xnn2uE3AU. #582 #377564
>>377207

Далее. Что это за функции, которые болтаются сами по себе? checkSize, checkFilling — их надо сделать методами.

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

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

>>377276

> function SolarPanel(isDay) {


«день ли сейчас» — это НЕ своство солнечной панели. Это текущее время суток, которое сущестсвует само по себе независимо от панелей.

Логично просто передавать переменную isDay в функцию расчет баланса.

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

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

И я не помню. ты задания по ООП на PHP делал? Там как раз изучается какие должны быть своцства и методы у объектов.

>>377429

Неплохо в общем, но вот это нехорошо:

> $random = mt_rand(0, 3);


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

> Notice: Undefined variable: word9 in /t.php on line 22


Опечатался где-то в 22-й строке — надо исправить

Палиндром

> if ($char != ' ') {


> $textWithoutSpaces .= $char;


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

А так, в остальном все верно.
!xnn2uE3AU. #582 #377564
>>377207

Далее. Что это за функции, которые болтаются сами по себе? checkSize, checkFilling — их надо сделать методами.

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

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

>>377276

> function SolarPanel(isDay) {


«день ли сейчас» — это НЕ своство солнечной панели. Это текущее время суток, которое сущестсвует само по себе независимо от панелей.

Логично просто передавать переменную isDay в функцию расчет баланса.

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

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

И я не помню. ты задания по ООП на PHP делал? Там как раз изучается какие должны быть своцства и методы у объектов.

>>377429

Неплохо в общем, но вот это нехорошо:

> $random = mt_rand(0, 3);


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

> Notice: Undefined variable: word9 in /t.php on line 22


Опечатался где-то в 22-й строке — надо исправить

Палиндром

> if ($char != ' ') {


> $textWithoutSpaces .= $char;


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

А так, в остальном все верно.
!xnn2uE3AU. #583 #377565
>>377470

Ой-ой-ой, как все страшно.

Проверку где много !== можно и нужно заменить поиском в словаре:

var a = { x: true, y: true, z: true };
var b = 'x';
if (!(b in a)) { ... }

Копипасту Object.prototype.toString.call(type) — надо ликвидировать. Хватит и одного вызова.

Ну и посмотри, может можно ифы переставить чтобы они были не вложенными? Ну например:

if (x === null) {
return 'null';
}

....

>>377507

> var newArray = object.slice((0));


> return newArray;


Пиши сразу return object.slice....

А вообще, slice для копирования — хорошая идея, другой анон, прими на заметку.

> for (var key in object) {


> newObj[key] = shadowCopy(object[key]);


Это глубокое копирование получается. Негулбокое это когда тут = стоит (slice делает неглубокое кстати).

> (Object.prototype.toString.call(type) === '[object Arguments]'


Э не, ты все array-like объекты не перечислишь. Надо проверять что есть свойство length, оно неотрицательно и есть свойства 0 ... length - 1.
!xnn2uE3AU. #583 #377565
>>377470

Ой-ой-ой, как все страшно.

Проверку где много !== можно и нужно заменить поиском в словаре:

var a = { x: true, y: true, z: true };
var b = 'x';
if (!(b in a)) { ... }

Копипасту Object.prototype.toString.call(type) — надо ликвидировать. Хватит и одного вызова.

Ну и посмотри, может можно ифы переставить чтобы они были не вложенными? Ну например:

if (x === null) {
return 'null';
}

....

>>377507

> var newArray = object.slice((0));


> return newArray;


Пиши сразу return object.slice....

А вообще, slice для копирования — хорошая идея, другой анон, прими на заметку.

> for (var key in object) {


> newObj[key] = shadowCopy(object[key]);


Это глубокое копирование получается. Негулбокое это когда тут = стоит (slice делает неглубокое кстати).

> (Object.prototype.toString.call(type) === '[object Arguments]'


Э не, ты все array-like объекты не перечислишь. Надо проверять что есть свойство length, оно неотрицательно и есть свойства 0 ... length - 1.
!xnn2uE3AU. #584 #377568
>>377544

> function hasClass(node, klass) {


>if (node.getAttribute('class') == klass) {


Используй node.className вместо getAttribute. Также, это не сработает когда имеется тег

<div class="a b c">

имеющий несколько классов.

> node.className += ' ' + klass;


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

>>377545

Нет, не надо, просто в className записать пустую строку.

>>377559

> Создаешь админа в базе, переходишь по экшену admin/login и логинишься, вроде нет там подводных камней.


Я создал обычного юзера-студента, поставил ему тип admin, залогинился (через /admin/login), но при попытке зайти на /student/admin выдает 403.

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


Ок, хорошо тогда

> Скорее всего, oath и капча прописаны под


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

> Да, я хотел это в класс вынести, потом передумал,


Зря

> подумал удобней будет в отдельной таблице хранить эти данные.


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

> Я же просто сделал столбец user_id и через нее связываю ключи с юзером.


Связь — это FOREIGN KEY. А без этого — это костыли на изоленте.

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


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

> А так совсем не годится или для мелких проектов сгодится?


Для dev-версии сгодится, для боевой крон настроить — дело 2 минут, надо только CLI-команду сделать, все нужное в Yii для этого есть: http://www.yiiframework.com/doc/guide/1.1/ru/topics.console. Сделай-ка, кстати.
!xnn2uE3AU. #584 #377568
>>377544

> function hasClass(node, klass) {


>if (node.getAttribute('class') == klass) {


Используй node.className вместо getAttribute. Также, это не сработает когда имеется тег

<div class="a b c">

имеющий несколько классов.

> node.className += ' ' + klass;


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

>>377545

Нет, не надо, просто в className записать пустую строку.

>>377559

> Создаешь админа в базе, переходишь по экшену admin/login и логинишься, вроде нет там подводных камней.


Я создал обычного юзера-студента, поставил ему тип admin, залогинился (через /admin/login), но при попытке зайти на /student/admin выдает 403.

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


Ок, хорошо тогда

> Скорее всего, oath и капча прописаны под


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

> Да, я хотел это в класс вынести, потом передумал,


Зря

> подумал удобней будет в отдельной таблице хранить эти данные.


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

> Я же просто сделал столбец user_id и через нее связываю ключи с юзером.


Связь — это FOREIGN KEY. А без этого — это костыли на изоленте.

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


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

> А так совсем не годится или для мелких проектов сгодится?


Для dev-версии сгодится, для боевой крон настроить — дело 2 минут, надо только CLI-команду сделать, все нужное в Yii для этого есть: http://www.yiiframework.com/doc/guide/1.1/ru/topics.console. Сделай-ка, кстати.
!xnn2uE3AU. #585 #377569
>>377559

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

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

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

Тесты конечно тоже имеют недостатки — их надо писать, зачастую объем соспоставим с основным кодом, если они неудачно написаны, то придется их переписывать при изменениях в коде, так что это отдельная наука.
!xnn2uE3AU. #586 #377572
Прошу всех к нашему шалашу в новый тред >>377570
#587 #377588
>>377564
На php делал все задания по ООП, на мышах застрял, ну и я пообещал себе сделать позже, т.к. js для работы нужен.
#588 #377599
>>377557

>искать надо не в check, а в накопленном к данному моменту пути, то есть видимо path.


Ну так check это и есть массив накопленного пути, а в path у нас записаны все точки.
#589 #377623
>>377564
Спасибо ОП!
Ты меня вдохновляешь, поправил с учетом твоих замечаний свои задачки про строки.
Перекатываюсь в новый тред.

http://codepad.org/wI2nuCDT- про стихи
http://ideone.com/IhBSXJ - про палиндром
!xnn2uE3AU. #590 #377641
>>377599

Я имел в виду надо искать в $pathDone.

> Ну так check это и есть массив накопленного пути, а в path у нас записаны все точки.


Нет. check сожержит только проверенные на текущем шаге точки-соседи (и проверять по нему нет смысла так как они и так не повторяются). А надо проверять по всем точкам, которые есть в текущем пути то есть pathDone.

То есть если мы допустим прошли путь A - B - C — D и стоим в D (и проверяем соседние с ней точки) то мы не должны пытаться идти в A, B или С (иначе мы будем ходить кругами). У тебя такой проверки нет.

Путь кстати у тебя тоже не собирается. По идее в $pathDone должен передаваться массив пройденных точек, а у тебя ничего подобного не передается. Вместо него передается только элемент $paths[$point][$key1].

> $result['path'] =array($pathDone, $paths[$point][$target]);


Это тоже скорее всего неправльный код. У тебя путь получается — это массив ровно из 2 элементов. Хотя точек в пути может быть больше.

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

>>377623

Что-то ты слоупочно перекатываешься как-то, пиши уже в новый тред.

> " " . "$word2[$random]"


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

> про палиндром


Все праивльно.
!xnn2uE3AU. #590 #377641
>>377599

Я имел в виду надо искать в $pathDone.

> Ну так check это и есть массив накопленного пути, а в path у нас записаны все точки.


Нет. check сожержит только проверенные на текущем шаге точки-соседи (и проверять по нему нет смысла так как они и так не повторяются). А надо проверять по всем точкам, которые есть в текущем пути то есть pathDone.

То есть если мы допустим прошли путь A - B - C — D и стоим в D (и проверяем соседние с ней точки) то мы не должны пытаться идти в A, B или С (иначе мы будем ходить кругами). У тебя такой проверки нет.

Путь кстати у тебя тоже не собирается. По идее в $pathDone должен передаваться массив пройденных точек, а у тебя ничего подобного не передается. Вместо него передается только элемент $paths[$point][$key1].

> $result['path'] =array($pathDone, $paths[$point][$target]);


Это тоже скорее всего неправльный код. У тебя путь получается — это массив ровно из 2 элементов. Хотя точек в пути может быть больше.

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

>>377623

Что-то ты слоупочно перекатываешься как-то, пиши уже в новый тред.

> " " . "$word2[$random]"


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

> про палиндром


Все праивльно.
!OP #591 #382466
BUMP
#592 #383978
http://ideone.com/nK2Ys3
Задачка про айфон, совсем я ещё зелёный, потому получилась только с костылями. Но почему у меня и у анона (http://codepad.org/EwrDcjCS) получился разный $paymentTotal? Где ошибка?
Тред утонул или удален.
Это копия, сохраненная 6 сентября 2014 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски