Сохранен F 522
https://2ch.hk/pr/res/313971.html
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Клуб любителей изучать PHP и HTML #10

 !xnn2uE3AU. Пнд 26 Авг 2013 17:19:08  #1 №313971 
1377523148774.png

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

Для удобства читателей архивы уроков по PHP выложены по адресу http://archive-ipq-co.narod.ru

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

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

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

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

Оформляй код правильно!!! например пропусти через 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, робот его выровняет как надо.

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

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

Мануалов никогда не бывает много !xnn2uE3AU. Пнд 26 Авг 2013 17:20:51  #2 №313972 
1377523251449.png

У нас есть задачки не только на PHP, но и на знание и изучение HTML, CSS, JS. Самые простые задачи — на картинке, более сложные — по запросу (я их пока не нарисовал, но уже есть задачка из яндексовского задания и есть задачка на кнопки-переключатели на CSS3).

Для тех, кому нужны теория и мануалы, ссылки:

HTML/CSS
htmlbook.ru/samhtml
htmlbook.ru/samcss
softwaremaniacs.org/blog/category/primer/
pepelsbey.net/
clubs.ya.ru/ui/

JS
learn.javascript.ru

SQL
Для любителей изучать MySQL есть http://mysqlru.com/ (ок, там так себе описано), есть учебник по SQL http://www.opennet.ru/docs/RUS/rusql/ Тренироваться можно на кошках и на специальном сайте http://sqlfiddle.com/ слева вводишь команды CREATE TABLE, создаешь базу, справа пишешь запросы like a boss.

ООП
Есть первый урок по ООП pastebin.com/14jj6uUc (увы, только первый) и задачка про кошек-мышек.

Пасты
Как установить Апач — gist.github.com/anonymous/946f4f1830be3955fe17
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8

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

Хороший код — красивый код !xnn2uE3AU. Пнд 26 Авг 2013 17:25:04  #3 №313974 
1377523504412.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(...)
{
// ...
}


В общем, пиши как на картинке, и проблем не будет.
Аноним Пнд 26 Авг 2013 17:28:03  #4 №313975 

>>313972
> HTML/CSS
Хотет. Уровень - хуй знает, проходил курсы по CSS на codeacademy:
CSS: An Overview, CSS Selectors, CSS Positioning. Но это было полгода назад, я уже наверное многое забыл.

Хороший код — красивый код !xnn2uE3AU. Пнд 26 Авг 2013 17:46:28  #5 №313978 
1377524788853.png

>>313975

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

Код можно постить на jsbin.com

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

Дальше — задача 11, сверстать кота (пикрелейтед). HTML-код добрый дядя уже написал и выложил тут: http://pastebin.com/s1P96nVA

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

Если сделаешь — есть еще задача 12, и 13+14, но они пока не нарисованы.

Аноним Пнд 26 Авг 2013 17:49:05  #6 №313979 

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

Аноним Пнд 26 Авг 2013 18:53:05  #7 №313989 

Привет, мастерам! У меня к вам просьба риквест. Видел как то pdf по php от дваща или добрача, не помню, видел в б зимой или давно, все там так красиво было, подскажите ссылочку

Аноним Пнд 26 Авг 2013 18:57:27  #8 №313990 

>>313974
> Не пиши транслитом, открой лучше slovari
Oh, irony!

!xnn2uE3AU. Пнд 26 Авг 2013 18:57:36  #9 №313991 

>>313979

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

В общем, на профессиональный подход не тянет.

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

sageАноним Пнд 26 Авг 2013 19:03:36  #10 №313992 
1377529416067.jpg

>>313778
без циклов http://ideone.com/DDqRO6

!xnn2uE3AU. Пнд 26 Авг 2013 19:12:57  #11 №313993 

>>313992

Код работает, но почему он такой нечитабельный? Неужели хотя бы переменные нельзя нормально назвать? Я, например, не могу держать в голове что такое a, b, c, d.

sageАноним Пнд 26 Авг 2013 19:20:21  #12 №313996 

>>313993
улучшил для тебя, няша:
http://ideone.com/3s62Oo

!xnn2uE3AU. Пнд 26 Авг 2013 19:28:26  #13 №314000 

>>313996

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

Аноним Пнд 26 Авг 2013 19:30:59  #14 №314002 

А мне это >>313992 понятнее чем это >>313996.

!xnn2uE3AU. Пнд 26 Авг 2013 19:35:34  #15 №314006 

>>314002

Значит, у тебя очень хорошая память. Но уверен, даже твоя память не справится, если переменных будет не 4, а например 24.

Аноним Пнд 26 Авг 2013 20:22:25  #16 №314022 

>>313991
Опушка, посмотри: http://ideone.com/DDBkog
Может где-то не так понял или сделал, поясни. Во втором задании я новую функцию не добавлял, а просто дописал еще одно поле к функции с вопросами.
Всё еще довольно мутно, ту задачку про кошек-мышек не потяну?
Опечатка у тебя на 133 строчке в $naswers[$i]

!xnn2uE3AU. Пнд 26 Авг 2013 20:33:35  #17 №314027 

>>314022

Если ты запускаешь скрипт через Апач и браузер, а не через ideone/командную строку, то в начале можно написать:

header('Content-type: text/plain;charset=utf-8');

И текст будет выводиться как есть, без всяких < br >

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

Вот условия задачи про кошек/мышек: >>>>304841

Аноним Пнд 26 Авг 2013 20:57:45  #18 №314035 

>>314027
А, забыл про <br>. Я когда-то менял на text/html, уже и не помню для чего, так и привык <br> вместо /n юзать.
Я завтра вернусь к погромированию, попробую кошек-мышек уже тогда. Можешь пока не придумывать, бобра.

Аноним Пнд 26 Авг 2013 21:37:15  #19 №314046 
1377538635247.jpg

Оп, ты писал сегодня, что в новом пхп уже работает буква-флаг i, а функции без mb, вроде strlen(), substr() и пр. случаем не заработали?

!xnn2uE3AU. Пнд 26 Авг 2013 23:20:59  #20 №314084 
1377544859787.png

>>314046

Нет, и вроде пока такого не планируется. Deal with it.

>>314035

Так, анон, прочти-ка пикрелейтед, потом отвернись от экрана и повтори по памяти.

Аноним Пнд 26 Авг 2013 23:26:44  #21 №314086 

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

!xnn2uE3AU. Пнд 26 Авг 2013 23:51:20  #22 №314090 

>>314086

Написать свою функцию. Это дело на 3 минуты для начинающего любителя PHP.

!xnn2uE3AU. Пнд 26 Авг 2013 23:52:12  #23 №314092 

>>314086

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

Аноним Втр 27 Авг 2013 00:15:43  #24 №314097 
1377548143500.jpg

>>314092
Я просто очень глупый начинающий любитель, доходит все медленно. Спасибо!

Аноним Втр 27 Авг 2013 00:33:47  #25 №314107 
1377549227845.jpg

http://jsbin.com/OSiHULI/13/edit
Вторая задачка, сделал что-то похожее на то, что на пикче. Проверь, опушка.

!xnn2uE3AU. Втр 27 Авг 2013 00:42:10  #26 №314110 

>>314107

Есть проблема. Попробуй сделать окно маленьким, и видно будет что у зеленого блока слева отступ от края окна гораздо больше чем 10px, а справа, наоборот, меньше. Неаккуратно. Подсказка: у элементов body или html в браузерном CSS обычно выставлен паддинг по умолчанию

> overflow-y: hidden;
Зачем это свойство? У нас учебная задача, и ставить свойства «на всякий случай» нельзя.

> box-sizing: border-box;
Не кросс-браузерно. Надо либо добавить версии с префиксами для mozilla и webkit, либо, что лучше, обойтись вообще без этого свойства, тем более в такой простой ситуации.

Аноним Втр 27 Авг 2013 01:14:16  #27 №314116 

>>314084
Да-да-да! Это значит мне пора спать. Как-то привычнее "/", не задумался и машинально жмякнул по нему. А в редакторе "\" подсвечивается по-другому, так что збс.

Аноним Втр 27 Авг 2013 01:37:24  #28 №314121 

>>314110
http://jsbin.com/OSiHULI/13/edit
> Зачем это свойство?
А как тогда сделать, чтобы текст отображался в маленьком окне, как на пикче? Хотя с overflow-y: hidden тоже не совсем так будет, так как появляется горизонтальная полоса прокрутки. Может нужно и минимальную ширину выставить?

Аноним Втр 27 Авг 2013 01:42:28  #29 №314122 

Калькулятор.
Дроби пока не сделал, а то это какой-то странный калькулятор получится. В следущей "версии" дабавлю флаг на сокращение.
Undefined тип не реализовывал, это тоже в следующей "версии".
http://ideone.com/Gxgken
Ну что, C++ понятнее чем питон?

!xnn2uE3AU. Втр 27 Авг 2013 03:04:09  #30 №314128 

>>314121

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

Также, ты дал ссылку на старую ревизию.

Кстати, есть еще одно замечание: всегда, когда задаешь размер шрифта, задавай line-height, иначе она унаследуется от родителя, и не факт что та, которая нужна, потому лучше задать явно.

!xnn2uE3AU. Втр 27 Авг 2013 03:21:38  #31 №314129 

>>314122

Этот код гораздо понятнее Питона. Странные моменты:

> Token(const char);
> Token::Token(char ch)

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

> std::vector<Token> toRPN(std::string str)
> ...
> std::vector<Token> result;
> ...
> return result;

Разве можно из функции возвращать локальную переменную? Это же работает на честном слове и в любой момент может сломаться. В Си++, если я не ошибаюсь, ты должен либо выделять память через new (и потом не забыть сделать delete), либо передавать result снаружи.

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

Также, если я не ошибаюсь, если тебе нужен стек, то там есть какая-то коллекция вроде queue или deque, которая эффективно умеет делать pop/push, а vector для этого не очень хорош.

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

Аноним Втр 27 Авг 2013 09:33:17  #32 №314161 

>>314128
http://jsbin.com/OSiHULI/15/edit
Исправил.

Аноним Втр 27 Авг 2013 10:41:11  #33 №314170 

Доброкун, глянь пожалуйста сюда http://jsbin.com/EpIliXo/5/edit Я не понял, что там за линия справа, если это не тень, там же не только справа, мне кажется там и сверху, и снизу.

!xnn2uE3AU. Втр 27 Авг 2013 13:56:23  #34 №314200 

>>314170

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

> body, html{ height: 100%; }
Зачем?

> overflow: auto
Зачем?

> margin-top: 90px;
Не, это неправильно, третий блок должен не болтаться в воздухе, а быть прижат к низу. Это задача на свойство vertical-align и inline-block элементы.

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

!xnn2uE3AU. Втр 27 Авг 2013 13:58:02  #35 №314202 

>>314161

Теперь верно.

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

Аноним Втр 27 Авг 2013 14:50:32  #36 №314215 

http://jsbin.com/EpIliXo/6/edit
>расстояние между желтыми блоками не 10px, а больше
В задаче написано что должны быть поля 10 px, я думал поле это от границы элемента до содержимого. Или в задаче как-то по другому указано какие должны быть отступы?

!xnn2uE3AU. Втр 27 Авг 2013 15:06:05  #37 №314227 
1377601565086.png

>>314215

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

Расстояния по горизонтали между желтыми блоками должны быть ровно 10px.

Аноним Втр 27 Авг 2013 16:06:27  #38 №314240 

>>314227
Доброкун, расскажи почему так странно ul вставляется, с дичайшим padding-ом http://jsbin.com/edUrumA/1/edit

Аноним Втр 27 Авг 2013 16:10:56  #39 №314242 
1377605456343.png

Анон, в чем может быть проблема?
$(window).height()
$(document).height()
возвращают одно и тоже значение,но документ скролится
Браузер: хром последняя стабильная версия

!xnn2uE3AU. Втр 27 Авг 2013 16:15:43  #40 №314244 

>>314240

У ul, ol, li есть padding и margin по умолчанию. Это нужно, чтобы списки в тексте выглядели как списки, а не просто набор невыровеннных строчек. Если тебе они мешают, присвой им свои значения.

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

Аноним Втр 27 Авг 2013 16:24:43  #41 №314247 

>>314242
Проблема была в DOCTYPE, забыл прописать и не обратил внимания, что его нет

!xnn2uE3AU. Втр 27 Авг 2013 16:31:16  #42 №314250 

>>314242

Проблема в том, что ты не почитал документацию к jQuery.

C чего ты взял, анон, что $(window).height() вернет размер окна, а $(document).height() — размер документа? Это так написано в документации к height? Я подозреваю, там такого нет.

Насколько я знаю, в DOM у ноды document в принципе нет размеров. Я подозреваю, оба этих вызова возвращают offsetHeight у documentElement.

Также, от себя добавлю, что получать размеры или положение элементов через Jquery — это фейл, там куча костылей, и оно всегда возвращает не то, что нужно. Лучше использовать методы DOM (точнее CSSOM):

Размер документа: document.documentElement.scrollWidth
Размер окошка включая скроллбары: window.innerWidth || document.documentElement.offsetWidth (innerWidth — в W3C браузерах, offsetWidth — в ИЕ)
Размер окошка браузера без скроллбаров: document.documentElement.clientWidth
На сколько прокручена страница: document.documentElement.scrollLeft || document.body.scrollLeft (Webkit прокручивает body, все остальные браузеры documentElement)

Эти методы должны работать и на новых браузерах, и на всяких ИЕ (но только в режиме поддержки стандартов). для высоты, естественно, надо использовать height вместо width.

Если хочешь знать больше, то welcome: http://www.quirksmode.org/dom/w3c_cssom.html

Аноним Втр 27 Авг 2013 16:32:17  #43 №314252 

>>314129
>Разве можно из функции возвращать локальную переменную?
А ты не путаешь с локальными ссылками? Ну хуй знает, должно вроде копироваться

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

>Также, если я не ошибаюсь, если тебе нужен стек, то там есть какая-то коллекция вроде queue или deque, которая эффективно умеет делать pop/push, а vector для этого не очень хорош.
Я хотел stack юзать, но мне почему-то понадобился доступ по индексу и я его убрал...

>Также, если я не ошибаюсь, если тебе нужен стек, то там есть какая-то коллекция вроде queue или deque, которая эффективно умеет делать pop/push, а vector для этого не очень хорош.
Точно, структуру! Хорошая идея.

>Не совпадают типы же, разве это правильно? Плюс, зачем писать const char, может я что-то путаю, но const обычно пишут с указателями.
Да, забыл написать конст, компилятор постарался)
Const это "гарантия" того что я не буду менять значение ch.
С указателями const, еще может значить что указатель всегда будет указывать на одну и туже область в памяти.

!xnn2uE3AU. Втр 27 Авг 2013 16:32:23  #44 №314253 

>>314247

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

!xnn2uE3AU. Втр 27 Авг 2013 16:35:27  #45 №314255 

>>314240

Кстати, вот так писать не стоит:

li { list-style-type: none; }

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

Аноним Втр 27 Авг 2013 16:35:38  #46 №314256 

Оп, проверь пожалуйста мои задачи по занятию по массивам.

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

Задача про оценки: http://ideone.com/Kl8XZd
Задача про рост: http://ideone.com/pAgq56
Задача - ответ на любой вопрос: http://ideone.com/ID8LIv
Генератор имен: http://ideone.com/z2i3mC

Поясни также, я правильно понял работу последней задачи? Понял я ее так: при выполнении цикла for, пока $i не будет больше или равно 6, к $i прибавляется единица. Пока условие ($i <= 6) верно, переменной $random присваивается значение при каждом проходе цикла, значение вычисленное функцией mt_rand из меньшего - 1, и большего - того числа, которое получается при подсчете функцией count() элементов в массиве $letters.

Далее, переменной $randomText присваиваем значение = обращаемся к одному элементу массива $letters, именно к тому, индекс которого был получен с помощью функции mt_rand() выше и присвоен переменной $random

После этого (что мне трудно понять) - переменной $name, ранее объявленной с присвоенным значением - пустой строкой, присваивается значение - она сама, плюс (конкатенация) то, что получено в переменной $randomText. Все это проходит через цикл, пока верно условие, и все это время к перемеенной $name плюсуются полученные в $randomText значения?

Спасибо.

Аноним Втр 27 Авг 2013 16:42:07  #47 №314260 

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


<script type="text/javascript">
$(document).ready(function () {
var mainCanvas = document.getElementById('mainCanvas');
var mainContext = mainCanvas.getContext('2d');

var drawingCanvas = {
canvas: mainCanvas,
context: mainContext,

test: function () {
alert(this.canvas);
},
}
});

//...
</script>


В общем, суть такая: алерт выдаёт 'undefined'. Поясните, в чём я мудак. Я непонимат что тут неправильного, если написав это же в консольке хрома всё работает правильно
Аноним Втр 27 Авг 2013 16:47:13  #48 №314263 
1377607633174.jpg

Сап, доброкун! Сейчас вот добрался до кукисов и решил с ними разобраться. И вот сегодня уже битый час бьюсь над реализацией задачки, которая проверяет через кукисы первый ли раз анон на данном сайте, если первый - то говорит велком, если не первый, то выводит какое это посещение по счету и дату последнего визита. Написал код - запустил, кукисы не передаются, выдает варнинги, что у меня уже был вывод информации, где хоть убей не пойму, ни пробелов. ни пустых строк, ничего нет, а кукисы не работают. Вот код, запускаю на энделсе если что.Помоги разобраться, пожалуйста!!!
http://ideone.com/OXAknu

!xnn2uE3AU. Втр 27 Авг 2013 16:50:41  #49 №314264 

>>314256

Задача про оценки Все верно.
Рост одноклассников Правильно решено.
Ответ на любой вопрос Все хорошо, массив тут как раз лучше всего подходит.
Генератор имен Годный генератор.

> я правильно понял работу последней задачи?
Да, только $i <= 6 — это условие продолжения цикла, то есть пока i меньше или равно 6, цикл выполняется, как только оно станет равно 7 и условие нарушится, цикл завершится. Цикл выполняется в таком порядке:

$i = 1; (выполняется один раз в самом начале)
Проверка условия $i <= 6 (i == 1, выполняется, потому продолжаем)
Выполняется тело цикла
$i++ ; (увеличиваем i, i теперь равно 2)


Проверка условия $i <= 6 (i == 2, выполняется, потому продолжаем)
Выполняется тело цикла
$i++ ; (i теперь равно 3)


....

Проверка условия $i <= 6 (i == 6, выполняется, потому продолжаем)
Выполняется тело цикла
$i++ ; (i теперь равно 7)

Проверка условия $i <= 6 (i == 7, условие не выполняется, потому выходим из цикла)

....



> Все это проходит через цикл, пока верно условие, и все это время к перемеенной $name плюсуются полученные в $randomText значения?
Да, верно. Мы каждый шаг добавляем к уже имеющемуся имени по одному слогу (ты можешь поставить echo внутри цикла, чтобы это увидеть). Кстати, это можно записать еще короче:

$name = $name . $randomText; → $name .= $randomText;

!xnn2uE3AU. Втр 27 Авг 2013 16:54:23  #50 №314267 

>>314260

При вызове функции drawingCanvas.test() this будет равно drawindCanvas. this не передается через замыкание, а выставляется заново при вызове функции.

http://learn.javascript.ru/this
http://learn.javascript.ru/binding

Аноним Втр 27 Авг 2013 16:55:05  #51 №314268 

>>314263
Упс, у меня почему-то идеон не всегда весь код передает кнопкой отправить, а лишь некоторые его куски. Я запостил адрес не глядя. Вот мой код:
http://ideone.com/kejYFT

!xnn2uE3AU. Втр 27 Авг 2013 17:02:11  #52 №314269 

>>314263

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

А! Вспомнил. Если ты используешь Windows блокнот то он в режиме utf-8 вставляет BOM в начало документа и этот BOM может ломать скрипт, хоть он сам невидим. Но тут ты сам виноват, я всегда писал, используйте Notepad++ или Sublime, не сохраняйте файл с BOM, не используйте виндовый блокнот для редактирования кода.

Аноним Втр 27 Авг 2013 17:18:13  #53 №314272 

>>314269
>BOM
Точно, доброкун! Проверил, сам то нотепадом++ пользуюсь, но кодировка стояла в ютф-8, перекодировал в ютф-8 без БОм и все заработало. Спасибо!

Аноним Втр 27 Авг 2013 17:24:15  #54 №314274 

>>314269
Доброкун, может не совсем по теме, но подскажи как запилить чтобы мой огнелис правильно распознавал кодировки? А то файл в ютф8 без бом, а он по умолчанию открывает в 1251, то есть после каждого ф5 приходится вручную переключать. Заранее спасибо.

!xnn2uE3AU. Втр 27 Авг 2013 17:26:06  #55 №314278 

>>314274

Написать в html коде

<meta charset="utf-8">

или проставить charset в заголовке Content-Type.

!xnn2uE3AU. Втр 27 Авг 2013 17:27:44  #56 №314280 

>>314274

Кстати, я бы проверил заголовки фаербагом. Наверняка у тебя сервер отдает charset=cp1251, а заголовок вроде бы имеет приоритет перед meta.

Аноним Втр 27 Авг 2013 17:30:53  #57 №314282 

>>314278
В мета-теге всегда ставлю ютф-8, сейчас проверю фаербагом заголовки тогда.

Аноним Втр 27 Авг 2013 17:32:34  #58 №314283 

>>313978
Сделал 1-5
http://jsbin.com/OSigiS/1/
http://jsbin.com/OPAYOj/2/
http://jsbin.com/IceBof/3 - были проблемы с тем, что бы 3й блок прижать к низу. В итоге как-то сделал, но думаю, что не правильно.
http://jsbin.com/iVoHOWa/1/
http://jsbin.com/ODOCeWE/1/ - при малом разрешении текст залазит под меню. Не знаю как исправить.

Аноним Втр 27 Авг 2013 17:37:23  #59 №314284 

>>314278>>314282>>314280
В общем, в коде ютф-8 прописан, сохранено в ютф-8 без бом, открывает его фаерфокс в 1251, в заголовке тоже лежит 1251. Можешь мне коротко объяснить что это и как с этим бороться?

Аноним Втр 27 Авг 2013 17:38:48  #60 №314286 

>>314267
Спасибо, анон. Вроде разобрался

!xnn2uE3AU. Втр 27 Авг 2013 17:44:48  #61 №314288 

>>314284

Заголовок отдает сервер, Апач (или денвер который его содержит), кодировка прописана либо в настройках Апача либо в настройках PHP, надо найти где и поменять на utf-8.

Аноним Втр 27 Авг 2013 17:56:14  #62 №314295 
1377611774470.jpg

>>314288
Будем искать. Благодарю.

Аноним Втр 27 Авг 2013 18:24:25  #63 №314303 

Человеки, есть какой-нибудь нормально работающий плагин на саблайм для форматирования кода ? Ничего не хочет работать на бубунте.

Аноним Втр 27 Авг 2013 19:30:51  #64 №314313 

Оп, скажи, можно ли серьезно заниматься версткой (html, css) и джаваскриптом и хорошо зарабатывать, но при этом не знать php совершенно (ну или скажем питон/руби? знать только джаваскрипт в общем)? Или такое невозможно?

Аноним Втр 27 Авг 2013 19:31:34  #65 №314314 
1377617494751.png

Третья и четвертая задачка. Добра, опушка.
http://jsbin.com/UnuLUVu/1/edit
http://jsbin.com/idoFUGe/1/edit

!xnn2uE3AU. Втр 27 Авг 2013 19:47:44  #66 №314320 

>>314313

Можно, это называется фронтенд-разработчик, но для этого надо быть профессиональным разработчиком (Javascript, Backgone, Knockout, Handlebars, Angular, библиотеки виджетов, Coffeescript, LESS, умение писать клиентские MVC-приложения).

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

В Яндексе это называется «разрабочик интерфейсов» или как-то так, http://company.yandex.ru/job/vacancies/?city=all&department=3588&spec10=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0+%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%B2&cf1=msk — можешь походить по ссылкам и почитать требования к вакансиям.

!xnn2uE3AU. Втр 27 Авг 2013 20:10:18  #67 №314328 

>>314283

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

Задача 1

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

Задача 2

Все верно, только зеленого цвета не хватает.

Задача 3

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

Насчет позиционирования — хитрый способ ты придумал. Но он не сработает, если мы захотим добавить четвертый блок, верно? И он не работает, если мы в третий блок вобьем побольше текста: http://jsbin.com/IceBof/4/

Думаю, стоит решить задачу по-другому, через (подсазка) inline-block и vertical-align

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

задача 4

Цвета ужасные, и не те. Пожалуйста, сделай правильные. И шрифт покрупнее, например, 18-22px

Задача 5

> при малом разрешении текст залазит под меню.
Надо говорить, это не баг, а адаптивная верстка под узкие экраны. Исправить просто — использовать для content например float: right, а не left. Или не использовать float, а просто поставить padding-left.

Также, непонятно, откуда взялось число 83%.

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


!xnn2uE3AU. Втр 27 Авг 2013 20:18:06  #68 №314329 

>>314303

Что насчет этих: http://www.google.ru/search?client=&rls=en-GB&q=sublime+format+code+php&sourceid=&ie=utf-8&oe=utf-8&channel=suggest ?

>>314314

задача 3

> font-size: 0%;
Лучше бы другой способ использовал, не нравится мне идея с обнулением шрифта. И шрифт в желтых блоках не-жирный. В остальном, выглядит верно.

задача 4

Сделай шрифт покрупнее (например, 32px) и ты увидишь баг: http://jsbin.com/idoFUGe/2/ — у красной полоски слева и справа нет паддинга, она примыкает вплотную к буквам, некрасиво. В остальном, верно.

Аноним Втр 27 Авг 2013 21:00:31  #69 №314343 

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

Аноним Втр 27 Авг 2013 21:36:31  #70 №314348 

https://github.com/serrufAAA/HelloWorld Стыдно показывать, во что я превратил зачатки борды. Доброкун, дай мне ЦУ пожалуйста, а то я потерял всякое желание продолжать что-то делать. ох, скоро осень, учеба, все пхп забудется

!xnn2uE3AU. Втр 27 Авг 2013 22:14:22  #71 №314358 

>>314348

Проблем не так и много (пока что). Но вот это нехорошо:

