Сохранен F 507
https://2ch.hk/pr/res/327422.html
Изменился адрес Архивача в сети Tor — arhivachqqqvwqcotafhk4ks2he56seuwcshpayrm5myeq45vlff44yd.onion. Установите Tor Browser для беспрепятственного доступа!

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

 !xnn2uE3AU. Срд 16 Окт 2013 14:02:08  #1 №327422 
1381917728470.png

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

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

Требуемые знания: умение включить компьютер и пользоваться браузером. Если вы читаете этот текст, они у вас, скорее всего, уже есть. Устанавливать и скачивать пока что ничего не требуется, разве что редактор кода вроде Notepad++ или Sublime (необязательно).

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

Предыдущий тред: >>320929

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

Оформляй код правильно!!! например пропусти через phpformatter.com

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

Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/?vz0z5134irhn2zl (треды 1-10, 160 Мб) http://www.mediafire.com/?3zxb19z9j2q5gf2 (11-19, 74 Мб) и на дропбоксе: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)

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

Решил сложную задачу? Покажи решение, может оно не такое уж и правильное.

Куда постить код Удобнее всего на ideone. Пости ссылку на ideone, код копипастить не надо. Еще, говорят, модно постить на instacode. HTML, CSS и JS постят на jsbin.com

Как привести код в аккуратный вид? Закачай его на phpformatter.com, робот его выровняет как надо.

Решил задачу, но ничего не понял? Попроси еще пару для закрепления знаний.

В общем, хватит разговоров, давайте начинать уже!

Loading...
Хороший код — красивый код !xnn2uE3AU. Срд 16 Окт 2013 14:04:42  #2 №327424 
1381917882743.png

Код надо писать не как придется, а аккуратно и красиво. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока.

