24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию. Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492 ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет. Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
>>588512 (OP) Еще. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults() - Название функции начинается с глагола, в стиле «сделайЧтоТо» - не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там - в именах классов используется CamelCase, первая буква большая, «_» может использоваться - мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек - мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?» Не годится: «В гугле забанили?» Не годится: «Твой код плохой» Хорошо: «Вот, как можно улучшить этот код: ...» Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Не придирайся к знанию английского языка.
Объясняй
Не очень хорошо: «сделай как в этом коде» Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)» Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
>>588513 Собственно ОП традиционно заслоупочил с созданием нового треда. А мне не хочется чтобы вопросы анонов уходили на 5 страницу /pr Так что создал новый тред. Надеюсь ОП прошлого треда меня не возненавидет за это.
Анон, что ты умел, когда пошёл на самую первую работу с php? Что мне стоит уметь сейчас для того же самого? Чем ты занимался в начале? Не надо только отвечать "php+mysql", нужно более конкретно. Спасибо.
>>588514 > 4 пробела Я расстегнул ширинку. Открой рот пошире, чтобы не пропустить ни 1 капли. У тебя на клавиатуре есть кнопка TAB, дебил. Когда ковыряешь чужой код - просто выворачивает от того, что там пробелы вместо табуляции. Ух, сука! Лично бы выебал каждого, кто использует пробелы, в жопу, чтобы знал, что нужно ставить табуляцию. Пидоры, блядь. Говно, залупа.
>>588613 лол, тоже топлю за табуляцию, н очаще всего по дефолту в IDE стоят именно 4 пробела по нажатию на tab. Вообще надо смотреть PSR стандарт, вроде там пробелы, как раз.
>>588514 А за эту картинку надо убивать нафиг. НАХУЯ ТАМ ДВОЙНЫЕ КАВЫЧКИ??? Одинарные, там нет переменных, заботьтесь о нагрузках, мать вашу.
Я не понимат. У меня есть некая библиотека helper, использующая паттерн factory. В своем приложении я написал функцию getHelper для получения хэлпера. function getHelper() { $helper = helper::factory($params); return $helper; } Вопрос: мне нужно в моей функции объявлять static $helper или factory и так мне всегда будет возвращать один объект?
Правильно ли я понимаю, что красно-черные деревья и логарифмы нам не понадобятся? Алсо не помешали бы задачки на выполнение условий KiSS DRY SOLID. А то теория в вики какая-то туманная.
>>588624 По стандартам вроде нужно ВСЕГДА двойные ставить, кроме исключительных случаев. Тоже всегда одинарные ставлю, а потом одергиваю себя и переставляю двойные.
Я вот не могу понять, как стать фрилансером. Выучил я ПХП, немного подучил яваскрипт и джейквери (достаточно для создания стандартных эффектов на сайте), более менее разобрался с вёрсткой, ну например что то лёгкое могу сверстать из PSD, слегка разобрался с некоторыми КМС вроде Вордпресс. как мне например заиметь портфолио на фриланс-бирже? Для того чтобы создать более менее нормальное портфолио, необходимо уметь в дизайн, то есть красиво рисовать в фотошопе а потом переносить всё это в ВЕБ, фотошоп я почти не знаю, да и просто нарисовать ничего красивого не смогу, потому что нет способностей к этому. Как выйти из этой ситуации, я не могу быть фрилансером?
>>588970 Да препод придрался к тому, что я сделал сортировку через asort и зставил делать ПУЗЫРЧАТУЮ СОРТИРОВКУ алгоритмом, я вот и не понял, как эта фигня работает.
>>589015 Ну когда то она была очень даже ничего. Хороших книг по PHP для начинающих нет. Или старое говнецо или вариация офф. мануала. >>589035 Потому что первый индекс массива это 0 а не 1. Соответсвенно последний индекс массива равен количеству элементов - 1.
ананасы, выручайте, впал в ступор, прошел курс по пхп на кодакадемии и почитал мануальчик от Опа, но теперь не знаю, что делать дальше. Многие советуют начать писать что-нибудь свое, но я даже не знаю, с чего начать. Нужен дельный совет,с меня как всегда
Практически доделанный файлообменник. Осталось только соль добавить и инфу о картинках в порядок привести. Все, что не смог сделать (слим композером, чтобы автолоад был, твиг добавить) - сделать не получилось. $app прямо в классы передаются, потому что написали, что надо было контроллеры подсократить, ну и это единственный способ был. Переименовать тоже не могу, ибо в сборке ИДЕ он уже как твигблог записался. В конечном итоге, переименовать могу только устанавливая на хостинг. Если есть какие-то уязвимости - напишите плиз.
Допустим мне дают задание, допилить какой-нибудь функционал на сайте. Я так понимаю, что обычно дают доступ по ssh? Там можно как-то контроль версий прикрутить, чтобы ненароком не убить сайт полностью?
>>589422 >Хочу реальные задачи решать и чувствую, что я готов. ну вот тебе реальная задача. Есть бд. Есть приход товара и уход. У каждгого товара есть уникальное имя. На склад пришло 500 товаров и ушло 480. Нужно найти оставшиеся 20 и вывести их имена. Когда товар приходит - в бд появляется запись "Товар Игорь. на склад получен". когда уходит - "Товар Игорь. со склада отгружен". Естественно товар игорь и состояние отгрузки - разные ячейки.
И ещё, сделать это всё надо без использования SQL излишеств типа JOIN Делай.
>>589441 Из "реальности" задачи здесь только неспособность заказчика грамотно сформулировать условие.
По сути есть таблица учета товаров. В ней колонка "Состояние" с enum ("На складе", "Отгружено"). Выбрать нужно товары доступные на складе на данный момент. Запрос будет элементарный типа SELECT x FROM warehouse WHERE status = "in stock". Что касается джойнов, то тут вопрос к проектированию базы, логичнее как раз каталог товаров хранить в отдельной таблице, а в таблице с учетом товаров на складе хранить только внешний ключ на описание товара. Но если приложение простое то наверное информацию о товарах действительно лучше хранить прямо в учете склада.
>>589587 Потому что планировали сделать шестую несколько лет назад, даже учебники по ней успели выпустить, а потом передумали. Чтобы не было путаницы.
>>589438 Теоретически можно но на практике адекватные люди так делать не будут, значит работу с такими навыками ты сможешь найти только у неадекватных. Посмотри сам вакансии - в каждой требования ООП, MVC а иногда и SOLID вдобавок.
Потренироваться в ООП можно на задачах из Оп поста Про вектор и кошек-мышек.
>>588566 Когда осилил написать два плагина на wordpress, первую задачу с ЕГЭ для студентов и фронт-енд на уровне, фикса багов и мелкой вертски. Устроился дали учить magento
>>589588 Нет, я имею ввиду что если это приложение для предприятия уровня ИП "Вован и ко", то все можно свалить в одну денормализованную таблицу вида id | название товара | еще колонки с описанием товара | дата поступления на склад | статус | дата отгрузки | количество
Ну у человека в условии джойны названы "излишеством", значит перед нами очевидный быдлосайтец, где тебя не только не поблагодарят за качественную схему базы или ооп-код, а наоборот выдвинут претензии за "лишнюю" сложность.
Тут такая дилемма: мне нужно, чтобы в имени файла присутствовало его айди из таблице. Но для того, чтобы узнать его айди, мне нужно его сначала добавить в таблицу. А чтобы добавить его в таблицу мне нужно знать его имя.
>>589622 Ты собрался дублировать айди в колонке, где хранится имя файла? Это не нужно делать, я понимаю что тебе ради уникальности нужно добавить какой-то суффикс к имени реального файла на диске, но в базе этого делать не нужно. В базу сохраняй имя файла (из массива $_FILES), lastinsertid вернет тебе его идентификатор. Присоединяешь этот id к имени файла и сохраняешь на диск под этим именем. При обращении к файлу получаешь его имя при помощи нехитрой операции типа "{$file->id}_{$file->name}". Копипастить эту штуку по представлениям и контроллерам естественно ни в коем случае нельзя, сделай метод getName у модели File, который будет возвращать имя.
Этот алгоритм не помешало бы завернуть в транзакцию. Потому что например приложение может успеть добавить запись в таблицу, но упадет и не успеет сохранить файл на диск. Или в случае если нет прав на запись в папку download, будет писать в таблицу а файлы не сможет переместить. Так что используй транзакции. http://php.net/manual/ru/pdo.transactions.php
>>589599 А что значит "дали учить"? Что прям ничего не делай, сиди и учи? Как сильно вообще гоняют джуниоров, сильно ли загружают? Я например опасаюсь что приду и меня сразу нагрузят работой и будут требовать выполнения в сжатые сроки, а я чего-то не буду знать и буду гуглить по полдня.
>>589654 Да, примерно так. Сказали, создай екстеншен, что делать и как, что не понятно гугли, потом спрашивай. Не, нормальные люди так делать не будут. Тем более ты сам говоришь сколько времени нужно(у нас так)
>>588512 (OP) Скажем решил я написать один сайт на друпале, и мне нужно добавить новый content type. Как лучше это сделать, написать отдельный модуль, который сам добавляет content type, а при удалении за собой чистит, или просто добавить этот тип в гуе?
Слышал, что перед тем как верстать из PSD, да и вообще верстать сайт, надо прописать какие-то стили, которые нейтрализуют все стандартные отступы и всё остальное, а также подключить все необходимые скрипты на js. Где можно почитать как это правильно делать?
>>589422 Давали, но у меня такой разрыв жопы случился, когда я увидел то говно и что нужно было сделать, что я уже удалил этот "проект". Могу тебе устно пересказать.
>>588512 (OP) Ковыряю Опенкарт. Что-то даже не могу понять, на какой имейл отсылаются данные в разделе Contact us. Вьюхи прямо в темплейтах переделывать под другую верстку?
Пишу курсовую, где мне нужно базу данных подключить к простенькому сайту на пхп и хотелось бы поинтересоваться, существуют ли какие-нибудь готовые примеры с правильным кодом? Хочется увидеть как реализуются те или иные функции, а то вставлять костыли то тут, то там уже надоело.
>>589550 >работать с этой самой бд? Вы только посмотрите на него. Кто в здравом уме даст доступ к своей базе данных, ещё и рабочей. Какому-то сосачеру анонимусу который даже портфолио не имеет? Все данные для решения задачи у тебя есть. Если бы захотел - построил бы базу из 2 полей сам, сложного ничего нет. А так от тебя одни отговорки. Считай первое же задание рабочее ты провалил.
>>589584 >логичнее как раз каталог товаров хранить в отдельной таблице Нет. Каждый товар уникален и не имеет повторений. Каталог на них делать - вообще нет никакого смысла! Я имею ввиду вообще каждый. Тоесть нет в базе даже 2 одинаковых коробков спичек. У них просто 2 разных имени! >Что касается джойнов джойны - это плохой тон в SQL. Как goto. Об этом ещё Бобук говорил. Безсмысленные нагрузки создаёт там, где всё можно решить просто работой на стороне клиента.
>>589605 >Ну у человека в условии джойны названы "излишеством", значит перед нами очевидный быдлосайтец, где тебя не только не поблагодарят за качественную схему базы или ооп-код, а наоборот выдвинут претензии за "лишнюю" сложность. И это в то время, как 80% новых СУБД построенных после 2012 года как раз стараются максимально отказаться от джойнов?
> джойны - это плохой тон в SQL. Как goto. Об этом ещё Бобук говорил. Безсмысленные нагрузки создаёт там, где всё можно решить просто работой на стороне клиента. А вот это плохо тебя характеризует. То есть инструмент специально придуманный для объединения данных из разных таблиц, а ты предлагаешь его не использовать, и написать свой велосипед который с большой вероятностью будет еще и хуже работать.
>>590188 >>590104 >XML Кто-нибудь подскажет мне что работодатель этим хочет сказать? Зачем это вообще знать? По моему сколько работодателей, столько и разных вопросов по XML. И каждый его вертит как хочет. Кто-то его в андройде юзает по своему, кто-то в 1с, кто-то на него вешает самопальное подобие екселя. В любом случае новый работник будет просто недели 2 вникать что там наворотили. Отсюда мне вообще непонятно это требование.
>>590241 >а ты предлагаешь его не использовать, и написать свой велосипед который с большой вероятностью будет еще и хуже работать. Джойн как раз и есть велосипед который очень плохо работает. >А вот это плохо тебя характеризует. Когда у тебя в парочке таблиц по 5 миллионов записей... Попробуй как-нибудь сделать джойн. Если у тебя не облако - сервак вполне может просто затупить минуты на 2-5. Я не говорю что у меня такая БД. Но именно те, кто юзают например финансовые бд, почему-то как огня боятся всяких Join.
Делал джойны на миллионных таблицах. Не тормозило. Ты наверно просто не знаешь про способы оптимизации, как они выполняются итд.
И еще, если на сервере джойн выполняется 5 минут то в твоем приложении он будет выполняться еще дольше, тебе ведь надо сделать все то же самое, а перед этим 5 млн записей выкачать из базы, да и памяти будет есть много все это.
> Но именно те, кто юзают например финансовые бд Ты ведь в этой теме совсем не разбираешься, зачем фантазировать начинаешь? Или ты под финансовыми БД 1С подразумеваешь?
После HTTP можно переходить к curl. Кстати пользоваться им напрямую довольно неудобно, я бы советовал нормальный ООП-ориентированный клиент вроде Guzzle 5
Также, держи задания на XML:
----------------
XML довольно важная тема, так как это очень распространенный формат.
> пару слов об xml XML это формат для обмена данными (например интернет-магазин через XML может передавать данные о товарах и ценах в яндекс-маркет) и хранения данных (например конфиг с настройками программы может использовать формат XML). XML поход на HTML внешне, но в общем это отдельный не связанный с ним язык, отличия такие:
1) элементы и атрибуты XML не имеют никакого преопределенного смысла, ты сам решаешь что обозначает тот или иной тег 2) HTML используется для разметки веб-страниц (то есть тегами мы показываем что тут ссылка, тут заголовок, тут картинка), XML для произвольных данных 3) В XML все теги должны закрываться, есть самозакрывающиеся теги ( <x/> ), регистр букв в именах важен 4) В XML есть неймспейсы
Можно ли обойтись без XML? Можно изобрести свой формат, но вот что ты теряешь: другие разработчики не слышали про твой формат, а про XML слышали, для XML есть готовые парсеры/генераторы для многих языков, валидаторы, редакторы с подсветкой и автодополнением, визуализаторы, схемы. То есть для XML существует огромная инфраструктура для работы с ним и изобретать в таких условиях велосипед будет только неграмотный разработчик.
Благодаря популярности и инфраструктуре XML используется в перевую очередь в различных API для обмена данными между системами.
Неймспейсы нужны для того чтобы можно было объединить несколько документов в одном. Допустим 2 разработчика используют XML для описания товаров. Вася тегом <total> обозначает число товаров на складе, а Петя — цену товара. Если мы соединим вместе документы в Петином и Васином формате, получится неразбериха:
Ну разве не умно? Если каждый будет использовать для неймспейса свой домен то они гарантированно будут уникальными. Неймспейсы могут применяться как к элементам так и к аттрибутам. Их можно не использовать, если тебе не нужен этот функционал. Почитать: http://gberman.narod.ru/xmllections/ns/namespace.htm
Схемы XML. Схема (или DTD) — это машинночитаемое описание формата. Помнишь, я написал, что в XML смысл и правила использования тегов и атрибутов ты задаешь сам? Схема позволяет тебе описать эти правила, описать какие теги можно использовать, какие у них атрибуты, какие значения, как их можно вкладывать. Схема может использоваться для автоматической проверки данных на правильность, а также как документация (которую прочтет человек и поймет что к чему). То есть если какая-то система принимает данные в XML, разработчики обычно выкладывают схему с описанием данных.
Схемы, как ты надеюсь уже понял, тоже огромный плюс XML. Имея схему ты можешь легко проверить соответствует твой XML требованиям системы или нет.
Еще есть такая интересная технология, как XSLT. Это язык преобразования XML-документа в другой XML- или HTML-документ. Правила преобразования также описываются в формате XML.
Также, есть такая вещь как XPath. Это язык запросов для поиска элементов в документе.
Для работы с XML в PHP есть расширения: DOM, SimpleXML (надстройка над DOM, с ограничениями), и потоковые XML Reader и XML Writer. DOM строит полную структуру документа в памяти и годится для небольших файлов (до десятка мегабайт). Потоковые библиотеки позволяют работать с гигантскими файлами (например картографическими файлами проекта Open Street Map, который создает открытую карту мира: https://www.openstreetmap.org/relation/2555133 . Файл с Россией весит там 2.5Гб в сжатом виде).
-------------------
Задания (для их выполнения надо освоить HTTP, curl, Guzzle, XML):
-------------
Ну есть такие задачи на XML (ты ведь имел в виду расширение PHP DOMDocument):
1) скрейпинг (дана HTML-страница с сайта объявлений, надо с помощью DOM разобрать ее содержимое), сложность: несложно, быстро 2) геокодирование и использование Yandex Maps API (дан адрес, проверить, правильный ли он и определить район и ближайшую станцию метро), сложность: посложнее, но дает ценные знания 3) работа с ФИАС (сначала придется скачать 1.5 Гб архив с базой), надо скриптом разобрать базу и составить список районов и городов нашей страны. Огромную базу таких размеров в память не засунешь, надо исхитряться, например, с помощью XMLReader. Ну или если тебе не нравится ФИАС, можно сделать что-то аналогичное с OpenStreetMAp, например, распарсить оттуда координаты остановок автобусов.
Могу еще придумать задачи на XSLT и XSD/relax NG, если тебе интересна тема XML.
В общем, самой реалистичной из 3 задач мне кажется вторая.
1) Пользователь вводит адрес в одной из столиц (Москва или Спб — выбери сам), скрипт определяет район города и ближайшее метро.
Первым запросом ты определяешь координаты по адресу (и существует ли адрес). Вторым обратным запросом, определяешь район и метро по координатам. Для запросов используется формат XML, так что использовать придется DOM или SimpleXML (и наверно XPath для поиска узлов). Для отправки запросов тебе нужен HTTP клиент, в минимальном варианте достаточно file_get_contents или curl (но лучше конечно использовать нормальный клиент вроде Guzzle). На бесплатном хостинге запросы наружу отправлять нельзя, так что наверно лучше запускать скрипт из командной строки или на своем компьютере.
Не пиши скрипт простыней, разбивай на маленькие функции.
Надо загрузить ее HTML-код в DOM ( http://php.net/manual/en/domdocument.loadhtml.php ), распарсить ее, например, с помощью Xpath, и получить массив объектов JobOffer с полями: title (название вакансии), minSalary, maxSalary (0, если не указана), company (название компании), address, publishDate (дата публикации в вие объекта DateTime).
То есть HTML волшебным образом превращается в массив объектов, с которыми можно нормально работать, например, вывести список с помощью echo.
Не нравится парсить вакансии? Парсь торренты: www.nyaa.eu/?page=search&cats=0_0&filter=0&term=watamote , надо создать массив объектов TorrentFile с полями category (одна из констант), title, torrentUrl (ссылка скачивания торрент-файла), size (числом), seeders, leechers, downloadCount
Честно предупрежу, HTML на сайте hh.ru адский и торренты вроде проще. Ну и для скрейпинга страниц удобнее использовать имитирующие jQuery библиотеки вроде phpQuery или Simple DOM HTML, но для изучения XML лучше будет использовать именно DOM и XPath.
>>590240 Вот, кстати, поясните за Джойны. Например, ОП говорил, что под каждую сущность должен быть свой дата маппер и модель. Т.е. своя отдельная таблица под товары и например их владельцев. В дата маппере выборка делается только для одной сущности, потому что модель для каждого дата маппера - только для одной сущности. Т.е. джойн там никак не запихнешь. Как например в моем обменнике такой запрос для комментов: "SELECT * FROM comments WHERE file_id = :file_id ORDER BY id DESC" file_id - это внешний ключ идентичный id файла в таблице.
>>590254 Видимо они собираются взять одну таблицу, сделать выборку, потом к этой же таблице сделать джойн. Лол. Я тоже не понял этого наркоманства чесно говоря.
Вообще, я тут подумал и это у тебя скорее не дата маппер, а Table DataGateway (урок на гитхабе обновлен, загляни в него).
Делать джойны к другим таблицам можно. Например если ты хоешь выбрать файл + все комментарии к нему сразу, это вполне можно сделать в классе работы с таблицей файлов.
>>590253 >Ты ведь в этой теме совсем не разбираешься, зачем фантазировать начинаешь? Или ты под финансовыми БД 1С подразумеваешь? Ну вот, унижения пошли. Вообще имел опыт работы со SWIFT. (Если не знаешь что это - погугли. Кратко - все данные по всем картам Visa, MasterCard и прочим.) У них примерно 2.6. миллиарда записей в год. Так что думаю эти ребята знают толк в джойнах, и в том, как именно они нагружают систему. У них все джойны были на стороне клиента. Это оказалось гораздо проще! Могу рассказать почему если хочешь.
>>590258 Я не смотрел урок. Но в теории можно сделать "SELECT Filenamecomments from komments WHERE filename = 'Рандомное имя файла'" Не совсем понимаю на кой тут вообще Join? И куда его лепить?
>>590253 Иногда ОП печатает так много текста на какой-то банальный вопрос, что мне хочется подойти к нему и обнять. А потом угостить его вкусным чаем. мимо другой анон
В класс работающий с таблицей комментариев конечно.
> Не совсем понимаю на кой тут вообще Join? Ну например тебе надо найти пользователей у которых объем загруженных файлов больше опр. величины и которые зарегистрированы больше месяца назад. Тут с джойном задача легко решается.
>>590241 > Алсо, почитай статью про СуБД без джойнов: http://habrahabr.ru/post/231213/ >Делать приложение на рельсах >Соцсеть >На документированной БД >Соцсеть! Ребятам явно сначала надо было закончить университет. В особенности курс по СУБД. Прежде чем заниматься подобным.
>>590258 Ну смотри, допустим мне нужен один файл, выборку которого я делаю по токену (который передается в контроллер). Т.е. во время совершения этого запроса я еще не знаю id файла, он будет мне известен после выборки, когда массив результата распарсится. Как же я в этом же запросе приджойню коменты? $sql = "SELECT * FROM files WHERE token=:token";
>>590278 Как ты себе это представляешь? Таблицы связаны по id в файлах и file_id - колонка в комментах, которые идентичны. SELECT * FROM files where token = :token JOIN comments ON files.id = comments.file_id
>>590282 И да, это еще не говоря о том, что массив данных для файла у меня парсится в одном классе, а комменты в совсем другом. А этот запрос вернет мешанину. И придется смешивать классы для парсинга файла и комментов, что приведет к каше. И это нарушит всю логику приложения и работы с дата маппером для комментов.
> что массив данных для файла у меня парсится в одном классе, а комменты в совсем другом Это можно решить вызывая метод того класса.
> И придется смешивать классы для парсинга файла и комментов, что приведет к каше. Доктрина как-то решает эту проблему. Она умеет делать запрос с джойнами и выделять отттуда отдельные сущности, да еще и связи между ними настраивать.
В общем эта проблема решаема. Другой вопрос что в твоем простом приложении это наверно лишние сложности.
И это кстати объясняет почему стоит использовать готовую библиотеку-data mapper вроде doctrine 2: там эти проблемы уже решены.
>>590235 >Считай первое же задание рабочее ты провалил. Нахуй кому-то решать задачи бесплатно для макаки, которая называет join'ы излишеством? Это что уровня "Памагите сделать за меня лабу, мне через час сдавать".
>>590295 >Это что уровня "Памагите сделать за меня лабу, мне через час сдавать". Ну простите что тут вам не дают задач по написанию фэйсбуков. Такова жизнь. И большая часть программирования состоит из решения вот таких задач.
>>590295 >двачь, у меня нет опыта, хочу какую-нибудь рабочую задачку решить. Чувствую что готов. >Вот тебе реальная задача. >Чёт мне твоя задача не нравится. И решать её как-то мне не хочется. Да и условия по решению какие-то стрёмные. >Ну не решай. >И вообще ты хрен какой-то и денег мне платить не хочешь. Да и задачу стрёмную предложил чёт, на уровне лабы. Вот как я вижу всю эту переписку.
>>590299 >Вот как я вижу всю эту переписку. Читай внимательнее >на фриланс сайтах, а не двощах. Этот опездал вместо того, чтобы ответить на вопрос решил повыебываться, подсунув мне задание с которым он сам не смог справиться, с надеждой на то, что я её решу, а он просто спокойненько отправит её на тест.
>>590409 Будешь знать - готов ты или нет. Ну и немного кода для портфолио. Можешь также попробовать устроиться в эту компанию, они вроде до сих пор ищут.
>>590551 Тоесть ты скрываешь что у тебя есть опыт из-за NDA? Ты не врёшь, ты уже нагло запизделся просто. К тому-же я и сам так работаю, что однако не помешало мне создать мало мальское портфолио в свободное от работы время.
>>590555 >Джунам достаточно уметь делать хелловорлды. Нет. Алсо 4. Хранение в БД MySQL. Я конечно понимаю с какой целью... но всё-таки уточню. Как это может применяться?
Что-то я разочаровываюсь. Сначала кажется, что натянуть верстку на ЦМС - просто непосильная задача, но потом, разбираясь в темплейтах, оказывается, что это гораздо легче, быстрее и удобнее, чем писать аналогичный сайт с нуля. Но при этом это совершенно не творческий подход. Неужели вся задача phpшников и заключается в таком вот натягивании тем и ковырянии гуя?
>>590554 Как я могу себе добавить в портфолио часть функционала на сайте? Весь сайт же не я делал. Что, мне писать "на этом сайте формочка, на том геолокация, здеся я ещё страницы поверстал"?
http://m.habrahabr.ru/post/271795/ - игра в балду на SQL (кто хочет может сам попробовать написать запрос который проанализирует таблицы с состоянием поля и словарь и выберет подходящий ход)
>>588512 (OP) Ищу годный фак по yii для домохозяек на русском, помогите найти. В гугле какие-то бложики заточенные под адсенс и недописанные статьи на хабре.
Может нахуй этот yii? Какой фреймворк попроще и вообще дружелюбней? Учу потому что в вакансиях требуют, писать буду магазин с резиновыми хуями.
Анон, вопрос по регулярным выражениям. Как проверить то, что в тексте отсутствует запятая. Допустим во фразе "я был а она нет", запятая перед "а" отсутствует. Как это проверить?
>>591027 >кто хочет может сам попробовать написать запрос Я больше на это не куплюсь.
>>590660 Да, вот этот момент скользкий. Как заставить человека, реализующего наш абстрактный класс, использовать исключения, причем нашего класса? Видимо никак, только в ридми накидать пару строк своими словами.
>>590654 >Исключения это часть интерфейса твоего класса или метода Согласен. Хотя в данном случае универсальное исключение будет служить получается только как обертка, чтобы его удобно было ловить при смене клиента или драйвера бд. >Если клиент редиса при получении ERR выкидывает исключение - хорошо. Да, удалось разобраться при помощи эксперимента: специально вызвал ошибку (ltrim на строке) и проследил в стеке вызовов где было выброшено исключение. Кстати, это xdebug пишет этот стек, или так было всегда? Так вот, исключение под названием Rediska_Connection_Exec_Exception (казалось бы, при чем тут соединение? я бы из названия подумал что это ошибка соединения) выпало в методе readResponseFromConnection. https://github.com/Shumkov/Rediska/blob/master/library/Rediska/Connection/Exec.php#L274-L275 Так что да, редиска вроде адекватно реагирует на исключения, смотрит первый символ ответа, и если это '-' (в протоколе RESP означает ошибку), то выбрасывает исключение. >придется по диагонали почитать ее код. Если ты собираешься заниматься программированием, тебе это не раз придется Все равно они сами редиски, раз не написали нормальной документации. Я бы мог найти лучшее применение потраченному времени.
> Вопрос: мне нужно в моей функции объявлять static $helper или factory и так мне всегда будет возвращать один объект? Скорее всего новый каждый раз, но лучше проверить документацию.
А какие могут быть задачи на красно-черные деревья? Ну не знаю, сделай на PHP реализацию этих деревьев с балансировкой и ООП. То есть должен быть класс представляющий узел дерева, и методы удаления/добавления узлов.
> и принципы SOLID KISS, чтобы лучше понимать ООП с конкретными задачами и примерами реализации. Задачи Вектор и Кошки-мышки из учебника решал для начала?
> Желательно еще на каждый существующий паттерн по задаче и Это довольно бессмысленно. Паттерны лучше разбрать по примерам использования. То есть взять фрйемворк и смотреть какие в нем используются и как реализованы и зачем.
Было бы идеально как ты написал, но на практике делают как попало. Через админку добавлять не так удобно, например когда у тебя несколько серверов (продакшен, тестовый) или команда, что ты каждому будешь подходить и объяснять что где нажать? а ведь так и делают.
Это друпал? Тогда скорее всего там используется модуль обратной связи и у него есть настройки.
> Вьюхи прямо в темплейтах переделывать под другую верстку? Ты должен сделать «тему» для Друпала со своей версткой, чтобы можно было на нее переключиться. Почитай документацию друпала по темам.
Вообще не надо никогда править код библиотек и фреймворков - их потом нельзя обновить, и разобраться в этом тяжело. Хотя я видел такое не раз.
XML это язык для хранения и передачи произвольных данных. Есть описывающий его стандарт. Очевидно от тебя требуют знание языка, и возможно библиотек для работы с ним (DOM как минимум).
При чем тут андроид или 1С? XML это отдельная технология и она была когда андроида еще не было.
> В любом случае новый работник будет просто недели 2 вникать что там наворотили. Отсюда мне вообще непонятно это требование. Требуется знать сам язык разметки XML и библиотеки для работы с ним. А не то как его используют в андроиде.
> Я больше на это не куплюсь. ну хоть почитай, впечатлись. Кто бы поверил что SQL так может?
> Как заставить человека, реализующего наш абстрактный класс, использовать исключения, причем нашего класса? Никак, только попросить в ридми и надеяться что прочтет. также как и нельзя заставить вернуть значения определенного типа.
> Кстати, это xdebug пишет этот стек, или так было всегда? Без xdebug по моему на экране просто текст пишется без стектрейса. и что особо печально, в логи стектрейс тоже не пишется. И не пишется на какой странице оно произошло, так что я например смотрю на время и грепаю аксесс лог.
> казалось бы, при чем тут соединение? Там еще Exec - выполнение.
> Так что да, редиска вроде адекватно реагирует на исключения, смотрит первый символ ответа, и если это '-' (в протоколе RESP означает ошибку), то выбрасывает исключение. Это радует.
> Я бы мог найти лучшее применение потраченному времени. Написать 12-й драйвер для редиса?
По поводу того как сделать ридми, у меня в голове был такой план:
- (1 маленький абзац) что это за библиотека - (1-2 абзаца) чем эта библиотека лучше других подходов, зачем она вообще нужна, почему бы не делать просто UPDATE count = count + 1 - (кратко) пошаговая инструкция по подключению к проекту, с минимальными примерами кода - (кратко) алгоритм работы - (кратко) возможности расширения
Вроде он примерно соответствует твоему но пошаговой инструкции у тебя вроде нет, ну то есть «сделайте composer require» и так далее.
в теории, можно еще сделать папку example с 2 php-страницами где демонстрируется подключение и использование счетчика.
По словам:
cross-client - лучше написать driver independent internally algorithms - наверно лучше написать implementation details - подробности реализации
> public function getDeltaVisits($pageID) Возможно стоит еще сделать метод массового получения дельт?
> set key ttl if you want to store information about visits > for last month only; default is 0, i.e. persistant это по моему неправильно, объем данных в редисе так будет расти неограниченно. Нужно какое-то разумное дефолтное значение, например 1 сутки.
Когда-то давно одна маня в воркаче попросила сделать инет-магаз .. за 5 дней. Чтобы разделы и товары можно было добавлять, удалять и редактировать, в общем натянуть макет на готовую цмс. В общем, сверстал макет, по-моему, дня за 3, но прям с утра до ночи верстал, чтобы все резиновое было и не наезжало друг на друга пиксель в пиксель. И сейчас натягиваю этот макет на опенкарт (а там еще ру. яз. подключать надо). И я просто ахуеваю, насколько тут много работы и какое вообще говно можно сделать быстро-быстро всего за 5 дней одному человеку, и это он еще цену не называл.
Как указывать в резюме или в анкетах опыт работы, если я год работал в черную я микроконторе, у которой даже названия нету, в которой помимо меня было 2 человека. И это по сути мой первый опыт. То есть я хочу написать в том же резюме, что занимался вот такими то вещами. Но не писать же, что работал в шараге за еду.
> Диапазоны IP адресов не пересекаются. Это правило для базы? База не должна принимать пересекающиеся диапазоны? Первая мысль хранить left и right как в nested sets, вторая версия вообще деревом пахнет.
>>591918 Может я неправильно понял условие но такой вот вариант: 4 таблицы, в 1: (ip, city_id) во 2: (city_id, city_name) в 3: (city_name, country_id) в 4: (country_id, country_name)
Не очень эффективно для каждого IP вставлять строчку, учитывая что их может быть до 4 млрд. Там часто большой диапазон, например 256 подряд идущих IP, соответствует 1 городу и выгоднее хранить его именно как диапазон.
Алсо
> (city_name, country_id) не очень правильно, почему тут связь многие-ко-многим да еще и через название, а не через id города?
>>591932 Тогда вместо строки ip, min_ip и max_ip и в запросе проверять попадает ли в диапазон. >>591936 А тут да, как то не подумал. тогда 1 таблица: (min_ip, max_ip, city_id) 2: (city_id, country_id, city_name) 3: (country_id, country_name)
Видишь какая польза от троллинга? Стоило назвать тупыми и ленивыми, как сразу зашевелились.
Не хочу спойлерить, но у меня там получился юнион с группировкой и having. Однако с explain беда, оно все равно не использует индексы, возможно из-за малого количества записей в таблице. Ты же умный, без текста понимаешь как выглядит запрос. Что я делаю не так? Как быстро набить базу мусором ради кол-ва? Не хочу заливать реальную.
Нет, все-таки не понимаю, почему даже запрос вида SELECT x FROM ips WHERE start_ip <= INET_ATON('1.0.0.18') не использует индекс? В possible_keys есть, но в key почему-то null.
Я не очень понимаю зачем там юнион и группировка. Мне кажется, можно сделать проще. Подумай как уложить диапазоны в таблицу чтобы можно было использовать индексы.
Аноны, пожалуйста, поясните, почему не работает мое регулярное выражение. В массив должны попадать все случаи, подчиняющиеся правилу. В моем случае в массив должны попадать случаи, когда после восклицательного знака и запятой нету пробела. Но попадает только одно значение: когда после восклицательного знака нет пробела. Я уже всю голову сломал. https://ideone.com/AUDhsK
Я не знаю, что имел в виду тот анон, но тебе хорошо бы пояснить свою идею, показав примерную схему таблиц и написав примерный запрос для поиска города по IP, а то непонятно что именно ты предлагаешь.
Кому не лень, помогите аутисту. Пишу кулькулятор для даунов. Пока без всяких выебонов типа проверки деления на ноль, вычисления косинусов и т.п. Просто "+/-", умножить разделить. Собственно, делаю хтмл форму, куда вводятся циферки. В результате имею хуиту пикрелейтед. > Undefined variable: op1 in C:\Apache24\htdocs\lessons\calculator.php on line 33 Но она объявлена, блджад, и считается нормально.
>>592049 При первом запуске очевидно что в строке: <input type="text" name="op1" value="<?php echo $op1; ?>"/> переменная $op1 ещё не объявлена, ведь она объявляется внутри if конструкции.
>>592062 Да, я уже понял, лол. Спасибо. Хотел сохранить введенное число в форме, но мне лень переделывать учебную говнозадачку, почистил эти куски кода, все работает.
Юнион и группировка для того, чтобы объединить результаты этих двух запросов и выбрать из них повторяющиеся более одного раза. http://sqlfiddle.com/#!9/c70a5/4 Понятно, что это хуйня, потому что фактически мы берем один раз половину таблицы, которая может быть гигантской, потом склеиваем юнионом с еще одним гигантским куском только чтобы в итоге отсеять две нужные записи группировкой. Это неправильное решение, вбрасываю потому что не понимаю, почему в одном случае индекс срабатывает, во втором нет. И если писать запросы по отдельности, и в сложном запросе.
>>592069 А теперь я понял, что достаточно было объявить в самом начале кода две переменные со значением нулл. Теперь все работает, введенные циферки сохраняются в форме.
>>592013 А вот я кстати не знал, что BETWEEN можно использовать таким способом. Почему-то думал, что только для запросов вида WHERE column_name BETWEEN первое_значение AND второе_значение. Оказывается можно и WHERE значение BETWEEN колонка1 AND колонка2.
http://sqlfiddle.com/#!9/c70a5/5 Но если я правильно понял, between равнозначен where a > x and a < y, так что оба индекса по прежнему не удается использовать.
> Вот тут не используется индекс. Почему? Потому что почти вся таблица попадает под условие WHERE и выгоднее обойти ее всю чем искать записи в индексе и соответствующие им в таблице. Если mysql это заметила то хорошо. Также, возможно потому что записей мало.
> А тут используется Наверно потому что там выбирается только часть записей.
> Юнион и группировка для того, чтобы объединить результаты этих двух запросов Если ты уже выбираешь полтаблицы что тебе мешает добавить условие AND end_ip >= ?
>>592099 >что тебе мешает добавить условие AND Я же пытаюсь добиться оптимального использования индексов. WHERE x > a AND y < b сработает только индекс на x.
SELECT t1.id, t1.city FROM ips t1 WHERE t1.start_ip <= INET_ATON('1.0.0.18')
тоже только на start_ip работает и обходит полтаблицы. От добавления второго ограничивающего условия хуже уже не станет, наборот, меньше строк в итоге выбрать придется.
Вот взял в ОПпосте задачу на палиндромы - и это пиздец, я не могу понять логику выполнения. Т.е. я даже базовый алгоритм "здесь пишем это, а потом выясняем то" не могу составить. Причем теорию я уже довольно неплохо выдрочил, нужно ПОНЯТЬ как ее применять. Есть какой-нибудь способ? Может уделить пару недель какому-нибудь паскалю/бейсику? лол
>>590969 Вроде-бы с айфонами элементарная задачка. Но прорешав всё остальное - почему-то застопорился именно на ней. По логике всё просто, отслеживаем когда нужно провести последний платёж и отводим в отдельный if. Но на самом деле какой-то бред у меня происходил всю ночь и оператор if ($creditBalance<5000) тупо не срабатывал! В итоге после перезагрузки, сегодня написал на работе вот это.
https://ideone.com/qFTYEa ОП, пожалуйста дай мне максимум критики, в том числе и по пунктуации и по самому коду. Может я что-то неправильно написал?
Сколько примерно будет стоить натянуть верстку на цмс (опенкарт). Интернет магазин, с разделами, поиском, добавлением, редактированием, удалением товара и категорий. И сколько бы это у вас времени заняло?
>>592281 >Сколько примерно будет стоить натянуть верстку на цмс (опенкарт). 100$ >Интернет магазин, +150$ > с разделами, поиском, добавлением, редактированием, удалением товара и категорий. Если я это всё сам буду готовить \ вбивать \ редактировать \ фотать +1500$ сразу, по минимальной планке. Если нет - то 0. >И сколько бы это у вас времени заняло? 1 месяц. Неделю на натягивание, 3 на тесты. Всегда с запасом по срокам беру.
>>592277 Ты не посчитал проценты и не заплатил обслуживание по счетам банку в последний месяц. В итоге по программе ты вроде как всё заплатил, а на самом деле остался должен банку ~1498 рублей
>>592295 Задача на процент по вкладу. https://ideone.com/U6XDFS Вроде условия правильные. Хотя я рассеяный и мог что-то упустить. Решать сел буквально 4 минуты назад. Надеюсь ОП проверит и скажет что я не совсем рукожопый.
>>592298 >5.5 Выполни код с картинки, чуть-чуть его переделав на свой лад. ОП, у меня мозг немного не работает. Можно свою рулеточку написать? или в чём задача?
> $cookie = $app->getCookie('salt'); > $app->setCookie('salt', $cookie, '1 month'); > Это я не понимаю. почему ты соль хранишь в куках? Соль не нужна пользователю, она должна храниться только в БД. Что ты тут за собственный алгоритм изобрел?
> Более того, ты еще и ищешь пользователей почему-то по соли. Это явно что-то не так.
Это сделано для того чтоб если файл загрузил анонимный, незарегистрированный пользователь, он мог потом зарегистрироваться и видеть какие файлы им загружены. Или так соль использовать нельзя?
> foreach ($users as $user) { > $filesCount[$user->getId() ] = count($app->em->getRepository('Uppu3\Entity\File') > Это неэффективно, делать запросы в цикле. Надо использовать запрос с GROUP BY (если у тебя меньше 1000-2000 файлов, если больше то и он не очень эффективен и надо заводить у пользователя поле с числом файлов и брать данные из него)
Я сделал через DQL $filesCount = $app->em->createQuery('SELECT IDENTITY(u.uploadedBy), count(u.uploadedBy) FROM Uppu3\Entity\File u GROUP BY u.uploadedBy'); но этот запрос возвращает мне многомерный массив с которым неудобно работать. Правильно будет преобразовать его в такой как нужен мне? Ну то есть наверно так будет эффективней, но выглядеть это будет очень некрасиво, и неочевидно.
>Если ты отправляешь пользователя залогинится, то надо сохранять текущий URL (например /login?from=/users/) а после логина редиректить, причем дополнительн проверять что URL нходится на твоем сайте, чтобы нельзя было пользователя отправить на левый сайт. Так и не придумал как это сделать в слиме. На страницу авторизации у меня редиректит проверка в middleware, как там можно сделать чтоб функция определяла с какой страницы нас заредиректило?
>>592371 Обычно делается через mod_rewrite что-то типа RewriteRule . index.php То есть одна точка входа, в самом приложении уже разбирается маршрут. Можно конечно понаписывать десятки правил в .htaccess, но зачем?
>>592481 Прописываем в location пути к разным сервисам, тем самым уменьшая оверхед. Например, есть у нас апи для авторизации, апи для комментирования. Лучше же разделить логику.
Решил продвинуть свои знания парсинга и спарсил с одной страницы курсы 54 валют. Потом, решил написать на основе всего этого калькулятор валют, сформировал многомерный массив, такого формата:
Но как мне написать глобальный парсер, на основе только этих данных, так как это всё курсы по отношению к определённой валюте. Как можно перевести любую валюту в любую валюту? Неправильно же будет вначале всё переводить в ту валюту к которой этот курс, а уже потом в необходимую?
>>592582 Конечно можно просто использовать коэффициенты, для этого достаточно разделить курс переводимой валюты к рублю на курс той валюты в которую переводят к рублю, но это же будет не правильно? Так не пишутся такие калькуляторы?
>>592599 Недавно сверстал из псд то что у ОПа в заданиях, хочу попробовать натянуть это на Вордпресс, но, не могу понять что там должно динамически изменяться.
Текст и заголовок преимуществ можно редактировать через админку Работы в портфолио добавлять и редактировать Адрес, заголовок, слоган и телефон редактировать
>>592666 > 1. Не будут. А можешь сказать почему, чтобы я успокоился? > 2. Как хочешь. Ну а как думаешь, легче изучать веб или другие области? Где больше платят?
>>592673 Потому что нестандартный функционал нереально поставить на конвеер. Не знаю, что такое легче или сложнее. По-моему это зависит от того, насколько ты любишь это дело. Если не любишь и пришел только из-за денег, то сложно будет освоить даже верстку. Платят много например в CERN или NASA, можешь попробовать к ним устроиться.
>>592681 Спасибо, анон, с CMS ты меня успокоил. То есть большинство сайтов, будут писать не на CMS? > Если не любишь и пришел только из-за денег, то сложно будет освоить даже верстку. Ну я уже немного вкотился, изучил CSS и HTML, немного продвинулся в JS и PHP. > Платят много например в CERN или NASA, можешь попробовать к ним устроиться. Просто я часто слышу, что в вебе зарабатывают меньше всех. Не знаю правда ли.
>>592688 >Просто я часто слышу, что в вебе зарабатывают меньше всех. Не знаю правда ли. Сначала стоит определиться, что мы называем вебом. Фейсбуки, одноклассники - это всё тоже веб.
>>592688 Большинство дешевых сайтов будут писать на cms. Но сливки будут всегда снимать грамотные разработчики, способные не только тыкать кнопки в админке, но и проявлять сообразительность, применять эрудицию. Хорошие специалисты везде нужны и очень ценятся. Другое дело что в вебе очень, очень много плохих специалистов, потому и средняя зарплата меньше. Например в робототехнике наверное платят больше, но там и требования гораздо выше, потому быдлокодеры отстутствуют как явление.
>>592699 Если включить всех "вебмастеров", "контент-менеджеров", "администраторов сайтов", натягивателей вёрстки и прочих говночистов, которых почему-то называют разработчиками, то да, в среднем меньше. Если сравнивать разработчиков со схожим уровнем компетенций, но разными средствами разработки, то разница минимальна.
>>592700 Я уже учился в институте, но бросил. Сейчас мне 22 года, и не хочется терять время. Как думаешь, можно ли самостоятельно стать хорошим специалистом? Легко ли найти работу без диплома?
Если строго задавать пустые диапазоны, то можно использовать только начало (или конец диапазона). Тогда с индексами не будет проблем. Например так http://pastebin.com/X4gc19D3 sqlfiddle опять лагает, не могу выложить. А нет, вроде с пятой попытки запустился http://sqlfiddle.com/#!9/5b673/3
С накладывающимися диапазонами только не знаю что делать. Может подзапросом их отсеивать по разнице между концом и началом?
>>592700 Макет на цмску не так-то просто натянуть, там все равно нужно будет и в темлейтах ковыряться и рендеринг контроллеров менять и ООП с MVC знать, чтобы понимать, что вообще происходит и как это менять. А некоторые детали все равно невозможно сделать.
Зарепортил чатящихся пидарасов. Вот вы точно работы не найдете, если будете пиздеть на сосаче вместо того чтобы прокачивать знания.
>>591884 >Более сложная версия: Ip адреса могут накладываться, например Под накладыванием подразумевается именно включение под-диапазонов в родительский диапазон, типа страна 1.0.0.1 - 1.0.0.255 город 1.0.0.10 - 1.0.0.20, или под накладыванием подразумевается пересечение типа 1.0.0.40 - 1.0.0.50 и 1.0.0.45 - 1.0.0.55? Если первый случай, то пожалуй можно обойтись таким решением. >>592726
Продолжая тему определения города по ip. Оптимальное решение задачи по хранению диапазонов может быть оп позже соблаговолит подсказать (я например нервничаю что не могу решить, это ставит под сомнение компетенцию), но в принципе здесь тоже не нужно писать свои велосипеды, потому что есть хорошие бесплатные сервисы и свободные базы. GeoIP вроде бы полубесплатный, там урезанная версия в light пакете. Мне понравился SypexGeo, он вроде бы вообще бесплатный, без ограничений, и по словам автора "самый быстрый".
Как вообще относиться к этой тенденции определения положения пользователя по ip-адресу? Вот у меня например провайдер выдает ip без привязки к региону. Когда захожу на сайты с автоопределением приходится каждый раз руками менять поисковый запрос на свое реальное положение.
>>592826 Почему ты думаешь, что я не способен работать с кмсками? Вполне себе могу. Я просто немного шокирован тем, что еще и цсс нужно будет подтягивать, думал что этим фронтэндеры/дизайнеры занимаются. Ну и да, я не совсем еще представляю себе, чем занимаются пхп-оиды. Но раз уж нужен цсс - буду учить цсс.
>>592841 Ну хз, я когда приходил вебпрогером устраиваться, мне сказали только макет сверстать адаптивно, а "остальное отдадим программистам". Я обиделся и ушел. Все обычно с цсс и верстки начинают.
Давайте перцептрон разберем. Что-то я не понимаю, как он устроен и как его использовать. Вроде установил композером, но вылетают ошибки. Класс\PHPUnit_Framework_TestCase не найен
Итак, господа, позвольте мне уточнить, все-таки: 1)продолжаю задрачивать пхп 2)подтягиваю хтмл (курсы хтмлакадеми полгода назад прошел все, но уже подзабыл, форму, например, из головы не напишу) 3)css - до какого уровня? Неужели до того же, что в верстка-треде учат? 4)джскрипт, фреймворки - это понятно, к этом я готов был.
Задача про компанию «Вектор».Довольно интересная вынужден признать. Нужна критика, совсем хуита? Где, что можно подисправить? https://ideone.com/apFxj8
>>592681 Лольнул с дивана. Пример - есть фирма "Мегафирма", продаёт свою цмс, скажем Z4. Заказчику нужно почти как было, но чтобы в интернет-магазине можно было продавать не 5000 видов резиновых залуп, а 10000 и деревянных. Нормальные люди просто допишут залупно-продажный модуль к имеющемуся, а не будут городить с нуля говно на шкрептах за 5 минут.
>>592361 > Это сделано для того чтоб если файл загрузил анонимный, незарегистрированный пользователь, он мог потом зарегистрироваться и видеть какие файлы им загружены. Или так соль использовать нельзя? Ты перегружаешь себя лишней работой. Если файл загрузил анонимус - пусть и будет файл который загрузил анонимус без всяких возможностей опознования.
Ты заходишь на сайт, пробуешь закачать несколько файлов, он тебе нравится, ты регистрируешься, и твои ранее закачанные файлы уютненько лежат в твоем личном кабинете. Ты по прежнему можешь ими управлять.
Ох ты ж елки зеленые, неужели у меня получилось запустить дебаггер в шторме? Кажется, это стоит отпраздновать.
Повторял по дурацким урокам с хабрахабра, но не хочется быть обезьяной, хочется понимать за что отвечает каждая настройка. Поэтому несколько вопросов. Для начала, являются ли обязательными некоторые настройки в php.ini, такие как
За что отвечает xdebug.remote_enable? Не надо тыкать ссылкой на xdebug.org, я читал, но не понимаю смысла >This switch controls whether Xdebug should try to contact a debug client which is listening on the host and port as set with the settings xdebug.remote_host and xdebug.remote_port. Эта настройка определяет будет ли xdebug соединиться с клиентом отладки который прослушивается на хосте и порту, указанных в соотв.настройках Что такое клиент отладки (debug client)? Ага, из этой главы http://www.xdebug.org/docs/remote вроде бы явствует, что они так называют собственно саму ide. Так почему все-таки remote? Что значит удаленный? Если настройка remote_enable отвечает просто за включение дебаггера, то это странно, потому что дебаггер у меня явно работал до того как я это прописал в php.ini. Например в phpinfo() выводилась секция xdebug, и профилирование я выполнял раньше. Или профилирование это другой инструмент, и на него это не влияет? Есть еще подозрение, что в убунту несколько этих php.ini файлов, потому что конкретно в /etc/php5/apache2/php.ini секции xdebug вообще не было.
remote_mode=req вроде по-умолчанию, так что наверное можно не писать. Насчет remote_host не уверен что на линуксе можно писать localhost, где-то слышал (кажется когда мы тут разбирали подключение сфинкса) что это может вызвать неприятности, правда не помню какие. Кажется, если линукс увидит localhost, он проигнорирует порт что ли. Возможно из-за этого у меня не работало. От греха подальше прописал 127.0.0.1
В шторме мне нравится возможность переходить к классу или его полю по ctrl+клик. В саблайме такой фичи не знаю, если есть подскажите. Также замена по всему проекту. В саблайме насколько я знаю только поиск по проекту, и оттуда уже прыгать по файлам и поправлять. Аналог множественных курсоров в шторме имеется, alt+j, хотя лучше наверное поправлю клавиши под саблайм. Еще есть инструменты для гита и композера, хотя наверное это скорее вредные вещи, потому что так можно забыть нативные команды.
Темы только не получается установить. Везде пишут 'скачай и кинь в папку /config/colors', но у меня почему-то ломается, то есть тема устанавливается, но поломанная, например весь текст красного цвета. Причем говорят про xml и jar форматы, а я вижу в icls https://github.com/daylerees/colour-schemes/tree/master/jetbrains
>>592999 >Вещи, которые ты описал, лучше получатся с использованием хотя бы микрофреймвока Slim, шаблонизатора Twig, то есть лучше бы это прикручивать ко второй задаче про файлообменник. Либо прикрутить микрофрейморк и шаблонизатор к первой задаче Хорошо, будет прикручивать ко второй задаче. Кстати, по первой задаче, мы уже с тобой делали подобную задачу на простую регистрацию https://github.com/someApprentice/simpleRegistration Осталось перенести её на ООП. Задам вопросы об этом позже. Пока читают пасты про БД и уязвимости. Сложна. Понимаю лишь только потому что уже делал такое. Чувствую будет сложно потому что я хочу все побыстрей узнать.
>Домашнее задание >Зайди на свои любимые сайты (где есть авторизация), открой инструменты разработчика в браузере (Ctrl + Shift + I), изучи формы и ссылки на сайте, свои куки, и попробуй понять, есть на них защита от XSRF или нет. А я не нашел на гитхабе токен в куках. Они его шифруют?
>>592999 >Переходи в новый тред и вбрось туда ссылку на свой пост в этом треде. Код кошек-мышек я внимательно посмотрю позже. Не понял. На этот пост? >>588058
А принцип такой: если включен режим отладки и все условия выполнены, PHP перед выполнением первой строчки скрипта останавливается и пытается установить соединение с указанным в конфиге IP и портом. Там должен ждать соединения отладчик, и после его установки PHP принимает и выполняет команды отладчика. Отладчик может ставить точки останова, просматривать значения переменных, пошагово выполнять скрипт и так далее.
То есть отладчик в IDE слушает порт и ждет соединения (и при этом почему-то называется клиентов отладки), а PHP- устанавливает его (и называется сервером отладки). Из-за такой схемы обратного соединения (обратного по отношению к тому как браузер соединяется с веб-сервером) и нужны все эти пляски с портами и описание сложных схем проброса портов (проброс портов нужен если ты за NAT, а сервер в интернете - так как напрямую снаружи соединиться с узлом за NAT нельзя).
Проверить есть ли соединение с IDE можно из командной строки (на сервере где работает PHP) командой
telnet 1.2.3.4 5678
Где указаны IP-адрес и порт отладчика. Если IDE ждет соединения то оно будет успешно установлено, если нет то будет ошибка.
> Что такое клиент отладки (debug client)? Отладчик в IDE.
> Так почему все-таки remote? Что значит удаленный? Потому что он может находиться на любом узле в сети интернет. Потому и удаленный.
> Если настройка remote_enable отвечает просто за включение дебаггера, то это странно, потому что дебаггер у меня явно работал до того как я это прописал в php.ini. Если у тебя линукс то эта настройка могла быть включена в другом конфиге, например xdebug.ini. Проверить настройки можно через phpinfo()
> Есть еще подозрение, что в убунту несколько этих php.ini файлов Да, у каждого расширения свой файл. Причем тебе наверно лучше свои настройки не совать в их файлы, а сделать свой файл username.ini и в него все писать, чтобы видно было где твои настройки а где дефолтные.
> не уверен что на линуксе можно писать localhost, где-то слышал (кажется когда мы тут разбирали подключение сфинкса) что это может вызвать неприятности, Это относится только к mysql и тут не при чем. Тут можно писать.
> В шторме мне нравится возможность переходить к классу или его полю по ctrl+клик. В саблайме такой фичи не знаю, если есть подскажите. F12 в Sublime 3
> Также замена по всему проекту. В саблайме насколько я знаю только поиск по проекту, и оттуда уже прыгать по файлам ипоправлять. замена есть в поиске по проекту (Ctrl + Shift + F) но убогонькая.
> хотя лучше наверное поправлю клавиши под саблайм. Не советую - привыкнешь к нестандартным клавишам и придется везде с собой конфиги таскать. Лучше привыкать к стандартным и ничего не менять.
Интернет - это всемирная сеть, объединяющая множество компьютеров и устройств. Устройство и принцип работы этой сети описаны в протоколе (протокол это стандарт, описывающий взаимодействие систем) IP.
У каждого узла сети есть свой уникальный идентификатор (он называется IP адрес), и указав его, узлы могут передавать друг другу по этой сети пакеты данных. Сейчас все еще используются IPv4-адреса, которые имеют вид вроде `102.34.23.20` (4 числа от 1 до 254), но так как эти адреса заканчиваются, в будущем мы перейдем на [IPv6](https://ru.wikipedia.org/wiki/IPv6), где адреса состоят из большего числа цифр.
Также, некоторые IP адреса имеют специальный смысл. IP-адреса вида `127.x.x.x`(например `127.0.0.1`) соответствуют так называемому loopback-интерфейсу и если попытаться отправить пакет на такой адрес, то он не уйдет в сеть, а останется на компьютере. Эта особенность используется программами, которые запущены на одном и том же узле и хотят обмениваться друг с другом данными.
Каждый IP-пакет содержит IP-адрес отправителя, получателя, а также примерно до 1600 байтов данных (байт это целое число от 0 до 255). IP адрес либо задается администратором узла, либо узел получает его автоматически через DHCP.
Если быть точнее, то обычно IP адрес назначается не узлу, а сетевой карте. Если у узла несколько сетевых карт, у него может быть несколько Ip адресов. Более того, можно присвоить одной сетевой карте несклоько IP адресов, но как правило это не имеет смысла.
## Локальная сеть
Интернет это объединение большого числа локальных сетей. Есть сети, к ним подсоединены устройства, и эти сети соединены с помощью маршрутизаторов. Маршрутизатор (роутер) это узел, у которого 2 или больше сетевых карт и который подсоединен к 2 или больше сетям. Он позволяет пакетам проходить из одной сети в другую.
В переделах локальной сети узлы могут пересылать пакеты без IP адресов, по MAC-адресам (MAC адрес это серийный номер сетевой карты, вшитый в нее. В отличие от него IP адрес задается системой программно). В переделах локальной сети пакеты пересылаются напрямую. А вот чтобы отправить пакет в другую сеть, узел передает пакет машрутизатору-шлюзу, который передает его в соседнюю сеть, там его передают дальше, и т.д. IP-адрес шлюза задается в настройках сети на узле либо администратором либо получается автоматически по DHCP.
Маршрутизатор немного меняет пакеты. Так как он принимает пакет на одной сетевой карте и передает с другой, то в пакете MAC-адрес отправителя заменяется на адрес маршрутизатора, а MAC-адрес получателя - на адрес шлюза во второй сети. IP-адреса и другая информация в пакете не меняется.
Ты можешь увидеть путь пакета через цепочку маршрутизаторов командой traceroute (на Windows она называется tracert):
(linux) /usr/sbin/traceroute google.com (win) tracert google.com (онлайн на сайте) http://ping.eu/
Компьютеры объединяются в локальную сеть с помощью свитча. Это устройство, у которого много сетевых разъемов к которым подсоединяются узлы. Свитч это прозрачное устройство, у которого нет ни MAC- ни IP-адресов - оно просто принимает пакет от одного компьютера и передает другим.
Компьютеры в локальной сети имеют общий префикс IP-адреса. Например если у нас маска сети 255.255.255.0 и адрес шлюза 10.10.10.1 то все другие узлы этой сети должны иметь IP адреса вида 10.10.10.x. Именно по этому признаку узел определяет находится он в одной сети с получателем (и может слать ему пакет напрямую по MAC адресу) или в разных (и пакет надо передать шлюзу). Сеть обычно называют по префиксу, то есть говорят «узел находится в сети 10.10.10.0».
## NAT
Если мы соединяем 2 или более сети маршрутизатором, то фактически получается одна большая сеть. Все узлы в ней имеют уникальные IP адреса и могут посылать друг другу пакеты, напрямую если они в одной локальной сети, или через маршрутизаторы если в разных. Маршрутизатор не меняет IP адреса в передаваемом пакете и никак не препятствует их передаче.
Но еще сети можно соединить с помощью NAT. В случае если мы включаем на маршрутизаторе между 2 сетями режим NAT, ситуация меняется. NAT принимает пакеты из внутренней сети и отправляет их во внешнюю от своего имени, заменяя IP адрес отправителя (допустим a.b.c.d) на свой. А когда извне приходит ответ, он передает этот пакет во внутреннюю сеть, меняя адрес получателя со своего IP адреса на a.b.c.d, то есть того, кто послал исходный пакет наружу.
Это приводит к тому что внутренняя сеть становится изолированной от внешней. Извне никто не видит узлы внутренней сети, снаружи ситуация выглядит как будто у нас один узел с одним IP адресом. Нельзя снаружи установить соединение с внутренним узлом (если только явно не пробросить порт через NAT).
Также, так как внутренние узлы не видны снаружи, мы не обязаны выдавать им белые уникальные IP адреса (которых мало и которые стоят денег). Мы можем выдать им «серые» адреса из диапазона 192.168.x.x или 10.x.x.x. В одной локальной сети IP адреса не могут повторяться, но в разных сетях (например у разных провайдеров), отделенных NAT, могут. Серые адреса уникальны только в пределах своей сети, а не во всем мире. Из-за неуникальности снаружи нельзя установить соединение с узлом у которого серый IP адрес. Именно потому NAT переписывает адрес отправителья на свой, «белый».
Большинство провайдеров помещает своих абонентов именно в изолированную сеть за NAT, из соображений экономии на IP адресах и безопасности. Если ты используешь дома роутер то в нем тоже есть NAT, у тебя создается изолированная домашняя сеть, и провайдер не видит устройства в ней, видит только роутер.
## Проброс порта
При использовании NAT можно пробросить порт снаружи на один из узлов внутренней сети. В этом случае пакеты приходящие на этот порт передаются узлу во внутренней сети.
Давай повторим, чтобы не забыть:
- локальная сеть организуется на свитчах, IP адреса в ней начинаются с одного и того же префикса, узлы могут слать пакеты напрмямую по MAC адресу - локальные сети объединяются маршрутизаторами, которые при передаче пакета не меняют IP адреса в них - маршрутизатор может работать в режиме NAT, в этом случае он подменяет IP адреса в пакетах. Снаружи соединиться с узлом за NAT нельзя.
Допустим, у нас есть 2 программы, A и B, запущенные на разных компьютерах (допустим, A на узле `1.1.1.1`, а B на `2.2.2.2`). Они могут использовать описанный выше протокол IP для передачи друг другу каких-то данных, но это не очень удобно:
- в протоколе IP в пакете указывается IP-адрес узла-получателя, но не указано какой из программ, запущенных на узле, он предназначен. Если их несколько, то понять это невозможно. - протокол IP не гарантирует доставку пакетов - часть из них может теряться - есть ограничение на размер пакета, и в одном пакете можно переслать не более 1600 байт данных. А что, если мы хотим передать большой файл или сообщение?
Все эти проблемы решает более высокоуровневый протокол TCP (еще его называют TCP/IP, так как он в своей работе использует IP). Он добавляет к IP-адресам номер порта - число от 1 до 65535, которое идентифицирует программу-получателя или отправителя. Разные программы используют разные номера портов, и потому можно понять какой из них предназначены данные. Также, он обеспечивает повторную отправку пакетов при потере, и позовляет пересылать сколь угодно большой объем данных, разбивая их на пакеты при передаче и собирая обратно при получении.
Протокол TCP/IP в примере выше работает так:
- программа A на узле `1.1.1.1` хочет получать данные от программы B. Потому она открывает на компьютере порт с заранее обговоренным номером, например `2000`, и начинает ждать входящих соединений («слушать порт»). Если этот порт уже используется другой программой, повторно открыть его не удастся, и произойдет ошибка, если нет, то операционная система выделяет порт номер 2000 программе. - программа B, которая хочет послать какие-то данные программе A, устанавливает TCP-соединение с узлом `1.1.1.1`, порт `2000` - программа на узле A получает уведомление, что кто-то пытается установить соединение с ней с IP-адреса `2.2.2.2`. Она может принять это соединение, или отказаться, допустим она принимает его. - с этого момента соединение установлено, и программы могут посылать друг другу в обе стороны данные любого объема - когда передача закончена (или когда программа не хочет больше получать данные), любая из программ может закрыть соединение на прием данных. Вторая программа получает уведомление об этом, и если она тоже закрывает соединение со своей стороны, то соединение завершается (а если нет, то передача данных продолжается, но только в одну сторону, пока вторая программа не закроет соединение на прием со своей стороны).
Если программы запущены на одном и том же компьютере, то они могут использовать упомянутый выше IP-адрес `127.0.0.1`.
Если ты используешь Windows/linux/mac, ты можешь установить TCP-соединение с любым узлом и портом командой `telnet IP-адрес порт`, например:
```shell telnet 8.8.8.8 80 ```
Если порт и адрес указаны правильно (то есть есть узел с таким IP-адресом, на нем запущена программа, слушающая этот порт и она принимает твое соединение), то все, что ты печатаешь, кодируется в виде байт и посылается на удаленный узел, а все, что он пришлет, отображается на экране. Если нет, то подождав минуту-две, ты получишь сообщение об ошибке. Завершить сеанс связи можно, нажав Ctrl + C.
> А я не нашел на гитхабе токен в куках. Они его шифруют? Они могут хранить токен внутри сессии (сессия это данные хранящиеся на сервере, ты их не видишь, а в куках хранится лишь идентификатор сессии).
data-form-nonce="038de663......7190" - nonce это специальный одноразовый код, который видимо защищает от повторной отправки формы (сервер не принимает код nonce второй раз)
<input name="authenticity_token" type="hidden" value="0rmnd......A=="> - это и есть CSRF токен. Я не знаю, где хранится вторая копия токена - она может храниться в сессии, или она может получаться из идентификатора сессии каким-то преобразованием, или она может получаться из IP адреса или чего-то еще.
Заметь что я вырезал лишнее из токенов, чтобы злоумышленник не мог ими воспользоваться.
Насколько я знаю, обычно с js- называют классы, которые предназначены не для оформления элемента, а для поиска элемента из яваскрипта по этому имени.
Также, обрати внимание что Sign Out сделан не ссылкой, а кнопкой в форме. Потому что в HTTP принято что метод GET не должен менять данные на сервере. Потому переход по ссылке не должен ничего удалять, или разлогинивать. Это делается методом POST, в данном случае отправкой формы.
https://ideone.com/xDRbLj Ананимасы. У меня косяк в коде (если выпадает последнй элемент массива - вылетает ошибка), или таки что-то неправильно с настройками моей сборочки? Можете проверить? Или я действительно неправильно массив обрабатываю? (У меня на компе если выпал последний элемент массива - выскакивает ошибка)
Бля, меня уже чета подташнивает от нубов с их версткой, кусками говнокода на идеоне с прикрепленными анимекартинками, которые даже не знают, с какого числа начинается нумерация массива и что такое перцептрон. джва года в пхп треде
>>593032 Кстати, мне уже лень копать этот баг, но при регистрации у меня анонимный юзер теряет доступ к редактирвоанию ранних данных. Я просто ключ куки в бд сохраняю и ставлю куки пользователю те же что и куки в бд того юзера при залогинивании.
>>593085 Просто это типичные ошибки, которых очень много, от которых очень устают. Да, ошибки в гугле хорошо переводятся. >>593084 И покажи, что у тебя выдает.
Я упоролся кавычками. Кто-то говорит, что везде, где можно - надо хуячить двойные. Кто-то говорит, что везде, где можно - одинарные, а где нельзя - двойные. Кто-то говорит, что переменные надо выносить из-под кавычек. Как правильно с точки зрения стилистики?
Лучше сделать не кодом с echo, а функцией которая возвращает результат. Ты смешал алгоритм и вывод данных в кучу, а лучше сделать это отдельно.
Ошибки:
- как выводит числа без разделителей, напимер не 1, 2 а 12 - ты думаешь если в массиве 2 и более чисел то будет 2 ответа. но это не так - код не находит 2 наибольших числа, а просто берет 2 первых не повторяющихся числа из массива
Чувствую что вопросы платиновые, но спрошу: 1) Стоит ли вообще сейчас окунаться в php и связываться с backend? Ведь это самая легкодоступная ниша из всех и все норовят в неё залезть. Работа в моём регионе есть, но только с мидла (либо джуна, но со своим проектом). До джуна надо будет как-то выживать, возможно вообще хоть где-то найти подработку и не наткнуться на индуса работающего за фишки с покемонами/крышками от фанты с кодовым номером/новые тапки? 2) Что надо учить для того, чтобы достичь уровня джуна (не беря в расчёт сам php, html, css, http)? 3) С чего начинать (точнее какую лит-ру)? Ссылка с введением для совсем нью фагов мне не нужна, год назад пытался перл учить, так что как создать переменную, массив, что такое функция - я знаю. Не знаю всего остального, ООП и т.д. Всем заранее спасибо за ответы.
>>593177 1) > Ведь это самая легкодоступная ниша Не заставляй людей шутить про твою маму. > где-то найти подработку Фриланс. 2) > Что надо учить для того, чтобы достичь уровня джуна (не беря в расчёт сам php, html, css, http)? Английский
3) > Ссылка с введением для совсем нью фагов мне не нужна Спустись на землю.
>>593228 И что? Просто замечательно, что все так подробно расписано, в первом yii была краткая байда вида http://yiiframework.ru/guide/source/images/flow.png с бессвязными комментариями, криво переведенными китайцем на английский, а потом макаровым на русский. После первого мне хочется плакать от счастья, глядя на доки второго.
Тащемто что в первом, что во втором, русскоязычная документация более полная, чем английская (внезапно, да). Об этом и samdark говорил. Хотя сейчас, может, и исправили ситуацию.
Раз оп опять заработался и пока не принимает квесты, буду считать оптимальным решением задачи про хранение диапазонов ip от товарища garex http://habrahabr.ru/post/138536/ Он даже скрипт написал для перегонки базы geoIP https://github.com/garex/geoip-flat-range Мне понравилась еще Sypex Geo, там походу базы только в бинарном виде, но наверное их и не нужно оптимизировать.
В чем суть статических методов кроме того, что их моно использовать без создания экземпляра класса? Допустим у меня есть класс, в нем 5 методов, только один из них используется внутри самого класса, значит логично остальные четыре делать статическими? Получается, что большинство методов нужно делать статическими? Или здесь есть какие-то подводные камни?
>>593357 >В чем суть статических методов кроме того, что их моно использовать без создания экземпляра класса? Какие еще причины тебе нужны, кроме этой?
А какая у тебя структура бд? На бордах по-моему просто делается запрос вида "выбрать оп-пост + 3 его последних поста из каждого из верхних 10 тредов". Так что последние N тредов в которых был постинг, окажутся на главной благодаря order by post_time desc limit N
У тебя по поему непонимание ООП и зачем нужны классы. использовать статические или обычные методы - это выбирается не в зависимости от числа созданных экземпляров, а логикой.
Статические методы это методы которые работают с классом, а не его экземпляром (объектом) и не используют $this. То есть методы результат вызова которых не зависит от полей какого-то объекта. Методы, которые по логике относятся ко всему классу, а не к конкретному объекту этого класса.
Обычно это маленькие вспомогательные методы. Например, метод, который делает первую букву строки заглавной или метод который вычисляет площадь круга из радиуса. Или метод переводящий длину файла в байтах в строку вида «16 Мб».
Статические методы используются не очень часто, если у тебя их много, скорее всего ты что-то делаешь неправильно.
Если бы ты написал пояснение что у тебя за класс и моделью чего он является, какие в нем методы, тогда можно было бы конкретно сказать статические они должны быть или нет.
Меня уже запарила эта проблема, почему имя файла на кириллице сохраняется в папку с кракозябрами в имени? При том имя файла сохраняется в бд нормально.
>>591185 >>591209 Исправил замечания к счетчику. Так как ты потребовал убрать конструкторы и поля для зависимостей, то нужда в абстрактных классах отпала, заменил на интерфейсы. Насчет времени жизни ключа, то мне нужно отслеживать именно уникальные посещения, для сайта объявлений ну как минимум месяц. А то одни и те же чуваки (например от агенства недвижимости) накликают сотни посещений, а звонков от реальных покупателей ноль (личный опыт). Вообще для высоконагруженных приложений такая схема как у нас не очень подойдет, потому что придется закупать дополнительную память именно ради несчастного счетчика. Самым оптимальным решением наверное все-таки является схема мейлру с таблицей memory в качестве очереди. Но у нас же учебный проект. Кстати он довольно разросся, так что я наверное буду считать это отдельной работой, которую можно показать работодателю.
Добавил пример использования. https://github.com/nsdvw/visit-counter/tree/master/example Только пожалуйста не придирайся к процедурному стилю. Ну не буду я ради одностраничного хелловорлда неделю писать mvc приложение по всем правилам.
Сейчас почитаю твои пасты по поводу тестирования, и может замучу еще простые тесты. Но тоже без фанатизма. Хочу до нг успеть подтянуть js и устроиться хоть куда-то, а там буду уже в свободное от работы время прокачивать скиллы.
> Только пожалуйста не придирайся к процедурному стилю. Ну не буду я ради одностраничного хелловорлда неделю писать mvc приложение по всем правилам. На мой взгляд ты даже переусложнил приложение. Куча файлов, папок, длинный сложный код. Нельзя ли сделать проще, например 2-3 файла:
page1.php - засчитывает визит на страницу 1 page2.php - засчитывает визит на страницу 2 index.php - показывает общее число визитов и содержит ссылки на page1.php, page2.php
Без шаблонов, без разделения на кучу файлов. И может даже без базы данных? Возможно ли так упростить? Если тебе жалко написанный код то можно сделать его в папке simple-example.
> Самым оптимальным решением наверное все-таки является схема мейлру с таблицей memory в качестве очереди. так она тоже в памяти хранится, какая разница тратить память на редис или на mysql? Или я что-то не понял?
> потому что придется закупать дополнительную память именно ради несчастного счетчика. Ну 128 Гб на сервере увидеть не редкость, а хеш на миллион элементов будет весить порядка мегабайт 20, так что я бы не беспокоился особо.
> $recentVisits = $vc->getDeltaVisits( [$model->id] ); > $visits = $savedVisits + $recentVisits; мы передаем массив id, а получаем просто число? Я бы для удобства сделал 2 метода, один для массового получения чисел, а другой для получения одного значения для одной страницы.
>>593732 >>593733 Нет, без базы никак, это же чуть ли не главный функционал - перенос из редиса в базу. Ну и счетчик на странице состоит из суммы того значения, что хранится в базе + дельта в редисе.
Можно еще рассмотреть вариант вообще без хранения счетчика в базе, редис сам почти полноценная база. А почему я так сразу не сделал? Что-то я ночью уже не соображаю.
Про мейлру дело даже не в таблице-очереди memory, которая у них кстати очень быстро очищается, а в хранении самих уникальных посещений на диске. Редис или мемкеш использовать только как буффер, чтобы снизить нагрузку, и сбрасывать посещения в отдельную таблицу. То есть перенести этот объем данных из памяти на диск. Но если там действительно несколько сот мегабайт, то не стоит париться.
>>593737 Не, там массив возрващается, это я ридми не обновил. Два метода? Зачем? Пусть будет один, он всегда принимает массив айдишников, и всегда возвращает в ответ массив вида [id => visitCount]. Лучше пойду посплю.
>>593738 Я не в курсе api фейсбука, но мне кажется там должны быть фичи для получения имени и альбомов пользователя. Ну и парсить DOM нужно не регулярками, а библиотеками типа http://habrahabr.ru/post/176635/
Нет. Я написал что перекодировать в 1251 надо только имена которые передаются в функции работы с файлами, только их. А не то что ты вставляешь в базу или выводишь на странице.
САП, пхпач, установил опен сервер на шиндошс, там есть планировщик заданий. Делаю по мануалу, но что-то не хочет работать. Поясни, зачем нужно после php-win.exe указывать файл php.ini? Он не пытается его искать в своей же директории по умолчанию?
Вот неправильный не поправленный пример с оф сайта:
на их сайте неправильно указана директория php.ini, нужно вот так: [CODE]%progdir%\modules\php\%phpdriver%\php-win.exe -c %progdir%\modules\php\%phpdriver%\php.ini -q -f %sitedir%\localhost\test\index.php[/CODE] после запуска этого, пишет в логах Start result:0, но запись в базу не добавляется
если убрать ini-файл, то выходит ошибка в месседжбоске "syntax err0r, unexpected '$' in C:\OpenServer\domains\localhost\test\index.php on line 2" %progdir%\modules\php\%phpdriver%\php-win.exe -c %sitedir%\localhost\test\index.php
наверное из-за того, что он пытается запустить, как вин приложение, хотя сомневаюсь в этом, но информация с оф сайта заставила задуматься над этим: Очень важно понимать, что планировщик заданий (cron) это не командная строка и не консоль. Планировщик лишь запускает программу с указанными в задании параметрами. Таким образом те программы, которые которые могут работать только в консоли, так же необходимо запускать через консоль и в самом планировщике.
в пхп файле содержится это:
[CODE]<?php $db = mysqli_connect('localhost', 'root', '', 'test'); $query = 'INSERT INTO test (date) VALUES (NOW())'; mysqli_query($db,$query); ?>[/CODE]
если просто обновить страницу, то запись добавляется. пути проверял, все верно. поясни, что за параметры -q -f после ини файла? как заставить планировщик запускать этот скрипт?
>>593086 День 4. Адово заболел зуб и ещё простудился, но таки сделал ещё одно задание. https://ideone.com/8YMlrb Бустрее бы добраться до баз данных.
Скриншот ошибки. Я разбираться особо не хочу. В скобках работает всё отлично, без нареканий. А мне и норм. Грешу на сборочку. ибо на Ideone всё работает и так и так на отличненько.
>>593800 ЛОЛ скопировал отсюда и все заработало, видимо ошибся первый раз, когда писал, хотя проверял все
>>593806 Ну, я понял, что есть параметры для самого php.exe, но не понял, что это за параметры после php.ini, это скорее всего опен сервера какие-то параметры, но я не нашел на их сайте что-то что это за параметры
Бериллиевая, покрытая позолотой и инструктированная бриллиантами платина, но... Есть шанс выучить PHP без знаний английского?
Просто учусь на вышке, гумунитарской, для галочки. Понял что не мое - хочу кодить. Математика - по нулям, английский - по нулям. А хочу. Выйдет что путное? Сейчас на народе читая первый урок, вроде бы все интересно, понятно.
>>593864 Я и не мечтал о тысячи долларов в день четыре часа фриланс, и тому подобное. Если уже из этого буду копейку получать - будет наращиваться опыт.
Заебался уже. Надо подключить расширение, а если конкретнее, то amqp.so. В cli сука настроилось сразу же, но мне там нахуй не надо. В fpm уже 3 дня ебусь оно не загружается и ошибок никаких не выдается. Что за хуйня блядь?
>>593857 Верстать на уровне "за копеечку" в канторе типа ПроВебИнфармэйшнТехнологисЛаб, плюющей говноклоны кривых сайтов, может любая обезьяна. И это будет сват/кум/брат/соска дирехтора.
>>593857 А что сложного в том чтобы выучить английский? Тем более что тебе не потребуется читать Шекспира в оригинале, нужно выучить несколько тысяч общеупотребительных слов.
Есть такая дрочильня под названием memrise.com, выучил там 4000 слов за два месяца, занимаясь по полчаса в день. Фильмы в оригинале еще тяжело смотреть, но тексты документации уже идут сносно
>>593865 Персистентность (возможность сбрасывать данные на диск), сложные структуры данных типа хешей, списков, сетов; транзакции, репликации, pipeline, мониторинг, инструменты мониторинга. Много букв про редис http://habrahabr.ru/post/64917/ Много букв про тарантул http://habrahabr.ru/post/133435/
>>593947 >Ты так говоришь, как будто я не собираюсь повышать скилл. На говноработе + универ + еще повышать скилл могут очень быстро сесть батарейки. Возненавидишь отрасль раньше чем научишься чему-нибудь на хорошем уровне. На лоускилл вакансии сейчас бешеный конкурс. На нормальные вакансии конкурс тоже большой. 20-30 человек на место, но реально там конкурируют 2-4 человека, остальные "посмотрел курсы/прочитал книгу" просто массовка. Естественно тебе нужно быть одному из этих 2-4. Это пол года дисциплинированной работы над собой при адекватных способностях. За это время английский выучится по 30 мин в день для достаточного уровня очень легко. Без него очень тяжко. Чтение документации довольно большая часть работы, а она переводится с опозданием если переводится вообще. Можно пробовать фриланс для старта, но там свои подводные камни. Вывод тут простой, если холодильник не душит пиздец с какой силой, то лучше все доступное время трать на обучение, а не на однообразную лоускилл работу.
>>593975 Ты про проекты забыл. Один сайт занимает месяца три-четыре и таких штук 7 надо сделать, доделанных и больших, чтобы типа партфалио. И не просто лендинг а норм сайт с функционалом и на фреймворках.
Посоны, а в пхп вообще есть функции для работы с видео? Чтобы там камеры пользователей писались, граффити сделать. Хочу аналог чатрулетки запилить.. Или такое на шарпе делается?
>>588512 (OP) Объясните нубу, для чего используется php в реальном мире? Почему работодатели требуют знать php от фронтенд разработчиков? Почему работодатели требуют знать php от бэкенд разработчков на python+django?
>>593890 > Geekbrains Просмотрел за пару дней курс, спиздженный с торрентов. Для дауна, типа меня, вполне неплохо как дополнение к книжкам, оповскому гайдику и прочему (дополнительные задачки, пояснения для тупых).
Иногда в требованиях вакансий пишут "знание отличий версий php". Для чего это? Такие конторы работают с древними cms, или может есть настолько поехавшие ретрограды, что до сих пор сидят на четверке?
>>594111 >>594118 Или есть какой-то крупный легаси проект, который сидит на 5.3, и менять версию никто не будет так как рефакторинг дорог, долог и не нужен.
>>594111 >>594118 Или есть какой-то крупный легаси проект, который сидит на 5.3, и менять версию никто не будет так как рефакторинг дорог, долог и не нужен.
Что такое зависимость в юнит-тестах? Это значит, что один тестовый метод вызывается из другого? Вот пример 4.2 на хабре http://habrahabr.ru/post/89175/
Зависимость вроде бы объявляется через phpdoc, но я просто не вижу разницы в результате работы теста, что есть зависимость, что ее нет. Вывод для класса с двумя тестовыми методами и там и там одинаковый Time: 519 ms, Memory: 7.75Mb OK (2 tests, 2 assertions)
Запускаю phpunit.phar через командную строку, еще не дошел до продвинутых опций, может быть там есть опции для подробного отчета.
>>594143 Твой уровень знаний не при чем, семерка просто новая версия, она не сложнее предыдущих, просто добавляются некоторые удобные фичи типа строгой типизации плюс прирост скорости http://habrahabr.ru/post/260351/
Свои проекты можно уже делать на семерке, но большинство сайтов сделаны на 5.3-5.5, естественно заказчики не кинутся платить деньги за перевод на новую версию, если "оно и так работает".
Посоны, не бейте, лучше обоссыте сразу. В общем нужно создать некое подобие вот такой http://www.polagristrade.by/calc/ вот хуйни. Суть такова, чтобы заходящий на сайт хуй, выбирал себе какой-нибудь металл из категорий, указывал количество тонн, нужных ему, а калькулятор считал и выдавал ему конечную сумму с ндс. Формулы-хуермулы, это все я сделаю сам, вопрос в том, как сделать саму базу данных с ценами и категориями. MySql, да? Я создаю БД с ценами-хуенами, а калькулятору просто указываю на нее ссыль, или нет?
>>594165 Спасибо. Ну, я реалист, пока дойду до уровня, на котором смогу без стыда устроиться на работу, пройдет еще полгода, так что, пожалуй, начну сразу новые фичи осваивать.
Внимание, вопрос. Не ради холивара. Стоит вообще сейчас соваться в php или нет? То есть идей своих проектов нет, скилла в программировании нет? Я буду типичный индусом-мусором-помойкой или есть возможность пробиться в люди?
Посоны, подскажите в чем может быть проблема. Есть php календарь https://github.com/jamierumbelow/julian Собственно установил все как в ридми, но объект создается пустой! В чем может быть проблема? Как я понял данный класс написан под CodeIgniter, но там же указано что это стэндэлон класс все должно работать, но почему то не работет.
Или может есть похожий класс для создания календаря? Перерыл весь гитхаб, но этот самый подходящий по функционалу, нет ничего лишнего, но блин, не работает.
>>594283 Контроллер и вью как создавал? Как я понял, его предлагается использовать как - >Copying the contents of libraries into your application/libraries folder will allow you to load Julian like any other CodeIgniter library. Попробуй просто объедини код контроллера и вью в один файл.
>>594311 Этот класс мне идеально подходит, То есть на вход месяц, год, на выходе возможность перебора элементов календаря, чтобы сгенерировать свой календарь. Но почему не работает? <?php foreach ($calendar->weeks() as $week): ?> <tr> <?php foreach ($week->days() as $day): ?> <td class="calendar-day <?= $day->today_class() ?>"> <?php if(!$day->blank()): ?> <span class="day-number"><?= $day->day() ?></span> <?php endif; ?> </td> <?php endforeach; ?> </tr> <?php endforeach; ?>
>>594327 А еще можешь вкратце объяснить зачем в примере у него в контроллере написано это $calendar = new Julian(array( 'url' => site_url('/absence_requests?year=%y&month=%m'), 'current_month' => $month, 'current_year' => $year ));
Возможно раньше вместо метода initialize использовался конструктор __construct, который выполняется при создании объекта, потом он был заменен на initialize, а пример не поправили.
>>594341 В смысле инициализировать, как создать объект? Если ты его заинклудил вручную, зачем тебе автозагрузка? Или ты хочешь избавиться от ручного инклуда?
Вкатываюсь в пхп. В шапке нет гайда по тому, что именно надо учить дабы вкатиться в бэкэнд. Что начал сейчас - сам php, html по видео из youtube. Что надо ещё (кроме ксс, мускула, джаваскрипта (который можно фремворком от твиттера заменить))?
>>594389 Так я не собираюсь в фулстак заделываться, просто если хтмл и цсс надо будет в любом случае (вдруг отвалиться форма регистрации, а фронтендщик-индус пьяный с коровой спит), то я смогу сделать. А задрачивать я в бекенд хочу, чтобы по хардкору.
>>594389 Вот только в вордресс говном кидаться не нужно. Вп по сути тот же фреймворк, созданный под вполне определенные задачи, как и любой другой. И без адекватных знаний php хуй ты чего там путного сделаешь, кроме как нахячить ебанутого лапшекода в шаблоны. Наверно из-за этого вп и приобрел такую бешенную популярность быдло платформы.
>>594423 Задача на сферический в вакууме фейлообменник (за основу копипиздинга был взят рыгост) лично у меня заняла 3 часа. Включая настройку nginx с aio, mod_upload и secure link (для приватных фейлов). Это при том что всё делалось на сифоне2, под который документации на русском нет в принципе.
>>594434 ну блин, ты опытный, я новичек, никогда подобного не делал, просто по учебе нужно что-то реализовать и я подумал файлообменник сделать, для учебы норм и для себя php подучить.
Интересует, сколько его будет делать человек который делает впервые.
>>594445 Если без забивания себе головы ООП-шлаком, аналог рыгоста можно сделать за час, даже нихуя не зная. Только для раздачи приватных фейлов с приемлемой скоростью, нжинкс всё-таки понадобиться.
>>594452 Фреймворки (если ты пишешь аналог рыгоста, а не йобы с платными скачками за смс уровня depositfiles) - нахуй не нужны. Там на всё про всё хватит 2-3 шкрептов. Фейкопочту можешь оставить свою, но я сегодня один хер буду отсыпаться после двух ночей чехарды с миграцией продакшена по 3 разным датацентрам. С побочными эффектами "ёпта, поцоны - у нас новая корзина с товарами, мы не ту ветку на %datacentername% развернули. Налетай на логи, пока юзеры багов не заметили!"
Ребята, есть вопрос по заданию на тему регулярочек. Какого вида она должна быть? Одна здоровая? Если бы я принимал данные через $_POST, то просто убрал бы лишнее через preg_replace. Пишу и пока что получается убожетсво что-то вроде: /^8[^a-zA-Z0-9]([0-9]{3})[^a-zA-Z0-9]([0-9]{2})[^a-zA-Z0-9]([0-9]{3})[^a-zA-Z0-9]([0-9]{2})[^a-zA-Z0-9]*$/ .
Само задание: Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Донный вопрос про уместность "die" в контексте начинающего быдлокодера. Вот, к примеру, примитивнейшая задачка (если это вообще можно назвать "задачей"), которую я накатал за минуту. Насколько вообще уместно стопать скрипт таким образом? http://ideone.com/mMH3Id
>>594482 В некоторых случаях проще закрыться с "нимагу коннект к БД", чем городить огород эксепшенов для достижения того же результата. Что не отменяет того, что он уебан, а die замечательно используется с аргументом.
>>594482 Понятно, спасибо. В мануале уже прочитал об этом, да. Я сейчас только-только в ооп смотрю, написал быдлофотогалерею с соблюдением mvc, так что все эти тонкости мне пока не знакомы. Но когда-нибудь мне захочется приказать скрипту УМЕРЕТЬ.
Тестирую здесь: https://regex101.com/ Само задание: «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок: нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия «жи» или «ши» написано с буквой ы в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан» в тексте есть слова «а» или «но» без запятой перед ними. (можешь добавить еще несколько правил, если хорошо знаешь русский язык) В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).*
Сами вопросы: вот я тестирую в регэксп тестере и это нормально, что у меня, например, в thirdOne всего одно совпадение?
Слушайте, прекратите флудить тупыми вопросами, что да за какое время вам нужно учить. Откуда мы блять знаем? Все это индивидуально. Кто-то знает по 10 языков, написал второй гугл и не может работу найти, кто-то сверстал один макет и устроился в гугл, реально все индивидуально, хватит бесите. Учите то что учится и смотрите по ситуации блять.
>>594548 >Он ищет не первый, а все по всему документу, так? да, наведи на знак вопроса в поле с модификаторами на сайте, там есть описание модификаторов.
>>594608 Вдогон - ещё надо будет написать алгоритмы подобной же проверки банковского счёта и СНИЛС, дабы утырки, любящие порегаться с Иванов И.И. и 12345678 вместо всех номеров - соснулей далеко и надолго. Благо, нехуй там писать.
Мля, посерфил апворк. Везде вордпрессы, жумолы, друпалы, лаварелы, боже упаси ангуляры. Это ведь на каждом из этих говен делать по сайту с уникальным макетом-темой for free для партфалио. Как же это уныло. Наверное сделаю на каждом по простенькому бложику с простейшим макетом, ибо заебало уже пиздец как.
Двач, спасай, препод обезумел, сможешь ли ты совладать с ним?
Определить интерфейс student_interface с методами: show_info, set_debts, show_debts, show_students В файле index.php описать класс students, который реализует интерфейс student_interface и содержит следующие свойства и методы: Свойства: $name - имя студента. Значение свойства должно быть доступно только в контексте класса; $group - группа. Значение свойства должно быть доступно только в контексте класса; $n_assignments - количество выполненных заданий; $n_absents - количество пропущенных лекций; $debts - boolean, false - нет долгов, true - есть долги; $n_questions - количество вопросов на зачете. Константы: N_LECT - число прочитанных лекций; N_LAB - число лабораторных заданий. Методы: show_info - выводит информацию: имя студента, группу, количество выполненных заданий, количество пропущенных лекций, количество посещенных лекций; set_debts - устанавливает значение переменной $debts, true - если есть пропущенные лекции и остались невыполненные задания, false - иначе; устанавливает значение $n_questions = числу пропущенных лекций; show_debts - выводит "нет долгов" если $debts=false, иначе выводит "есть долги" и информацию: количество вопросов на зачете, количество невыполненных лабораторных. Добавить в класс конструктор, принимающий 4 аргумента: имя студента, номер группы, количество выполненных заданий, количество пропущенных лекций и устанавливающий значение свойств $name, $group, $n_assignments и $n_absents соответственно Определить метод __clone() так, чтобы при создании копии объекта класса students сбрасывались значения свойств $n_assignments, $n_absents, $debts, $n_questions Добавить в класс статическое свойство $n_students - счетчик объектов и метод show_students для вывода текущего количества объектов класса students. Добавить деструктор класса и модифицировать конструктор для учета числа объектов Создать несколько объектов класса, передав в конструктор различные значения параметров. Вывести информацию о студенте (show_info) для произвольного объекта Создать копию $copy произвольного объекта. Вывести информацию show_info для $copy Вызвать метод set_debts, а затем вывести долги конкретного студента с помощью show_debts Создать класс child_students, наследующий класс students. Переопределить метод show_debts таким образом, чтобы при выводе $n_questions учитывались пропуски лекций по-болезни (пропущенная по-болезни лекция считается посещенной). Для этого добавьте в класс child_students свойство $n_reports и переопределите конструктор С помощью final запретить перегрузку метода show_debts в классе students. Объяснить возникновение ошибки.
interface students_interface { public function show_info(); public function set_debts(); public function show_debts(); public function show_students(); }
class students implements students_interface; { define ("N_LECT", ""); define ("N_LAB", ""); $name; $group; $n_assignments; $n_adsents; $n_absents; $debts; $n_questions; private function show_info($name, $group, $n_assignments, $n_absents,$n_adsents); private function set_debts($n_questions) { if ($debts = false) { echo "нет долгов"; else echo "есть долги,"."количество вопросов на зачете = $n_questions"."" } } public function show_depts(); public function show_students(); } }
public function __construct($name, $group, $n_assigments, $n_absents) { $this->name = $name; $this->group = $group; $this->n_assignments = $n_assignments; $this->n_absents = $n_absents;
> Все, что не смог сделать (слим композером, чтобы автолоад был, твиг добавить) - сделать не получилось. Надо бы разобраться и сделать. Ведь с точки зрения сложности микрофреймворк сложнее чем композер, композер всего лишь инструмент для установки и управления установленными библиотеками. Ну а автозагрузка это элементарно и ты должен в ней разбираться на этом этапе.
Твиг можно не добавлять, если не хочешь, но мне кажется, ты упускаешь возможность познакомиться с этим современным и продвинутым шаблонизатором.
Если ты не можешь найти какую-то информацию по этим темам - так и напиши, я пороюсь в своих пастах, про автозагрузку у меня точно что-то было, и статьи на хабре есть.
Композер сейчас везде используется, без него ты далеко не уйдешь.
> Переименовать тоже не могу, ибо в сборке ИДЕ он уже как твигблог записался Ну это несерьезно. Что ты за программист если с IDE справиться не можешь? В крайнем случае сотри конфиги своей IDE и создай новый проект в той же папке.
Также, из репозитория нужно убрать конфиги твоей IDE так как они интересны только тебе.
1) перенести папку nbproject в другое место 2) закоммитить это изменение 3) добавить ее в gitignore и вернуть на место 4) закоммитить (папка не должна теперь закоммититься)
Есть еще такая штука, можешь сделать если хочешь (было бы полезно, я думаю). В целях безопасности можно сделать так, чтобы твой проект лежал не в корне веб-сервера, а на один уровень выше и таким образом корень сайта находился например в папке public (в ней лежат 2 входных php скрипта и css файлы). В этом случае весь код, конфиги оказываются вне корня сайта и к ним нельзя обратиться напрямую или прочитать. Так получается надежнее и безопаснее. Если ты можешь настроить свой сервер (Апач) таким образом, можешь попробовать.
Ты перехватываешь исключения, но никуда их не логгируешь. То есть у какого-то пользователя сайта произойдет ошибка - а ты о ней никогда не узнаешь и не исправишь. Это неправильно. Логгируй подробности исключения функцией error_log, подробности в мануале.
Далее, у тебя много закомментированного кода - удаляй его, он мешается и если что его всегда можно найти в истории гита.
> $app->render('Header.php', compact('app')); > $app->run(); > $app->render('Footer.php', compact('app')); Это неправильно. Ты закладываешь идею что любые действия всегда будут выводить одну и ту же HTML страницу с одной и той же шапкой и подвалом. Но в реальности нам может понадобиться отдавать другие виды контента, например картинку или JSON или еще что-то. Более того, после вывода шапки мы не можем выводить заголовки, ставить куки и делать редиректы (домашнее задание: объясни почему так, для этого тебе понадобится почитать про протокол HTTP, можешь глянуть мой не очень хороший урок https://github.com/codedokode/pasta/blob/master/network/http.md или нагуглить сам)
В общем, жду что ты это исправишь и напишешь почему мы с твоим кодом не можем ставить куки, добавлять заголовки в ответ и делать редирект.
> $log = $login->getLogin($user_id, $db); Не надо сокращать «логин» как «лог» так как «лог» значит «файл журнала» и это сбивает с толку при чтении кода.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes.php Этот ужас надо заменить автозагрузкой. Я понимаю, если бы у тебя было 2-3 инклуда, но там их десятки. Для начала погугли и сделай автозагрузчик через spl_autoload_register, после того как это сделаешь и покажешь, переделай на автозагрузку через композер. Если что-то непонятно, задавай вопросы.
Автозагрузка - это возможность в PHP вызвать указанную тобой функцию при обращении к не загруженному классу. Твоя функция может подключить файл где определен этот класс, и таким образом писать руками десятки require не требуется.
Однако, функция-автозагрузчик получает на вход имя класса, который нужен PHP. Как определить в каком именно файле он описан? Для этого надо соблюдать некоторую договоренность, например стандарт PSR-4 который задает сосответствие между именем класса и файла. В PSR-4 сказано что класс с именем
\A\B\C\D
должен хранится в файле с именем вроде
/some/folder/A/B/C/D.php
Теперь по ООП и MVC. Я не вижу в твоем коде ни особого следования MVC ни правильного ООП. Ты просто раскидал код по классам и функциям, но это еще не делает код объектно-ориентированным. То же самое с MVC - я не вижу четкого разделения контроллеров и моделей: например тут огромная простыня кода вписана в контроллер: https://github.com/toppestkek/TwigBlog/blob/master/app/routes/fileEdit.php
В общем, над кодом требуется серьезная работа (рефакторинг). Тут пока даже на тройку с минусом не набирается. Ты освоил правила и синтаксис языка PHP, но правильно разбивать код на классы и функции пока не научился. Справедливости ради, у меня нет уроков которые бы это объясняли, потому придется учиться на примерах твоего кода.
Что такое Foo? Освой функцию поиска\замены в своем редакторе кода и переименуй класс в что-то осмысленное.
Далее, надо разобраться с приватными/публичными методами и полями. Как ты думаешь, по какой логике должны ставиться слова private/protected/public? Как выбрать уровень доступа для поля или метода?
В помощь тебе дам пасту про инкапсуляцию, возможно ты ее не до конца поймешь сейчас, но со временем, думаю, разберешься.
--------------
Инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными и сами данные, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему). Также, это упрощает изменение кода: если какое-то свойство имеет уровень private то доступ к нему возможен только из того же класса и тебе не надо бегать по всему коду и смотреть что там с этим свойством делается, тебе достаточно просмотреть один файл с этим классом.
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
Если проводить аналогии, то можно представить кофе-машину. Ты нажимаешь кнопку (=вызываешь публичный метод) и получаешь кофе (=результат вызова этого метода), при этом ты не видишь что происходит внутри нее и тебе не надо в этом разбираться.
Еще одна важная вещь - это принцип так называемой «одной ответственности» (Single Responsibility). Это значит что каждая функция или класс отвечает только за какую-то свою часть работы. Ну например класс, сохраняющий данные в базу не пытается заниматься выводом чего-то на экран, и наоборот, шаблон, в котором происходит вывод, не пытается делать SQL-запросы к базе.
Также, есть такая вещь как зависимости. Функции или классу для своей работы могут быть нужны какие-то данные, объекты других класссов. Но не стоит делать эти зависимости слишком широкими. Практически по всем случаям где у тебя передается объект $app, придется разбираться и смотреть: а нужен ли нам там весь объект фреймворка? Может быть достаточно передать только часть, например только объект хранящий запрос (request) или только объект формирующий ответ (response)?
У меня такое ощущение что ты просто взял код с функциями и каждую функцию завернул в свой отдельный класс. Боюсь, что это не очень похоже на ООП.
Давай-ка разберемся, для чего они нужны.
https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Helper/Cookie.php - тут название не соответствует тому чем занимается класс. Название говорит что это класс, объект которого хранит информацию о куке. Но в коде мы видим, это не так. Скорее этот класс можно назвать UserIdentifierGenerator (генератор идентификатора пользователя) так как он именно эти занимается. Или UniqueTokenGenerator - генератор уникального токена.
https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Helper/RegExp.php - можно подумать что класс хранит информацию о регулярном выражении. Опять же видно что это не так, это какая-то самодельная защита. Давай я поясню тебе как легко ее обойти. Ты фильтруешь строку document.write. Но что если я запишу ее в виде document['write'] ? С точки зрения JS это то же самое. И кстати непонятно чем эта строка так опасна.
У меня сложилось ощущение что ты не разбираешься в узявимостях. Поэтому твой фильтр оказался бесполезен и легко обходится. Бороться с уязвимостями таким фильтром это то же самое что прыгать с бубном и вызывать дождь. Давай попробуем в них разобраться - почитай например мой урок про XSS с которой ты скорее всего и боролся: https://github.com/codedokode/pasta/blob/master/security/xss.md
Ну и мне не нравится идея вырезать символы вроде <. Зачем? Надо пропускать любые символы, просто выодить их так, чтобы они не могли причинить никакого вреда.
Вообще, я подумал что код который работает с отслеживанием анонимных и зарегистрированных пользователей лучше всего будет собрать в один класс. Назвать его можно например LoginManager, AuthManager, LoginService - как-то так. Продумай, какие методы должны быть у такого класса, что они делают или возвращают.
Я думаю, для начала тебе хватит этих замечаний. Странно, что ты делаешь такие ошибки хотя ты дошел до второго задания. Куда же я раньше смотрел?
Если что, задавай вопросы. Я сейчас довольно занят, код быстро наверно проверить не могу но кинуть пасту или дать совет наверно смогу. Тем более в твоем случае у нас есть конкретный код и мы можем разбирать примеры на нем, что тут плохо и что можно поменять.
И вообще, я советую тебе перед тем как делать класс, ответить хотя бы мысленно на такие вопросы:
— для какой сущности мы сделаем классы? Что представляют собой объекты этих классов? ну например CommentMapper это класс который сохраняет и загружает из базы объекты Comment. — какие у них есть свойства? — что мы хотим от них получить, что они должны уметь делать (какие у них должны быть методы)? — как сущности связаны? Ну например CommentMapper имеет зависимость от PDO - он ему нужен чтобы делать запросы к базе.
Можно сделать так: вставить запись без имени, получить id, сохранить файл на диск, добавить в базу имя файла. Разумеется все это нужно завернуть в транзакцию, чтобы при какой-то ошибке в базе не осталось наполовину заполненной записи.
> джойны - это плохой тон в SQL. Как goto. Об этом ещё Бобук говорил Потому что Бобук менеджер, а не специалист по базам данных. Хотя я не знаю, говорил ли он на самом деле это, в каком контексте или ты все это сам сочинил.
Если ты хочешь рассказать что джойны плохая вещь, то надо пояснить: в каких конкретно условиях. Просто говорить что «джойны - плохо» это глупость. Потому что это инструмент для объединения таблиц и в общем случае заменять его на велосипед худшего качества не имеет смысла.
О цене надо договариваться до начала работы. Иначе он скажет: молодец, хорошо потрудился, держи 100 копеек (100 копеек это около 1.5 цента США).
Также, ты должен искать способы сократить затраты времени. Например если тебе надо сделать несколько магазинов, можно сделать какую-то заголовку где часть модулей уже предустановлена и настроена. Если ты делаешь верстку, можно какие-то компоненты сохранять и потом повторно использовать.
В общем, старайся подумать как и где можно выиграть время.
REST и Slim не связаны напрямую. REST это набор договоренностей о том как построить API на основе протокола HTTP, Slim это микрофреймворк. Что именно тебе непонятно?
Про REST для начала изучи протокол HTTP, без его знания статьи про REST читать нет смысла.
Пути лучше наверно писать в конфиге через прямой слеш: c:/Server/bin - а то вдруг он их как экранирующие последовательности понимает.
Тебе надо проверить, какой именно php.ini используется и какие настройки применились, для этого сделай файл с единственной командой <?php phpinfo(); и посмотри что она выведет. Возможно ты правишь не тот php.ini.
А, вспомнил! «Unable to load» значит что у библиотеки вроде php_interbase.dll есть какая-то зависимость (другая dll) и она у тебя не установлена (либо не находится в списке каталогов в PATH). Ты можешь взять программу https://ru.wikipedia.org/wiki/Dependency_Walker (или аналог), она покажет какие файлы нужны.
В твоем случае, для php_interbase.dll скорее всего нужна какая-то библиотека от interbase, и проще всего отключить этот модуль в php.ini.
Код лучше выравнивать (читай второй пост в треде), а то тяжело читать.
> function printHint($questions){ Тут стоит questions (вопросы) во множественном числе, можно подумать это массив вопросов, но реально это один объект. Не стоит так запутывать читателя.
Также, функция называется printHint (напечатать подсказку) но она ничего не печатает. Опять же, нехорошо.
Ну и она тут не очент нужна, я думаю, проще было сделать echo "Подсказка : .... "; и тут же вписать вывод поля hint из объекта $question через стрелочку.
> ([!]+)\\S?([,]+)\\S? Странное выражение: почему оно ищет восклицательный знак? Ну и давай попробуем выкинуть это и рассмотреть такое выражение: \\S?([,]+)\\S?
- сначала может идти (а может не идти) не-пробел - за ним 1 или более запятых - за ней может идти, а может не идти, не-пробел
Так как \S тут не обязателен то это выражение срабатывает для любой запятой. Очевидно это неверное выражение, надо искать только запятую после которой нет пробела. То есть искать примерно такое:
- запятая - за ней буква (или цифра)
Это простое выражение найдет все случаи где пропущен пробел после запятой. Обрати внимание что регулярками удобнее искать по условию «тут должен быть такой-то символ» или «тут должен быть любой символ кроме», а не по «тут не должно быть».
Если что-то непонятно то реши задачу и попроси потом еще. В задаче про палиндром идея такая: идем по строке с концов к центру и берем каждый раз по 2 буквы: с левого и правого края, и сравниваем. Если они не совпали то перед нами не палиндром. Если все пары букв совпали, то палиндром.
Другой вариант: разбить слово на массив букв, перевернуть массив, склеить назад в слово, и сравнить с исходным - совпадет или нет.
> $LastTransact=( $creditBalance x $percent ) + $servicePayment; > $paymentTotal = $paymentTotal + $monthlyPayment; Это повторяется несколько раз, убери копипасту.
Не называй переменные с большой буквы (только классы и константы, ты с ними потом познакомишься).
Также, ответ должен быть около 61270 а не 80 000. Попробуй поставить сумму поменьше, например долг 1000 или долг 4000 и поссмотри что твоя программа насчитает.
> echo "<br>";
------ Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
>>594826 >Так может выглядеть Ваше резюме после прохождения обучения и стажировки >Должность: Senior Web Developer >Желаемая зарплата 90 000 руб. >Опыт работы < 1 года Даже не знаю.... Но в рекламе же врать не будут...... И все комментарии одобрительные...... Пойду еще оплачу курс по джаве, буду через полгода работать на двух работах и получать 4000$ ))))
Городить огород не надо. Одна строчка throw по умолчанию завершит скрипт и сохранит информацию об ошибке в лог. А вот die не сохранит и ты об ошибке не узнаешь.
Послушай-ка. Мы тут изучаем общепринятые подходы, а они говорят что фреймфорки экономят время, структурируют код, и позволяют не изобретать велосипед.
Гениев вроде тебя, способные в одиночку за ночь написать гугл без фреймворков тут вряд ли поймут. У нас тред для обычных людей.
> С побочными эффектами "ёпта, поцоны - у нас новая корзина с товарами, мы не ту ветку на %datacentername% развернули. Налетай на логи, пока юзеры багов не заметили!" да, у гениев свои проблемы которые обычным людям не знакомы.
>>594838 Удваиваю, где-то выше задавал подобный вопрос. У Бергмана на сайте что-то мутится с transition для выстраивания блоков, не понимаю как это работает. >>594100
зависимость A от B значит что методу A нужен результат выполнения метода B, то что он вернет (посмотри там передается массив в примере). Лучше наверно их избегать так как с ними сложнее читать тесты. Лучше когда тесты независимы.
> Это значит, что один тестовый метод вызывается из другого? Нет значит что вызвается B и то что он вернет передается потом методу A.
> Зависимость вроде бы объявляется через phpdoc, но я просто не вижу разницы в результате работы теста, что есть зависимость, что ее нет. А как ты проверял? Ты наверно ошибку допустил потому что код в примере, если убрать depends, будет выдавать ошибку.
>>594857 >{} в цикле на одну строку Ты что там делаешь, ты что, ебанутый? >добавить проверку что на вход функции подается строка нужной длины is_numeric, в дальнейшем длина проверяется собссно на длину
Самое забавное что если смотреть буквально то тут нет ни слова лжи. Действительно, ты можешь сделать себе такое резюме. Более того, ты можешь сделать его прямо сейчас не проходя курсов.
Я слышал, в соседних странах много талантливой молодежи и там бывают 23-летние сеньоры и 19-летние тимлиды, но у нас в стране на вакансию сеньора вряд ли будут рассматривать резюме человека у которого нет года опыта.
Также, на другой странице написано:
> средняя зарплата программиста в Москве - XXX
только это не значит что ты после прохождения курсов будеь ее получать.
У меня такое ощущение что это рассчитано на далеких от нашей области людей, менеджеров каких-нибудь, эконоимстов, чтобы они увидели цифры и не раздумывая купили курсы.
>>594860 >Если число колонок фиксированное то можно просто сверстать колонками. У меня вывод идет неограниченного количества статей в рубрике, и суть в том, что блоки тогда придется наполнять через js уже после загрузки страницы, либо в шаблоне фигачить кучу ифов для того чтобы открыть и закрыть 4 блока. Но с 4 блоками тоже неудобно при адаптивности, ведь когда один из блоков выпадет вниз - его либо через медиа придется переписывать, либо он будет слева под тремя торчать как палка.
Да, с 4 блоками неудобно делать адаптивность. Тогда надо яваскрипт-плагин выравнивающий блоки, но там свои подвохи - например как сделать чтобы при загрузке верстка не прыгала.
>>594871 Ну на время загрузки можно спрятать всё и показать прелоадер. Но всё равно как-то не взлюбил использовать жиэс не для анимаций, а для обычной верстки.
>>594875 Вот в этом и беда, можно как на том сайте, без js будет показывать в том виде как по кодпен ссылке выше, а с js будет абсолютами вешать их попутно изменяя их позицию
Я так понимаю, ему надо сделать: SELECT * FROM employees WHERE seting >= 3 да, английский уровень ФЛУЕНТ видать правильно? И как вывести это в списке ниже на странице, такой же цикл вроде работать не будет?
>>594870 Ты ещ про PEP8 напомни, с лестницами из пачек пробелов. for(;;) foo_bar(); - совершенно нормальное сишное написание. вариант for() { foo_bar(); } пошёл от перла, в котором тоже можно сделать в одну строчку, но на сишку уже будет не похоже. >регулярку Нахуя, учитывая крайнюю "скорость" pcre в похапе? Есть is_int()/is_numeric(). Последний как раз и рекомендуется для стринга.
Ребята, подскажите, допустим у меня в бд есть строки вида "Улица Каштановая дом 2". "Улица Новая дом 2". Когда я делаю поиск типа LIKE 'новая' то не находит ни одной строки. Когда я делаю поиск типа LIKE '%новая%' Находит и ту строку и ту. Как сделать поиск таким образом, чтобы не было такого как во втором случае? чтобы искало по словам целиком, а не их частям?
Кто-то выше писал про курсы. НЛПдаун, писавший этот рекламный скам, прокололся в двух местах. Во-певых, в том, что Хуйнов Хуян, успешный погромист 10 компаний-лидеров-митол-групп, владеет методами НЛП (уже ржём), а ещё решил всем рассказать как стать охуенным программистом и зарабатывать дохуя бабла.
Короче, "продам книгу как заработать миллион - потому что очень ЖРАТЬ ХОЧЕТСЯ".
Не сочтите за троллинг, такой вопрос. Программисты ребята обычно умные (как-никак аналитическое мышление), а следственно могут в логику инвестирования и реинвестирования, сложные проценты, все дела. Так почему же программисты не развивают свой маленький бизнес, дающий 100% годовых при минимальных усилиях ?
анон, имеется проблема с yii framework: описаны два класса в двух файлах (Event.php и Video.php) http://pastebin.com/k1rmY1NZ
Event.php был описан ранее и вполне рабочий, Video.php описан по его подобию.
в контроллере описываю экшн для добавления записи в БД http://pastebin.com/bXJaeyQ5 (addvideoreport по аналогии с addevent). Но, экшн addEvent работает, а addVideoReport выбрасывает ошибку Property "Video.src" is not defined при попытке вызова save()
>>594930 ПАЦАНЫ, А УЧОНЫЕ ОНИЖ УМНЫЕ, НАХУЯ ИМ ФИНАНСИРОВАНИЕ ПОЧ ОНИ НЕ СОЗДАТУТ ЁБА БИЗНЕС ТИП ЧТОБ БАБЛО НА ИССЛЕДОВАНИЯ МУТИТЬ?))) блядь как же ты меня выбесил своей тупостью
>>594940 эм, а где его описывать, и каким образом, ибо в самом классе нет конструктора, который бы описывал. Свойство это вроде как нестатическое, и экземпляр класса я создаю непосредственно в функции
>>594963 > Ну а насчет 100% годовых - это маловероятно. Ты у нас я вижу хорошо разбираешься в экономике, подумай сам, почему. Делал порносайты 1000% годовых
>>594962 > Что программист может инвестировать? Накопить тысячу долларов и за 11 лет стать миллионером
>>594932 > Хуйню написал С этим у меня проблемы. Всегда переоцениваю интеллект людей, из-за чего принимаю кучу мер, дабы этим не смогли тактически воспользоваться ушлые персоны
>>594939 > ПАЦАНЫ, А УЧОНЫЕ ОНИЖ УМНЫЕ, НАХУЯ ИМ ФИНАНСИРОВАНИЕ ПОЧ ОНИ НЕ СОЗДАТУТ ЁБА БИЗНЕС ТИП ЧТОБ БАБЛО НА ИССЛЕДОВАНИЯ МУТИТЬ?))) > блядь как же ты меня выбесил своей тупостью
Ну анончик, как бы у ученых цель - развивать науку, а у погроммистов - зарабатывать. Неужели кодить легче, чем вкладывать деньги и отдавать распоряжения?
Я вот как вспоминаю кодин. Все эти циклы, сверка имен переменных, пиздец. Простая примитивная работа, вся суть котрой сводится к тому, чтобы копировать в нужные места названия переменных, постоянно переключаясь между вкладками и ища эти самые названия переменных. На сам кодинг уходит процентов 10 времени
> Простая примитивная работа, вся суть котрой сводится к тому, чтобы копировать в нужные места названия переменных, постоянно переключаясь между вкладками и ища эти самые названия переменных. Ты IDE установить не пробовал? Ну или писать более качественный код как вариант?
>>594991 >Ну анончик, как бы у ученых цель - развивать науку, а у погроммистов - зарабатывать. Ой блджад. Ладно, пусть будут не ученые, а инженеры. Умные люди, цель - зарабатывать деньги. Почему же они не становятся финансовыми воротилами?
>>594859 Вот ты пудель, что нельзя было сразу сказать что за этот эффект отвечает библиотека isotope?
Кстати в мануале есть демо-пример http://codepen.io/desandro/pen/mEinp Что интересно, там все ломается, если не прописать box-sizing: border-box. Если запускать не на codepen а локально, все вообще жестоко (пик). В третьем бутстрапе по-моему тоже какие-то манипуляции с box-sizing. Это сейчас такая общая тенденция, w3.org случайно не планируют выставить значение по умолчанию border-box?
Поясните, аноны. Доделываю кое-какой сервис в роли первого проекта для портфолио. Интересуют правовые вопросы: 1) Обязательно ли писать правила использования? 2) Что если мне нужна, например, иконка из гугла. Я ее чутка отредактирую даже. Не будет ли это нарушением прав?
>>595098 Вряд ли твой говно-код кто-то захочет украсть, а если какой-то вован и спиздит, то разве жалко? Мои проекты на гитхабе, которые вбрасывал в тред, пара васянов форкнули, ну и на здоровье, на то он и оупен-сорс.
По поводу вещей из гугла, так там же пишут, можно использовать или нет. Бесплатных ресурсов уйма. Ну и даже если ты возьмешь что-то платное, я не думаю что ты попадешь в контору, где за такое убивают, как у меня во дворе.
>>595105 Я совсем не про свой код. Правила использования - ToS. На крупных сайтах выложены почти везде, огромной простыней, мол, что они делают с данными.
А есть где подробно расписано, как натягивать вёрстку на вордпресс. Только не на стандартный шаблон, там где обычный блог и можно обойтись стандартным циклом и функциями вида get_header() и т.д. А такой шаблон как например ОП дал для вёрстки? Как например сделать так чтобы заголовок в шапке можно было изменять из админки? Создавать запись с таким заголовком а потом выводить её по определённому ID из базы данных и без ссылки?
Ты документацию вордпресса по темам и API читал? Там может быть эта информация. Разумеется надо понимать устройство и архитектуру вордпресса чтобы это сделать.
>>595245 Я читал, некоторые моменты. Вот например натянуть тему обычного на вордпресс вполне просто, там всё очевидно. А если это сайт какой-то компании например, где нет стандартной блоговой вёрстки, то здесь я уже не очень понимаю. Единственное что мне приходит в голову это создавать запси и вытаскивать их из базы по ID, для каждого блока текста например. Но не думаю что это правильно. Мне бы хоть полуслово услышать от тех кто таким занимается, тогда бы я быстрее всё понял, а так не получается.
>>595228 Я даже скачал макет ОПа, чтобы посмотреть. Макет прекрасно просто устанавливается на вордпресс. для этого есть мануалы на ютубе и в сети, гугли. когда я устанавливал свой макет на вп, у меня возникла проблема только с менюхой, ибо она в вп рендерилась в хедере, а по макету она шла уже в контейнере. ну я и оставил в хедере.
>>594821 Так я и сохраняю модули. Сайдбары, хедеры, футеры, карточка товара - все это можно использовать повторно. Но сам факт, что у категорий, есть суб-категории (это еще надо подумать, как привязать или поискать суб-категории к опенкарту, ведь там есть контроллеры только для категорий). Т.е. структура сайта очень даже разветвленная, а еще эти категории и подкатегории должна быть возможность добавлять, удалять и редактировать. Потом он просил добавить комменты с премодерацией, такой функции в опенкарте не вижу, значит нужно свой велосипед городить с возможностью добавлять, удалять комменты и добавлять их только после одобрения админом, и рендерить их для модерации либо в админке (фикс и дописывание админки), либо отправлять на ящик. А это еще месяц-два. А потом еще думать, как это прихерачить к контроллерам и бд опенкарта, о которых мне доподлинно ничего не известно (ибо не я же писал), а значит нужно сидеть и разбираться, что и куда и откуда там идет, как это все работает с базой и как рендерятся айди, поскольку зависимость у таблиц там сложная, по айдишкам добавляются и рендерятся контроллеры и категории, имя таблиц и сущностей для фикса генерируется динамически, т.е. ты даже не знаешь, что именно у тебя произошло в контроллере или модели и какой запрос был к бд при выводе той или иной страницы и где вообще там работа с дб, поскольку паттерн Data Mapper они там, судя по всему, не юзают и в работают с бд прямо из контроллеров.
Фикс незнакомой цмс - это как ходить по канату на ощупь с завязанными глазами.
Время для работы на таким вот инет-магазином я бы оценил - месяца три минимум, максимум пол-года. Ну а стоимость, по 1 000 у.е. в месяц - 3 000 у.е. минимум. Да, это с учетом использования готовой цмс для фикса. Если взять фреймворк и с нуля еще и админку херачить (допустим очень простую и примитивную админку) - даже не знаю, сколько по времени и сложности выйдет, ибо не пробовал еще, но наверное все же выйдет быстрее и проще, чем работа с плохо фиксируемой готовой цмс, имеющей большой спектр возможностей для управления сайтом (плюс для пользователя). Но он именно так c издевкой и горой скобочек сказал "можно же готовое взять))" и сроки поджимают, нужно сделать "за 5 дней", а потом он нашел кого-то, кто согласился "взять готовое и сделать еще быстрее". Еще быстрее, чем 5 дней, Карл и прям "взять готовое". Не, я просто в ахуе с такого ТЗ.
>>594784 Я разбираюсь в композере. Но я уже написал сайт со слимом, подключенным прямо в папке, я повторяю, что при удалении этой папки и подключении слима композером - структура сайта ломается и все перестает работать. Не знаю, почему. Видимо, некоторые вещи не поддаются "рефакторингу" и нужно с самого начала делать их определенным образом, ибо позднее они становятся неизменными. Твиг я планирую подключить к юи2 в следующем прожекте. Неоднократно читал на стаке да и здесь, что у слима проблемы с подключением твига. Видать, особенности фреймворков. Также читал на стаке, что автозагрузка в слиме работает только, если слим подключен композером. Опять же "особенности" этого кривого фреймворка, автозагрузка классов в другом проекте у меня работает без перебоев и ее принцип я понимаю.
>можем выводить заголовки, ставить куки и делать редиректы
Все у меня ставится и редиректится на локалке, переменные в хедер передаю через append data.
>Foo Не хочу переименовывать, слишком много мест надо будет править в коде. Private ставится, если метод или переменная используются только внутри класса. Public ставится если метод или переменная используются при создании объекта класса, т.е. вне его. Protected как и статик используются, только если на протяжении всего проекта объект создается только один раз и его содержание должно оставаться неизменным.
>document['write'] Я решил реплейсить вообще все спецсимволы, потмоу что мне уже один раз так стерли сайт через document.write. ______________________________ Вот смотрите, шкальники, мой прожект тянет только на 3 с минусом. А вебом я занимаюсь уже почти 2 года. Теперь вы понимаете, что изучать один только маленький узенький похапе можно всю оставшуюся жизнь, а делать какой-то жалкий файлообменник десятилетиями? Я вас предупредил.
Поясните за фриланс. Допустим есть заказ на правки в верстке и допиливание функционала. Как это выполняется? Мне доступ к админке что ли дадут? А если я там снесу всё к хуям и редирект на лошадей с хуями поставлю?
>>595315 > А вебом я занимаюсь уже почти 2 года. Расскажи поподробнее чем ты занимался два года. ЦМСками? Или ты писал на чистом пэхапэ? Просто странно что ты ни до композера не дошел, ни до фреймворков
А по поводу слима и твига там все элементарно работает, правда если ставить через композер. Просто дополнительно нужно подключить slim\views для интеграции smarty или твига.
>>595403 Короче я совсем не понял что произошло, уже процесс эксплорером вырубил 99% софта. Всё-равно кто-то 80 порт занимает. по ID написано System. Никаких других идентификаторов нет. Вообще какой-то бред.
Вот откуда у тебя такое недовольство? Тебе предлагают возможность улучшить свои навыки, изучить какие-то новые вещи.
Ну и ты пишешь что ты 2 года в вебе, но при этом ты не знаком с композером, микрофреймворками, не умеешь правильно разбивать код на классы. И классы переименовывать не умеешь. Это все сильно будет тебя ограничивать, например ты не сможешь пройти конкурс на какие-то вакансии где это требуется. А мы даем тебе возможность всему этому научиться.
> я повторяю, что при удалении этой папки и подключении слима композером - структура сайта ломается и все перестает работать. Ты программист или шаман с бубном? Если не работает надо разобраться почему и исправить причину проблемы. А не говорить «почему-то не работает».
Если ты не можешь разобраться сам, напиши, я попробую тоже глянуть. Только пиши с подробностями, что ты куда вписал, какая ошибка выводится и тд.
> Видимо, некоторые вещи не поддаются "рефакторингу" и нужно с самого начала делать их определенным образом, ибо позднее они становятся неизменными. В программировании все поддается рефакторингу.
> Неоднократно читал на стаке да и здесь, что у слима проблемы с подключением твига. Какие конкретно проблемы?
> Опять же "особенности" этого кривого фреймворка Это неправда. Как минимум потому что автозагрузка в Слиме работает только для классов Слима и не отвечает за другие библиотеки.
> Все у меня ставится и редиректится на локалке, Хорошо, но разве оно должно работать? Разве можно выводить заголовки если выведен кусок страницы? Надо разобраться почему так происходит. Например попробуй в качестве экмперимента добавить в хедер вывод 10 000 пробелов и посмотреть будут ли работать редиректы.
И опять же, ты пишешь что ты 2 года в вебе, но при этом не знаешь особенностей протокола HTTP.
> Не хочу переименовывать, слишком много мест надо будет править в коде. Это хороший повод научиться пользоваться поиском/заменой. Я знаю что в хороших редакторах поиск поддерживает регулярные выражения и это дает много возможностей. Если ты будешь когда-нибудь работать программистом или писать какие-то свои проекты такие навыки будут полезны.
Более того, в продвинутых IDE вроде PhpStorm по моему есть опция для переименовывания функций и классов. IDE все за тебя сделает, надо только разобраться.
> Вот смотрите, шкальники, мой прожект тянет только на 3 с минусом. А вебом я занимаюсь уже почти 2 года. Теперь вы понимаете, что изучать один только маленький узенький похапе можно всю оставшуюся жизнь, а делать какой-то жалкий файлообменник десятилетиями? Ну смотри, у нас в треде такая планка. Если это не первое задание которое ты делаешь, это тебя не должно удивить. Если первое то лучше бы было не браться сразу за файлообменник, а может решить предыдущие задания. Ну в любом случае, это ведь повод для того чтобы улучшить свои знания.
> Protected как и статик используются, только если на протяжении всего проекта объект создается только один раз и его содержание должно оставаться неизменным. Неверно. Модификатор доступа protected определяет что доступ к полю имеет только класс и его наследники. Модификатор static используется для полей и методов, не относящихся к конкретному объекту, которым не нужен $this.
Сколько раз создается объект тут никакого значения не имеет.
> Я решил реплейсить вообще все спецсимволы, потмоу что мне уже один раз так стерли сайт через document.write. Это потому что ты не хочешь разбираться с причинами уязвимостей а хочешь стучать в бубен. С таким подходом сотрут еще не раз.
>>595455 >Для решения проблемы и освобождения занятого системой 80-го порта достаточно остановить сервис «Web Deployment Agent Service». Сам грешил на него, но в службах его и в помине нет, что странно, поскольку я что-то подобное ставил пару месяцев назад. По моему webmatrix.
>>595457 >>595456 >>595455 >>595453 Парни, спасибо всем. >Рассмотрим детальнее четверый случай, т.е. Web Deployment Agent Service/MsDepSvc Майкрософт в win10 просто русифицировал названия. Методом отключения всего и вся я установил что теперь это Служба веб публикаций! Так и остался вопрос, зачем ей заслонять 80 порт, и зачем она не пишет свои ID при скане. Спасибо за помощь! Вы няшки!
>>595358 композер я знаю и фреймворк целый один знаю. занимался версткой, макетами, мамку твою поебывал, читал доки, задачки, куда ж без них, целую одну решил, файлообменник год писал.
>>594689 >С помощью final запретить перегрузку метода show_debts в классе students. Объяснить возникновение ошибки. Это уже вообще шизотребование. Через эксепшн запретить перезагрузку и объяснить, почему вылетает ошибка, у меня просто рекурсия от этого требования, какие же конченные все эти рашкопреподы, поссал бы ему в ебло и кинул эту шарагу.
>>595537 в ебле твоей мамашки я себя уже попробовал, не понравилась, больно страшная и жирная и пизда гонореей воняет, своди ее к гинекологу штоли) а так я же не нищеброд, как вы, чтобы кодингом еще и зарабатывать, ахаха ну вы и лахи, пиздец. кодингом зарабатывать, хаха, циклами и скобочками какие-то там копейки зарабывать, вы че мужики после этого, да говно вы женоподобное с толстой жопой.
>>595541 >отчаянье Может лучше попробовать разобраться в теме? Про подключение композера к слиму могу тебе пошагово (как вы любите) расписать, что куда копировать и где прописывать. Нужно только один раз внимательно разобраться, а не засирать этот тред (и как я подозреваю алкотреды и "мы вам перезвоним").
Но времени учеба занимает действительно много. Чтобы выйти на зп в 1000-1500 нужно как минимум три-четыре года. Ну может и меньше, если работать как проклятый. Ну это как бы и не удивительно, мы же все-таки программированием занимаемся, не самая простая профессия в мире. Но полне можно учиться и параллельно работать в говно-конторе, постепенно повышая скиллы и затем претендовать уже на серьезные вакансии.
Про требования неадекватных заказчиков на апворке, которые на полном серьезе могут потребовать функциональность симфони от сайта на вордпрессе, ты прав. Большинство заказчиков идиоты, к этому нужно быть готовым и нормально воспринимать. Как и большинство исполнителей, к слову.
---------------------------------- Только что за три минуты поставил twig на слим. 1. composer require slim/slim twig/twig slim/views 2. Как обычно .htaccess с подменой запроса на index.php. 3. В index.php $app = new Slim\Slim( array( 'view' => new Slim\Views\Slim(), 'templates.path' => '../views', )); 4. Пишем тестовый маршрут и запускаем приложение (кстати было пару раз забывал $app->run() и психовал, что не работает) $app->get('/hello/:name', function ($name) use ($app) { $app->render('template.twig', array('name'=>$name)); }); $app->run(); 5. Содержимое body файла template.twig <h1>Hello, {{name}}!</h1> 6. Запускаем site.name/hello/вован и все прекрасно работает.
Структура директорий - d vendor - d web -- f index.php -- f .htaccess f composer.json Где папка web должна быть доступна для доступа из веб. Как настроить виртуальные хосты расписывать не буду, но там тоже 3-4 шага.
Ты думаешь что подобные посты как-то тебе помогут? Нет, не помогут. Поможет понятное описанеи проблемы, что ты делал, что не работает, чтобы это можно повторить. Желательно на минималистичном примере.
Если это не мешает работать композеру то лучше всего вообще ничего не делать, пусть жалуется.
Переменную окружения можно выставить так:
- временно, только в текущей консоли:
linux/mac: export VAR=value windows: set VAR=value
Просмотреть список переменных окружения:
linux: printenv windows: set
- постоянно, навсегда:
linux: дописать команду export ... в конец файла ~/.bashrc (~ значит твоя домашняя директория вроде /home/ivan) windows: правой кнопкой на мой компьютер - свойства - найти кнопку переменные окружения и добавить. Понадобится перезагрузка или перезайти в аккаунт.
Есть ли возможность отслеживать процент загрузки страницы до события $(document).ready() ? Хочу сделать прогресс бар загрузки но гугл нихуя толком не выдает
... html код .... <скрипт>setProgress(10);</скрипт> .... html код ... <скрипт>setProgress(20);</скрипт> ....
Но я сильно сомневаюсь что это нужно. Обычно HTML файл загружается за долю секунды и какой смысл показывать прогресс бар на такое короткое время?
Если же тебя интересует еще время загрузки картинок, скриптов, стилей, то тут все сложнее.
Более того, мне не нравится идея вообще делать прогресс-бар на вебстранице. Ты дублируешь функционал браузера - например в Сафари прогресс бар рисуется в адресной строке.
HTML странице по задумке загружаются и работают прогрессивно то есть отображаются по мере загрузки, не дожидаясь ее окончания. Если ты хочешь перекрыть страницу своим прогресс баром то ты однозначно ухудшаешь удобство пользования сайтом. Если ты просто хочешь сбоку выводить его, то ты добавляешь бессмысленный индикатор так как часть браузеров и так показывают прогресс загрузки, а часть считают это ненужным.
Однако, прогресс бар можно использовать там где загрузка медленная : например загрузка большого числа ресурсов для онлайн-игры. И то, лучше бы избежать этого и сделать постепенную подгрузку.
Потому мое мнение такое: тебе надо сконцентрироваться на других вещах, а именно:
- сделать хорошую верстку, чтобы по мере загрузки сайта ничего не прыгало - сделать верстку так, чтобы контент отображался и сайт можно было использовать как можно раньше, не дожидаясь полной загрузки - установить сайт на хороший сервер с быстрыми каналами и оптимизировать так, чтобы загрузка происходила быстро
Также, напомню тебе что по исследованиям каждая лишняя секунда ожидания загрузки повышает шанс того что пользователь просто закроет вкладку и откроет другой сайт.
>>595619 Заказчик хочет прелоадер как здесь http://javastartup.com.ua/ , я не представляю к чему привязать движение, прелоадер нужен так как много фоновых фото с большим разрешением. и загрузка составляет ~5 секунд
>>595661 Кстати часто вижу такой дизайн последнее время, какие-то видосы на заднем плане, при скроллинге страницы выскакивают огромные блоки, в некоторых из них скроллинг работает горизонтально, то есть ты крутишь колесико то прыгают элементы в галерее например, потом когда они закончатся, тогда снова идет скроллинг сверху вниз. Уебищно конечно, но модно. По каким тегам гуглить это говно? А то вдруг от меня тоже потребуют хренотень в таком стиле.
>>595683 Он скорее всего любит дизайн 90-х с белым фоном, черным текстом и синими ссылками с подчеркиванием. Другая крайность надо сказать.
Однако, шрифт великоват для моего экрана, а также мне не нравится дизайн комментариев внизу (как-то все разбросано, нет ощещения что это один блок комментария, а не отдельные надписи), постоянно висящая вверху шапка и выезжающая из угла бесполезная штука, которая только отвлекает. Также, серый цвет стоило бы сделать темнее. И я бы убрал все, кроме текста, куда-нибудь подальше.
> Он скорее всего любит дизайн 90-х с белым фоном, черным текстом и синими ссылками с подчеркиванием. > Другая крайность надо сказать. Текст быстрее и удобнее читается, меньше отвлекаешься. Я берегу свое время и свое внимание.
хотел еще похвалить Слон, но зашел - а там какой-то ад, бесконечная прокрутка, хочет иметь право слать мне нотификации, какие-то адские карточки из картинок, процессор грузится - я этим пользоваться не могу.
>>595746 Ты бы еще про клинопись вспомнил. Веб дизайн вдохновлялся не работами гуттенберга, а журналами двадцатого века. Лично мне ближе плоский дизайн, то есть такая середина, когда страница не перегружена дурацкими картинками, но при этом достаточно насыщенная и контрастная. Как макет из задания по верстке например, или пикрелейтед.
Ну ладно, пошла уже вкусовщина, но тем не менее важно учитывать вкусы целевой аудитории.
Насчет ООП вопрос. Нормально ли размещать геттеры и сеттеры свойств класса в классе самой сущности? По идее это нарушает логику, и нам нужен какой-то воркер с этими сущностями. Например ножик не может сам сказать, из какого металла был сделан. Для этого нужен некий обозреватель.
>У нас конечно нет мануалов и примеров использования ООП и MVC, но ты просто возьми php и научись на практике их использовать. ?У нас конечно нет руководства и примеров по пересадке печени, но ты просто возьми скальпель научись на практике ее пересаживать. Пиздец, просто пиздец, хоть бы так и сказали до своего ебучего задания на файлообменник - иди-ка деточка и просто поковыряй какую-нибудь цмску, посмотри что там да как.
>>596104 Допустим, есть класс "Мясо". У него свойства: цвет, запах, тип. Мясо не может их осознать, они имеют смысл только для наблюдателя. Например паттерн Active Record нарушает этот принцип. В нем объект сохраняет сам себя.
Но в моем случае просто надо не использовать геттеры, а сделать свойства public и напрямую к ним обращаться.
Перечитываю learn.javascript для закрепления, нашел там интересный трюк, который соответствует "духу" этого треда о задачах-головоломках. Нужно не прибегая к циклу и рекурсии написать функцию, которая возвращает склеенную N раз с самой собой строку. Например sringMultiplier('АЗ', 3) должна вернуть 'АЗАЗАЗ'
>>588512 (OP) >Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер
Чтобы делать эти задания, тебе надо установить PHP и использовать его встроенный веб-сервер. И когда будешь готов к разработке полноценных приложений, нужно будет поставить LAMP стек.
ОП, не думаешь, что так будет правильней и удобней (может быть не сразу, но в долгосрочной перспективе точно) для обучающегося? Зачем тратить время на возню с виндой, когда линукс в любом случае осваивать придется?
>>595661 >ПРЕПОДАВАТЕЛИ SENIOR УРОВНЯ Преподаватели являются тренерами курсов в компании ЕPAM, стаж преподавания больше 6 лет, в IT сфере - от 10 лет просто лол, тот, кто что-то хорошо делает, не пойдет учить этому за деньги.
>>595694 А мне этот макет нравится, все модно-молодежно-адаптивно, с претензией на вкус к дизину и новомодные влияния, хипстерство, эти чашки с кофе, макбуки, графики, типа такой вестерн сириус бизнес. Особенно приятно становится, когда я думаю, сколько на этим макетом ебалась верстко-жиес макака.
Почаны, объясните доходчиво, нахуя выдумали в HTTP-серверах такую хуйню, как виртуальные хосты, если дело все решалось через хостс, а права на каталоги можно настраивать и так было?
Есть картинка. Нужно из неё сделать 200 картинок с мельчайшими изменениями, незаметными глазу. Т.е. взять пиксель, рандомно изменить значение цвета в пределах, вставить обратно. Либо же просто взять картинку и пересохранить её в таком-то проценте качества, чтобы md5 изменилось. Как это лучше осуществить?
Что за хуйня с пхп и апачем Не получается запустить все вместе, делаю все по инструкции из оп-поста
Апач работает, выдает "It works". ПХП работает, через консоль код выполняется.
Но с включенным апачем при запуске пхп файлов просто выдает сам текст кода
А при выключенном апаче и запущенном встроенном в пхп сервере просто выдает ошибку браузер
Веб-страница недоступна
ERR_CONNECTION_REFUSED
Попытка Google Chrome подключиться к localhost была отклонена. Сайт недоступен или ваша сеть настроена неправильно. В командной строке надпись Invalid request <Unexpected EOF>
eof это end of file, но там все в порядке
Document root стоит C:\Scripts, там и находится пхп файл
> А при выключенном апаче и запущенном встроенном в пхп сервере просто выдает ошибку браузер
> Веб-страница недоступна А ты в адресной строке номер порта пишешь? Что вообще в адресной строке? Также, у тебя какой-нибудь фаерволл не запущен? Попробуй его ненадолго отключить или добавить PHP и указанный номер порта в исключения.
> Но с включенным апачем при запуске пхп файлов просто выдает сам текст кода Покажи конфиг Апача. Больше всего меня интересует какими командами ты указываешь Апачу что php-файлы должен обрабатывать интерпретатор PHP.
> Рребят поясните за редирект назад по истории в Slim PHP В общем случае это невозможно. Во-первых пользователь мог впервые зайти на данную страницу и история пуста, во-вторых, у пользователя могут быть отключены куки и сессия работать не будет.
Также, вопрос, а зачем вдруг это тебе понадобилось?
Без виртуальных хостов любые запросы к серверу идут в одну папку, то есть ты не можешь поднять у себя больше одного сайта. Виртуальные хосты позволяют проверять имя хоста на который идет запрос (заголовок Host в HTTP запросе) и задавать индивидуально настройки для этого случая, например отдельный DocumentRoot.
во всех мануалах упоминают Апач, потому у многих он уже может быть настроен и установлен. Также, без апача надо заморачиваться со скриптом роутинга чтобы например подключить Слим.
> Зачем тратить время на возню с виндой, Если это основная ОС то почему нет? Под апачом скрипт удобнее запускать чем поднимать ради этого виртуальную машину. Он как минимум памяти меньше ест.
https://github.com/MindiMakridi/filehosting Файлообменник. Пока с минимумом функций, все равно большинство придется переделывать, ибо я пока плохо разбираюсь в MVC структуре, а так же не очень понимаю, что должно быть в lib, а что в models.
Можешь попробовать, но если что-то сломается, ты ведь не сможешь открыть браузер и погуглить решение проблемы (если у тебя нет второго устройства с интернетом конечно).
> Так и остался вопрос, зачем ей заслонять 80 порт, и зачем она не пишет свои ID при скане. В винде есть пара особенностей.
1) некоторые службы запускаются не как самостоятельный процесс, а как отдельный поток-гость внутри общего процесса-хозяина вроде svchost.exe (svchost = Service Host). У тебя в системе их как минимум 2, один с правами системы, другой с правами пользователя. Я подозреваю, что засовыванием служб в один процесс майкрософт пыталась сэкономить память, во времена Windows 95-98 ее очень не хватало, или время запуска.
> Well, unlike *nix, on Windows, a process is a relatively expensive entity. It takes a non trivial amount of time to launch a process, and each process consumes a fair amount of system resources (something like 1M of virtual memory, just for the various process structures (virtual address map, handle table, etc), IIRC). Each process running drains the system of resources that could be used for your application, so it's important to reduce the number of system processes running.
Программа вроде process explorer показывает список служб внутри svchost.
Минус в том что если одна из служб например начинает потреблять 100% процессора, то сложнее понять какая именно (надо смотреть какой это поток и какая служба в нем запущена). Ну и это в теории менее надежно, проблемная служба при падении может уронить весь процесс svchost со всеми другими службами (хотя я с таким не сталкивался - видимо у майкрософт все отлажено и протестировано).
2) некоторые службы могут быть (ради производительности?) реализованы как драйвер ядра, тогда они работают из процесса System (id = 4). Может это конечно и позволяет немного повысить производительность, но зато в случае уязвимости в такой службе взломщик получает доступ в систему с максимальным уровнем привилегий.
В Линуксе обычно так не делают и службы (демоны) каждая запускаются как отдельный процесс.
> зачем ей заслонять 80 порт эта служба видимо тоже работает как веб-сервер. Ты можешь при включенной службе и отключенном Апаче зайти браузером на http://localhost/ (или http://localhost/MsDeployAgentService ) и посмотреть что именно за страницу она отдает.
Также возможно порт 80 выбран в надежде что фаерволлы по умолчанию пропустят соединение на этот порт (так как он используется для просмотра сайтов). по той же причине скайп по умолчанию использует порты 80 и 443 - так как высокая вероятность что они открыты на разных фаерволлах по умолчанию. Обычный пользователь не может разобраться в настройках фаерволла, а в организации у него еще и прав нет их менять. Использование порта 80 повышает шансы что программа заработает в таком окружении (и повышает доходы разработчика) потому многие программы использует его, хотя это нарушает исходную концепцию что каждая программа исплоьзует свой уникальный номер порта.
Судя по статье http://habrahabr.ru/post/192150/ из которой я ничего не понял, эта служба как-то связана с IIS, если ты используешь Апач то не надо было устанавливать IIS.
>>596438 Делал, на гитхабе есть репозиторий. Я сначала всё это писал в index.php, но потом подумал, что неплохо было бы выносить всё в отдельные файлы, чтобы Index был компактнее.
>>596423 >Также, вопрос, а зачем вдруг это тебе понадобилось? Скажем пользователь может добавить к себе в друзья другого пользователя кликнув на кнопку либо у себя на страничке /user/me либо на страничке этого пользователся /user/123.
При клике переходим на /add_friend.php, который делает что надо, и встает вопрос куда вернуться, /user/me или /user/123
только не забудь проверять что этот параметр from принимает разрешенные значения а не что угодно. не редиректь на неизвестные адреса предоставленные пользователем.
>>596445 Это не совсем контроллеры, скорее по аналогии похоже на действия контроллеров.
Чтобы посмотреть на модели и контроллеры в деле, попробуй поковырять YII например. Модель это класс, представляющий сущность. Например у тебя в случае файлообменника есть пользователи и файлы, может еще комментарии. Значит нужны во-первых таблицы в бд, во-вторых классы User, File, Comment и т.д. Дальше нужны классы для работы с базой, такие классы описываются паттерном DataMapper. Класс UserMapper будет содержать методы для работы с базой типа save или getFileByID, в которых будут выполняться соответствующие sql-запросы.
А контроллеры это классы для работы с определенной группой маршрутов. Когда идет запрос на example.com/user/view/123 вызывается метод actionView($id) класса UserController public function actionView($id) { $um = new UserMapper; // у слима есть контейнеры для синглтонов, так что на самом деле каждый раз создавать маппер нерационально, но здесь для простоты $user = $um->findByID($id); // вытаскиваем из базы пользователя по id, полученному из адресной строки типа /user/view/123 $this->render('userProfile.twig', ['user'=>$user]); // вызывается метод render либо контроллера, либо приложения, который берет шаблон профиля пользователя и заменяет в нем плейсхолдеры значениями переменных и выводит полученный html на экран
В yii используется паттерн ActiveRecord, когда фактически модель и маппер слеплены в один класс.
Короче, контроллер это штука, у которой есть методы, которые вызываются под нужный запрос из адресной строки /user/123, /file/456 или /site/search?word=слово Модель это класс для работы с сущностью, контроллер для группировки методов обработки запросов грубо говоря.
«действия контроллеров» (на самом деле контроллер действия) и контроллер это фактически одно и то же. Просто в одних фреймворках действия объединяют в классы, а в других каждое действие может быть отдельным классом - это самой сути не меняет.
Более того, если погуглить слово «действие» по английски пишется как Action Controller (гугл: https://www.google.ru/search?q=controller+action&newwindow=1&gbv=1&sei=K-piVovLLOegyAPqz6uABw ) то есть полностью это переводится как «контроллер действия». «Действие» значит какое-то действие пользователя, например загрузка страницы, отправка формы, а контроллер действия - это компонент который отвечает за его обработку.
Надеюсь я не запутал.
> Модель это класс, представляющий сущность. Я вижу, что слово «модель» используется в 2 смыслах:
«модель» как класс, который соответствует какой-то реальной сущности из предметной области. Ну например класс User является моделью реального пользователя, а Comment - моделью комментария.
«модель» как буква M из MVC. В MVC моделью называют часть приложени, отвечающую за хранение и обработку данных. в MVC в модель входят и классы работы с базой данных, и вспомогательные классы-сервисы.
Соответственно из-за этого путаница.
> такие классы описываются паттерном DataMapper. ОП решил немного пересмотреть урок и называть то, что мы делаем, TableDataGateway, так как часто мы добавляем в такой класс методы которые не занимаются маппингом сущностей на таблицы, а например считают число комментариев к посту. Вот обновленный урок: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
>>596511 Я нихуя не понял. Ты можешь коротко и ясно объяснить разницу между TableDataGateway и AR?
Я понимаю, в DataMapper могут быть только методы для работы с базой, в AR есть еще свойства по колонкам в таблице и методы несложных преобразований. А TDG? По определению вроде вообще не отличается от AR.
Гуглить пробовал, но ничего внятного не нашел. Везде пидорасы только цитируют заумные куски из Фаулера, как будто это что-то понятное. > Table Data Gateway: An object that acts as a Gateway (466) to a database table. One instance handles all the rows in the table. > Active Record: An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data. TDG вроде как взаимодействует "со всей таблицей", со всеми ее строками. И как это понять? AR не может что ли иметь метода, работающего с несколькими строками? Метод findAll я могу использовать в классе AR?
Или TDG в отличие от AR не может иметь табличных свойств, как DM?
Кажется, главная разница в том, что ActiveRecord может работать только с одной строкой таблицы, плюс имеет свойства сущности. TDG может работать с группой записей, и подобно DM не имеет свойств сущности, нужно передавать отдельный объект с этими свойствами.
Получается, разработчики YII нарушили паттерн ActiveRecord, напихав туда методов для работы с группой записей типа findAll или deleteAllByAttributes? Это уже какая-то комбинация AR + TDG.
> Ты можешь коротко и ясно объяснить разницу между TableDataGateway и AR? AR это когда модель (да, она представляет одну запись из таблицы) сохраняет сама себя в базу:
$user->rating = 100; $user->save();
То есть у нас модель и код для работы с базой объединены в одном классе.
TDG это отдельный класс содержащий методы для работы с таблицей:
$user = $userGateway->findById(100); // получить пользователя из базы по id $count = $userGateway->getTotalUserCount(); // получить общее число пользователей в базе
По моему так они сильно отличаются.
И есть еще один паттерн. Data Mapper это класс который занимается загрузкой и сохранением моделей в таблицу БД. Ты можешь заметить что по определению он может подходить под TDG, но обычно Data Mapper устроены более сложно. Например в случае с TDG если ты хочешь изменить что-то в таблице, ты делаешь это явно:
$user->setRating(100); $userGateway->updateUser($user); // обновляет данные в таблице из объекта $user
А DM в отличие от TDG обычно умеет обнаруживать изменения сам. Например:
$user1->setRating(100);// меняем рейтинг в модели 1 пользователя $user2->setRating(50); // и второго $entityManager->flush(); // просим Data Mapper сбросить сделанные нами изменения в базу. Что именно мы меняли мы не указываем - он сам найдет
Посмотри еще описание от Фаулера и попробуй поискать различия:
>>596552 Но я-то ничего не менял, аптайм компа уже недели две. Если вручную путь до файлика в браузере прописывать, то все работает. Чувствую себя блондинкой.
> TDG вроде как взаимодействует "со всей таблицей", со всеми ее строками. И как это понять?
Это значит что один класс TDG может делать любые запросы к таблице. Надо - обновляет одну строку, надо - обновляет все строки.
В общем TDG это просто класс где собраны все запросы к одной таблице. Ну например в UserGateway мы собираем все методы работающий с таблицей пользователей.
> AR не может что ли иметь метода, работающего с несколькими строками? Один объект AR соответствует одной записи в таблице так что да, не может.
> Метод findAll я могу использовать в классе AR? Обычно этот метод там прикручивают сбоку, либо как статический метод либо в отдельном классе. Вот в Юи:
Заметь что метод для поиска данных в таблице where() находится не в классе Customer а в другом классе.
Либо же это делают через статические методы:
$users = User::findAll();
Но метода $user->findAll() конечно не может быть, так как это абсурдно. $user это одна запись в таблице и она никак не отвечает за поиск других записей.
> Или TDG в отличие от AR не может иметь табличных свойств, как DM? По моему у тебя все запутано. Внимательно перечитай урок, а потом еще мой пост и посмотри картинки на сайте с описанием паттернов.
> Получается, разработчики YII нарушили паттерн ActiveRecord, напихав туда методов для работы с группой записей типа findAll или deleteAllByAttributes? Эти методы не в классе модели. Ты код смотрел?
Вчера у тебя был либо другой конфиг Апача, либо ты сохранял файл в другое место. Алсо, жалобы на PhpStorm тут не принимаются, если ты не можешь осилить профессионльную IDE (то есть ленишься прочесть мануал или погуглить), скачай Notepad++ и редактируй им.
>>596572 Я неделю пхп учу, извини, что разочаровал. Олсо, это примитивная задачка на калькулятор, чего ты от меня хотел, реализацию через ООП с MVC? >>596573 Ну, вот http://pastebin.com/WBVjNhQt Собственно, все так и осталось. Я просто даже не знаю, как гуглить.
>>581862 http://ideone.com/SMLKQE Переделал по твоим советам, посмотри. Вопрос такой: создал метод getWidth чтобы обращаться к приватным полям из других классов, нужно ли теперь в родном классе их использовать вместо $this? > abstract protected function tryToMove($field, $game); Неудобно везде передавать $field, лучше сделать его свойством класса. автоматически проставлять при добавлении животного на карту и убирать (ставить null) при снятии. Ну я вроде сделал это, но не уверен правильно ли тебя понял.
> Вопрос такой: создал метод getWidth чтобы обращаться к приватным полям из других классов, нужно ли теперь в родном классе их использовать вместо $this? Можно и так и так (обращаться напрямую к свойству или через геттер).
Там внизу закомментированный код - эти тестовые случаи удобнее поместить в функции с понятными именами и тогда закомментировать достаточно будет одну строку с ее вызовом.
Наверняка в PhpStorm есть настройка которая указывает где находится корневая папка сервера. И если ее задать, то он начнет правильный URL писать в адресной строке.
Также надо понимать что этот поиск быстро работает только пока записей мало. Если их мало, или если поиск где-то в админке, недоступной посетителям, то ок. Но если это поиск на публичной части сайта, и записей много то нужны другие подходы - например использовать полнотекстовые индексы либо внешний поисковый движок вроде Sphinx.
Как запустить ёбаный mysql сервер? Я отредактировал path
Ввожу net start mysql и "не удалось запустить службу mysql служба не сообщает об ошибке" Ессли ввести "C:\mysql\bin\mysqld", то вообще ничего не происходит
Ребзя, посоветуйте лит-ры/статей по работе с библиотекой cURL (желательно где подводные камни). А то столкнулся с проблемой, что практически два идентичных файла с кодом запроса и авторизации вк дают совершенно разный эффект.
>>596594 >>596595 Бесполезно, все равно шторм пытается открыть файл в корневой директории (а его там нет, естественно, он в другой папке). Помогло только в апаче директорию напрямую прописать, но это костыль. С другой стороны, это лучше, чем адрес вручную в браузере прописывать, а все, что мне нужно сейчас - открывать задачки в браузере, так что похуй. Но осадочек остался.
>>596562 А, то есть объект класса AR не может работать более чем с одной записью, но сам класс своими статическими методами может вытворять что угодно? Логика мне не понятна.
И __CLASS__::model() вообще-то возвращает экземпляр данного класса, так что методы findAll вызываются именно у него Разве $posts = Post::model()->findAll() нельзя разложить на две строки $weirdFuckingStaticModel = Post::model(); $posts = $weirdFuckingStaticModel->findAll();
Открой в документации код функции. Действительно, он создает отдельный экземпляр модели (который называет static model) и передает ему null в конструктор.
> А, то есть объект класса AR не может работать более чем с одной записью, но сам класс своими статическими методами может вытворять что угодно? Логика мне не понятна. Логика в том что вся работа с таблицей должна быть в этом же классе. Потому да, иногда используют статические методы. Так как им не нужен объект.
В Юи решили извернуться по-своему. AR это вообще не лучший паттерн из-за того что в одном классе смешаны функции модели и работы с базой.
>>596562 >И объясни где тут нарушение? >>596638 >Действительно, он создает отдельный экземпляр модели Вот и я о том же. Создается экземпляр модели AR, причем какой-то странный, фактически пустышка с незаполненными полями, и у него вызываются методы типа findAll. Это противоречит заявлению о том, что экземпляр модели AR может работать только с одной записью.
Ну ладно, это видимо такая извращенная реализация в первом yii. Во втором сделали уже прямые статические методы без создания странных промежуточных объектов.
Что в Симфони используется из этих паттернов? Или там наверное доктрина с датамаппером?
Про датамаппер твой пост только запутал. Пойду лучше погуглю, потом высру сюда то что переварил, ты скажешь правильно или нет.
Не перестаю удивляться, как ебанутые гики умудряются сделать простые вещи сложными для понимания. Думаю, что если бы нужно было написать о различиях между ложкой и вилкой, это выглядело бы приблизительно так: "Ложка есть экземпляр сущности из электропроводящего материала либо диэлектрика, имеющей выпукло-вогнутую форму и продолговатым держателем для захвата передней конечностью тела прямоходящего млекопитающего. Применяется для переноса жидкой питательной среды из негерметичного контейнера в полость головной части тела вышеупомянутого организма. Вилка в отличие от ложки имеет вместо выпукло-вогнутой части три-четыре заостренных на конце зубца, предназначена для пронзания твердых сгустков органической субстанции и перемещения оных в пространственно-временном континууме в направлении полости головы человекообразного организма".
>>596638 >Логика в том что вся работа с таблицей должна быть в этом же классе. Но ведь мы только что пришли к выводу что AR не работает со всей таблицей, только с определенной записью. Еще раз: > Active Record: An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data. AR по определению должен работать только с одной записью. Да, работа с таблицей должна быть в том же классе, но не со всей таблицей, а с конкретной записью же, adds domain logic on that data
Мне просто важно понять различия между этими паттернами, потому что если понадобится расширить класс той же AR, а я добавлю туда что-то некошерное, это же будет непорядок.
Пик из Фаулера по data mapper. Я вижу только методы вставки/обновления/удаления. Для полного crud'а не хватает read, то есть select. Допустимы тут методы выборки или нет? Если да, то только по одной записи, или по многим? (find или findAll?)
>>596686 Ну ты переменную в {} засунул. Я это еще в первый день изучения пхп прочитал. Зачем вообще одну-единственную переменную через эхо выводить в кавычках, да еще и с экранированием? Если что - я примерно на том же уровне, что и ты, так что это не издевка.
Как делается выборка промежутков? Вот есть например у товаров цены, нужно выбрать от n до m цены. Как это вообще делается? Это же явно в SQL есть что-то, но я никак не соображу, и нагуглить не могу. Подскажите хоть что искать.
>>596745 Или between. Не надо отвечать на такие вопросы. Сейчас он радостно скажет "спасибо!)))))", а завтра задаст следующий вопрос типа "а как выбрать не все записи из таблицы, а только первые 5? а как выбрать кол-во записей или максимальное значение?".
>>596697 Я просто тут недавно упоролся кавычками, в общем, теперь почти все пишу в одинарных, переменные выношу за кавычки. Не знаю, правда, насколько это оправдано с т.з. стилистики/оптимизации/читабельности (думаю ни на сколько, лол).
да, лучше давать направление в котором гуглить или ссылки на статьи. Но с другой стороны, в случае конкурса на какую-то вакансию он проиграет тем кто хорошо знает SQL.
не могу понять что тут сложного? Тебя же не просят с нуля написать какую-то программу, просто надо установить и настроить аж целых 3 программы. Неужели для этого нужны какие-то способности?
Я в первый раз устанавливал Апач/PHP в первый день на работе (до этого сам их не ставил никогда), причем помощи спросить было не у кого, и в итоге как-то справился.
Правда я тогда уже был знаком с линуксом, может в этом дело.
>>596765 > не смог mysql заставить работать вместе с пхп Помню на старой винде такое было, после долгих танцев с бубном нашел на стаковерфлоу совет закинуть php.ini в папку windows и всё заработало.
Тем не менее, в AR в том же классе делают и методы для поиска данных.
Я видел разные реализации AR и могу сказать как делают на практике. А делают так:
- статические методы (ruby on rails) - внешний класс вроде UserFinder который умеет искать и выбирать записи в таблице - методы в том же самом объекте
Также, я решил обратиться к первоисточнику - книге PoEAA (пиратская версия легко гуглится, а при желании наверно можно найти и перевод. Или можно купить эту книгу.). В ней написано:
> The data structure of the Active Record should exactly match that of the database: one field in the class for each column in the table. ... > The Active Record class typically has methods that do the following: > - Construct an instance of the Active Record from a SQL result set row > - Construct a new instance for later insertion into the table > - Static finder methods to wrap commonly used SQL queries and return Active Record objects > - Update the database and insert into it the data in the Active Record > - Get and set the fields > - Implement some pieces of business logic
Как видишь Фаулер сам пишет что допустимо использовать статические методы для поиска записей в таблице. А дальше он добавляет:
> Because of the close coupling between the Active Record and the database, I more often see static find methods in this pattern. However, there's no reason that you can't separate out the find methods into a separate class, as I discussed with Row Data Gateway (152), and that is better for testing.
Пишет, что также можно вынести методы поиска в отдельный класс.
Главная идея паттерна AR это то что в объекте одного класса находится и бизнес-логика обработки этих данных, и логика загрузки/записи их в БД.
Если ты хочешь разобраться в паттернах лучше, я советую найти книгу и прочитать в ней главу про них, там они подробнее описаны и есть примеры кода.
> Пик из Фаулера по data mapper. Я вижу только методы вставки/обновления/удаления. Для полного crud'а не хватает read, то есть select. Допустимы тут методы выборки или нет? Если да, то только по одной записи, или по многим? (find или findAll?) Да, допустимы любые. На всякий случай я заглянул в книгу Фаулера.
> The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. With Data Mapper the in-memory objects needn't know even that there's a database present; they need no SQL interface code, and certainly no knowledge of the database schema
... > A simple case would have a Person and Person Mapper class. To load a person from the database, a client would call a find method on the mapper
То есть да, методы поиска тоже есть в классе-маппере.
В общем, советую почитать книгу. Заодно можешь попробовать разобраться в чем разница между TDG и Data Mapper.
Сейчас еще на вордпресс, жумолу и друпал натяну макет, бля, как же это скучно, эти однотипные цмски, эта адаптивно-резиновая верстка мать ее за ногу. Даже на перцептрон времени нет, а ведь он интереснее.
http://javastartup.com.ua Там график в свг отрисован и анимирован, я бы так не смог, пытался один раз свг анимировать по готовому мануалу - такая ересь вышла, отрисовать бы точно не смог, только с картинки конвертировать в низком качестве. А остальные плагины есть в сети вроде, со скроллбарами и менюхой.
>кококо у тебя слишком длинные контроллеры, выноси все в модель. >вынес все в классы >кококо что-то у меня такое ощущение, что ты просто функции в классы засунул и все, это не ООП и не MVC пиздец оп ну ты и выродок
Парни, где-нибудь хотя бы на английском описано как работает движок php в паре с OpCache? Что движок отдаёт opcache'у, что конкретно пытается изобразить opcache при кешировании? Во что кешируется код - в jit / в нативку / в LLVM?
>>596892 Хочется процитировать тему лебедева. Выглядит убого, если честно. В столбик выводи. Или просто убери вот это вот "о нас", всю нужную инфу о компании можно засунуть в контакты, а про историю очередного ООО "Рога и копыта" никому читать не интересно.
>>596911 Но по макету должно быть именно так же. Сделаем вид, что это заказчик попросил сделать. Я же не могу ему ответить: давайте вот это уберем и все переделаем, никому не интересна история ваших рогов и копыт.
Пиздец, вот у пакистанца с апворка куча статичных сайтов в портфолио. И хуле я мучаюсь с этой резиново-адаптивной-бутстрап-кроссбраузерной хуеверсткой?
ОП, в Задаче про айпад - невероятно сильное упущение.
Сама задача. кредит за 4% и (мелким шрифтом) 500 р комиссии в месяц от HomoCredit кредит за 3% и 1000 р комиссии в месяц от того же банка (Softbank), что и в первой задаче нереально вкусное предложение от StrawberryBank за 2% в месяц, без комиссии, но с платой в размере 7777 р за открытие счета (эту сумма прибавляется к сумме долга)
Но школьник может заплатить только 5000 рублей. Я имею ввиду StrawberryBank требует 7777 единоразово, так что школьник просто не сможет взять у них кредит. Или я что-то неправильно понял?
Алсо думал что только у меня не работает /n. Но теперь на 3 компах настроил апачи и /n не переводит строку на новую. Что я делаю не так? И ещё ньюфажный вопрос. Правильно ли я понял, что функция не может брать переменные которые не переданы в функцию?
>>596966 Про \n: Для того что бы работал перенос строки, нужно сообщить броузеру, что содержимое которое мы ему присылаем нужно рассматривать как обычный текст, а не как html. Для этого нужно ДО какого либо вывода из нашего скрипта послать http-заголовок. Про все это ты узнаешь подробно в процессе изучения технологий, а пока добавь в начало: header("Content-Type: text/plain"); не ОП -кун
Натянул вёрстку, сделанную из задания ОПа по ксс, на вордпресс. Поступил следующим образом. Там где картиночки и надписи вроде- estibulum id ligula porta euismod semper... Создал четыре записи в админке определённой категории и вывел их через WP_Query, выводил с условием выводить только из этой категории. Там где заголовок в шапке, создал одну запись определённой категории и вывел её в этом месте. С другом заголовком поступил точно также. Там где ссылки на работы из портфолио, создал три записи определённой категории, в каждой из которых 4 картинки и вывел их в том месте где надо, опять же по категории. Создал страницы, те что есть в меню, также создал меню и вывел его динамически. В итоге, почти весь контент можно менять, но возможности тем не менее ограничены, например нельзя вставить 5 картинок в ряд, можно только поменять сами картинки. Так нормально или это неправильно?
>>597054 Каким образом двойной прогон через htmlspecialchars вернёт хтмл-сущности? Если бы это так работало, то на харкаче была бы полная xss уязвимость и в поля можно было бы вставлять какой угодно код http://ideone.com/erMHGH
Ты бы выложил свое расширение к ВП для проверки (если конечно это у тебя сделано в виде расширения которое ставится на стандартный вордпресс; если не так то конечно не очень хорошо).
Также, что касается заголовка и адреса/телефона, мне кажется неправильно делать их через пост. Логичнее бы сделать просто страницу в админке где задаются эти настройки (или встроить это в настройки вордпресса).
Что касается портфолио, вот что я подумал. У нас ведь для работ портфолио будут отдельные страницы для каждой, где описана эта работа. Значит нужно просто сделать специальный тип поста «Работа для портфолио», и у нее сделать свойства:
- картинка для главной - категория (категории?) работы - тут наверно можно теги использовать - флаг, выводить ли эту работу на главной (так как работ может быть много)
Соответственно на главной выводятся картинки от тех работ у которых стоит галочка. А теги определяют к каким категориям они относятся. Переключатель видов работ можно строить автоматически из имеющихся тегов.
Проблема в том что ты не следуешь соглашениям протокола HTTP. Изменения на сервере должны делаться POST запросом а не просто открытием странички. переделай свой скрипт добавив форму с кнопкой.
- своя тема позволяет поменять внешний вид страниц не меняя логику работы CMS - плагин (расширение?) позволяет менять логику работы CMS, добавлять новые функции, страницы в админке, менять конфигурацию системы
Соответственно ты делаешь либо тему либо расширение которое устанавливается на вордпресс.
А то что ты сделал это глупость. Объясни как в твоем случае понять где твой код а где не твой? Как увидеть что ты изменил? как обновить версию вордпресса?
Нет миграций для БД, много ручной возни по переносу данных с локального сервера на продакшен.
Я помню, когда я работал с Друпалом, приходилось делать так: закачивать дамп базы с продакшена себе на локалхост, делать изменения, закачивать дамп обратно.
В общем эти CMS это дрянь, они рассчитаны на низкоквалицифированных натягивателей верстки которым не нужна автоматизация и которые не ценят свое время.
Да. Если ты меняешь только внешний вид, то делаешь свою тему. Если не только, то пишешь расширение.
То что ты дал, да, это как раз документация по созданию тем.
Вообще, «процесс разработки под wordpress» по английски переводится как wordpress development flow и если гуглить по этим словам, там есть статьи и обсуждения, кто как организует все это. Также можно попробовать гуглить на русском языке:
>>597230 Какой в жопу локальный сервер, через ftp правят прямо на рабочем сайте. Я один раз пришел на собеседование в такую дно-контору и немного опешил: про линукс никто не слышал, верстают в блокноте (илитные планктонины в дримвивере и фронтпейдже, ибо визивиг). Нет систем контроля версий, нет никакого планирования и командного взаимодействия в помине, нихуя нет.
Еще многие функции можно решить стандартными способами или готовыми плагинами. Например рассмотрим такую вещь как добавление настроек для телефона, адреса, слогана:
Оказывается, в WP уже есть нужный функционал. Ты можешь из своего расширения добавить в админку отдельную страницу настроек для сайта.
Еще наверно можно добавить настройки каким-нибудь сторонним плагином, но мне вариант с расширением кажется более простым. Если бы такие вещи нужно было делать часто, я бы пошел дальше и сделал расширение-генератор форм настроек, чтобы достаточно было дать только конфиг со списком полей, а он бы генерировал форму.
обьясните тупому. Почему регулярка $regexp='/^8-([(]{1})([0-9]{3})([)]{1})-([0-9]{3})-(0-9]{2})-(0-9]{2})$/'; работает на "8(123)123" а "8(911)-506 11 11" - для неё уже проблема? Ведь -(0-9]{2})-*(0-9]{2}) - как раз направлены на обработку 2 пар последних цифр
>>597295 Со скобками напутал. Вот регулярка. $regexp='/^8-([(]{1})([0-9]{3})([)]{1})-([0-9]{3})([0-9]{2})([0-9]{2})$/'; И она не работает если к "8(123)123" написать 4 цифры в конец.
>>597305 >Спецсимолы экранировать надо двойным обратным слешом \\ Ну как-то не работает для номера телефона $regexp='/^8-\\(([0-9]{3})-\\)([0-9]{2})-([0-9]{3})-([0-9]{2})-*$/'; почему-то не проходит проверку.
>>597300 А вообще и вправду, как встроить это? Можно $regexp='/^8(//(*[0-9]{3}) но тогда стоит ли писать {3} ? Или всё-равно? Обьясните мне пожалуйста?
Ты написал регулярку под конкретный шаблон номера. Так не пойдет.
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
>>597317 Спасибо, я знаю. Сложно написать шаблон сразу подо всё, поэтому пишу по 1 шаблону для каждого. Потом выясняю где косяк и добавляю исправления в главную регулярку. >>597313 Щас, погодьте. Кстати разобрался с первым вопросом, надо было пробелы посчитать. https://ideone.com/IULz7d
>>597317 >Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Оп-половой орган, ну ты все-таки прокомментируй эту уязвимость сосача. Я сейчас пилю небольшое приложение используя 2ч-апи, не хочется обосраться на ровном месте. Как мне экранировать данные, которые возвращает сосач? Если пропускать через htmlspecialchars, выводятся html-entities, а если через html_entity_decode, вроде выглядит красиво, но безопасно ли это?
В идеале правильно хранить в базе оригинальные данные, а при выводе экранировать. Если данные представлены в виде HTML разметки (например если данные пришли из WYSIWYG редактора) то экранирование конечно не сработает, в этом случае их обрабатывают фильтром который оставляет только разрешенные теги и разрешенные атрибуты. Атрибуты, содержащие ссылки (например href и src у картинок) надо фильтровать дополнительно: проверять что ссылка использует разрешенный протокол, иначе тебе всунут data: или Ja va script: ссылку с возможностью выполнения кода.
Есть готовые фильтры которые все это умеют делать.
Алсо не вздумай обрабатывать HTMLкод регулярками: это 100% уязвимость. Фильтр должен парсить код в дерево DOM, обрабатывать и потом собирать обратно. Это гарантирует что злоумышленник не сможет внедрить некорректный код (например где не совпадает число закрывающих тегов или где теги написаны с ошибками).
Слабость фильтра на регулярках, кроме прочего, это то, что теги могут быть записаны с ошибками. Браузер исправит ошибку и тег сработает, а твоя регулярка ее пропустит.
>>597328 >>597325 В условиях задачи не написано "решай только с применением циклов" >>597332 >Не забудь после любой правки кода заново перепроверять все номера. Нажать F5
>>597338 >В чем суть уязвимости? Ты с какого устройства сидишь? Не видишь что за байда получается при использовании юникода в полях "тема", "опции" и "имя" поста?
Да не буду я тянуть сторонний фильтр, я сейчас на коленке пишу приложение, которое будет выгребать все мои посты из этого треда и твои полезные комментарии к ним. (Заебался скроллить сотни постов)
>>597346 Не катит, в базу сосача сохраняются уже через жопу закодированный html.
>>597345 Не игнорьте меня пожалуйста. Регулярки для меня - весьма сложная тема. Всё равно что ^&^&$%^&#$&!@&#)(!@&# читать и понимать что эта фиговина делает.
Оп-кун, подгрузил я все свои файлы с локалки, кроме .git папки и файлов composer.lock, composer.json по фтп на хостинг, только вот случился трабл. autoload не работает на ftp на каждый класс мне пишет, что не найден и все.Что делать?
Я написал про те случаи когда на вход поступает HTML, а не текст. Например если в форме комментария на сайте стоит редактор и можно вставлять смайлики, менять шрифт, и тд. Очевидно что htmlspecialchars тут не поможет.
Это всего лишь юникодный символ который задает вывод текста в обратном порядке. Особого риска от него нет, если ты его так боишься то можно просто узнать его код и вырезать. Так как символы в HTMl могут быть закодированы то опять же это лучше делать в дереве DOM где данные присутствуют в исходном незакодированном виде.
Имей в виду что удаляя этот символ ты помешаешь писать тексты на некоторых языках (иврит, арабский) где требуется совмещать тексты написанные справа налево с написанными слева направо.
То есть если и удалять то в служебных полях вроде имени (где он точно не может встретиться), а в основном тексте поста наверно не стоит.
>>597369 >Например если в форме комментария на сайте стоит редактор и можно вставлять смайлики, менять шриф Так это де BB коды, почему бы регуляркой не искать их? То есть я хочу, например, сделать у себя в форме BB-код для жирного шрифта [FAT] [/FAT] и регуляркой заменять их на хтмл теги <b>
Если сложная то тебе надо решить все задачи на регулярки, запостить решения и исправить все замечания. И потом попросить еще одну-две задачки повышенной сложности для закрепления.
По твоей регулярке:
она написана под конкретный шаблон, например она предполагает что в коде города ровно 3 цифры. Но это не так, бывают код из 4 или 5 цифр.
Потому ее лучше сделать более абстрактной, например так:
- в начале идет +7 или 8, за ними ровно 10 цифр, между которыми идет любое число пробелов, минусов, скобок
>>597379 Так и сделаю. >И потом попросить еще одну-две задачки повышенной сложности для закрепления. Давай. >она написана под конкретный шаблон, например она предполагает что в коде города ровно 3 цифры. Но это не так, бывают код из 4 или 5 цифр. Разьве не в этом весь смысл регулярок? Отслеживать только конкретный шаблон. >- в начале идет +7 или 8, за ними ровно 10 цифр, между которыми идет любое число пробелов, минусов, скобок
Хорошо. Завтра переделаю по новой. А пока у меня 2 часа ночи ( В любом случае спасибо тебе няшка!
А почему ты хочешь писать велосипед а не взять готовый парсер BB кода?
Также, в случае использования регулярок мы можем получить уязвимость (если ты сделаешь более сложные теги с параметрами. например для ссылок или картинок), а также проблемы с обработкой вложенных друг в друга тегов.
Правильный BB пасер должен парсить текст в дерево и из него генерировать HTML как нарисовано на моей картинке.
>>597369 Ну мало ли, вдруг кроме этого символа вывода текста есть и другие опасные моменты, которые могут сломать верстку. Например трипкода у меня вообще-то нет.
>>597372 Нет, я надеялся что ты как обычно подкинешь решение одной строчкой. Сидеть и учить фильтры bb-кодов в мои планы на данный момент не входит.
Скажи просто, если я буду выводить как есть данные полученные с сосача http://2ch.hk/pr/res/588512.json , может ли это привести к худшим последствиям кроме похеренной верстки?
Это не BB коды. BB коды это когда пользователь руками пишет загадочные коды. А я говорю про нормальный WYSIwYG редактор, когда пользователь жмет кнопку и текст становится красненьким, как в ворде.
Ну и есть еще много других ситуаций, вот анон выше получает из API HTML код и хочет обезопасить себя.
Я не понимаю, вообще что тут обсуждать. Я 10 постов назад привел правильное решение, если тебя беспокоит бещопасность - использовать фильтр. Аргументов против фильтра кроме «я тупой не могу осилить» у тебя нету, значит и обсуждать больше нечего.
>>597385 Я ничего писать не собираюсь, ты меня с кем-то путаешь. Просто интереса ради спрашиваю. >>597386 Ничего ты не похеришь, этот юникод действует только на элементы с одним родителем, до первого блочного или блочно-строчного элемента. Так уж получилось, что на харкаче идет строка из span(то-бишь inline элементов) с общим родителем, поэтому юникод меняет их все. Если сделать хотя-бы один из спанов инлайн-блоковым, то юникод на нем и остановится.
>>597396 О, нормально объяснил, респект. >>597395 Иди в пизду со своим фильтром. Мне важно как это работает, а не подключать 10 мегабайт непонятно чего к библиотеке весом 10кб.
Какой агрессивный школьник. Тем не менее, мои посты все же я думаю, не пропали зря, другие аноны благодаря им узнали как обрабатывать и фильтровать HTML и BB код.
С вами снова я, тот даун, что вчера весь вечер ебался с апачем. Но сегодня у меня вопрос по существу. Допилил тот "калькулятор через свитч", от которого так у кого-то сильно припекло, теперь циферки сохраняются в форме и все такое. Может кто покидать в меня говном - типа, так нельзя, а вот так было бы лучше и т.п.? Если кому не лень, конечно. В частности, интересует, можно ли как-нибудь обойтись без объявления двух пустых переменных (цель - чтобы в хтмл форме сохранялись введенные значения) Cам говнокод http://ideone.com/D6YrkC
>>597417 Да мало полезного было в твоих постах на сей раз, поэтому и был справедливо послан. Тебе нужно было не ткнуть в готовую библиотеку, которую человек должен бездумно использовать, а объяснить принцип кодирования спецсимволов, какие есть функции для этого, к каким последствиям может привести неправильная обработка спецсимволов. И проблемы создает не только ‮ на котором все почему-то зациклились, но и другие символы юникода.
Потому что тогда теги выведутся как текст. А у нас задача - принять HTMl код, оставить в нем только безопасные и разрешенные теги, атрибуты и ссылки и вывести как HTML код.
Чтобы например пользователь в редакторе сделал текст красненьким и он так же и вывелся. А хакер, подсунувший скрипт в HTML код, остался бы ни с чем.
Я же написал выше, кодирование через htmlspecialchars это для тех случаев когда у нас простой текст, и надо вывести его так же как его ввел пользователь.
А фильтр HTML нужен когда у нас на входе HTML код и надо вывести его без риска для сайта. Это более сложная задача.
Аноны, вопрос такой: только начал работать с композером. Столкнулся с таким случаем, когда точно не знаешь, поможет ли тебе хуёвина из репозитория или нет, пока не попробуешь. Попробовал, не помогла - как её выпилить без потерь особенных?
>>597693 { "require": { "silex/silex": "~1.3", "jasongrimes/silex-simpleuser": "^2.0", "twig/twig": "^1.23", "symfony/form": "^2.7", "symfony/security-csrf": "^2.7", "symfony/twig-bridge": "^2.7", "symfony/translation": "^2.7", "symfony/validator": "^2.7", "symfony/config": "^2.7" }, "autoload": { "psr-0": { "Controllers": "src/", "Mapper": "src/", "Models": "src/" } } } И что мне говорит сервер, на локалке все работет Fatal error: Class 'Mapper\DataBaseMapper' not found in /home/u901582110/public_html/web/index.php on line 80
Переделал, свою натяжку на вордпресс, теперь большая часть информации выводится при помощи настроек, очень удобно получается, не знал про такое раньше. Вот правда не понимаю, стоит делать некоторый вывод через посты? Вроде бы и неправильно, так как посты создаются отдельно от темы, но с другой стороны, мне один знакомый который работает с вордпресс говорит, что чаще всего именно постами и делает, если делает какой-нибудь сайт визитку. Дайте ещё каких-нибудь PSD-шаблонов, постараюсь сверстать и натянуть на вордпресс.
Что будет, если дважды объявить локальную переменную функции через var в javascript? Будет ошибка, это я уже понял, но почему? http://jsfiddle.net/q3L8raun/3/ Вроде бы перед выполнением скрипта интерпретатор проводит какой-то анализ и собирает объявления всех функций и переменных, казалось бы он должен просто проигнорировать второе объявление одной и той же переменной, ан нет.
У jsfiddle новый дизайн, ошибки он теперь не выводит (хотя может и раньше не выводил), просто молча не выполняется.
Еще одна задача с learn.javascript https://learn.javascript.ru/global-object#window-и-переменная-2 Почему alert(x) выдаст ошибку ReferenceError: x is not defined, а alert(window.x) спокойно выведет undefined? Я что-то недопонял, разве это не одно и то же?
>>597240 >>597230 Какой нахуй продакшн? На оф. сервере вп его вообще нельзя править ни устанавливать свои темы (фтп забанено). Нужно скачать себе на локалку, править, а потом заливать уже на свой отдельный хостинг. А плагины добавляются и одобряются в каком-то специально разделе вп, я еще этот момент не до конца разобрал.
>>597764 Так разве x и window.x не одно и то же? А, все, до меня дошло: если x не объявлен, то интерпретатор просто не знает, что это свойство глобального объекта.
Ребята, извините, я немного даун. Мне нужно разбить число на составляющие, десятки, сотни и так далее. Пример: 356 = 300 + 50 + 6. Использую 356 % 1000 / 100 / 10 и остается некое количество знаков, ну сколько указано. Что мне использовать? Спасибо.
Антоши, нужна срочная помощь, вы тут живые? Я к вам залётный, имею слабое отношение к программированию на проф. уровне, но иногда пишу говнокод, за который платят. Так вот, суть токова: есть сайт с iframe (http://books.e-heritage.ru/book/10075598 ), на котором лежит нужная книжка, которую хер найдёшь для скачивания. Я вот уже полчаса ломаю голову, как написать парсер для скачивания этой книжки. Пока писал, пополнил инфу, лол, и перешёл из js-треда к вам, няши. Пост-запросом можно переходить со страницы на страницу, у каждого изображения есть индекс, не последовательный, отправив который гетом, получаем желаемое изображение. Проблема в том, что этот индекс надо на каждой странице выцепить из урла изображения, которое во фрейме. В общем, очень сумбурно получилось, анон, посмотри сам, будь ласка, на это говно, и скажи, вообще возможно что-то написать, чтобы спарсить эту книгу?
>>598587 В общем, ответом на пост приходит что-то типа <img alt="page" src="/Book/book/Image/1071399?i=625388678" /> , из которого важная часть - i=625388678 Эту поеботу нужно отправить гет-запросом, тогда получим ответом картинку. Вот только я не умею в пост-гет запросы, помоги, антоша
> Но если я правильно понял, between равнозначен where a > x and a < y, так что оба индекса по прежнему не удается использовать. Да, верно. Используется только один индекс, и смотри какая ситуация получается:
- допустим мы используем индекс для условия start_ip < :ip - mysql в индексе быстро находит максимальное значение start_ip, которое меньше :ip - mysql проходит по индексу от этого места до начала, выбирая строки из таблицы и проверяя для каждой условие end_ip
В неудачном случае (позиция окажется в конце индекса) мы пройдем всю таблицу, в среднем мы обходим половину строк таблицы. Это очевидно далеко от оптимального алгоритма. Тебе надо найти такой способ который бы эффективно использовал индексы.
> Это сделано для того чтоб если файл загрузил анонимный, незарегистрированный пользователь, он мог потом зарегистрироваться и видеть какие файлы им загружены. Или так соль использовать нельзя? Ты используешь неправильный термин. Соль это секретное случайное значение которое хранится в базе и используется для хеширования и соления пароля. Если у пользователя нет пароля то и соли у него нет.
То, что хранится в куках, должно называться: идентификатор анонимного пользователя, код доступа, токен доступа. Я думаю безопаснее все же иметь отдельный идентификатор, а не использовать соль для двух целей. Чтобы те, кто читает код, не путались.
Видишь, из-за неправильного названия я что-то не так понял и подумал что тут ошибка. Надо переименовать куку, переменные, методы для работы с этим значением.
Сама схема, когда мы выдаем пользователю случайный код для идентификации, верная.
> Я сделал через DQL > $filesCount = $app->em->createQuery('SELECT IDENTITY(u.uploadedBy), count(u.uploadedBy) FROM Uppu3\Entity\File u GROUP BY u.uploadedBy'); > но этот запрос возвращает мне многомерный массив с которым неудобно работать. Правильно будет преобразовать его в такой как нужен мне? Ну то есть наверно так будет эффективней, но выглядеть это будет очень некрасиво, и неочевидно. Ты выбираешь не слишком много данных? Тебе точно нужна вся таблица пользователей, или может только чатсь из них?
Насчет неудобного формата, надо его преобразовать в удобный, например вида [id пользователя => число файлов]. Также, ты можешь использовать тут SQL запрос если хочешь. Можно и DQL как у тебя.
> Так и не придумал как это сделать в слиме. На страницу авторизации у меня редиректит проверка в middleware, как там можно сделать чтоб функция определяла с какой страницы нас заредиректило? Берешь текущий URL из $app->request и добавляешь в ссылку. Для формирования ссылки возможно стоит сделать отдельную функцию. Не забудь правильно все заэкранировать.
> https://github.com/V3N0m21/Uppu3/blob/master/files.sql Не вижу внешние ключи. Также, во всех таблицах, те колонки или группы колонок где значения уникальны, надо пометить уникальным индексом чтобы нельзя было нарушить это правило.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L21 > $helper = new LoginHelper($app->em); Не надо создавать вторую копию LoginHelper. Также, неправильно делать currentUser синглтоном в Слиме. Ведь синглтоны СЛима для объектов которые не меняются, а текущий пользователь может залогиниться, разлогиниться, то есть он меняется. И потому неправильно писать
$app->currentUser
Так писать можно только если пользователь всегда один и никогда не меняется. А в твоем случае надо псиать так:
$app->loginHelper->getCurrentUser()
Такая запись показывает нам что текущий пользователь может быть изменчивым значением.
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L48 > if (!$cookie) { > $cookie = HashGenerator::generateSalt(); > $app->setCookie('salt', $cookie, '1 month'); > } > $user = $app->em->getRepository('Uppu3\Entity\User')->findOneBy(array('salt' => $cookie)); > if (!$user) { > $user = \Uppu3\Helper\UserHelper::saveAnonymousUser($cookie, $app->em); > } Этот кусок кода явно стоит того чтобы вынести в отдельную функцию. Например в loginHelper. Ведь он может понадобиться и при добавлении комментария.
> new \Uppu3\Helper\FileHelper В этом класс есть метод сохранения файла: fileSave, хорошо. А где метод валидации (проверки что файл передан, что ошибки нет, что размер имеет допустимое значение)? Обычно всегда есть 2 метода, метод валидации и метод для сохранения значения.
Также, почему ты в обработчике формы логина 3 раза скопировал код
Как писать надежный код в этом шаблоне если мы не знаем, придет нам переменная или нет? Мне кажется, вызов render в обработчике должен быть только 1 раз.
По идее нужен курс центробанка одной из стран. Ну то есть чтобы перевести нигерийские фантики в суданские тугрики, нужен курс либо банка Нигериии, либо Судана. Если его нет то можно через крпекую валюту вроде доллара или евро, но так мы дважды теряем на комиссии.
> А как часто меняются диапазоны? Допустим раз в несколько дней мы скачиваем новый дамп и заливаем в базу.
> WHERE start_ip <= inet_aton('1.0.0.30') ORDER BY start_ip DESC LIMIT 1; Это неплохой запрос в плане использования индекса - он берет всего лишь одну запись. Но я не вижу тут проверки что искомый IP входит в диапазон. К примеру если start_ip = 4, end_ip = 6, а искомый IP адрес равен 100 твой запрос вернет что все ок? Вот например я подставил 5.5.5.5: http://sqlfiddle.com/#!9/5b673/4
Кстати я бы еще индексы заменил на уникальные для защиты от ошибок.
И что насчет второй части задачи, где могут быть вложенные друг в друга поддиапазоны для городов, районов городов?
> С накладывающимися диапазонами только не знаю что делать. Может подзапросом их отсеивать по разнице между концом и началом? Попробуй. Скорее всего тут нужно нестандартное решение, на первом месте для нас производительность, ведь может быть такой запрос будет делаться для каждого посетителя сайта. Кстати, один из вариантов решения состоит в том чтобы решать эту проблему не в момент поиска города по IP, а в момент загрузки дампа базы.
Ты близок к решению. Надо просто еще немного подумать. Кстати, это ведь хорошая задача для собеседования, как ты думаешь?
> Как вообще относиться к этой тенденции определения положения пользователя по ip-адресу? Если пользователь может поменять город вручную - то хорошо. Автоопределение ведь не делает никому хуже. Тебе в любом случае пришлось бы выбирать город руками, что с автоопределением что без. Значит, тебе от этого хуже не становится.
Если не может то плохо. Также, я не люблю принудительные редиректы (на страницу своего города, на десктопную версию с мобильной) - я считаю редиректить никого не надо, надо просто вывести плашку (не блокирующий страницу попап!) с предложением перейти если человек хочет.
> Вот у меня например провайдер выдает ip без привязки к региону. Когда захожу на сайты с автоопределением приходится каждый раз руками менять поисковый запрос на свое реальное положение Базы несовершенны. Меня например обычно определяет правильно. Более того, гугл чуть ли не мой дом мне показывает в результатах, мне аж страшно.
Хорошая идея. Нейросети это важная часть курса по машинному обучению и искуственному интеллекту, а распознавание образов - важная задача. Но перцептрон надо разбирать с чтения теории, а не кода.
На перцептрон в свое время ученые возлагали особые надежды. Они надеялись, что перецетрон сможет обучаться и автоматически выделять признаки из изображений (условно говоря, показав ему силуэт кота, он сможет опознать этого же кота перевернутого вверх ногами). Надежды не оправдались - нейросеть не обладает никаким разуммом или аналитическими способностями, она лишь сопоставляет входный набор данных с заложенными в нее при обучении и дает на выходе степень сходства с известными ей образами. Каких-то отличительных признаков она выделить не может.
Что такое нейросеть? Это сеть, у которой есть N входов, несколько слоев связанных элементов-нейронов и M выходов. Входы можно подсоединять к чему угодно - если мы хотим распознавать картинки, мы можем связать входы с отдельными пикселями картинки, если мы распознаем звук, то можем связать входы со значениями спектра звука. Нейросеть анализирует сигнал на входе, сопоставляет с заложенными в ней при обучении образцами и выдает сигнал на выходе, указывающий на какие образцы похож входной сигнал.
В процессе обучения мы меняем коэффициенты связей между нейронами. В них таким образом накапливается информация об поданных на вход образах. Позже нейросеть сможет распознавать их и похожие на них образы.
Погугли статьи про нейросети и перцептрон. Почитай. Есличто-то непонятно - давай ссылки и задавай конкретные вопросы. В том числе тебе придется изучить и метод обучения перцептрона (метод обратного распространения по моему).
Кстати, нейросети могут еще и генерировать картинки, ты наверно видел в интернете эти адские картинки с собачьими мордами, сгенерированные нейросетью от гугла.
В Оп посте есть задачи на HTML/CSS.Реши их и исправь все замечания Опа. Вполне возможно что планка будет в итоге выше чем в верстка треде.
> до какого уровня? Неужели до того же, что в верстка-треде учат? Надо уметь качественно странички и править чужую верстку. Ну подумай сам, разработчик - на голову выше просто верстальщика - он знает больше, и работу верстальщика при надобности может сделать с закрытыми глазами там, где верстальщик будет час ломать голову и переставлять дивы.
Верстальщиков держат только потому что они дешевле, так конечно никто бы им верстку не доверил.
Тут важно не только тренировать, а правильно формровать признаки которые мы подаем на вход нейросети. нейросеть фактически просто сопоставляет поданный на вход набор чисел (вектор) с теми что даны при обучении. Если ты будеь пытаться распознавать буквы, подавая на вход яркость пикселей, то скорее всего это будет фейл - достаточно сдвинуть букву на один пиксель чтобы входной вектор стал не похож на предыдущий.
А вот если ты будешь подавать такие признаки как «наличие вертикальной прямой линии слева» или «наличие угловой точки снизу слева» - это другой вопрос.
То есть надо искать признаки, устойчивые (не изменяющиеся сильно) при преобразованиях вроде поворота, масштабирвания.
У тебя гигантская функция public function getSalary($post,$rang). Это неправильно, большие функции это зло, их тяжело читать и легко что-то сломать - ее надо разбивать на более маленькие функции, более того там эти функции почти одинаковы и незачем копипастить это 4 раза.
Также там есть условие, надо иметь возможность добавлять новые профессии не переписывая основной код. Решить это можно сделав отдельные классы для разных профессий (хотя тогда мы получаем минус: нельзя поменять профессию).
Не надо смешивать разные стили переменных:
> $summaryPages > $me_base_salary
> if($this->post=='Менеджер'){ В таких случаях надо использовать не строки, а константы. Они делают код читабельнее, понятнее, защишают от опечаток (PHP сразу заметит ее и будет ругаться). Читай: http://php.net/manual/ru/language.oop5.constants.php
Например:
const JOB_MANAGER = 'manager';
> public function getEmployeeStatsByDep($counter){ > public function salarySummary($summary){ > public function coffeeSummary($coffee){ Эти функции не имеют никакого отношения к работникам (они относятся к департаменту) и не должны быть в этом классе
> public function average($first,$second,$third,$fourth){ Название функции начинается с глагола: сделайЧтоТо()
Также, ставь в коде тайп-хинты.
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент, может быть еще Компания?) — какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо. — что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег. — как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии. Правда в этом случае мы не можем поменять профессию сотрудника.
Также, чтобы помочь тебе лучше изучить ООП, а также проверить готов ли ты к внесению изменений в код, вот дополнительные условия:
-----------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Надо исправить. Нехорошо терять то что юзер накопил тяжелым трудом. Может, дело в том что ты генерируешь новый код доступа. а не переиспользуешь старый.
> В простом случае: needle between start and end limit 1. Если записи нет в базе то мы попадаем на обход таблицы по индексу, в худшем случае всей. Или они заполняют пустые промежутки? Тогда вообще достаточно оставить WHERE :ip >= start ORDER By start DESC LIMIT 1. Но тогда в базе получается в 2 раза больше записей, добавляются пустые блоки. Нельзя ли без них?
> Можно еще рассмотреть вариант вообще без хранения счетчика в базе, редис сам почти полноценная база. А почему я так сразу не сделал? Что-то я ночью уже не соображаю. Нельзя записи в таблице будет сортировать по просмотрам. Но если твой класс счетчика сделан правильно, он позволит заменить базу на редис, написав адаптер.
> Про мейлру дело даже не в таблице-очереди memory, которая у них кстати очень быстро очищается, а в хранении самих уникальных посещений на диске. Я подозреваю что информацию вида Юзер A посмотрел страницу B выгоднее не помещать в базу так как она временная. Ее можно даже в мемкеше хранить если не жалко потерять. То есть делаем ключ с ограниченным временем жизни в мемкеше/редисе. Я такое видел не в одном проекте и сам делал так.
> Но если там действительно несколько сот мегабайт, то не стоит париться. Ну если у тебя миллионы посетителей в день то скорее всего у тебя не один сервер и памяти достаточно. Вообще, если тебе интересна в общих чертах архитектура сложных проектов то вот 2 русскоязычных ресурса:
> Не, там массив возрващается, это я ридми не обновил. Два метода? Зачем? Пусть будет один, он всегда принимает массив айдишников, и всегда возвращает в ответ массив вида [id => visitCount]. Потмоу что для одного посещения неудобно использовать метод с массивом. Приходится писать лишний код. Некрасиво как-то. почему бы его не написать тебе?
> парсить DOM Лучше избегать этого как кошка воды. Парсеры дома постоянно ломаются, работал на проекте где их были десятки, были отдельные люди только для их написания и поддержки.
У тебя код в ветках для 10 и 12 символов - копипаста, это плохо. Почитай про принцип DRY, don't repeat yourself. Также, в PHP исплоьзуется camelCase а не snake_case для переменных.
Также, зачем ты сокращаешь слова? cksum - надо писать полностью.
Не надо писать числа прописью $xOne - надо писать $x1.
Я не решаю чужие задания, но могу ответить на какой-то конкретный вопрос. Также, ООП немного описан в моем учебнике в ОП посте - можешь почитать, последняя глава.
Странное задание, имена классов и интерфейсов обычно пишут с большой буквы. Имена ужасные, вас плохому учат.
> class students implements students_interface; { > define ("N_LECT", ""); > define ("N_LAB", ""); Это неправильно, читай мануал http://php.net/manual/ru/language.oop5.constants.php (читай весь раздел про ООП в нем)
> Добавить в класс конструктор, Есть в мануале PHP
> Создать копию $copy произвольного объекта. Читай про оператор clone
> Создать несколько объектов класса Читай про new
> Создать класс child_students, наследующий класс students. extends
Не получается записать созданное изображение в файл. В браузер же выводится отлично через imagepng
Warning: file_put_contents(): supplied resource is not a valid stream resource in
// Загрузка штампа и фото, для которого применяется водяной знак (называется штамп или печать) $randstamp = rand(1,10); $randstamp .= ".jpg"; $stamp = imagecreatefromjpeg("stamp1/$randstamp"); $im = imagecreatefromjpeg('1.jpg');
// Установка полей для штампа и получение высоты/ширины штампа $marge_right = rand(1,30); $marge_bottom = rand(1,30); $sx = imagesx($stamp); $sy = imagesy($stamp); // Копирование изображения штампа на фотографию с помощью смещения края // и ширины фотографии для расчета позиционирования штампа. imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
Вордпресс предназначен в первую очередь для блогов и новостных (блогоподобных) сайтов. Соответственно делать на нем сайт компании наверно не лучшая идея, может быть стоит взять другую CMS. А если нужен именно вордпресс то надо найти/написать плагины для вывода нужных тебе блоков.
Вообще, по моему опыту, даже если ты делаешь сайт на CMS, практически в каждом проекте есть вещи для которых приходится писать код.
Судя по скриншотам, опенкарт поддерживает подкатегории. Что тут думать? Либо я тебя не так понял либо ты сам не знаешь даже основных возможностей опенкарта. В последнем случае тебе надо его изучить, а не спешить браться делать задачи по нему. Ну или хотя бы погуглить.
> А это еще месяц-два Да ну, это надо быть мегаслоупоком чтобы модерацию комментариев делать месяц. 3-4 дня если с нуля надо написать админку для модерации.
> А потом еще думать, как это прихерачить к контроллерам и бд опенкарта, о которых мне доподлинно ничего не известно (ибо не я же писал), А открыть код и посмотреть не судьба?
> Фикс незнакомой цмс Вообще-то по идее надо не трогать чужой код а писать расширение и тему к CMS. Иначе как потом эту CMS обновить?
Я конечно не видел твою задачу, может там и требуется полгода, но сдается мне что тебе стоило бы потратить время на повышение уровня знаний. Потому что без них ты дальше и будешь конкурировать с теми кто «за 5 дней все сделает».
> а потом он нашел кого-то, кто согласился "взять готовое и сделать еще быстрее" Вообще может и не нашел, просто он так тебя мотивирует.
А потом взять нормальный HTTP клиент вроде Guzzle.
> А то столкнулся с проблемой, что практически два идентичных файла с кодом запроса и авторизации вк дают совершенно разный эффект. Тогда дело может быть не в курле, а в ошибке в коде.
Там есть байткод и есть даже какая-то команда для его вывода. Нативный код в динамическом языке генерировть бесполезно если неизвестен тип переменных, такое делают только в JIT (когда типы переменных известны) в HHVM например.
- полэкрана занято черным квадратом. Зачем он нужен? - логотип бессмысленно болтается в углу, а нужен ли он вообще? - меню надо сделать компактнее, например в строчку или вообще убрать за кнопку - слайдеры тоже малополезны
Посмотри как сделаны мобильные версии маазинов, например http://lamoda.ru
То, что у тебя -это не адаптивная версия, а бессмысленное нагромождение блоков. Посмотри как сделаны известные магазины (ламода, ситилинк, юлмарт, эльдорадо и тд) и просто скопируй структуру страницы у них.
> Но школьник может заплатить только 5000 рублей. Я имею ввиду StrawberryBank требует 7777 единоразово, так что школьник просто не сможет взять у них кредит. Или я что-то неправильно понял? Банк не требует платить 7777 сразу, они просто добавляются к сумме долга, то есть в первый же день школьник должен 47776 (39999 + 7777) р.
По коду:
> $creditsum x $per ) + $komission; > $paymentTotal = $paymentTotal + $LastTransact; избавься от повтора кода
Число 39999 повторяется 3 раза - избавься.
> PHP Notice: Undefined variable: paymentTotal in /home/Xd2SZt/prog.php on line 14 Это надо исправить, ты обращаешься к переменной ктоторой в тот момент еще не существует.
> softBank: 60260.891466803 А должно быть 61270.
Вот еще пример, я подставил сумму долга 4000, должно получиться 6123 во втором банке, у тебя 5120: https://ideone.com/S93B6o
Вообще, HTML лучше бы вынести в отдельный файл-шаблон
> <?php echo <?= короче будет
> if ($op2 == 0) { > echo 'На ноль делить нельзя!'; неправильно выводить текст до <html>. Лучше сделать чтобы ошибка выводилась в специально отведенном месте страницы.
> <br> Неправильно верстать с помощью br. Гораздо правильнее поместить 2 блока в 2 отдльных дива:
Также, обрати внимание, у нас в ОП посте есть задания по HTML/CSS если ты хочешь разобраться в них лучше.
> <input type="submit" value="calc!" /> Слеш в конце одиночного тега в HTML не нужен. Это не XML.
> <?php if(isset($res)): ?> Неправильно когда переменная может существовать, а может и нет. как писать надежный код если непонятно есть ли такая переменная?
> Вроде бы перед выполнением скрипта интерпретатор проводит какой-то анализ и собирает объявления всех функций и переменных, казалось бы он должен просто проигнорировать второе объявление одной и той же переменной, ан нет. он так и делает
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: ( не OP)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.