> $sql="INSERT INTO post(title, content, create_time) VALUES('{$post->title}', '{$post->content}', {$post->time})";
> $db->exec($sql);
Так, иди читай про плейсхолдеры в запросах и про bindValue в PDO (например тут http://habrahabr.ru/post/137664/ ). Переделай все запросы на использование плейсхолдеров и никогда больше не подставляй переменные прямо в текст запроса.

Также, настрой в редакторе чтобы Tab заменялся на 4 пробела. На гитхабе из-за табов все равъехалось в разные стороны, тяжело читать. В Sublime 3 табы заменяются на пробелы прямо через меню, в других редакторах тоже есть возможности для этого.

Также, настройки соединения с БД надо вынести в отдельный файл, например, application/config.php. А то представь, я хочу запустить этот код и должен все файлы просомтреть и найти где эти настройки меняются. Неудобно. Файл config.php может выглядеть например так:

$config = Config::getInstance(); // ок, синглтон это плохо но пока пусть будет так, лучше чем ничего
$config->dbName = '...';
$config->dbUser = '...';
....

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

Также, если ты что-то выводишь в view, то должен делать htmlspecialchars($x, ENT_QUOTES), чтобы не было XSS. То есть вместо

<?= $title ?>

везде пишем

<?= h($title) ?>

Где h() − это функция, вызывающая htmlspecialchars.

В index.php:

> header("Content-Type: text/html;charset=utf-8");
Нехорошо, а вдруг ты захочешь картинку (image/png) или JSON (application/json) отдать?

> $filePath = implode(DIRECTORY_SEPARATOR, $path) . '.php';
Можно не заморачиваться с DIRECTORY_SEPARATOR, Windows много лет понимает / в путях, linux всегда понимал, макось последние лет 10 тоже использует /. Потому можно писать гораздо проще, через '/' и везде будет работать.

В файле application_Controllers_Main:

> application_Controllers_Main
Лучше бы писать с большой буквы и переименовать папку (или сделать костыль для изменения буквы в автозагрузчике)

> $this->view = new core_View();
> $this->post = new application_Models_Post;
Можно (и лучше в данном случае) писать просто

$post = new application_Models_Post;

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

В application_Controllers_Post:

Алгоритм работы с формами должен быть такой:


Если (метод = POST) {
Проверяем данные;
Если (все верно) {
добавляем пост;
делаем редирект на пост;
конец;
}
}

Выводим форму и возможно сообщения об ошибке


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

> $post->title=trim(strip_tags($_POST['tittle']));
Нехорошо, а если у меня пост называется «Особенности тега <a>»?

Старые контроллеры, которые не используются, надо удалить.

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

О, еще может попробуем сделать поддержку нескольких языков. Но это потом.
Аноним Втр 27 Авг 2013 22:33:22  #72 №314366 

Оп, поясни про кошек-мышек, по какому алгоритму поле рисовать? Что-то умнее массива в цикле ничего не могу придумать. А если так, то ведь оче запутанно будет в дальнейшем.
Ну или дай чего полегче :3

sageАноним Втр 27 Авг 2013 22:52:53  #73 №314376 
1377629573907.jpg

простенький вариант того алгоритма с векторами, ещо не придомал как животные будут взаимодействовать если их будет больше
http://ideone.com/W03W9Y

!xnn2uE3AU. Втр 27 Авг 2013 22:54:57  #74 №314377 

>>314366

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

array(
array(".", ".", "M", "."),
array(".", "C", ".", "."),
....
);

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

Ну или в самом начале ты можешь вообще текстом писать «Кошка x=2,y=3»

Сделай хоть что-нибудь, в общем, потом если что переделаешь.

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

Аноним Срд 28 Авг 2013 00:06:42  #75 №314410 

http://ideone.com/w94xFY
стих вверх тормашками

Аноним Срд 28 Авг 2013 03:10:16  #76 №314446 

>>314328
Спасибо. Я думал цвета не важны, сейчас все кажется сделал:

http://jsbin.com/OSigiS/4/
http://jsbin.com/OPAYOj/3/
http://jsbin.com/IceBof/6/
http://jsbin.com/iVoHOWa/2/
http://jsbin.com/ODOCeWE/4/ - только с этим проблемы. Не получается сделать 2 колонки, текст все равно оборачивает меню снизу.

Аноним Срд 28 Авг 2013 11:01:57  #77 №314502 

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

Аноним Срд 28 Авг 2013 12:07:50  #78 №314515 

>>314446
> http://jsbin.com/ODOCeWE/4/ - только с этим проблемы. Не получается сделать 2 колонки, текст все равно оборачивает меню снизу.
http://jsbin.com/ODOCeWE/5/ пофиксил

Аноним Срд 28 Авг 2013 12:35:57  #79 №314516 

клуб любителей пощекотать очко

Аноним Срд 28 Авг 2013 13:13:01  #80 №314524 

>>314516
Зачем ты тут рекламируешь свой гей клуб?
Тебя сюда не звали! Уходи!

Аноним Срд 28 Авг 2013 13:41:21  #81 №314528 

>>314358
Блин, ДК, какой ты все такие хороший! Твои советы прямо как холодная вода, в чувства приводят, а то я сижу как сыч и только и думаю, что о начале учебы. А фигли думать, когда первые пары в пнд? Вобщем спасибо, снова обрел смысл, хотябы до конца недели.

!xnn2uE3AU. Срд 28 Авг 2013 13:58:50  #82 №314532 

>>314376

О, круглое поле смотрится годно. Но по-моему они у тебя даже пока не едят друг друга.

>>314410

Хорошо, решено верно.

!xnn2uE3AU. Срд 28 Авг 2013 13:59:20  #83 №314533 

>>314446

Задача 1 Все верно
Задача 2 Правильно решено
Задача 3

В общем, все хорошо
1) потерялся border у желтых блоков (ну ладно, это мелочи, можешь не исправлять)
2) а зачем overflow: hidden? У нас учебная задача, нельзя ставить свойства «на авось».

Также, эти overflow здорово мешают, когда например потом захочешь добавить какую-нибудь кнопочку в угол блока, чтобы она вылезала за его границы. Не люблю overflow hidden.

Задача 4

Все хорошо, но текст должен быть не черный, а тоже цветной.

Задача 5

Ты перепутал #content и .content, посмотри внимательнее.

!xnn2uE3AU. Срд 28 Авг 2013 14:06:57  #84 №314539 

>>314502

Тут надо не гадать, а померять, хотя бы с помощью microtime(true), сколько времени это занимает. Если медленно — можно эту инофрмацию кешировать куда-нибудь в memcache или APC cache.

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

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


>>314515

Ок, эта задача решена.

>>314528

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

Аноним Срд 28 Авг 2013 14:20:01  #85 №314543 

>>314358
Я не понял куда редирект. У меня всего-то есть главная, и страница с формой для поста или комента. Нужно еще конечно сделать страницу с тредом, но с моими знаниями css это будет сложно.

Аноним Срд 28 Авг 2013 14:26:46  #86 №314544 

>>314358
Алсо, в Sublime и так вроди стоит indentation->tab width 4, или что-то другое нудно поменять?

Аноним Срд 28 Авг 2013 14:37:20  #87 №314548 

>>314544
tab на spaces поменяй

!xnn2uE3AU. Срд 28 Авг 2013 15:31:02  #88 №314561 

>>314543

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

!xnn2uE3AU. Срд 28 Авг 2013 15:31:57  #89 №314562 

>>314544

Поставь галочку Indent Using Spaces и сразу же сделай Convert Tabs To Spaces.

Аноним Срд 28 Авг 2013 17:13:54  #90 №314578 

Сложные эти ваши кошки-мышки, не для ньюфага.
Весь секрет успеха в решении в правильном описании классов и методов, да? Я чего-то похожее на ООП понатыкал, а юзать не знаю как. Вот и не идет дальше первоначального рандомного спавна кошки/мышки. Бида

!xnn2uE3AU. Срд 28 Авг 2013 17:53:02  #91 №314596 

>>314578

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

Аноним Срд 28 Авг 2013 19:38:53  #92 №314656 

>>314596
ОП, подкинь мыслей, хоть в какую сторону двигаться. Что в классах должно быть и как примерно они должны взаимодействовать друг с другом Пока есть вот эти превозмогания: http://ideone.com/xFmRY5

Аноним Срд 28 Авг 2013 20:02:13  #93 №314668 

>>314533
Спасибо.

Исправил 3): http://jsbin.com/IceBof/6/

6-9:
http://jsbin.com/eQunehe/1/
http://jsbin.com/uYURuPa/2/
http://jsbin.com/AXixEJu/1/
http://jsbin.com/ELiZojE/1/ - тут не получилось выровнять username относительно коммента.

Аноним Срд 28 Авг 2013 20:17:28  #94 №314672 

>>314358
Так, ну вроди вот https://github.com/serrufAAA/HelloWorld Почему-то git плохо ладит с переименованием и удаление файлов. Старые контроллеры выпилены, application->Application, но этого почему-то не видно. По порядку: плейсхедеры крутые, я даже сделал чтобы не массив массивов, а массив объектов, все ок. Настройки бд: в отдельный файл перенести не получилось, но теперь настраивается в bootstrape-е, как в Yii. htmlspecialchars добавил через статический метод. Возник вопрос как выводить ошибки в формах. Передавать GET-ом через ...?var=value или бросать исключения? Но исключения же придется в view обрабатывать, так можно?

!xnn2uE3AU. Срд 28 Авг 2013 20:43:50  #95 №314683 

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

Задача на ООП

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

Менеджер получает 500 тугриков в месяц, выпивает 20 литров кофе и производит 200 страниц отчетов в месяц
Маркетолог — 400 тугриков, 15 литров кофе и 150 страниц отчетов
Инженер — 200 тугриков, 5 литров кофе и 50 страниц чертежей
Аналитик — 800 тугриков и 50 литров кофе и 5 страниц стратегических исследований

Кроме того, все сотрудники бывают 3 рангов: первого, второго и третьего. Сотрудник второго ранга получает на 25% больше, чем первого, а сотрудник 3-го ранга - на 50% больше, чем первого.

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

Вот состав департаментов:

Департамент закупок: 9×ме1, 3×ме2, 2×ме3, 2×ма1 + руководитель департамента ме2
Департамент продаж: 12×ме1, 6×ма1, 3×ан1, 2×ан2 + руководитель ма2
Департамент рекламы: 15×ма1, 10×ма2, 8×ме1, 2×ин1 + руководитель ма3
Департамент логистики: 13×ме1, 5×ме2, 5×ин1 + руководитель ме1

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

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

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

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


Департамент сотр. тугр. кофе стр. тугр./стр.
-----------------------------------------------------------------------
Закупок 25 45040 100 10 450.4
Продаж 14 56000 150 12 560
....

Среднее 23.5 35600 170 15 500
Всего 120 120000 220 34 2000


Программа должна быть сделана так, чтобы исходные данные о сотрудниках можно было легко поменять.
!xnn2uE3AU. Срд 28 Авг 2013 20:57:20  #96 №314693 

>>314656

Предлагаю такую архитектуру:

Класс Mouse и Cat — классы кошки и мышки, содержат логику поведения (то есть код, который решает, как ходит животное)
Эти классы стоит унаследовать от единого класса Animal например.

Класс Map (или Field) — класс, хранит в себе информацию, где находятся кошки и мышки, и умеет выводить ее в виде карты
Класс Game — управляет игрой, создает карту, создает и добавляет в начале игры кошек/мышек на карту, дает им ходы по очереди

В общем, примерно как у тебя. Замечания и советы:

- Не используем public свойства, только private и protected
- Вместо function spawnCat() лучше сделать конструктор с параметрами x,y чтобы можно было писать так:

$cat = new Cat(10, 12); // создаем кошку
$map->add($cat); // добавляем на карту

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

$map = "
..........
....C.....
......m...
..........
";


Аноним Срд 28 Авг 2013 21:11:31  #97 №314700 
1377709891423.jpg

>>314683
Ой фу блять, фу!
Вот нахуя нужно ТАКОЕ гавно?
Нахуя эти ебанутые задачки? Вам блять тугрики считать надо, или сайты писать?ну я знаю, что на пыхе можно даже весьма пиздатых демонов писать и даже многопоточные приложения, но ты же об этом нахуй не слыхал, так что не будем об этом
Задачки имеют смысл только если ты будешь писать высоконагруженные приложенияи то далеко не всегда или 3D движки.
В остальном они НАХУЙ не нужны.
Вы тут свои задачки решаете и потом пишите скрипты, где по 68 запросов в цикле к базе на одной странице, код похож на блевотину кота, а про оптимизацию для конечного пользователя никто не думает.
А почему?
Потому что ты гавно.
Чтобы научиться прыгать с парашютом надо прыгать с парашютом, не надо бегать вокруг аэродрома с ранцем или рисовать парашюты на стенах в общественном туалете.
Я не спорю, для некоторых это прикольно, но это не поможет тебе научиться прыгать с парашютом.

!xnn2uE3AU. Срд 28 Авг 2013 21:15:36  #98 №314701 

>>314668

Общее замечание: если задаешь font-size, тут же задай line-height.

Задача 3, не понял что поменялось, но ладно, вроде разобрались с этой задачей.
Задача 6:

- не надо убирать паддинг у инпута. Попробуй что-нибудь ввести и посмотри, как некрасиво текст прилипает к левому краю.
- Почему высота кнопки 32, а не 30?
- Расстояние между input и кнопкой больше 10px

Задача 7:

- Что еще за .row? Для разделения текста на абзацы есть тег p, зачем городить свои теги для этого? div.row надо выпилить
- div.left туда же, выпилить
- Если мне не изменяет память, float автоматически задает свойству display значение block (или я путаю?), тогда зачем ты тут же пишешь display: inline-block?

- Предлагаю такую, более простую структуру HTML:

<div class="...">
<p>абзац 1</p>
<p class="note">примечние</p>
<p>абзац 2</p>
</div>

Задача 8:

Предлагаю упростить структуру HTML и выкинуть лишние дивы (что-то их многовато):

<div id="content">
<div class="row">
<div class="box"></div>
<p>Одна или несколько строк
текста размером 14рх.
</p>
</div>
<div class="row">
....

Также, предлагаю загуглить clearfix и new micro clearfix hack.

Задача 9:

Поскольку это кнопки, предлагаю «Ответить» и «Мне нравится» сделать тегом input или button, а не a. Чтобы выровнять надпись User относительно комментария, стоит поменять там margin-bottom на margin-top (ты наверно просто опечатался).

Аноним Срд 28 Авг 2013 21:35:19  #99 №314711 

>>314683
>Я у мамы самый умный.
Сделал две, проверь, пожалуйста:
http://ideone.com/3GGKJH
http://ideone.com/mK8NVl

И дай мне хоть наводку на то, как третью решать. Гуглил немного, почитал про debug_backtrace() и debug_print_backtrace(), но не увидал нужного функционала.
xDebug - громоздко и пока ни черта не понятно, может, он вообще не подходит для этих целей. Спасай-выручай, коль такую задачу выдумал.

!xnn2uE3AU. Срд 28 Авг 2013 21:51:38  #100 №314718 

>>314700

Мы сначала учимся вообще писать код, а потом думать об оптимизациях. Это задача для начинающих изучать ООП. Для людей, которые толком не запомнили чем abstract отличается от final.

И естественно, умение писать хороший ООП-код должно идти раньше чем умение заменять 68 запросов на 34.

!xnn2uE3AU. Срд 28 Авг 2013 21:56:45  #101 №314721 

>>314711

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

Алсо, с циклом слишком легко. Ты без цикла реши.

Задача 2.
http://ideone.com/hiiBcY — неправильно парсится строка, должен быть один элемент test, а не несколько.

Задача 3
заведи в функции переменную static. Они не уничтожаются при выходе из функции, а сохраняют свое значение. backtrace и xDebug тут не нужен.

!xnn2uE3AU. Срд 28 Авг 2013 21:57:35  #102 №314722 

>>314672

Фунцкию h можно ради простоты было сделать просто функцией, либо же класс лучше переименовать из XSS в Html. ну это не срочно, пока пусть будет как есть.

> Почему-то git плохо ладит с переименованием и удаление файлов.
Скорее всего, ты что-то неправильно делал, не так как надо коммитил. Или, если дело под виндой, то там могут быть проблемы, так как винда плохо различает маленькие и большие буквы. Если ты под виндой, то попробуй делать переименование в 2 шага: 1) core → tmp , закоммитить 2) tmp → Core, закоммитить. Либо поищи настройку, отвечающую за ignorecase, если знаешь где.


> Возник вопрос как выводить ошибки в формах. Передавать GET-ом через ...?var=value или бросать исключения?
Если у нас в форме ошибка, мы не редиректим (смотри алгоритм работы с формой где-то выше в моем посте), а снова выводим форму с сообщениями об ошибках. Насчет исключений — лучше бы без них обойтись, например, сделать метод validate() где-нибудь в модели, который возвращает список ошибок (можно массивами, можно объектами).

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

Насчет sql-кода таблиц, а зачем ты задаешь значение по умолчанию для content и post_id?

post_id int(11) NOT NULL DEFAULT '0',
content varchar(50) NOT NULL DEFAULT '',

Лучше написать NOT NULL и не задавать значение по умолчанию, тогда БД не позводит тебе вставить запись, если ты забыл какое-то обязательное поле, то есть полявляется дополниетльный уровень защиты от ошибок. Думаю, стоит пройтись по 2 Sql-файлам и убрать там дефолтные значения для полей, которые не могут быть пустыми.

create_time хорошо бы сделать не int, а DATETIME, тогда оно будет во всяких программах работы с Бд отображаться как дата, а не как число.

Также, есть интересная мысль. MySQL позволяет прописать связи между табицами. Например, у нас всегда comments.post_id указывает на таблицу post, поле id. Почему бы не прописать это явно (чтобы защититься от ошибок когда мы создаем коммент с неправильным или пустым post_id)? Допиши в конец CREATE TABLE comments такую строку:

PRIMARY KEY (id),
FOREIGN KEY (post_id) REFERENCES posts (id) ON DELETE RESTRICT ON UPDATE RESTRICT

B нагугли где-нибудь теорию, как это работает. Если сделать так, то MySQL не даст тебе создать коммент, указывающий на несуществующий пост и не даст удалить пост, если у него есть комменты (так как при этом поле post_id станет указывать на несуществующий более пост).

Конечно, эти FOREIGN KEY в некоторых случаях, наоборот, создают сложности, но думаю, ты с ними справишься. Зато взамен мы получаем контроль целостности ссылок на уровне БД, а это круто.

> $config->setConfig(array(
> 'dbName' => "test.db",
> 'dbUser' => "root")
> );

Ох, плохо же, почему бы не использовать просто

$config->dbName = ...;
$config->dbUser = ...;

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


> if(!empty($_POST['post_id']) && !empty($_POST['content']) && strlen($_POST['content']) > 3){
Валидацию (проверку правильности) лучше перенести из контроллера в модель.

> $STH->execute((array)$comment);
Не, так не пойдет. Это ненадежно. У тебя в будущем могут появиться поля, которые не надо сохранять в базу, и тут будет выпадать ошибка. Лучше явно сделать:

$data = array(
'post_id' => $comment->post_id,
....
);


> $comments = $db->query($sql)->fetchAll(PDO::FETCH_CLASS, "core_Comment");
Так можно сделать пока, как временное решение, но вообще это не очень хорошее решение, так как при таком создании объекта вроде бы не вызывается конструктор, а просто создается пустой объект и в него запихиваются свойства. Если у тебя будут более сложные объекты, с конструктором, и с дополнительными полями, то это работать не будет. Пока можно оставить так, но имей это в виду.

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


12.3 ms 20 rows SELECT * FROM posts
1.03 ms 3 rows SELECT * FROM comments WHERE id = 6
12.5 ms OK INSERT INTO posts (...), ...

Total DB: 14.5 ms, script: 56ms <-- общее время работы скрипта и время на выполнение всех запросов


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

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

!xnn2uE3AU. Срд 28 Авг 2013 22:07:11  #103 №314731 

>>314672

Также, я сейчас посмотрел историю коммитов, старайся пожалуйста писать нормальные описания, вроде «added post form» или хотя бы на русском, но нормальные.

Chip Срд 28 Авг 2013 22:12:53  #104 №314733 

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

Вот вам недавняя задачка:
Имеем сервак с мускулом база на 200гб, там что-то 30+ млн текстовых материалов.
Требуется всего лишь
а) найти дубликаты
б) найти похожести на 90+%
И важно: никакие супер рейды и кластеры не рассматриваются, обычный сервак с с-ата винтом на 1тб, уникс и т.д.

!xnn2uE3AU. Срд 28 Авг 2013 22:20:22  #105 №314737 

>>314733

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

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

!xnn2uE3AU. Срд 28 Авг 2013 22:22:17  #106 №314738 

>>314733

Ты описал задачу, но не описал сколько на нее отведено времени. Одно дело, если это надо сделать за 3 часа (и отзыв, лол), другое — если есть 2 недели например.

Аноним Срд 28 Авг 2013 22:35:44  #107 №314746 

Это нормально - начинать изучать html на codecademy?
Решил сначала разобраться с html и CSS, а потом продолжить PHP.

!xnn2uE3AU. Срд 28 Авг 2013 23:26:01  #108 №314766 

>>314746

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

!xnn2uE3AU. Чтв 29 Авг 2013 00:38:39  #109 №314793 

Питон-куны, а можно вас потроллить? Правда, что у вас в языке тернарный оператор принято записывать через if в обратном порядке? Зачем так сложно? Я-то думал, в Питоне все делается ради читаемости и понятности, и уж точно лучше чем в PHP.

Вот у нас в PHP все нормально: $x = $y > 0 ? 1 : -1;

Также, чтобы 2 раза не вставать, поделюсь ссылочкой: http://roem.ru/2013/08/28/addednews79257/

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

sageАноним Чтв 29 Авг 2013 00:46:58  #110 №314797 

ПХП-куны а можно вас потроллить? Нахуя вы пишете "доллар" перед именами? Вот у нас в питоне все нормально

a = b

а в ПХП
$a = $b
Задача для умненьких !xnn2uE3AU. Чтв 29 Авг 2013 00:56:22  #111 №314800 

А вот еще интересно. Наткнулся в сети на такой код:

http://govnokod.ru/13669

Как вы видите, там в коде использованы русские имена полей в объектах, вроде:

> $Док2=$this->app->Документы->ПлатежноеТребованиеВыставленное->СоздатьДокумент();
> $this->app->УправлениеДенежнымиСредствами->ЗаполнитьРеквизитыРасчетногоДокумента(

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

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

Критиковать все горазды, а вы решение предложите. Я вижу плюс от импользования русскоязычных терминов, в том, что 1) они 100% понятны 2) они совпадают с терминами из кода 1С.

Аноним Чтв 29 Авг 2013 01:10:57  #112 №314804 

>>314800
>УстановитьСтатьюДДСПоУмолчанию
setArticleDDSByDefault
setDefaultArticleDDS

Задача для умненьких !xnn2uE3AU. Чтв 29 Авг 2013 01:17:39  #113 №314807 

>>314804

А ДДС почему транслитом? (ДДС = движение денежных средств наверно). И ты другие термины посмотри, ты офигеешь их переводить.

!xnn2uE3AU. Чтв 29 Авг 2013 01:26:49  #114 №314808 

>>314804

И вообще, проведем небольшое исследование. Гугл по поводу статьи ДДС говорит: http://systecs.ru/programs/objekty-programmy/spr_statji_dds.html — статья ДДС — это способ классификации перевода денег, то есть какой-то код.

Словарик тут пишет http://www.english.womanknow.ru/otchet-o-dvizhenii-denezhnyx-sredstv-na-anglijskom-yazyke/ что движение средств — это cash flow.

Так что статья ДДС — это что-то вроде cash flow category code и УстановитьСтатьюДДСПоУмолчанию (в моей версии) должно выглядеть как

setDefaultCFCCode()

И заметь, сколько гемора с одним названием одной функции, сколько уходит времени на выяснение, сколько ошибок это вызовет при сопряжении с 1С и сверке всех этих таблиц. Это все выльется в вполне конкретные денежные потери. Легко смеяться на 1-сниками, а ты годное, хорошее решение придумай.

Аноним Чтв 29 Авг 2013 01:31:54  #115 №314809 

>>314793
А еще в питоне switch/case нету...

Аноним Чтв 29 Авг 2013 01:51:57  #116 №314812 
1377726717908.png

http://jsbin.com/iwUvUKU/5/edit
http://jsbin.com/UpogAfo/2/edit
Так и не нашел способ, как убрать пробел между блоками, кроме обнуления шрифта. У кнопки размер почему-то получается не 30, а 31. Такие дела.

Аноним Чтв 29 Авг 2013 02:00:32  #117 №314814 

>>314808
http://ideone.com/3GGKJH
Переделал, проверь. Не осилил без циклов, в общем.

!xnn2uE3AU. Чтв 29 Авг 2013 02:02:25  #118 №314815 

>>314812

Сайт агросервис

Заголовок должен быть не-жирным шрифтом, в остальном верно.

Форма поиска

Для inline-элементов (кнопки и input) нужно выставлять правильный vertical-align, иначе они могут выровняться не так, как надо (сейчас они у тебя выравниваются по baseline и находятся на разной высоте).

padding у input убирать не надо, так как без паддинга текст прижимается слишком близко к краю и это некрасиво. Дефолтный паддинг 2px, можно просто выставить такой же и учесть его при расчете высоты.

4 свойства padding-top, left, ... можно бы объединить в одно.

> как убрать пробел между блокам
Платиновая статья на эту тему: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html

Обнуление шрифта, по моему, не лучший способ, давай что-нибудь по-лучше из статьи возьмем.

!xnn2uE3AU. Чтв 29 Авг 2013 02:13:45  #119 №314816 

>>314814

1) Вместо sizeof в наше время используют count (хотя это cинонимы, но пишут именно count), но в if можно просто писать if ($redundant), так как пустой массив приводится к false
2) Вместо foreach($redundant as $key=>$value) можно использовать implode.

Кстати, удалить лишние запятые в выводе можно rtrim().

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

Аноним Чтв 29 Авг 2013 02:33:03  #120 №314820 

>>314816
http://ideone.com/3GGKJH
В чем преимущество count перед sizeof?
Спасибо.
Да, я давно ничего не писал для разминки, про explode помнил, а implode выпало из головы напрочь.

Аноним Чтв 29 Авг 2013 02:35:14  #121 №314821 

>>314815
http://jsbin.com/UpogAfo/4/edit
Немного не ровно получается, так как высота кнопки больше на 1px.

!xnn2uE3AU. Чтв 29 Авг 2013 03:09:06  #122 №314823 

>>314820

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

Теперь все верно.

!xnn2uE3AU. Чтв 29 Авг 2013 03:26:47  #123 №314824 

>>314821

В каком браузере? В Хроме и Firefox кнопка и input выглядят правильно.

!xnn2uE3AU. Чтв 29 Авг 2013 04:36:13  #124 №314830 

>>314672

Борда-кун, держи обновленную верстку: http://rghost.ru/48440706

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

Аноним Чтв 29 Авг 2013 11:39:15  #125 №314886 

>>314809
NOOOOO!!!!

Аноним Чтв 29 Авг 2013 11:43:09  #126 №314889 

>>314808
> Легко смеяться на 1-сниками, а ты годное, хорошее решение придумай.

http://www.linux.org.ru/news/opensource/9517228

Аноним Чтв 29 Авг 2013 12:31:46  #127 №314921 
1377765106103.png

>>314824
В Хроме. В Опере и Firefox все ровно. Алсо, почему в Хроме размеры отступов, полей и т.д. показаны дробными числами, а в других браузерах целыми?

sageАноним Чтв 29 Авг 2013 12:33:03  #128 №314923 

>>314921
Потомушо Хромог.

Аноним Чтв 29 Авг 2013 12:56:47  #129 №314936 

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

!xnn2uE3AU. Чтв 29 Авг 2013 14:33:33  #130 №314969 

>>314889

Я надеюсь, это стеб. Ибо всерьез сравнивать это с 1С глупо.

>>314921

У меня в Хроме 30 px. Попробуй кнопке сделать box-sizing: border-box и жестко задать высоту.

!xnn2uE3AU. Чтв 29 Авг 2013 14:35:53  #131 №314970 

>>314889

