Это копия, сохраненная 6 сентября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>369682
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Начинающим: Никсон Р. - Создаем динамические веб-сайты с помощью PHP (аноны говорят, она не очень хорошая)
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне.
В общем, давайте начинать уже!
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт 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/
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт 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/
ОП, зацени задачу на цифры прописью. Я ожидал что она займет у меня пару дней, но вроде справился довольно быстро.
Пока что особо не смотрел, но сразу отмечу:
/* Вызовем функцию несколько раз */
$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";
Будь ты проклят, блядь.
Я этот код не менял вообще, кроме переменной amount1, всё это было в первоначальном коде.
1) связь many to many то есть, например, категория "Работа" может быть у многих юзеров. У юзера может быть несколько категорий задач.
2) Каждая категория в таблице категорий привязана к конкретному юзеру т.е. связь юзер - категория 1 - много.
Какой вариант лучше?
why?
Прочитай "Проверка на соответствие шаблону и выделение частей", это прямо над текстом задачи.
Сделал, но теперь, если в тексте больше чем одна ошибка, код выдаёт только одну
preg_match_all
я кстати так и не разобрался в чем там у тебя была ошибка, хотя сам давно сделал эту задачу. Весьма странно
Спасибо. То что получается куча пустых элементов в массиве нормально или их нужно убрать ?
Все скобки убери, кроме первой и последней. Ну или можешь не убирать, хотя лучше наверное убрать, очень уж огромный массив.
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).
Внутри функции выполняется console.log(this.x), а потом ты еще раз запускаешь console.log(testThis());
Два console.log
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
>пропущенные аргументы обозначаются с помощью undefined
Вроди так и нужно? Или нет? Ты ОП?
хуёп
В пятой задаче пропущенные с конца аргументы не обозначаются как undefined. Ну я и в шестой задаче так и оставил, а если пропущены аргументы в середине, то соответственно undefined.
неОП
Нормально. По коду ОП посмотрит.
CURL возвращает checking your browser, а дальше как попасть?
if ($creditBalance < 5000) {
$monthlyPayment = $creditBalance;
}
Вот это дописал, но там постоянно тысяча лишняя.
там на сколько я помню сначала прибавляются проценты, потом вычитается выплата, следовательно проверку надо делать после надбавки процентов.
При выводе постов регулярным выражением собирать ответы в массив, а затем использовать функцию array_unique()?
И вообще. Разметку накладывать на вводе в БД или на выводе?
$select = mysql_query("SELECT title FROM albums WHERE user_id=".$_SESSION['id']);
$nv = "albumname";
if($nv==$select){
do_action();
}
Есть простой способ осуществить это? Мне нужно сравнить $nv с данными, полученными из $select, как это осуществить быстро и без смс?
Я нихуя не понял.жпг
Тебе что ли надо выбрать данные по имени альбума?
Ну так и юзай что-то типа "SELECT * FROM albums WHERE user_id=".$_SESSION['id']." and title=".$nv
$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("запрос который я еще не придумал");
}
Суть проблемы в том, что я хочу получить картинки из одного конкретного альбома, в который я захожу, переходя по одной из ссылок в списке альбомов.
Надеюсь, я понятно объясняю
Во-первых, title - это unique или нет?
Во-вторых, сравнивать тебе надо не с $select, а как-то так:
$r = mysql_query("SELECT title FROM albums WHERE user_id=".$_SESSION['id']);
$row = mysql_fetch_assoc($r);
if($row['title'] === "huita") ....
аноны я задам тупой вопрос, но без этого никак
Вот скажите как вы запоминаете столько символов?
Как вы запоминаете где и как их ставить?
Ну например где какую скобочку ставить где нет, где перед словом ставить апостроф где нет, где применять равно, нижний пробел, где просто слово написать
Хоть убей я не могу понять как вы это помните, это же нереально знать. Вы что гении?
сублимайн подсказывает
Сколько слов, кодов, символов нужно выучить, чтобы писать на пхп?
Можно ли на пхп написать оконную программу?
Можно ли написать программу, которая на сайте делает дополнительное окошко с тема вариантами, каждый из которых делает определённое действие?
Если я средний человек, то долго ли нужно учить пхп, чтоб хоть 100долларов в месяц нафрилансить?
Это весьма относительное понятие, ты можешь выучить, к примеру, синтаксис команды 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
>
>Вот как-то так. Тебе этого минимум на полгода хватит.
>>373667
Есть различные компиляторы (http://php-compiler.net/, например), но зачем? Лучше уж тот же C# использовать.
ОП, можно ли данную конструкцию запихнуть в switch лаконичности ради?
http://ideone.com/w4eGOB
Интуиция говорит - да, можно. Но ума не хватает, чтобы сообразить как это сделать. А если нельзя, то как сократить так чтобы быстрее выполнялось? А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.
Если что-то не указано - будет дырка. Обязательные поля - улица и дом, остальное может быть пропущено.
Атъебись. Твой код - говно, а ты мудак, потому что нихуя не понимаешь, но лезешь. Интерполировать блять ему.
а ты знаешь что у тебя будет если скрипт не найдёт какой-нибудь ключ?
Круто! Спасибо. Пойду осиливать такой способ.
№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 пару глав об объектах прочитал.
Больше года уже
>>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, "рубль", "рубля", "рублей");
Вместо этой длинной строки удобнее добавлять слова по частям:
если (в слове есть миллионы) {
добавить число миллионов;
}
Также, можно добавлять слова не в строку, а в массив, а в конце склеивать в строку.
Больше года уже
>>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, "рубль", "рубля", "рублей");
Вместо этой длинной строки удобнее добавлять слова по частям:
если (в слове есть миллионы) {
добавить число миллионов;
}
Также, можно добавлять слова не в строку, а в массив, а в конце склеивать в строку.
Там можно вместо rand свои значения вписать. Ты бы подумал головой прежде чем на желчь исходить.
>>373464
> А как быть с отношением категория - юзер?
Оно не нужно. зачем?
>>373501
> как в сообщение об ошибке вывести именно слово в котором ошибка, а не всю фразу
preg_match_all заполняет массив $matches найденными фразами, надо в нем разобраться и выводить строки из него. как именно заполняется массив, написано в мануале: http://php.net/manual/ru/function.preg-match-all.php
> \\[а-я]
Что это \\[ экранирует скобку и лишает ее специального значения. Вместо этого она теперь значит «ищи квадратную скобку в тексте».
> зделал|зделаю|зделан
Это можно сгруппировать вместе, посмотри урок, там вроде был пример про кошек и собак, также у тебя не учтены другие формы вроде «зделать, зделаем».
> [а-я][А-Я]
Почему ты хочешь чтобы сначала шли маленькие буквы, а за ними большие? Если ты хотел написать «любые буквы» то надо писать [а-яА-Я] или добавить в конце регулярки флаг i (игнорировать регистр символов)
> [а-я][А-Я]
Это постоянно повторяется — подумай, как вынести отдельно, чтобы повторов не было
Там можно вместо rand свои значения вписать. Ты бы подумал головой прежде чем на желчь исходить.
>>373464
> А как быть с отношением категория - юзер?
Оно не нужно. зачем?
>>373501
> как в сообщение об ошибке вывести именно слово в котором ошибка, а не всю фразу
preg_match_all заполняет массив $matches найденными фразами, надо в нем разобраться и выводить строки из него. как именно заполняется массив, написано в мануале: http://php.net/manual/ru/function.preg-match-all.php
> \\[а-я]
Что это \\[ экранирует скобку и лишает ее специального значения. Вместо этого она теперь значит «ищи квадратную скобку в тексте».
> зделал|зделаю|зделан
Это можно сгруппировать вместе, посмотри урок, там вроде был пример про кошек и собак, также у тебя не учтены другие формы вроде «зделать, зделаем».
> [а-я][А-Я]
Почему ты хочешь чтобы сначала шли маленькие буквы, а за ними большие? Если ты хотел написать «любые буквы» то надо писать [а-яА-Я] или добавить в конце регулярки флаг i (игнорировать регистр символов)
> [а-я][А-Я]
Это постоянно повторяется — подумай, как вынести отдельно, чтобы повторов не было
Зависит от компании, это может значить умение:
— пользоваться этими ЦМС и жать мышкой в админке
— делать под эти 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
Зависит от компании, это может значить умение:
— пользоваться этими ЦМС и жать мышкой в админке
— делать под эти 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
Пропущенные обозначаются через 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 не передаются аргументы.
Пропущенные обозначаются через 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 не передаются аргументы.
Это защита 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
Это защита 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
Ты делаешь все неправильно. Какой смысл 2 раза выбирать одни и те же данные? Можно сохранить то, что тебе надо, в массив.
Алсо, нет никакого смысла выбирать все альбомы чтобы найти один, когда можно просто указать название в WHERE name = ...
Алсо, эта проверка не имеет никакого смысла:
> ($_GET['album_name']==$select)
$select это не строка, а ресурс (условный идентификатор или число), который указывает на определенный запрос. Его нет смысла с чем-то сравнивать. Его можно только передать в функцию вроде mysql_fetch_array. Ты должен сначала выбрать строку через mysql_fetch... и то, что получишь уже сравнивать.
> что я хочу получить картинки из одного конкретного альбома,
SELECT * FROM images WHERE album_id = ?
Алсо, какой смысл передавать название альбома когда удобнее работать с его id?
>>373640
Не подставляйте переменные в запрос, используйте плейсхолдеры, сколько раз вам объяснять. Это быдлокодский быдлокод, так писать.
>>373661
У меня в учебнике все изучается постепенно, по одной скобочке за раз + на каждую скобочку есть задача. Когда ты пишешь код, то постепенно запоминаешь. Это же все не за один день изучается, а постепенно.
Начинай проходить мой учебник, пости сюда решения задач — и ты тоже научишься со временем.
>Больше года уже
Добра, ОП.
> Сколько слов, кодов, символов нужно выучить, чтобы писать на пхп?
От полгода до года
> Можно ли на пхп написать оконную программу?
По идее можно, но очень неудобно, он не для этого. Оконные программы пишутся на C#/C++/Java (простите меня пользователи его будущей проограммы)/Python + Qt (и вы тоже простите).
Но если «окошко» ты имеешь в виду не то, что на рабочем столе, а то что на сайте, то можно конечно.
> Можно ли написать программу, которая на сайте делает дополнительное окошко с тема вариантами,
Конечно. Но это надо не только PHP, а PHP + HTML + JS + CSS
> Если я средний человек, то долго ли нужно учить пхп, чтоб хоть 100долларов в месяц нафрилансить?
Полгода-год. Но это надо не только PHP, а PHP + HTML + JS + CSS + SQL так что скорее год.
>>373667
Он видимо имел в виду окошко на сайте.
Опять говно всплыло. Есть же хаскель и прочие радости жизни, зачем вы учите эту парашу?
Нет. Разве что как-то массив с шаблонами фраз прикрутить и по нему циклом пройтись.
> А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.
Не вижу тут обращения к БД и не понимаю что ты хочешь сделать. Чтобы не делать много запросов, может можно как-то все данные выбрать сразу одним запросом?
>>373682
Вон отсюда, убогий
>>373684
> PHP Notice: Undefined variable: result
Это бы еще исправить.
>foreach(array_keys($address) as $key)
foreach ($prefixes as $key => $prefix) по моему будет проще
Нет. Разве что как-то массив с шаблонами фраз прикрутить и по нему циклом пройтись.
> А то тягаться это будет из бд по 10-100 раз за один запрос. Вот.
Не вижу тут обращения к БД и не понимаю что ты хочешь сделать. Чтобы не делать много запросов, может можно как-то все данные выбрать сразу одним запросом?
>>373682
Вон отсюда, убогий
>>373684
> PHP Notice: Undefined variable: result
Это бы еще исправить.
>foreach(array_keys($address) as $key)
foreach ($prefixes as $key => $prefix) по моему будет проще
Ну так возвращайся в свой уютный гадюшник и радуйся жизни, что ты тут забыл?
>>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
Ну так возвращайся в свой уютный гадюшник и радуйся жизни, что ты тут забыл?
>>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
> №8
То же самое, исплоьзу push, а то будут дырки в массиве
> 9
> if ( func(input) ) { res.push(input) };
Не надо экономить место на переносах строк. А так, сделано верно.
> №11
> if (x[1] > y[1]) {
Лучше наверно исплоьзовать ключи с названием, вроде x.population, будет гораздо читабельнее.
Программа просто выводит первые несколько записей из списка, не проверяя население города.
Вместо prompt наверно лучше просто переменную в код вписать, а то замучаешься вводить числа.
> С объектами вообще не представляю что делать. Хотя в твоем учебнике я вроде бы делал пару заданий. И в js пару глав об объектах прочитал.
Про прототипы читал? Про ООП тут: http://javascript.ru/tutorial/Object читал?
Он пока не сделан. Если ты прошел учебник, то попроси дополнгительные задачки. Вон у нас их сколько разных есть: https://gist.github.com/codedokode/
Есть небольшой опыт на пыхе, думал даже в свое время угореть по yii, но как-то не взлетело.
Сейчас стоит задача переписать одну вьюшечку(не знаю, как это по-другому назвать) MVC-пыха-приложения, так чтобы бы она стала МАКСИМУМ интерактивной.
Реквестирую какие-нибудь javascript UI фреймворки с низким порогом вхождения для создания подобия одностраничного приложения и легкой интеграцией с пыхой.
Из того что нашел в этих ваших интерентах: http://webix.com/ http://www.jqwidgets.com/ http://qooxdoo.org/ Но я не могу оценить их сложность в освоении. Хотя webix пока что выглядит самым няшным.
Со строками, мне кажется, гораздо читабельней.
Более простого я придумать не смог.
http://ideone.com/gshZBC
Парси с мобильной версии двача
Давай уже закончим задачи на ООП, потому что я уже про DOM прочитал. В принципе после TinyDOM читается на одном дыхании. Но боюсь, что долго в памяти не удержу без практики.
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
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
Когда происходит обращение к несуществущему классу, например:
$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 — там же есть и пример кода
Когда происходит обращение к несуществущему классу, например:
$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 — там же есть и пример кода
>Что это за волшебные строки? Тут должны быть константы.
Да, только если писать так new Hamburger(TYPE_SMALL, FILLING_CHEESE), то выводит ошибку.
>У тебя константа неедоступна до первого вызова функции. Как ее передать в функцию, если ее, константы, изначально нету?
Сделать функцию по типу (function() {})() ?
>Опять же, тут какие-то волшебные строки, а должны быть константы.
Опять же ошибки выдает TYPE_SMALL: 50,..
>доделал TinyDOM
Не доделал. Очень мало времени стало. Только вечером успеваю порешать задачи. Мы же решили пока на js остановиться.
Не знаю, ОП, может ты не заметил, а может у тебя много работы, на всякий случай бамп.
>Ну так в самом начале она равна нулю. А потом увеличивается на один командой 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. Надо переделать как-то?
/* Делает первую букву в строке заглавной */
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
$user = new User();
$user->personal_no = 1234;
$user->login = 'somelogin';
$user->email = 'email@example.com';
$user->save();
Это же должно быть в контроллере?
Просто обычно у меня в нем получается еще куча условий, всякие $_GET и $_POST и выходит многобукаф. А я читал, что контроллеры не должны быть толстыми. Или это еще не толстые?
Я не могу, я установил по руководству пхп, нажал старт денвер. Зашел в папку с пхп, вбил туда простую команду, открыл этот файл в фаерфоксе, а оно не работает. Я настолько безрукая бездарность. что даже пхп не могу запустить. Сижу и плачу.
>открыл этот файл в фаерфоксе
Прям взял и открыл файл? Нажал на кнопку "открыть с помощью"? Тогда не мудрено, что он не работает.
а ну да, заработало. но я все равно уже поплакал и пришел к выводу, что бездарность.
Жизнь-боль
Потому что мы уже сразу имеем доступ к вложенной функции, проходя мимо currentCount = 0;
Всё, разобрался.
http://ideone.com/46VDb3 думал калькулятор займет у меня гораздо больше времени чем любое другое задание, но пока самым сложным остаётся задачка на грамматику.
Как я понимаю, придется переписывать? Как сделать работающий не кривой вариант? Сейчас лезет в голову идея через if'ы, которая ни к чему хорошему не приведет. Собственно, если есть гет, то вывод (но, блядь, вывод чего? контроллера? какого? или создать файл с отдельным классом где будут правила?)
Алсо, почему задаю вопрос -- не знаю как гуглить. Нагуглил какую-то вариацию, где обрабатывались элементы массива и я нихуя не понял.
И да, извините, если я совсем дубовый.
нет. я мирно учу пхп у вас тут.
Символично, что прыщеблядки пресытившись срачами между собой теперь засирают этот раздел на свой убогий манер.
var_dump($posts);
$posts[0]['content'] = $posts[0]['content'];
var_dump($posts);
Результат:
array(0) { }
array(1) { [0]=> array(1) { ["content"]=> NULL } }
как такое может быть?
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 купюра из всех, и фиг знает что с этим делать.
Вот еще ответы по 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. Какое слово то страшное, а оказывается это аналоги управляющих символов. Нужны для ситуаций когда как текст нужно отобразить какой то спецсимвол используем для разметки, начинается всегда с амперсанда &. & - &, < - <, > - > и т.д.
9. Любое количество пробелов и переносов строки в браузере станет одним пробелом. Для переноса строк надо использовать <br>. Пробелы же вставить с помощью html сущности   либо использовать тег <pre> который сохранит и переносы и пробелы
if ($a > 0 && $b < 10) {}
(У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно http://jsfiddle.net/W3ZAj/)
if ($a > 0 && $b < 10) {}
Вроде так. Не припоминаю для каких целей используются {}()$ символы в html. Вроде можно их просто так писать?
10. <a title="'"<test>"'">
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 & 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 ее не проходит) Связано это с тем что для того что бы страница выглядила так как хочет верстальщик в разных браузерах приходится использовать всякие хаки и костыли.
Вот еще ответы по 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. Какое слово то страшное, а оказывается это аналоги управляющих символов. Нужны для ситуаций когда как текст нужно отобразить какой то спецсимвол используем для разметки, начинается всегда с амперсанда &. & - &, < - <, > - > и т.д.
9. Любое количество пробелов и переносов строки в браузере станет одним пробелом. Для переноса строк надо использовать <br>. Пробелы же вставить с помощью html сущности   либо использовать тег <pre> который сохранит и переносы и пробелы
if ($a > 0 && $b < 10) {}
(У меня почему то и на локальном веб сервере и на jsfiddle все и так отображается корректно http://jsfiddle.net/W3ZAj/)
if ($a > 0 && $b < 10) {}
Вроде так. Не припоминаю для каких целей используются {}()$ символы в html. Вроде можно их просто так писать?
10. <a title="'"<test>"'">
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 & 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 ее не проходит) Связано это с тем что для того что бы страница выглядила так как хочет верстальщик в разных браузерах приходится использовать всякие хаки и костыли.
>мне почти 30, так что джуниором
Лол, я всегда думал что джуниор это твой опыт работы а не возраст.
Не подскажите, как вызвать эту функцию? Надо создавать отдельный класс или можно вызвать из другого пхп файла?
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;
}
основных составляющих и общих принципов их взаимодействия"
Что вы можете посоветовать? Пока из идей есть только мысль сделать два класса: пассажир и лифт.
>иерархию классов пассажирского лифта
Проиграл. Класс "Кабина" с вложеными класами "двери" и "панель с кнопочками" . В "панели с кнопочками" куча вложеных классов "кнопочка" и "динамик". Класс "подъемный механизм", в который также вложены куча "панелек" с "кнопочками" (на каждом этаже).
Да я сам на хую вертел в такой задаче ООП применять, но тестовое есть тестовое.
На пике задание, но если лень читать, то я сам могу объяснить. Пишем код:
<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 и в новых версиях что-то поменялось?
Это из-за того, что книжка старая, да?
Перед этим задание тоже похожее было, но там с формой. Я тоже с $_POST['name'] решил, но без {}.
Спасибо.
я не знаю, я третью неделю пых учу, знаю что это делается через супервариаблы. А как работал пых раньше я не знаю
Если коротко, то да, я ебанутый. Я не знал, что они сильно отличаются. Пойду искать что-нибудь поновее.
Я уже пхп неплохо знаю, и чувствую острую потребность в изучении джэйэй.
А что значит «включить сервер через воркбенч»? Ты не можешь его так включить, только подсоединиться к уже запущенному. А сервер по моему запускается через
Насчет пользователей — там вроде может быть несколько пользователей с одним именем и разными паролями. Разберись, сделай например 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() {})() ?
Конечно нет.
> Не доделал. Очень мало времени стало.
Ну тогда, конечно, ничего не поделать, потом как-нибудь доделаешь может быть.
переустановил без гуи, все нормально заработало. Тогда реально хрень какая-то была. Под мои пользователем не заходил, анонимно только. В любом случае, уже все норм.
>function Hamburger(....) {.....}
>Hamburger.CONSTANT = 'value';
http://jsbin.com/buzade/2/edit?js,console
Ничего же не изменится, если вынести создание констант вне функции. Просто мысль не могу уловить, что не так.
>>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
>>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
Проще код получается. Алсо, если ты выводишь 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 родительской функции и она видит переменные, хранящиеся в нем.
Проще код получается. Алсо, если ты выводишь 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 родительской функции и она видит переменные, хранящиеся в нем.
В учебнике 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 запроса.
Потом можно будет, если есть желание, добавить другие фичи:
- постинг картинок и файлов-приложений
- быстрый ответ
- древовидные ответы
- разметка
- модераторские функции
- автообновление треда
В учебнике 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 запроса.
Потом можно будет, если есть желание, добавить другие фичи:
- постинг картинок и файлов-приложений
- быстрый ответ
- древовидные ответы
- разметка
- модераторские функции
- автообновление треда
> 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();
...
}
> 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();
...
}
То же самое, не надо пробелы удалять в нескольких местах кода.
> 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 {
А так, сама логика верная.
То же самое, не надо пробелы удалять в нескольких местах кода.
> 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 {
А так, сама логика верная.
От чего ты защищается? Используй 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, ради большей скорости.
в чем вообще смысл использования пост в ссылке может быть. Это перестанет быть пост-запросом. Гет используй.
Красноречивый, я хотел сказать что пост специально нужен чтобы предотвратить его использование в ссылках.
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.
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.
> А что тут не так? 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. Или куда он вообще ошивки выводит?
Я хотел сделать ссылку, что-то вроде "удалить", а гет же обычно только для чтения советуют использовать.
> 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] а не один из элементов в нем. Иначе у тебя эти массивы с остатками перемешиваются.
> 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] а не один из элементов в нем. Иначе у тебя эти массивы с остатками перемешиваются.
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.
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.
Полгода, скорее даже год, так как еще надо верстка (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()
Полгода, скорее даже год, так как еще надо верстка (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()
Ссылка — это то, куда можно кликнуть и перейти на другую страницу. Тебе нужна не ссылка, а кнопка и яваскрипт на ней который и будет слать запрос:
<button type="button" onclick="..."></button>
Еще есть вариант сделать форму + кнопку, но по моему яваскриптом проще.
>>374381
Всегда ошибки идут в лог.
А на экран только если display_errors = On
Не забудь перезапустить Апач.
Также, если error_reporting не равно E_ALL то часть ошибок может скрываться (потому поставь просто E_ALL или -1).
>>374387
Ты что-то делаешь не так. Этот массив всегда заполнен. Покажи код и что ты в браузеер открываешь.
<?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
Ошибки на экран не вылезают все-равно. Пустой бланк просто. Апаче перезапускал, и через службы и через монитор.
да, если скопировать путь и открыть в адресной строке, то хедер и футер открываются, т.е. пути верные.
> Ошибки на экран не вылезают все-равно. Пустой бланк просто.
# значит комментарий вообще то. У тебя код закомментирован.
Что за наркоманство с SERVER_NAME? Пиши просто
require_once _ _ DIR _ _ .'/lalala/lololo.php';
комментарии ставил чтобы код запускался, забыл убрать. Я же говорю пишу localhost вместо переменной - все-равно. Абсолютный адрес, т.к. например, код может быть вызван с разных мест. Require же поддерживает абсолютные ссылки, в мануале написано. так вот у меня нихера не пашет.
и еще: вроде же абсолютный путь, начинающийся с / означает с корневой дериктории, т.е. localhost нет?
<?php require_once "../../../kickstart/includes/temps/header.php";
?>
работает, а
<?php require_once "/kickstart/includes/temps/header.php";
?>
нет.
Выше папки kickstart у меня ничего нет, localhost там.
как тогда сделать релативную ссылку от корня сайта? Это самый лучший вариант. Хотя почему не работают абсолютные ссылки тоже интересно.
Делай ссылку от текущего файла через _ _ DIR _ _ : http://php.net/manual/ru/language.constants.predefined.php
говорю же не от текущего надо. допустим есть подключаемый файл, который может быть вызван с разных мест. Он подключает еще один файл. соответственно ссылка должна быть или относительно корня или обсолютная. Как я нагуглил в пхп / значит самый коренной корень, а $_SERVER['DOCUMENT_ROOT'] дает абсолютную ссылку, которые у меня не работают. почему не работают, не понятно.
собственно DIR возратит абсолютную ссылку, которые я не могу заставить работать. Какого вообще хрена они не работают, когда должны.
Так же, я правильно сделал тут? >>374393
> И я включил:
display_errors = On
error_reporting = -1
он же должен выдавать ошибку вместо пустого бланка в таком случае? Я и тут что-то неправильно сделал.
Я даун в php.ini помимо закомментенных опций были еще и уже указанные с середине кода. Заработало. Хвала аллаху. наконецто не эти сраные белые бланки. Не надо гадать где ты скобочку пропустил.
> Потому что DOCUMENT_ROOT очень ненадежная вещь и не всегда указывает куда надо. Потому ее лучше бы не использовать.
Как-так может, что она не туда покажет? Ей рандом что-ли управляет? Как иначе тогда от корня ссылку делать. Ведь относительно файла делать ссылку это очень негибко. Кстати, а зачем _ _DIR_ _ использовать, когда просто относительная ссылка тот же результат даст?
> Ей рандом что-ли управляет?
Ей управляют особенности настройки веб-сервера. Если например в Апаче использовать 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.
Хотя такая конфигурация не часто встречается, но все же.
Верхняя картинка это результат javascript:alert(document.cookie);
Нижняя - мнение браузера (Опера).
Почему вот эти **__cfduid** и cl_clearance не достаются скриптом?
require_once 'temps/SHABLON.php';
в нем рисуешь хтмл страницу с внедренным пхп, там где переменные. На подобии:
<h2>Post #<?php echo $postId; ?></h2>
<p><?php echo $postContent; ?></p>
Вроде это оп имел ввиду.
> Что это за странный код? Как можно подставлять текст внутрь регулярного выражения?
Это чтобы знаки препинания не потерять, по-другому все превращаются в один.
> Лучше ли будет тогда сделать цикл через все fetch()
Если один хер будешь собирать их в массив и что-то потом с ним делать - лучше fetchAll().
Если будешь сразу выводить - лучше fetch() в цикле.
PHP всё-равно в какой кодировке я храню строки в скрипте, главное на выходе в html поставить какой-нибудь <meta charset>, так?
Т.е. использовать mb_internal_encoding нужно только если я захочу обработать их средствами php?
Ага, пых вываливает текст дословно. Кодировка, емнип, влияет только на mb_* функции.
Кто-нибудь делал по другому?
Как лучше организовать валидацию сообщения? Пока реализована проверка на наличие текста в полях. Сообщение отправляется при условии, что все поля заполнены.
Нужно сделать так, что если человек заполнил только часть полей, то он получит обратно эту же страницу с формой, но с теми данными в полях, что он уже заполнял и сообщением "заполните все поля". Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?
специально сейчас проверил. Надо выбрать match с помощью against по одному кортежу все остальные. Итак, в первом содержание "слово1 слово2", во втором "слово1 слово2" - работает. Во втором "слово2 слово1" - работает. Во втором "слово2 слово3" - работает, во втором "слово3 слово2" - работает. А вот если во втором "слово1" или "слово1 слово3" - не работает. ПОЧЕМУ БЛДЖАД? И как это можно отладить?
Начал решать задачки.
Доброанон, покритикую
Про айфон в кредит - http://codepad.org/EwrDcjCS
Следующая задача из урока по циклам - http://ideone.com/xmMCxC
А разве в задачке про айфон в последнем месяце так высчитывается последняя выплата?
http://jsbin.com/buzade/4/edit?js,console
Ошибки я умею читать, просто пытаюсь сделать по твоим словам:
>Тут тоже надо использовать константы, а не слова
>этот массив надо создавать один раз, например добавив его как свойство Hamburger, а не в конструкторе.
Добавить свойство, создать константу - созвучные вещи? Различие в регистре букв?
Кстати, ОП, начал почитывать вот это:
http://blog.contra.lv/category/joomla/creating-own-mvc-component/page/2/
Правда много устаревшей информации касательно синтаксиса. Но мне думается будет полезно, ведь я работаю с джумлой. А MVC вообще по сути интересная вещь, когда-нибудь надо будет углубиться.
Пока рылся в джумле и гуглил, нашел статью про класс Наблюдатель. Вот тут http://allineed.ru/articles-joomla/j15dev/58-composing-joomla15-plugin.html я вычитал его реализацию на примере с клоуном и зрителями. Только интересно можно ли наблюдателя сделать более гибким, с множеством вариантов выбора и обучением по ходу. И вот я вышел на новый уровень: начал гуглить про перцептрон (нейронная сеть со слоями). И по ходу перцептрон и есть наблюдатель, который обучается и реагирует соответственно на различные изменения объектов. А обучение подразумевает собой дописывание кода? Может какой-нибудь объект одного класса дописывать код для другого класса в соответствии с условиями? А создавать новые php файлы? Можно например написать код, который по запросам пользователя обучится и сам допилит движок cms или хотя бы увеличит функционал готовой?
Отсыпь, пожалуйста.
Снова задачки по 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
http://ideone.com/gLr2QK
Отступы в стиле "я упала с сеновала".
Пробелы по талонам получаешь?
max неправильно юзаешь. Он не самую длинную строку ищет, а самую большую в лексикографическом порядке.
И 28-29 строки как-то странно смотрятся. Я бы сделал примерно так:
$c = mb_substr($text[$b],$i,1);
echo $c ? $c : " ";
http://ideone.com/7XD6mD
У них 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() — обычный.
> 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
А также в книге Зандстры (название в ОП-посте). Попроьуй изучить это самостоятельно, если есть вопросы — задавай.
> 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
А также в книге Зандстры (название в ОП-посте). Попроьуй изучить это самостоятельно, если есть вопросы — задавай.
Код в строках 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 символа или меньше), игнорируется.
Код в строках 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 символа или меньше), игнорируется.
> Она очень похожа на словарь,
Так в яваскрипт и словари и массивы — тоже объекты. А вообще, если я понял твой вопрос то да, полноценный объект «класса» 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 (...) { ... };
> Если что пишу на ноде
Я вызовов функций ноды не вижу тут, так что правильнее сказать что пишешь на яваскрипте.
> Она очень похожа на словарь,
Так в яваскрипт и словари и массивы — тоже объекты. А вообще, если я понял твой вопрос то да, полноценный объект «класса» 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 (...) { ... };
> Если что пишу на ноде
Я вызовов функций ноды не вижу тут, так что правильнее сказать что пишешь на яваскрипте.
>Тут нельзя писать big_burger, надо исплоьзовать константу. Иначе нет никакой логики: почему в одном месте кода используется константа, а в другой простой строка.
В том-то и фищка, что у меня не получилось использовать константу для обозначения ключа словаря. В пыхе ведь нельзя для обозначения св-ва класса использовать переменную или константу. Поэтому и просил про объект.
>Гораздо лучше прочесть про прототипы и добавлять методы в prototype конструктора:
Это как-то непривычно описывать методы класса вне класса.
>> Где лучше хранить вот эти заполненные поля до тех пор пока пользователь их все не заполнит: в кеше, сессии, через параметры или ещё как-нибудь?
>> В массиве или переменной.
Это можно, если сразу после пост запроса отображать предыдущую страницу. Но тогда если пользователь захочет обновить страницу, браузер будет говорить мол, "данные опять через пост передаёшь". Не будет ли человеку неприятно от этого?
> $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 части.
> $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 части.
Оп, еще такой вопрос:
есть абстрактный класс 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(...)?
Про joomla 3 в официальной документации мало чего есть. Установил себе 2.5, чтобы не заморачиваться. Но если честно сложно разобраться в оф. документации. Я хочу понять суть работы движка.
Хотя может мне просто написать с помощью mvc простой сайт визитку по какому-нибудь мануалу для чайников? В дебрях joomla я теряюсь.
По моему там объяснение так себе, усложнено. Суть паттерна 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 или хотя бы увеличит функционал готовой?
Наверно можно в теории, но это очень сложно. Пока никто вроде такого не сделал.
По моему там объяснение так себе, усложнено. Суть паттерна 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 или хотя бы увеличит функционал готовой?
Наверно можно в теории, но это очень сложно. Пока никто вроде такого не сделал.
№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() и обойтись без цикла.
№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() и обойтись без цикла.
Функция, которую передаем. 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 и длины строки.
> у меня не получилось использовать константу для обозначения ключа словаря.
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 (англ) — обрати внимание, здесь приводятся примеры создания классов с помощью библиотек
> у меня не получилось использовать константу для обозначения ключа словаря.
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 (англ) — обрати внимание, здесь приводятся примеры создания классов с помощью библиотек
>Вообще можно, я покажу как, но никогда так не делай:
$obj->$key = 1;
$obj->{'oh you!'} = 1;
$obj->{CONSTANT} = 1;
Вообще ты сделал это для инстанса, а не для класса. В классе сво-во можно объявить переменной, но не константой же http://ideone.com/SWlb9X
> Но тогда если пользователь захочет обновить страницу, браузер будет говорить мол, "данные опять через пост передаёшь". Не будет ли человеку неприятно от этого?
Нет, так как данные действительно опять через 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
Да.
> Но тогда если пользователь захочет обновить страницу, браузер будет говорить мол, "данные опять через пост передаёшь". Не будет ли человеку неприятно от этого?
Нет, так как данные действительно опять через 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
Да.
Изучать код удобно в нормальном редакторе, который умеет по Ctrl + клику на функцию/класс переходить к определению. Это умеют Eclipse PDT, PhpStorm и наверно другие IDE. Sublime Text 3 по F12 тоже умеет, если папку с проектом на левую панель добавить.
Ну и на листочек выписывай все что нужно, а то забудешь.
>Так jimport — обычная функция, не метод объекта.
И правда, плохо код прочитал. Хорошо условились. Но как мы запускаем функцию jimport без include того файла, где есть эта функция?
Жизнь яваскрипт-программиста — боль, что поделать.
Скобки после return не нужны
prices и calories не должны быть болтающимися в пространстве переменными, а свойствами Hamburger (то есть аналогом статических свйоств в других языках программирования).
Думаю, необязательную добавку надо добавлять отдельным методом, а не через конструктор.
Методы надо вынести из конструктора в прототип.
>простоты питона
Это пока. Скоро ты доберешься до декораторов, генераторов, множественного наследования и костылей с приватными методами, тогда по-другому запаешь.
100 => 0
Тогда array_flip выбросит его, так как нулевой элемент в массиве уже есть.
> Нет, так как данные действительно опять через POST передаются. Проблем из-за этого вроде повторной отправки поста не будет, так как форма заполнена с ощибками. Редиректить принято только после успешной отправки формы (чтобы не было двойной отправки поста), а не при ошибках.
Спасибо так и сделаю.
Есть ещё проблема, прочитал на досуге про нормализацию бд и что хорошо прижерживаться трём нормальным формам.
Так вот, у меня есть таблица постов. Скажем, там есть аттрибуты "имя" и "текст". Согласно второй НФ:
> Если данные, содержащиеся в столбце, не имеют отношения к ключу, который описывает строку, то их следует отделять в свою отдельную таблицу. В старую таблицу надо возвращать первичный ключ.
Получается, что если у меня много значений "Аноним" столбца "Имя", то мне столбец "Имя" вынести в отдельную таблицу и хранить только его id в таблице постов? Получится же куча мелких таблиц и будет неудобно манипулировать данными.
Это акроним.
Не делай array_flip
>>374873
> Получается, что если у меня много значений "Аноним" столбца "Имя", то мне столбец "Имя" вынести в отдельную таблицу и хранить только его id в таблице постов? Получится же куча мелких таблиц и будет неудобно манипулировать данными.
Если у тебя есть пользователи (например через регистрацию или как-то еще) то должна быть отдельная таблица, так как пользователь — отдельная сущность. Для анонима можно вписывать NULL вместо id пользователя.
Если же у тебя имя просто вводится в поле, то не надо делать отдельной таблицы, так как «Иван» и «Иван» вполне могут быть на самом деле разными пользователями, или наоборот, один пользователь может ввести разные имена и id не будет иметь никакой связи с реальностью.
Принцип простой: одна сущность — одна таблица.
Алсо, полезная статья про связи в БД: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Action - адрес. action="" кидает на текущую страницу, но думаю лучше явно указать. method="post" указывает совершить пост-запрос по заданному action.
где же я обосрался то. Форма закрыта, action указан. по ссылке в ней или будет еще один переход или ничего не будет. НА еще одном переходе только текст тестовый. А он почему остается на текущей странице, да еще и ей пост-запрос передает по ходу. не пойму. закрыл же обе формы, они никак не пересекаются. В сабмит кнопке не надо же явно указывать к какой она форме, если она в форме, собственно?
сейчас попробовал путь заменить, все равно остается. значит или он не переходит по битой ссылке или ошибка в шаблоне.
<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>
еще попробовал заменить путь во фторой форме на нужный (для первой). Итог отправка второй формы поменялась, отправка первой все равно не редиректит. Значит пересечений форм нет, значит я вообще не знаю. гребаный вагон. пока читал че написал понял в чем проблема. кривоглазое чмо
http://jsbin.com/buzade/14/edit?js,console
Не нравится мне, что приходится добавлять свойства и константы вне конструктора объекта. А если код большой? Запутаться тут проще простого. Ну и как обычно ошибка. JSbin выводит что-то непонятное при ошибке:
>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.
И в html5 не нужно закрывать одиночные теги вот так <img/>. Пиши <img>
> Hamburger.prices[Hamburger.TYPE_SMALL] = 50;
Habgurger.prices не существует, потому оно возвращает undefined. ты пытаешься добавить поле в undefined и закономерно получешь ошибку так как поля можно добавлять только к объектам.
А как я тогда добавил Hamburger.TYPE_SMALL = 'small'; например? Я ведь в undefined добавил?
http://jsbin.com/buzade/16/edit?js,console
А теперь prices должен быть. Но ошибка вот какая:
ReferenceError: prices is not defined
мне надо извлечь prepare'd строки с помощью execute(array($login, crypt($userInput, $cryptedPass)) Но как мне узнать $cryptedPass? Извлекать все строки, вместо нужных, а затем сравнивать поле через цикл while ($fetched[] = $dbPrepared->fletch()) {...}?
> $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? Извлекать все строки, вместо нужных,
По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.
> $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? Извлекать все строки, вместо нужных,
По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.
> По имени пользователя находишь соль, шифруешь пароль, проверяешь совпадает ли сохраненный в БД хеш с полученным.
сделал уже так. Оказалось даже короче чем, если можно было бы при указании параметров в execute() указывать переменную для значения ячейки, чтоб проверить пароль. Кстати я соль использую случайную crypt() это вроде как ненадежно, как лучше генерировать соль?
http://jsbin.com/buzade/18/edit?js,console
А так?
Не понял зачем тут var. Нам же нужен контекст объекта Hamburger.
Я и не говорил, что он нужен. Я говорил, что ты обращаешься к несущестующей переменной.
Надо сделать еще методы на прототипах и метод для добавления дополнительных добавок.
>>374938
> Кстати я соль использую случайную crypt() это вроде как ненадежно, как лучше генерировать соль?
Там в мануале есть описание. Если есть возможность, лучше делать соль подлинее.
$fromangle=-80
$toangle=260
Откуда мы взяли их значения? Я сначала думал, что это углы до оси х и у, но очевидно, что это не так.
Дальше, что за $centerX и $centerY, центр, он как бы по определению один. Далее мы создаём массив из 30 подмассивов, чтобы у нас был круг в 30 строк высоток. Но элементов в подмассивах 80, а не 30. Разве не должно количество элементов в подмассивах совпадать с колличеством элементов в массиве?
Ты очень интересно объясняешь! Но правила в последнем предложении не существует.
Это правило для круга.
Я сдаюсь. Я понятия не имею, что делать дальше. И для чего нужны centerX с centerY.
Но я не понимаю как можно инклудить файл где-то в другом месте, а потом писать jimport в другом файле. Для меня это пока выглядит как: создал файл .php на одном диске, а приинклудил совсем в другом. А потом в этом .php используются каким-то образом какие-то методы.
Может например в каком-нибудь файле типа loader.php осуществляется "прослушка" на новые созданные файлы index.php в шаблоне? А потом вытаскивается код из них как-то? В общем мне непонятно.
А зачем? Какой профит будет от того, что я методы перенесу в прототип? Допустим я прототипы изучил, но где они применяются мне не понятно.
а, все нашел методом копирования на раб стол
post('/kukarek.php') выполняет POST-запрос на скрипт kukarek.php. Внутри kukarek.php одна строчка - echo "kukarek".
Когда я нажимаю на ссылку, сначала выполняется kukarek.php, а потом переходит в kokoko.php. Так во всех браузерах работает (сначала onclick, а потом href) и на это можно полагаться или только в моём?
onclick всегда выполнялся раньше самого действия тега, но в твоем случае на это надеяться не стоит, т.к. твой пост может занимать больше времени чем браузер перейдет к загрузки самой страницы по href и твой пост просто не дойдет до получателя...
Оп, я никак не могу понять как работает функция:
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 не очень понятно.
> 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
Обходим массив, увеличивая каждый раз переменную-счетчик, если она дошла до порога, то удаляем текущий элемент и сбрасываем счетчик. И так пока в массиве не останется нужное число элементов.
Все правильно сделано.
>>374987
Это начальный и конечный угол для расстановки букв. В комп. графике углы традиционно отсчитываются от оси X против часовой. то есть 0° = точка справа от центра, 90° — сверху, 180° — слева.
> Дальше, что за $centerX и $centerY, центр, он как бы по определению один.
Центр — это точка, а координаты-то у точки две: x и y
> Но элементов в подмассивах 80, а не 30. Разве не должно количество элементов в подмассивах совпадать с колличеством элементов в массиве?
Нет. Мы как бы разбиваем экран на строки, а строки на ячейки. Полчуается что-то вроде листа бумаги в клеточку, и в каждую клеточку мы можем вписать какой-то символ или пробел. Соответственно большой массив содержит подмассивы-строки, которые содержат отдельные ячейки-элементы.
Все верно.
>>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);
}
Не годится так как искажает форму круга.
Посмотри код Джумлы уже. Там начинается все с файла 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 то перестанет работать.
Посмотри код Джумлы уже. Там начинается все с файла 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 то перестанет работать.
> Какой профит
- изучение прототипов и прототипного ООП (это обязательно надо знать, так как это классический подход который везде применяется)
- код конструктора станет менее уродлив
- методы создаются один раз и они общие для всех объектов одного типа, а не при каждом вызове конструктора
> Допустим я прототипы изучил, но где они применяются мне не понятно.
На прототипах в JS делаются «классы» и наследование. Без их знания ты не сможешь писать классический ООП-код на JS и понимать его, использовать ООП-библиотеки.
>>375021
Это вроде бы не папка, а диск z:, который замаплен на папку в денвере. Алсо, полезнее ставить все по частям, у меня даже паста есть: https://gist.github.com/codedokode/10774100
>>375035
Это ненадежно, так как все выполняется параллельно и в момент загрузки новой страницы kokoko.php старые запросы (в том числе post(...)) отменяются. То есть это все работает на честном слове и в зависимости от скорости интернета, загруженности сервера и других факторов может не работать. Так конечно же делать не стоит.
Начать стоит с изучения функции 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() из первого задания — и ты получишь тот же код, что и в твоем посте.
Начать стоит с изучения функции 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() из первого задания — и ты получишь тот же код, что и в твоем посте.
> 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()
А тесты кто писать будет, Пушкин? Не проходит твой код тесты: http://jsbin.com/bicaveti/1/edit
Ты не создаешь новый объект, а возвращаешь тот, что передан в функцию, смотри внимательно.
http://jsbin.com/voyam/2/edit?js,console
>var pr = { a: 1, b: 2 }; // объект который станет прототипом
Мне кажется newObj прототип pr?
Нет, неверно. Функция create() должна создавать новый, пустой объект, прототипом котрого будет pr.
Нет, я не понимаю опять. Объект родитель (главный объект) и объект прототип родителя (наследуемый объект от главного объекта)?
Или все наоборот?
Наоборот же. Прототип — это как бы предок. Свойство ищется сначала в самом объекте а только потом в прототипах.
Нет.
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
То есть в цепочке три звена всегда как минимум?
Наоборот. У объекта созданного через
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
Наоборот. У объекта созданного через
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
№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() и обойтись без цикла.
Получится же намного сложнее, не?
>У объекта созданного через new Rabbit() (а не у функции Rabbit) прототипом будет Rabbit.prototype или animal, что одно и то же.
Почему одно и то же?
>Не путай свойства prototype и прототип
Я путаю. В свойстве prototype хранится прототип?
>Object.prototype.isPrototypeOf(o); // true
Почему не Object? Получается Object.prototype - это прототип o и Object? Почему мы сразу бежим к свойству prototype в объекте Object?
http://ideone.com/XhD0tI
У объектов есть внутреннее свойство [[Prototype]] (встречается как proto), а обычное свойство prototype есть только у функций.
Они связаны? Как они связаны? Ничего не понимаю.
>Есть родитель(функция-конструктор), у которой есть ссылка в свойстве prototype на некий объект где хранятся все методы и свойства к которым потомок должен иметь доступ. И есть, собственно, потомок которому при создании через вызов new от родителя передаётся ссылка в свойство proto на тот самый объект с общими свойствами и методами.
Источник: http://habrahabr.ru/post/151070/
Это меня запутало полностью. Тут верно написано?
Родитель со свойством prototype, в котором ссылка на некий объект с методами и свойствами. Это не бред? Может правильнее будет, потомок со свойством prototype, в котором лежит ссылка на некий объект-родитель, в котором лежат свойства и методы?
Вот еще №12: http://jsbin.com/jekinido/1/edit?js,console
Сделал не полностью(даже не пробовал пока добавлять приправу и майонез) и наговнокодил.Но рад, оче рад, для меня это оче сложная тема. Надеюсь, что правильно применял ООП-принципы.
Объект из свойства prototype функции-конструктора записывается в свойство proto каждого созданного объекта. Прототипом является именно то, что лежит в proto
Кажется я понял что было не так. В моем алгоритме часть информации о купюрах была взята из предыдущей суммы, а часть из количества по умолчанию, поэтому и получалась такая путаница. И в результате одну купюру высчитывало верно, а другие фиг пойми как.
http://ideone.com/6Kz9uE
Словосочетания
http://ideone.com/htytkF
У меня проблема. Очень скоро мне надо будет админить сервер на линуксе, а знания о последнем у меня заканчиваются где-то на уровне умения ставить пакеты и пользоваться простейшими консольными утилитами. Как, например, привязать домен к апачу, настроить почту на домене, поставить ту же cPanel, да даже сменить стандартные пароли у веб-служб - я вообще не представляю. Это не говоря уже о том, чтобы обеспечить оптимальные по безопасности, стабильности и скорости работы настройки веб-сервера и сопутствующих служб, тут я даже не знаю, что именно я должен делать. А админить уже скоро, сервер важный. Что делать? Что читать? Что гуглить? Есть какие-то книжки (хорошо, если на русском) с экспресс-курсами? Есть какие-нибудь хендбуки по линуксу, фре, не важно, с упором именно на разворачивание и админство веб-сервера? Что читать вообще фундаментального и отвечающего на большинство вопросов начинающего админа веб-сервера?
Хотя вот, что интересно:
>Однако, изменение свойства prototype в конструкторе, никак не влияет на прототип уже порождённых объектов. Меняется только (и именно) свойство prototype конструктора. Это означает, что новые порождаемые объекты, будут иметь новый прототип. Порождённые же уже (до смены свойства prototype) объекты, имеют связь со своим старым прототипом, и эта связь уже неизменна.
То есть получается и конструктор, и объекты имеют свой прототип. Но объекты наверное имеют копию прототипа, а в prototype функции-конструктора лежит ссылка на оригинальный прототип. То есть при изменении прототипа функции-конструктора, прототип созданных объектов не изменится.
Т.е. я бы мог её загрузить через файлзилла, а как сделать так, чтобы это происходило автоматически, через php?
Я пытаюсь реализовать так называемый инициализирующий контекст, чтобы в итоге получился автовызов функций и вывод необходимых данных при создании объекта. Это реально? У меня пока не получается.
Зачем мне дополнительный метод для добавок? Хотя, если их будет много, то да, наверное стоит. Но я все равно не знаю как сделать метод, чтобы он вычислял откуда нужно брать значение из prices или calories. Вообще реально узнать какому объекту принадлежит свойство?
Конструктор - это функция. Функция - это объект. Прототип функции-конструктора - это SomeFunction.proto, никакого отношения к прототипам порожденных объектов это поле не имеет. В цепочку прототипов попадет SomeFunction.prototype, SomeFunction.prototype.proto, итд.
Причем SomeFunctionObject.proto - это копия SomeFunction.prototype, а не ссылка, потому и прототип уже порожденных объектов и не меняется. По сути при создании нового объекта перед выполнением всего, что есть в функции-конструкторе, делается:
this = {};
this.proto = SomeFunction.prototype;
>мы имеем следующую структуру с двумя явными собственными (own) свойствами и одним неявным (внутренним) свойством proto, которое является ссылкой на прототип объекта foo
proto, которое является ссылкой
http://dmitrysoshnikov.com/ecmascript/ru-javascript-the-core/#obyekt
Окей, поправлюсь. В proto попадает ссылка. Но в SomeFunction.prototype тоже ссылка. Замена свойства SomeFunction.prototype.someField повлияет на уже созданные объекты, а замена SomeFunction.prototype - нет.
Еще начал делать задачку на поиск пути. Вроде бы норм написал вариант для возвращения маршрута только для одной точки, но вот с рекурсией не могу разобраться. Как сохранять и куда сохранять результаты вызова функции в функции, да и как вообще этим пользоваться не понимаю.
http://ideone.com/W7f33e
Погугли алгоритмы поиска кратчайшего пути в графе. Там ни к чему рекурсия.
Это я уже в задаче про банкомат разбираю. A*. Хотелось бы рекурсию осилить.
Хотя для закрепления возможно попробую этот алгоритм к этой задаче тоже применить, ибо с большим трудом осилил его.
Установил EasyPHP DevServer 14.1 VC11
с сайта easyphp.org
В итоге у меня не запускается Апач, ругается на отстутствие каких-то файлов. Винда 8 свежая. В чем может быть проблема?
Какой вопрос, такой и ответ. Если ругается, значит говорит их имена. Начать изучение php да и вообще чего либо, стоит с заведения привычки внимательно читать и вникать во все предупреждения и ошибки. И искать файл логов конкретной программы для того что бы понять что не так, а не бежать на двачи и форумы и сразу спрашивать. 99% ошибок уже давно обмусолены 1000 раз и легко ищутся в гугле.
Ты уверен?
Спасибо ОП, я кун, который начал решать твои задачи. про айфон поправил. Буду занимаься дальше
Ну не знаю, вызови конструктор A внутри конструктора B. Зачем тебе это? Кстати, у тебя в коде конструктор A не используется вовсе. Его можно сделать пустым.
В оригинале в конце функции extend зачем-то приписывается:
child.superclass = parent.prototype
а внутри конструктора B прописывается A.superclass.constructor.apply(this, arguments), но у меня это не работает.
>Зачем тебе это?
Пытаюсь понять работу extend. Кстати погуглил, для копирования свойств пишут миксин. А вообще есть фреймворк http://learn.javascript.ru/files/tutorial/js/class-extend.js
мой монстр вроде и работает, но явно это неправильно, хочу порефакторить в канон
> 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), даже не зная, что именно это за функция - С.
http://hhvm.com/blog/5723
https://github.com/php/php-langspec/blob/master/spec/php-spec-draft.md
Но там еще HHVM встречается, который мне кажется никому не нужен. Слышу впервые о нем, и думаю, что его никто не использует.
Посоветуйте как более правильнее будет: присваивать в скрипте значение метода переменной, а потом эту переменную использовать в шаблоне или сразу использовать метод в шаблоне?
А то у меня подобных штук (вызовов методов из стороннего класса) много и с одной стороны засоряется скрипт, если понаприсваивать многим переменным значения, а с другой шаблон, если без промежуточных переменных.
О, офигенно. Колокол внизу по моему называется кривой Гаусса (или нормальным распределением): 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
О, офигенно. Колокол внизу по моему называется кривой Гаусса (или нормальным распределением): 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
> но не знаю как сделать так, чтобы сначала выводил новое стартовое значение.
Сохраняем текущее занчение, увеличиваем счетчик, возвращаем сохраненное значение.
№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
Все верно.
> олучится же намного сложнее, не?
Ну вообще да, может быть.
> но не знаю как сделать так, чтобы сначала выводил новое стартовое значение.
Сохраняем текущее занчение, увеличиваем счетчик, возвращаем сохраненное значение.
№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
Все верно.
> олучится же намного сложнее, не?
Ну вообще да, может быть.
Это логично так как 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 — все используют кемелкейс.
Ну и я там еще чуть подправил условие, чтобы был смысл исплоьзовать несколько линий передачи.
Это логично так как 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 — все используют кемелкейс.
Ну и я там еще чуть подправил условие, чтобы был смысл исплоьзовать несколько линий передачи.
> Почему одно и то же?
Потому что у тебя написано: 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 — тогда не накапливаются ошибки округления (при сложении они накапливаются, тут это не важно, но когда шагов много, тысячи и миллионы, ошибка может стать значительной).
> Почему одно и то же?
Потому что у тебя написано: 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 — тогда не накапливаются ошибки округления (при сложении они накапливаются, тут это не важно, но когда шагов много, тысячи и миллионы, ошибка может стать значительной).
> Они связаны? Как они связаны? Ничего не понимаю.
При создании объекта его прототипом становится то, что было в свойстве 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ал в условие:
> Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться).
> Они связаны? Как они связаны? Ничего не понимаю.
При создании объекта его прототипом становится то, что было в свойстве 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ал в условие:
> Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться).
> ажется я понял что было не так.
Ну наконец-то!
> // Удаляем из массива купюры которых нет в наличии
Это лучше сделать через 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;
Это лучше сделать массивом и запонять не через конструктор, а через метод
Обрати внимание, я там в условие задачи добавил пункт про защиту от ошибок.
> ажется я понял что было не так.
Ну наконец-то!
> // Удаляем из массива купюры которых нет в наличии
Это лучше сделать через 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;
Это лучше сделать массивом и запонять не через конструктор, а через метод
Обрати внимание, я там в условие задачи добавил пункт про защиту от ошибок.
Тут лучше для начала в википедии например про алгоритмы поиска пути почитать: 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
Можешь поизучать на досуге. Я советую взять ту, что попроще и разобрать исходный код.
Тут лучше для начала в википедии например про алгоритмы поиска пути почитать: 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
Можешь поизучать на досуге. Я советую взять ту, что попроще и разобрать исходный код.
Круто и важно.
> Дай какой-то гайд, который по твоему мнению самый каноничный, чтобы я мог целенаправленно залипнуть в него.
Ну не знаю, вот например тут посмотри: 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 (англ)
Круто и важно.
> Дай какой-то гайд, который по твоему мнению самый каноничный, чтобы я мог целенаправленно залипнуть в него.
Ну не знаю, вот например тут посмотри: 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 (англ)
Спасибо большое что ответил, думал меня проигнорируют. Я просто учил пхп зимой, а потом как устроился на работку то забил. Сейчас я нахожусь в относительном отдыхе и решил возобновить. Начал с повторения твоего учебника. Но делать одни и те же задания про айфон немного скучно вот и решил. Сейчас поправлю код. И да, для меня главное интерактивность в обучении, ибо хочу научиться писать качественный код.
У меня такая проблема с MVC.
Вью отобразил данные которые в него пришли из контроллера, произошло это методом вью, в котором он реквайрит шаблон.
Мне нужно сделать кнопку, по нажатии которой, отобразится еще что-то. Для этого контроллер должен выдать нужные мне данные.
Обратится к контроллеру как из начальной точки я не могу, так как scope стоит на вью, потому что мы его методом отобразились.
Сначала, я смешал методы вью в контроллер, и тогда я через $this мог вызывать нужные мне методы. Но это ломает MVC.
Теперь я подумал, что можно сделать контроллер глобальной переменной, и на отображенных страницах обращаться к нему через $GLOBALS['ctrl'] например.
И вот вопрос, это приемлемо или я должен с самого начала продумать абсолютно все, что может мне понадобиться и передать его во вью?
Ну передал во вью те данные, которые пришли из модели.
>Может там другой тип таблицы MyISAM/InnoDB? Или кодировка не настроена?
что это значит и как проверить? В обеих MyISAM (и у меня на тестовом, и на хостинге), кодировка одна и та же вроде (utf8_general_ci)
Куда еще можно копнуть?
Как-то так. Получился овал, но если увеличивать коэффициент х и дальше, то правая половина круга сплющивается и получается полукруг.
Вычисляются координаты буквы по Х через синус и по У через косинус и заносятся в соответствующий элемент пустого массива, который мы выводим на экран. В подсказке к задачке написано.
№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)) ?
проблема вроде решилась, ухожу.
>Полгода-год. Но это надо не только PHP, а PHP + HTML + JS + CSS + SQL так что скорее год.
Не увидел где написано в каком темпе нужно учить, чтоб за год стать пыхапистом.
Если на обучение тратить пару часов после основной работы? Сколько времени займёт?
А если не иметь работы и учить по 8 часов в сутки? Тогда сколько займёт?
Я вот раньше тоже такие вопросы когда-то задавал, но потом пошел играть в доту понял, что у всех разные мозги и обучаемость, так что такие вопросы не оче
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. По мануалу он возвращает абсолютный путь.
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. По мануалу он возвращает абсолютный путь.
1. Очевидно, include не слишком критичные файлы (настройки например, когда есть дефолтный набор настроек)
3. Переходиш chdir, используешь функции, которые работают с текущей директорией. Перечисление файлов, например.
4. Да.
5. Щито?
http://ideone.com/wI6Gvl
Задача на кредит. Не мог запустить её час наверное, все перепроверил, а в итоге ушел перекусить, и через 40 минут она сама запустилась. Мог Идеон тупить?
Вот на оценки. http://ideone.com/h2NvmE
заебал идеон, сильно напрягает когда он тебе выдает ошибку, и ты не знаешь ты ли где тупанул или он не работает.
Сейчас остановился на Порязрядных операторах пхп.
?>
<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;
?>
Сейчас остановился на Порязрядных операторах пхп.
?>
<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;
?>
не понимаю, как можно учить какой-то язык не на специально для этого установленной программе.
Какая разница? Результат то один и тот же. Да и я начинал его учить на апаче, через сублайм текст, это уже после книжки Никсона пришел сюда решать задачки.
Но ты же не понимаешь самой сути, для чего этот язык, если сразу его в локалхосте не испробуешь. Я вот сейчас доделаю задачки из мануала и буду его с хтмл и сss связывать.
Я же написал, что учил его по Никсону. С чего ты взял, что я не испробовал пхп на локалхосте? Как же еще я мог это делать? И мускул ставил, и соц.сеть сделал. Вернее скопипастил с учебника. Это сейчас я айдеон юзаю, чисто для задачек ОПа.
Общественное мнение не нужно
Но что тебе сейчас мешает скачать пхп и денвер и делать все в блокнотике и на сайте, как белый человек?
Я страдаю от того, что из довольно простого и удобного скриптоязычка для веба пытаются сделать какого-то франкенштейна.
сначала объясни что это.
подожди пхп7, там ты охубеешь
Фу, какой даже локалхост ленится открыть, вы посмотрите на него! Какой вообще от тебя, бездаря, толк, тьху, вырастила на свою голову!
На codecademy есть соответствующие курсы.
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 или еще больше.
А так, норм сделано.
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 или еще больше.
А так, норм сделано.
>>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 отделбных свойства, а не валить все в один массив.
Также, не вижу как добавить добавку. Для этого стоит сделать отдельнй метод.
При ошибке лучше выбрасывать исключение, а то ошибку сразу можно не заметить (если в программе есть еще куча других действий).
>>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 отделбных свойства, а не валить все в один массив.
Также, не вижу как добавить добавку. Для этого стоит сделать отдельнй метод.
При ошибке лучше выбрасывать исключение, а то ошибку сразу можно не заметить (если в программе есть еще куча других действий).
Не знаю, все зависит от тебя. Но конечно чем больше времени тем лучше.
>>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 иногда содержит точки. Или нет?
Не знаю, все зависит от тебя. Но конечно чем больше времени тем лучше.
>>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 иногда содержит точки. Или нет?
> /spoj/php_run: line 1: exec: php: not found
Это явно у них проблема. Сегодня и jsbin что-то глючит.
Вокруг знаков +, -, = надо ставить пробелы для читабельности:
$credit = $credit + ($credit * $percent) + $fee;
А так, считает верно.
>>375641
> сильно напрягает когда он тебе выдает ошибку
Ну можешь себе PHP поставить и запускать в консоли — пик.
Выводить оценки из массива, кстати, гораздо удобнее через implode:
echo implode(', ', $marks);
Решено верно.
Не все описано в самоучителе.
>>375678
Проблемы видимо какие-то.
>>375702
Айдиван позволяет поделиться ссылкой, а это для меня например очень удобно.
>>375706
Зато можно попробовать ничего не устанавливая.
>>375722
Это плохо, так как людям в блокноте часто становится лень отбивать отступы и они лепят код сплошной стеной. Плюс, он может вставлять BOM из-за чего некоторые функции не работают.
>>375725
Норм, сначала язык изучать а потом уже вывод html. Мне например не нравится, когда в учебниках вокруг любой задачи пишется html, body и прочий мусор.
Теория категорий, определение, функторы, эквивалентности, сопряженные функторы (Маклэйн, 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-алгебре Ли когомологий векторных полей. Пространства модулей и их конечномерность (см. лекции Концевича, либо собрание сочинений Кодаиры). Теорема Богомолова-Тиана-Тодорова о деформациях Калаби-Яу.
Симплектическая редукция. Отображение моментов. Теорема Кемпфа-Несс.
Деформации когерентных пучков и расслоений в алгебраической геометрии. Геометрическая теория инвариантов. Пространство модулей расслоений на кривой. Стабильность. Компактификации Уленбек, Гизекера и Маруямы. Геометрическая теория инвариантов это симплектическая редукция (третье издание Геометрической Теории Инвариантов Мамфорда, приложения Фрэнсис Кирван).
Инстантоны в четырехмерной геометрии. Теория Дональдсона. Инварианты Дональдсона. Инстантоны на кэлеровых поверхностях.
Псевдоголоморфные кривые на симплектическом многообразии. Инварианты Громова-Уиттена. Квантовые когомологии. Зеркальная гипотеза и ее интерпретации. Структура группы симплектоморфизмов (по статье Концевича-Манина, книжке Полтеровича "Симплектическая геометрия", зеленой книжке о псевдоголоморфных кривых и запискам лекций МакДафф и Саламона).
Комплексные спиноры, уравнение Зайберга-Уиттена, инварианты Зайберга-Уиттена. Почему инварианты Зайберга-Уиттена равны инвариантам Громова-Уиттена.
Теория категорий, определение, функторы, эквивалентности, сопряженные функторы (Маклэйн, 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-алгебре Ли когомологий векторных полей. Пространства модулей и их конечномерность (см. лекции Концевича, либо собрание сочинений Кодаиры). Теорема Богомолова-Тиана-Тодорова о деформациях Калаби-Яу.
Симплектическая редукция. Отображение моментов. Теорема Кемпфа-Несс.
Деформации когерентных пучков и расслоений в алгебраической геометрии. Геометрическая теория инвариантов. Пространство модулей расслоений на кривой. Стабильность. Компактификации Уленбек, Гизекера и Маруямы. Геометрическая теория инвариантов это симплектическая редукция (третье издание Геометрической Теории Инвариантов Мамфорда, приложения Фрэнсис Кирван).
Инстантоны в четырехмерной геометрии. Теория Дональдсона. Инварианты Дональдсона. Инстантоны на кэлеровых поверхностях.
Псевдоголоморфные кривые на симплектическом многообразии. Инварианты Громова-Уиттена. Квантовые когомологии. Зеркальная гипотеза и ее интерпретации. Структура группы симплектоморфизмов (по статье Концевича-Манина, книжке Полтеровича "Симплектическая геометрия", зеленой книжке о псевдоголоморфных кривых и запискам лекций МакДафф и Саламона).
Комплексные спиноры, уравнение Зайберга-Уиттена, инварианты Зайберга-Уиттена. Почему инварианты Зайберга-Уиттена равны инвариантам Громова-Уиттена.
>Брал бы тогда задачи посложнее, например из раздела про регулярки и далее. Алсо, даже если ты пройдешь учебник, у нас есть дополнительные задания.
Решил начать с простого, в этот раз обязательно планирую дойти и до сложного.
>str_pad же есть
>str_repeat
>Тут пробел нужен: 48 0
http://ideone.com/kTkT98
Вот исправил и доделал
>Для кнопок ALL / GRAPHIC / ILLUSTRATION / MOTION надо сделать чтобы работало переключение, средствами CSS3
Но это же будет не кроссбраузерно? Или ты посоветовал это, потому что по умолчанию будет видно весь список работ? А ничего не сломается в старых браузерах?
>, например как описано тут: http://habrahabr.ru/post/138020/
Я прочитал статью, стал делать как там, но что-то не выходит, наверное, потому что я что-то не понимаю. Можешь объяснить, что там в CSS-коде происходит?
>А ты уверен, что тут нельзя использовать display: block; text-align: center; ?
Что-то не понял - display: block; и text-align: center; для чего?
>И насчет удаления пробелов, хак с font-size 0 очень плохой, так как работает не везде. Вот статья с описанием других способов:
Какой посоветуешь?
Полный путь, в котором разрешили все симлинки и убрали все "..", емнип.
На денвере изображения сохраняются относительно подключенного диска, в моем случае Y, создавать каталоги нельзя. В иксах же вообще ничего не пишет и не сохроняет, в чем может быть проблема такого поведения, что включить подкрутить надо для сохранения в созданные мной каталоги файлов?
http://ideone.com/umskKe
Сделал вывод через имплод. Спасибо за подобные хинты. В принципе у меня цикл нужен тут так и так для заполнения массива, но если бы его не было, то вместо запуска полного цикла для вывода значений действительно куда лучше делать вот так 1-й строкой.
http://jsbin.com/buzade/31/edit?js,console
Оп, посмотри.
А можешь какие-нибудь короткие задачи на определении директории написать? Вообще работа с каталогами, а то я путаюсь.
Вот, кстати, мне тоже интересно, как сделать, чтобы кнопочки вдавливались при нажатии. Ну ховер понятно, а дальше.
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;
Я проверял, не работает, но почему?
Нет, нет, меня эти транзикшн не устраивают. Я хочу знать, как сделать, если я лично нарисовал в фотошопе анимацию кнопочки. Надо ее как гифку на бэкграунд поставить кнопке? И как чтобы не повторялась?
Ща продолжу ковыряться и докопаюсь до русских символов таки.
http://ideone.com/hSSnZ2
Ок, видимо просто так получить русские символы нельзя. Многобайтовость видимо и вся хуйня.
И опять штырит идеон сегодня или как?
Я все задачи до 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.
в объекте же вроде бы не нельзя использоваться переменные, у объекта свойство - это строка же, не?
mkdir("/one");
chmod("/one", 777);
mkdir("/one/two");
chmod("/one/two", 777);
mkdir("/one/two/three");
chmod("/one/two/three", 777);
Не слишком гибко делать деревья, а уж если говорить про файлы. Неужели другого решения нету?
Написал функцию для одного и двух шагов. Дальше хз как её модифицировать.
А, так ты про пхп
Если я правильно понял, то передавай третьим параметром true в mkdir, тогда сразу сможешь создавать "/one/two/three"
http://php.net/manual/en/function.mkdir.php
Спасибо, все получилось, раньше пытался через true не получалось. Да и в документации об этом ничего не написано.
sudo apt-get install mysql-server
и еще, как происходит процесс регистрации юзера? он заполняет поля, я ему на мыло присылаю ссылку с кодом, он по нему переходит и регистрация оконччена. Так вот, какой код ему присылать и куда сохранять инфу о нем пока он не авторизировался?
Хмм, если например папка one была создана и я пишу
mkdir("one/two", 0777, true);
то папка не создается/
Папка создана ранее через саму ОС.
Владелец не www-data, а пользователь.
Если у тебя украли базу, и в ней логины и пароли хранятся в виде "как есть", то злоумышленник сразу получает доступ ко всем аккаунтам.
Если же в базе вместо паролей были хеши (штука, принимающая на вход данные и возвращающая строку фиксированной длины, у одних и тех же данных один и тот же хеш), к примеру результаты md5(пароль), то злоумышленник может узнать пароли по готовым таблицам md5(пароль), которые есть в сети (радужные таблицы).
Если же хранить в базе пароли в виде md5(пароль + случайная строка), то злоумышленник не сможет найти пароль по стандартным радужным таблицам (хеши для таких паролей не сгенерированы) и ему придётся генерировать свою радужную таблицу, а это обычно долго и много места занимает на диске. Так вот, случайная строка - соль.
Чем медленный алгоритм хеширования, тем медленнее генерация таблиц в случае взлома. Соль обычно уникальна для каждого пользователя и хранится в соседней колонке.
Я не очень в этом разбираюсь, но может у директории one нет прав на изменение для других пользователей?
Хочу сделать вложенные комментарии. Для этого у каждого комментария храню id родительского комментария в отдельном столбце.
Не понимаю как вывести сформировать это и вывести представление. Сформировать как массив массивов массивов массивов массивов массивов, а как его распарсить потом?
Что актуально использовать для sql-запросов в PHP? mysqli или mysql?
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
или
$dbh = mysql_connect("127.0.0.1", "user", "password");
mysql теперь не рекомендован к использованию.
Либо mysqli, если только MySQL либо PDO, если универсальность. Мне больше PDO нравится, он удобней.
$url = $_REQUEST['url'];
$content = file_get_contents($url);
$content = str_replace("%26", "&", $content);
file_put_contents('correct_url.txt', $content , FILE_APPEND | LOCK_EX);
Да. Можешь скачать например OpenServer. Там есть все самое необходимое и он уже готов к работе, вообще сборок разных куча. Можешь и просто apache+php поставить. В гугле почитай про то как.
http://ideone.com/EPICNZ
(url на что то намекает)
Вторая задачка
http://ideone.com/a5H95S
>компания «Вектор» строго соблюдает закон
>"Вектор"
тонко
>>376415
>Вопрос: Сегодня у меня будет секс?
>Ответ: Нет
Пикритейлед
>>376427
Потому что он показывает результаты последнего запуска.
Сами откройте программу через fork и нажмите run
http://ideone.com/BnbbdD
вот генератор паролей накидал.
Ок, теперь все верно.
>>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 незакрывающимися тегами либо с вставкой комментария между тегами.
Ок, теперь все верно.
>>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 незакрывающимися тегами либо с вставкой комментария между тегами.
> На денвере изображения сохраняются относительно подключенного диска, в моем случае 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() ?
> На денвере изображения сохраняются относительно подключенного диска, в моем случае 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() ?
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 *
да ты крут
>>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
да ты крут
>>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
Надо использовать невидимые радиокнопки и с помощью 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.
Надо использовать невидимые радиокнопки и с помощью 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.
>аботает с байтами, а не символами. То есть она возвращает строку из 1 байта (не символа). Байт может иметь всего 256 значений, от 0 до 255. В utf-8 русские буквы состоят из 2 байт, потому русскую букву надо генерировать за 2 вызова:
Спасибо большое и мне даже вроде всё понятно в теории, но как с этим работать не ясно. Я ведь просто хотел сделать годный шифровальщик. При том что бы не забивать в ручную массив со значениями: 1 => 'А', 2 => 'Б' и т.д. Я хотел заполнить его выдергивая символы по их коду в асски, а оказалось что я соснул с этим, вот и всё.
Пока энивей это кажется довольно сложным, поэтому просто иду по задачам и в том числе делаю какие-то левые, а так же те которые пропустил, думаю лишним не будет.
Вот генератор имен.
http://ideone.com/KiwM5N
Правильно, немогущие в гугол должны страдать.
> 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(...);
И все будет нормально.
> 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(...);
И все будет нормально.
Надо исплоьзовать рекурсию, то есть если шага больше одного, то функция вызвыает саму себя для проверки вариантов:
Если (остался один шаг до финиша) {
добавляем его и возвращаем получившийся путь;
}
// иначе же
Берем все соседние точки, которых нет в пути;
Для каждой точки вызываем себя, чтобы попробовать найти путь к финишу через эту точку, получаем в итоге массив путей
Из всех полученных путей берем самый короткий;
Возвращаем его;
Также, стоит посмотреть на алгоритмы из википедии, там есть и более простые варианты: 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
Ок, все верно, только не скупись на пробелы.
Надо исплоьзовать рекурсию, то есть если шага больше одного, то функция вызвыает саму себя для проверки вариантов:
Если (остался один шаг до финиша) {
добавляем его и возвращаем получившийся путь;
}
// иначе же
Берем все соседние точки, которых нет в пути;
Для каждой точки вызываем себя, чтобы попробовать найти путь к финишу через эту точку, получаем в итоге массив путей
Из всех полученных путей берем самый короткий;
Возвращаем его;
Также, стоит посмотреть на алгоритмы из википедии, там есть и более простые варианты: 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
Ок, все верно, только не скупись на пробелы.
Ось какая? По идее на официальном сайте 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 — эти вопросы любят на собеседованиях
Ось какая? По идее на официальном сайте 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 — эти вопросы любят на собеседованиях
>Функция 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
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 и оператор склеивания строк.
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 и оператор склеивания строк.
Потому что «нет».
>>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() делает то же самое.
Потому что «нет».
>>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() делает то же самое.
Мне ответил везде, пойду раскритикованный генератор паролей менять, плюс делать шифровальщика. Ты уходишь опять надолго?
>> $password = "";
>>Надо писать array() а не ""
Просто сначала я хотел сделать его переменной типа string
>>Также плохо, что структура пароля предсказуема, а именно число цифр. Также, стоит разбавить знаками и символами. Также, сделать подлинеее на пару символов.
переделал, в итоге пароль получается более омский и скрипт получился короче, еще будут замечания или ограничения?
http://ideone.com/BnbbdD
>>Зачем тут file_get_contents например? Ты можешь вообще объяснить что твой скрипт по задумке должен делать?
Я вообще на stackoverflow нашел это решение. Хз, я плохо понимаю механику, как именно нужно 'поймать url', не обессудьте.
перешел по наследству из предыдущей версии, когда я сначала генерировал несколько букв, несколько цифр, а потом перемешивал их, что бы не шли подряд.
Да думаю как тебе удобно, я что бы затестить на два дабла аж урезал кости до 3 вместо шести, а то никак не выпадали.
Не пропустил, но не ответил на вопрос. >>376062
Я думаю, что линии электропередач должны наследовать и от электростанций, и от солнечных панелей, а жилые дома от линий электропередач.
Также жилые дома могут напрямую наследовать от солнечных панелей.
Как это реализовать? Наследование классов мне тут понадобится видимо. Но проблема не в этом, а в том, что один класс должен наследовать от двух классов.
Ты говорил через какие-то библиотеки?
Я пробовал ftp_put, но там только сохраняет уже в готовые файле на сервере. Подскажи годный загрузчик.
В этом самоучителе столько ошибок в примерах. Пиздец просто.
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 (правильный ход мыслей?)
Можно ли так делать? И вообще как заключать объекты и классы в кавычки?
Вместо 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
Вместо 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
Проверка на даблы сделана верно.
>>376524
Ты просто не такой везучий, как анон а вообще для проверки можно было вместо mt_rand вписать нужное число
>>376525
Пачку зеленого чая и коробку печенек. А вообще, походи по hh.ru, geekjob, зайди в /wrk, поищи зарплата-тред в /pr, в общем изучи состояние рынка.
>>376528
Не, ты не так понимаешь концепцию наследования.
Если B наследуется от A то это значит одно из двух:
A — это улучшенная/переделанная версия B. Например, B — это Самолет, а A — это СамолетСВертикальнымВзлетом. И соответственно, B можно использовать вместо A (это называется принцип подстановки Лисков: вместо базового класса можно подставить его наследника и все должно работать. Кстати, Лисков — это не название иноплатнетных существ, а фамилия).
Или же A — это какая-то асбтрактная штука, а B — ее реализация. Например, A — это СредствоПередвижения, а B — Автомобиль.
Здесь мы имеем именно второй случай. Базовым классом у нас должно быть ЭлементЭлектросети, а от него наследуются Дом, Панели, ЛЭП и что там еще есть.
> Я думаю, что линии электропередач должны наследовать и от электростанций, и от солнечных панелей, а жилые дома от линий электропередач.
Бред же. Жилой дом — это усовершенствованная версия ЛЭП? Его можно поставить вместо ЛЭП?
Множественное наследование тут (и в 99% других случаев) не нужно.
Проверка на даблы сделана верно.
>>376524
Ты просто не такой везучий, как анон а вообще для проверки можно было вместо mt_rand вписать нужное число
>>376525
Пачку зеленого чая и коробку печенек. А вообще, походи по hh.ru, geekjob, зайди в /wrk, поищи зарплата-тред в /pr, в общем изучи состояние рынка.
>>376528
Не, ты не так понимаешь концепцию наследования.
Если B наследуется от A то это значит одно из двух:
A — это улучшенная/переделанная версия B. Например, B — это Самолет, а A — это СамолетСВертикальнымВзлетом. И соответственно, B можно использовать вместо A (это называется принцип подстановки Лисков: вместо базового класса можно подставить его наследника и все должно работать. Кстати, Лисков — это не название иноплатнетных существ, а фамилия).
Или же A — это какая-то асбтрактная штука, а B — ее реализация. Например, A — это СредствоПередвижения, а B — Автомобиль.
Здесь мы имеем именно второй случай. Базовым классом у нас должно быть ЭлементЭлектросети, а от него наследуются Дом, Панели, ЛЭП и что там еще есть.
> Я думаю, что линии электропередач должны наследовать и от электростанций, и от солнечных панелей, а жилые дома от линий электропередач.
Бред же. Жилой дом — это усовершенствованная версия ЛЭП? Его можно поставить вместо ЛЭП?
Множественное наследование тут (и в 99% других случаев) не нужно.
FILE на локальном сервере возвращает путь, начиная с раздела жесткого диска и заканчивая папкой с файлом, в котором исполняется код. Как оно выводится на удаленном сервере? В случае с joomla будет что-то вроде /templates/someTemplate/index.php или будет что-то наподобии /var/www/site/templates/someTemplate/index.php?
Не могу разобраться в этих константах. Функции типа realpath и dirname меня вводят в тупик.
Должен в них разобраться, как недавно разобрался в прототипах на js. Кстати по привычке забываю писать знак $ после js. Немного подзабыл названия функций из стандартного набора, ползал в мануал и искал то, что нужно.
Набираем в Гугле «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, код-то наверно проще станет?
Набираем в Гугле «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, код-то наверно проще станет?
Это с помощью SPL? Но почему-то нигде не наблюдал его использование, неужели он настолько непопулярен?
Нужно когда-то разобраться в итераторах. Ты упоминал, что там можно мозг сломать.
В чем разница, если я напишу is_dir ( string $filename ) или DirectoryIterator::isDir? В производительности?
А вот есть еще Direct IO, он для чего? Вроде у него встречаются такие же функции, как и обычные встроенные.
"{$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, а они объединяются в буфер и отдаются на запись одним блоком — это повышает производительнсоть когда идет вывод небольшими блоками, например вывод текста по буквам). Не встречал, чтобы оно использовалось.
"{$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, а они объединяются в буфер и отдаются на запись одним блоком — это повышает производительнсоть когда идет вывод небольшими блоками, например вывод текста по буквам). Не встречал, чтобы оно использовалось.
https://github.com/Purplepeak/TestHub
Бампану, вдруг забыл про меня. Глянь хотя бы регистрацию, очень интересно твое мнение.
http://ideone.com/J9hong
Вторую задачу пофиксил, ideone опять правда лежит.
Еще такой вопрос возник - начинаю делать задачу номер 3, про департаменты. И как я понимаю самое главное тут правильно думать и составить алгоритм. Всякие там наследования и еще куча непонятных вещей. Подскажите кто как вообще правильно в ооп сформулировать эту задачу и её решение.
Когда не визитка но и не ХАЙЛОАД_КРОВЬ_КИШКИ.
Не знаю какую задрочить.
Сделал задачку на палиндром
Сам дам замечание, которое сам же исправил в процессе. Сначала использовал при подсчете длины строки strlen, который возвращал мне количество байт, а не символов, поэтому даже это число поделенное на пополам давало в целом длину строки и цикл проходил от начала до конца, а не до середины.Что не мешало скрипту правильно выявлять панлиндромы Когда заменил на mb_strlen то всё стало как в подсказке.
То есть у меня есть некий базовый контроллер который обеспечивает функционал для всех компонентов, но некоторые данные в них отличаются, и нужна кастомная функция которая будет вызываться из родителя.
>Ну так и в чем проблема, тебе же это и надо? Или тебе надо чтобы он и от пользователя сам файлы принимал? Тогда не знаю, но по моему тут немного писать.
Ну смотри, вот код:
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'; указать не папку, а файл, допстим ридми.тхт, то инфа из тест.тхт запишется в файл и все работает.
А как закачать этот файл на сервер? А не записать его в существующий уже на сервере?
Итак, я понял, что SplStack ну ни чем не отличается от SplDoublyLinkedList. От сюда вывод, что стек и двусвязный список - это одно и то же?
Дальше SplQueue. У него появились новые методы enqueue и dequeue, которые ничем не отличаются от SplDoublyLinkedList::push() и SplDoublyLinkedList::shift(). Опять приходим к выводу, пока три класса идентичны, но с разными названиями.
Далее SplMaxHeap и SplMinHeap наследуются от SplHeap. Используются для сортировки значений. Что такое куча?
SplPriorityQueue. Тут очень полезный класс, для компоновки элементов по приоритетам.
SplFixedArray. Создаем массив с фиксированной длиной. Я могу забыть о стандартных массивах php и использовать SplFixedArray с ее методами? И кстати по индексу я могу обращаться и в SplDoublyLinkedList.
Я как понял, все классы выше работают как массивы и различие в них ну очень маленькое.
SplObjectStorage. Хранит массив объектов и ассоциирует указанные данные с объектами. Мне интересно, что может быть в тех данных? Описание объекта?
Оп, расскажи подробнее. Вот где грань между использованием SPL и встроенных функций php?
1) Какой "движок" для сайтиков с MySQL использовать?
Книжки вроде советуют InnoDB.
2) К каким аттрибутам ставить индексы в таблицах?
Гугл говорит, что индекс ускоряет чтение столбца и замедляет запись, т. е если у меня есть таблица с информацией о книгах и я выбираю всегда только их названия, то мне ставить индекс у столбца с названием книги?
А если для этой же таблицы я постоянно выбираю информацию из всех столбцов, то и индексы не нужны или, наоборот, их ставить у всех столбцов?
индексы ставятся на поля по которым идет выборка или сортировка. primary как правило на id.
Вот решение.
http://ideone.com/07tPq2
Вроде разобрался с операторами селекторов и разобрался в коде с хабра. Ну вот смотри, селекторы + и ~ используются, когда находятся в одном и том же блоке, а у меня там отдельно блок для кнопок(навигация) и блок с картинками. Попробовал вот так сделать: #tab1:checked .portfolio.pics.all { display: block; } - что-то не работает. Не пойму input:checked только с "+" и "~" работает?
\r\n
Ок, гляну. Кстати, что касается тестхаба, я наконец-то придумал новую, упрощенную версию, без групп и студентов, и даже смог на листочке нарисовать все страницы (впервые) надо будет потом обновить задачу.
Нельзя. Но можно сказать, что ноды с общим родителем организованы в друхсвязный список с помощью свойств previousSibling/nextSibling.
Он не циклический, у крайних нод там стоит null.
>>376707
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Во первых в phpstorm можно запускать и дебажить скрипты, что очень удобно. Не надо браузеров и прочего - просто нажми ctrl+alt+f10 и снизу будет результат работы. В этом окошечке и просто \n работает. А так да, есть фишка - в линупсах символ перевода строки \n в виндовсах \r\n. Надо учитывать этот момент когда будешь работать с текстом.
Интересно, почему у тебя в firefox все окей отображается, в то время как у меня без тега <meta charset="UTF-8"> в странице кракозябры. Заставил меня задуматься, я был уверен что это норма. Ide та же, браузер тот же.
>{0: 1, 1: 1, 2: 1, length: 3} — array-like
Но ведь это Object. Т.е проверка на array-like должна быть до проверки на Object?
>>376733
ну так функции и массивы это тоже Object.
В Windows \n прекрасно работает в консоли (но не в блокноте, но кто им пользуется?), так что можно использовать его.
Ну моя phpstorm например при нажатии на enter вставляет \r\n. Так что я когда делал задачки на текст с регулярками писал исходя из того что может быть либо \n либо \r\n
Потом обновлю текст задачи на гитхабе.
Анон, который делает GitHub, смотри, можешь делать как хочешь, по старому заданию или по новому или как-то еще.
>>376624
> Подскажите кто как вообще правильно в ооп сформулировать эту задачу и её решение.
Решать надо так:
- Определяем, какие сущности есть в задаче (очевидно, Департаменты и Работники)
- Определяем, какие у них есть свойства
- Определяем что можно с ними делать, то есть какие у них есть методы
- Определяем, как они свзяаны (Работники относятся к какому-то департаменту)
- Пишем код
> Вторую задачу пофиксил
> str_repeat(' ', $length - mb_strlen($string));
Тут отрицательное число выйти не может?
А так, все верно.
Не знаю, может тебе рейтинг 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
Не знаю, может тебе рейтинг 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
Базовый класс и функцию 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), то же самое, но можно добавить несколько элементов с одинаковым ключом
И может еще что-то. Хорошо бы кстати, в них разбираться.
Базовый класс и функцию 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), то же самое, но можно добавить несколько элементов с одинаковым ключом
И может еще что-то. Хорошо бы кстати, в них разбираться.
> 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
Не хочешь получить задачку реализовать все эти замечательные структуры данных?
Если алгоритм требует только вставлять и снимать данные с одного конца, то логично использовать стек, а не очередь — так как стек может быть реализован более эффективно.
>>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».
Если алгоритм требует только вставлять и снимать данные с одного конца, то логично использовать стек, а не очередь — так как стек может быть реализован более эффективно.
>>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».
Верно.
>>376683
Не, я имел в виду другое, только кнопки должны нажиматься и переключаться, пока без смены картинок.
>>376727
Аноны, обратите внимание, как удобно, тут же код пишешь и тут же во встроенной консольке запускаешь. Советую всем так делать.
>>376733
да, до.
>>376755
Ну ок тогда. Но это переключается настройкой «line endings -> unix» в настройках.
Так, твой код я гляну, но не сегодня, а может завтра, а то уже поздно. Вот, можешь пока посмотреть новые (очередные) наброски по тестхабу: https://gomockingbird.com/mockingbird/#l0bk13j
>Используй strtr или str_replace
>Это берет $i-й байт, а не букву. Соответственно, это работает с латиннцией и пробелом, но не будет работать с другими буквами, потому лучш вообще не использовать этот способ.
>Это лучше в переменную вынести чтобы каждый раз не считать
>Неприавльно определяет слово: http://ideone.com/Fg3qo8
переделал: http://ideone.com/pR7oEH
> - Определяем, какие сущности есть в задаче (очевидно, Департаменты и Работники)
Мне пока не очень очевидно. Как то так или херню написал?
Класс Департамент
Свойство - название
Свойство - руководитель
Свойство - кол-во менеджеров
Свойство - кол-во маркетологов
Свойство - кол-во инженеров
Свойство - кол-во аналитиков
Класс Сотрудник
Свойство - название
Свойство - является ли руководителем
Свойство - ранг
Свойство - зарплата
Свойство - потребление кофе
Свойство - траты страниц
> Тут отрицательное число выйти не может?
Случайно потер, изначально там была проверка. Вот вернул обратно, теперь в случае если слово больше то ставиться 1 пробел дабы не слипалось и слово обрезается до нужной длины с точкой на конце.
http://ideone.com/EmSs10
Используй git shell. Во первых это правильно, а во вторых без багов, как в том же Github for Windows.
Туториал по работе с консолью: https://try.github.io/levels/1/challenges/1
На английском, да, зато очень годно для новичка.
И консоль, на мой взгляд, удобней и понятней, если разобраться с командами.
Спасибо, думаю что на перевес с гугл-транслейтом таки разберусь.
6. http://jsbin.com/labozapa/10/edit
12. http://jsbin.com/labozapa/10/edit - как-то тяжко. Код пока полностью нерабочий, так как сначала надо нормально сформировать класс. Так что смотри только свойства, к методам я пока не прикасался.
Правильно ли я понимаю, когда мы пишем что-то подобное: Hamburger.type[Hamburger.SIZE_SMALL] у конструктора Hamburger появляется объект type с свойством-объектом SIZE_SMALL?
Не могу понять, как создать массив у конструктора?(покажи на примере) Там же все индексы будут числовыми, а ты говоришь что так будет непонятно.
Уже вижу что обосрался. Бля.
Есть массив из 3 элементов: [a, b, c]. Элемент a иммет индекс 0, b - 1, c - 2.
Другими словами, максимальный элемент массива = длина - 1.
И читай ошибки, где PHP Notice.
2) http://codepad.org/HKx6VrGx как тут с dirname и basename сделать?
3) http://codepad.org/PVHzlvj8 - по мне он работает, в чем дело?
http://codepad.org/9PpOdd15 - этот поправил
Недолгой была радость.
Почему, если я загружаю файл, то все ок, он загружается. Но, стоит мне попробовать загрузить папку, выдает ошибку:
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);
Хотя, файлы загружает окей.
>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
http://jsbin.com/buzade/34/edit?js,console
Hamburger.prices is not a function. Что я делаю не так?
Вот, например, пишу генератор текста для своих дурачеств, в бд хранятся шаблоны, по которым текст генерируется, и есть выбор: хранить в бд 2 варианта одного и того же шаблона с некоторыми различиями и в скрипте минимально обрабатывать, или хранить в бд один вариант, а в скрипте уже "нагруженнее" обрабатывать (куча регулярок).
Сам думаю, что пока записей в бд не миллионы лучше хранить 2 варианта. Поделитесь советом мудрым, пожалуйста.
Переделал - https://github.com/infinitecats/infinitecats. Блок навигации в ие8 починить не удалось. Там чего-то длина кнопок увеличивается само по себе.
И да, почему-то в портфолио в блоке навигации не получается переключиться на вкладку "ALL". Почему?
http://ideone.com/hqlOMT
Функция работает для двух шагов, но если их там больше двух, ничего не возвращается. Как я понял она зацикливается на остановке спортивной и чикаловской, так как первые элементы их массивов обращаются друг-другу. Чего я только не перепробовал, ставил unset Везде, но это не помогло, т.к цикл даже не доходит до конца, сделал специальный массив, для проверки на повторяющиеся ключи, но всё бестолку.
Чтобы понимать jQuery, нужно изучить "чистый javascript". jQuery - всего лишь библиотека, которая упрощает жизнь, и которая написано на "чистом javascript", который ты сейчас и изучаешь.
http://jsbin.com/hekole/6/edit?js,console
В правильном направлении иду? Куда дальше смотреть?
Доброанон, проверь задачи из урока по строкам
Задачи про стихи - http://codepad.org/h8AP0wYp
Задача про палиндром - http://ideone.com/2y7o1L
На будущее: пробелы, да и любые символы можно заменять функцией str_replace или preg_replace.
Анон, я посмотрел код, вот мысли по этому поводу, писать постараюсь кратко.
Вообще, я вижу, сделано неплохо, видно что ты в Юи разбираешься, уже там расширения свои пишешь, это хорошо. Старайся только поменьше логики в контроллерах писать.
Почему ты 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/ — такая будет работать надежнее.
При ошибке активации не надо редиректить на главную — надо написать об ошибке и что делать пользователю. Вообще, молча редиректить куда-то — плохая идея.
Анон, я посмотрел код, вот мысли по этому поводу, писать постараюсь кратко.
Вообще, я вижу, сделано неплохо, видно что ты в Юи разбираешься, уже там расширения свои пишешь, это хорошо. Старайся только поменьше логики в контроллерах писать.
Почему ты 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/ — такая будет работать надежнее.
При ошибке активации не надо редиректить на главную — надо написать об ошибке и что делать пользователю. Вообще, молча редиректить куда-то — плохая идея.
Насчет таблицы и модели 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 сделать?
Насчет таблицы и модели 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 сделать?
> 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 (так как приложение достаточно сложное — неплохо бы иметь средства для его проверки). То есть тесты например, когда бот проходит форму регистрации и проверяет что она выдает ошибки или наоборот пропускает регистрацию, и т.д.
Ты что по поводу написания тестов думаешь? Я в течение недели в любом случае постараюсь пасту-инструкцию на эту тему написать.
> 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 (так как приложение достаточно сложное — неплохо бы иметь средства для его проверки). То есть тесты например, когда бот проходит форму регистрации и проверяет что она выдает ошибки или наоборот пропускает регистрацию, и т.д.
Ты что по поводу написания тестов думаешь? Я в течение недели в любом случае постараюсь пасту-инструкцию на эту тему написать.
>>376815
Ок, теперь верно.
>>376816
> , find the sum of the even-valued terms.
надо складывать только нечетные числа. А ты складываешь все (я проверил твой ответ на сайте — неверно).
>>376834
Частично правильно.
> Свойство - кол-во менеджеров
Твой вариант не позволит посчитать зарплату, так как ты знаешь количество менеджеров, но не знаешь какого они ранга. Потому от этого свойства пользы нет.
Лучше свойством сделать «работники». То есть в департаменте есть массив его работников. Ну и шеф тоже должен быть свойством департамента.
> Свойство - зарплата
Я думаю, свойством логично сделать базовую ставку. Зарплату в любой момент можно посчитать, зная базовую ставку, ранг и является_ли_руководиетлем, это не первичная информация, значит ее можно не хранить.
Ну и думаю, в этой задаче стоит использовать наследование. У разных видов работников есть много общего, потому можно сделать абстрактный базовый класс Сотрудник и от него унаследовать сотрудников разных профессий.
Если ты не знаешь что такое наследование, то это создание класса на основе существующего. Ты можешь взять класс за основу и добавить или переопределить свойства и методы. Абстрактный класс обозначает что объект класса нельзя создать, но от этого класса можно наследоваться. Подробнее ты можешь прочесть в маунале, гугле или книге Мэтта Зандстры из ОП-поста.
>>376815
Ок, теперь верно.
>>376816
> , find the sum of the even-valued terms.
надо складывать только нечетные числа. А ты складываешь все (я проверил твой ответ на сайте — неверно).
>>376834
Частично правильно.
> Свойство - кол-во менеджеров
Твой вариант не позволит посчитать зарплату, так как ты знаешь количество менеджеров, но не знаешь какого они ранга. Потому от этого свойства пользы нет.
Лучше свойством сделать «работники». То есть в департаменте есть массив его работников. Ну и шеф тоже должен быть свойством департамента.
> Свойство - зарплата
Я думаю, свойством логично сделать базовую ставку. Зарплату в любой момент можно посчитать, зная базовую ставку, ранг и является_ли_руководиетлем, это не первичная информация, значит ее можно не хранить.
Ну и думаю, в этой задаче стоит использовать наследование. У разных видов работников есть много общего, потому можно сделать абстрактный базовый класс Сотрудник и от него унаследовать сотрудников разных профессий.
Если ты не знаешь что такое наследование, то это создание класса на основе существующего. Ты можешь взять класс за основу и добавить или переопределить свойства и методы. Абстрактный класс обозначает что объект класса нельзя создать, но от этого класса можно наследоваться. Подробнее ты можешь прочесть в маунале, гугле или книге Мэтта Зандстры из ОП-поста.
Есть клиент для командной строки и учебник на русском, официальный: 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-й задачи.
Есть клиент для командной строки и учебник на русском, официальный: 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-й задачи.
Всего получается около 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 — дает неприавильный ответ
Всего получается около 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 — дает неприавильный ответ
Собираемся.
>>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 — а то можно накопировать свойств из прототипов.
Собираемся.
>>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 — а то можно накопировать свойств из прототипов.
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-класс
});
Если скрипт не заработает — пиши. Там можт надо имена классов еще подправить.
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-класс
});
Если скрипт не заработает — пиши. Там можт надо имена классов еще подправить.
>>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 не копируется.
>>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 не копируется.
>>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?
Хм, надо подумать.
>Ты что по поводу написания тестов думаешь?
Думаю, что идея хорошая, но не знаю как по времени у меня получится. Инструкция в любом случае не помешает.
>>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?
Хм, надо подумать.
>Ты что по поводу написания тестов думаешь?
Думаю, что идея хорошая, но не знаю как по времени у меня получится. Инструкция в любом случае не помешает.
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
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
Далее. Что это за функции, которые болтаются сами по себе? 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 вместо цикла
А так, в остальном все верно.
Далее. Что это за функции, которые болтаются сами по себе? 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 вместо цикла
А так, в остальном все верно.
Ой-ой-ой, как все страшно.
Проверку где много !== можно и нужно заменить поиском в словаре:
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.
Ой-ой-ой, как все страшно.
Проверку где много !== можно и нужно заменить поиском в словаре:
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.
> 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. Сделай-ка, кстати.
> 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. Сделай-ка, кстати.
Насчет тестов, тогда, посмотрим, когда я напишу инструкцию. Вообще, тестирование — вещь полезная, мало где ее делают, конечно, но например Яндекс и Баду очень много пишут тестов — на Хабре можно найти статьи на эту тему. То есть это удел передовых компаний, а мы на них и ориентируемся, а не на подвальную студию по клепанию сайтов за мкадом.
Когда приложение делает несколько человек, и тем более когда их больше десяти, тестировать приходится постоянно — один программист легко может сломать что-то, что делал другой, так как объем кода большой, он не идеальный, местами запутанный отсюда и проблемы. И ты либо пишешь автоматические тесты, либо каждый релиз тестирует команда живых тестеров (это часто встречается), либо сами программисты (самый плохой вариант так как они забивают на это). И чем больше приложение становится, тем тяжелее его руками тестировать каждую неделю.
Есть еще вариант вообще не тестировать, пусть заказчик сам разбирается, но я не думаю, что он долго будет это терпеть.
Тесты конечно тоже имеют недостатки — их надо писать, зачастую объем соспоставим с основным кодом, если они неудачно написаны, то придется их переписывать при изменениях в коде, так что это отдельная наука.
На php делал все задания по ООП, на мышах застрял, ну и я пообещал себе сделать позже, т.к. js для работы нужен.
>искать надо не в check, а в накопленном к данному моменту пути, то есть видимо path.
Ну так check это и есть массив накопленного пути, а в path у нас записаны все точки.
Спасибо ОП!
Ты меня вдохновляешь, поправил с учетом твоих замечаний свои задачки про строки.
Перекатываюсь в новый тред.
http://codepad.org/wI2nuCDT- про стихи
http://ideone.com/IhBSXJ - про палиндром
Я имел в виду надо искать в $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]"
Тут надо либо кавычки убрать вокруг переменной либо точку и пару кавычек.
> про палиндром
Все праивльно.
Я имел в виду надо искать в $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]"
Тут надо либо кавычки убрать вокруг переменной либо точку и пару кавычек.
> про палиндром
Все праивльно.
Задачка про айфон, совсем я ещё зелёный, потому получилась только с костылями. Но почему у меня и у анона (http://codepad.org/EwrDcjCS) получился разный $paymentTotal? Где ошибка?
Это копия, сохраненная 6 сентября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.