Самый распространенный стандарт оформления — это Zend Coding Guides (http://framework.zend.com/manual/1.12/en/coding-standard.html — на англ. яз.), вот их суть:

- переменные и функции пишутся с маленькой буквы, _ не используется, используется 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 makeMeFeelGood(...)
{
// ...
}


В общем, пиши как на картинке, и проблем не будет.
!xnn2uE3AU. Срд 16 Окт 2013 14:21:39  #3 №327435 

>>327273
Кто-то просил задачу на ООП и деревья. Держите:

Задача на ООП.

Есть такая структура данных «дерево». Теория: http://ru.wikipedia.org/wiki/Дерево_(структура_данных) Дерево состоит из узлов, начинается с корневого узла, и каждый узел может иметь дочерние узлы.

С помощью деревьев можно представить самые разные вещи: структуру папок и файлов на диске, меню сайта с подразделами, категории товаров в каталоге, содержимое XML-файла и много чего еще.

Задание 1: реализуй образцовое дерево с использованием принципов ООП. У узлов дерева должны быть такие методы:

$node->getParentNode(); // Возвращает родителя или null, если родителя нету
$node->getChildren(); // Возвращает массив всех детей $node
$node->getAllParents(); // Возвращает массив всех предков, начиная с корня дерева, заканчивая родителем узла. Массив может быть пуст, если у $node нет родителя
$node->getDepth(); // Возвращает глубину дерева (расстояние до самого дальнего потомка, 0 если у $node нет детей, 1 если есть дети, но у них нет детей, и так далее)
$node->getDescendantsCount(); // Число всех потомков узла

$node->appendChild($child); // делает $node родителем $child
$child->remove(); // если у $child был родитель, то $child удаляется из его списка детей и становится отдельным узлом

$node->getNextSibling() // возвращает следующего «брата» $node, то есть узел, который идет в списке детей сразу после $node, или null если такого нету.
$node->getPreviousSibling(); // то же, но возвращает предыдущий узел
$node->walk(function ($child) {
...
});
// обходит всех потомков $node, для каждого вызывая функцию

Задание 2: после того, как ты сделал просто дерево, тебе нетрудно будет на его основе сделать дерево-меню из таких пунктов:


Электроника Бытовая техника Компьютеры Справка

- Телевизоры - Холодильники - Настольные - О нас
- Плееры - Пылесосы - Ноутбуки - Доставка
DVD-плееры - Стиральные машины Apple - Оплата
MP3-плееры Другие
- Фотокамеры - Планшеты
- Принтеры


Надо сделать такое дерево меню, и написать код для его вывода в таком виде. Пункты первого уровня выводятся в строчку, пункты второго, третьего и т д — вертикально, причем для каждого следующего уровня добавляется отступ в 2 пробела. Расстояние между вертикальными колонками - 4 пробела.
!xnn2uE3AU. Срд 16 Окт 2013 15:36:55  #4 №327455 

Задача про калькулятор на ООП

http://pastie.org/8406173 (ссылкой так как много текста)

Задача про города, не на ООП

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

Дан список городов России и США в виде страна-город-население (обрати внимание, создание массива через квадратные скобки работает только начиная с PHP5.4):


$cities = [
["Россия", "Moscow", "Москва", "мск", 11514330],
["Россия", "Saint-Petersburg", "Санкт-Петербург", "спб", 4848742],
.....
["США", "New York", "Нью-Йорк", "ny", 8 175 133],
["США", "Los Angeles", "Лос-Анджелес", "la", 3 792 621],
...
];


Списки городов можно взять тут: http://ru.wikipedia.org/wiki/Список_городов_России и тут: http://ru.wikipedia.org/wiki/Список_городов_США_с_населением_более_100_тысяч_жителей#.D0.A1.D0.BF.D0.B8.D1.81.D0.BE.D0.BA_.D0.BF.D0.BE_.D0.BD.D0.B0.D1.81.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8E (достаточно взять первые 20 самых начеленных из каждой страны). Заметь, что у каждого города есть русское название, английское название и, для некоторых, сокращенное название.

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

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

Выводить результат можно в таком виде:


Вы ввели: сан

Санкт-Петербург
Россия, 4.5 млн.чел.

Сан-Андреас
США, 3 млн. человек

!xnn2uE3AU. Срд 16 Окт 2013 19:52:41  #5 №327531 

Анон с бородой, тебе ответ в предыдущем треде >>327372

Аноним Чтв 17 Окт 2013 02:19:39  #6 №327630 

>>327455
> Калькулятор
> обратная польская нотация
> советую использовать ООП, так как иначе код быстро превратится в лапшу.
Лолшто? Там же одна рекурсивная фукнция, какое ещё ООП?

!xnn2uE3AU. Чтв 17 Окт 2013 02:34:05  #7 №327633 

>>327630

Обратная польская нотация − для слабаков. Мы предлагаем использовать полноценный парсер и AST.

Аноним Чтв 17 Окт 2013 02:36:54  #8 №327634 

>>327630
Как бэ намекаешь на то, что в ООП не можгут быть использованы рекурсивные функции.

Аноним Чтв 17 Окт 2013 02:49:02  #9 №327635 

>>327435
Задание 1.

http://ideone.com/c0WNtU

Функция removeChild($child) и appendParent($child являются продолжениями функциё remove() и appendChild() соответственно. Потому и не имеет смысла их использование вне этих функций. Как запретить их вызов другими функциями или пользователем. Подобно тому как лычка protected запрещает обращатся к переменной из другого обьекта.

Вызвало смущение эта часть задания. Поясни на сколько я верно понял.
public function walk(function ($child) {
...
});
// обходит всех потомков $node, для каждого вызывая функцию

В общем и целом, как то так.

Аноним Чтв 17 Окт 2013 03:25:42  #10 №327639 

Хочу стать пхп резус макаком, но слишком ленив.
Бтв опу добра.

Аноним Чтв 17 Окт 2013 05:07:50  #11 №327646 

Так. Аноны, выручайте. Не могу понять, что от меня хотят. Почти прошел курс на http://archive-ipq-co.narod.ru. Но на кодакадеми не могу понять, чего все таки требуется сделать? Делал все как сам понимаю, по знаниям полученным в >archive-ipq-co.narod.ru , но ни чего не выходит.

Ссылка на урок:http://www.codecademy.com/courses/web-beginner-en-ZQQ64/0/6?curriculum_id=5124ef4c78d510dd89003eb8#

Аноним Чтв 17 Окт 2013 07:37:41  #12 №327651 

>>327646


<!DOCTYPE html>
<html>
<head>
<title>Reconstructing the Person Class</title>
<link type='text/css' rel='stylesheet' href='style.css'/>
</head>
<body>
<p>
<?php
class Person {
public $isAlive = true;
public $firstname;
public $lastname;
public $age;

public function __construct($firstname,$lastname,$age){
$this->firstname = $firstname;
$this->lasttname = $lastname;
$this->age = $age;
}

public function greet() {
return "Hello, my name is " . $this->firstname . " " . $this->lastname . ". Nice to meet you! :-)";
}
}

$teacher = new Person("boring","12345",12345);
$student = new Person("Hello","Hi",33);

echo $student->age;
echo $teacher->greet();
echo $student->greet();
?>
</p>
</body>
</html>
Аноним Чтв 17 Окт 2013 14:21:32  #13 №327720 

>>327633
Теперь понятно, там просто в тэгах стоит "обратная польская запись", а в самом задании уже написано про приоритет операций.

!xnn2uE3AU. Чтв 17 Окт 2013 17:17:00  #14 №327779 

>>327635

>>327635

> Не забыть спросить о том, как запретить её вызов другими функциями
> или пользователем подобно тому как лычка protected запрещает обращатся к переменной
> из другого обьекта

Очень просто, пиши protected function или private function. Если функция объявлена как private, то ее можно вызвать только из этого же класса (Node), но не обязательно из того же самого объекта. То, есть вот это:

$child->appendParent($this);

будет работать, а снаружи класса вызвать appendParent будет нельзя. То же самое и с private свойствами, из класса Node ты можешь обращаться в том числе и к свойствам других объектов, не только $this->root, но и $child->root. Посмотри пример 3 в мануале: http://php.net/manual/ru/language.oop5.visibility.php

> Функция walk
Почти правильно, но надо сделать не так: $child->$function(), а так: $function($child). То есть, мы вызываем переденную нам функцию на каждом потомке. У тебя, кстати, вызывается только на детях. Если ты не очень понимаешь, что значит $function и как можно передавать одну функцию в другую, можешь почитать мануал:

http://www.php.net/manual/ru/functions.variable-functions.php
http://www.php.net/manual/ru/functions.anonymous.php

В PHP ссылку на функцию можно сохранить в переменную и потом вызывать ее через эту переменную

Еще из багов: если узел принадлежил одному родителю, и его добавить другому, то он не удаляется из детей первого родителя: http://ideone.com/BT2s4R - node3 там есть в обоих деревьях

Еще из багов: при удалении узла список детей родителя не меняется http://ideone.com/ZamL6k

Советы по коду и оформлению.

Я бы переименовал некоторые свойства и методы, чтобы было логичнее:

root → parent
seed → children
getChildrenNode → getChildren или getChildrenNodes (чтобы было понятно, что детей может быть много)
appendParent → setParent
getAllChildren → getAllDescendants (children — значит дети, а descendants — потомки, там правильнее)

Вот тут:

$seedDepth = $seed->getDepth();
if ($depth < $seedDepth) {
$depth = $seedDepth;
}

можно написать просто $depth = max($depth, $seed->getDepth());

> unset($this->root);
Лучше бы написать $this->root = null, а не удалять свойство. Вообще, нехорошо удалять свойства у объектов.

> foreach ($seeds as $seed) {
> if ($seed == $child) {
> unset($child);

Это просто удаляет переменную $child, а массив $seeds остается неизменным. Более того, $seeds — это копия $this->seeds, и даже если ты что-то в нем удалишь, $this->seeds останется тем же самым.

Кстати, вместо того, чтобы писать foreach и if, можно попробовать использовать функцию поиска в массиве array_search — будет же проще.

!xnn2uE3AU. Чтв 17 Окт 2013 17:20:48  #15 №327783 

>>327639

А ты попробуй, это один из самых простых языков.

!xnn2uE3AU. Чтв 17 Окт 2013 17:31:38  #16 №327785 

>>327635

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

appendChild() должен запрещать добавлять узел в дети самому себе. То есть, такой код:

$node->appendChild($node);

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

appendChild должен позволять добавлять в дети только узлы класса Node или его наследников, а не что попало:

$node->appendChild(123);
$node->appendChild("Hello");
$node->appendChild();
$x = new MyClass();
$node->appendChild($x);

Все эти вызовы должны выдавать либо фатальную ошибку, либо исключение. Проще всего такую защиту сделать с помощью type hints: http://php.net/manual/ru/language.oop5.typehinting.php

Аноним Чтв 17 Окт 2013 19:15:28  #17 №327819 

>>327633
У меня на Clojure 41 строкa получилось, считая импорты и пустые строки. Без ООП, без приведения в обратную польскую нотацию.
Ideone, к сожалению, не умеет импортировать библиотеки, но просто показать как выглядит код:
http://ideone.com/i0UJ7U

!xnn2uE3AU. Чтв 17 Окт 2013 19:23:08  #18 №327821 

>>327819

Можно порадоваться, что в Clojure есть библиотека для создания парсеров. Я правда не вижу, соблюдается ли приоритет и лево/право-ассоциативность операторов, и сохраняются ли дроби вроде 1/3.

Вообще предполагается, что эта задача решается через построение AST и recursive descent (а не через преобразование в ОПН), ради изучения этих понятий и развития навыков работы с объектами.

Аноним Чтв 17 Окт 2013 19:29:04  #19 №327822 

>>327651
Все оказывается было так же, как ты и написал, кроме одного момента:
echo $student->age;
echo $teacher->greet();
echo $student->greet();
Спасибо, бро. Разобрался благодаря тебе :3

Аноним Чтв 17 Окт 2013 20:03:45  #20 №327830 
1382025825447.png

>>327821
Библиотека и правда хорошая. Приоритет соблюдается - пикрелейтед. Дроби вроде 1/3 сохраняются и сокращаются на уровне самого языка.

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

В курсе Programming Languages на Coursera последним заданием как раз было написать один и тот же вычислитель в ООП стиле на Руби и в ФП стиле на ML. В итоге на Ruby кода получалось раза в 2 больше, ещё и double dispatch приходилось делать.

!xnn2uE3AU. Чтв 17 Окт 2013 20:31:04  #21 №327838 

>>327830

Если ты используешь готовую библиотеку, то да, потому что все сводится к объявлению правил и большому switch (или как там это называется). Но если мы пишем на PHP и с нуля, то лучше ООП. Так как то дерево, которое у тебя на рисунке, удобно представить деревом из объектов.

А вот синтаксис со скобками мне не нравится. Не представляю, как в таком стиле писать что-нибудь больше 200 строчек.

Аноним Чтв 17 Окт 2013 20:31:57  #22 №327839 

Суп /пр/. Нужна помощь. Прошел весь курс на codeacademy, кроме
http://www.codecademy.com/ru/courses/web-beginner-en-ZQQ64/0/10?curriculum_id=5124ef4c78d510dd89003eb8#
Не могу понять что ему от меня нужно?

Аноним Чтв 17 Окт 2013 20:33:39  #23 №327841 

>>327779
root → parent

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

$this → parent

Это нужно попросту игнорировать?

Аноним Чтв 17 Окт 2013 20:39:25  #24 №327845 

>>327838
Но ведь дерево не обязательно состоит из объектов.
Та библиотека просто возвращает дерево из вложенных массивов, в начале каждого массива стоит символ обозначающий тип элемента. Потом рекурсивная функция это дерево парсит. То есть "поведение" не прицеплено к каждому конкретному типу узлов, а сосредоточено для всех узлов сразу в одной большой фукнции. И на PHP тоже так можно написать.

!xnn2uE3AU. Чтв 17 Окт 2013 21:20:21  #25 №327852 

>>327841

> Меня смутило, что переменная parent выделяется синим текстом как зарезервированное слово.
Ох, что-то я об этом не подумал. Действительно, parent присутствует в списке зарезервированных названий классов в мануале, и нехорошо его использовать, так что давай назовем parentNode.

Аноним Чтв 17 Окт 2013 21:23:23  #26 №327854 
1382030603066.png

Я хочу получить одинаковый отступ со всех сторон. Делаю во внутреннем диве width:100% и margin:5px. В результате ширина остается неизменной и вылазит за границы из-за отступа сверху и слева. Что я делаю не так?

!xnn2uE3AU. Чтв 17 Окт 2013 21:23:29  #27 №327855 

>>327845

Если заменять объекты на массивы, по мере роста кода все это превращается в бардак гораздо быстрее. Потому я за ООП. У нас в PHP тоже можно программировать на массивах, и так часто делают, и получается какой-нибудь Друпал. Потому не надо так делать.

> То есть "поведение" не прицеплено к каждому конкретному типу узлов, а сосредоточено для всех узлов сразу в одной большой фукнции. И на PHP тоже так можно написать.

На твоем скрипте из 40 строчек разницы не видно, но ООП-код растет и расширяется гораздо лучше. А заменять объекты с методами на массив + набор не связанных функций = увеличивать степень беспорядка.

!xnn2uE3AU. Чтв 17 Окт 2013 21:29:28  #28 №327859 

>>327854

Почитай про боксовую модель тут: http://softwaremaniacs.org/blog/2005/07/08/css-boxes/ — width по умолчанию относится к внутренней ширине, а не в внешней.

Чтобы сделать блок с отступами 5px достаточно поставить margin и все. При display: block ширина вычисляется втоматически, чтобы соответсвовать ширине родителя (потому width 100% писать не надо, если кто-то пишет так то это значит только что он не разбирается в CSS).

Советую прочесть вообще весь учебник по позиционированию в CSS отсюда — это одно из самых простых объяснений всех этих вещей: http://softwaremaniacs.org/blog/2005/07/08/css-boxes/ (читать надо снизу вверх)


Аноним Чтв 17 Окт 2013 21:32:21  #29 №327861 

>>327859
ок, пасиба

Аноним Чтв 17 Окт 2013 21:32:24  #30 №327862 

>>327855
Ну фиг знает, в общем, у каждого свое мнение. Порядок по-разному можно себе представлять: можно называть порядком разделение друг от друга разных типов данных, а можно называть порядком разделение между данными и функциями. Мне лично второй тип порядка больше нравится. Вряд ли что-то однозначно лучше, от области применения зависит.

!xnn2uE3AU. Чтв 17 Окт 2013 21:33:24  #31 №327863 

>>327839

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

> Instructions
> echo the following sentence: "Now I know the basics of OOP!".

!xnn2uE3AU. Чтв 17 Окт 2013 21:39:49  #32 №327864 

>>327861

Почитай еще потом про margin collapsing. А то будешь удивляться, почему 2 маргина по 10px склеиваются в один.

!xnn2uE3AU. Чтв 17 Окт 2013 21:42:06  #33 №327865 

>>327862

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

Аноним Чтв 17 Окт 2013 22:08:49  #34 №327871 

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

!xnn2uE3AU. Чтв 17 Окт 2013 22:18:40  #35 №327877 

>>327871

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

Аноним Чтв 17 Окт 2013 22:59:31  #36 №327897 
1382036371856.png

>>327863
На самом деле, это не последний урок в целом, но, видимо, последний урок от этого автора. После него идут еще 2 главы.
Но, не суть.
Проблема в том, что при попытке следовать инструкции, т.е. просто вывести строчку "Now I know the basic of OOP!".
Всплывает сообщение как на моем пике.
По сути, это задание ничего не дает, просто хочется ачивку.

!xnn2uE3AU. Птн 18 Окт 2013 00:09:14  #37 №327920 
1382040554898.png

>>327897

Я просто скопипастил текст и все сработало. Может, у тебя что-то лишнее набрано или удалено? Смотри мой пик.

Кстати, не вздумай на этом заканчивать обучение, это только начало ООП, изучай его дальше.кстати, на сайте в разделе «Пасты и ООП» есть задачки на ООП, и еще пара задачек есть тут в треде в начале

Аноним Птн 18 Окт 2013 00:46:08  #38 №327930 

>>327920
Лол, и правда сработало, спасибо!
Кажется, я просто забыл S в конце слова basics.
И да, обучение продолжу, спасибо тебе еще раз и добра!

Аноним Птн 18 Окт 2013 12:20:42  #39 №327994 

>>327877
А разве в ПХП есть контроль типов?

IchiMuck Птн 18 Окт 2013 14:04:32  #40 №328006 

http://ideone.com/hJdW9E Задачка про школьника и айфон в кредит. Что я делаю не так?

ОП - няша и молодец. Очень тебе благодарен.

IchiMuck Птн 18 Окт 2013 14:08:33  #41 №328007 

>>328006
Не в плане решения. Знаю, что со счетом там неверно. А почему он не считает после одного раза, и цикл не идет?

Аноним Птн 18 Окт 2013 14:13:06  #42 №328008 

>>328006
Убери ; в 17 строчке, после условия для if.

!xnn2uE3AU. Птн 18 Окт 2013 14:26:26  #43 №328011 

>>327994

Есть type hints для аргументов функций для классов и массивов. Для чисел и строк нет, но варианты обсуждаются (так как надо учесть возможности по конвертированию чисел в строки).

http://php.net/manual/ru/language.oop5.typehinting.php

>>328008

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

IchiMuck Птн 18 Окт 2013 14:36:42  #44 №328012 

>>328008
Работает. Спасибо

!xnn2uE3AU. Птн 18 Окт 2013 14:42:41  #45 №328013 

>>328012

Проверь, считается ли кредит верно, если взять маленький долг. Для долга в 1000 должно получаться выплачено примерно 2030, для долга в 4000 должно быть около 6123.

Аноним Птн 18 Окт 2013 21:42:08  #46 №328120 

>>327779
>http://www.php.net/manual/ru/functions.anonymous.php

3-ий пример из мануала до сих пор не могу понять, что делает use в программе. Опиши в кратце что б я понял.

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

IchiMuck Птн 18 Окт 2013 22:10:21  #47 №328123 

Опять я. Вроде все нормально со счетом. Но break останавливает на предпоследней сумме. Хотя без break долг = 0, как и должно быть
http://ideone.com/hJdW9E

Аноним Птн 18 Окт 2013 22:33:39  #48 №328128 
1382121219588.jpg

>>327455
>Задача про калькулятор на ООП
Без ООП, но в хаскеле его и нет, зато парсер монадический. Пока не сделаны дроби, т.к. было лень. Если будет время, то потом сделаю.
Без тестов укладываюсь в 80 строк. Можно было бы и короче, если не реализовывать typeclass'ы.

http://ideone.com/3iwkxg

Аноним Птн 18 Окт 2013 22:44:46  #49 №328130 
1382121886123.jpg

>>328120
use позволяет использовать переменные из родительской области видимости. Т.е. пусть у тебя объявлена, например, переменная $myVariableForClosure и ты хочешь тут же объявить анонимную функцию и использовать эту переменную. Тогда её надо указать в use при определении этой функции, иначе использовать её не выйдет, т.к. интерпретатор не будет знать из какой области видимости её брать.

Аноним Птн 18 Окт 2013 23:27:57  #50 №328140 

>>328130
то есть в этой строчке
function ($quantity, $product) use ($tax, &$total)

use запихивает переменные $tax и &$total внутрь функции.

Аноним Суб 19 Окт 2013 01:50:58  #51 №328163 

>>327531
Я опять выхожу на связь. Вроде поправил косяки и попробовал прикрутить профайлер. Вот мой говнокод:
https://github.com/melanchthon/board
Посмотри на досуге, пожалуйста

Аноним Суб 19 Окт 2013 03:31:09  #52 №328173 

http://ideone.com/d1WhYM - задание про компанию "Вектор". Объекты в PHP, часть 2.
Проверь пожалуйста, ОП.
И обрати внимание на метод getSalary(), как правильнее будет - с использованием локальных переменных или просто через return?

!xnn2uE3AU. Суб 19 Окт 2013 04:03:53  #53 №328176 

>>328120

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

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

use ($tax, &$total) передает $tax по значению (то есть копию), а переменную $total по ссылке внутрь функции.

При этом (важный момент) переменные привязываются к функции в момент ее создания. Посмотри этот пример: http://ideone.com/5JVxbf и попробуй разобраться, что и почему там происходит.

Такая функция, вместе с привязанными к ней через use переменными, называется еще замыканием.

Зачем нужны замыкания? Эта мода пришла из функциональных языков программирования и они позволяют делать всякие интересные вещи. Например, их удобно использовать вместе с array_map, array_filter, array_reduce и подобными функциями. Вот пример их использования: http://ideone.com/Ff709f

Еще замыкание можно исплоьзовать совсемстно с preg_replace_callback: http://ideone.com/ZPPhfI

Если интересно, посмотри примеры, почитай мануал, освой все эти хитрые техники.

!xnn2uE3AU. Суб 19 Окт 2013 04:04:56  #54 №328177 

>>328120

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

Это совсем другое. Пространства имен — это когда use написан в начале файла в таком виде:

use Some\Namespace;

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

!xnn2uE3AU. Суб 19 Окт 2013 04:15:35  #55 №328179 

>>328123

Ты на последней сумме, которая перед break, выводишь данные? Может ты их поменял, а вывести забыл?

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

Аноним Суб 19 Окт 2013 04:21:32  #56 №328180 

>>328176
> Зачем нужны замыкания? Эта мода пришла из функциональных языков программирования и они позволяют делать всякие интересные вещи. Например, их удобно использовать вместе с array_map, array_filter, array_reduce и подобными функциями. Вот пример их использования: http://ideone.com/Ff709f
У тебя каша в голове.

!xnn2uE3AU. Суб 19 Окт 2013 04:29:51  #57 №328181 

>>328128

Странно, я думал монады нужны для организации ввода/вывода. Ты точно ничего не перепутал?

И честно говоря, для меня (человека, не знающего Хаскелл) твоя программа не сильно отличается от Перла. Всюду какие-то запутанные значки и сокращения.

!xnn2uE3AU. Суб 19 Окт 2013 04:39:04  #58 №328182 

>>328180

Разве не из функциональных?

>>328173

Просто через return вполне годится, так как выражение тут простое.

Я бы число 40 сделал константой — а то завтра наступит кризис и нормой станет не 40, а 60 часов работать, чтобы менять весь код не надо было. В остальном, все верно. Ты даже функцию mb_str_pad где-то сам нашел, молодец.

!xnn2uE3AU. Суб 19 Окт 2013 06:01:44  #59 №328183 

>>328163

Вообще, пока неплохо получается. Я вижу, что у тебя борда более-менее готова к испытаниям, так что как будет время (на выходных не обещаю, наверно на следующей неделе), я попробую подключить к ней код из https://github.com/codedokode/board-test-scripts чтобы потестировать на скорость работы на большом числе тредов. Ну или ты можешь сам попробовать, но не знаю, разберешься ли.

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

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

> $lastPostId = $posts[$postsPerPage-1]->id;
Постов может быть меньше, чем $postsPerPage, например, всего несколько. Их даже может вообще не быть (ты учел эту ситуацию?). Чтобы найти первый/последний пост, можно использовать reset($posts) и end($posts).

> Core_Profiler::setQuery($str);
Ну не, статические методы — это просто и неинтересно. Плюс, они нас сильно ограничивают. Например, мы не сможем создать 2 профайлера, или мы не можем заменить класс Core_Profiler на наследник без переписывания кучи кода. Мы изучаем ООП, так что давай изучать ООП-подход. А ООП-подход нам советует сделать так:

- сделать нормальный, не статический класс профайлера
- если профайлер включен в настройках, то подключать его к классу Core_PDO, например так:

$profiler = new Core_Profiler();
$pdo->setProfiler($profiler);

> public static function setScriptStart()
Думаю, время старта лучше замерять где-нибудь в самом начале bootstrap, до подключения других файлов, и передавать в этот метод для большей точности.

> memory_get_usage(), memory_get_peak_usage()
Там лучше писать в скобках true, тогда цифры побольше и более правдивые получаются.

> self::$start[], self::$query[], self::$end[], self::$rows[]
Вот так делать не стоит, заводить 4 разных массива, так как очень высока вероятность что ты где-нибудь пропустишь один из вызовов, число записей разойдется и все перепутается. То есть, работа с твоим классом сравнима с хождением по минному полю. Не надо так делать. Лучше сделать метод вроде такого:

$profiler->addQuery($startTime, $endTime, $query, $rows);

или так:

$query = $profiler->startQuery();
.... выполняем запрос ....
$query->logRowsCount(123);
$query->logEnd();

> $STH->bindParam(':thread', $thread);
Почему bindParam, а не bindValue? bindParam же вроде для двухсторонней связи используется (когда база данных может возвращать значение в переменную), у нас тут явно такого нет.

> public function getPageComments($firstPostId = 0, $lastPostId = 0)
> $STH = $DBH->prepare("SELECT * FROM comment WHERE post_id<= :firstPostId AND post_id>=:lastPostId");
Ой-ой, ты предполагаешь, что посты выстроены по id. Но на борде добавление комментария поднимает тред, и порядок нарушается. Ты это учел?

Я бы просто передавал сюда массив с id постов, для которых надо получить комменты, и использовал бы WHERE post_id IN (100, 200, 301, 400 ... )

Я заметил, что ты сделал формы для кнопок, а не заменил их на ссылки. Это, конечно, плохо, что в верстке они были кнопками, а не ссылками, но я исправил это. Можешь взять изменения из моего репозитория: https://github.com/codedokode/board-markup/commit/c015c38305de06c39016df08675fad5daa40f4ab

Заодно, чтобы 2 раза не вставать, добавил форму комментария в тред: https://github.com/codedokode/board-markup/commit/050fab8ae4386b2147240284238bcbfeb4a0b291 Сможешь тоже добавить? Старую, отдельную страницу можно не удалять, а оставить для повторной отправки (то есть, постим форму на старый адрес, если все ОК — добавляем комментарий и возвращаемся в тред, если все плохо — показываем форму уже на отдельной странице). Потарайся при этом избежать копипасты кода и шаблонов.

Аноним Суб 19 Окт 2013 07:59:46  #60 №328185 
1382155186361.jpg

>>328181
Монады - это не только ввод/вывод, это более общее понятие, пришедшее из теории категорий в хаскелль вместе с функторами, категориями, стрелками и т.д.
С программисткой точки зрения - это что-то вроде контейнера в который можно засунуть значение определённого типа (return :: a → M a) и которые можно объединять ( join :: M(M a) → M a) и для которого выполняется ряд аксиом (см. monad's laws).

MonadPlus - это монада, которая является моноидом (полугруппа с нейтральным элементом)


Functor - если рассуждать в рамках той же аналогии, это контейнер элементы внутри которого можно менять с помощью указанной функции. (fmap :: (a → b) → f a → f b)

Примером монады и функторами может быть обычный список:
return:: a → [a]
return x = [x]

join :: [[a]] → [a]
join = concat


-mzero - это нейтральный элемент моноида
mzero = []

-mappend - это операция моноида
mappend x y = x ++y
- в данном случае просто объединение списков

fmap :: (a → b) → [a] →
fmap = map
- fmap в данном случае будет обычной функцией map для списков


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

Аноним Суб 19 Окт 2013 08:01:36  #61 №328186 

>>328185
Чёрт! Макаровский парсер сожрал "[ b ]"

Аноним Суб 19 Окт 2013 08:03:50  #62 №328187 

>>328186
>Макаровский
Макабовский

Аноним Суб 19 Окт 2013 08:37:49  #63 №328188 

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

Аноним Суб 19 Окт 2013 17:42:08  #64 №328247 

На локалке у себя проверь php макака ёбаная

!xnn2uE3AU. Суб 19 Окт 2013 18:40:35  #65 №328253 

>>328188

Скорее всего это плохой хостинг.

>>328247

Хороший совет, кстати.

!xnn2uE3AU. Суб 19 Окт 2013 19:32:18  #66 №328265 

>>328185

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

Я пока что решил почитать вот эту статью: http://learnyouahaskell.com/functionally-solving-problems но и там все запутанно.

Например, чем вот эта трудно читаемая запись:

solveRPN = head . foldl foldingFunction [] . words

лучше старой доброй императивной формы записи вроде

words = str.split()
for word in words:
.....

Она как минимум читается проще.

Аноним Суб 19 Окт 2013 19:52:11  #67 №328274 

>>328265
>Монады так с ходу понять сложновато.
Монада это всего лишь моноид в категории эндофункторов. Чего тут сложного-то?
>Например, если монадой может быть список, почему бы его и не использовать вместо них?
Не может быть, а список является монадой. Любой список это монада, но не любая монада — список. По-моему это очевидно.
>Например, чем вот эта трудно читаемая запись: ... лучше старой доброй императивной формы записи вроде
Короче, проще читается, быстрее понимается.

Аноним Суб 19 Окт 2013 20:15:13  #68 №328276 

>>328274
>Монада это всего лишь моноид в категории эндофункторов. Чего тут сложного-то?
НУ ОХУЕТЬ ТЕПЕРЬ

Аноним Суб 19 Окт 2013 20:16:02  #69 №328277 
1382199362593.jpg

>>328128
> Без тестов укладываюсь в 80 строк
>>327819
> У меня на Clojure 41 строкa получилось, считая импорты и пустые строки.
Таким образом эксперементально установлено, что код на Хаскеле ровно в 2 раза длиннее.

Аноним Суб 19 Окт 2013 20:36:18  #70 №328287 

>>328277
Охуеть неожиданно, нетипизированное лиспоговно короче статики.

Аноним Суб 19 Окт 2013 20:44:38  #71 №328289 

>>328277
>Таким образом эксперементально установлено, что код на Хаскеле ровно в 2 раза длиннее.

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

Аноним Суб 19 Окт 2013 20:56:10  #72 №328292 
1382201770157.jpg

>>328265
>И зачем всюду писать Just?
Т.к. сделал ерзац библиотеку для тестированию и так было проще.
>нельзя просто разобрать выражение на части и посчитать?
Так так оно и работает. Вначале создается парсер, который переводит из строки в AST (см. termAndOperations, expr, eterm, expterm), дальше вычисляется значение по AST (см. ф-ию compute).
А всё остальное, что есть в коде - это тесты и мини-реализация монадического парсера, которую я сделал по аналогии с Parsec'ом.

Аноним Суб 19 Окт 2013 22:23:25  #73 №328305 

>>328183
ок, за выходные попробую сделать

Аноним Вск 20 Окт 2013 10:21:55  #74 №328419 

посоны поясните ньюфагу, почему его быдлокод не работает.
http://ideone.com/LXjNW9
в php over 2 часа

sageАноним Вск 20 Окт 2013 10:38:39  #75 №328421 

>>328419
>ты лох
>ты пидор
>ты сдохнешь
>ты черт
>ты кот
>ты лал
>ты жуль
>ты кура
>ты кака
Ты школьник.

Аноним Вск 20 Окт 2013 10:51:54  #76 №328427 

>>328421
твой детектор сломан...
но речь не об этом, а о том, почему не работает?

Аноним Вск 20 Окт 2013 11:12:46  #77 №328430 

>>328427
текст ошибки указывает тебе где искать. Точку с запятой пропустил же.

Аноним Вск 20 Окт 2013 11:19:38  #78 №328431 

>>328430
спасибо, нашел. Меня запутал тот момент, что ошибка указана была в 9 строке, а ; была не поставлена в 7 строке

Аноним Вск 20 Окт 2013 11:21:37  #79 №328432 

>>328431
http://ideone.com/OyuRoE
вот он, момент моего апогея

Аноним Вск 20 Окт 2013 22:03:19  #80 №328501 

>>328432>>328419
Вместо кучи else if лучше сделать мапу (ключи - цифры, значения - слова) и из неё брать ответ. Короче, читабельней, прозрачнее.

Аноним Пнд 21 Окт 2013 00:39:00  #81 №328515 

Напомните зеркало сайта опа, начиналось как webmaqaque вроде. Не гуглится ничерта.

!xnn2uE3AU. Пнд 21 Окт 2013 01:58:03  #82 №328523 

>>328432

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

>>328501

Это мы не проходили, это нам не задавали.

!xnn2uE3AU. Пнд 21 Окт 2013 01:59:47  #83 №328524 

>>328515

webmacaque.tk

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

!xnn2uE3AU. Пнд 21 Окт 2013 02:07:38  #84 №328528 

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

1. Набираем в адресной строке браузера arhivach.org и жмем Enter
2. Нажимаем на кнопочку с лупой в правом углу
3. Вводим pr
4. Выбираем из выпадающего списка /pr — программирование
5. Ждем пару секунд, когда скрипт сообразит что пора бы обновить страницу
6. Видим нужные треды.

Это хороший пример, показывающий, почему важно правильно проектировать сайт, чтобы на любую страницу можно было скопировать ссылку, чтобы работали кнопки вперед/назад, чтобы при нажатии F5 поиск не сбрасывался, а не бездумно лепить скрипты на jQuery/Angular или что там сейчас у вас модно.

Аноним Пнд 21 Окт 2013 02:12:09  #85 №328529 

>>328524
Спасибо, оп!
Давно не заходил я. Как с работой дела?

!xnn2uE3AU. Пнд 21 Окт 2013 02:36:56  #86 №328531 

>>328529

Так себе. Перебиваюсь всякими случайными заказами.

Аноним Пнд 21 Окт 2013 06:55:22  #87 №328543 

>>327422
Короче я скачал ПХП и Апаче и не могу понять, как их соединить. Пхп не запускается.

Аноним Пнд 21 Окт 2013 08:31:19  #88 №328552 

>>328531
Подожди, а ты из какого города? Просто у нас в дс2 работы для пхп-макак миддлов и синьоров вроде как много. Переехал бы.

!xnn2uE3AU. Пнд 21 Окт 2013 08:31:45  #89 №328553 
1382329905265.jpg

>>328543

Нет ли ответа на вопрос в пасте: https://gist.github.com/anonymous/946f4f1830be3955fe17 ?

Также, работает ли PHP сам по себе, если его запустить как на пикче?

Аноним Пнд 21 Окт 2013 17:48:47  #90 №328709 
1382363327802.jpg

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

Аноним Пнд 21 Окт 2013 20:18:11  #91 №328776 

>>328553
У меня не получается скачать MSVCR110 dill. А без него пхп.ехе не открывается.

Аноним Пнд 21 Окт 2013 20:22:33  #92 №328780 

>>328709
Все три рожи вполне ок, можно перефоткать в успешных альфачей. Правому прическу сменить, и всё, Перевозчик обосрётся.

Аноним Пнд 21 Окт 2013 20:29:11  #93 №328781 

Вот, а еще при попытке поменять текст в htdocs пишет, то у меня нет прав.

Аноним Пнд 21 Окт 2013 21:09:37  #94 №328790 

Сап, пхпач, нужна твоя помощь.
Как правильно экранировать следующую строку SQL запроса?

$a = mysql_query("INSERT INTO All VALUES (NULL,'$Mark','$Model','$Year','$Komp','$Kuzov','$new','$ABS','$SDK','$PodS','$KruK','$FPB','$SPB','$LitW','$LeaS','$price')");

Аноним Пнд 21 Окт 2013 21:19:00  #95 №328792 

>>327785
http://ideone.com/QX07oa

>Почти правильно, но надо сделать не так: $child->$function(), а так: $function($child).
Теперь ближе к истине?

Аноним Пнд 21 Окт 2013 21:35:38  #96 №328794 
1382376938396.png

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

Аноним Пнд 21 Окт 2013 21:44:49  #97 №328795 
1382377489989.jpg

И работать я буду говночистом. Какой я тупой, блять.

Аноним Пнд 21 Окт 2013 22:08:20  #98 №328799 

>>328795
Особой пикантности придает то, что самобичеванием ты занимаешься в треде пехепе-макак, то есть ты на дне, парень.

Аноним Пнд 21 Окт 2013 22:48:52  #99 №328811 

Так. Я пошел другим путем, описанным вот здесь: http://ru.html.net/tutorials/php/lesson2b.php
Установил XAMPP, включил апаче и mySQL, все норм. Создал в Notepad++ файл пхп с работающим кодом "хеллоу ворд". Сохранил его в папку C:XAMPP/htdocs с расширением пхп. Все, как в инструкции. Открыл http://localhost/ и добавил туда название файла. Пишет - не найден.
ЧТО Я ОПЯТЬ ДЕЛАЮ НЕ ТАК БЛЯТЬ???

Аноним Пнд 21 Окт 2013 23:24:24  #100 №328819 
1382383464402.jpg

Опушка и пхпаны, я нахуячил программу банкомата из дополнительных задач. Все норм, но я не использовал массивы. Зацените.
http://ideone.com/7Kp30W

Аноним Пнд 21 Окт 2013 23:27:44  #101 №328821 

Похвалите меня, блять.

!xnn2uE3AU. Втр 22 Окт 2013 01:07:21  #102 №328845 

>>328552

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

Аноним Втр 22 Окт 2013 01:41:11  #103 №328852 

test

http : // www . microsoft . com/en-us/download/details.aspx?id=30679

Аноним Втр 22 Окт 2013 01:46:50  #104 №328855 

test


hTtP : / / microsoft . com /en-us/download/details.aspx?id=30679
Аноним Втр 22 Окт 2013 01:50:47  #105 №328857 

>>328781

Если ты в Linux, то можно поменять владельца папки. Если ты в Windows, щелкни правой кнопкой на папку, выбери свойства → доступ и проверь права, которые там выставлены.

>>328790

> Сап, пхпач, нужна твоя помощь.
> Как правильно экранировать следующую строку SQL запроса?

Ты не написал, какую библиотеку используешь. Значит, наверно, PDO. С ней это так длелается, через плейсхолдеры:


$pdo = new PDO(.....);
// Включаем проверку и отображение ошибок
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Подготавливаем запрос
$stmt = $pdo->prepare('INSERT INTO All VALUES (NULL, :mark, :model, :year, :komp.....');
// Выполняем
$stmt->execute(array(
':mark' => 'данные',
':model' => 'данные',
':year' => 'данные',
....
));


При таком подходе данные автоматически экранируются. Правда, удобно? Если же ты до сих пор не перешел на PDO и используешь какие-нибудь устаревшие функции вроде mysql_* (за которые над тобой будут смеяться на собеседовании и пообещают перезвонить), то используй mysql_real_escape_string, но лучше переходи на PDO.
Аноним Втр 22 Окт 2013 02:01:17  #106 №328859 

Что значит t . co или вокару при попытке отправить пост?

Аноним Втр 22 Окт 2013 02:17:15  #107 №328861 

Что значит t . co или вокару при попытке отправить пост?

>>328709

Просто снято на мыльницу с плохим освещением.

>>328776

Я же тебе писал совет: гуглим php MSVCR110 dll (не dill, а dll, dynamik link library). И находим что можно скачать пакет от майкрософта

http : / / www . microsoft . com / en-us / download / details.aspx?id=30679

с этой библиотекой.

!xnn2uE3AU. Втр 22 Окт 2013 02:29:20  #108 №328863 

>>328792

Лучше, но пока не идеально.

>>Почти правильно, но надо сделать не так: $child->$function(), а так: $function($child).
> Теперь ближе к истине?

Нет. Не работает вот этот код (он должен вывести имена всех нод в дереве): http://ideone.com/hvNXAH Ты опять сделал так, что можно вызывать только метод с именем $function, а должно быть по-другому. Надо убрать $callback = ... и return и в array_walk передавать сразу $function. Ну и сделать, чтобы функция вызывалась не только на детях первого уровня, а на всех потомках.

> try {
> throw new Exception("ОШИБКА! Нельзя делать обьект " . $this->getName() . " родителем самого себя.\n");
> } catch(Exception $e) {

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

Просто пиши

if ($this == $child) {
throw new Exception("ОШИБКА! Нельзя делать обьект " . $this->getName() . " родителем самого себя.\n");
}

и все.

> $key = array_search( $siblings, $this);
> if (isset($siblings[$key+1])) {
> return $siblings[$key+1];
> }

Не сработает. Допустим, у родителя в массие $child были элементы с ключами 0, 1, 2, 3. Мы удаляем детей 1 и 2 и остаются только 0 и 3. И твое «$key + 1» если $key = 0, не сработает. Смотри сам: http://ideone.com/879Xsx (кстати, ты там еще у array_search перепутал порядок аргументов). Это потому, что в массиве индексы могут идти в любом порядке. Придумай более надежный способ.

То же самое с previousSibling.

Дальше в следующем посте.

!xnn2uE3AU. Втр 22 Окт 2013 02:36:25  #109 №328864 

>>328792

продолжение.

> $key = array_search( $siblings, $this);
> if (isset($siblings[$key+1])) {
> return $siblings[$key+1];
> }

Не сработает. Допустим, у родителя в массие $child были элементы с ключами 0, 1, 2, 3. Мы удаляем детей 1 и 2 и остаются только 0 и 3. И твое «$key + 1» если $key = 0, не сработает. Смотри сам: http://ideone.com/879Xsx (кстати, ты там еще у array_search перепутал порядок аргументов). Это потому, что в массиве индексы могут идти в любом порядке. Придумай более надежный способ.

То же самое с previousSibling.

> if (isset($this->parentNode)) {
> return $this->parentNode;
> }
> return NULL;
Можно написать просто return $this->parentNode. isset() как раз и проверяет, что оно не равно null.

> foreach ($children as $child) {
> $depth = max($depth, $seed->getDepth());
переменная $seed не определена.

Давай, осталось немного, исправить баги и сделать меню, унаследованное от твоего чудо-дерева.

!xnn2uE3AU. Втр 22 Окт 2013 02:37:53  #110 №328865 

>>328819

В банкомате должно быть ограничено число купюр. Например, осталось всего 10 100-рублевых и 4 500-рублевых. Так же, я не понимаю, что ты выиграл, отказавшись от массивов? Теперь тебе каждый кусок кода надо копипастить по 4 раза (или по 5, если мы например захотим добавить еще один вид купюр). Боюсь, это скорее минус, чем плюс, копипаста — зло.

Алсо, у задачи есть усложненная версия: сделать банкомат с купюрами на 5000, 1000, 500, 200 и 100 р (она реально сложнее, например когда надо выдать 1100 р, а в банкомате осталось 0×5000, 1×1000, 1×500, 4×200, 0×100).

!xnn2uE3AU. Втр 22 Окт 2013 02:39:13  #111 №328867 

Как правильно вставить ссылку на сайт microsoft . com? Ну что за дебилы составляют спамлист.

!xnn2uE3AU. Втр 22 Окт 2013 02:44:11  #112 №328868 

>>328811

Что за ошибка? Таймаут, хост не найден или 404 от сервера? Сервер что пишет в окошке? Он запустился вообще?

Без подробностей (а еще лучше скриншотов окошка запуска XMPP, папки с PHP файлом и подробностей ошибки из браузера) я помочь не могу.

Лучше бы конечно ты сам поставил Apache/PHP/MySQL. Тебе явно стоит прокачать знания и умения установки программ.

Аноним Втр 22 Окт 2013 03:43:23  #113 №328872 

>>327422
Как запускаются парсеры написанные на PHP?

Аноним Втр 22 Окт 2013 04:48:08  #114 №328878 
1382402888725.png

>>328868
Пишет, что у меня нет разрешения для доступа!!

!xnn2uE3AU. Втр 22 Окт 2013 06:05:04  #115 №328881 

>>328872

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

>>328878

О! Вот так намного понятнее. Теперь смотри: когда ты открываешь http://localhost/ ты должен по идее видеть стартовую страницу XAMPP (если верить документации на сайте: www.apachefriends.org/images/5601.jpg она оранжевая с кучей текста)

Ты видишь белую страницу It works!. Почему? Это стартовая страница Апача, возможно ты в процессе установки оставил Апач запущенным, он занял 80-й порт (это порт используемый для HTTP по умолчанию) и на запросы браузера отвечает именно он? В таком случае, тебе надо остановить Апач (по моему, в меню пуск есть такой пункт), а возможно даже сразу удалить (через пункт Установка и удаление программ в меню пуск). И после этого остановить и запустить заново XAMPP. И убедиться, что по адресу locahost будет открываться его страница, а не Апачевская.

Если Апач не получается остановить через Пуск, зайди в Пуск — Настройки — Администрирование — Службы, найди там apache и останови его.

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

Алсо, у XAMPP есть окошко, через которое он запускается и в котором пишется текст, вроде такого: www.apachefriends.org/images/5600.jpg Если эти советы тебе не помогут, сделай и его скриншот, чтобы мы видели, что там за ошибки при запуске.

Аноним Втр 22 Окт 2013 06:11:43  #116 №328882 

>>328881
> а не у меня.
Не знаешь, не отвечай.

Поддержки нет. Я сами пишу.

Аноним Втр 22 Окт 2013 12:40:37  #117 №328908 

>>328857
Спасибо, анан. Про PDO вообще не знал, сейчас буду прикручивать пока не засмеяли.

Аноним Втр 22 Окт 2013 12:57:42  #118 №328912 

>>328882
очевидно что разрешение к файлам .php не прописано в конфиге апача или какой там у тебя сервер, ну прав на чтение у этого файла нет, но я хз как там дела в винде с этим, вроде там вообще прав нету или они какие то ущербные, по крайней мере знаю что винда даже свою ntfs в полной мере не поддерживает, так что я бы первым делом конфиги проверил в таком случае

Аноним Втр 22 Окт 2013 12:59:44  #119 №328913 

>>328881
ну ты вообще лалка

Аноним Втр 22 Окт 2013 13:03:32  #120 №328915 

>>328912
бля не тому анону ответил
>>328912>>328878

Аноним Втр 22 Окт 2013 13:10:47  #121 №328916 

>>328881
> (вроде скайпа или торрентов) могут занимать порт 80

Серьезно эта хуйня может занимать 80 порт без рутового пользователя? Пиздец же.

!xnn2uE3AU. Втр 22 Окт 2013 14:39:52  #122 №328939 

>>328916

В виндоус же принято сидеть под рутом. Так что вполне может.

!xnn2uE3AU. Втр 22 Окт 2013 14:42:10  #123 №328940 

>>328912

Права в винде не ущербные, а гораздо мощнее, чем в базовом линуксе (в винде есть нормальный ACL, который в линуксе надо устанавливать отдельно).

Если бы прав не было, была бы ошибка 403, а не 404.

У анона скорее всего просто одновременно запущены Апач и XAMPP.

Аноним Втр 22 Окт 2013 19:04:39  #124 №329074 

ОП, нужно пройти по всем возможным 8 значным комбинациям, символ может быть буквой в нижем или верхнем регистре, а так же цифрой, как такой алгоритм организовать? Я чего-то видимо не шарю в строках пыхи наверно, на с++ делал, тут даже не знаю с какой стороны зайти.

Аноним Втр 22 Окт 2013 21:49:41  #125 №329112 
1382464181777.png

>>328881
Все равно пишет, что нет разрешения на доступ. Может от страны зависит?

Аноним Втр 22 Окт 2013 22:17:34  #126 №329124 

>>328940
О, господи, у меня нет прав! Что же делать??

Аноним Втр 22 Окт 2013 23:01:37  #127 №329136 

>>329112

Надо писать http://localhost/new1.php , путь пишется от корневой папки сервера (в твоем случае, htdocs). Писать имя диска вроде c:.... бесполезно. Судя по картинке 1, XAMPP вполне работает. Апач, который включен в XAMPP, отключать не надо.

Попробуй написать в адресной строке http://localhost/new1.php

Аноним Срд 23 Окт 2013 00:33:27  #128 №329159 

>>329136
Заработало, спасибо.

Аноним Срд 23 Окт 2013 08:25:03  #129 №329195 

Оп у тебя в папке из оп поста все перепутано. Можешь как-то объяснить как все это пронумеровать?

Аноним Срд 23 Окт 2013 14:07:58  #130 №329253 

>>329074
Решение на языке программирования:


combinations = replicateM 8 $ ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']
!xnn2uE3AU. Срд 23 Окт 2013 16:06:07  #131 №329283 

>>329195

О какой папке речь? Если о дропбоксе, которую собрал неизвестный доброанон, то файлы там такие:

archive-ipq-co.narod.ru.rar — старый-престарый архив сайта
archive.ipq.co.v3.zip — не очень старый архив сайта (на rghost давно есть v4)
threads-archive-r2.zip — по моему, это архивы php-тредов из /b , начиная со 2 и до 11
threads-archive-11-19.zip — архивы тредов из /b с 11 по 19
Тред от 27.02.13, сохранен 02.04.13.rar — без понятия что это.

Аноним Срд 23 Окт 2013 17:14:16  #132 №329286 

>>329253
няша, не выёбывайся, пиши пояснение.
я понял только за конкатенацию ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']
стремящийся хаскаёб

Аноним Срд 23 Окт 2013 17:38:16  #133 №329289 
1382535496856.jpg

>>329286
replicateM n выполняет действие монады данное число раз и собирает результаты в список.
Т.е. например для n == 3 результат этой функции будет аналогичен результату вот такой функции:


analogue3 monad = do
x ← monad
y ← monad
z ← monad
return [x,y,z]
Аноним Срд 23 Окт 2013 21:47:37  #134 №329318 

доброанон, я в тупике, читаю гайды, а дальше этого -
if (in_array($anonHeight, $classmates))
продвинутся не могу...
http://codepad.org/JKBnRyFg

!xnn2uE3AU. Срд 23 Окт 2013 22:06:38  #135 №329319 

>>329318

1) заведи переменную и положи в нее число 0
2) обойди массив циклом и каждый раз, как встречаешь высокого одноклассника, увеличивай переменную на 1

-- или (для любителей потяжелее) --

Используй функцию array_filte или array_reduce, если понимаешь как их использовать. Но проще наверно циклом.

Аноним Срд 23 Окт 2013 22:59:49  #136 №329323 

>>329318
Условием
if (in_array($anonHeight, $classmates)){
$number = 0;
}
ты проверяешь, есть ли в массиве люди такого же роста как и анон, и, если есть, присваиваешь переменной $number значение равное 0.
Тебе же надо, в предыдущем foreach, сравнить рост анона с ростом каждого человека, и, если он будет меньше, увеличивать счетчик людей, которые выше, на 1;

Аноним Срд 23 Окт 2013 23:10:22  #137 №329324 

Макабаприключения, блять.

Аноним Чтв 24 Окт 2013 02:06:47  #138 №329341 

>>328183
Вот, попробовал переделать сортировку и добавил возможность бампать тред. Правда пришлось добавить новое поле в таблицу с постами, которое обновляется при каждом добавлении нового коментария, я хз насколько это правильное решение.
Еще попробовал переделать профайлер, но он часто выдает довольно разные данные по времени при загрузке одной и той же страницы. Так и должно быть?
Как-то так:
https://github.com/melanchthon/board

!xnn2uE3AU. Чтв 24 Окт 2013 04:40:08  #139 №329356 

>>329341

В этот раз замечаний особых нет, так, по мелочам только.

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

> https://github.com/melanchthon/board/blob/8baec77426180efae415b6da2c49f93f0bdba133/Application/Controller/Comment.php#L18
> $comment->name = (!empty($_POST['name']))? trim($_POST['name']) : Config::getDefaultName();

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

> https://github.com/melanchthon/board/blob/496141b420a923e7b4c1b587e69f347c065c7e2f/Application/Core/View.php#L10
> foreach($params as $key=>$value){
> $_GET[$key] = $value;
> }

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

> $placeholder = implode(',',array_fill(0, count($postsIds), '?'));
О, вижу ты тоже наткнулся на (далеко неединственный) недостаток PDO: в нем забыли сделать плейсхолдеры для массивов. Еще, как вариант, вместо подстановки кучи знаков вопроса, можно самому заэкранировать данные, например, так: $values = implode(', ', array_map('intval', $ids)). intval гарантирует нам, что в запрос пройдут только числа. Но твой вариант тоже годится.

> header("Location:{$_SERVER['HTTP_REFERER']}");
Не используй REFERER для того, чтобы хранить адрес возврата. Браузер по спецификации не обязан передавать реферер, его можно отключить, прокси и фаерволлы могут его вырезать. Ненадежно.

Еще совет: в SQL у тебя есть связь между таблицами: post_id в таблице comment ссылается на поле id в таблице post. Хорошо бы прописать эту связь на уровне MySQL (ну и прочесть где-нибудь как это работает), например так:

ALTER TABLE comment ADD FOREIGN KEY post_id REFERENCES post(id) ON UPDATE RESTRICT ON DELETE RESTRICT

Этим ты делаешь 2 вещи: 1) пост теперь не удалить, не удалив сначала все комменты (тем самым мы обеспечиваем ссылочную целостность в базе) 2) всякие средства работы с Бд могут теперь по клику на значение post_id после автоматически переходить к соответствующему посту.

Еще совет: дату в MySQL лучше хранить как нормальную дату, полем DATETIME, а не INT. А то как в твоей борде вручную запросом например выбрать все посты от 1 сентября?

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

> Fatal error: Call to undefined method PDO::setProfiler() in \Application\bootstrap.php on line 9

Ладно, перейдем к тестированию твоей чудо-борды.

- Если борду поместить в не-корневую папку, она глючит, стили не подгружаются на странице добавления комментария, все плохо (так как URL страницы добавления имеет вид /board2/thread/index?thread=1 а ссылка на CSS вид /board2/thread/css/board-style.css). Если поместить в корневую, FrontController перестает видеть URL и все страницы, кроме главной выводятся пустыми. У тебя точно все работает?

Надо исправить это и добавить параметр вроде baseUrl, который содержит путь к корню борды ( например /board2). Параметр либо задавать вручную в конфиге, либо, что лучше, определять автоматически из REQUEST_URL и SCRIPT_URL.

- Если указать неправильный URL например /lalala/lololo, надо выводить ошибку 404, а не пустую страницу с кодом 200.

- На пустой БД вместо красивого сообщения «Постов пока нет. Хотите _добавить первый_? (ссылка)» вываливаются PHP-ошибки:

Warning: array_fill(): Number of elements must be positive in \board2\Application\Model\Comment.php on line 31
Warning: implode(): Invalid arguments passed in \board2\Application\Model\Comment.php on line 31
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1' in \board2\Application\Core\PDOStatement.php on line 14

- Если на борде всего 1 пост, внизу выводится 0 в качестве номера страницы. ЧТо за ерунда? Во-первых, страницы нумеруют начиная с первой, а не нулевой, во-вторых, если страница всего одна, пагинатор показывать незачем. Все равно там кликать некуда.

- Писать пропущено 0 комментариев так же нет смысла

В общем, про тестирование производительности я сегодня написать не успел, напишу завтра. Код скриптов для набивания постов и тетсирования, если любопытно, можешь посомтреть тут: https://github.com/codedokode/board-test-scripts/tree/melanchthon

!xnn2uE3AU. Чтв 24 Окт 2013 04:43:20  #140 №329357 
1382575400742.png

>>329341

Алсо, кнопки по моему съехали влево.

Аноним Чтв 24 Окт 2013 04:44:10  #141 №329358 

>>329341
Ух ты, бесплатная борда.

Аноним Чтв 24 Окт 2013 05:00:23  #142 №329359 

А каким образом делаются такие полупрозраные плавающие окошки, как в фейсбуке? Их надо в фотошопе рисовать, а потом анимировать и вставлять в код ссылкой поверх другого текста?

!xnn2uE3AU. Чтв 24 Окт 2013 05:12:20  #143 №329365 

>>329359

В смысле, плавающие? Не понимаю, о чем речь. Но вообще, там используются обычные HTML/CSS/JS.

Аноним Чтв 24 Окт 2013 05:37:51  #144 №329368 

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

!xnn2uE3AU. Чтв 24 Окт 2013 05:47:12  #145 №329369 

>>329368

Ты CSS изучал? Это обычный див с HTML-кодом и абсолбтным ии фиксированным позиционированием. Появляется и двигается он за счет того, что яваскрипт по таймеру меняет свойства opacity и top/left (в новых браузерах можно использоать CSS3 animation, но надо тщательно тестировать так как они глючные).

Алсо, ты можешь в Хроме нажать Ctrl + Shift + I и сам посмотреть инспектором как это меню устроено.

!xnn2uE3AU. Чтв 24 Окт 2013 05:49:40  #146 №329370 

>>329368

Алсо, на jQuery (для совсем ленивых) это делается парой строчек вроде

$(node).animate({ opacity: 1, top: '-=20px' }, 400);

А animate уже запускает таймер и плавно меняет свойства за заданное время.

Аноним Чтв 24 Окт 2013 10:19:27  #147 №329388 
1382595567706.jpg

Что происходит, пэхэпаны? Это у них регулярно? Вчера вроде нормально всё было.

Аноним Чтв 24 Окт 2013 12:27:31  #148 №329404 
1382603251408.png

>>329388
А вот как на сайте языка программирования.

Аноним Чтв 24 Окт 2013 13:21:01  #149 №329414 

>>329404
Но ведь хаскель – не язык программирования...

Аноним Чтв 24 Окт 2013 13:43:02  #150 №329419 
1382607782818.png

Инфа о заказе в БД имеет несколько полей: ид, время, инфа о пользователе(имя, мыло, телефон, адрес), корзина, общая сумма, статус. Корзина в свою очередь это массив массивов вида ['наименование','цена','количество'], например
корзина = [
['водка','8$','2'],
['хлеб','1$','1'],
['колбаса','4$','3']
]
Нужно дать админу возможность редактировать любую инфу - наименование, цену, кол-во. Как это реализовать в первую очередь интерфейсно? Кнопка edit в сводной таблице грузит инфу о заказе в правую панель, там можно поправить общую цену, инфу о пользователе и статус. А вот как изящно реализовать правку отдельных товаров - голову уже сломал. Засрать форму инпутами под каждый элемент массива не вариант, кроме того по понятным причинам их количество переменно и это задачу сильно усложняет.

Аноним Чтв 24 Окт 2013 14:07:56  #151 №329426 
1382609276683.jpg

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

Аноним Чтв 24 Окт 2013 14:18:41  #152 №329430 
1382609921111.jpg

>>329426
Это ты о ком сейчас?

Аноним Птн 25 Окт 2013 01:45:27  #153 №329630 

>>329369
>>329370
>яваскрипт по таймеру меняет свойства opacity и top/left
Ааа, просто еще не дошел до явы. Также прозрачность анимируемого объекта задается на фотошопе с отсутствующим бэкгранудом, да?

Аноним Птн 25 Окт 2013 01:58:02  #154 №329632 

>>329630
>явы
ДжаваСкрипт, блядь. От джавы там только название.
>объекта задается на фотошопе
Щито?!

a:hover {opacity: 0.4; transition: 1s;}

Да-да, это всё. Ослы, правда, идут нахуй.
Либо же на jQuery использовать функции. Даже ты с ним разберешься.
Аноним Птн 25 Окт 2013 04:26:41  #155 №329647 

>>329419
Я думаю, тебе нужно три инпута в один блок сделать и массив тройной разделить на колонки. И привязать к новой кнопке эдит товар.

!xnn2uE3AU. Птн 25 Окт 2013 05:21:37  #156 №329651 

>>329341

Анон с ником melanchthon, выше был список ошибок, теперь посмотрим на то, оптимизированы ли твоим запросы. Вообще, стоит сказать, что оптимизировать запросы не всегда нужно — бывает, что, сайт посещает 3 человека в день, и заказчик готов выделить на тестирование производительности не более 0 рублей. Или сайт сделан на безнадежно кривой CMS, которую исправить можно только полным переисыванием. Если куча людей, которые и не слышали про индексы, и им это не мешает успешно работать.

Но у нас учебная задача, а значит база должна быть не просто оптимизирована, а выоптимизирована и заоптимизирована по максимуму. Потому, приступим. Для тестирования нам понядобятся скрипты отсюда: https://github.com/codedokode/board-test-scripts/tree/melanchthon которые надо скачать и положить в папочку test-scripts (чтобы она была на одном уровне с папкой Application). Не знаю, разберешься ли, лучше бы разобраться.

Скрипты запускаются из командной строки, так что паста тебе в помощь: http://gist.github.com/anonymous/2dfa134fe20d9cf91bbe

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

> php db-add-threads.php 200 100 500

Эта команда сгенерирует 200 тредов, в каждом от 100 до 500 комментов. Сгенерировав их, откроем главную страницу. Мы видим:

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

Этот запрос надо оптимизировать.

- Запрос выборки комментариев выбирает слишком много строк и делает это не спеша:


1015.625 ms. 2643rows SELECT * FROM comment WHERE post_id IN (?,?,?,?,?,?,?,?,?,?)


Выбирать 2643 строки ради того, чтобы вывести 20 комментариев на главной — как-то не очень. Так не пойдет, этот запрос тоже надо переделать.

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

- Не выбирать больше данных, чем требуется. Не выбирать 2000 комментариев ради нескольких последних.
- Предпочитать простые запросы, а не сложные
- Правильно расставлять индексы.
- Проверять сомнительные запросы с помощью EXPLAIN
- Денормализация

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

https://www.google.ru/search?client=&rls=en-GB&q=habr+mysql+explain+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B

Поясню, как работает команда EXPLAIN. Начнем с простого запроса: выбрать 5 комментариев из треда номер 2. Возьмем adminer, phpMyAdmin или любую другую программу, которая позволяет делать SQL-запросы и введем туда:

EXPLAIN SELECT * FROM comment WHERE post_id = 2 LIMIT 5

выведется такая табличка:


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE comment ALL NULL NULL NULL NULL 94573 Using where


На что надо обратить внимание? Первым делом — на колонку rows. В ней написано, сколько строк MySQL пришлось обойти ради получения результата. В данном случае, ради выборки 5 комментариев из треда пришлось обойти 95000 строк, то есть всю таблицу (в колонке type написано ALL). MySQL обошла каждую строчку, проверила ее на условие WHERE post_id = 2 (об этом говорит надпись «Using where»), отобрала все комментарии из треда и выбрала 5 первых результатов. Это очень неэффективно и медленно. А если бы в таблице были миллионы комментариев?

Поиск данных в таблице можно ускорить, добавив индекс. Индекс позволяет оптимизировать сортировку по колонке (так как он хранит значения из колонки в дереве по порядку), и выборку по условиям равно/больше/меньше/BETWEEN/IN. Если к твоей таблице добавить индекс по post_id и снова сделать тот же запрос, вот что мы увидим:


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE comment ref post_id post_id 4 const 4


В колонке possible_keys написано, какие индексы можно использовать для ускорения запроса. В колонке key написано, какие из них использовались. Как мы видим, индекс по post_id использовался, в результате в колонке rows у нас цифра 4 — это значит, что MySQL выбрала все 4 комментария из треда с использованием индекса и без обхода всей таблицы. Такие простые запросы с использованием индека выполняются в MySQL очень быстро, обычно меньше 1 мс. Очевидно, что обойти 4 строки гораздо быстрее, чем 95000.

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

EXPLAIN SELECT post.*,COUNT(comment.id) AS total FROM post LEFT JOIN comment ON (post.id = comment.post_id) GROUP BY post.id ORDER BY bumped DESC LIMIT 1, 10

Выводит такую таблицу:


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE post ALL NULL NULL NULL NULL 300 Using temporary; Using filesort
1 SIMPLE comment ALL NULL NULL NULL NULL 94573


Как видишь, этот запрос обходит полностью обе таблицы (несмотря на то, что мы просили лишь первые 10 постов), и есть такие нехорошие слова, как «Using temporary; Using filesort» — создается временная таблица, что небыстро.

Кстати, с индексом по post_id JOIN проходит гораздо быстрее:


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE post index NULL PRIMARY 4 NULL 1 Using temporary; Using filesort
1 SIMPLE comment ref post_id post_id 4 host1.post.id 140 Using index


В этом случае, как видишь, выбирается всего 140 комментариев и 1 пост (то есть, только те данные, которые нам и нужны). Правда, даже так это не оченб эффективно — мы выбираем 140 комментариев только ради того, чтобы узнать их количество.

В общем, вот тебе задание:

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

Ну и не забудь, что я выше написал про FOREIGN KEY REFERENCES.

У меня там еще есть скрипт db-measure.php, который считает скорость отображения главной страницы, но пока ты не разберешься с оптимизацией запросов, его вызывать нет смысла.

Возможно, что тебе как начинающему, тут что-то непонятно, тогда задавай вопросы. Понятно? Тогда пиши код (ну и что ты собираешься делать с запросами).
Аноним Птн 25 Окт 2013 06:25:13  #157 №329652 

>>328940
> нормальный ACL
Ну я под виндой уже лет 5 не сидел, логично что ситуация улучшилась.

Но
> который в линуксе надо устанавливать отдельно
что ты несешь вообще? аксесс контрол лист встроен в ext, причем как концепция, а не конкретная реализация. То что в винде таки озаботились правами доступа к файлам меня радует, но при чем тут линукс, в котором это первое с чем необходимо быть знакомым?

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

ну а по теме
> 403
и в правду затупил

> XAMPP
денвер использовать уже не стильномодномолодежно?

!xnn2uE3AU. Птн 25 Окт 2013 07:19:08  #158 №329653 

>>329652

«Нормальный» ACL в виндах начиная еще с NT (и ActiveDirectory кстати). Вам, линуксоидам, фанатизм глаза затмевает почище апплолюбов. В линуксе исторически используется лишь простая система из пользователь-группа-мир, а когда ее не хватает, используется sudo. ACL, если верить этой статье: http://users.suse.com/~agruen/acl/linux-acls/online/ появился в линуксе лишь в 2002.

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

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

Аноним Птн 25 Окт 2013 08:32:26  #159 №329665 

>>329632
Где я тебе CSS3-5 скачаю, эта фича только на нем.

Аноним Птн 25 Окт 2013 09:46:48  #160 №329672 

>>329653
> начиная еще с NT
с каких именно версий ты, конечно, не уточнил

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

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

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

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

Аноним Птн 25 Окт 2013 09:50:32  #161 №329673 

>>329653
>И вообще, сколько я помню, линукс всегда был в догоняющих, то он винду догонял, то мак (в плане интерфейса). Сейчас, говорят, айфон пытается догнать.
У него вообще нету интерфейса, жирный.

>В линуксе исторически используется лишь простая система из пользователь-группа-мир
Покажи мне систему в которой подругому из коробки, а не AC или самба

Аноним Птн 25 Окт 2013 10:44:12  #162 №329676 

>>329673
Со срачами шиндовс-против-ленсука лучше идти в /s/, там спермобляди поумнее. По крайней мере не пишут хуйню вроде
>У анона скорее всего просто одновременно запущены Апач и XAMPP.
1. Апач входит в XAMPP
2. Даже шиндовс не разрешает биндить два сокета на один порт.

Аноним Птн 25 Окт 2013 12:30:36  #163 №329698 

Make your selection
Edit → Copy Merged
File → New (Photoshop should automatically suggest a new canvas size to match the selection size)
Edit → Paste
File → Save As (PNG)
Rinse and repeat... (keyboard shortcuts are handy here)

Это самый быстрый способ резать макет?

Аноним Птн 25 Окт 2013 13:36:23  #164 №329711 

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

Аноним Птн 25 Окт 2013 14:15:03  #165 №329726 

>>329711
>Однотонные фоны тоже картинками сохраняешь?
Не понял тебя.

!xnn2uE3AU. Птн 25 Окт 2013 15:30:36  #166 №329747 

>>329672

> ядро суси
> я так понимаю что мне с тобой не стоит продолжать эту бессмыслицу
не стоит

!xnn2uE3AU. Птн 25 Окт 2013 15:33:15  #167 №329749 

>>329676

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

!xnn2uE3AU. Птн 25 Окт 2013 15:50:31  #168 №329757 

>>329698

Вполне работающий способ.

Аноним Птн 25 Окт 2013 16:41:14  #169 №329767 

Оп-няша, подскажи, в чем косяк в регэкспе?
Делаю упражнение про грамма-наци.

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

http://ideone.com/m4tF6q

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

Аноним Птн 25 Окт 2013 16:49:07  #170 №329770 

>>329767
Вай-вай, внезапно сам разобрался. Если переставить часть с а|но в начало, то всё работает как надо.

Но почему так? Какое теоретическое объяснение?
У меня была версия, что проблема с $ и ^, пробовал их убирать, но не помогало.

Аноним Птн 25 Окт 2013 16:55:20  #171 №329775 
1382705720590.png

>>329647
Запилил, но интерфейс по-прежнему не очевидный, на инпуты товаров и кнопки удаления повесил обработчик который автоматом пересчитывает и записывает сумму в Total, но при этом в сам Total можно вписать что угодно и получится ерунда как на пике.
Можно не давать права его редактировать, но, допустим, админу хочется сделать скидку 10% от конечной суммы, а не высчитывать по -10% от каждого товара. Плодить поля, кнопки и функционал для скидок?

sageАноним Птн 25 Окт 2013 17:24:52  #172 №329782 

>>329775
Добавить ещё одно поле "discount" по умолчанию незаполненное, и всё.

Аноним Птн 25 Окт 2013 20:24:58  #173 №329815 
1382718298638.jpg

Привет, оп, мне нужен твой совет. Часто сталкиваюсь с однйо проблемой и не знаю насколько хорошо её решаю, вот смотри, например, я делаю лайки как вконтакте, мне нужно их где-то хранить, так? Ясен пень, что не через запятую их перечислять в поле likes, я обычно в таких случаях делаю так, создаю отдельную табличку, которая содержит только 3 поля, id, user_id, target_user_id. Ну то есть понятно, простая табличка которая хранит от кого к кому или что, принадлежит кому. Но у меня вопрос, не слишком ли это избыточно и вообще нормально ли так делать, ведь такая табличка может быть очень и очень длинной? Еще у меня какой-то трабл с использованием фореджин кейс, я прописываю мол user_id foregin key user(id), но при удалении юзера все поля с фориджин кейс остаются, а мне бы хорошо, что бы они удалялись. Подскажешь как быть?

Аноним Птн 25 Окт 2013 20:28:35  #174 №329818 
1382718515354.jpg

Привет, оп, мне нужен твой совет. Часто сталкиваюсь с однйо проблемой и не знаю насколько хорошо её решаю, вот смотри, например, я делаю лайки как вконтакте, мне нужно их где-то хранить, так? Ясен пень, что не через запятую их перечислять в поле likes, я обычно в таких случаях делаю так, создаю отдельную табличку, которая содержит только 3 поля, id, user_id, target_user_id. Ну то есть понятно, простая табличка которая хранит от кого к кому или что, принадлежит кому. Но у меня вопрос, не слишком ли это избыточно и вообще нормально ли так делать, ведь такая табличка может быть очень и очень длинной? Еще у меня какой-то трабл с использованием фореджин кейс, я прописываю мол user_id foregin key user(id), но при удалении юзера все поля с фориджин кейс остаются, а мне бы хорошо, что бы они удалялись. Подскажешь как быть?

!xnn2uE3AU. Птн 25 Окт 2013 20:32:42  #175 №329821 

>>329775

Начнем с того, что ты по-видимому занимаешься бесполезной работой. Есть куча CMS для магазинов, начиная от симплы, заканчивая популярным на западе магенто, зачем писать свой велосипед? Взять и допилить/перепилить CMS дешевеле, если только ты не работаешь за бесплатно.

Но это была лирика. Теперь по делу.

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

Сервер не должен принимать значение Total от пользователя, а должен высчитывать его из типов и количества товаров.

Насчет скидки, я бы советовал сделать отдельным полем, например «дать скидку [      ] %» (при вводе в него сразу же высчитывается итоговая цена) или «задать цену со скидкой [      ] руб.», и естественно на сервере проверять допустимость данных.

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

Ну и насчет товаров, странно, что они у тебя сделаны текстом. По идее, это должны быть поля с autocomplete, которые бы выбирали товары из какой-то таблицы, чтобы сервер бы получал id этих товаров и админ мог, например, добавить что-нибудь если надо или поменять неправильно выбранный товар. Хотя, это наверно уже усложнение. Но ты бы мог взять готовую CMS и не иметь таких проблем.

!xnn2uE3AU. Птн 25 Окт 2013 20:40:05  #176 №329822 

>>329815

> не слишком ли это избыточно
Нет. Это классический и правильный способ связать между собой пользователей (кто кого лайкнул). Избыточно — это если ты какие-то лишние данные хранишь, например, имя, город и фото пользователя рядом с лайком.

Учти, что если у тебя будет большая нагрузка, это не очень эффективный способ. Например, чтобы вывести 10 пользователей и число лайков у них (допустим, у них по 100 лайков у каждого), ты будешь делать SELECT users, COUNT(*) JOIN likes GROUP BY user.id , и этот запрос перебирает 10 × 100 = 1000 строк таблицы likes только чтобы посчитать число лайков.

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

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

> Еще у меня какой-то трабл с использованием фореджин кейс, я прописываю мол user_id foregin key user(id), но при удалении юзера все поля с фориджин кейс остаются, а мне бы хорошо, что бы они удалялись.

Надо писать ALTER TABLE x ADD FOREIGH KEY user_id REFERENCES user(id) ON DELETE CASCADE ON UPDATE RESTRICT. Почитай мануал про ON DELETE и ON UPDATE.

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

!xnn2uE3AU. Птн 25 Окт 2013 20:41:50  #177 №329823 

>>329815

> которая содержит только 3 поля, id, user_id, target_user_id
Можно еще id убрать, а первичным ключем сделать составной ключ (user_id, target_user_id) или вообще не делать первыичный ключ, если твой фреймворк/CMS такое позволит — так как id тут бесполезное число.

!xnn2uE3AU. Птн 25 Окт 2013 20:47:07  #178 №329824 

>>329767

Когда есть несколько вариантов, разделенных | , они проверяются слева направо. У тебя:

'/\s|жы|шы|[.?!;,]\S|координально|сдесь|здел(ал|аю)|((^|\s)

Регулярка идет по строке слева направо. Когда встречается пробел, он совпадает с первым вариантом \s и остальные варианты уже не проверяются, так как первый вариант его (пробел) ловит. До ((^|\s)(а|но)(\s|$)) дело уже не доходит.

Зачем, кстати, ты поставил этот \s в начале? Я не понимаю. Что, пробел в строке — это тоже ошибка?

!xnn2uE3AU. Птн 25 Окт 2013 20:49:11  #179 №329826 

>>329767

Алсо, вот тут:

(^|\s)(а|но)

Зачем ^ ? Если А или Но идет в начале строки, перед ним и не должно быть запятой и это не ошибка. Ошибка — если перед а|но есть пробел и другое слово, а запятой или другого знака препинания нет.

Аноним Птн 25 Окт 2013 21:28:07  #180 №329834 
1382722087051.jpg

>>329823
С подсчетом так и сделал, а вот с индексами можешь подробнее распилить и направить по ссылке, это мое слабое место ппц. Почитал мануал снова, так и не понял про un update, типо если у пользователя смениться полу, в данном случае ИД, то и фореджин кейс поменяется? А то либо у меня с англ пробелмы, либо немного мутно изложено.
>>329822
Вроде не позволяет, сейчас пишу на kohane, но попробую, мож прокатит.

Спасибо.

!xnn2uE3AU. Птн 25 Окт 2013 21:44:55  #181 №329837 

>>329834

ON UPDATE говорит что делать если меняется ид на который ссылаются, лучше поставить RESTRICT (запрещать такую вещь), так как менять id — нехорошее дело (записи, которые указывали на старый id, станут неактуальны), да и я не припомню не одного случая, когда требуется поменять id записи. Так что ставь RESTRICT.

> а вот с индексами можешь подробнее распилить и направить по ссылке

Есть ссылка в гугол: https://www.google.ru/search?client=&rls=en-GB&q=habr+mysql+explain+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B почитай эти статьи например.

Вот я анону чуть выше пытался объяснить про индексы и EXPLAIN: >>329651 — может ты там что полезное найдешь.

Аноним Птн 25 Окт 2013 21:51:11  #182 №329839 
1382723471272.png

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

Аноним Птн 25 Окт 2013 21:54:17  #183 №329840 

>>329839
Сам нашел. Нахуя я ставил слеши, когда вместо нового абзаца они остались в предыдущей строке.
Как запилить новый абзац-то? Закрывать команду нужно, или есть способы без этого?
Нахуя код пишут не в каждой строке, а через одну?

Аноним Птн 25 Окт 2013 22:34:03  #184 №329847 

>>329840
Новая строка <br>
>Нахуя код пишут не в каждой строке, а через одну?
Для удобства редактирования. Хочешь - пиши весь скрипт в одну.

Аноним Птн 25 Окт 2013 22:37:52  #185 №329849 

>>329847
Хотя стой, у тебя там вывод не в HTML. Делай echo "\r\n"; для новой строки.

Аноним Птн 25 Окт 2013 23:47:23  #186 №329861 

>>329837
Как всегда, спасибо за советы.

Аноним Суб 26 Окт 2013 00:10:11  #187 №329864 
1382731811975.png

>>329849
Как же я охуенен. Спасибо.
Алсо дочитал только до того, где написано, что нужно сделать счетчик обмена по курсу. Дальше сам, без шаблонов и пояснений. Понимаю, что это самое начало, и с этим справится любой школьник, но уже чувствую, что втянулся, и это неплохо, как для ленивого хуйла.

Аноним Суб 26 Окт 2013 00:28:29  #188 №329868 

>>329849
>Делай echo "\r\n"; для новой строки.
а есть разница между этим и '<br>'?
мимошел

Аноним Суб 26 Окт 2013 00:36:09  #189 №329870 

>>329775
Ну ты дурашка, меня слушаешь, я ведь еще толком руководство не дочитал. Но мне было приятно, что я такой эксперт, оказывается.
>>329840
Новый абзац в HTML делается вот этим <br>. Вы хоть HTML и CSS перед пхп учите. Да, закрывать нужно каждый раз, когда в HTML выходишь. Так что ты мог сделать так:
<?php
echo "Suck my dick";
?>
<br>
<?php
$cocksucked=4;
echo 25 +"$cocksucked";
?>

Аноним Суб 26 Окт 2013 00:46:54  #190 №329871 
1382734014401.png

>>329870
Но у меня же не html, а типа виртуалка через сайт-песочницу. Алсо можно не закрывать тегами, а просто "\r\n", как писали выше. А нахуя учить хтмл и цсс сначала?
Вот, целый час пилил, блять.

Аноним Суб 26 Окт 2013 01:15:56  #191 №329874 

Для ведра есть хуитка типа IDE?

Аноним Суб 26 Окт 2013 01:29:43  #192 №329877 

>>329871
Малаца, к успеху идешь.
>\r\n
Просто \n
>А нахуя учить хтмл и цсс сначала?
Потому, что брузер показывает не похапе, html/css/js. Тем более, мешанина из ПХП и ХТМЛ в одном файле - излюбленный паттерн проектирования на пыхе, поэтому это жизненно необходимо. Учить там особо нечего. Просто нужно знать штук 10 тегов, атрибуты (id, class, style), стили (margin, border, display) и всё, на пару месяцев хватит.

Аноним Суб 26 Окт 2013 01:50:22  #193 №329878 

>>329877
Чего на пару месяцев хватит?
Обязательно ли сначала учить хтмл и цсс с жс, или можно сначала закончить курс пхп? А то путаница в голове возникнет, как по мне.

Аноним Суб 26 Окт 2013 05:13:39  #194 №329882 
1382750019362.jpg

>>329878
Обязательно. Сначала надо начинать с разметки. ПХП - это язык для создания вэб-страниц, если ты не знаешь, как задавать размер и стиль шрифта, задавать ссылки, присваивать классы и айди - ты будешь на пхп выполнять ненужные задачи, которые и на паскале можно будет делать. Короче, ты не познаешь смысла того, что делаешь, не научишься чувствовать красоту вэб страниц, не сможешь применить свои знания на практике, увидеть результат воочию в виде работающего сайта. Это сложно передать словами, это можно только прочувствовать ИНТУИТИВНО, приобщившись к ХТМЛ и СSS.

!xnn2uE3AU. Суб 26 Окт 2013 06:13:13  #195 №329886 

>>329839

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

Во-вторых, зачем разбивать код на 2 блока? Пиши в одном.

В-третьих, закрывающий тег ?> в конце ставить не надо.

Наконец вот эта строка "$cocksucked" — вообще какой-то маразм. Подставляя число в кавычки, ты делаешь из числа 4 строку "4", которая затем при сложении преобразуется назад в число. Зачем?

Такая подстановка используется, когда ты хочешь подставить число в строку, например: echo "x=$x\n";

Упростив твой код, получим:


<?php

echo "...\n"; // \n для перевода строки
$x = 4;
echo 25 + $x; // добавим пробелов для читаемости
// закрывающий тег PHP в конце файла не нужен


Намного проще и читаьельнее. Я бы советовал тебе все же порешать задачи по очереди из учебника. Они простые, но полезные. Ну и мануал можешь почитать, тоже полезно.
!xnn2uE3AU. Суб 26 Окт 2013 06:23:24  #196 №329887 

>>329868

Разница большая. Этим вопросом, кстати, можно смело на собеседовании отличить того, что понимает PHP, HTML, HTTP и читал мануал от того, кто по быстрому пролистал курсы для чайников вроде специалист или codeacademy.

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

Когда ты запускаешь скрипт в консоли, и выводишь echo "\n"; этот символ начинает новую строку. Но если ты попробуешь сделать echo "\n"; в скрипте, который генерирует веб-страницу (который ты запускаешь через браузер), то перевода строки не будет. Почему? Может, PHP себя по-другому ведет при запуске через браузер?

Нет. Символ новой строки генерируется, но трюк в том, что браузер по умолчанию воспринимает то, что выводит скрипт на сервере, как HTML-код. А в языке HTML любое число пробелов и переводов строки равносильны одному пробелу. Потому если ты в HTML пишешь например: echo "1\n\n2"; то браузер выведет просто:

1 2

Но заглянув в исходный HTML-код страницы (Ctrl + U в Хроме) эти 2 перевода строки там есть. Просто согласно правилам HTML они интерпретируются как пробел.

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

echo " 1\n 2"; — эти пробелы склеятся в один. Что делать?

1) использовать <br>, который в HTML вызывает принудительный перевод строки. Минус: в консольке <br> просто выведется как есть и ничего не переведет.

2) Поставить в начале скрипта header("Content-Type: text/plain; charset=utf-8"); Эта команда пошлет заголовок Content-Type, который говорит браузеру что страница представляет собой не HTML, а обычный текст и ее надо отобразить как есть. В консоли header() ничего не делает, потому при таком способе твой скрипт будет одинаково работать и в браузере, и в ideone, и в консоли.

!xnn2uE3AU. Суб 26 Окт 2013 06:26:11  #197 №329888 

>>329877

С 10 тегами ты ничего не сверстаешь, так что пользы от этого будет чуть менее нуля. Но знать HTML/CSS конечно неплохо.

Аноним Суб 26 Окт 2013 11:19:46  #198 №329907 
1382771986468.png

Ладно, пока закончу задачи, потом уже перейду к основам хтмл и цсс.
Пикрилейтед — ЧЯДНТ? Функция должна выдавать рандомное число, а выдает ебаное ничего. Ее как-то иначе надо писать?

Аноним Суб 26 Окт 2013 11:23:44  #199 №329908 

О, получилось.

Аноним Суб 26 Окт 2013 11:24:09  #200 №329909 
1382772249303.png

>>329908
Отклеилось.

Аноним Суб 26 Окт 2013 12:28:45  #201 №329919 

>>329907
Так ты ж смотри что должна функция принимать — то ей и давай

Аноним Суб 26 Окт 2013 14:10:16  #202 №329941 

>>329826
Про порядок понял, спасибо. Чтобы это обойти нужно в квадратные скобки всё обернуть, да?

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

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

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

Аноним Суб 26 Окт 2013 19:19:24  #203 №329988 

Респект и уважуха ОПу. Буду учить, начинать с нуля.

Аноним Суб 26 Окт 2013 19:25:03  #204 №329990 
[url]

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

!xnn2uE3AU. Суб 26 Окт 2013 23:43:49  #205 №330065 

>>329909

Молодец, сам разобрался.

>>329941

> Про порядок понял, спасибо. Чтобы это обойти нужно в квадратные скобки всё обернуть, да?

Нет. Квадратные скобки обозначают «одиз из символов», например, [0-9a-f] значит «цифра от 0 до 9 или буква от a до f».

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

\\s(собака|кошка)

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

\\sсобака|кошка

то это равносильно

(\\sсобака)|(кошка)

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

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

!xnn2uE3AU. Суб 26 Окт 2013 23:46:19  #206 №330066 

>>329990

Есть одеск-терд в /wrk: http://2ch.hk/wrk/res/64049.html
Есть где-то тут в /pr зарплатный тред. Там кулсторей, я думаю, будет больше.

Аноним Вск 27 Окт 2013 01:09:10  #207 №330074 

>>327455
>Время: 2-3 дня
http://ideone.com/QR7OfU
Написал простенький калькулятор, задумался над тем, как быть с унарными операторами:
-x^2 = -(x^2)
fac x ^ 2 = (fac x)^2
2^-x^2 = ?
fac fac x = ?
- fac x = -(fac x)
Прочел несколько статей, включая http://www.cse.chalmers.se/~nad/publications/danielsson-norell-mixfix.pdf
В итоге меня осенило: сделать два вида префиксных операторов. Операторы первого вида имеют наивысший приоритет (в коде у постфиксных выше) и не имеют ассоциативности. Операторы второго вида имеют задаваемые приоритет и ассоциативность. В коде вторые называются "принфиксными".
В коде множества постфиксных и инфиксных операторов имеют пустое пересечение, что можно исправить, множества принфиксных и префиксных операторов тоже имеют пустое пересечение, но это исправить нельзя в силой самой идеи разделения.
Потенциально можно добавить и другие стейтменты кроме(_), if_then_else_end например, но лень.

Аноним Вск 27 Окт 2013 01:56:28  #208 №330084 
1382824588261.png

Вот же я хуярю. Опять даже не смотрел пикчу к заданию, а только прочитал про if и else. Охуенная штука, это ваше программирование. Раньше совсем не понимал как это все работает и даже не мог представить. Только не пойму какое это имеет отношение к сайтостроению.

!xnn2uE3AU. Вск 27 Окт 2013 02:17:03  #209 №330089 

>>330084

Неплохо, но там есть еще одно хитрое условие: если у анона и у ИИ у обоих выпали даблы (по 2 одинаковых числа, например у анона 2 и 2, у робота 3 и 3), то победила дружба независимо от числа очков.

> Только не пойму какое это имеет отношение к сайтостроению.
Так начинаем изучение с самых основ. Переменные, if и else — это все равно что кирпичи, из которых строятся большие дома, и они применяются на сайтах, например так (это пример, потому часть кода написана по-русски):

// страница только для залогиненных
// ! значит «не»
if (!пользовательЗалогинен()) {
показать сообщение, что надо сначала залогиниться
} else {
показать нужную страницу
}

или так:

// Если пользователь купил товаров на определенную сумму,
// покажем ему сообщение
$price = получитьОбщуюСтоимостьЗаказа();
$bigPrice = 3000;

if ($price > $bigPrice) {
показатьСообщение("Похоже, вы купили товаров больше чем на {$bigPrice} р. Спасибо! Кроме чудесных товаров, вы получите бесплатную доставку, дисконтную карту и небольшой подарок от нашего магазина!");
}

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

!xnn2uE3AU. Вск 27 Окт 2013 02:18:30  #210 №330090 

>>330084

Алсо, \n принято писать после выводимого текста, а не перед.

Аноним Вск 27 Окт 2013 02:38:06  #211 №330092 

>>330089
А, над хитрым условием завтра на работе поколдую, хотя уже в голове представил это всё. Просто поставить условие, что если переменная randomuser и randomuser2 одинакова, то проверить не одинаковы ли randomAi и randomAi2, ну и при совпадении вывести эчо о ничьей, естественно.

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

Аноним Вск 27 Окт 2013 02:40:48  #212 №330093 
1382827248956.jpg

>>330090
ОК, запомнил. Держи 3D шлюху, а я спать.

!xnn2uE3AU. Вск 27 Окт 2013 02:41:11  #213 №330094 

>>330074

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

Что касается кода, в хаскелле я особо не разбираюсь, но код что-то с виду не очень:

- плохие, невыразительные идентификаторы вроде DD, DDD, toOp', ifp, tts
- магические числа в коде: [("-", (negate, (5, True)))]б toOp 3
- запятые в начале строки смотрятся имхо ужасно
- l == "(" = ifp (<= 2) $ uncurry (add 3) =<< parse' ls выглядит как какой-то прикрученный костыль. Что еще за uncurry add 3? Почему 3?
- Функция eval напоминает какой-то зоопарк. Разве в хаскелл не так принято:

eval Number value = value
eval Add list = foldl + . map eval list
eval Multiply list = foldl * . map eval list
eval Power list = foldr ** . map eval list

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

Функция parse выглядит сложно и запутанно, в то время как Хаскелл — лаконичный и выразительный язык. Скорее всего, ты там что-то криво написал, но я не могу понять что.

Выражение «2 + -3 * 5» почему-то дает Nothing.

!xnn2uE3AU. Вск 27 Окт 2013 02:42:18  #214 №330096 

>>330092

Если будешь стараться, то сможешь запилить что-нибудь даже раньше, через 2-3 месяца, а не через полгода.

Аноним Вск 27 Окт 2013 04:52:26  #215 №330108 

>>330094
>Определить, является ли минус унарным или бинарным легко можно по предыдущему токену (начало строки, число, ( или ), оператор).
Проблема была не в этом, а в разном поведении разных унарных операторов. Хаскелль со мной согласен: http://ideone.com/TaJGxq http://ideone.com/kqHaCU
Только в нем унарный минус является не частным случаем общего правила, а синтаксическим сахаром.
>плохие, невыразительные идентификаторы вроде DD, DDD, toOp', ifp, tts
Зато весь код в голове на манер J.
>магические числа в коде
Без них было бы еще хуже, поскольку используются сравнения и prinf_prev_val <= val выглядело бы еще магичнее. С числами намного проще, если перед глазами есть их расшифровка.
>запятые в начале строки смотрятся имхо ужасно
Это стандарт для хаскелля.
>ifp (<= 2) $ uncurry (add 3) =<< parse' ls
parse' ls возвращает Maybe (t, ls'), где t — это Statement, а ls' — оставшаяся часть строки, после того, как это стейтмент был собран. (=<<) — это перевернутый монадный бинд, в данном случае распаковывает значение справа, то есть делает из него (t, ls') и передает в функцию uncurry (add 3).
add i t = ff (t :) . parse'' i
или что то же самое: add i t ls = ff (t :) $ parse'' i ls
parse'' i ls возвращает почти то же, что parse' ls, только вместо Statement список из Expr. Считай незаконченный стейтмент.
ff = fmap . first
ff (t :) просто прибавляет к этому списку один элемент.
uncurry из-за того, что результатом parse'' является кортеж. uncurry просто применяет функцию к кортежу, а не к к каждому подряд как обычно.
ifp (<= 2) проверяет, ожидается ли операнд.
В итоге эта строка кода получает следующий стейтмент, добавляет его к списку уже существующих значений типа Expr, продолжает парсить строку с того места, где закончился стейтмент. Или возвращает Nothing, если парсинг где-то зашел в тупик.
>Функция eval напоминает какой-то зоопарк. Разве в хаскелл не так принято:
Только для простых случаев.
>Ну а еще лучше, как-то отдельно вынести определение всех операций, чтобы для каждой задавался приоритет, лево/право-ассоциативность, бинарность/унарность, функция вычисления.
[("-", (negate, (5, True)))] — минус, которому соответствует функция negate, имеет приоритет 5 и левоассоциативен. Для ассоциативности и правда надо было константы завести. Тип оператора приведен в той же строке.
>Функция parse выглядит сложно и запутанно, в то время как Хаскелл — лаконичный и выразительный язык. Скорее всего, ты там что-то криво написал, но я не могу понять что.
Нет ничего лаконичнее, чем пробрасывать строку, которая парсится, по всему стектрейсу туда и обратно. И оборачивать результат в монаду Maybe. Можно было бы завернуть все в монаду State или Reader, но вряд ли это выглядело бы лаконичнее.
>Выражение «2 + -3 * 5» почему-то дает Nothing.
Потому что "принфиксный" оператор может стоять только в начале стейтмента. if -1 == (-1) then ...