И кстати, эта ссылка не объясняет, как переводить термины вроде СтатьяДДС. Конечно, в программе расчет Фибоначчи можно и латинницей все сделать, а в реальных задачах не все так просто. Это вам не монады на хаскелле писать, тут думать надо.

Аноним Чтв 29 Авг 2013 14:51:04  #132 №314982 
1377773464806.jpg

>>314970
> Это вам не монады на хаскелле писать, тут думать надо.
Бугуртишь от того, что не осилил?

!xnn2uE3AU. Чтв 29 Авг 2013 16:48:46  #133 №315045 

>>314936

psd2cms.ru

Аноним Чтв 29 Авг 2013 18:08:19  #134 №315069 

>>314683
ОП, пробегись быстренько, подскажи в какую сторону идти: http://ideone.com/N3YYZb

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

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

Аноним Чтв 29 Авг 2013 18:35:38  #135 №315082 
1377786938026.jpg

Анончик, подскажи как правильно вычислять дату в поля timestamp

Вот нпр, мне нужно все записи последних 2-х дней, как правильно оформить запрос?
Как верно использовать NOW()?

sageАноним Чтв 29 Авг 2013 18:39:36  #136 №315083 

>>315069
не насилуй мозг всеми этими ссаными наследованиями и прочей говнотой.
функциональный подход намного прощe и натуральней чем ООП. ознакомься:
http://en.wikipedia.org/wiki/Functional_programming

!xnn2uE3AU. Чтв 29 Авг 2013 18:46:46  #137 №315085 

>>315082

Там есть что-то вроде NOW() + INTERVAL: http://stackoverflow.com/questions/3887509/mysqls-now-1-day

Но я бы вычислял дату в PHP и передавал явно, в стиле WHERE date > '....'

!xnn2uE3AU. Чтв 29 Авг 2013 18:57:45  #138 №315091 

>>315069

Плохо у тебя с ООП. Не беда, именно решением таких задач знания можно прокачать, я подскажу, как. Исправляй:

1) Для каждого департамента надо создавать свой объект, то есть:

// Создаем департамент продаж и забиваем его сотрудниками
$salesDep = new Departament("Продаж");
$salesDep->addEmpoyees(3, "man1");
$salesDep->addEmpoyees(5, "man2");

// Ставим им руководителя
$head = new Manager(3); // менеджер 3-го разряда
$salesDep->setHead($head); // назначаем руководить департаметнтом. При этом должно автоматически вызываться что-то вроде
> $head->setPosition(Employee::POSITION_HEAD); // делаем его руководителем



2) Для каждой профессии стоит создать свой класс (Manager, MarketingPerson, Engineer, Analytic), они должны наследоваться от абстрактного класа Employee (сотрудник), у них должны быть свойства вроде ранг и позиция (обычный сотрудник или руководитель). Для рангов, профессий и позиций надо, естественно, зафигачить константы.

В методе addEmployees() создавать нужное количество объектов, то есть если мы пишем

$salesDep->addEmpoyees(3, "man1");

То при этом вызове создается 3 объекта-менеджера и добавляется в стройные ряды сотрудников.

3) Класс Ranks выпилить нафиг
4) Класс Info выпилить

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

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

!xnn2uE3AU. Чтв 29 Авг 2013 19:00:50  #139 №315092 

>>315069

Также, хочу показать интересную штуку. Есть методы (вроде addEmployees), которые ничего не возвращают. Если в конец им поставить

return $this;

то такие методы можно будет писать цепочкой, например:

$salesDep = new Departament("Продаж");
$salesDep->addEmpoyees(3, "man1")->addEmpoyees(5, "man2");

Стильно, модно, молодежно.

Аноним Чтв 29 Авг 2013 19:32:43  #140 №315102 

>>314701
Спасибо.

6-9:
http://jsbin.com/eQunehe/4/
http://jsbin.com/uYURuPa/4/
http://jsbin.com/AXixEJu/2/
http://jsbin.com/ELiZojE/3

Во всех колонка слева не на одном уровне справа. Долго пытался, но ничего не получилось.

Аноним Чтв 29 Авг 2013 19:37:37  #141 №315104 

>>315102
>>314701
> - Почему высота кнопки 32, а не 30?
input type=submit в высоте учитывает границу, поэтому пришлось на 2px увеличить.

Аноним Чтв 29 Авг 2013 20:50:23  #142 №315138 

>>314830
О, спасибо! Теперь у уютного будет своя криво-борда.

sageАноним Чтв 29 Авг 2013 21:20:56  #143 №315153 

>>315138
>у уютного
У чего?

Аноним Чтв 29 Авг 2013 21:23:05  #144 №315155 

Не совсем пхп, но рядом.
В корне сайта есть файл с именем например tag_2.php
Нужно заставить сервер выдавать этот файл в ответ на запрос site.ru/tag/2
Помогите сформулировать правило в .htaccess

Алсо, это должно как-то ужиться с тем что там есть сейчас:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

ErrorDocument 404 /404.php

Аноним Чтв 29 Авг 2013 21:32:55  #145 №315156 

>>315153
Ты пишешь в уютный с сажей, ты плохой.

Аноним Чтв 29 Авг 2013 22:01:35  #146 №315160 

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

ПОмоги а то я не осилил

Аноним Чтв 29 Авг 2013 22:25:22  #147 №315162 

>>315160
Ты не можешь считывать из файла?

Аноним Чтв 29 Авг 2013 22:45:31  #148 №315171 

>>315162
Нет, не могу массив записать

Аноним Чтв 29 Авг 2013 23:04:53  #149 №315183 

>>315171
Выложи код своего скрипта (например, на ideone.com) для начала.

sageАноним Птн 30 Авг 2013 00:17:56  #150 №315209 

>>315183
вот код скрипта http://ideone.com/7IH7Qw

!xnn2uE3AU. Птн 30 Авг 2013 00:44:00  #151 №315222 

>>315102

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

> Во всех колонка слева не на одном уровне справа.
Не понял, о чем речь.


задание 6: ширина инпута больше 400px (пруф http://jsbin.com/eQunehe/5/edit ), также, странно смотрится слеш из языка XHTML в теге <input .... />. Зачем он там? Все остальное хорошо.

задание 7: не очень хорошо

<p class="main clearfix"> — нехорошо, представь, ты на каждый абзац будешь ставить эти классы. Пусть обычные абзацы будут просто тегом <p>.

Также, плохо, что ты делаешь поля с помощью margin. Представь, у тебя там еще кроме текста будут списки, таблицы, картинки, ты каждому тегу будешь приписывать margin-left 120px? Нафиг-нафиг, для полей есть замечательное свойство padding и ставить его надо не на абзацах, а на родительском элементе.

Также, плохо, что ты бездумно поставил clearfix. Вот что получается, если примечание будет больше чем абзац: http://jsbin.com/uYURuPa/6/

Чтобы выровнять примечание по высоте с первой строкой абзаца, можно использовать margin или padding.

Задание 8:

<p class="clearfix"> — не совсем логично, вообще-то clearfix используется на родителе (на сером боксе), чтобы серый бокс растягивался под высоту флоатов внутри него, а на абзац его ставить смысла нет (так как внутри абзаца нет флоатов). Похоже, ты невнимательно прочел теорию. Исправлйся.

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

Задание 9:
<input type="submit" value="Ответить" /> — зачем в конце слеш? Что изменится, если его убрать?

Алсо, обнаружил забавный баг. Если делать кнопки input'ом в старой Опере, то текст в них не подчеркивается (несмотря на t-d:underline), а если сделать button — подчеркивается. Но поддерживать старую Оперу не входит в наши задачи, так что это не ошибка.

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

!xnn2uE3AU. Птн 30 Авг 2013 00:47:32  #152 №315229 

>>315155

выкинь RewriteCond и напиши
RewriteRule /tag/2 tag_2.php

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

Также, если у тебя есть сомнения, а какие именно правила сработали и как? — в Апаче можно включить режим отладки реврайтов, читай первый ответ тут: http://stackoverflow.com/questions/9632852/how-to-debug-apache-mod-rewrite

Если включить эти директивы (RewriteLog и RewriteLogLevel) то Апач будет в этот лог писать подробно для каждого запроса, какие правила применялись и как переписывался запрос. Это полезно в запутанных ситуациях.

!xnn2uE3AU. Птн 30 Авг 2013 00:48:17  #153 №315230 

>>315229

Ой, вроде первый слеш не нужен,

RewriteRule tag/2 tag_2.php

Аноним Птн 30 Авг 2013 00:49:21  #154 №315231 

А есть чего годного из IDE для ньюфага под ленсук?

!xnn2uE3AU. Птн 30 Авг 2013 00:50:19  #155 №315234 

>>315138

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

!xnn2uE3AU. Птн 30 Авг 2013 00:52:29  #156 №315236 

>>315231

Netbeans, Eclipse PHP, phpStorm, но конечно суровый бородатый линуксоид с презрением отметет эти недо-IDE и скомпилирует vim или emacs.

А я лично предпочитаю Sublime. Люблю вещи с продуманным няшным интерфейсом.

!xnn2uE3AU. Птн 30 Авг 2013 00:56:22  #157 №315238 

>>315209

хаскеллист-теоретик пожаловал?

Аноним Птн 30 Авг 2013 00:59:29  #158 №315241 
1377809969693.jpg

>>315236
Только vim/emacs, только хардкор. Зонды не нужны.

!xnn2uE3AU. Птн 30 Авг 2013 01:07:30  #159 №315244 

>>315241

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

Аноним Птн 30 Авг 2013 01:11:07  #160 №315246 

>>315244
Ты просто не пробовал. После дня-двух под вимом ты уже не сможешь писать в саблайме, это как жрать говно, когда есть фуа-гра.

Аноним Птн 30 Авг 2013 01:17:44  #161 №315250 

>>315244
Ну, типа ничто не вечно под луной, чувак.
Заветы меняются. Был, например, вполне пригодный Текстмейт. Где он теперь?
Ничто не вечно под луной. Кроме Лед Зеппелин и vim/emacs, конечно же!

!xnn2uE3AU. Птн 30 Авг 2013 01:18:12  #162 №315251 

>>315246

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

Аноним Птн 30 Авг 2013 01:19:59  #163 №315253 

>>315251
Ну, значит, ты дебил. Не всем дано, что уж тут. Как вы в саблайме по коду перемещаетесь? Мышкой?

Аноним Птн 30 Авг 2013 01:22:36  #164 №315254 

>>315253
А то. Хотя есть винтаж (ололо вим) мод, который как-то странно сделан, хоть и работает.

Аноним Птн 30 Авг 2013 01:24:19  #165 №315256 

>>315236
> суровый бородатый линуксоид
А на деле школьник с чсв нетакойкаквсе
В любом случае, не нужны ни те ни те

Аноним Птн 30 Авг 2013 01:25:04  #166 №315257 

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

мимопроходил

!xnn2uE3AU. Птн 30 Авг 2013 01:25:57  #167 №315258 

>>315253

Ctrl + R и набираешь название функции (поиск нечеткий, так что сокращения работают). Ctrl + Shift+ R ищет функции и классы по всему проекту (да, там есть индексация идентификаторов, и в отличие от ява-IDE она не тормозит). Ctrl + P ищет по именам файлов. Причем если ты открываешь файл или переходишь к функции, то по мере набора открывается файл и ты можешь, если посмотрел что надо, нажать Esc и вернешься назад. Плюс няшности вроде мультиселекшена. Удобнейший редактор.

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

Аноним Птн 30 Авг 2013 01:27:21  #168 №315259 

>>315256
Стоявшие у истоков операционных систем и языков программирования, конечно же нинужны. А вот миллионы кукарекающих хипстеров, бегущих за FOTM ЯП/IDE не могут ошибаться.

Аноним Птн 30 Авг 2013 01:28:31  #169 №315260 

>>315259
по дороге растерял все запятые

!xnn2uE3AU. Птн 30 Авг 2013 01:29:38  #170 №315261 

>>315253

Причем, как я понимаю, и vim и emacs используют консольку для вывода кода, а Sublime полноценно использует возможности современных экранов, рисует всякие рамочки и окошечки, а как он выглядит и некоторые приемы работы можно увидеть на гифке на офсайте http://www.sublimetext.com/ .

Аноним Птн 30 Авг 2013 01:31:17  #171 №315263 

>>315254
>винтаж
Год назад там не работала даже точка (повторение последней команды), так что никакого смысла нет. Вот в идее хороший эмулятор.
>>315257
Ты жопой читаешь, опущенка? Я говорю как ты, допустим, на 3 слова вправо переходишь?
>>315258
> Я говорю как ты, допустим, на 3 слова вправо переходишь?

Аноним Птн 30 Авг 2013 01:33:56  #172 №315264 

>>315261
>используют консольку для вывода кода
Emacs и Vim можно использовать в терминале, а можно извне. Для Vim есть GVim и подобное, EMACS же с гуем изкоробки.

!xnn2uE3AU. Птн 30 Авг 2013 01:34:40  #173 №315265 

>>315263

1) 3 раза Ctrl + →
2) Ткнуть мышкой

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

Аноним Птн 30 Авг 2013 01:35:33  #174 №315266 
1377812133520.png

>>315261
Gvim.
Btw, как саблайме забиндить команду на caps lock? У меня так и не получилось.

Аноним Птн 30 Авг 2013 01:37:10  #175 №315268 
[url]

emacs

!xnn2uE3AU. Птн 30 Авг 2013 01:38:25  #176 №315269 

>>315266

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

Аноним Птн 30 Авг 2013 01:40:22  #177 №315270 

>>315259
Будто бы в их времена были IDE сегодняшнего уровня, у них не было выбора, вот и жрали что давали

Аноним Птн 30 Авг 2013 01:40:40  #178 №315273 

>>315269
Ну это просто уникальна фича саблайма, лол. Это есть в любом редакторе уровня выше блокнота.

Аноним Птн 30 Авг 2013 01:41:29  #179 №315274 

>>315263
Уже работает, только к комбинациям вимоимитатора еще добавляется стандартные комбинации (^v, ^c, ^d, и пр) и получается пиздец какая каша.

!xnn2uE3AU. Птн 30 Авг 2013 01:46:34  #180 №315275 

>>315273

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

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

Аноним Птн 30 Авг 2013 01:48:10  #181 №315277 

>>315270
>жрали что давали
Кукарику!
Редактор - вторичен. Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed.

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

Аноним Птн 30 Авг 2013 01:49:48  #182 №315279 

>>315275
> мультиселекшен
Хотя в виме это есть, в то же время совершенно не нужно. Замена намного удобнее.

Аноним Птн 30 Авг 2013 01:51:05  #183 №315280 

Emmet в сублайме лучше, чем в виме. Вообще работа с хтмл/хмл подобными в сублайме лучше. Остальное дико не удобно или я не осилил

мимовимобог

!xnn2uE3AU. Птн 30 Авг 2013 01:55:18  #184 №315281 

>>315277

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

Ну и я не понимаю, что плохого в использовании мыши. Я кручу колесо, прокручивается код. Куда проще и логичнее?

Аноним Птн 30 Авг 2013 01:55:49  #185 №315282 

>>315277
> Редактор - вторичен. Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed
Ты так говоришь, будто я тебе доказывал обратное
> Ну и я думаю, что любому уважающему себя программисту на любом ЯП любого уровня вскоре придется изучать *NIX, командно-ориентированный+текстовый интерфейс
Ну, допустим
> и всё это
Зачем изучать консольные текстовые редакторы, если есть возможность мышкоёбствовать где удобно в гуе?

Аноним Птн 30 Авг 2013 01:58:04  #186 №315283 

>>315281
Перед одноклассниками с консолью можно пердолиться, а с хипстерскими редакторами нельзя

Аноним Птн 30 Авг 2013 01:59:08  #187 №315284 

>>315281
Ну ведь руку отрываешь от клавы. Дохуя времени идет. Пока ты возьмешься за мышку, прицелишься куда надо, уберешь руки с мышки и вернешься к клаве печатать, вимобоги уже и макрос запишут и прокрутить его несколько раз успеют. Такие дела.

!xnn2uE3AU. Птн 30 Авг 2013 02:01:21  #188 №315285 

>>315277

Изучать командную строку надо не всем, серверным разработчикам надо, а фронтендщикам — нет, им лучше консоль отладчика браузера изучить.

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

Аноним Птн 30 Авг 2013 02:03:03  #189 №315287 

>>315281
> используют нестандартные сочетания клавиш с давно умерших программ (нафига?)
стандартные - это C-C, C-V, C-X?
Они не "нестандартные", а эргономичные и удобные (это я про вим). Пользователям вима не надо тянуться к мышке для перехода на 2 строки ниже, вообще ни для чего не нужно тянуться к мышке. Так получается не отвлекаться он написания кода на всякую левую хуйню.
Но ты, наверное, не поймешь, потому что ты слишком зашоренный.

Аноним Птн 30 Авг 2013 02:04:58  #190 №315288 

>>315281
> Можно подумать, мне делать нечего как проходить спецкурс по пользованию редактором кода.
Можно подумать, что строителю нечего делать, как проходить спецкурс по пользованию рабочих инструментов.

Если ты 90% рабочего времени находишься в редакторе, то почему бы не научиться им пользоваться на 100%?

!xnn2uE3AU. Птн 30 Авг 2013 02:05:48  #191 №315289 

>>315277

> Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed.
Это провокационное заявление. Во времена ed программы укладывлись в один или несколько файлов на 1000 строк (пруф - смотри код первого компилятора Си или код первых версий фотошопа). Разрабатывал их чаще всего один автор (или несколько каждый свой модуль), держа архитектур в голове и на листочках бумаги.

Сейчас объем кода в проектах в разы больше. C ed ты офигеешь уже когда надо будет писать (и помнить наизусть) пути вроде application/modules/stats/controllers/graph.php, я уж боюсь представить сколько времении у тебя займет поиск, где находится класс Some_Class, в то время как в IDE (и в Sublime 3) есть киллер фича, когда кликаешь по имени класса или функции и переходишь к определению.

А что, кстати, в vim/emacs с индексацией? Они умеют в автокомплит и поиск функции по имени?

Аноним Птн 30 Авг 2013 02:10:58  #192 №315290 

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

!xnn2uE3AU. Птн 30 Авг 2013 02:14:24  #193 №315292 

>>315284

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

Например, когда я в командной строке что-то делаю с фалами, я устаю гораздо быстрее, чем когда использую mc или аналогичный менеджер, и половину времени трачу на просмотр вывода ls (или списка файлов после нажатия Tab). Возможно, конечно, я плохо знаю командную строку.

А вот что меня раздражает в некоторых ява-ИДЕ, так это 1) когда слишком много всплывающих подсказок включено (причем они еще и появляются и исчезают с огромной задержкой) и они отвлекают и 2) когда ИДЕ подвисает на секунду-две в ходе набора кода и я начинаю думать, это я клавишу не нажал или комп тупит, и опять же отвлекаюсь от задачи. По этой причине, например, я не смог нормально пользоваться eclipse. Ну и плюс в ней по умолчанию 100500 кнопок и окошек, они мешаются, а настраивать их расположение мне лень.

Аноним Птн 30 Авг 2013 02:17:48  #194 №315294 

>>315292
> вспоминание сложных клавиатурных команд — прерывает
Щас он скажет, что у него всё на рефлексах и мышечной памяти. Это же поехавший фанатик, он себя заставил верить в то, что это круто и пацаны уважают, а кто не пердолится с консолью - тот лох и опущенец

Аноним Птн 30 Авг 2013 02:20:39  #195 №315297 

>>315292
> вспоминание сложных клавиатурных команд
Кокой бред. Во-первых, они не сложные. Во-вторых, там нечего вспоминать, потому что их не много.

!xnn2uE3AU. Птн 30 Авг 2013 02:21:41  #196 №315299 

>>315287

> Они не "нестандартные", а эргономичные и удобные (это я про вим)
Никто не начинает знакомство с компьютера с вимом. Уже лет 15 все юные пользователи начинают с блокнота, ворда, екселя и для всех этих сотен миллионов пользователей C-C и выделение мышью — самое родное сочетанияе. А загадочные вимовские комбинации родные только для бородатых отцов-основателей линукса (потому, что такие комбинации клавиш использовались на древнем мейнфрейме в их университете, на котором не было ни мыши-утюга, ни стрелок на клавиатуре, ни кнопок управления плеером). И теперь объясни, почему все современные разработчики должны переучиваться на команды и жесты времен молодости Ритчи и Кернигана?

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

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

Аноним Птн 30 Авг 2013 02:24:18  #197 №315300 

>>315292
Ок. У меня все наоборот. Даже в командной строке все наоборот. Не смог осилить мс и подобных. Кто как привык.
>>315294
Мимо.

!xnn2uE3AU. Птн 30 Авг 2013 02:25:12  #198 №315301 

>>315290

Разве ctags — это не внешняя команда, которую надо вызывать, и которая переиндексирует проект с нуля, без инкрементальных изменений?

>>315288

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

Аноним Птн 30 Авг 2013 02:27:32  #199 №315303 

>>315301
Тебя троллят.

мимовсетотжевимобог

!xnn2uE3AU. Птн 30 Авг 2013 02:28:07  #200 №315304 

>>315297

Это не отвечает на вопрос, почему я в одной программе выделяю и копирую текст одной кнопкой, а ради vim должен запоминать другую, и еще помнить в какой программе я нахожусь (я например иногда пытаюсь сохранить набираемый в браузере комментарий через Ctrl + S и это не потому, что я тупой, а потому что плохо продуманный интерфейс).

Аноним Птн 30 Авг 2013 02:28:18  #201 №315305 

>>315299
> Что дольше, считать эти строки и набирать команды, или ткнуть хорошей чувствительной оптической мышью в нужную точку?
>ткнуть хорошей чувствительной оптической мышью в нужную точку
Вот это.
Потому что считать ничего не надо. Есть поиск, и обычно достаточно набрать первые 2-4 символа.

Аноним Птн 30 Авг 2013 02:30:23  #202 №315306 

>>315304
Все уже поняли, что ты тупой и не можешь изучать новое, даже если это принесет выгоду. Можешь не продолжать.

!xnn2uE3AU. Птн 30 Авг 2013 02:33:42  #203 №315307 

>>315305

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

Аноним Птн 30 Авг 2013 02:37:50  #204 №315308 

>>315307
Ты меня тролишь что-ли? У тебя большая нагрузка на мозг, когда нужно набрать / + <первые 2 символа того, куда надо перейти> + Enter ?
Алсо, смотри видео http://youtu.be/Dmv6-dguS3g?t=1m32s

!xnn2uE3AU. Птн 30 Авг 2013 02:41:18  #205 №315309 

>>315308

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

!xnn2uE3AU. Птн 30 Авг 2013 02:42:42  #206 №315310 

>>315308

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

Аноним Птн 30 Авг 2013 02:44:13  #207 №315311 

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

Аноним Птн 30 Авг 2013 02:52:17  #208 №315312 

>>315311
Что сложного, дебил? Может ты расскажешь как проще? inb4 мышка

Аноним Птн 30 Авг 2013 02:55:47  #209 №315313 

>>315312
Угомонись уже. Трудно людям доказать, когда сам привык и тебе все легко. Сам таким был когда-то. Надо будет попробуют.

>>315311
Такие плагины не нужны.

мимовимобог

Аноним Птн 30 Авг 2013 02:56:59  #210 №315314 

>>315312
Проще выебать мамашу глупого перокурсника с желанием быть не таким как все

Аноним Птн 30 Авг 2013 02:57:22  #211 №315315 

>>315312
Ну если сравнивать с саблаймом, то
cmd-F → два символа → cmd-G свитчишься между найденными совпадениями
без всяких переключений режимов и дополнительных плагинов.

Аноним Птн 30 Авг 2013 02:57:45  #212 №315316 

>>315313
> Сам таким был когда-то
алтфак в треде, лол.

Аноним Птн 30 Авг 2013 02:58:57  #213 №315317 

>>315314
Слышь нахуй иди понел

Аноним Птн 30 Авг 2013 14:19:32  #214 №315459 

PhpStorm охуенен. Меня все больше начинает мучать совесть, что использую без лицензии.
С первой же з\п обязательно куплю лицензию.

sageАноним Птн 30 Авг 2013 16:37:18  #215 №315514 

>>315307
Сколько у тебя рук и сколько из них ты держишь на клавиатуре при наборе?

Аноним Птн 30 Авг 2013 18:08:22  #216 №315550 

>>313971
Доброкун, решаю новую ООП-задачку.
Думал, что знаю его хоть сколько-нибудь, оказалось, гусь там.
Посмотри заготовочку, будь любезен: http://ideone.com/I5D778
Дай советов, подсказок. Боюсь я дальше писать, вдруг все совсем неправильно.
Кстати, не увидал я цену за литр кофе, чтобы посчитать тугрикостраницы.

!xnn2uE3AU. Птн 30 Авг 2013 18:27:19  #217 №315552 

>>315550

В общем, ты двигаешься в правильном направлении, но немного перемудрил.

Вместо хитрых вычислений salaryRate в конструкторе, лучше просто хранить информацию о работнике: ранг, базовая ставка (в зависимости от профессии), позиция (руководитель или сотрудник). А зарплату не хранить, а вычислять в функции getSalary() из этих данных. Почему? 1) так код будет проще 2) если например мы повышаем ранг, то достаточно поменять одну цифру, а не пересчитывать все

Базовая ставка (сколько получает сотрудник 1-го ранга) постоянна для каждой профессии, значит ее можно определить как свойство в классе:

class Manger
{
protected $baseSalaryRate = 500; // или сколько там получает менеджер

Ну и естественно, надо дописать функции для получения информации о работнике: getSalary(), getCoffeeConsumption(), getPageProduction(). Эти функции как раз и будут содержать логику, которая описана в условиях задачи (то есть учитывать ранг, должность и прочее).

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

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


!xnn2uE3AU. Птн 30 Авг 2013 18:29:55  #218 №315553 
1377872995600.jpg

>>315514

Аноним Птн 30 Авг 2013 19:19:38  #219 №315562 

>>315553
Это ж октокот с trygit, да?

!xnn2uE3AU. Птн 30 Авг 2013 19:29:17  #220 №315568 

>>315562

Да, октокот, маскот гитхаба.

Аноним Птн 30 Авг 2013 21:33:39  #221 №315614 

Доброкун, как во второй функции грамотно разбить эксплойдом предложение? У меня такая лажа выходит:
http://ideone.com/St5FnS

Аноним Птн 30 Авг 2013 22:59:42  #222 №315661 

>>315552
Проверь теперь, пожалуйста: http://ideone.com/kUeZAH .
Теперь надо Department запиливать. В конструктор передавать имя раздела? А как функцию addEmployees() сделать? Не могу сообразить. Как понимаю, в нее надо передавать название класса сотрудника (профессии то бишь),
его ранг, позицию и количество таких сотрудников, но как вызывать конструктор нужного класса в зависимости от имени класса, переданного в функцию? Кейсы городить? Наставь на путь истинный и все такое.

!xnn2uE3AU. Суб 31 Авг 2013 00:07:03  #223 №315677 

>>315661

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

> if ($this->rank==Employee::SECOND_RANK){$this->salaryRate=1.25;}
Не экономь место и пиши в 3 строчки, как положено:


if ($this->rank==Employee::SECOND_RANK) {
$this->salaryRate=1.25;
} else {


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

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

Цепочку вызовов и return $this используют с другими методами, вроде addEmployee() или setLeader() которые ничего не возвращают.

> if ($this->rank==Employee::SECOND_RANK){$this->salaryRate=1.25;}
> elseif ($this->rank==Employee::THIRD_RANK){$this->salaryRate=1.5;}

Это надо перенести из конструктора в getSalary().

> FIRST_RANK=1;
Обычно такие константы называют в другом порядке, RANK_FIRST. Почему? 1) так принято 2) потому, что когда в IDE начинаешь набирать Employee::RANK_ то в выпадающей подсказке появляются все варианты констант, удобно.

