Сохранен F 522
https://2ch.hk/pr/res/313971.html

Клуб любителей изучать 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, робот его выровняет как надо.

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

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

Loading...
Мануалов никогда не бывает много !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

Функции, классы и объекты нужны для организации и разделения кода на отдельные слабосвязанные фрагменты. Это позволяет разрабатывать программы большего объема, командно, при это