Аноним Вск 27 Окт 2013 04:54:54  #216 №330109 

>>330108
>а не к к каждому значению подряд

Аноним Вск 27 Окт 2013 05:29:20  #217 №330111 

>>329747
Не знаю что ответить
@
Доебусь до слов

> Ядро суси
Под этим, столь не очевидным, словосочетанием я имел ввиду: скомпилированное, программистами компании Novell, ядро Linux, с теми патчами и флагами, которые посчитали необходимыми в определенном совете этой компании.

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

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

!xnn2uE3AU. Вск 27 Окт 2013 06:26:58  #218 №330118 

>>330111

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

> аксесс контрол лист встроен в ext, причем как концепция, а не конкретная реализация
Поддержка ACL должна быть прежде всего в ядре. В статье по ссылке написано:

> Patches that implement POSIX 1003.1e draft 17 ACLs have been available for various versions of Linux for several years now. They were added to version 2.5.46 of the Linux kernel in November 2002

Добавлены в ядро в 2002 году. При чем тут дистрибутив или тем более файловая система?

В то время, как в Windows ACL появились в NT3.1 (в Win95/98 по моему вообще не было разрешений у файлов), а вышла она в 1993 году. Пруф не могу найти, но есть вот это: http://support.microsoft.com/kb/100012 — там упоминается setacl.exe

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

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

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