> $isLeader=false
Думаю, тут лучше сделать другое, вынести параметр из конструктора и задавать его отдельной функцией setIsLeader(true); Так чуть логичнее, так как мы можем уже после создания объекта сделать его руководителем, или наоборот разжаловать до сотрудника. Причем вызов этого метода можно сделать автоматическим, когда ты назначаешь человека руководителем:

$depatrment->setLeader($person);

То функция setLeader() может автоматически делать $person->setIsLeader(true); (а еще можно сразу же предыдущему руководителю делать setIsLeader(false) )


> public function getCoffeeConsumption(){
> if ($this->isLeader){$this->coffeeConsumption*=2;}

Нехорошо. Функция вида get* должна возвращать что-то, а не менять состояние объекта. Если мы случайно 2 раза вызовем эту функцию то потребление кофе вырастет в 4 раза без всякой причины.

> Теперь надо Department запиливать. В конструктор передавать имя раздела?
Логично.

> Как понимаю, в нее надо передавать название класса сотрудника (профессии то бишь),
его ранг, позицию и количество таких сотрудников, но как вызывать конструктор нужного класса в зависимости от имени класса, переданного в функцию?

Делаем метод Employee::createEmployee($code) который создает работника по переданному типу, а в нем if/else или switch/case. Кстати, такая функция, которая создает объекты, называется фабрикой.


!xnn2uE3AU. Суб 31 Авг 2013 00:10:19  #224 №315679 

>>315614

Если проблема в пробелах, то есть 2 варианта:

1) Функциями trim, ltrim, rtrim можно отрезать пробелы (и кстати, не только пробелы) с краев строки.
2) можно заменить много пробелов на 1 с помощью preg_replace и регулярных выражений.

Также, совет:

> $sentence1 = makeFirstLetterUppercase($piece[0]);
> $sentence2 = makeFirstLetterUppercase($piece[1]);
> $sentence3 = makeFirstLetterUppercase($piece[2]);

Этот код поддерживает только ровно 3 предложения. Надо переделать, чтобы могло быть сколько угодно предложений, от 0 до бесконечности. Толстый намек: используй foreach

Аноним Суб 31 Авг 2013 00:24:52  #225 №315684 

>>315677
>фабрикой
А вот мы и до паттернов добрались, собственно. Только хотел спросить про MVC, design patterns и прочие чудеса enterprise.

>Sublime Text
Уже стоит, но писал в ideone. Все лень было потратить пару минут на настройку php.ini, теперь готов к работе.

>const RANK_*
При именовании констант я подумал об этом, но почему-то сделал по-другому. И не упомню, чем руководствовался.

>Это надо перенести из конструктора в getSalary().
>Функция вида get* должна возвращать что-то, а не менять состояние объекта.
Твое противоречие, либо мое недопонимание. Сделать setSalary()? А вызывать set-ы где? Прямо в конструкторе?

>Employee::createEmployee($code), а в нем if/else или switch/case


public function createEmployee($count, $profession){
if($profession='Manager')
{
for($iterator=1; $iterator<$count; $iterator++){
$employee=new Manager;
}
}elif(...){...}
}

Правильно понял?
Спасибо.
!xnn2uE3AU. Суб 31 Авг 2013 00:37:25  #226 №315690 

>>315684

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

>> Это надо перенести из конструктора в getSalary().
>> Функция вида get* должна возвращать что-то, а не менять состояние объекта.
> Твое противоречие, либо мое недопонимание. Сделать setSalary()? А вызывать set-ы где? Прямо в конструкторе?

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

То есть логика расчета зарплаты с учетом всех факторов должна быть вписана в getSalary()

> Правильно понял?
Да. Но вот тут вот:

> public function createEmployee($count, $profession){
думаю, лучше убрать $count, просто в addEmployee вызовешь ее циклом несколько раз если надо нсеколько сотрудников.

Также, когда профессиональный программист видит такую строчку

if($profession=='Manager')

что ему бросается в глаза?

1) должно быть 2 равно, а не 1
2) 'manager' должно быть не строкой, а либо скоращением, либо константой.



Алсо, еще одна мысль. Поскольку базовые ставки для профессии у нас постоянные, то вот это вот можно вынести из конструктора:

> $this->defaultSalary=500;
> $this->coffeeConsumption=20;
> $this->pagesCreated=200;

и прописать как дефолтные значения свойство объекта:

protected $defaultSalary = 500;
protected $pagesCreated = 200;

Так будет короче и нагляднее.

!xnn2uE3AU. Суб 31 Авг 2013 00:43:31  #227 №315694 

>>315684

Кстати, отдельно поясню вот эту мою мысль:

> Мы не храним зарплату в полях объекта, а рассчитываем ее при вызове getSalary().

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

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

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

Аноним Суб 31 Авг 2013 01:41:22  #228 №315703 
1377898882873.jpg

>>315694
Как-то так: http://ideone.com/kUeZAH .
Не знаю, с чего начать с департаментами. Глуповат. Не пойму, как хранить какое количество сотрудников какого ранка и какой профессии работает в каждом из департаментов. Инкременты в addEmployees(), но их же куча для каждого департамента. А что будет, когда мы добавим еще и по паре ясновидящих в каждый департамент?
Наводочку, доброкун, наводочку, пожалуйста.

!xnn2uE3AU. Суб 31 Авг 2013 02:02:10  #229 №315705 

>>315703

> Не знаю, с чего начать с департаментами.
Давай подумаем, какие свойства/поля есть у департамента? Это:

1) название
2) список рядовых сотрудников (список в PHP проще всего реализовать массивом)
3) руководитель

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

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

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

Также, по коду:

if ($this->rank==Employee::RANK_SECOND){
$this->salaryRate=1.25;

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

> public function __construct($rank){
> parent::__construct($rank);
> }

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

> setCoffeeConsumption()
> setPagesCreated()

Эти методы надо выпилить. Они не нужны. Так же как и расчет зарплаты, расчет потребления кофе и производства страниц можно сделать прямо в функциях getCoffeeConsumption и getPagesCreated.

Аноним Суб 31 Авг 2013 02:49:50  #230 №315707 
1377902990623.jpg

>>315705
http://ideone.com/kUeZAH
Назначать руководителем надо не случайного работника, а конкретного. Значит, нужен уникальный идентификатор для каждого из сотрудников. Или есть другой способ, "как все делают"?
Почему-то не добавляется несколько сотрудников (линии 119-120): должно быть три аналитика первого ранга и два -- второго. На деле же, два аналитика первого ранга и один -- второго. В причине не разобрался, пошел спать.
Жду замечаний, подсказок, спасибо.

!xnn2uE3AU. Суб 31 Авг 2013 03:21:01  #231 №315710 

>>315707

> Почему-то не добавляется несколько сотрудников
Пересмотри внимательно условие в цикле: for($i=1; $i<$count; $i++){ — цикл выполняется на 1 раз меньше чем ты хотел.

> $sellsDepartment->addEmployees(Employee::PROF_MANAGER, Employee::RANK_FIRST, 12)
> ->addEmployees(Employee::PROF_MARKETER, Employee::RANK_FIRST, 6)

Обычно стрелочку оставляют в конце строки, а не переносят (так же как и знаки +, - в многострочных формулах):

$sellsDepartment->addEmployees(Employee::PROF_MANAGER, Employee::RANK_FIRST, 12)->
addEmployees(Employee::PROF_MARKETER, Employee::RANK_FIRST, 6)->


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

Вообще, каждый объект сам по себе уникален, и идентификаторы не обязательны (но они упрощают ситуацию). Можно просто создавать руководителя отдельно и передавать в функцию setLeader, так:

$leader = new Manager(3);
$department->setLeader($leader);

При таком подходе руководитель не хранится в массиве employees, там хранятся только рядовые сотрудники. Идентификатор нам не нужен, так как у нас есть переменная $leader, которая и хранит этого руководителя, и мы можем с ней делать что хотим.

Идентификаторы могут понадобиться потом, если например надо будет вывести зарплатную ведомость с таблицей всех сотрудников. Чтобы присвоить сотруднику уникальный номер, можно поступить очень просто: сделать статическое свойство $lastId = 1 в Employee и брать номер из него при создании сотрудника, увеличивая при этом каждый раз lastId на 1. Если хочешь, можешь сделать это. В принципе, логично автоматически нумеровать сотрудников.

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

- Если есть стадо, то есть пастух switch, то в нем должен быть пункт default, который например выьрасывает исключение или хотя бы делает die, если ты еще не учил исключения (но лучше бы исключения). Иначе в твоем варианте, если передать неправильное значение $profession, никакой ошибки не выведется, нехорошо. Код, который делает дополнительные проверки самого себя. гораздо надежнее и солиднее.

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

> if ($this->isLeader){$this->coffeeConsumption*=2;}
> if ($this->isLeader){$this->pagesCreated=0;}
Методы getCoffeeConsumption и getPagesCreate не должны менять поля объекта. Замени их на переменные.

ГДЕ ОШИБКА? Аноним Вск 01 Сен 2013 13:38:03  #232 №315754 

<?php

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

error_reporting(-1);

$dicePlayer1 = mt_rand(1,6);
$dicePlayer2 = mt_rand(1,6);

$diceComp1 = mt_rand(1,6);
$diceComp2 = mt_rand(1,6);

echo "У игрока выпало $dicePlayer1 и $dicePlayer2 \n У компьютера выпало $diceComp1 и $diceComp2 \n";

$compSum = ($diceComp1 + $diceComp2);
$playerSum = ($dicePlayer1 + $dicePlayer2);

if (($dicePlayer1 == $dicePlayer2) && ($diceComp1 == $diceComp2)) {
echo "Выпало два дабла, игра закончена, победила дружба \n";
exit();
}
else {
if($compSum == $playerSum) {
echo "Ничья. \n";
exit();
}
else {
if($compSum > $playerSum)
echo "Компьютер победил. \n";
exit();
}
else {
if (1=1);
echo "Вы победили. \n";
exit();
}

?>

Аноним Вск 01 Сен 2013 13:50:53  #233 №315761 

>>315754
Сам разобрался.

sageАноним Вск 01 Сен 2013 17:26:29  #234 №315825 

>>315754
>error_reporting(-1);
Каково это - быть петухом опущенным?

Аноним Вск 01 Сен 2013 18:06:39  #235 №315832 

>>315825

Тролль, уходи, еды нету.

Аноним Вск 01 Сен 2013 18:08:14  #236 №315833 

>>315754

if (1=1); — это что-то странное.

Аноним Вск 08 Сен 2013 19:42:51  #237 №315864 
1378654971302.png

Суп, анончики. Есть случайная картинка, которая выводится с помощью <имг срк="ляляля/<?php echo(rand(1,5)); ?>.jpg">. Мне надо, чтобы она показывалась через 20 секунд после загрузки страницы. Как это сделать? Нагуглил sleep(); но прикрутить не смог. Разжуйте, пожалуйста, а я вам черепашку дам.

Аноним Вск 08 Сен 2013 19:44:28  #238 №315865 

>>315864
Рендерь скрытой, а по таймеру открывай.

Аноним Вск 08 Сен 2013 19:48:51  #239 №315866 
1378655331612.jpg

>>315865 Не могу таймер прикрутить, почему и пришел сюда.

Аноним Вск 08 Сен 2013 20:17:37  #240 №315870 

Скучал по треду! Наша пхп-борда на MVC тихонько умирает, гит меня уже совсем не слушает https://github.com/serrufAAA/HelloWorld , но зато я перебрался в миллионник и здесь есть не иллюзорная возможность попробовать устроиться куда-нить макакой. Застрял на пагинации, профайлер так и не сделал. Не могу придумать как к своей MVC прикрутить норм пагинацию.

Аноним Вск 08 Сен 2013 20:39:11  #241 №315873 

>>315870
С гитом сразу же разобрался https://github.com/serrufAAA/HelloWorld живительное действие треда, не иначе!

Аноним Пнд 09 Сен 2013 02:13:42  #242 №315932 

>>315710
Ох, как же я скучал за харкачиком.
Доброкун, принимай, наконец: http://ideone.com/kUeZAH
Новый интерфейс ideone так себе, кстати.

!xnn2uE3AU. Пнд 09 Сен 2013 04:51:47  #243 №315940 

Ну что, выборы прошли, можно продолжать изучать PHP.

>>315866

Для таймера нужен не PHP, а яваскрипт. Гугли setTimeout и learn.javascript.ru.

>>315873

Пагинацию можно сделать так: делаем специальный класс Pagination, в конструктор передаем номер текущей страницы и общее число страниц. И у этого класса есть метод render(), который вызывает нужный шаблон, подставляет в него нужные переменные и выводит результат. В общем, виджет-пагинатор — по сути как отдельный view. Если нам понадобится поменять логику или вид пагинатора, мы можем это делать не трогая остальной код.

Соответственно, в контроллере мы создаем объект, передаем в шаблон, в шаблоне вызываем у него render().

Советы и замечания по коду, напишу, наверно, завтра, сейчас уже поздно.

>>315932

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

По коду:

Вообще, сделано по большей части хорошо, но...

— try ... catch в строках 38-44 не нужен. Нужно сделать как можно проще:

default:
throw new Exception(....);

В правильно написанной программе на default управление никогда не попадет, значит, перехватывать этот ексепшен не нужно. И даже если было бы надо перехватывать, нет никакого смысла это делать в соседней строчке с throw.

- цепочку вызовов addEmployee не надо писать в километровую строку, а оформить переносами и отступами:


$object->
doSomething(....)->
doSomethingElse(....)->
doSomething(...);



—printf, к сожалению криво считает русские буквы при использовании %15s, так как 15 — это количество байт, а не букв. Чтобы исправить эту ошибку, наверно надо либо написать свою функцию-аналог printf с поддержкой многобайтовых кодировок (может быть немного заморочно), либо сделать вывод таблицы на функциях padLeft/padRight, которые дополняют строку пробелами справа или слева до нужной длины (их тоже надо написать самому).

— Код из getDepartamentSummary логичнее было бы перенести в конец, к остальным комнадам для вывода таблицы.

— Не надо так писать: $$department. Надо просто в массив $departments помещать не названия переменных, а сами объекты-департаменты:

$departments = array($salesDepartment, $purchaseDepartment, ....);

— то же самое и касается $$avgVariable, не советую использовать эту конструкцию ($$) вообще, я не могу вспомнить не одного адекватного применения ей. Тут можно просто сделать обычный массив: $avg['empoyees'] = ...;

В общем, замечания не такие и серьезные, сам Ооп-код аполне хорош. Завтра, если ты не убежишь, напишу дальнейшее задание, там скорее всего появятся дополнительно проекты и рабочие группы. А то тугрики считать слишком просто.
!xnn2uE3AU. Пнд 09 Сен 2013 04:56:11  #244 №315941 

>>315870

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

!xnn2uE3AU. Пнд 09 Сен 2013 04:58:47  #245 №315942 

>>315870

«Баги» с гитом скорее всего были из-за того, что ты напутал с ветками: https://github.com/serrufAAA/HelloWorld/network — тут тут зачем-то создал вторую ветку и видимо запутался с ними.

Аноним Пнд 09 Сен 2013 08:57:37  #246 №315948 

>>315940
А как передавать номер страницы? Я пробовал через массив GET, но в результате у меня получилась какая-то каша. Нужно наверное как-то изменить действие Index контроллера Main

!xnn2uE3AU. Пнд 09 Сен 2013 17:39:08  #247 №316017 

>>315948

просто добавляешь к адресу ?page=4

!xnn2uE3AU. Пнд 09 Сен 2013 17:40:42  #248 №316018 

>>316017

У тебя там есть:

if(isset($_GET['id'])){
$page=$_GET['id'];
}

Используй только лучше пареметр page или p, но не id (так как id это все же немного другое, нелогично получается).

!xnn2uE3AU. Пнд 09 Сен 2013 18:15:38  #249 №316024 

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

— Из-за того, что в файлах смесь табов и пробелов, код тяжело читать: https://github.com/serrufAAA/HelloWorld/blob/master/application/models/Comment.php — вот тут например некоторые строчки съехали и выглядит ужасно. Надо это исправить, пока не поздно, для этого есть несколько вариантов:

1) Открыть файлы и ручками в Sublime выбрать Convert tabs to spaces для каждого пробелмного файла и сохранить
2) Использовть тулзы вроде такой, если ты под виндой http://bluefive.pair.com/tabs2spaces.htm (я сам ее правда не исользовал)
3) Если ты линуксоид, то можно обработать файлы командой отсюда http://stackoverflow.com/a/11094620

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

- Профайлер логично встраивать не в модели, а в класс работы с Бд. Почему? Так логичнее. Естественно, в класс PDO мы добавить ничего не можем, потому есть 2 варианта:

1) сделать свой класс-наследник PDO переопределив нужные методы (те, которые делают запросы)
2) сделать свой класс для работы с БД, PDO хранить у него в приватном поле и перенаправлять обращения к нему (это называется делегирование)

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

— В шаблонах используют специальные версии for, foreach, if, while без фигурных скобок: http://php.net/manual/ru/control-structures.alternative-syntax.php

Это делают потому, что с фигурными скобками получается плохо читаемо, так как скобка маленькая и теряется в конструкции <?php } ?>

echo из шаблонов тоже надо убрать. Чтобы что-то вывести, вместо <?php echo ... ?> короче написать <?= ... ?>

— В перспективе (не сейчас, но потом), мы наверно уберем прямой доступ к свойствам классов Comment/Post и сделаем их не public, а protected.

— Твой класс core_BDClient не позволяет задать пароль для БД. Как я запущу этот код у себя, если у меня база с паролями? На хостингах тоже пароли, так что надо сделать пароль и хост для БД в конфиге.


— Tread пишется как Thread :( Чтобы исправить, предлагаю воспользоваться функцией «Найти и заменить в файлах» (заодно научишься ей пользоваться), в Sublime это Ctrl + Shift + F, дело на 10 минут, заменяешь минуту, потом 9 минут смотришь, не сломалось ли что. Советую заменять с чувствительностью к регистру, иначе можно нечаянно заменить Tread на thread с маленькой буквы и что-то сломать.

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

$msq= "SELECT * FROM post ORDER by id DESC";
$posts = $db->query($msq)->fetchAll(PDO::FETCH_CLASS, "core_Post");
$count=count($posts);

Чтобы посчитать число постов, надо писать SELECT COUNT(*) FROM .... Тогда база данных сама их посчитает, и вернет одно число, и нам не придется создавать 100500 экземпляров Post, только чтобы узнать их количество.

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

Если тред недоступен !xnn2uE3AU. Пнд 09 Сен 2013 19:30:43  #250 №316041 

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

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

А то неделю пробездельничали, нехорошо.

Аноним Пнд 09 Сен 2013 19:33:55  #251 №316044 

>>316018
С этим как раз запара. У меня нельзя просто так добавить к адресу ?, особенно на главной странице, т.к. там не указывается контроллер и действие, а если что-то указывать, роутер думает что это контроллер. Я просто писал "./Main/Index/page?p=<?=$i?>", но это тупо, потому что во-первых первая страница тогда отличается от остальных, во-вторых эта шляпа всегда прибавляется к адресу, и потом получается /Main/Index//Main/Index/page?p=2, ну и ясное дело что тут css отпадает. Нужно наверное чтобы /Main/Index/ всегда добавлялось к адресной строке.

!xnn2uE3AU. Пнд 09 Сен 2013 19:53:19  #252 №316055 

>>316044

> потому что во-первых первая страница тогда отличается от остальных
Это нормально. У одной страницы должен быть ровно один УРЛ, потому первая страница может иметь адрес /, а вторая, третья ... иметь адрес /?page=2 или /posts/2 или как-то еще.

Обычно используют такие варианты: либо цифра в URL (/posts/2), либо параметр в query string (который пхп-шники называют GET-параметрами): ?page=2

> если что-то указывать, роутер думает что это контроллер
Значит это баг, который надо исправить. Уверен, что у тебя более чем достаточно знаний для этого. Например, можно до роутинга отрезать вопрос и все что за ним. Точнее, нужно, так как параметры в query srting не должны ломать роутинг.

В общем, роутер надо подправить.


> во-вторых эта шляпа всегда прибавляется к адресу, и потом получается /Main/Index//Main/Index/page?p=2

Теперь по поводу css и картинок. Чтобы не было проблемы, надо либо подставлять префикс перед адресами файлов:

href="<?= $baseUrl ?>/style.css"

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

href="<?= Url::path('/style.css') ?>"

Таким спообом, мы можем в одном месте приписать например базовый путь /board и все пути пофиксятся. Во втором случае, мы можем даже разместить статику на другом домене (огромные сайты так делают), переделав функцию path.

Просто относительные ссылки вида ./style.css или style.css работать не будут.

Кстати, что касается ссылок на страницы (вроде /Main/Index). Во многих фреймворках их не пишут руками, а генерируют функцией-хелпером (так: href="<?= Url::route('Main', 'Index', ...) ?>"). То есть, мы даем ей имя контроллера, метода, доп. параметры, а хелпер уже собирает УРЛ. При таком подходе мы можем поменять принципы роутинга, и ссылки не сломаются.

Кстати, класс Db_Profiler.php лучше назвать без подчеркивания, DbProfiler а то твой автозагрузчик наверно не сможет его загрузить.

Аноним Втр 10 Сен 2013 00:55:33  #253 №316199 

Котаны, какого хуя тут заебись: http://rubular.com/r/r5xbOotAdQ
а тут хуйня: http://ideone.com/MEJYIx

Аноним Втр 10 Сен 2013 04:20:08  #254 №316236 
1378772408837.jpg

Ага, ну понятно, модификатор для мультистрок "m" как раз здесь бесполезен, а dota2ll "s" именно то что мне нужно. Биг спс разрабы за интуитивность.

!xnn2uE3AU. Втр 10 Сен 2013 04:50:34  #255 №316240 

>>316199

На ideone не прописан флаг s. Без s точка не матчит символ новой строки.

!xnn2uE3AU. Втр 10 Сен 2013 04:51:50  #256 №316241 

>>316236

Ой, я слоупок, ты уже разобрался. m влияет только на поведение ^ и $

Аноним Втр 10 Сен 2013 05:15:35  #257 №316243 

>>316241
Слух, а ты в рекурсивных регулярках понимаешь?
Вот есть такой текст:
(P
abc
azc
anc
)
(L
atc
ayc
aqc
)
Нужно захватить: P, L, и все что между а и с. Реально это одной регуляркой?

Аноним Втр 10 Сен 2013 05:17:59  #258 №316244 

>>316243 точнее даже такой текст:
(P>
abc
azc
anc
)
(L>
atc
ayc
aqc
)

Аноним Втр 10 Сен 2013 05:25:50  #259 №316245 

Сделал такую: (?:\((.?)>|a(.?)c)
Работает, но массив кривой получается, все в перемешку свалено, если б как то сгруппировать, чтоб:
P, b, z, n отдельно а L, t, y, q отдельно.

Аноним Втр 10 Сен 2013 09:17:08  #260 №316264 

Анон, подскажи по гиту.
Есть один репо, он не мой.
Я его себе скачал git clone.
Теперь я поправил некоторые скрипты, мне нужно их показать в репозитории, но так чтобы изменения не затронули репо.

Аноним Втр 10 Сен 2013 10:11:05  #261 №316268 

>>316055
>Значит это баг, который надо исправить. Уверен, что у тебя более чем достаточно знаний для этого
Действительно, элементарщина какая-то. Поправил, все работает, даже css не отваливается. Я просто думал в другом направлении, хотел чтобы контроллер и действие всегда выводились в адресную строку, править url для роутера почему-то в голову не приходило.

Аноним Втр 10 Сен 2013 14:26:39  #262 №316292 

http://wallbase.cc/
Видали кокой смачный ввод в поисковую строку? Как такое забабахать? За счет чего такая свистоперделка сделана? Я тред-релейтеды не изучаю, просто стало интересно.

Аноним Втр 10 Сен 2013 16:16:04  #263 №316322 

>>313971
А на пыхе можно борду написать?

sageАноним Втр 10 Сен 2013 16:23:23  #264 №316326 

>>316322
А молотком можно гвоздь забить?

Аноним Втр 10 Сен 2013 16:36:07  #265 №316336 

>>316322
Правильный вопрос: стоит ли писать борду на пыхе? Нет.

!xnn2uE3AU. Втр 10 Сен 2013 16:47:43  #266 №316342 

>>316322

Один аноним-кун уже пишет: https://github.com/serrufAAA/HelloWorld/

Также, в одном из первых тредов был Котоба-кун с бордой на PHP (но код там конечно требует доработки и рефакторинга).

Аноним Втр 10 Сен 2013 17:04:40  #267 №316351 

>>316342
Самое главное и не сказал. Футаба и кусаба на пхп написаны.

мимопроходил

!xnn2uE3AU. Втр 10 Сен 2013 17:29:29  #268 №316359 

>>316351

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

>>316264

То есть, ты хочешь пушить измененный код в отдельный, свой репозиторий?

По моему там просто надо добавить твой репозиторий как remote и пушить в него. Вот, на всякий случай русская книга по гиту, почитай: http://git-scm.com/book/ru/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8

!xnn2uE3AU. Втр 10 Сен 2013 17:32:11  #269 №316360 

>>316243

Скорее всего нереально. То есть, если у тебя есть регулярка /a((\d)+)c/ и текст

a123567c

То ты ей не можешь захватить каждую цифру отдельно в свою группу — только все цифры сразу.

!xnn2uE3AU. Втр 10 Сен 2013 17:33:48  #270 №316361 

>>316245

Не получится отдельно одной регуляркой.

!xnn2uE3AU. Втр 10 Сен 2013 17:47:01  #271 №316364 

>>316292

http://dropthebit.com/demos/fancy_input/fancyInput.html — можешь скачать и на свой сайт поставить.

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

Открываешь Хром, в нем Инспектор. Щелкаешь правой кнопкой на поле ввода, Inspect Element и изучаешь ДОМ и подвешенные события. Ставишь брейкпойнт на изменение ДОМ, ставишь курсор в инпут и жмешь любую кнопку. Срабатывает брейкпойтнт, смотришь дерево вызовов, видишь там jQuery и home.js. Переходишь в home.js, смотришь, находишь комментарий

fancyInput v1.3.0
© 2013 Yair Even Or <http://dropthebit.com>

Вводишь это в Гугл.

Алсо, меня не впечатлило. По мне, так ненужное украшение.

!xnn2uE3AU. Втр 10 Сен 2013 17:48:57  #272 №316365 

>>316292

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

sageАноним Втр 10 Сен 2013 17:53:53  #273 №316367 

>>316365
Нахуя велосипед, когда он уже есть и ездить умеет?

Аноним Втр 10 Сен 2013 18:15:40  #274 №316373 

>>316365 это ты виноват. Когда есть место где задать вопрос, мозг отказывается работать.

Аноним Втр 10 Сен 2013 18:19:24  #275 №316375 

>>316364
Спасибо.

!xnn2uE3AU. Втр 10 Сен 2013 18:43:47  #276 №316380 

>>316375

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

Аноним Втр 10 Сен 2013 18:52:42  #277 №316382 

Опец, а ты так, просто любитель, или бабки таки на этом делаешь - фрилансишь?

Аноним Втр 10 Сен 2013 18:54:22  #278 №316383 

Привет оп.
Где можно посмотреть возможности html5 элементов? Например в стандарте нашел два интересных
интерфейса и атрибут start_position. Могу я изменить его например, или поменять стартовую громкость?
http://www.w3.org/TR/html5/embedded-content-0.html#default-playback-start-position
http://www.w3.org/TR/html5/embedded-content-0.html#media-element
http://www.w3.org/TR/html5/embedded-content-0.html#mediacontroller

Кстати, что за странные readonly, attribute, interface? Это псевдо-код что-ли?
Наверно псевдо-код, это же стандарт, а не webkit

Ты всё еще на php пишешь или больше по js?
C asp'ом приходилось работать? Как он тебе?

!xnn2uE3AU. Втр 10 Сен 2013 19:28:20  #279 №316390 

>>316382

Конечно, фрилансю, в свободное время. Жить-то на что-то надо.

>>316383

Читать документацию — правильно, наш тред всегда готов помочь в этом.

Официальные сайты: стандарты на сайте w3c (иногда они появляются с задержкой, иногда не соответствуют ситуации в бразуерах, то есть только на них ориентироваться не стоит). Черновики и драфты на whatwg.org и docs.webplatform.org

Браузеры сейчас стараются следовать стандартам, но как я написал, не на 100%, потому стоит читать про их особенности на официальных сайтах:

— MDN — Mozilla Developer Network — официальная документация от Mozilla в том числе и по HTML5 в браузере Firefox. Годный сайт.
— MSDN — документация по особенностям IE
https://developer.apple.com/devcenter/safari/index.action — По Сафари (например, особенности работы на i-устройствах или на маках с ретиной описаны там)

У Хрома и Оперы вроде нет своей документации, максимум можно найти список того что они поддерживают из стандартов W3C.

Неофициальные, но полезные сайты: статьи на Хабре, сайты вроде quirksmode, html5rocks, caniuse.com с таблицами сравнения разных фич (на caniuse есть в том числе ссылки на оф. документацию по той или иной фиче).

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

В твоем случае, можно почитать доки в MDN по audio и video:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video

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

Интерфейсы по твоим ссылкам — это описание яваскриптовых методов и свойств, которые есть у элемента DOM (не HTML-аттрибуты, которые пишутся в HTML-коде). То есть, ими надо пользоваться через JS. HTML-аттрибуты (а также, много другой полезной информации) описаны в спецификации тут:
http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#the-audio-element
http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#the-video-element

(смотри раздел content attributes). Там нет аттрибутов, задающих громкость или стартовую позицию.

> Кстати, что за странные readonly, attribute, interface? Это псевдо-код что-ли?
Да, это IDL, который используется во всех аналогичных доках от W3C. Он описан тут http://www.w3.org/TR/WebIDL/ (много-много букв), хотя по моему и без документации все вполне понятно. Если кратко, то интерфейс описывает, какие есть свойства и методы у DOM-элемента, и интерфейсы наследуются друг от друга. Например, вот эта строчка:

> interface HTMLMediaElement : HTMLElement {
значит, что и/ф HTMLMediaElement расширяет HTMLElement (наследуется от него), а эта:

> readonly attribute Date startDate;

Значит что у audio и video (которые реализуют интерфйес HTMLMediaElement) есть свойство (только для чтения) startDate, которое содержит яваскриптовый объект класса Date (стандартная яваскриптовская дата). И мы млжем сделать например:

var video = document.getElementById('video1');
var s = video.startDate;

!xnn2uE3AU. Втр 10 Сен 2013 19:30:57  #280 №316391 

>>316383

> Ты всё еще на php пишешь или больше по js?
На обоих.

> C asp'ом приходилось работать? Как он тебе?
Не приходилось, но знаю, что есть просто ASP который по сути треш и похож на PHP4, только использует Basic со всеми его минусами, и есть ASP.NET MVC, который более годный и современный.

Аноним Втр 10 Сен 2013 19:38:21  #281 №316392 

>>316390
Долго учился до своей первой з/п? Олсо, не знаешь, если без айтишного образования, но с техническим в/о, поднатореть, припереться в какую-нибудь конторку в ДС и попроситься макакой - взять могут? Или для них критично, чтоб корочки и всё такое-прочее и всяким фрилансерам-самоучкам дорога заказана(?)

Может не только ОП, но еще кто имеет что сказать по этому поводу?

Аноним Втр 10 Сен 2013 20:56:58  #282 №316402 

>>316391
Где импрувнутая версия задачки с департаментами? У меня тут ООП дымится.

!xnn2uE3AU. Втр 10 Сен 2013 21:02:33  #283 №316403 

>>316392

В первую компанию пришел работать студентом с знанием основ PHP, ООП, MySQL и HTML/CSS. HTML учил в школьные годы, PHP/MySQL в универе. Про Хабр (и про борды) тогда не знал, что лучше изучать и какие языки востребованы не знал, программистом становиться не хотел, так как надо сидеть весь день за компом и пялиться в экран, не круто, девушек этим не впечатлишь. Оказалось впрочем, не так и плохо, сидишь в тепле, читаешь хабр, пишешь код не спеша.

> Олсо, не знаешь, если без айтишного образования, но с техническим в/о, поднатореть, припереться в какую-нибудь конторку в ДС и попроситься макакой - взять могут

В ДС — возьмут, если на вопросы сможешь ответить и тестовое задание выполнить или портфолио показать. Айтишного в/о (матфак?) много у кого нет, это вообще мало что значит.

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

Открой hantim.ru или hh.ru, почитай требования к вакансиям, я что-то не вижу там требований к диплому, зато вижу список технологий и языков программирования. Кстати, в Москве есть вакансии стажеров, там вообще требования минимальные.

!xnn2uE3AU. Втр 10 Сен 2013 21:31:38  #284 №316407 

>>316402

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

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

В ООО «Вектор» сотрудники не просто пьют кофе, но и работают над проектами. Проект — это определенное задание, над которым работает несколько сотрудников одного департамента. Ну например, проект по закупке холодильников или проект по исследованию рынка. Каждый проект для своего выполнения требует затрат рабочего времени разных специалистов, например X часов работы маркетологов и Y часов работы инженеров.

Очевидно, что чем больше человек работает над проектом, тем быстрее он будет выполнен. Проект, который делать 20 часов, один человек сделает за 20 ч, 2 человека — за 10, 4 человека — за 5, 10 человек — за 2 ч. (ну это пока мы не дошли до 3-й части задачи).

У каждого проекта так же указано общее рекомендуемое число сотрудников для работы над ним (размер рабочей группы) и дедлайн (максимальный срок выполнения). Если проект требует 20 часов работы и дедлайн равен 5 часам, то надо выделить минимум 4 человек (даже если рекомендуемый размер меньше), иначе проект будет провален. Ну и очевидно, что выделить больше человек, чем есть в департаменте, тоже невозможно.

Для работы над проектом собирается рабочая группа, и один из участников становится ее руководителем. Руководитель выбирается по принципу: 1) самый высокоранговый сотрудник 2) если таких несколько, самый кофепотребляющий сотрудник 3) если таких несколько, сотрудник с меньшим номером. Размер рабочей группы не может быть больше 15 человек, так как руководитель не сможет управлять таким количеством людей. Если проект требует больше человек, его выполнить невозможно.

