У нас есть задачки не только на 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/ООП, то попросите, я что-нибудь придумаю, укажите только примерный уровень, что вы до этого решали.
Код надо писать не как попало, а аккуратно и красиво. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на 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(...)
{
// ...
}
>>313972
> HTML/CSS
Хотет. Уровень - хуй знает, проходил курсы по CSS на codeacademy:
CSS: An Overview, CSS Selectors, CSS Positioning. Но это было полгода назад, я уже наверное многое забыл.
>>313975
Тогда для начала можешь сделать задания 1-10 с картинки во втором посте. Обрати внимание, в большинстве заданий надо не жестко задавать размеры, а чтобы они вычислялись автоматически (из размеров окна браузера или содержимого, в зависимости от задачи).
Код можно постить на jsbin.com
Если ты хорошо знаешь CSS, то это у тебя займет максимум пару часов.
Дальше — задача 11, сверстать кота (пикрелейтед). HTML-код добрый дядя уже написал и выложил тут: http://pastebin.com/s1P96nVA
Обрати внимание, размер картинки должен определятся так: большая картинка — ужимается до ширины окна (с учетом полей конечно), маленькая — выводится как есть.
Если сделаешь — есть еще задача 12, и 13+14, но они пока не нарисованы.
Чем плохо вызывать из похапе внешние программы через обратные апострофы? Если например есть скрипт, который что-то делает, а мне не хочется его переписывать.
А еще у меня бугурт от ООП, как же всё запутано. Третий день ковырять пытаюсь и как-то туго идет.
Привет, мастерам! У меня к вам просьба риквест. Видел как то pdf по php от дваща или добрача, не помню, видел в б зимой или давно, все там так красиво было, подскажите ссылочку
>>313974
> Не пиши транслитом, открой лучше slovari
Oh, irony!
>>313979
> Чем плохо вызывать из похапе внешние программы через обратные апострофы?
Не проверяется результат (код возврата), не логгируется поток ошибок. Чтобы передать сложные аргументы скрипту, с пробелами и кавычками, надо извращаться, причем под разными ОС по-разному. Нельзя скормить данные на вход (stdin) скрипту. Нет таймаута для зависшего скрипта.
В общем, на профессиональный подход не тянет.
> спойлер
Ну что поделаешь, тяжело в учении. Привыкай, все через это прошли. Алсо, есть задачка на кошек-мышек, хотя она сложноватая.
>>313778
без циклов http://ideone.com/DDqRO6
>>313992
Код работает, но почему он такой нечитабельный? Неужели хотя бы переменные нельзя нормально назвать? Я, например, не могу держать в голове что такое a, b, c, d.
>>313993
улучшил для тебя, няша:
http://ideone.com/3s62Oo
>>313996
Гораздо лучше. Надеюсь, в следующий раз ты еще и строчки до 80 колонок переносами разобьешь.
>>314002
Значит, у тебя очень хорошая память. Но уверен, даже твоя память не справится, если переменных будет не 4, а например 24.
>>313991
Опушка, посмотри: http://ideone.com/DDBkog
Может где-то не так понял или сделал, поясни. Во втором задании я новую функцию не добавлял, а просто дописал еще одно поле к функции с вопросами.
Всё еще довольно мутно, ту задачку про кошек-мышек не потяну?
Опечатка у тебя на 133 строчке в $naswers[$i]
>>314022
Если ты запускаешь скрипт через Апач и браузер, а не через ideone/командную строку, то в начале можно написать:
header('Content-type: text/plain;charset=utf-8');
И текст будет выводиться как есть, без всяких < br >
В остальном, все выглядит верно. Если тебе кажется сложной задача про кошек/мышек то не знаю, может я вечером что-нибудь попроще придумаю. Почитай пока что ли мануал по ООП.
Вот условия задачи про кошек/мышек: >>>>304841
>>314027
А, забыл про <br>. Я когда-то менял на text/html, уже и не помню для чего, так и привык <br> вместо /n юзать.
Я завтра вернусь к погромированию, попробую кошек-мышек уже тогда. Можешь пока не придумывать, бобра.
Оп, ты писал сегодня, что в новом пхп уже работает буква-флаг i, а функции без mb, вроде strlen(), substr() и пр. случаем не заработали?
Почему для мультибайтовых кодировок нет аналога функции ucfirst()?
Как мне теперь сделать заглавной только первую букву предложения?
>>314086
Написать свою функцию. Это дело на 3 минуты для начинающего любителя PHP.
>>314086
Алгоритм функции такой: получаем первую букву, переводим ее в заглавную, присоединяем к ней остаток строки.
>>314092
Я просто очень глупый начинающий любитель, доходит все медленно. Спасибо!
http://jsbin.com/OSiHULI/13/edit
Вторая задачка, сделал что-то похожее на то, что на пикче. Проверь, опушка.
>>314107
Есть проблема. Попробуй сделать окно маленьким, и видно будет что у зеленого блока слева отступ от края окна гораздо больше чем 10px, а справа, наоборот, меньше. Неаккуратно. Подсказка: у элементов body или html в браузерном CSS обычно выставлен паддинг по умолчанию
> overflow-y: hidden;
Зачем это свойство? У нас учебная задача, и ставить свойства «на всякий случай» нельзя.
> box-sizing: border-box;
Не кросс-браузерно. Надо либо добавить версии с префиксами для mozilla и webkit, либо, что лучше, обойтись вообще без этого свойства, тем более в такой простой ситуации.
>>314084
Да-да-да! Это значит мне пора спать. Как-то привычнее "/", не задумался и машинально жмякнул по нему. А в редакторе "\" подсвечивается по-другому, так что збс.
>>314110
http://jsbin.com/OSiHULI/13/edit
> Зачем это свойство?
А как тогда сделать, чтобы текст отображался в маленьком окне, как на пикче? Хотя с overflow-y: hidden тоже не совсем так будет, так как появляется горизонтальная полоса прокрутки. Может нужно и минимальную ширину выставить?
Калькулятор.
Дроби пока не сделал, а то это какой-то странный калькулятор получится. В следущей "версии" дабавлю флаг на сокращение.
Undefined тип не реализовывал, это тоже в следующей "версии".
http://ideone.com/Gxgken
Ну что, C++ понятнее чем питон?
>>314121
А, извини, это я просто криво картинку нарисовал. Не надо ничего обрезать, пусть занимает по высоте столько места, сколько хочет. Так что убери это overflow.
Также, ты дал ссылку на старую ревизию.
Кстати, есть еще одно замечание: всегда, когда задаешь размер шрифта, задавай line-height, иначе она унаследуется от родителя, и не факт что та, которая нужна, потому лучше задать явно.
>>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 для этого не очень хорош.
Также, идея возвращать ошибку через глобальную переменную мне интуитивно не нравится. Может, использовать исключения или возвращать структуру с несколькими полями?
Доброкун, глянь пожалуйста сюда http://jsbin.com/EpIliXo/5/edit Я не понял, что там за линия справа, если это не тень, там же не только справа, мне кажется там и сверху, и снизу.
>>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
>>314161
Теперь верно.
Кстати, чтобы не тратить зря время, ты можешь решать сразу несколько задач одновременно, если чувствуешь в себе силы.
http://jsbin.com/EpIliXo/6/edit
>расстояние между желтыми блоками не 10px, а больше
В задаче написано что должны быть поля 10 px, я думал поле это от границы элемента до содержимого. Или в задаче как-то по другому указано какие должны быть отступы?
>>314215
Почти все идеально, кроме расстояния между желтыми блоками. Чтобы не было непонимания, держи картинку.
Расстояния по горизонтали между желтыми блоками должны быть ровно 10px.
>>314227
Доброкун, расскажи почему так странно ul вставляется, с дичайшим padding-ом http://jsbin.com/edUrumA/1/edit
Анон, в чем может быть проблема?
$(window).height()
$(document).height()
возвращают одно и тоже значение,но документ скролится
Браузер: хром последняя стабильная версия
>>314240
У ul, ol, li есть padding и margin по умолчанию. Это нужно, чтобы списки в тексте выглядели как списки, а не просто набор невыровеннных строчек. Если тебе они мешают, присвой им свои значения.
Обрати также внимание, что одни браузеры делают отступ паддингом, а другие маргином, так что переопределить надо оба свойства.
>>314242
Проблема была в DOCTYPE, забыл прописать и не обратил внимания, что его нет
>>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
>>314129
>Разве можно из функции возвращать локальную переменную?
А ты не путаешь с локальными ссылками? Ну хуй знает, должно вроде копироваться
>Также, мне кажется, парсинг (разбор строки на токены) можно бы вынести в отдельную функцию или лучше, класс-итератор, который будет возвращать по токену за раз и тем самым убрать эти костыли с glueNumber.
Т.е. c одной функции перенести в другую?
>Также, если я не ошибаюсь, если тебе нужен стек, то там есть какая-то коллекция вроде queue или deque, которая эффективно умеет делать pop/push, а vector для этого не очень хорош.
Я хотел stack юзать, но мне почему-то понадобился доступ по индексу и я его убрал...
>Также, если я не ошибаюсь, если тебе нужен стек, то там есть какая-то коллекция вроде queue или deque, которая эффективно умеет делать pop/push, а vector для этого не очень хорош.
Точно, структуру! Хорошая идея.
>Не совпадают типы же, разве это правильно? Плюс, зачем писать const char, может я что-то путаю, но const обычно пишут с указателями.
Да, забыл написать конст, компилятор постарался)
Const это "гарантия" того что я не буду менять значение ch.
С указателями const, еще может значить что указатель всегда будет указывать на одну и туже область в памяти.
>>314247
Если проблема решилась, хорошо, тем не менее, советую использовать методы DOM, так как jQuery не всегда возвращает то, что нужно.
>>314240
Кстати, вот так писать не стоит:
li { list-style-type: none; }
Ты этим у всех списков (которые могут встретиться на сайте) отключаешь точечки, а надо только у меню.
Оп, проверь пожалуйста мои задачи по занятию по массивам.
Я так понял, что задачи про ответ на любой вопрос и генератор имен нужно было просто переделать, не добавляя ничего, верно?
Задача про оценки: 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 значения?
Спасибо.
Вообще я пишу десктопные и мобильные приложения, но ради разнообразия я решил потыкать веб и встретился с одной проблемой в джаваскрипте:
<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>
Сап, доброкун! Сейчас вот добрался до кукисов и решил с ними разобраться. И вот сегодня уже битый час бьюсь над реализацией задачки, которая проверяет через кукисы первый ли раз анон на данном сайте, если первый - то говорит велком, если не первый, то выводит какое это посещение по счету и дату последнего визита. Написал код - запустил, кукисы не передаются, выдает варнинги, что у меня уже был вывод информации, где хоть убей не пойму, ни пробелов. ни пустых строк, ничего нет, а кукисы не работают. Вот код, запускаю на энделсе если что.Помоги разобраться, пожалуйста!!!
http://ideone.com/OXAknu
>>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;
>>314260
При вызове функции drawingCanvas.test() this будет равно drawindCanvas. this не передается через замыкание, а выставляется заново при вызове функции.
http://learn.javascript.ru/this
http://learn.javascript.ru/binding
>>314263
Упс, у меня почему-то идеон не всегда весь код передает кнопкой отправить, а лишь некоторые его куски. Я запостил адрес не глядя. Вот мой код:
http://ideone.com/kejYFT
>>314263
С этим скриптом варнингов быть не должно. Они из-за какого-то другого кода, который выполняется перед ним. Попробуй запускать только этот скрипт.
А! Вспомнил. Если ты используешь Windows блокнот то он в режиме utf-8 вставляет BOM в начало документа и этот BOM может ломать скрипт, хоть он сам невидим. Но тут ты сам виноват, я всегда писал, используйте Notepad++ или Sublime, не сохраняйте файл с BOM, не используйте виндовый блокнот для редактирования кода.
>>314269
>BOM
Точно, доброкун! Проверил, сам то нотепадом++ пользуюсь, но кодировка стояла в ютф-8, перекодировал в ютф-8 без БОм и все заработало. Спасибо!
>>314269
Доброкун, может не совсем по теме, но подскажи как запилить чтобы мой огнелис правильно распознавал кодировки? А то файл в ютф8 без бом, а он по умолчанию открывает в 1251, то есть после каждого ф5 приходится вручную переключать. Заранее спасибо.
>>314274
Написать в html коде
<meta charset="utf-8">
или проставить charset в заголовке Content-Type.
>>314274
Кстати, я бы проверил заголовки фаербагом. Наверняка у тебя сервер отдает charset=cp1251, а заголовок вроде бы имеет приоритет перед meta.
>>314278
В мета-теге всегда ставлю ютф-8, сейчас проверю фаербагом заголовки тогда.
>>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/ - при малом разрешении текст залазит под меню. Не знаю как исправить.
>>314284
Заголовок отдает сервер, Апач (или денвер который его содержит), кодировка прописана либо в настройках Апача либо в настройках PHP, надо найти где и поменять на utf-8.
>>314288
Будем искать. Благодарю.
Человеки, есть какой-нибудь нормально работающий плагин на саблайм для форматирования кода ? Ничего не хочет работать на бубунте.
Оп, скажи, можно ли серьезно заниматься версткой (html, css) и джаваскриптом и хорошо зарабатывать, но при этом не знать php совершенно (ну или скажем питон/руби? знать только джаваскрипт в общем)? Или такое невозможно?
Третья и четвертая задачка. Добра, опушка.
http://jsbin.com/UnuLUVu/1/edit
http://jsbin.com/idoFUGe/1/edit
>>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 — можешь походить по ссылкам и почитать требования к вакансиям.
>>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%.
Также, расстояния между заголовков и меню, между пунктами меню, паддинги не соответствуют тем, что на картинке. Заголовок должен быть не-жирным и темно-синим.
>>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/ — у красной полоски слева и справа нет паддинга, она примыкает вплотную к буквам, некрасиво. В остальном, верно.
>>313989
Просветите меня же, хочу на ридере почитать такое, было же в /b этой зимой, никто ничего не знает?
https://github.com/serrufAAA/HelloWorld Стыдно показывать, во что я превратил зачатки борды. Доброкун, дай мне ЦУ пожалуйста, а то я потерял всякое желание продолжать что-то делать. ох, скоро осень, учеба, все пхп забудется
>>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) {
Проверяем данные;
Если (все верно) {
добавляем пост;
делаем редирект на пост;
конец;
}
}
Выводим форму и возможно сообщения об ошибке
Оп, поясни про кошек-мышек, по какому алгоритму поле рисовать? Что-то умнее массива в цикле ничего не могу придумать. А если так, то ведь оче запутанно будет в дальнейшем.
Ну или дай чего полегче :3
простенький вариант того алгоритма с векторами, ещо не придомал как животные будут взаимодействовать если их будет больше
http://ideone.com/W03W9Y
>>314366
Рисовать поле тут самая легкая часть. ты можешь например хранить массив массивов, вида:
array(
array(".", ".", "M", "."),
array(".", "C", ".", "."),
....
);
И выводить его циклом. А можешь не хранить, а хранить например координаты животных и составлять такой массив на ходу.
Ну или в самом начале ты можешь вообще текстом писать «Кошка x=2,y=3»
Сделай хоть что-нибудь, в общем, потом если что переделаешь.
Чего полегче я пока не придумал, так что делай пока кошек-мышек, чтобы они хотя бы в случайную сторону ходили, а потом постепенно допиливай.
http://ideone.com/w94xFY
стих вверх тормашками
>>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 колонки, текст все равно оборачивает меню снизу.
Сап, анон.
Расскажи мне про реляционный ActiveRecord. Я с ним столкнулся в Yii фреймворке. И меня мучает мысль о том, что связи будут постоянно загружаться из конф файлов. Не сильно ли это нагрузит сайт в случае больших проектов? Или это наоборот заебись, что с базы снимается нагрузка и все что делает субд это выполняет кучу простых запросов?
>>314446
> http://jsbin.com/ODOCeWE/4/ - только с этим проблемы. Не получается сделать 2 колонки, текст все равно оборачивает меню снизу.
http://jsbin.com/ODOCeWE/5/ пофиксил
клуб любителей пощекотать очко
>>314516
Зачем ты тут рекламируешь свой гей клуб?
Тебя сюда не звали! Уходи!
>>314358
Блин, ДК, какой ты все такие хороший! Твои советы прямо как холодная вода, в чувства приводят, а то я сижу как сыч и только и думаю, что о начале учебы. А фигли думать, когда первые пары в пнд? Вобщем спасибо, снова обрел смысл, хотябы до конца недели.
>>314446
Задача 1 Все верно
Задача 2 Правильно решено
Задача 3
В общем, все хорошо
1) потерялся border у желтых блоков (ну ладно, это мелочи, можешь не исправлять)
2) а зачем overflow: hidden? У нас учебная задача, нельзя ставить свойства «на авось».
Также, эти overflow здорово мешают, когда например потом захочешь добавить какую-нибудь кнопочку в угол блока, чтобы она вылезала за его границы. Не люблю overflow hidden.
Задача 4
Все хорошо, но текст должен быть не черный, а тоже цветной.
Задача 5
Ты перепутал #content и .content, посмотри внимательнее.
>>314502
Тут надо не гадать, а померять, хотя бы с помощью microtime(true), сколько времени это занимает. Если медленно — можно эту инофрмацию кешировать куда-нибудь в memcache или APC cache.
Но вообще, если ты нагородишь много сложных связей, то, скорее всего, будет тормозить. И запросы, скорее всего, будут не самые эффективные. AR ориентирована в первую очередь на скорость разработки, а не на производительность.
Так что еще раз повторю, надо мерять время выполнения, смотреть какие запросы отправляются и там уже думать, а не сидеть гадать.
>>314515
Ок, эта задача решена.
>>314528
Пары парами, а эту задачу тебе все же лучше продолжать делать. На примере простой борды можно много чего изучить, например дальше (когда ты приведешь код в порядок) мы попробуем проверить, хорошо и ты работаешь с БД и эффективны ли будут твои запросы на большом количестве постов.
>>314358
Я не понял куда редирект. У меня всего-то есть главная, и страница с формой для поста или комента. Нужно еще конечно сделать страницу с тредом, но с моими знаниями css это будет сложно.
>>314358
Алсо, в Sublime и так вроди стоит indentation->tab width 4, или что-то другое нудно поменять?
>>314543
Тогда логично пока что редиректить на главную. Со страницей треда что-нибудь придумаем.
>>314544
Поставь галочку Indent Using Spaces и сразу же сделай Convert Tabs To Spaces.
Сложные эти ваши кошки-мышки, не для ньюфага.
Весь секрет успеха в решении в правильном описании классов и методов, да? Я чего-то похожее на ООП понатыкал, а юзать не знаю как. Вот и не идет дальше первоначального рандомного спавна кошки/мышки. Бида
>>314578
Да, конечно, вся суть задачи в умении правильно определить объекты (поле, кошки, мышки) и взаимодействие между ними.
>>314596
ОП, подкинь мыслей, хоть в какую сторону двигаться. Что в классах должно быть и как примерно они должны взаимодействовать друг с другом Пока есть вот эти превозмогания: http://ideone.com/xFmRY5
>>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 относительно коммента.
>>314358
Так, ну вроди вот https://github.com/serrufAAA/HelloWorld Почему-то git плохо ладит с переименованием и удаление файлов. Старые контроллеры выпилены, application->Application, но этого почему-то не видно. По порядку: плейсхедеры крутые, я даже сделал чтобы не массив массивов, а массив объектов, все ок. Настройки бд: в отдельный файл перенести не получилось, но теперь настраивается в bootstrape-е, как в Yii. htmlspecialchars добавил через статический метод. Возник вопрос как выводить ошибки в формах. Передавать GET-ом через ...?var=value или бросать исключения? Но исключения же придется в view обрабатывать, так можно?
Итак, я придумал более легкую задачу на ООП, чем задача про кошек-мышек. Для тех, кому сложны кошки-мышки, можете попробовать эту.
Задача на ООП
В большой международной перспективной компании «Вектор» есть 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
>>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...
..........
";
>>314683
Ой фу блять, фу!
Вот нахуя нужно ТАКОЕ гавно?
Нахуя эти ебанутые задачки? Вам блять тугрики считать надо, или сайты писать?ну я знаю, что на пыхе можно даже весьма пиздатых демонов писать и даже многопоточные приложения, но ты же об этом нахуй не слыхал, так что не будем об этом
Задачки имеют смысл только если ты будешь писать высоконагруженные приложенияи то далеко не всегда или 3D движки.
В остальном они НАХУЙ не нужны.
Вы тут свои задачки решаете и потом пишите скрипты, где по 68 запросов в цикле к базе на одной странице, код похож на блевотину кота, а про оптимизацию для конечного пользователя никто не думает.
А почему?
Потому что ты гавно.
Чтобы научиться прыгать с парашютом надо прыгать с парашютом, не надо бегать вокруг аэродрома с ранцем или рисовать парашюты на стенах в общественном туалете.
Я не спорю, для некоторых это прикольно, но это не поможет тебе научиться прыгать с парашютом.
>>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 (ты наверно просто опечатался).
>>314683
>Я у мамы самый умный.
Сделал две, проверь, пожалуйста:
http://ideone.com/3GGKJH
http://ideone.com/mK8NVl
И дай мне хоть наводку на то, как третью решать. Гуглил немного, почитал про debug_backtrace() и debug_print_backtrace(), но не увидал нужного функционала.
xDebug - громоздко и пока ни черта не понятно, может, он вообще не подходит для этих целей. Спасай-выручай, коль такую задачу выдумал.
>>314700
Мы сначала учимся вообще писать код, а потом думать об оптимизациях. Это задача для начинающих изучать ООП. Для людей, которые толком не запомнили чем abstract отличается от final.
И естественно, умение писать хороший ООП-код должно идти раньше чем умение заменять 68 запросов на 34.
>>314711
Задача 1.
Она пишет много ненужной информации, зато не обнаруживает, что wrongValue присутствует в исходных данных. Надо, чтобы писались только ошибки, и чтобы wrongValue обнаруживалось.
Алсо, с циклом слишком легко. Ты без цикла реши.
Задача 2.
http://ideone.com/hiiBcY — неправильно парсится строка, должен быть один элемент test, а не несколько.
Задача 3
заведи в функции переменную static. Они не уничтожаются при выходе из функции, а сохраняют свое значение. backtrace и xDebug тут не нужен.
>>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 <-- общее время работы скрипта и время на выполнение всех запросов
>>314672
Также, я сейчас посмотрел историю коммитов, старайся пожалуйста писать нормальные описания, вроде «added post form» или хотя бы на русском, но нормальные.
Xорошо живете товарищи, задачки на тугрики и аналитиков мухаха... мнеб такие приносили.
Учится конечно надо, но такие задачи с практикой совсем не сравняться.
Вот вам недавняя задачка:
Имеем сервак с мускулом база на 200гб, там что-то 30+ млн текстовых материалов.
Требуется всего лишь
а) найти дубликаты
б) найти похожести на 90+%
И важно: никакие супер рейды и кластеры не рассматриваются, обычный сервак с с-ата винтом на 1тб, уникс и т.д.
>>314733
Начинать надо с учебных задач. С человеком, который не умеет писать аккуратный, поддерживаемый и логичный код, будь он хоть 10 раз гений, я бы (и не только я) работать не захотел. Потому мы начинаем с более важных вещей.
> мнеб такие приносили.
Так за эту задачу не платят. Вряд ли ты ей обрадуешься.
>>314733
Ты описал задачу, но не описал сколько на нее отведено времени. Одно дело, если это надо сделать за 3 часа (и отзыв, лол), другое — если есть 2 недели например.
Это нормально - начинать изучать html на codecademy?
Решил сначала разобраться с html и CSS, а потом продолжить PHP.
>>314746
Нормально, но я советую после прорешать все наши задачи на CSS, для закрепления знаний. Задачи перечислены вверху, во втором посте.
Питон-куны, а можно вас потроллить? Правда, что у вас в языке тернарный оператор принято записывать через if в обратном порядке? Зачем так сложно? Я-то думал, в Питоне все делается ради читаемости и понятности, и уж точно лучше чем в PHP.
Вот у нас в PHP все нормально: $x = $y > 0 ? 1 : -1;
Также, чтобы 2 раза не вставать, поделюсь ссылочкой: http://roem.ru/2013/08/28/addednews79257/
Забавно, глава российского Гугл сказала, что она не была в питерском офисе, потому что там сидят одни разработчики.
ПХП-куны а можно вас потроллить? Нахуя вы пишете "доллар" перед именами? Вот у нас в питоне все нормально
a = b
$a = $b
А вот еще интересно. Наткнулся в сети на такой код:
http://govnokod.ru/13669
Как вы видите, там в коде использованы русские имена полей в объектах, вроде:
> $Док2=$this->app->Документы->ПлатежноеТребованиеВыставленное->СоздатьДокумент();
> $this->app->УправлениеДенежнымиСредствами->ЗаполнитьРеквизитыРасчетногоДокумента(
Можно, конечно, смеяться, называть людей быдлокодерами, но оставим это занятие глупым и неопытным людям. А умных людей мы спросим, как они предлагают решить эту проблему?
Для не понимающих проблему людей, поясняю: есть предметная область, в ней 100500 терминов из экономики на русском, некоторые из которых (ИНН, КПП) даже не имеют аналога в английском языке, а другие такие, что хрен переведешь (УстановитьСтатьюДДСПоУмолчанию). Предложите, как писать код с использованием этих терминов?
Критиковать все горазды, а вы решение предложите. Я вижу плюс от импользования русскоязычных терминов, в том, что 1) они 100% понятны 2) они совпадают с терминами из кода 1С.
>>314800
>УстановитьСтатьюДДСПоУмолчанию
setArticleDDSByDefault
setDefaultArticleDDS
>>314804
А ДДС почему транслитом? (ДДС = движение денежных средств наверно). И ты другие термины посмотри, ты офигеешь их переводить.
>>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-сниками, а ты годное, хорошее решение придумай.
http://jsbin.com/iwUvUKU/5/edit
http://jsbin.com/UpogAfo/2/edit
Так и не нашел способ, как убрать пробел между блоками, кроме обнуления шрифта. У кнопки размер почему-то получается не 30, а 31. Такие дела.
>>314808
http://ideone.com/3GGKJH
Переделал, проверь. Не осилил без циклов, в общем.
>>314812
Сайт агросервис
Заголовок должен быть не-жирным шрифтом, в остальном верно.
Форма поиска
Для inline-элементов (кнопки и input) нужно выставлять правильный vertical-align, иначе они могут выровняться не так, как надо (сейчас они у тебя выравниваются по baseline и находятся на разной высоте).
padding у input убирать не надо, так как без паддинга текст прижимается слишком близко к краю и это некрасиво. Дефолтный паддинг 2px, можно просто выставить такой же и учесть его при расчете высоты.
4 свойства padding-top, left, ... можно бы объединить в одно.
> как убрать пробел между блокам
Платиновая статья на эту тему: http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html
Обнуление шрифта, по моему, не лучший способ, давай что-нибудь по-лучше из статьи возьмем.
>>314814
1) Вместо sizeof в наше время используют count (хотя это cинонимы, но пишут именно count), но в if можно просто писать if ($redundant), так как пустой массив приводится к false
2) Вместо foreach($redundant as $key=>$value) можно использовать implode.
Кстати, удалить лишние запятые в выводе можно rtrim().
Не знаю, формально работает, но стоило бы еще допилить код до идеала.
>>314816
http://ideone.com/3GGKJH
В чем преимущество count перед sizeof?
Спасибо.
Да, я давно ничего не писал для разминки, про explode помнил, а implode выпало из головы напрочь.
>>314815
http://jsbin.com/UpogAfo/4/edit
Немного не ровно получается, так как высота кнопки больше на 1px.
>>314820
> В чем преимущество count перед sizeof?
То, что всюду пишут count() и таким образом твой код будет выглядеть более привычно. В плане же исполнения sizeof — алиас для count и делает то же самое.
Теперь все верно.
>>314821
В каком браузере? В Хроме и Firefox кнопка и input выглядят правильно.
>>314672
Борда-кун, держи обновленную верстку: http://rghost.ru/48440706
Верстка местами кривая, так как времени не было сделать нормально, надеюсь разберешься. Может, потом я ее допилю до нормального вида.
>>314808
> Легко смеяться на 1-сниками, а ты годное, хорошее решение придумай.
http://www.linux.org.ru/news/opensource/9517228
>>314824
В Хроме. В Опере и Firefox все ровно. Алсо, почему в Хроме размеры отступов, полей и т.д. показаны дробными числами, а в других браузерах целыми?
Аноны, можете подсказать какие-нибудь годные видеоуроки по верстке? Знания есть, но их еще правильно применить нужно.
>>314889
И кстати, эта ссылка не объясняет, как переводить термины вроде СтатьяДДС. Конечно, в программе расчет Фибоначчи можно и латинницей все сделать, а в реальных задачах не все так просто. Это вам не монады на хаскелле писать, тут думать надо.
>>314970
> Это вам не монады на хаскелле писать, тут думать надо.
Бугуртишь от того, что не осилил?
>>314683
ОП, пробегись быстренько, подскажи в какую сторону идти: http://ideone.com/N3YYZb
Наверняка нужно наследование и всё такое, но боюсь не там понатыкать. Паблик сейчас везде, это потом как-нибудь поменяю.
Че-то не получается думать по ООП-шному, однообразная безысходность в коде. Может пойти еще теории с книжки навернуть или продолжать методом тыка пытаться придумать чего?
Анончик, подскажи как правильно вычислять дату в поля timestamp
Вот нпр, мне нужно все записи последних 2-х дней, как правильно оформить запрос?
Как верно использовать NOW()?
>>315069
не насилуй мозг всеми этими ссаными наследованиями и прочей говнотой.
функциональный подход намного прощe и натуральней чем ООП. ознакомься:
http://en.wikipedia.org/wiki/Functional_programming
>>315082
Там есть что-то вроде NOW() + INTERVAL: http://stackoverflow.com/questions/3887509/mysqls-now-1-day
Но я бы вычислял дату в PHP и передавал явно, в стиле WHERE date
> '....'
>>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 выпилить
Алсо, не слушай тролля. Для такой задачи (как и для большинства реальных задач) идеально подходит именно ООП.
Доделаешь — пости код, не отлынивай. Там будут еще задания на доработку и переделку под постоянно меняющиеся требования заказчика.
>>315069
Также, хочу показать интересную штуку. Есть методы (вроде addEmployees), которые ничего не возвращают. Если в конец им поставить
return $this;
то такие методы можно будет писать цепочкой, например:
$salesDep = new Departament("Продаж");
$salesDep->addEmpoyees(3, "man1")->addEmpoyees(5, "man2");
Стильно, модно, молодежно.
>>314701
Спасибо.
6-9:
http://jsbin.com/eQunehe/4/
http://jsbin.com/uYURuPa/4/
http://jsbin.com/AXixEJu/2/
http://jsbin.com/ELiZojE/3
Во всех колонка слева не на одном уровне справа. Долго пытался, но ничего не получилось.
>>314830
О, спасибо! Теперь у уютного будет своя криво-борда.
Не совсем пхп, но рядом.
В корне сайта есть файл с именем например 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
Анон помоги
Нужно решить такую задачу
Массив считывается из файла
Затем один из заранее определенных элементов ставится первым
После этого массив записывается в файл (Алсо, я описал механизм бампа тредов)
ПОмоги а то я не осилил
>>315171
Выложи код своего скрипта (например, на ideone.com) для начала.
>>315183
вот код скрипта http://ideone.com/7IH7Qw
>>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 — подчеркивается. Но поддерживать старую Оперу не входит в наши задачи, так что это не ошибка.
В остальном, кроме слеша, хорошо.
>>315155
выкинь RewriteCond и напиши
RewriteRule /tag/2 tag_2.php
Алсо, убедись что ты понимаешь регулярные выражения (без их знания rewrite не напишешь).
Также, если у тебя есть сомнения, а какие именно правила сработали и как? — в Апаче можно включить режим отладки реврайтов, читай первый ответ тут: http://stackoverflow.com/questions/9632852/how-to-debug-apache-mod-rewrite
Если включить эти директивы (RewriteLog и RewriteLogLevel) то Апач будет в этот лог писать подробно для каждого запроса, какие правила применялись и как переписывался запрос. Это полезно в запутанных ситуациях.
>>315229
Ой, вроде первый слеш не нужен,
RewriteRule tag/2 tag_2.php
А есть чего годного из IDE для ньюфага под ленсук?
>>315138
Пиши код уже. Допишешь до работающего состояния и прикрутишь профайлер, начнем тестировать скорость работы. Вместо того, чтобы учить теорию про всякие индексы и прочую заумь, мы на практике проверим, как быстро или медленно работают твои Sql-запросы. Заодно может быть научишься правильно проектировать БД, а не лепить таблицы как попало.
>>315231
Netbeans, Eclipse PHP, phpStorm, но конечно суровый бородатый линуксоид с презрением отметет эти недо-IDE и скомпилирует vim или emacs.
А я лично предпочитаю Sublime. Люблю вещи с продуманным няшным интерфейсом.
>>315236
Только vim/emacs, только хардкор. Зонды не нужны.
>>315241
Но ведь у них нет современного, сделанного по заветам Раскина, продуманного интерфейса (как у саблайма), и странные сочетания управляющих клавиш, перекочевавшие без изменений из допотопного софта эпохи лед зеппелин. Последнее меня напрягает больше всего, зачем переучиваться на старое?
>>315244
Ты просто не пробовал. После дня-двух под вимом ты уже не сможешь писать в саблайме, это как жрать говно, когда есть фуа-гра.
>>315244
Ну, типа ничто не вечно под луной, чувак.
Заветы меняются. Был, например, вполне пригодный Текстмейт. Где он теперь?
Ничто не вечно под луной. Кроме Лед Зеппелин и vim/emacs, конечно же!
>>315246
Скорее, после дня-двух я все еще буду искать комбинацию клавиш для выхода однажды так запустил vi
>>315251
Ну, значит, ты дебил. Не всем дано, что уж тут. Как вы в саблайме по коду перемещаетесь? Мышкой?
>>315253
А то. Хотя есть винтаж (ололо вим) мод, который как-то странно сделан, хоть и работает.
>>315236
> суровый бородатый линуксоид
А на деле школьник с чсв нетакойкаквсе
В любом случае, не нужны ни те ни те
>>315253
Ебать, посмотрите на этого патлатого вонючего петуха! Он смеется над теми, кто пользуется мышкой
мимопроходил
>>315253
Ctrl + R и набираешь название функции (поиск нечеткий, так что сокращения работают). Ctrl + Shift+ R ищет функции и классы по всему проекту (да, там есть индексация идентификаторов, и в отличие от ява-IDE она не тормозит). Ctrl + P ищет по именам файлов. Причем если ты открываешь файл или переходишь к функции, то по мере набора открывается файл и ты можешь, если посмотрел что надо, нажать Esc и вернешься назад. Плюс няшности вроде мультиселекшена. Удобнейший редактор.
Ну а в пределах одной функции вполне удобно перемещаться колесом мыши, если функция не влезает на экран. Плюс, справа есть няшная полосочка с птичьим видом.
>>315256
Стоявшие у истоков операционных систем и языков программирования, конечно же нинужны. А вот миллионы кукарекающих хипстеров, бегущих за FOTM ЯП/IDE не могут ошибаться.
>>315253
Причем, как я понимаю, и vim и emacs используют консольку для вывода кода, а Sublime полноценно использует возможности современных экранов, рисует всякие рамочки и окошечки, а как он выглядит и некоторые приемы работы можно увидеть на гифке на офсайте http://www.sublimetext.com/ .
>>315261
>используют консольку для вывода кода
Emacs и Vim можно использовать в терминале, а можно извне. Для Vim есть GVim и подобное, EMACS же с гуем изкоробки.
>>315263
1) 3 раза Ctrl + →
2) Ткнуть мышкой
Но вообще ты какие-то странные примеры приводишь, я например плохо представляю как в коде считать слова, так как там половина — всякие символы. Мне быстрее ткнуть мышью, или стрелочки нажать, чем посчитать на сколько слов мне надо сдвинуться.
>>315261
Gvim.
Btw, как саблайме забиндить команду на caps lock? У меня так и не получилось.
>>315266
Не знаю. У меня CL переключает раскладку клавиатуры. Но, продолжая пиарить саблайм, кроме всех этих фич, там еще удобный (и быстрый) поиск, по регулярке ищет по всем файлам и выводит результаты в отдельном табе.
>>315259
Будто бы в их времена были IDE сегодняшнего уровня, у них не было выбора, вот и жрали что давали
>>315269
Ну это просто уникальна фича саблайма, лол. Это есть в любом редакторе уровня выше блокнота.
>>315263
Уже работает, только к комбинациям вимоимитатора еще добавляется стандартные комбинации (^v, ^c, ^d, и пр) и получается пиздец какая каша.
>>315273
Но ведь не везде у этой фичи удобный интерфейс, в других редакторах часто уродливо слепленные окошки и неудобное отображение результатов. Важен же не только список фич, но и как они реализованы, насколько удобно ими пользоваться, насколько они интуитивно понятны.
И что мне особо нравится, всем этим можно пользоваться сразу же, без программирования скриптов или изучения мистических комбинаций клавиш. Тот же мультиселекшен реализован максимально наглядно и понятно.
>>315270
>жрали что давали
Кукарику!
Редактор - вторичен. Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed.
Ну и я думаю, что любому уважающему себя программисту на любом ЯП любого уровня вскоре придется изучать *NIX, командно-ориентированный+текстовый интерфейс и всё это. Или мириться с планшето-ориентированными окошками и макинтошами, зондами и всем этим.
>>315275
> мультиселекшен
Хотя в виме это есть, в то же время совершенно не нужно. Замена намного удобнее.
Emmet в сублайме лучше, чем в виме. Вообще работа с хтмл/хмл подобными в сублайме лучше. Остальное дико не удобно или я не осилил
мимовимобог
>>315277
Так никто не говорит, что это плохие редакторы. Естественно, если их десятилетиями программисты затачивали под свои нужны, то они доведены чуть ли не до совершенства. Но проблема (на мой взгляд) в том, что это — доведенные до совершенства консольные редакторы 80-х. Хоть ты оберни их в окошко и добавь меню, они все равно консольные по сути, используют нестандартные сочетания клавиш с давно умерших программ (нафига?), нестандартные особенности интерфейса, так что привыкший к современным интерейсам человек ими пользоваться сходу не может. И тут возникает вопрос, нафига мне сидеть с книгами и мануалами, если я могу взять саблайм и начать им пользоваться сразу же, а всякие комбинации клавиш запоминать по мере использования? Можно подумать, мне делать нечего как проходить спецкурс по пользованию редактором кода. Я считаю, лучше упрощать интерфейсы.
Ну и я не понимаю, что плохого в использовании мыши. Я кручу колесо, прокручивается код. Куда проще и логичнее?
>>315277
> Редактор - вторичен. Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed
Ты так говоришь, будто я тебе доказывал обратное
> Ну и я думаю, что любому уважающему себя программисту на любом ЯП любого уровня вскоре придется изучать *NIX, командно-ориентированный+текстовый интерфейс
Ну, допустим
> и всё это
Зачем изучать консольные текстовые редакторы, если есть возможность мышкоёбствовать где удобно в гуе?
>>315281
Перед одноклассниками с консолью можно пердолиться, а с хипстерскими редакторами нельзя
>>315281
Ну ведь руку отрываешь от клавы. Дохуя времени идет. Пока ты возьмешься за мышку, прицелишься куда надо, уберешь руки с мышки и вернешься к клаве печатать, вимобоги уже и макрос запишут и прокрутить его несколько раз успеют. Такие дела.
>>315277
Изучать командную строку надо не всем, серверным разработчикам надо, а фронтендщикам — нет, им лучше консоль отладчика браузера изучить.
И я опять же не понимаю, вот у меня курсор в одной точке функции, мне надо переместиться в другую, не проще будет кликнуть мышью, чем отсчитывать число слов и строк и набирать команды? И разве неудобно выделять код мышью, не занимая мозг подсчетом слов и скобок, а думая над задачей? Некоторые вещи мышью быстрее делать, чем клавишами.
>>315281
> используют нестандартные сочетания клавиш с давно умерших программ (нафига?)
стандартные - это C-C, C-V, C-X?
Они не "нестандартные", а эргономичные и удобные (это я про вим). Пользователям вима не надо тянуться к мышке для перехода на 2 строки ниже, вообще ни для чего не нужно тянуться к мышке. Так получается не отвлекаться он написания кода на всякую левую хуйню.
Но ты, наверное, не поймешь, потому что ты слишком зашоренный.
>>315281
> Можно подумать, мне делать нечего как проходить спецкурс по пользованию редактором кода.
Можно подумать, что строителю нечего делать, как проходить спецкурс по пользованию рабочих инструментов.
Если ты 90% рабочего времени находишься в редакторе, то почему бы не научиться им пользоваться на 100%?
>>315277
> Многие с мощным IDE не напишут того, что суровые бородатые программисты-*никсоиды писали на ed.
Это провокационное заявление. Во времена ed программы укладывлись в один или несколько файлов на 1000 строк (пруф - смотри код первого компилятора Си или код первых версий фотошопа). Разрабатывал их чаще всего один автор (или несколько каждый свой модуль), держа архитектур в голове и на листочках бумаги.
Сейчас объем кода в проектах в разы больше. C ed ты офигеешь уже когда надо будет писать (и помнить наизусть) пути вроде application/modules/stats/controllers/graph.php, я уж боюсь представить сколько времении у тебя займет поиск, где находится класс Some_Class, в то время как в IDE (и в Sublime 3) есть киллер фича, когда кликаешь по имени класса или функции и переходишь к определению.
А что, кстати, в vim/emacs с индексацией? Они умеют в автокомплит и поиск функции по имени?
>>315289
> киллер фича, когда кликаешь по имени класса или функции и переходишь к определению
Да вы охуели, блять, киллер фича саблайма. Эта фича называется ctags, и ей уже десятки лет.
>>315284
Так при использовании клавиатурных команд ты часть своего процессорного (мозгового?), скажем так, времени тратишь на выбор подходящей команды и ввод, а при использовании визуальных средств — меньше. То есть «кликнуть мышью в точку, которую я смотрю» не прерывает мыслительный процесс «как бы отрефакторить этот класс», а вот вспоминание сложных клавиатурных команд — прерывает, у меня по крайней мере.
Например, когда я в командной строке что-то делаю с фалами, я устаю гораздо быстрее, чем когда использую mc или аналогичный менеджер, и половину времени трачу на просмотр вывода ls (или списка файлов после нажатия Tab). Возможно, конечно, я плохо знаю командную строку.
А вот что меня раздражает в некоторых ява-ИДЕ, так это 1) когда слишком много всплывающих подсказок включено (причем они еще и появляются и исчезают с огромной задержкой) и они отвлекают и 2) когда ИДЕ подвисает на секунду-две в ходе набора кода и я начинаю думать, это я клавишу не нажал или комп тупит, и опять же отвлекаюсь от задачи. По этой причине, например, я не смог нормально пользоваться eclipse. Ну и плюс в ней по умолчанию 100500 кнопок и окошек, они мешаются, а настраивать их расположение мне лень.
>>315292
> вспоминание сложных клавиатурных команд — прерывает
Щас он скажет, что у него всё на рефлексах и мышечной памяти. Это же поехавший фанатик, он себя заставил верить в то, что это круто и пацаны уважают, а кто не пердолится с консолью - тот лох и опущенец
>>315292
> вспоминание сложных клавиатурных команд
Кокой бред. Во-первых, они не сложные. Во-вторых, там нечего вспоминать, потому что их не много.
>>315287
> Они не "нестандартные", а эргономичные и удобные (это я про вим)
Никто не начинает знакомство с компьютера с вимом. Уже лет 15 все юные пользователи начинают с блокнота, ворда, екселя и для всех этих сотен миллионов пользователей C-C и выделение мышью — самое родное сочетанияе. А загадочные вимовские комбинации родные только для бородатых отцов-основателей линукса (потому, что такие комбинации клавиш использовались на древнем мейнфрейме в их университете, на котором не было ни мыши-утюга, ни стрелок на клавиатуре, ни кнопок управления плеером). И теперь объясни, почему все современные разработчики должны переучиваться на команды и жесты времен молодости Ритчи и Кернигана?
> Пользователям вима не надо тянуться к мышке для перехода на 2 строки ниже, вообще ни для чего не нужно тянуться к мышке.
А если надо перейти на 15 строк вверх и 12 позиций вправо? Что дольше, считать эти строки и набирать команды, или ткнуть хорошей чувствительной оптической мышью в нужную точку?
И я написал выже, важно не только сколько ты секунд потратил на перемещение курсора, но и сколько процентов своей мозговой деятельности, и насколько отвлекся от нити своих размышлений.
>>315290
Разве ctags — это не внешняя команда, которую надо вызывать, и которая переиндексирует проект с нуля, без инкрементальных изменений?
>>315288
Потому, что большую часть времени я трачу не на перемещение курсора, а на придумывание, как написать аккуратный и правильно работающий код и на набор этого кода. Сэкономив несколько секунд на перемещении курсора, я ничего не выиграю, а вот время на изучение затрачу.
>>315297
Это не отвечает на вопрос, почему я в одной программе выделяю и копирую текст одной кнопкой, а ради vim должен запоминать другую, и еще помнить в какой программе я нахожусь (я например иногда пытаюсь сохранить набираемый в браузере комментарий через Ctrl + S и это не потому, что я тупой, а потому что плохо продуманный интерфейс).
>>315299
> Что дольше, считать эти строки и набирать команды, или ткнуть хорошей чувствительной оптической мышью в нужную точку?
>ткнуть хорошей чувствительной оптической мышью в нужную точку
Вот это.
Потому что считать ничего не надо. Есть поиск, и обычно достаточно набрать первые 2-4 символа.
>>315304
Все уже поняли, что ты тупой и не можешь изучать новое, даже если это принесет выгоду. Можешь не продолжать.
>>315305
Так кликнуть в точку которую видишь, требует меньше нагрузки на мозг (по крайней мере у меня), чем решить задачу, что надо набрать в поиске, чтобы перейти именно в это место, а не в какое-то другое. Я с ума сойду, если надо будет целый день так делать.
>>315307
Ты меня тролишь что-ли? У тебя большая нагрузка на мозг, когда нужно набрать / + <первые 2 символа того, куда надо перейти> + Enter ?
Алсо, смотри видео http://youtu.be/Dmv6-dguS3g?t=1m32s
>>315308
Если я наберу первые 2 символа переменной, то у меня легко выделится 30 строчек сразу (и хорошо есть только 30). И я должен теперь думать, что еще набрать, чтобы попасть на нужную.
>>315308
И эта же фича, поиск по мере набора, есть во всех современных редакторах если уж на то пошло. Sublime например по мере набора рамочкой обводит подходящие буквы.
>>315308
Хуита видео. Поиграться пару раз и забыть, слишком много нужно делать ради такого простого действия
>>315311
Что сложного, дебил? Может ты расскажешь как проще? inb4 мышка
>>315312
Проще выебать мамашу глупого перокурсника с желанием быть не таким как все
>>315312
Ну если сравнивать с саблаймом, то
cmd-F → два символа → cmd-G свитчишься между найденными совпадениями
без всяких переключений режимов и дополнительных плагинов.
PhpStorm охуенен. Меня все больше начинает мучать совесть, что использую без лицензии.
С первой же з\п обязательно куплю лицензию.
>>315307
Сколько у тебя рук и сколько из них ты держишь на клавиатуре при наборе?
>>313971
Доброкун, решаю новую ООП-задачку.
Думал, что знаю его хоть сколько-нибудь, оказалось, гусь там.
Посмотри заготовочку, будь любезен: http://ideone.com/I5D778
Дай советов, подсказок. Боюсь я дальше писать, вдруг все совсем неправильно.
Кстати, не увидал я цену за литр кофе, чтобы посчитать тугрикостраницы.
>>315550
В общем, ты двигаешься в правильном направлении, но немного перемудрил.
Вместо хитрых вычислений salaryRate в конструкторе, лучше просто хранить информацию о работнике: ранг, базовая ставка (в зависимости от профессии), позиция (руководитель или сотрудник). А зарплату не хранить, а вычислять в функции getSalary() из этих данных. Почему? 1) так код будет проще 2) если например мы повышаем ранг, то достаточно поменять одну цифру, а не пересчитывать все
Базовая ставка (сколько получает сотрудник 1-го ранга) постоянна для каждой профессии, значит ее можно определить как свойство в классе:
class Manger
{
protected $baseSalaryRate = 500; // или сколько там получает менеджер
Ну и естественно, надо дописать функции для получения информации о работнике: getSalary(), getCoffeeConsumption(), getPageProduction(). Эти функции как раз и будут содержать логику, которая описана в условиях задачи (то есть учитывать ранг, должность и прочее).
> Кстати, не увидал я цену за литр кофе, чтобы посчитать тугрикостраницы.
Кофе не учитывается при расчете тугрикосстраниц, так устроена бухгалтерия в ООО Вектор.
Алсо, напомню, это задача с меняющимися правилами. Это значит, что решив задачу, ты получаешь новый набор условий и правил, которые надо добавить, и таким образом мы проверяем гибкость кода и способность изменяться под меняющиеся требования.
Доброкун, как во второй функции грамотно разбить эксплойдом предложение? У меня такая лажа выходит:
http://ideone.com/St5FnS
>>315552
Проверь теперь, пожалуйста: http://ideone.com/kUeZAH .
Теперь надо Department запиливать. В конструктор передавать имя раздела? А как функцию addEmployees() сделать? Не могу сообразить. Как понимаю, в нее надо передавать название класса сотрудника (профессии то бишь),
его ранг, позицию и количество таких сотрудников, но как вызывать конструктор нужного класса в зависимости от имени класса, переданного в функцию? Кейсы городить? Наставь на путь истинный и все такое.
>>315661
Уже лучше, но по-прежнему требует доработок. Вот советы и замечания:
> if ($this->rank==Employee::SECOND_RANK){$this->salaryRate=1.25;}
Не экономь место и пиши в 3 строчки, как положено:
if ($this->rank==Employee::SECOND_RANK) {
$this->salaryRate=1.25;
} else {
>>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
>>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(...){...}
}
>>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;
Так будет короче и нагляднее.
>>315684
Кстати, отдельно поясню вот эту мою мысль:
> Мы не храним зарплату в полях объекта, а рассчитываем ее при вызове getSalary().
Хранить в полях объекта нужно именно исходные данные: ранг, должность, базовая ставка. А производные от них числа, вроде итоговой зарплаты, хранить не надо. Почему? Потому что если их хранить, то мы не должны забывать их пересчитывать например при повышении ранга или при смене должности, и в больших объектах с кучей свойств это геморройно. Ну и не хранить проще, чем хранить.
То есть, если у нас например есть объект прямоугольник со свойствами ширина и высота, то «площадь» хранить в нем не надо, так как ее всегда легко вычислить, умножив ширину на высоту. Так же и у нас, зарплата рассчиытвается из данных о сотруднике, хранить ее не надо. Вот если мы введем индивидуальные зарплаты (кто сколько смог выжать на собеседовании), то тогда надо будет хранить, а пока не надо.
В общем, не надо хранить в объекте то, что можно всегда легко посчитать заново.
>>315694
Как-то так: http://ideone.com/kUeZAH .
Не знаю, с чего начать с департаментами. Глуповат. Не пойму, как хранить какое количество сотрудников какого ранка и какой профессии работает в каждом из департаментов. Инкременты в addEmployees(), но их же куча для каждого департамента. А что будет, когда мы добавим еще и по паре ясновидящих в каждый департамент?
Наводочку, доброкун, наводочку, пожалуйста.
>>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.
>>315705
http://ideone.com/kUeZAH
Назначать руководителем надо не случайного работника, а конкретного. Значит, нужен уникальный идентификатор для каждого из сотрудников. Или есть другой способ, "как все делают"?
Почему-то не добавляется несколько сотрудников (линии 119-120): должно быть три аналитика первого ранга и два -- второго. На деле же, два аналитика первого ранга и один -- второго. В причине не разобрался, пошел спать.
Жду замечаний, подсказок, спасибо.
>>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 не должны менять поля объекта. Замени их на переменные.
<?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();
}
?>
>>315754
>error_reporting(-1);
Каково это - быть петухом опущенным?
Суп, анончики. Есть случайная картинка, которая выводится с помощью <имг срк="ляляля/<?php echo(rand(1,5)); ?>.jpg">. Мне надо, чтобы она показывалась через 20 секунд после загрузки страницы. Как это сделать? Нагуглил sleep(); но прикрутить не смог. Разжуйте, пожалуйста, а я вам черепашку дам.
>>315865 Не могу таймер прикрутить, почему и пришел сюда.
Скучал по треду! Наша пхп-борда на MVC тихонько умирает, гит меня уже совсем не слушает https://github.com/serrufAAA/HelloWorld , но зато я перебрался в миллионник и здесь есть не иллюзорная возможность попробовать устроиться куда-нить макакой. Застрял на пагинации, профайлер так и не сделал. Не могу придумать как к своей MVC прикрутить норм пагинацию.
>>315870
С гитом сразу же разобрался https://github.com/serrufAAA/HelloWorld живительное действие треда, не иначе!
>>315710
Ох, как же я скучал за харкачиком.
Доброкун, принимай, наконец: http://ideone.com/kUeZAH
Новый интерфейс ideone так себе, кстати.
Ну что, выборы прошли, можно продолжать изучать 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(...);
>>315870
И кстати, раз ты собираешься искать работу, тебе бы как раз стоило бы посвятить свободное время как можно более плотному изучению PHP и сопутствующих технологий. Не помешает.
>>315870
«Баги» с гитом скорее всего были из-за того, что ты напутал с ветками: https://github.com/serrufAAA/HelloWorld/network — тут тут зачем-то создал вторую ветку и видимо запутался с ними.
>>315940
А как передавать номер страницы? Я пробовал через массив GET, но в результате у меня получилась какая-то каша. Нужно наверное как-то изменить действие Index контроллера Main
>>316017
У тебя там есть:
if(isset($_GET['id'])){
$page=$_GET['id'];
}
Используй только лучше пареметр page или p, но не id (так как id это все же немного другое, нелогично получается).
Советы и замечания по коду. Всякие мелочи, сам код в общем выглядит правильно.
— Из-за того, что в файлах смесь табов и пробелов, код тяжело читать: 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, ну и нам всегда может захотеться поиграться с разными вариантами.
Ситуация сейчас какая-то неясная, так что хочу на всякий случай напомнить, что даже в то время, когда наш уютный тредик недоступен, вы все равно можете продолжать решать задачки и изучать PHP.
У меня есть почта , она написана внизу на моем сайте, если у вас есть какие-то вопросы, можно писать туда.
А то неделю пробездельничали, нехорошо.
>>316018
С этим как раз запара. У меня нельзя просто так добавить к адресу ?, особенно на главной странице, т.к. там не указывается контроллер и действие, а если что-то указывать, роутер думает что это контроллер. Я просто писал "./Main/Index/page?p=<?=$i?>", но это тупо, потому что во-первых первая страница тогда отличается от остальных, во-вторых эта шляпа всегда прибавляется к адресу, и потом получается /Main/Index//Main/Index/page?p=2, ну и ясное дело что тут css отпадает. Нужно наверное чтобы /Main/Index/ всегда добавлялось к адресной строке.
>>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 а то твой автозагрузчик наверно не сможет его загрузить.
Котаны, какого хуя тут заебись: http://rubular.com/r/r5xbOotAdQ
а тут хуйня: http://ideone.com/MEJYIx
Ага, ну понятно, модификатор для мультистрок "m" как раз здесь бесполезен, а dota2ll "s" именно то что мне нужно. Биг спс разрабы за интуитивность.
>>316199
На ideone не прописан флаг s. Без s точка не матчит символ новой строки.
>>316236
Ой, я слоупок, ты уже разобрался. m влияет только на поведение ^ и $
>>316241
Слух, а ты в рекурсивных регулярках понимаешь?
Вот есть такой текст:
(P
abc
azc
anc
)
(L
atc
ayc
aqc
)
Нужно захватить: P, L, и все что между а и с. Реально это одной регуляркой?
>>316243 точнее даже такой текст:
(P>
abc
azc
anc
)
(L>
atc
ayc
aqc
)
Сделал такую: (?:\((.?)>|a(.?)c)
Работает, но массив кривой получается, все в перемешку свалено, если б как то сгруппировать, чтоб:
P, b, z, n отдельно а L, t, y, q отдельно.
Анон, подскажи по гиту.
Есть один репо, он не мой.
Я его себе скачал git clone.
Теперь я поправил некоторые скрипты, мне нужно их показать в репозитории, но так чтобы изменения не затронули репо.
>>316055
>Значит это баг, который надо исправить. Уверен, что у тебя более чем достаточно знаний для этого
Действительно, элементарщина какая-то. Поправил, все работает, даже css не отваливается. Я просто думал в другом направлении, хотел чтобы контроллер и действие всегда выводились в адресную строку, править url для роутера почему-то в голову не приходило.
http://wallbase.cc/
Видали кокой смачный ввод в поисковую строку? Как такое забабахать? За счет чего такая свистоперделка сделана? Я тред-релейтеды не изучаю, просто стало интересно.
>>316322
Правильный вопрос: стоит ли писать борду на пыхе? Нет.
>>316322
Один аноним-кун уже пишет: https://github.com/serrufAAA/HelloWorld/
Также, в одном из первых тредов был Котоба-кун с бордой на PHP (но код там конечно требует доработки и рефакторинга).
>>316342
Самое главное и не сказал. Футаба и кусаба на пхп написаны.
мимопроходил
>>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
>>316243
Скорее всего нереально. То есть, если у тебя есть регулярка /a((\d)+)c/ и текст
a123567c
То ты ей не можешь захватить каждую цифру отдельно в свою группу — только все цифры сразу.
>>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>
Вводишь это в Гугл.
Алсо, меня не впечатлило. По мне, так ненужное украшение.
>>316292
Алсо, не могу не удивиться, какие разработчики ленивые. Все, что они умеют, скачать поставить готовый плагин, а свой более лучший и оригинальный написать слабо что ли?
>>316365
Нахуя велосипед, когда он уже есть и ездить умеет?
>>316365 это ты виноват. Когда есть место где задать вопрос, мозг отказывается работать.
>>316375
Я тут подумал, можно было сделать проще. Можно было просто пройтись по используемым там JS-скриптам и посмотреть в них комментарии — обычно там всегда указано название и автор плагина. Так что в следующий раз можешь не заморачиваться со всеми этими инспекторами, а тупо просмотреть бегло исходники JS-скриптов и получишь список плагинов.
Опец, а ты так, просто любитель, или бабки таки на этом делаешь - фрилансишь?
Привет оп.
Где можно посмотреть возможности 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'ом приходилось работать? Как он тебе?
>>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;
>>316383
> Ты всё еще на php пишешь или больше по js?
На обоих.
> C asp'ом приходилось работать? Как он тебе?
Не приходилось, но знаю, что есть просто ASP который по сути треш и похож на PHP4, только использует Basic со всеми его минусами, и есть ASP.NET MVC, который более годный и современный.
>>316390
Долго учился до своей первой з/п? Олсо, не знаешь, если без айтишного образования, но с техническим в/о, поднатореть, припереться в какую-нибудь конторку в ДС и попроситься макакой - взять могут? Или для них критично, чтоб корочки и всё такое-прочее и всяким фрилансерам-самоучкам дорога заказана(?)
Может не только ОП, но еще кто имеет что сказать по этому поводу?
>>316391
Где импрувнутая версия задачки с департаментами? У меня тут ООП дымится.
>>316392
В первую компанию пришел работать студентом с знанием основ PHP, ООП, MySQL и HTML/CSS. HTML учил в школьные годы, PHP/MySQL в универе. Про Хабр (и про борды) тогда не знал, что лучше изучать и какие языки востребованы не знал, программистом становиться не хотел, так как надо сидеть весь день за компом и пялиться в экран, не круто, девушек этим не впечатлишь. Оказалось впрочем, не так и плохо, сидишь в тепле, читаешь хабр, пишешь код не спеша.
> Олсо, не знаешь, если без айтишного образования, но с техническим в/о, поднатореть, припереться в какую-нибудь конторку в ДС и попроситься макакой - взять могут
В ДС — возьмут, если на вопросы сможешь ответить и тестовое задание выполнить или портфолио показать. Айтишного в/о (матфак?) много у кого нет, это вообще мало что значит.
> Или для них критично, чтоб корочки
Критично знания и практические навыки. Корочки нужны разве только что в госучреждениях и не-айтишных корпорациях. тебе там вряд ли самому захочется работать.
Открой hantim.ru или hh.ru, почитай требования к вакансиям, я что-то не вижу там требований к диплому, зато вижу список технологий и языков программирования. Кстати, в Москве есть вакансии стажеров, там вообще требования минимальные.
>>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 часа
№ Занятость в проектах Всего, ч. Кофе Тугриков Загрузка
00001 №1 (4ч.), №3 (6ч.) 10 13 140 7%
00002 0 0 0 0%
00003 №5 (8ч.) 8 20 120 8%
http://pastebin.com/vGnUPFQ4
В js это основные эмуляции ооп или есть еще какие?
>>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 и корректно сохранять стектрейс. По моему, это вообще кроссбраузерно сделать невозможно.
>>316415
Также есть библиотеки
https://github.com/ded/klass
https://github.com/dotnetwise/Javascript-FastClass
есть любимый рубистами Coffeescript и TypeScript от майкрософт (яваскрипт со строгой типизацией).
>>316024
>сделать свой класс-наследник PDO переопределив нужные методы (те, которые делают запросы)
Хм. Тересна. Получается нужно перегрузить какие-то методы так, чтобы они записывали свои запросы и еще запускали таймеры, так чтоли? Пока вообще не представляю как это сделать, но пойду ковырять.
>>316514
да ничего там не надо перегружать
по сути это иломорфизм с парочкой эндофункторов
>>316514
Ты можешь унаследоваться например от класса PDOStatement, и написать в наследнике примерно так:
public function execute(...) {
// засекаем время
$start = microtime(true);
$result = parent::execute(....);
$end = microtime(true);
// сохраняем запрос и результат
if ($this->profiler){
$this->profiler->logQuery(....);
}
return $result;
}
Таким образом, мы меряем время выполнения PDOStatement::execute(). То есть в классе наследнике можно все нужные функции так обернуть.
>>316594
Доброкунчик, не пиши мне пока пожалуйста готовый код, я хочу сам. Объясни лучше на словах. Мне же все равно нужно сделать наследника PDO, в нем перегрузить например PDO::prepare() так чтобы он возвращал не просто PDOStatement, а мой класс, унаследованный от PDOStatement?
>>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/
>>316617
Алсо, если у тебя затруднения с придумыванием названий классов, подсказываю:
Db_Adapter для наследника PDO
Db_Statement для наследника PDOStatement
Но вообще, я подумал, отсутсвие поддержки профайлера это конечно недостаток проектирования PDO. Жаль, что в нем не предусмотрели такую возможность сразу.
>>316617
Ах да, еще хотел тебе дать эту ссылку http://framework.zend.com/manual/1.12/ru/zend.db.adapter.html
Это класс для работы с Бд в ZF. Если есть время, можешь почитать, чтобы знать как в фреймворках это делается.
>>313971
Стоит ли обращать внимание на особенности вёрстки под ie6-7 или похуй на этот мусор?
>>316630
> похуй на этот мусор
В 99% случаев. Если только заказчик не доебется.
Помогите, почему не работает? Точнее почему не шлет на мою почту ничего?
(отправляю с хостинга конечно)
http://anonymousdelivers.us/66113
Доброкунчик, глянь сюда https://github.com/serrufAAA/HelloWorld Я накидал примерно то, что будет профайлером, нужно его еще как-то с конфигом увязать, скажи что думаешь, но не подсказывай пока про конфиг. Давай с профайлером вначале решим, хотя бы логически, а потом я остальную мелочь буду подбирать, ок?
А, я че спросить-то хотел. По поводу вывода таблицы с отчетом. У меня же на страницах добавление поста и треда есть заголовки, так что там выводить незя. Нужно ли накапливать все действия совершаемые с базой, а потом все разом выводить или как? Вот это мне не ясно. Еще хотел историю рассказать: кароче вчера весь день не мог собраться с мыслями и начать писать, а потом перед сном, уже заполночь, за 1 час взял и написал код. Пхп
это прямо какая-то лунная технология.
Доброкун, скажи а как должен выключаться профайлер: мы просто убираем вывод информации, или отключаем весь его функционал?
>>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/ говорит, что неизвестная функция, но браузер такого не выводит, а выводит вышеуказанное. Няшу авансом.
Что за ерунда, капча постоянно исчезает. Что за кривокодеры ее прикручивали?
>>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% состоял весь интернет.
Примерно в то же время команда ИЕ и придумала использовать доктайп — чтобы отличать сверстанные по стандартам страницы от сверстанных как придется.
Ой, что-то я много написал. Ну может, кому будет полезно почитать.
>>316669
Пожалуйста, выкладывай код на ideone, pastebin, gist.github.com или куда-то еще, где его можно прочитать сразу, а не скачивать непонятные архивы, распаковывать, открывать редактором, и тебе неудобно, и нам неудобно.
Теперь по поводу почты. Во-первых, ты сделал большую глупость поставив @ перед mail (так как @ скрывает ошибки). Может, в сообщении об ошибке как раз написано что-то полезное, а ты его отключаешь. И вообще, никогда не используй @. Также, поставь в начале скрипта error_reporting(-1); и ini_set('display_errors', 'On'); (чтобы включить вывод ошибок в браузер, не забудь потом отключить назад).
Теперь еще про другие причины. Важно, где ты запускаешь код: на своем компьютере, на shared hosting или на VPS.
Если ты используешь бесплатный хостинг, то почта там может быть отключена (чтобы не рассылали спам). Читай подробнее в их FAQ или на их форуме. Если платный, то функция mail должна работать по умолчанию и ты имеешь полное право жаловаться, если она не работает: пусть чинят. Только сначала протестируй без @, чтобы убедиться что никаких сообщений об ошибке нет.
Если же речь о VPS (сервер который ты сам администрируешь), то конечно ты сначала должен на нем настроить почту и запустить почтового демона. Но я думаю, это не твой случай, наверно ты исползуешь обычный хостинг.
>>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
Ну вот, он делает вкл/выкл https://github.com/serrufAAA/HelloWorld решение простое, в лоб.
Ой, сишники !
Есть простая задача, решать максимум минут 30, кода на 7 строчек, за идеальное решение платят 500 долларов. Немного, конечно, но хватит например на тортик к чаю, новый чехол к айпаду и пару раз заправить машину. Не хотите попробовать свои силы?
http://habrahabr.ru/post/193308/
http://thecodeil.com/
Плачу не я, я просто объяву разместил. Я бы сам попробовал решить, но сегодня времени нет.
>>316699
Алсо там есть пункт в условии:
> Если вы передадите задачу тому, кто сможет ее решить, вы оба получите по 500 долларов.
Не забудьте про меня, няши, если получите приз. Я тоже от тортика не откажусь.
>>316683
Лучше отключать целиком, чтобы код не выполнялся, класс профайлера не подгружался. Зачем делать лишнее?
Счас, разберу твой код и скажу конкретнее.
>>316701
Тю! Дак нужно было отдельным классом чтоли делать?
>>316702
Удали его и воспользуйся нормальным профайлером если есть необходимость.
>>316697
Помогло, премного благодарен.
>>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.
>>316702
Так же, я заметил, что ты там подставляешь значения плейсхолдеров в запрос. Но я тут подумал, иногда нам нужен именно сам запрос в исходном виде, вроде SELECT * FROM x WHERE id = :id, например для сбора статистики. Я думаю, подставлять плейсхолдеры или нет, надо хранить отдельной опцией в конфиге, чтобы можно было выбирать.
>>316708
А как я сделал в последней версии это не прокатит? В смысле какие слабости у моего решения?
>>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.
>>316676
> Еще хотел историю рассказать: кароче вчера весь день не мог собраться с мыслями и начать писать, а потом перед сном, уже заполночь, за 1 час взял и написал код.
У меня бывает так же, только сроки неделя и день.
> Нужно ли накапливать все действия совершаемые с базой, а потом все разом выводить или как?
Накапливать, выводить в самом-самом конце. Можно вызов вывода лога вписать куда-нибудь (куда? в конец Router? в bootstrap?) где он гарантированно вызовется после всего остального.
Теперь советы по коду. Пока я за ним не следил, в нем появилась куча странных вещей.
— В будущем надо что-то делать с именами классов. Я уже смотреть не могу на эти 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 я тут не пишу, а даю возможность тебе спроектировать и написать его самому.
Что не так с моим регулярным выражением?
/?(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
>>316765
Странный знак вопроса в самом начале.
Кстати, для разбора регулярок можно использовать сайты вроде описанного тут: http://habrahabr.ru/post/192920/
Там ошибка сразу будет видна и подсвечена красным (правда там бекслеш надо писать один раз, а не 2)
>>316765
Если убрать знаки вопросов, то ошибки нету. ШТА? Что я делаю не правильно?
>>316697
А ежели надобно комбинировать html и php-образные изображения?
>>316777
Ставишьв HTML ссылку вида <img src="graph.php"> чтобы изображение генерировалось отдельным запросом. Или кодируешь в data url но это не во всех браузерах работает.
>>316777
Это называется не php-образные, а сгенерированные изображения.
>>316769
Я же написал, ошибка в вопросе в самом начале. Зачем он там?
>>316769
А, понял. Квантификаторы (вроде знака вопроса) надо ставить не до скобок, а после.
Анон у меня какой-то странный трабл. Скрипт ставит 2 вида кук в зависимости от адресса в браузере. с www и без www.
1. Как жетско прописать куки с www.
2. Как сделать так, что бы при пехеоде на сайт без www, читалась кука c www
Кароч, как правильно прописывать хост куки
>>316808
> у меня какой-то странный трабл.
Это не трабл, а правильное поведение.
Начнем с правильного решения: мне показалось, что у вас каждая страница сайта имеет фактически 2 адреса:
www.example.com/page
example.com/page
По которым находится одна и та же информация. Это плохо, не только с точки зрения кук. В таком случае надо просто сделать редирект 301 с одного из доменов, чтобы адрес у каждой страницы был ровно один.
Теперь вернемся к неправильному пути. При выставлении куки, по моему, можно указать домен без www но с точкой в начале: .example.com Но я не уверен. Тебе надо почитать правила разрешения имени домена у кук, так как браузеры могут не принять такую куку или не отдать или не разрешить ее ставить с субдомена. И, конечно, тщательно все протестировать.
Но лучше бы сделать редирект.
>>316818
А как сделать редирект то?
В папке у меня один домен, делать редирект в htaccess? Подскажи примерно как?
>>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
if(preg_match('/^www/' ,$_SERVER['HTTP_HOST']) == false) header("Location: http://www.".$_SERVER['HTTP_HOST']);
Сделал так, норм или лучше через аксес?
>>316830
А не, почему-то в этом случае кука совсем слеатет, сранно
>>316830
Лучше через htaccess, там всего несколько строчек
Плюс, ты редирект сделал на тройку с минусом: пользователь пришел на конкретную страницу, а ты его на главную перекидываешь.
>>316831
Ты после установки редиректв куки все почисти и заново тестируй.
>>316782
А. Спасибо! Теперь работает.
Кстати, почему в результатах ссылки с одним слешем?
А не, мой отработал норм.
Как ты думаешь ,что вернее оставить мой или сделать через аккесс? Мой получается независимым от имени домена, можно смело переносить на другой и он буд работать, скрипт описан в контроллере готорый срабатывает перед формированием финального вывода
>>316836
Троечник ты потому что. Во-первых, выучи пикрелейтед. Во-вторых, в php с бекслеша начинаются экранирующие последовательности. Например,
\" — вставляет в строку кавычку
\n — вставляет перевод строки
\x40 — вставляет байт с кодом 40 hex
\\ — вставляет бекслеш
Что бы вставить \\ надо писать \\\\. Обрати внимание, это относится только к бекслешу \ , с прямым слешем / все нормально.
>>316837
Лучше бы в htaccess, так как в этом случае PHP даже не вызывается. А у тебя странно, скрипт запустился, сделал часть работы а потом внезапно куда-то редиректит.
в хтаксесс 500 ощибку выдает зараза, у меня и так там перенаправление на индекс.пхп стоит, сейчас еще погуглю
ааа, надор было перед перенаправлением на индекс поставить, терь все норм, спасибо анон
>>316839
Ой точно точно... Я совсем забыл про это. Спасибо тебе, Анон. Ты просто чудо!
>>313971
http://ideone.com/nm1ukA
Как школьнику не переплачивать не понимат. Столько голову ломаю.
>>316863
Над этой задачей все голову ломают. Причина вот в этой строчке:
$balanceCredit = ($balanceCredit * $percent) + $comesis - $month;
Ты выплачиваешь 5000 независимо от того сколько должен, может осталось всего 1000 а школьник все равно платит 5000 и получается платит больше, чем надо. Надо переделать эту строчку, чтобы она только увеличивала долг, без выплаты. А дальше уже смотреть чему равен долг и выплачивать.
Также, надо переименовать одну из переменных $month или $month1, так как они слишком похожи по названию. Также, надо исправить имя переменной:
PHP Notice: Undefined variable: comesis in /home/5BTgEa/prog.php on line 12
Последний вопрос который мне не понятен: Почему
>(\\.)([a-zA-Z]+)
игнорируется в этих случаях?
>>316873
Добавь третий параметр к preg_match и выводи его:
if (preg_match($regexp, $link, $m)) {
var_dump($m);
}
Тогад ты увидишь что захватили каждые скобки. Так трудно сказать.
>>316753
Хм, я тут подумал, а не переключится ли мне временно на javascript? Полистал объявы по городу в котором очутился, везде основы пхп мускл хтмл ксс и жаваскрипт. ДК, ты же опытный, скажи реально совмещать работу и, ну если не учебу, то хотя бы посещение ВУЗа. Мне в нем предстоит заниматься около-научными изысканиями.
>>316885
JS конечно знать полезно, но и на PHP не стоит забивать. Тем более что нам надо еще разобраться с SQl-запросами, которые ты там понаписал и проверить насколько они хороши.
> скажи реально совмещать работу и, ну если не учебу, то хотя бы посещение ВУЗа
Реально, но сложно. Бывает вариант, работать полдня, бывает вариант, в какие-то дни учишься, в какие-то работаешь, бывает вариант отпуск во время сессии. Если вакансия для стажера, то скорее всего там понимающе отнесутся, если для программиста, то не факт. В общем, надо искать, писать, звонить, спрашивать.
>>316889
>надо искать, писать, звонить, спрашивать
Это понятно. Увы город не такой уж большой. У вас там в столицах наверное с этим проще.
>проверить насколько они хороши
Время на исполнение уже видно. Кстати, подсчет с помощью COUNT(*) почему-то занимает чуточку больше времени, чем мой первоначальный вариант.
>>316864
http://ideone.com/nm1ukA
Я иду не в том направлении?
>>316876
Ясно в чем проблема.
www.google
www - распознается как адреc
. - как точка перед доменной зоной.
google - как адрес доменной зоны.
/(http:\\/\\/ | https:\\/\\/)?(www\\.)?([a-zA-Z0-9.-]+)(\\.)([a-zA-Z]+)/
>>316891
> Кстати, подсчет с помощью COUNT(*) почему-то занимает чуточку больше времени, чем мой первоначальный вариант.
Это явно какая-то ошибка. Вернуть одно число проще, чем вернуть несколько рядов данных и создать из них несколько объектов.
>>316902
Да в том, но эту программу надо еще дорабатывать, она пока что не работает.
>>316915
Тебе будет полезно еще погуглить про жадные и нежадные квантификаторы. Жадные — это которые стремятся захватить как можно букв, а нежадные — как можно меньше. Может, это как-то поможет.
Кстати, для разбора URL на части есть готовая функция parse_url, может лучше ее исподьзовать?
>>316922
>Кстати, для разбора URL на части есть готовая функция parse_url, может лучше ее исподьзовать?
Мне не нужно разбирать урл. Мне нужно только чтобы он нормально распознавал её. Или это одно и тоже?
>Тебе будет полезно еще погуглить про жадные и нежадные квантификаторы. Жадные — это которые стремятся захватить как можно букв, а нежадные — как можно меньше. Может, это как-то поможет.
Завтра разберусь с этим. Сейчас я слишком устал и иду спать. Добра тебе, анон.
>>316922
>Да в том, но эту программу надо еще дорабатывать, она пока что не работает.
Да я уж вижу, лол.
Спасибо няша, еще подумаю :3
>>316922
Анон! Все безысходно! Помоги мне! Мне нужно было сделать
>(www\\.)?
ревнивым (сверхжадным) квантификатором. Я сделала его таким как было показано на википедии
>(www\\.)?+
Но он не работает: Почему-то он вообще теряет одну "w" из ссылки и делает как раньше.
/(http:\\/\\/ | https:\\/\\/)?(www\\.)?+([a-zA-Z0-9.-]+)(\\.)([a-zA-Z]+)/
Доброкун, подкинь простых задач на JS, если возможно, таких, чтобы можно было в борду повтыкать.
>>317194
> сделала
ТИТС ОР ГТФО!
> Почему-то он вообще теряет
Странно что вообще работает. Зачем у тебя обратные слеши везде по две штуки вписаны?
> True
> Else
Ок.
>>317194
Сверхжадный квантификатор используют только для ускорения выражений, но взамен он может работать не так, как хочется. Не стоит его использовать вообще. Тем более начинающим.
Теперь про регулярку. У тебя она не привязана к началу и концу строки, а это значит, что она вполне имеет право матчить только часть строки. Стоит почитать про ^ и $
Также, там есть пробел после http, он точно нужен?
>>317195
Простых не могу сообразить, давай начнем со средней сложности. Сделай автокомплит для ввода адреса. По мере ввода адрес отображается на карте. Можно использовать API Яндекс-карт или любое другое.
Или это слишком сложно и надо попроще? Я в принципе подсказать что-то готов.
Для борды задания будут попроще, вроде сделать раскрытие тредов, сделать автообновление или сделать аяксовую форму комментирования. Но может тебе интереснее с картой помучаться.
>>317224
Хм. Тересна. Для этого нужно наверное хорошенько читкануть API Яндекс-карт. Я просто не знаю ни JS, ни API Яндекс-карт. Пойду почитаю, но, так сказать, не отказался бы от задачи попроще.
>>317224
Пажи, доброкун, ты же кидал какие-то задачи на JS и CSS, точно помню, только вот где и когда это было...
>>317234
Что касается Яндекс-API.
Для поиска адреса по началу у них есть готовая функция. То есть, ты даешь ей первые буквы, а она возвращает варианты адресов. Не надо самому писать это.
Для отображения маркера на карте в заданных координатах у них тоже есть готовые методы, надо просто их найти и использовать. Ну а координаты можно найти геокодером (который тоже уже встроен).
Так что реально тут писать самому надо только выпадающий список, работа с картой делается через готовую библиотеку.
>>317242
Опаньки! Вот маркер-то меня больше всего беспокоил. Круто, подписываюсь. Схожу на пары и буду делать.
>>317241
Что за задача-то? Я не помню.
Ну если не хочешь карты, могу придумать еще такие задачи:
— Пользователь выбирает или перетаскивает картинку, программа рисует поверх нее красивый падающий снег
— Сделать простую игру вроде такой, когда внизу твой космический корабль, а сверху толпами валят всякие пришельцы и надо их уничтожать
— Сделать красивый фейерверк
— Сделать программу, ты перетаскиваешь картинку, и добавляешь поверх нее надписи как в графическом редакторе
— Сделать программу, которая имитирует катающиеся и сталкивающиеся бильярдные шары
>>317245
Ты потом почитай их API (только бери новый API, зачем старый изучать-то), там дофига готовых возможностей вплоть до того что можно например свои линии поверх карти рисовать и еще много чего. Там все уже написано, главное уметь пользоваться.
>>317199
Расслабься, я только лишнюю букву поставил.
>>317209
>Также, там есть пробел после http, он точно нужен?
Нет. Забыл, что пробелы тоже считаются. Ставил для наглядности.
>Теперь про регулярку. У тебя она не привязана к началу и концу строки, а это значит, что она вполне имеет право матчить только часть строки. Стоит почитать про ^ и $
Но регулярка у меня не должна быть привязана к началу или к концу строки. Неверное
>Стоит почитать про ^ и $
Прочел. http://php.net/manual/ru/regexp.reference.meta.php
Не совсем понял твоего напутствия. Зачем мне привязывать мою кривую кригулярочку к начало или концу строки?
>>317298
Если ты делаешь привязку к началу/концу строки то такой образец:
allala google.com lololo
не пройдет, preg_match вернет false, а если не делаешь — то пройдет, регулярка найдет google.com и вернет true.
Анон, есть два сайта на разных серверах, у каждого своя база. И нужно чтобы второй сайт брал инфу (некоторые поля) из базы первого. Как лучше всего это реализовать?
>>317604
На первом сделать скрипт, который будет отдавать нужные данные.
>>313971
Доброкун, который где-то год назад учил ньюфагов быть ПХП, это ты? Привет, я тебя помню! Я тебе показал свою вакабу, а ты сказал, что она хуйня и я больше не брался!
>>317672
Ты не котоба-кун случайно? Помню-помню. Жаль, что ты забросил рефакторинг. Тут, кстати, у нас в треде еще один анон делает борду.
>>317673
> рефакторинг
Я так до сих пор и не знаю, что это означает.
>>317691
это процесс усложения структуры приложения путём добавления шаблонов проектирования - Абстрактных Заводов, Фасолин, Холостяков и др.
>>317694
В смысле, кто-то хочет делать код лучше, но делает его еще более сложным и менее производительным? Тогда, зачем?
>>317707
ну программистам надо работать чтоб на что то жить. поэтому они создают себе проблемы чтобы их решать. притом щас так много программистов, их всех надо чем то занять!
вот для создания таких вот исскуственных проблем и были придуманы шаблоны проектирования и императивные ЯП.
>>317707
Рефакторинг — это наведение порядка в коде. Не стоит верить троллям, а стоит хотя бы почитать вики.
>>317712
Тем не менее, на шаблонах проектирования и императивных ЯП написано 99% десктопного и серверного софта.
>>317719
А еще программисты работают в таких огромных футуристических лабораториях, где всё белого цвета. В воздухе у них всё время летаю голограммы с зелёными нулями и единицами на чёрном фоне, они их всё время мацают руками, двигают вверх-вниз. Сами они при этом висят в воздухе, а по телепатической связи президент в мозг транслирует им сверхсекретные и особо важные задания. Друг с другом они общаются только при помощи специально оговоренных функций и только в двоичном коде. Ещё они могут силой мысли переустановить виндоус, заставить принтер работать или работать правильно, починить печаталку, создать почту, удалить баннер. Ещё если ты вдобавок ко всему хакер, то ты можешь вычислять адрес по ip, а ip - по сообщению в чате игры.
>>317719
Ну так оно и понятно. Только один процент людей способен писать музыку или книги, которые войдут в историю, доказывать новые теоремы и открывать физические законы, ставить спортивные рекорды или становиться великими политиками, ведущими за собой людей. Остальные большей частью только жрут и срут.
>>317735
он доказал что твоей мамаше в срачло вмещается трехлитровая банка петушатины
Объясните мне, зачем нужны функции, классы и объекты?
1.Ну, функция, ладно, понятно — чтобы посчитать разные значение по одной формуле, но я вот открою сорц лицокниги и там все — сплошные функции. Зачем?
2.Класс. Есть же массивы, многомерные массивы. Ну, да, круто вызывать класс со свойством, но ведь можно обойтись и вызовом переменной со свойством?
3.Объект. А он зачем? Ну, ладно, в каком-нибудь низкоуровневом языке — хранить байты, там, но а зачем он нужен в языке, где любое значение — строка, которая будет потом обработана как число, буль или строка?
Ведь если я напишу код без всего этого, который будет хорошо работать, но занимать в три раза больше места, то меня тут же сочтут ничтожеством, но, постойте, не на дискетах же этот код будет распространяться, к чему экономить место?
>>317779
На костер его, сжечь полоумного!
Про байты особенно доставило
>>317779
Функции, классы и объекты нужны для организации и разделения кода на отдельные слабосвязанные фрагменты. Это позволяет разрабатывать программы большего объема, командно, при этом минимизируя затраты на поддержку и расширение. Если не использовать классы, объекты и функции, то получается не код, а лапша.
Естественно, один человек пишет простую лабу на 50-100 строчек, то можно обойтись и без этого. Но реальные приложения легко могут содержать десятки, сотни тысяч и даже миллионы строк кода. И работает над ними не один человек, а большая команда специалистов. И тут нужны особые подходы и организация, чтобы продукт развивался, и чтобы люди не мешали друг другу, не создавали новые баги из-за непонимания, не ломали чужой код.
Потому в примышленном программировании повсеместно используется ООП. Код с ООП гораздо аккуратнее и логичнее, чем без. Практически любая вакансия содержит требование знать ООП.
Если тебе интересно, у меня есть несколько паст по теме и задачи на ООП.
Также, если у тебя есть какие-то еще вопросы по функциям и ООП, я могу постараться на них ответить.
> Ну, да, круто вызывать класс со свойством
По моему, ты путаешь класс и объект. Класс никто не вызывает, вызывают методы объекта.
> зачем он нужен в языке, где любое значение — строка, которая будет потом обработана как число, буль или строка?
Мне кажется, ты не очень хорошо понимаешь, о чем пишешь.
> Ведь если я напишу код без всего этого, который будет хорошо работать, но занимать в три раза больше места
А если ты не сможешь написать и получится плохо работающая лапша, в которой невозможно разобраться? Откуда у тебя такая уверенность? Я думаю, что ничего не получится.
Сосоны, а есть по жава-скрипту норм мануал, типа как php.net? Чтобы все структурировано, по полочкам.
Анончик, подскажи, курсы от Специалиста годные или Нахуй нужно?
>>317870
В php как раз таки начинающий, но лет пять тому назад ходил на курсы по паскалю, аж два года, лол. Сейчас имею дико громадное желание понять и выучить php, есть 10 часов в сутки на упырывание книг, видео курсов и собственно самого написания моего обезьянего кода. Посмотрел пару уроков на ютубе, и вот решил остановиться на Специалисте. Вопрос - что мне еще нужно помимо самого изучения php? Всякие книги по матану, алгоритмам, ООП, быть может Кнут? Подскажи доброкун, направь в нужную сторону, спасибо.
>>317875
10 часов — это хорошо. Ты можешь многого добиться, если не бросишь.
Видеокурсы можно посмотреть, но параллельно стоит читать официальный мануал по PHP ( php.net/manual/ru ). Он довольно понятный.
Потом будет нужен ООП. Например, книга
> PHP: объекты, шаблоны и методики программирования. Мэтт Зандстра
Нужно изучить какой-нибудь фреймворк, Yii или Zend Framework или Symfony. Мануалы на русском можно нагуглить.
Стоит почитать сайт phptherightway (погугли, не помню точный адрес).
Если у тебя будут вопросы, непонимание, желание порешать задачки или просто поговорить о PHP, ты всегда можешь зайти в наш уютный тредик.
Кнут и матан тебе не нужен, алгоритмы (пока) тоже.
>>317870
>learn.javascript.ru
Да ладно, сайт конечно хороший, но на качественный официальный мануал никак не тянет.
>>317922
Официального мануала по JS, такого как в PHP нет, так как движки яваскрипт делают несколько производителей. Но есть официальный стандарт. Он называется ECMA 262 (ECMAScript). Официальный стандарт можно нагуглить на английском, русский перевод одной из старых версий тут http://javascript.ru/ecma
Яваскрипт бывает еще и разных версий, например сейчас в новых браузерах появляется поддержка ES5, а разрабатывается ES6. Вот перевод ES5: http://es5.javascript.ru/
С одним яваскриптом далеко не уедешь. Чтобы применять его на веб-странице, надо знать интерфейсы взаимодействия с браузером: BOM, DOM. Это набор методов и объектов, с помощью которых код на явскрипте может получать информацию об элементах страницы и изменять их свойства. Они описаны в стандартах на сайте W3C (например: http://www.w3.org/DOM/DOMTR ), для Firefox есть мануал по дому на сайте MDN, для IE на сайте MSDN, но для других браузеров таких мануалов нет (они говорят, что придерживаются стандратов и потому мануал не нужен).
Доброкун и опытные антохи, подскажите. Вот я например хочу написать резюме, а че писать, если я мало что умею. Нужно ли приводить примеры работ? У меня есть всего-то одни репо на гитхабе с унылым прообразом борды, стоит ли его палить?
Здравствуй, клуб любителей изучать PHP;
В первый раз в PHP.
Есть Один класс http://pastebin.com/iKBrCGV2
В другом файле есть вызов
http://pastebin.com/0WebqNLQ
В итоге получаю
PHP Catchable fatal error: Object of class Model could not be converted to string in /var/www/Controller/controller.php on line 12
То есть не могу выполнить функцию
public function setModel($model) {
$this->$model = $model;
}
Какого хуя? Почему PHP при присваивании хочет выполнить преобразование объекта к строке?
>>318066
>$this->$model = $model;
После стрелы не нужно писать $
>>318055
Как писать резюме — ищи в гугле. Если у тебя нет опыта работы, то резюме вполне может состоять из имени-фамилии, мест учебы, списка технологий (только честно пиши, на каком уровне ты их знаешь, а то на собеседовании тебя могут начать расспрашивать по ним и все сразу станет видно).
Насчет унылого гитхаба, не знаю. Может, и не стоит.
>>318066
Здравствуй, анон.
Этот анон >>318094 прав, там один $ лишний. Перечитай-ка мануал.
Анон, вопрос не совсем по пыхчу, но так как тут у вас добротред, задам и свой ответ. Итак, есть сферический проект с базами MySQL, можно взять структуру новостного портала для примера. Есть разделы новостей - в мире, в регионе, спортивные и т. д. У каждой новости есть превью, анонс, который видят при заходе на страницу перед тем, как выбрать интересующим новость. Вопрос: как организовать структуру базы оптимально и почему? Например, можно все хранить в огромной таблице, можно сделать таблицу для каждого раздела, а можно для каждого раздела сделать таблицу для превью и полных новостей (ведь полные новости будут смотреть в десять раз реже, чем анонсы, зачем их грузить в одну базу ). Понятно, что способы различаются размерами таблиц и их количеством и ставят целью либо загружать минимум разных таблиц, либо грузить из разных таблиц, но по минимально достаточному объему данных. + чем больше таблиц, тем сложнее поддерживать код. Пояснишь?
>>318160
Хуярь все новости в одну таблицу, группы новостей в другую таблицу. Превью выберешь каким-нибудь хитровыебанным запросом к базе. И вообще не задумывайся, как там все работает, этим занимаются только байтобляди и крестопетухи.
Анон, у меня очень и очень странная проблема, вот посмотри
foreach ($content as $user){
echo "<form action='/admin/users' method='post'><input type='hidden' name='id' value='".$user->id."'></form>";
}
Вроде все элементарно, на страницу выводятся формы, внутри поля, но вместо этого получается вот что
<form action='/admin/users' method='post'></form>
<input type='hidden' name='id' value='4'>
Что за бред, как такое может быть, вообще?
>>316747
Доброкун, чет ты меня этим постом запутал начисто. Вот это например
>Если (в конфиге включен профайлер)
Разве к конфиге нужно что-то включать? У меня конфиг просто предоставляет методы на включения, поэтому он кстати весь на синглтонах. Т.е. менять нужно аж с бутстрапа и конфига?
ОП, пояснишь за авторизацию?
Человек вводет логин и пароль, если хэш пароля и логин совпадает с бд, то мы пишем ему в сессию (что пишем?)
что все ок, а также в куки (что пишем?). И допустим редериктим его на страницу, на которой находится менюха в if'e. В нем проверяем что у юзера все ок в сессии или куках, и разрешаем ему пользоваться менюхой.
>>318160
Пиши все в одну таблицу.
И оптимизировать надо не так, как ты делаешь. Ты с чего-то придумал, что если все раскидать по нескольким таблицам, или хранить превью отдельно, то будет работает быстрее. Почему ты решил, что это так? Ты проверял?
Если тебя интересует оптимизация и производительность, то надо делать тесты, пробовать разные варианты и сравнивать, а не гадать наугад.
Также, я сомневаюсь, что для такой просто таблицы вообще нужны какие-то оптимизации.
Другой вопрос, если это таблица с миллионами записей и у тебя миллионы пользователей. Там, конечно, уже придется придумывать хитрости с раскидыванием таблицы по нескольким серверам.
>>318167
Ты что-то перепутал или не заметил. Посмотри код внимательнее. Может, это выводит какой-то другой скрипт.
>>318177
Конфиг — это файл с настройками, и он как раз и предназначен для включения и выключения разных опций. Не класс Config, а файл config.php (и config.local.php). То есть, выглядеть он может так (если он сделан PHP кодом):
$config->profilerEnabled = true;
$config->dbPass = '123456';
или так (в формате ini):
profilerEnabled=true
dbPass = 123456
или так (в XML):
<config>
<profilerEnabled>true</profilerEnabled>
<dbPass>123456</dbpass>
</config>
Ты наверно что-то не так понял.
> У меня конфиг просто предоставляет методы на включения
Может быть, стоит его переделать. Я в предыдущем посте вроде бы писал, как можно это сделать, если я непонятно написал (вполне возможно), напиши, я еще объясню.
Я предложил переделать так:
— делаем класс Config, который может хранить в себе какие-то настройки
— в бутстрапе забиваем в него настройки из config.php
— если существует файл config.local.php, то загружаем настройки и из него
— сохраняем получившийся конфиг в класс Registry, после чего конфиг можно получить из любого другого места кода
>>318179
Есть разные варианты.
1) Можно вообще без сессии, при успешной авторизации пишем в куки логин и специальный хеш, наличие этих кук автоматически доказывает что пользователь залогинен, для разлогина удаляем их.
2) можно с сессией, пишешь в сессию при удачной авторизации user_id = 1234567, при разлогинивании удаляешь. Минус сессии — она может умереть через 15 минут или при закрытии окна браузера (это зависит, от того какие у тебя в PHP настройки). Первый способ не имеет этого недостатка, при нем мы сами можем выставить любое время жизни кук.
> В нем проверяем что у юзера все ок в сессии или куках, и разрешаем ему пользоваться менюхой.
Сделай лучше функцию isAuthorised(), которая провеярет залогинен ли пользователь, чтобы ее можно было вызвать откуда угодно. Зачем в меню это проверять?
>>318184
>Другой вопрос, если это таблица с миллионами записей и у тебя миллионы пользователей.
я это и подразумевал.
>Почему ты решил, что это так?
Нет, я предположил, что если на 20 просмотренных превью будет одна просмотренная новость, то к огромной таблице с редкоиспользующимися новостями будет дольше идти запрос, чем к маленькой с частоиспользуемыми превью. А как вообще делать такие тесты? Забивать таблицу рандомным контентом и замерять время тяжелых запросов, выдающих одинаковую информацию?
>>318188
Все по 100 раз перепроверил, может ли так фреймфорк исполнять?
Это уже не первый раз, один раз так уже было при выводе форычем, тогда не правильно выводился тэг <a>
Сразу еще спрошу такую вещь. Смотри, например, мне нужно выводить данные из базы в 2-х местах на странице 2-мя циклами, но когда я так делаю php говорит, что мол PDO не может развернуть не буфферизированный массив или как-то так, как это можно обойти?
>>318194
Насчет выборок, даже из таблицы с миллионом записей простые выборки вроде «взять 10 последних новостей из категории X» работают очень быстро, если использовать индексы (но лучше конечно проверить тестами, а не верить на слово).
Так что читай теорию по индексам, если не читал, и учись пользоваться командой EXPLAIN. Ну и сделай тесты. Это единственный способ узнать правильный ответ.
Кроме индексов, важны правильные настройки БД, чтобы было выделено достаточно памяти под разные кеши и буфера. MySQL лучше всего работает, когда индексы помещяются в память. На высоконагруженных сайтах под кеши и буфера может отводиться почти вся память на сервере с БД.
Если не хватает одного сервера, можно подумать про репликацию мастер-слейв. И даже если этого недостаточно, проблему можно попробовать решить кешированием. И только после этого стоит думать о шардинге, разбиении таблиц и подобных вещах. То есть, самый сложный и неудобный вариант стоит оставить на потом и искать более простые решения. Шардинг нужен сервисам масштабов вконтакте и твиттера, а обычные сайты с посещаемостью до 500 000 человек легко могут обойтись без него.
> А как вообще делать такие тесты? Забивать таблицу рандомным контентом и замерять время тяжелых запросов, выдающих одинаковую информацию?
Именно. Забить таблицу таким числом записей, которое у тебя будет, в несколько потоков делать запросы, аналогичные тем что будут на сайте и считать сколько их выполнится за N секунд. Я думаю, простая таблица с правильно настроенными индексами будет легко пережевывать хотя бы 500-1000 запросов на чтение в секунду.
Если тебе интересна тема хайлоада, кстати, можешь почитать про архитектуру высоконагруженных сайтов тут: http://www.insight-it.ru/highload/ Но не забывай, что одно дело — Гугл и Твиттер, другое — обычный сайт.
>>318198
Я не знаю, что у тебя за фреймворк, но обычные фреймворки не занимаются перестановкой тегов местами.
> Смотри, например, мне нужно выводить данные из базы в 2-х местах на странице 2-мя циклами, но когда я так делаю php говорит, что мол PDO не может развернуть не буфферизированный массив или как-то так, как это можно обойти?
Можно прочитать данные из Бд, сохранить их в массив, и потом выводить из этого массива сколько угодно раз.
>>318199
>Так что читай теорию по индексам, если не читал, и учись пользоваться командой EXPLAIN
а посоветуй годную книгу по базам от А до Я (лучше с упором именно на сложные темы, select/insert итак проблем не вызывают)?
Можно даже не только по реляционным, в жизни пригодится. Теории бы тоже можно, наверное.
>>318202
К сожалению, насчет книги не знаю, если не боишься английского, можно прочесть официальный мануал на сайте mysql ( http://dev.mysql.com/doc/refman/5.6/en/ ), разделы, посвященные оптимизации и производительности. Это самый подробный источник информации. Также, есть английский сайт «mysqlperformanceblog», там бывают хорошие статьи.
На русском — введи в гугл
> индексы и explain в mysql
и изучай ссылки.
Если тебя интересует NoSQL, что просто погугли статьи про Redis, CouchDB, MongoDB. Их много.
>Если тебя интересует NoSQL, что просто погугли статьи про Redis, CouchDB, MongoDB. Их много.
Видел, даже книжки по последней нашел, читаю. Нет, лучше на русском. Ладно, буду искать.
>>313971
Доброй ночи.
Кто-нибудь может примерно пояснить за архитектуру генерируемого php-сайта? Я вроде как догадываюсь, что можно поделить на header, body, footer и т.п. и страница (одна единственная) будет подтягивать нужные части по мере надобности где-то слышал красивое слово ajax, а также генерировать дизайн я не знаю, как это объяснить подгружать CSS?. Но я не совсем в курсе насчёт тонкостей взаимодействия этих структурных составляющих и реализации своей задумки.
>>318304
Что такое генерируемый php-сайт? И при чем тут аякс?
>>318189
Мне бы про реализацию подробей. Где хранятся хэши? Создавать специальную таблицу в бд? А если нет, то как хэш проверять?
>>318310
> Где хранятся хэши?
В куках
> А если нет, то как хэш проверять?
Хеш нужен лишь для подтверждения что пользователь прошел авторизацию. Его можно получать, например так:
hash = hash-function(userid, secretkey)
Где hash-funtion — необратимая хеш функция, md5 или sha.
Таблицы для этого не нужны (ну только таблица с пользователями для проверки логина-пароля).
>>318310
> А если нет, то как хэш проверять?
Вычисляем кеш от userid и secretkey и сравниваем с тем что в куках. Совпадает — значит настоящий, нет — значит поддельный.
>>318308
Php-страничка, структура которой генерируется в зависимости от действий пользователя. То бишь мы не прыгаем по ссылкам, а подгружаем, но не только данные по sql-запросам, а ещё и элементы структуры и дизайна в соответствующие им места.
>>318308
А аякс у меня стоит обязаловкой в курсовой техзадании.
>>318188
>Я в предыдущем посте вроде бы писал
Да, я потом уже заметил. Кстати, я спалил в резюме недоборду. В четверг иду на первое в жизни собеседование. Главное от страха там не обделаться.
>>318320
Там ничего не генерируется. Просто данные подгружаются с сервера аяксом и вставляются в нужное место страницы, и делается это примерно так же как и в обычном статическом сайте, только код не выводится, а возвращается аяксом. На клиенте можно использовать jQuery:
$('#loadDetailsButton').click(function () {
$.ajax({
url: 'pages/page1',
....
success: function (result) {
$('#result').html(result.html);
}
...
});
});
На сервере выводимый HTML-код капчурится с помощью ob_start/eb_get_contents(), засовывается в массив и возвращается:
ob_start();
require 'page.php' ; // шаблон страницы
$html = ob_get_contents(); // сохраняем в переменную
ob_end_clean();
header('Content-Type: application/json');
echo json_encode(array(
'success' => true,
'html' => $html
));
die();
Можешь посмотреть инспектором код вконтакте или аналогичного сайта например. Ну это конечно, только основы, я не упомянул обработку ошибок или замену URL (чтобы работало открытие в новой вкладке, кнопки назад-вперед-обновить), это делается например через history.js.
>>318323
Провалишь одно собеседование, будешь лучше подготовлен к другому.
>>317862
Короче, мне надоело. Я не умею. Надо сначала выучить, основные принципы логики, а потом доделывать.
http://ideone.com/cFmwCM
>>318330
Слышь! Я не хочу его проваливать. Вакансия на стажера, еще и в рубрике "подработка для студентов". Хочется верить что уж туда меня возьмут. Кстати, доброкун, давно хотел тебя спросить, ты по образованию кто? Из твоих прошлых рассказов я понял, что будучи студентом ты не хотел кодить.
>>318328
>Ну это конечно, только основы, я не упомянул
>это только основы
>основы
Моё лицо пикрлтд.
Это только основы, а мне уже нехорошо.
Ощущаю себя этим вашим АРХЕТЕКТАРАМ.
Единственное, что утешает - я уже пользовался history.js для постраничной перемотки каталога товаров.
>>318337
Это задача на ООП. Если ее решать без применения ООП (на массивах и функциях или только на массивах), обычно получается лапша, и сам автор начинает запутываться в своем коде. Но ты молодец, что хотя бы попробовал свои силы.
Надеюсь, ответ на вопрос «зачем нужны функции и объекты» тебе стал более понятен, чтобы можно было писать большие сложные программы.
Теперь про более правильный подход. Вот смотри, ты например городишь сложный массив с данными (не буду копировать целиком):
$Vector["manager"]["Livel1_MNT"] = 500 ;
$Vector["manager"]["Livel2_MNT"] = $Vector["manager"]["Livel1_MNT"]* $difference[level1to2MNT] ;
....
$Vector["manager"]["Liters"] = 20 ;
$Vector["manager"]["Pages"] = 200 ;
То есть, у тебя в коде есть сущность (не знаю, как лучше назвать) «менеджер», у менеджера есть свойства: сколько он зарабатывает, сколько кофе пьет. Так вот, это идеальный случай для применения ООП, так как ООП как раз предназначено для описания разных сущностей и их свойств. То есть, в ООП мы бы создали класс Employee (сотрудник), дали ему свойства liters, pages, добавили бы несколько функций для работы с ними, и код получился бы аккуратный. Потом на основе Employee (сотрудник) мы бы сделали классы основных профессий: Manager, Analityc, Marketer, Engineer с помощью наследования (а не копипастом). Ну а потом уже начали бы собирать их в департаменты и считать общие затраты на кофе.
В общем, насчет теории, не хочешь почитать мой учебник (ссылка в первом посте)? Если ты слабо знаешь PHP, то можешь начать с главной страницы (судя по тому, что ты не знаешь функций, тебе стоит начать с начала), а если хочешь сразу перейти к ООП, то там есть раздел «ООП и пасты».
Ну или можно почитать официальный мануал по PHP или какую-то книгу (Например, «Мэтт Зандра, PHP: паттерны, шаблоны и объектно-ориентированное программирование»). Если у тебя будут вопросы, можешь всегда придти в наш уютный тредик, мы постараемся помочь.
>>318340
Советую перечитать официальный мануал по PHP (и возможно другие мануалы по технологиям которые ты указал в резюме). Стажеров любят по теории гонять, больше-то все равно у них спрашивать нечего. Всякие вещи вроде «чем == отличается от ===», «сработает ли условие if ('xyz' == 0)», отличие protected от private и так далее.
Официальное название специальности, что-то связанное то ли с физикой, то ли с информационными системами, но я никогда по ней не работал, я даже не знаю что это за специальность такая. А насчет не хотел кодить, ну да, тогда я вообще толком не знал, чем я хочу заниматься.
>>318343
Тебе нехорошо потому, что ты толком не изучив теорию, собрался что-то делать. Не понимая JS/AJAX/HTTP/PHP, ты конечно можешь каким-то чудом сделать все это и заставить работать, но сомневаюсь, что результат будет качественным. Но лучше изучить теорию.
>>318350
Помню в первых тредах был сайтик с заданиями для начинающих с нуля. Не подкинешь адрес? Лень искать просто.
>>318352
Напиши чуть подробнее, может я вспомню, о чем речь.
>>318352
php-кун сверстал небольшую страничку со списком из нескольких заданий и графическими пояснениями к коду и результату. Помню задачу по игре в кости, с рандомной генерацией двух пар значений сравненем.
>>318371
А это случайно не задачи, которые выложены на сайте из ОП-поста archive-ipq-co.narod.ru (пикрелейтед)?
В ПХП ПОЛНЫЙ ноль
скажите, вот этот код, он должен нормально отправлять на почту мою то, что человек ввел в форму? У меня выскакивает ошибка на хостинге, проблема в хостинге или в коде?
Вот HTML http://jsfiddle.net/F7cCh/
Вот PHP код http://ideone.com/NjF6E1
>>318765
Чтобы не гадать, сделай простой скрипт вроде такого:
<?php
error_reporting(-1);
mail('[email protected]', 'Test', 'Test message');
укажи в нем свой адрес и проверь, отправилось ли письмо (в том числе не попало ли оно в спам).
На бесплатных хостингах обычно письма отправлять нельзя (защита от спамеров). Точнее — читай FAQ и форум хостинга. На платных — можно и все должно быть настроено из коробки. Если ты на платном хостинге и скрипт выше не отправляет письмо в течении 5 минут, смело стучись в техподдержку и требуй, чтобы тебе починили почту, это их работа проверять нужные настройки.
>>318771
бро, я повторюсь, я вообще 0 в php у тебя в твоем коде есть
<?php
а разве его закрывать не надо?
'Test', 'Test message' - в твоем коде, это то, что должно в форме быть
<input type="text" name="вот тут допустим TEST"> ?
этот скрипт подключать надо так <form method="post" action="адрес этого скрипта"> ?
Мне нужно сделать сайт, туда ли я зашел?
>>318388
Да, оно, спасибо.
>>318824
Здесь мы изучаем программирование, в том числе и написание сайтов, но тебе наверно вряд ли охота его с нуля писать (это долго), так что да, лучше в web спросить про подходящую CMS.
>>318789
Закрывающий тег PHP не обязателен.
Этот скрипт сохраняешь в файл testmail.php, загружаешь на хостинг и открываешь браузером, без всяких форм. Если ты не знаешь PHP, то плохо, ты будешь на каждом шагу спотыкаться, пока настроишь эту форму, лучше взять любую книгу и почитать, или видеокурсы какие-нибудь посмотреть.
>>318837
Тогда, если захочешь порешать задачи, можешь постить сюда решения, мы проверим.
>>318348
Сходил я на собеседование. Кажется обосрался. Это все из-за MySQL. С бордой и MVC я так и не разобрался полностью с MySQL и не умею писать крутые запросы. Например: на главной у треда показываются последний ск-ко то коментов, я там получаю все коменты, а потом array_slice все дела. Нужно будет написать запрос который бы сразу возвращал последних ск-ко коментов. Сказали до четверга решат, нужен я им или нет. Кстати, это была другая вакансия, в ней требования были круче, так что наверное для первого IT-собеседования в целом норм.
>>318879
>на главной
>array_slice
Когда же вы все передохните наконец?
>>318879
Если ты тот кун, что делал борду, то как у меня будет время, я-таки напишу тестовые скрипты, чтобы проверить твою борду под нагрузкой (если там все работает, просмотр тредов, постраничная навигация и добавление сообщений). Тогда ты сможешь лучше разобраться в MySQL запросах.
>>318879
> Нужно будет написать запрос который бы сразу возвращал последних ск-ко коментов.
Недавно сам столкнулся, google "greatest n per group"
О, на Хабре статья про подвохи и недостатки Хаскелл при использовании в реальном проекте: http://habrahabr.ru/post/193722/
>>318902
Нет, просто сити на просторах родины
>>318955
> делал борду
Он самый. Все работает, только кажется в каких-то случаях редириктит не совсем туда, куда нужно. Кстати, борда понравилась, на нее все надежда. Пригласили еще в одно место на собеседование, но я пока не тороплюсь, ибо много волновался перед этом.
Интересно, на Хабре годная статья про шрифты: http://habrahabr.ru/company/uidesign/blog/194368/ и 0 комментариев. Странно даже как-то.
Еб твою мать, все мозги себе вытрахал уже. Подскажи, анон. Суть такова: есть условие, которое находится в цикле. Условие проверяет совпадение логина и пароля, которые хранятся в текстовой базе данных. Функция берет строку из базы, заносит в новый массив значения из этой строки (разделителем на несколько элементов является @). Все вроде срабатывает, но блять ебаный в рот только со второй строчки. То есть на первой строке хранится юзер1, на второй юзер2, на третей юзер3. Через второго и третьего юзера заходит замечательно, но через первого не хочет. Я уже все перепроверил, значения сравнивающихся переменных совпадают, теоритически он должен выполнить условие, но не выполняет. Помоги понять в чем дело, анон.
$passArray = file("pass1.txt",FILE_IGNORE_NEW_LINES); //Считывание файла c паролями построчно в массив
for ($i = 0 ; $i < count($passArray) ; $i++) {
$str = explode("@",$passArray[$i]); //Разбиение строчного массива на несколько элементов в каждой строке, разделителем является @, в итоге получаем итую строку с персональными данными, разбитую на массив str
//echo "Логин=$str[0]@@@@Пароль=$str[1]<br>";
//echo "Логин в подмассиве=$str[0]@@@@логин в полученной переменной=$pass<br>";
//echo "<br>$passArray[0]<br>";
if (($str[0] == $login) and ($str[1] == $pass)) {
//дальнейшие действия
>>319352
Что еще странно: Сдвинул сейчас в текстовой базе все строчки на одну строку вниз, все нормально заработало. То есть начинается проверка только со второй строки. Ебаный ты в рот, анон, почему? i же начинает проверку с 0-ого элемента проверку, в нулевом элементе хранится запись о первой строчке из базы, где данные юзера1. Я вообще запутался.
>>319352
В таких случаях лучший способ — выводить значения, которые сравнивает программа, чтобы посмотреть самому. Вот перед этой строчкой:
> if (($str[0] == $login) and ($str[1] == $pass)) {
Поставь var_dump($str, $login, $pass); и посмотри, что он с чем сравнивает.
>>319352
Ой, попробуй еще сделать var_dump($passArray) чтобы посмотреть что в нем.
>>319356
Поставил, вроде там чего-то не так сравнивается, сейчас попробую разобраться. Спасибо. Странно, когда выводил через i все эти элементы - все норм вроде было, сравнивающиеся переменные совпадали.
>>319361
Лучше используй var_dump() так как он выводит и массивы, и null, и false/true а через echo ты тип переменной не увидишь.
>>319359
>var_dump($passArray)
В нем вроде все хорошо, он правильно хранит в себе значения каждой строки из базы.
>var_dump($str)
Вроде тоже все нормально, в каждом элементе массива нужные символы, которые взяты из целой строки массива $passArray. Только смущает параметр string. Я не знаю за что он отвечает в данной отладке, но значения String имеют странный хаотичный разброс. Сначала это 8, потом 1, потом 3, итак далее. Непонимат что это значит.
>$login
Все хорошо, он хранит в себе переданное значение из формы.
>$pass
Тоже все хорошо, хранит в себе пароль переданный через форму.
До сих пор не пойму почему все работает если в базе сделать отступ на одну строчку. Вроде это хорошо, можно и так оставить, но это совсем тогда будет быдлокод. Надо фиксить такое учиться.
Алсо, доброкун, есть еще такой вопрос. Вот у меня в адресной строке при обращении к скрипту видно все переданные данные (пикрелейтед). Можно как-то их скрыть? Если да, то какой метод, функцию гуглить?
Блять, теперь я совсм запутался. Как я понял - String нам говорит сколько символов в строке, отлично. Я хочу вывести через var_dump массив $str[0], где должно храниться значение логина юзера. Вывожу через цикл for, все норм, он выводит как надо, 3 раза, так как в базе только три строки со значениями персональных данных. Вот результат:
string(8) "user1"
string(5) "user2"
string(5) "user3"
Вы видите это? Почему у юзера1 8 символов, а не 5 как надо? Ебаный в рот, откуда 3 бита перед юзером1? Что это? Проделки кодировки? Чертовщина? Как это работает?
Как говорил - проблема решается сдвигом на одну строчку вниз всей базы. То есть нулевой элемент пустой, выводится он вот так:
string(3) ""
Откуда? Откуда он берет три невидимых бита? Из-за этого и не проходит проверка.
>>319371
Гугли метод POST у тега form (method="post").
>>319385
> Вы видите это? Почему у юзера1 8 символов, а не 5 как надо?
Есть такая вещь, как непечатаемые символы. Например, спецсимволы или пробелы нулевой ширины. В строке они есть, но на экране не отображаются. Чтобы понять в чем причина в твоем случае:
(картинка we need to go deeper)
нам надо сдампить строку по-байтно, чтобы видеть каждый отдельный байт. Делается это так:
$hex = binhex($string); // преобразуем в hex-код
var_dump($hex); // выведется что то вроде 2234566f5f
То, что выведется — это коды символов (2 цифры = 1 символ). Вот пример: http://ideone.com/Q5yU4y
Коды символов зависят от кодировки. В utf-8 например одна буква может состоять из нескольких кодов, в ascii 1 код = 1 буква. Ну, например латинская a имеет код 61, пробел имеет код 20 и так далее. Подробнее можешь погуглить википедию.
В общем, давай, иди глубже и сдампь подозрительную строку в hex-виде. Я предчувствую в чем может быть дело, но лучше если ты сам догадаешься. заодно полезное что-то выучишь.
>>313971
ОП, начал обмазываться твоими ранними тредами(я слоу, да), спасибо тебе, мне нравится.
А есть что-нибудь почитать о кодинге в целом, вроде научпопа или сорт оф.
Чтобы более обширное общее представление поиметь.
Криво выразился, но, вроде, понятно.
>>319421
Не знаю, что посоветовать. Попробуй Хабр почитать, там каждый день новые статьи на самые разные темы, связанные с программированием.
>>319413
Ух ты, значит можно таки увидеть причину проблемы, да еще и так просто. Спасибо огромное, чуть позже освобожусь, сяду доделывать, первым же делом проверю строку.
Кстати, как посоветуешь учить php, чтобы в будущем можно было вполне претендовать на должность разработчика? С самого нуля и от корки до корки, или ставя перед собой задачи, и с помощью поиска конкретной информации реализовывать их?
И имеет ли php какие-то утвержденное русское произношение? Пхп, пиашпи? Я привык говорить пхп, остальные варианты режут слух. Надо мной не будут смеяться толковые люди, если я так и буду продолжать называть его?
>>319452
Правильно читать так, как читаются английские буквы: пиэйчпи
Насчет учить, советую для начала пройтись по мануалу, чтобы закрыть пробелы в теории (мануал: http://php.net/manual/ru ), потом уже браться за задачи и поиск. Без знания теории поиск в гугле тебе не поможет, так как ты не сможешь отличить хорошее решение от плохого.
Также, начинающих на собеседовании любят спрашивать по теории, так что прочесть мануал в любом случае надо.
Потом, надо изучить ООП и MVC (на примере какого-нибудь фреймворка, например, Yii или ZF). Сейчас всюду используют ООП, так что надо его знать. По ООП можно прочесть, например, книгу
> Зандстра Мэтт - PHP: объекты, шаблоны и методики программирования
Если хочется пример задачи на знание ООП, то вот например: часть 1 >>314683 часть 2 >>316407
Если будут вопросы, заходи в наш уютный тред, поможем разобраться.
Анон, смотри, у меня есть насайте элементы, типо виджетов. Я хочу дать сторонним веб-мастерам возможность разместить их у себя на странице по ссылке. План такой, генерирую ему iframe нужных размеров, в ссылке указываю путь на контроллер который выведет на страницу ровно 1 нужный элемент, это годно? Или как надо?
Итак, анон-который-делал-борду, мы собирались потестировать SQL-запросы, мы их тестируем. В тестировании нам помогут скрипты, которые я написал.
Во-первых, скажу, что борда сделана довольно криво. Не знаю, может у тебя на компьютере ошибок нет, все исправлено, и ты просто забыл это закоммитить и запушить на гитхаб, но то, что там есть, довольно-таки глючно. Сыплются варнинги и ошибки, код работает только если он вложен в папку, конфига нет, приходится править настройки БД в коде, в общем, про баги я напишу наверно отдельно, их там очень много.
Вернемся к тестированию. Вообще, для базового тестирования производительности веб-приложений есть минимум 2 тулзы (обе работают из командной строки). Профессиональные разработчики, конечно, должны о них знать. Это ab и siege.
ab - Apache Benchmark, идет в комплекте с Апач. Эта простая, но полезная утилита умеет долбить сервер одинаковыми запросами в несколько потоков и выводить потом статистику. Мануал по ней можно увидить, набрав что-то вроде ab --help. Вот как выглядит ее отчет, если запустить ее на твоей борде:
https://gist.github.com/anonymous/f61c08a22fae36de3b71
Ну думаю, тут все понятно, пишется число запросов, сколько в среднем заняла обработка одного из них и так далее. ab — простая утилита, она годится для простых целей, но у нее есть и недостаток: она запрашивает только один URL. Это неинтересно, потому что на сложных приложениях данные кешируются и ты фактически проверяешь производительность кеша.
Для более сложных случаев используют siege. Этой утилите дается список адресов страниц, и она начинает ходить по этим адресам, имитируя нагрузку от посетителей.
Также есть годная тулза от Google под названием skipfish. Она сама обходит страницы сайта и ищет там уязвимости. Из минусов — она может работать довольно-таки долго, несколько часов, хотя можно прервать ее работу раньше.
Но мы пока не будем пользоваться этими утилитами, а начнем с более простых тестов. Первый тест — надо посмотреть, как будет вести себя борда, если в нее добавить много тредов и сообщений, а то тестировать на 5 постах неинтересно. Руками добавлять посты можно долго, так что я написал вспомогательные скрипты, они выложены тут: https://github.com/codedokode/board-test-scripts
Скрипты запускаются из командной строки. На тот случай, если ты не знаешь, как ей пользоваться, у меня есть гайд-паста: https://gist.github.com/anonymous/2dfa134fe20d9cf91bbe . Эту папку (board-test-scripts) надо поместить на одном уровне с другими папками (application, core), также надо прописать настройки БД в lib/config.php . После этого можно запускать скрипты. Их пока 3:
php db-truncate.php yes
удаляет все посты и комментарии из БД
php db-add-threads.php 100 200 300
генерирует 100 тредов, в каждом из которых будет от 200 до 300 постов
php db-measure.php 10
10 раз пытается сгенерировать главную страницу и считает общее время и статистику
В общем, сначала я очистил все посты, а потом сгенерировал 200 тредов по 500 постов. После чего я зашел на главную страницу, и борда упала. Оказалось, что PHP недостаточно 64 Мб памяти, пришлось дать ему больше и только тогда главная страница отобразилась. Проблема в этом запросе:
SELECT * FROM coments Время 734.4 мсек
(кстати, почему comments написано с одной буквой m? что за ерунда). Этот запрос выбирает абсолютно все комментарии и пытается загрузить их в память (и память заканчивается). Конечно, это тупиковый путь и 700 мс — это слишком много. И это всего лишь на 100 000 постов, а если их будут миллионы? Надо всегда стараться выбирать только те данные, которые нужны, а не все подряд.
Потому, по SQL-запросам, предлагаю тебе сделать следующее:
— Подумать, как выбирать данные для главной страницы. Надо придумать такой способ, который обеспечит максимальную скорость выборки. Давай ориентироваться на максимум 10 мс на выборку данных для главной. По сути на главной сейчас выводится 6 постов + 18 комментариев, и мне кажется, 24 записи из БД при желании можно выбрать даже не за 10, а за 1 мс. Если ты конечно выбираешь их правильно, а не полным перебором таблицы.
У меня есть в голове интересный вариант, но для начала подумай сам.
— Почитай теорию по индексам и EXPLAIN. Пригодится в дальнейшем. Для начала можно читануть статьи из гугла: https://www.google.ru/search?client=&rls=en-GB&q=%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B+%D0%B8+exlain+%D0%B2+mysql&sourceid=&ie=utf-8&oe=utf-8&channel=suggest#channel=suggest&newwindow=1&q=%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%8B+%D0%B8+explain+%D0%B2+mysql&rls=en-GB&spell=1
После того, как исправишь выборку данных, будем делать дальнейшие тесты. Также, надо допилить профайлер:
— Добавить вывод профайлера на все страницы, а не только на главную
— Добавить в профайлер вывод занятой памяти (плохо, что мы забыли про это, а ведь потребление памяти сразу позволяет увидеть проблемы). В твоем случае, оно должно болтаться в районе 2-3Мб. Померять потребление можно так: https://github.com/codedokode/board-test-scripts/blob/master/lib/lib.php#L105
Если есть вопросы и непонятные моменты, пиши. Дальше будет пост со списком найденных багов.
Доброанон, вопрос не совсем по php, но больше и спросить не у кого... Вот есть на сервере картинки, их много, слишком сильно их не пережать, нужно в нормальном качестве.
На дваче их же дохуя, например. Но ладно двач, у него есть вайп тредов, на апачане нет вайпа и хранятся миллионы пикч. Ладно апачан, там рандомы есть, а мелкоборды? Ладно, там у них нет много картинок, а разные комиксы японские в онлайне? Там нет вайпов, рандомов, разрешения больше и т. д. Это же десятки терабайт данных. А проблемы те же. Сервер-хостинг, который будет слать нахуй не самые серьезные жалобы, держать простейшие DDOSы и предоставлять такие объемы под данные, будут жрать тысячи денег. Что делать?
Анон-который-делал-борду, держи список багов. Начнем с самых важных, закончим мелкими.
PHP-ошибки
При работы борды на ней сыплются такие ошибки:
Strict standards: Declaration of core_DbStatement::bindParam() should be compatible with PDOStatement::bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL) in core\DbStatement.php on line 73
Notice: Undefined property: Application_Models_Post::$time in \application\controllers\Main.php on line 16
Notice: Undefined property: Application_Models_Post::$query in \application\controllers\Main.php on line 17
Notice: Undefined index: p in \application\views\MainView.php on line 88
Если перейти по ссылке /board/?p=0 то вываливается ошибка:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-6, 6' at line 1 in \board\core\DbStatement.php on line 62
Если у тебя они не видны, проверь логи или включи на локалхосте display_errors On, чтобы все отображалось.
PDO и MySQL
Ошибки выполнения запросов в PDO никак не проверяются и не отображаются, так как по умолчанию у PDO стоит ERRMODE_SILENT (http://php.net/manual/ru/pdo.error-handling.php). Проще говоря, ты их даже не увидишь. Надо дописать код:
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
В BDClient::__construct()
— Если написать длинный пост или комментарий, сохраняется только первые 50 символов. Что за наркоманство? даже в твиттере больше символов можно использовать.
URL и роутер
— Борда работает правильно, только если она установлена в подпапку, например, /board. Если установить ее в корень сайта или в папку глубиной больше 1, то роутер ломается. Надо это исправить. Надо ввести такую переменную как baseUrl — URL где находится борда и либо прописать его в конфиге, а лучше сделать чтобы он определялся автоматически из переменных в $_SERVER . Надо чтобы борда работала корректно из любой папки любой вложенности.
— Неправильно, что часть страниц открывается методом POST. Плохо, если ты не понимаешь разницу между POST и GET (ну или может это я тебе что-то неправильно подсказал). Принцип такой, если кратко:
GET используется для получения страниц и для запросов, не меняющих состояние данных (например, поиск)
POST используется для выполнения запросов, меняющих данные (добавление/правка/удаление постов)
Браузеры также имеют свои особенности. Например, если попытаться обновить или вернуться на полученную через POST страницу, выведется диалог «Точно ли вы хотите повторно отправить форму», в то время как GET-страницы обновляются без лишних вопросов. В общем, если ты этого не знаешь, стоит почитать теорию, если знаешь — хорошо.
Если не соблюдать эти правила, будут происходить нехорошие вещи. Например, у тебя на борде, если зайти в тред, в адресной строке написано: http://host1/board/Tread . Если скопировать эту ссылку и вставить в новое окно, откроется не тред, а посыплются ошибки:
Notice: Undefined variable: tread_id in \board\application\controllers\Tread.php on line 12
Notice: Trying to get property of non-object in \board\application\views\TreadView.php on line 10
Получается, ссылку на тред нельзя скопировать, добавить в закладки, запостить в твиттер. Это плохо. Надо все это исправить и использовать нужные методы и правильные УРЛ. Вот, примерная схема, как должно быть:
GET / главная
GET ?page=N или GET /page/N N-я страница (если N <=1 должно редиректить на главную с кодом 301)
GET /thread/12345 страница треда
GET /thread/add форма создания нового треда
POST /thread/add адрес, на который отправляются данные из формы создания треда
GET /thread/12345/comment или GET /comment/add?post_id=12345 форма добавления комментария
>>319893
Найти другой хостинг, найти деньги или отказаться от своей затеи. Может, можно найти хостинг/CDN специально для хранения картинок с приемлемой ценой. Проект с большим числом картинок будет еще и трафик потреблять, и ты внезапно узнаешь, что
белимитный* трафик
не такой уж и безлимитный.
И вообще, если у тебя нет денег на хостинг, ты всегда можешь закачать свои картинки на файлообменники или в торренты.
> Ладно, там у них нет много картинок, а разные комиксы японские в онлайне? Там нет вайпов, рандомов, разрешения больше
Это где? Я всюду встречаю только крошечные JPEG сканы рарешением в 1000-2000 пикс, где половину иероглифов не разобрать.
>>319893
Алсо, всегда есть вариант просто купить свой сервер с большим винтом (неск. тыс. $) и поставить на коллокейшен. У любого большого проекта свои сервера, так выгоднее чем платить хостеру.
>>319930
>Это где?
я взял для примера русскую борду, на которой нет лимита для бампа постов, они никуда не сливаются и остаются там навсегда. Если убрать рандомы, картинок станет очень много.
На файлообменники или торренты такое не зальешь ни разу, это же должно быстро подгружаться.
Куча есть сайтов с ворованными комиксами онлайн или хотя бы e-hentai знаменитый, там же очень много места.
Но даже если 1000-2000 пикселей, это ведь все равно 250-300 кб, а то и больше, может быть изображение. А на хуевом сайте коммиксов могут быть тысячи, в каждом много страниц. Не покупают же они терабайтные хостинги за такие деньги все?
>>319961
Во-первых, я написал, можно просто купить свой сервер и набить туда дисков в raid на несколько терабайт, а не пользоваться хостингом. Будет дешевле.
Во-вторых, есть сервисы, которые хранят гораздо больше данных. Вот например flickr: http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/
> Всего приблизительно 470 миллионов изображений, каждое представлено в 4 или 5 размерах
> 2 петабайта дискового пространства
> Более 400000 фотографий добавляются ежедневно
>>319507
Таки наконец-то добрались руки до кодинга снова. Я доделал все нужные скрипты и расшифровал таки те самые 3 байта. Так вот: закодировав их в hex-код, я получил efbbbf. В переводе в кодировки это:
ascii - ???
windows12-51 - п»ї
utf-8 - �bf
Что это я так и не понял, однако предполагаю что это байты обозначающие начало текстового файла, и в первой строке они будут всегда. Поэтому без костыля в виде второй строки тут никак не обойтись. Но если я таки ошибаюсь и есть простой метод поиска именно с первой строки - буду рад выслушать. Спасибо за наводку, Доброкун.
>>320009
http://en.wikipedia.org/wiki/Byte_order_mark
Найди нормальный текстовый редактор, а не notepad.exe.
>>320010
Лол, значит таки был прав. Ладно, хороший опыт на будущее. Спасибо.
Алсо, аноны, снова про этот >>319371 вопрос.
Я погуглил сейчас немного по совету Доброкуна метод POST у тега form, но ничего не нашел про шифрование передаваемой информации в адресную строку. Сейчас уже пора спать, делать это буду завтра. Мне по сути не нужно шифрование для какой-то безопасности, мне нужно шифрование лишь для глаз, чтобы не было видно персональных данных в адресной строке, как браузер отображает на скрине. Может кто-нибудь сталкивался с таким? Что применяли в таких случаях?
>>320012
>применяли в таких случаях?
Не передавай такие данные через GET.
>>320009
Это так называемый BOM, который вставляет блокнот Windows. Этот BOM невидим в тексте, но приводит к разным веселым глюкам, так как PHP его воспринимает как полноценные байты. Хуже, если BOM будет например в начале PHP-файла, можно получить что-то вроде Cannot send header: ouput started
По этой причине лучше использовать нормальный редактор, и никогда не использовать блокнот для кода. В общем, ты сам виноват что его использовал. Создай файл в нормальном редакторе заново.
>>320012
Плохо почитал.
При методе POST параметры не шифруются, они просто не приписываются к адресной строке, а передаются в теле запроса. И потому они не видны в адресной строке и не попадают в историю браузера, например. То,что надо для формы авторизации.
Кроме того, если бы ты почитал ее внимателнее, ты бы узнал, что:
- GET используется для получения страниц и для запросов, не меняющих состояние данных (например, поиск)
- POST используется для выполнения запросов, меняющих данные (добавление/правка/удаление постов/авторизация/загрузка файлов)
Ну и еще из особенностей, браузер выдает предупреждение при попытке повторно отправить это запрос (например при обнволении страницы). Потому после успешной обработки POST-формы надо делать редирект.
>>320015
Но я отправляю методом POST. У меня на главной страничке форма с авторизацией, на ней поля ввода Логина и Пароля. Введя данные в форму и нажав Отправить, данные передаются в php-скрипт, который методом GET считывает отправленные ему данные. То есть в форму я ввел логин User1, пароль 123. Скрипт сделал вот так:
$login = $_GET[login];
$pass = $_GET[pass];
и продолжил с ними работать. Есть идея получать не открытые данные, а перед отправкой их к примеру зашифровывать во что-нибудь, а в принимающем скрипте расшифровывать, но не знаю как это сделать. Смогу вернее зашифровать\расшифровать, но не знаю как шифровать их именно в момент отправки.
>>320017
google → HTTPS.
google → client-side encryption
алсо, разве не $_POST получает данные-то?
мимокрок
>>320017
Ты путаешь. Через $_GET ты получаешь данные из URL (?x=y), а данные из POST-формы находятся в $_POST.
Читани-ка теорию: http://www.php.net/manual/ru/language.variables.external.php
> Есть идея получать не открытые данные, а перед отправкой их к примеру зашифровывать во что-нибудь, а в принимающем скрипте расшифровывать, но не знаю как это сделать. Смогу вернее зашифровать\расшифровать, но не знаю как шифровать их именно в момент отправки.
Это не нужно, просто используй POST. При POST данные формы не должны попадать в адресуню строку.
>>320021
Шифровать — лишнее. А вот HTTPS — хорошая идея для безопасности.
Анон, который пишет форму, если ты эту форму только для себя используешь то конечно можно и без HTTPS обойтись, ну а если ты делаешь серьезный сайт, то хорошо бы использовать HTTPS. При его использвоании все передаваемые данные надежно шифруются, а без него их может прочитать например любопытный сотрудник провайдера, хакер с вайфай-антенной, дяди из ФСБ.
В простой задаче это вряд ли нужно, но знать про отличия HTTP от HTTPS хорошо бы.
>>320016
Все, теперь ясно что и как делать, спасибо. Я использовал виндовый нотепад лишь для текстовой базы, для кодинга же использую Нотепад++.
Плохо понял так как сильно хочу спать, повнимательнее обо всем этом почитаю завтра. Значит только если так: Отправка данных логина и пароля в принимающий скрипт, скрипт сверяет данные по базе, делает редирект со значением True или False либо на страницу пользователя, либо на страницу о неверном логине\пароле?
Понял что надо серьезнее углубиться в GET и POST, тогда смогу получить желаемый результат. Серьезной защиты мне пока не требуется, так как сайт пока будет рассчитан на малую категорию людей и всех своих так сказать. Главное пока скрыть это от глаз и дать старт проекту, а в будущем уже буду делать нормальную защиту, нормальную MySQL базу, а не текстовый файлик с данными. Спасибо, завтра буду читать, осталось в принципе доделать только эту часть.
>>320024
Нет, не так. Алгоритм обработки форм такой:
Если метод запроса == POST (это значит пользователь отправил форму):
— проверяем входящие данные
— если все верно, делаем какое-нибудь действие и редиректим куда-нибудь
— если есть ошибки, не редиректя выводим снова эту же форму и пишем сообщение об ошибке
Если метод == GET (это значит пользвоатель просто открыл страницу с формой):
— выводим пустую форму
Насчет авторизации, ты спрашивал как ее делать. Предлагаю простой вариант: если пользователь залогинен, у него в сессии хранится его логин. Код, естественно, надо поместить в функции (а не проверять сессию напрямую через if, это будет ужасной ошибкой). Функции советую сделать такие:
isLoggedIn() — проверяет залогинен ли пользвоатель (хранится ли логин в сессии) и возвращает true/false
getActiveLogin() — воозвращает логин пользвоателя или false если пользвоатель не залогинен
checkCredentials($login, $pass) — проверяет логин/пароль на правильность и возвращает true/false
login($login) — залогинивает пользователя, записывая его логин в сессию
logout() — разлогинивает пользователя, удаляя его логин из сессии (для верности можно и саму сессию уничтожить).
Думаю, как их написать ты и сам понимаешь.
Хочу рассказать о стандартах в PHP. Представители ведущих фреймворков и CMS объединились в группу под немного странны названием PHP-FIG и теперь у нас в PHP тоже ест стандарты.
http://www.php-fig.org/
https://github.com/php-fig/fig-standards
Уже приняли пару стандартов по оформлению кода и по Logger Interface (я слышал, в яве с этим было особенно плохо). Сейчас обсуждается интерфейс кеша и новый, улучшенный автозагрузчик классов.
А, и не могу не порадоваться за адекватность:
> Code MUST use 4 spaces for indenting, not tabs.
> Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.
В общем, стандарты — это хорошо. Надеюсь, велосипедов и неразберихи станет меньше.
>>320036
Хочу рассказать о стандартах в PHP. Представители Delphi и VBA объединились против тех немногих, кто ещё помнит Perl, vi и нортонкоммандер и теперь у нас в PHP стало как в Delphi и VBA. Постановилли:
1) Не делать более отступы разной длины в "if", "for" и "foreach"
2) Не использовать более знак подчёркивания в именах свойств, и символ доллара скоро тоже удалим из языка
В общем, стандарты — это хорошо. Надеюсь, олдфагов и Unix-админов с их консольными редакторами станет меньше.
Оп, проверь пожалуйста задачу на палиндром, может что-то можно улучшить?
http://ideone.com/hixYZI
>>320036
> Property names SHOULD NOT be prefixed with a single underscore to indicate protected or private visibility.
А мне так больше нравится и удобнее, так что дизлайк
А вообще на работе юзаем стандарт Zend, и чекстайл стоит на jenkins, так что мне и так норм
>>320162
Отлично! Все и правда лишь своими стараниями? Сколько учил php? Тяжело было работу найти? Зарплату приемлемую обещают?
Другой кун.
>>320162
Ну вот и замечательно. Главное, не расслабляйся пока, так как стажер — временная должность, и многое зависит от того, как ты себя покажешь.
>>320199
Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.
>>320190
Все хорошо, правильно работает. Единственное, точки с запятой после { и }не надо ставить (строки 21, 25, 27).
>>320264
> Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.
https://gist.github.com/lastguest/5966992
>>320279
Плохой пример. Вместо того, чтобы получать эти данные кривыми костылями, ты бы мог просто использовать Reflection (ну или какой-нибудь var_dump чтобы уж совсем извратиться). К тому же, похоже, ты не очень понимаешь что значит private.
>>320294
Анончик, что почитать по классам, методам и прочему? Так чтоб для одарённых личностей тупых.
>>320257
Учил с этого лета более-менее серьезно. Посмотрел курс специалиста, слушал доброкуна и маму. Писать небольшие кодики, например на поиск пути или парсинг дат из вики, было очень интересно, с написанием своей борды подвис, и перестал развиваться, решил пойти поработать. Найти вакансию оказалось очень легко, прошел на первом же собеседовании. Зп стажером обещали 20 к, для своего сити денежки не большие, но если стану кодером зп будет больше.
>>320264
Это да, мне в фирме точно так и сказали. Во-первых нужно буде себя проявить, во-вторых сдать на 1с-битрикс какую-то шляпу, типа курсы или что-то типа того. Хочется еще и про учебу не забыть, хотя бы НИРС делать, он у меня очень интересный - электрохимия цветных металлов в водных растворах.
>>320271
во-первых да, есть
>>320264
>Так у нас (в отличие от Руби, Яваскрипта или Питона) есть private/public так что подеркивания лишние.
И что? если есть подчеркивание, то автокомлит быстрее подтянет нужный мне метод/список, потому что я внутренние методы класса редко помню наизусть, а внешние - это как правило экшены контроллера, или api модели (начинается с fetch/set/get и т.д. ), так что вызываются реже, чем приватные
>>320331
Выглядит на мой взгляд, уродливо, и избыточно (не писать подчеркивание проще, чем писать). Мне, кстати, в Питоне не нравится _вот_такой_вот_стиль называть функции (ок, у нас тоже такие есть, что поделать), и куча всяких странных имен вроде dict, main эти подчеркивания напоминают какие-то костыли. Почему нельзя было назвать их нормально?
> если есть подчеркивание, то автокомлит быстрее подтянет нужный мне метод/список, потому что я внутренние методы класса редко помню наизусть
Если ты не знаешь, что тебе нужно, автокомплит не поможет. Логичнее переделать автокомплит, чтобы он искал не только по началу имени (как в sublime например), чем уродовать код. То есть, набираешь name и он подсовывает getUserName().
>>320028
Спасибо Доброкун, более-менее разобрался.
Я пока не буду делать так >>320029 , так как знаний не хватит, а если и смогу с помощью гугла такое сделать - толку сейчас не будет, ведь как говорил - главное сейчас стартануть сайт. Он будет работать, а в это время я буду писать его по новой, только уже с нормальными методами, с базой данных, с сессиями и прочем.
Получилось считывать логин с паролем благодаря POST без выведения в адресную строку, но возникла трудность с редиректом. Вот смотри, анон, у меня есть вот такой код: http://ideone.com/sjRSyf
Он импровизирует введение логина и пароля, какое-то сравнение и должен сделать редирект в случае выполнения условия. Естественно, рeдирeкт он не делает, так как перед хедером ничего не должно быть. Что делать в таких случаях? Делать рeдирeкт через script? Просьба не усложнять данную конструкцию, так как на данный момент я все пишу благодаря гуглу, практических настоящих знаний у меня мало. Планирую как раз обучаться по нормальному в момент пересоздания сайта который делаю сейчас.
>>320351
После редиректа header() надо ставить die()
>>320351
> Естественно, рeдирeкт он не делает, так как перед хедером ничего не должно быть.
В приведенном скрипте перед редиректом вроде ничего и нету. Должно работать, если поставить die()
>>320356
И правда, работает. А разве он не требует чтобы перед хедером вообще никаких строчек небыло? И не будет ли никаких конфликтов, если хедер используется сначала для указания кодировки, а затем для редиректа?
>>320357
Лучше бы конечно content-type переставить так, чтобы он не вызывался при редиректе, куда-нибудь пониже.
>>320358
Нет, все таки не получилось. Если делать редирект на ссылку - все хорошо. Если делать редирект на документ - Cannot modify header information - headers already sent by...
Пробовал убрать первую строчку хедера с кодировкой, чтобы поставить ее в строке редиректа, но так слетает кодировка и в браузере иероглифы. И все равно не перенаправляет при отправке формы, даже со сбитой кодировкой. Пишет туже самую ошибку. Делаю вот так:
http://ideone.com/JzyS10
>>320360
> header('Location: /1.php Content-type: text/html; charset=utf-8');
Так нельзя писать. «переставить» я имел в виду, поствить строчку header('Content-type: text/html; charset=utf-8') дальше, после if чтобы при редиректе она не вызвалась вообще.
> Если делать редирект на документ - Cannot modify header information - headers already sent by...
Это у тебя что-то криво. Может, ты опять блокнотом Windows в како-нибудь файл BOM добавил?
>>320363
Нет, юзал UTF-8 без BOM в notepad++.
Ладно, это кара мне за индусский код. Попробую все таки все разрешить. Хороший опыт на будущее.
Открыл сейчас код, глянул, понял насколько я бездарен и невнимателен.
>echo "$login $pass $bool"; в четвертой строке
Нельзя же ничего выводить, а я еще хочу чего-то. Все заработало, ОП, прошу прощения.
Алсо, бамплимит у треда же.
>>320368
> Нельзя же ничего выводить, а я еще хочу чего-то.
Чтобы такого не было, старайся всегда делить скрипт на две части: первая только обрабатывает данные, и записывает их в переменные, но ничего не выводит, а вторая часть выводит HTML-код (примерно как у тебя и сделано). Просто возьми это за правило.
Иногда еще эти 2 части разносят в 2 скрипта: первый скрипт только обрабатывает данные, а в конце подключает второй, который и выводит их.
> бамплимит
Скоро создадим новый тред.
Антоны! Подскажите php-нубу. Пишу всякий мелкий код в np++, в целом все нравится, автокомплиты и прочие ништяки. Но вот такая ситуация:
Вот ковыряю я, допустим, чей-то уже код. Ну допустим это CMS. И там хуева туча всяких функций. И я начинаю исследовать какую-то функцию, но мне интересно, где она еще вызывается-то.
Короче, не знаю как обьяснить популярно… Есть ли какая-то IDE или инструмент, который создаст для меня после сканирования определенного количества файла этакое дерево зависимостей функций. Ну то есть я тыкаю - а инструмент мне: а еще она вызывается там-то и там-то
Анон, поясни по хардкору, сколько не юзаю разные фреймы, никак не могу уяснить такую простую вещь. Где должен происходить забор данных из модели в контроллере или модели?
Типо в теории в модели, но в куче фреймов типо симфони, кохана и микрофреймах, обращение к базе данных происходит в контроллере. А вот в том же зенде и CI за это могут пизды дать.
Лично мне кажется первый вариант намного логичнее, если тебе нужно провести обычную выборку из 1-ой таблицы и сразу поместить её в вывод, петухи которые говорят, что ТАК НЕ ХИБКО, не могу привести внятного примера почему. С другой стороны, в таком случае классы модели становятся оч тонкие и описывают только логику зависимостей и подготовку сложных выводов данных. ОПытный анон, объясни как лучше делаьт.
>>320467
Есть такие варианты:
1) Если надо по имени функции/класса перейти к ее определению. Это есть в любых больших IDE вроде Eclipse, Netbeans и даже в редакторе Sublime с 3-й версии.
2) Найти все места, где используется функция. В больших IDE есть инструменты для этого, но они не работают на 100% верно. Единственный работающий способ — сделать поиск по файлам.
В общем, попробуй Eclipse PDT или Netbeans, там функционал индексирования кода есть.
>>320572
> Типо в теории в модели, но в куче фреймов типо симфони, кохана и микрофреймах, обращение к базе данных происходит в контроллере.
Не, такого нету, ты наверно что-то путаешь. Покажи код, я тебе не верю.
Правильная идея такая. Работа с БД происходит только в модели, а контроллер только вызывает методы этой модели. Если уж делать совсем правильно, то каждая модель должна работать только со своей таблицей и ни в коем случае не лезть в чужие ( http://ru.wikipedia.org/wiki/Принцип_единственной_обязанности ).
Почему? Потому, что если один класс работает только с одной, своей, таблицей — это логично и организованно. Надо поменять логику работы с таблицей — достаточно поменять один класс. Вся логика собрана в одном месте.
Если же кто угодно может писать в любую таблицу, это бардак, а бардак способствует возникновению багов и ошибок. Логика работы с таблицей тонким слоем размазана по всему коду и перемешана с другой логикой. А если надо что-то поменять, то придется по всему коду искать обращения к этой таблице. Это верный путь к быдлокодингу.
В контроллере должно быть минимум логики, контроллер сам никакой работы не делает, он только руководит другими. Контроллер делает такие вещи:
— получает и обрабатывает GET/POST параметры
— вызывает сервисы проверки авторизации и прав пользователя
— вызывает модель для получения данных (если надо)
— вызывает сервисы для обработки данных (если это требуется)
— редиректит если надо
— вызывает классы для работы с формой, если надо обработать данные из формы
Заметь, сам он почти никогда ничего не делает, а просто вызывает методы других классов (поручает работу другим). Это так называемый принцип тонких контроллеров. Старайся, чтобы экшен в контроллере укладывался в 10-20 строк.
Если не очень понятно, давай на конкретном примере кода разберем что хорошо, а что плохо.
Не могу норм припомнить, гугление наткнула на манула по симфони
"Цель у контроллера всегда одна: создать и вернуть объект Response. Следуя этой цели, контроллер может читать информацию из запроса, загружать ресурсы из базы данных, отправлять email или же записывать информациюю в сессию пользователя. Но всегда, в конечном итоге, контроллер вернёт объект Response, который будет отправлен клиенту."
А когда учил кохану там были примеры кода где все делается в контроллере, в микрофреймворка тоже часто все запросы осуществляются именно там.
>>320617
Не, я понял, просто фрейм который я юзал, нарочито толкал меня к толстым котролерам, но там это упрощало логику и он был предназначени дял маленьких и средних проектов. Запрос в базу происходил в контроллере таким спосбом.
$data = $this->orm->get('имя модели')->find_all()
Вот самый простой пример запроса, при этом в модели за все время работы с этим фреймом я только определял зависимости между таблицами, а так методов там никаких не было. Одна модель для каждой таблицы
>>320618
> загружать ресурсы из базы данных, отправлять email или же записывать информациюю в сессию пользовател
Так он делает это не сам, а вызывая модель (для работы с БД), сервис отправки email. То есть через другие классы.
С сессией можно и напрямик работать, это да.
> А когда учил кохану там были примеры кода где все делается в контроллере,
Значит, это был плохой код.
> в микрофреймворка тоже часто все запросы осуществляются именно там.
Микрофреймворк рассчитан на сайты из 2 страниц, там нет проблемы бардака так как кода очень мало, и там это делают ради экономии времени, хотя по мне так лишний класс создать — дело на 30 секунд, я бы сделал отдельный класс.
>>320623
Так это нормально, ты в контроллере же не пишешь SQL-запросы, а используешь модель. Ненормально, если ты в контроллере пишешь $this->db->fetchAll('SELECT ..... на 20 строчек')
Если же выборка более сложная (например, надо выбрать данные из одной таблицы, хитро их обработать и объединить с данными из другой), то это лучше вынести из контроллера в класс-сервис.
Ну что? Лето заканчивается, хнык-хнык, а мы в этом треде по-прежнему изучаем основы языка 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, робот его выровняет как надо.
Решил задачу, но ничего не понял? Попроси еще пару для закрепления знаний.
В общем, хватит разговоров, давайте начинать уже!