!xnn2uE3AU. Вск 27 Окт 2013 06:36:22  #219 №330119 

>>330108

> Зато весь код в голове на манер J.
Только в твоей голове и только пару недель. И код помещается в голову только пока ты пишешь маленькие программки на 200 строчек — в реальных продуктах столько кода, что ты его весь не запомнишь никак. А как же умение работать в команде и все такое.

> Без них было бы еще хуже
Нет, это просто неаккуратно написанный код. Автор кода не смог придумать красивое решение и слепил как придется. Говорю как человек, который смотрит со стороны. Я предпочитаю понятный код, а не код, который я сначала должен расшифровать, выписывая сокращения на отдельный листочек. Это еще называется write-only код.

> Потому что "принфиксный" оператор может стоять только в начале стейтмента
Значит, использованный тобой алгоритм не очень подходит к задаче. Если мне память не изменяет, тут можно использовать recursive descent, либо какой-то более крутой алгоритм парсинга со стеком, в который мы добавляем или вынимаем операторы в зависимости от приоритета.

Аноним Вск 27 Окт 2013 06:56:43  #220 №330122 

>>330119
>Только в твоей голове
В других головах нет нужды.
>и только пару недель.
Нет.
>И код помещается в голову только пока ты пишешь маленькие программки на 200 строчек — в реальных продуктах столько кода, что ты его весь не запомнишь никак.
Я знаю, что мой код нечитаем, но я решал паззл, а не писал программу, в которой кто-то будет разбираться. Иначе я сделал бы его более читаемым.
>Нет, это просто неаккуратно написанный код. Автор кода не смог придумать красивое решение и слепил как придется.
У меня ОКР, я все делаю аккуратно.
>Значит, использованный тобой алгоритм не очень подходит к задаче.
Это сделано умышленно. Даже в задании написано "2 + (-3)". Достаточно заменить i rem 4 + 1 на (i + 1) rem 5, чтобы принфиксные операторы могли встречаться в середине стейтмента: http://ideone.com/oZkmfc
>либо какой-то более крутой алгоритм парсинга со стеком, в который мы добавляем или вынимаем операторы в зависимости от приоритета.
Тут что-то такое и используется, только стек вызовов функций вместо явной структуры данных.