Дан список проектов (номер/название/департамент/затраты времени разных сотрудников/рекомендуемый размер группы/дедлайн). Точнее не дан, а ты его можешь составить сам, штук 9 проектов часов на 100 каждый, на 2-10 человек, дедлайн от 5 до 50 часов. Программа должна распределить их по сотрудникам, и вывести 2 дополнительных таблицы-отчета:

1) время и статус выполнения, руководитель для каждого проекта:


№ Проект Департамент Срок Кофе, л. Тугриков Руководитель

1 Реклама в метро Рекламы 5 120 2300 №00001
2×ме1, 3×ин2, выполнен за 3 часа

2 Обзор рынков поставок обор… Закупок 2 0 0
провален: недостаточно сотрудников чтобы успеть к дедлайну

3 Презентация продукта Продаж 8 130 2700 №00004
8×ме1, выполнен за 2 часа



2) Занятость сотрудников (кто над какими проектами работал). Сотрудники идентифицирются либо номерами, либо по ФИО — как хочешь. Учитывается только кофе и тугрики, потраченные во время работы над проектом. Загрузка — сколько времени в месяц потрачено на полезную работу (в месяце 168 часов, если сотрудник работал над проектами 42 часа, то загрузка = 42 / 168 = 25%).


№ Занятость в проектах Всего, ч. Кофе Тугриков Загрузка

00001 №1 (4ч.), №3 (6ч.) 10 13 140 7%
00002 0 0 0 0%
00003 №5 (8ч.) 8 20 120 8%


Раньше у нас было указано потребление кофе и тугриков в месяц. Чтобы не было проблем с расчетами, мы заменим его часовым потреблением:

Менеджер получает 40 тугриков в час, выпивает 1 стакан кофе в час и производит 1 странцу отчетов в час
Маркетолог — 30 тугриков, 0.5 стакана кофе и 1 страницу отчетов
Инженер — 15 тугриков, 0.3 стакана кофе и 0.25 страниц чертежей
Аналитик — 60 тугриков и 3 стакана кофе и 0.05 страниц стратегических исследований

По итогам месяца стаканы кофе округляются вверх, зарплата и страницы — вниз.

Что касается таблиц, теперь надо выводить 3 таблицы. Уверен, что ты и сам понимаешь, что код вывода таблиц тоже надо поместить в классы с названиями вроде ProjectReport, WorkloadReport, DepartmentsReport. Несмотря на возросший объем задачи, если правильно проектировать и писать код, он должен получаться логичным и понятным.

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

Есть вопросы? Задавай. Нет? Пиши код.
Аноним Втр 10 Сен 2013 21:40:24  #285 №316408 

>>316403
А тебе сколько лет тогда получается? Тридцать?
>>316373
Точно пхп-кун, хватит на наши глупые вопросы отвечать, отвлекает.

!xnn2uE3AU. Втр 10 Сен 2013 21:44:26  #286 №316409 

>>316408

Не, не, ты что, я не такой старый.

Аноним Втр 10 Сен 2013 22:24:51  #287 №316415 

http://pastebin.com/vGnUPFQ4
В js это основные эмуляции ооп или есть еще какие?

!xnn2uE3AU. Втр 10 Сен 2013 22:40:36  #288 №316419 

>>316415

Это какие-то странные примеры. В них, наример, не всегда работает instanceof и нет наследования. В JS впрочем, с ООП все плохо и на костылях. Классическое ООП делается через прототипы:

function Base(...) { ... }
Base.prototype.method = function (...) { ... };
Base.prototype.property = 1;

// Наследование
function Child(...) {
Base.call(this, ...);
...
}
inherit(Child, Base);
Child.prototype.method2 = function() {};

Где inherit можно написать так:

function inherit(child, parent) {
if (Object.create) {
// Новые браузеры
var proto = Object.create(parent.prototype);
proto.constructor = child;
child.prototype = proto;
} else {
// Для старых браузеров
function _() {}
_.prototype = parent.prototype;
var proto = new _;
proto.constructor = child;
child.prototype = proto;
}
}

При таком подходе (в отличие от некоторых других) наследование нормальное, цепочка прототипов правильная, instanceof корректно работает, свойство constructor работает.

Вот еще варианты разной степени костыльности:

http://ejohn.org/blog/simple-javascript-inheritance/ (на самом деле не simple)
http://javascript.ru/tutorial/object/inheritance
http://www.crockford.com/javascript/inheritance.html (в половине вариантов instanceof и цепочка прототипов не работает)

Особый челлендж: написать наследника класса Error, который будет поддерживать instanceof и корректно сохранять стектрейс. По моему, это вообще кроссбраузерно сделать невозможно.

!xnn2uE3AU. Втр 10 Сен 2013 22:50:09  #289 №316422 

>>316415

Также есть библиотеки
https://github.com/ded/klass
https://github.com/dotnetwise/Javascript-FastClass

есть любимый рубистами Coffeescript и TypeScript от майкрософт (яваскрипт со строгой типизацией).

Аноним Срд 11 Сен 2013 09:01:11  #290 №316514 

>>316024
>сделать свой класс-наследник PDO переопределив нужные методы (те, которые делают запросы)
Хм. Тересна. Получается нужно перегрузить какие-то методы так, чтобы они записывали свои запросы и еще запускали таймеры, так чтоли? Пока вообще не представляю как это сделать, но пойду ковырять.

sageАноним Срд 11 Сен 2013 11:02:15  #291 №316541 

>>316514
да ничего там не надо перегружать
по сути это иломорфизм с парочкой эндофункторов

!xnn2uE3AU. Срд 11 Сен 2013 12:55:18  #292 №316594 

>>316514

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

public function execute(...) {
// засекаем время
$start = microtime(true);
$result = parent::execute(....);
$end = microtime(true);
// сохраняем запрос и результат
if ($this->profiler){
$this->profiler->logQuery(....);
}

return $result;
}

Таким образом, мы меряем время выполнения PDOStatement::execute(). То есть в классе наследнике можно все нужные функции так обернуть.

Аноним Срд 11 Сен 2013 14:13:54  #293 №316617 

>>316594
Доброкунчик, не пиши мне пока пожалуйста готовый код, я хочу сам. Объясни лучше на словах. Мне же все равно нужно сделать наследника PDO, в нем перегрузить например PDO::prepare() так чтобы он возвращал не просто PDOStatement, а мой класс, унаследованный от PDOStatement?

!xnn2uE3AU. Срд 11 Сен 2013 14:25:56  #294 №316621 

>>316617

Тебе надо для начала: определить все функции, которые ты хочешь перехватывать. Запрос можно сделать как методом query у PDO, так и методом execute у PDOStatement, так что скорее всего надо написать свои наследники для обоих классов.

Насчет подмены PDOStatement на свой класс. Обрати внимание, в списке констант есть интересная контсанта PDO::ATTR_STATEMENT_CLASS: http://php.net/manual/en/pdo.setattribute.php

С ее помощью можно задать свой класс вместо PDOStatement. Может, тебе это поможет.

Насчет перехвата функций, есть 2 способа:

1) унаследоваться
2) делегирование (делаем свой класс, в нем в приватном поле храним настоящий объект PDO или PDOStatement)

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

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

Вот еще ссылка на эту тему: http://habrahabr.ru/qa/22669/

!xnn2uE3AU. Срд 11 Сен 2013 14:27:57  #295 №316623 

>>316617

Алсо, если у тебя затруднения с придумыванием названий классов, подсказываю:

Db_Adapter для наследника PDO
Db_Statement для наследника PDOStatement

Но вообще, я подумал, отсутсвие поддержки профайлера это конечно недостаток проектирования PDO. Жаль, что в нем не предусмотрели такую возможность сразу.

!xnn2uE3AU. Срд 11 Сен 2013 14:35:16  #296 №316625 

>>316617

Ах да, еще хотел тебе дать эту ссылку http://framework.zend.com/manual/1.12/ru/zend.db.adapter.html

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

Аноним Срд 11 Сен 2013 15:59:26  #297 №316630 

>>313971
Стоит ли обращать внимание на особенности вёрстки под ie6-7 или похуй на этот мусор?

Аноним Чтв 12 Сен 2013 03:33:10  #298 №316668 

>>316630
> похуй на этот мусор
В 99% случаев. Если только заказчик не доебется.

Аноним Чтв 12 Сен 2013 04:01:00  #299 №316669 

Помогите, почему не работает? Точнее почему не шлет на мою почту ничего?
(отправляю с хостинга конечно)

http://anonymousdelivers.us/66113

Аноним Чтв 12 Сен 2013 07:21:41  #300 №316675 

Доброкунчик, глянь сюда https://github.com/serrufAAA/HelloWorld Я накидал примерно то, что будет профайлером, нужно его еще как-то с конфигом увязать, скажи что думаешь, но не подсказывай пока про конфиг. Давай с профайлером вначале решим, хотя бы логически, а потом я остальную мелочь буду подбирать, ок?

Аноним Чтв 12 Сен 2013 07:41:23  #301 №316676 

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

Аноним Чтв 12 Сен 2013 08:52:32  #302 №316683 

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

Аноним Чтв 12 Сен 2013 09:19:50  #303 №316690 
1378963190590.jpg

>>313971
Репост из ньюфаг-треда:

M-M-M-M-MAXIMUM NEWFAG тянет руку.
Бывало ли у вас такое, что на imageсreatetruecolor и тому подобные браузер отображает:

‰PNG IHDRИИ":9ЙgIDATxњнЭЫvЈH…a<ь4ЖёчЏЗЬ•¤Ц:/{иvМ}ґмz…Ѕ«ЅCХэЇ

Использую джентельменский набор Денвер, т.к. не могу в Unix-системы. GD2 имеется и сконфигурировано. http://writecodeonline.com/php/ говорит, что неизвестная функция, но браузер такого не выводит, а выводит вышеуказанное. Няшу авансом.

!xnn2uE3AU. Чтв 12 Сен 2013 09:20:16  #304 №316691 

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

>>316630

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

Под ИЕ6 не надо. Под ИЕ7 некоторые заказчики могут потребовать, но ты можешь за это потребовать дополнительную оплату (ну или можешь не требовать и сделать бесплатно). Под ИЕ8 и выше, надо бы уметь. ИЕ8 практически на 100% поддерживает CSS2.1, так что проблем с аккуратной версткой быть не должно.

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

Отдельная песня, кстати, тестирование под разными версиями ИЕ, в одну систему их не поставишь, всякие IETester кривые и глючные, потому надо либо ставить несколько вируталок (ИЕ8, ИЕ9, ИЕ10, ИЕ11 Preview) либо покупать платные сервисы вроде Spoon. Ну либо иметь несколько компьютеров под рукой. Но таков путь профессионала.

Также, у ИЕ есть подвох: если ты не пишешь тег meta X-UA-Compatible, то Ие8 выбирает разные режими отображения для сайтов в локальной сети и в интернете. То есть на локалхосте он работает в одном режиме (и все выглядит хорошо), на продакшене — в другом. Я натыкался на проблемы из-за этого. Так что всегда задавай X-UA-Compatible.

Естественно, всегда задавай доктайп (лучше всего HTML5 или 4), иначе словишь еще глюков из-за перехода браузера в редим совместимости со старыми сайтам (quirks mode).

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

Алсо, мне не нравится слово «мусор». Когда ИЕ6 вышел, он был на голову впереди других браузеров. Некоторые вещи, которые появились в HTML5 и CSS3, были в ИЕ еще с 5 версии (то есть на 15 лет раньше чем во всяких мозиллах и хромах). Что же касается багов, то во время выхода ИЕ6 стандартам никто не следовал (они только-только появлялись), и потому их поддержка не была особо важна, а гораздо важнее была поддержка кривых старых сайтов, из которых на 99% состоял весь интернет.

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

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

!xnn2uE3AU. Чтв 12 Сен 2013 09:29:20  #305 №316693 

>>316669

Пожалуйста, выкладывай код на ideone, pastebin, gist.github.com или куда-то еще, где его можно прочитать сразу, а не скачивать непонятные архивы, распаковывать, открывать редактором, и тебе неудобно, и нам неудобно.

Теперь по поводу почты. Во-первых, ты сделал большую глупость поставив @ перед mail (так как @ скрывает ошибки). Может, в сообщении об ошибке как раз написано что-то полезное, а ты его отключаешь. И вообще, никогда не используй @. Также, поставь в начале скрипта error_reporting(-1); и ini_set('display_errors', 'On'); (чтобы включить вывод ошибок в браузер, не забудь потом отключить назад).

Теперь еще про другие причины. Важно, где ты запускаешь код: на своем компьютере, на shared hosting или на VPS.

Если ты используешь бесплатный хостинг, то почта там может быть отключена (чтобы не рассылали спам). Читай подробнее в их FAQ или на их форуме. Если платный, то функция mail должна работать по умолчанию и ты имеешь полное право жаловаться, если она не работает: пусть чинят. Только сначала протестируй без @, чтобы убедиться что никаких сообщений об ошибке нет.

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

!xnn2uE3AU. Чтв 12 Сен 2013 09:44:03  #306 №316697 

>>316690

Это отображает не imagetruecolor, а imagepng, imagejpeg и другие функции, которые сжимают картинку в заданный формат (PNG, JPEG) и выводят результат. Эта тарабарщина — это бинарный код картинки (в твоем случае PNG).

Ты можешь спросить, если это код картинки, то почему отображаются буквы, а не картинка? Отвечаю, потому что глупенький программист забыл поставить заголовок Content-Type.

В протоколе HTTP (через который браузер вызывает твой скрипт и получает ответ) в ответе перед содержимым могут идти заголовки. Один из таких заголовок — Content-Type и он содержит MIME-тип (что такое? смотри в вики) ответа. Браузер ведет себя по-разному в зависимости от этого заголовка.

Если указан тип text/html, значит в ответе HTML-код (браузер его отображает как HTMl-страницу)
Если text/plain, то браузер отобразит содержимое как обычный текст
Если image/png то браузер отображает содержимое как PNG-картинку

Так что изучай:
http://ru.wikipedia.org/wiki/Список_MIME-типов
http://php.net/manual/ru/function.header.php


> Использую джентельменский набор Денвер
Когда подрастешь, снеси денвер, поставь Апач сам. У меня есть одобряющая паста на эту тему: http://gist.github.com/anonymous/946f4f1830be3955fe17

Аноним Чтв 12 Сен 2013 09:52:49  #307 №316698 

Ну вот, он делает вкл/выкл https://github.com/serrufAAA/HelloWorld решение простое, в лоб.

!xnn2uE3AU. Чтв 12 Сен 2013 09:54:04  #308 №316699 

Ой, сишники !

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

http://habrahabr.ru/post/193308/
http://thecodeil.com/

Плачу не я, я просто объяву разместил. Я бы сам попробовал решить, но сегодня времени нет.

!xnn2uE3AU. Чтв 12 Сен 2013 09:56:19  #309 №316700 

>>316699

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

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

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

!xnn2uE3AU. Чтв 12 Сен 2013 10:00:19  #310 №316701 

>>316683

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

Счас, разберу твой код и скажу конкретнее.

Аноним Чтв 12 Сен 2013 10:04:01  #311 №316702 

>>316701
Тю! Дак нужно было отдельным классом чтоли делать?

Аноним Чтв 12 Сен 2013 10:10:48  #312 №316703 

>>316702
Удали его и воспользуйся нормальным профайлером если есть необходимость.

Аноним Чтв 12 Сен 2013 10:24:59  #313 №316706 
1378967099878.jpg

>>316697
Помогло, премного благодарен.

!xnn2uE3AU. Чтв 12 Сен 2013 10:30:19  #314 №316708 

>>316702

Ну логично же, для отдельной задачи — отдельный класс-профайлер, который хранит в себе список запросов, содержит метод для добавления новых запросов и для получения списка сохраненных в нем. Во вью тоже кстати можно передавать не массивы time и sql, а этот объект- профайлер. Точнее, не можно, а нужно.

А в BDClient просто заводим приватное поле $profiler, если оно не пустое, значит надо отсылать в этот объект информацию о всех запросах, если пустое — не надо:

if ($this->profiler) {
$this->profiler->logQuery(....);
}

Отключение/включение можно сделать 2 способами:

1) Передавать объект-профайлер в BDClient вместе с user, pass, db, четвертым аргументом (не очень хорошо, так как так у нас там скоро станет 100500 аргументов, не нравится).

2) Сделать BDClient метод setProfiler(DBProfiler $profiler), который вызывается например из bootstrap.php:

Если (в конфиге включен профайлер) {
$profiler = new DbProfiler(...);
$client = BdClient::getInstance();
$client->setProfiler($profiler);
}

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

!xnn2uE3AU. Чтв 12 Сен 2013 10:33:04  #315 №316710 

>>316702

Так же, я заметил, что ты там подставляешь значения плейсхолдеров в запрос. Но я тут подумал, иногда нам нужен именно сам запрос в исходном виде, вроде SELECT * FROM x WHERE id = :id, например для сбора статистики. Я думаю, подставлять плейсхолдеры или нет, надо хранить отдельной опцией в конфиге, чтобы можно было выбирать.

Аноним Чтв 12 Сен 2013 11:28:08  #316 №316734 

>>316708
А как я сделал в последней версии это не прокатит? В смысле какие слабости у моего решения?

!xnn2uE3AU. Чтв 12 Сен 2013 12:06:33  #317 №316747 

>>316734

> А как я сделал в последней версии это не прокатит? В смысле какие слабости у моего решения?

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

— Переименовать:
core_QueryInfo → core_DbProfiler, core_QueryLogger или придумай свой вариант
boolFlag → enabled (или сразу убрать, так как у нас он будет другой способ включать профйлер)
setRow → logQuery или придумай свой вариант
getInfo → getQueries, listQueries или свой вариант
core_ProfInfo → core_ProfilerRecord, core_QueryLogRecord, core_LoggedQuery, core_QueryInfo или свой вариант

— Убрать getInstance() из core_QueryInfo. И в будущем стараться не писать синглтоны, а создавать объекты нормально через new

— Мне не нравится злоупотребление синглтонами, это не очень хорошо. Думаю, надо вместо обращения к профайлеру через core_QueryInfo::getInstance() хранить его в приватном поле $profiler у класса core_DbAdapter.

То есть, у core_DbAdapter есть методы setProfiler(), removeProfiler(), getProfiler(). В bootstrap.php мы делаем так:

Если (в конфиге включен профайлер) {
$profiler = new DbProfiler(...); // создаем
BdClient::getInstance()->setProfiler($profiler);
}

В BDClient мы передаем этот объект дальше, в DbAdapter:

public function setProfiler(...) {
$this->db->setProfiler(...);
}

Таким образом, мы избавимся от использования синглтона.

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

> $time = round(($end - $start)*1000, 1);
Округление лучше перенести в класс core_ProfInfo, в отдельный метод getTimeMs(). А эту строчку заменить на $time = $end - $start;

— Надо дополнительно перехватывать метод PDO::exec
— Перехватываешь bindParam, а bindValue почему-то нет (ктстаи, если bindParam используют для двунаправленной привязки переменной к запросу, а чтобы просто взять значение переменной, лушче использовать bindValue).
— Твой код не поддерживает подстановку нумерованных плейсхолдеров (которые обозначаются знаком вопроса ? ). Попробуй допилить, если это не сложно.
— В ProfInfo хорошо бы сохранять и исходный запрос, до подстановки плейсхолдеров. Также, если профайлер отключен, подстановку делать не надо.
— Если это не сложно, хорошо бы подумать о том, как логгировать число возвращаенных в рузельятате запроса рядов. Наверно, надо перехватывать функции fetch* в PDOStatement.

!xnn2uE3AU. Чтв 12 Сен 2013 12:12:52  #318 №316749 

