Это копия, сохраненная 7 ноября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>386602
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть задачки по основам JS и DOM, хорошие, многие их с ходу решить не могут, попроси, дадим ссылку. Есть задачка на MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Не поздно ли в мои 40 становиться программистом? Ох, это будет сложно, но если ты покажешь лучшие знания, чем моложежь, то шансы есть.
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
[code]
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
[/code]
у определений функций и классов так:
[code]
function bakeCookies(...)
{
// ...
}
[/code]
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Основные правила
Если ты вдруг решил выровнять код вручную, запомни эти правила:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский (неужели такое бывает?) Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела, а не табы (нужно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
скобки в for и if/else ставятся так (египетские скобки):
[code]
if (...) {
// ...
} else {
// ...
}
for (...) {
// .....
}
[/code]
у определений функций и классов так:
[code]
function bakeCookies(...)
{
// ...
}
[/code]
Официальные ссылки
В PHP есть система стандартов с названием PSR. Вот стандарты, относящиеся к оформлению кода:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Та же разработка через тестирование - я пишу что? То же самое создание экземпляра, вызов предполагаемого метода для получения всех товаров. Ок, реализую простейшее решение - обращение к дб, вывод результата. Добавляю возможность фильтра в тесте. Реализую в коде. Проверяю тестом. Все так?
Понял и выделил для себя каскад и итерации. Каскад имхо миф, в итоге все равно что то допиливается и перепиливается в реальном проекте для пользователей.
Не нашел книгу "паттерны программирования для корпоративных приложений", может она не так называется? Это не Фаулер случайно?
Хочу понять для себя порядок разработки крупного проекта. Ну например соцсеть.
Понятно, умные дядьки и тетки выше решили зачем оно, кому надо, таргетгруп итп.
Что дальше? За работу берутся дизайнеры, которые рисуют интерфейс, основные разделы, где и как пользователь будет взаимодействовать и что получать, что будет подгружаться ajax а что нет, где что и как будет выводится, что у нас будет в строке адреса. Так?
Потом отдают ворох надеюсь структурированных и продуманных идей программерам. Они смотрят и выделяют какие будут ... Таблицы БД? Модули системы? Как будет и куда будет вести роутинг?
Как идет этот этап? Что после него?
> Кстати, на jsbin все же показываются 0 на месте пустых клеток,
У меня при клике по пустой клетке ничего не происходит.
По коду: главная проблема, на мой взгляд, что ты спутываешь в одну кучу логику и отображение. И хранить данные в аттрибутах, по моему неудобно и костыльно:
> this.field.rows.cells[j].getAttribute('value') != '-1'
(кстати, для своих аттрибутов надо использовать префикс data- то есть например data-value).
Соответственно, надо бы разделить код на класс с логикой и класс, который отвечает за отображение данных. Или хотя бы в отдельные функции это вынести. Тут можно сделать один класс, который отвечает за все поле, а можно сделать каждую клетку объектом.
Соответственно, тогда информация о минах, открытых клетках будет храниться в нормальных массивах без всяких исхитрений.
Темная надпись You lose плохо читается на темном фоне. Надо либо сделать ее светлой, либо поиграть с добавлением белой text-shadow. Черный значок молнии тоже слабо различим на темно-зеленой клетке.
> if(elem.className === '') return false;
Стоит всегда ставить фигурные скобки в if, так как это защищает от ошибок.
В addClass можно было написать просто var classes += ' ' + klass; там где используется split/join. Также, имена классов могут быть разделены не только пробелами, но и другими пробельными символами (\n или \t) так что тут было бы лучше разбивать по регулярке \s+
> Math.pow(this.size - 2, 2);
Идея добавлять невидимые клеточки с краев — какой-то кривой костыль. Я думаю, проблему можно решить лучше.
> while (target.tagName != 'TD') {
> if (target == this) return;
> target = target.parentNode;
Это надо сделать отдельной функцей. В jQuery она назвается closest, думаю, можно взять это название.
Если кликнуть по пустой клетке несколько раз в фаерфоксе, появляется:
> TypeError: this.field.rows is undefined (line 289)
> this.field.oncontextmenu
Это не событие клика правой кнопкой. Это событие открытия меню которое можно например вызвать с клавиатуры кнопкой справа от пробела. Тебе нужен mousedown/mouseup (так как нажатие правой кнопки не генерирует click).
При клике по клетке с нулем надо раскрывать все 8 соседних с ней.
Попап удобнее создавать из шаблона, как описано тут: http://javascript.ru/unsorted/templating только шаблонизатор сделать попроще, который только заменяет {{var}} на содержимое переменной. Тогда у тебя будет попап в виде нормального HTML-кода.
А сейчас у тебя кнопка и надпись не внутри попапа оказались. Ты умеешь пользоваться инспектором, который есть в Хроме и ФФ (Ctrl + Shift + I)? Если нет, срочно учись, там эта ошибка сразу видна:
http://habrahabr.ru/post/143767/
https://developer.chrome.com/devtools (англ)
> document.body.removeChild(this.field);
Удобно сделать функцию removeNode(node)
> table
Лучше использовать класс и привязать все стили к нему, так как сейчас твою игру нельзя встроить на веб-страницу: она переопределяет вид всех таблиц на ней.
Еще, в фаерфокс при нажатии на клетку она становится чуть шире и таблица едет. Поэкспериментируй, можно ли это победить. Насколько я помню, тут срабатывает особенность фаерфокса, что он поддерживает дробные размеры в пикселях и как-то их хитро округляет.
> .popup-button {
> z-index: 1001;
z-index применимо только к позиционированным элементам
> Кстати, на jsbin все же показываются 0 на месте пустых клеток,
У меня при клике по пустой клетке ничего не происходит.
По коду: главная проблема, на мой взгляд, что ты спутываешь в одну кучу логику и отображение. И хранить данные в аттрибутах, по моему неудобно и костыльно:
> this.field.rows.cells[j].getAttribute('value') != '-1'
(кстати, для своих аттрибутов надо использовать префикс data- то есть например data-value).
Соответственно, надо бы разделить код на класс с логикой и класс, который отвечает за отображение данных. Или хотя бы в отдельные функции это вынести. Тут можно сделать один класс, который отвечает за все поле, а можно сделать каждую клетку объектом.
Соответственно, тогда информация о минах, открытых клетках будет храниться в нормальных массивах без всяких исхитрений.
Темная надпись You lose плохо читается на темном фоне. Надо либо сделать ее светлой, либо поиграть с добавлением белой text-shadow. Черный значок молнии тоже слабо различим на темно-зеленой клетке.
> if(elem.className === '') return false;
Стоит всегда ставить фигурные скобки в if, так как это защищает от ошибок.
В addClass можно было написать просто var classes += ' ' + klass; там где используется split/join. Также, имена классов могут быть разделены не только пробелами, но и другими пробельными символами (\n или \t) так что тут было бы лучше разбивать по регулярке \s+
> Math.pow(this.size - 2, 2);
Идея добавлять невидимые клеточки с краев — какой-то кривой костыль. Я думаю, проблему можно решить лучше.
> while (target.tagName != 'TD') {
> if (target == this) return;
> target = target.parentNode;
Это надо сделать отдельной функцей. В jQuery она назвается closest, думаю, можно взять это название.
Если кликнуть по пустой клетке несколько раз в фаерфоксе, появляется:
> TypeError: this.field.rows is undefined (line 289)
> this.field.oncontextmenu
Это не событие клика правой кнопкой. Это событие открытия меню которое можно например вызвать с клавиатуры кнопкой справа от пробела. Тебе нужен mousedown/mouseup (так как нажатие правой кнопки не генерирует click).
При клике по клетке с нулем надо раскрывать все 8 соседних с ней.
Попап удобнее создавать из шаблона, как описано тут: http://javascript.ru/unsorted/templating только шаблонизатор сделать попроще, который только заменяет {{var}} на содержимое переменной. Тогда у тебя будет попап в виде нормального HTML-кода.
А сейчас у тебя кнопка и надпись не внутри попапа оказались. Ты умеешь пользоваться инспектором, который есть в Хроме и ФФ (Ctrl + Shift + I)? Если нет, срочно учись, там эта ошибка сразу видна:
http://habrahabr.ru/post/143767/
https://developer.chrome.com/devtools (англ)
> document.body.removeChild(this.field);
Удобно сделать функцию removeNode(node)
> table
Лучше использовать класс и привязать все стили к нему, так как сейчас твою игру нельзя встроить на веб-страницу: она переопределяет вид всех таблиц на ней.
Еще, в фаерфокс при нажатии на клетку она становится чуть шире и таблица едет. Поэкспериментируй, можно ли это победить. Насколько я помню, тут срабатывает особенность фаерфокса, что он поддерживает дробные размеры в пикселях и как-то их хитро округляет.
> .popup-button {
> z-index: 1001;
z-index применимо только к позиционированным элементам
Автотест — это тест который сам может проверить свои результаты. В отличие от обычного, где результаты оценивает человек.
> Та же разработка через тестирование - я пишу что?
Это когда ты сначала формируешь требования к классу в виде тестов (метод add должен вернуть сумму 2 чисел), а потом пишешь код чтобы все тесты проходились.
> пишу создание экземпляра и вызов (всех?) методов, проверяю что вывод соответствует ожиданиям.
Имей в виду, тесты бывают разных видов:
- юнит-тесты — тестируют один класс в изолированном окружении. Все внешние классы подменяются на моки, в том числе работа с файлами, сетью и базой данных.
- интеграционные тесты - тестируется вместе группа классов. Тут можно тестировать класс вместе с Бд. При этом естественно используется тестовое окружение, и развернутая из заранее подготовленного дампа база (для MySQL удобно использовать таблицы типа MEMORY которые работают очень быстро так как хранятся в памяти).
- функциональные/приемочные тесты — тестируется продукт насквозь через интерфейс, то есть робот жмет кнопку и убеждается что результат соответствует одижаниям.
Ну и вообще, тестирование — это отдельная наука. Но зато имея правильно составленные тесты, ты можешь запустить их и убедиться что все работает, не занимаясь ручными проверками.
>Соответственно, надо бы разделить код на класс с логикой и класс, который отвечает за отображение данных
Получается, нужно с промежуточной матрицей работать? Думал, что без нее лучше.
Книга эта, да, Фаулер:
http://martinfowler.com/books/eaa.html
http://www.williamspublishing.com/Books/5-8459-0579-6.html
Насчет методологии разработки, сейчас модно делать гибкую (agile) разработку с continuous integration. Гибкая — значит что все делается параллельно, пока программисты кодят одну страницу, дизайнеры рисуют вторую, плюс никто не строит далеких планов и не знает что будут делать через месяц, все может поменяться (это необходимо для выживания на высококонкурентном рынке, кроме того заказчик часто сам не знает что он хочет). Continuous Integration — значит процесс сборки, тестирования и деплоя (разворачивания) проекта максимально автоматизирован, а команды регулярно выгружают новый код.
Соответственно, в этом случае никто не пишет многостраничные ТЗ (как в случае водопада) — менеджер просто на словах объясняет разработчикам что надо сделать. В веб-разработке абсолютно реально сделать и выкатить какую-то несложную фичу за 2-3 дня.
Настраивается несколько окружений: у каждого разработчика есть свое окружение для разработки (в случае сайтов это локальный Апач на компьютере), есть продакшен — боевые сервера, и есть предпродакшен (stage) — это сервер, который доступен только для своих, и куда выкладывают код для проверки/просмотра перед тем как выкладывать на продакшен. Также, если есть тестеры, то у них может быть свои тестовые сервера где они могут развернуть нужную версию кода.
Компании типа facebook поступают так: сначала новый код выкладывается на сервер, которым пользуются только сотрудники (eat own dogfood). Потом включается для нескольких процентов пользователей. И только потом, если все ок, он включается для всех.
В случае когда у компании много серверов (facebook, yandex) обычно есть отдельная команда (Dev Ops) людей, которые их настраивают, автоматизируют выкладку кода, тестирование и т.д.
Для того, чтобы отслеживать задачи, которые надо сделать, и фиксировать ошибки, испольуются системы вроде Redmine, JIRA, Trello ( http://habrahabr.ru/company/alconost/blog/218245/ ).
https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8
В рамках agile есть разные подходы. Вот например книга «getting real» от 37 signals где они описывают свои принципы разработки приложений:
https://gettingreal.37signals.com/ (англ)
http://blog.web2.com.ua/wp-content/uploads/getting-real.pdf (рус)
Есть такая методология как скрам:
https://ru.wikipedia.org/wiki/Scrum
http://dev.by/blogs/main/kanban-na-paltsah
Также, вот еще пара терминов, которые тебе могут встретится и которые относятся именно к коду а не к организации процесса:
SOLID: https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
YAGNI: https://ru.wikipedia.org/wiki/YAGNI
KISS: https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)
DRY: https://ru.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself
Поучительная история:
http://habrahabr.ru/post/153225/
http://habrahabr.ru/post/153845/
> работу берутся дизайнеры, которые рисуют интерфейс, основные разделы, где и как пользователь будет взаимодействовать и что получать, что будет подгружаться ajax а что нет, где что и как будет выводится, что у нас будет в строке адреса. Так?
Да, они еще называются UX дизайнеры/проектировщики интерфейса.
> где что и как будет выводится, что у нас будет в строке адреса.
Вот это не факт, это уже техническая реализация, за нее отвечают разработчики. В некоторых командах есть архитектор, который принимает решения, какие фреймворки использовать, какую платформу. В некоторых — нет, и это решают сами программисты.
> Потом отдают ворох надеюсь структурированных и продуманных идей программерам
> Они смотрят и выделяют какие будут ... Таблицы БД? Модули системы? Как будет и куда будет вести роутинг?
Да, верно. Они отдают не ворох идей, а макеты/наброски интерфейса и объясняют как это должно работать. Соответственно, разработчики быстро обсуждают как это реализовать и начинают писать код. При гибкой разработке никаких долгих проектирований нет. Естественно, разработчики должны иметь определенный опыт, новичок тут может и не справиться.
В других компаниях делают по-другому: каждому семпаю сеньору дают несколько джуниоров, он распределяет им простые задачи, а сам делает то, что посложнее.
> Как идет этот этап? Что после него?
После написания кода — выгрузка на стейдж, код смотрят, тестеры тестируют, если все ок то выгружают (деплоят) на продакшен. И переходят к следующей фиче. Если компания маленькая то шаг «выложить на стейдж и протестировать» могут пропустить.
Вот, я опять вместо того, чтобы разложить все по полочкам, вываливаю кучу ссылок, надеюсь ты разберешься. Вот еще ссылки, где компании описвают принятые у них подходы:
http://habrahabr.ru/company/badoo/blog/190572/
http://habrahabr.ru/company/yandex/blog/237017/ (я вообще советую просмотреть весь блог яндекса на хабре — там много интересного)
http://habrahabr.ru/company/megafon/blog/236055/
http://habrahabr.ru/company/celecom/blog/232587/
http://habrahabr.ru/company/taucraft/blog/144051/
https://tech.yandex.ru/education/shri/simf-2013/talks/665/
http://habrahabr.ru/post/135776/ (тут больше про тестирование ну да ладно)
http://macode.ru/
Книга эта, да, Фаулер:
http://martinfowler.com/books/eaa.html
http://www.williamspublishing.com/Books/5-8459-0579-6.html
Насчет методологии разработки, сейчас модно делать гибкую (agile) разработку с continuous integration. Гибкая — значит что все делается параллельно, пока программисты кодят одну страницу, дизайнеры рисуют вторую, плюс никто не строит далеких планов и не знает что будут делать через месяц, все может поменяться (это необходимо для выживания на высококонкурентном рынке, кроме того заказчик часто сам не знает что он хочет). Continuous Integration — значит процесс сборки, тестирования и деплоя (разворачивания) проекта максимально автоматизирован, а команды регулярно выгружают новый код.
Соответственно, в этом случае никто не пишет многостраничные ТЗ (как в случае водопада) — менеджер просто на словах объясняет разработчикам что надо сделать. В веб-разработке абсолютно реально сделать и выкатить какую-то несложную фичу за 2-3 дня.
Настраивается несколько окружений: у каждого разработчика есть свое окружение для разработки (в случае сайтов это локальный Апач на компьютере), есть продакшен — боевые сервера, и есть предпродакшен (stage) — это сервер, который доступен только для своих, и куда выкладывают код для проверки/просмотра перед тем как выкладывать на продакшен. Также, если есть тестеры, то у них может быть свои тестовые сервера где они могут развернуть нужную версию кода.
Компании типа facebook поступают так: сначала новый код выкладывается на сервер, которым пользуются только сотрудники (eat own dogfood). Потом включается для нескольких процентов пользователей. И только потом, если все ок, он включается для всех.
В случае когда у компании много серверов (facebook, yandex) обычно есть отдельная команда (Dev Ops) людей, которые их настраивают, автоматизируют выкладку кода, тестирование и т.д.
Для того, чтобы отслеживать задачи, которые надо сделать, и фиксировать ошибки, испольуются системы вроде Redmine, JIRA, Trello ( http://habrahabr.ru/company/alconost/blog/218245/ ).
https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8
В рамках agile есть разные подходы. Вот например книга «getting real» от 37 signals где они описывают свои принципы разработки приложений:
https://gettingreal.37signals.com/ (англ)
http://blog.web2.com.ua/wp-content/uploads/getting-real.pdf (рус)
Есть такая методология как скрам:
https://ru.wikipedia.org/wiki/Scrum
http://dev.by/blogs/main/kanban-na-paltsah
Также, вот еще пара терминов, которые тебе могут встретится и которые относятся именно к коду а не к организации процесса:
SOLID: https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
YAGNI: https://ru.wikipedia.org/wiki/YAGNI
KISS: https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)
DRY: https://ru.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself
Поучительная история:
http://habrahabr.ru/post/153225/
http://habrahabr.ru/post/153845/
> работу берутся дизайнеры, которые рисуют интерфейс, основные разделы, где и как пользователь будет взаимодействовать и что получать, что будет подгружаться ajax а что нет, где что и как будет выводится, что у нас будет в строке адреса. Так?
Да, они еще называются UX дизайнеры/проектировщики интерфейса.
> где что и как будет выводится, что у нас будет в строке адреса.
Вот это не факт, это уже техническая реализация, за нее отвечают разработчики. В некоторых командах есть архитектор, который принимает решения, какие фреймворки использовать, какую платформу. В некоторых — нет, и это решают сами программисты.
> Потом отдают ворох надеюсь структурированных и продуманных идей программерам
> Они смотрят и выделяют какие будут ... Таблицы БД? Модули системы? Как будет и куда будет вести роутинг?
Да, верно. Они отдают не ворох идей, а макеты/наброски интерфейса и объясняют как это должно работать. Соответственно, разработчики быстро обсуждают как это реализовать и начинают писать код. При гибкой разработке никаких долгих проектирований нет. Естественно, разработчики должны иметь определенный опыт, новичок тут может и не справиться.
В других компаниях делают по-другому: каждому семпаю сеньору дают несколько джуниоров, он распределяет им простые задачи, а сам делает то, что посложнее.
> Как идет этот этап? Что после него?
После написания кода — выгрузка на стейдж, код смотрят, тестеры тестируют, если все ок то выгружают (деплоят) на продакшен. И переходят к следующей фиче. Если компания маленькая то шаг «выложить на стейдж и протестировать» могут пропустить.
Вот, я опять вместо того, чтобы разложить все по полочкам, вываливаю кучу ссылок, надеюсь ты разберешься. Вот еще ссылки, где компании описвают принятые у них подходы:
http://habrahabr.ru/company/badoo/blog/190572/
http://habrahabr.ru/company/yandex/blog/237017/ (я вообще советую просмотреть весь блог яндекса на хабре — там много интересного)
http://habrahabr.ru/company/megafon/blog/236055/
http://habrahabr.ru/company/celecom/blog/232587/
http://habrahabr.ru/company/taucraft/blog/144051/
https://tech.yandex.ru/education/shri/simf-2013/talks/665/
http://habrahabr.ru/post/135776/ (тут больше про тестирование ну да ладно)
http://macode.ru/
Чем лучше? С массивом у тебя будет:
if (this.hasBomb(x, y)) ...
что гораздо читабельнее колбасы из this.field.rows...
А смешивать в кучу логику и отображаениеплохо. Представь, что завтра тебе надо сделать сетевую версию игры: вместо отображения в браузере твоя игра получает запросы по сети от игрока и должна слать ответы. Или надо сделать текстовый интерфейс: игрок пишет в консоли координаты и ему в ответ рисуется поле.
Вопрос: можно ли твой нынешний код переделать под такое? Очевидно нет, так как он завязан намертво на браузерный DOM.
>>391979
https://gist.github.com/codedokode/ce30e7a036f18f416ae0#3-%D0%A1%D0%B0%D0%BF%D0%B5%D1%80
Если у тебя есть метод только для поиска в базе, то тестирование стоит сделать так:
- загружаем в чистую базу дамп либо очищаем базу и программно запихиваем несколько записей
- делаем выборку и убеждаемся что в результатах есть заранее известные записи и их число верное
- задаем параметр фильтрации и убеждаемся что запись подпадающая под фильтр, возвращается, а запись не подходящая — нет
- тестируем фильтр на всяких коварных параметрах: содержащих кавычки, текст вместо числа, число с пробелом внутри, неправильное число и т.д. Заодно можно попробовать убедиться что SQL-инъекция через параемтры фильтра не сработает.
Сперва для изучения скачал рандомный туториал. Там в первых же главах говорится о том, что чтобы начать работу с пхп, необходимо установить wamp сервер. Сделал все, как было написано, но наткнулся на ошибку - в консоли выводилась надпись, что порт 80 уже используется IIS. Погуглив на эту тему и нихуя не поняв, я прочитал дальше, что можно обойтись без него, и настроить работу с IIS. Сделал все, как рассказали в гугле, и все равно нихуя не заработало. Затем в оф. мануале написано, что можно скачать apache и потыкать и поустанавливать что-нибудь там. Здесь приведен список файлов в установочной папке http://ru2.php.net/manual/en/install.windows.manual.php. Но он совсем не совпадает с тем, что есть на самом деле. На другом сайте рассказали, что нужно запустить скрипт configuration, но во-первых, он запускался только после запуска другого bat-файла, и то потом выдавал ошибку. В общем, я опять нихуя не понял. В ютубе глянул, там сказали, что нужно установить xampp, но это совсем какая-то хуйня. Расскажите, как установить все, что требуется и нормально начать работу с пхп на шиндовсе.
Ясен хуй, ты ничё не запустишь, если у тебя макрософаковская хуйня 80й порт отожрала. Выруби IIS (пкм мой комп -> управление -> службы и приложения) и ставь чё хочешь. Пользуюсь опенсервером, мне охуенно.
http://jsbin.com/kulucuxadahe/1/edit.
>Когда ты делаешь наследование, надо вызывать конструктор предка (ElementsNetwork). Он у тебя пустой, но вызывать все равно стоит на случай если туда кто-то что-то впишет.
Это же свойство? Как тогда его вызывать можно?
Смотри, я там специально заменил баланс с положительного на отрицательный(просто сначала писать код для покупки). Метод для выбора линии электропередач я не дописал, потому что там у меня будут повторы, не знаю как избежать. Это все, что я понаписал, наверное, можно оптимизировать, но я не знаю как.
В общем, я отключил IIS, только не так, как ты сказал, а через компоненты шиндошс, и wamp заработал. Буду теперь с ним работать.
ну вот например я хочу в диКонтейнер захуячить работу с бд
очевидно это нужно сделать перед началом работы с контроллерами и классами
где для этого место?
мои варианты - захуячить в главный контроллер
могу ли я просто создать ёба-класс АУТОРУН и туда установить всё это говно?
внедрёнными зависимостями фикс
алсо я правильно понял как его использовать - я то что надо засовываю в переменную контейнера - а в классе достаю как из глобальной переменной?
http://extensions.joomla.org/extensions/miscellaneous/mass-content/18000
Теперь его нужно расширить. Опять же он сделан как компонент, а потому приходится все таки заходить в админку и через нее им пользоваться. Сама админка тормознутая, да и компонент не совершенен. Поэтому нужно сделать этот компонент полноценной админкой.
А вот, что еще можно сделать. Взять код джумловской админки, то есть все, что находится в папке administrator и почистить его. Почистить от всякого барахла и интегрировать код из компонента.
Далее хотелось бы сделать простое переключение между оригинальной джумловской админкой и моей. Думаю как это лучше сделать. Либо самому код править каждый раз и комментировать ненужные строки, либо реализовать графическое переключение, то есть после ввода логина и пароля можно было бы выбирать.
>только без КОКОКО ГЛАБАЛЬНЫЕ ПЕРЕМЕННЫЕ ПЛОХА
>неужели только из-за этого?
нет, изменяемые глобальные переменные это отличных способ связанности тысячи построенных программ, не слушай их
да пиздец я не спорю с этим
но раз это плохо - то почему этот контейнер - что по сути одно и то же - вдруг НЕ плохо?
почему?
разницы же нет нихуя
Полезнее учиться ставить и настраивать все самому. Если ты хочешь чувствовать себя суровым бородатым программистом, а не девочкой, то снеси свой openserver и установи все сам:
— MySQL — устанавливается как обычная программа, через инсталлятор
— PHP: гайд https://gist.github.com/codedokode/7054af4a03865c4cc863
— Апач: гайд https://gist.github.com/codedokode/10774100
Проясняю. Я не знаю, выполняется ли оно быстрее или нет, но знаю, какого порядка разница. Разница настолько микроскопическа (доли микросекунд), что она теряется на фоне случайных ошибок. То есть запусти один скрипт 2 раза, разница по времени выполнения будет больше чем от замены кавычек.
То есть пользы от конкатенации нет. А может, есть вред? Конечно, есть. Во-первых, обилие точек и кавычек хуже читается. Во-вторых, эта микрооптимизация мотивирует бездельников заниматься заменой кавычек вместо того, чтобы делать полезную работу.
То есть если ты хочешь сказать «но это быстрее...» то ты не прав. Если ты хочешь сказать «это лучше читается», «это уменьшает вероятность ошибиться», «это быстрее пишется» — тогда этот аргумент можно обсудить.
Микрооптимизации не нужны.
Этот процесс начальной загрузки называется бутстрап. Для него обычно делается отдельный класс, который читает конфиги, создает классы и т.д. Вот процесс бустрапа в ZF: http://framework.zend.com/manual/1.12/ru/zend.application.quick-start.html
В Symfony 2 пошли более хардкорным путем: там вообще код, нужный для инициализации при первом запуске автоматически склеивается в большой php-файл и в дальнейшем подключается (вместо того, чтобы читать конфиги, загружать много классов).
http://symfony-gu.ru/documentation/ru/html/book/performance.html#bootstrap
Вот файл с которого обычно начинается выполнение кода: https://github.com/symfony/symfony-standard/blob/master/web/app.php Он вызывает класс AppKernel.
Соответственно, отвечая на вопрос:
> очевидно это нужно сделать перед началом работы с контроллерами и классами
Это зависит от фреймворка. Симфони в стадии бустрапа создает DI container, пустой, затем обходит все бандлы (там проект делается из бандлов - это может быть как написанный тобой бандл, так и сторонний код), собирает в них файлы с описанием сервисов, который каждый предсотавляет и засовывает эту информацию в контейнер (потом для оптимизации все это запекается в bootstrap.php.cache).
То есть каждый бандл может объявить сервисы которые он предоставляет. Ты подключаешь стороннюю библиотеку и у тебя в контейнеры появляются сервисы A, B, C от нее которые ты можешь использовать.
А если ты хочешь сам сделать сервис my_service который можно получить через контейнер, ты просто описываешь его в конфиге: http://symfony.com/doc/current/book/service_container.html#creating-configuring-services-in-the-container
> мои варианты - захуячить в главный контроллер
Ты становишься на один шаг ближе к реализации антипаттерна God Object: https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82
Каждый должен заниматься своим делом. Если тебе нужен DI Container, надо сделать отдельный класс.
Этот процесс начальной загрузки называется бутстрап. Для него обычно делается отдельный класс, который читает конфиги, создает классы и т.д. Вот процесс бустрапа в ZF: http://framework.zend.com/manual/1.12/ru/zend.application.quick-start.html
В Symfony 2 пошли более хардкорным путем: там вообще код, нужный для инициализации при первом запуске автоматически склеивается в большой php-файл и в дальнейшем подключается (вместо того, чтобы читать конфиги, загружать много классов).
http://symfony-gu.ru/documentation/ru/html/book/performance.html#bootstrap
Вот файл с которого обычно начинается выполнение кода: https://github.com/symfony/symfony-standard/blob/master/web/app.php Он вызывает класс AppKernel.
Соответственно, отвечая на вопрос:
> очевидно это нужно сделать перед началом работы с контроллерами и классами
Это зависит от фреймворка. Симфони в стадии бустрапа создает DI container, пустой, затем обходит все бандлы (там проект делается из бандлов - это может быть как написанный тобой бандл, так и сторонний код), собирает в них файлы с описанием сервисов, который каждый предсотавляет и засовывает эту информацию в контейнер (потом для оптимизации все это запекается в bootstrap.php.cache).
То есть каждый бандл может объявить сервисы которые он предоставляет. Ты подключаешь стороннюю библиотеку и у тебя в контейнеры появляются сервисы A, B, C от нее которые ты можешь использовать.
А если ты хочешь сам сделать сервис my_service который можно получить через контейнер, ты просто описываешь его в конфиге: http://symfony.com/doc/current/book/service_container.html#creating-configuring-services-in-the-container
> мои варианты - захуячить в главный контроллер
Ты становишься на один шаг ближе к реализации антипаттерна God Object: https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82
Каждый должен заниматься своим делом. Если тебе нужен DI Container, надо сделать отдельный класс.
ОП, задача для MySql на лайки.
http://sqlfiddle.com/#!2/c45b6/2
Не доходит что-то до меня как посчитать взаимные лайки, намекни а?
То есть, логически задача несложная, найти зеркальные пары значений для каждого юзер айди, посчитать и занести в таблицу, но как ее реализовать?
Охуенно, спасибо. Я сразу понял, в чем у меня проблемы были.
>>392099
> могу ли я просто создать ёба-класс АУТОРУН и туда установить всё это говно?
Назови его bootstrap, kernel, core, loader, boot, или как-то похоже и будет ок.
> алсо я правильно понял как его использовать - я то что надо засовываю в переменную контейнера - а в классе достаю как из глобальной переменной?
Не совсем так, ты не понял. Перечитай потом статью Фаулера и мануал Симфони 2 про DI контайнер. Так как ты можешь полениться это сделать, или не понять, я сейчас распишу существующие паттерны. Надеюсь, в процессе разбора я смогу донести в чем проблема и как ее решают. И в чем отличие DI контейнера от глобальной переменной.
Вот я расписал все: https://gist.github.com/codedokode/e1d31a31b37d5f635057
задавай если что непонятно.
Конструктор это функция которая пишется после new. А не свойство constructor: http://learn.javascript.ru/object-methods
Свойство constructor лишь указывает на то кто создал объект.
> if (this.listElements.power) {
Не лезь внутрь чужжого объекта. Алсо, if не нужен достаточно вернуть 0 из showPower.
Код покупки делается просто:
- сортируем линии по убыванию выгодности
- пока (нужный объекм не выкуплен и в списке есть линии) {
берем самую верхнюю не тронутую линию и выкупаем у нее доступный максимум энергии
}
> if (-balance <= powerlines.bandwidth) {
Math.min / max
> price = -balance powerlines.price;
Тут надо учитывать только купленную у этой линии энергию
> if (i == this.listElements.length - 1) {
Не нужен if
> if (powerline1.price > powerline2.price) return 1;
Не забывай скобки {} после if. Алсо, можно вроде бы написать так:
sort(function (a, b) {
return a.price - b.price;
})
Мануал: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Но я не призываю так писать, лучше наверно записать длинно, как у тебя, для понятности. Только return 0 дописать.
Конструктор это функция которая пишется после new. А не свойство constructor: http://learn.javascript.ru/object-methods
Свойство constructor лишь указывает на то кто создал объект.
> if (this.listElements.power) {
Не лезь внутрь чужжого объекта. Алсо, if не нужен достаточно вернуть 0 из showPower.
Код покупки делается просто:
- сортируем линии по убыванию выгодности
- пока (нужный объекм не выкуплен и в списке есть линии) {
берем самую верхнюю не тронутую линию и выкупаем у нее доступный максимум энергии
}
> if (-balance <= powerlines.bandwidth) {
Math.min / max
> price = -balance powerlines.price;
Тут надо учитывать только купленную у этой линии энергию
> if (i == this.listElements.length - 1) {
Не нужен if
> if (powerline1.price > powerline2.price) return 1;
Не забывай скобки {} после if. Алсо, можно вроде бы написать так:
sort(function (a, b) {
return a.price - b.price;
})
Мануал: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Но я не призываю так писать, лучше наверно записать длинно, как у тебя, для понятности. Только return 0 дописать.
Потому что ты не просил PHP ничего напечатать между числами. Добавь echo "\n"; например
Алсо, советую код показать на проверку. Поверь, многие ошиьки и сомнитеьные места ты сам можешь не заметить.
>>392105
> админка тормознутая
Тогда надо сделать чтобы можно было заранее выставить все настройки и запустить — пусть тормозит сколько хочет.
> Взять код джумловской админки, то есть все, что находится в папке administrator и почистить его
Годы работы. Не советую, забей на это. А то угробишь время своей молодости на оптимизацию доисторических систем. А мог бы изучать всякие крутые современные штуки.
> Думаю как это лучше сделать. Либо самому код править каждый раз и комментировать ненужные строки, либо реализовать графическое переключение, то есть после ввода логина и пароля можно было бы выбирать.
Советую сделать самое минимальное и простое решение которое тебе будет экономить время. Логин тебе время не сэконмит и им заниматься не стоит.
База спроектирована неплохо. но искуственный ключ id мне кажется в таблице лайков не нужен. Зачем, у нас есть естественный первичный ключ — пара (from, to). заодно мы запретим вставлять одинаковые пары (у тебя этой защиты нет).
Косые кавычки используют если имена содержат пробел, специсимволы или совпадают с ключевыми словами языка. users и likes не совпадают, можно не ставить их.
Решение с подзапросом выглядит громоздким, и они плохо оптмизируются MySQL (по моему никак не оптимизируется — MySQL реально делает оба запроса). Давай перейдем на решение на основе джойнов/группировок без подзапросов. Если можно не использовать подзапросы — лучше не исплоьзовать.
Я помню, мы эту задачу решали в треде, я там пару хитрых решений в итоге придумал, чисто на джойнах и группировке.
> как посчитать взаимные лайки, намекни а?
Попробуй сделать отдельный запрос для этого. Используй джойн так, чтобы выбрались только взаимные лайки. Помни что разрешено джойнить таблицу на саму себя.
> `from` ASC
MySQL игнорирует ASC/DESC в индексе вроде бы: http://dev.mysql.com/doc/refman/5.5/en/create-index.html
> An index_col_name specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.
Блядь, какую же я хуйню понаписал. Из-за ёбаной дрочки мозги совсем отваливаются. Надо завязывать, лол.
Спасибо, анон.
Да, наверное, я почитаю теорию по твоему плану и поделаю твои задачи по верстке.
Ответы на вопросы написать? Или просто по ним пройтись и не писать?
спасибо, помутнение разума
Ты точно поехавший. Какая задача, щито ты делаешь? Ты просто "очистил" массивы.
> PHP Notice: Undefined variable: string in /home/6oE5M1/prog.php on line 29
$string не существует.
по аналогии он должен разделить ещё мельче всё по 1 символу - вот задача какова была
ОП, какие часто встречающиеся группы функций следует выучить? (Мда, я тут собрался позубрить немного, ибо все еще слишком часто лезу в мануал. Хоть что-то, да в голове останется). Работа с массивами, строками, сессии, СКЛ, математика... что там еще?
как смирится с тем что вылезает много багов?
поясню:
работаю в самой стандартной конторе за еду, где, само собой, скорость разработки важнее качества.
общаюсь с менеджерами заказчика, и они то и дело находят недоработки и баги, иногда серьёзные, иногда нет.
очевидно, как мне и сотню раз писали в генерал /pr/ треде, баги делат все, особенно когда кодишь без тз на ходу под пожелания менеджера.
но с другой стороны я тоже тот ещё хуй, и уровень у меня низкий, и я довольно сильно переживаю из-за всего этого.
вот пилишь ты фичу, покрыл тестами пхпюнитовскими, ну вроде норм, на стейджевый сервер выкатил, там посмотрели. и потом у этого кода баг, потом ещё один. это же я криворук, никто не будет с этим спорить. и я уже просто боюсь выкатывать какие-то важные изменения, потому что как показала практика, сколько я бы не покрывал их тестами и не обдумывал - говно всегда случится, может завтра, может через месяц.
нормальная ли эта ситуация? многие ли программисты сталкиваются с таким? как жить с этим потом?
Настрой в редакторе замену таба на 4 пробела и пиши, в чем проблема-то? От табов один вред, надо привыкать к стандартам.
>>392264
> получается массив состоящий из нескольких массивов без адресов каждый массив соотвествует строке и начинатся с [0], но как мне его оттуда выделить у него же адреса нет
Во-первых, ты можешь работать с вложенными массивами так:
// двухмерный массив
$a = array(
1 => array(2 => 'a', 3 => 'b')
);
// получаем внутренний массив
$inner = $a[1];
// получаем его элемент
echo $inner[2]; // a
// Или без промежуточной переменной:
echo $a[1][2]; // a
Во-вторых, у тебя в $result1 одномерный массив и с ним вообще проблем быть не должно.
Алсо, для перебора массив удобнее использовать foreach ($a as $element) а не for.
>>392286
> PHP Warning: preg_split() expects parameter 2 to be string, array given
preg_split вторым аргументом надо передать строку, а ты передаешь массив
Также, ставь скобки {} после foreach
Также. если тебе надо обработать массив функцией то удобно использовать array_map.
Настрой в редакторе замену таба на 4 пробела и пиши, в чем проблема-то? От табов один вред, надо привыкать к стандартам.
>>392264
> получается массив состоящий из нескольких массивов без адресов каждый массив соотвествует строке и начинатся с [0], но как мне его оттуда выделить у него же адреса нет
Во-первых, ты можешь работать с вложенными массивами так:
// двухмерный массив
$a = array(
1 => array(2 => 'a', 3 => 'b')
);
// получаем внутренний массив
$inner = $a[1];
// получаем его элемент
echo $inner[2]; // a
// Или без промежуточной переменной:
echo $a[1][2]; // a
Во-вторых, у тебя в $result1 одномерный массив и с ним вообще проблем быть не должно.
Алсо, для перебора массив удобнее использовать foreach ($a as $element) а не for.
>>392286
> PHP Warning: preg_split() expects parameter 2 to be string, array given
preg_split вторым аргументом надо передать строку, а ты передаешь массив
Также, ставь скобки {} после foreach
Также. если тебе надо обработать массив функцией то удобно использовать array_map.
массивы http://php.net/manual/ru/book.array.php
строки http://php.net/manual/ru/book.strings.php
мбстроки http://php.net/manual/ru/book.mbstring.php
даты http://php.net/manual/ru/book.datetime.php b мой урок https://gist.github.com/codedokode/10539805
gd http://php.net/manual/ru/book.image.php
математика http://php.net/manual/ru/book.math.php
spl http://php.net/manual/ru/book.spl.php
http://php.net/manual/ru/book.classobj.php
curl http://php.net/manual/ru/book.curl.php
dom http://php.net/manual/ru/book.dom.php
PDO для работы с БД
Наизусть учить не надо, все равно не запомнишь.
Сайт phptherightway
Полезные ссылки https://gist.github.com/codedokode/98a0f0976ef454436d0c
Неплохо, а что id не хочешь из таблицы likes убрать или хотя бы запретить вставку одинаковых пар туда?
> `likes` `t3` LEFT OUTER JOIN `likes` `t4`
Почему LEFT JOIN а не просто JOIN?
В MySQL INNER JOIN = CROSS JOIN = JOIN, а LEFT OUTER JOIN = LEFT JOIN. Ты знаешь в чем разница между ними? Там где-то была картинка на эту тему: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
Кстати, у тебя используются скобки в списке джойнов. Можно сделать без них (но этот вариант тоже годится).
Вообще, неплохо решено.
Также, я дописал сюда: https://gist.github.com/codedokode/10539213 список понятий которые хорошо бы знать.
Подскажите книжку для самых маленьких по основам пехепе. Или хватит того, что в шапке?
Как вторую книгу выбрал PHP Cookbook.
Учти что Cookbook — это книга рецептов, то есть не для начинающих с нуля, там основы не объясняются.
Также, тут вбрасывали в тред какую-то книгу рецептов PHP и она мне не понравилась.
В том-то и дело. Поэтому сейчас вот ищу самые самые основы. В данный момент листаю сайт из оп-поста - php.net.
оп, ты не замечаешь или игнорируешь?
>>392342
Нормально, хотя по моему они однотипные. решения советую постить в тред на проверку, можно сразу пачкой.
>>392252
Ответ тебе: http://ideone.com/yGA8lT
>>392296
> как смирится с тем что вылезает много багов?
«В своих проектах у меня не будет ни одного бага, а это работа, потерплю»
Причины багов бывают разные. Ты не пишешь, баги в том модуле который ты делал или же ты сломал чужой модуль? А может этот баг изначально был заложен до тебя?
Чтобы писать лучше, надо соблюдать такие правила:
- не пиши длинные портянки кода, разбивай на функции. Чем длиннее кусок кода тем сложнее его проверить.
- почитывай мануал если не уверен как работает та или иная стандартная функция. Может ты не все про нее знаешь.
- тестирование своего кода (ручное). Сделал модуль — потыкайся, попробуй повводить всякие странные значения в формы, попередавать неприавльные параметры в ссылки, позаходить на страницы не залогинившись. Убедись что все работает идеально. Перечитай задачу и убедись что все требования выполнены.
- будь внимателен. Видишь, что цикл может стать бесконечным если в базе окажется NULL? Исправь, даже если в базе NULL не должно быть.
- убедись что ты видишь любые ошибки возникшие в ходе тестирования и они не скрываются. Включи display_errors=on, error_reporting=E_ALL (не на боевом а на своем сервере). Если возможно, используй режим превращения ошибок в исключения: http://php.net/manual/ru/class.errorexception.php . В PDO исплоьзуй ERRMODE_EXCEPTION. После тестирования проверь логи сервера — нет ли там чего. В браузере держи открытой консоль чтобы видеть JS-ошибки или подключи логгер таких ошибок.
- если ты как-то трогаешь ранее написанный код, убедись что изменения ничего не сломают. Правишь функцию — поиском найди все места, где она вызвается, глянь какие ей пераметры передаются и что делается с результатом. Используешь поле в базе и не уверен что в нем может быть — сделай выборку из базы, проверь, сделай поиск по имени, посмотри что в это поле кладется. То есть изучи чужой код который трогаешь.
Более того, если ты не уверен, ты можешь перепроверить те модули, которые затронуты изменениями.
Ну и наконец может быть такое, что твоей вины нет: код такой запутанный что любая правка что-то ломает. Тогда ничего не поделать: предыдущие разработчики накопили технический долг и исправить можно только начав новый проект или сделав большой рефакторинг.
> на стейджевый сервер выкатил, там посмотрели.
Ну и отлично, если приняли то все ок.
> и я уже просто боюсь выкатывать какие-то важные изменения, потому что как показала практика, сколько я бы не покрывал их тестами и не обдумывал
Не бойся.
>>392252
Ответ тебе: http://ideone.com/yGA8lT
>>392296
> как смирится с тем что вылезает много багов?
«В своих проектах у меня не будет ни одного бага, а это работа, потерплю»
Причины багов бывают разные. Ты не пишешь, баги в том модуле который ты делал или же ты сломал чужой модуль? А может этот баг изначально был заложен до тебя?
Чтобы писать лучше, надо соблюдать такие правила:
- не пиши длинные портянки кода, разбивай на функции. Чем длиннее кусок кода тем сложнее его проверить.
- почитывай мануал если не уверен как работает та или иная стандартная функция. Может ты не все про нее знаешь.
- тестирование своего кода (ручное). Сделал модуль — потыкайся, попробуй повводить всякие странные значения в формы, попередавать неприавльные параметры в ссылки, позаходить на страницы не залогинившись. Убедись что все работает идеально. Перечитай задачу и убедись что все требования выполнены.
- будь внимателен. Видишь, что цикл может стать бесконечным если в базе окажется NULL? Исправь, даже если в базе NULL не должно быть.
- убедись что ты видишь любые ошибки возникшие в ходе тестирования и они не скрываются. Включи display_errors=on, error_reporting=E_ALL (не на боевом а на своем сервере). Если возможно, используй режим превращения ошибок в исключения: http://php.net/manual/ru/class.errorexception.php . В PDO исплоьзуй ERRMODE_EXCEPTION. После тестирования проверь логи сервера — нет ли там чего. В браузере держи открытой консоль чтобы видеть JS-ошибки или подключи логгер таких ошибок.
- если ты как-то трогаешь ранее написанный код, убедись что изменения ничего не сломают. Правишь функцию — поиском найди все места, где она вызвается, глянь какие ей пераметры передаются и что делается с результатом. Используешь поле в базе и не уверен что в нем может быть — сделай выборку из базы, проверь, сделай поиск по имени, посмотри что в это поле кладется. То есть изучи чужой код который трогаешь.
Более того, если ты не уверен, ты можешь перепроверить те модули, которые затронуты изменениями.
Ну и наконец может быть такое, что твоей вины нет: код такой запутанный что любая правка что-то ломает. Тогда ничего не поделать: предыдущие разработчики накопили технический долг и исправить можно только начав новый проект или сделав большой рефакторинг.
> на стейджевый сервер выкатил, там посмотрели.
Ну и отлично, если приняли то все ок.
> и я уже просто боюсь выкатывать какие-то важные изменения, потому что как показала практика, сколько я бы не покрывал их тестами и не обдумывал
Не бойся.
Да, смогу.
>>392313
Ну фиг знает, попробуй Р.НИксон — Php, MySQL, и еще что-то — но книга так себе в плане качества.
>>392327
Сложные фреймворки (Симфони 2?), паттерны проектирования, базы данных, также по клиентсайду впереди много тем: jQuery, библиотеки виджетов (jQuery UI), HTML5 фичи (история, загрузка файлов перетаскиванием, audio/video), библиотеки работы с коллекциями (underscore/lodash), вебсокеты, канвас, Node.JS (асинхронное программирование, модули, сокеты, морской бой), модули AMD/require, data binding (Knockout/Angular), JS шаблонизаторы, SPA, Backbone, совместное редактирование (Share.JS).
Тестирование (phpunit/codeception), линукс/bash.
>«В своих проектах у меня не будет ни одного бага, а это работа, потерплю»
ну я попросил тебя по человечески ответить, а ты опять учить начал
да, маленькие функции, да, конечно, я гуглю непонятное, я же не могу просто использовать функцию не зная будет ли она работать, да конечно, я сам тыкаю всё и тестирую, плюс за всё это время накопился запас тестов на каждый чих и баг
>убедись что изменения ничего не сломают
ну охуеть. поменял что-то - да и похуй, в продакшен сразу, так ты думаешь?
но знаешь что? оно всё равно ломается.
я выгружаю на продакшен что-нибудь серьёзнее вывода хелло-ворлд, и через час-пол дня загорается окошко скайпа и там текст "у нас баг","нашёл вот это, надо бы поправить" или "у нас беда, нужно срочно ..."
я преувеличиваю немного, но суть в том что вместо пиления функционала на исправление того что накопилось уходит очень много времени, может быть даже половина.
и кароч у меня батхерт
Ты выводишь \n после каждой буквы. А надо выводить только в конце строки.
Никаких чудес тут нет: в консоли можно печатать только слева направо и сверху вниз, по строчкам.
Вот советы по коду:
> for ($i = 0; $i < count($text); $i++) {
Исплоьзуй тут foreach
> foreach($text as &$t) $t = explode(" ", $t);
Используй {} и перенеси на новую строку
> $t
Используй нормальные названия, например $line
> PHP Notice: Undefined offset: 1 in /home/qgzTsI/prog.php on line 31
Этого не должно быть. Ты обращаешься к несуществующему в массиве элементу
что я конкретно хочу:
может я упускаю что-то очевидное?
я последнее время трачу кучу времени на тесты, покрываю каждый новый метод, пишу функциональные тесты
но основная масса ошибок от того что я просто не могу предусмотреть все варианты использования.
например профиль пользователя есть в трёх вариантах, у трёх типов пользователей. и добавляя фичу для одного типа это выходит боком для другого
например оплата фич для одного типа одна, для другого другая, вывод информации также разный.
нужно было спроектировать грамотно всю архитектуру изначально, но это не было сделано. функционал накапливался и теперь мне кажется что всё катится к хуям.
и теперь если я пробую представить как это должно выглядеть правильно - я просто хуею от сложности и нагромождения классов, их зависимостей, отношений и т.д.
кажется я просто не справляюсь с этим говном. руководителя проекта ставил в известность о том что нужен жёсткий рефакторинг, и даже время было выделено. но это время в сумме было на неделю-две, для проекта который говнокодился 8 месяцев, и то часть этого времени я обслуживал баги, так как проект живой
я в недоумении, что тут можно сделать?
Денег у них на помощника мне нет. Если я буду громко кукарекать то просто распишусь в своей беспомощности и криворукости. А может я преувеличиваю и ничего страшного там нет?
Cпасибо большое за ответ, но всё же for(for ($i = 0; $i < count($text); $i++) {) стараюсь менять на foreach (foreach ($text as $value){
\t$i = 0;
\t$i++;
получается такая каша http://ideone.com/Egaqx5
вот я без этого условия пытаюсь поменять через foreach и не работает...
Как убрать лишнее нижнее подчеркивание я разобрался. А вот как убрать лишний символ "-", если после него ничего нет? Т.е., пользователь ввел в инпут +380(961)-564-___-___ , а в БД должно записаться +380(961)-564. А у меня сейчас записывается +380(961)-564--
совет от неопа
ты допускаешь ошибку храня телефоны в бд в каком-то формате
крани исключительно цифры, без плюсов и прочего
доставая из бд ты будешь приводить их к виду какому тебе нужно, а в бд они должны быть в сыром виде
потому что ты сейчас хочешь
+380(__)-___-___
завтра ты захочешь
+3-80(__)-___-___
и т.д.
Пойду посплю немного и дальше буду разбираться
Однако, спасибо. Пожалуй, так и поступлю. Тем не менее эта задача всё равно не будет давать мне покоя, пока я не найду решение(
для форматирования телефонов есть миллиард яваскрипт библиотек
алсо, в пхп даже, насколько я помню, есть встроенный валидатор телефонов
Это вы хорошо придумали, всю эту хуйню в БД вносить. Кому нужен номер без скобочек и черточек? Вот тебе регулярка:
/^\+380\(\d{3}\)-\d{3}(-\d+){,2}/
Вроде в пхп это будет так:
preg_match(/^\+380\(\d{3}\)-\d{3}(-\d+){,2}/, $str)[0]
Циферки просто вноси. А при выводе добавляй плюсики, черточки, скобочки, что угодно.
>как нужно в реальных проектах
если ты делаешь на показ - то конечно тебе нужно делать правильно
я могу аргументировать -
у тебя уже много пользователей, куча телефонов.
и ты хочешь подключить смс-услуги
ну там что угодно.
смс сервис просит у тебя телефон пользователя:
если ты хранишь в сыром виде - ты достаёшь из бд телефон, строишь запрос и отправляешь.
как это выглядит в twilio:
curl -X POST https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages\
-d "To=+14159352345" \
-d "From=+14158141829" \
-d "Body=Hello world!" \
-d "MediaUrl=http://www.images.com/flower.png" \
-u '{AccountSid}:{AuthToken}'
а если ты будешь хранить со скобками? тебе придётся очищать его от всего кроме цифр.
и тот же аргумент с форматированием. сейчас ты хочешь скобки так, потом ты хочешь скобки по другому
здесь нечего обсуждать.
телефоны должны быть в сыром виде и провалидированы. ты должен убедится что у тебя в бд нет телефонов "121опхуй122" и "7543"
вот за такое тебе везде скажут малаца и пригласят работать
>как нужно в реальных проектах
если ты делаешь на показ - то конечно тебе нужно делать правильно
я могу аргументировать -
у тебя уже много пользователей, куча телефонов.
и ты хочешь подключить смс-услуги
ну там что угодно.
смс сервис просит у тебя телефон пользователя:
если ты хранишь в сыром виде - ты достаёшь из бд телефон, строишь запрос и отправляешь.
как это выглядит в twilio:
curl -X POST https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages\
-d "To=+14159352345" \
-d "From=+14158141829" \
-d "Body=Hello world!" \
-d "MediaUrl=http://www.images.com/flower.png" \
-u '{AccountSid}:{AuthToken}'
а если ты будешь хранить со скобками? тебе придётся очищать его от всего кроме цифр.
и тот же аргумент с форматированием. сейчас ты хочешь скобки так, потом ты хочешь скобки по другому
здесь нечего обсуждать.
телефоны должны быть в сыром виде и провалидированы. ты должен убедится что у тебя в бд нет телефонов "121опхуй122" и "7543"
вот за такое тебе везде скажут малаца и пригласят работать
вообще это относится ко всему что бы ты не хранил
это очевидно, но лично у меня ушло дохуя времени чтобы понять это
Дык просто то было тестовое задание, которое я завалил по срокам, а теперь доделываю для себя. Там в условии было для телефонного номера сделать маску, как я описал и тип данных VARCHAR(30) для колонки phone в БД. Ну, я подумал, раз VARCHAR, там нужно и скобки с дефисами хранить, а тут вот оно чё..
если у тебя задание сделать маску - то ты должен делать маску, а не тратить пол дня на то как хранить в бд
в данном случае в бд хранится будет то как твоя маска работает на разных телефонах, и варчар и скобки там более чем логичны.
пиши маску и сохраняй вместе со скобками.
>Т.е., пользователь ввел в инпут +380(961)-564-___-___ , а в БД должно записаться +380(961)-564
тут очевидно твоя маска не должна пропустить такой номер.
задача маски в том чтобы валидировать телефон
поэтому у тебя априори не должно быть в базе номеров вида +380(961)-564 или
+380(961)-564--
блять, ты же писал что делаешь для себя
кароче - если у тебя задание сохранять маску - то сохраняй маску
если твоя цель - сохранить телефон - сохрани телефон, а не скобки
запутал меня нахуй
Это из задания
"код телефона максимум 4 символа, только чиста и знак "+".
Сам номер телефона - должна быть маска +380(__)___-__-__ только числа, длина до 20 символов."
есть мировые стандарты, и насколько я помню телефон вместе с кодом страны не может быть меньше 10 знаков
погугли сам
Было задание, я проебал сроки, доделываю для себя. Но хочу доделать правильно. Но по ходу оказалось, что "правильно" и "как просили по заданию" отличается.
Хуёбки там логичны. Ты когда номер набираешь, чтобы звонить, часто скобки используешь? Ты понимаешь, что скобки никакой информации в номере не несут и нужны только для представления?
Вот и думай потом, зачем у пхпдебилов в sql-таблицах одно поле с html, а другой с json для одной и той же информации, а если им xml понадобится, так они и третью колонку въебенят нахуй не задумываясь вообще. Им задачу решать, а не тратить пол дня.
ты что мне пытаешься доказать, маня?
из поле варчар было правильным.
они давали тебе задачу сделать маску.
как они будут маску проверять? они повводят разные телефоны, и потом в бд будут СМОТРЕТЬ МАСКУ, ВМЕСТЕ СО СКОБКАМИ
а если ты делаешь для себя, то тебе нужно хранить не маску, а сам телефон
это два разных случая, и поля должны быть разные
чего два варианта? два поля в бд с одними и теми же данными? пхп-стайл во все поля? ты нихуя не понял и пошёл говнокодить?
Нет, поле будет одно - с сохранением скобок и т.д. А код, который я сделал для преобразования телефонного номера без лишних символов приберегу у себя в загашниках.
>поле будет одно - с сохранением скобок и т.д
>пхп-стайл во все поля
блять, как оп выдерживает это уже 33ий тред?
надо ему денег перевести штоли
Ты тот Анон, что советовал сохранять только цифры? Я ж не против, если что, просто выспрашиваю тут у тех, кто с такими вещами сталкивался на практике.
Сохраненный номер телефона потом приходит работнику группы поддержки на почтовый ящик для дальнейшей связи с клиентом.
ты исключаешь вариант когда тебя попросят отсылать уведомления на этот телефон - >>392468 ?
разделять телефон на код страны\города в твоём случае смысла нет, как мне кажется, и с нуля ни один код страны не начинается.
поэтому не виду иного варианта как хранить всё в числовом виде
то как работник техподдержки увидит телефон базу данных ебать не должно.
в базе данных - данные. неожиданно, правда?
ты берёшь телефон, накладываешь какие угодно маски, добавляешь плюс или восьмёрку, и выводишь на страницу, которую видит суппорт
я вижу это так
Ну по крайней мере я так делал для простейшего залива на гитхаб.
Как это устроено, когда народу > 1?
не забудь про гит ресет, ебать как пригодится
Есть программеры за еду? Делаю общественное дело, ищу программиста.
Требуется сделать сайт на Jquery + API Яндекс.Карт + API vk + PHP + Mysql.
Сервис, в котром пользователи могут добавлять точки на карте, а потом просматривать их. Авторизация через контакт, хранение данных в бд, страницы - на простом php-фреймоворке по вашему выбору (думаю о F3 Framework).
Ближайший пример: http://красивыйпетербург.рф/map
Будет ТЗ и постановка задач в реальном времени. Работа на несколько часов в день.
Оплата по часам. Опишите что умеете в двух словах.
randallyoungyoung@yahoo.com
Ты тот новичок, который создавал тред, не знал с чего начать, сидел дрочил хтмл?
Я столкнулся с проблемой, а из друзей / знакомых никто не может помочь к ебеням. Я пишу о задаче про айфон, собсна, вот ссылочка на мой код (http://ideone.com/GcQ5KW), можешь намекнуть, где я тупой? Думал встваить в цикл return $creditSumm, но выходит еще больший кал.
Поясните, пожалуйста, по поводу этой картинки с котами в оппике. Что там происходит и как это связано с PHP-тредом?
чур я тот кот, который на коленях у няшки сидит
котики - это мы с тобой
пушистые, няшные, тупые
длинноволосая тяночка - это оп, на руках у неё анон, которому она подробно поясняет с пруфами
а вторая тяночка - модер, которому делать итт нечего, потому что у нас всё лампово и спокойно
>Undefined variable: monthlyPayment
Инглиш, мазафака, ду ю спик ит?
Почитай за области видимости переменных. Особенно в функциях.
Функция ничего никуда не возвращает (return);
И вообще, глобал тут не нужен. Все должно передаваться в аргументы функции, которая должна возвращать результат, если ты чему-то присваиваешь или самостоятельно выводить что-нибудь если не присваиваешь.
Ты присваиваешь переменной результат вычисления функции, которая ничего не возвращает. Функция чё-то там насчитает у себя внутри, в локальных переменных, но об этом хуй кто узнает чего она там насчитала.
Понял про return, спасибо. ВОзвращаю $totalSumm, но на деле получается странное дерьмо, попытаюсь разобраться.
Сейчас попоробую быстро ответить кому успею, а то мне еще работать надо.
>>392349
Ответ тебе: https://www.notehub.org/2014/10/4/392349
>>392363
Ты мало подробностей написал в своем посте, потому я написал общие правила. Надо выяснить почему ошибки просачиваются незамеченными в продакшен. И исходя из этого, решать что делать.
Ты не пробовал понять в чем именно причина ошибок? Как они остаются незамеченными при тестировании? Судя по
> да, маленькие функции, да, конечно, я гуглю непонятное, я же не могу просто использовать функцию не зная будет ли она работать, да конечно, я сам тыкаю всё и тестирую, плюс за всё это время накопился запас тестов на каждый чих и баг
ты достаточно тщательно все пытаешься делать. Может это кто-то другой ломает твой код своими правками? Может код изначально ненадежный?
Впрочем в следующем посте чуть очевидее становится:
> и теперь если я пробую представить как это должно выглядеть правильно - я просто хуею от сложности и нагромождения классов, их зависимостей, отношений и т.д.
Возможно в этом и проблема — код запутанный, написан как попало. Я с таким не раз сталкивался. Выход тут только один — тщательно разбирать, как работает код, какие значения могут быть у переменных, искать все места, откуда вызвыается функция, это не очень просто, но иначе никак. И более тщательно тестировать.
Если есть какое-то совсем плохое место, его можно попробовать по-быстрому отрефакторить.
> например профиль пользователя есть в трёх вариантах, у трёх типов пользователей. и добавляя фичу для одного типа это выходит боком для другого
Я понимаю, что задним умом все крепки, но почему бы не протестировать для 3 разных аккаунтов если у них разная логика работы? Хотя бы основные какие-то, самые важные функции?
> нужно было спроектировать грамотно всю архитектуру изначально, но это не было сделано. функционал накапливался и теперь мне кажется что всё катится к хуям.
Если так то остается только тестирование — проще тестировать на 3 аккаунтах чем переделывать весь код.
> А может я преувеличиваю и ничего страшного там нет?
Я с таким кодом сталкивался не раз, так что вполне возможно это обычная ситуация. Смотри, твоему руководителю может быть выгоднее залатывать баги, чем устраивать долгий сложный рефакторинг, причем неизвестно еще справишься ли ты с ним.
Ну и есть надежда, что со временем ты изучишь код лучше, будешь знать где опасные места, соответственно ошибок будешь допускать меньше.
>>392349
Ответ тебе: https://www.notehub.org/2014/10/4/392349
>>392363
Ты мало подробностей написал в своем посте, потому я написал общие правила. Надо выяснить почему ошибки просачиваются незамеченными в продакшен. И исходя из этого, решать что делать.
Ты не пробовал понять в чем именно причина ошибок? Как они остаются незамеченными при тестировании? Судя по
> да, маленькие функции, да, конечно, я гуглю непонятное, я же не могу просто использовать функцию не зная будет ли она работать, да конечно, я сам тыкаю всё и тестирую, плюс за всё это время накопился запас тестов на каждый чих и баг
ты достаточно тщательно все пытаешься делать. Может это кто-то другой ломает твой код своими правками? Может код изначально ненадежный?
Впрочем в следующем посте чуть очевидее становится:
> и теперь если я пробую представить как это должно выглядеть правильно - я просто хуею от сложности и нагромождения классов, их зависимостей, отношений и т.д.
Возможно в этом и проблема — код запутанный, написан как попало. Я с таким не раз сталкивался. Выход тут только один — тщательно разбирать, как работает код, какие значения могут быть у переменных, искать все места, откуда вызвыается функция, это не очень просто, но иначе никак. И более тщательно тестировать.
Если есть какое-то совсем плохое место, его можно попробовать по-быстрому отрефакторить.
> например профиль пользователя есть в трёх вариантах, у трёх типов пользователей. и добавляя фичу для одного типа это выходит боком для другого
Я понимаю, что задним умом все крепки, но почему бы не протестировать для 3 разных аккаунтов если у них разная логика работы? Хотя бы основные какие-то, самые важные функции?
> нужно было спроектировать грамотно всю архитектуру изначально, но это не было сделано. функционал накапливался и теперь мне кажется что всё катится к хуям.
Если так то остается только тестирование — проще тестировать на 3 аккаунтах чем переделывать весь код.
> А может я преувеличиваю и ничего страшного там нет?
Я с таким кодом сталкивался не раз, так что вполне возможно это обычная ситуация. Смотри, твоему руководителю может быть выгоднее залатывать баги, чем устраивать долгий сложный рефакторинг, причем неизвестно еще справишься ли ты с ним.
Ну и есть надежда, что со временем ты изучишь код лучше, будешь знать где опасные места, соответственно ошибок будешь допускать меньше.
>>392376
Я наверно плохо объяснил. foreach используется там, где не нужен счетчик, то есть не нужны $i и $k. Если счетчик используется, то нужен for.
В этой задаче счетчик все-таки нужен. Алгоритм такой: разбиваем текст на строки (на слова — мне кажется, не надо, это лишнее). После чего делаем цикл: сначала выводим все первые буквы строк, затем делаем перевод строки и выводим все вторые, и так до последней.
Получить n-ю букву строки можно с помощью mb_substr или разбив строку на массив символов.
Ну и у тебя есть ошибка:
> foreach ($text as $value){
Ты передал не массив, а строку в foreach
Кстати, если ты мне не показывал решения предыдущих задач — советую показать, я дам советы и комментарии по улучшению.
>>392380
Нафига ты такие посты пишешь? Ты наверно заблудился и забыл что зашел в php-тред?
Я поясню. Это тред для начинающих. Здесь мы помогаем людям изучать программирование. Если ты хочешь дать совет по улучшению, или обратить внимание на ошибку, это надо делать правильно.
Надо написать, что неправильно, почему неправильно, и как это исправить. Можно дополнить ссылочками на теорию или мануал. Например: «ты зря используешь тут функцию substr. Она не работает с русскими буквами в utf-8, потому лучше ее вообще не использовать, и заменить на mb_substr».
Твой пост ничего полезного не содержит. Более того, он написан в агрессивной манере. Такие посты тут не нужны.
>>392376
Я наверно плохо объяснил. foreach используется там, где не нужен счетчик, то есть не нужны $i и $k. Если счетчик используется, то нужен for.
В этой задаче счетчик все-таки нужен. Алгоритм такой: разбиваем текст на строки (на слова — мне кажется, не надо, это лишнее). После чего делаем цикл: сначала выводим все первые буквы строк, затем делаем перевод строки и выводим все вторые, и так до последней.
Получить n-ю букву строки можно с помощью mb_substr или разбив строку на массив символов.
Ну и у тебя есть ошибка:
> foreach ($text as $value){
Ты передал не массив, а строку в foreach
Кстати, если ты мне не показывал решения предыдущих задач — советую показать, я дам советы и комментарии по улучшению.
>>392380
Нафига ты такие посты пишешь? Ты наверно заблудился и забыл что зашел в php-тред?
Я поясню. Это тред для начинающих. Здесь мы помогаем людям изучать программирование. Если ты хочешь дать совет по улучшению, или обратить внимание на ошибку, это надо делать правильно.
Надо написать, что неправильно, почему неправильно, и как это исправить. Можно дополнить ссылочками на теорию или мануал. Например: «ты зря используешь тут функцию substr. Она не работает с русскими буквами в utf-8, потому лучше ее вообще не использовать, и заменить на mb_substr».
Твой пост ничего полезного не содержит. Более того, он написан в агрессивной манере. Такие посты тут не нужны.
Регулярными выражениями. У меня есть урок (не очень хороший, правда), по ним: http://archive-ipq-co.narod.ru/l1/regexp.html Там даже задача на обработку номеров есть.
Ну и неправильный номер (в котором часть цифр отсутствует) не надо сохранять. Зачем? По нему все равно позвонить нельзя.
И да, в базе удобнее всего хранить в международном формате без лишних знаков типа 3809991234567
Иногда к номеру могут прилагаться инструкции, например «123456789, доб. 123» или «раб. 12345678, моб. 987643322». Если ты хранишь телефон с целью использования людьми, например службой поддержки, то лучше разрешить вводить такие вещи. Если телефон для автоматической обработки (отправка СМС скриптом) то не разрешать.
>>392457
Посмотри внимательно внизу страницы:
> PHP Notice: Undefined offset: 0 in /home/JcsIow/prog.php on line 42
Это ошибки — их надо исправить, я советую тебе обращать на них внимание (может у тебя на локальном сервере отключен вывод ошибок и ты их не видишь? Это не значит что их нет).
То есть твое решение пока что неправильное.
Вот еще советы:
Найти максимальную длину можно в 1 строчку с использованием max и array_map без цикла.
> if ($lines[$j][$i] == NULL) {
Это неправильный код. В массиве не хранится null для отсутсвующих элементов. Вместо этого генерируется ошибка и потому ты не должен обращаться к несуществующим элементам вообще. Чтобы проверить, есть ли элемент в массиве, используй
if (isset($x[$a]))
if (array_key_exists($x, $a))
if ($x < count($a))
В чем разница? Прочти мануал по isset и поймешь. И кстати, если ты хочешь сравнить переменную с null, надо использовать ===, а не == так как будет выполняться например if (0 == null).
Для форматирования лучше бы использоват пробелы, а то отступы гигансткие получились.
Регулярными выражениями. У меня есть урок (не очень хороший, правда), по ним: http://archive-ipq-co.narod.ru/l1/regexp.html Там даже задача на обработку номеров есть.
Ну и неправильный номер (в котором часть цифр отсутствует) не надо сохранять. Зачем? По нему все равно позвонить нельзя.
И да, в базе удобнее всего хранить в международном формате без лишних знаков типа 3809991234567
Иногда к номеру могут прилагаться инструкции, например «123456789, доб. 123» или «раб. 12345678, моб. 987643322». Если ты хранишь телефон с целью использования людьми, например службой поддержки, то лучше разрешить вводить такие вещи. Если телефон для автоматической обработки (отправка СМС скриптом) то не разрешать.
>>392457
Посмотри внимательно внизу страницы:
> PHP Notice: Undefined offset: 0 in /home/JcsIow/prog.php on line 42
Это ошибки — их надо исправить, я советую тебе обращать на них внимание (может у тебя на локальном сервере отключен вывод ошибок и ты их не видишь? Это не значит что их нет).
То есть твое решение пока что неправильное.
Вот еще советы:
Найти максимальную длину можно в 1 строчку с использованием max и array_map без цикла.
> if ($lines[$j][$i] == NULL) {
Это неправильный код. В массиве не хранится null для отсутсвующих элементов. Вместо этого генерируется ошибка и потому ты не должен обращаться к несуществующим элементам вообще. Чтобы проверить, есть ли элемент в массиве, используй
if (isset($x[$a]))
if (array_key_exists($x, $a))
if ($x < count($a))
В чем разница? Прочти мануал по isset и поймешь. И кстати, если ты хочешь сравнить переменную с null, надо использовать ===, а не == так как будет выполняться например if (0 == null).
Для форматирования лучше бы использоват пробелы, а то отступы гигансткие получились.
>>392465
Скобочки добавляются при выводе на экран.
>>392466
Только цифры, в международном формате. Потому что минусы каждый расставляет как хочет (как ему кажется красивее):
+7(812)123-45-45
+7(812)999-999-0
Вот еще ссылочка про виды номеров: http://www.artlebedev.ru/kovodstvo/sections/91/
Вот тут описан более сложный подход — хранение номеров по частям: http://www.artlebedev.ru/tools/technogrette/xslt/phone-numbers/ но в твоей задаче он мне кажется не нужен.
>>392476
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе.
>>392477
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе. Не надо смешивать форматы хранения и отображения информации.
>>392480
>>392490
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе. А если есть сомнения то спрашивать надо у того, кто дал задание — а вы ответа не знаете.
>>392494
Я думаю, надо все же хранить без скобок. Ну или если ты не уверен, спросить у того кто дал задание.
>>392496
Я сталкивался на практике, хранили без плюса и цифр с кодом страны вроде 79991234567. Номер исплоьзовался для отправки СМС и оплаты.
>>392501
> добавляешь плюс или восьмёрку,
В Украине наверно восьмерка не работает, у них нолик, как к Европе: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D1%8B
А то, что с плюса — должно работать везде, это международный формат.
Но в общем я согласен что логичнее хранить без скобок и минусов.
И аноны, давайте поменьше агрессии. Хочешь дать совет — напиши нормально, не умеешь нормально общаться — иди в любой соседний тред, там твои братья.
>>392465
Скобочки добавляются при выводе на экран.
>>392466
Только цифры, в международном формате. Потому что минусы каждый расставляет как хочет (как ему кажется красивее):
+7(812)123-45-45
+7(812)999-999-0
Вот еще ссылочка про виды номеров: http://www.artlebedev.ru/kovodstvo/sections/91/
Вот тут описан более сложный подход — хранение номеров по частям: http://www.artlebedev.ru/tools/technogrette/xslt/phone-numbers/ но в твоей задаче он мне кажется не нужен.
>>392476
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе.
>>392477
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе. Не надо смешивать форматы хранения и отображения информации.
>>392480
>>392490
Наверно имелось в виду что маска должна быть в форме редактирования, а не в базе. А если есть сомнения то спрашивать надо у того, кто дал задание — а вы ответа не знаете.
>>392494
Я думаю, надо все же хранить без скобок. Ну или если ты не уверен, спросить у того кто дал задание.
>>392496
Я сталкивался на практике, хранили без плюса и цифр с кодом страны вроде 79991234567. Номер исплоьзовался для отправки СМС и оплаты.
>>392501
> добавляешь плюс или восьмёрку,
В Украине наверно восьмерка не работает, у них нолик, как к Европе: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D1%8B
А то, что с плюса — должно работать везде, это международный формат.
Но в общем я согласен что логичнее хранить без скобок и минусов.
И аноны, давайте поменьше агрессии. Хочешь дать совет — напиши нормально, не умеешь нормально общаться — иди в любой соседний тред, там твои братья.
Работа с ветками — ты можешь делать какую-то задачу в отдельной ветке — создание веток, push для веток, merge. Там где merge — есть конфликты так что надо учиться их решать. Вручную это не очень интересно, потому тебе нужна программа для 3-way merge: я использую KDiff3 и она ужасная. Хорошие программы входят в IDE вроде PhpStorm или бывают отдельно: http://git-scm.com/downloads/guis
Нужная теория есть в git book: http://git-scm.com/book/ru (на русском и англ.). Я бы советовал найти время всю книгу прочесть.
Ну и привыкай к такому циклу работы: git pull origin master (скачал чужие изменения, тут может произойти конфликт), сделал свои, закоммитил, git push origin HEAD.
>>392555
>Есть программеры за еду?
Нет, только за деньги и на сайтах вроде fl.ru, geekjob.ru, hh.ru и подобных.
Аноны, будьте осторожны. Есть люди, которые берут заказ по одной цене, ищут доверчивых, и продают им уже по более низкой.
>>392561
Смотри, переменные внутри функции (локальные) изолированы от внешних (глобальных). Ты не можешь из функции обратиться к глобальной переменной и не можешь извне обратиться к локальной. Перечитай урок, у меня это упомянуто. И мануал перечитай: http://php.net/manual/ru/language.variables.scope.php
Все переменные, которые тебе нужны внутри функции, надо передавать как аргументы (в скобках). Все, что ты хочешь вернуть из функции, ты должен вернуть через return.
Если что-то еще непонятно, задавай вопросы, я отвечу.
Ну и в алгоритме у тебя по моему ошибочка. Надо записать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000 и продолжаем цикл
Работа с ветками — ты можешь делать какую-то задачу в отдельной ветке — создание веток, push для веток, merge. Там где merge — есть конфликты так что надо учиться их решать. Вручную это не очень интересно, потому тебе нужна программа для 3-way merge: я использую KDiff3 и она ужасная. Хорошие программы входят в IDE вроде PhpStorm или бывают отдельно: http://git-scm.com/downloads/guis
Нужная теория есть в git book: http://git-scm.com/book/ru (на русском и англ.). Я бы советовал найти время всю книгу прочесть.
Ну и привыкай к такому циклу работы: git pull origin master (скачал чужие изменения, тут может произойти конфликт), сделал свои, закоммитил, git push origin HEAD.
>>392555
>Есть программеры за еду?
Нет, только за деньги и на сайтах вроде fl.ru, geekjob.ru, hh.ru и подобных.
Аноны, будьте осторожны. Есть люди, которые берут заказ по одной цене, ищут доверчивых, и продают им уже по более низкой.
>>392561
Смотри, переменные внутри функции (локальные) изолированы от внешних (глобальных). Ты не можешь из функции обратиться к глобальной переменной и не можешь извне обратиться к локальной. Перечитай урок, у меня это упомянуто. И мануал перечитай: http://php.net/manual/ru/language.variables.scope.php
Все переменные, которые тебе нужны внутри функции, надо передавать как аргументы (в скобках). Все, что ты хочешь вернуть из функции, ты должен вернуть через return.
Если что-то еще непонятно, задавай вопросы, я отвечу.
Ну и в алгоритме у тебя по моему ошибочка. Надо записать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000 и продолжаем цикл
>>392562
Этот анон >>392564 в общем все правильно расписал. Эта картинка отражает атмосферу, которую мы стараемся поддерживать в треде.
На картинке, скорее всего изображено японское кошачье кафе.
>>392569
global тут не нужен, передай нужные переменные как аргументы в функцию. И return исплоьзуй чтобы вернуть результат.
>>392600
Style cop как я понимаю, не исправляет код а только проверяет. У меня описано, как одной кнопкой отформатировать код, объясни, зачем нужна после этого какая-то еще библиотека? По твоему одну кнопку нажать дольше чем загрузить, разобраться, настроить и куда-то подключить целую библиотеку? В IDE это уже встроено.
Ты написал неграмотный пост. И да, библиотеки для проверки соответствия правилам тоже есть, но анону они не нужны, так как они предназначены для автоматизации проверки.
Просвещайся:
http://www.jetbrains.com/phpstorm/webhelp/using-php-code-sniffer-tool.html
http://www.jetbrains.com/phpstorm/webhelp/reformatting-source-code.html
Если не можете постить в тред — пишите мне на почту, адрес почты на сайте внизу.
http://newrelic.com/lp/code-school
3 месяца бесплатной подписки на codeschool (неплохие курсы на английском по хтмл, жс, всяким надстройкам над жс, гиту и всякому другому, но нет пхп).
Из регистрационных данных проверяется только почта. Код для cs отправляется на неё после использования нью релик с чем-нибудь.
кстати использовал этот ньюрелик на своём сайте, оче хорошо показывает печальные мускулзапросы и всё прочее
>isset
Спасибо за пояснения. я видел эти ошибки сразу, просто не знал как решить. Вот уже вчера помог опытный знакомый это дело исправить: http://ideone.com/kyJH1e
ну и сегодня еще сам попробовал с твоими подсказками сделать. http://ideone.com/D5Nmqy
Оп, мне надо передать переменную в шаблон upload.tpl, чтобы выводить название файла и его вес. Но у меня ничего не выходит.
Вот после закачки запускается эта строчка:
$app->redirect('upload'....
Как-то вторым параметром передают массив переменных. Ключ = название переменной, значение = значение переменной. Я так понял. Но оно все равно не работает.
После редиректа, как я понял, запускается $app->get('/upload'.... Или нет? А там как передать переменную?
Объясни, застрял на этом.
Жду комментариев и критики.
А вот на конкретном примере.
У меня на гитхабе есть репозиторий, ветка master / master.
Делаю git branch new_branch - получаю локально у себя пустую ветку? Делаю git checkout new_branch - переключаюсь на ветку. Теперь git add . - заливаю в нее все текущие файлы проекта. Вношу изменения. Git commit.
Теперь что? Git pull new_branch говорит что на сервере нет ветки new_branch.
Можешь привести пример, как потом слить ветки? Какие бывают траблы? Как их решать? На примере текстовичка.
1. Чем code school лучше бесплатных codeacademy и htmlacademy? Как я понимаю, там то же самое только без всех этих регистраций.
2. Что хорошего в ньюрелик? Как я понимаю, это плагин который ты ставишь в вебсервер, который вставляет в твою страницу свой яваскрипт, и который может собирать и сливать информаию о всех запросах. Мне такие вещи однозначно не нравятся.
Так что ну нафиг.
Откроем код Слима и посмотрим функцию redirect:
https://github.com/codeguy/Slim/blob/master/Slim/Slim.php#L1097
> redirect($url, $status = 302)
Видно что у нее ровно 2 аргумента, URL который пойдет в заголовок Location и код HTTP-редиректа. Массивы туда никакие передавать естественно нельзя.
Ты знаешь, как делается редирект? Сервер отдает код 3xx и заголовок Location с новым URL, соответственно браузер делает запрос на этот URL. При этом запускается новый экхемпляр PHP-скрипта который никак не связан с предыдущим, и в который нельзя передать никакие переменные.
Единственный способ − передавать какие-то аргументы в URL например редиректить на адрес /something/?a=1&b=2&c=3 . Еще можно сохранять что-то в куки, но это неправильно в данном случае.
Я советую посмотреть как это сделано на rghost. Открой там инспектор, вкладку Network, включи кружочек чтобы он сохранял все запросы и попробуй загрузить файл.
> Как-то вторым параметром передают массив переменных. Ключ = название переменной, значение = значение переменной. Я так понял.
Где это написано?
> После редиректа, как я понял, запускается $app->get('/upload'.... Или нет? А там как передать переменную?
Чтобы передать переменную в шаблон, можно указать массив вторым аргмуентом в функции render: http://docs.slimframework.com/#Rendering
Ты что-то делаешь неправильно. Объясни, что ты хочешь сделать? У тебя пустой репозиторий на гитхабе и ты хочешь залить в него свои файлы? Я не понимаю.
Ты наверно какой-то мануал неправильнй читал. Я советую почитать git book, там все довольно понятно объясняется.
> Делаю git branch new_branch - получаю локально у себя пустую ветку?
Неверно. Когда ты создаешь ветку то она отпочковывается от текущего коммита, то есть она не пустая, а содержит копию всех файлов в репозитории. Ты наверно не читал git book, а зря. Почитай эту главу: http://git-scm.com/book/ru/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D1%8F
Если точнее то ветка это просто указатель на какой-то коммит.
> Теперь git add . - заливаю в нее все текущие файлы проекта.
Неверно. git add добавляет файлы в список для отслеживания (переводит их под контроль гита), и ничего никуда не заливает. Читай git book: http://git-scm.com/book/ru/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9
> Git pull new_branch говорит что на сервере нет ветки new_branch.
Логично, ты же создал ее только у себя.
> Можешь привести пример, как потом слить ветки?
Для начала иди и прочитай git book чтобы знать основы работы с гит и понимать как он устроен. Я вижу по твоему посту, что ты возможно знаком с какой-то другой системой версий, но в гите совершенно не разобрался. Знание другой системы может быть даже вредным так как в гите некоторые вещи значат совсем другое чем например в SVN или Меркуриал.
Алгоритм работы с ветками такой:
- создаешь ветку
- правишь код
- коммитишь
- пушишь ветку на сервер
- когда решил что пора залить эти изменения в мастер, переходишь в ветку, мерджишь мастер, возможно решаешь конфликты. Затем переходиim в мастер и мерджишь в него ветку. Ну и пуш естественно не забываешь делать.
Ты что-то делаешь неправильно. Объясни, что ты хочешь сделать? У тебя пустой репозиторий на гитхабе и ты хочешь залить в него свои файлы? Я не понимаю.
Ты наверно какой-то мануал неправильнй читал. Я советую почитать git book, там все довольно понятно объясняется.
> Делаю git branch new_branch - получаю локально у себя пустую ветку?
Неверно. Когда ты создаешь ветку то она отпочковывается от текущего коммита, то есть она не пустая, а содержит копию всех файлов в репозитории. Ты наверно не читал git book, а зря. Почитай эту главу: http://git-scm.com/book/ru/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D1%8F
Если точнее то ветка это просто указатель на какой-то коммит.
> Теперь git add . - заливаю в нее все текущие файлы проекта.
Неверно. git add добавляет файлы в список для отслеживания (переводит их под контроль гита), и ничего никуда не заливает. Читай git book: http://git-scm.com/book/ru/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9
> Git pull new_branch говорит что на сервере нет ветки new_branch.
Логично, ты же создал ее только у себя.
> Можешь привести пример, как потом слить ветки?
Для начала иди и прочитай git book чтобы знать основы работы с гит и понимать как он устроен. Я вижу по твоему посту, что ты возможно знаком с какой-то другой системой версий, но в гите совершенно не разобрался. Знание другой системы может быть даже вредным так как в гите некоторые вещи значат совсем другое чем например в SVN или Меркуриал.
Алгоритм работы с ветками такой:
- создаешь ветку
- правишь код
- коммитишь
- пушишь ветку на сервер
- когда решил что пора залить эти изменения в мастер, переходишь в ветку, мерджишь мастер, возможно решаешь конфликты. Затем переходиim в мастер и мерджишь в него ветку. Ну и пуш естественно не забываешь делать.
`$connection = mysql_connect("localhost", "root", "");`
`$db = mysql_select_db("newbd");`
`if (!$connection || !$db){`
`\texit(mysql_error());`
`}`
`else{`
`\techo "Connection established successfully";`
`}`
`?>`
и пара вопрос по нему:
Я правильно понимаю, что если подключение к базе не произойдет, переменная $connection все равно будет создана, "установлена" - set, но будет возвращать значение false, что и проверяется в конструкции if-else? То есть, там, грубо говоря, при проебе одного из подключений будет единица: if(не 0 или не 0){прекращаем выполнение, вываливаем ошибку} иначе (если var_dump обеих переменных = true, и выражение = false) пишем, что {все заебок}.
Пока писал, врое разобрался.
`php = govno`
[code]php = govno[/code]
Есть. Давай вспомним, что это такое и как оно работает.
Куки — кусочки информации (строки), которые сервер может передать браузеру и которые браузер будет после этого передавать в заголовках при каждом запросе. Куки хранятся в браузере (пользователь может делать с ними что хочет), их объем ограничен 4Кб на один домен.
Сессия — это данные, которые хранятся на сервере, по умолчанию в файле (и потому пользователь не может видеть или менять эти данные). Когда ты создаешь сессию, PHP сохраняет ее идентификатор (32-символьный набор букв и цифр вроде dsfsfgsyfgsduf7ew7w) в куки. Когда потом ты вызваешь функцию session_start(), PHP находит в куках этот идентификатор, находит файл с данными сессии с соответствующим именем и загружает их в массив _SESSION. После выполнения скрипта данные сохраняются обратно в файл (чтобы сохранить изменения).
У сессии нет такого ограничения на размер данных, как у кук. Однако, есть другая особенность: неактивные сессии удаляются. Обычно специальный скрипт периодически запускается и удаляет сессии, дата модификации которых больше 15-30 минут. Таким образом, если к сессии не было обращение долгое время, она удаляется.
Ну вот теперь, зная эти особенности, ты можешь выбрать что тебе больше подходит.
> Вот уже вчера помог опытный знакомый это дело исправить: http://ideone.com/kyJH1e
Да, можно и так.
> ну и сегодня еще сам попробовал с твоими подсказками сделать
Ну вот видишь, с array_map выходит значительно короче. Тутт тоже все верно.
>>392681
Да, так и надо было сделать. Все правильно. Переходи к следующим задачам — там будет интереснее.
>t. Открой там инспектор, вкладку
Вот, что может заинтересовать:
GET thumb.png - http://rghost.ru/58369002/thumb.png
Cache-Control\tmax-age=600, public
Connection\tkeep-alive
Content-Type\ttext/html; charset=utf-8
Date\tSun, 05 Oct 2014 15:42:06 GMT
Keep-Alive\ttimeout=3
Last-Modified\tSun, 05 Oct 2014 15:42:05 GMT
Location\thttp://tau.rghost.ru/58369002/thumb.png
Server\tnginx
Status\t302 Found
Transfer-Encoding\tchunked
X-UA-Compatible\tIE=Edge,chrome=1
GET thumb.png - http://tau.rghost.ru/58369002/thumb.png
Accept-Ranges\tbytes
Cache-Control\tmax-age=600, public
Connection\tkeep-alive
Content-Disposition\tinline
Content-Length\t10276
Content-Type\timage/jpeg
Date\tSun, 05 Oct 2014 15:42:07 GMT
Etag\t"543166ce-2824"
Keep-Alive\ttimeout=3
Last-Modified\tSun, 05 Oct 2014 15:42:06 GMT
Server\tnginx
Но мне что-то это ничего не дало.
\t
>t. Открой там инспектор, вкладку
Вот, что может заинтересовать:
GET thumb.png - http://rghost.ru/58369002/thumb.png
Cache-Control\tmax-age=600, public
Connection\tkeep-alive
Content-Type\ttext/html; charset=utf-8
Date\tSun, 05 Oct 2014 15:42:06 GMT
Keep-Alive\ttimeout=3
Last-Modified\tSun, 05 Oct 2014 15:42:05 GMT
Location\thttp://tau.rghost.ru/58369002/thumb.png
Server\tnginx
Status\t302 Found
Transfer-Encoding\tchunked
X-UA-Compatible\tIE=Edge,chrome=1
GET thumb.png - http://tau.rghost.ru/58369002/thumb.png
Accept-Ranges\tbytes
Cache-Control\tmax-age=600, public
Connection\tkeep-alive
Content-Disposition\tinline
Content-Length\t10276
Content-Type\timage/jpeg
Date\tSun, 05 Oct 2014 15:42:07 GMT
Etag\t"543166ce-2824"
Keep-Alive\ttimeout=3
Last-Modified\tSun, 05 Oct 2014 15:42:06 GMT
Server\tnginx
Но мне что-то это ничего не дало.
\t
Спасибо, доступно.
Чем яблоко лучше чем груша? Это разные вещи.
Если ты хотел спросить «почему я советую Слим», то тут все просто: когда я составлял задачу, я толком не знал про Sliex, а проСлим знал, плюс сейчас мне кажется что он чуть проще.
Что хорошо в Silex — это использование компонент Симфони, так как HttpFoundation из Симфони уже исплоьзуется в нескольких фреймворках, да и изучать Симфони наверно после Silex будет проще.
Если ты или кто-то хочет использовать для решения задачи Silex вместо Slim, я не против.
Добавил информацию о нем в задание.
>Чем яблоко лучше чем груша? Это разные вещи.
Слим и силекс это не совсем разные вещи, но я понял тебя
А есть задания типа сложные у тебя? Ну для тех, кто 2+ года уже работает, хочется себя проверить.
> переменная $connection все равно будет создана, "установлена"
Верно. Если у тебя есть запись вида
$x = ....;
то после выполнения этой команды переменная $x будет создана в любом случае.
Что произойдет если соединенеи не удалось установить, написано в мануале: http://php.net/manual/ru/function.mysql-connect.php
> Возвращает дескриптор соединения с MySQL в случае успешного выполнения или FALSE в случае возникновения ошибки.
По идее если ты получил false ты не должен вызвыать mysql_select_db так как соединение не удалось установить и отправить команду на выбор базы данных не получится. Это явная ошибка в коде.
Также, давай я еще чуть-чуть расскажу про то, как работают конструкции:
if ($x) ...
if (!$x) ...
В PHP есть специальный тип данных boolean, он имеет всего 2 значения true (правда) и false (ложь). Операции сравнения возвращают результат именно в виде true или false:
var_dump(5 > 3); // true
var_dump(5 < 3); // false
Соответтственно если в if передать true, он сработает, если false то нет (выполнится блок else). А если передать не true и не false, а что-то другое? Тогда PHP сначала преобразует значение к булеву типу (true/false) и только потом проверит его.
Правила преобразования описаны тут: http://php.net/manual/ru/language.types.boolean.php
Как видишь, «пустые» значения вроде 0, "", "0", null, пустой массив преобразуются в false, а почти все остальное — в true.
Заметь, что «любой ресурс», то есть дескриптор соединения с Бд, приравнивается к true.
Таким образом, код if ($x) срабатывает если в $x «непустое» значение, которое даст true почле преобразования.
if (!$x) работает противоположным образом - срабатывает на пустые значения так как оператор ! сначала преобразует еременную к булеву типу, а потом меняет местами true и false.
Если что-то непонятно, спрашивай, давай разберемся чтобы все было понятно.
И еще.
Хватит исплоьзовать mysql
Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO: http://habrahabr.ru/post/137664/ — советую почитать.
> переменная $connection все равно будет создана, "установлена"
Верно. Если у тебя есть запись вида
$x = ....;
то после выполнения этой команды переменная $x будет создана в любом случае.
Что произойдет если соединенеи не удалось установить, написано в мануале: http://php.net/manual/ru/function.mysql-connect.php
> Возвращает дескриптор соединения с MySQL в случае успешного выполнения или FALSE в случае возникновения ошибки.
По идее если ты получил false ты не должен вызвыать mysql_select_db так как соединение не удалось установить и отправить команду на выбор базы данных не получится. Это явная ошибка в коде.
Также, давай я еще чуть-чуть расскажу про то, как работают конструкции:
if ($x) ...
if (!$x) ...
В PHP есть специальный тип данных boolean, он имеет всего 2 значения true (правда) и false (ложь). Операции сравнения возвращают результат именно в виде true или false:
var_dump(5 > 3); // true
var_dump(5 < 3); // false
Соответтственно если в if передать true, он сработает, если false то нет (выполнится блок else). А если передать не true и не false, а что-то другое? Тогда PHP сначала преобразует значение к булеву типу (true/false) и только потом проверит его.
Правила преобразования описаны тут: http://php.net/manual/ru/language.types.boolean.php
Как видишь, «пустые» значения вроде 0, "", "0", null, пустой массив преобразуются в false, а почти все остальное — в true.
Заметь, что «любой ресурс», то есть дескриптор соединения с Бд, приравнивается к true.
Таким образом, код if ($x) срабатывает если в $x «непустое» значение, которое даст true почле преобразования.
if (!$x) работает противоположным образом - срабатывает на пустые значения так как оператор ! сначала преобразует еременную к булеву типу, а потом меняет местами true и false.
Если что-то непонятно, спрашивай, давай разберемся чтобы все было понятно.
И еще.
Хватит исплоьзовать mysql
Имей в виду, что этот код устарел. Лет так на 10. Сейчас для работы с БД используют расширение PDO: http://habrahabr.ru/post/137664/ — советую почитать.
Это не то. Это загрузка каких-то картинок. Ты должен найти там сначала POSt-запрос на загрузку файла, а после него редирект на страницу просмотра.
Впрочем, я проверил Хромом — действительно, они что-то переделали и теперь POST запрос на загрузку файла (POST http://pion.rghost.ru/files ) возвращает ответ 200, а в содержимом яваскрипт-код для перехода на страницу файла:
top.location.href = 'http://rghost.ru/58369676';
Ну гм, тогда изучи как происходит сохранение текста в paste2.org. Там точно редирект есть.
Насчет посложнее, это смотря на какую тему.
Вот задачка на MySQL (уровень: начинающий): https://gist.github.com/codedokode/10539213
Если на тему JS, я бы предложил написать свою маленькую data-binding библиотеку которая позволяет привязывать переменные к html-разметке (если ты сталкивался с angular/knockout то понимаешь о чем речь). То есть мы даем кусок html-кода со вставленными переменными и получаем объект view с куском DOM, при изменении значений в котором меняется этот DOM.
Также, по яваскрипту можешь взять одну из последних задач тут: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Есть вопросы в общем по веб-разработке, вполне подходят для проверки знаний, выбирай любые:
- спроектировать схему БД для чего-нибудь, с внешними ключами. Например, сайт Хабрахабр или Википедия.
- знаешь ли ты способы хранения в БД древовидных данных?
- придумать способ хранения большого числа отмеченных на карте объектов
- написать, а потом оптимизировать сложный запрос
- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
- есть сайт вроде хабрахабр, у каждого пользователя есть карма, пользователей сто тысяч, надо в профиле выводить на каком он месте в топе находится. Как?
- поговорить про стратегии кеширования и поддержания актуальности кеша на том или ином сайте. Например, что бы ты кешировал на хабре?
- спроектируй форму выбора города/села/деревни с проверкой правильности и автодополнением
- у тебя на сайте подключено 20 CSS- и 20 JS файлов, из-за этого он долго грузится и прыгает верстка, что делать?
- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
- что лучше и прогрессивнее, SQL или NoSQL?
- расскажи про деплой
- расскажи про тестирование
- зачем писать на PHP если есть прекрасный ruby on rails?
- нужны ли ORM?
Насчет посложнее, это смотря на какую тему.
Вот задачка на MySQL (уровень: начинающий): https://gist.github.com/codedokode/10539213
Если на тему JS, я бы предложил написать свою маленькую data-binding библиотеку которая позволяет привязывать переменные к html-разметке (если ты сталкивался с angular/knockout то понимаешь о чем речь). То есть мы даем кусок html-кода со вставленными переменными и получаем объект view с куском DOM, при изменении значений в котором меняется этот DOM.
Также, по яваскрипту можешь взять одну из последних задач тут: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Есть вопросы в общем по веб-разработке, вполне подходят для проверки знаний, выбирай любые:
- спроектировать схему БД для чего-нибудь, с внешними ключами. Например, сайт Хабрахабр или Википедия.
- знаешь ли ты способы хранения в БД древовидных данных?
- придумать способ хранения большого числа отмеченных на карте объектов
- написать, а потом оптимизировать сложный запрос
- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
- есть сайт вроде хабрахабр, у каждого пользователя есть карма, пользователей сто тысяч, надо в профиле выводить на каком он месте в топе находится. Как?
- поговорить про стратегии кеширования и поддержания актуальности кеша на том или ином сайте. Например, что бы ты кешировал на хабре?
- спроектируй форму выбора города/села/деревни с проверкой правильности и автодополнением
- у тебя на сайте подключено 20 CSS- и 20 JS файлов, из-за этого он долго грузится и прыгает верстка, что делать?
- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
- что лучше и прогрессивнее, SQL или NoSQL?
- расскажи про деплой
- расскажи про тестирование
- зачем писать на PHP если есть прекрасный ruby on rails?
- нужны ли ORM?
>- спроектировать схему БД для чего-нибудь, с внешними ключами. Например, сайт Хабрахабр или Википедия.
Table posts
id
varchar title
text context
int author_id -> users.id
...
Table users
int id
varchar login
varchar password
....
Table comments
int id
int parent_id=null -> comments.id
int post_id -> posts.id
int author_id -> users.id
text content
...
Ну такиим вот псевдокодом. Ты это имел в виду ?
>- знаешь ли ты способы хранения в БД древовидных данных?
Ну выше еще написал, есть наверное другие, но я никогда такого не делал в работе, так что не знаю
>- придумать способ хранения большого числа отмеченных на карте объектов
Объединять метки в кластеры. Можно взять одну метку, ее считать центром класстера, если какая-то метка на расстоянии < d - она тоже попадает в кластер. d зависит от текущего масштаба.
Т.е. так
1) берем метку
2) строим для нее кластер для текущего d
3) для оставшихся опять делаем 1)
Тонкость есть в выборе центральной метки для кластера, но в общем идея такая
>- написать, а потом оптимизировать сложный запрос
Не понял вопроса
>- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
Sphinx. Или тебе подробнее рассказать? Ну у него короче есть конфиги, в котороых ты указываешь индексируемые поля там, размеры ключевых слов, много всего еще. запускаешь его, он собирает всю малафью. По крону или хуком можно кеш сбросить и пересчитать
>- есть сайт вроде хабрахабр, у каждого пользователя есть карма, пользователей сто тысяч, надо в профиле выводить на каком он месте в топе находится. Как?
Ну в редисе взять какую-нибудь залупу, типа сортед-лист, там точно был такой знач тип данных, который сам сортируется. Но если нету ты скажи, я тогда перепроверю и подумаю
>- поговорить про стратегии кеширования и поддержания актуальности кеша на том или ином сайте. Например, что бы ты кешировал на хабре?
С кешем на хабре беда лел. Ну а так все, что не оч быстро обновляется я бы кешировал. Ленту на главной, которая без фильров. Профили пользователей.
>- спроектируй форму выбора города/села/деревни с проверкой правильности и автодополнением
Тут чуть дольше писать, потом
>- у тебя на сайте подключено 20 CSS- и 20 JS файлов, из-за этого он долго грузится и прыгает верстка, что делать?
У меня есть ассет-менеджеры, которыми я все соберу в 1 сss и 1js файл
js файл вниз страницы кину. Картинки соберу в спрайт
>- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
Если это фреймворк, то в нем 100 про есть i18. Буду создавать файлы с переводами и заменять текст на вызов трансейтера. Или не файлы, а в редис положу переводы, смотря что за сайт. Ну а когда это сделаю, посажу макаку, которая эти переводы сделает для англ, от меня уже ничего не нужно будет
>- что лучше и прогрессивнее, SQL или NoSQL?
Вот это груша и яблоко. NoSQL быстрее и разпиздящее, sql строже, но надежнее (особенно если есть например транзакции, myisam имхо недалеко от nosql ушел)
По ситуации лучше то, или лучше другое.
>- расскажи про деплой
Ну по разному. Самое простое - гит репо на сервер и там же хук подцепить, который на коммит в мастер из папки будет делать pull
Для маленьких проектов capistrano норм.
А так работаю с бамбу и дженкинс. Деплоймент скрипт - это просто набор инструкций, которые деплойер обычно бы руками делал, но его делает деплой-машина лол. Ну там делает пулл репоза, собирает ассеты, выполняет миграции, прогоняет тесты, и если тесты не упали, то выкатывает билд.
>- расскажи про тестирование
Ну чо тестирование, нужно для того, чтобы предыдущий пункт был целесообразнее. Юнит-тесты для академически правильного кода, для бизнеса обычные тесты норм. Ну типа когда просто из phpunit теста дергаешь контроллеры, шлешь пост-запросы и все вот это. Еще тестировщики пишут UI тесты, и я даже тоже их писал на ватире. От них пользы может еще больше, но это очень уныло и как по мне более трудозатратно.
>- зачем писать на PHP если есть прекрасный ruby on rails?
PHP заводится на любом корыте, а не с еблей на vps или на дорогом heroku. Людей больше, запустить проект готовый получается дешевле и работает он стабильнее, чем СТАРТАП НА РУБИ.
>- нужны ли ORM?
А то. Для прототипирования и ненагруженных сайтов идеально. При небольшом тюнинге норм и для средненагруженных.
Задачи завтря гляну, спасибо
>- спроектировать схему БД для чего-нибудь, с внешними ключами. Например, сайт Хабрахабр или Википедия.
Table posts
id
varchar title
text context
int author_id -> users.id
...
Table users
int id
varchar login
varchar password
....
Table comments
int id
int parent_id=null -> comments.id
int post_id -> posts.id
int author_id -> users.id
text content
...
Ну такиим вот псевдокодом. Ты это имел в виду ?
>- знаешь ли ты способы хранения в БД древовидных данных?
Ну выше еще написал, есть наверное другие, но я никогда такого не делал в работе, так что не знаю
>- придумать способ хранения большого числа отмеченных на карте объектов
Объединять метки в кластеры. Можно взять одну метку, ее считать центром класстера, если какая-то метка на расстоянии < d - она тоже попадает в кластер. d зависит от текущего масштаба.
Т.е. так
1) берем метку
2) строим для нее кластер для текущего d
3) для оставшихся опять делаем 1)
Тонкость есть в выборе центральной метки для кластера, но в общем идея такая
>- написать, а потом оптимизировать сложный запрос
Не понял вопроса
>- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
Sphinx. Или тебе подробнее рассказать? Ну у него короче есть конфиги, в котороых ты указываешь индексируемые поля там, размеры ключевых слов, много всего еще. запускаешь его, он собирает всю малафью. По крону или хуком можно кеш сбросить и пересчитать
>- есть сайт вроде хабрахабр, у каждого пользователя есть карма, пользователей сто тысяч, надо в профиле выводить на каком он месте в топе находится. Как?
Ну в редисе взять какую-нибудь залупу, типа сортед-лист, там точно был такой знач тип данных, который сам сортируется. Но если нету ты скажи, я тогда перепроверю и подумаю
>- поговорить про стратегии кеширования и поддержания актуальности кеша на том или ином сайте. Например, что бы ты кешировал на хабре?
С кешем на хабре беда лел. Ну а так все, что не оч быстро обновляется я бы кешировал. Ленту на главной, которая без фильров. Профили пользователей.
>- спроектируй форму выбора города/села/деревни с проверкой правильности и автодополнением
Тут чуть дольше писать, потом
>- у тебя на сайте подключено 20 CSS- и 20 JS файлов, из-за этого он долго грузится и прыгает верстка, что делать?
У меня есть ассет-менеджеры, которыми я все соберу в 1 сss и 1js файл
js файл вниз страницы кину. Картинки соберу в спрайт
>- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
Если это фреймворк, то в нем 100 про есть i18. Буду создавать файлы с переводами и заменять текст на вызов трансейтера. Или не файлы, а в редис положу переводы, смотря что за сайт. Ну а когда это сделаю, посажу макаку, которая эти переводы сделает для англ, от меня уже ничего не нужно будет
>- что лучше и прогрессивнее, SQL или NoSQL?
Вот это груша и яблоко. NoSQL быстрее и разпиздящее, sql строже, но надежнее (особенно если есть например транзакции, myisam имхо недалеко от nosql ушел)
По ситуации лучше то, или лучше другое.
>- расскажи про деплой
Ну по разному. Самое простое - гит репо на сервер и там же хук подцепить, который на коммит в мастер из папки будет делать pull
Для маленьких проектов capistrano норм.
А так работаю с бамбу и дженкинс. Деплоймент скрипт - это просто набор инструкций, которые деплойер обычно бы руками делал, но его делает деплой-машина лол. Ну там делает пулл репоза, собирает ассеты, выполняет миграции, прогоняет тесты, и если тесты не упали, то выкатывает билд.
>- расскажи про тестирование
Ну чо тестирование, нужно для того, чтобы предыдущий пункт был целесообразнее. Юнит-тесты для академически правильного кода, для бизнеса обычные тесты норм. Ну типа когда просто из phpunit теста дергаешь контроллеры, шлешь пост-запросы и все вот это. Еще тестировщики пишут UI тесты, и я даже тоже их писал на ватире. От них пользы может еще больше, но это очень уныло и как по мне более трудозатратно.
>- зачем писать на PHP если есть прекрасный ruby on rails?
PHP заводится на любом корыте, а не с еблей на vps или на дорогом heroku. Людей больше, запустить проект готовый получается дешевле и работает он стабильнее, чем СТАРТАП НА РУБИ.
>- нужны ли ORM?
А то. Для прототипирования и ненагруженных сайтов идеально. При небольшом тюнинге норм и для средненагруженных.
Задачи завтря гляну, спасибо
> text context
Максимум 65535 символов, может и не хватить для большого поста
> varchar password
Не надо хранить пароли в БД. Паста: https://gist.github.com/codedokode/9576319
> Table comments
Попробуй напиши алгоритм вывода комментариве по порядку или вывода ветки комментариев.
>>- знаешь ли ты способы хранения в БД древовидных данных?
> Ну выше еще написал, есть наверное другие,
Это значит не знаешь. Читай: https://gist.github.com/codedokode/10539720
>>- придумать способ хранения
Имелось в виду как лучше хранить эти точки в БД, их может быть много, и нам надо уметь искать точки в определенном квадрате/радиусе от заданной.
>>- написать, а потом оптимизировать сложный запрос
> Не понял вопроса
Вопрос был, знаешь ли ты как оптимизировать запросы? Как работают индексы, что ими можно оптимизировать а что нет, составные индексы, что делает команда EXPLAIN
>>- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
> Sphinx.
Да, у них он и используется. А как ты организуешь индексацию, то есть помещение в сфинкс сущнствующих и новых постов? Какая у тебя будет задержка между публикацией и попаданием в поиск?
> text context
Максимум 65535 символов, может и не хватить для большого поста
> varchar password
Не надо хранить пароли в БД. Паста: https://gist.github.com/codedokode/9576319
> Table comments
Попробуй напиши алгоритм вывода комментариве по порядку или вывода ветки комментариев.
>>- знаешь ли ты способы хранения в БД древовидных данных?
> Ну выше еще написал, есть наверное другие,
Это значит не знаешь. Читай: https://gist.github.com/codedokode/10539720
>>- придумать способ хранения
Имелось в виду как лучше хранить эти точки в БД, их может быть много, и нам надо уметь искать точки в определенном квадрате/радиусе от заданной.
>>- написать, а потом оптимизировать сложный запрос
> Не понял вопроса
Вопрос был, знаешь ли ты как оптимизировать запросы? Как работают индексы, что ими можно оптимизировать а что нет, составные индексы, что делает команда EXPLAIN
>>- есть сайт вроде Хабрахабр с 100 000 постов, надо организовать на нем поиск. Как?
> Sphinx.
Да, у них он и используется. А как ты организуешь индексацию, то есть помещение в сфинкс сущнствующих и новых постов? Какая у тебя будет задержка между публикацией и попаданием в поиск?
>>- есть сайт вроде хабрахабр, у каждого пользователя есть карма, пользователей сто тысяч, надо в профиле выводить на каком он месте в топе находится. Как?
> Ну в редисе взять какую-нибудь залупу, типа сортед-лист,
А он позволяет по пользователю определить его позицию в рейтинге? Уверен?
> Но если нету ты скажи, я тогда перепроверю и подумаю
Перепроверь и подумай
>>- поговорить про стратегии кеширования и поддержания актуальности кеша на том или ином сайте. Например, что бы ты кешировал на хабре?
> С кешем на хабре беда лел. Ну а так все, что не оч быстро обновляется я бы кешировал. Ленту на главной, которая без фильров. Профили пользователей.
А что ты будешь кешировать? HTML-код профиля или запись взятую из БД?
Дальше, смотри на главной выводится список постов, а под каждым написано число комментариев, добавлений в избранное и просмотров. Как эти числа хранить и получать?
Дальше, выводится список комментариев под постом, что с ним? Будем кешировать или нет? Как?
Вообще, если ты не очень знаком с кешированием, советую почитать презентацию где все аспекты разбираются:
http://www.slideshare.net/custisppt/ss-22208427
http://vimeo.com/66739605
инбифо: Денвер ненужен...
> У меня есть ассет-менеджеры, которыми я все соберу в 1 сss и 1js файл
> js файл вниз страницы кину.
Ну а смотри, по идее в разных разделах сайта используются разные скрипты. Где-то jquery + пара маленьких скриптов, а где то подключен wysiwyg, куча виджетов, какой-то самописный код. То есть если все сразу подключить на всех страницах, то многовато получается.
> js файл вниз страницы кину.
Тут есть такой момент. Допустим, у тебя есть кнопка
button onclick="doSomething()"
что если пользователь с GPRS нажмет ее до того как скрипт загрузится? Или, если ты используешь привязку событий по document.ready, то у тебя эта кнопка вообще ничего делать не будет пока все не загрузится.
>>- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
i18n это хорошо, а что насчет данных в БД, например статьи в разделе помощи?
> Или не файлы, а в редис положу переводы, смотря что за сайт
В чем профит от редиса?
>>- что лучше и прогрессивнее, SQL или NoSQL?
Эти системы не взаимозаменяемы. Советую, например, почитать: http://habrahabr.ru/post/231213/
> Ну чо тестирование,
Ну тут ты бы мог вспомнить в чем разница между юнит-тестами, интеграционными и функциональными (приемочными) тестами.
Юнит-тесты хороши например там, где есть изолированный код с хитрой логикой, которая легко проверяется. Например, код, извлекающий телефонные номера из текста легко и удобно тестировать именно юнит-тестами, без всяких контроллеров, баз данных, и тд.
Насчет тестов: допустим на сайте есть функция входа через соцсети. Как тестировать будешь? Как будешь тестировать функцию покупки рингтона через СМС? Как будешь тестировать функцию восстановления забытого пароля через почту?
> У меня есть ассет-менеджеры, которыми я все соберу в 1 сss и 1js файл
> js файл вниз страницы кину.
Ну а смотри, по идее в разных разделах сайта используются разные скрипты. Где-то jquery + пара маленьких скриптов, а где то подключен wysiwyg, куча виджетов, какой-то самописный код. То есть если все сразу подключить на всех страницах, то многовато получается.
> js файл вниз страницы кину.
Тут есть такой момент. Допустим, у тебя есть кнопка
button onclick="doSomething()"
что если пользователь с GPRS нажмет ее до того как скрипт загрузится? Или, если ты используешь привязку событий по document.ready, то у тебя эта кнопка вообще ничего делать не будет пока все не загрузится.
>>- есть какой-то сайт на русском, надо его локализовать — сделать англоязычную версию. Расскажи, что делать будешь
i18n это хорошо, а что насчет данных в БД, например статьи в разделе помощи?
> Или не файлы, а в редис положу переводы, смотря что за сайт
В чем профит от редиса?
>>- что лучше и прогрессивнее, SQL или NoSQL?
Эти системы не взаимозаменяемы. Советую, например, почитать: http://habrahabr.ru/post/231213/
> Ну чо тестирование,
Ну тут ты бы мог вспомнить в чем разница между юнит-тестами, интеграционными и функциональными (приемочными) тестами.
Юнит-тесты хороши например там, где есть изолированный код с хитрой логикой, которая легко проверяется. Например, код, извлекающий телефонные номера из текста легко и удобно тестировать именно юнит-тестами, без всяких контроллеров, баз данных, и тд.
Насчет тестов: допустим на сайте есть функция входа через соцсети. Как тестировать будешь? Как будешь тестировать функцию покупки рингтона через СМС? Как будешь тестировать функцию восстановления забытого пароля через почту?
>Максимум 65535 символов, может и не хватить для большого поста
Ну LONGTEXT, это просто псевдокод, суть же не в этом была
>Не надо хранить пароли в БД
Никто их в БД и не хранит. Мне называть поле hash_password? соль хранить тоже там же? А суть в чем была, во внешних ключах или в этом? Я над очевидными вещами тут не заморачивался
>Имелось в виду как лучше хранить эти точки в БД, их может быть много, и нам надо уметь искать точки в определенном квадрате/радиусе от заданной.
В монго и в постгресе есть специальный тип для гео-координат с поиском по радиусу
>Как работают индексы
Создается еще одна типа "виртуальная" таблица в памяти, в которой только столбец индекса и ссылка на строку в нормальной таблице.
>составные индексы
Тогда столбец ключа в индексе просто клеится из столбцов.
>что делает команда EXPLAIN
Ну она выводит детальную информацию, что именно делает запрос и сколько памяти и времени это занимает, хотя я ей не пользовался, так как пишу нормально сразу
>Да, у них он и используется. А как ты организуешь индексацию, то есть помещение в сфинкс сущнствующих и новых постов? Какая у тебя будет задержка между публикацией и попаданием в поиск?
Какая надо, такую и сделаю. Хоть почти сразу же с дполнительным индексом.
>А он позволяет по пользователю определить его позицию в рейтинге? Уверен?
Конечно. http://redis.io/commands/zrank
>Перепроверь и подумай
Может ты?
Алсо, про тестирование (в том числе интерфейсов) есть полезные статьи в блоге Яндекса на хабре. Они очень много тестируют.
> PHP заводится на любом корыте
Тут дело не в сервере (у любого нормального проекта есть сервер, а часто и не один), мне кажется, а в разработчиках. PHP-программистов больше, а аппетиты у них меньше. Хотя вообще, у Руби есть перспективы так как ситуация может поменяться.
> Для прототипирования и ненагруженных сайтов идеально. При небольшом тюнинге норм и для средненагруженных.
По моему опыту, если программист понимает индексы и понимает какой запрос получается в итоге, то ORM работает достаточно быстро. Типичное время получается, как у обычных запросов — от 1 до нескольких мс (речь о доктрине). Из плюсов, что можно использовать нормальный ООП и сущности, а не какие-нибудь массивы с полями.
Если программисты не разбираются в оптимизации БД и архитектуре ОРМ, тогда скорее всего все будет тормозить так как неэффективный код легко с ORM пишется.
meta charset поставь: http://htmlbook.ru/html/meta/charset
>>392866
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
>Ну а смотри, по идее в разных разделах сайта используются разные скрипты. Где-то jquery + пара маленьких скриптов, а где то подключен wysiwyg, куча виджетов, какой-то самописный код. То есть если все сразу подключить на всех страницах, то многовато получается.
Ну и норм, в процессе рендера все скрипты собираются в массив, и для каждого набора компилится отдельный скрипт
Jquery можно отдельно из cdn подключить, ну и другие либы, которые везде будут использываться
>Тут есть такой момент. Допустим, у тебя есть кнопка
>button onclick="doSomething()"
>что если пользователь с GPRS нажмет ее до того как скрипт загрузится? Или, если ты используешь привязку событий по document.ready, то у тебя эта кнопка вообще ничего делать не будет пока все не загрузится.
А что если пользователь закроет вкладку до того как страница откроется, тогда у него тоже ничего работать не будет.
>Эти системы не взаимозаменяемы.
Я где-то писал, что они взаимозаменяемы? Просто без контекста вопрос, что лучше это блять вообще пушка.
>Ну тут ты бы мог вспомнить в чем разница между юнит-тестами, интеграционными и функциональными (приемочными) тестами.
Я со студентом 2-го курса разговариваю? Прости бро, мы с тобой говорим на разных языках, я просто работаю в проектах, где много работы, где код-ревью, где надо уметь, знать и делать. А похожие фразы, как ты говоришь, и вместо обсуждения сути скатываться в очевидные мелочи уровня джуниора я в последний раз слышал на интервью в один отечественный проект, где денег было явно больше, чем задач в трекере. И поэтому у них хватало времени заниматься этим словесным онанизмом и философствованием
Впрочем, в коде у них присутствовали простыли по 200 строк и вложенные двойные тернарные операторы, и они этого не скрывали и даже гордились тем, что они это читают, а мне западло. Ну ты понял
Прости, я наверное в твоей теме лишний. Тут храм одного бога, за сим удалюсь
Успехов
>>Да, у них он и используется. А как ты организуешь индексацию, то есть помещение в сфинкс сущнствующих и новых постов? Какая у тебя будет задержка между публикацией и попаданием в поиск?
> Какая надо, такую и сделаю. Хоть почти сразу же с дполнительным индексом.
это был вопрос на знание realtime-индексов. С ними можно не почти, а сразу добавить пост.
Насчет индексов, а допустим для запросов
SELECT WHERE a = ? AND b = ? ORDER BY c
SELECT WHERE d BETWEEN ? AND ? AND e = ? ORDER BY f
какие индексы можешь предложить? А для запроса:
SELECT ... FROM posts WHERE likes > 5 AND active = 1 ORDER BY date
А еще, насчет задачек, я бы советовал тебе смотреть олимпиадные задачки с codeforces.ru например — они там отсортированы по сложности.
не робит meta charset. Но заработало, когда в Notepad++ поменял кодировки на ANSI, а в мета чарсете оставил utf-8...Что за нах...
Спасибо, посмотрю
По js прикольные задачи, но это может потому что я js хуже знаю
Дай угадаю, ты тимлид в каком-нибудь проекте а-ля авито, или дочки мейл.ру? Аккуратно очень с такой работой.
ZRANK, да, там сложность небольшая, вполне пойдет.
> Ну и норм, в процессе рендера все скрипты собираются в массив, и для каждого набора компилится отдельный скрипт
В процессе рендера страницы? Не нагрузит ли это сайт?
И если ты все скрипты на странице склеиваешь в один, то при переходе между разделами все придется грузить заново. Обычно их группируют в 2 скрипта — общий для всех страниц и индивидуальный для раздела.
> Jquery можно отдельно из cdn подключить, ну и другие либы, которые везде будут использываться
По моему, профита особого нет, так как увеличивает риск сломать сайт. Недавно например code.jquery.com лежал какое-то время из-за взлома. Также, западный ресурс может быть заблокирован роскомнадзором, опять же, чем меньше ты от внешних ресурсов зависишь тем меньше проблем.
> А что если пользователь закроет вкладку до того как страница откроется, тогда у него тоже ничего работать не будет.
Если он закроет вкладку, кнопка не будет видна, нажать ее нельзя и проблем нет. А если не закроет то проблема есть.
> Просто без контекста вопрос, что лучше это блять вообще пушка.
Вопрос был в смысле для чего лучше использовать SQL, а для чего NoSQL. Что где удобнее хранить.
> Прости, я наверное в твоей теме лишний.
По моему ты сам что-то за меня додумал, сам на это обиделся и сам же ушел.
я выбрал миндмапы уровня xmind, но всё равно довольно неудобно. рано или поздно всё сливается в общий хаос
Не, в мейл ру вроде нет удаленки же, а каждый день ездить в офис для меня напряжно (раньше ездил, надоело). Да и не очень я серьезный и ответственный человек для тимлида.
По JS — учти, задачи-то для начинающих. Больше на знание DOM, событий, работой с кодами клавиш и т.д.
Ну и советую именно олимпиадные задачки смотреть - если брать те, что посложнее, можно неплохо размять мозги.
И еще, может тебе будет интересно этот сайт почитать: http://www.insight-it.ru/highload/ — там описана архитектура разных крупных проектов.
Текстовые файлы, гугл докс, задачки вообще в гитхабе храню. А схемы какие-то я вооще на листочке рисую и никуда не сохраняю.
Сайт годный, я в курсе. Про шардинг и репликации я там узнал например
На олимпиадные задачки вряд ли времени хватит, у меня тут кроме работы еще корсера.
На остальное сложно м телефона отвечать, потом
>В процессе рендера страницы? Не нагрузит ли это сайт?
В процессе ее сборки на бекенде. Нет, не нагрузит, проверял
Можно кстати юзать для этого апи google closure compiler, тогда даже на шаред хостинге работает
Тащемто, такие варианты
1) в конфигах создать "профили" со списком скриптов и в нужных контроллерах эти профили включать
2) в каждом контроллере делать вещи а-ля addScript(<src>);. Потом на последнем этапе у тебя будет список всех скриптов. Из них можно хеш получить например или еще какой идентификатор и скомпилить 1 скрипт, или если уже есть, загрузить уже скомпиленый
>Вопрос был в смысле для чего лучше использовать SQL, а для чего NoSQL. Что где удобнее хранить.
Данные, критические для целостности - в sql, агрегированные, "грязные" или кеши - в nosql. агрегированные и кеш тащемто почти одно и то же в этом контексте. По хорошему все ДАННЫЕ хорошо бы в sql, все то, что можно впоследствии вычислить на основе этих данных - в nosql.
> как происходит сохранение текста в paste2.org. Там точно редирект есть.
Заголовки ответа:
Connection\tkeep-alive
Content-Type\ttext/html
Date\tSun, 05 Oct 2014 19:04:51 GMT
Location\t/YUIVBt7G
Server\tcloudflare-nginx
Transfer-Encoding\tchunked
X-Powered-By\tPHP/5.4.4-14+deb7u8
cf-ray\t174be32a33a70c9b-AMS
Заголовки запроса:
Accept\ttext/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding\tgzip, deflate
Accept-Language\tru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Connection\tkeep-alive
Cookie\t__cfduid=dfbdb49ef6dac220de79c7dab32cde0101412527449863; __qca=P0-827290259-1412527451452
Host\tpaste2.org
Referer\thttp://paste2.org/
User-Agent\tMozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0
Запрос заголовков из потока загрузки:
Content-Length\t144
Content-Type\tapplication/x-www-form-urlencoded
Вот так примерно.
Генерится какой-то рандомный урл. Я не знаю как это делается. Мне не особо что-то дала эта информация. Наверное я не умею с ней работать. Оп, опять ты меня выкинул в открытый океан и не сказал, что собственно искать и делать.
> как происходит сохранение текста в paste2.org. Там точно редирект есть.
Заголовки ответа:
Connection\tkeep-alive
Content-Type\ttext/html
Date\tSun, 05 Oct 2014 19:04:51 GMT
Location\t/YUIVBt7G
Server\tcloudflare-nginx
Transfer-Encoding\tchunked
X-Powered-By\tPHP/5.4.4-14+deb7u8
cf-ray\t174be32a33a70c9b-AMS
Заголовки запроса:
Accept\ttext/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding\tgzip, deflate
Accept-Language\tru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Connection\tkeep-alive
Cookie\t__cfduid=dfbdb49ef6dac220de79c7dab32cde0101412527449863; __qca=P0-827290259-1412527451452
Host\tpaste2.org
Referer\thttp://paste2.org/
User-Agent\tMozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0
Запрос заголовков из потока загрузки:
Content-Length\t144
Content-Type\tapplication/x-www-form-urlencoded
Вот так примерно.
Генерится какой-то рандомный урл. Я не знаю как это делается. Мне не особо что-то дала эта информация. Наверное я не умею с ней работать. Оп, опять ты меня выкинул в открытый океан и не сказал, что собственно искать и делать.
Идея такая: POST-запрос создает новую запись и редиректит на ее страницу.
> Генерится какой-то рандомный урл. Я не знаю как это делается.
Рандомный URL можно сгенерировать функцией на основе mt_rand, я думаю. Но тебе это не надо. В твоем случае, ты можешь в базе (у тебя же есть база данных?) сделать колонку с AUTO_INCREMENT и брать id из нее. mySQL умеет сама генерировать id при вставке новой записи, соответственно этот id ты можешь брать.
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
http://www.mysql.ru/docs/man/example-AUTO_INCREMENT.html
Соответственно, в твоем случае при загрузке файла он сохраняется на диск, в таблицу вставляется новая запись и из этой же записи берется id. И делается редирект на страницу этого файла например /files/12345
Ну да, мне тоже кажется, что NoSQL для кешей хорошо подходит.
Насчет минификации скриптов —там еще есть подводный камень, если это минификация которая меняет номера строк и имена функций, то добавляется отдельный геморрой с отладкой (не всюду map-файлы поддерживаются и работают), а логгеры js ошибок перестают выдавать читабельные стектрейсы. Я больше сторонник просто склеивания по этой причине, а сжатие как-нибудь за счет gzip делать.
у кложуры есть light-режим, который сжимает достаточно неплохо, но пока ничего у меня не ломал
А так да, если не загоняться, то gzip сам по себе даже более эффективен, чем само по себе компилирование
>Ну да, мне тоже кажется, что NoSQL для кешей хорошо подходит.
Не все так просто. Если по чесноку, то я думаю что NoSQL все же заменит реляционные базы, если они тупо не сделают мне интерфейс для кода. РСУБД делались изначально как самостоятельный софт с интерфейсом для обученного ЧЕЛОВЕКА (SQL). А сейчас мы в коде ебемся с этими ORM, query-builder-ами, эскейпами, экранированием и прочей залупой, потому что другого интерфейса, кроме интерфейса для человека у РСУБД нет. А у новых свистоперделок есть более продуманные обвязки, а есть "человекческий" интерфейс
В общем, сейчас РСУБД в вебе в таком виде все больше похоже на костыль по этой причине.
Нет базы. Ты же сам говорил, гитхаб и база данных несовместимые вещи. И еще, установил я mysql. Поставился ещё mysql installer, который запускается каждый день в одно и то же время. И скачал я рандомный вариант, ведь там было из чего выбрать. Server, development что-то ещё.
Насчет SQL и ORM согласен, но всеядность NoSQL (можно записывать что угодно куда угодно), отсутсвие транзакций и связей — это пока что серьезный минус. Так как в real world приложениях если разрешить писать в базу что угодно, она быстро превращается в свалку.
Ну и еще, SQL интерфейс удобен когда ты хочешь из консоли какой-то сложный запрос с джойнами соорудить, чтобы например что-то посчитать или проверить — в NoSQL как я понимаю, для этого приходится писать скрипт что дольше (в монге есть какая-то консоль с яваскриптом, но в ней не поджойнишь).
> Ты же сам говорил, гитхаб и база данных несовместимые вещи
Не помню такого. Все совместимо, создавай базу.
Я имел в виду, хранить код или шаблоны в базе — не совместимо с гитом. А хранить в базе данные — это то, для чего она и предназначена.
> Поставился ещё mysql installer, который запускается каждый день в одно и то же время. И скачал я рандомный вариант, ведь там было из чего выбрать. Server, development что-то ещё.
Тебе нужен только MySQL Server. Ну еще можешь MySQL Workbench оставить — это программа для графического построения БД, таблички там делать, стрелочки протягивать. Остальное можешь отключить или удалить.
Вот ссылки по базам данных если что: https://gist.github.com/codedokode/10539213
>но всеядность NoSQL (можно записывать что угодно куда угодно), отсутсвие транзакций и связей — это пока что серьезный минус.
Я работал на проекте, когда это наоборот было гуд и серьезный плюс
>в NoSQL как я понимаю, для этого приходится писать скрипт
Не, в редисе и монго есть консоль, которая все умеет делать, что надо. Монга джоины не поддерживает, но ты можешь вложенность делать или хранить референсы на другие объекты других коллекций, и при желании их вытягивать тоже
>Монга джоины не поддерживает, но ты можешь вложенность делать
Ну это несерьезно. Нарушение нормализации до добра не доводит, как раз про это была статья на Хабре.
> или хранить референсы на другие объекты других коллекций, и при желании их вытягивать
Это как я понимаю, там очень неэффективно, так как вытягивание происходит клиентом дополнительными запросами. И референсы там, как я понимаю, никто на правильность и целостность не проверяет.
Мне кажется, все же плоские данные там удобнее хранить, как в кеше, а связи оставить для БД.
> есть консоль
Как я понимаю из этого поста: http://stackoverflow.com/a/8746805 для запросов с джойнами там надо написать полноценную программу и как раз SQL-синтаксис проще и лаконичнее, если тебе надо один раз какую-то выборку сделать. Джойны/группировки однозначно проще этого нагромождения циклов и скобочек.
Редисовская консоль вообще кроме примитивных операций (проверить ключ/добавить ключ) ничег не умеет. Редис и монго в принципе рядом упоминать не стоило, так как монго — это полноценная NoSQL база данных, а редис — скорее улучшенный мемкеш.
>для запросов с джойнами там надо написать полноценную программу и как раз SQL-синтаксис проще и лаконичнее
Ну так мы тут трем о том, что SQL - интерфейс для человека, так как СУБД - самостоятельный софт
Redis - не имеет смысла как самостоятельный софт, а в тех рамках, которых он используется, вполне хватает той консоли что есть.
Ну и редис не хранит данные, для которых джоины надо делать. Это максимум хеши с дополнительными фичами, не более
>Ну это несерьезно. Нарушение нормализации до добра не доводит
Ну вот задача. В омерике есть требование в университетах к составлению цитат к курсовым. Есть около 24 разных стилей, к каждому из которых есть 80 страничные мануалы. Все это выливается в очень объемные "умные" формы, которые для одних и тех же данных должны генерить цитаты в разных стилях, фильровать цитаты по авторам и другим параметрам и прочему. Вот как тут реляционной таблицей сделаешь? Ну сделать-то можно, но проще всего было с монгой.
И в рамках такого неочень большого, но вот хитровыебанного проекта хранение референсов из других коллекций вполне себе работало
> Ну так мы тут трем о том, что SQL - интерфейс для человека, так как СУБД - самостоятельный софт
Ну так я с этим согласен, я это упоминаю к тому что окончательно от SQL отказываться не стоит, так как человеку именно он удобнее. И я не спорю, что для сохранения сущностей он не очень удобен, так как надо городить слой преобразования.
> Вот как тут реляционной таблицей сделаешь? Ну сделать-то можно, но проще всего было с монгой.
Ну может быть, хотя я тут бы это вообще в код перенес, так как этих стилей мало и они столетиями не меняются, и проще может быть их кодом выразить чем городить сложные условия. А если надо было бы в SQL хранить — засунул бы в поле в JSON формате.
> хранение референсов из других коллекций вполне себе работало
Ну это не нарушает нормализацию, я имел в виду что плохо допустим комменты хранить внутри поста.
>хотя я тут бы это вообще в код перенес, так как этих стилей мало и они столетиями не меняются, и проще может быть их кодом выразить чем городить сложные условия.
Так рендер мы так и вынесли, но суть в том, что кроме 24 стилей есть еще больше 10 сущностей (цитата к книге, фильму, статье в газете etc.), итого их дохуя комбинаций. И в одном стиле есть в форме поля, которых в другом стиле нету. Т.е. чувак создает цитату для одного стиля, а потом может переключиться на другой стиль, но персистентность должна быть. Т.е. чувак решит отредактировать цитату - и все поля нужно загрузить в форму.
Сохранять в json можно было бы, если бы не был предусмотрен поиск по некоторым полям например и кое-какое агрегирование
Можно и в mysql было
но в этом случае не нужно
>я имел в виду что плохо допустим комменты хранить внутри поста.
Комменты как раз и можно хранить, в них самих по сути смысла нет в отрыве от поста. В чем проблема с этим?
>я это упоминаю к тому что окончательно от SQL отказываться не стоит, так как человеку именно он удобнее
Для человека можно еще более удобный ui делать.
И честно говоря запросы в консоли я пишу реже, чем клею запросы в коде, пропорции где-то 1 к 20.
> В чем проблема с этим?
Вывести в профиле оставленные пользователем комментарии например. Или хотя бы их число. Ну е-мое, я же раза 2 или 3 упомянул уже статью, http://habrahabr.ru/post/231213/
Идея отказаться от нормализации и хранить сущности внутри дурная изначально. То, что она упоминается в мануале по монго (я вроде видел) говорит лишь о странных взглядах ее разработчиков. Ни один адекватный человек такое предлагать не станет.
Выигрыш от отказа нулевой, а проблем можно огрести немало.
> Для человека можно еще более удобный ui делать
Удобный ui — это Гугл. Но он годится только для поиска текста.
Для поисков вроде «5 самых популярных постов на тему SQL» или «пользователи у которых кешированное число комментариев не соответствует реальному » ты не сделаешь простой Gui. Не говоря о более сложных вещах.
> И честно говоря запросы в консоли я пишу реже, чем клею запросы в коде, пропорции где-то 1 к 20.
Кому как. Я пишу их каждый день, база у нас большая и сложная. Для меня пользоваться монго где SQL нету было бы очень неудобно.
И я тут подумал, предлагать сделать GUI для программиста как минимум странно. Программисты предпочитают консоль.
http://ideone.com/5cQfR3
>Вывести в профиле оставленные пользователем комментарии например. Или хотя бы их число. Ну е-мое, я же раза 2 или 3 упомянул уже статью,
Так кхуле ты с этим хабром прицепился?
Вконтакте выводит все комментарии пользователя? Кроме хабра и хабра-лайк ресурсов я такого вообще нигде не видел. В вк комменты плоские, так что можно сделать в монго массив комментов и length и будет их количеством.
В документации кстати таких примеров нет, а есть примеры лучше
Например телефонный номер, можно отдельно хранить код страны, операторный префикс, кучу всего блять и красиво выводить. А в MySQL что? Таблица отдельная и джоины-джоины? JSON сериализация? Конечно, с отдельными таблицами можно будет посчитать количество номеров начинающихся на 2 или количество номеров, где 3-я цифра 0, но кому оно всралось то?
>Идея отказаться от нормализации и хранить сущности внутри дурная изначально.
>Ни один адекватный человек такое предлагать не станет.
Вот это да. А поцаны то и не знали, и рекомендуют денормализацию как один из способов забустить перформанс.
Я так понимаю, основной твой позыв "Заебали форсить и пихать это говно везде". Так вот, конкретно ты не менее религиозен, просто "в профиль". Без контекста задачи, которая должна решаться, нет смысла это обсуждать. Это как говорить, что внедорожник - это здоровое, неповоротливое, много жрущее ненужное говно. И ни один нормальный адекватный здравомыслящий человек такого не купит. А может в сельской местности живет человек, так он неадекват значит.
В общем, я видел разные задачи, где монга была вполне себе целесообразная если не как основное, то как одно из основных хранилищ, а не как кеш-машина
вопрос - есть ли такой ресурс, чтобы можно было загрузить пыхокод, а затем заходить на такую сраницу, а она как настоящий веб-сервер? чисто в учебных целях.
>>var constructor = this.constructor;
>Что это за ерунда?
Прочел - http://javascript.ru/tutorial/object/inheritance#tretya-stroka-prototype-dlya-dochernego-klassa. Мне прописывать alert(имяЭлемента.constructor) каждый раз после создания нового элемента? После примера там написано, что такая строка ставит правильное значение prototype.constructor.
>Во-первых, ты забыл new
>Во-вторых, ты должен вызывать этот конструктор не сам по себе, а при создании объекта-потомка. Например из конструктора Powerline, при этом еще и передавать нужный this.
Мне в конструкторе каждого объекта это прописывать? А, например, в конструкторе электросети один раз это прописать нельзя?
>> ElementsNetwork.prototype.showPower =
>Нехорошо, эта функция обращается к свойству из потомка. Надо любо объявить это свойство в родительском классе либо что-то еще поменять. Предок не должен знать о своих потомках.
Вроде понял, но что можно сделать - не знаю.
http://jsbin.com/kulucuxadahe/3/edit
>>393058
мимоперфекционист
getSalary()
...
$multiply = 1;
switch ($this->rank) {
case 2:
$multiply = 1.25;
break;
case 3:
$multiply = 1.50;
break;
...
Если rank равен 2 или 3, то присвоение $multiply будет происходить два раза — лишняя операция. Засунь в default.
pages() можно безболезненно сократить на одну строку.
Конструкторы лучше объявлять вначале класса (Department).
В createEmployee первый параметр — строка с именем класса. Если при вызове опечатаешься в имени, придётся лезть в код, искать, где эта хуйня объявляется, на больших проектах очень не приятно таким заниматься.
Можно объявить createEmployee(Employee $type, $quantity) и вызывать createEmployee(new Manager(1), 9). Так и IDE будет подсказывать и вообще строки надо поменьше использовать. Но это спорный момент, наверное...
Я бы где возможно использовал === вместо == (почти везде). Дисциплинирует.
Вопросы задавать научись. Для того что ты написал, подойдет локалхост с установленным на нем апачем, пхп и прочим необходимым. Если необходим доступ извне, можно сделать туннель к локалхосту (https://ngrok.com/ например).
Если же ты ищешь, чтобы за тебя уже все было установлено и настроено бесплатно, ты ничего не найдешь.
Сопливый ребенок с болдом головного мозга и синдромом маленьких буковок приходит в мой уютный загончик и высирает свое недоразумение, которые он по скудоумию своему принял за продукт умственной деятельности своего головного мозга... еще и требует чего-то, квохчет.
Чисто в учебных целях, проследуй на хуй.
Анон, посмотри на http://phpfiddle.org. Тут много фреймворков можно использовать, ajax, jquery, все вот это.
Гугли беспатный php хостинг. Некоторые добавляют рекламу на твои страницы , некоторые нет (обычно это западные). Например, http://www.000webhost.com/ и куча аналогичных западных. Есть также сайты (западные) с большой таблицей сравнения бесплатных хостингов. Гугли.
после того как появились впс за 2-5 баксов в месяц я перестал понимать вопросы уровня ПАСАВЕТУЙТЕ БИСПЛАТНЫЙ ХОСТЕНГ
Анон может быть не умеет в линукс и ему удобнее мучаться с ручным копированием файлов чем написать деплой скрипт или гит поставить. Это нормально для начинающего, потом научим нормально делать.
это хуёвый подход
это то же самое что вместо того чтобы научить нюфага в нетбинс или пхпшторм он полгода говнокодит в блокноте, так как ПОКА НЕ СОЗРЕЛ
это полная хуйня
При чем тут phpStorm и копирование файлов по FTP? phpStorm за тебя деплоймент скрипт не напишет все равно.
Опять же, изучать FTP надо с простого файлового менеджера, а не с многтстраничных инструкций по настройке FTP в phpStorm, когда читатель сам не понимает, что он делает. Если у тебя есть на примете хороший мануал, где все объясняется в деталях, начиная с того что такое FTP и как он работает, какие у него есть настройки и зачем, и заканчивая как это интегрируется в phpStorm, то давай ссылку.
Алсо, неправильно привязывать обучение к платным продуктам, я тут подумал, тем более что есть бесплатные аналоги.
при чём тут фтп? ты ничего не понял.
ты советуешь ему учить заведомо устаревший фтп
давай ещё раз: водители учатся водить не на телеге, они садятся сразу на машину.
детей учат общаться не с обезьянами - их сразу погружают в коллектив.
вот и не надо ебать мозги новичкам ручными фтп, блокнотами для кода и прочим говном - пусть сразу окунаются в гит, основы линукса и иде.
оп, я не пойму кое-чего
цитирую:
"
для проверки старого пароля функция
AppUser::checkPass($old_pass) => true если ок
для смены пароля
AppUser::setPass($new_pass) => true если ок
Session::put($var, $val) - для сохранения в сессию (для механизма защиты от многократных подборов)
Session::get($var) - для взятия из сессии
"
так вот, всё вроде ясно, но что за хуйня вот эта AppUser? это класс в котором функция, или че?!
А что ещё как-то делают помимо копирования файлов в тотал командере на сервер? Я только так делал и даже не задумывался.
И да, у меня был линукс пол года примерно, но из-за постоянных проблем, ошибок приходилось терять время, гуглить, вместо продуктивной работы. Тогда я как раз твой учебник ещё решал.
Спасибо. Осилил.
Смотря для какого уровня. Ну напиши мне алгоритм сортировки массива. Объем массива задается через переменную. Массив заполняется случайными числами, элементы могут повторятся. Алсо пусть ведется подсчет количества перестановок нужных для сортировки.
И еще вопрос, как вы деплоите сайты на shared хостинги, где есть только ftp доступ? Так же по старинке копипаст?
Это тралинг такой? Люто проиграл с твоего алгоритма, но в хорошем смысле. Почему не сделал подсчет количества ходов?
>Пачаны, как вы тестируете сайтики?
функциональные тесты в phpunit
bdd тесты симфони
unit-test-ы js
>Как тестировать frontend оболочку?
Ну можешь так
>функциональные тесты в phpunit
>bdd тесты симфони
>unit-test-ы js
>есть ли какие нибудь автоматические способы тестирования таких типичных действий пользователя на сайте?
Если тебе нужно чтобы "робот" заполнял поля и нажимал кнопки, то это watir, selenium.
>Так же по старинке копипаст?
Якой копипаст? Имеешь в виду выгрузку из IDE?
Ну у меня в шаред-хостинге есть кастрированный ssh, и там есть svn. Тащемто для проектов, которые на шаред хостинге, svn норм
Ну и это, я через капистрано, а в капфайле только svn update
> Как тестировать frontend оболочку?
Тут есть 2 варианта: полноценные браузеры и не полноценные. Полноценные загружают и понимают яваскрипт/CSS, неполноценные — только HTML. С полноценными все гораздо сложнее и медленнее, но они обеспечивают лучшее качество тестирования. Начнем с полноценных.
Это Selenium либо phantomjs и фреймворки на его основе. Selenium — это набор драйверов, которые встраиваются в браузеры (Хром, ФФ, ИЕ) и позволяют управлять ими: загрузить страницу: нажать кнопку и т.д. Соответственно, ты можешь программно загружать свой сайт и делать на нем какие-то действия в реальном браузере.
Все это работает, естественно, достаточно криво. Например может выскочить какое-нибудь окошко обновления браузера и сломать тест. Сам селениум тоже написан неидеально. Ну и запускать надо на отдельном сервере, иначе ты будешь мешать проведению тестов.
Если ты хочешь тестировать под разными ОС (Мак/винда) то надо минимум 2 сервера (или виртуалки).
phantomjs — это «безголовая» версия браузера на вебките (тот же движок что и в Хроме), то есть браузер который не выводит никаких окошек. Он управляется кодом на яваскрипте. Он хуже тем, что не является настоящим браузером, и тем что им нельзя управлять извне (например из тестов на PHP), а надо писать скрипты на JS. Но зато он работает быстрее и менее глючно чем настоящий браузер с селениумом.
И Selenium, и phantomjs умеют сохранять скриншоты для дальнейшего анализа.
Как ты видишь, полноценное тестирование достаточно сложное в плане организации и настройки, но зато оно позволяет проверять всю работу веб-приложения. Потому им пользуются далеко не все.
Есть еще «неполноценные» браузеры, то есть PHP-скрипт который скачивает html-код (не загружая JS, CSS или картинки), умеет искать текст на странице, переходить по ссылкам и заполнять формы (опять же без выполнения яваскрипта). Такие скрипты работают гораздо быстрее чем полноценный браузер, и достаточно надежные. Ты можешь писать такие тесты с использованием фреймворков:
https://phpunit.de/ (самый известный) — несмотря на название, он поддерживает не только юнит-тесты, но и другие виды тестов. Вроде даже умеет работать с селениум, но я никогда не пробовал, так что не знаю.
http://codeception.com/ — надстройка поверх phpunit, тоже умеет делать разные виды тестов, в том числе работать c HTML-страницами и формами, и с селениумом.
Иногда для ускорения используют еще более сложный вариант: вместо того, чтобы запрашивать страницы через веб-сервер по протоколу HTTP, тесты напрямую загружают приложение и вызывают контроллеры. Очевидно что такие тесты работают чуть быстрее, но могут не заметить какие-то ошибки, которые пользователь увидит в браузере. Плюс, из-за того что контроллеры вызвыаются несколько раз подряд внутри одного процесса, они могут работать не так, как в реальности.
Вот еще интересные стати на тему:
http://habrahabr.ru/company/yandex/blog/173769/
http://habrahabr.ru/company/yandex/blog/238323/
http://habrahabr.ru/company/yandex/blog/200968/
http://habrahabr.ru/company/yandex/blog/177163/
http://habrahabr.ru/company/badoo/blog/190572/
> Как тестировать frontend оболочку?
Тут есть 2 варианта: полноценные браузеры и не полноценные. Полноценные загружают и понимают яваскрипт/CSS, неполноценные — только HTML. С полноценными все гораздо сложнее и медленнее, но они обеспечивают лучшее качество тестирования. Начнем с полноценных.
Это Selenium либо phantomjs и фреймворки на его основе. Selenium — это набор драйверов, которые встраиваются в браузеры (Хром, ФФ, ИЕ) и позволяют управлять ими: загрузить страницу: нажать кнопку и т.д. Соответственно, ты можешь программно загружать свой сайт и делать на нем какие-то действия в реальном браузере.
Все это работает, естественно, достаточно криво. Например может выскочить какое-нибудь окошко обновления браузера и сломать тест. Сам селениум тоже написан неидеально. Ну и запускать надо на отдельном сервере, иначе ты будешь мешать проведению тестов.
Если ты хочешь тестировать под разными ОС (Мак/винда) то надо минимум 2 сервера (или виртуалки).
phantomjs — это «безголовая» версия браузера на вебките (тот же движок что и в Хроме), то есть браузер который не выводит никаких окошек. Он управляется кодом на яваскрипте. Он хуже тем, что не является настоящим браузером, и тем что им нельзя управлять извне (например из тестов на PHP), а надо писать скрипты на JS. Но зато он работает быстрее и менее глючно чем настоящий браузер с селениумом.
И Selenium, и phantomjs умеют сохранять скриншоты для дальнейшего анализа.
Как ты видишь, полноценное тестирование достаточно сложное в плане организации и настройки, но зато оно позволяет проверять всю работу веб-приложения. Потому им пользуются далеко не все.
Есть еще «неполноценные» браузеры, то есть PHP-скрипт который скачивает html-код (не загружая JS, CSS или картинки), умеет искать текст на странице, переходить по ссылкам и заполнять формы (опять же без выполнения яваскрипта). Такие скрипты работают гораздо быстрее чем полноценный браузер, и достаточно надежные. Ты можешь писать такие тесты с использованием фреймворков:
https://phpunit.de/ (самый известный) — несмотря на название, он поддерживает не только юнит-тесты, но и другие виды тестов. Вроде даже умеет работать с селениум, но я никогда не пробовал, так что не знаю.
http://codeception.com/ — надстройка поверх phpunit, тоже умеет делать разные виды тестов, в том числе работать c HTML-страницами и формами, и с селениумом.
Иногда для ускорения используют еще более сложный вариант: вместо того, чтобы запрашивать страницы через веб-сервер по протоколу HTTP, тесты напрямую загружают приложение и вызывают контроллеры. Очевидно что такие тесты работают чуть быстрее, но могут не заметить какие-то ошибки, которые пользователь увидит в браузере. Плюс, из-за того что контроллеры вызвыаются несколько раз подряд внутри одного процесса, они могут работать не так, как в реальности.
Вот еще интересные стати на тему:
http://habrahabr.ru/company/yandex/blog/173769/
http://habrahabr.ru/company/yandex/blog/238323/
http://habrahabr.ru/company/yandex/blog/200968/
http://habrahabr.ru/company/yandex/blog/177163/
http://habrahabr.ru/company/badoo/blog/190572/
Тут стоило бы добавить что watir — руби-фреймворк поверх Селениум чтобы было понятно что к чему. Если анон пишет на PHP ему наверно удобнее использовать php- а не руби-фреймворк.
> как вы деплоите сайты на shared хостинги, где есть только ftp доступ?
Если только FTP то берем какой-нибудь rsync и пишем bash скрипт на его основе. Я например, ради экономии времени делаю так, чтобы он заливал только изменившиеся с последнего деплоя файлы. Надо немного помучаться, чтобы написать и настроить, зато потом все нормально.
Если есть ssh доступ то опять же rsync.
Да я не тот человек, который задание просил, просто мимо проходил, решил пошутить.
Здохни, холоп унитазный
> function cofee()
Функции надо называть с глагола, сделайЧтоТо, getCoffeeConsumption().
> public $data;
лучше назвать workers. data — это ничего не значит и это то же самое что public $a;
> if ($worker->isHead == true) {
В таких случаях (когда переменная принимает значения только true или false) можно писать просто if ($worker->isHead)
> if ($worker->isHead == true) {
> $cofee += $worker->cofee 2;
Этот код должен быть в классе Работник, а не Департамент. В работнике есть все данные для того, чтобы рассчитать потребление им кофе и потому надо сделать соответствующий метод в нем.
То же самое относится к числу печатаемых страниц.
> foreach ($this->data as $key => $worker) {
Ты не используешь $key, значит не надо его тут писать, пиши $this->workers as $worker
> if (is_array($data)) {
Это плохо, когда функция принимает на вход разные типы данных (так труднее обнаружить ошибку). Лучше сделать 2 отдельных функции.
Везде, где можно, надо расставить тайп хинты ( http://php.net/manual/ru/language.oop5.typehinting.php ) — ты можешь указать что в функцию можно передавать только массив или объект определенного класса.
> while (mb_strlen($name) < $col) {
Используй str_repeat (эта функция корректно работает с любыми символами)
> $col1 = 20;
> $col2 = 6;
Эти переменные скопированы. Это значит что менять их надо сразу в двух местах, а это неудобно. Избавься от этой проблемы.
И еще. Тут ты всюду используешь публичные свойства (public). Это хорошо для простых случаев, но в дальнейшем давай использовать private и protected свойства которые обеспечивают инкапсуляцию (инкапсуляция значит что нельзя извне прочесть или поменять данные объекта, а можно только вызывать его методы). Про это ты можешь почитать в мануале: http://php.net/manual/ru/language.oop5.visibility.php
Так, в общем, решено верно, надо только исправить эти замечания.
> function cofee()
Функции надо называть с глагола, сделайЧтоТо, getCoffeeConsumption().
> public $data;
лучше назвать workers. data — это ничего не значит и это то же самое что public $a;
> if ($worker->isHead == true) {
В таких случаях (когда переменная принимает значения только true или false) можно писать просто if ($worker->isHead)
> if ($worker->isHead == true) {
> $cofee += $worker->cofee 2;
Этот код должен быть в классе Работник, а не Департамент. В работнике есть все данные для того, чтобы рассчитать потребление им кофе и потому надо сделать соответствующий метод в нем.
То же самое относится к числу печатаемых страниц.
> foreach ($this->data as $key => $worker) {
Ты не используешь $key, значит не надо его тут писать, пиши $this->workers as $worker
> if (is_array($data)) {
Это плохо, когда функция принимает на вход разные типы данных (так труднее обнаружить ошибку). Лучше сделать 2 отдельных функции.
Везде, где можно, надо расставить тайп хинты ( http://php.net/manual/ru/language.oop5.typehinting.php ) — ты можешь указать что в функцию можно передавать только массив или объект определенного класса.
> while (mb_strlen($name) < $col) {
Используй str_repeat (эта функция корректно работает с любыми символами)
> $col1 = 20;
> $col2 = 6;
Эти переменные скопированы. Это значит что менять их надо сразу в двух местах, а это неудобно. Избавься от этой проблемы.
И еще. Тут ты всюду используешь публичные свойства (public). Это хорошо для простых случаев, но в дальнейшем давай использовать private и protected свойства которые обеспечивают инкапсуляцию (инкапсуляция значит что нельзя извне прочесть или поменять данные объекта, а можно только вызывать его методы). Про это ты можешь почитать в мануале: http://php.net/manual/ru/language.oop5.visibility.php
Так, в общем, решено верно, надо только исправить эти замечания.
А что злой-то такой?
> Вконтакте выводит все комментарии пользователя?
Во вконтакте есть например раздел «последние комментарии к мои фото». Так что отказаться от нормализации тут не выйдет. Как и в 99% других случаев. Ее не глупые люди придумали, и не вчера.
Есть такое явление, как денормализация ради оптимизации, но это совсем не то, что ты упомянул. Это когда например для числа комментариев в таблице постов делают колонку с цифрой, чтобы не считать их число через джойн с группировкой.
И насчет монги, не знаю, возможно ее авторы имели в виду что-то другое, предлагая хранить связанные записи внутри, возможно они живут в каком-то параллельном мире где такой подход работает. Может они имели в виду ситуации вроде хранить список адресов пользователя внутри объекта профиля — почему бы и нет.
> Например телефонный номер, можно отдельно хранить код страны, операторный префикс, кучу всего блять и красиво выводить. А в MySQL что? Таблица отдельная и джоины-джоины? JSON сериализация? Конечно, с отдельными таблицами можно будет посчитать количество номеров начинающихся на 2 или количество номеров, где 3-я цифра 0, но кому оно всралось то?
Это какая-то выдуманная ситуация по моему. Я бы начал с вопроса зачем делать несколько полей для хранения и ввода 1 номера. Мне (в интерфейсах) всегда нравится когда одно поле ввода, а не куча мелких полей между которыми не всегда правильно переходит курсор.
И что плохого в отдельной таблице (user_id, phone)? Ничего плохого. По крайней мере между вариантом «сделать таблицу для телефонов» и «перейти на монгу» я бы выбрал первый вариант не задумываясь.
Почему-то среди пользователей монги много фанатиков, если им указываешь на недостатки, они только агрессивнее становятся.
Не знаю, жизнь такая.....
>>393107
Ответ: http://ideone.com/gqRx2u
>>393116
Не очень-то ты перфекционист если не обратил внимания на имена функций и переменных.
> Можно объявить createEmployee(Employee $type, $quantity) и вызывать createEmployee(new Manager(1), 9). Так и IDE будет подсказывать и вообще строки надо поменьше использовать. Но это спорный момент, наверное...
Ты имеешь в виду клонировать объекты через clone? Это тоже не очень, так как у нас может быть в конструкторе генерация уникальных id и нам надо чтобы объекты создавались, а не клонировались.
Если делать по-перфекционистки, надо наверно завести константы Employee::TYPE_MANAGER и передавтаь их.
О, ngrok интересное решение, жаль правда что это коммерческий сервис а не open source.
Но минус в том что надо быть онлайн, то есть нельзя опубликовать сайт и выключить компьютер. Ну и не очень безопасно конечно, считай доступ открываешь к своему компу всяким анонимусам.
>>393151
О, это интересный сервис, хотя конечно работать через веб не очень быстро. И глючный, у меня редактор пару раз завис.
Тоже интересная штука, хотя немного странная: скрипт запускается там в cli-режиме. а выводится результат как HTML.
>>393190
Я не понял как он работает — там какой-то адски непонятный интерфейс.
>>393274
А что вместо заведомо устаревшего FTP? SFTP? Так для пользователя он отличается только названием, которое ты выбираешь в диалоге свойств соединения. Потому проблем в данном случае я не вижу.
И что значит заведомо устаревший? Ему лет больше чем мне (FTP появился в 1971 -> 43 года), это не устаревший, а классический протокол.
> пусть сразу окунаются в гит, основы линукса и иде.
Что из этого является протоколом передачи файлов как альтернатива FTP? По моему, ничего.
А в гит мы погружаем, и IDE и линуксом пользоваться никак не запрещаем.
Это я задачу на считалочку ковыряю.
p.s Git не средство деплоя, хотя некоторые его так используют — и получают подводные камни: на сервер выгружаются лишние файлы (точнее весь репозиторий), создаются риски безопасности и т.д.
>>393283
Это статический метод: http://php.net/manual/ru/language.oop5.static.php
От себя замечу, что это дурная идея использовать их везде, как в твоем примере. Это не ООП, а несвязанный набор функций из какого-то плохого туториала.
>>393293
Тема на SO (англ.): http://stackoverflow.com/a/929568
Используют:
- какие-то готовые системы для деплоя вроде capistrano. Что мне не нравится в нем (я полистал мануал) — это то, что вместо нормальных конфигов там практически всегда надо писать код на руби со всеми вытекающими неудобствами, причем все обычно довольно запутанно. Но если у тебя не один сервер, а несколько, то капистрано будет полезен так как умеет например делать вещи параллельно.
- самописные шелл скрипты — мой любимый проверенный временем метод. Если у тебя один сервер/сайт и ничего сложнее копирования файлов/запуска скрипта делать не надо, то это по моему самый удобный вариант.
- кто-то пытается использовать чекаут из гита или хуки (то есть ты пушишь сови изменения на сервер и они сами копируются в веб-папку), но это напоминает костыли и имеет ограничения недостатки (в том числе в плане безопасности), так как гит не для этого создавался.
А возясь с тотал коммандером ты занимаешь мартышкиной рутинной работой с риском сделать ошибку.
Тебе не обязательно делать линукс основной машиной. Если у тебя достаточно памяти, можешь поставить дебиан в виртуалку, дать ей 300-500 Мб и мучать не боясь что-то сломать.
Ну и если есть какие-то вопросы по линуксу — задавай, поможем разобраться.
>>393298
Гит — система управления версиями, а не средство деплоя и имеет недостатки и ограничения. Например, в дефолтной конфигурации папка .git становится публично доступной.
>>393346
> sortirovka
Никогда не называй функции и переменные транслитом. Не знаешь английский — не беда, используй slovari.yandex.ru или translate.google.com
> if (otsortirovan($massiv))
>\t\treturn $massiv;
Надо ставить фигурные скобки, так надежнее код и так рекомендуют стандарты.
Алсо, не вижу гарантий что алгоритм отработает за конечное время для любого N.
Ты папку .svn уже закрыл от публичного доступа? Система контроля версий — не средство деплоя.
Откуда вообще взялась эта мода? Опять кто-то не шибко грамотный в западных блогах подкинул идею и понеслась?
Никак. Нельзя так делать так как это запутыает понимание кода.
Если тебе надо переставлять указатель, используй цикл while, а еще лучше, перепиши алгоритм — он скорее всего неправильный.
В случае считалочки, ты можешь использовать while либо вложенные циклы. Мануал: http://php.net/manual/ru/control-structures.while.php
Да, спасибо. Через while тогда сделаю.
http://jsbin.com/gazucolegusu/1/edit . Мне выдает мою же ошибку, что элемент не наследуется от ЭлементаСети. Я проверил через firebug цепочки __proto__ и вроде бы все правильно записывает(например, у Powerhouse.prototype.__proto__ == ElementsNetwork)
Значит там не следуют принципам ООП проектирования.
>>393472
Ответ: http://ideone.com/b6VN2j
Что за дебилы настраивали спам-фильтр? В моем тексте не спама.
>Ты имеешь в виду клонировать объекты через clone?
Не надо ничего клонировать, тут просто проверка типа первого параметра и создание объекта будет происходить не внутри метода, а при вызове. Логика не изменится.
Константы заводить не круто, потому что тогда Employee должен будет знать обо всех потомках, а это ограничение. То есть нельзя будет создавать потомков без модификации родительского класса (добавления константы) — так не делают.
Что касается имён функций — я, наверное, много на что ещё не обратил внимания. Нет предела совершенству.
> От себя замечу, что это дурная идея использовать их везде, как в твоем примере. Это не ООП, а несвязанный набор функций из какого-то плохого туториала.
мимокрокодил
Это почему? Имхо, если метод не использует атрибуты класса, он должен быть static. Чем плохо? По какому принципу ты решаешь, объявлять метод статическим или нет?
ОП, а можешь пояснить за AJAX?
вот нужно мне сделать проверку форм на соответствие требованиям(типа, не меньше 6ти знаков) не перезагружая страницу.
Я искал мануалы, но вот на хабре используют плагины для этого, а я хотел бы сам сделать.
В голос.
Я вот на арче сидел. Дебиан потом пробовал, и все мне было как то непривычно, неуютно.
> Не надо ничего клонировать, тут просто проверка типа первого параметра и создание объекта будет происходить не внутри метода, а при вызове. Логика не изменится.
Не понял. Можешь написать краткий пример кода?
>>393494
> Имхо, если метод не использует атрибуты класса, он должен быть static
Что такое «аттрибуты класса»? Поля объекта ты хотел сказать? Он у них очевидно использует статические поля.
Там просто люди используют статический вызов методов ради краткости (не надо создавать и передавать объект) при этом теряют преимущества ООП:
- мы не можем создать несколько объектов с разными настройками
- мы не можем в класс передать вместо одного объекта другой и получаем сильносвязанные классы ( длинная паста на тему https://gist.github.com/codedokode/e1d31a31b37d5f635057 )
Особенно это проявится, если они захотят тесты например написать к своему коду или сделать несколько проектов на общем коде.
Для этого хватит просто яваскрипта. Яваскрипт — это язык для написания программок, которые встроены в страницу и выполняются в браузере.
Учебник learn.javascript.ru
В новых браузерах есть еще аттрибуты для проверки значений:
http://htmlbook.ru/html/input/required
http://htmlbook.ru/html/input/pattern
http://htmlbook.ru/html/input/min
Алсо, в пхп я новичок, и не стремлюсь его изучить. Обычный верстак. Буду рад любому мнению.
Времени не очень много но без знания php все эти команды которые ты вписываешь будут выглядеть как заклинания.
Ну и без английского тяжко так как официальная документация на нем:
http://codex.wordpress.org/Theme_Development (англ)
http://codex.wordpress.org/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BC (рус)
> Алсо, в пхп я новичок, и не стремлюсь его изучить.
Зря конечно. Хотя php это долгий путь
> Столкнулся с тем, что обычная верстка уже никому в хуй не уперлась, всем натяжку подавай
ну так обычная верстка при большом желании изучается за недели 2, это каждый может
>все эти команды которые ты вписываешь будут выглядеть как заклинания.
Я уже пытался натягивать, но не до конца, забил, ибо думал что хуйня. Выглядит интуитивно понятно.
>Зря конечно. Хотя php это долгий путь
Слишком много плохого об этом языке слышал, чтоб начинать его учить, ну а может лучше рельсы, что скажешь? Сейчас я средненький фронт-енд, с знаниями javascript и angular. В верстке более продвинуто все, конечно, на более высоком уровне там все знаю. Но ощущаю не хватку бек-енда, из-за этого не могу реализовать ни одну свою задумку, но увы, нужно работать и учить фронт-енд, а времени на бекенд нету совершенно, даже не знаю что и делать. А учить и то и другое сразу, это будет ни туда, ни сюда, ни к чему не приду в итоге.
Я никогда под вордпресс темы не делал, но думаю там вёрстка не особо отличается, просто в некоторых местах страницы ты указываешь что тут будет менюшка вордпресса, а там виджеты, например. А может и нет.
Знаю, что меньше намного, просто я понимаю, что на пхп уйдет больше года обучения, чтобы начать нормально работать, а не биться за доллар с индусами. За тот же год, можно и рельсы выучить, а с ними можно и поболее деньжат делать.
Насколько я понял это набор правил по наименованию и использованию http-методов со всякими операциями для взаимодействия с ресурсом.
Только во всяких фреймворках своя реализация этой штуки.
В Yii2: http://stuff.cebe.cc/yii2docs/guide-rest-quick-start.html
В RoR: http://habrahabr.ru/post/45458/
Как будет правильно? Или суть в том, что просто нужно использовать http-методы для операций?
Мне он кажется лютым непонятным говном, а это плохо, мне _нужно_ с ним разобраться. Полагаю, просто эти криворукие мудаки переводчики, или разработчики оригинального мана - решили составить список функций, хуюнций, совершенно оторвавшись от реального кода. Показывают мне кусок гет-замыкания в роутинг - а где контроллер, что это, пиздец.
Дай если в наличии пример нормального простого проекта на Laravel уровня скелета на Yii, что бы я понял куда вся эти вызовы сувать и что где и откуда.
Пишите на почту, отправлю ТЗ
snow.tyre@gmail.com
Есть модель, у которой может быть много разных версий (для версий существует отдельная модель). Какая версия в данный момент активна определяет модератор. Как лучше всего это реализовать:
1) Не хранить данные модели в самой модели, а хранить их в модели версий, а потом выводить через текущую активную версию, например: $model->version->name.
2) Хранить данные и в модели, и в модели версий в формате JSON (например), которые при применении модератором вставляются в соответствующие столбцы модели.
Уточню еще, что к версиям прикреплены медиафайлы и выводятся они как раз так, как в 1) варианте.
Дак вот, вам действительно задавали вопросы про паттерны на собеседовании, или... это написали так, чтобы подстраховаться?
Я ж написал изменения, которые нужно сделать в коде — чем не пример?
Ну на ещё один, из жизни:
class Foo {}
class Bar extends Foo {
public function doSmthng($var) {echo $var;}
}
function baz(Foo $f) {
$f->doSmthng('qwe');
}
baz(new Bar());
А ты на логи посмотри, которые тебе ideone выдает.
>Empty delimiter
Ты передаешь пустую строку туда, где ее быть не должно.
Если что-то не получается, используй var_damp и смотри на результаты, которые выдает каждая отдельная функция.
Что касается непосредственно кода. Тут можно обойтись одной функцией. Все что идет после $sentence = trim($sentence) неверно.
Во-первых, твоя makeFirstLetterUppercase тут не нужная, вполне подойдет дефолтная ucfirst. Во-вторых, можно обойтись одной функцией preg_replace, в которой найти запятую окруженную возможными символами и заменить на ', ' используя $1 $2 и т.д, ну ты понял. И да, в конечном итоге foreach у тебя работает впустую, результаты выполнения никуда не заносятся.
var_dump конечно же
>>393672
Алсо если возникают проблемы в составлении регулярок, можешь попробовать этот ресурс http://phpliveregex.com/. На лету выдает результат работы функция с твоей регуляркой.
http://jsbin.com/lofuwukudugi/1/edit
Так, а если написать Powerhouse.prototype = Object.create(ElementsNetwork.prototype); в конструкторе, то второй объект, который будет создаваться этим конструктором, будет наследоваться от ElementsNetwork?
сделал еще 1 задачу по регкспам. Вывод всех емейлов встречающихся в тексте.
http://ideone.com/NNQyeF
как вы на работе устанавливаете сроки для своей работы?
например, менеджер спрашивает - сколько тебе понадобится на работу. что вы делаете чтобы указать время?
я имею охуительную привычку обсираться со сроками в 2, 3 раза.
я беру время на обдумывание, расписываю для себя что нужно делать, озвучиваю срок (5ч например) и уже блять через 30 минут работы понимаю что я нихуя не уложусь.
как бороться с этим?
>я имею охуительную привычку обсираться со сроками в 2, 3 раза.
>я беру время на обдумывание, расписываю для себя что нужно делать, озвучиваю срок (5ч например) и уже блять через 30 минут работы понимаю что я нихуя не уложусь.
сопоставив эти два фактора я нашел решение на твой вопрос. После того как ты всё обдумал, ты просто берешь и умножаешь срок на 2 или 3. Я бы умножал на 3, для гарантии так сказать. Не благодари.
>Я бы умножал на 3, для гарантии так сказать. Не благодари.
да, ты не первый кто мне такое советует
и перед моим последним обосрамсом со сроком я именно это и хотел сделать
но я боялся обосраться и взять на простую как казалось задачу блядские 12 часов например.
я же не могу сказать - 12, а сделать за 2, так ведь? это такой же обосрамс как и 2-12.
хуйня какая-то
Не знаю бро. Ты сам джун или кто? Видимо раз ты в пхп треде спрашиваешь еще и пхп джун. Расскажи лучше свою кулстори о том как ты стал джуном? А то мочевахтер потер мой тред сегодня.
да, я ждун, год опыта, говнокодю весь год в одном корыте, 50% фич выпущенных с теста содержат баги, о которых мне докладывают заказчики, проёбываю сроки в 2-3 раза, более опытный коллега которому приходится работать со мной пол года унижал меня и пытался учить, а потом просто нахуй послал. работаю за еду, читаю мейнстримные книги по архитектуре, ооп, и т.д. но как обезьяной был так и остался.
а, ты спрашивал то как я устроился на работу? ну не стирать же теперь всё что выше.
пошул на собеседование, на собеседованиях говорил что нихуя не знаю и хочу стажироваться за минимальную зп. первое собеседование - мы вам перезвоним, во втором сейчас работаю.
тут проходят трали и пишут пхп-говно.
вот скажи мне - где в другом языке я бы мог работать так как сейчас? ни в каком. а в пхп я могу ещё и среднячком считаться. ну охуеть теперь.
Хочешь сказать что ты за год совсем не вырос?
Ты в мухосрани работаешь или где?
Спасибо за ответ, и вообще всё интересует. В большинстве даже скорее то, что делал в жизни до собеседований и первой работы. Не мог же ты с уровенем хеллоу ворлда прити.
Тут, как я понимаю, мы сначала делаем пустой объект dom = {}, а потом добавляем метод Animation. Не легче сразу сделать "класс" Animation и как обычно добавить ему методы?
500к мухосранск, 18к зп, при том что однушку снимать стоит 8-10к
то есть почти за еду работаю
>с уровенем хеллоу ворлда
показал самописный проект, 200 строк кода через иф в одной функции в одном файле лол
>за год совсем не вырос
вырос, могу в ооп и минимальные архитектурные решения
проблема в том что меня сразу посадили на большой проект
я могу делать что-то приличное, но делаю это довольно долго
я с дуру решил что скорость важнее качества, на самом деле оно так и есть, но я не могу найти этот баланс
сам себе ебу мозги когда заказчик пишет скорее бы и т.д.
вот что мне делать когда нужно побыстрее, но задача не тривиальна? намеренно растягивать время делая всё чуть получше?
или ебашить в говно костыли? второй вариант я уже пробовал, но я не могу попробовать первый. какая-то хуйня происходит, я не могу спокойно сидеть и вдумчиво делать когда знаю что это нужно сделать быстро.
мне никто из опытных анонов не поможет с этим итт?
Я вот по опыту работы эникеем сказал бы, что нужно слать всех нахуй и делать все именно вдумчиво. Делать всякие пометки и составлять для себя самого мануалы, которые помогут тебе в дальнейшем. А еще тренировать ум. Он, сука, даже у тупых способен к запоминанию большого количества инфы и ускорению её обработки. А то вот так пытаешься делать быстро что бы все отъебались, а через некоторое время понимаешь, что ты не то что методы решения проблем забыл, ты вообще забыл сами проблемы. Кароче имхо нужно сначала качество наращивать пытаться. А так это абсолютно логично, что от тебя хотят быстрых решений, просто нужно это понимать, но не принимать близко к сердцу. Жопа кстати еще может быть в том, что ты просто начал в своё время в одном ключе, а сейчас уже не можешь остановиться, и начать делать в другом. Я даже увольнялся как-то из-за этой херни. Проще мол на другом месте было начать всё заного но с умом, хоть это и пиздец глупый подход.
смотри в чём дело -
1) я делаю медленно и не очень хорошо - я мудак и макака
2) я делаю быстро и плохо - я мудак и макака
я просто блять разрываюсь и не знаю что выбрать.
вот скажи как найти грань между этим?
если я буду делать вдумчивей - это не значит что не будет багов
Не совсем. Начни с изучения википедии: https://ru.wikipedia.org/wiki/REST
Потом можешь глянуть http://habrahabr.ru/post/38730/
Основная идея — что сервер не хранит состояние, и вся нужная информация содержится в запросе. Например, протокол FTP (протокол передачи файлов с компьютера на удаленный сервер) использует состояние: там клиент соединяется с сервером, отдает команды и результат выполнения команды зависит от предыдущих команд. К примеру, команда «показать список файлов в текущем каталоге» выведет разные результаты в зависимости от того, в какой каталог мы перешли до этого. Краткое описание FTP, если ты с ним не знаком: http://eax.me/ftp-descr/
REST обычно реализуется на основе HTTP, хотя такого требования нет. Вообще, если посмотреть, то REST — это просто правильное использование HTTP. Мы определяем, какие ресурсы у нас есть, URL для них и что можно с ними делать.
Можешь посмотреть на примеры яндексовских АПИ:
http://api.yandex.ru/disk/api/concepts/about.xml
https://api.yandex.ru/dictionary/doc/dg/concepts/api-overview.xml
https://api.yandex.ru/money/doc/dg/concepts/About.xml
В общем, я советую тебе смотреть REST API известных сервисов и брать пример с них.
И сразу хочу еще одну штуку показать. Это swagger — штука для автоматической генерации документации к АПИ: https://helloreverb.com/developers/swagger
Ты описваешь свое Апи в формате JSON (или генерируешь этот JSON из кода), а получается такая панелька: http://petstore.swagger.wordnik.com/
>laravel.ru
Не нравится русская — читай английскую документацию.
Роутинг с использованием функций — это популярно в микрофреймворках, где маршрутов мало и код можно уместить в 1 небольшой файл. Для использования контроллеров там есть возможность:
http://laravel.ru/docs/v4/routing
> Laravel позволяет вам регистрировать маршруты не только в виде функции-замыкания, но и классов-контроллеров и даже создавать контроллеры ресурсов.
> Больше информации содержится в разделе о контроллерах.
Ты не дочитал просто.
> Дай если в наличии пример нормального простого проекта на Laravel уровня скелета на Yii
У меня под рукой такого нет (может конечно кто из анонов подскажет, не знаю), но на мой взгляд документация несложная, если ты ее не понял, ты и в приложении ничего не поймешь. Попробуй более внимательно перечитать, а если непонятно — можешь задать здесь вопрос.
Это тред для начинающих, быстро тебе сделают на фрилансе.
>>393659
Я не очень понял твоего вопроса, версии — это типа версий страницы в википедии, то есть надо хранить историю правок? Тогда решение простое:
- делаем таблицу с актуальными версиями страниц
- делаем таблицу с архивными версиями страниц и связываем с первой
Соответственно, для работы с ними можно использовать 2 разных модели.
>>393662
Не знаю, мне вроде не задавали.
>>393668
Ну я не понял.
> Можно объявить createEmployee(Employee $type, $quantity) и вызывать createEmployee(new Manager(1), 9).
Это ты написал, но ты не написал как реаизована функция createEmployee. Что у нее внутри? Как она из 1 объекта Manager делает 9 штук?
А, или ты предлагаешь создать еще 5 классов-фабрик, которые создают рабочих? по моему усложненная схема получается.
Насчет
> Константы заводить не круто, потому что тогда Employee должен будет знать обо всех потомках, а это ограничение. То есть нельзя будет создавать потомков без модификации родительского класса (добавления константы) — так не делают.
Это верно. Предок не должен знать о наследниках. Для таких случаев иногда делают класс-фабрику EmployeeFactory (класс, умеющий создавать рабочих нужного типа) и уже в нем объявляют константы. Чтобы добавить новый тип рабочего, конечно придется модифицировать класс EmployeeFactory тоже.
Это тред для начинающих, быстро тебе сделают на фрилансе.
>>393659
Я не очень понял твоего вопроса, версии — это типа версий страницы в википедии, то есть надо хранить историю правок? Тогда решение простое:
- делаем таблицу с актуальными версиями страниц
- делаем таблицу с архивными версиями страниц и связываем с первой
Соответственно, для работы с ними можно использовать 2 разных модели.
>>393662
Не знаю, мне вроде не задавали.
>>393668
Ну я не понял.
> Можно объявить createEmployee(Employee $type, $quantity) и вызывать createEmployee(new Manager(1), 9).
Это ты написал, но ты не написал как реаизована функция createEmployee. Что у нее внутри? Как она из 1 объекта Manager делает 9 штук?
А, или ты предлагаешь создать еще 5 классов-фабрик, которые создают рабочих? по моему усложненная схема получается.
Насчет
> Константы заводить не круто, потому что тогда Employee должен будет знать обо всех потомках, а это ограничение. То есть нельзя будет создавать потомков без модификации родительского класса (добавления константы) — так не делают.
Это верно. Предок не должен знать о наследниках. Для таких случаев иногда делают класс-фабрику EmployeeFactory (класс, умеющий создавать рабочих нужного типа) и уже в нем объявляют константы. Чтобы добавить новый тип рабочего, конечно придется модифицировать класс EmployeeFactory тоже.
Если ты предлагаешь сделать в каждом классе (инженер, маркетолог) метод создатьНовогоРаботника то не выйдет, так как во-первых, он дублирует конструктор, во-вторых, у разных классов могут быть разные параметры в конструкторе. ну попробуй сам напиши код creeateEmployee и увидишь проблемы.
Мне кажется, что приавльнее использовать фабрику либо так:
$engineers = EmployeeFactory::create(EmployeeFactory::TYPE_ENGINEER, 2, 7);
Либо
$engineers = EmployeeFactory::createEngineers(2, 7);
Для простоты я сделал методы статическими.
Анон, это хорошо, что ты хочешь помочь, но ты тут ошибся:
> твоя makeFirstLetterUppercase тут не нужная, вполне подойдет дефолтная ucfirst
Нет. Она не работает с utf-8 и в принципе непригодна для использования. Подробнее: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> Тут можно обойтись одной функцией.
Выходит что нет.
>>393684
Хороший сайт, только помните аноны, что там бекслеш пишется один раз: \s а не \\s
> Так, а если написать Powerhouse.prototype = Object.create(ElementsNetwork.prototype); в конструкторе, то второй объект, который будет создаваться этим конструктором, будет наследоваться от ElementsNetwork?
Наверно. Но это неправильный путь.
Почему ты это хочешь писать в конструкторе? Конструктор вызывается при создании каждого экземпляра объекта, соответственно в него пишут код, который задает значения каких-то полей в этом объекте.
Такой конструктор который в первый раз создает один объект, а во второй — совершенно другой — это ад какой-то.
Значение свойства prototype надо задавать до вызова конструктора, в глобальном коде, один раз. Вот пример кода для наследования:
// класс-предок
function Parent() { ... конструктор ... }
Parent.prototype.someMethod = function () { ... };
// класс-наследник
function Child() {
Parent.call(this, ....);
.....
}
Child.prototype = Object.create....
Child.prototype.consuctor = Child; // если не сделать то оно будет равно Parent
Child.prototype.someOtherMethod = function () { ... };
Обрати внимание, что писать каждый раз код с Object.create надоедает и в нем легко ошибиться. Потому код, настраивающий наследование, удобно вынести в отдельную функцию и писать просто:
function Child() { .... }
inherits(Child, Parent);
Также, есть готовые библиотеки, которые автоматизируют создание и настройку прототипов, например:
augment: https://github.com/javascript/augment/wiki/Classical-Inheritance
prototype.js: http://prototypejs.org/learn/class-inheritance
klass: https://github.com/ded/klass
> result.isBlanced
Опечаточка
> SolarPanel.prototype.constructor = this.constructor;
Это странный код. что ты ожидаешь найти в this.constructor?
Обычно пишут так:
Child.prototype.constructor = Child;
чтобы у созданных объектов свойство constructor возвращало бы Child (то есть функцию-конструктор, с помощью которой объект был создан).
И еще, кстати, твой код пишет:
> sell: 53.2
Можно продать 53 единицы энергии, но где прибыль которую мы получим от продажи? Ты ее забыл сохранить.
> Так, а если написать Powerhouse.prototype = Object.create(ElementsNetwork.prototype); в конструкторе, то второй объект, который будет создаваться этим конструктором, будет наследоваться от ElementsNetwork?
Наверно. Но это неправильный путь.
Почему ты это хочешь писать в конструкторе? Конструктор вызывается при создании каждого экземпляра объекта, соответственно в него пишут код, который задает значения каких-то полей в этом объекте.
Такой конструктор который в первый раз создает один объект, а во второй — совершенно другой — это ад какой-то.
Значение свойства prototype надо задавать до вызова конструктора, в глобальном коде, один раз. Вот пример кода для наследования:
// класс-предок
function Parent() { ... конструктор ... }
Parent.prototype.someMethod = function () { ... };
// класс-наследник
function Child() {
Parent.call(this, ....);
.....
}
Child.prototype = Object.create....
Child.prototype.consuctor = Child; // если не сделать то оно будет равно Parent
Child.prototype.someOtherMethod = function () { ... };
Обрати внимание, что писать каждый раз код с Object.create надоедает и в нем легко ошибиться. Потому код, настраивающий наследование, удобно вынести в отдельную функцию и писать просто:
function Child() { .... }
inherits(Child, Parent);
Также, есть готовые библиотеки, которые автоматизируют создание и настройку прототипов, например:
augment: https://github.com/javascript/augment/wiki/Classical-Inheritance
prototype.js: http://prototypejs.org/learn/class-inheritance
klass: https://github.com/ded/klass
> result.isBlanced
Опечаточка
> SolarPanel.prototype.constructor = this.constructor;
Это странный код. что ты ожидаешь найти в this.constructor?
Обычно пишут так:
Child.prototype.constructor = Child;
чтобы у созданных объектов свойство constructor возвращало бы Child (то есть функцию-конструктор, с помощью которой объект был создан).
И еще, кстати, твой код пишет:
> sell: 53.2
Можно продать 53 единицы энергии, но где прибыль которую мы получим от продажи? Ты ее забыл сохранить.
> \w-\.
Знак минус надо либо ставить в самый конец либо экранировать бекслешем так как в квадратных скобках минус обозначает диапазон (вроде 0-9).
Вот эти емайлы находит непраивльно: http://ideone.com/gayZZ8
(знаки + % и подчеркивание вполне часто используются в именах)
В общем, надо улучшить регулярки.
>Она не работает с utf-8 и в принципе непригодна для использования
Да, что-то совсем вылетело из головы.
> под винду7 + denver(желательно)
По моему ZF одинаково под разными платформами работает
Мануалы тут:
http://framework.zend.com/manual/1.12/ru/learning.quickstart.html
http://framework.zend.com/manual/1.12/ru/reference.html
>>393746
Мне повезло, я в большинстве случаев работал там, где не надо делать оценку. Если надо то вспоминаб предыдущие походие задачи и оцениваю, практически всегда называю меньше чем в итоге выйдет.
Итак: http://pastebin.com/HYKqBh4D - максимально понятный код без единого изъеба:
<?php
$datetime1 = date_create('01/01/2009');
$datetime2 = date_create("01/01/2011");
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('Интервал между 01.01.2009-01.01.2011: %y лет');
echo "<br>";
$datetime1 = date_create('01/01/2010');
$datetime2 = date_create("01/01/2012");
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('Интервал между 01.01.2010-01.01.2012: %y лет');
?>
ЧЯДНТ?? (http://php.net/manual/en/datetime.diff.php)
Если есть время и желание, можешь у нас какое-нибудь задание сделать, например для начала задачку на файлообменник: https://gist.github.com/codedokode/9424217
Мы тебе поможем исправить ошибки и разобраться с фреймворками.
>>393786
Прдставь что мы пишем библиотеку. В ней допустим несколько функций, такие как Animation, и другие. Если мы исплоьзуем нашу библиотеку совместно с другими, то большая вероятность что где-то еще используется имя Animation и одна из функций затрет другую, все сломается.
Чтобы этого не было, мы создаем единственную глобальную переменную dom и вносим наши функции и переменные в нее:
dom.Animation
dom.addClass
и так далее. По идее конечно надо использовать не название dom, а что-то уникальное, например название нашей библиотеки.
Так обычно разработчики библиотек и поступают. Например, функции библиотеки underscore находятся в объекте с именем _ (подчеркивание): _.throttle().
Но в общем это делается чтобы не засорять глобальные переменные и избежать конфликта.
Есть и другие способы защиты от конфликтов, например испльзование системы модулей вроде require.js/AMD.js
Алсо, покажи свои настройки часовых поясов, а именно чему равно date.timezone
var_dump(ini_get('date.timezone'))
Я подозреваю это может быть связано с отключением/включением зимнего и летнего времени в России, возможно у тебя в системе что-то не установлено.
На ideone пишет 2 года кстати: http://ideone.com/i3Am1I
https://mega.co.nz/#!woMnFAbR!AqUjuZvTTqGfasKwtVngmVzN2CQv_7kDO9ZIvbJRUr8
Втыкай в охуенное руководство по нему:
http://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&INDEX=Y
и за месяц, максимум 2 - ты будешь зашибать 50К не выходя из дома - работы под битрикс просто дохуища: https://freelance.ru/projects/?cat=4&spec=536 , а тот факт, что он позволяет использовать код PHP прямо в страницах сайта - позволит тебе зарабатывать, даже не заглядывая в документацию (но очень сильно испортит карму, т.к. говнокод вставлять в страницы не следует (нужно через компоненты хуячить).
В общем, в качетстве развлечения - сделай всё что написано выше на Битриксе (гораздо быстрее получится), а потом поссы на бесплатные фреймоворки, кишашие уязвимостями SQL, XSS и даже File Inclusion...
Тестировал на винде, юниксе и линуксе... всё там установлено - возможно это просто баг...
Да у тебя же XSS-УЯЗВИМОСТЬ.
На ideone код работает как надо. Может ты какие-то файлы с информацией о временных зонах не обновил? У нас же за последние несколько лет раза 2 или 3 отменяли/включали зимнее время.
И сдампь $diff, что там будет? 1 год и 364 дня?
Что-то в этом роде, да:
kуда деался [code]блеать?[/code]
object(DateInterval)#3 (15) {
["y"]=>
int(2)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(730)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
object(DateInterval)#2 (15) {
["y"]=>
int(1)
["m"]=>
int(11)
["d"]=>
int(29)
["h"]=>
int(23)
["i"]=>
int(0)
["s"]=>
int(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(730)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
Что-то в этом роде, да:
kуда деался [code]блеать?[/code]
object(DateInterval)#3 (15) {
["y"]=>
int(2)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(730)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
object(DateInterval)#2 (15) {
["y"]=>
int(1)
["m"]=>
int(11)
["d"]=>
int(29)
["h"]=>
int(23)
["i"]=>
int(0)
["s"]=>
int(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(730)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
Fatal error: Call to undefined function mb_internal_encoding() in C:\Apache24\htdocs\test.php on line 4
По мнению PHP в том году было на час меньше, нежели требуется для полного года, лол - что-то я припоминаю, что час корректировали (раз в тыщу лет), да..
extension=php_mbstring.dll
[mbstring]
mbstring.language = all
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = UTF-8
mbstring.substitute_character = none;
mbstring.func_overload = 2
mbstring.strict_encoding = Off
да весь фриланс полон такими заказчиками-нищебродами-долбоёбами (и надо сказать для битрикс-задач их в разы меньше) - сразу надо цену говорить от 30K на любой битрикс. А на 6K только школота без каких-либо умений может подписаться или кидалово. Логика в том, что если уж ты битиркс купил, то и на интеграцию изволь отвалить никак не меньше 3-4 кратной стоимости коробки (ну либо пользуйся изкаробочным функционалом и не пизди)...
Анон, а с какими знаниями ты устраивался? Имею ввиду технологии. Какие фреймворки?
Ты говоришь, тебя по началу пытались подтянуть - как это было? Что тебе там втирали?
Да просто впишись на фриланс - сделай пару говносайтов по 6K на чём угодно и тебя с распростёртыми объятьями возьмут в любую говноконтору... Только вот нахуй оно надо, когда дома пизже работается (деньги ни на проезд, ни на питание не расходуешь, можешь не выходить на улицу и воображать что живешь в гейропе) - да и вообще сполшные плюсы...
>это типа версий страницы в википедии, то есть надо хранить историю правок?
Да, именно так, надо было сразу этот пример привести, что-то заработался, из головы вылетело.
>- делаем таблицу с актуальными версиями страниц
>- делаем таблицу с архивными версиями страниц и связываем с первой
Уточни, пожалуйста, где мы данные храним, в обеих таблицах или только в таблице с архивными? Я тебе картинку нарисовал, чтобы нагляднее было о том, какие у меня в голове были варианты, посмотри, пожалуйста, — я правильно понимаю, что ты предлагаешь сделать, как в 1 варианте?
Пишу по работе на Laravel, задавай свои вопросы, только вдумчиво и по порядку, чтобы я тебя понял.
ДАО ГЕНЕРАТОР http://skaji.esy.es/test/index.php
Сделал через массивы, 3 масива со словами потом echo'м вывожу в одну фразу.
[code]
$word1 = array('Хуесос', 'гниль', 'пидор');
$text1 = mt_rand (0, count($word1));
$randtext1 = $word1[$text1];
echo"Абу $randtext1 "
[/code]
Так вот иногда рандом не показывает значение.
То есть 1 текст он подбирает рандомом, а другой нет.
В пыхыпэ ведь идет отсчет как в ЖС с 0? Тогда хуле он иногда тупит и не показывает рандом?
mt_rand(0,3)
PHP Parse error: syntax error, unexpected end of file in /home/7JDOda/prog.php on line 21
Ссылочка http://ideone.com/P84KJb.
Есть простая форма для отправки на почту: http://ideone.com/HXFCqC
Нужно сделать, чтоб она отправляла письмо сразу на два емейл адреса, сейчас там один стоит, это pidor@mail.ru
Как сделать чтоб отправлялось еще и на адрес suka@mail.ru?
Там может массив надо делать? типа define("CONTACT_FORM", ['pidor@mail.ru', 'suka@mail.ru']);
Выручайте.
Но все равно ругается.
Мне помогут? Правда срочно надо, а больше спросить не у кого.
Скопировал код в идеон, все работает.
http://ideone.com/EjB4ee
Вотафак? Почему у меня тогда $postRestriction NULL возращает?
Мои посты видно? Почему все отвечают на пост, будто он супер интересный, а меня в упор не замечают? Посоветуйте где задать вопрос по пхп, чтобы ответили быстро.
кун - >>393971
freelance.ru
>Почему ты это хочешь писать в конструкторе?
Я не хочу, просто хотел понять правильно ли я понял этот момент.
http://jsbin.com/lofuwukudugi/2/edit
Конечно уроки, котики, все это круто, но как-то это не фундаментально и толком то на пособие не тянет, так - шишечка.
Так вот денег у меня совсем нет, я же хикка, соответственно раз упор в веб пхп же то наверняка есть комплексные книги по вебу.
Большая часть пхп и еще база для сайтостроения про мускл, жабаскрипт, жопаквери. Есть что-то такое?
Я цены посмотрел и ахуел что-то я хуй могу себе позволить купить отдельно 3 книги по пхп, жабе, БД, где каждая 1к++ стоит. Короче комплексное бы.
И всякие сменары авторства хххМЕГА-ПЫХАРЬххх как сделать сайт и на хуй сесть тоже нахуй.
>>393856
> как реаизована функция createEmployee
http://ideone.com/5cQfR3
Изначально я писал про этот код.
>> Если ты предлагаешь сделать в каждом классе (инженер, маркетолог) метод создатьНовогоРаботника
Не предлагаю. Просто поменять объявление и вызов createEmployee.
> купить книжку
А что в этом такого. С книгой даже удобней лежать с буком и втыкать. Сидишь такой уснул, проснулся, сходил под себя и дальше лежишь и как утюг высушиваешь постель.
Да и с ебуков читать неудобно + всегда хочется скопипастить говно.
Второй день продолжаю биться над этим дерьмом. С пробелами, точками и запятыми и регулярными выражениями разобрался. А вот заглавные буквы всё никак не получаются.
http://ideone.com/Etwbt2
>>393672
>Во-первых, твоя makeFirstLetterUppercase тут не нужная, вполне подойдет дефолтная ucfirst.
Я задачку отсюда брал - http://archive-ipq-co.narod.ru/l1/finals.html - там вроде как makeFirstLetterUppercase в условии. И меня самого сейчас интересует, почему грёбаная функция отказывается работать.
>И да, в конечном итоге foreach у тебя работает впустую, результаты выполнения никуда не заносятся.
Как и куда их заносить? Через return?
Это ПХП ворлд, братишка. Тут кто во что горазд. Композер тоже никто не рекомендует. Только пир, только хардкор. Говори рубитсам и питонистам открыто и смело прямо в лицо, ПЫХ ФОРЕВА.
Я два бука купил. На одном книжка, на другом апач. Рекомендую, братик-макака. А еще трекбол хочу купить на зарплату. Говорят лучше мышки, а то рука устает формошлепить. Просто я формочки визуально собираю в IDE. Такие дела. Всем карьерного роста в этом треди и процветания на фриланс точка сру.
Не слушай наркоманов. Чтобы делать нормальные саитики тебе будет достаточно Жумлы. Поищи на рутрекере спизженные курсы или заплати авторам или сам разберись по документации, не дурак же. Там даже пхп знать не нужно, главное чтобы мышка была хорошая. Но лучше трекбол, чтобы рука не уставала. Ну а еще bitnami стэк поставь, он за 2 минуты заводится и не нужно с настройками апача и мускуля гемороится. Вангую, еще откроешь свою вебстудию.
PHP - язык для программирования визиток и простеньких интернет-магазинов. Схуяли ты от него хочешь архитектуры, когда он просто для таких проектов не предназначен? Ты же не будешь на CGI-C# делать себе сайт? Правильно - ты его сделаешь на PHP, т.к. быстрее и удобнее в разы, нежели поднимать какой-нибудь django...
Ты так говоришь, как будто джанго чем-то лучше юи или симфонии.
Решив кардинально что-то в жизни изменить, захотел поучится кодить. Поскольку я в этом абсолютнейший профан, подумал пойти на курсы, чтоб хоть какие-то азы постичь и вообще посмотреть, пойдёт или нет. В своём замкадске откопал УЦ (один из двух, где учат), где 8 лет преподаёт вроде нормальный чувак.
В программе курса: изучение html, css, основ JavaScript. Вы научитесь текстовой и графической верстке. Получите практические знания по созданию макетов сайта и дальнейшей их обработке в программах Photoshop и Dreamweaver. На основе этих знаний Вы сможете создавать статические сайты: сайты визитки, домашние страницы.
Курс ориентирован на начинающих веб-разработчиков и дизайнеров.
80 а/часов, 2 месяца.
Как думаешь, анон, пойдёт или лучше брать книгу и вкуривать самому? Так-то думается, чтоб лучше получить базу, какой-то разгон от препода, чем уйти в жопу и устроить в голове кашу.
Там же отдельным курсом есть веб-программирование (что уже интереснее), но оно, для, дескать, уже постигших эти самые азы.
Он полезен только тем, что понимает вордовскую разметку и автоматически расставляет теги.
Ах да, именно на веб-программировании и идёт, собственно, PHP на 52 часа. Но совать туда свой нос без элементарных знаний, естественно, тупо.
По окончании курса Вы будете уметь:
· Применять навыки создания веб-сайтов на PHP
· Самостоятельно устанавливать т настраивать сервер Apache
· Устанавливать и настраивать PHP
· Грамотно создавать сценарии PHP
· Эффективно работать с формами: принимать данные HTML форм и обрабатывать их
Обучение строится на сквозном проекте (создание движка сайта).
В качестве зачетной работы учащимся будет предложено, на основе полученных знаний, создать свой сайт.
Часть 2. PHP.- 52 ак.часа
1. Основы языка PHP (переменные, операции).
2. Передача информации в скрипт.
3. Работа с MySQL.
4. Работа с cookies и сессиями.
5. Установка и настройка WordPress.
6. Выполнение контрольного задания.
Я бы сходил.
Итак первый вопрос. Как сделать так что бы лиса нормально воспринимала русский шрифт? Пробовал сохранять .php файлы в разных кодировках и всё такое, в итоге все равно всё идет попизде. Если сохраняю в юникоде то тоже самое. В лисе тоже выставляю юникод, и только тогда всё вроде бы читабельно, НО! стоит нажать f5 и опять всё летит попизде.
Алсо поясните за phpStorm, он только платный бывает? Полазил по оффсайту там фри-триал 30 дневный есть. Лицензия для соло пользования стоит 50$, но есть всякие бесплатные лицензии для студентов, учителей и обучения. Их можно как-то получить? Какие альтернативы этой софтине посоветуете?
Я всегда сохраняю в UTF-8.
Там еще в конфиге надо выставить "default_encoding": "UTF-8",
И некоторые советуют "fallback_encoding": "Western (Windows 1252)" поменять на "fallback_encoding": "Cyrillic (Windows 1252)".
У меня все в порядке.
Кстати можно просто создать Build System в Sublime Text. Вот ссылка:
http://pmickplace.blogspot.ru/2013/03/compiling-php-code-in-sublime-text-2.html
Со структурой более-менее разобрался.
Насущный вопрос - как забанчить свой валидатор вместо встроенных integer|max|min? Например, что бы моей функции передавалась проверяемая переменная, а я уже говорил тру / фолс
Я на php особо не программировал.
Хотел на ноде писать.
Поясните тут момент: var_dump на 18-й строчке даёт результат, на 20-й - не выдаёт вообще ничего, на 35-й - не учитывает функцию, которую он, однако, на 18-й строчке уже успешно, казалось бы, обработал.
>>394063
>mbstring.func_overload = 2
Да стоит уже. На локалхосте тоже проверил, пишет тоже самое.
Поясните тут момент: var_dump на 18-й строчке даёт результат, на 20-й - не выдаёт вообще ничего
Ок, я сам тут нуб но свежим взглядом посмотрел и отвечу тебе.
у тебя на 19-й строчке стоит return, который вроде как завершает функцию и всё что после него уже не проверяются, не уверен в этом на 100%.
еще у тебя
>HP Notice: Undefined offset: 0 in /home/jnIeod/prog.php on line 14
очевидно какая-то хрень на 14й строчке.
foreach ($text as $sentence) {
makeFirstLetterUppercase($sentence); //функция выше
var_dump($sentence); //результата нет
}
у тебя функция makeFirstLetterUppercase($sentence);
должна выглядеть примерно так.
$a = makeFirstLetterUppercase($sentence);
что бы она возвращала куда-то результат своей работы.
и с помощью var_dump($a); ты сможешь его увидеть.
Больше в твоем коде не копался, мне только предстоит эту задачу решить. так что только куски смотрел.
>С пробелами, точками и запятыми и регулярными выражениями разобрался.
Что-то у тебя там адовый огород в makeFirstLetterUppercase. Эту задачу можно решить разными способами, но я бы поступил так. Обрати внимание на php функцию mb_convert_case. Используя ее в режиме MB_CASE_TITLE ты сможешь сделать первую букву первого слова предложения заглавной. Все решение укладывается в три строки.
>Как и куда их заносить? Через return?
Перед foreach создаешь пустой массив, в конце форича заносишь в этот массив результат работы.
Алсо, трим ты зря убрал, он работает же и вполне полезен тут. Метод отлова некорректной запятой у тебя снова не очень хороший.
$newSentence = preg_replace('/([^\s])\s([,])\s([^\s])/u', '$1$2 $3', $newSentence).
Как-то так должно быть.
>$newSentence = preg_replace('/([^\s])\s([,])\s([^\s])/u', '$1$2 $3', $newSentence).
Тут замечательный спамфильтр двача убрал
звездочки перед поиском пробела, надеюсь ты поймешь в чем суть.
После поиска пробела, то есть каждый пробел может быть сколько угодно раз, а может и не быть вообще.
То же самое и с этими символами [^\s].
http://ideone.com/h8p3sS
Буковки:
http://ideone.com/zLEB39
Банкомат(простейший случай, с 6600 пока не оче):
http://ideone.com/nGt27e
Еще вопрос - как проверить переданные в роутинг параметры, если он создан на контроллер командой
Route::controller('/', 'PostsController');
т.е. как из этого получить аналог
Route::get('/show/{id}', function($id)
{
\treturn "This post with id = $id";
})->where('id', '[0-9]+');
Не проверять же в самом методе show
Знать PHP все равно нужно, чтобы писать под Битрикс. ООП в том числе.
>>393884
Ответ: http://ideone.com/cON0Zz
что за дебильный спам лист на этом сайте? В моем поcте нет никакого спама.
> mbstring.func_overload = 2
Это абсолютно глупая и изначально неправильно спроектированная фича. Никогда
не используй ее.
1) она создает путаницу так как не глядя в конфиг нельзя понять как работает strlen
и подобные функции: считают байты или символы
2) она переопределяет только часть функций, то есть теперь ты должен думать, переопределена
та или иная функция для utf-8 или нет.
Подробнее: http://php.net/manual/ru/mbstring.overload.php
Подробнее про плохие строковые функции которые не надо использовать:
\thttps://gist.github.com/codedokode/ff99e357e9860ea169b8
> Уточни, пожалуйста, где мы данные храним, в обеих таблицах или только в таблице с архивными?
В одной таблице храним актуальные версии данных, в другой — архивные:
news:
id: 1
title: заголовок новости
----
id: 2
title: заголовок 2
news_revisions:
id: 1
revision: 1
title: старый заголовок
------
id: 1
revision: 2
title: очень старый заголовок
Вот про википедию: http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/Vol-2/mediawiki-3.html
Твой вариант 1 тоже годится, но в нем получается более сложные запросы с джойнами в то время как у нас достаточно брать данные из актуальной таблицы.
> json
А это зачем еще? не нужно.
> Уточни, пожалуйста, где мы данные храним, в обеих таблицах или только в таблице с архивными?
В одной таблице храним актуальные версии данных, в другой — архивные:
news:
id: 1
title: заголовок новости
----
id: 2
title: заголовок 2
news_revisions:
id: 1
revision: 1
title: старый заголовок
------
id: 1
revision: 2
title: очень старый заголовок
Вот про википедию: http://rus-linux.net/MyLDP/BOOKS/Architecture-Open-Source-Applications/Vol-2/mediawiki-3.html
Твой вариант 1 тоже годится, но в нем получается более сложные запросы с джойнами в то время как у нас достаточно брать данные из актуальной таблицы.
> json
А это зачем еще? не нужно.
потому что элемента с индексом count($word1) в массиве нет. проверь через var_dump($word1);
>>393971
Значением константы может быть только скалярное значение, то есть число, строка, boolean или null. Массив не может быть.
Я бы советовал лучше изучить язык прежде чем писать программы на нем.
Алсо
> $name = stripslashes($_POST['name']);
Зачем тут stripslashes?
алсо. у тебя там разные виды инъекций в коде. например, пользователь может добавить любые заголовки к письму и XSS присутствует.
>>393973
У тебя код не рабочий, посмотри:
if (...) {
echo "дабл";
}
exit(); // <-- здесь программа завершится в любом случае и не станет проверять дальше
потому что элемента с индексом count($word1) в массиве нет. проверь через var_dump($word1);
>>393971
Значением константы может быть только скалярное значение, то есть число, строка, boolean или null. Массив не может быть.
Я бы советовал лучше изучить язык прежде чем писать программы на нем.
Алсо
> $name = stripslashes($_POST['name']);
Зачем тут stripslashes?
алсо. у тебя там разные виды инъекций в коде. например, пользователь может добавить любые заголовки к письму и XSS присутствует.
>>393973
У тебя код не рабочий, посмотри:
if (...) {
echo "дабл";
}
exit(); // <-- здесь программа завершится в любом случае и не станет проверять дальше
Не работает же. На ideone что-то не установлено.
>>393981
Может ты var_dump до создания переменной поставил или в названии переменной опечатался?
Алсо, у тебя включено отображение ошибок?
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log . Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
> просто хотел понять правильно ли я понял этот момент.
Теперь правильно. Единственное, вызов конструктора предка:
ElementsNetwork.call(this);
обычно ставят в начале, а не в конце так как он может создавать какие-то поля которые ты или функции которые ты вызваешь могут захотеть использовать.
Но теперь наследование сделано верно.
>>394001
Для целей игры в кубике рандом из коробки вполне ок.
>>394019
2 неплохих книги (Зандстра и Шлосснейгл) упомнянуты в первом посте треда. Они только по PHP и рассчитаны на тех кто знает основы. Но зато они неплохие, хоть и староватые.
По яваскрипту неплохие книги: Фленаган JavaScript: Подробное руководство (Definitive Guide) и Javascript: the good parts (яваскрипт сильные стороны).
Книги, которые учат всему (PHP/HTMl/MySQL) есть, но их уровень обычно гораздо ниже. Например, книга «Р.Никсон — PHP, Mysql, HTML» объясняет PHP на очень примитивном уровне, а примеры кода некачественные. По PHP книги в основном пишут люди которые его толком не знают.
Плюс есть проблема что русские переводы довольно-таки устаревшие.
Если ты столкнешься с утаревшей книгой, то почитай сайт phptherightway который расссказывает про современные подходы.
Так что не знаю, что тебе посоветовать. Электронные книги читать не вариант? Вот например ссылки по основам Mysql: https://gist.github.com/codedokode/10539213
> жабе
java и javascript — разные языки и тех кто их путает сразу же выгоняют с собеседования. Прочти про них хотя бы статьи в википедии чтобы не путать.
> просто хотел понять правильно ли я понял этот момент.
Теперь правильно. Единственное, вызов конструктора предка:
ElementsNetwork.call(this);
обычно ставят в начале, а не в конце так как он может создавать какие-то поля которые ты или функции которые ты вызваешь могут захотеть использовать.
Но теперь наследование сделано верно.
>>394001
Для целей игры в кубике рандом из коробки вполне ок.
>>394019
2 неплохих книги (Зандстра и Шлосснейгл) упомнянуты в первом посте треда. Они только по PHP и рассчитаны на тех кто знает основы. Но зато они неплохие, хоть и староватые.
По яваскрипту неплохие книги: Фленаган JavaScript: Подробное руководство (Definitive Guide) и Javascript: the good parts (яваскрипт сильные стороны).
Книги, которые учат всему (PHP/HTMl/MySQL) есть, но их уровень обычно гораздо ниже. Например, книга «Р.Никсон — PHP, Mysql, HTML» объясняет PHP на очень примитивном уровне, а примеры кода некачественные. По PHP книги в основном пишут люди которые его толком не знают.
Плюс есть проблема что русские переводы довольно-таки устаревшие.
Если ты столкнешься с утаревшей книгой, то почитай сайт phptherightway который расссказывает про современные подходы.
Так что не знаю, что тебе посоветовать. Электронные книги читать не вариант? Вот например ссылки по основам Mysql: https://gist.github.com/codedokode/10539213
> жабе
java и javascript — разные языки и тех кто их путает сразу же выгоняют с собеседования. Прочти про них хотя бы статьи в википедии чтобы не путать.
Алсо по яваскрипту неплохой учебник на learn.javascript.ru
>>394038
> Не предлагаю. Просто поменять объявление и вызов createEmployee.
Как именно? смотри, ты предлагаешь писать
createEmployee(new Engineer(2), 9)
как ты сделаешь из 1 инженера 9 инженеров? написал бы уже пример.
>>394060
> И меня самого сейчас интересует, почему грёбаная функция отказывается работать
Если кратко то это плохая устаревшая функция. Объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> (\\s){2,}
скобки круглые не нужны тут более того она вырезает повторяющиеся пробелы напрочь а надо заменять их на 1 пробел
> makeFirstLetterUppercase($sentence);
Ты никуда не сохраняешь то что вернет функция. Переменные передаются в функцию как копии, то есть если ты в функции меняешь $sentence то ты меняешь переданную ей копию строки, а не исходную переменную. Исходная переменная остается неизменной.
Ну и локальные (созданные или переданные в функцию переменные) изолированы от глобальных (внешних). Ты не можешь из функции обратиться к глобальной переменной и не можешь снаружи обратиться к локальной. Сделано так специально чтобы код был простым и надежным.
Потому ты должен возвращать из функции измененную строку через return и в месте вызова сохранять ее:
$y = func($x); или $x = func($x);
Принцип простой: в функцию мы передаем данные через аргументы в скобках, а возвращаем результат с помощью return.
Если ты не пишешь = а пишешь так:
func($x);
то то что вернет функция никуда не сохранится, а будет выкинуто.
> makeFirstLetterUppercase
Слишком сложно, можно сделать проще: отрезать mb-substr первую букву, повысить ее регистр, присоединить остаток строки.
> склеить предложение из букв, implode пустым не бывает, нужно что-то вставить, иначе код ругается
Неправда, бывает, это в explode нельзя передать пустую строку, а в implode можно.
> $regexp = "/[-][-]/";
Для таких простых слчаев можно использовать str_replace или strtr, мощь регулярок тут не нужна.
Вот видишь, ты запостил решение и мы сразу же увидели какие места в Php ты не понимаешь. давай исправляться.
Алсо по яваскрипту неплохой учебник на learn.javascript.ru
>>394038
> Не предлагаю. Просто поменять объявление и вызов createEmployee.
Как именно? смотри, ты предлагаешь писать
createEmployee(new Engineer(2), 9)
как ты сделаешь из 1 инженера 9 инженеров? написал бы уже пример.
>>394060
> И меня самого сейчас интересует, почему грёбаная функция отказывается работать
Если кратко то это плохая устаревшая функция. Объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8
> (\\s){2,}
скобки круглые не нужны тут более того она вырезает повторяющиеся пробелы напрочь а надо заменять их на 1 пробел
> makeFirstLetterUppercase($sentence);
Ты никуда не сохраняешь то что вернет функция. Переменные передаются в функцию как копии, то есть если ты в функции меняешь $sentence то ты меняешь переданную ей копию строки, а не исходную переменную. Исходная переменная остается неизменной.
Ну и локальные (созданные или переданные в функцию переменные) изолированы от глобальных (внешних). Ты не можешь из функции обратиться к глобальной переменной и не можешь снаружи обратиться к локальной. Сделано так специально чтобы код был простым и надежным.
Потому ты должен возвращать из функции измененную строку через return и в месте вызова сохранять ее:
$y = func($x); или $x = func($x);
Принцип простой: в функцию мы передаем данные через аргументы в скобках, а возвращаем результат с помощью return.
Если ты не пишешь = а пишешь так:
func($x);
то то что вернет функция никуда не сохранится, а будет выкинуто.
> makeFirstLetterUppercase
Слишком сложно, можно сделать проще: отрезать mb-substr первую букву, повысить ее регистр, присоединить остаток строки.
> склеить предложение из букв, implode пустым не бывает, нужно что-то вставить, иначе код ругается
Неправда, бывает, это в explode нельзя передать пустую строку, а в implode можно.
> $regexp = "/[-][-]/";
Для таких простых слчаев можно использовать str_replace или strtr, мощь регулярок тут не нужна.
Вот видишь, ты запостил решение и мы сразу же увидели какие места в Php ты не понимаешь. давай исправляться.
Смотри, это неправильно. Ты советуешь включить какую-то магическую опцию, не объяснив в чем ошибка, как ее исправить, как работает опция и что она сделает.
Нам в этом треде не нужны магические заклинания и танцы с бубном, нам нужны знания.
Поэтому это плохой совет.
Во-первых никакая локаль не заставить strlen считать символы в utf-8
Во-вторых, локаль не кроссплатформенна, а также общая для многопоточных приложений, потому ее не стоит использовать, это изначально не очень удачное решение.
в-третьих, overload тоже плохо спроетированная фича, ее нельзя использовать.
Прочти мое объяснение: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Они придуманы много лет назад, до появления PSR. В новых библиотеках типа PDO эти стандарты соблюдаются.
>>394130
То, что ты за 2 года никак не продвинулся не значит что у других будет так же.
Тем более у тех анонов, которые приходят к нам и делают задания — у них все будет нормально.
Си, который ты упомянул, гораздо унылее PHP. уж лучше Си++, ООП, шаблоны, STL, Boost, Qt — хотя там тоже бардака немало.
Толсто
>>394133
Толсто. Ты наверно пытаешься сбить с толку других анонов потому что конкуренции боишься? Бойся.
>>394156
В вебе сейчас на разных языках используются общие подходы и многое копируется.
Есть микрофреймворки — Sinatra (руби), Play (ява), Express (Node.JS), Slim/Silex (PHP). Есть большие фреймворки (django/ror/Symfony 2/ZF 2), есть ORM (Hibernate в ява, Doctrine в PHP).
То, что ты про них не знаешь, не значит что их нет.
Этот курс может быть полезен, но трудно сказать до какого уровня он тебя дотянет. 80 часов выглядит солидно.
Что лучше, курс или книга, зависит от тебя — кому-то одно удобнее, кому-то другое.
Если хочешь потом или параллельно с курсом проверить свои знания и исправить пробелы, приди к нам, попроси задание. У нас есть набор заданий по верстке, который позволяет проверить понимание CSS, тонкостей позиционирования и другие вещи, которые важны но не везде хорошо освещены. Если ты их понимаешь, то ты задания сделаешь за 5 минут, если нет — мы поможем понять. Ну и задания типа «сверстать макет» тоже есть.
И на JS у нас задания есть.
Веб-программирование да, наверно надо после HTML изучать.
Только не блокнот, а редактор для кода — notepad++, Sublime text или что-то вроде этого.
>>394186
Да, чтобы изучать этот курс, надо знать хотя бы основы HTMl/CSS.
Я не уверен, что за 52 часа тебя всему научат, скорее базовые знания дадут. Придется тебе после курса еще читать сайт phptherigthway и может быть упомянутые в первом посте Зандстру или Шлосснейгла.
Опять же, если хочешь, ты можешь придти в тред потом и попросить задание для проверки закрепления знаний.
>Эту задачу можно решить разными способами, но я бы поступил так. Обрати внимание на php функцию mb_convert_case.
Хотя я тут подумал, что такой способ оставит заглавные буквы, если они есть в другой части предложения. Поэтому используй mb_strtoupper, mb_strtolower и mb_substr.
Сохраняй файл в utf-8
В начале файла поставь:
header("Content-Type: text/html; charset=utf-8");
чтобы сказать браузеру в какой кодировке текст.
Если хочешь чтобы работали пробелы и переводы строк замени text/html на text/plain
Объяснение (увы не очень, но другого не нашел):
http://scriptsite.ru/article/show/8/
http://scriptsite.ru/article/show/5/
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_MIME-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2
Для PhpStorm бывает EAV то есть ты сидишь на новой непроверенной версии, но за бесплатно.
> есть всякие бесплатные лицензии для студентов, учителей и обучения. Их можно как-то получить?
Можно: http://habrahabr.ru/company/JetBrains/blog/237879/
Зачем там build system если ты сохранил файл и достаточно обновить страницу в браузере?
>>394221
Почему бы и нет
>>394222
> Да стоит уже.
Отключай. Это дурная и плохо спроектированная вещь. Вместо этого, исправь свой код.
>>394230
Верно, return выходит из функции и то что дальше не выполняется.
> какая-то хрень на 14й строчке.
Обращение к 0 элементу массива, которого в нем нет.
>>394245
Там проще отрезать первую букву, перевести в верхний регистр и присоединить остаток строки.
>>394245
[^\s] => \S
[,] => ,
\s => \s (пробелов может быть несколько)
>>394247
Иди и учи, тебе никто не запрещает а мы PHP пока поучим.
Зачем там build system если ты сохранил файл и достаточно обновить страницу в браузере?
>>394221
Почему бы и нет
>>394222
> Да стоит уже.
Отключай. Это дурная и плохо спроектированная вещь. Вместо этого, исправь свой код.
>>394230
Верно, return выходит из функции и то что дальше не выполняется.
> какая-то хрень на 14й строчке.
Обращение к 0 элементу массива, которого в нем нет.
>>394245
Там проще отрезать первую букву, перевести в верхний регистр и присоединить остаток строки.
>>394245
[^\s] => \S
[,] => ,
\s => \s (пробелов может быть несколько)
>>394247
Иди и учи, тебе никто не запрещает а мы PHP пока поучим.
Я то выучил, еще в прошлом веке, дрыщавки =)
Пехопе макаки даже найти ключ не могут для Пыхсторма, палю тему бля - https://gist.github.com/mrfhitz/8401898
> Считалка:
Код оформлен странно (кривое выравнивание). Попробуй пропустить его через phpformatter.com — должно исправиться.
> for ($s = 1; $s <= $quantity; $s++)
Правила PHP (по историческим причинам) разрешают не ставить фигурные скобки после if/for/foreach если там идет всего 1 команда. Но нужно их ставить. Так как если ты не используешь скобки, то легко сделать ошибку, например добавив еще одну команду или удалив, при этом код будет вести себя не так как задумано. Потому проще всегда их ставить чтобы не путаться.
Алсо. этот цикл заменяется функцией range, подробности в мануале.
Код слишком сложный. Я плохо понимаю, как он работает, но вижу что там много лишнего. Давай его упрощать.
Нет смысла делать 4 ветки на разные случаи, можно написать универсальный код который выкидывает любой элемент массива.
Удалить элемент массива можно через unset или array_splice (но он перенумерует ключи элементов).
Sort вызывать не надо. Если тебе надо перенумеровать элементы массива, используй array_values (если использовать array-aplice то это не требуется).
> reset($total);
А зачем? Она же ни на что не влияет тут.
> Буковки:
> //поиск максимальной длинны
во-первых, тут можно заменить if на max(), будет в 1 строчку и короче.
во-вторых, поиск макс. длины можно сделать без цикла. с помощью array_map и max в 1 строчку.
> for ($i = 1; $i <= $max - $len; $i++)
Вообще, есть функция str_repeat чтобы добавить нужное число пробелов, но тут можно не дополнять строки а просто добавить проверку на наличие элемента при выводе.
Вместо хранения строк в array2 можно сразу их выводить — этот массив тут не нужен.
Не стоит называть переменные ничего не значащими именами типа array, value, key, tmp, data, x и так далее. лучше осмысленные: string, text, letter.
> Банкомат
То же самое. пропусти код через phpformatter.com и используй фигурные скобки после if.
> static $quantity
Не, вот это очень плохо. Что если мы вызовем функцию giveMeMoney 2 раза? Во второй раз она выведет данные в перемешку с первым разом. Это неправильно.
Также, внутри функций в этой задаче не должно быть echo. Хорошие функции должны что-то возвращаать, а печатать (или делать с реузльтатом что-то еще) должен вызвавший их код.
> if ($bill == 5000)
> giveMeMyMoney($amount, $array, 1000);
Это нехорошо так как если мы захотим поменять номинал или число видов купюр, придется переделывать код. Надо, чтобы было достаточно поменять значения в массиве и все работало.
> (простейший случай, с 6600 пока не оче):
Она сложная, это разновидность задачи о ранце
Ну тогда ладно, лицензионные форточки и блокнот ему в руки =)
Походу я понял. Поиск элемента у меня был через хак с every, т.к у меня массив клеток. Правильно будет использовать объект вместо массива и использовать ключ типа "i,j" ? А потом еще одолжить методы у массива для перебора свойств объекта.
В JS чаще всего тормозит обращение к DOM. Если у тебя на странице 6000 элементов и ты ко всем ним обращаешься, то я бы советовал перейти на использование canvas — это скорее всего позволит выжать 60 fps.
Кстати, говоря о 60 fps: чаще обновлять экран нет смысла, потому если твоя программа данные в памяти обновляет бытрее чем 60 раз в секунду, то можно обновление картинки делать по requestAnimationFrame.
Также, не перерисовывай клетки не изменившие свое состояние.
В общем, не видя кода/алгоритма сказать подробне трудно.
В Хроме в инспекторе есть 2 мегаполезные вещи: вкладка Timeline и профайлер. Используй их чтобы найти источник тормозов.
Вместо forEach можно попробовать for но скорее всего разница будет не очень большая.
> Поиск элемента у меня был через хак с every, т.к у меня массив клеток
Что за хак?
var elem;
arr.every(function(cell){
if (i != cell.getI() && j != cell.getJ()) return true;
elem = cell;
})
return elem;
Надо с объект делать вместо массива.
Да, надо. every перебирает все элементы, и имеет сложность O(N), при этом ты вызваешь его N раз, получается O(N^2) то есть O(36 млн) что довольно много. А поиск в словаре имеет O(1).
>оформление поправит
Ну, в считалке понятно, а что в остальных с оформлением - ты мне, кстати, не первый раз это говоришь. Я, обычно, если не забываю, пропускаю через форматтер. Выбираю ГНУшный стиль отступов.
В PSR-2 (стандарт по офрмлению кода PHP) есть пример оформления: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#11-example
Делай как там (думаю это PEAR style, то есть можно использовать настройки по умолчанию). Честно говоря, я не припоминаю чтобы где-то видел в PHP такой стиль отступов.
Мину наверно не надо делать классом (у нее же нет никаких свойств, все мины одинаковые), можно просто сделать у Клетки свойство заминированаЛи.
Думаю, можно писать код.
ОП, по поводу тестхаба.
>Сущность Вопросы теста: текст (наверно стоит предусмотреть возможность HTML), картинка, сложность в баллах, тип ответа, ответ
>Сущность Виды ответов: выбрать один из вариантов, выбрать 0-N вариантов, число (с погрешностью, например, 1.23 ±10%), строка (сравнивается без учета пробелов и регистра).
То есть я создаю две таблицы. Таблица "Виды ответов" будет содержать столбец question_id, который будет внешним ключом к таблице "Вопросы теста". Остальные четыре столбца будут предназначены для типов ответа, лишь один из которых будет использован.
Или можно сразу добавлять типы ответов в таблицу "Вопросы теста", чтобы не мучатся со связями? Пока что не вижу других вариантов.
http://sqlfiddle.com/#!2/3974b
Набросал схему для наглядности.
`multiple` VARCHAR(200) NULL, подразумевает, что мы вставляем сюда JSON строку.
>>394280
Спасибо. Да, я сперва собираюсь на веб-дизайн (там, где хтмл, цсс, жс), а уже потом перекатиться на программирование, где немного дают расширенные знания по предыдущим пунктам, а уж потом подрачивают пхп.
В целом, у них на сайтце так и написано, что на хтмл может придти любой, кто рубит в пекарнях. А на пхп - то вот тут лучше знать основы.
С 20к клеток проседает фпс уже, лол. ОП, про setInterval забыть нужно? Либо requestAnimationFrame, либо setTimeout, да?
Оп, почему ты такой правильный, а ещё мудрый? Как таким же стать? Я говорю от чистого сердца, если что. До того как ты первый тред открыл ты многое прошёл? Что побудило тебя открыть первый тред, как ты понял, что готов учить других?
А как пхп страницу запускать? В консоли, в редакторе. Ну ты же сам понимаешь о чем я. Он вроде говорил, если ideone будет не доступен. Хотел помочь, может херню ляпнул. Извини.
>год пилю жопоразрывной проект
Даже SAP быстрее внедряют
>архитектуру,
>оптимизацию
Сборка php.exe со флагом "-O3 --march=native" и покупка Core i7?
>проектирование
Целый год макаки строчили код от балды? Типично...
>тестирование
Firebug еще по ночам не снится?
>мастеры интернет-магазинов могут смело проходить мимо и кукарекать про
- жопоразрывные проекты, целиком умещающиеся на дешевом VPS за $5
- работающие в один поток, на единственном ядре сервера
- кучу говна запущенного на кроне, т.к. вывод данных пользователю блокируется до выполнения скрипта
- что делает невозможным асинхронные запроcы и какой-либо user-driven интерфейс приложений сложнее интернет-магазина
>Даже SAP быстрее внедряют
связывает внедрение в корпорациях и работу одного программиста
>Сборка php.exe со флагом "-O3 --march=native" и покупка Core i7?
не может загуглить слова архитектура и оптимизация
>Целый год макаки строчили код от балды? Типично...
привык говнокодить с ходу проекты сроком в месяц
>Firebug еще по ночам не снится?
не отличает отладку от тестирования
фантазирует про сервера, не может в буферизацию вывода, не может выделить процесс для параллельного выполнения, представляет себе пхп только через интернет магазины
ты густейше обосрался, обезьяна
иди почитай что-нибудь по программированию
Хороший видосик по композеру.
>иди почитай что-нибудь по программированию
Школьники, задроты и прочие омеги пускай читают, а потом годами говнопроекты за говнозарплате делают, а то и просто на маминой шее сидят со своими говнопознаниями. Мне некогда хуйней страдать - магазины надо продавать, а если тормозит говнобитрикс - мне же лучше еще и сервер с хостингом впарю.
http://jsfiddle.net/hbjoaLar/1/embedded/result/
Наверно скоро приступлю делать этот макет http://rghost.ru/58151961
Зеленый ты. Как заполнить разрыв между Junior-ом php програмистом и тем, что я знаю сейчас?
Agda.
Достаточно.
Вот мне нужно получить просто пока ответ от сервера с адреса
https://bittrex.com/api/v1.1/public/getmarkets
Вот что я пишу.
http://pastebin.com/dFaZJsA1
Не возвращает ничего. В чем проблема?
Это хорошо. Это значит, ты выучил основы Php. Но на этом обучение веб-разработке не заканчивается.
Далее, у нас есть вот такие несложные задания:
попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
посложнее: https://gist.github.com/codedokode/9424217
Если ты их сможешь сделать, то получится что ты способен сам сделать несложный сайт — и ты вполне хороший кандидат в джуниоры.
Если ты посмотришь эти задания, то увидишь, что там нужны кое-какие дополнительные знания, по которым у меня нет уроков. Не беда, ты вполне можешь изучить их сам.
- основы HTML — можно почитать это http://htmlbook.ru/samhtml
- основы CSS — можно почитать это http://htmlbook.ru/samcss
Проверить знания HTML/CSS можно на простых задачках отсюда: http://archive-ipq-co.narod.ru/l1/reading-list.html (10 заданий внизу страницы). После этого есть еще 11-е, 12-е задание и большое задание — сверстать макет страницы.
- как установить Апач и как запускать php-файлы из под него — есть небольшая статья: https://gist.github.com/codedokode/10774100
- основы баз данных — на эту тему я собрал ссылки и мини-задачку: https://gist.github.com/codedokode/10539213
Есть еще одна технология, которую полезно знать для разработки сайтов — это яваскрипт. По нему есть замечательные уроки на сайте learn.javascript.ru , а у меня есть задачки для проверки знаний: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Ну и еще, ты пишешь что прошел учебник, но показывал ли ты нам решения задач? Если нет, то зря, я заметил что когда аноны проверяют свои же решения, они пропускают многие ошибки (тут можно вспомнить поговорку про бревно в глазу). Было бы гораздо полезнее показать решения последних задач, и исправить замечания.
Если есть каике-то вопросы или что-то непонятно, задавай их в теде.
Это хорошо. Это значит, ты выучил основы Php. Но на этом обучение веб-разработке не заканчивается.
Далее, у нас есть вот такие несложные задания:
попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
посложнее: https://gist.github.com/codedokode/9424217
Если ты их сможешь сделать, то получится что ты способен сам сделать несложный сайт — и ты вполне хороший кандидат в джуниоры.
Если ты посмотришь эти задания, то увидишь, что там нужны кое-какие дополнительные знания, по которым у меня нет уроков. Не беда, ты вполне можешь изучить их сам.
- основы HTML — можно почитать это http://htmlbook.ru/samhtml
- основы CSS — можно почитать это http://htmlbook.ru/samcss
Проверить знания HTML/CSS можно на простых задачках отсюда: http://archive-ipq-co.narod.ru/l1/reading-list.html (10 заданий внизу страницы). После этого есть еще 11-е, 12-е задание и большое задание — сверстать макет страницы.
- как установить Апач и как запускать php-файлы из под него — есть небольшая статья: https://gist.github.com/codedokode/10774100
- основы баз данных — на эту тему я собрал ссылки и мини-задачку: https://gist.github.com/codedokode/10539213
Есть еще одна технология, которую полезно знать для разработки сайтов — это яваскрипт. По нему есть замечательные уроки на сайте learn.javascript.ru , а у меня есть задачки для проверки знаний: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Ну и еще, ты пишешь что прошел учебник, но показывал ли ты нам решения задач? Если нет, то зря, я заметил что когда аноны проверяют свои же решения, они пропускают многие ошибки (тут можно вспомнить поговорку про бревно в глазу). Было бы гораздо полезнее показать решения последних задач, и исправить замечания.
Если есть каике-то вопросы или что-то непонятно, задавай их в теде.
Можно переходить к темам «разработка сайтов», «базы данных» и «использование фреймворков»: >>394561
>>394547
Решить для начала эти задания: >>394561
>>394551
В учебнике недостаточно, там только основы PHP, но с дополнительными заданиями которые ОП выдает индивидуально, будет достаточно. >>394561
Насчет этой задачи, я тут подумал ее упрощать, и нарисовал наброски всех страниц, если ты еще не видел, то советую посмотреть: https://gomockingbird.com/mockingbird/#l0bk13j (сверху есть переключатель между страницами - их там около 12).
Текст задачи пока не обновлен, потому если в нем упоминается что-то чего нет на набросках страниц то это можно не делать.
Типов вопросов (множественный, один-из, с выбором, с вводом числа) всего несколько и их нельзя добавить через интерфейс. Значит, не надо делать для них таблицу, а можно просто их запрограммировать в коде.
Теперь вопрос, как хранить правильный ответ и список вариантов? Гм, такие варианты:
- таблица с вариантами ответов и таблица связи «вопрос - правильный ответ» для вопросов с множественным выбором. Для вопросов с числом или текстом — хранить ответ в таблице вопросов. Для вопросов с одним ответом — хранить id правильного ответа. Без всяких там JSON:
title: Чему равно Пи?
type: numeric
precisionPercent: 1 // точность в процентах
answerNumber: 3.1415 // для вопросов с числом-ответом
answerText: NULL // для текстовых вопросов
answerId: NULL // для вопросов с едиснтвенным выбором
title: Кому упало яблоко?
type: select-one
....
answerId: 123456 // ссылка на таблицу вариантов ответов
....
- можно отказаться от хранения в таблицах и использовать поле с JSON:
title: Чему равно Пи?
type: numeric
answer: {"value": 3.1415, "precision": 1}
title: кому на голову упало яблоко?
type: select-one
answer: {"corrent": 1, "options": [.....]}
Вариант без JSON мне кажется удобнее тем что там все разложено по отдельным колонкам, а в случае с JSON например можно по ошибке положить не тот JSON и потом что-нибудь где-нибудь отвалится. То есть больше возможностей что-то сломать. Потому мне больше нравится вариант без JSON, но если у тебя есть какие-то аргументы, давай их выслушаем.
> Или можно сразу добавлять типы ответов в таблицу "Вопросы теста", чтобы не мучатся со связями? Пока что не вижу других вариантов.
Я думаю, стоит добавить. Так как нет особого смысла хранить правильный ответ отдельно от вопроса.
Насчет этой задачи, я тут подумал ее упрощать, и нарисовал наброски всех страниц, если ты еще не видел, то советую посмотреть: https://gomockingbird.com/mockingbird/#l0bk13j (сверху есть переключатель между страницами - их там около 12).
Текст задачи пока не обновлен, потому если в нем упоминается что-то чего нет на набросках страниц то это можно не делать.
Типов вопросов (множественный, один-из, с выбором, с вводом числа) всего несколько и их нельзя добавить через интерфейс. Значит, не надо делать для них таблицу, а можно просто их запрограммировать в коде.
Теперь вопрос, как хранить правильный ответ и список вариантов? Гм, такие варианты:
- таблица с вариантами ответов и таблица связи «вопрос - правильный ответ» для вопросов с множественным выбором. Для вопросов с числом или текстом — хранить ответ в таблице вопросов. Для вопросов с одним ответом — хранить id правильного ответа. Без всяких там JSON:
title: Чему равно Пи?
type: numeric
precisionPercent: 1 // точность в процентах
answerNumber: 3.1415 // для вопросов с числом-ответом
answerText: NULL // для текстовых вопросов
answerId: NULL // для вопросов с едиснтвенным выбором
title: Кому упало яблоко?
type: select-one
....
answerId: 123456 // ссылка на таблицу вариантов ответов
....
- можно отказаться от хранения в таблицах и использовать поле с JSON:
title: Чему равно Пи?
type: numeric
answer: {"value": 3.1415, "precision": 1}
title: кому на голову упало яблоко?
type: select-one
answer: {"corrent": 1, "options": [.....]}
Вариант без JSON мне кажется удобнее тем что там все разложено по отдельным колонкам, а в случае с JSON например можно по ошибке положить не тот JSON и потом что-нибудь где-нибудь отвалится. То есть больше возможностей что-то сломать. Потому мне больше нравится вариант без JSON, но если у тебя есть какие-то аргументы, давай их выслушаем.
> Или можно сразу добавлять типы ответов в таблицу "Вопросы теста", чтобы не мучатся со связями? Пока что не вижу других вариантов.
Я думаю, стоит добавить. Так как нет особого смысла хранить правильный ответ отдельно от вопроса.
> подразумевает, что мы вставляем сюда JSON строку.
В MySQL таблицам и полям можно давать комментарии. Настоятельно рекоемндую это использовать:
CREATE TABLE x (
a INT(10) COMMENT "комментарий поля"
) COMMENT "комментарий к таблице"
Бамп вопросу. Аноны, ну помогите уже ньюфагу. Наверняка вопрос на минуту ответа. Я правда не понимаю в чем ошибка.
Смотри, requestAnimationFrame нужен в тех случаях когда ты рисуешь (рисуешь значит рисуешь на канвасе или меняешь свойства dOM объектов) быстрее чем обновляется монитор. Типичный монитор обновляет каритнку на экране 60 раз в секунду. Если ты делаешь изменения чаще, то часть из них ты делаешь зря так как они не будут отображены, а время процессора на это расходуется.
В этом случае тебе надо менять только данные в памяти, а по requestAnimationFrame обновлять изменившуюся часть картинки. Плюс, браузер в неактивной вкладке может перестать вызывать или вызывать реже эту функцию чтобы зря не грузить процессор.
> проседает фпс уже
зависит еще от того, что ты используешь для отображения (канвас, DOM) и как ты обновляешь поле. Я бы советовал использовать вкладки Timeline и Profile в инспекторе Хрома чтобы найти варианты оптимизации.
> Что побудило тебя открыть первый тред, как ты понял, что готов учить других?
Некий Перл-кун в день программистов устроил в /b тред изучения Перла и я решил то же самое попробовать. Треды оказались популярными, и они уходил в бамплимит за несколько часов, хотя тогда еще не было сайта, а задачки постились как картинки.
> Как таким же стать?
Ну я лет 5, или даже больше занимаюсь веб-разработкой, так что знаний накопилось прилично. И до этого я интересовался программированием (сейчас проще: в моем детстве компьютеры и интернет были дорогие и не у всех, а вам достаточно отложить в сторону Беттлфилд и скачать редактор кода). Плюс, для меня раньше это была не просто работа, а я всем этим интересовался. Надо читать разные статьи, для начала с хабра можно начать, изучать библиотеки и фреймворки, в общем интересоваться чем-то новым и расширять кругозор, а не просто делать свою работу (если ты можешь работать не 8 часов в день, а меньше или можешь изучать новые вещи на работе, это здорово помогает).
Если тебе интересно, у меня на сайте есть кое-какие ссылочки: http://archive-ipq-co.narod.ru/tsuzuke.html
Качай installer, но не ставь все подряд. Тебе нужно только:
- mysql server
- mysql workbench по желанию (это штука для проектирования БД перетаскиванием прямоугольничков)
Судя по тому что ты не знаешь ни как работает сервер, ни про яваскрипт, ты скорее всего какой-нибудь студентик-байтоед, выучивший основы Си (Си++ не осилил так как Ооп не нужно, и вообще сложно как-то там все).
ну как узнать - я макака, среднячок, норм или охуеть профессионал? ну ты понял.
алсо что там с форумом? у тебя же сайт на юкозе - так запили туда форум и всё
Мы уже поняли, что ты студент-фантазер. Конечно, тебе некогда, поэтому ты сидишь фантазируешь в нашем треде.
>>394535
Я бы советовал привыкать использовать CSS-классы. Сейчас твои вкладки нельзя поместить на существующий сайт, так как там могут уже использоваться теги вроде section, input и твои стили сломают сайт. Надо использовать либо уникальный класс, например
.tab-widget .tab
.tab-widget .frame
либо префикс
.tab-widget__tab
.tab-widget__frame
(двойное подчеркивание я взял из БЭМ).
> section{
> width: 800px;
> height: 315px;
Ну не, это непрактично. Смотри, мы добавим на вкладку текста или пару картинок и высота уже поменялась. Что, нам каждый раз вручную ее высчитывать? А если текст генерируется скриптом например берется из базы данных, как PHP-скрипт посчитает его высоту?
Использовать фиксированные размеры — очень неудобно потому их лучше не использовать. Давай лучше сделаем чтобы ширина равнялась ширине родителя, а высота определялась содержимым.
То же с заголовками вкладок — пусть их ширина и высота вычисляется автоматически из содержимого.
> input[type="radio"]:checked + label + input + label + input + label + div
ой-ой, какое сложное заклинание. А если мы хотим добавить/убавить число табов, нам придется CSS переписывать? Плюс, стоит нам добавить хоть один лишний тег как все сломается. Давай попробуем обойтись без этого. Можно попроьовать использовать тут CSS селектор ~ из CSS3, а табы пронумеровать клссами вроде tab-1, tab-2 и тд. или аттрибутами data-number="1"
Мы уже поняли, что ты студент-фантазер. Конечно, тебе некогда, поэтому ты сидишь фантазируешь в нашем треде.
>>394535
Я бы советовал привыкать использовать CSS-классы. Сейчас твои вкладки нельзя поместить на существующий сайт, так как там могут уже использоваться теги вроде section, input и твои стили сломают сайт. Надо использовать либо уникальный класс, например
.tab-widget .tab
.tab-widget .frame
либо префикс
.tab-widget__tab
.tab-widget__frame
(двойное подчеркивание я взял из БЭМ).
> section{
> width: 800px;
> height: 315px;
Ну не, это непрактично. Смотри, мы добавим на вкладку текста или пару картинок и высота уже поменялась. Что, нам каждый раз вручную ее высчитывать? А если текст генерируется скриптом например берется из базы данных, как PHP-скрипт посчитает его высоту?
Использовать фиксированные размеры — очень неудобно потому их лучше не использовать. Давай лучше сделаем чтобы ширина равнялась ширине родителя, а высота определялась содержимым.
То же с заголовками вкладок — пусть их ширина и высота вычисляется автоматически из содержимого.
> input[type="radio"]:checked + label + input + label + input + label + div
ой-ой, какое сложное заклинание. А если мы хотим добавить/убавить число табов, нам придется CSS переписывать? Плюс, стоит нам добавить хоть один лишний тег как все сломается. Давай попробуем обойтись без этого. Можно попроьовать использовать тут CSS селектор ~ из CSS3, а табы пронумеровать клссами вроде tab-1, tab-2 и тд. или аттрибутами data-number="1"
В JS fiddle нельзя вставлять картинки. Чтобы опубликовать свой html-код с доп. файлами, удобно использовать статические сайты на гитхабе: https://pages.github.com/
Гит (который используется для постинга кода на гитхаб) тебе рано или поздно все равно понадобится.
>Конечно, тебе некогда, поэтому ты сидишь фантазируешь в нашем треде.
совсем необязательно он фантазёр
довольно много людей которые попали на хорошие места где незачто платят оче много
может он такой же
У тебя наверно ошибки не отображаются.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log . Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
>оп, поясни как оценить свой навык?
А что ты можешь сделать сам? Можешь поиск по миллионам пользователей (по возрасту, имени, учебным заведениям, городу) как вконтакте сделать например?
Определяется тем, что ты можешь сделать. Джуниор делать простые задачи, под надзором старших товарищей. Миддл может самостоятельно сделать какой-то сложный раздел сайта, например. Сениор может принимать ответственные архитектурные решения, например как запилить этот поиск.
Плюс важны такие качества, как ответственность например.
Плюс, у миддла/сеньора могут быть другие программисты в подчинении, а могут и не быть.
Но все сильно зависит от компании, потому эти градации очень размытые. Джуниор в компании по клепанию простых сайтов не равносильно джуниору в яндексе или например гугле. Сеньор в стартапе не равно сеньору в ленивой и сытой аутсорсинговой компании.
Вот еще: http://dou.ua/lenta/columns/junior-middle-senior-kakimi-popugayami-meryaem/
> ну как узнать - я макака, среднячок, норм или охуеть профессионал?
попробуй пройти собеседование на должность «сеньор программист» например и узнаешь :)
>>394589
А что хорошего в его воображаемой работе? На «хороших» местах рабочий день все равно длится 8 часов, и оплата там вряд ли сильно выше рынка, только занимаешься ты не тем, что тебе интересно, а делаешь рутинную работу. Ты же волком завоешь через год такой деятельности.
форумы нисколько не устарели.
ну или назови как иначе кроме форума можно организовать то что происходит итт?
я не вижу ничего что может лучше подойти для того что ты здесь делаешь кроме форума.
>>394597
>А что хорошего в его воображаемой работе?
деньги, естественно
между напряжённой и интересной работой за 18к и унылой за 30 что ты выберешь? и не говори что первое.
у меня сейчас первый вариант и я вертел это всё.
>Можешь поиск по миллионам пользователей
не вижу вообще никакой проблемы в этом
займёт много времени конечно чтобы сделать это быстрым, но по сути это ерунда
не бывает такого
либо курл вернёт ошибку, либо пустой ответ. но никак не чистую страницу.
что-то ты нам пиздишь тут
http://www.forumotion.com/
>Forumotion is a a free forum hosting service. Obviously because the service is free you will be using a yourwebsitename.forumotion.com domain. You can create a free forum on Forumotion in seconds, without any technical knowledge and begin to discuss on your own forum instantly! The interface of the forum is intuitive, easy to use and customizable.
я тебя доёбываю форумом потому что у меня печёт от этой пятисотпостовой портянки
у тебя, надеюсь, тоже
Давай тогда сделам из этого мини-урок по отладке и поиску проблем с curl. Как поступать в таких ситуациях?
Во-первых, откроем мануал http://php.net/manual/ru/function.curl-setopt.php и найдем там опцию для отладки
> CURLOPT_VERBOSE
> TRUE для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR
Если ты поставишь ее
curl_setopt($curl, CURLOPT_VERBOSE, true);
то конечно ничего не увидишь. Почему? Потому что когда ты запускаешь PHP через Апач (а браузер вызвает твой скрипт именно так) то поток STDERR направлен неизвестно куда и не отображается в браузере (по идее он идет в лог ошибок сервера — но у меня там ничего нет).
Чтобы увидеть отладочную информацию, надо запустить скрипт в консоли, командой вроде
"c:\php\php.exe" "d:\script\curl.php"
(краткий гайд по консоли с нуля: https://gist.github.com/codedokode/10539568 )
Я попробовал и у меня получилось увидеть причину, кстати.
Также, второй сопсоб. У curl есть внутреннее поле для информации об ошибке:
> curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Сделай такой код:
$error = curl_error($curl);
после curl_exec и посмотри что выведется. Кстати, это отдельный вопрос к тебе, почему ты пишешь код с использованием curl и не вызывыаешь curl_errno/curl_error — это неправильно.
Ну и наконец третий способ. Иногда curl не пишет никакой ошибки, но все равно что-то не так. В таком случае придется перехватывать трафик между curl и сервером и разбираться.
Для этого можно применить либо программу перехвата данных на сетевых интерфейсах вроде Wireshark которой не требуется дополнительной настройки, либо ставить прокси (сервер-посредник), который будет перехватывать проходящий через него трафик, например http://www.telerik.com/fiddler (естественно при использовании прораммы-прокси надо в опциях курла указать ему использовать этот прокси).
Надеюсь, теперь-то ты сможешь разобраться с проблемой? получив текст ошибки ты поймешь надеюсь что делать дальше.
Давай тогда сделам из этого мини-урок по отладке и поиску проблем с curl. Как поступать в таких ситуациях?
Во-первых, откроем мануал http://php.net/manual/ru/function.curl-setopt.php и найдем там опцию для отладки
> CURLOPT_VERBOSE
> TRUE для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR
Если ты поставишь ее
curl_setopt($curl, CURLOPT_VERBOSE, true);
то конечно ничего не увидишь. Почему? Потому что когда ты запускаешь PHP через Апач (а браузер вызвает твой скрипт именно так) то поток STDERR направлен неизвестно куда и не отображается в браузере (по идее он идет в лог ошибок сервера — но у меня там ничего нет).
Чтобы увидеть отладочную информацию, надо запустить скрипт в консоли, командой вроде
"c:\php\php.exe" "d:\script\curl.php"
(краткий гайд по консоли с нуля: https://gist.github.com/codedokode/10539568 )
Я попробовал и у меня получилось увидеть причину, кстати.
Также, второй сопсоб. У curl есть внутреннее поле для информации об ошибке:
> curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Сделай такой код:
$error = curl_error($curl);
после curl_exec и посмотри что выведется. Кстати, это отдельный вопрос к тебе, почему ты пишешь код с использованием curl и не вызывыаешь curl_errno/curl_error — это неправильно.
Ну и наконец третий способ. Иногда curl не пишет никакой ошибки, но все равно что-то не так. В таком случае придется перехватывать трафик между curl и сервером и разбираться.
Для этого можно применить либо программу перехвата данных на сетевых интерфейсах вроде Wireshark которой не требуется дополнительной настройки, либо ставить прокси (сервер-посредник), который будет перехватывать проходящий через него трафик, например http://www.telerik.com/fiddler (естественно при использовании прораммы-прокси надо в опциях курла указать ему использовать этот прокси).
Надеюсь, теперь-то ты сможешь разобраться с проблемой? получив текст ошибки ты поймешь надеюсь что делать дальше.
Если смотреть с моей стороны то доска удобнее:
- никаких регистраций и вводов паролей
- достаточно зайти и просмотреть накопившиеся внизу посты. Не надо смотреть в каких темах появились новые сообщения и заходить в них. Не надо просматривать весь тред.
>>394602
Ну как сказать, доска чем-то удобнее в том плане что нет никаких тем, разделов. И слева от сообщения не выводится куча бессмысленной информации типа аватарок, даты регистрации, рейтинга и прочей ерунды. И подписей под постами нет.
> между напряжённой и интересной работой за 18к и унылой за 30 что ты выберешь?
Выберу интересную за 100к например (точнее, интересную за 50к на полдня).
>>Можешь поиск по миллионам пользователей
> не вижу вообще никакой проблемы в этом
А вот это плохо что не видишь. Ибо она там есть, и не одна. Типичный MySQL на таком поиске начнет тормозить, да еще как.
Если смотреть не с моей а с точки зрения пользователей то им наверно удобнее комментарии под уроком где можно задать вопрос.
Ок, спасибо. НО, когда я пишу вот такой вот код
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, 'http://test.lc/primer.php?a=5&b=10');
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
$out = curl_exec($curl);
echo $out;
curl_close($curl);
}
а примере у меня просто
$a = $_GET['a'];
$b = $_GET['b'];
echo $a + $b;
И при этом я получаю правильный ответ, т.е. выводится 15.
Но при этом все равно в командной строке выводится ошибка о том, что curl_init не определена. Почему так?
Зависит от твоих настроек. Возможно что у тебя php при запуске из командной строки использует php.ini по умолчанию, а при запуске из под openserver ему передается путь к настоящему ini файлу с настройками.
Тогда тебе надо явно указать путь к конфигу при вызове:
"c:\php\php.exe" -c "d:\openserver\php.ini" "d:\script\curl.php"
Заметь опцию -с и заметь что она отделена пробелами от имени файла. Путь к php.ini можно увидеть в phpinfo().
Увидеть список загруженных модулей можно командой
"c:\php\php.exe" -m (можно добавить перед ней -с чтобы использовать другой конфиг)
Просмотреть информацию о настройках аналогичную phpinfo можно командой
"c:\php\php.exe" -i
Вот где php ищет свой ini файл: http://php.net/manual/ru/configuration.file.php (согласен, непонятно написано но важно что он ищет его в своей папке и в папке Windows, а вот при запуске из-под апача еще и там куда указывает опция PHPIniDir в конфиге Апача).
>- никаких регистраций и вводов паролей
форум без регистрации.
с каптчёй как на дваче
>- достаточно зайти и просмотреть накопившиеся внизу посты. Не надо смотреть в каких темах появились новые сообщения и заходить в них. Не надо просматривать весь тред.
список последних непрочитанных сообщений
тебе даже не нужно помнить читал ты это или нет, они сами исчезают из списка.
>даты регистрации, рейтинга и прочей ерунды
ну ты же застрял в 2000
посмотри на совеременные форумные движки. они совершенно не похржи на то что ты описываешь.
алсо размещаешь урок в отдельной ветке форума, аноны задают вопросы по уроку, ты отвечаешь. то что ты и хотел, только в виде форума
>Выберу интересную за 100к например (точнее, интересную за 50к на полдня).
ты не можешь её выбрать, потому что её нет.
>>394650
>А вот это плохо что не видишь
а кто сказал что я буду делать это на сыром мускуле\пхп?
Короче, запустил с ini openserver'a. Вышла куча ошибок, в том числе и эта.
А вот, что получилось в консоли.
http://pastebin.com/vs3NvQ4J
Может баги в сервере? Я сейчас качаю самую новую версию, может там исправлено.
> посмотри на совеременные форумные движки
Можешь ссылочек скинуть на современные форумные движки или форумы на их основе?
Я подумаю, может действительно можно тут что-то сделать. Но может лучше комментарии под уроком добавить?
Ну и если я смотрю на сайты вроде codeacademy, там же вроде форума нет (точнее есть, но он спрятан за ссылкой и служит больше для техподдержки).
> ты не можешь её выбрать, потому что её нет.
Значит надо стараться и развиваться, чтобы иметь возможность ее выбрать.
> а кто сказал что я буду делать это на сыром мускуле\пхп?
Ну допустим если бы ты делал уже такие вещи, ты бы сказал «я бы сделал так...»или «можно использовать X», если бы ты не делал, но знал в чем сложность, ты бы написал «гм, это непросто, мне надо погуглить для начала», а раз ты говоришь «не вижу проблем», скорее всего ты просто не представляешь в чем именно проблема и потому не видишь.
Я погуглил — в openserver момент с cli скриптами явно не продуман, вот люди тоже мучаются:
http://open-server.ru/forum/viewtopic.php?f=3&t=988
И вот совет
> Консоль запускайте из меню программы.
Видимо в этом случае она пропишет переменные окружения для PHP и он все-таки сможет найти свой конфиг без флага -c
Алсо, у меня PHP установлен сам по себе и с такими проблемами я даже не сталкивался. я вообще сборки не люблю.
ТО что у тебя не php.ini, а какой-то шаблон для него так как в php.ini не используются вот такие штуки:
%progdir%
На это также косвенно указывает расширение .ini.txt на конце.
Ты можешь запустить phpinfo() в браузере и посмотреть там пункт Loaded php.ini file или как-то так — там наверно другой файл указан. Но сначала попробуй вариант выше.
Алсо, я гуглил на английском и удивлялся чего результатов мало — а он за рубежом не особо известен.
>Ну допустим если бы ты делал уже такие вещи, ты бы сказал
как бы я сделал
очевидно нет смысла оптимизировать что-то не зная где будет слабое место
беру сырой мускул, пилю таблицы городов, учебных заведений, итд итп
смотрю как происходит поиск, смотрю где именно бутылочное горлышко
можно вынести неизменяющиеся данные в память, например
можно кэшировать самые популярные запросы (например "том круз")
не вижу смысла фантазировать на счёт того что может быть медленно, потому что можно потратить неделю на микрооптимизации этого всего поиска, когда у социальной сети тысяча посетителей в день, а можно в это время развивать саму сеть и улучшать её, одновременно наблюдая где появляются вопросы и решать их по мере поступления
>Но может лучше комментарии под уроком добавить?
нет. допустим у тебя 30 уроков, ты будешь между уроками бегать искать комментарии?
или прикрутишь тот же дискус - это будет тот же самый форум.
http://www.quertime.com/article/15-best-online-forum-platforms-software-free-and-paid/
http://vanillaforums.org/
http://fluxbb.org/forums/viewtopic.php?id=7951
вообще с минимальными знаниями пхп ничего не мешает просто убрать ту информацию которую ты считаешь лишней, будет та же самая борда, только с ёба-функционалом
Опытные разработчики обмазываются вагрантами и докерами, а не этими спермоподелиями.
> нет смысла оптимизировать что-то не зная где будет слабое место
Тут ты прав. Но знать, что стандартными средствами MySQL это не выйдет, хорошо бы.
> смотрю как происходит поиск, смотрю где именно бутылочное горлышко
Главное бутылочное горлышко в том, что там миллионы пользователей, поиск по нескольким критериям (возраст от 18 до 20 лет, девочки, из Москвы) и MySQL может использовать максимум один индекс, и все это превращается в обход всех пользователей от 18 до 20 лет или обход всех пользователей из Москвы, c последующей сортировкой в памяти или файле (тогда лучше сразу застрелиться), что не быстро. Если у тебя нагруженный сайт, то все становится совсем печально.
Если говорить про вконтакте, там еще есть дополнительная сложность в том, что база распределенная и пользователи не хранятся все на одном сервере.
Потому лучше всего было бы для начала погуглить, а не спешить писать код. Ты бы мог например для начала вспомнить про внешние системы для поиска типа sphinx или elastic search или solr и посмотреть, не подойдут ли они для наших целей. И если не подойдут, то что лучше: перепиливать один из существующих серверов или писать свой?
Те движки, что я упомнул, неплохие и для многих проектов их хватает. Если не хватает, можно их подкручивать либо писать свое.
Велосипедистам из вконтакте естественно использовать существующий сервер даже в голову
мысль не придет, они написали свой:
https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/KittenDB_Search.wiki (написано не очень понятно, особенно если ты не представляешь как работают поисковые движки)
https://github.com/vk-com/kphp-kdb/tree/master/search
Ну да ладно, мой вопрос был скорее чтобы не проверить твое знание поисковых движков, а увидеть ход мысли, какие варианты ты будешь рассматривать. То, что ты готов броситься писать код сразу — не лучший вариант.
Но чтобы сделать докер-образ надо знать линукс, командную строку, а также уметь устанавливать и настраивать php и апач, чего я и добиваюсь. Хотя можно взять готовый, но в командную строку лезть все равно придется.
Мне лично VirtualBox и apt-get install хватает.
Никак не могу врубится как сделать эту задачу. Можешь объяснить что бы даже дцпшнику стало ясно?
2) не палить код миру (ибо потом спалюсь на антиплагиате или ещё какой залупе)?
>как ты сделаешь из 1 инженера 9 инженеров?
Ну да, никак — я долбаёб. Ненависть к строкам в параметрах мешает мне вникать в чужой код.
Значит с этим, наверное, правильнее ничего не делать.
Но поскольку я таки ненавижу строки в параметрах, то скорее всего попытался бы например объявить в родителе статичный getClassName(), который бы возвращал get_called_class(). Тогда createEmployee() остаётся как есть и вызывается createEmployee(Manager::getClassName(), 1, 9);
Есть такой код (упрощен для примера):
http://ideone.com/fc8rpa
Казалось бы все правильно и ошибки быть не может в принципе. Но при попытке запустить этот код c 30 000 слов, а не с двумя (под нодой, хотя это неважно) вылетает исключение в отмеченной комментарием про птичку строке:
TypeError: Object function Object() { [native code] } has no method 'push'
at Index.prototype.addWord
at Array.forEach (native)
....
Внимание вопрос: объясните, откуда ошибка и как ее исправить. Как тут может быть ошибка? Я лично потратил 5 минут на поиски, ставя всюду console.log, но вы у меня умные и, я думаю, можете без отладки найти ошибку.
Задачка очень поучительная, кстати, так как решив ее, вы сможете избежать такой ошибки в своем коде.
http://ideone.com/ePT9tx выходит такая штука.(Да-да, тупой гуманитарий.
двачую этого. делаю магазины на битриксе не выходя из дома - поднимаю 50К в месяц, из них половина на обслуживании существующих проектов - отнимает пару-тройку часов в день, остальное время страдаю хуйней на двачах или дрочу на свои генты...
>>394597
Вот когда магаз на 50K+ товаров с ежечасными обновлениями прайсов и остатков сделаешь и чтоб не больше <0,7 секунд грузилась любая страница - тогда поговорим, а поднимать свой ЧСВ решением своих воображаемых нахуй никому не нужных задачек много ума не надо...
>/Если баланс отрицательный — хватит считать/
Ну, во-первых, почему отрицательный-то? Перестать выплачивать кредит нужно не тогда, когда ты по нему переплатил, а когда твоя месячная анальная выплата больше оставшегося долга.
>чтоб не больше <0,7 секунд грузилась любая страница
какой-то ебанутое условие.
это при идиальном интернете с нагрузкой в 0 посетителей?
Скачал installer. Выбрал Custom, чтобы выбрать, что устанавливать. Так там исключение выпадает:
System.FormatException: Строка не распознана как действительное значение DateTime.
в System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
в WexInstaller.Core.Package.get_Published()
в WexInstaller.Wizards.AddProductsWizard.SelectProductsPage.productTree_AfterSelect(Object sender, TreeViewEventArgs e)
в System.Windows.Forms.TreeView.OnAfterSelect(TreeViewEventArgs e)
в System.Windows.Forms.TreeView.TvnSelected(NMTREEVIEW nmtv)
в System.Windows.Forms.TreeView.WmNotify(Message& m)
в System.Windows.Forms.TreeView.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Вот полный текст:
http://ideone.com/73lUpi
Нажимаю продолжить, но выбирать уже нельзя. Что делать?
Ебало свое гнойное завали, черт угашенный.
Что дальше делать?
Нужно выбрать тип конфига: server, development, dedicated.
Порт 3306 и оставить? Named Pipe и Shared Memory нужно менять? Там сейчас MYSQL написано.
Юзера надо создавать? И если да, то какого? Там есть роли: разные админы (user admin, security admin, db admin, monitor admin и т.д.).
Configure MySQL Server as a Windows Service?
Run Windows Service as: standart system account или custom user?
Все логи нужны? Там general log, slow query log, bin log?
Server Id что ставить? Или без разницы? Там по-умолчанию 1.
с таким терпением ты выучишь только улицу которую будешь подметать, обезьянка
а может ты и прав, пхп дно ещё то
Я тот кун, который уже три месяца не может выбрать себе серверный язык (пхп, рельсы, нода).
Я хочу стать мамкиным фрилансером.
я год работаю на пхп и моя зп 18к
как там во фрилансерстве?
мне кажется это оче тяжело
там правда можно зарабатывать неплохо?
А я откуда знаю, я безработный вообще.
>я год работаю на пхп и моя зп 18к
Вот из-за такой хуйни не хочется в пхп лезть.
я сомневаюсь что в моём случае дело в пхп
скорее это я говно и не могу сменить работу на нормальную
А ты из мухосранска? Пишешь на каком фреймворке, и что именно? Онлаен магазы? Просто интересно чем занимается пхпшник за 18 тыщ.
пишу дохуя времени большой проект, если он взлетит то будет что-то уровня авито (нет, это не доска объявлений) и каждый будет знать о нём
но перспективы этого мне кажется сомнительными, если бы было норм - он бы уже был известен
мухосранск полумиллионник
вообще для пхп-макаки с годовым опытом в городе норм за - 25к, так что да, нужно говорить с начальством или перекатываться
По поводу БД-нных. Допустим я могу решить задачу с Гит, но я еще не знаю всего из списка, что выше задачи, стоит ли продолжать читать?
Какой у тебя был уровень, когда ты устраивался, у нас в мухосрани около 800к населений зарплата для около 300-400 баксов будет в начинающего
Да я скопировал прям свой код в идеон. Имена перепроверил много раз, копипастил, чтоб наверняка. Непойму что за беда. Ошибки включены. Ошибки не выводит.
http://jsbin.com/hafiwatasaxi/12/edit - сделал мало, но уже будет куча ошибок. Клетка должна наследоваться от Поля? Чтобы были общие методы - добавитьКласс, удалитьКласс и т.д?
Даже не так. Мне надо чтобы заменялось только $word, но только когда после него не стоит [A-Za-z]. "/$word".'[^A-Za-z]/' - приводит к тому что заменяется и символ после $word. К тому же, если символа нет, то нет и замены.
Условие кажется ебанутым только тем, кто не работал над реальными проектами с реальными заказчиками. Им похуй на интернет, похуй на количество посетителей, похуй на тебя и твои мысли по поводу движков баз данных. Им надо что бы на пикрилейтед было пиздато, а не хуёво. И уж будешь ты оптимизировать код, базу данных или скажешь покупать новый сервер - исключительно твоя головная боль. Клиенту надо чтоб любая страница в 0,7 секунд грузилась.
Именно этим отличаются ваши студенческие фантазии от реальной жизни - тут всем похуй на тебя и твои мысли - нужен только результат...
Нужно получить bands.id по любому параметру и их сочетаниям, а именно: bands.name, bands.year_start, bands.year_end, bands.creator, bands_countries.country_id, bands_members.member_id, albums_genres.genre_id. Для выполнения запросов типа "покажи группы, которые играют в россии с 1995 по сегодняшний день в жанре русская попса, добавленные в БД Васяном". Как это сделать по-научному? Как мне этот ёба-запрос формировать программно?
select from ... JOIN ... JOIN ... JOIN ... where %твоё условие из любой приджоиненной таблицы%
Без знака вопроса.
Таки нашел http://php.net/manual/en/regexp.reference.assertions.php
"/$word".'(?![A-Za-z])/' - работает.
Но есть другой вопрос
Пытаюсь сделать подобие BB-кодов. Вот допустим я заменяю тег на картинку:
$post = preg_replace('/\\[img\\](.)\\[\\/img\\]/', '<img src="$1">', $post);
Затем хочу добавить цитирование:
$post = preg_replace('/(?<=\n|^)(\\> )([^\n]+)/', "<span class='quote'>$1$2</span>", $post);
Но цитирование работает и на картинки, так <img src="#"> foo превратиться в <img src="#"<span class="quote">> foo</span>. Есть идеи как все это дело обойти?
Ой, я обманул, конечно же не превратиться. Но это просто пример неудачный, т.к. у цитирования довольно строгие превязки к начальным перед ним символам. А допустим я хочу сделать тег [url], да еще и чтобы ссылки на http:// автоматов вкладывались в этот тег. Тогда ссылки внутри картинок будут тоже вкладываться. Я могу сделать ограничение, чтобы не менялось когда ссылка замкнута ковычками, но по моему это костыли. Есть идеи по лучше, без этих унылых ограничений? Чтоб и ссылки в ковычках вкладывались в тег и чтобы ссылки в картинках не трогались?
используй орм, люк
Почему нельзя сделать вот так, а нужно использовать blindparam?
Я php учу 3 дня, не бейте сильно, а скажите почему нельзя.
Бамп
Пишешь SQL код (только создание таблиц, не пиши туда создание БД или пользователя) ручками в файл schema.sql и кладешь в папочку в репозитории. В README.md пишешь что для установки надо загрузить этот дамп.
Теперь любой, кто захочет развернуть твой проект, сделает команду
mysql -uusername -p database < schema.sql
(ну либо воспользуется какой-нибудь громоздкой неудобной программой с кнопочками) и загрузит твой дамп.
Если ты будешь делать изменения в схеме БД (захочешь например добавить колонки или еще одну таблицу) то есть 2 варианта.
В простом случае ты дописываешь все в файл schema.sql, дропаешь базу данных и загружаешь заново из дампа.
В случае более сложных проектов, и когда работает несколько человек, чтобы не дропать постоянно БД пишут миграции, то есть делают новые файлики с изменнниями, которые надо загрузить. В фреймворках вроде Yii для этого даже есть стандартные средства, которые позволяют запоминать какие миграции выполнялись и одной командой прогнать все не выполнявшиеся ранее. Есть также отдельные библиотеки вроде такой: http://webdev-tales.ru/post/62178815430/doctrine-migrations-in-php-project или такой http://phinx.readthedocs.org/en/latest/migrations.html
В нашем случае хватит файлика schema.sql, я думаю.
Но советую тебе статьи почитать, чтобы знать как такие штуки делаются в других проектах.
Для начала тебе надо сделать классы животных и карту (я вижу, у тебя там что-то есть), а затем нужно реализовать такие вещи:
- добавление животных на карту
- удаление с карты
- перемещение
- рисование карты
- съесть мышку
Заметь, что «съесть мышку» можно с помощью перемещения на ее клетку и удаления мышки с карты.
Нужны методы, которые это делают. Тогда ты сможешь писать более высокоуровневые вещи вроде выбора хода.
Для начала ты можешь сделать выбор хода по случайному принципу, но потом надо будет написать более умный алгоритм. Тут есть разные варианты, но обычно в таких играх используют рассчет очков. То есть, мы выбираем все клетки, на которые может сходить кошка/мышка, и для каждой рассчитываем число очков. Потом ходим на ту, которая дает больше очков. Вот по каким критериям рассчитываются очки (ты можешь добавить к ним свои):
- расстояние до ближайшей кошки/мышки (для кошки чем ближе тем лучше, для мышки чем дальше тем лучше). Это должно заставлять мышку ходить на наиболее безопасную клетку
- число кошек по соседству (мышка предпочтет клетку вокруг которой меньше кошек)
- число мышек по соседству (кошка предпочтет пойти туда где мышей больше и шанс их поймать выше)
- свобода хода: клетка, с которой можно сходить в любую сторону выгоднее чем клетка на краю поля или в углу, где легко попасть в ловушку
В классе карты тебе еще пригодятся вспомогательные методы вроде «найти всех кошек в определенном радиусе от точки».
Вот еще замечания:
- прочитай про модификаторы public/private/protected и исплоьзуй тут для свойств только private/protected.
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
> $this->animals[$animal->name] = $animal;
Не уверен, что стоит использовать имя в качестве ключа массива. Имена уникальны?
> class Map
> public $x = 100;
Если это ширина то лучше $width
В класс Game надо будет написать код, который считает ходы и каждый ход дает всем животным возможность сделать этот ход.
У нас то же: изучаешь сам язык, а потом библиотеки и фреймворки. сколько времени уйдет, зависит от тебя.
> Что и до какого уровня нужно учить, в чистом пхп
Сам язык включая ООП. Мануал: http://php.net/manual/ru/langref.php
>>394778
Пока что без трипкода обойдемся.
>>394807
Это сложная задача, на ней все спотыкаются.
> $creditBalance = $creditBalance % $month;
Это явно неправильный код. % берет остаток от деления, зачем ты пытаешься поделить долг на номер месяца?
Тут должно получиться около 61270
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
>>394778
Пока что без трипкода обойдемся.
>>394807
Это сложная задача, на ней все спотыкаются.
> $creditBalance = $creditBalance % $month;
Это явно неправильный код. % берет остаток от деления, зачем ты пытаешься поделить долг на номер месяца?
Тут должно получиться около 61270
Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.
Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.
Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
Если тебе трудно написать сразу, давай писать по частям:
- напиши код, который каждый месяц только увеличивает долг (и выводит его на экран)
- допиши к нему код, который каждый месяц пишет, большой сейчас долг (школьник не может его выплатить разом) или маленький (меньше 5000 и его можно выплатить за один раз)
- допиши код, который каждый месяц пишет, сколько надо заплатить в этом месяце (с учетом того что больше 5000 школьник заплатить не может)
- наконец, допиши код, который платит эту сумму, уменьшая долг и считает сколько всего выплачено
Это тред изучения PHP и веб-технологий. И мы здесь занимаемся именно тем, что написано в названии. Ты хочешь получить ответ на вопрос по PHP или решить задачку? Всегда пожалуйста. Ты пришел поныть про то, как тебе надоело писать однотипные магазины на битриксе? Тогда тебе надо набраться сил и поменять что-то в своей жизни, а не засорять наш тред.
Да и в разработке интернет-магазинов тоже есть интересные вещи. Если брать российских ритейлеров вроде ламода или ситилинк, то у них, как я понимаю, что-то свое, глубоко интегрированное с их внутренними системами.
Что касается примеров, которые ты приводишь (низкобюджетные магазины на готовых движках), то там все так плохо просто потому, что никому не интересно переделывать или оптимизировать их, так как люди с мозгами занимаются решением других проблем, а магазинные движки пишут кто остался. Плюс битрикс, как я понимаю, еще и с закрытым кодом и поменять там что-то в принципе нельзя. Вот тебе и приходится изобретать костыли.
Кто именно пишет битрикс? Я думаю, студенты. Откроем список вакансий и посмотрим какие высокие зарплаты (от 20 до 40 000 рублей) предлагают его разработчикам: http://www.1c-bitrix.ru/about/job.php
Давай на этом тему нытья закроем.
А про сложность хранения аж 50 000 товаров ты можешь рассказать компаниями вроде Ebay или Alibaba.
Ну и насчет «не больше <0,7 секунд грузилась любая страница» — почитай про длинный хвост ( http://royal.pingdom.com/2013/04/16/websites-performance-long-tail-real-user-monitoring/ ) — если ты это говоришь заказчику то скорее всего обманываешь его. Правильнее обещать попадаение какого-то перцентиля запросов ниже этого времени.
>>394861
Как все печально. В мое время инсталлятор был гораздо проще, а сейчас Оракл видимо решил о максимум усложнить жизнь бесплатным пользователям, еще и на регистрацию пытается развести.
Если у тебя не получится разобраться с инсталлятором, можешь поставить MariaDB: https://downloads.mariadb.org/ MariaDB — это форк MySQL, то есть по сути то же самое, с определенными улучшениями. Работает она также, только название другое.
Ну или можно ставить zip-версию с dev.mysql.com как описано тут: http://mysqlbugs.blogspot.ru/2014/08/basic-windows-mysql-installation.html
MySQL управляется настройками в ini-файле. Этот визард лишь позволяет задать их начальные значения, потому выбирать можно что угодно, а потом если что, подредактировать my.ini.
>тип конфига: server, development, dedicated.
development. Думаю, другие отличаются тем, что выделяют много памяти и разрешают много соединений, а development меньше.
> Порт 3306 и оставить? Named Pipe и Shared Memory нужно менять? Там сейчас MYSQL написано.
Оставить
> Юзера надо создавать? И если да, то какого? Там есть роли: разные админы (user admin, security admin, db admin, monitor admin и т.д.).
Админа наверно. Остальных можно из-под него создать если понадобится.
> Configure MySQL Server as a Windows Service?
да, установить как службу чтобы не запускать руками
> Run Windows Service as: standart system account или custom user?
стандартный
> Все логи нужны? Там general log, slow query log, bin log?
bin log я думаю не нужен, он для репликации используется.
> Server Id что ставить? Или без разницы? Там по-умолчанию 1.
Это наверно для кластера какого-нибудь, оставь по умолчанию.
MySQL управляется настройками в ini-файле. Этот визард лишь позволяет задать их начальные значения, потому выбирать можно что угодно, а потом если что, подредактировать my.ini.
>тип конфига: server, development, dedicated.
development. Думаю, другие отличаются тем, что выделяют много памяти и разрешают много соединений, а development меньше.
> Порт 3306 и оставить? Named Pipe и Shared Memory нужно менять? Там сейчас MYSQL написано.
Оставить
> Юзера надо создавать? И если да, то какого? Там есть роли: разные админы (user admin, security admin, db admin, monitor admin и т.д.).
Админа наверно. Остальных можно из-под него создать если понадобится.
> Configure MySQL Server as a Windows Service?
да, установить как службу чтобы не запускать руками
> Run Windows Service as: standart system account или custom user?
стандартный
> Все логи нужны? Там general log, slow query log, bin log?
bin log я думаю не нужен, он для репликации используется.
> Server Id что ставить? Или без разницы? Там по-умолчанию 1.
Это наверно для кластера какого-нибудь, оставь по умолчанию.
Неправильно так как в последний месяц ты платишь 5000 и сразу же 4138, хотя анон не может столько денег за раз выложить и должен ждать.
>>394886
Такими темпами ты станешь только мамкиным хиккой. В любом случае тебе изучать придется довольно много. Нода обычно используется для написания сетевых демонов типа чата, сайты и приложения на ней не делают (есть отдельные фанаты, но это именно фанатизм напоминает, так как это неудобно).
>>394891
Можно удаленно найти работу с большей оплатой, если у вас в городе разработчики не нужны, а у тебя хороший уровень. Можно переехать. Можно вообще на одеск пролезть и на американцев работать за американские деньги, с учетом падающего рубля это неплохо.
>>394909
Можешь решить — реши и покажи решение, его еще проверить надо.
Стоит читать, так как это тебе рано или поздно понадобится. Ну и представь, ты где-то на работе будешь обсуждать как сделать базу данных и предложишь глупый вариант просто потому что не знаешь про правильный.
> Call to undefined function mcrypt_create_iv()
Расширение с функциями криптографии не установлено очевидно на ideone.
>>394946
assertions (утверждения)
>>394955
> Клетка должна наследоваться от Поля?
Нет конечно. Что у них общего? Это разные вещи. Наследоваться может например Танк и Машина от базового класса Техника, а это не тот случай.
> Чтобы были общие методы - добавитьКласс, удалитьКласс
Это методы не должны быть ни в Поле, ни в Клетке, а отдельно. Это вспомогательные методы. У Клетки должны быть методы вроде показатьФлажок, заминировать, естьЛиМина, раскрытьКлетку, я думаю. У Поля методы вроде сгенерироватьМины, получитьКлетку по координатам. Еще где-то должна быть функция посчитатьЧислоМинВокруг. Наверно все же в Поле.
> Field.prototype.trim
Этого не должно быть в поле, нужен просто класс для вспомогательных функций, обычно его называют Util. Cделай отдельный объект util и метод util.trim например. Ну и попробуй понять, почему в Поле логично сделать метод вроде сгенерироватьМины, а trim нелогично. Потому, что каждый должен заниматься своим делом (и ты должен понимать какой класс для чего предназначен). Булочник не должен подстригать газоны, а садовник — печь хлеб или мешать тесто.
> Field.prototype.generateMines
Там у тебя бесконечный цикл получился. Ставить мины лучше наверно генерируя координаты случайно и проверяя, пустая ли клетка.
> cells[k][Field.MINE] = true;
Не лезь внутрь чужого объекта, а вызывай метод заминировать().
> function Cell(tr) {
Логично ячейку создавать в том же методе где создается таблица, а в Cell передавать ссылку на td.
> Call to undefined function mcrypt_create_iv()
Расширение с функциями криптографии не установлено очевидно на ideone.
>>394946
assertions (утверждения)
>>394955
> Клетка должна наследоваться от Поля?
Нет конечно. Что у них общего? Это разные вещи. Наследоваться может например Танк и Машина от базового класса Техника, а это не тот случай.
> Чтобы были общие методы - добавитьКласс, удалитьКласс
Это методы не должны быть ни в Поле, ни в Клетке, а отдельно. Это вспомогательные методы. У Клетки должны быть методы вроде показатьФлажок, заминировать, естьЛиМина, раскрытьКлетку, я думаю. У Поля методы вроде сгенерироватьМины, получитьКлетку по координатам. Еще где-то должна быть функция посчитатьЧислоМинВокруг. Наверно все же в Поле.
> Field.prototype.trim
Этого не должно быть в поле, нужен просто класс для вспомогательных функций, обычно его называют Util. Cделай отдельный объект util и метод util.trim например. Ну и попробуй понять, почему в Поле логично сделать метод вроде сгенерироватьМины, а trim нелогично. Потому, что каждый должен заниматься своим делом (и ты должен понимать какой класс для чего предназначен). Булочник не должен подстригать газоны, а садовник — печь хлеб или мешать тесто.
> Field.prototype.generateMines
Там у тебя бесконечный цикл получился. Ставить мины лучше наверно генерируя координаты случайно и проверяя, пустая ли клетка.
> cells[k][Field.MINE] = true;
Не лезь внутрь чужого объекта, а вызывай метод заминировать().
> function Cell(tr) {
Логично ячейку создавать в том же методе где создается таблица, а в Cell передавать ссылку на td.
Это тред изучения PHP. Ты не по адресу пришел.
>>394964
Обычно считают не среднюю скорость, а куда попадает 90-95% процентов запросов.
>>394972
Да. Тут есть такие варианты: http://ideone.com/5FjUrk
(что за дебильный спам лист? в моем ответе нет спама)
Используй формы:
http://php.net/manual/ru/tutorial.forms.php
http://htmlbook.ru/samhtml5/sozdanie-formy
плюс возможно нужна база данных если их надо сохранять.
>>395007
> Пытаюсь сделать подобие BB-кодов.
делать такие вещи на регулярках довольно глупо, так как будут баги и может быть уязвимости XSS (что такое: https://gist.github.com/anonymous/52adda0113428b274c64 ). У тебя в итоге будет ненадежный, небезопасны и запутанный код.
Правильный подход тут (этот подход не только для BB-кодов годится, но для разбора любых текстов с определенным синаксисом) — делать полноценный токенайзер и парсер с деревом как на картинке. Он может быть кажется сложным, но это самый качественный и надежный вариант. Если что-то непонятно, спрашивай.
Без ООП делать это неудобно. Также, хорошо бы написать к нему тесты.
Это очень плохой код так как ты вносишь SQL-уязвимость. Злоумышленник может вписать в качестве имени
'Ivan' , is_admin = 1; --
И при подстановке в
> UPDATE students SET first_name = {$read_first_name}
Будет запрос, который ставит всем пользователям флаг админа. А 2 минуса закомментируют отстаток запроса. SQL инъекция — одна из популярнейших уязвимостей, позволяет получить полный контроль над сайтом и популярна она именно из-за того что авторы числе старых учебников и статей не знали про то как правильно надо подставлять данные в запрос и писали неграмотный код.
Конечно можно вручную экранировать данные:
" UPDATE students sET name = {$pdo->quote($name)} ... "
но код получается очень унылый и запутанный и тебе быстро надоест писать quote.
Никогда не подставляй переменные прямо в запрос. Используй плейсхолдеры.
Мне нужен класс по работе с базой данных, нет? Названия файлов должны автоматом закидываться, а также их вес, рандомное число, которое будет ссылкой (или все таки генерировать на стороне php, а потом закидывать в базу?). Еще наверное поле "тип" нужно будет, которое будет определяться в соответствии с форматом файла, jpg - картинка например, mp3 - музыка. И запускать соответственные функции по типу файла.
Слышал много тут про PDO. Его стоит юзать? Где читать про него, или не про него?
Еще про schema.sql не понял. Вот обновилась у меня база после того, как я залил несколько файлов, я опять туда что-то должен руками записывать, или он генериться как-то должен?
Оп, я еще зеленый. Давай доступным языком.
Интересно. На сильно сложно самому вникнуть в это дело? Хотя чего я спрашиваю, все равно загуглю. На ООП умею кодить, проект с ним и сделан. Но мне трудно понять как это дерево строить. Токенайзер еще можно представить, а вот парсер... Хотя думаю гугл объяснит.
> Где читать про него
http://habrahabr.ru/post/137664/
http://php.net/manual/ru/book.pdo.php
> Мне нужен класс по работе с базой данных, нет?
Может быть, я советую использовать паттерн DataMapper
http://design-pattern.ru/patterns/data-mapper.html http://habrahabr.ru/post/198450/
> Названия файлов должны автоматом закидываться
Конечно, как иначе ты будешь выводить список файлов или организовывать поиск?
> рандомное число, которое будет ссылкой
база умеет сама генерировать числа, гугли AUTO_INCREMENT
> Вот обновилась у меня база после того, как я залил несколько файлов, я опять туда что-то должен руками записывать
Там хранится только структура таблиц то есть CREATE TABLE, а не данные, так что ничего менять не надо. А так, да, ручками ты его правишь если хочешь поменять что-то в структуре БД.
Вообще написание парсеров уже давно исследованная тема и все тут изучено:
http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
Тебе подойдет простой метод, назвается recursive descent (рекрсивный спуск). При его использовании синтаксис описывается в коде, для каждой конструкции делается своя функция. Вот пример синтаксиса для разбора математических выражений из чисел, плюсов и умножения вроде 2 + 2 4 + 5:
Допустим у нас есть классы Node_Number, Node_Sum, Node_Multiplication представляющие узлы дерева. Вот примерная идея (на самом деле код должен быть конечно в ООП стиле).
http://ideone.com/VZMoQD
Ох, надо все-это переварить суметь. Я, наверное, слишком тупой для всего этого.
Обгуглившись, я таки решил что не потяну. Не могу я все-же понять.
Нужно написать локально запускающийся скрипт на php который:
1. парсит эксель файл (xls), считывает значения
2. создает xml-файл, согласно формату
3. записывает данные в соответствии с форматом Яндекса
Тема - недвижимость.
Вот кусок xml-разметки на выходе:
[code]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<objects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
\t<object>
\t\t<original_id>1</original_id>
\t\t<contact>
\t\t\t<email>959857@mail.ru</email>
\t\t\t<telephone>+7(915)000-00-00</telephone>
\t\t\t<name>Иван</name>
\t\t</contact>
\t\t<category>208</category>
\t\t<theme>Аренда квартиры выгодно, Евро ремонт, мебель и бытовая техника</theme>
\t\t<description>полностью укомплектована мебелью и бытовой техникой а также все необходимое для комфортного проживания,
на любой срок, в том числе на короткий. Пустят всех, с детьми, с животными, адекватный хозяин.Также есть другие варианты.
Интересы собственника представляет агентство (посредник), оформление договора, отчетные документы.
звонки принимаются с 9.00 до 23.00 без выходных. В Остальное время вы можете отправить письмо.</description>
\t\t<price>
\t\t\t<unit>total</unit>
\t\t\t<value>23000</value>
\t\t\t<currency>RUR</currency>
\t\t</price>
\t\t<location>
\t\t\t<country>Россия</country>
\t\t\t<city>Санкт-Петербург</city>
\t\t\t<district>Адмиралтейский</district>
\t\t\t<metro>Садовая</metro>
\t\t\t<street>Садовая ул</street>
\t\t\t<house>7</house>
\t\t</location>
\t\t<square>
\t\t\t<total>46,8</total>
\t\t\t<living>25.4</living>
\t\t\t<kitchen>9,8</kitchen>
\t\t\t<unit_sq>sq_m</unit_sq>
\t\t</square>
\t\t<parameters>
\t\t\t<rooms>1</rooms>
\t\t\t<story>3</story>
\t\t\t<story_count>3</story_count>
\t\t\t<type_bild>кирпичный</type_bild>
\t\t\t<type_bathroom>1</type_bathroom>
\t\t\t<tech_8>y</tech_8>
\t\t\t<tech_4>y</tech_4>
\t\t\t<lift>3</lift>
\t\t\t<repairs>4</repairs>
\t\t\t<balcony>3</balcony>
\t\t\t<furniture>4</furniture>
\t\t\t<tv>1</tv>
\t\t\t<inet>1</inet>
\t\t\t<rooms_type>2</rooms_type>
\t\t</parameters>
\t</object>[/code]
\t
http://help.yandex.ru/webmaster/realty/requirements.xml - описание формата (в примере немного другой формат)
Кто-нибудь может осилить такой скрипт или может готовый уже есть? С меня вполне реальное бабло.
Асечка для торгов и предложений 312-343-973
Нужно написать локально запускающийся скрипт на php который:
1. парсит эксель файл (xls), считывает значения
2. создает xml-файл, согласно формату
3. записывает данные в соответствии с форматом Яндекса
Тема - недвижимость.
Вот кусок xml-разметки на выходе:
[code]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<objects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
\t<object>
\t\t<original_id>1</original_id>
\t\t<contact>
\t\t\t<email>959857@mail.ru</email>
\t\t\t<telephone>+7(915)000-00-00</telephone>
\t\t\t<name>Иван</name>
\t\t</contact>
\t\t<category>208</category>
\t\t<theme>Аренда квартиры выгодно, Евро ремонт, мебель и бытовая техника</theme>
\t\t<description>полностью укомплектована мебелью и бытовой техникой а также все необходимое для комфортного проживания,
на любой срок, в том числе на короткий. Пустят всех, с детьми, с животными, адекватный хозяин.Также есть другие варианты.
Интересы собственника представляет агентство (посредник), оформление договора, отчетные документы.
звонки принимаются с 9.00 до 23.00 без выходных. В Остальное время вы можете отправить письмо.</description>
\t\t<price>
\t\t\t<unit>total</unit>
\t\t\t<value>23000</value>
\t\t\t<currency>RUR</currency>
\t\t</price>
\t\t<location>
\t\t\t<country>Россия</country>
\t\t\t<city>Санкт-Петербург</city>
\t\t\t<district>Адмиралтейский</district>
\t\t\t<metro>Садовая</metro>
\t\t\t<street>Садовая ул</street>
\t\t\t<house>7</house>
\t\t</location>
\t\t<square>
\t\t\t<total>46,8</total>
\t\t\t<living>25.4</living>
\t\t\t<kitchen>9,8</kitchen>
\t\t\t<unit_sq>sq_m</unit_sq>
\t\t</square>
\t\t<parameters>
\t\t\t<rooms>1</rooms>
\t\t\t<story>3</story>
\t\t\t<story_count>3</story_count>
\t\t\t<type_bild>кирпичный</type_bild>
\t\t\t<type_bathroom>1</type_bathroom>
\t\t\t<tech_8>y</tech_8>
\t\t\t<tech_4>y</tech_4>
\t\t\t<lift>3</lift>
\t\t\t<repairs>4</repairs>
\t\t\t<balcony>3</balcony>
\t\t\t<furniture>4</furniture>
\t\t\t<tv>1</tv>
\t\t\t<inet>1</inet>
\t\t\t<rooms_type>2</rooms_type>
\t\t</parameters>
\t</object>[/code]
\t
http://help.yandex.ru/webmaster/realty/requirements.xml - описание формата (в примере немного другой формат)
Кто-нибудь может осилить такой скрипт или может готовый уже есть? С меня вполне реальное бабло.
Асечка для торгов и предложений 312-343-973
Извиняюсь, забегался что-то. Важно тебе сообщить, что скоро случится Laravel 5 (говорят, что в середине-конце ноября), и там немного меняется структура всего, добавляется несколько новых и важных вещей, поэтому то, что ты сейчас пишешь при обновлении на 5 будет работать только с костылями, но костыли — это плохо, поэтому надо будет переписать/дописать. По идее, там немного, может, на день работы, не знаю, но просто, чтобы ты в курсе был.
>Насущный вопрос - как забанчить свой валидатор вместо встроенных integer|max|min? Например, что бы моей функции передавалась проверяемая переменная, а я уже говорил тру / фолс
Сразу уточню, если правил очень много, можно создать папку в /app для валидации, но там нужно будет еще немного манипуляций проделать, спросишь потом, как, если понадобится.
1) Открываешь app/start/global.php, мотаешь в самый низ, под require app_path().'/filters.php'; вставляешь аналогичную строчку require app_path().'/custom_validators.php'; (ну или назови, как хочешь).
2) custom_validators.php создаешь на том же уровне, что и файл routes.php.
3) В самом файле создаешь правило примерно так:
Validator::extend('foo', function($attribute, $value, $parameters)
{
\treturn 'yoba';
});
Первый параметр — название экстеншона, то есть, название правила; второе — замыкание, где $attribute — имя аттрибута, который ты валидируешь, $value — его значение, $parameters — массив параметров, которые ты можешь добавить к правилу.
4) Потом это правило используешь, как и любое правило валидации:
$rules = array(
'name' => 'required|foo'
);
>>394257
>Еще вопрос - как проверить переданные в роутинг параметры, если он создан на контроллер командой
Я не очень понял вопроса, но мне кажется, что ты вот это ищешь:
Route::get('login', 'userController@getLogin');
Где userController — твой класс контроллера, а getLogin — функция внутри него. То есть, вот этот путь обрабатывает вот эта функция вот этого контроллера.
Извиняюсь, забегался что-то. Важно тебе сообщить, что скоро случится Laravel 5 (говорят, что в середине-конце ноября), и там немного меняется структура всего, добавляется несколько новых и важных вещей, поэтому то, что ты сейчас пишешь при обновлении на 5 будет работать только с костылями, но костыли — это плохо, поэтому надо будет переписать/дописать. По идее, там немного, может, на день работы, не знаю, но просто, чтобы ты в курсе был.
>Насущный вопрос - как забанчить свой валидатор вместо встроенных integer|max|min? Например, что бы моей функции передавалась проверяемая переменная, а я уже говорил тру / фолс
Сразу уточню, если правил очень много, можно создать папку в /app для валидации, но там нужно будет еще немного манипуляций проделать, спросишь потом, как, если понадобится.
1) Открываешь app/start/global.php, мотаешь в самый низ, под require app_path().'/filters.php'; вставляешь аналогичную строчку require app_path().'/custom_validators.php'; (ну или назови, как хочешь).
2) custom_validators.php создаешь на том же уровне, что и файл routes.php.
3) В самом файле создаешь правило примерно так:
Validator::extend('foo', function($attribute, $value, $parameters)
{
\treturn 'yoba';
});
Первый параметр — название экстеншона, то есть, название правила; второе — замыкание, где $attribute — имя аттрибута, который ты валидируешь, $value — его значение, $parameters — массив параметров, которые ты можешь добавить к правилу.
4) Потом это правило используешь, как и любое правило валидации:
$rules = array(
'name' => 'required|foo'
);
>>394257
>Еще вопрос - как проверить переданные в роутинг параметры, если он создан на контроллер командой
Я не очень понял вопроса, но мне кажется, что ты вот это ищешь:
Route::get('login', 'userController@getLogin');
Где userController — твой класс контроллера, а getLogin — функция внутри него. То есть, вот этот путь обрабатывает вот эта функция вот этого контроллера.
В этом и проблема, даже с тем что ты разжевал и с гуглом я не могу составить в голове как это должно быть сделано.
Попробуй начать с разбиения текста на массив токенов. То есть отдельно текст, отдельно начало тега, аттрибуты и закрывающий тег.
Для того чтобы срабатывало не всегда а при соблюдении указанного условия. Например если id состоит только из цифр или имеет определенный вид. Да что тут я распинаюсь, мануал же есть: http://laravel.com/docs/4.2/routing#route-parameters
Поправил как понял: http://ideone.com/maQnsT
только я не совсем понял. Он должен был все эти емейлы найти или какие-то из них фейковые? Сделал так что все что ты мне вписал он теперь находит.
http://ideone.com/B5ps87 - поиск опечаток. Знаю что в случае с двумя латинскими буквами в слове в разных его местах покажет только пол слова, но делал как на картинке, что бы подсвечивал скобками латиницу.
>>394201
>>394283
Спасибо за хинты. Сделал как вы подсказали и вроде всё работает. Правда единственное напрягает сильно когда дампишь какой-нибудь массив в html, то он его вместо ровного слолбика размазывает по строчкам. Не писать же собственную функцию-аналог с вставлением её в каждый кусок кода? запилить библиотеку и подключать её?
И как по поводу того, что бы создать новый тред, а то этот уходит в бамп лими.
И кстати, а можно делать вот так?
If (condtion 1 AND condition 2){
...
}
Ну на словах это будет вроде идем слева направо ищем "[", когда/если находим ищем "]" или "=" или " , /n, /t". Если первое то ищем "[/$tagname]", если находим разбиваем на токены как ...текст тегнейм тегконтент клозингтег текст... Пока это хотябы сделать. Но как проверять данные слева направо? Допустим хочу проверять строку по каждому символу на соответствия заданным символам. Как это делается? В моем случае, наверное, можно обойтись и strtok(), но с ним нельзя делить посимвольно. Как же?
http://ideone.com/Lp4zPQ
Исправил недочеты за исключением имен функций, потому что их редактировать долго.
Алсо, не понял, зачем ты хочешь, чтобы я использовал str_repeat, ведь функции нужно знать точное число повторений, которые нам придется предварительно вычислить. С while проще, разве нет?
Если на словах, тебе надо найти строку в которой поле email совпадает с проверяемым. В execute() исполюзуется анонимная переменная или как она там, а в prepare() дается массив в котором поочередно перечисленны эти переменные. Этот же способ лучше использовать при добовлении в базу данных пользователя, для экранировки. $database - это заранее описаный PDO - класс, типо этого: http://ideone.com/dmY4bK
http://jsbin.com/linisocipuqu/1/edit . Я пораскинул и решил просто вызывать в основной программе метод сгенирироватьМины(). По идее, там я никуда не лезу же?
Сделал задачу на корректировку пунктуации в тексте. Очень хочу послушать критику, так как думаю что мой подход с постепенным обрезанием предложений с помощью кучи мелких регулярок можно заменить чем-то другим. Как захерачить всё это в 1 регулярку я не знаю. Алсо первой сложностью с которой столкнулся это было то, что если бить предложения preg_split'ом, то терялись бы знаки пунктуации как . ! ? в итоге,, при склеивании их просто не откуда было взять. После того как обошел эту трудность накидал остальное за час. Ну и еще сложно было придумать как заменить в строке первую букву на большую. Ведь нельзя просто сделать
$string[0] = $firstLetter; пришлось в итоге к заглавной прилеплять всю строку без первой буквы. Такие дела.
а давай я вместо твоих задач пришлю тебе на почту код из реального проекта, опишу для чего он нужен и ты пояснишь мне по нему?
я начинал делать твои задачи месяца 2 назад, ты предсказуемо доёбываешься до запятых, и это не очень нравится. жалко времени на задачи просто ради кода, когда самого кода написано дохуища
Одна колонка например 23%, то бишь меню, а вторая колонка 77%, то бишь контент.
И так внутри контента и меню шрифт масштабируется под экран с помощью единиц измерения vw. А вот картинки, если задать им ширину 100% растягиваются на всю ширину контента, который 77%, то бишь больше своего размера исходного.
Все остальное на сайте выстроено либо в em, либо в процентах, где удобнее и предпочтительнее.
Нужно сделать резиновую картинку.
И еще на сайте нет ничего фиксированного. Все относительное. Поэтому внутрь фиксированного блока картинку не вставить.
Я просто с fetch и таким странным образом перебора не встречался, а про PDO и классы для работы с бд вчера уже читал и написал код, который правил сегодня. Я когда допишу и проверю на работоспособность закину сюда и спрошу еще пару советов
Хотелось бы найти еще какой-нибудь полифил для vw в ie8. Со скриптами наверно умру и просижу долго.
Но как красиво выглядит, когда текст остается все того же размера при любом экране. Может за этим будущее? Надо с резиной разобраться.
> Он должен был все эти емейлы найти
Все
Теперь все верно. Кстати, в квадратных скобках экранируются только символы [ ] ^ \ - а все остальные можно писать без бекслеша, в том числе точку и плюс.
> опечатки
Он у тебя ищет не опечатки, а любые английские буквы: http://ideone.com/CteSUA
А надо искать слова где смешаны буквы разных алфавитов.
> напрягает сильно когда дампишь какой-нибудь массив в html, то он его вместо ровного слолбика размазывает по строчкам.
Либо ставь content-type: text/plain; charset=utf-8 (это наверно лучше), либо перед var_dump сделай echo "<pre>"; — тег pre в HTML включает отображение пробелов и переносов строк. Ну или 3-й вариант, поставь расширение Xdebug — c ним все дампится нормально с переносами строк.
> как проверить мыло на уникальность?
Можно сделать уникальный индекс по колонке email — тогда база данных не даст вставить 2 одинаковых email. А также, перед добавлением искать такой email в базе запросом вроде
SELECT COUNT() FROM table WHERE email = ?
> И кстати, а можно делать вот так?
Можно только пишут обычно не AND а &&:
if ($a > 5 && $b < 6) { ... }
Подробнее в мануале: http://php.net/manual/ru/language.operators.logical.php
>>395265
Логичнее наверно COUNT() если тебе не нужны данные, а только проверить наличие записи.
Ты можешь искать регуляркой, есть такие варианты:
1. Делаем список всех возможных токенов (примерно так):
$regexp = "/(\[|\]|'[^']')|./s";
Точка в конце ловит все остальные символы. Флаг s позволяет точке ловить символ \n тоже.
После чего preg_split с флагом PREG_SPLIT_DELIM_CAPTURE чтобы все кусочки текста сохранились
2. делаем регулярку для поиска токенов и применяем ее с помощью preg_match в цикле, пока не обойдем всю строку. У функции preg_match есть параметр $offset, в байтах, он определяет с какого места строки надо искать текст.
3. Считать каждую букву токеном и разбить входной текст на массив букв.
Тут есть еще один момент: правила разбора текста и разбора содержимого тега разные. В тексте мы пропускаем любые символы пока не встретим начало тега вроде
[img или [/img
А вот внутри тега мы ищем аттрибуты вида attr="string" и закрывающую скобку. Второй вариант позволяет это учесть и использовать разные регулярные выражения. Третий вариант позволяет это учесть, но уже на этапе работы парсера.
Вообще, если ты посмотришь markdown парсеры (markdown — это как BB код но намного сложнее), то там код адский:
https://github.com/michelf/php-markdown/blob/lib/Michelf/Markdown.php
https://github.com/erusev/parsedown/blob/master/Parsedown.php
Этот код сложный, хрупкий и вряд ли кто-то кроме автора в нем толком разбирается. Вот видишь, что бывает когда люди вместо проверенных подходов изобретают велосипеды.
Вот еще код, тут все на классы разбито, но мне тоже не очень нравится: https://github.com/kzykhys/Ciconia
Я уверен, это можно сделать проще и логичнее.
Вот тебе еще вариант 4: в 2 захода. Сначала разбиваем регуляркой входной текст на теги и текст между ними:
hello, (i), world, (/i), (img src=...)
Затем на втором этапе проходимся по ним и разбираем теги регулярками на аттрибуты и название — и получаем в итоге большой токен. Ну а потом скармливаем массив токенов парсеру.
> потому что их редактировать долго.
Что значит долго? Если у тебя есть редактор кода (я надеюсь что есть ибо редактировать такой большой код прямо на ideone неудобно), то открываешь функцию замены, ставишь галочку «слово целиком» и меняешь. у меня на переименование всех функций максимум минуты 2-3 ушло бы.
> setHead
> $this->cofee = $this->cofee2;
Это плохая идея. Гораздо лучше сделать метод получитьПотреблениеКофе() который учтет босс это или нет. А значение cofee не менять.
> $this->pages = 0;
То же самое, это плохо так как мы теперь не можем при разжаловании в простые сотрудники вернуть прежнее значение.
> foreach ($this->data as $key => $worker) {
key тут не используется, значит писать его не надо
> public function addSingleEmployee($employee){
Тут бы тайп хинт нужен: (Employee $employee)
> return $this->data;
Думаю, это не нужно.
> Алсо, не понял, зачем ты хочешь, чтобы я использовал str_repeat, ведь функции нужно знать точное число повторений, которые нам придется предварительно вычислить. > С while проще, разве нет?
Без цикла проще и лучше чем с циклом. А вычисление сводится к одному вычитанию и может быть функции max, так что не вижу тут ничего сложного.
Ну и таблицу у тебя раскособочило, ты там перепутал col1 и col2 местами видимо.
Так, идея конечно у тебя правильная, но код неидеален.
> потому что их редактировать долго.
Что значит долго? Если у тебя есть редактор кода (я надеюсь что есть ибо редактировать такой большой код прямо на ideone неудобно), то открываешь функцию замены, ставишь галочку «слово целиком» и меняешь. у меня на переименование всех функций максимум минуты 2-3 ушло бы.
> setHead
> $this->cofee = $this->cofee2;
Это плохая идея. Гораздо лучше сделать метод получитьПотреблениеКофе() который учтет босс это или нет. А значение cofee не менять.
> $this->pages = 0;
То же самое, это плохо так как мы теперь не можем при разжаловании в простые сотрудники вернуть прежнее значение.
> foreach ($this->data as $key => $worker) {
key тут не используется, значит писать его не надо
> public function addSingleEmployee($employee){
Тут бы тайп хинт нужен: (Employee $employee)
> return $this->data;
Думаю, это не нужно.
> Алсо, не понял, зачем ты хочешь, чтобы я использовал str_repeat, ведь функции нужно знать точное число повторений, которые нам придется предварительно вычислить. > С while проще, разве нет?
Без цикла проще и лучше чем с циклом. А вычисление сводится к одному вычитанию и может быть функции max, так что не вижу тут ничего сложного.
Ну и таблицу у тебя раскособочило, ты там перепутал col1 и col2 местами видимо.
Так, идея конечно у тебя правильная, но код неидеален.
Сложно понять потому что ты не разбираешься в базах данных.
Тебе надо сначала изучить как работают база данных, я чувствую что ты эту тему проскочил. Вот, почитай ссылочки отсюда: https://gist.github.com/codedokode/10539213
Там и задачка есть для проверки как ты все усвоил.
> Util.prototype.trim
Это тот случай когда нужен статический метод, то есть метод, который вызвыается на классе, а не на объекте. То есть так:
var util = {};
util.trim = function () ...
Или так:
function Util() {}
Util.trim = ....
Тебе незачем тут создавать объект Util через new только ради того чтобы воспользоваться его функциями. Объект нужен там где есть какие-то свойства и где он прдеставляет каку-то сущность, а у Util нету свойств и он ничего не представляет, это просто набор вспомогательных функций.
Это паттерн класс-утилита: http://en.wikipedia.org/wiki/Utility_pattern
В языках вроде PHP для того чтобы объявить метод статическим есть слово static, в JS его нету и делают как я написал выше.
В остальном, пока все нормально.
> По идее, там я никуда не лезу же?
конечно, нет. «лезешь» это когда ты в свойства залезаешь, а методы можешь вызывать сколько хочешь.
>>395315
Вот про разделитель: http://ideone.com/AATurU
По коду: мне кажется, слишком сложно. Можно сделать замену так:
(любое число пробелов)(знак препинания)(любое число проеблов) -> заменяем на (ничего)(знак препинания)(один пробел)
> preg_replace('/\n/', '', $sentence);
\s включает в себя кроме пробела еще \t \r и \n так что \n там в строке не останется к этому моменту
> preg_replace('/^\s/'
есть же trim()
Код делающий первую букву заглавной, стоит наверно вынести в отдельную функцию. Зачем все одной портянкой писать.
> /\s[\s]+/
Это равносильно \s{2,}
> mb_substr($sentence, (-1mb_strlen($sentence)+1));
= mb_substr($sentence, 1);
В общем, тут много чего есть что можно улучшить.
В остальном, пока все нормально.
> По идее, там я никуда не лезу же?
конечно, нет. «лезешь» это когда ты в свойства залезаешь, а методы можешь вызывать сколько хочешь.
>>395315
Вот про разделитель: http://ideone.com/AATurU
По коду: мне кажется, слишком сложно. Можно сделать замену так:
(любое число пробелов)(знак препинания)(любое число проеблов) -> заменяем на (ничего)(знак препинания)(один пробел)
> preg_replace('/\n/', '', $sentence);
\s включает в себя кроме пробела еще \t \r и \n так что \n там в строке не останется к этому моменту
> preg_replace('/^\s/'
есть же trim()
Код делающий первую букву заглавной, стоит наверно вынести в отдельную функцию. Зачем все одной портянкой писать.
> /\s[\s]+/
Это равносильно \s{2,}
> mb_substr($sentence, (-1mb_strlen($sentence)+1));
= mb_substr($sentence, 1);
В общем, тут много чего есть что можно улучшить.
> пришлось в итоге к заглавной прилеплять всю строку без первой буквы.
Так и надо
>>395317
Ты можешь прислать код, конечно. Напиши тогда что тебе нужно.
> предсказуемо доёбываешься до запятых
Тут я не могу согласиться, мне кажется, что касается оформления, тут обсуждать нечего, что касается остального (логика программы, мелкие ошибки) то суть в том, что людям свойственно забывать часть того, что они изучают. Если мы будем заставлять их делать лучше чем требуется, то в итоге у них что-то останется в голове.
> жалко времени на задачи просто ради кода
Ты же про задачи из учебника? Если задачи из учебника, то они несложные, самые сложные вроде кошек-мышек делаются минут за 20-25 если хорошо знать предмет, а всякая мелочь вроде банкомата вообще в один присест пишется.
Я не думаю, что мои задачи плохие, так как аноны которые по ним учились, потом достаточно хорошо делали более сложные задачи вроде файлообменника и быстро все схватывали.
Судя по описанию, макет наркоманский какой-то. Обычно резину делают по-другому, например фиксированная левая колонка, а правая на всю оставшуюся ширину.
Ну и пропорции наверно будут плыть на разных разрешениях.
> А вот картинки, если задать им ширину 100% растягиваются на всю ширину контента, который 77%, то бишь больше своего размера исходного.
Ну значит надо не увеличивать их, а ограничивать размер, то есть width: auto, max-width: X;
Картинки — это так называемые replaced elements, то есть элементы у которых есть свой внутренний размер (а у картинок еще и пропорции: по умолчанию высота меняется вместе с шириной).
Не нужны скрипты. Просто сверстай страницу в ИЕ без vw чтобы она была читабельна и ей можно было пользоваться пусть и с фиксированным шрифтом.
>>395417
> Но как красиво выглядит, когда текст остается все того же размера при любом экране.
Я сомневаюсь, так как пользователи больших экранов может быть привыкли что у них больше информации помещается, а тут вдруг гиганские буквы выскакивают. Да и я не могу припомнить какого-то сайта где бы такое применялось. В общем, это надо тестировать и проверять еще.
Алсо, «резина» существует уже лет 15, она была задолго до CSS3. Размер шрифта тогда еще менять не додумались и просто подстраивали ширину блоков под размеры окна.
>самые сложные вроде кошек-мышек делаются минут за 20-25 если хорошо знать предмет
я бы потратил на это часы
и потом неделю исправляя твои замечания.
вот этих часов не и жалко.
другой вопрос:
что есть чтобы облегчить жизнь с яваскриптом?
была задача, было написано тысячи полторы строк яваскрипт кода на джквери.
я удивлён как это вообще работает. какие есть штуки чтобы упростить этот код, ну что-нибудь ангулара, но он слишком крут, как я понимаю, мне что-то более лёгкое нужно
>>394264
Объясните мне ещё раз, пожалуйста, почему слово иногда не выводится. Какое значение нужно для mt_rand, и почему count сбоит.
http://ideone.com/USw3e9
Ты генерируешь числа от 1 до 4, а надо от 0 до 3 так как индексы в массиве проставляются начиная с нуля.
И лучше не проставлять цифры руками, а использовать count().
> $str1_p1_rand
У нас в PHP используется камелкейс: $someThing, и тут для переменной можно придумать название попроще вроде $index1
> $strr3 = Я.' '.$str4.' '.$str5;
Буква Я должна быть в кавычках. Удобнее исопльзовать тут подстановку переменных:
echo "Я $word1 $word2\n";
> я бы потратил на это часы
Если ты начинающий, то, да. Но ты бы потратил эти часы не зря, а разбираясь с тем, как правильно создавать классы, свойства, методы в них, как организовать их взаимодействие.
Мы в треде никого не заставляем что-то учить. Если тебе некогда или неохота, ты можешь не делать эту задачу. Но задача же не просто так там дана, по ней очень хорошо можно увидеть, понимает человек ООП или еще нет, и соответственно можно объяснить те места, которые непонятны.
Будет довольно глупо, если ты например захочешь сделать какое-то другое, более сложное, задание и там будешь неправильно использовать классы. По хорошему, надо в таком случае попросить тебя вернуться к задаче про кошек, но у нас же тут анонимная доска и неясно, решал ты ее или пропустил.
> какие есть штуки чтобы упростить этот код, ну что-нибудь ангулара, но он слишком крут, как я понимаю, мне что-то более лёгкое нужно
Так это не работает. Если ты возьмешь просто 1500 строк кода и перепишешь его на ангуляр, ты получишь 1500 срок кода под ангуляр.
Я не видел этот код, потому сказать не могу. Angular позволяет за счет бандингов избавиться от кода, который читает данные из элементов форм, пересчитывает, и обновляет DOM. Если у тебя много такого кода, он поможет сделать его проще, если нет то не поможет, наоборот только усложнит жизнь.
Потому ответ на твой вопрос зависит от того, что это за код и что он делает. В общем можно только посоветовать код разбить на небольшие функции вместо портянки, ограничить глубину отступов, и избавиться от повторов — эти советы применимы к любому коду.
Ну и еще, если это код который работает и за который тебе уже заплатили/готовы заплатить то лучше всего ничего с ним не делать.
1500 — немного, кстати. Я писал гораздо большее приложение, не на jQuery, а на яваскрипте, использовал модули (AMD) чтобы разбить его на небольшие файлы.
Как это написать? Какие функции использовать?
Чем один лучше другого?
Желательно вид со стороны менеджера, типа:
"вот заебошили проект на 1к часов на Yii, заебались с Active Record";
"Laravel это не просто тренд, мы на нем проекты по 600 часов уже второй год пилим и все здоровы, зависимость есть";
"Делаю визитки на Zend, подходит идеально, потому что ..."
У меня похожая проблема.
>Call to undefined function yii\web\mb_strlen()
В php.ini раскомментировано:
>extension=php_mbstring.dll
Апач перезагружен.
Сам файл лежит, где положено: C:\php\ext.
В консоли пишу php -m и вижу mbstring.
В тестовом index.php пишу phpinfo() и в выводе mbstring среди модулей нет.
Что ещё сделать?
Это копия, сохраненная 7 ноября 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.