Аноним Вск 27 Окт 2013 06:58:32  #221 №330123 

>>330122
>Достаточно заменить
А нет, недостаточно, ответ-то неправильный.

Аноним Вск 27 Окт 2013 07:05:03  #222 №330125 

>>330123
http://ideone.com/uyIQWl

Аноним Вск 27 Окт 2013 07:51:11  #223 №330128 

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

> в Windows ACL появились в NT3.1
> Пруф не могу найти

> setacl.exe
> Short history[edit]
> March 2001 SetACL program 0.x development begins
http://en.wikipedia.org/wiki/SetACL#Short_history

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

если ты про права которые задаются например утилитой chmod, тогда блять съеби нахуй и не пудри мне мозги, эта утилита существовала еще до появления ведра и по дефолту входила в GNU/Linux, и права эти поддерживались еще даже в ext, и в предшествующих fs собственно тоже.
а если взять файловые системы которые использовала microsoft, то только начиная с ntfs, потому что их вынудили, сами бы они не догадались добавить, и работа с этими правами осуществлялась только через api, ну то есть только по средствам вызова нужных функций ядра, ни в терминале, ни в проводнике, да блять короче нигде в стандартном софте это не использовалось, как и сейчас наверное.

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

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

по поводу остального просто иди нахуй

!xnn2uE3AU. Вск 27 Окт 2013 10:47:39  #224 №330137 