>>316676

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

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

> Нужно ли накапливать все действия совершаемые с базой, а потом все разом выводить или как?
Накапливать, выводить в самом-самом конце. Можно вызов вывода лога вписать куда-нибудь (куда? в конец Router? в bootstrap?) где он гарантированно вызовется после всего остального.

!xnn2uE3AU. Чтв 12 Сен 2013 12:33:37  #319 №316753 

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

— В будущем надо что-то делать с именами классов. Я уже смотреть не могу на эти core_Controller, класс с маленькой буквы, ад какой-то. Может, можно как-то автозагрузчик переделать, чтобы папка назвыалась core, но классы — нормально, а не как сейчас. Может, папки назывть с большой буквы. Может, использовать классы в core без префиксов. Не знаю, надо подумать.

> if($misCom == 1 || ($misCom%100 != 11 && $misCom%10 == 1)){
> echo "Пропущен $misCom комментарий";

О! Молодец, сам, без намеков понял, что надо склонять существительные. Только вот каждый раз писать череду if очень неудобно. Лучше сделать функцию-хелпер для склонения слов в таком формате:

echo Lang::inclineWord($count, "Добавлен %d комментарий", "Добавлено %d коментария", "Добавлено %d комментариев")

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

echo Lang::formatString("Ты {gender:$isMale|написал|написала} {count:$cnt|%d пост|%d поста|%d постов}", array(
'isMale' => ...,
'cnt' => ...
));

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

Класс Config требует рефакторинга ибо кривой. Предлагаю сделать его так:

1) В bootstrap.php создается конфиг и ему присваиваются дефолтные значения:
2) Подключаем файл application/config.local.php. Этот файл не коммитится в гитхаб и по умолчанию его нет. В нем переопределяются некоторые настройки, например название и пароль к БД. Таким образом, любой может задать свои настройки, не меняя при этом существующие файлы
3) Запрещаем запись в конфиг, чтобы случайно не перезаписать какую-то настройку
4) Сохраняем конфиг в реестр (паттерн Registry), чтобы его можно было читать из любого места программы

$appConfig = new core_Config();
$appConfig->setting = ...;
$appConfig->dbName = ....;
if (file_exists($localConfigPath)) {
require $localConfigPath;
}
// Блокируем запись в конфиг
$appConfig->setReadonly(true);
// Сохраняем конфиг в реестр
Registry::setConfig($appConfig);

После этого в любом месте программы можно читать значения из конфига:

if (Registry::getConfig()->enableProfiler) {
.....
}

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

Аноним Чтв 12 Сен 2013 13:44:50  #320 №316765 

Что не так с моим регулярным выражением?

/?(http:\\/\\/ | https:\\/\\/)?(www\\.)([a-zA-Z0-9\\.\\-]+)(\\.)([a-zA-Z]+)/

Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 on line 16
!xnn2uE3AU. Чтв 12 Сен 2013 13:50:10  #321 №316768 

>>316765

Странный знак вопроса в самом начале.

Кстати, для разбора регулярок можно использовать сайты вроде описанного тут: http://habrahabr.ru/post/192920/

Там ошибка сразу будет видна и подсвечена красным (правда там бекслеш надо писать один раз, а не 2)

Аноним Чтв 12 Сен 2013 13:53:00  #322 №316769 

>>316765
Если убрать знаки вопросов, то ошибки нету. ШТА? Что я делаю не правильно?

Аноним Чтв 12 Сен 2013 14:20:27  #323 №316777 

>>316697
А ежели надобно комбинировать html и php-образные изображения?

!xnn2uE3AU. Чтв 12 Сен 2013 14:23:40  #324 №316778 

>>316777

Ставишьв HTML ссылку вида <img src="graph.php"> чтобы изображение генерировалось отдельным запросом. Или кодируешь в data url но это не во всех браузерах работает.

!xnn2uE3AU. Чтв 12 Сен 2013 14:24:14  #325 №316779 

>>316777

Это называется не php-образные, а сгенерированные изображения.

!xnn2uE3AU. Чтв 12 Сен 2013 14:24:46  #326 №316781 

>>316769

Я же написал, ошибка в вопросе в самом начале. Зачем он там?

!xnn2uE3AU. Чтв 12 Сен 2013 14:25:32  #327 №316782 

>>316769

А, понял. Квантификаторы (вроде знака вопроса) надо ставить не до скобок, а после.

Аноним Чтв 12 Сен 2013 16:54:05  #328 №316808 

Анон у меня какой-то странный трабл. Скрипт ставит 2 вида кук в зависимости от адресса в браузере. с www и без www.
1. Как жетско прописать куки с www.
2. Как сделать так, что бы при пехеоде на сайт без www, читалась кука c www

Кароч, как правильно прописывать хост куки

!xnn2uE3AU. Чтв 12 Сен 2013 17:27:58  #329 №316818 

>>316808

> у меня какой-то странный трабл.
Это не трабл, а правильное поведение.

Начнем с правильного решения: мне показалось, что у вас каждая страница сайта имеет фактически 2 адреса:

www.example.com/page
example.com/page

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

Теперь вернемся к неправильному пути. При выставлении куки, по моему, можно указать домен без www но с точкой в начале: .example.com Но я не уверен. Тебе надо почитать правила разрешения имени домена у кук, так как браузеры могут не принять такую куку или не отдать или не разрешить ее ставить с субдомена. И, конечно, тщательно все протестировать.

Но лучше бы сделать редирект.

Аноним Чтв 12 Сен 2013 17:46:13  #330 №316823 

>>316818
А как сделать редирект то?
В папке у меня один домен, делать редирект в htaccess? Подскажи примерно как?

!xnn2uE3AU. Чтв 12 Сен 2013 17:55:19  #331 №316827 

>>316823

То, есть твой добрый хостер тебе сделал домен с www зеркалом обычного? СЕОшники говорят, что это нехорошо, поисковики не любят дублирование страниц.

Сделать можно через htaccess, гугли: https://www.google.ru/search?q=301+%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82+.htaccess+%D1%81+www+%D0%BD%D0%B0+%D0%B1%D0%B5%D0%B7&rls=en-GB

Аноним Чтв 12 Сен 2013 17:58:02  #332 №316830 

if(preg_match('/^www/' ,$_SERVER['HTTP_HOST']) == false) header("Location: http://www.".$_SERVER['HTTP_HOST']);


Сделал так, норм или лучше через аксес?

Аноним Чтв 12 Сен 2013 17:59:47  #333 №316831 

>>316830

А не, почему-то в этом случае кука совсем слеатет, сранно

!xnn2uE3AU. Чтв 12 Сен 2013 17:59:48  #334 №316832 

>>316830

Лучше через htaccess, там всего несколько строчек

Плюс, ты редирект сделал на тройку с минусом: пользователь пришел на конкретную страницу, а ты его на главную перекидываешь.

!xnn2uE3AU. Чтв 12 Сен 2013 18:00:33  #335 №316834 

>>316831

Ты после установки редиректв куки все почисти и заново тестируй.

Аноним Чтв 12 Сен 2013 18:01:12  #336 №316836 
1378994472682.jpg

>>316782
А. Спасибо! Теперь работает.
Кстати, почему в результатах ссылки с одним слешем?

Аноним Чтв 12 Сен 2013 18:03:48  #337 №316837 

А не, мой отработал норм.

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

!xnn2uE3AU. Чтв 12 Сен 2013 18:05:14  #338 №316839 
1378994714408.png

>>316836

Троечник ты потому что. Во-первых, выучи пикрелейтед. Во-вторых, в php с бекслеша начинаются экранирующие последовательности. Например,

\" — вставляет в строку кавычку
\n — вставляет перевод строки
\x40 — вставляет байт с кодом 40 hex
\\ — вставляет бекслеш

Что бы вставить \\ надо писать \\\\. Обрати внимание, это относится только к бекслешу \ , с прямым слешем / все нормально.

!xnn2uE3AU. Чтв 12 Сен 2013 18:08:07  #339 №316841 

>>316837

Лучше бы в htaccess, так как в этом случае PHP даже не вызывается. А у тебя странно, скрипт запустился, сделал часть работы а потом внезапно куда-то редиректит.

Аноним Чтв 12 Сен 2013 18:15:58  #340 №316848 

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

Аноним Чтв 12 Сен 2013 18:17:21  #341 №316850 

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

Аноним Чтв 12 Сен 2013 18:44:39  #342 №316856 

>>316839
Ой точно точно... Я совсем забыл про это. Спасибо тебе, Анон. Ты просто чудо!

Аноним Чтв 12 Сен 2013 19:42:50  #343 №316863 
1379000570179.jpg

>>313971
http://ideone.com/nm1ukA
Как школьнику не переплачивать не понимат. Столько голову ломаю.

!xnn2uE3AU. Чтв 12 Сен 2013 19:52:01  #344 №316864 

>>316863

Над этой задачей все голову ломают. Причина вот в этой строчке:

$balanceCredit = ($balanceCredit * $percent) + $comesis - $month;

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

Также, надо переименовать одну из переменных $month или $month1, так как они слишком похожи по названию. Также, надо исправить имя переменной:

PHP Notice: Undefined variable: comesis in /home/5BTgEa/prog.php on line 12



Аноним Чтв 12 Сен 2013 20:13:18  #345 №316873 
1379002398013.jpg

Последний вопрос который мне не понятен: Почему
>(\\.)([a-zA-Z]+)
игнорируется в этих случаях?

!xnn2uE3AU. Чтв 12 Сен 2013 20:18:41  #346 №316876 

>>316873

Добавь третий параметр к preg_match и выводи его:

if (preg_match($regexp, $link, $m)) {
var_dump($m);
}

Тогад ты увидишь что захватили каждые скобки. Так трудно сказать.

Аноним Чтв 12 Сен 2013 20:38:16  #347 №316885 

>>316753
Хм, я тут подумал, а не переключится ли мне временно на javascript? Полистал объявы по городу в котором очутился, везде основы пхп мускл хтмл ксс и жаваскрипт. ДК, ты же опытный, скажи реально совмещать работу и, ну если не учебу, то хотя бы посещение ВУЗа. Мне в нем предстоит заниматься около-научными изысканиями.

!xnn2uE3AU. Чтв 12 Сен 2013 20:43:36  #348 №316889 

>>316885

JS конечно знать полезно, но и на PHP не стоит забивать. Тем более что нам надо еще разобраться с SQl-запросами, которые ты там понаписал и проверить насколько они хороши.

> скажи реально совмещать работу и, ну если не учебу, то хотя бы посещение ВУЗа
Реально, но сложно. Бывает вариант, работать полдня, бывает вариант, в какие-то дни учишься, в какие-то работаешь, бывает вариант отпуск во время сессии. Если вакансия для стажера, то скорее всего там понимающе отнесутся, если для программиста, то не факт. В общем, надо искать, писать, звонить, спрашивать.

Аноним Чтв 12 Сен 2013 20:53:20  #349 №316891 

>>316889
>надо искать, писать, звонить, спрашивать
Это понятно. Увы город не такой уж большой. У вас там в столицах наверное с этим проще.
>проверить насколько они хороши
Время на исполнение уже видно. Кстати, подсчет с помощью COUNT(*) почему-то занимает чуточку больше времени, чем мой первоначальный вариант.

Аноним Чтв 12 Сен 2013 21:06:16  #350 №316902 

>>316864
http://ideone.com/nm1ukA
Я иду не в том направлении?

Аноним Чтв 12 Сен 2013 21:16:45  #351 №316915 
1379006205037.jpg

>>316876
Ясно в чем проблема.
www.google
www - распознается как адреc
. - как точка перед доменной зоной.
google - как адрес доменной зоны.

/(http:\\/\\/ | https:\\/\\/)?(www\\.)?([a-zA-Z0-9.-]+)(\\.)([a-zA-Z]+)/
!xnn2uE3AU. Чтв 12 Сен 2013 21:17:50  #352 №316917 

>>316891

> Кстати, подсчет с помощью COUNT(*) почему-то занимает чуточку больше времени, чем мой первоначальный вариант.
Это явно какая-то ошибка. Вернуть одно число проще, чем вернуть несколько рядов данных и создать из них несколько объектов.

!xnn2uE3AU. Чтв 12 Сен 2013 21:20:48  #353 №316922 

>>316902

Да в том, но эту программу надо еще дорабатывать, она пока что не работает.

>>316915

Тебе будет полезно еще погуглить про жадные и нежадные квантификаторы. Жадные — это которые стремятся захватить как можно букв, а нежадные — как можно меньше. Может, это как-то поможет.

Кстати, для разбора URL на части есть готовая функция parse_url, может лучше ее исподьзовать?

Аноним Чтв 12 Сен 2013 21:40:23  #354 №316941 
1379007623471.gif

>>316922
>Кстати, для разбора URL на части есть готовая функция parse_url, может лучше ее исподьзовать?
Мне не нужно разбирать урл. Мне нужно только чтобы он нормально распознавал её. Или это одно и тоже?

>Тебе будет полезно еще погуглить про жадные и нежадные квантификаторы. Жадные — это которые стремятся захватить как можно букв, а нежадные — как можно меньше. Может, это как-то поможет.
Завтра разберусь с этим. Сейчас я слишком устал и иду спать. Добра тебе, анон.

Аноним Чтв 12 Сен 2013 22:03:04  #355 №316960 

>>316922
>Да в том, но эту программу надо еще дорабатывать, она пока что не работает.
Да я уж вижу, лол.
Спасибо няша, еще подумаю :3

Аноним Птн 13 Сен 2013 14:26:28  #356 №317194 
1379067988529.jpg

>>316922
Анон! Все безысходно! Помоги мне! Мне нужно было сделать
>(www\\.)?
ревнивым (сверхжадным) квантификатором. Я сделала его таким как было показано на википедии
>(www\\.)?+
Но он не работает: Почему-то он вообще теряет одну "w" из ссылки и делает как раньше.

/(http:\\/\\/ | https:\\/\\/)?(www\\.)?+([a-zA-Z0-9.-]+)(\\.)([a-zA-Z]+)/

Аноним Птн 13 Сен 2013 14:26:59  #357 №317195 

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

Аноним Птн 13 Сен 2013 14:34:17  #358 №317199 

>>317194
> сделала
ТИТС ОР ГТФО!
> Почему-то он вообще теряет
Странно что вообще работает. Зачем у тебя обратные слеши везде по две штуки вписаны?
> True
> Else
Ок.

!xnn2uE3AU. Птн 13 Сен 2013 14:42:30  #359 №317209 

>>317194

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

Теперь про регулярку. У тебя она не привязана к началу и концу строки, а это значит, что она вполне имеет право матчить только часть строки. Стоит почитать про ^ и $

Также, там есть пробел после http, он точно нужен?

!xnn2uE3AU. Птн 13 Сен 2013 15:01:19  #360 №317224 
1379070079394.png

>>317195

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

Или это слишком сложно и надо попроще? Я в принципе подсказать что-то готов.

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

Аноним Птн 13 Сен 2013 15:10:19  #361 №317234 

>>317224
Хм. Тересна. Для этого нужно наверное хорошенько читкануть API Яндекс-карт. Я просто не знаю ни JS, ни API Яндекс-карт. Пойду почитаю, но, так сказать, не отказался бы от задачи попроще.

Аноним Птн 13 Сен 2013 15:15:36  #362 №317237 

>>317224
Пажи, доброкун, ты же кидал какие-то задачи на JS и CSS, точно помню, только вот где и когда это было...

Аноним Птн 13 Сен 2013 15:19:38  #363 №317241 

>>317237
Нашел в прошлом треде

!xnn2uE3AU. Птн 13 Сен 2013 15:20:54  #364 №317242 

>>317234

Что касается Яндекс-API.

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

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

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

Аноним Птн 13 Сен 2013 15:21:27  #365 №317243 

>>317241
Черт, это не то.

Аноним Птн 13 Сен 2013 15:23:21  #366 №317245 

>>317242
Опаньки! Вот маркер-то меня больше всего беспокоил. Круто, подписываюсь. Схожу на пары и буду делать.

!xnn2uE3AU. Птн 13 Сен 2013 15:25:24  #367 №317247 

>>317241

Что за задача-то? Я не помню.

Ну если не хочешь карты, могу придумать еще такие задачи:

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

!xnn2uE3AU. Птн 13 Сен 2013 15:27:00  #368 №317248 

>>317245

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

Аноним Птн 13 Сен 2013 17:04:31  #369 №317298 

>>317199
Расслабься, я только лишнюю букву поставил.

>>317209
>Также, там есть пробел после http, он точно нужен?
Нет. Забыл, что пробелы тоже считаются. Ставил для наглядности.

>Теперь про регулярку. У тебя она не привязана к началу и концу строки, а это значит, что она вполне имеет право матчить только часть строки. Стоит почитать про ^ и $
Но регулярка у меня не должна быть привязана к началу или к концу строки. Неверное
>Стоит почитать про ^ и $
Прочел. http://php.net/manual/ru/regexp.reference.meta.php
Не совсем понял твоего напутствия. Зачем мне привязывать мою кривую кригулярочку к начало или концу строки?

!xnn2uE3AU. Птн 13 Сен 2013 17:25:28  #370 №317315 

>>317298

Если ты делаешь привязку к началу/концу строки то такой образец:

allala google.com lololo

не пройдет, preg_match вернет false, а если не делаешь — то пройдет, регулярка найдет google.com и вернет true.

Аноним Вск 15 Сен 2013 00:38:32  #371 №317604 

Анон, есть два сайта на разных серверах, у каждого своя база. И нужно чтобы второй сайт брал инфу (некоторые поля) из базы первого. Как лучше всего это реализовать?

!xnn2uE3AU. Вск 15 Сен 2013 10:34:03  #372 №317661 

>>317604

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

Аноним Вск 15 Сен 2013 11:20:49  #373 №317672 

>>313971
Доброкун, который где-то год назад учил ньюфагов быть ПХП, это ты? Привет, я тебя помню! Я тебе показал свою вакабу, а ты сказал, что она хуйня и я больше не брался!

!xnn2uE3AU. Вск 15 Сен 2013 11:38:37  #374 №317673 

>>317672

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

Аноним Вск 15 Сен 2013 12:46:59  #375 №317691 

>>317673
> рефакторинг
Я так до сих пор и не знаю, что это означает.

sageАноним Вск 15 Сен 2013 13:14:02  #376 №317694 

>>317691
это процесс усложения структуры приложения путём добавления шаблонов проектирования - Абстрактных Заводов, Фасолин, Холостяков и др.

Аноним Вск 15 Сен 2013 14:15:53  #377 №317707 

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

sageАноним Вск 15 Сен 2013 14:26:12  #378 №317712 
1379240772436.jpg

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

!xnn2uE3AU. Вск 15 Сен 2013 15:03:28  #379 №317718 

>>317707

Рефакторинг — это наведение порядка в коде. Не стоит верить троллям, а стоит хотя бы почитать вики.

!xnn2uE3AU. Вск 15 Сен 2013 15:05:12  #380 №317719 

>>317712

Тем не менее, на шаблонах проектирования и императивных ЯП написано 99% десктопного и серверного софта.

sageАноним Вск 15 Сен 2013 15:16:37  #381 №317725 

>>317719
А еще программисты работают в таких огромных футуристических лабораториях, где всё белого цвета. В воздухе у них всё время летаю голограммы с зелёными нулями и единицами на чёрном фоне, они их всё время мацают руками, двигают вверх-вниз. Сами они при этом висят в воздухе, а по телепатической связи президент в мозг транслирует им сверхсекретные и особо важные задания. Друг с другом они общаются только при помощи специально оговоренных функций и только в двоичном коде. Ещё они могут силой мысли переустановить виндоус, заставить принтер работать или работать правильно, починить печаталку, создать почту, удалить баннер. Ещё если ты вдобавок ко всему хакер, то ты можешь вычислять адрес по ip, а ip - по сообщению в чате игры.

Аноним Вск 15 Сен 2013 15:22:41  #382 №317728 

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

Аноним Вск 15 Сен 2013 15:50:58  #383 №317735 

>>317728
а ты что открыл/доказал/написал?

sageАноним Вск 15 Сен 2013 16:12:58  #384 №317743 

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

Аноним Вск 15 Сен 2013 17:54:48  #385 №317779 

Объясните мне, зачем нужны функции, классы и объекты?
1.Ну, функция, ладно, понятно — чтобы посчитать разные значение по одной формуле, но я вот открою сорц лицокниги и там все — сплошные функции. Зачем?
2.Класс. Есть же массивы, многомерные массивы. Ну, да, круто вызывать класс со свойством, но ведь можно обойтись и вызовом переменной со свойством?
3.Объект. А он зачем? Ну, ладно, в каком-нибудь низкоуровневом языке — хранить байты, там, но а зачем он нужен в языке, где любое значение — строка, которая будет потом обработана как число, буль или строка?
Ведь если я напишу код без всего этого, который будет хорошо работать, но занимать в три раза больше места, то меня тут же сочтут ничтожеством, но, постойте, не на дискетах же этот код будет распространяться, к чему экономить место?

Аноним Вск 15 Сен 2013 18:50:38  #386 №317821 

>>317779
На костер его, сжечь полоумного!
Про байты особенно доставило

!xnn2uE3AU. Вск 15 Сен 2013 21:01:09  #387 №317860 

>>317779

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

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

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

Если тебе интересно, у меня есть несколько паст по теме и задачи на ООП.

Также, если у тебя есть какие-то еще вопросы по функциям и ООП, я могу постараться на них ответить.

> Ну, да, круто вызывать класс со свойством
По моему, ты путаешь класс и объект. Класс никто не вызывает, вызывают методы объекта.

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

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

!xnn2uE3AU. Вск 15 Сен 2013 21:04:16  #388 №317862 

>>317779

Если ты хочешь, ты можешь взять например задачу про ООО «Вектор» отсюда: >>314683 продолжение тут: >>316407 и попробовать решить без применения ООП, на переменных и строках. Попробуй реши, а мы посмотрим, что получится.

Аноним Вск 15 Сен 2013 21:29:49  #389 №317866 

Сосоны, а есть по жава-скрипту норм мануал, типа как php.net? Чтобы все структурировано, по полочкам.

Аноним Вск 15 Сен 2013 22:13:42  #390 №317869 

Анончик, подскажи, курсы от Специалиста годные или Нахуй нужно?

!xnn2uE3AU. Вск 15 Сен 2013 22:22:34  #391 №317870 

>>317866

learn.javascript.ru

>>317869

Для начала сойдет, но уровень там так себе, именно что на начинающих.

Аноним Вск 15 Сен 2013 23:05:08  #392 №317875 

>>317870

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

!xnn2uE3AU. Вск 15 Сен 2013 23:21:19  #393 №317879 

>>317875

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

Видеокурсы можно посмотреть, но параллельно стоит читать официальный мануал по PHP ( php.net/manual/ru ). Он довольно понятный.

Потом будет нужен ООП. Например, книга

> PHP: объекты, шаблоны и методики программирования. Мэтт Зандстра

Нужно изучить какой-нибудь фреймворк, Yii или Zend Framework или Symfony. Мануалы на русском можно нагуглить.

Стоит почитать сайт phptherightway (погугли, не помню точный адрес).

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

Кнут и матан тебе не нужен, алгоритмы (пока) тоже.

Аноним Вск 15 Сен 2013 23:26:00  #394 №317880 

>>317879
Спасибо тебе, огромное!

Аноним Пнд 16 Сен 2013 08:27:34  #395 №317922 

>>317870
>learn.javascript.ru
Да ладно, сайт конечно хороший, но на качественный официальный мануал никак не тянет.

!xnn2uE3AU. Пнд 16 Сен 2013 11:53:23  #396 №317965 

>>317922

Официального мануала по JS, такого как в PHP нет, так как движки яваскрипт делают несколько производителей. Но есть официальный стандарт. Он называется ECMA 262 (ECMAScript). Официальный стандарт можно нагуглить на английском, русский перевод одной из старых версий тут http://javascript.ru/ecma

Яваскрипт бывает еще и разных версий, например сейчас в новых браузерах появляется поддержка ES5, а разрабатывается ES6. Вот перевод ES5: http://es5.javascript.ru/

С одним яваскриптом далеко не уедешь. Чтобы применять его на веб-странице, надо знать интерфейсы взаимодействия с браузером: BOM, DOM. Это набор методов и объектов, с помощью которых код на явскрипте может получать информацию об элементах страницы и изменять их свойства. Они описаны в стандартах на сайте W3C (например: http://www.w3.org/DOM/DOMTR ), для Firefox есть мануал по дому на сайте MDN, для IE на сайте MSDN, но для других браузеров таких мануалов нет (они говорят, что придерживаются стандратов и потому мануал не нужен).

Аноним Пнд 16 Сен 2013 19:01:01  #397 №318055 

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

Аноним Пнд 16 Сен 2013 19:37:03  #398 №318066 
1379345823390.jpg

Здравствуй, клуб любителей изучать PHP;

В первый раз в PHP.
Есть Один класс http://pastebin.com/iKBrCGV2
В другом файле есть вызов
http://pastebin.com/0WebqNLQ

В итоге получаю

PHP Catchable fatal error: Object of class Model could not be converted to string in /var/www/Controller/controller.php on line 12

То есть не могу выполнить функцию
public function setModel($model) {
$this->$model = $model;
}

Какого хуя? Почему PHP при присваивании хочет выполнить преобразование объекта к строке?

Аноним Пнд 16 Сен 2013 20:37:54  #399 №318094 

>>318066
>$this->$model = $model;
После стрелы не нужно писать $

!xnn2uE3AU. Пнд 16 Сен 2013 21:34:59  #400 №318114 

>>318055

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

Насчет унылого гитхаба, не знаю. Может, и не стоит.

>>318066

Здравствуй, анон.

Этот анон >>318094 прав, там один $ лишний. Перечитай-ка мануал.

Организация базы данных Аноним Втр 17 Сен 2013 04:26:20  #401 №318160 

Анон, вопрос не совсем по пыхчу, но так как тут у вас добротред, задам и свой ответ. Итак, есть сферический проект с базами MySQL, можно взять структуру новостного портала для примера. Есть разделы новостей - в мире, в регионе, спортивные и т. д. У каждой новости есть превью, анонс, который видят при заходе на страницу перед тем, как выбрать интересующим новость. Вопрос: как организовать структуру базы оптимально и почему? Например, можно все хранить в огромной таблице, можно сделать таблицу для каждого раздела, а можно для каждого раздела сделать таблицу для превью и полных новостей (ведь полные новости будут смотреть в десять раз реже, чем анонсы, зачем их грузить в одну базу ). Понятно, что способы различаются размерами таблиц и их количеством и ставят целью либо загружать минимум разных таблиц, либо грузить из разных таблиц, но по минимально достаточному объему данных. + чем больше таблиц, тем сложнее поддерживать код. Пояснишь?

Аноним Втр 17 Сен 2013 05:35:51  #402 №318165 

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

Аноним Втр 17 Сен 2013 06:45:48  #403 №318167 
1379385948878.png

Анон, у меня очень и очень странная проблема, вот посмотри

foreach ($content as $user){
echo "<form action='/admin/users' method='post'><input type='hidden' name='id' value='".$user->id."'></form>";
}

Вроде все элементарно, на страницу выводятся формы, внутри поля, но вместо этого получается вот что
<form action='/admin/users' method='post'></form>
<input type='hidden' name='id' value='4'>

Что за бред, как такое может быть, вообще?

Аноним Втр 17 Сен 2013 09:24:26  #404 №318177 

>>316747
Доброкун, чет ты меня этим постом запутал начисто. Вот это например
>Если (в конфиге включен профайлер)
Разве к конфиге нужно что-то включать? У меня конфиг просто предоставляет методы на включения, поэтому он кстати весь на синглтонах. Т.е. менять нужно аж с бутстрапа и конфига?

Аноним Втр 17 Сен 2013 09:39:17  #405 №318179 

ОП, пояснишь за авторизацию?
Человек вводет логин и пароль, если хэш пароля и логин совпадает с бд, то мы пишем ему в сессию (что пишем?)
что все ок, а также в куки (что пишем?). И допустим редериктим его на страницу, на которой находится менюха в if'e. В нем проверяем что у юзера все ок в сессии или куках, и разрешаем ему пользоваться менюхой.

Аноним Втр 17 Сен 2013 13:57:07  #406 №318183 

>>318165
смешно.

!xnn2uE3AU. Втр 17 Сен 2013 13:58:23  #407 №318184 

>>318160

Пиши все в одну таблицу.

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

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

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

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

!xnn2uE3AU. Втр 17 Сен 2013 14:08:34  #408 №318188 

>>318167

Ты что-то перепутал или не заметил. Посмотри код внимательнее. Может, это выводит какой-то другой скрипт.

>>318177

Конфиг — это файл с настройками, и он как раз и предназначен для включения и выключения разных опций. Не класс Config, а файл config.php (и config.local.php). То есть, выглядеть он может так (если он сделан PHP кодом):

$config->profilerEnabled = true;
$config->dbPass = '123456';

или так (в формате ini):

profilerEnabled=true
dbPass = 123456

или так (в XML):

<config>
<profilerEnabled>true</profilerEnabled>
<dbPass>123456</dbpass>
</config>

Ты наверно что-то не так понял.

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

Я предложил переделать так:

— делаем класс Config, который может хранить в себе какие-то настройки
— в бутстрапе забиваем в него настройки из config.php
— если существует файл config.local.php, то загружаем настройки и из него
— сохраняем получившийся конфиг в класс Registry, после чего конфиг можно получить из любого другого места кода

!xnn2uE3AU. Втр 17 Сен 2013 14:13:57  #409 №318189 

>>318179

Есть разные варианты.

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

2) можно с сессией, пишешь в сессию при удачной авторизации user_id = 1234567, при разлогинивании удаляешь. Минус сессии — она может умереть через 15 минут или при закрытии окна браузера (это зависит, от того какие у тебя в PHP настройки). Первый способ не имеет этого недостатка, при нем мы сами можем выставить любое время жизни кук.

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