>>330128

Ты наверно ругаешься, пытаясь прикрыть свою неграмотность.

> March 2001 SetACL program 0.x development begins
Это другая программа. Та входила в состав Windows NT 3.1 (о чем написано внизу в Knowledge Base). Когда она вышла, нагугли сам.

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

> то только начиная с ntfs
NTFS появилась вместе с Windows NT.

> потому что их вынудили, сами бы они не догадались добавить
Ох лол.

> и работа с этими правами осуществлялась только через api, ну то есть только по средствам вызова нужных функций ядра, ни в терминале, ни в проводнике, да блять короче нигде в стандартном софте это не использовалось, как и сейчас наверное.
Правая кнопка — свойства файла — доступ. В терминале — команда cacls.

> иксы изобретали в эмайти вроде как
Иксы — это display server, а не графическое окружение.

И вообще, ты зря споришь. Windows — коммерческая система, в которую вложены тонны денег и которую разрабатывали вполне талантливые разработчики (впрочем, в последние годы с этим что-то не очень, но в 90-е годы они были впереди планеты всей, взять тот же plug and play который у них впервые появился или сеть с автоконфигурацией).

Аноним Вск 27 Окт 2013 13:46:41  #225 №330169 

Что не так?
http://ideone.com/j6jbYB

!xnn2uE3AU. Вск 27 Окт 2013 13:54:19  #226 №330172 

>>330169

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

!xnn2uE3AU. Вск 27 Окт 2013 13:55:20  #227 №330173 

>>330169

Алсо, опечатка: monthly и monhtly.

Аноним Вск 27 Окт 2013 14:01:09  #228 №330175 

>>330173
точно

Аноним Вск 27 Окт 2013 14:28:55  #229 №330186 
1382869735364.png

Фух, блять, наконец-то получилось. Да уж, тут без пикчи-мануала я соснул бы. То действие с двойными скобками и && сам бы не придумал. Сделал вроде, не дочитав пример в задаче, но потом скрипт срабатывал при даблах у обоих игроков так, что выдавал не только сообщение о ничьей, а еще и признавал одного из игроков победителем. Без команды exit() хуита получалась, короче. Еще и вставить ее нужно перед сообщениями о результатах.

Сейчас буду пилить рулеточку.

!xnn2uE3AU. Вск 27 Окт 2013 14:34:14  #230 №330190 

>>330186

Давай, пили, рулетка вроде несложное задание.

Аноним Вск 27 Окт 2013 15:17:05  #231 №330204 

Допердолил таки свои регэкспы.

Из подводных камней на данный момент вижу только один - если регулярка сжирает, к примеру, ".Ж", то "жы" уже не видит. Можно было бы в разных statementах обрабатывать разные группы ошибок, но может можно как-то в одном регэкспе это сделать? Кстати, ОП, как statement дословно перевести на русский? Встречал в книгах перевод "инструкция", но это как-то ЭВМ и БЭСМ-2 попахивает.

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

Ну и пользоваться байтовыми смещениями в уникоде как-то не оче комильфо. Мысль о том, что стоило бы всё в windows-1251 временно перевести только сейчас пришла.

В общем, ОП, жду твоих комментариев.

http://viper-7.com/SdCEAZ

!xnn2uE3AU. Вск 27 Окт 2013 16:11:19  #232 №330222 

>>330204

Вообще, смотрится неплохо, ошибки еще и цветом подсвечиваются, мило, жаль только причина ошибки не пишется. Увы, на правильном тексте твою программу глючит: http://viper-7.com/a7exAt