Аноним Втр 17 Сен 2013 14:26:50  #410 №318194 

>>318184
>Другой вопрос, если это таблица с миллионами записей и у тебя миллионы пользователей.
я это и подразумевал.
>Почему ты решил, что это так?
Нет, я предположил, что если на 20 просмотренных превью будет одна просмотренная новость, то к огромной таблице с редкоиспользующимися новостями будет дольше идти запрос, чем к маленькой с частоиспользуемыми превью. А как вообще делать такие тесты? Забивать таблицу рандомным контентом и замерять время тяжелых запросов, выдающих одинаковую информацию?

Аноним Втр 17 Сен 2013 14:37:57  #411 №318198 

>>318188
Все по 100 раз перепроверил, может ли так фреймфорк исполнять?

Это уже не первый раз, один раз так уже было при выводе форычем, тогда не правильно выводился тэг <a>

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

!xnn2uE3AU. Втр 17 Сен 2013 14:39:27  #412 №318199 

>>318194

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

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

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

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

> А как вообще делать такие тесты? Забивать таблицу рандомным контентом и замерять время тяжелых запросов, выдающих одинаковую информацию?
Именно. Забить таблицу таким числом записей, которое у тебя будет, в несколько потоков делать запросы, аналогичные тем что будут на сайте и считать сколько их выполнится за N секунд. Я думаю, простая таблица с правильно настроенными индексами будет легко пережевывать хотя бы 500-1000 запросов на чтение в секунду.

Если тебе интересна тема хайлоада, кстати, можешь почитать про архитектуру высоконагруженных сайтов тут: http://www.insight-it.ru/highload/ Но не забывай, что одно дело — Гугл и Твиттер, другое — обычный сайт.

!xnn2uE3AU. Втр 17 Сен 2013 14:41:10  #413 №318200 

>>318198

Я не знаю, что у тебя за фреймворк, но обычные фреймворки не занимаются перестановкой тегов местами.

> Смотри, например, мне нужно выводить данные из базы в 2-х местах на странице 2-мя циклами, но когда я так делаю php говорит, что мол PDO не может развернуть не буфферизированный массив или как-то так, как это можно обойти?
Можно прочитать данные из Бд, сохранить их в массив, и потом выводить из этого массива сколько угодно раз.

Аноним Втр 17 Сен 2013 14:49:08  #414 №318202 

>>318199
>Так что читай теорию по индексам, если не читал, и учись пользоваться командой EXPLAIN
а посоветуй годную книгу по базам от А до Я (лучше с упором именно на сложные темы, select/insert итак проблем не вызывают)?
Можно даже не только по реляционным, в жизни пригодится. Теории бы тоже можно, наверное.

!xnn2uE3AU. Втр 17 Сен 2013 14:58:04  #415 №318205 

>>318202

К сожалению, насчет книги не знаю, если не боишься английского, можно прочесть официальный мануал на сайте mysql ( http://dev.mysql.com/doc/refman/5.6/en/ ), разделы, посвященные оптимизации и производительности. Это самый подробный источник информации. Также, есть английский сайт «mysqlperformanceblog», там бывают хорошие статьи.

На русском — введи в гугл
> индексы и explain в mysql
и изучай ссылки.

Если тебя интересует NoSQL, что просто погугли статьи про Redis, CouchDB, MongoDB. Их много.

Аноним Втр 17 Сен 2013 17:02:21  #416 №318246 

>Если тебя интересует NoSQL, что просто погугли статьи про Redis, CouchDB, MongoDB. Их много.
Видел, даже книжки по последней нашел, читаю. Нет, лучше на русском. Ладно, буду искать.

Аноним Втр 17 Сен 2013 19:18:12  #417 №318304 
1379431092432.jpg

>>313971
Доброй ночи.
Кто-нибудь может примерно пояснить за архитектуру генерируемого php-сайта? Я вроде как догадываюсь, что можно поделить на header, body, footer и т.п. и страница (одна единственная) будет подтягивать нужные части по мере надобности где-то слышал красивое слово ajax, а также генерировать дизайн я не знаю, как это объяснить подгружать CSS?. Но я не совсем в курсе насчёт тонкостей взаимодействия этих структурных составляющих и реализации своей задумки.

!xnn2uE3AU. Втр 17 Сен 2013 19:26:27  #418 №318308 

>>318304

Что такое генерируемый php-сайт? И при чем тут аякс?

Аноним Втр 17 Сен 2013 19:34:40  #419 №318310 

>>318189
Мне бы про реализацию подробей. Где хранятся хэши? Создавать специальную таблицу в бд? А если нет, то как хэш проверять?

!xnn2uE3AU. Втр 17 Сен 2013 19:46:55  #420 №318316 

>>318310

> Где хранятся хэши?
В куках

> А если нет, то как хэш проверять?
Хеш нужен лишь для подтверждения что пользователь прошел авторизацию. Его можно получать, например так:

hash = hash-function(userid, secretkey)

Где hash-funtion — необратимая хеш функция, md5 или sha.

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

!xnn2uE3AU. Втр 17 Сен 2013 19:47:44  #421 №318317 

>>318310

> А если нет, то как хэш проверять?
Вычисляем кеш от userid и secretkey и сравниваем с тем что в куках. Совпадает — значит настоящий, нет — значит поддельный.

Аноним Втр 17 Сен 2013 19:58:43  #422 №318320 
1379433523983.jpg

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

Аноним Втр 17 Сен 2013 20:01:17  #423 №318321 

>>318308
А аякс у меня стоит обязаловкой в курсовой техзадании.

Аноним Втр 17 Сен 2013 20:07:08  #424 №318323 

>>318188
>Я в предыдущем посте вроде бы писал
Да, я потом уже заметил. Кстати, я спалил в резюме недоборду. В четверг иду на первое в жизни собеседование. Главное от страха там не обделаться.

!xnn2uE3AU. Втр 17 Сен 2013 20:24:56  #425 №318328 

>>318320

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

$('#loadDetailsButton').click(function () {
$.ajax({
url: 'pages/page1',
....
success: function (result) {
$('#result').html(result.html);
}
...
});
});

На сервере выводимый HTML-код капчурится с помощью ob_start/eb_get_contents(), засовывается в массив и возвращается:

ob_start();
require 'page.php' ; // шаблон страницы
$html = ob_get_contents(); // сохраняем в переменную
ob_end_clean();
header('Content-Type: application/json');
echo json_encode(array(
'success' => true,
'html' => $html
));
die();

Можешь посмотреть инспектором код вконтакте или аналогичного сайта например. Ну это конечно, только основы, я не упомянул обработку ошибок или замену URL (чтобы работало открытие в новой вкладке, кнопки назад-вперед-обновить), это делается например через history.js.

!xnn2uE3AU. Втр 17 Сен 2013 20:25:31  #426 №318330 

>>318323

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

Аноним Втр 17 Сен 2013 20:41:44  #427 №318337 
1379436104295.jpg

>>317862
Короче, мне надоело. Я не умею. Надо сначала выучить, основные принципы логики, а потом доделывать.
http://ideone.com/cFmwCM

Аноним Втр 17 Сен 2013 20:46:38  #428 №318340 

>>318330
Слышь! Я не хочу его проваливать. Вакансия на стажера, еще и в рубрике "подработка для студентов". Хочется верить что уж туда меня возьмут. Кстати, доброкун, давно хотел тебя спросить, ты по образованию кто? Из твоих прошлых рассказов я понял, что будучи студентом ты не хотел кодить.

Аноним Втр 17 Сен 2013 20:55:01  #429 №318343 
1379436901194.jpg

>>318328
>Ну это конечно, только основы, я не упомянул
>это только основы
>основы

Моё лицо пикрлтд.
Это только основы, а мне уже нехорошо.
Ощущаю себя этим вашим АРХЕТЕКТАРАМ.
Единственное, что утешает - я уже пользовался history.js для постраничной перемотки каталога товаров.

!xnn2uE3AU. Втр 17 Сен 2013 20:59:17  #430 №318344 

>>318337

Это задача на ООП. Если ее решать без применения ООП (на массивах и функциях или только на массивах), обычно получается лапша, и сам автор начинает запутываться в своем коде. Но ты молодец, что хотя бы попробовал свои силы.

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

Теперь про более правильный подход. Вот смотри, ты например городишь сложный массив с данными (не буду копировать целиком):

$Vector["manager"]["Livel1_MNT"] = 500 ;
$Vector["manager"]["Livel2_MNT"] = $Vector["manager"]["Livel1_MNT"]* $difference[level1to2MNT] ;
....
$Vector["manager"]["Liters"] = 20 ;
$Vector["manager"]["Pages"] = 200 ;

То есть, у тебя в коде есть сущность (не знаю, как лучше назвать) «менеджер», у менеджера есть свойства: сколько он зарабатывает, сколько кофе пьет. Так вот, это идеальный случай для применения ООП, так как ООП как раз предназначено для описания разных сущностей и их свойств. То есть, в ООП мы бы создали класс Employee (сотрудник), дали ему свойства liters, pages, добавили бы несколько функций для работы с ними, и код получился бы аккуратный. Потом на основе Employee (сотрудник) мы бы сделали классы основных профессий: Manager, Analityc, Marketer, Engineer с помощью наследования (а не копипастом). Ну а потом уже начали бы собирать их в департаменты и считать общие затраты на кофе.

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

Ну или можно почитать официальный мануал по PHP или какую-то книгу (Например, «Мэтт Зандра, PHP: паттерны, шаблоны и объектно-ориентированное программирование»). Если у тебя будут вопросы, можешь всегда придти в наш уютный тредик, мы постараемся помочь.

!xnn2uE3AU. Втр 17 Сен 2013 21:07:33  #431 №318348 

>>318340

Советую перечитать официальный мануал по PHP (и возможно другие мануалы по технологиям которые ты указал в резюме). Стажеров любят по теории гонять, больше-то все равно у них спрашивать нечего. Всякие вещи вроде «чем == отличается от ===», «сработает ли условие if ('xyz' == 0)», отличие protected от private и так далее.

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

!xnn2uE3AU. Втр 17 Сен 2013 21:09:23  #432 №318350 

>>318343

Тебе нехорошо потому, что ты толком не изучив теорию, собрался что-то делать. Не понимая JS/AJAX/HTTP/PHP, ты конечно можешь каким-то чудом сделать все это и заставить работать, но сомневаюсь, что результат будет качественным. Но лучше изучить теорию.

Аноним Втр 17 Сен 2013 21:12:09  #433 №318352 

>>318350
Помню в первых тредах был сайтик с заданиями для начинающих с нуля. Не подкинешь адрес? Лень искать просто.

!xnn2uE3AU. Втр 17 Сен 2013 21:14:22  #434 №318358 

>>318352

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

Аноним Втр 17 Сен 2013 21:34:51  #435 №318371 

>>318352
php-кун сверстал небольшую страничку со списком из нескольких заданий и графическими пояснениями к коду и результату. Помню задачу по игре в кости, с рандомной генерацией двух пар значений сравненем.

Аноним Втр 17 Сен 2013 21:38:23  #436 №318373 

>>318371
это для
>>318358

!xnn2uE3AU. Втр 17 Сен 2013 22:16:05  #437 №318388 
1379441765838.png

>>318371

А это случайно не задачи, которые выложены на сайте из ОП-поста archive-ipq-co.narod.ru (пикрелейтед)?

Аноним Срд 18 Сен 2013 23:49:11  #438 №318765 

В ПХП ПОЛНЫЙ ноль


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

Вот HTML http://jsfiddle.net/F7cCh/
Вот PHP код http://ideone.com/NjF6E1

!xnn2uE3AU. Чтв 19 Сен 2013 00:02:03  #439 №318771 

>>318765

Чтобы не гадать, сделай простой скрипт вроде такого:

<?php

error_reporting(-1);
mail('[email protected]', 'Test', 'Test message');

укажи в нем свой адрес и проверь, отправилось ли письмо (в том числе не попало ли оно в спам).

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

Аноним Чтв 19 Сен 2013 01:19:09  #440 №318789 

>>318771
бро, я повторюсь, я вообще 0 в php у тебя в твоем коде есть

<?php


а разве его закрывать не надо?

'Test', 'Test message' - в твоем коде, это то, что должно в форме быть

<input type="text" name="вот тут допустим TEST"> ?


этот скрипт подключать надо так <form method="post" action="адрес этого скрипта"> ?

Аноним Чтв 19 Сен 2013 05:05:44  #441 №318824 

Мне нужно сделать сайт, туда ли я зашел?

Аноним Чтв 19 Сен 2013 05:25:59  #442 №318827 

>>318824
нет, тебе в /web/

Аноним Чтв 19 Сен 2013 07:08:03  #443 №318837 
1379560083424.jpg

>>318388
Да, оно, спасибо.

!xnn2uE3AU. Чтв 19 Сен 2013 07:43:49  #444 №318841 

>>318824

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

>>318789

Закрывающий тег PHP не обязателен.

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

>>318837

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

Аноним Чтв 19 Сен 2013 12:16:56  #445 №318879 

>>318348
Сходил я на собеседование. Кажется обосрался. Это все из-за MySQL. С бордой и MVC я так и не разобрался полностью с MySQL и не умею писать крутые запросы. Например: на главной у треда показываются последний ск-ко то коментов, я там получаю все коменты, а потом array_slice все дела. Нужно будет написать запрос который бы сразу возвращал последних ск-ко коментов. Сказали до четверга решат, нужен я им или нет. Кстати, это была другая вакансия, в ней требования были круче, так что наверное для первого IT-собеседования в целом норм.

Аноним Чтв 19 Сен 2013 13:42:57  #446 №318899 

>>318879
>на главной
>array_slice
Когда же вы все передохните наконец?

Аноним Чтв 19 Сен 2013 13:50:02  #447 №318902 

>>318879
Это нерезиновка?

!xnn2uE3AU. Чтв 19 Сен 2013 17:01:15  #448 №318955 

>>318879

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

sageАноним Чтв 19 Сен 2013 17:03:59  #449 №318956 

>>318879
> Нужно будет написать запрос который бы сразу возвращал последних ск-ко коментов.
Недавно сам столкнулся, google "greatest n per group"

!xnn2uE3AU. Чтв 19 Сен 2013 17:15:20  #450 №318959 
1379596520749.jpg

О, на Хабре статья про подвохи и недостатки Хаскелл при использовании в реальном проекте: http://habrahabr.ru/post/193722/

Аноним Чтв 19 Сен 2013 17:33:40  #451 №318965 

>>318902
Нет, просто сити на просторах родины
>>318955
> делал борду
Он самый. Все работает, только кажется в каких-то случаях редириктит не совсем туда, куда нужно. Кстати, борда понравилась, на нее все надежда. Пригласили еще в одно место на собеседование, но я пока не тороплюсь, ибо много волновался перед этом.

!xnn2uE3AU. Птн 20 Сен 2013 21:10:13  #452 №319303 

Интересно, на Хабре годная статья про шрифты: http://habrahabr.ru/company/uidesign/blog/194368/ и 0 комментариев. Странно даже как-то.

Аноним Птн 20 Сен 2013 23:44:06  #453 №319352 

Еб твою мать, все мозги себе вытрахал уже. Подскажи, анон. Суть такова: есть условие, которое находится в цикле. Условие проверяет совпадение логина и пароля, которые хранятся в текстовой базе данных. Функция берет строку из базы, заносит в новый массив значения из этой строки (разделителем на несколько элементов является @). Все вроде срабатывает, но блять ебаный в рот только со второй строчки. То есть на первой строке хранится юзер1, на второй юзер2, на третей юзер3. Через второго и третьего юзера заходит замечательно, но через первого не хочет. Я уже все перепроверил, значения сравнивающихся переменных совпадают, теоритически он должен выполнить условие, но не выполняет. Помоги понять в чем дело, анон.

$passArray = file("pass1.txt",FILE_IGNORE_NEW_LINES); //Считывание файла c паролями построчно в массив
for ($i = 0 ; $i < count($passArray) ; $i++) {
$str = explode("@",$passArray[$i]); //Разбиение строчного массива на несколько элементов в каждой строке, разделителем является @, в итоге получаем итую строку с персональными данными, разбитую на массив str
//echo "Логин=$str[0]@@@@Пароль=$str[1]<br>";
//echo "Логин в подмассиве=$str[0]@@@@логин в полученной переменной=$pass<br>";
//echo "<br>$passArray[0]<br>";
if (($str[0] == $login) and ($str[1] == $pass)) {
//дальнейшие действия

Аноним Птн 20 Сен 2013 23:50:38  #454 №319355 

>>319352
Что еще странно: Сдвинул сейчас в текстовой базе все строчки на одну строку вниз, все нормально заработало. То есть начинается проверка только со второй строки. Ебаный ты в рот, анон, почему? i же начинает проверку с 0-ого элемента проверку, в нулевом элементе хранится запись о первой строчке из базы, где данные юзера1. Я вообще запутался.

!xnn2uE3AU. Птн 20 Сен 2013 23:51:15  #455 №319356 

>>319352

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

> if (($str[0] == $login) and ($str[1] == $pass)) {

Поставь var_dump($str, $login, $pass); и посмотри, что он с чем сравнивает.

!xnn2uE3AU. Птн 20 Сен 2013 23:52:54  #456 №319359 

>>319352

Ой, попробуй еще сделать var_dump($passArray) чтобы посмотреть что в нем.

Аноним Птн 20 Сен 2013 23:55:18  #457 №319361 

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

!xnn2uE3AU. Птн 20 Сен 2013 23:58:14  #458 №319363 

>>319361

Лучше используй var_dump() так как он выводит и массивы, и null, и false/true а через echo ты тип переменной не увидишь.

Аноним Суб 21 Сен 2013 00:05:35  #459 №319367 

>>319359
>var_dump($passArray)
В нем вроде все хорошо, он правильно хранит в себе значения каждой строки из базы.

>var_dump($str)
Вроде тоже все нормально, в каждом элементе массива нужные символы, которые взяты из целой строки массива $passArray. Только смущает параметр string. Я не знаю за что он отвечает в данной отладке, но значения String имеют странный хаотичный разброс. Сначала это 8, потом 1, потом 3, итак далее. Непонимат что это значит.

>$login
Все хорошо, он хранит в себе переданное значение из формы.

>$pass
Тоже все хорошо, хранит в себе пароль переданный через форму.

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

Аноним Суб 21 Сен 2013 00:13:40  #460 №319371 
1379708020115.png

Алсо, доброкун, есть еще такой вопрос. Вот у меня в адресной строке при обращении к скрипту видно все переданные данные (пикрелейтед). Можно как-то их скрыть? Если да, то какой метод, функцию гуглить?

Аноним Суб 21 Сен 2013 00:39:43  #461 №319385 

Блять, теперь я совсм запутался. Как я понял - String нам говорит сколько символов в строке, отлично. Я хочу вывести через var_dump массив $str[0], где должно храниться значение логина юзера. Вывожу через цикл for, все норм, он выводит как надо, 3 раза, так как в базе только три строки со значениями персональных данных. Вот результат:
string(8) "user1"
string(5) "user2"
string(5) "user3"

Вы видите это? Почему у юзера1 8 символов, а не 5 как надо? Ебаный в рот, откуда 3 бита перед юзером1? Что это? Проделки кодировки? Чертовщина? Как это работает?
Как говорил - проблема решается сдвигом на одну строчку вниз всей базы. То есть нулевой элемент пустой, выводится он вот так:
string(3) ""
Откуда? Откуда он берет три невидимых бита? Из-за этого и не проходит проверка.

!xnn2uE3AU. Суб 21 Сен 2013 04:04:15  #462 №319413 

>>319371

Гугли метод POST у тега form (method="post").

>>319385
> Вы видите это? Почему у юзера1 8 символов, а не 5 как надо?

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

(картинка we need to go deeper)

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

$hex = binhex($string); // преобразуем в hex-код
var_dump($hex); // выведется что то вроде 2234566f5f

То, что выведется — это коды символов (2 цифры = 1 символ). Вот пример: http://ideone.com/Q5yU4y

Коды символов зависят от кодировки. В utf-8 например одна буква может состоять из нескольких кодов, в ascii 1 код = 1 буква. Ну, например латинская a имеет код 61, пробел имеет код 20 и так далее. Подробнее можешь погуглить википедию.

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

!xnn2uE3AU. Суб 21 Сен 2013 04:04:56  #463 №319414 

>>319385

Не 3 бита, а 3 байта.

Аноним Суб 21 Сен 2013 05:55:09  #464 №319421 

>>313971
ОП, начал обмазываться твоими ранними тредами(я слоу, да), спасибо тебе, мне нравится.
А есть что-нибудь почитать о кодинге в целом, вроде научпопа или сорт оф.
Чтобы более обширное общее представление поиметь.
Криво выразился, но, вроде, понятно.

!xnn2uE3AU. Суб 21 Сен 2013 06:18:14  #465 №319424 

>>319421

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

Аноним Суб 21 Сен 2013 12:36:52  #466 №319452 

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

Кстати, как посоветуешь учить php, чтобы в будущем можно было вполне претендовать на должность разработчика? С самого нуля и от корки до корки, или ставя перед собой задачи, и с помощью поиска конкретной информации реализовывать их?
И имеет ли php какие-то утвержденное русское произношение? Пхп, пиашпи? Я привык говорить пхп, остальные варианты режут слух. Надо мной не будут смеяться толковые люди, если я так и буду продолжать называть его?

!xnn2uE3AU. Суб 21 Сен 2013 15:17:38  #467 №319507 

>>319452

Правильно читать так, как читаются английские буквы: пиэйчпи

Насчет учить, советую для начала пройтись по мануалу, чтобы закрыть пробелы в теории (мануал: http://php.net/manual/ru ), потом уже браться за задачи и поиск. Без знания теории поиск в гугле тебе не поможет, так как ты не сможешь отличить хорошее решение от плохого.

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

Потом, надо изучить ООП и MVC (на примере какого-нибудь фреймворка, например, Yii или ZF). Сейчас всюду используют ООП, так что надо его знать. По ООП можно прочесть, например, книгу

> Зандстра Мэтт - PHP: объекты, шаблоны и методики программирования

Если хочется пример задачи на знание ООП, то вот например: часть 1 >>314683 часть 2 >>316407

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

Аноним Вск 22 Сен 2013 18:23:27  #468 №319870 

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

!xnn2uE3AU. Вск 22 Сен 2013 19:18:37  #469 №319892 
1379863117190.png

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

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

Вернемся к тестированию. Вообще, для базового тестирования производительности веб-приложений есть минимум 2 тулзы (обе работают из командной строки). Профессиональные разработчики, конечно, должны о них знать. Это ab и siege.

ab - Apache Benchmark, идет в комплекте с Апач. Эта простая, но полезная утилита умеет долбить сервер одинаковыми запросами в несколько потоков и выводить потом статистику. Мануал по ней можно увидить, набрав что-то вроде ab --help. Вот как выглядит ее отчет, если запустить ее на твоей борде:

https://gist.github.com/anonymous/f61c08a22fae36de3b71

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

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

Также есть годная тулза от Google под названием skipfish. Она сама обходит страницы сайта и ищет там уязвимости. Из минусов — она может работать довольно-таки долго, несколько часов, хотя можно прервать ее работу раньше.

Но мы пока не будем пользоваться этими утилитами, а начнем с более простых тестов. Первый тест — надо посмотреть, как будет вести себя борда, если в нее добавить много тредов и сообщений, а то тестировать на 5 постах неинтересно. Руками добавлять посты можно долго, так что я написал вспомогательные скрипты, они выложены тут: https://github.com/codedokode/board-test-scripts

Скрипты запускаются из командной строки. На тот случай, если ты не знаешь, как ей пользоваться, у меня есть гайд-паста: https://gist.github.com/anonymous/2dfa134fe20d9cf91bbe . Эту папку (board-test-scripts) надо поместить на одном уровне с другими папками (application, core), также надо прописать настройки БД в lib/config.php . После этого можно запускать скрипты. Их пока 3:

php db-truncate.php yes
удаляет все посты и комментарии из БД

php db-add-threads.php 100 200 300
генерирует 100 тредов, в каждом из которых будет от 200 до 300 постов

php db-measure.php 10
10 раз пытается сгенерировать главную страницу и считает общее время и статистику

В общем, сначала я очистил все посты, а потом сгенерировал 200 тредов по 500 постов. После чего я зашел на главную страницу, и борда упала. Оказалось, что PHP недостаточно 64 Мб памяти, пришлось дать ему больше и только тогда главная страница отобразилась. Проблема в этом запросе:

SELECT * FROM coments Время 734.4 мсек

(кстати, почему comments написано с одной буквой m? что за ерунда). Этот запрос выбирает абсолютно все комментарии и пытается загрузить их в память (и память заканчивается). Конечно, это тупиковый путь и 700 мс — это слишком много. И это всего лишь на 100 000 постов, а если их будут миллионы? Надо всегда стараться выбирать только те данные, которые нужны, а не все подряд.

Потому, по SQL-запросам, предлагаю тебе сделать следующее:

— Подумать, как выбирать данные для главной страницы. Надо придумать такой способ, который обеспечит максимальную скорость выборки. Давай ориентироваться на максимум 10 мс на выборку данных для главной. По сути на главной сейчас выводится 6 постов + 18 комментариев, и мне кажется, 24 записи из БД при желании можно выбрать даже не за 10, а за 1 мс. Если ты конечно выбираешь их правильно, а не полным перебором таблицы.

У меня есть в голове интересный вариант, но для начала подумай сам.

— Почитай теорию по индексам и EXPLAIN. Пригодится в дальнейшем. Для начала можно читануть статьи из гугла: https://www.google.ru/search?client=&rls=en-GB&q=%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B+%D0%B8+exlain+%D0%B2+mysql&sourceid=&ie=utf-8&oe=utf-8&channel=suggest#channel=suggest&newwindow=1&q=%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B+%D0%B8+explain+%D0%B2+mysql&rls=en-GB&spell=1

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

— Добавить вывод профайлера на все страницы, а не только на главную
— Добавить в профайлер вывод занятой памяти (плохо, что мы забыли про это, а ведь потребление памяти сразу позволяет увидеть проблемы). В твоем случае, оно должно болтаться в районе 2-3Мб. Померять потребление можно так: https://github.com/codedokode/board-test-scripts/blob/master/lib/lib.php#L105

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

Картинок много Аноним Вск 22 Сен 2013 19:24:29  #470 №319893 

Доброанон, вопрос не совсем по php, но больше и спросить не у кого... Вот есть на сервере картинки, их много, слишком сильно их не пережать, нужно в нормальном качестве.
На дваче их же дохуя, например. Но ладно двач, у него есть вайп тредов, на апачане нет вайпа и хранятся миллионы пикч. Ладно апачан, там рандомы есть, а мелкоборды? Ладно, там у них нет много картинок, а разные комиксы японские в онлайне? Там нет вайпов, рандомов, разрешения больше и т. д. Это же десятки терабайт данных. А проблемы те же. Сервер-хостинг, который будет слать нахуй не самые серьезные жалобы, держать простейшие DDOSы и предоставлять такие объемы под данные, будут жрать тысячи денег. Что делать?

!xnn2uE3AU. Вск 22 Сен 2013 20:37:50  #471 №319927 
1379867870332.png

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

PHP-ошибки

При работы борды на ней сыплются такие ошибки:

Strict standards: Declaration of core_DbStatement::bindParam() should be compatible with PDOStatement::bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL) in core\DbStatement.php on line 73

Notice: Undefined property: Application_Models_Post::$time in \application\controllers\Main.php on line 16
Notice: Undefined property: Application_Models_Post::$query in \application\controllers\Main.php on line 17
Notice: Undefined index: p in \application\views\MainView.php on line 88

Если перейти по ссылке /board/?p=0 то вываливается ошибка:

PDOException: 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 '-6, 6' at line 1 in \board\core\DbStatement.php on line 62

Если у тебя они не видны, проверь логи или включи на локалхосте display_errors On, чтобы все отображалось.

PDO и MySQL

Ошибки выполнения запросов в PDO никак не проверяются и не отображаются, так как по умолчанию у PDO стоит ERRMODE_SILENT (http://php.net/manual/ru/pdo.error-handling.php). Проще говоря, ты их даже не увидишь. Надо дописать код:

$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

В BDClient::__construct()

— Если написать длинный пост или комментарий, сохраняется только первые 50 символов. Что за наркоманство? даже в твиттере больше символов можно использовать.

URL и роутер

— Борда работает правильно, только если она установлена в подпапку, например, /board. Если установить ее в корень сайта или в папку глубиной больше 1, то роутер ломается. Надо это исправить. Надо ввести такую переменную как baseUrl — URL где находится борда и либо прописать его в конфиге, а лучше сделать чтобы он определялся автоматически из переменных в $_SERVER . Надо чтобы борда работала корректно из любой папки любой вложенности.

— Неправильно, что часть страниц открывается методом POST. Плохо, если ты не понимаешь разницу между POST и GET (ну или может это я тебе что-то неправильно подсказал). Принцип такой, если кратко:

GET используется для получения страниц и для запросов, не меняющих состояние данных (например, поиск)
POST используется для выполнения запросов, меняющих данные (добавление/правка/удаление постов)

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

Если не соблюдать эти правила, будут происходить нехорошие вещи. Например, у тебя на борде, если зайти в тред, в адресной строке написано: http://host1/board/Tread . Если скопировать эту ссылку и вставить в новое окно, откроется не тред, а посыплются ошибки:

Notice: Undefined variable: tread_id in \board\application\controllers\Tread.php on line 12
Notice: Trying to get property of non-object in \board\application\views\TreadView.php on line 10

Получается, ссылку на тред нельзя скопировать, добавить в закладки, запостить в твиттер. Это плохо. Надо все это исправить и использовать нужные методы и правильные УРЛ. Вот, примерная схема, как должно быть:


GET / главная
GET ?page=N или GET /page/N N-я страница (если N <=1 должно редиректить на главную с кодом 301)
GET /thread/12345 страница треда
GET /thread/add форма создания нового треда
POST /thread/add адрес, на который отправляются данные из формы создания треда
GET /thread/12345/comment или GET /comment/add?post_id=12345 форма добавления комментария


В общем, нужны нормальные URL. У меня, кстати, есть паста про URL, может она будет полезна:
https://gist.github.com/codedokode/772a4ccc03e41d6b7cba
http://www.artlebedev.ru/kovodstvo/sections/48/

Кнопки «перейти в тред», «добавить пост», «добавить комментарий» должны быть ссылками, которые выглядят как кнопки, а не настоящими кнопками.

Верстка

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

Также, надо подумать над ссылками «вернуться» на странице добавления поста/комментария. Они по идее должны возвращать туда, откуда пришел, а не на главную. Надо подумать, как это сделать.

!xnn2uE3AU. Вск 22 Сен 2013 20:43:05  #472 №319930 

>>319893

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

белимитный* трафик

не такой уж и безлимитный.

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

> Ладно, там у них нет много картинок, а разные комиксы японские в онлайне? Там нет вайпов, рандомов, разрешения больше
Это где? Я всюду встречаю только крошечные JPEG сканы рарешением в 1000-2000 пикс, где половину иероглифов не разобрать.

!xnn2uE3AU. Вск 22 Сен 2013 20:45:11  #473 №319931 

>>319893

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

Аноним Вск 22 Сен 2013 22:07:48  #474 №319961 

>>319930
>Это где?
я взял для примера русскую борду, на которой нет лимита для бампа постов, они никуда не сливаются и остаются там навсегда. Если убрать рандомы, картинок станет очень много.
На файлообменники или торренты такое не зальешь ни разу, это же должно быстро подгружаться.
Куча есть сайтов с ворованными комиксами онлайн или хотя бы e-hentai знаменитый, там же очень много места.
Но даже если 1000-2000 пикселей, это ведь все равно 250-300 кб, а то и больше, может быть изображение. А на хуевом сайте коммиксов могут быть тысячи, в каждом много страниц. Не покупают же они терабайтные хостинги за такие деньги все?

!xnn2uE3AU. Вск 22 Сен 2013 22:16:26  #475 №319966 

>>319961

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

Во-вторых, есть сервисы, которые хранят гораздо больше данных. Вот например flickr: http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/

> Всего приблизительно 470 миллионов изображений, каждое представлено в 4 или 5 размерах
> 2 петабайта дискового пространства
> Более 400000 фотографий добавляются ежедневно

Аноним Пнд 23 Сен 2013 02:23:41  #476 №320009 

>>319507
Таки наконец-то добрались руки до кодинга снова. Я доделал все нужные скрипты и расшифровал таки те самые 3 байта. Так вот: закодировав их в hex-код, я получил efbbbf. В переводе в кодировки это:
ascii - ???
windows12-51 - п»ї
utf-8 - �bf
Что это я так и не понял, однако предполагаю что это байты обозначающие начало текстового файла, и в первой строке они будут всегда. Поэтому без костыля в виде второй строки тут никак не обойтись. Но если я таки ошибаюсь и есть простой метод поиска именно с первой строки - буду рад выслушать. Спасибо за наводку, Доброкун.

Аноним Пнд 23 Сен 2013 02:27:25  #477 №320010 

>>320009
http://en.wikipedia.org/wiki/Byte_order_mark
Найди нормальный текстовый редактор, а не notepad.exe.

Аноним Пнд 23 Сен 2013 02:40:37  #478 №320012 
1379888845814.jpg

>>320010
Лол, значит таки был прав. Ладно, хороший опыт на будущее. Спасибо.

Алсо, аноны, снова про этот >>319371 вопрос.
Я погуглил сейчас немного по совету Доброкуна метод POST у тега form, но ничего не нашел про шифрование передаваемой информации в адресную строку. Сейчас уже пора спать, делать это буду завтра. Мне по сути не нужно шифрование для какой-то безопасности, мне нужно шифрование лишь для глаз, чтобы не было видно персональных данных в адресной строке, как браузер отображает на скрине. Может кто-нибудь сталкивался с таким? Что применяли в таких случаях?

Аноним Пнд 23 Сен 2013 02:46:55  #479 №320015 

>>320012
>применяли в таких случаях?
Не передавай такие данные через GET.

!xnn2uE3AU. Пнд 23 Сен 2013 02:52:21  #480 №320016 

>>320009

Это так называемый BOM, который вставляет блокнот Windows. Этот BOM невидим в тексте, но приводит к разным веселым глюкам, так как PHP его воспринимает как полноценные байты. Хуже, если BOM будет например в начале PHP-файла, можно получить что-то вроде Cannot send header: ouput started

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

>>320012
Плохо почитал.

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

Кроме того, если бы ты почитал ее внимателнее, ты бы узнал, что:

- GET используется для получения страниц и для запросов, не меняющих состояние данных (например, поиск)
- POST используется для выполнения запросов, меняющих данные (добавление/правка/удаление постов/авторизация/загрузка файлов)

Ну и еще из особенностей, браузер выдает предупреждение при попытке повторно отправить это запрос (например при обнволении страницы). Потому после успешной обработки POST-формы надо делать редирект.

Аноним Пнд 23 Сен 2013 02:54:40  #481 №320017 

>>320015
Но я отправляю методом POST. У меня на главной страничке форма с авторизацией, на ней поля ввода Логина и Пароля. Введя данные в форму и нажав Отправить, данные передаются в php-скрипт, который методом GET считывает отправленные ему данные. То есть в форму я ввел логин User1, пароль 123. Скрипт сделал вот так:
$login = $_GET[login];
$pass = $_GET[pass];
и продолжил с ними работать. Есть идея получать не открытые данные, а перед отправкой их к примеру зашифровывать во что-нибудь, а в принимающем скрипте расшифровывать, но не знаю как это сделать. Смогу вернее зашифровать\расшифровать, но не знаю как шифровать их именно в момент отправки.

Аноним Пнд 23 Сен 2013 02:58:01  #482 №320021 

>>320017
google → HTTPS.
google → client-side encryption

алсо, разве не $_POST получает данные-то?

мимокрок

!xnn2uE3AU. Пнд 23 Сен 2013 02:58:03  #483 №320022 

>>320017

Ты путаешь. Через $_GET ты получаешь данные из URL (?x=y), а данные из POST-формы находятся в $_POST.

Читани-ка теорию: http://www.php.net/manual/ru/language.variables.external.php

> Есть идея получать не открытые данные, а перед отправкой их к примеру зашифровывать во что-нибудь, а в принимающем скрипте расшифровывать, но не знаю как это сделать. Смогу вернее зашифровать\расшифровать, но не знаю как шифровать их именно в момент отправки.

Это не нужно, просто используй POST. При POST данные формы не должны попадать в адресуню строку.

!xnn2uE3AU. Пнд 23 Сен 2013 03:01:08  #484 №320023 

>>320021

Шифровать — лишнее. А вот HTTPS — хорошая идея для безопасности.

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

В простой задаче это вряд ли нужно, но знать про отличия HTTP от HTTPS хорошо бы.

Аноним Пнд 23 Сен 2013 03:01:55  #485 №320024 

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

Плохо понял так как сильно хочу спать, повнимательнее обо всем этом почитаю завтра. Значит только если так: Отправка данных логина и пароля в принимающий скрипт, скрипт сверяет данные по базе, делает редирект со значением True или False либо на страницу пользователя, либо на страницу о неверном логине\пароле?

Аноним Пнд 23 Сен 2013 03:07:08  #486 №320027 

Понял что надо серьезнее углубиться в GET и POST, тогда смогу получить желаемый результат. Серьезной защиты мне пока не требуется, так как сайт пока будет рассчитан на малую категорию людей и всех своих так сказать. Главное пока скрыть это от глаз и дать старт проекту, а в будущем уже буду делать нормальную защиту, нормальную MySQL базу, а не текстовый файлик с данными. Спасибо, завтра буду читать, осталось в принципе доделать только эту часть.

!xnn2uE3AU. Пнд 23 Сен 2013 03:09:13  #487 №320028 

>>320024

Нет, не так. Алгоритм обработки форм такой:

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

Если метод == GET (это значит пользвоатель просто открыл страницу с формой):
— выводим пустую форму

!xnn2uE3AU. Пнд 23 Сен 2013 03:17:38  #488 №320029 

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

isLoggedIn() — проверяет залогинен ли пользвоатель (хранится ли логин в сессии) и возвращает true/false
getActiveLogin() — воозвращает логин пользвоателя или false если пользвоатель не залогинен
checkCredentials($login, $pass) — проверяет логин/пароль на правильность и возвращает true/false
login($login) — залогинивает пользователя, записывая его логин в сессию
logout() — разлогинивает пользователя, удаляя его логин из сессии (для верности можно и саму сессию уничтожить).

Думаю, как их написать ты и сам понимаешь.

!xnn2uE3AU. Пнд 23 Сен 2013 03:51:56  #489 №320036 

Хочу рассказать о стандартах в PHP. Представители ведущих фреймворков и CMS объединились в группу под немного странны названием PHP-FIG и теперь у нас в PHP тоже ест стандарты.

http://www.php-fig.org/
https://github.com/php-fig/fig-standards

Уже приняли пару стандартов по оформлению кода и по Logger Interface (я слышал, в яве с этим было особенно плохо). Сейчас обсуждается интерфейс кеша и новый, улучшенный автозагрузчик классов.

А, и не могу не порадоваться за адекватность:

> Code MUST use 4 spaces for indenting, not tabs.
> Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.

В общем, стандарты — это хорошо. Надеюсь, велосипедов и неразберихи станет меньше.

Аноним Пнд 23 Сен 2013 13:33:24  #490 №320095 

>>320036
Хочу рассказать о стандартах в PHP. Представители Delphi и VBA объединились против тех немногих, кто ещё помнит Perl, vi и нортонкоммандер и теперь у нас в PHP стало как в Delphi и VBA. Постановилли:

1) Не делать более отступы разной длины в "if", "for" и "foreach"
2) Не использовать более знак подчёркивания в именах свойств, и символ доллара скоро тоже удалим из языка

В общем, стандарты — это хорошо. Надеюсь, олдфагов и Unix-админов с их консольными редакторами станет меньше.

Аноним Пнд 23 Сен 2013 15:14:45  #491 №320162 

>>319892>>319927>>320029
Доброкунчик, спасибо большое что уделил внимание, по мере сил буду править недоборду. Меня позвали стажером в фирму, так что теперь я стажер-макака. Все благодаря тебе, ты делаешь очень крутые вещи. Фирма работает на 1с-битрикс, буду ковыряться в этом гиганте. Такие дела.

Аноним Пнд 23 Сен 2013 15:46:18  #492 №320190 

Оп, проверь пожалуйста задачу на палиндром, может что-то можно улучшить?

http://ideone.com/hixYZI

Аноним Пнд 23 Сен 2013 15:59:15  #493 №320199 

>>320036
> Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.

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

А вообще на работе юзаем стандарт Zend, и чекстайл стоит на jenkins, так что мне и так норм

Аноним Пнд 23 Сен 2013 18:11:19  #494 №320257 

>>320162
Отлично! Все и правда лишь своими стараниями? Сколько учил php? Тяжело было работу найти? Зарплату приемлемую обещают?
Другой кун.

!xnn2uE3AU. Пнд 23 Сен 2013 18:50:47  #495 №320264 

>>320162

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

>>320199

Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.

>>320190

Все хорошо, правильно работает. Единственное, точки с запятой после { и }не надо ставить (строки 21, 25, 27).

Аноним Пнд 23 Сен 2013 19:08:51  #496 №320271 

>>320264
Как будто в руби нет private/protected/public

Аноним Пнд 23 Сен 2013 19:27:49  #497 №320279 

>>320264
> Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.
https://gist.github.com/lastguest/5966992

!xnn2uE3AU. Пнд 23 Сен 2013 20:04:52  #498 №320294 

>>320279

Плохой пример. Вместо того, чтобы получать эти данные кривыми костылями, ты бы мог просто использовать Reflection (ну или какой-нибудь var_dump чтобы уж совсем извратиться). К тому же, похоже, ты не очень понимаешь что значит private.

Аноним Пнд 23 Сен 2013 20:30:25  #499 №320305 

>>320294
Анончик, что почитать по классам, методам и прочему? Так чтоб для одарённых личностей тупых.

Аноним Пнд 23 Сен 2013 20:37:13  #500 №320310 

>>320257
Учил с этого лета более-менее серьезно. Посмотрел курс специалиста, слушал доброкуна и маму. Писать небольшие кодики, например на поиск пути или парсинг дат из вики, было очень интересно, с написанием своей борды подвис, и перестал развиваться, решил пойти поработать. Найти вакансию оказалось очень легко, прошел на первом же собеседовании. Зп стажером обещали 20 к, для своего сити денежки не большие, но если стану кодером зп будет больше.
>>320264
Это да, мне в фирме точно так и сказали. Во-первых нужно буде себя проявить, во-вторых сдать на 1с-битрикс какую-то шляпу, типа курсы или что-то типа того. Хочется еще и про учебу не забыть, хотя бы НИРС делать, он у меня очень интересный - электрохимия цветных металлов в водных растворах.

Аноним Пнд 23 Сен 2013 22:41:25  #501 №320331 

>>320271
во-первых да, есть
>>320264
>Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.
И что? если есть подчеркивание, то автокомлит быстрее подтянет нужный мне метод/список, потому что я внутренние методы класса редко помню наизусть, а внешние - это как правило экшены контроллера, или api модели (начинается с fetch/set/get и т.д. ), так что вызываются реже, чем приватные

!xnn2uE3AU. Пнд 23 Сен 2013 23:14:26  #502 №320339 

>>320331

Выглядит на мой взгляд, уродливо, и избыточно (не писать подчеркивание проще, чем писать). Мне, кстати, в Питоне не нравится _вот_такой_вот_стиль называть функции (ок, у нас тоже такие есть, что поделать), и куча всяких странных имен вроде dict, main эти подчеркивания напоминают какие-то костыли. Почему нельзя было назвать их нормально?

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

Если ты не знаешь, что тебе нужно, автокомплит не поможет. Логичнее переделать автокомплит, чтобы он искал не только по началу имени (как в sublime например), чем уродовать код. То есть, набираешь name и он подсовывает getUserName().

Аноним Пнд 23 Сен 2013 23:37:53  #503 №320351 

>>320028
Спасибо Доброкун, более-менее разобрался.
Я пока не буду делать так >>320029 , так как знаний не хватит, а если и смогу с помощью гугла такое сделать - толку сейчас не будет, ведь как говорил - главное сейчас стартануть сайт. Он будет работать, а в это время я буду писать его по новой, только уже с нормальными методами, с базой данных, с сессиями и прочем.
Получилось считывать логин с паролем благодаря POST без выведения в адресную строку, но возникла трудность с редиректом. Вот смотри, анон, у меня есть вот такой код: http://ideone.com/sjRSyf
Он импровизирует введение логина и пароля, какое-то сравнение и должен сделать редирект в случае выполнения условия. Естественно, рeдирeкт он не делает, так как перед хедером ничего не должно быть. Что делать в таких случаях? Делать рeдирeкт через script? Просьба не усложнять данную конструкцию, так как на данный момент я все пишу благодаря гуглу, практических настоящих знаний у меня мало. Планирую как раз обучаться по нормальному в момент пересоздания сайта который делаю сейчас.

!xnn2uE3AU. Пнд 23 Сен 2013 23:46:27  #504 №320355 

>>320351

После редиректа header() надо ставить die()

!xnn2uE3AU. Пнд 23 Сен 2013 23:47:36  #505 №320356 

>>320351

> Естественно, рeдирeкт он не делает, так как перед хедером ничего не должно быть.

В приведенном скрипте перед редиректом вроде ничего и нету. Должно работать, если поставить die()

Аноним Пнд 23 Сен 2013 23:50:55  #506 №320357 

>>320356
И правда, работает. А разве он не требует чтобы перед хедером вообще никаких строчек небыло? И не будет ли никаких конфликтов, если хедер используется сначала для указания кодировки, а затем для редиректа?

!xnn2uE3AU. Пнд 23 Сен 2013 23:54:50  #507 №320358 

>>320357

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

Аноним Втр 24 Сен 2013 00:02:18  #508 №320360 

>>320358
Нет, все таки не получилось. Если делать редирект на ссылку - все хорошо. Если делать редирект на документ - Cannot modify header information - headers already sent by...
Пробовал убрать первую строчку хедера с кодировкой, чтобы поставить ее в строке редиректа, но так слетает кодировка и в браузере иероглифы. И все равно не перенаправляет при отправке формы, даже со сбитой кодировкой. Пишет туже самую ошибку. Делаю вот так:
http://ideone.com/JzyS10

!xnn2uE3AU. Втр 24 Сен 2013 00:06:14  #509 №320363 

>>320360

> header('Location: /1.php Content-type: text/html; charset=utf-8');
Так нельзя писать. «переставить» я имел в виду, поствить строчку header('Content-type: text/html; charset=utf-8') дальше, после if чтобы при редиректе она не вызвалась вообще.

> Если делать редирект на документ - Cannot modify header information - headers already sent by...
Это у тебя что-то криво. Может, ты опять блокнотом Windows в како-нибудь файл BOM добавил?

Аноним Втр 24 Сен 2013 00:11:31  #510 №320365 

>>320363
Нет, юзал UTF-8 без BOM в notepad++.
Ладно, это кара мне за индусский код. Попробую все таки все разрешить. Хороший опыт на будущее.

Аноним Втр 24 Сен 2013 00:14:55  #511 №320368 

Открыл сейчас код, глянул, понял насколько я бездарен и невнимателен.
>echo "$login $pass $bool"; в четвертой строке
Нельзя же ничего выводить, а я еще хочу чего-то. Все заработало, ОП, прошу прощения.
Алсо, бамплимит у треда же.

!xnn2uE3AU. Втр 24 Сен 2013 02:22:43  #512 №320394 

>>320368

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

Иногда еще эти 2 части разносят в 2 скрипта: первый скрипт только обрабатывает данные, а в конце подключает второй, который и выводит их.

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

Аноним Втр 24 Сен 2013 12:41:56  #513 №320467 

Антоны! Подскажите php-нубу. Пишу всякий мелкий код в np++, в целом все нравится, автокомплиты и прочие ништяки. Но вот такая ситуация:
Вот ковыряю я, допустим, чей-то уже код. Ну допустим это CMS. И там хуева туча всяких функций. И я начинаю исследовать какую-то функцию, но мне интересно, где она еще вызывается-то.

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

Аноним Втр 24 Сен 2013 16:53:46  #514 №320572 
1380012116045.jpg

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

Лично мне кажется первый вариант намного логичнее, если тебе нужно провести обычную выборку из 1-ой таблицы и сразу поместить её в вывод, петухи которые говорят, что ТАК НЕ ХИБКО, не могу привести внятного примера почему. С другой стороны, в таком случае классы модели становятся оч тонкие и описывают только логику зависимостей и подготовку сложных выводов данных. ОПытный анон, объясни как лучше делаьт.

!xnn2uE3AU. Втр 24 Сен 2013 18:51:56  #515 №320617 

>>320467

Есть такие варианты:

1) Если надо по имени функции/класса перейти к ее определению. Это есть в любых больших IDE вроде Eclipse, Netbeans и даже в редакторе Sublime с 3-й версии.

2) Найти все места, где используется функция. В больших IDE есть инструменты для этого, но они не работают на 100% верно. Единственный работающий способ — сделать поиск по файлам.

В общем, попробуй Eclipse PDT или Netbeans, там функционал индексирования кода есть.

>>320572

> Типо в теории в модели, но в куче фреймов типо симфони, кохана и микрофреймах, обращение к базе данных происходит в контроллере.

Не, такого нету, ты наверно что-то путаешь. Покажи код, я тебе не верю.

Правильная идея такая. Работа с БД происходит только в модели, а контроллер только вызывает методы этой модели. Если уж делать совсем правильно, то каждая модель должна работать только со своей таблицей и ни в коем случае не лезть в чужие ( http://ru.wikipedia.org/wiki/Принцип_единственной_обязанности ).

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

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

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

— получает и обрабатывает GET/POST параметры
— вызывает сервисы проверки авторизации и прав пользователя
— вызывает модель для получения данных (если надо)
— вызывает сервисы для обработки данных (если это требуется)
— редиректит если надо
— вызывает классы для работы с формой, если надо обработать данные из формы

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

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

Аноним Втр 24 Сен 2013 18:58:52  #516 №320618 

Не могу норм припомнить, гугление наткнула на манула по симфони
"Цель у контроллера всегда одна: создать и вернуть объект Response. Следуя этой цели, контроллер может читать информацию из запроса, загружать ресурсы из базы данных, отправлять email или же записывать информациюю в сессию пользователя. Но всегда, в конечном итоге, контроллер вернёт объект Response, который будет отправлен клиенту."

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

Аноним Втр 24 Сен 2013 18:59:39  #517 №320619 

>>320617
Спасибо за развернутый ответ, кста

Аноним Втр 24 Сен 2013 19:04:04  #518 №320623 

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

$data = $this->orm->get('имя модели')->find_all()

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


!xnn2uE3AU. Втр 24 Сен 2013 19:14:56  #519 №320630 

>>320618

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

Так он делает это не сам, а вызывая модель (для работы с БД), сервис отправки email. То есть через другие классы.

С сессией можно и напрямик работать, это да.

> А когда учил кохану там были примеры кода где все делается в контроллере,
Значит, это был плохой код.

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

!xnn2uE3AU. Втр 24 Сен 2013 19:16:58  #520 №320631 

>>320623

Так это нормально, ты в контроллере же не пишешь SQL-запросы, а используешь модель. Ненормально, если ты в контроллере пишешь $this->db->fetchAll('SELECT ..... на 20 строчек')

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

!xnn2uE3AU. Срд 25 Сен 2013 20:07:00  #521 №321003 

Этот тред закрыт, новый, 11-й, тут: >>320929

comments powered by Disqus

Отзывы и предложения