Вот тут нехорошее место: preg_replace("/{$errorName}(?=\S*\s\S*$)/ui", — ты подставляешь строку как часть регулярки, а ведь в ней могут быть спецсимволы (например /), которые сломают твою регулярку. Чтобы такого не было, надо пропустить строку через preg_quote — она добавит ко всем специсмволам бекслеши.

Также, раз ты используешь вывод в HTML, хорошо бы использовать htmlspecialchars(), а то будет XSS. Тут конечно исходная строка подставляется тобой же, но все равно, лучше использовать эту функцию.

> Кстати, ОП, как statement дословно перевести на русский
statement значит «предложение» в смысле «Этот текст состоит из 3 предложений», также «заявление» (в юридическом смысле, например заявление, произнесенное в суде). В программировании можно, наверно перевести как «команда», но тогда возникает вопрос, как переводить command. Так что подойдет «инструкция» или «утверждение» (но тут стоит помнить, что утверждение — уже используется для перевода слова assertion) (ссылочка: http://slovari.yandex.ru/statement/перевод/#lingvo/ )

> можно как-то в одном регэкспе это сделать?
Можно, но надо отказаться от preg_match_all, а использовать preg_match + цикл. Она ищет только первое совпадение, но ей можно передать offset, начиная с которого она будет искать.

Насчет поиска соседних слов. Чтобы найти ближайший пробел справа/слева от данного символа, можно использовать strpos/strrpos (или mb_strpos/mb_strrpos) вместо велосипеда с циклом и захватом пробелов регуляркой. Алсо, байтовый отступ от начала строки (который возвращает preg_match_all) можно легко преобразовать в символьный с помощью небольшого костылька:

$offsetChars = mb_strlen(substr($string, 0, $offsetBytes));

Чтобы окружить строку спанами, можно писать проще (или я что-то не понял?):

// Массив заполняем циклом из найденных ошибок
$replace = array(
"{$error[1]}" => "<span>{$error[1]}</span>",
"{$error[2]}" => "<span>{$error[2]}</span>",
....
);
$htmlString = strtr($string, $replace);

Или же использовать исходное выражение и preg_replace:

$htmlString = preg_replace($regex, '<span>$0</span>', $string);

Не хочешь оптимизировать и улучшить программу?

!xnn2uE3AU. Вск 27 Окт 2013 16:12:30  #233 №330223 

>>330204

> Мысль о том, что стоило бы всё в windows-1251 временно перевести только сейчас пришла.
Не стоит, однобайтовые кодировки надо забыть. А то японские буковки будут теряться, нехорошо.

Аноним Вск 27 Окт 2013 16:22:40  #234 №330226 
1382876560916.jpg

Анон, какая лучшая книжка по PHP + Mysql?

!xnn2uE3AU. Вск 27 Окт 2013 16:36:33  #235 №330230 

>>330226

В нашем треде советуют Мэтт Зандстра «объекты, шаблоны и методики программирования для PHP», но она только по PHP и нужны базовые знания (функции/переменные/циклы).

Аноним Вск 27 Окт 2013 17:05:21  #236 №330235 
1382879121543.png

>>330190
Такие дела.

Аноним Вск 27 Окт 2013 17:19:33  #237 №330238 

>>330137
спасибо капитан за столь очевидные пояснения

> шиндовшс кококомерческая арганизация поэтому априори лучше.

ну пиздец ты долбоеб, ты хотя бы выяснил бы что такое acl и потом бы кудахтал. ну и как я ожидал ты отклонился от темы

Аноним Вск 27 Окт 2013 17:21:34  #238 №330240 

>>330222
>Увы, на правильном тексте твою программу глючит: http://viper-7.com/a7exAt

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

>Чтобы окружить строку спанами, можно писать проще (или я что-то не понял?)

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

Улучшить хочу, завтра займусь. Спасибо тебе.

Аноним Вск 27 Окт 2013 17:52:54  #239 №330248 

Пожалуюсь вам, ребята-обезьянята. В общем, так-то я прогаю на C#, но вздумал написать своб борду. Решил сделать всё по модному, чтобы всё в ООП и всё такое. Но получилось не всё. На данный момент, у меня уже около половины скриптов в хрен знает каком стиле. Неудобно, постоянно путаюсь, пишу лишний код, дебажу, ужасаюсь и переписываю. Думаю, надо отдохнуть, выпилить большую часть кода и подойти к этому со свежей головой.

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

sageАноним Вск 27 Окт 2013 18:28:02  #240 №330261 

>>330248
>C#
>скрипты
Тебя в детстве били?

Аноним Вск 27 Окт 2013 19:29:42  #241 №330281 

>>330261
А чё, похапэ – не скрипты что ли?

Аноним Вск 27 Окт 2013 20:21:58  #242 №330312 

>>330261
C# это ОПП головного мозга. Там названия функций пишет с большой буквы!

Аноним Вск 27 Окт 2013 20:54:55  #243 №330322 

>>330312
Ну уже ничего не поделать. Мой

_мозг.УжеНеБудетПрежним();
Аноним Вск 27 Окт 2013 21:00:46  #244 №330323 

>>330322
Ты про нэймспэйсы забыл.

Аноним Вск 27 Окт 2013 21:49:05  #245 №330332 

>>330323
Да и хрен с ними.

Аноним Пнд 28 Окт 2013 00:04:40  #246 №330376 
1382904280241.jpg

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

Аноним Пнд 28 Окт 2013 00:15:22  #247 №330378 

Каждый даун сможет выучить пхп, верно?

Аноним Пнд 28 Окт 2013 00:39:43  #248 №330384 

>>330376
Да нет там никакого результата. Всего понемногу: скрипт установки, БД, создание таблиц, метод для работы с БД, авторизация и пара классов, предназначенных для вывода постов. Но оно всё как-то не вяжется. Получится только лишняя нагрузка и, в итоге, велосипед, состоящий из костылей. Надо было с самого начала задрочить полностью под ООП, либо делать как у людей.

А выше в треде, ссылка на гитхаб с бордой – твоих рук дело.

Аноним Пнд 28 Окт 2013 01:00:25  #249 №330386 
1382907625405.jpg

>>330384
Вот мой вариант борды:
https://github.com/cthulhu314/scalaba

Scala + spray + angular.js + bootstrap. Супер-модно, супер молодежно.
UI пока толком не работает. Серверная часть запускается и даже добавляет и показывает треды и посты через json.

Аноним Пнд 28 Окт 2013 01:10:07  #250 №330390 

>>330386
А, вот оно что. Перепутал тебя с другим аноном, у которого борда на пыхе сделана.
Занятно посмотреть, что у тебя там.
На первый взгляд, очень модно, не по-быдлокодерски.

Аноним Пнд 28 Окт 2013 01:14:05  #251 №330392 
1382908445048.jpg

>>330390
>не по-быдлокодерски
Это ты мой фронтенд не видел. Я в этом деле почти к нулю близок. Особенно в вёрстке.

Аноним Пнд 28 Окт 2013 01:20:03  #252 №330394 
1382908803209.jpg

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

Аноним Пнд 28 Окт 2013 01:34:42  #253 №330396 

>>330386
Mongo для аиб? Хуевая затея. Если только на поиграться.

Аноним Пнд 28 Окт 2013 01:42:38  #254 №330398 

>>330396
А для чего mongo не хуевая затея? Монго это самое дно, хуже некуда.

Аноним Пнд 28 Окт 2013 01:56:55  #255 №330400 
1382911015054.jpg

>>330396
>Если только на поиграться.
Для чего и делалось. Так что принимаю реквесты на добавление поддержки ещё более извращенных вариантов БД.

Аноним Пнд 28 Окт 2013 02:46:16  #256 №330407 

>>330398
Ну почему же. Если много готовых данных и сайт используется больше для чтения, то вполне.
>>330400
Это не извращенность, а просто неподходящий вариант для успешных борд.

Аноним Пнд 28 Окт 2013 04:55:54  #257 №330422 

>>330407
А какой вариант подходящий?

!xnn2uE3AU. Пнд 28 Окт 2013 07:38:19  #258 №330435 

>>330248

Есть такая штука, как MVC. С ней все получается логично и аккуратно, тут модельки, тут контроллеры, тут вьюшки. Если ты используешь .NET, наверняка у вас есть какой-нибудь стандартный фреймворк для MVC, поддержки БД и прочего.

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

Вакабу не бери, как я понимаю, это набор Перл-скриптов на костылях и файлах.

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

!xnn2uE3AU. Пнд 28 Окт 2013 07:42:42  #259 №330437 

>>330312

ООП головного мозга — это когда вместо a + b пишут Add2NumbersStartegy extends MathStrategy<Type, count, Operator> extends AbstractStrategy + фабрику для их создания. Ну и для a и b конечно еще класы-обертки добавляют.

А C# — как я понимаю, мощный, выразительный и современный язык программирования, к тому же с типизацией.

>>330378

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

!xnn2uE3AU. Пнд 28 Окт 2013 07:47:20  #260 №330438 

>>330392

Можешь мою верстку взять за основу, если хочешь: https://github.com/codedokode/board-markup — PHP там используется только ради того чтобы подключить один файл из другого, по сути чистый HTML.

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

Аноним Пнд 28 Окт 2013 10:09:15  #261 №330452 

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

!xnn2uE3AU. Пнд 28 Окт 2013 10:25:10  #262 №330455 

>>330452

Такой стиль кодирования. В майкрософт это и в WinAPI есть, подозреваю еще с тех времен когда виндоус была написана на Паскале.

Аноним Пнд 28 Окт 2013 12:44:12  #263 №330475 
1382949852694.png

Почему ошибка? Из за бесконечности скрипта с выводом сообщения "9000"?

Аноним Пнд 28 Окт 2013 13:58:16  #264 №330492 

>>330475
Цикл фор:
стартовое условие(присваивание); конечное условие(сравнение); итерация
у тебя:
стартовое условие(присваивание); конечное условие(присваивание); итерация

!xnn2uE3AU. Пнд 28 Окт 2013 14:32:59  #265 №330500 

>>330475

Проблема во втором цикле, там вторым пунктом идет условие, а ты написал присваивание, и получился вечный цикл. Если ты хотел написать «пока a равно 9000», то надо писать ==

for ($a = 9000; $a == 9000; ...) {

Ну и третий пункт, ($a * 10 - 81000) ничего не делает так как ты считаешь выражение, но ни в какую переменную это не сохраняешь и результат просто выкидывается.

Аноним Пнд 28 Окт 2013 15:05:28  #266 №330510 

>>330492
>>330500
Ох бля, не заметил, но я и хотел "поделить на ноль", т.е создать вечный цикл. Ошибки же, как таковой, нет. Если сравнение верно, то поступает команда опять получить 9000 и в следующем цикле сравнить их с 9000, и так по кругу
Почему конкретно получается ошибка? Может это ошибка не самого кода, а ограничение среды, у которой буфер (или что там за НЕХ) не резиновый?
Если я и сравню их через знак ==, то выйдет то же самое, что и при =, ну и дам переменную команде (как дать имя уже существующей переменной которая меняется?), то команда опять сделает 9000.
Сейчас попробую.


!xnn2uE3AU. Пнд 28 Окт 2013 15:13:07  #267 №330512 

>>330510

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

!xnn2uE3AU. Пнд 28 Окт 2013 15:14:12  #268 №330513 

>>330475

Алсо, строки надо всегда брать в кавычки: $bh = "....";

Аноним Пнд 28 Окт 2013 20:03:57  #269 №330555 
1382976237438.png

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

>>330512
Вот вот, что-то такое я и предполагал.
>>330513
Чтобы тексты не путались с переменными, добавляя лишние символы?

Аноним Пнд 28 Окт 2013 21:02:52  #270 №330568 

Помогите нубу, пожалуйста. Grammar Nazi задание. http://ideone.com/kEuwN5

Как можно сослаться на "$i-1"-ый элемент массива?

Опираясь только на курс ОПа, в коде этого господина >>330204 не смог разобраться. МЫ ТАКОГО НЕ ПРОХОДИЛИ Бессистемное курение мануалов на сайте только добавило каши в голове.

!xnn2uE3AU. Втр 29 Окт 2013 12:07:50  #271 №330744 

>>330568

> Как можно сослаться на "$i-1"-ый элемент массива?
$value = $array[$i - 1];
echo $value;

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

!xnn2uE3AU. Втр 29 Окт 2013 12:36:19  #272 №330753 

>>330568

> Опираясь только на курс ОПа, в коде этого господина >>330204 не смог разобраться
А что непонятно? Напиши, я поясню.

По твоему коду:

- Не обнаруживается отсутсвие пробела после точки: http://ideone.com/rkIV2Q

- для обхода массива есть специальный вид цикла foreach, он лучше и удобнее for:

foreach ($words as $word) {
...
}

Правда, если тебе надо получать предыдущее слово, то наверно лучше использовать for. Ну или foreach + переменная в которой хранится предвдущее слово.

Алсо, ты пишешь $i <= count($words), но в массиве из 4 элементов индексы будут 0, 1, 2, 3, а элемента с индексом 4 там нету. Потому надо писать не <= а <.

- preg_match('/[^,]^/', $words[$i-1]) — неверное выражение. Если ты хотел написать «не запятая в конце» то надо писать '/[^,]$/' . Символ ^ обозначает привязку к началу строки (если он стоит в начале, а если нет то он обозначает просто символ крышечки), а конец обозначается $. Твое же выражение значит «не запятая, а за ней крышечка».

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

!xnn2uE3AU. Втр 29 Окт 2013 12:57:58  #273 №330758 

>>330555

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

Алсо, запости-ка ссылку на решение, я еще проверю. Что-то у меня ощущение, что она у тебя неправильно считает.

Если взять кредит в 1000 р, должно получаться всего выплачено 2030 р, если 4000 р то всего выплачено 6123р, если 40000 то 61270.

По коду:

> for ($month; ....)

Тут первая часть цикла ничего не делает. Она берет значение переменной $month и ничего с ним не делает. Надо либо писать for ($month = .... ; ... ; ...) если ты хочешь присвоить какоето значение в $month, либо если ты ничего не хочешь делать то писать просто for ( ; $summ < 4000 ; $month += ... ) — обрати внимание, в for внутри скобок всегда ровно 2 точки с запятой.

> чтобы переменные можно было временно менять на ходу (типа переменные переменных) и использовать в примерах
Может, просто завести еще пару отдельных переменных и менять их?

> Чтобы тексты не путались с переменными, добавляя лишние символы?
Ну да. Иначе если ты пишешь $a = 2 + 2 непонятно, ты хочешь посчитать выражение и поместить в $a результат или же ты хочешь строку из цифр 2 и знака плюс. Кавычки позволяют различить эти ситуации:

$a = 2 + 2; // = число 4
$b = "2 + 2"; // = строка "2 + 2"
$c = 4; // = число 4
$d = "4"; // = строка из одного символа «4»

Когда ты пишешь $a = lalala то PHP сначала думает что ты имел в виду константу lalala, но такой константы нет, и он понимает ее как строку. И при этом выводится предупреждение. Но если ты напишешь 2 слова ,tp кавычек:

$a = lalala lololo;

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

Аноним Втр 29 Окт 2013 14:38:47  #274 №330782 

>>330568
Я сам там разобраться не смогу через неделю. :3
Ну и использовал, конечно, не только то, что у ОПа в туториале было.

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

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

Но вроде допердолил до приемлемого состояние. Хотя почти уверен, что что-то пропустил.

http://viper-7.com/UDKFp7

Аноним Втр 29 Окт 2013 17:09:43  #275 №330818 

>>330753
Спасибо за ответ. Эх, оказывается, я уже был у финиша. Напекло мне дико от
>это не работает внутри строк с кавычками

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

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

Вот код с исправлениями: http://ideone.com/KdxuHX

Аноним Втр 29 Окт 2013 17:11:14  #276 №330819 

>>330818
*отсутствие пробела после точки

самофикс

Аноним Втр 29 Окт 2013 18:05:57  #277 №330836 

Привет братве, привет доброкунчик! Я тот антуанус, который пилил борду, геокодер и прочую приблуду. Сейчас дико парюсь с уями, интересно - пиздец. Встала задача фильтровать данные для грида, но колонки по которым идет фильтрация в гриде не должны выводиться. Подскажите как такое делается. Прилепил форму для поиска, чуть выше грида, но что с ней делать толком не знаю. С аяксами, jquery, js не дружу, так что если доброкунчик пояснит в хард-кор стайле, буду примного благодарен.

Аноним Втр 29 Окт 2013 18:20:46  #278 №330842 

>>330836
Наверняка у колонок есть свойство "visible" или метод "show", погугли.

Аноним Втр 29 Окт 2013 18:24:57  #279 №330844 

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

!xnn2uE3AU. Втр 29 Окт 2013 18:35:24  #280 №330845 

>>330782

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

Теперь по ошибкам. У тебя выводится первая строка с ошибкой неправильно:

> 1: � зделал но

(там вместо буквы А битый символ). Выглядит так, как будто ты когда резал строку отрезал один байт от русской буквы (которая в utf-8 занимает 2 байта). Почему? Попробуем сдампить $offset и $errorOffset. Они одинаковы. Как так может быть, ведь русские буквы занимают 2 байта и $errorOffset должен быть в 2 раза больше $offset?

Очень просто. Кто-то забыл поставить в начале скрипта mb_internal_encoding('utf-8'), потому mbstring-функции используют какую-то другую кодировку, которая видимо однобайтовая, и работают неправильно. Не забывай выставлять кодировку когда работаешь с функциями mbstring. Если добавить mb_internal_encoding, баг исчезает.

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

> (з|с)десь
Перестарался же. Здесь — правильное слово.

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

> if (false === $rightOffset = mb_strpos($str, ' ', $errorOffset)) {

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

if (false === ($rightOffset = mb_strpos($str, ' ', $errorOffset))) {

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

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

!xnn2uE3AU. Втр 29 Окт 2013 19:47:44  #281 №330876 

>>330818

Все хорошо сделано. Только а/но — не предлог, а частица. предлоги — это например, «в», «на», «под» и подобные слова.

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

!xnn2uE3AU. Втр 29 Окт 2013 19:54:39  #282 №330879 

>>330836

Помню, помню. Ты про стандартный Yii грид говоришь или про какой-то другой?

Если речь о Yii, то там данные грид берет из dataProvider, а у него есть свойство criteria ( http://www.yiiframework.com/doc/api/1.1/CActiveDataProvider#criteria-detail ) — может, можно его использовать?

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

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

Аноним Втр 29 Окт 2013 20:13:27  #283 №330887 
1383063207894.png

>>330758
ideone.com/kMgJPA


В условии же не сказано именно про проценты от остатка долга, поэтому и считал от 40000.

Я пробовал присвоить $month значение 0, и это ни на что не повлияло.

$month же имеет значение вроде, т.к эта переменная обозначена и просчитана выше. Или "for" использует только "свою" переменную, которая идет первой в скобках?

Аноним Втр 29 Окт 2013 20:24:41  #284 №330893 
1383063881102.png

>>330887
Пофиксил концовку.

Аноним Втр 29 Окт 2013 20:30:52  #285 №330895 

>>330879
Обычный cgridview ну на самом не деле не обычный, а унаследованый от cgridview, обернутый в bootstrap, но это не важно . Фишка короче в том, что допутим у меня в контроллере DataProvider, настроенная criteria, у критерии compare, все есть, все настроено норм. Я гридом вывожу данные dataProvidera, а выше грида допустим есть у меня CActiveForm для той же модели, что и у грида->dataProvider. У формы конечно есть баттно. Как я понимаю нужно на баттон навесить всякого js, ajax и прочих не понятных мне вещей. Собс-на вот. Проблема просто в том что я не знаю js. Наверное придется навернуть мануала.

Аноним Втр 29 Окт 2013 23:43:20  #286 №330984 
1383075800919.png

Норм, или я где-то наебал систему/себя?

!xnn2uE3AU. Втр 29 Окт 2013 23:46:33  #287 №330985 

>>330895

Это надо разбираться в гриде. Вполне возможно что в нем нет возможности «отфильтровать записи по переданному извне критерию». Наверно, надо посмотреть JS-код этого грида, как там реализован фильтр, и посмотреть, можно ли вместо данных из поля ввода как-то передать эти данные снаружи.

Если можно — хорошо, если нельзя — надо писать как-то это самому.

!xnn2uE3AU. Втр 29 Окт 2013 23:55:07  #288 №330989 

>>330887

> $month же имеет значение вроде,
Нет не имеет. В первой части for пишется действие, которое выполняется перед началом цикла. Команда $month; ничего не делает. Ты с таким же успехом можешь просто написать for ( ; ....) то есть заменить $month на пустое место.

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

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

Также, проверь, правильно ли считает программа. Для суммы кредита в 1000 получается всего 2030, для 4000 получается 6123, для 40000 получается 61200 с копейками.

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

>>330893

Да, все верно.

Аноним Срд 30 Окт 2013 00:14:56  #289 №331000 

>>330989
Да я уже волосы на яйцах рву от баттхерта. Голова уже болит. Переписывал все с нуля три раза, а тут то одно не так, то другое. Не могу запилить переменную, которая будет остатком от кредита, к которому нужно прибавлять проценты, комиссию и 5000, и эту переменную писать в остаток кредита, где опять же надо искать остаток и проценты от него... Ну вот, уже запутался. Как по кругу хожу, одно действие требует второе, где без второго не произвести первое, а первое без второго. Кажется, что на листке бумаги и уме легче это все просчитать. Но это только кажется.
Сейчас все таки перестану выебываться и возьму шаблон из задания, переименую переменные в асслциативные себе и буду превозмогать.

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

Аноним Срд 30 Окт 2013 09:37:58  #290 №331075 

http://ideone.com/kb1UYo
Косметические изменения в функции eval. Переписал парсер на монадном трансформере. "Магические числа" оставил в коде, ибо чтобы было без них и это не был говнокод, надо писать FSM, а мне лень. Учитывая небольшое изменение в алгоритме — вместо того, чтобы сразу разбирать строку на лексемы, каждая обрабатывается отдельно — практически никаких отличий. Что хорошо видно на примере Функции modifyVal, которая делает то же, что до этого делала функция ff, только теперь с монадным трансформером, а не простым функтором. Почти целую ночь думал над тем, как реализовать функцию ifp, чтобы было так же удобно, пока не вспомнил про guard и MonadPlus. Геморроя много, отличий почти нет. На императивном языке это все заняло бы час. Раздражает постоянно держать в голове контекст вычисления, с монадами-контейнерами все намного проще.
Если еще есть хачкелисты, которые не скрыли этот тред, какие есть хорошие, но малоизвестные мануалы по монадам? И что вообще можно почитать не энтрилевельного?

Аноним Срд 30 Окт 2013 11:43:23  #291 №331088 
1383119003702.jpg

>>331075
См. Parsec - лучшее, что было придумано для ручного написания парсеров.

Аноним Срд 30 Окт 2013 13:32:14  #292 №331113 
1383125534768.png

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

!xnn2uE3AU. Срд 30 Окт 2013 13:41:53  #293 №331116 

>>331113

Это троллинг, чтобы программировать на Хаскелле, надо читать мануалы по программированию, а не учебник математики. Не верьте ему, аноны.

>>331075

Честно говоря, мне стало еще непонятнее. Любители Хаскелл, посмотрите код этого анона.

!xnn2uE3AU. Срд 30 Окт 2013 13:57:24  #294 №331120 

Хабр такой хабр. Есть полезная статья: http://habrahabr.ru/post/200096/

> Как обойти PopUp blocker в браузере в асинхронных запросах
В статье описано годное решение, например, для случая когда надо отправить аякс-запрос на сервер, и после получения ответа, открыть окно авторизации через соцсеть (это можно сделать только через попап-окно). Я даже помню, что сам сталкивался с такой проблемой но решения не придумал. Но хабрадети видят только слово «попап» и сразу же идут комментарии вроде «попапы не нужны» и минусы автору.

Зато какую-нибудь дебильную статью вроде «в Линуксе наконец то поддерживается видеокарта Y» или «как установить библиотеку Z для рельсов (с картинками)» или «злые правообладатели не смогли закрыть сайт с пиратским контентом» люто заплюсуют.

Аноним Срд 30 Окт 2013 14:25:55  #295 №331129 
1383128755160.png

>>331116
>Любители Хаскелл, посмотрите код этого анона.

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

>Не верьте ему, аноны.

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

!xnn2uE3AU. Срд 30 Окт 2013 14:32:29  #296 №331134 

>>331129

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

Видимл это зависит от образа мышления. Мне например, не помогает. Если я открываю книгу со слоном (learn for a great good) — то там все понятно описано. А если я начинаю читать про теорию категорий. то через 5 минут я это закрываю и откладываю в сторону. Мне все же привычнее мыслить списками/байтами/ссылками/значениями/функциями и подобными программисткими терминами, а не абстрактными математическими идеями. Справедливости ради, Хаскелл — язык программирования и работает на вполне конкретных списках, числах и байтах, а не на абстрактный понятиях.

Аноним Срд 30 Окт 2013 14:40:13  #297 №331135 
1383129613651.jpg

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

>Справедливости ради, Хаскелл — язык программирования

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

Аноним Срд 30 Окт 2013 17:08:09  #298 №331165 
1383138489418.png

>>330845
Окей, приму всё к сведению.
Про internal encoding - я у себя в php.ini прописал и не указываю в коде, потому и забыл. Мне кажется, на любом более-менее пристойном хостинге должна быть настроена поддержка UTF-8 по дефолту, или я ошибаюсь?

Твой вариант расстановки скобок в присваивании+сравнении, конечно, удачней. Меня удивило, что в коде Symfony (откуда я эту идиому утащил) скобок нет.

Остальное принял к сведению.

Вот свежачок - борьба с коррупционерами. Снова буду рад замечаниям.

http://viper-7.com/SROahz

Аноним Срд 30 Окт 2013 17:48:05  #299 №331170 

Ищу анона который поможет разобраться в одной простой задаче

Тестовое задание

очень надо плиз спс
[email protected]

!xnn2uE3AU. Срд 30 Окт 2013 17:53:13  #300 №331173 

>>331165

Вообще, хорошо решено, код выглядит аккуратно. Тем не менее, вот советы и замечания:

- ты не учел кучу букв. Пример: (В)олк, (H)ос, (K)ость, (M)е(m)ро, (T)олк, ®(p)ус(m)ь, (x)леб. Наверно, стоит подсвечивание сделать через preg_replace/preg_replace_callback (это вообще мощная функция, ей можно что угодно менять на что угодно).

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

> function($word) {
> return ($word == ' ') ? false : true;
> }

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


$words = array_filter($words, function ($word) {
return trim($word) !== '';
});


> [а-я]
В юникоде буква ё идет не после е, а отдельно ( http://unicode-table.com/en/#cyrillic ). Потому, чтобы ее учесть, надо писать [a-яё]

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


> Мне кажется, на любом более-менее пристойном хостинге должна быть настроена поддержка UTF-8 по дефолту, или я ошибаюсь?
Ни разу еще не встречал, чтобы было utf-8. Обычно по дефолту там прописана какая-то однобайтовая треш-кодировка для Западной Европы (с буквами типа a с точечками сверху, o с точечками и подобными). То же, если в линуксе ставить PHP с дефолтными настройками. Так что надо либо менять php.ini, либо прописывать в htaccess/в приложении каждый раз.
!xnn2uE3AU. Срд 30 Окт 2013 18:11:13  #301 №331175 
1383142273616.png

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

<-

Задачку я взял из этой статьи, не читайте ее, там написан ответ: http://habrahabr.ru/post/200190/

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

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

Аноним Срд 30 Окт 2013 19:04:41  #302 №331184 
1383145481950.jpg

>>331175
И правда, парой строчек:
http://ideone.com/USPKpt

Особо не проверял, но базовый набор тестов проходит.

Аноним Срд 30 Окт 2013 19:20:40  #303 №331185 

>>331175

>задачка из собеседования в компанию twitter

Меня примут в твиттор?

		static int getRainVolume(int[] wallHeight)
{
int maxHeight = 0;
int maxHeightIndex = 0;
for (int i = 0; i < wallHeight.Length; i++)
if (wallHeight[i] > maxHeight)
{
maxHeight = wallHeight[i];
maxHeightIndex = i;
}
int airLevel = 0;
int rainCollected = 0;
for (int i = 0, curHeight; i < maxHeightIndex; i++)
{
curHeight = wallHeight[i];
if (airLevel < curHeight)
airLevel = curHeight;
else if (airLevel > curHeight)
rainCollected += airLevel - curHeight;
}
airLevel = 0;
for (int i = wallHeight.Length - 1, curHeight; i > maxHeightIndex; i--)
{
curHeight = wallHeight[i];
if (airLevel < curHeight)
airLevel = curHeight;
else if (airLevel > curHeight)
rainCollected += airLevel - curHeight;
}
return rainCollected;
}


Правда, потратил я на это внезапно пол часа. Не спал давно.
Аноним Срд 30 Окт 2013 19:34:26  #304 №331187 

>>331184

Пиздец. Это не язык, а говно. Брейнфак лучше читается.

Аноним Срд 30 Окт 2013 19:38:59  #305 №331189 

>>331173

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

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

Вот еще задачку сделал, пока борду шатали.

http://viper-7.com/nhfBc8

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

http://viper-7.com/xp6twn

Аноним Срд 30 Окт 2013 20:01:24  #306 №331195 

>>331175

Давай ещё такие.

Аноним Срд 30 Окт 2013 20:11:42  #307 №331199 

>>331187
Ты хоть понимаешь, какой ты уёбок?

Аноним Срд 30 Окт 2013 20:23:28  #308 №331203 

>>331088
Parsec парсит леворекурсивные и праворекурсивные грамматики? Какой у него перформанс в худвем случае?
%%тонкий намёк на https://github.com/Engelberg/instaparse%%

Аноним Срд 30 Окт 2013 20:37:32  #309 №331208 

Ананас поясни мне за задачу в >http://archive-ipq-co.narod.ru по циклам. ту которая с айфоном
у меня весь пердак распотрошило уже.Брат умер, зависимость дикая Умом я все понимаю, но как сделать, что бы это говно работало я не знаю - ибо не вижу данное условие в теме вообще. Дай хотя бы направление.

!xnn2uE3AU. Срд 30 Окт 2013 20:46:04  #310 №331214 

>>331184

http://ideone.com/niEJKK

Почему-то в последнем примере выходит -6. Как так? мы вам перезвоним

Аноним Срд 30 Окт 2013 20:47:58  #311 №331215 

>>331175
http://ideone.com/1CunNa

Аноним Срд 30 Окт 2013 21:00:50  #312 №331221 

>>331214
http://ideone.com/Ji5QRH

Быстро фикс

!xnn2uE3AU. Срд 30 Окт 2013 21:08:46  #313 №331223 

>>331221

http://ideone.com/QXADbz

В последнем примере должно быть 5.

Аноним Срд 30 Окт 2013 21:14:13  #314 №331224 

>>331129
>Получилось нечто практически нечитаемое, т.к. протаскивание состояния туда сюда в хаскеле - это всегда куча проблем и неудобств и даже монада State не так уж и хорошо помогает в этом.
Парсек точно так же протаскивает состояние. Бинд в данном случае выполняет функцию слева, которая отгрызает кусок от строки и передает его в функцию справа. Оставшаяся часть строки — в контексте вычисления. Если бы были длинные цепочки подобных вычислений, было бы удобно. Парсек так и работает, если забыть о замене провала на список удач.
>>331135
>Твое высказывание работает в обе стороны, в неком смысле. Так как тут в тред вторгается изоморфизм Карри-Говарда и говорит о том, что существует структурная эквивалентность между математическими доказательствами и программами на типизированных языках.
Только между доказательствами в определенных логических системах и программах на определенных типизированных языках.

Аноним Срд 30 Окт 2013 21:15:20  #315 №331225 

>>331224
>программами

Аноним Срд 30 Окт 2013 21:18:18  #316 №331226 
1383153498816.jpg

>>331223
Чёрт! Я идиот. Полный бред написал. Только что дошло. Больше не буду участвовать в спец олимпиадах, пока еду в общественном транспорте. Не могу толком думать в дороге.

!xnn2uE3AU. Срд 30 Окт 2013 21:19:00  #317 №331227 

>>331185

Не знаю даже. Ты мало того, что не дописал код, который бы тестировал и выводил результат, так еще и ошибки оставил: http://ideone.com/KKb21d

Впрочем, если исправить ошибки, вроде верно считает. Алсо, в статье написано можно сделать все одним циклом.

!xnn2uE3AU. Срд 30 Окт 2013 21:27:12  #318 №331233 

>>331208

Делаем цикл по месяцам, в цикле:

- начисляем на текущий долг проценты и комиссию
- школьник смотрит на долг и решает сколько он заплатит в этом месяце(с помощью min или if), кладя результат в переменную
- школьник платит, долг уменьшается, сумма выплат увеличивается
- если долг <= 0 выходим из цикла, кредит выплачен

Аноним Срд 30 Окт 2013 21:32:16  #319 №331236 

>>331226
Лох. Пидор.

Аноним Срд 30 Окт 2013 21:37:30  #320 №331238 

>>331236
Ага, самому стыдно. В такой лёгкой задачке зафейлиться.

Аноним Срд 30 Окт 2013 21:40:43  #321 №331242 

>>331233
>школьник смотрит на долг и решает сколько он заплатит в этом месяце(с помощью min или if)
вот в этом я и не понимаю, каким образом он решает, что заплатит столько то и столько то.

Аноним Срд 30 Окт 2013 21:41:46  #322 №331243 

>>331242
>вот в этом я и не понимаю, каким образом он решает, что заплатит столько то и столько то.
А хотя феил, понимаю.

Аноним Срд 30 Окт 2013 21:48:04  #323 №331245 

>>331175
http://ideone.com/nvKPYp
Скажи мне, что я налажал с условием.

!xnn2uE3AU. Срд 30 Окт 2013 21:54:58  #324 №331247 

>>331189

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

Сначала ты пишешь скриптик на 50 строк, потом дописываешь еще несколько, потом еще и понеслось. Я видел портянки на тысячу с лишним строк и ковыряться в такой портянке ни разу не весело. Так-то 50 строк — еще ОК, но лучше бы разбивать на функции.

Задача про пробелы и большие буквы.

Код работает верно. Попридираюсь к комментариям что ли.

> fixText
> исправляет текст
Спасибо, Капитан Очевидность! Если комментарий не несет никакой новой информации, то он не нужен. Стоило бы лучше написать как именно эта функция исправляет текст.

> Если предыдущая часть текста - не ',' или ';',
Если переименовать $temp в $previousPart, то комментарий станет не нужен так как это видно будет из кода. Комментировать что делает функция trim или mb_strtoupper, не нужно.

В комментариях стоит писать не что делается ($a++; // увеличиваем $a на один), а зачем («учитываем что в високосном году на один день больше»), пояснять какие-то хитрые неочевидные моменты, писать название использованного алгоритма. Но описывать дословно, что делает код (если это можно понять с одного взгляда), не надо. А еще лучше, давать хорошие имена переменным и писать так, чтобы было понятно без комментариев.

По коду: у меня есть подозрение, что весь этот цикл можно заменить парой preg_replace или preg_replace_callback. Хотя, конечно, хорошо, что код работает, но мне кажется можно сделать гораздо проще.

Задача про Йоду

Вообще, хорошо решено.

> mb_strtoupper(mb_substr($part[0], 0, 1)) . mb_substr($part[0], 1);
Это лучше вынести в функцию, например, mbUcFirst. Смотри, насколько лучше будет читаться:

$part[0] = mbUcFirst($part[0]);

> $part = explode(' ', trim($part));
Лучше назвать эту переменную $words:

$words = explode(...);

> Йоду тоже, но меня смутил момент с предлогами.
Попробуй, если не боишься.

!xnn2uE3AU. Срд 30 Окт 2013 21:59:39  #325 №331250 

>>331215

Вроде все верно.

>>331224

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

!xnn2uE3AU. Срд 30 Окт 2013 22:02:06  #326 №331251 

>>331245

http://ideone.com/x9p417 — в последних 2 примерах должно быть 0 и 5 соответственно. Увы, пока молодец только Си++ -кун, и почему ни один PHP анон еще не решил эту задачу???

Аноним Срд 30 Окт 2013 22:12:07  #327 №331256 

>>331243
>А хотя феил, понимаю.
>>331243
двойной феил, все равно не выходит

Аноним Срд 30 Окт 2013 22:13:47  #328 №331258 

https://ideone.com/TxJgAE

!xnn2uE3AU. Срд 30 Окт 2013 22:17:12  #329 №331259 

>>331256

Сравниваем долг и сколько у нас есть денег этом в месяце (5000) и выбираем, что меньше.

Аноним Срд 30 Окт 2013 22:18:44  #330 №331260 

>>331258
print calculate([0, 5, 0, 1, 0, 2, 0])

Должно быть 5, у тебя 0.

!xnn2uE3AU. Срд 30 Окт 2013 22:19:12  #331 №331261 

>>331258

https://ideone.com/Sv22Zk — неверно считает.

Аноним Срд 30 Окт 2013 22:22:25  #332 №331262 

Анон,как сменить кодировку в PHPmyadmine?
В таблице отображается по русски(утф-8),вывожу в скрипт,выдает "????" что мне сделать?

Аноним Срд 30 Окт 2013 22:26:07  #333 №331263 

>>331259
http://ideone.com/g4XJtj
Возможно я гиперушербен, но все равно.

!xnn2uE3AU. Срд 30 Окт 2013 22:27:43  #334 №331264 

>>331262

https://www.google.ru/search?client=opera&rls=en-GB&q=phpmyadmin+encoding+utf-8&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest

Советы отсюда пробовал выполнять?

!xnn2uE3AU. Срд 30 Окт 2013 22:31:27  #335 №331267 

>>331263

Твой код так и не выплатил долг. Ты не мог бы написать код строго по этому алгоритму из 4 действий: >>331233 ? Чтобы каждой строчке алгоритма соответсовала бы одна или несколько строк кода.

Например, в алогоритме написано:

> начисляем на текущий долг проценты и комиссию

А ты делаешь:

$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment;

Зачем-то тут же вычитаешь monthlypyment, хотя в алгоритме это не написано. Можешь написать код строго как в алгоритме?

Аноним Срд 30 Окт 2013 22:31:28  #336 №331268 

>>331264
если мне не изменяет англиш,то да.

Аноним Срд 30 Окт 2013 22:34:54  #337 №331272 

Ну ок.
https://ideone.com/s6DsYk

!xnn2uE3AU. Срд 30 Окт 2013 22:35:27  #338 №331273 

>>331268

Тогда ты неправильно ставишь вопрос. Ты пишешь:

> В таблице (видимо имеется в виду в phpMyAdmin) отображается по русски(утф-8),вывожу в скрипт (видимо в тот что ты написал сам),выдает "????"

В БД есть так называемая кодировка соединения (об этом кстати написано в мануале по ней) — кодировка, в которой MySQL отдает данные. По умолчанию она может быть не utf-8 а другая. Попробуй в скрипте сразу после соединения выполнить запрос

SET NAMES utf8

(да, utf8 слитно), а потому уже делать SELECT. Также, проверь чтобы в HTML коде было <meta charset="utf-8"> (да, тут надо с минусом писать).

Аноним Срд 30 Окт 2013 22:37:49  #339 №331275 

>>331175
>из собеседования в компанию twitter
Из собеседования в ананасы. >>326313
http://ideone.com/jOX2zY

Аноним Срд 30 Окт 2013 22:40:52  #340 №331278 

>>331273
Что,прям так и писать? или как то через переменные?

Аноним Срд 30 Окт 2013 22:43:05  #341 №331281 

>>331278 #например
$pdo->query("SET NAMES utf8");

Аноним Срд 30 Окт 2013 22:49:34  #342 №331282 

>>331275
То же самое на хачкеле. http://ideone.com/Zj51Df

!xnn2uE3AU. Срд 30 Окт 2013 22:50:58  #343 №331283 

>>331278

А как ты SELECT пишешь, так или через переменные?

>>331281

Правильнее exec(). query используется, когда ждешь в отвт результат.

Аноним Срд 30 Окт 2013 22:51:18  #344 №331284 

>>331281
query не возвращает значение

Аноним Срд 30 Окт 2013 22:51:43  #345 №331285 

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

Аноним Срд 30 Окт 2013 22:54:18  #346 №331286 

>>331283
переменная=функция(селект)

Аноним Срд 30 Окт 2013 23:02:37  #347 №331288 

>>331267
Спасибо няша, я помазал пердак.
http://ideone.com/e1OQDs

!xnn2uE3AU. Срд 30 Окт 2013 23:05:21  #348 №331289 

Я нашел решение задачи про воду и дома, но оно с 2 циклами. Многовато. Вроде на Хабре пишут, можно в один проход решить.

Аноним Срд 30 Окт 2013 23:05:55  #349 №331290 

>>331283
а может быть подобная хуйня с кодировкой из-за mysqli?

!xnn2uE3AU. Срд 30 Окт 2013 23:10:57  #350 №331291 

>>331290

Как можно писать код, не понимая, что он делает?

Я не знаю, что ты за функцию используешь, но попробуй выполнить запрос SET NAMES так же как и SELECT.

!xnn2uE3AU. Срд 30 Окт 2013 23:31:39  #351 №331299 

В общем, вот мое неоптимальное решение с 2 циклами. http://ideone.com/PArCPj

Аноним Срд 30 Окт 2013 23:33:24  #352 №331301 

>>331291
спасибо тебе ОГРОМЕННОЕ,заработало.
код:
$link=mysqli_connect(host,login,pass,baza)
mysqli_query($link,'SET NAMES utf8');

Аноним Срд 30 Окт 2013 23:34:52  #353 №331304 

>>331282
>>331275
v2.0. http://ideone.com/8JMddE

!xnn2uE3AU. Срд 30 Окт 2013 23:40:44  #354 №331307 

>>331304

А у нас в PHP почему-то нет ни scanl, ни даже foldr. А через array_reduce scanl имитировать как-то костыльно получается.

Аноним Срд 30 Окт 2013 23:42:39  #355 №331309 

>>331304
Охуительно
Мой говнокодик на sml
http://ideone.com/gfHQbS
начинающий быдлкодер на фп

!xnn2uE3AU. Срд 30 Окт 2013 23:44:44  #356 №331310 

>>331309

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

Аноним Чтв 31 Окт 2013 00:02:05  #357 №331312 

>>331307
Как будто scanl1 сложно реализовать. Три строчки на массивах. Ну а scanr1 f xs = reverse $ scanl1 (flip f) $ reverse xs (или тоже в три строчки).

Аноним Чтв 31 Окт 2013 00:15:19  #358 №331318 

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

Аноним Чтв 31 Окт 2013 00:22:19  #359 №331325 

>>331318
От балды спизданул, или у тебя есть какие-то основания полагать, что этот случай особенный?
Хачке1.0 и эквивалентное ему гвидорешение: http://ideone.com/AHiyR5
Хачке2.0, а также все эквивалентные императивные (там где идем с двух концов считая максимумы): http://ideone.com/4pHZF0

Аноним Чтв 31 Окт 2013 00:47:55  #360 №331340 

>>331304
http://ideone.com/snGucu

!xnn2uE3AU. Чтв 31 Окт 2013 00:56:39  #361 №331343 

>>331318

Код доступен, подставь небоскреб и проверь По крайней мере я за свое решение уверен.

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

Аноним Чтв 31 Окт 2013 01:07:51  #362 №331351 

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

Аноним Чтв 31 Окт 2013 13:12:52  #363 №331425 

[Попытка починить тред, сломанный вакабой]

Аноним Чтв 31 Окт 2013 13:15:50  #364 №331426 

>>331227

Лол. Это не ошибки. Это шарп.

!xnn2uE3AU. Чтв 31 Окт 2013 14:15:12  #365 №331436 

>>331426

Забавно. Я подумал что это Ява, дописал class и public static main, исправил Length на length и, что самое удивительно, все заработало. Вот это совместимость.

Аноним Чтв 31 Окт 2013 17:17:07  #366 №331477 
1383225427719.jpg

>>331436
Добрый вечер Аноны. Есть ли среди вас те кто работает в сфере создания сайтов и вообще заработка с помощью php?
Расскажите сколько вы получайте и в каких городах организациях работаете, какой у вас стаж, в общем желательно максимально просвятить новичка в плане насколько реально жить-поживать программисту пишушему на php.

Аноним Чтв 31 Окт 2013 17:29:43  #367 №331483 

>>327435
Вот, нашлёпал.
http://ideone.com/DSODso

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

Аноним Чтв 31 Окт 2013 17:50:48  #368 №331500 

>>331477
жить - реально, поживать - нет

!xnn2uE3AU. Чтв 31 Окт 2013 18:24:38  #369 №331509 

>>331477

Ищи зарплата-тред в /pr
Ищи odesk-тред в /wrk

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

!xnn2uE3AU. Чтв 31 Окт 2013 18:55:46  #370 №331520 

>>331483

Вообще, неплохо. Меню отображается правильно. Вот советы и замечания:

> Проще покажи конечный её вариант, а я постараюсь запомнить.
Например, есть такая функция array_walk. Она вызывает переданную функцию для каждого элемента:

$input = array(1, 2, 3);
array_walk($input, function ($value) {
echo $value * 2, " ";
});
// выведет 2 4 6

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

// Пример 1
$tree->walk(function ($node) {
var_dump($node);
});

// Пример 2
function dumpNode($node) {
var_dump($node);
}
$tree->walk('dumpNode');

То есть, walk вызывает функцию, давая ей по очереди всех потомков узла. Если тебе непонятно, как вообще можно передавать функции в виде переменных, почитай это: http://php.net/manual/ru/language.types.callable.php (увы только на английском, но можно просто посмотреть примеры кода) и http://www.php.net/manual/ru/function.call-user-func.php

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

Теперь по коду.

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

> if (isset($this->parentNode)) {
> return $this->parentNode;
> }
> return NULL;

Можно писать короче: return $this->parentNode ? $this->parentNode : null; Дело в том, что объект в логиеских условиях (например в if или в операторе a ? b : c) приравнивается к true, и потому если у тебя в parentNode может быть либо null, либо объект то можно просто писать без всяких isset:

if ($this->parentNode) { ... }

А вместо этого:

> if (NULL == $this->getParentNode()) {
можно писать if (!$this->getParentNode()) {


> //к ширине строки прибавляется расстояние между колонками 4
Если бы ты вместо числа 4 написал в коде константу COLUMN_SPACING:

$widthColumn[] = $width + self::COLUMN_SPACING;

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

!xnn2uE3AU. Чтв 31 Окт 2013 19:09:53  #371 №331530 

>>331483

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

Есть такая статья на хабре: http://habrahabr.ru/company/mailru/blog/200394/

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

Для начала можно взять HTML-код какой-нибудь страницы и засунуть прямо в скрипт с помощью heredoc или nowdoc (читай мануал если не знаешь что это):

$html = <<<EOT
.... HTML код...
EOT;

Затем, этот текст можно разобрать и превратить в дерево из тегов с помощью написанного до нас расширения PHP DOM и метода loadHtml: http://www.php.net/manual/ru/domdocument.loadhtml.php

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

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

Изучить ДОМ-дерево тегов на любом сайте удобнее всего Хромом или Фаерфоксом, нажав Ctrl + Shift + I.

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

Аноним Чтв 31 Окт 2013 19:11:37  #372 №331531 
1383232297104.jpg

ОП или братишки, нужна помощь.
Изучал ПХП по сайту опа, но потребовалось сделать несколько лаб в моей институте, ничего лучше как сделать их на ПХП я не придумал, нужно сделать 10 лаб, сделано 2/10.
Суть в Пикрелейтед.
Осилил сделать прибавление " " если слово не соответствует длине по кол-ву столбцов, чтобы можно было шифровать любое слово, не задавая исключительно то что есть в задании. Собственно, по моим предположениям нужно прикрутить создание массива + ключевое слово + выборку каждая буква ключевого слова - место в русском алфавите.
Отдамся в рабство/отсосу за код или просто конкретное пояснение на русском пошаговое, реализовать на самом ПХП я смогу сам.
<?php
$word = $_POST['Code'];
$len = $_POST['stolb'];

while( (strlen($word)%$len)!=0 ){ // пока (длинаСтроки($word) не будет делится без остатка на $len
$word=$word." "; // каждый раз прибавлять к строке пробел " ".
}

?>

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

!xnn2uE3AU. Чтв 31 Окт 2013 19:22:11  #373 №331536 

>>331531

Тут нужен 2-мерный массив, то есть массив строк, где каждая строка — это тоже массив из N символов. Потом этот массив заполняешь своей фразой слева направо и сверху вниз. Например:

$a = array(
array('п', 'р', 'и', 'к'),
array('л', 'а', 'д', 'н'),
...
);

к такому массиву можно обращаться по номеру строки и колонки: $a[1][3] даст нам букву «н».

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

Алсо, советую использовать не strlen, а mb_strlen, а то strlen не всегда корректно считает русские буквы. У меня кстати это тут описано: http://archive-ipq-co.narod.ru/l1/strings.html ближе к концу урока.

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

Аноним Чтв 31 Окт 2013 19:29:35  #374 №331541 

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

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

И то - глянул не оптимальный ОПов вариант, у меня почти то же самое, но много лишней суеты.

http://viper-7.com/OGVop2





Аноним Чтв 31 Окт 2013 19:53:14  #375 №331553 
1383234794114.jpg

>>331536
Не, я не математик, до математика мне далеко, но факультет технический.
В таком решении как ты предложил, нам даже не понадобиться добавление пробелов, собственно вот:
$a = array(
array('н', 'е', 'я', 'с', 'н', 'о', 'е'),
array(' ', 'с', 'т', 'а', 'н', 'о', 'в'),
array('и', 'т', 'с', 'я', ' ', 'е', 'щ'),
array('е', ' ', 'б', 'о', 'л', 'е', 'е'),
array(' ', 'н', 'е', ' ', 'п', 'о', 'н'),
array('я', 'т', 'н', 'ы', 'м', ' ', ' '),
);


Вопрос в том, как реализовать выборку? Т.е. есть слово-ключ ЛУНАТИК, каждая буква n-ая по счету в русском алфавите, как это сделать циклом? Или забить и сделать как лох в том же массиве только сверху?
Алсо, какой цикл сделать для самой шифровки, не буду же я к каждой букве обращаться, верно? Как сдвинуть весь стобец сразу?
Понимаю, что вопрос даунский, но помощи ждать неоткуда, спс заранее, браток.

!xnn2uE3AU. Чтв 31 Окт 2013 19:56:12  #376 №331554 

>>331541

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

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

!xnn2uE3AU. Чтв 31 Окт 2013 20:01:46  #377 №331557 

>>331553

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

> каждая буква n-ая по счету в русском алфавите, как это сделать циклом?
Можно превратить слово  «ЛУНАТИК» в массив вида «номер буквы в слове → номер буквы в алфавите», отсортировать его по номеру в алфавите и получим порядок, в котором надо обходить столбцы (это сложно звучит, но ты попробуй сделай такой массив и будет понятнее).

Как определить номер буквы? Ну, можно тупо сделать массив вида буква → номер в алфавите, можно сделать строчку "абвгдеёжз...эюя", искать на какой позиции в ней буква и таким образом определить ее номер.

> не буду же я к каждой букве обращаться, верно?
Будешь. Если у нас есть последовательность столюцов, например «array(2, 5, 1, 3, 4)» то проходимся циклом по массиву, берем номер столбца. Вторым циклом берем все буквы из этого столбца сверху вниз. И так далее.

!xnn2uE3AU. Чтв 31 Окт 2013 20:05:00  #378 №331559 

>>331541

Проще говоря, можно написать такую формулу:

$volume = sum( min(left, right) - height )

Где left/right — максимальная стена слева/справа от клетки, height — высота здания в клетке

Аноним Чтв 31 Окт 2013 20:14:24  #379 №331562 
1383236064510.jpg

>>331557
>>Только наверно этот массив надо бы не заполнять руками, а создавать циклом из исходной фразы.
Тут как оказалось, можно и руками, т. е. я конечно хочу что бы все было просто вбил слово и готово, но сейчас несколько не до этого.
>>Как определить номер буквы? Ну, можно тупо сделать массив вида буква → номер в алфавите, можно сделать строчку "абвгдеёжз...эюя", искать на какой >>позиции в ней буква и таким образом определить ее номер.
array('л', 'у', 'н', 'а', 'т', 'и', 'к'),
array('13', '21', '15', '1', '20', '10', '12'),
Вот соответствие ЛУНАТИКА-а номерам букв в алфавите.
>>Будешь. Если у нас есть последовательность столюцов, например «array(2, 5, 1, 3, 4)» то проходимся циклом по массиву, берем номер столбца. Вторым >>циклом берем все буквы из этого столбца сверху вниз. И так далее.
Напиши пожалуйста оба цикла, вот тут я совсем не могу придумать.

Аноним Чтв 31 Окт 2013 20:30:27  #380 №331571 

Так что реально, решить задачу с водичкой за 1 проход и O(n)?

!xnn2uE3AU. Чтв 31 Окт 2013 20:37:52  #381 №331577 

>>331571

Пишут, что да.

Аноним Чтв 31 Окт 2013 20:38:25  #382 №331578 

>>331571
Тред не читал, так как не хочу спойлеров об алгоритме.

!xnn2uE3AU. Чтв 31 Окт 2013 20:42:56  #383 №331582 

>>331562

> array('13', '21', '15', '1', '20', '10', '12'),
Числа в PHP пишутся без кавычек. Теперь открывай мануал, функцию sort и связанные с ней и ищи ту, которая сортирует по числам, не меняя ключи массива. Ей ты можешь получить массив, который будет отсортирован в нужном порядке и таким образом получишь порядок, в котором