24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Прошлый тред там https://2ch.hk/pr/res/536866.html Добро пожаловать в наш уютный тредик. Тут мы изучаем язык 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. Решай их параллельно с задачами выше.
Подскажи сайты для поиска работы, я не умею гуглить? brainstorage.me, geekjob.ru, hh.ru Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию. Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492 ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет. Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Ананасы, кто-нибудь работал со снипетом? Есть БД на мускуле, есть запись в текстовом формате. Домустим как двачезапись любого ответа. Только тут есть простой текст и в нём есть куски кода которые нужно подсветить снипетом не задевая текст. Как это сделать?
>>543720 (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, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
>>543720 (OP) Во что превратили мой уютненький Comodo Edit. Этож просто ужос. Добавили какую-то панельку слева. Дубрали меню, и добавили кнопку как в фаерфоксе, тпеерь оно при открытии заслоняет пол экрана и неудобно. Капец. Короче, на чём писать PHP код?
Аноны, напишите ваши предложения, что делать если сайт опять упадет. Пока есть 2 варианта:
- резервный тредик на доброчане (создадим при надобности) - слак (нужно сначала заргистрироваться и получить инвайт через какой-то сайт вроде slack-for-pr.heroku.com или как-то так )
Выбранный способ опубликуем в шапке следующего треда.
ОП, порекомендуй что почитать про использование AJAX, потому что на learn.javascript.ru тема раскрыта как-то поверхностно. Ну и вообще, ajax используют чаще всего с jQuery? Почему практически все при поиске в гугле по слову ajax как-то связано с jQuery?
Я тот анон с файлообменником с доктриной и древовидными камментами. Проебланил месяц, берусь обратно за ум.
Другой анон который тоже делал файлообменник таки его доделал?
>>543927 С этим все понятно. У нас в двух переменных одна и таже ссылка на объект. Второй цикл проходит весь SplObjectStorage и переставляет курсор в конец SplObjectStorage. Из-за чего первый цикл пытается перейти к следующему объекту, а его нет и завершается как обычно. Попробую создать несколько классов посмотреть что получиться.
Да, ты прав. SplObjectStorage это не настоящий массив, а объект реализующий интерфейс Iterator.
Там единственный счетчик текущего положения и он находится внутри SplObjectStorage. Внутренний цикл прокручивает этот счетчик от начала и до конца, внешний цикл видит что мы в конце списка и завершается.
Да, тут выход либо использовать clone либо не допускать вложенных циклов. В любом случае, надо в коде это пояснить комментарием, так как это неочевидно и вызывает вопросы, зачем там сделано.
В случае с массивами такой проблемы нет так как foreach делает для себя приватную копию массива перед выполнением цикла.
Обрати внимание, что интерфейс IteratorAggregate тоже позволяет перебирать содердимое через foreach, но он каждый раз создает новый итератор и лишен этого недостатка, который есть у тех кто реализует просто Iterator. Взамен он делает итерацию чуть дороже, так как каждый раз приходится создавать новый объект (что не имеет значения пока ты не делаешь это десятки тысяч раз).
Если хочешь получше в этом разобраться, можешь сделать класс-наследник или класс-обертку (если наследование не сработает) для SplObjectStorage, реализующий IteratorAggregate и исправляющий это досадное недоразумение.
>>543878 >- слак (нужно сначала заргистрироваться и получить инвайт через какой-то сайт вроде slack-for-pr.heroku.com или как-то так ) > Вот он: http://php-pr-slack.herokuapp.com/
Случайно написал в старый тред: Мне кажется в шапку надо бы добавить ещё информацию о Zen Coding, совсем недавно натолкнулся на него и был очень приятно удивлен: https://www.youtube.com/watch?v=WlsJkAhcHQE
доделал банкомат http://ideone.com/eNBIPi , добавил проверки, а так же добавил наминал 200 и 2000 взгляни правильно ли я понял что массив необходимо сортировать по значению что бы выдать сумму 6600 из доп. условий к задаче??
>>544093 Устроился случайно, можно сказать мимо проходил и в шутку спросил не нужен ли им дизайнер, оставил номер свой и на следующий день мне перезвонили. Пришел, показал свой гит (очень скудный (сайт студентов + некоторые задачки)), пообщался. Контора маленькая, занимается разработкой сайтов на разных CMS (Joomla, Opencart в основном), первое время было дико сложно, открыв впервый раз опенкарт, а потом и джумлу не знал с чего начать, со временем более менее разобрался с опенкартом (допиливал некоторые модули), сейчас работаю над сайтом на джумле. Джумла меня очень напрягает, она довольно странно структурирована, хотя всё же какое-никакое разделение MVC в ней присутствует, но на мой взгляд очень извращенное. Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний, видимо из-за того, что когда делал тот же сайт студентов и какой-то элемент кастомизировал лишь до фазы "и так сойдет" но там такое не прокатывает - нужно доводить внешность сайта до совпадения с макетом который нарисовал дизигнер". Очень помогает то, что есть у кого попросить помощи или спросить в сию секунду (так как там присутствует ещё один программист более опытный). В общем в первый месяц испытывал перманентную фрустрацию из-за больших объемов информации, плюс голова не соображала уже к 17:00, но на втором месяце вроде втянулся. Время от времени появляется чувство, что я слишком медленно делаю текущее задание, ещё и заказчик названивает постоянно менеджерам и спрашивает о сайте, ну а менеджеры соответственно напрягают меня. Ещё немного опасался, что не подойду им после стажировки (2 недельной) но утешал тот факт, что если и не подойду то некоторые опыт и знания за это время я всё же получу. И да, работаю уже 2 месяца, всем доволен, за свои 26 лет это первая работа (а сменил я мест работы немало) которая мне по душе, и я не ощущаю желания бросить всё и забить. И да, коллектив хороший, веселый и доброжелательный. Извините за сумбурность изложения, писатель из меня никудышный. А и забыл добавить: мухосранск с 90к населения, в котором я думал найти что-то из области IT нереально
Не знаю, в правильный ли тред пишу, но анон, как много и чего именно нужно знать, чтобы начать зарабатывать фрилансом в околокомпьютерной тематике, сайтостроением, например? Как много времени нужно в это вложить? К самообучению способен, есть ну совсем базовые знания плюсиков (массивы, сортировочки, пойнтеры, всякая такая синтаксическая хуита ещё из школы), с юниксами тоже знаком, но вот в вебе и этих ваших сетях не шарю совершенно, хотелось бы это исправить. Помоги, пожалуйста, анон. Не хочется тратить своё время на изучение того, что принципиально не может принести пользы.
>>544106 Ну то, что мухосранск еще не о чем не говорит, хотя да, 90к - это деревня. У меня 300к, есть web-студии(не торт по описанию), есть 1С много, есть филиалы тырпрайз конторок(java, c#) но они редко всплывают, есть intel, но есть ли у них офис или это просто рекрутинг "умных парней" из вузика я не знаю. Отдельная категория - это уютненькие конторки, но они ни когда не пишут на сайтах с работой. Видел около кафедры и деканата их обьявления, по описанию хорошие, чай, пряники и модные фреймворки на месте.
Господа, что-то мне уныло. Вот я почти весь файлообменник сделал, осталось только поиск, тэги, регистрацию и комменты допилить. Но скучно пиздец, не могу прям себя заставить доделывать. Кажется, что все нправильно делают и на выходе какой-то позорный, бесполезный говнокод получится. Типа бесполезно это, вот что я чувствую... Не знаю, может надо было с какого-нибудь паскаля начать.. матан выучить.
>>544124 >Не знаю, может надо было с какого-нибудь паскаля начать Да. Становишь новенький дельфи и на этом паскале ебашишь приложения для винды, макоси и айфонов с ведрами. Будь успешным.
>>544103 > занимается разработкой сайтов на разных CMS (Joomla, Opencart в основном) Жаль, я думал что-то серьезное. Крайне пугает перспектива возиться с этим дерьмом.
ОП сделал текст вертикальным, но не как не пойму как вывести его по образу примера. Думаю что сначала нужно вывести все значения массива $arr[строка1-14][символ0] потом переход на следующую строку и уже выводим $arr[строка1-14][символ1] и т.д. но не как не могу это реализовать. =( пока что только так http://ideone.com/ihaT1q
>>543887 Ну в первых тебе просто самому с нуля нужно написать простенький пример. Только тогда ты наконец поймёшь что и как работает. Я например писал голосовалку. Мне норм. И да, jquery с уровнем ньюфага не суйся. Сначала только что-то очень простое и скопипащенное. Только пjтом jquery. Ибо иначе не поймёшь.
Скажите, как лучше регистрацию в файлообменнике организовать? Вот у меня заливаются файлы, ставятся куки. Куки пишутся в БД, если куки файла и куки юзера совпадают, то юзер может редактировать файл (удалять и тп). Далее теперь есть регистрация. Для юзеров отдельная таблица от файлов. В таблицу юзера тоже заносить куки? В слиме куки так ставится $app->setCookie('username', $cookieKey, time()+86400*4);
Надо ли вместо поля "юзернейм" ставить логин или мейл юзера? Я чот запутался, честно говоря.
Что-то у меня затык со студентиками. Окей, у юзера есть кука(токен), я дергаю из бд запись с этим токеном и возвращаю студенту, чтобы он мог отредачить свои данные. Но как понять(вернее, как реализовать) какие поля апдейтить в БД, после того как он нажал кнопку отправить?
>>544344 Это снова я. Вот так пока: Метод save принимает на вход объект, метод search возвращает массив, метод getEnrollee возвращает массив с инфой(кроме id и token) об авторизованном студенте(то есть если есть кука). Вот этими данными, которые возвращает getEnrollee я заполню страничку профиля и закину их в value для форм, чтобы не думать какие поля апдейтить, а апдейтить все по умолчанию. Но как реализовать метод update, принимать в качестве параметра поля или создать обьект enrollee и заполнить ему все свойства(кроме id и токен) а потом передать его в update.
>>544392 Кароче, я решил использовать итеративный подход, он позволяет мне не скатываться в прокастинацию. Думаю запилить рабочий прототип абы как(это не значит что совсем говнокод), потом отправить ОПу, потом поправить, потом снова отправить ОПу, и так до состояния когда можно будет залить его на гитхаб.
>>544586 В логах если что фатальная ошибка PHP Fatal error: Default value for parameters with array type hint can only be an array or NULL Ее на экран не выводит.
Обычные нотисы типа undefined variable выводятся. Странно.
Поясните за наследование в php. Получается, методы передаются как бы по ссылке в класс наследник? В этом примере http://ideone.com/OWwo7S я запускаю Bar::getName(), но фактически получаю вызов Foo::getName(), который не может достучаться до приватного свойства класса Bar, из-за чего выбрасывается ошибка.
А вот если переопределить метод в классе наследнике, то ошибки нет. Получается, если мы вызываем метод класса, сначала он ищется в данном классе, затем по цепочке в предках, и изнутри предка же и вызывается.
Написал сам рекурсию это было трудновато, сделал к коду аннотации, а так же оставил все сопроводительные функции. проверки на отрицательные значения и т. д. не делал жду критики и поправок.
Привет антоны. Есть один не большой сайт. На данном сайте будут регистрироваться люди. При переходе по определенной секретной ссылке определенные люди будут получать xls из базы данных. Все это дело я запилил. Но теперь меня тревожит то, что если какой нибудь не хороший человек решит начать спамить эту ссылку, то ничего хорошего из этого не выйдет. Собственно можно настроить кеширование этого файла, дабы он обновлялся раз в час. Только вот как это сделать я не совсем представляю. С кешированием до этого ни разу не работал. Можете чего посоветовать или что нибудь почитать на эту тему?
>>544392 если в модели нет if if(!$foo->id) { то в сокл запросе просто апдейт делаешь. тот же метод save. } и просто в модели определяешь id вытащив его из бд.
Наконец-то закрыл старый тред. Вот кому я еще ответил:
>>544856 - вопрос про перевод сайта на https, и странный вопрос про идею сделать приложение внутри сайта.
>>544861 вопрос про скачивание файлов с гитхаба (качай зип) и про способы авторизации. Анону, который делает доску объявлений на Юи посоветовал рассмотреть возможность использования хорошего быстрого поискового движка sphinx — дополнительный пунктик в резюме будет.
Анон, который делал размен банкнот отдельным сайтом, а с тобой мы все прояснили или не все? Я помню, у тебя был сложный алгоритм и я советовал рекурсию заменить на цикл.
Приучи себя в учебных задачах пользоваться валидатором HTML кода. Есть много споров, должен ли код быть валидным или нет, так как ты пока учишься то для тебя ответ на этот вопрос «да», так что посмотри тут и исправь замечания:
Там единственная ошибка, про IE=edge не актуальна, это скорее баг в валидаторе который не знает про опцию chrome. Остальные все верные. Исправь их.
Также, имей в виду что есть браузерные расширения, отправляющие текущую страницу на проверку одним нажатием, но я не доверяю расширениям (это же по сути бекдор) и потому никакого конкретного не рекомендую. Скачивай их только если доверяешь автору.
Он немного ругается на вендорные префиксы, но тут ничего не поделать.
В общем, я думаю, задача решена, сколько я замечаний уже написал, хватит пожалуй. Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку. Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется).
Ну и подучи синтаксис селекторов. Убедись сам, что ты знаешь все селекторы из этого списка:
Ну и так как ты (судя по потраченному времени) увлекаешься HTML/CSS то советую почитывать иногда статьи об интересных возможностях этих технологий вроде такой: http://habrahabr.ru/company/paysto/blog/251933/
Там приведены довольно сложные алгоритмы. Более простым, но менее эффективным был бы алгоритм полного перебора всех возможных (то есть не превышающих требуемую сумму комбинаций) купюр.
> Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний Ты наверно наши задачи на HTML/CSS (в ОП посте) не прорешал, а зря, они хорошие, вот другие аноны наверно не проверяя в браузере CSS написать могут.
Ну и конечно тебе, как и другим, совет, развивайся дальше, верстка и натяжка шаблонов на джумлу подходит начинающему но всю жизнь заниматься такой примитивной работой не стоит.
Задача 3: все верно Задача 4: так-то все верно, но вот я тебе не советую этот способ:
> letter-spacing : -.36em; Это очень ненадежно и зависит от шрифта, так как в разных шрифтах размеры символов разные.Такая верстка это мина замедленного действия.
Также font-size:0 может не работать если в браузере ограничивается минимальный размер шрифта.
Лучше использовать способ с комментариями или написанием тегов вплотную.
А ты сдай на проверку код. Ну а паскаль не рекомендую, он старый, никому не нужный да и делался не для практических задач, а для обучения. Если ты хочешь изучить еще какой-то язык то изучай актуальное, напиши что именно ты хочешь на нем писать, и я или аноны посоветуем что-нибудь.
С++ не для начинающих, быстро ты его не выучишь, а выучить поверхностно пользы не дает. Да и что на нем писать? Топовые игры? Браузеры? Вряд ли у анона хватит времени в одиночку сделать то что делают командами.
А для обычных приложений С++ все же медленный в написании, лучше другие языки использовать.
Начинающему может и полезно, чтобы лучше осознать важность использования ООП, неймспейсов, композера, и MVC фреймворков и может даже тестов (кто хочет научиться писать тесты, у меня есть урок).
jQuery логичен и понятен если сначала изучить JS и DOM. дело не в ньюфажестве а в том что jQUery это обертка вокруг DOM и XHR функций, событий и надо научиться сначала их использовать напрямую.
learn.javascript.ru содержит нужную для обучения информацию. Ну и у нас в ОП посте есть хорошие задачки на JS.
> В таблицу юзера тоже заносить куки? Получается нехорошее дублирование. Я бы советовал сделать так: коды хранятся только в таблице пользователей. Для незалогиненных пользователей при первой загрузке файла генерируется кука и создается анонимный пользователь (который никак на сайте не отображается). При второй загрузке файла этот файл благодаря куке записывается тому же пользователю. А при регистрации мы просто добавляем в таблицу логин/пароль и все закачанные ранее файлы остаются в аккаунте.
То есть для каждого загруженного файла есть аккаунт, возможно анонимный.
Преимущества:
- используется один способ хранения и для зарегистрированных, и для незарегистрированных пользователей, проще база - мы знаем кто что загрузил даже если он не зарегистрирован - при регистрации ранее загруженные файлы не теряются, а оказываются в аккаунте пользователя
Так что советую тебе так сделать. Я вижу такую схему редко, а зря, она же удобнее для пользователя.
Сделать список массивом, какие поля разрешено редактировать. При обработке запроса от формы проходиться по этому списку, брать данные из POST и обновлять соответсвующее поле в модели.
Обновлять все поля которые пришли в POST небезопасно так как у нас могут быть какие-то поля которые пользователь сам менять не должен (ну например флаг модератора).
Также, ты читал комментарии к задаче и урок про работе с формами который там упомянут?
> метод getEnrollee возвращает массив с инфой почему не модель? Чем массив лучше объекта?
> Но как реализовать метод update, принимать в качестве параметра поля или создать обьект enrollee и заполнить ему все свойства(кроме id и токен) а потом передать его в update. Взять список разрешенный полей и обновить их в модели из POST.
короче, хуйня какая-то. делал я делал это файлообменник, уже регистрацию сделал. и тут хуяк что-то куда-то не то запостил (а проект пиздец большой разрося) и все теперь только хедер наполовину рендерится. хуйня полная, пойду зенд учить.
Там просто при вызове метода он ищется сначала в текущем классе, потому в предке, потом в предке предка и так далее. То есть идем по цепочке, пока не найдем.
> я запускаю Bar::getName(), но фактически получаю вызов Foo::getName(), который не может достучаться до приватного свойства класса Bar, из-за чего выбрасывается ошибка. Это пример кода за который бьют канделябром конечно. Так как код должен быть прост и понятен а не содержать капканы.
Похоже это из-за того что static соответствует вызванному классу (Bar), почитай про late static binding
На практике такое писать не придется никогда.
> если мы вызываем метод класса, сначала он ищется в данном классе, затем по цепочке в предках, и изнутри предка же и вызывается. Это да, но тут пример долбанутый. Статические методы в праивльном ООП используются редко и особо надобности в static нет.
Что касается приватных полей и методов то они принадлежат только одному классу. Они недоступны из других классов (и невидимы там) потому метод Foo::getName() не может обратиться к полю из другого класса.
Я обычно отвечаю по очереди, пропускаю большие задачи только если не успеваю. да и давно ли ты написал вопрос? день назад? Это нормальная задержка в нашем треде.
Вот мой недоделанный файлообменник. Все работало, но потом перестало :c щас впадлу разбираться, что там не так. вот сырая версия, в общем. Все пагинаторы и валидаторы я хотел потом в массивы и отдельные классы вынести, а не ifами, когда все уже бы работало. https://github.com/toppestkek/TwigBlog
if ($link->set_charset("utf8")) { printf("Ошибка при загрузке набора символов utf8: %s\n", $link->error); } else { printf("Текущий набор символов: %s\n", $link->character_set_name()); }
Ничего, если я сюда напишу с вопросом, почему не кликабельна ссылка? <html> <body> <html> <head> <title>title</title> </head> <body> <a hfef="03.html" title="03.html">linkname2</a> </body> </html> честно, не могу понять, где ошибка. В IE и хроме отображается просто как обычный текст. Файл 03.html, само собой, находится в той же папке, что и файл со ссылкой. В гугле не забанили, нет.
>>544949 Наверное там соль конкатенируется с хешем и хранится в одной колонке в базе, а затем вырезается оттуда, если нужна проверка. Сам хеш ведь имеет постоянную длину, для sha1 это 40 символов.
Можно ли как-то средствами html ограничить кол-во загружаемых файлов? Допустим, на сервере стоит max_file_uploads 5, и я могу написать плашку типа "разрешено не более 5 файлов", но юзер все равно сможет выбрать сколько захочет. Понятно, что сервер лишние просто не примет, но тем не менее как-то нехорошо получается. Джаваскриптом не пускать лишние?
>Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку. Знаю. Но я говорил, что это с самого начала делал, когда еще не знал как правильно. Пробовал различные форматтеры, но все как один не только убирают ненужные пробелы, но и увеличивают количество строк в лучшем случае процентов на 10-20. Ну думаю, хватит того, что буду со следующей работы писать правильно.
>Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется). Я только за классы. Душа к ним изначально лежала.
>Ну и подучи синтаксис селекторов. Ссылки сохранил. Пока пробежался быстренько, есть пара незнакомых моментов, а некоторые статьи наоборот я уже даже читал.
>Дальше, если есть желание, можно изучать JS (задачки в ОП треде) или по PHP что-нибудь делать. Уже давно определился, что следующий шаг это яваскрипт, с учебником тоже определился ранее http://learn.javascript.ru/ Как я понял учить там нужно все. Ну и не проблема. Я не знаю насколько большой этот учебник, но раз надо, то выучу все, проблем с чтением литературы не имею.
>Ну и так как ты (судя по потраченному времени) увлекаешься HTML/CSS то советую почитывать иногда статьи об интересных возможностях этих технологий. Я бы не сказал, что увлекаюсь, скорее хочу знать все. Тем более в начале мне было сказано, что фуллспековым программистом знающим и фронтэнд и бэкенд в любом случае быть лучше. Ну а время у меня пока есть, имею 2 года пока учусь в универе. Ну а дальше по специальности не пойду и буду пробовать устроиться программистом.
В общем, спасибо, ОП, что в некоторые моменты настаивал на том, чтобы я не забрасывал сложные вещи, а разбирался в них, они как это бывает, оказались не такими уж и сложными. Думаю дальше сам себя заставлять теперь буду после этого опыта. Лично меня ты не только верстке обучил.
Опять я пасту целую написал, ну что поделать, люблю поговорить.
>>543875 ОП, проверь пожалуйста. https://github.com/never3ver/vector Все переделал, кроме __clone. Я так понимаю, что мы помощью __clone переопределяем стандартный метод clone для одного или нескольких свойств объекта, правильно? В моем случае мне нужно в этот метод поместить код для клонирования объекта SplStorageObject, содержащего объекты сотрудников, и тут я просто не знаю что делать, гугл не помогает, мануал тоже, ничего не клонируется а тупо создается ссылка. Накидал как смог и закомментировал. https://github.com/never3ver/vector/blob/master/Classes/Department.php#L16 На данный момент для получения правильного результата используется функция клонирования департамента.
> В моем случае мне нужно в этот метод поместить код для клонирования объекта SplStorageObject, содержащего объекты сотрудников, и тут я просто не знаю что делать, гугл не помогает, мануал тоже, ничего не клонируется а тупо создается ссылка
Если ты делаешь clone $employees то да, ты клоируешь объект Storage, но сотрудники в нем не клонируются. Потому надо создавать новый пустой Storage и по одному класть туда клоны сотрудников.
И разумеется да, надо делать все это в методе __clone чтобы стандартный оператор clone делал полноценную копию компании, департамента или работника.
>>545317 >надо создавать новый пустой Storage и по одному класть туда клоны сотрудников Вот этого мне и не хватало. Спасибо, заработало. С __clone разобрался.
Надо срочно разобраться с блочной вёрсткой сайта, где найти пояснение по поводу основных моментов. Хорошо бы с реальными примерами, а то про float и position я прочитать могу, но когда ситуация немного сложнее я вообще ничего не понимаю.
В большинстве вакансий требуют знания вордпресс/друпал и т.д., а я боюсь их больше симфони. Смотрел некоторые cms, там такая дикая каша в коде, что разобраться с этим не представляется возможным.
Чем вообще занимаются разработчики на cms? Пишут всякие планигы/модуля? Но зачем, если написаны уже тысячи готовых.
> Чем вообще занимаются разработчики на cms? - устанавливают CMS - задают разные настройки в админке - натягивают верстку (чаще всего и верстку делают тоже они) - устанавливают плагины - ставят костыли в коде когда что-то не работает - (реже) пишут свои плагины
По сути разработчиком на CMS обычно называют верстальщика со скиллами натягивания верстки.
Соответственно тебе надо установить эти CMS, пощупать, может почитать руководство пользователя, руководство по натяжке шаблонов (изготовлению тем), потом найти и запомнить 20 самых популярных плагинов к ним. Если ты хочешь писать свои плагины то почитать документацию для разработчиков.
Что бояться-то? CMS как раз расситаны на не умеющих программировать вообще.
>>545482 >у тебя слабые скиллы разбирательства в чужом коде Есть такое. Хотя и код выглядит не аппетитно. Мне почему-то легче расковырять фреймворк, чем разбираться в этой мешанине функций с неговорящими названиями, код внутри которых не связан логически. Честно, писал на слиме и юи, все абсолютно понятно (хоть и не с первого раза) и вполне логично. А cms не воспринимаю, наверное мне просто неинтересно этим заниматься. Ты нас тут так приучил к ооп и красивым паттернам, что процедурный код теперь не лезет.
Ну ладно, если ты говоришь что все так легко, то выделю по две недели на wp и друпал, пригодятся первое время. Я смотрю даже хорошие компании этим делом не брезгуют на безрыбье, просят знать.
Зря я на ночь пролистал вакансии. Если судить по требованиям, что там пишут, то тру-программисты уже рождаются с трехлетним опытом и знанием кучи технологий.
Аноны, а что скажете насчет своих редакторов? На чем код пишете? Я вот пробовал несколько, например сублим текст 3 и нотпад++ и остановился на втором. В принципе вполне комфортно на нем пишется, но подойдет ли он для серьезных работ? Или возможно там нужны будут какие-нибудь расширения? Я в общем хотел изначально выбрать тот редактор, на котором бы в дальнейшем серьезные работы писать, чтобы не переучиться на него потом, а начать сейчас в нем разбираться.
>>545481 >Что бояться-то? CMS как раз расситаны на не умеющих программировать вообще. Вот интересно, они вроде не рассчитаны, однако же ковырять их сложнее, чем такой же сайт из ТЗ заново на фреймворке написать.
Не подключались ресурсы (ни js, ни css), грешил на менеджер ресурсов Yii. Какого же было мое удивление, когда оказалось, что это AdBlock блокирует любые ресурсы, в названии которых присутствуют нехорошие слова (типа banner или ad). А я как раз делаю сайт объявлений, у меня половина файлов содержит такие стоп-слова. (Кажется, по английски "объявление" правильнее будет classified, но ad короче писать)
Кстати, ОП кажется призывал не пользоваться браузерными расширениями по каким-то параноидальным причинам. Как же мне тогда рекламу резать? На минуту включил, так оно меня обвешало баннерами с дилдаками и предложениями слетать в Таиланд.
Можем разобрать тут пример и поискать решение, но при условии что ты сначала прочел документацию или погуглил и что ты знаешь PHP (или JS если он нужен), то есть мы можем разобрать именно проблемы интеграции верстки в ВП, а не основы программирования. Основы программирования надо изучать по учебникам.
Так как в ВП шаблоны это PHP файлы то там можно засунуть любую логику и я проблем не вижу.
Это как раз хорошо что ты обнаружил проблему, ведь ты иначе мог бы сделать неработающий у многих пользоваелей сайт. Ты должен смотреть интернет теми же средствами что и пользователи.
По поводу адблока мне как раз и не нравится эта всеядность, я считаю блокировать надо конкретные домены а не все что отдаленно напоминает рекламу.
Ну и у адблока есть еще недостатки, в фаерфоксе он тяжелый и жрет ресурсы не хуже самой рекламы (я помню был блогпост в блоге мозиллы на эту тему, он там очень неэффективно сделан, например внедряет огромные CSS правила в каждый фрейм). Ну и так как он массовый то его умеют обнаруживать сайты.
Я лично блокирую рекламу тем что отключил яваскрипт везде кроме нескольких сайтов где я им пользуюсь, а большинство рекламы без JS не работает. А, еще у меня в хромиуме нет флеша и опять же часть рекламы не работает. До этого сидел в обычном браузере и как-то реклама особо не раздражала. может быть потому что я не сижу на сомнительных сайтах. Еще до этого у меня была старая опера, которая тоже блокировала скрипты и всякие шпионящие домены типа google analytics.
Из минусов, некоторые (кривые) сайты могут вообще ничего не отображать, так как там показ контента завязан на JS. Увы, в Хромиуме нельзя отключить еще и CSS, чтобы увидеть сам текст без скрывающих его стилей.
> Кстати, ОП кажется призывал не пользоваться браузерными расширениями по каким-то параноидальным причинам. Ты можешь пользоваться если полностью доверяешь автору. Так как расширение это бекдор который имеет полный доступ ко всему что ты видишь и пишешь в браузере, а также возможно оно может устанавливать программы на сам компьютер (работающие вне пределов браузера). Никакой системы безопасности там нет, все чисто на доверии что автор не будет делать ничего плохого. Так что ставь но на свой страх и риск. И не заходи со включенными расширениями в интернет-банки и подобные сайты.
>>545532 >может быть потому что я не сижу на сомнительных сайтах У меня в почтовом ящике от яндекса все облеплено рекламой. И главное суки неприкрыто читают письма и выбирают оттуда ключевые слова для подбора тематики.
Гмейл тоже следит за мной? Как быть? Где завести надежный ящик?
А я почту читаю через Thunderbird, а не сайт. Рекламы там разумеется нет, open source. Но когда я в последний раз был в яндекс-почте, там вроде терпимая реклама, не навязчивая. А в гугле по моему вообще просто одна строчка которая по моему отключается в настройках.
Если ты везде видишь именно навязчивую рекламу, стоит проверить нет ли у тебя вирусов, вредоносных браузерных расширений которые ее подсовывают, не заражен ли роутер.
Вот смотрите, у меня в слиме хедер рендерится в файле старт, отдельно от роутеров. Вопрос: как туда передать массив $users, в зависимости от которого либо показывается Register либо Hello, %username%.
>>545532 Дешевле и быстрее только если ты сам по своему усмотрению делаешь (т.е. тупо интернет-магазин и похуй какой дизин и функционал у него будут, стандартную тему для магазина из джумолы просто берешь и все, чтобы вообще во вьюхи и бэкенд не лезть), а если тебе дают макет и ебанутое ТЗ, то проще на фреймворках с нуля ящитаю.
Посмотрел сейчас тему для вп, а весь код оказывается с бэкендом удалился. да похуй короче на это говно, пусть ЖАБАСКРИПТИЧИКИ и версталы в цмсках ковыраются, как раз их уровень.
можно ли в один класса засунуть создание объекта другого вот так? class Cookie { public function __Construct($app){ $cookieToken = new Token(); $cookieKey=$cookieToken->generatePassword(8); $app->setCookie('username', $cookieKey, time()+86400*4); //setting cookies 86400 = 1 day }
Могут ли виды создавать объекты контроллера в MVC. То есть вот есть уменя жава скрипт на странице, он вызывает какой-то файл. Правильно-ли будет запилить так чтобы он вызывал файл вида который будет создавать объект контроллера и передавать ему данные? Или нужно напрямую сразу через контроллер взаимодействовать?
>>545660 Блджад, но я о другом же совсем. Правила я вообще не рассматриваю сейчас, как и валидацию (у меня вообще в примере новая запись создаётся). И про плесхолдеры я другие спрашиваю, куда ты лезешь-то?
>>545683 >у меня вообще в примере новая запись создаётся Ну правильно, в твоём примере ты создаёшь новую запись, присваиваешь полю name хуй знает что из юзер инпута, возможно null, потом сохраняешь запись. Типа если был null, будет подставлено значение по умолчанию из правила.
>И про плесхолдеры я другие спрашиваю Во вьюхе что-ли? Но плейсхолдер до жопы, если юзер ничего не ввёл - получишь null. Если default value - получишь его.
>>544876 >Ты наверно наши задачи на HTML/CSS (в ОП посте) не прорешал, а зря, они хорошие, вот другие аноны наверно не проверяя в браузере CSS написать могут. Делал начальные, но не было особой мотивации, так как более интересно было всё же чистое пхп. Сейчас вот стал знакомиться по работе с jquery, и влюбился с первого взгляда, начну изучать.
сделал считалку без рекурсии http://ideone.com/QuAv3r Странно что я сразу не увидел этого решения, а решал ее через рекурсию, еще подскажи что можно прочесть для лучшего понимания того как правильно создавать и организовывать рекурсивные функции а то у меня от них уж больно сильно голова пухнет
вот что получилось, застрял, ни как не могу дальше продвинуться, пытался обрабатывать исключения но все мои попытки не к чему не привели, http://ideone.com/7gGwfJ
uploads — надо внести содержимое в гитигнор, но саму папку оставить в репозитории (для этого можно поместить в нее файл .placeholder и закоммитить его, и для него сделать исключение в гитигноре. Гит управляет только файлами и в нем нельзя добавить пустую папку).
Еще насчет файлов, есть такой подход когда весь код выносится за пределы корневой папки веб-сервера. То есть мы делаем допустим папку public, в нее кладем index.php, стили, скрипты, а все что пользователю видеть не положено, выносим за ее пределы. Это повышает безопасность, так как не позволяет скачать какие-то посторонние файлы снаружи. Не хочешь попробовать сделать? Придется только в конфиге Апача путь к папке поменять.
Теперь посмотрим базу данных
> `name` varchar(255) COLLATE utf8_bin NOT NULL, Зачем utf8_bin? В чем выгода от регистрозависимого сравнения и сортировки?
> CREATE TABLE IF NOT EXISTS `comments` ( Вот это IF NOT EXISTS это плохая идея, так как лучше пусть он при разворачивании дампа выдаст ошибку чем оставит старую таблицу и напишет что все ок. Покрути в средстве, которым ты делаешь дамп, нужные настройки.
> INSERT INTO `users` (`id`, `login`, `password`, `email`, `cookie`) VALUES Этот обрывок запроса надо удалить.
> `user_id` int(11) NOT NULL, > `file_id` int(11) NOT NULL, Где внешние ключи? http://denis.in.ua/foreign-keys-in-mysql.htm Если не очень хорошо знаешь базы данных, в ОП посте есть хорошие задачки на SQL
База без внешних ключей это не реляционная база, а свалка.
Этот комментарий остается в базе и поможет в ней разобраться.
> `tags` varchar(255) COLLATE utf8_bin NOT NULL, Почему tags строкой а не отдельной сущностью? Погугли по словам «нормализация sql» и прочти любую статью на эту тему, которая тебе больше нравится, и подумай, правильно ли ты реализовал теги. Учти, там есть заумные статьи, а есть где написано простыми словами.
> `public` enum('1','0') COLLATE utf8_bin DEFAULT '0', Для ENUM нельзя использовать числа так как mysql поймет их не как значения, а как номер опции. Для ENUM надо использовать только текстовые, написанные латинницей, значения. Например yes/no, true/false. Ну или можно использовать еще TINYINT(1) NOT NULL DEFAULT 0
> `cookie` varchar(200) COLLATE utf8_bin NOT NULL, > `token` varchar(255) COLLATE utf8_bin NOT NULL, Нужны комментарии
> `filesize` varchar(266) COLLATE utf8_bin NOT NULL Почему размер это строка? И почему в ней 266 символов?
> `login` varchar(255) COLLATE utf8_bin NOT NULL, мне кажется ты зря тут ставишь utf8_bin так как он будет считать name и NaMe разными именами, а на мой взгляд это практически одно и то же. Тут лучше ставить collation для сравнения без учета регистра символов.
Также, на таблицах users, files надо проставить уникальные ключи для колонок, чьи значения не могут повторяться.
> `password` varchar(500) COLLATE utf8_bin NOT NULL, Нужен комментарий что именно там хранится, пароль, хеш, или что-то еще (и если ты не хранишь соленый хеш то придется переделывать, почитай урок https://gist.github.com/codedokode/9576319 ).
> https://github.com/toppestkek/TwigBlog/blob/master/app/start.php#L31 > $app->render('Header.php', compact('app')); > $app->run(); Это неправильно. Во-первых Слим не расситан на такой сценарий использования, во-вторых при таком подходе мы например не можем выводить заголовки, не можем отдавать не-html файлы.
Подключать шапку придется в конкретном шаблоне. Если бы ты использовал twig, то там есть такая штука как наследование шаблонов, она как раз для этого придумана.
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes.php Это не очень хороший подход. Суть микрофреймворка в том, что контроллеры там крошечные и мы кладем их в один файл, все в одном месте, кратно и понятно. А если у тебя так много файлов то может быть тебе нужен другой фреймворк.
В твоем конкретном случае не надо писать код простыней прямо в контроллере. делал ли ты задание про студентов? Знаком ли с MVC? Если нет, то стоит вернуться и познакомиться.
> require "dbconfig.php"; > require 'cookie.php'; Мне кажется, оно того не стоит, заводить кучу мелких файлов вместо того чтобы написать все тут же. Идея микрофреймворка в том, что у нас относительно небольшой index.php в котором и происхоит инициализация.
> move_uploaded_file($_FILES["img"]["tmp_name"], $target_file); Нет проверок имени файла, тебе можно легко закачать например php скрипт или .htaccess файл. Вот что надо сделать:
- запретить выполнение php кода в папке uploads ( php_flag engine 0 ) - увы, многие хостеры игнорируют описанную выше команду потому придется при загрузке переименовывать файлы, давая им безопасное имя и расширение, а оригинальное имя сохранять в базе и подставлять при скачивании. Имя выбирай так, чтобы оно было понятно человеку-админу.
> $mapper = new FooMapper($db); Маппер надо сделать сигнлтоном в Слиме.
Простыню с загрузкой и обработкой файла лучше вынести в методы какого-нибудь класса, например FileUploader, методов логично сделать два: первый для проверки, все ли верно, не превышен ли размер файла и тд, второй для собственно загрузки.
> $tokenGenerate = new Token(); Если это класс-генератор токенов то надо так его и назвать, а также сделать синглтоном в Слиме. Хотя тут если никаких полей у него нет, можно сделать метод генерации пароля статическим. Ну и 8 букв это несерьезно.
> $public =htmlspecialchars($_POST['public']); зачем htmlspecialchars? Также, надо использовать $app->request, а не _POST.
> filename=' . basename($log); Это не работает так как по стандарту в заголовках можно использовать только ASCII (латинницу). Чтобы дать произвольное имя, надо заканчивать URL на него, напрмиер /download/123/название%20файла.txt
Также, отдача файла через readfile очень неэффективна так как держит ресурсы всего PHP процесса пока файл не скачается. Да и например докачивать файл PHP не умеет. Отдавать файл должен сервер, и я проедлагаю один из 2 вариантов:
- трюк с .htaccess (работает только в Апаче), когда мы переписываем URL чтобы при обращении /download/123/название%20файла.txt отдавался /uploads/123.txt. При этом считать скачивания не получится. - использовать модуль XSendFile:
Суть в том что PHP тут вызывается до скачивания, проверяет все ли ок, и затем отдает специальный заголовок который перехватывает сервер и далее уже без участия PHP файл отдается со всеми удобствами.
Исключения от PDO ловить не надо, все исключения ловит Слим и выводит страницу-заглушку (точнее в твоем случае может быть не выведет так как ты уже успел вывести кусок шапки).
> WHERE tags LIKE '% :search %' "; Это неэффективно так как ты делаешь полный перебор всех записей, а если вынести теги в отдельную таблицу (что и надо сделать) то можно будет сделать поиск по индексу. конечно когда у тебя 100 записей это не особо важно, но все равно теги так не делают.
И еще, напоследок скажу. Мне кажется, ты пропустил задачу про студентов, и зря. В ней изучается работа с формами, таблицами, вывод и редактирование записей. К самой задаче написаны подробные комментарии. Ты теряешь много знаний и практических навыков которые мог бы получить.
Да, будет, что поделать. Но мы верим что они все в итоге зарегистрируются на нашем чудесном сервисе. А какие у тебя есть альтернативы? Хранить коды доступа в 2 местах по моему сильно все усложняет.
Код неплохой, но во-первых нет проверки на ничью, во-вторых проверка на дабл должна идти до сравнения очков, так как при дабле у нас ничья даже если у кого=то очков меньше.
Яваскриптом пересчитывать после выбора и блокировать отправку. Ну и предпреждение написать. А лучше конечно разрешить грузить сколько пользователь хочет.
> Уже давно определился, что следующий шаг это яваскрипт А у нас если что и задачки есть в ОП посте, и на DOM, и на jQuery тоже есть. Ну и думаю дальше у тебя проще пойдет, вторую технологию легче изучать чем первую.
> public function getEmployeesArray() Так как SplObjectStorage является итератором, то получить из него массив можно такой малоизвестной функцией: http://php.net/manual/ru/function.iterator-to-array.php (переделывать не обязательно)
Но по хорошему конечно у него должен быть метод toArray(), не знаю почему его забыли сделать.
В общем, если ты не накосячишь, то после исправления этих замечаний задача будет решена, ну а ты, надеюсь, научился использовать ООП для моделирования предметной области задачи.
Профессионал способен разобраться даже в коде Друпала, а уж Вордпресс это отдых. Если ты знаешь фреймворки то хорошо так как ты понимаешь как обычно обрабатываются данные в веб-приложениях и можешт увидеть что-то аналогичное.
> то выделю по две недели на wp и друпал, пригодятся первое время. Могу тогда предложить задачку: сделай на вордпрессе https://m.roem.ru. Админы и модераторы постят статьи и модерируют комменты, пользователи комментируют и предлагают новые статьи. Мобильную версию советую так как она проще.
Нет. В CMS есть готовая админка + функционал вроде вывода статей. Для простого сайта самое то, на фреймворке дольше. Сейчас много делают например на вордпрессе. Ну а интернет-магазин на CMS намного быстрее чем с нуля, если только это не микромагазин на несклоько товаров с индивидуальным дизайном.
только чтобы нормально владеть jQuery надо сначала изучить DOM, XHR, события так как jQuery лишь удобная обертка над ними. У нас кстати в ОП посте в задачах на JS есть задачи на jQuery.
> а решал ее через рекурсию, еще подскажи что можно прочесть для лучшего понимания того как правильно создавать и организовывать рекурсивные функции Не знаю, можно наверно какие-то задачи порешать. Ну например, напиши рекурсивную функцию вычисления числа Фибоначчи с номером N:
> for ($i = 0; $i < $total; $i++) { > $humans[$i] = $i + 1; Функция range() не подойдет?
По коду: не проще ли сделать так: вычисляем номер следующего участника на удаление (прибавляя $skip с учетом зацикливания) и удаляем его через array_splice который перенумеровывает массив? Мне кажется, так было бы чуть понятнее и не пришлось бы делать сложные переносы участников из конца в начало.
Ну и в любом случае, нехорошо что у тебя там строки с формулами 2 раза повторяются, это как минимум надо в функцию вынести.
> PHP Notice: Undefined offset: 7 in /home/RaP7se/prog.php on line 34 Это потому что некоторые строки короче, а некоторые длиннее. Надо проверять сначала, есть ли в массиве такой элемент и если нет то выводить пробел вместо него.
Я правильно понимаю, что пользователя нужно авторизовывать в куки. Например, если куки стоит на какое-то время, то распознавать как зарегинного пользователя. Если он вошел, то в его таблицу вешается кука и по ней хедер сайта сверяется, если он вылогинился, то кука удаляется, как с его стороны, так и из таблицы, да? А если юзер анонимный и в таблице записан, как аноним с кукой, то в хедере если находит куку из таблицы, навешанную на анонима, на это реакции нет? Может вместо уничтожения кук поставить какую-нибудь галочку для юзера - что он вылогинился или залогинился, будет проще, чем куки пересоздавать каждый раз?
Решил задачку W5.1. Хочу узнать правильно ли? Добавил переменную $paymentLast задав ей значение $monthlyPayment - $creditBalance. Дальше задал условие if ($creditBalance < $monthlyPayment) { echo "С меня хватит! вот вам остальное: $paymentLast \n" } на выхлопе получил что анон должен отдать разницу между ежемесячным платежом и долгом за последний месяц 11.
>>546353 Я сам только учусь, но проверку я поместил выше расчетов и поменял на if ((( $creditBalance * $percent ) + $servicePayment) < $monthlyPayment) а потом приравнивал выплату к долгуи высчитывал. Но лучше подожди ответа ОПа.
Предупреждение в начале: "Эта глава требует дополнительных знаний в программировании и не очень важная, при первом чтении вы можете пропустить её и вернуться потом, когда захотите понять, как побитовые операторы работают." принял как вызов, но что-то все это сложно как-то. Стоит ли сейчас в этом разбираться или перейти к следующим темам?
В комментариях под темой не нашел ничего в стиле "Что это? Я ведь новичок в этом, как я должен это все понимать?" и заплакал.
Сап хикканы,вот как то пришел к выводу что нужно начинать учить хотя бы пхп и в будущем найти какую контору у себя в дс. Так вот,насколько долго учить ? Год - полтора? Хотел бы узнать что представляют из себя работа по пхп собственно. Т.е. как это происходит? Тебе дают задание - напиши то-то и ты сидишь ковыряешься ? Насколько много нужно знать что бы сделать это? И что нужно знать что бы тебя взяли хоть-куда.
>>546373 Я вчера вечером учить сел, с утра проснулся и уже 369 предложений по работе. Только что пришел с собеседования, сеньором взяли. Теперь пассивный доход 10к доллоров в неделю.
Внешние ключи это не какая то отдельная вещь, ты прописываешь их при создании таблицы. То есть сначала надо правильно создать таблицу а потом работать с ней.
Это неправильно. В базе надо хранить исходные данные, то есть число байт, а не их краткое представление. Как ты посчитаешь например суммарный объем загруженных пользователем файлов по таким данным?
Где я говорю брать другой фреймворк? Слим хорошо подходит для файлообменника. Я говорю что надо вместо гиганских простыней разбросанных по куче файлов оформить код в одном файле и вынести лишнее в другие классы.
А почему «или»? тебе без разницы какой фреймворк изучать?
Я могу придумать задачку на создание клиентсайдного приложения, но я думаю то в начале придется изучить более простые технологии вроде Backbone, Knockout, чтобы разобраться с MVVM и дата байндингом, с синхронизацией данных и оффлайн режимом и тд. Вообще, мне было бы интересно сделать задачу на создание яваскриптового приложения, да.
Ну и разумеется предполагается что более простые вещи вроде DOM, XHR, событий ты уже знаешь.
>>546484 >А ты знаешь что такое двоичные числа? Попробуй сначала разобраться что это и тогда битовые операторы понять будет не сложно.
Гуглю сижу. Нашел пока вот это. http://www.uroki.net/docinf/docinf28.htm Вроде понемногу начинаю разбираться. По крайней мере могу перевести десятичное число в двоичное и обратно, а так же освоил с горем пополам сложение, вычитание и умножение, но деление что-то мозг отказывается воспринимать.
>>546499 Делил конечно. Но тут сложнее. Долго высчитывать было на каждом шагу вычитания. Тем более я сейчас без бумажки просто в уме все числа запоминая, сложновато в общем было, но уже разобрался. Проблема только в скорости высчитывания, а технология уже ясна.
И еще такой вопрос. В учебнике написано, что статик методы вызываются как-то так :: А как мне тогда статичный токен сгененрировать для куки? вот статичный токен class Token { static protected $string; public static function generatePassword($length = 8){ $chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789'; $numChars = strlen($chars); $string = ''; for ($i = 0; $i < $length; $i++) { $string .= substr($chars, rand(1, $numChars) - 1, 1); } return self::$string; }
вот его генерация для куки
$cookieToken = new Token(); $cookieKey=$cookieToken->generatePassword(8);
но ведь написано, что оно должно как-то так вызываться $cookieToken::generatePassword(8); не?
Я тут переписывал код, избавлялся от двумерного массива в $map заменяя его на список объектов, и когда дошло дело до перемещения оказалось, что код теперь может работать и без определения границ, то есть наши космические кошки теперь могут удалиться и на 15 "клеток" и на 5493720, и на -41892346, и т.д. Все прямо как в нашем мире - вселенная бесконечна, расширяется не вселенная а материя в ней!
Помогайте, ребятки. Взяли на работу, проект на юи, я юи нихера не знаю. В общем меняю там ксс - ничего не меняется, только по прошествии времени иногда. Я так понял на меня нагрянул кеш. Как очищать кеш в юи? Сжальтесь, я только начал его изучать. Работал раньше на другом фреймворке, там в дебаг режиме кеш вообще не сохранялся, а тут вот палки в колеса.
>>543720 (OP) Дорогой ОП, пишу тебе впервые. Прохожу самоучитель с нуля, засел в регэкспах, вроде бы сделал первую задачку про телефонный номер, но мне кажется, что очень уж уёбищно и громоздко у меня получилось, хотя вроде все форматы, которые даны в условии задачи, проверку проходят. Алсо немного не понял это: может ввести не только цифры, но и скобки, минусы, может что-то еще. В смысле, может ввести, но это не должно приниматься? Вот ссылка, если обратишь внимание: http://ideone.com/ynYv7Q
Столкнулся с проблемой, работаю я на фирме у которой есть говносайт, там порядка 20000 строк говнокода. И решил я понемногу вырываться из этого, начал писать на yii2. Нужно было сделать новый раздел и написал я его на фреймворке, но есть одна проблема: когда заходишь в новый раздел, в ней не действует сессия с основного сайта. Я подозреваю, что yii использует свой механизм сессий и рассчитан на то, чтобы быть основой приложения, но как быть, если он просто часть?
>Вам не следует выбрасывать исключения PDOException из своего кода. Не понял, как мне написать обертку для PDO? Создаю класс наследуемый от PDOException, но объекты pdo и statement выбрасывают именно PDOException, а дочерний класс их не ловит. ОП, ты скажешь, дак кидай свой эксепшен, но ведь он не сгенерит нужное сообщение с ошибкой из БД, кароче я запутался...
комментирую код на картинке: нет никакого смысла писать throw и catch одного исключения внутри одной и той же функции так как в этом случае проще написать if
Вот есть у меня таблица примерно такая, но больше +--------+---------+--------+ id | pid | data | +--------+---------+--------+ 1 | null | 123 | +--------+---------+--------+ 2 | 1 | 232 | +--------+---------+--------+ 3 | 2 | 313 | +--------+---------+--------+ 4 | 3 | 232 | +--------+---------+--------+ pid - id родителя, data - какая-то инфа. Как мне по айдишнику получить инфу из самого старшего предка?
>>546646 Кстати, да, читаю книгу, написано, что нужно делать throw exception. А у меня все в PDO try {} catch. Так как надо? наверное, exception нужно только внутри классов делать.
>>546675 АХ ВЫ УБЛЮДКИ, ПЕРДИТЕ В ПОЕЗДАХ, ЖАННОЧКА МЕЖДУ ПРОЧИМ НЕ ЕЗДИЛА НА МЕТРО, ОНА НА КРАСНОМ, КАК ВАРЕНЫЙ РАК, ХЭТЧБЭКЕ ПО СТЕНАМ ГОНЯЛА, ЗАЧЕМ ВЫ ЕЁ ГРЯЗЬЮ ПОЛИВАЕТЕ, НЕГОДНИКИ?!?! НАКАЗАНИЕ ЕЩЕ ВПЕРЕДИ, КОБЗОН НАСТУПАЕТ!!!!
БОХ НАКАЖИТ ВАС ЗА ТАКИЕ СЛОВА ОЙ НАКАЖИТ БУМЕРАНГОМ ВСЕ ВЕРНЕТСЯ ЖАННОЧКА СЕЙЧАС СЛЫШИТ И ВИДИТ НАС ИРОДЫ НЕХРИСТИ
>>546674 я отложил на потом, тем более, еще писать контроллер, который в свою очередь будет задействовать вспомогательные классы, в их методах тоже могут быть исключительные ситуации. Почему бы не вынести функцию отлавливания catch'ем в контроллер, а из класса маппера и класса для валидации кидать эксепшены?
>>543720 (OP) Ебать охуел от адеквадтности ОПа и треда в целом. Просто чудовищный контраст по сравнению с другими тредами где тебя обсыкают перманентно. И так php ребята, учил я тут питон и django и думал влезть на фриланс. Так как очень плохо пишу на инглише,закономерно всосал на upworke, а разработка на django на просторах снг никому не всралась. Так у меня вопрос с чего лучше начинать PHP и javascript что максимально быстро выйти на рынок? Мильёны заработать не мечтаю, я бы на 100 баксов в месяц согласен.
>>546834 положение шариков по вертикали и его изменение всегда остается детерминированным, но у некоторых шариков возникает иллюзия, что они могут крутиться быстрее или медленнее. мамкиндетерменист
Сел сегодня за пхп, и первый пример в книге связан с отправкой письма. У меня, конечно, ничего не отправилось, так что пришлось копать гугл. В итоге поставил на свою убунту ssmtp и полез править конфиги. Делаю все как здесь webhamster.ru/site/page/index/articles/comp/149 или с небольними вариациями, но результат один: из консоли ничего не происходит, браузер просто бесконечно грузит пхп файл. Пробовал отправлять с гмэила и яндекса, на гмэил один раз пришло письмо, типа была попытка зайти с неизвестного устройства. Такое чувство, что все стопорится самим почтовым ящиком, но что он о себе возомнил? Я ведь не могу двигаться дальше, пока не превозмогу это препятствие.
Чего твиг выбрасывает исключение при обращении к несуществующему свойству? Заведомую ерунду типа abc или x.y он спокойно приводит к null и соответственно пустой строке при рендере (что и требуется), к такой переменной можно применить фильтр default например.
Однако если передать ему реальный объект, то он спотыкается на несуществующем свойстве, пишет An exception has been thrown during the rendering of a template ("В классе Foo и его поведениях не найден метод или замыкание с именем "property".") Пытался его и фильтрами model.property|default('hello world'), и ифами проверял {% if model.property %}{{ model.property }}{% else %}not found{% endif %} Все равно выкидывает исключение.
Я понял, это проблема взаимодействия yii с твигом. Проверил на пустышке, все работает. А с yii косяки, то переменная недоступна в шаблоне виджета, теперь не срабатывают фильтры.
Ладно, позже скину гитхаб, чтобы было о чем говорить.
>>546980 Проблема была в юишных геттерах. Я использовал паттерн eav для описания модели объявления, соответственно в главной модели есть свойства (и геттеры) только для общих полей. Для полей eav геттеров не было, поэтому выбрасывался эксепшн. Решено при помощи кала (__call), он у меня получается выполняет роль фильтра default.
>>546846 Да в общем все вместе, нет заказов, я пишу на инглише так что хоть святых выноси. Литературы маловато по джанге, например связку фрейморк + база данных я практически не знаю, литератур только на английском( читаю я неплохо, но медленно), сделал для портфолио лишь 0.25 сайта на бесплатном хостинге openshift. Да и просто смотря сколько заказов по PHP и Python становиться грустно. В PHP хоть можно что за индусами подбирать, в django нужны одни паладины без страха и упрека. >>546843 Заставил меня гуглить. Детерминированность (от лат. determinans — определяющий) — определяемость. Теперь вообще не могу понять что ты сказал.
ты постоянно повторяешь один и тот же код, попробуй использовать функцию и вызывать каждый раз ее. Функция будет вида function randWord ($arr) { $randWord= $arr[mt_rand(1, count($arr)-1)]; return $randWord; }
Как заставить twig форматировать дату в соответствии с локалью? Фильтр date выводит английские версии, несмотря на таймзону: model.added|date('d F', 'Europe/Moscow') Intl стоит, чего ему еще нужно?
ОП вновь не могу осилить рекурсию, в задаче про навигатор функция считает правильно если необходимо сделать 1 шаг, если же больше рекурсия работает (вроде только в том случае если элемент для которого вызывается функция стоит на [0] позиции, еще не правил), но возвращает результат последнего вызова. http://ideone.com/R6Oz9u натолкни на верный путь. ни как не получается связать =(
>>546641 >но как быть, если он просто часть? >фреймворк >просто часть Никак не быть, это маразм. Можно использовать те же независимые бандлы Symfony для определенных задач, но никак не целый фреймворк, если у тебя приложение уже основано на какой-то говноцмс или другом фреймворке.
>>543720 (OP) Итак с вами ОП этого треда. Что-то ОП пост мне не нравится. Во первых задачи лишены градации. Сначала оверпросто, потом сразу хардкор. Нет вменяемой литературы. Вместо неё какой-то странный сайт php.net на котором чтобы найти ответ - нужно часа 2 лазить. (Я рекомендую Пыху.) Там хоть и сумбурное сборище, но всё-же ответы на вопросы ищутся быстро и всё более менее понятно.
>Что почитать >- Мануал по PHP — http://www.php.net/manual/ru/langref.php Кто в здравом уме это читал? Серьёзно, кто-то взял в руку чашку кофе, подумал что сейчас можно передохнуть и почитать что-то и залез по ссылке? Или намеренно прочитал весь текст? Поздравляю, более безсмысленного времяприпровождения в жизни не видел. Есть вопрос - гуглишь и находишь ответ. Так читать про PHP - просто получать спутанный клубок знаний.
Прочитал - не одобряю. Книга расчитана на весьма ВЕСЬМА олдфагов с опытом работы 3года+
class Person { function __get($property){ $method="get($property)"; if(method_exists($this, $method)){ return $this->$method(); } } function getName(){ return "Ivan"; } function getAge(){ return 44; } } $p = new Person(); print $p->name;
Почему этот код не работает? Должно писаться Иван.
ОП, ответь на такой идеологический вопрос. Вот, допустим, есть у меня модель. Есть экшн в контроллере, который должен во вью выводить информацию. Однако после запроса информацию нужно еще должным образом обработать(пропустить через foreach, добавить что-то, ну, типа того). Так вот, эти все преобразования лучше производить сразу в модели, или же лучше в представлении? Я бы делал в модели, но тогда она становится вообще не абстрактной и ее нужно сильно расширять, если те же данные нужно представить в другом виде. Тогда логичнее в представлении, но можно ли так? И еще вопрос, нормально ли писать запросы в контроллере, или лучше через гетеры получать из модели?
Аноны, застрял на второй задаче про регекспы, на первой её подзадаче - максимум, что удалось, это выделить слово, которое идёт после запятой без пробела, но как сделать так, чтобы нормально работало на большом количестве таких слов? Если есть два слова подряд, функция может их вывести в одном элементе массива, в принципе условию это соответствует. Но если есть два слова таких, потом запятая с пробелом, а потом снова слово, то не работает (см. ссылку). Как вообще пройти несколько раз по строке? На php.net читал, что вроде как в массиве вся строка и последняя итерация, тогда вообще нифига не пойму. Дайте спойлер что ли какой-нибудь. http://ideone.com/5oEUyr
>>547234 Вообще, хотелось бы сделать единый вывод для ошибок на каждом этапе работы контроллера, примерно как сделано в моделях. Как это лучше всего реализовать?
>>547246 preg_match возвращает не все совпадения, а первое. Тебе он возвращает массивчик с полным текстом совпадения и со значением группы 1 (то что в скобочках). Поищи другую функцию preg_, которая захватывает все совпадения (это спойлер). Можешь, конечно, сделать и с этой функцией - у нее есть флаг PREG_OFFSET_CAPTURE, который отдает тебе позицию совпадения, зная которую, ты можешь вызывать preg_match в цикле, чтобы найти следующее совпадение.
ОП сделал проверку на наличие элемента, условие работает, но теперь беда в том что не хочет выводить полностью предложения если задавать длину переменной, если выставлять руками (например 40) то отрабатывает на отлично как в примере у тебя. и еще он какую то ошибку мне показывает на 35 строке Где я опять накосячил?
Написал свой первый хеллоу ворд)0 Задача про компанию Вектор, вот тут ее нашел: archive-ipq-co.narod.ru/l1/pasta.html Посмотрите пожалуйста: ideone.com/IfbLQo
>>547436 Тот что посередине. Что значит "лучше"? Две темы оформления, два стиля дизайна, какой тебе/заказчику больше нравится, тот и "лучше".
На мой вкус конечно симпатичнее левый (только надо приглушить жирную box-shadow), но все зависит от аудитории. На говносайтах наоборот больше котируются яркие вырвиглазные темы. Ориентируйся на целевую аудиторию, короче.
http://archive-ipq-co.narod.ru/l1/pasta.html у кого есть готовый код первой задачи? дайте ссылку. Ни как не могу понять что хотят от меня требуя создать function createQuestions() и чем ее заполнять и т. д.
>>547677 А так и не понял рекурсию. Ну то есть понял что это функция вызывает сама себя, но когда пытюсь реалезовать на языке - обосрамс гарантирован. Вечно проебую откуда оно должно начинаться и как должно оканчиваться.
Как значению DIV точно задать в процентах чтобы он стоял ровно на 20% от левой части и занимал 50% страницы, а div номер 2 стоял правее него и занимал 15%? Никак не могу понять этого.
Механизм авторизации через куки при использовании логина и пароля такой:
----------
В случае авторизации через куки мы выставляем в куки id пользователя + какой-то секретный трудно угадываемый ключ, например:
- хеш пароля (злоумышленник его не знает) - специальный длинный случайный код, который генерируется при регистрации пользователя и хранится в базе. Этот вариант позволяет не хранить даже хеш пароля у пользователя - цифровую подпись id пользователя, подписанную секретным ключом сервера (плохой вариант так как она не меняется при смене пароля пользователем)
Что важно помнить:
- при смене пользователем пароля старые коды должны становиться недейтсвительными. Ну к примеру, пользователь подозревает что его куки украли и хочет сменой пароля защититься от их использования. - для кук надо стаивть флаг httpOnly, который делает куку недоступной яваскрипту и защищает от ее воровства через XSS уязвимость
Что надо еще помнить: авторизацию (передачу пароля на сервер) надо делать через https, иначе есть варианты украсть этот пароля, например владелец wifi-точки видит проходящие через нее данные, сотрудник провайдера и всяческие госконтроли видят проходящие данные, если они не зашифрованы. А так как куки тоже позволяют получить доступ в аккаунт пользователя, лучше вообще для залогиненных пользователей использовать только https-соединение.
----------
Это в традиционных системах с регистрацией.
Если ты говоришь про файлообменник, где пользователи могут загружать файлы анонимно, а нам надо их отслеживать, то тут механизм другой, мы просто генерируем тем пользователям, у которых нет куки с кодом, этот код и ставим куку, тем у кого она уже есть, ничего ставить не требуется. При загрузке файла в первый раз мы создаем запись в таблице пользователей, как бы создавая нового пользователя. При регистрации мы просто добавляем этому анонимному пользователю логин и пароля.
Анон, тебе бы стоило использовать правильные термины, а то я не очень понял что это значит:
> то в его таблицу вешается кука какую таблицу? что значит вешается? Куки это данные которые хранятся в браузере, на сервере ни в каких таблицах они никак не хранятся. Куки ставятся отправкой заголовка Set-Cookie в браузер, а он шлет их вместе с каждым запросом в заголовке Cookie.
>и по ней хедер сайта сверяется, если он вылогинился, то кука удаляется, как с его стороны, так и из таблицы, да? Если под «хедером» сайта ты имешшь в виду шаблон шапки то там конечно никакого кода проверки кук не должно быть, он должен быть в контроллере.
> А если юзер анонимный и в таблице записан, как аноним с кукой, то в хедере если находит куку из таблицы, навешанную на анонима, Не понял.
> Может вместо уничтожения кук поставить какую-нибудь галочку для юзера - что он вылогинился или залогинился, будет проще, чем куки пересоздавать каждый раз? Не понял, какую галочку и где ты собрался ставить, и зачем надо пересоздавать куки.
Так не пойдет. Ты должен сначала разобраться что такое куки и как они работают (и научиться смотреть их и относящиеся к ним заголовки например в отладчике в Хроме), а только потом делать авторизацию на их основе.
Не совсем так. В генераторе имен мы просто берем случайный слоги, а в Льве Толстом у нас есть набор кандидатов на роль первого слова, набор кандидатов для второго слова, и тд, чтобы в итоге получился стих с размером и рифмой.
В задаче должен получиться ответ «всего выплачено около 61268». Код внутри цикла надо написать примерно так:
- прибавляем проценты и комиссию к остатку долга - если остаток маленький, выплачиваем сколько осталось и уходим - иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
> на выхлопе получил что анон должен отдать разницу между ежемесячным платежом и долгом за последний месяц Нет, я думаю, ты ошибаешься. Анон платит по 5000 в месяц, а когда долг становится меньше этой суммы, выплачивает остаток (в данном случае около 1268) и уходит. Твоя программа должна посчитать и вывести общую сумму выплат за все время.
Зависит от компании. Где-то делают сайты и твоей задачей например будет взять шаблон от верстальщика и интегрировать верстку в CMS, настроить ее, может быть разместить какие-то тексты. Или задачи в стиле «переделать меню на этом сайте». А бывают продуктовые компании, которые разрабатывают свои продукты, и там задачи другого порядка, исправить баги, дописать новый фкункционал.
Учить долго, полгода-год в зависимости от того сколько времени уделять.
Знать надо для начала HTML/CSS/JS/PHP/SQL + ООП/MVC/фреймворки. Открой сайт вакансий и почитай.
> как мне тогда статичный токен сгененрировать для куки? Статические бывают методы, а токен это строка которая одинаковая независимо от того статический или нет метод ее сгенерировал.
К сожалению, примеры кода там запутывают больше чем учат. Статические поля и методы это поля и методы которые относятся к классу, а не конкретному объекту и они вызываются через имя класса:
А ты урок читал? https://gist.github.com/codedokode/9576319 Там написано что соль присоединяется к паролю и хешируется вместе с ним. Ну и конечно соль надо сохранять чтобы пароль можно было потом проверить.
Как видишь 1-мерный массив не только проще, но и во многом удобнее. Однако, твои животные не должны выходить за края карты. Я бы советовал сделать метод проверки и периодически его вызывать, и при обнаружении несоответствий бросать исключение чтобы программист знал что он опять накосячил.
> вселенная бесконечна, расширяется не вселенная а материя в ней! Я точно не знаю сам, что именно расширяется (да и знаем о расширении мы лишь по красному смещению, как я понимаю), так что не утверждал бы так уверенно.
> Алсо немного не понял это: может ввести не только цифры, но и скобки, минусы, может что-то еще. В смысле, может ввести, но это не должно приниматься Как раз наоборот, должны приниматься номера как с минусами и скобками так и без них. кто-то их пишет, а кто-то нет.
По поводу твоей задачи, пока рано что-то говорить, надо ее протестировать на разных номерах:
------ (паста) ------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Механизм сессий в Юи настраиваемый. У тебя есть 3 варианта:
- разобраться как сделаны сессии на сайте и заставить Юи использовать тот же механизм, то есть возможно покрутить настройки, возможно написать свой класс для работы с сессиями - написать отдельный компонент для работы с сессиями сайта, не трогая сессии Юи - забить на это. Так ли тебе нужны эти сессии?
> public function __construct() { > $this->x = mt_rand(); Насчет этого не уверен. Мне кажется координаты должен проставлять тот кто создает объект и ставит на карту, а не мышь сама себе.
> public function move() { > for ($x = $this->x - $speed; $x <= $this->x + $speed; $x++) { > //определяем расстояние до кошки и высчитываем баллы Нет, нехорошо. Ты хочешь все засунуть в 1 функцию и получить длинную запутанную простыню. Разбивай код на отдельные функции:
- получить список возможных ходов - оценить их (отдельно должна быть функция оценки 1 хода) - выбрать лучший - сделать его
Заметь что часть из этих функций одинакова и для кошки и для мышки (как минимум выбор лучшего хода).
Тебе не надо писат обертку для PDO. И ловить исключения тоже не надо, так как по умолчанию в PHP исключение записывается в лог, программа завершается (а пользователь видит белый экран).В случае Слима, он устанавливает обработчик исключний и вместо белого экрана показывает заглушку.
Писать в одной функции throw и catch не имеет никакого смысла. В твоем коде проще сделать if вместо throw/catch (то есть сразу вызывать myMethod() при ошибке). Но это все равно будет неправильно. правильно будет сделать только throw без try/catch.
Перечитай урок про исключения внимательно и разберись для чего они нужны. Надо понимать саму идею, концепцию исключений.
Если ты при ошибке бросаешь исключение, затем тут же его ловишь и вызываешь myMethod() то гораздо проще сразу вызывать этот метод без try/catch. Это говорит о том что код неправильный.
По ООП мало теории, нужно закреплять это практикой. У нас есть в последней главе учебника задачи «Вектор» и «Кошки мышки». Если ты знаешь ООП на пять, ты их решишь за полчаса каждую. Если не знаешь что-то, то пару неделек помучаешься. Рекомендую решить чтобы лучше понимать ООП и как именно с помощю классов мы строим модель предметной области для решения задачи.
За 1 запрос никак. Надо делать запросы в цикле, идя вверх по дереву. Однако, есть более эффективные способы хранения деревьев в БД, которые позвояют быстро получать нужные данные. О них написано в моем уроке: https://github.com/codedokode/pasta/blob/master/db/trees.md
Надо HTML/CSS/JS/SQL/PHP + ООП/MVC/фреймворки, это месяцев 4-12 в зависимости от имеющихся знаний и сколько ты времени будешь уделять.
Посмотри шапку треда, там есть задания почти на все эти темы.
>и думал влезть на фриланс. Имей в виду что офлайновая или удаленная работа может быть комфортнее так как работа есть постоянно, и тебе не надо тратить кучу времени на бесплатные переговоры с заказчиками. Не каждый может зарабатывать на фрилансе.
> без фрэймворков? Смысл? Ты хочешь иметь неактуальные и не нужные на рынке труда знания?
> Какую-бы книжку посовременнее взять, чтобы для ньюфагов Не знаю, в ОП посте есть мой учебник для начинабщих и 2 не очень новых, но хороших книги не для начинающих.
А зачем ты взял такой сложный пример? Чтобы правильно настроить отправку писем надо знать особенности работы SMTP, и особенности настройки почтовых служб в линукс. Я тебе рекомендовал бы если ты начинающий, не начинать с работы с почтой.
Также имей в виду, что ты не можешь просто брать и отправлять письма со своего компьютера — с веротяностью 90% они пойдут в спам или не будут приниматься почтовыми серверами. А чтобы отслыать через аккаунт на gmail/yandex надо разбираться с натстройками SMTP + они могут тебя забанить опять же подумав что ты спамер или бот (а могут и не забанить конечно).
> Делаю все как здесь webhamster.ru Эта статья рассчитана на тех кто на среднем уровне знает линукс и командную строку. Ты знаешь? Если нет, лучше начать с его изучения (ну или пока не браться за отправку почты)
Если тебе интересно, то на реальных проектах обычно используют библиоетку вроде Swiftmailer и ее настройка сводится к прописыванию имен/паролей/адреса сервера для отправки почты, а устанавливать ничего не приходится (или этим занимается сисадмин).
> из консоли ничего не происходит, браузер просто бесконечно грузит пхп файл. Надо изучать что происходит, например читать логи почтового агента.
> Пробовал отправлять с гмэила и яндекса, на гмэил один раз пришло письмо, типа была попытка зайти с неизвестного устройства. Там надо что-то в настройках менять скорее всего.
> Такое чувство, что все стопорится самим почтовым ящиком, но что он о себе возомнил? защита от спамеров и взломщиков
> Я ведь не могу двигаться дальше, пока не превозмогу это препятствие. Можешь, забей на почту и изучай PHP
> for ($i = $length; $i >= $skip; $i--) { Зачем введена переменная $i? Почему нельзя написать count($humans)? В твоем варианте получается сложнее так как надо иметь гарантию что $i всегда соответствует числу человек. Проще не заводить эту переменную вообще, а брать реальное число элементов в массиве. А с переменной всегда есть риск расхождения в количестве из-за какого-нибудь бага.
> if ($count >= count($humans)) { > $count -= count($humans); Это можно сделать красивее операцией взятия остатка от деления % , без if
Сам алгоритм вроде верный, но надо причесать код.
> задача про клавишу shift
> (\\s+)? Это то же самое что \\s☆
В остальном, верно. Реши-ка еще задачку про номера телефонов, с проверкой по большому списку номеров, раз ты не очень знаешь регулярки.
> задача про переворот слов > $arr Не называй так переменную, так как это ничего не значит. В данном случае у нас список предложений, потому логично назвать переменную $sentences
Также, у тебя тут 2 цикла. Но не логичнее ли оставить 1 цикл, а функцию makeFirstletterUppercase заставить работать только с 1 предложением, а не с их массивом?
> Чего твиг выбрасывает исключение при обращении к несуществующему свойству? А в какой ситуации может понадобиться обратиться к несуществующему свойству? У объектов список свойств фиксированный и известный заранее, следовательно в правильном коде обращений к несуществующему свойству быть не может.
> Заведомую ерунду типа abc или x.y он спокойно приводит к null Это плохо. Поставь в твиге опцию strict_variables в true чтобы прекратить это безобразие. (опции, ссылка на англ: http://twig.sensiolabs.org/doc/api.html#environment-options )
> Все равно выкидывает исключение. Скорее всего твой код неправильный. Не обращайся к несуществующим свойствам, элементам массива, переменным.
default предназначен не для случаев когда поля нет, а когда оно есть, но пустое.
> соответственно в главной модели есть свойства (и геттеры) только для общих полей. Если ты сам реализовал магический метод __get то должен реализовать и __isset чтобы работали проверки наличия свойства через это самое isset()
> Для полей eav геттеров не было Ничего не понимаю, но звучит как будто ошибка в твоем коде.Не должно быть такого, что свойство может быть а может не быть. Это не код, а свалка тогда получается с которым нельзя надежно работать.
Также, я не понимаю, зачем делать аякс отправку для регистрации? В Юи и так есть аякс-проверка форм, тебе достаточно толкьо правильно валидацию настроить (а отправка и дет обычным способом).
Также, ты неправильно сделал работу с аяксом. Я не вижу тут обработки ошибок отправки или получения данных. А ошибки надо обрабатывать, сервер может упасть, соединение быть плохим и тд.
> Фильтр date выводит английские версии, несмотря на таймзону: А какое отношение таймзона имеет к локали? Таймзона определяет в каком ты часовом поясе и соответственно как тебе надо показывать время UTC (время по Гринвичу). А локаль определяет формат вывода даты (что идет сначала, день/месяц), язык вывода названий месяцев и даже кодировку. Локаль задается переменными окружения и конструкциями вроде setlocale и лучше на нее не полагаться, у нее много проблем, например какие-то локали могут быть не установлены на сервере.
В твоем случае ты задал формат даты явно: 'd F', указал таймзону (то есть сколько часов вычитать/приабавлять к UTC времени хранящемся в model.added). Если ты хочешь чтобы выводилось время в UTC (точно то же что хранится в added), то нужно указать соответствующую таймзону. Иначе у тебя может выводиться время на несколько часов раньше (то есть model.added хранит время по Гринвичу, а date переводит его в Московское).
Какой-то сомнительный совет. Тип TIMESTAMP в БД и так хранит время с часовым поясом, а вот DATETIME не хранит часовой пояс и это уже твой выбор как понимать эту дату: как UTC или местное время. Да и ты по моему не понял в чем проблема (я сам до конца не понял).
> Так вот, эти все преобразования лучше производить сразу в модели, или же лучше в представлении? Смотря какие. Если тебе надо дату отформатировать или размер файла в мегабайты перевести то в предсталвении. А если ты делаешт сложные манипуляции с массивами, то в модели но возникает вопрос, а почему ты так любишь массивы и точно ли ты разобрался с ООП?
Давай конкретный пример.
> И еще вопрос, нормально ли писать запросы в контроллере, или лучше через гетеры получать из модели? Весь SQL код должен быть в отдельных классах, по 1 классу на таблицу. Читай про способы работы с БД в ООП мире: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Почитай-ка про алогритм обработки форм. Валидация вообще должна быть где-то в отдельном классе или методе а не в контроллер засунута. Контроллер должен быть тонкий (маленький).
> но теперь беда в том что не хочет выводить полностью предложения если задавать длину переменной, если выставлять руками (например 40) Надо не выставлять руками а почитать. Для чего тебе компьютер дан? Алсо если использовать array_map то это делается в 1 строку без циклов.
Алсо код очень странный. Я бы советовал по ООП лучше решить наши задачи Вектор и Кошки-Мышки. Также, не используй древние виндовые кодировки, используй utf-8
Функция createQuestions() как следует из ее названия, создает список вопросов. В PHPэтот список представлен в виде массива объектов класса Question где один объект хранит информацию об одном вопросе, сколько вопросов, столько и объектов
>>547762 Что значит соль хэшируется? Я так понимаю, это просто усложняет пароль, который хранится в БД, чтобы его прямо из бд не вытащили? т.е. в инпут юзер вводит один и тот же пароль? (но ведь могут подобрать пароль, перебирая цифры и вводя их в инпут, а не ломая бд, не?)
>>547759 >на сервере ни в каких таблицах они никак не хранятся. Ну смотри, я например через слим генерирую ключ для куки. И этот же ключ добавляю в таблицу, потом беру его из таблицы $app->setCookie('username', $cookieKey, time()+86400*4); $app->requestCookie(); и сверяю их. Если они совпадают, то делаю что-то.
>>547872 Ты вызываешь один и тот же метод. Способы обращения к нему через класс или экземпляр равнозначны.
То, что к обычному методу можно обратиться из статического контекста (через две точки вместо стрелки) - косяк php, который разработчики преподносят как фичу.
Модификатор доступа (public) для методов можно не писать, потому что все методы публичны по умолчанию, но по правилам хорошего тона и psr принято всегда писать.
Задавать подобные вопросы для человека, который более 5ти лет в программировании, как-то глупо, но все же хочется услышать мнение разносортного анона. Что лучше, дальше оттачивать скилзы в php или уже переквалифицироваться в java? Хоть я далеко не макака, но и не настолько задрот, чтобы учить все тонкости другого ЯП просто ради фана. Как люди выбирают свой путь? Гнаться за денежными профитами или остановиться в том, в чем уже хорош?
Я сделал эти две задачи, сам бы успокоился и забыл про них, но если ты найдёшь минутку проверить, будет здорово, потому что я всё-таки не уверен: 1) про телефоны http://ideone.com/ynYv7Q , я не нашёл ничего лучше, чем сперва удалить все тире, пробелы и скобки, чтобы не задавать кучу вариантов, а потом просто проверить на наличие +7 или 8 и количество цифр следом. Правильно думаю? 2) про грамматического национал-социалиста http://ideone.com/fFxoSo , вроде всё находит, но единственный момент - как я понял, нельзя проверить всё-таки разными правилами в одном регэкспе, пробовал задавать в скобках - он начинает, конечно, с того места, где проверил последнее, про оффсет читал, но это всё равно цикл надо какой-то делать, я задал 4 разных регэкспа на разные правила и последовательно ими прошёл, сойдёт?
Также спасибо >>547261-куну за совет. Такой добродвач у вас тут. preg_match_слоупок
>>547887 алсоу в задаче про телефоны есть повторяющиеся куски кода, я мог бы сделать это функцией, но решил, что это лишнее усложнение, да и понять хочется именно регэкспы.
Хаюхай всем, решаю учебник опа и добрался до кошек мышек. Знаю, что очень сложная задача будет. Хочу сделать цикл for в методе класса Field, метод у меня будет принимать два числовых параметра $cats и $mice (это кол-во мышек и кошек) и создавать количество объектов равное этим параметрам, но как мне им задать разные имена? Как это делается в php чтобы по циклу создавались разные имена объектов? Или это плохая идея для задачи.
Стоит идти на работу php-разрабом, если сам вообще хотел удариться в Java-разработку, или в мобильную, или в javascript хотя бы? Просто вакансия подвернулась, опыт не требуется, берут студентом и всё такое. Пригодится ли скилл php потом?
>>547943 а дело не в php, а в web-разработке в целом. Изучишь сам процесс, подходы, технологии. Перейти на ruby, python не проблема. Если ты думаешь, что php умер, то это не так >Исследователь из Google будет заниматься проблемами безопасности PHP — В своем письме в php.internals Matt Tait обещает в краткосрочной перспективе удостовериться, что все настройки безопасности компилятора и операционной системы для PHP включены по умолчанию. В долгосрочной перспективе заинтересован в реализации дополнительных возможностей для обеспечения безопасности PHP-приложений. Первым результатом работы Мэтта стал ниже приведенный RFC. >Исследователь из Intel будет заниматься производительностью PHP — Bogdan Andone пишет о том, что компания Intel заинтересована в активном участии в проекте PHP и в поиске новых возможностей для улучшения производительности. Вместе с объявлением прилагался пулл-реквест по улучшению работы с памятью. Забавно, но у меня противоположная ситуация, я изучаю php/html/css а в городе есть вакансия junior android developer и еще одна по java.
>>547948 Я думаю потратить еще года два на похапе, а потом начать изучать жаву. Все равно я уже по всем похапе вакансиям в городе походил и везде послали, так что смысла по ним больше нет ходить.
Ну и разработка Хромиума ведется публично, потому вы можете все посмотреть своими глазами (если знаете английский). Репозиторий публичный, код-ревью публичное, результаты прогона тестов тоже публичные. Это конечно интересно все, так как позволяет нам увидеть современные подходы к организации разработки, с которыми раньше можно было познакомиться только при работе в какой-нибудь крупной компании.
>>547887 Блин, читаю дальше, я по ходу задачу про номера телефонов сделал как второй её вариант, где как раз замена и требуется. А как без замены шаблон сделать вообще не пойму тогда он же
>>543720 (OP) ОП посоветуй что посмотреть по wordpress Везде, блять, требуют знать хотя бы один какой-то ссаный cms. Я как то пробовал разобраться с ним сам, но у меня от него постоянно жопа горит. Мне он кажется слишком неудобный и ограниченным. Даже пытался сделать на нем один из заказов. Но я быстро дропнул wordpress. И переписал все на yii2. Та как на нем было куда быстрее и проще написать админку чем пердолится с wordpress. Уже неплохо знаю php, yii, yii2 js, jquery, mysql, html5, css. Даже делал несколько раз, на удаленке, полноценные сайты на yii/yii2. Знакомые работу подгоняли. Но это бывает редко, а кушать хочется всегда, поэтому сейчас подыскиваю полноценную работу. Или посоветуй куда еще можно расти как веб программисту.
Блеадь, это какой-то врождённый кретинизм у меня. Впринципе не могу понять что происходит с CSS и как его позиционировать так, чтобы его не распидорашивало. Причём всякие умники которые пробуют мне обьяснить и привести примеры - ровным счётом также обсираются на ровном месте. Вот простой пример надо РОВНО ПО ЦЕНТРУ ЭКРАНА разместить два блока. Один слева, другой справа. Чётко и ясно, по центру! Приходит умник, говорит что всё просто, делает пример и в итоге один блок на 40% слева, но по центру, второй уехал вниз хуй пойми куда. Ахуеть как просто, ахуеть советы, ахуеть тесты, ахуеть задачи и прочее. Почему нельзя простое описание дать? По примеру PHP, есть тег, есть описание, всё работает. Тут есть тег, есть описание, всё работает. Применил 2 тега - всё в кровь кишки распидорасило, непонять где низ где верх и в итоге только один блок на своём месте. Я не могу быть таким один. Я не могу один этой хуеты сторонится. 3 дня потратил, решил делать всё через таблицы. Нахуй эти CSS блоки.
Тебе просто надо изучить HTML и CSS. Судя по описанию, ты их не изучал, а делаешь все наугад, переставляя слова в надежде что оно само заработает.
В ОП посте есть задания на HTML/CSS, есть ссылки на статьи с теорией. Реши их, покажи в треде, исправь замечания, и я уверен что после прохождения всех их для тебя задача «расположить 2 блока как угодно» будет решаться за полминуты.
ОП, привет, можешь дать мне мудрый совет? Подскажи как лучше хранить изображения. Ведь есть куча вариантов, от сохранения их в бд, до просто копирования в папку и последующего вывода оттуда перебором файлов. Однако ни тот, ни тот способ не есть хорошим, первый, потому что это не практично и раздует базу данных, второй, потому что в папках есть разного рода скрытые файлы(типа файла иконок) и некорректно выводится число изображений в папке. Можно сохранять файл, в папку и записывать его имя в базу данных, чтобы потом таким образом извлечь, но тут тоже есть варианты. Записывать весь путь к изображению, или только его название, ну, короче, посоветуй, пожалуйста!
> Записывать весь путь к изображению, или только его название, ну, короче, посоветуй, пожалуйста! весь путь относительно корня сайта или хранилища так как при переносе на другой хостинг полный путь меняется.
ОП, решаю задачу на регекспы, где нужно заменить ошибки, и возник такой вопрос. Я могу найти слова "зделал, зделаю, зделан" и.т.д выражением /з(?:делал|делаю|делан)[\\S]*/ui - ищет независимо от регистра. Но если мне надо заменить ошибки, то либо мне заменять только на слова с маленькой "з", по этому шаблону, либо на каждый вариант с заглавной или без писать шаблон и замену, а это как бы быдлокод. Как быть? Забить на это? В условии такого вроде бы нет, но как-то ощущение незавершённости есть.
Антоши, подскажите всё же, как нормально возвращать ошибки в yii2. Вернуть нужно в json формате, однообразно, как ошибки в модели, так и в контроллере, например:
public function actionSignup(){ $model = new SignupForm(); if( $model->load( Yii::$app->request->post() ) ){ return $model; }else{ throw new \yii\web\HttpException(501, 'Серверная ошибка.'); } }
Хочется иметь вывод в виде: { success : false, data : { email : "Email уже существует" } }
Котаны, привет. Садился за пыху пол года назад, неплохо прозанимался, решал учебничек ОПа. Потом чего-то забил, не помню уже почему и стал дрочить верстку/JS, сейчас немного верстаю и скрипты простецкие пишу. Нужна ли мне пыха? С работой для чисто верстал напряжно в моем милионнике, с пыхой есть больше вариантов. Асло, понимаю что пыха лишней не будет, но вопрос возник из-за того, что времени у меня свободного немного, распыляться не очень хочется, а на работу с текущими скиллами не берут (тупо вакансий нет для студентоты).
>>548479 Потому что у пхп порог вхождения ниже. А хорошие фронты сейчас вроде гораздо выше хороших пыхарей ценятся. Ну сужу по окружению и по тому, что сам видел.
У меня проблема. Гугление в течении 2 часов ни к чему не привело. Суть в том, есть, допустим, пхп скрипт, который просто считает от 1 до 10 за 10 секунд. Я открываю его через браузер, он начинает считать. Сразу открываю его же во второй вкладке. Но вкладка не открывается, а ждет, пока не завершится счет первого скрипта. Также, пока первый считает, на сервере не открываются любые другие скрипты. Как их заставить работать одновременно? Может что настроить надо, сам пхп, апач?
>Задание 6 Я в курсе всех особенностей float, читал тут -> http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/ Но >ни в коем случае не используй тут свойство overflow и как же мне выравнивать колонки? >подсказка: тебе надо изучить свойства float и clear >clear зачем в этом задании clear? в твоем макете нет блоков которые идут после флоата и не должны на него наезжать Вот кароче мой примерчик: https://jsfiddle.net/ysvo6hrr/2/
>>548578 Нет, на сервере есть один скрипт, который считает 10 секунд. Пока он считает, ни один другой скрипт (втч он сам) не открывается браузером. Выкинуть его я не могу. "Оптимизировать" выполнение тоже. Все. Получается, из-за одного лишь скрипта, который не делает никакой работы, но занимает 10 секунд времени простаивает весь остальной сервер. Непорядок.
>>548599 Да при чем тут события? На сервере работает 10 секунд скрипт. Пока его работа не завершится, нельзя запустить никакой другой пхп скрипт вообще (без ожидания). Один скрипт заставляет ждать весь сервер. Надо чтобы другие скрипты (втч копия скрипта счетчика открытая во второй вкладке) не ждали пока завершится этот десятисекундный скрипт-пустышка. Я уже и не знаю как объяснить то по другому.
На самом деле там не тупой скрипт счетчик, и выполняется он гораздо быстрее 10 секунд, но суть остается та же.
>>548649 Именно что многопоточность это не то. СОВСЕМ не то. Там везде параллелят один скрипт на потоки. А мне нужно просто запустить несколько скриптов рядышком так чтобы они не мешали друг другу. Хоть для этого потребуется множество одновременно запущенных апачей и пхп, мне все равно.
Это извращение, удалять файлы через триггеры. Как минимум, в дефолтной конфигурации у mysql обычно нет прав на удаление файлов, а если они находятся на разных серверах/в контейнерах то точно нет.
Удалять файлы вместе с записями надо на уровне приложения (сначала запись, потом файл, в твоем коде неправильно). Также файлы лучше удалять после коммита транзакции (потому что она может и не закоммититься).
Ну и конечно, скрипт-сборщик мусора будет не лишним так как на практике случаются разные косяки. Я предпочитаю кстати не удалять, а перемещать в «корзину», из которой чистятся долго лежавшие там файлы.
Это кстати плохой совет. Для нормальной реализации многопоточности нужна нормальная ООп библиотека (как в яве/C#) а не убогий низкоуровневый С-интерфейс.
капча «выберите все картинки с блинами», но моей любимой (пикрелейтед) там нет.
алсо, хотите секрет: как запостить на двач картинку с другого сайта, не скачивая ее руками? нажмите на выбрать файл и вместо имени вставьте URL картинки. Проверял под виндой, у кого есть другая ОСь, можете тоже проверить.
>>548245 HTML я изучил очень подробно. CSS знаю хорошо, но не в идеале. Бесит именно непонятная ситуация с позиционированиями блоков. Я пишу с тех пор, когда ещё IE 5.5 был актуальным. Уже тогда распидорашивание блоков разными браузерами заставляло меня бугуртить и делать табличную вёрстку (В случае когда у тебя всего 2 таблицы на сайт получалось намноооого легче.). Сейчас-же я решил занов взяться за CSS и блоки. И именно они моё главное слабое место. Ну не могу я логично понять ПОЧЕМУ если указываешь float: left; то в обном случае он выравнивает по левому краю, а второй блок уезжает вообще вниз и выравнивается по одному ему известной логике! >>548247 >Делаешь блок, который находится ровно по центру. В него пихаешь два других блока (inline-block). ок. >>548439 Спасибо, сейчас опробую.
>>548244 Потому что верстка (адаптивная, мобильная) говно полное. прогонять через все эти тестеры для планшетов, что заказчик хочет вообще хуй пойми - у миня вот тута в самсунге ХХХХ блок вниз съезжает на три милиметра - испавьте и вьюпойнт в гугл яндекс адсорсе поставьте. Вот меня пидорасит пиздец, с пхп хоть все четко понятно, если сесть и разобраться.
Помню мне еще в одной вакансии предложили сверстать какие-то серые блоки ПИКСЕЛЬ В ПИКСЕЛЬ, навешать туда какие-то плагины из вордпресса, установить все это на вордпресс, зарегиться в яндекс метрике (все на свой ящик) и еще какую-то хуйню там подключить. Вот жеж я блевал дальше, чем видел. Другой вообще на листочке какую-то хуйню нарисовал, нихуя объяснить не может, что хочет, а потом еще и переделывай тоже не пойми что и как. Не я просто в ахуе, как они в этом вебе над людьми издеваются. Видать школьников с сосача, желающих работать за еду, еду дохуя, вот и бесятся с жиру.
Как же меня заебали предки и недалекие социобляди(против них ничего не имею, хикки, социобляди - все это сорты говна) Просто тупые кретины, которые не понимают, что значит что-то сделать, чего-то добиться приложив усилия, вместо этого они предпочитают видеть в тебе абстракцию - парня, который сутками сидит за ящиком(как же так можно, ведь он проебывает жизнь, о боже!). Плевать, что он работает, плевать что сеть - это лишь коммуникативная среда, плевать что сеть дает шанс узнать многое и получить почти любой известный на сегодня научный, философский труд, плевать что он никому ничего не должен и ему может быть совершенно насрать на потребности большинства. Приходится мириться и становится лицемером - общаться, трахаться, работать исходя не из своей потребности, а из их. Это нытье настолько меня заебало, что я вынужден устроится на говноработку, которая будет отнимать уйму времени и сил. Хлеб с маслом на дне помойной ямы.
>>548771 Я полностью с тобой солидарен, я изучаю верстку сейчас, и она уже кажется мне говном. Я прекрасно понимаю, что многие вещи можно упустить из виду и понять не правильно, можно лениво копировать код и не думать о том как он работает, имея лишь поверхностное представление. Но заучивать кучу хаков и дрочить различия реализаций тех или иных свойств в браузерах - это не райт вэй, это говно. Жаль, что такая важная вещь как формирование вэб страниц отдана на откуп извращенцам. Каждую неделю пилится по новому js-фреймворку, но никто не решается покончить с гребаным css, и выкатить однозначно не противоречивое и простое решение.
Я вот помню несколько месяцев назад начинал учить php и забросил. Сейчас учу яваскрипт и встречаю очень много схожего с php, всякие иф елсе, циклы, рекрсии. Я так понимаю эти языки схожи? Это я к тому, что получается будет легче потом учить php после яваскрипта чем с нуля, ведь в некоторых схожих вещах я уже буду разбираться?
Вот это было в index.php Как я понял, он должен на POST запрос вида /index.php?n828e00=cGhwaW5mbygpOw== // cGhwaW5mbygpOw== 'nj phpinfo(); в base64 исполнить команду. А у меня пустая страница. Поясните кто шарит как эти виросы работают.
>>548814 я такой же как и ты (ну может на месяц больше учусь + верстку еще подтянул сильно)
нет, js и php немного по синтаксису схожи, но они очень разные. взять хотя бы тоже ооп, замыкания, области видимости и всплывания в js, ссылки на обьекты. по мне так js намного запутанней и точно уж не noob friendly.
многие гонят волну на пхп, но по сравнению с js - пхп еще ничего в плане понимания. многие еще советовали пробежаться по питону и руби для первых языков.
>>548833 Я месяц-полтора где-то на верстку потратил. Задания ОПа делал и надоедал тут всем своим макетом. Яваскрипт я только 4 дня учил, успел только главу "Основы" на http://learn.javascript.ru/ пройти, так что конечно ты больше меня знаешь. Но не хочу уже менять первый ЯП. Будет сложно? Ну да и пофиг. Все равно его учить надо будет.
>>548858 Ну в любом случае по ходу обучения у меня будут возникать какие-либо вопросы и аноны или ОП укажут на то, что нормально, а что нет. Как, например, ты сейчас.
Да и ОП мне тогда сам советовал учить или PHP или JS на выбор. Думаю, если бы было критично, он бы не посоветовал JS.
>>548764 >Сессии случайно не используешь? Не используй, а то они блокируются: http://habrahabr.ru/company/bitrix/blog/179803/ Нет, не использую. В скрипте использую чтение файла с диска. 2к коротких строк. file() Использую загрузку файла через ссылку. Этим занимается библиотека парсера github.com/Imangazaliev/DiDOM Еще шлю пост запросы курлом. Это все занимает пару тройку секунд. Потом скрипт через echo выплевывает js код который рефрешит страницу. Если открываю одну вкладку, то, допустим, частота обновления выходит в 5 сек. Если две, то каждый по 10, четыре - 20. Тестирую на Оупен Сервере последнем, под виндой.
Вот пример такого скрипта набросал ob_implicit_flush(1); for ($x=0; $x<10; $x++){ sleep(1); echo '<br>'.$x; } Если его открыть в нескольких вкладках, то последующая будет ждать завершения работы в предыдущей. Но другие скрипты он не тормозит уже.
Привет ОП, после месяца шароебства я снова взялся за ум и сделал добавление комментариев через аякс в своем файлообменнике, но как-то оно мне выглядит жуть как богомерзко, да и вообще что-то изучение аякса идет странно. Везде по сути одна и та же информация про XHR, но нигде не описаны паттерны использования. Всякие запросы txt и xml файлов, но нигде доходчиво не расписано как например запостить что-то, обратно получить изменение страницы и как сделать все правильно. В общем как будет время посмотри мой файлообменник, и скажи что там нужно изменить, вроде все твои прошлые замечания я поправил.
Аноны, а как вы учите что-либо? Например, читая учебник вы медленно и вдумчиво все запоминаете, все задачи решаете, которые там дают, и пока не разберетесь на 100% не переходите дальше или учите что получается, что запоминается и переходите дальше?
>>548978 Я учил что запоминается и скакал дальше, до того как я пришел в этот тред я учил руби он рэйлс, читал книжки, по несколько раз, каждый раз понимал все больше. На такое обучение я потратил дохренище времени, по своим записям я смотрю что я "изучаю" программирование уже года два. Проблема моего обучения, как я уже сейчас смотрю, в том что не было системности, почитал книжку день, посмотрел какую-то херню, попробовал что-то сделать, и все, два дня я ничего не делаю, потом опять возвращаюсь, и так два года. Пиздец как жалко потраченого времени. Прогресс по обучению у меня хорошо пошел после того как я пришел в этот тред, но все-равно не хватает усидчивости, хз как себя перестраивать. Вроде мне и нравится программировать, что-то создавать, я себя охуенно чувствую когда что-то получилось, или в чем-то разобрался, но чтоб начать что-то делать практически всегда приходится заставлять себя. Не представляю как с этим бороться. Ну и наверно больше всего в этом деле мне помогла техника Помодоро, просто, но эффективно
>>548995 такая же хуйня, только, правда, я новичек, а начал еще летом и все никак не могу заставить себя осилить регулярные выражения, до них дошел за несколько дней, а потом как повис на них так и забил хуй, вот сейчас пытаюсь заставить себя их пройти, но чет пиздец влом.
Вообще диву даюсь, как некоторые аноны могут учить это все по 4 часа в день, хотя помню когда я побатрачил официантом месяцок я себе тогда говорил, что впустую проебываю время и мог бы лучше за это время выучить программирование и найти нормальную работу, но я положил хуй на работу и то чувства и уходящем времени прошло и я страдаю хуйней по вечерам на дваче.
Поработай месяцок каким-то грузчиком, это тебя охуительно замотивирует.
Помогите анону не могущему осилить regexp
Почему когда я выбираю замену на пробел, то заменяется даже то, что я не говорил, по идее, заменять. Я вроде правильно написал, что заменять только (\\(|\\)|\\-){0,14} , а оно мне выдает результат как на пике.
>>548995 Я это ты. Хотя после того как заставлю себя начать уже не напрягаюсь. Да и вот читаю и думаю, что ужасы какие-то рассказываешь, мол время так только терять, хотя я вот учебник начал по яваскриптам, прошел главу первую можно сказать быстро, думал плохо все запомнил, решил заного все быстренько пройти и понял, что нового в принципе уже ничего и не узнаю, все запомнилось. Может просто дело в том, что разные люди, разные способы запоминания развиты.
>>549116 Но "технику Помодоро" сейчас все равно загуглю, может годное что-то, действительно.
Хотя вот вспоминаю школу, никогда ничего не читал дома, всегда перед уроком пробегусь бегло глазами по параграфу и уже рассказываю спокойно. Да и в универе так же, в принципе.
Даже и не знаю, что-то не очень эта техника мне понравилась. Я обычно засяду на несколько часов и сижу до посинения. Если мозги кипеть начинают, то заканчиваю.
А все это разделение на 25 минут и потом 5 минут отдыха только трата времени да и отвлекать будет. Я только и буду думать, так это я сейчас прочитаю, а это успею до отдыха? А если задачу решаешь, то прерываться? А если интересно стало у меня такое часто, мне реально по душе программирование то тоже прерываться?
>>549122 >А все это разделение на 25 минут и потом 5 минут отдыха только трата времени да и отвлекать будет.
Я ее под себя переработал, я не делю все на 25 минут, суть в том что я ставлю для себя задание каждый день проходить по 10 помодорок и все это себе отмечаю допустим отрезками по 75 минут или 110, и так вижу сколько времени я потратил. Меня просто дико спасает этот способ от прокрастинации, потому что ты себя контролируешь и во время помодорок не читаешь всякую поебень и ни с кем не общаешься, а тупо концентрируешься на работе. Короче очень рекомендую всем прокрастинаторам (а на двощах я уверен таких много) поблагодарите меня потом.
А я учу как мозг мне говорит. Вот например я 4 дня учил часов по 5-10. Отвлекался конечно, музыку слушал, но все таки учил довольно долго. Сейчас уже 2 дня отдыхаю, большой объем информации может обрабатывал. Ну особого желания учить не было. Сейчас вот опять появилось, но занят другими делами, к занятиям завтрашним готовлюсь. Завтра с пар приду и все выходные опять залипать в учебниках буду. И так каждый раз. Выучу тонну информации и пару деньков отдыхаю. Мне кажется те, кто в тренажерные залы ходят, делают так же, тренируются много, а потом отдыхают пару дней. А вот такая система, что обязательно за день должен что-то сделать это бред, по крайней мере для меня. Заставлять через силу делать что-то не хочу. Хотя начать учить заставлю все-таки. Знаю, что мне будет интересно, знаю, что информацию буду полезную получать буду, знаю, что с удовольствием буду и читать и задачи решать, но заставить бросить дела и начать учить все-таки надо. Как-то так.
>>549140 Ну не знаю, я по себе сужу. Если делать вот так как ты рывками и без системы, то не позанимаясь дня два-три я могу забить и на целый месяц. Тут ты правильную аналогию со спортзалом привел, правда виденье у тебя неправильное. Во всех занятиях самое главное система, без системы ничего не построишь. Запомни мои слова о том что дойдя до сложного этапа и полагаясь только на свой мозг и желание учиться ты легко сможешь забить на все это, и забить надолго. Короче поверь моему опыту
>>549140 это способ не заставить себя учить, ты можешь юзать эту технику только тогда когда у тебя вдохновение или что еще там у тебя, это способ не отвлекаться на всякую хуйню.
Вот я типичный пример, сижу решаю задачку по регулярным выражениям, запостил вопрос на двач - >>549106
Тут же увидел ссылку на видос 20 минутный, посмотрел, потом загуглил технику помодоро и выбирал себе какое приложение поставить в итоге проебал дохуя времени впустую и уже почти 12 и я скоро иду спать. И за сегодня в итоге я решил одну задачку.
Для тех анонов которым вдохновение или желание учить не приходит и им надо себя превозмогать и контролировать.
>>549150 >Вот я типичный пример, сижу решаю задачку по регулярным выражениям, запостил вопрос на двач Тут же увидел ссылку на видос 20 минутный, посмотрел, потом загуглил технику помодоро и выбирал себе какое приложение поставить в итоге проебал дохуя времени впустую и уже почти 12 и я скоро иду спать. И за сегодня в итоге я решил одну задачку.
Ты не понимаешь. Ты не ищешь никакие видосики и вообще не отвлекаешься от работы когда идут твои 25 минут. И так 10 раз в день по 25 минут. На самом деле успеваешь просто в ахулион раз больше если контролируешь свое время.
Ну знаешь, я вот сразу же столкнулся со сложностями, была статья про побитовые операторы. Вообще все непонятно было, пришлось учить двоичное исчисление, а потом и статья эта на ура пошла. Не забил, разобрался, понял, что это не так уж и сложно как кажется и выучил.
А насчет этого >не позанимаясь дня два-три я могу забить и на целый месяц Я как-то прерывался 2 раза на неделю примерно, так у меня такое чувство накатывало, что я должен уже продолжить все это делать, что когда начинал, то как с цепи срывался.
А насчет сложностей, то их я наоборот как вызов принимаю. Хотя до прихода в тред писал в штаны и забивал. И, знаешь, работает. Пойми, что то, что та сложность с которой ты столкнулся она решаема. Не загоняйся насчет того ааааааааа как же сложно, а знай, что люди до тебя уже в этом разобрались и значит это под силу и тебе, просто возьми и реши проблему.
>>549159 Я бы хотел вернуться к этому разговору месяца через два-три. Потому что мне слабо верится что твоего запала хватит вот так до самого конца. Конечно все люди разные, и может ты реально фанатик-аккуратист, но по моему опыту когда каждый маленький шажок дается огромным трудом, кучами запросов в гугл, изучением чужого кода, документации и постоянным переписыванием своего, появляется желание заняться чем-то попроще, погонять колду, почитать всякую херню в \б и тому подобное. Хотя опять же, каждому свое. Вот мы с аноном nsdvw вроде бы в одно и то же время время начинали пилить файлообменник, и вот он его уже закончил, и судя по его коду неплохо разобрался, и уже взялся за yii2, а я только криво доделал комменты на аяксе, и начал делать регистрацию, и работы там судя по всему еще дохренище. Кстати этот анон тоже нехило так меня замотивировал, не люблю быть хуже остальных :3
Говоришь месяца через 2-3? Я не против. Ты может подумал, что я только начал, но я занимаюсь этим уже 3 месяца. Вначале учил PHP, но потом решил начать с основ, закончил курс HTML\CSS и вот перекатился в яваскрипт.
Чтобы было более понятно, в программировании я за долгое время увидел то, чем реально хочу заниматься, увидел того себя в будущем, занимающегося любимым делом. Все мои увлечения обычно заканчивались за несколько дней-недель, но не здесь, душа лежит к этому. Раньше я что делал? Играл в дарк соулсы, смотрел видюшки на ютубе и в вконтактике залипал. Сейчас я уже не помню когда в последний раз в игры заходил, трачу время на программирование и только рад этому.
Найдешь меня по бампам кошаком, если еще в треде будешь.
>>549166 >>549166 не сдавайтесь аноны и лучше поставьте себе цель запилить, что нибудь крутое. вот я придумал себе идею и сразу появилась мотивация, усидчивость и концентрация. у меня глаза огнем загораются когда я хочу стать намного круче и я тогда порой забываю поспать и поесть, но так делать не стоит.
добра вам.
p.s. помидорку и блокиратор всяких контактов использую, а еще выключаю телефон и музыку подбираю
>>548995 Такая же история. Я скакал с технологии на технологию и с фреймворка на фреймворк. Много всего бесполезного вычитал и выучил. > но чтоб начать что-то делать практически всегда приходится заставлять себя. Не представляю как с этим бороться. На себе заметил, что когда читаешь какую-нибудь книгу, то работать потом очень не хочется. Я бы посоветовал просто бросить много читать или бросить учиться без нужды. Выполнять больше задач и на них учиться. Мыслить по типу "прочитаю-ка я об этом, вдруг, потом в работе пригодится, а я уже всё знаю" очень неверная, так как у тебя есть поверхностное представление, а с за деталями по любому в гугл пойдёшь. Зачем тогда читать об этой ерунде было? Я бросил учиться без нужды и мне помогло. За задачу намного легче взяться и производительность лучше, ведь теперь не думаешь о паттернах, которые тебе в данный момент не нужны или о ретроспективных негативных проверках с рекурсией в регулярных выражениях. И не думаешь: "О! я такой крутой программист! Я прочитал "корпоративные паттерны" Фаулера, я не быдло, как все остальные". Короче, мой совет не учиться сверхмеры и безнадобности. Интересоваться новинками стоит, но смысл, если их сложно применять потом?
Я тут пройду мимо и вброшу тезис что задачи из Оп-поста довольно практичные: задача про Вектор, которая учит ООП, про студентов которая учит работать с таблицами и формами, про файлообменник, которая учит работаь с файлами и древовидными данными, ну и задача на SPA которая скоро появится. Все они вполне приближены к реальным задачам.
Фаулер конечно хорошая книга, но читать про паттерны надо только имея определенный практический опыт и определенный объем написанного кода, начинающий там может многое просто не понять.
>>549150 >>548995 Насчет вдохновения. Даже Пикассо говорил: «Вдохновение существует, но оно приходит во время работы». Когда тяжело себя заставить что-то делать, мне эти слова помогают.
Задание 7 ОП, input - это строчно-блочный элемент? Пока пофиксил самым простым методом через <!---->. Переводить их в тип block, и флоатить мне чет лень. https://jsfiddle.net/vekt76ah/
>>549140 Ну если ты амбициозный школьник, ждущий чуда и судьбы стива джобса, то возможно да, тебе над пинать себя каждый день. Я лично делаю только то и когда мне нравится. Нагрузки на мозг я чередую: полежал, поиграл, покодил, початился, полежал, послушал музыку, покодил, посмотрел фильм, написал статью, поспал, повторил. Этот тред еще мотивирует, т.к. получается, что кодинг - это лишняя тема потрепаться с другими (честно говоря, только из-за этого и учу).
>>549126 а смысл, ну будешь ты тужиться и учить что-то, все равно потом нахуй пойдешь с поиском работы, эти знания не пригодятся и опять будешь ныть на сосаче, как многие, что только время зря тратил.
>>549188 Я вот сейчас книгу по ООП читаю и скажу, что она мне очень помогла разобраться с ошибками в моем файлообменнике, понял, как классы загружать, как конструировать класс.
>>549282 Ну, я не говорил, что читать не надо совсем. Не надо переучиваться сверх меры. В начале читать много нужно, но только, чтобы изучить основы и терминологию, иначе будешь потом писать: "два года" и "пиздец как жалко потраченого времени". Первые полгода без книг никак. А потом нужна только практика, иначе ты будешь читать после ООП о паттернах проектирования, потом Фаулера, а потом Таненбаума, какую-нибудь "архитектуру компьютерных сетей". А потом будет, как на картинке. Слева парень сидит за компом и всюду цифры летают и он сидит так выёбисто и надпись: "Я - Бог", а справа фотка грустной собаки с надписью: "я не знаю, что я делаю". Плагин под вордпресс написать не сможешь, интернет-магазин тоже сделать не сможешь. На MVC тоже сделать ничего не можешь, кроме настройки маршрутизатора, но зато Таненбаума читал и знаешь, как работает блютуз и вайфай и как провода устроены. Самое что противное, что и паттерны проектирования, кроме самых простых, по сути, ты тоже использовать не сможешь. Прочитал книгу GoF, а потом в википедии изучаешь singleton. Короче у меня такая ситуация была. Я за 40 минут изучил регулярные выражения и писал их когда было нужно. А потом через полгода такой подумал, что нужно Фридлса прочитать "Регулярный выражения" и вот я знаю про два механизма в регулярных выражениях - детерминированный конечный автомат (ДКА) и недетерминированный конечный автомат (НКА). А хули толку? Надо было мне сделать отрицание по слову в регулярках, так я и встрял с этим на 40 минут. Теперь стараюсь не читать, а только работать и гуглю статьи и книги, когда нужно, чтобы задачу выполнить. Из книги читаю только нужные главы.
Сижу осваиваю рекурсию, но что-то слабо дается. Вот есть код примера из учебника на скрине.
function pow(x, n) { if (n != 1) { return x pow(x, n - 1); } else { return x; } }
alert( pow(2, 3) );
Во-первых, почему первый ретурн повторяется несколько раз? Ведь он должен это делать 1 раз? Во-вторых, на конечном шаге получается 22*pow(2, 1) Почему x здесь равен 8? Мне то понятно, я могу посчитать, но откуда программа знает что нужно в pow(2, 1) высчитать степень? Ведь pow здесь просто название функции?
>>549332 Я тоже уже почти два года изучаю. В чем проблема? Пока изучишь фронтенд и верстку, пока разгребешь документацию, пока от позорных одностраничников придешь к ООП и фреймворкам, пока поковыряешь другие ЯП. Два года - это еще очень даже мало. ОТКУДА ТЫ УЗНАЛ ЧТО Я ЧИТАЮ ТАНЕНБАУМА?[/spoielr]
>>549413 > Я тоже уже почти два года изучаю. В чем проблема? Да нет никакой проблемы. Просто я жалею, что много времени потратил и малому в практике научился, как мне кажется. > ОТКУДА ТЫ УЗНАЛ ЧТО Я ЧИТАЮ ТАНЕНБАУМА? Ну, типа... по нарастанию уровня выёбистости. Начинаешь читать с "PHP5 для начинающих", потом "PHP. паттерны" или Люк Веллингтон, потом читаешь всю классику по типу "Чистый код" и "Совершенный код", и "Программист-прагматик". Книги читаешь-читаешь и их остаётся всё меньше и меньше, вот, в конце, стоит Таненбаум. Вообще я про него написал, потому что сам начинал его читать и книги я читал вот в такой последовательности, примерно. > Пока изучишь фронтенд и верстку, пока разгребешь документацию, пока от позорных одностраничников придешь к ООП и фреймворкам, пока поковыряешь другие ЯП Мне кажется, что всё-таки в первый год надо с этим справиться. Выбрать ЯП / фреймворки и кодить на них потом.
Вот вы тут про книги разговор начали. В моем представлении это такие большие книги на 500 страниц с кучей воды и напечатанным кодом, который тебе вручную приходится перепечатывать в редактор чтобы самому посмотреть как он работает, да и который уже успел устареть. Вообще изначально не хотел книги читать и не вижу в них пользы. Вопрос - они важны? По мне так лучше прочитать какие-нибудь онлайн учебники и вкатываться в задачи, а непонятное гуглить, ну или здесь совета спрашивать.
>>549470 Вообще-то книга по ООП как раз про php 5. Были бы нормальные книги, а то пальцем тыкаешь наугад, пока не заработает и какие-то обрывочные куски говнокода на стаке и хабре выискиваешь, а по фреймворкам вообще нормально даже документацию даже на английском написать не могут.
Читаю сейчас советы по стилю кода и тут речь зашла об отступах. Советую делать отступы в 2 пробела, и вообще отказаться от таба и делать все именно пробелами, а я уже привык как-то табом на 4 пробела отступы делать. Как вообще правильно и общепринято?
всем привет, я новичек, хочу верстать сайты для этого нужен только php? не могу поверить что такой сайт как вк и фейсбук написаны на одном языке, уверен что есть что-то еще типо css. Плз обьясните, после какой ключевой точки я смогу зарабатывать на верстке сайтов. Имеется ввиду сразу после изучения php или для этого нужно что-то еще?
Сап анон. Расскажи мне,как востребованы люди,знающие PHP,на рынке фрилансеров,и за сколько времени его возможно изучить с 0,имея опыт программирования онли в ABC Pascal,лол
>>549538 плюсую, тоже хотелось бы узнать >>549537 >Для верстки тебе надо не PHP учить а HTML\CSS\JavaScript Сори анон, я ошибся с термином. Я хотел спросить когда я смогу запиливать конкретно фулл сайты, а именно верстка и функциональную его часть алсо.
>>549539 Ну когда выучишь все, что для этого нужно, очевидно же) Учи HTML\CSS\JS\БД базы данных\PHP как минимум. Ссылки на учебники и задачи которые ты обязательно должен прорешать в ОП-посте. Ну а насчет времени, сам понимаешь, все индивидуально. ОП называет 4-8 месяцев на все мною перечисленное.
Впрочем, ВК и Фейсбук ты навряд-ли сделаешь один. Там нужна командная работа.
>>548234 Добавил ограничители выхода за карту: github.com/someApprentice/Cat-and-Mouse
Теперь когда у нас есть ограничители рано или поздно они сработают, и мне придется что-то сделать чтобы животные не выходили за карту. Можно ли это сделать так:
Ребята, такая проблема. Никогда не создавал сайты, решил начать с html. Скачал для этого дела notepad++. Делаю страничку, открываю её в браузере и вижу пикрилейтед. Русский шрифт не отображается. С английским проблем нет. Пробовал гуглить данную проблему, везде пишут, что надо ставить кодировку UTF-8, но она и так стоит по дефолту. Пробовал конвертировать в него - результата ноль. В общем, что мне сделать для того, чтобы русский шрифт отображался нормально?
>>549630 utf-8 может быть с бомом и без С бомом нормально отображается русский но хуево работают заголовки. Там идет какой то символ в начале, из этого иногда могут ругаться браузеры, если ты хочешь отправить им не страницу текста а какой то другой динамически формируемый бинарный файл. Без бома все наоборот. Попробуй так и так, возможно я перепутал.
>>549645 Уже стоит. В нём сейм щит. Я сперва дримвивер и качал, но столкнулся с этими иероглифами. Решил после этого перейти на notepad, но и там тоже самое.
Почему не получается вынести foreach в другой файл? У меня там создается объект и простенький цикл, а в хтмл инклюд и вывод переменных, и в конце строчка <?php } ?> закрывающая foreach. Вот на эту строчку и ругается собственно. C endforeach тоже не работает. Конечно если запихнуть этот цикл в хтмл то все отлично, но хотелось бы чтоб на страничке был только 1 инклюд, выглядит очень чисто. Инклюды что автоматом закрывают фигурные скобки или что? Как починить?
>>543720 (OP) Анон, скажи, есть ли способ проверить у нескольких методов существование свойства. пример public static function getAbsolutePathStyle($name) {
return self::$path . self::$style[$name];
}
Чтобы не писать вот так в каждом методе
public static function getAbsolutePathStyle($name) { if (isset(self::$style[$name])) { return self::$path . self::$style[$name]; } else { Throw new StyleException('Нет такого в массиве, пидар!'); }
По нажатию кнопки массив с данными записывается в текстовые поля для последующего редактирования . Остальная часть страницы не меняется. Как можно сделать это менее уебищнее? Или это норм практика вываливать html через echo?
if ($_REQUEST["showbase"]){ $result= $dbconnect->query('SELECT * FROM users');
>>549790 что я читаю? просто пишешь закрывающий тэг ?> потом хтмл теги <form action=login.php method=POST> <?php while ($row = $result->fetch()) { ?><input type=text value=<?=$row['login'] ?>
$engineers = array_filter($engineers, function ($engineer) { ... });
Ради изучения этой темы, сделай-ка тут через array_filter. Также, есть и другие функции для обработки массивов, например array_map и array_reduce. Только без фанатизма: эти функции хорошо подходят для простых случаев (например обработать все элементы массива функцией round()), а в сложных проще написать цикл.
Если ты не знаком с анонимными функциями (анонимная значит что у нее нет имени), знакомься:
К сожалению, в PHP конструкция получается довольно громоздкая, и не дает возможность оценить красоту этого подхода. В новом стандарте Яваскрипт ES6 например это могло бы выглядеть так:
// Удаляем босса из массива работников. Конструкция e => ... это и есть анонимная функция employees = employees.filter(e => !e.isLeader());
В остальном, у меня замечаний нет, все сделано. Пождумай, что ты дальше хочешь сделать, можно например «Кошки-Мышки», это тоже задача на ООП, а потом список студентов. Или может ты хочешь HTML/CSS, а затем JS подучить?
Например, А со звездочкой и Дейкстра вполне хороши.
В твоем коде:
> $time += $time; Не очень понятен смысл этой команды, это фактически умножение значения в $time на два. Ты тут наверно должен прибавлять к общему времени время прохождения последнего отрезка (между $point и предыдущей точкой).
Также, в твоем коде нужен сделать проверку, когда ты не можешь дойти до цели за 1 шаг и делаешь цикл, чтобы не заходить в уже посещенные точки. То есть если точка $alternativePath есть в массиве $pathDone, значит мы через нее уже прошли и второй раз в нее заходить не надо.
Также, в цикле ты берешь первый вариант и сразу возвращаешь его. Но ведь это может быть не самый быстрый путь. Ты должен проверить пути через все точки и выбрать тот, который занимает меньше всего времени.
> Сначала оверпросто, потом сразу хардкор. Есть такое, там после учебника и до задачи про студентов должны быть уроки, но их пока никто не написал. Увы.
> Вместо неё какой-то странный сайт php.net на котором чтобы найти ответ - нужно часа 2 лазить. Не надо. набираешь в гугле например php count и получаешь первым же результатом мануал по этой функции.
Читать там надо только раздел «справочник языка» https://php.net/manual/ru/langref.php , согласен написан не идеально но понять можно если ты читаешь его не с нуля а после например моего учебника.
> Кто в здравом уме это читал Я читал. И другими анонам советую читать перед собеседованием, так как там любят всякие тонкости спрашивать из него.
> Книга расчитана на весьма ВЕСЬМА олдфагов Книга не совсем для начинающих, это да.
Бывало. Переезжал, раньше адрес был типа archive.ipq.to или как-то так. Алсо ОП хотел купить для него домен в зоне jp, но цены высокие и условия мутные, вроде как иностранцам напрямую нельзя их покупать.
Во-первых, не стоит смешивать вместе HTML и PHP код. Почитай про шаблоны: http://phpfaq.ru/tpl
То есть ты в PHP-файле подготавливаешь нужные данные, а затем инклудишь файл шаблона и там их выводишь.
Теперь перейдем к класссам. Я вижу, что ты догадался сделать отдельные классы для разных профессий и унаследовать их от базового класса, это хорошо. Но недостаточно.
Далее, у нас классы-наследники Employee обязаны задавать базовую ставку, потребление кофе, и тд. Сейчас у тебя нет никакого способа заставить программиста это делать. Для этого можно использовать абстрактные методы — это методы которые ты обязан реализовать при наследовании. Добавь в базовый класс абстрактные методы, которые в наследниках будут возвращать потребление кофе, базовую ставку и производительность в страницах.
Далее, ты смешиваешь понятия «базовая ставка» дял профессии и итоговая зарплата (с учетом надбавок). Это разные вещи и они не должны храниться в одном и том же поле. Более того, так как итоговая зарплата полностью определяется свойствами работника, то ее хранить вообще не требуется — достаточно сделать метод который посчитает и вернет ее. Аналоично надо сделать методы для кофе и страниц.
А свойства c базовой ставкой стоит наверно вообще закрыть от доступа снаружи.
А у тебя сейчас сделано так, что если мы поменяем ранг или статус босса то итоговая зарплата не изменится, а это неправильно.
> public function addEmployer($Employee, $count = 1) { Тут (и в других местах где можно) надо добавить тайп хинт.
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
> $Employee Переменные пишутся с маленькой буквы. С большой буквы пишутся имена классов и константы.
> while($count) { > array_push($this->employee, $Employee); Это неправильно. Ты кладешь в массив несколько ссылок на один и тот же объект, то есть если мы например поменяем зарплату одному работнику, она изменится у всех сразу. Надо создавать нужное число работников и вызывать addEmployee в цикле.
Также, если тебе надо сделать цикл с известным количеством шагов, лучше исопльзовать for.
> if(!$this->$variable) { Так писать не стоит так как тут вообще непонятно к какому свойству идет обращение. Если тебе надо хранить разные параметры и обращаться к ним по имени, используй массив.
Если у тебя есть однотипные функции (посчитать сумму кофе, денег и тд) то ты можешь в функцию передавать анонимную функцию, так:
Также, я думаю, не стоит в Departament хранить посчитанную сумму по зарплатам, кофе, так как у тебя нет никакого механизма ее обновления при изменении числа, ранга работников. То есть твой код будет выдавать в этом случае устаревшие данные.
> public $employee = array(); Наверно стоит закрыть массив от доступа снаружи и обращаться к нему через методы.
> public function cfSum() { Имя непонятное
> private function forEachDepartaments($variable) { Тут лучше передавать анонимную функцию. Не стоит в учебном примере использовать обращение к полю по имени так как оно запутывает код.
Ну и также, держи сразу вторую часть задачи, которая проверит насколько ты правильно реализовал ООП и насколько гибок твой код и насколько легко его изменять:
----------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Нужно думать на уровне одной функции. То есть не пытаться представить что происходит при нескольких вложенных вызовах, а только в одном. Ну к примеру, возьмем функцию вычисления факториала:
Факториал от 1 равен 1 Факториал от N > 1 равен N умножить на факториал от N - 1
Дальше — еще сложнее. Имеется N1 купюр номиналом V1, N2 купюр номиналом V2, и тд.
1) выведи все возможные суммы которые можно ими выдать 2) определи, можно ли выдать ими сумму S, если да, то выведи список купюр дающих эту сумму
Рекурсивное определение тут выгядит тут примерно так:
- Все возможные суммы которые можно набрать из купюр номинала V1 считаются циклом от 1 до N1 - Все возможные суммы для купюр номинала от V1 до Vx = все возможные количества купюр Vx + все возможные суммы купюр от V1 до V(x-1)
> Я так понимаю, это просто усложняет пароль, который хранится в БД, Это значительно увеличивает затраты на вскрытие паролей из украденной базы, прочитай почему (потому что нельзя перебирать все хеши одновременно).
> т.е. в инпут юзер вводит один и тот же пароль? (но ведь могут подобрать пароль, перебирая цифры и вводя их в инпут, а не ломая бд, не?) Пользователь про соль ничего не должен знать. От перебора ты можешь защититься ограничивая число неудачных попыток авторизации с одного IP в одну единицу времени. Соль это защита от воровства базы и от любопытных сотрудников.
Да, прочитай внимательно при каких условиях работает коллапсинг. При наличии паддинга или бордера он отключается. Там еще он на флоаты не действует, и еще на что-то.
Это просто неудачное название. «статический» метод просто значит метод класса, а не то, что в нем есть что-то неизменное. В английской литературе методы часто называют так:
class method = метод класса = «статический» метод. То есть метод принадлежащий классу а не конкретному экземпляру. Вызывается через :: и очевидно не может обращаться к $this. instance method = метод экземпляра = обычный, нестатический метод.
Ты тоже можешь использовать понятия «метод класса» и «метод экземпляра».
> я не нашёл ничего лучше, чем сперва удалить все тире, пробелы и скобки, чтобы не задавать кучу вариантов, а потом просто проверить на наличие +7 или 8 и количество цифр следом. Хорошо бы все же регулярку (которая допускает скобки и минусы) написать для проверки. Это же задача на регулярки.
> как я понял, нельзя проверить всё-таки разными правилами в одном регэкспе, пробовал задавать в скобках - он начинает, конечно, с того места, где проверил последнее, Да, он идет по строке слева направо и 2 раза один и тот же кусок не проверяет. Так что нет, не получится одним регекспом. А вот проверить есть ошибки или нет одним регекспом можно.
По задаче, тут можно было обойтись без switch, сделав массив такого вида:
> Хочу сделать цикл for в методе класса Field, метод у меня будет принимать два числовых параметра $cats и $mice (это кол-во мышек и кошек) и создавать количество объектов равное этим параметрам, Не советую. Лучше создавать объекты снаружи класса Field.
> но как мне им задать разные имена? В уроке про массивы была задача на генератор имен и там даже код есть.
> 'Small', 'salad', Это должно быть константами (ну то есть свойствами написанными большими буквами), то есть
Gamburger.SIZE_SMALL, Gamburger.FILLING_SALAD
> this.getCost = function() { Надо добавлять методы через прототипы (Gamburger.prototype.x = ...). Твой вариант не очень эффективен так как для каждого экзепляра создается новый метод, и конструктор получается гигантский, а большие функции это плохо, тем более в JS там будет куча доступных везде переменных, это бардак.
> var SIZE = { > small: { > cost: 50, > cal: 20 Это наверно лучше вынести в метод вроде getCosts().
> var size = size.toLowerCase(); Это не нужно при исплоьзовании констант.
Также, нужно делать проверки и бросать исключение если что-то передано неправильно, наример вместо размера какая-нибудь ерунда.
> console.log('Нет такого размера!'); Не надо так делать, надо бросать исключение. Так как исключение можно поймать программно, а вывод в консоль нет.
> if (!checkValues()) return; if надо писать в 3 строчки, так же какой смысл что ты делаешь return при ошибке? Как узнать о том что в программе ошибка? В твоем случае никак, надо бросать исключение в такой ситуации.
Также, надо бы сделать чтобы в конструктор передавались только обязательные параметры (размер, начинка), а добавки можно было добавить позже чтобы например сравнить стоимость с добавкой и без.
Ты можешь просто вертикально выводить N таблиц, по одной на ход, а один анон еще нашел где-то слайдер на явакрипте который показывал их по таймеру:
http://apps.perfect-skin.com.ua/cat/ (сейчас анимации нет так как анон поленился скачать нужные скрипты к себе на сайт и подключил их с удаленного сервера который сейчас отдает ошибку. Если ты скачаешь все к себе на локалхост и разберешься с этим багом то все заработает. Не подключайте скрипты с внешних серверов).
> Почему лучше использовать $this->getProperty() вместо $this->property? Инкапсуляция. Представь что завтра тебе надо возвращать число в 2 раза больше. В первом случае ты меняешь только метод getProperty(), во втором ищешь по всему коду $this->property и 100 раз дописываешь умножение на 2.
Паста:
-----
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
-----
Паста №2:
-----
Для начала, я тебе хочу рассказать про такую штуку, как инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему).
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
- получить список возможных ходов - оценить один вариант - сделать ход на клетку
В цикле поиска ходов стоит добавить проверку, возможен ли ход на эту клетку (то есть находится ли она в пределах карты и не занята ли) и не добавлять невозможные варианты.
Далее, у тебя есть свойство die — оно как-то используется? Если нет, какой от него прок? Съеденных животных надо как минимум снимать с карты.
> Почему-то здесь код крашиться, если использвовать throw new Exception(" - They Die ~((‡> <br>"); Как именн крашится? В чем это проявляется? Непойманное исключение как раз и завершает программу. Также, у тебя плохое сообщение об ошибке так как оно не пишет никаких подробностей, например кто именно умер.
> class World { > private $x; Если это размер то лучше написать maxX или width, а то непонятно.
> public function getMap() { Правильнее назвать getAllAnimals()
> throw new Exception("In this coordinate already have it object"); Нужно указывать подробности то есть в каких координатах и кто находистя а то ты сам же запутаешься.
> public function searchScaryAnimals(Animal $animal) { > public function searchTrackedAnimals(Animal $animal) { А вот это мне не очень нравится, мир не должен знать кто кого боится. Это знание должно быть в Cat и Mouse. Лучше явно передавать список животных которых надо найти:
public function searchAnimalsAroundByType(Animal $viewer, array $types)
> public function delimitation Название функции начинается с глагола, например validateCoordinates() или isInsideMap()
> public function moveAnimal(array $from, array $to) { Не нужна, достаточно у животного сделать метод moveTo()
> что посмотреть по wordpress Документацию. Документация пользователя, затем документация по темам (то есть натяжке верстки), затем по API (то есть написание плагинов). Ну и для практики, можешь попробовать слелать аналог m.roem.ru (мобильную версию так как она проще по структуре) или m.habrahabr.ru
Имей в виду что там где нужен вордпресс ты как раз и будешь заниматься натяжкой верстки и допиливанием плагинов. Если ты все наши задачи решил (не только учебник а то что в ОП посте) то для тебя это должно быть несложной задачей. Если не все,то да, будешь страдать и тупить.
> Уже неплохо знаю php, yii, yii2 js, jquery, mysql, html5, css. Тогда лучше Юи и изучать. Вордпресс он для верстальщиков больше.
> Или посоветуй куда еще можно расти как веб программисту. Для начала выучи все перечисленное на отличном уровне. А так, есть symfony 2 + doctrine + twig, очень мощный и хороший фреймворк с кучей библиотек к нему.
Это потому что ты не разбираешься в позиционировании, и наверно читал какие-то дряные уроки от тех кто в нем тоже не разбирается. Наши задачи из Оп поста как раз этому учат и там есть ссылка на годный учебник на сайте softwaremaniacs
> Но если мне надо заменить ошибки, то либо мне заменять только на слова с маленькой "з", по этому шаблону, либо на каждый вариант с заглавной или без писать шаблон и замену, Используй preg_replace_callback, там ты указываешь функцию для замены и можешь применить вообще любую логику для каждого найденного случая. Это очень мощная штука.
> а на работу с текущими скиллами не берут (тупо вакансий нет для студентоты). Судя по описанию у тебя скиллов просто не хватает. Так что учи дальше то, что не доучил. По HTML/CSS и по JS все наши задачи решил?
Это вряд ли так как среднестатистический «фроненд» разработчик это не умеющий программировать верстальщик-быдлокодер. Верстать как правило он тоже не умеет, спецификаций не читал, просто свойства наугад переставляет, учится по видеоурокам.
>>ни в коем случае не используй тут свойство overflow > и как же мне выравнивать колонки? А как свойство overflow поможет выравнять колонки? Оно просто определяет что делать с вываливающимся за границы блока контентом. Где это написано что оно помогает выравнивать колонки? Я потому и написал не использовать, чтобы люди начитавшись неграмотных советов из интернета, не пытались их применить.
Насчет того, как решить, решение тут простое: для контента ставим отступ слева, а меню выносим влево флоатом. У тебя примерно так вроде и сделано.
> зачем в этом задании clear? в твоем макете нет блоков которые идут после флоата и не должны на него наезжать Верно. А изучить его все равно стоит.
> <div class="header" > <div class="menu"> Почитай-ка список тегов и выбери более подходящие:
Вообще, верстка начинается с HTML. Ты должен разметить текст наиболее правильно и только потом ставить CSS стили. И разумеется ты должен помнить основные теги и представлять какие есть еще.
> <div class="box"> Не нужен. Тем более он у тебя зачем-то еще зафлоачен влево.
> ul, li { > margin: 0; > padding: 0; > list-style: none; Это неправильно. Что, если в тексте статьи есть списки? Они преврататся в сплошной блок текста. Надо применять стили только к меню а не ко всем ul на странице.
Также, кавычки-елочки потерялись куда-то. Также, в меню надо сделать отступы между пунктами больше, как на картинке.
> CSS знаю хорошо, но не в идеале. А учебник по позиционированию на softwaremaniacs ты читал например? Наши задачи на HTML/CSS решал? Они как раз позиционированию посвящены во многом.
> Ну не могу я логично понять ПОЧЕМУ если указываешь float: left; то в обном случае он выравнивает по левому краю, а второй блок уезжает вообще вниз и выравнивается по одному ему известной логике! Это потому что ты на самом деле не знаешь CSS и позиционирование и не читал учебник по ссылке выше. Ты думаешь что если ты прочел где-то про свойство width и color то это знание CSS, а это не так. Это лишь самое начало, которого недостаточно для верстки. Ну то есть тот кто знает CSS, он прекрасно понимает и поведение флоатов, и маргин коллапсинг и инлайм-блоки и особенности display: table-cell и что такое клеарфикс.
Советую прочесть учебник по позиционированию и порешать наши задачи на HTML/CSS и наверняка больше флоаты у тебя проблем вызывать не будут.
> 1. Искусство программирования > Автор: Дональд Э.Кнут Я думаю тебе и этой одной книги хватит. К тому моменту как ты ее прочтешь ты конено станешь экспертом по алгоритмам, но вряд ли тебя куда возьмут учитывая твой пенсионный возраст и ноль опыта.
Остальные книги хороши, но рассчитаны не на начинающих, а на тех кто в миддлы метит.
Скорее всего ты просто плохо знаешь CSS потому у тебя вызывает проблемы исправление ошибок. Решал бы наши задачки, читал бы учебник по позиционированию. Ну а насчет заказчиков, кто платит деньги тот и высказывает пожелания. Что сложного исправить как просят?
> Помню мне еще в одной вакансии предложили Это фильтр. Если тебе тестовое задание делать неохота, ты наверно и к работе так же относиться будешь, сделаешь как попало. У тебя впрочем тоже есть выбор, не идти в такую компанию.
> Как же меня заебали предки Переехать жить отдельно не пробовал, или ты еще пока в школе учишься? переезжай и живи так, как тебе нравится и проблема будет решена.
> Но заучивать кучу хаков и дрочить различия реализаций тех или иных свойств в браузерах В наше время никаких значительных различий нет, под ИЕ6 и 7 никто сейчас не верстает, а ИЕ8 это почти CSS2.1 совместимый браузер и проблем я не вижу.
> Каждую неделю пилится по новому js-фреймворку, но никто не решается покончить с гребаным css, и выкатить однозначно не противоречивое и простое решение. Может быть это сделаешь ты?
Мы не обсуждаем тут такие вещи так что придется тебе ковыряться самому. для начала попробуй включить display_errors например. Ну и почитай что такое POST.
Прототипное наследование это нормально (за неимением нормального). Например в Google Closure Library оно везде использовалось. Да и в том же jQuery тоже методы через прототипы сделаны.
Точно, зависает. Я сделал вывод времени запуска и завершения скрипта и действительно, они выполняются по очереди.
Давай попробуем разгадать эту загадку. Добавь в скрипт вывод времени, открой его в нескольких владках, и в последней открой отладчик (Ctrl + Shift + I) и перезагрузи. Отладчик (а также просмотр логов Апача где ставится время получения запроса) покажет интересную вещь: браузер ждет (это время показано как stalled) пока не загрузятся предыдущие вкладки. Что значит stalled? В документации к отладчику Хрома написано:
> https://developer.chrome.com/devtools/docs/network > Time the request spent waiting before it could be sent. This time is inclusive of any time spent in proxy negotiation. Additionally, this time will include when the browser is waiting for an already established connection to become available for re-use, obeying Chrome's maximum six TCP connection per origin rule.
Похоже, действует какое-то ограничение в браузере какое же? Фаерфокс ведет себя так же.
Похоже что браузер пытается не отправлять второй запрос в надежде, что первый вернет ответ который будет кешируемый и который можно будет отдать во вторую вкладку. Обойти можно добавив случайный параметр в URL или поменяв метод на POST (рекомендуется).
> The cache has a single writer / multiple reader lock to avoid downloading the same resource n times.
Кеш в Хроме использует блокировку чтобы не загружать один и тот же ресурс несколько раз одновременно.
Обрати внимание что также в браузерах есть (более известный) лимит параллельных запросов на один домен, от 2 до 6.
Проверить что я прав и дело в браузере легко, отправляя запросы через командную строку, командой wget или curl (нужен мак/линукс и знание командной строки):
при запуске из 2 консолей покажет что запросы выполняются параллельно. Или отправь запросы из разных браузеров.
> Потом скрипт через echo выплевывает js код который рефрешит страницу. Это кстати очень дурной и ненадежный подход, не стоит использовать на продакшене, только если в какихнибудь поделках для себя. На серьезных сайтах надо делать очередь задач через крон или какой-нибудь Gearman.
> Всякие запросы txt и xml файлов, но нигде доходчиво не расписано как например запостить что-то, обратно получить изменение страницы и как сделать все правильно. А ты HTTP хорошо знаешь? Что такое методы, заголовки, код ответа, как отпраляются данные формы при POST запросе?
Данные на сервер посылают через GET или POST параметры. Выбор GET или POST зависит от того что ты делаешь (GET кешируется и не должен менять ничего на сервере). Ответ отправляется обычно в 1 из 2 форматов:
- просто HTML, который вставляется в нужное место страницы, минус: нельзя отправить в ответ сообщение об ошибке (разве что только через HTTP код ответа) - JSON который позволяет передать любые данные, в том числе статус и наличие ошибки. Он удобнее.
В интерфейсе пользователя ты должен сделать следующее:
- индикацию что идет отправка запроса и блокировку кнопки отправки на это время (обычно используют анимацию, например CSS анимацию или гифку). Иногда индикатор показвают с небольшой задержкой (50-150 мс) чтобы при быстром ответе сервера он не мигал зря, но если задержку поставить большой то у пользователя будт ощущение медленной реакции системы, что плохо. - при ошибке транспорта (ну то есть не удалось соединиться с сервером, код ответа не 200, ответ в неверном формате), а также логических ошибках (не введен текст комментария, комментарий содержит нехорошие слова) надо выводить соответствующее сообщение и давать возможность повторить попытку - по желанию можно добавить таймаут для защиты от зависших запросов при плохой связи, но таймаут должен быть большим, наверно порядка минуты, чтобы на медленных плохих соединениях данные успевали отправиться.
В коде стоит сделать отдельную функцию для отправки запроса (например sendAjaxRequest) с интерфейсом, аналогичным тому что используется в jQuery:
Все опции делать конечно не надо, хватит только тех что нужны тебе.
Вообще, это важная тема так что уточняй, если что непонятно. При аякс-запросе ты берешь на себя часть функций браузера и должен предоставлять нужные элементы интерфейса (например индикатор отправки).
может как-то еще. Там, кстати, доктрина умеет даже SQL код генерирвать и таблицы создавать по описанию сущностей, хотя нужно ли это в данном проекте, не знаю. Тебе наверно лучше пока руками создавать все.
> public function setCreated() > { > $this->created = new \DateTime("now"); Тогда функцию надо называть setCreatedNow. Более того, если у тебя это по умолчанию так, то можно прописать это прямо в конструктор.
> public function setPassword($password) Это пароль или хеш? Если хеш то надо переименовать. Если пароль то почему хранишь в базе открытые пароли?
Также, мне не нравится это массиво-ориентированное программирование везде. У нас же есть объекты, давай их передавать для сохранения и валидации. Тут правда появляется проблема, а что делать с полями которых в объекте нет (вроде пароля и подтверждения)? Есть 2 выхода:
- передавать их отдельно массивом - сделать объект типа RegsiterFormModel который содержит объект User + лишние поля. Но стоит ли этим заморачиваться?
Но то, что есть в User, я думаю, массивом передавать не стоит.
> $userResource = new User; Почему resource? Это же модель, $userModel или просто $user.
Также, я не уверен что UserHelper должен вызывать flush(). Это наверно логично в контроллере делать (может даже как-то автоматизированно), а не раскидывать по 20 местам в коде. Ну и это позволит делать несколько изменений в рамках одной транзакции. Ну то есть тут надо подумать, какую логику мы хотим: делать изменения одной транзакцией или несколькими.
> app/Helper/ValidationHelper.php Название плохое, надо назвать UserValidator. И уменьшить там число массивов. Также надо подумать, а не лучше ли возвращать ошибки явно, чем хранить их в свойстве error? А если хранить то сделать удобные методы вроде hasErrors().
Также непонятна логика возврата значений, когда он может вернуть либо true либо сообщение. Не лучше ли при отстутсвии ошибки возвращать например null?
> '{{comment.user}}' А что если в имени кавычка? Если бекслеш? JS-данные надо вставлять через json_encode. После того как заменишь, проверь что любые спецсимволы и все виды кавычек, бекслешей не ломают JS код.
> <i>{{ comment.user }} wrote:</i> > <h4>Нажмите чтоб написать комментарий</h4> Оформление и внешний вид должны задаваться через CSS а не тегами. Теги используются для смысловой разметки. Найди потом время порешать наши задачки на HTML/CSS ибо с ними все плохо.
> <span>reply</span> Почему не button type=button ?
А затем просто JS код. Это позволит например легко вынести его во внешний файл.
Также, у тебя очень странно реализован аякс: ты шлешь POST на отправку, а затем второй запрос на получение комментария, а можно сразу прислать нужные данные в ответе на первый запрос. Ну и не надо писать код простыней, надо разбивать на функции, функцию отправки аякс запроса надо сделать отдельно.
Обновлять все комментарии ради одного — это перебор. Надо вставлять в дерево ДОМ ровно один этот комментарий. Ну или если ты хочешь посложнее, то неплохо бы присылать также новые комменатрии, а также сделать кнопку обновления комментариев.
Также не вижу где у тебя предусмотрено получение с сервера ошибок отправки и выводи их пользователю.
Ну и еще, если ты не очень хорошо знаешь HTML/CSS и JS то у нас в ОП посте есть задания по ним, их можно делать параллельно с PHP. С версткой у тебя как-то все не хорошо пока.
Возможно просто что ты изучал не последовательно, а брался за сложные вещи сразу, не понимал в итоге как что работает и у тебя только получалось бездумно переписать код. А надо начинать с основ и простых вещей, чтобы понимать каждую строчку которую ты пишешь.
По поводу техник, я когда работаю обычно сижу несколько часов (от 4 до 10, как повезет, 10 конечно тяжело и это обычно надо всю ночь сидеть) не отрываясь, отвлечешься и ничего не сделашь. Обычно когда я проснулся отдохнувшим, голова хорошо работает, мне работать не хочется, прямо не могу, я сначала просижу весь день, и только когда устану и голова ничего не соображает, берусь за работу, так как мозгу уже все безразлично и он не возражает.
> Почему когда я выбираю замену на пробел, то заменяется даже то, что я не говорил, по идее, заменять. Я вроде правильно написал, что заменять только (\\(|\\)|\\-){0,14} , а оно мне выдает результат как на пике. Ну так у тебя стоит {0,14} то есть от 0 до 14 повторений. 0 повторений это пустая строка, и он каждый промежуток между 2 буквами считает пустой строкой и с радостью заменяет на точку. Более того, ты не использовал флаг u а это значит что если бы там были русские буквы (состоящие из 2 байт каждая), он бы их разломал на куски.
Также, паста:
-----
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Но вы, аноны, так не делайте, так как у меня работа довольно механическая и думать там вредно, а вам наоборот, надо думать.
> Я как-то прерывался 2 раза на неделю примерно, Это потому что ты в зоне комфорта, никто тебя не гонит, не бьет, в ухо не кричит. Человек стремится тратить минимум усилий, а если тебя мамка кормит и одевает, усилий прикладывать смысла нет. Сходил бы послужил, говорят в армии не попрокрастинируешь и не похиккуешь, мигом дурь выбивают.
> ОП, input - это строчно-блочный элемент? Он inline, но так называемый replaced element. Это значит что в отличие от просто inline элементов, чьи размеры и форма определяются заключенным в них текстом, у него есть собственный размер (но зато нет содержимого). replaced элементами являются картинки, видео, инпуты, кнопки, ифреймы. Там есть небольшие особенности их поведения и они похожи на инлайн-блоки.
Также, replaced элементы даже если им дать display: block, не растягиваются на всю доступную ширину.
> Переводить их в тип block, и флоатить мне чет лень. Не надо.
Первый вариант без дивов, но с комментарием вполне подойдет. Не стоит сильно усложнять разметку в данном случае. Тем более что применить флоат можно было и к инпутам напрямую. Флоат автоматически применяет к элементу display: block (и это вроде написано на softwaremaniacs).
Эти задания обычно не сами по себе, а относятся к какому-то проекту или сайту. Так что нам для начала тогда надо найти проект, над которым работать. Ну и прежде чем их делать надо изучить все нужные технологии, задачи в ОП посте как раз в этом могут помочь.
Обычно задачи вида: исправить баги, поменять что-то на сайте, добавить новый раздел или функцию на сайт.
Конкретные задачи конечно могу привести:
- поменять вид URL для каких-то страниц - добавить sitemap на сайт (то есть автоматически его генерировать по расписанию) - переделать отправку комментариев на аякс - сделать счетчик числа просмотров страницы с постом - оптимизировать SQL запросы на определенной странице - перенести данные из базы одного сайта на другой (базы разного формата разумеется) - разобраться почему не отправляются СМС в таких-то случаях - добавить возможность пользователям самим что-нибудь редактировать
> Плагин под вордпресс написать не сможешь, Если ты хорошо знаешь нужные технологии то с вордпрессом за день-два разберешься даже если первый раз его видишь. Есть же код, есть документация.
> интернет-магазин тоже сделать не сможешь. В простейшем варианте это значит скачать и установить готовую CMS.
Но ты прав в том, что надо получать и близкие к практике знания. Но и книги тоже почитывать стоит, надо развивать мозги пока молодой, а то так и будешь всю жизнь верстку на вордпресс натягивать.
> Самое что противное, что и паттерны проектирования, кроме самых простых, по сути, ты тоже использовать не сможешь. паттерны надо изучать когда есть опыт. Напиши файлообменник и там минимум пара паттернов найдется которые можно применить.
> и вот я знаю про два механизма в регулярных выражениях - детерминированный конечный автомат (ДКА) и недетерминированный конечный автомат (НКА). Это интересная тема. Я как-то писал для себя (не дописал) свой движок регулярных выражений на PHP, правда работающий на уровне слов. Он не использовал автоматы, а должен был генерировать PHP-код (разумеется при желании можно и на других языках если важна производительность, например на Си), соответствующий регулярке.
> Надо было мне сделать отрицание по слову в регулярках, так я и встрял с этим на 40 минут. (?!word) же
Все же я не думаю, что регулярки оказались совсем бесполезными. Конечные автоматы интересны тем, что позволяют многократно ускорить проверку на соответсвие регулярке в сложных случаях, где подход с виртуальной машиной и бектрекингом работает очень медленно, если ты знаешь английский то есть такая интересная статья: https://swtch.com/~rsc/regexp/
Я надеюсь, это тебе все же пригодится, ну хотя бы на собеседовании в Яндекс или Гугл будет что рассказать или может где-нибудь сможешь применить конечные автоматы. Штука-то интересная.
- x в степени 1 равен x (второй ретурн) - x в степени N (N != 1) равен N умножить на x в степени N - 1 (первый ретурн, хвостовая рекурсия)
Хвостовая рекурсия значит что рекурсивный вызов это последнее действие в функции (в ретурне). Хвостовая рекурсия может быть заменена на цикл (да и не хвостовая наверно тоже, но тут код получится проще).
2 пробела это обычно в HTML где отступов может быть много. Или в CSS. Но это не языки программирования. В хорошем коде отступов много не бывает и потому 4 пробела подходят. Ну а если их в JS ставят значит просто код не очень качественный.
Как ты автоматически определишь кодировку, а? Кодировка это таблица, которая показывает какое число какую букву обозначает. Вот пришел тебе набор байт (чисел). Как ты определишь в какой он кодировке если в нем это не написано?
Есть конечно методы основанные на статическом анализе, но они неточные и могут ошибаться.
Нельзя. Ничего, не умрешь. Алсо странно выглядит код, что-то я сомневаюсь что тут надо использовать статические методы и поля. Это дурная практика, делать все статическими методами там где нужны нормальные.
Все SQL запросы также должны выноситься в отдельный файл, желательно 1 класс на 1 таблицу. Ну там уже ООП пойдет, а я не уверен что ты его знаешь.
ну и про MVC почитай.
у тебя же все свалено в кучу, это верный способ получить неподдерживаемую лапшу в итоге.
В общем, я бы тебе советовал переучиться делать нормально. Пройди сначала Вектор в нашем учебнике (чтобы ООП изучить), кошки-мышки, а потом можешь студентов и файлообменник сделать из ОП поста.
Ну и при выводе надо использовать htmlspecialchars. Ужасный код, ужасный.
>>549837 >Нельзя. Ничего, не умрешь. Алсо странно выглядит код, что-то я сомневаюсь что тут надо использовать статические методы и поля. Это дурная практика, делать все статическими методами там где нужны нормальные.
Мне нужно просто возвращать полный путь к файлам стилей и плеера. В зависимости от разных условий дергаются разные стили + то что плеер постоянно обновляется, а мне уже надоело в 3 файлах одно и тоже менять, поэтому решил сделать вот такой вот класс. Инстанс вроде не нужен, поэтому решил методами класса сделать.
Да, ОП, ты был прав насчет скобок, но вот я все поправил, а оно все равно не делает замену.
>Ну так у тебя стоит {0,14} то есть от 0 до 14 повторений. 0 повторений это пустая строка
вот здесь вообще капец, я думал, что задается так, что может быть 14 символов, а может и не быть вообще, а оно как-то пихает повсюду эти точки, странно.
Пустая строка соответствует всем промежуткам между буквами и с краев строки, то есть всем возможным местам. Ты можешь попробоват сделать замену для пустой регулярки //u и увидишь сам.
>>549862 Макаками называют не всех php-шников, а быдлокодеров, то есть тех, кто как раз не тратил это время на учебу, и может написать только примитивные вещи, копируя из проекта в проект куски кода, которые он не понимает. Гугли "теорему о бесконечных обезьянах". Грамотных разработчиков на php очень мало, зато их труд ценится, соответствующая зарплата.
Господа, я правильно понимаю, что нельзя создать две переменные одного класса?
ну вот например есть class MyClass{}
Мы создаем объект класса $object = new MyClass; и создать вторую переменную-объект того же класса низя? например $secondObject = new MyClass? Нужно создавать два новых класса, которые унаследуют от MyClass, чтобы создать два разных объекта-переменных этих дочерних классов?
ОП, вот я начал делать задание "операточники". Я конечно ради интереса загуглил решение этой задачки и охуел. Я не всматривался в решение, но увидел там функцию, массивы, несколько форов и ифов.
Максимум, что я мог сделать https://ideone.com/dfjbmG и то даже здесь я не понимаю почему латинские буквы которые стоят рядом друг с другом берутся в одну квадратную скобку, а не у каждой своя и как сделать, чтобы у каждой своя скобка была кроме как не накопипастить много раз [a-z] и то не уверен, что и так получится, но вроде должно.
Так вот, вот я даже примерно не могу себе представить как решать эту задачу, с какой стороны подойти и как начать.
Что мне в такой ситуации делать? а) Сидеть ломать голову пока не умру произойдет чудо, если я пойму как это решать б) Посмотреть решение и разобрать чужой код в) Закрыть тред и забыть навсегда о php и программировании ясен хуй, что этот пункт я не выполню, но я приму во внимание твое мнение
Кстати вот этот случай когда ты с легких задачек типа "убери тире в номере" перепрыгиваешь сразу на суперхард, как для меня.может и не хард, конечно, но для меня хард >Возможно просто что ты изучал не последовательно, а брался за сложные вещи сразу, не понимал в итоге как что работает
>>549890 Тебе нужно понять суть регулярок. Вот например почитать http://javascript.ru/RegExp (там что в пхп что в жс суть одна и та же). Регулярки - это вообще первое что я изучил и понял в программировании. Если ты поймешь - будет очень полезно.
Хотел написать функцию, которая проверяет наличие css-класса у элемента, получилось что-то много кода. http://jsfiddle.net/5e4yLywm/ Как бы это подсократить? inb4: ко-ко-ко, используй jquery
- регуляркой разбить className на массив имен классов и поискать в нем - сделать регулярку из имени класса и проверить соответствует ли ей className - (один из самых быстрых вариантов) заменяем в className все пробельные символы (\ s) на пробелы, приписываем пробелы с краев, также приписываем пробелы к имени класса и проверяем является ли второе подстрокой первого
> indexOf(className) Это находит только первое совпадение с искомым именем, но ведь там может быть и второе и третье, а ты их не проверяешь. В такой ситауции:
class="some-class some"
Твоя функция найдет слово «some» в начале но не найдет второе слово some.
>>549939 Так нам и нужно только одно вхождение, функция проверяет, есть класс у элемента или нет. Пусть у него даже 10 раз присвоен один и тот же класс, это ничего не меняет.
Нельзя. имена классов могут быть разделены не только пробелом, но и другими пробельными символами, например таб \t и перевод строки \n. А почему ты так избегаешь регулярки? Если ты их не изучил еще, это повод за них взяться.
>>550013 Какой мудак будет разделять классы табуляциями и переносами? Может еще вертикальную табуляцию или какой-нибудь экзотический \ff? Ну хорошо, пусть будет split(/\s/)
https://html.spec.whatwg.org/#classes > The classes that an HTML element has assigned to it consists of all the classes returned when the value of the class attribute is split on spaces. (Duplicates are ignored.)
https://html.spec.whatwg.org/#space-character > The space characters, for the purposes of this specification, are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), U+000C FORM FEED (FF), and U+000D CARRIAGE RETURN (CR).
Таб разрешен так как он во многих языках является пробельным символом. Перевод строки тоже в общем имеет смысл, если классов очень много. Символ \r используется в переводе строки под windows (\r\n), а кто и для чего использует \f я не знаю.
Давно не постил, потому что был занят другим проектом, делал сайт объявлений на yii. Там больше времени потратил на возню с eav, чем с самим фреймворком. Тоже посмотри пожалуйста, наверняка ты найдешь, что можно поправить и улучшить. https://github.com/nsdvw/classifieds У меня есть некоторые смутные вопросы по этому проекту. Использование nested sets приводит к чудовищно медленным результатам поиска. Как бы это оптимизировать? Вот у меня есть категория высокого уровня, например "легковые автомобили". Соответственно при поиске по данной категории нужно вывести всех потомков, а это сотни категорий моделей и марок. Таким образом у нас получается очень некрасивый запрос WHERE category_id IN (сотни айдишников). Что с этим можно сделать? Потому что это никуда не годится, у меня в базе десяток объявлений, а оно ищет 3 секунды. Что будет при миллионах записей и сотнях параллельных запросов?
> Что с этим можно сделать? Потому что это никуда не годится, у меня в базе десяток объявлений, а оно ищет 3 секунды А почему ты думаешь что тормозит именно SQL? У тебя есть текст конкретного запроса который тормозит?
Я думаю, это хороший пример чтобы научиться искать узкие места.
Для начала тебе надо найти проблемные места в общем, то есть на уровне PHP кода понять какая функция медленно работает. Тут можно поступить 2 способами:
- установить и настроить профайлер (xdebug) и с ним выполнить скрипт в режиме профайлинга. xdebug сгенерирует отчет в котором будет видно какая функция сколько времени заняла. Как его настраивать — попробуй для начала поискать сам, может есть хорошая статья. Если нет, напиши, я прокомментирую. Там надо установить расширение php, дописать какие-то настройки в php.ini и запустить скрипт с доплонительным GET-параметром
- как-то по-простому натыкать команд которые замеряют время вызова разных функций и найти проблемную. Ну и сам Юи вроде в режиме отладки пишет время выполнения и выполняемые SQL запросы.
Первый вариант конечно посложнее, но он полезен в том плане что ты научишься делать профайлинг.
После того как ты разберешься на что уходит время, мы посмотрим что делать дальше. Если это медленный SQL запрос то будем учиться как их анализировать и оптимизировать. Если это PHP код, опять же, будем разбираться.
Я сомневаюсь что дело в nested sets.Это как раз сильно оптимизированная структура.
>>549819 Ок, возьмусь, пожалуй, за кошки-мышки и далее буду углубляться в бэкэнд. HTML/CSS я потрогал в бесплатной части htmlacademy, не понравилось, очень муторно показалось этим заниматься. JS тоже потрогал, тоже не понравилось, как-то запутано все, замыкания эти извращенческие, на первый взгляд вроде понятно, а потом начинается коллбэк на коллбэке сидит и коллбэком погоняет, оберни ее оберни оберни оберни еще раз, в общем решил отложить на потом. Может со второй попытки лучше зайдет. В PHP по сравнению с этим прелесть как очевидно и просто все. Понимаю, что все равно придется изучать, вроде в твоей программе обучения это нужно для написания файлообменника, когда дойду, так и повторю погружение.
Ну наши задачи на HTML/CSS, они там в начале очень простые и только потом становятся сложнее. Ну и я подсказываю обычно если что-то не так. Ты наверно просто какую-то вещь не понял и из-за этого запнулся.
Я бы не сказал что HTML/CSS такие уж сложные, да, там есть сложные места но в них можно разобраться.
>>550281 Да нет, трудности и неприятие только с JS возникли. HTML/CSS просто очень нудные, над PHP кодом я могу часов 5 просидеть, потом теряется концентрация, замыливается глаз, начинаются глупые опечатки и тому подобные вещи. Над версткой посидел полчаса и привет квадратная голова, постоянно отвлекаешься, в общем не возникает увлеченности процессом, когда вроде только сел а на самом деле уже несколько часов прошло.
>>550257 интересно как, взял разбил файл на типы и в зависимости от его типа (видео, имг, зип) подключаешь разные вьюхи-шаблоны. А можно я некоторые приемы у него возьму?
Еще здесь спрошу. Год назад гитхаб раздавал купоны для студентов, самая годнота была 100$ на счет в digitalocean, наверняка многие из вас нахватали этих паков, так вот, кажется там деньги давались на год и если их не использовать то они исчезнут со счета в do? я стараюсь удалять дроплеты когда они мне не нужны, на счету осталось больше 100$ (оплачивал до гитхаба), теперь вот думаю, их заберут или нет?
>>550273 А в чем еще, как не в sql? Хорошо, буду сегодня копаться с xdebug, давно пора. У yii кстати тоже есть какой-то логгер, но я не понимаю, как анализировать ту инфу, которую он вываливает. >>550305 Я неон. >>550306 Мне тоже. И это здорово, потому что свидетельствует о левел-апе: если наш старый код кажется нам хуже, значит очевиден прогресс. >>550308 Тип можно определить например через объект finfo (см. php.net) в конструкторе модели. Затем ради красоты обернуть в методы такие как isImage, isVideo, где тупо проверяется белый список mime-типов. Хочешь используй мой код, мне по-барабану. Хотя полезнее было бы научиться самостоятельно выводить алгоритм.
Задача: Циклы и айфон в кредит. Такая сложная? Или же это я такой тупой? Анон, я же мамин программист, что же мне делать? P.s Хочу сделать свой някавай сайт.. С учебой жопа - ищу альтернативу.. Посмотрел вот на 19 летних школьников, которые без проблем делают 2048 и решают сложные логические задачи, желание осталось только одно...
>>550327 Начинает подташнивать уже от вашей рефлексии. Приходят и прибедняются, причем с очевидным подтекстом, чтобы их утешили, погладили по головке и сказали "ты у мамы умный, просто верь в себя".
>>550328 Двачую. На 500 постов не больше 50 попыток решить детские задачи опа или вопросов по делу, зато все засрано мотиваторами в духе "как стать успешным нихуя не делая". Впрочем в этом весь двач.
>>550273 Таки sql тормозит. Включил логи yii, привожу скрин (не могу понять, в какой файл оно сохраняет логи, стыд).
Тормозит запрос вида SELECT * FROM `category` `t` WHERE (`t`.`lft`>2 AND `t`.`rgt`<2537) AND (`t`.`root`=:ycp0) ORDER BY `t`.`lft` на строке in /home/inside/www/yii.test/public/protected/models/Category.php (141) которая выглядит так $descendants = $category->descendants()->findAll(); Я использую библиотеку nested-set-behavior. Метод descendants https://github.com/yiiext/nested-set-behavior/blob/master/NestedSetBehavior.php#L33
Я нашел метод и вызванный им запрос, вызывающий тормоза. Что мне делать дальше?
Выполни этот запрос в командной строке MySQL (добавь для надежности SQL_NO_CACHE после SELECT ) и проверь точно ли он столько времени занимает и сколько результатов выводится.
Что поставить вместо :ycp0 можно определить с помощью var_dump
Я кстати замечу что твой запрос можно оптимизировать еще дальше, тебе ведь не нужна вся таблица а нужны только id категорий, можно ускорить его чуть-чуть если выбирать только их. Но это давай уже потом, после того как разберемся с основной проблемой.
Разберись с профайлингом, это полезный навык.
Тебе надо:
- установить расширение xdebug нужной версии и типа. Так как у тебя что-то напоминающее Убунту ли Дебиан, то, хорошая новость, тебе скорее всего достаточно сделать sudo pecl install xdebug
В debian/ubuntu, как я помню, файл php.ini разбит на отдельные файлы, и при установке расширения ты получишь где-то в /etc/php.d/ файл xdebug.ini с его настройками. Там ты можешь поменять что надо.
Обрати внимание: > You can also selectively enable the profiler with the xdebug.profiler_enable_trigger setting set to 1. If it is set to 1, then you can enable the profiler by using a GET/POST or COOKIE variable of the name XDEBUG_PROFILE
Упомянутая настройка включает профайлер только если в GET или POST содержится параметр XDEBUG_PROFILE=1. Советую ее и использовать.
Если надо отпрофайлить CLI-скрипт то можно дописать к параметрам PHP -d что-то-там=1
Далее, ты запускаешь свой скрипт с этим профайлером и xdebug кладет отчет в указанную в настройках папку. Отчет можно просмотреть как программой KCacheGrind (или аналогичной работающей с форматом cachegrind) так и установив веб-приложение WebCacheGrind.
Обрати внимание что там есть разные варианты просмотра статистики, можно выводить функции по порядку выполнения, а можно группироать и выводить сначала самые тяжелые.
Обрати также внимание, что там выводится 2 разных времени для каждой функции: общее время выполнения и собственное, то есть без учета выполнения вызываемых из нее функций.
>>550376 Ты наверное хотел сказать субд, а не бд. База данных это всего лишь совокупность данных. А какие ты знаешь? Проанализируй преимущества их использования в твоем конкретном проекте и выбери ту субд, которая больше удовлетворяет требованиям.
>>550392 >>550368 В общем, если я правильно догадался, то проблема в следующем: выбирая из базы 1200 с лишним записей, yii в цикле присобачивает к каждой из них поведение. Мне на самом деле нужны только айдишники, модели не нужны, и уж тем более не нужны модели с поведением. Так что твое абсурдное замечание > "можно оптимизировать еще дальше, тебе ведь не нужна вся таблица а нужны только id категорий, можно ускорить его чуть-чуть если выбирать только их" оказалось на деле пророческим. Колонки, в которых хранятся integer-данные типа left и right не так и перегружают приложение, а вот тот факт что при создании экземпляра объекта к нему еще применяется куча модификаций вроде навешивания событий и поведений, это оказалось критическим. В общем, попробую сделать так, чтобы из базы выбирались только айдишники в массив, должно помочь.
А вообще интересный урок получился. Почему забросил блог и больше не пишешь? Вот мог бы написать статью про использование профайлера, посты в треде все равно быстро тонут, и часто мечешь свои длиннопосты перед свиньями, а так сохранится навечно.
Начал заниматься по вашему учебнику, остановился на задачке про айфон. Анон, проверь, пожалуйста, и укажи на ошибки, если они есть. http://ideone.com/e02uDB Ещё возник вопрос: можно ли как-нибудь, не вводя новую переменную, в строку ввести математическое выражение? Например, чтобы в операции echo "$a + $b" выводилось не значение а + значение b, а значение (а+b).
Ок, давай разбираться с просмотром отчетов. Я не знаю точно что там где в KCacheGrind, потому покажу на примере WinCacheGrind. Думаю, в KCacheGrind при желании можно найти аналогичные таблицы. Если не найдешь, то можно попробовать WebCacheGrind как альтернативу.
Также, в WinCacheGrind есть маленький баг, она показывает время в 10 раз меньше реального. Так что не забывай домножать все со скриншотов на 10.
На первом скриншоте мы видим:
- слева так назывемый call graph, граф вызовов. Он показывает в каком порядке вызывались функции при выполнении программы, причем раскрывая пункты можно увидеть какие функции вызывались из данной. Там довольно много вызовов метода __desctruct. Деструктор — это метод который вызывается при уничтожении объекта. По завершению программы все ранее не удаленные переменные удаляются и для удаляемых объектов вызываются деструкторы. Несмотря на то, что их много, время выполнения их ничтожно.
- справа окно, которое показывает какие функции вызвались из текущей (выбранной слева). Во вкладке Line By Line показываются только непосредственно вызыванные из нее функции по одной, а на вкладке Overall все, включая глубоко вложенные, причем даже если функция вызвана несколько раз, то она группируется в одну строчку. Функции удобно отсортированы по общему времени выполнения так, что вверху самая тяжелая и кликая по ней, мы переходим к ней и видим что она вызвала, в свою очередь.
Обрати внимание, что у функций есть общее (включая время вложенных вызовов) и собственное (то есть время выполнения кода в самой функции без вложенных вызовов) время. Также надо различать время потраченное на один вызов функции (Avg. Self/Avg. Cum.) и суммарное (Total Self/Total Cum.), потраченное на все вызовы, если функция была вызвана несколько раз. Суммарное время есть на вкладке Overall.
Там кстати есть кнопочка, позволяющая скрыть быстро выполняемые функции.
В твоем KCacheGrind наверняка есть аналогичные виды.
Спускаясь так по дереву вызовов, мы приходим к тому что видим на скриншоте 2. Мы видим что в actionSearch почти все время заняли 2 функции: getDescendantIds и render. Ну, с render() мы наверно пока ничего не сделаем, а вот getDescendantIds стоит проверить, что она там делает целых 6700 мс?
Спускаясь далее, мы доходим до изображенной на скриншоте 3 ситуации. Как мы видим, теперь все функции занимаеют по отдельности немного, около 6-12 мс каждая, но зато вызово очень много (вкладка Overall говорит что их тысячи). Анализировать их по отдельности бесполезно, потому переключимся на статистику в Overall.
Поднявшись на 1 шаг вверх (в функцию CActiveRecord->query()) и переключившись на Overall, отсортировав список по колонке Total Self, мы видим что время (Self Time) расходуется на тысячи мелких вызовов вроде attachBehaviours, attachEventHandler, getMetaData (скриншот 4).
Таким образом, мы видим что большое время выполнения получается из-за загрузки через Activerecord более 1000 записей. Хотя загрузка и инициализация одной модели занимает порядка 6мс, тысяча вызовов дает уже 6 секунд. Действительно, загружать большое число объектов через ORM не лучшая идея.
Наверно ActiveRecord можно как-то чуть-чуть разогнать, может быть там можно что-то закешировать, но более правильной идеей будет не загружать 1000 записей только ради получения id категорий. Сделай отдельный метод в модели Category, получающий только id вложенных записей.
Надо обязательно, чтобы ты прошел этот же путь сам. Если не можешь найти нужные опции или таблиы в KCahe Grind, установи WebGrind — его интерфейс близок к тому что на скриншотах. Но важно чтобы ты научился искать таким образом проблемные места в коде.
Жаль, на этом примере нам не удалось изучить оптимизацию SQL запросов, это ведь важная тема. Но может быть у нас еще есть шанс это сделать. Для этого тебе надо перейти от базы с 10 записями к реалистичной базы с сотнями тысяч и миллионами записей — тогда проблемы и узкие места в запросах выйдут на первый план.
Для генерации такой базы тебе придется написать скрипт генерации пользователей, объявлений. Имена и тексты может генерировать библиотека Faker. Помни что вставка отдельными запросами будет медленная и стоит вставлять данные транзакциями по 1000 - 10000 записей или мультиинсертами. Подробнее про вставку больших объемов данных в MySQL написано тут (англ): https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html
> то проблема в следующем: выбирая из базы 1200 с лишним записей, yii в цикле присобачивает к каждой из них поведение. Я думаю, там дело не только в поведении, а в том что модель AcriveRecord довольно сложный объект с кучей подобъектов, и ее создание не бесплатное. ORM известны большим потреблением ресурсов при работе с большим количеством объектов.
> оказалось на деле пророческим. Ну, опыт и интуиция подсказали мне ответ до того как я видел отчет, но я не хотел лишать тебя удовольствия самому обнаружить причину.
> Почему забросил блог Все как-то времени нет, у меня уже куча черновиков раскидана, которые я пока что загружаю на гитхаб:
> Yii::app()->db->createCommand() > ->select('id') > ->from('category') Query Builder используется для построения запроса по частям, когда например часть запроса может отстутствовать в зависимости от условия. Если запрос неизменен, то использовать Query Builder смысла нет и гораздо удобнее записать его SQL кодом. Как минимум там будет меньше стрелок и кавычек.
>>550423 >маленький баг, она показывает время в 10 раз меньше реального О, я вот как раз не мог понять, что там за цифры: 60 для милисекунд вроде мало, для секунд много.
Хороший инструмент, мне нравится.
Да, я как раз думал посмотреть faker, чтобы нагрузить базу. Плюс какой-нибудь ab (апач бенчмарк) для тестов. Потому что первый yii меня что-то не впечатляет, какой-то он кривой, медленный. Так что будет нелишним.
>>550428 >времени нет В треде же пишешь длиннопосты, разве займет время скопировать пост в виде гист на гитхаб? Досадно что оно тонет, иногда хочется перечитать, а прошлый тред уже утонул. Буду тогда сам сохранять твои посты, потому что у меня память не идеальная, я все с первого раза не могу запомнить. > https://gist.github.com/codedokode > https://github.com/codedokode/pasta Там же только старые, или я опять туплю.
>>550421 Зачем в строке проводить математические операции? Вычисление можно произвести отдельно и приконкатенировать (присоединить к строке). echo "Результат равен " . ($a + $b); Оператор объединения строк . (точка), склеивает строку слева со строкой справа. Если один из операндов не строка (в нашем случае integer), то приводит (преобразует) его к строке.
ОП, я использую advanced шаблон yii2, мне нужно иметь доступ к картинкам и из фронтенд, и из бэкэнд, но как прописать пути к изображениям, если они лежат выше web директории? Можно обращаться вот так ../../images, но это не будет работать на хостинге, когда я размещу web директорию как public_html. Про псевдонимы в yii2 читал, они указывают или путь к файлу, или url файла доступного из вне, но как указать путь к файлу недоступному из web. Помоги, пожалуйста
Поясните за namespace. Например, есть у меня MyApp\Model\SomeClass. Как мне нужно к нему обращаться в клиентском коде: use MyApp\Model\SomeClass; $x = new SomeClass();
или просто $x = new MyApp\Model\SomeClass(); При том что у меня только одна строчка с обращением к этому классу.
Можно и как второй, но первый вариант будет выглядеть аккуратнее. Я использую первый, а use я руками не пишу, их ставит расширение к ST3 (PhpCompanion). Если ты используешь нормальную IDE, то она тоже это умеет.
В Юи есть такая штука как assets и с ее помощью ты можешь публиковать папки в веб-директорию, разберись как оно работает. Там по моему метод назвается publish() или как-то так.
Вообще, странная схема хранить публичные картинки за пределами веб-директории. Впрочем в Юи видимо это сделано для возможности препроцессинга файлов до публикации.
>>550671 штука странная, но взгляни на структуру папок, как иначе? нужно чтобы и backend и frontend мог работать с этими изображениями. Через assets как-то тупо, но, возможно, придется
ОП, посмотри код моего сапера: http://plnkr.co/edit/rsPZgtd1XjCrzOCbAq1P?p=preview Это первое, что я написал после learn.js (если не считать задачек в самом учебнике), какие самые главные моменты которые стоило бы переработать, чтобы оно не было говнокодом?
Конечно конфиги продакшена, пароли и ключи не должны быть в общедоступном репозитории. Они должны быть только у тех у кого должен быть к ним доступ, может быть где-то в приватном репозитории или еще где-то.
В основном репозитории должны быть только значения которые безопасно опубликовать, например от локалхоста.
А настройки на продакшен можно ставить так:
- можно сделать отдельный файл, например config/db.local.php или config/prod/db.php которого нет в основном репозитории и который выгружается откуда-то еще. Код на продакшене должен прочитать его (если он есть) и внести изменения из него.
Удобно в дополнительном конфиге хранить только те данные, что поменялись в сравнении с основным конфигом.
По идее в фреймворке должно быть что-то для поддержки этого. Гугление ничего не дело, но имя конфига задается в index.php, наверно можно что-то в нем подправить для этого.
- можно при деплое (процессе выгрузки кода из git на сервер) заменять config/db.php на нужный файл
Заметь также то процесс выгрузки кода на продакшен (деплой) надо автоматизировать. Незачем тратить драгоценное время разработчика на ручную возню с заменой или редактированием файлов каждый раз (да и ошибку сделать можно). Я использую bash скрипты, кто-то пишет конфиги для систем вроде Ansible. Кто-то использует хуки для гита, то есть при пуше в определенную ветку (production) на сервере начинается деплой.
Если что-то непонятно, задавай вопросы, так как тема важная.
>>550692 Многое непонятно, так как я делаю, можно сказать, свой первый hello world на Yii2, а с такими штуками, как деплой приложения в продакшен вообще ещё не знаком. Пока что интересует только вопрос, связанный с заливанием конфигов в публичный репозиторий. Нормально будет, если этот конфиг db.php будет брать credential-ы из другого php-файла, который добавлен в .gitignore?
Кстати, вот насчёт этого index.php и прописанного там конфига. В стандартном шаблоне в той же директории есть файлик index-test.php, который, судя по всему, тоже служит для чего-то подобного. Там и путь к конфигу другой указан:
>>550698 На локалхосте да, но другим, если они выкачают код из репозитория, придется править этот конфиг вручную на значения своей БД. Ну и, соответственно, иметь на своем компьютере такую же базу даных с такой же структурой.
Хм. А по идее, базу данных, с которой работает приложение, нужно тоже в репозиторий как-то заливать?
Делается дамп структуры (то есть CREATE TABLE) и кладется, дальнейшие изменения ты делаешь через миграции БД (изучи что это и как работает в Юи).
Также, если есть какие-то справочники (например таблица городов) то надо либо сделать дамп для них либо скрипт их заполнения.
Главная идея — чтобы любой разработчик мог максимально быстро и удобно развернуть локальную копию сайта (например просто запустив прилагаемый скрипт). Также это пригодится если ты захочешь делать автоматические тесты, тестовому скрипту надо будет автоматически разворачивать копию сайта на сервере.
Сами данные с продакшена нельзя использовать на локальном сервере, там могут быть email и пароли пользователей, может какие-то платежные данные. Для локалхоста по идее надо делать базу с искуственными данными либо скрипты наполняющие ее случайно сгенерированными данными. Наример библиотека Faker умеет их генерировать.
На практике в большинстве случаев (в не очень профессиональных командах и на фрилансе) на это забивают и либо это проблема разработчика как заполнять базу на локалхосте либо исплоьзуют продакшен базу со всеми последствиями вроде случайной отправки писем или смс с локалхоста реальным пользователям. Либо вообще все как-то настроено на продакшен сервере и никто не знает толком как это развернуть у себя. Не рекомендую так делать.
В правильном проекте сайт можно развернуть максимально автоматически на любом сервере.
>http://apps.perfect-skin.com.ua/cat/ (сейчас анимации нет так как анон поленился скачать нужные скрипты к себе на сайт и подключил их с удаленного сервера который сейчас отдает ошибку. Если ты скачаешь все к себе на локалхост и разберешься с этим багом то все заработает. Не подключайте скрипты с внешних серверов). Буду рад сделать это позже, но сейчас я знаком с JS только поверхностно и хочу сначала разобраться со своим кодом.
>> Почему лучше использовать $this->getProperty() вместо $this->property? >Инкапсуляция. Представь что завтра тебе надо возвращать число в 2 раза больше. В первом случае ты меняешь только метод getProperty(), во втором ищешь по всему коду $this->property и 100 раз дописываешь умножение на 2. А разве свойство property не будет равно последнему изменению? Окей, допустим я начинаю что-то понимать. Практическое применение инкапсуляции это написание API?
>Также можно доабвить абстрактные методы для того чтобы потомки определили какие-то обязательные вещи (например $hunted, символ-обозначение). А как узнать какие вещи обязательные? Я бы все их сделал такими.
>Далее, у тебя есть свойство die — оно как-то используется? Если нет, какой от него прок? Съеденных животных надо как минимум снимать с карты. Как минимум для этого оно и было сделано, но пока я не научился выводить все на страницу - я не могу это применить на практике. Однако, я скоро это исправлю.
>> Почему-то здесь код крашиться, если использвовать throw new Exception(" - They Die ~((‡> <br>"); >Как именн крашится? В чем это проявляется? Непойманное исключение как раз и завершает программу. Также, у тебя плохое сообщение об ошибке так как оно не пишет никаких подробностей, например кто именно умер. Окей, я понял что нужно самому разобраться с ошибкой. Я могу сделать это. Только это возможно как я все выведу это на страницу. Завтра буду изучать HTML\CSS. Хотя, может быть, мне будет лень и я выведу все с помощью таблицы (◠‿◠)
> А разве свойство property не будет равно последнему изменению?
Я имел в виду со свойствами надо будет искать и заменять везде код вида
$x = $y->property;
на
$x = 2 × $y->property;
Это надо делать по всему коду и многократно.
А в случае с методом тебе достаточно поменять метод то есть
public function getProperty() { return 2 × $this->property; }
Аналогично когда идет запись в свойство. Допустим мы хотим запретить записывать в property отрицательные числа. В случае инкапусляции нам достаточно это сделать в методе setProperty(). В случае если у нас прямой доступ к полю, мы должны найти обращения к нему по всему коду и исправить, а также как-то исправить код, работающий с этим свойством, который напишут в будущем другие разработчики (как?).
>>550719 Комментарий к коммиту описывает, какие изменения вносит данный коммит. Например "Добавляет в класс MyClass метод someMethod, который делает что-то там".
> А как правильно писать описание к коммитам? Просто написать что изменено, например:
Исправлен баг с выходом кошки за границу поля
Или:
Добавлена возможность создавать любое число животных, а не только 1 кошку и мышку.
Не пиши «отредактировал файл x» так как список файлов легко получить из гита.
Если у тебя используется баг-трекер (программа учета багов) то стоит в коммите писать номер бага который он исправляет.
Если в проекте никогда не будет иностранных разработчиков, можно писать текст коммита на русском, если будут, то на английском.
Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка:
> А как узнать какие вещи обязательные? Я бы все их сделал такими.
Ну представь что с твоим кодом будет работать другой человек и его задача например добавить новое животное. Понятно что для этого надо унаследовать Animal. А какие методы обязан реализовть новый разработчик? Их и надо сделать абстрактными.
Ну например если ты хочешь чтобы разработчик был обязан задать букву для обозначения животного, можно сделать абстрактный метод getIcon().
Если у любого животного должен быть метод move можно сделать его абстрактным. С другой стороны, можно сделать по другому - предоставить в Animal реализацию по умолчанию, а разработчик при желании может ее переопределить. То есть ты этим как бы задаешь правила использования твоего класса. И хорошее знание ООП подразумевает что ты умеешь задавать эти правила средствами языка (через abstract, private/protected/public, final, тайп хинты, интерфейсы).
Только без фанатизма. Если у тебя десятки абстрактных методов это говорит о том что класс спроектирован плохо.
> Наверно это нужно объединить в один класс с указанием в какую сторону нужно сортировать? А зачем указывать в какую? Ты хочешь выбирать не только наилучший но и наихудший ход? Для чего?
>>550733 О, теперь еще по полчаса ломать голову, какое имя дать каждому коммиту. Я вот только что добавил ридми. И как мне назвать коммит, если нельзя писать "добавлен ридми"?
Нет. Идея как раз что можно создавать любое число объектов одного класса, у них одинаковый набор свойств, а вот их значения могут быть разные.
Ну если провести аналогию с играми то класс это как тип воина, у тебя может быть 100 каких-нибудь всадников (100 объектов 1 класса), но при этом какие-то свойства у них разные (например координаты, оставшиеся HP, опыт).
Наследование исопльзуется когда ты хочешь создать новый класс не с нуля а расширив существующий.
>>550759 Дампы (схема и собственно дамп) лежат в папке protected/data, которая вроде бы для этого предназначена в yii. Чтобы развернуть базу, нужно выполнить mysql -uuser -ppassword < schema.mysql.sql для получения схемы базы, или mysql -uuser -ppassword < classifieds.sql для наполнения. Не забыл, а не счел нужным. Кто-то может не знать, как залить дамп?
Конфиги никакие менять не нужно. Название базы 'classifieds' и прочие настройки можно поменять как обычно в config/database.php 'connectionString' => 'mysql:host=localhost;dbname=classifieds'
>>550765 Да, поэтому и не знал куда ее положить, там ведь и js и css. Наверное лучше в js.
Скажи пару слов о сфинкс, что это вообще? "Поисковый движок" мне мало о чем говорит. Это отдельное программное обеспечение, или расширение для php или mysql? Как он работает с базой, напрямую или взаимодействует с mysql?
В оф.доках много букв, я это буду два дня читать. http://sphinxsearch.com/docs/current.html Твою статью видел, но там только об установке и настройке, а я не хочу что-то устанавливать, не понимая что это.
> Не забыл, а не счел нужным. Кто-то может не знать, как залить дамп? Анон, поставь себя на мое место. Я твой проект если и видел то ничего не вспомню так как я тонны кода каждую неделю просматриваю. Мне удобнее когда все перечислено в ридми и я могу если что сказать «я все сделал, не запускается», а не рыться по всем папкам и искать несчастный дамп.
Конкретные команды можно не писать, просто напиши «пропиши доступы к базе в этот конфиг, загрузи дамп из такого-то файла и прогони миграции»
А твой пост может потеряться к тому моменту как я дойду до проверки.
Это отдельный поисковый демон который загружает данные из базы (либо ты закачиваешь их в него через xmlpipe или SQL запросы) и после этого позволяет быстро и эффективно по этим данным делать поиск. У него куча настроек.
> Это отдельное программное обеспечение, отдельный демон (процесс работающий в фоновом режиме) + библиотека для PHP чтобы слать запросы, причем подсоединиться можно и без нее, используя MySQL совместимый интерфейс через PDO например.
> Как он работает с базой, напрямую или взаимодействует с mysql? Умеет подсоединяться и выполнять прописанные в конфиге запросы как клиент. Также, ты можешь подсоединяться к нему и заливать данные через xmlpipe или SQL запросы (он совместим с mysql клиентом).
> В оф.доках много букв, я это буду два дня читать Это часть деятельности программиста, чтение мануалов, привыкай.
Yii-шники, подскажите, как удалить встроенную в Yii 2 Basic Project Template модель User? Хочу свою модель с таким же названием создать через Gii, а там уже есть модель с таким названием. Если просто удалить дефолтную модель, то сайт валится с ошибкой, указывая на разные ссылки на эту модель из папки /vendor/.
>>550835 Не знаю, я работал только с первой версией. Смотри руководство, там это должно быть описано. Наверное, модель нужно просто унаследовать от той что поставляется с фреймворком.
Я правильно понимаю, что асбтрактная функция в асбтрактном классе отличается от обычной функции в абстрактном классе тем, что абстрактная наследуется другими экземплярами класса, которые наследуют абстрактный класса?
>>550850 http://php.net/manual/ru/language.oop5.abstract.php Абстрактный метод отличается тем, что не имеет тела и должен быть определен в классе-наследнике. Следовательно, класс имеющий хотя бы один абстрактный метод, должен быть объявлен как абстрактный, и от него нельзя создавать экземпляры.
>абстрактная наследуется другими экземплярами класса Наследуются абсолютно все методы (кроме приватных, естественно). Но абстрактный метод обязан быть реализован в классе-наследнике.
Там кстати говорится о том, что индекс обязан быть unsigned integer, в твоей статье этого нет. Хорошая документация, только слишком многословная. 400 страниц, мама дорогая.
так ты читай не все подряд а только первые главы где описывается общий принцип работы (какие там есть индексы, как оно настраивается) и только те опции которые тебе нужны.
Ну и если что задавай вопросы.
> индекс обязан быть unsigned integer Ты что-то путаешь. Может это идентификатор должен быть таким? Или целые аттрибуты?
JavaScript, не бейте за него, от макета еще синяки не прошли.
Помогите с задачкой. Не могу чего-то додумать как поставить алерт (-1) чтобы не на каждом ходу делался, а после окончания цикла. Да и в остальном, наверное, ошибка.
Не могу сообразить с mod_rewrite. На данный момент есть: http://pastebin.com/qn1jJYMS Если в урл попадает точка либо любой другой спец символ апач отдает 404, а надо чтобы обрабатывал. Так же, пробовал добавлять а-Я и т.д. для поддержки русских переменных, то апач отдает крякозябры. UTF-8 прописана в хедерах скрипта и в .htaccess.
> «Как вы бы стали искать английские слова, которые устарели между 16 и 17 веками? Вы можете пользоваться поисковой системой» (собеседование на позицию разработчика).
По моему, хороший вопрос так как он позволяет проверить кто перед нами: кодер который умеет повторять то что видел в видеоуроках, близорукий программист который не видит ничего кроме кода и заумных паттернов проектирования или самостоятельный разработчик, который умеет решать задачи наиболее эффективным образом и использовать код как инструмент.
я думаю, там требовалось найти слова которые употреблялись в допустим 15 веке но которые вышли из употребления к 17 веку. Твой словарь поссылке содержит в том числе слова которые и сейчас используются. «древнеанглийский язык» это не решение задачи.
>>551055 Но я знаю те слова, которые используются сейчас. Следовательно незнакомые мне слова будут являться устаревшими и вышедшими из употребления. Если нужно небольшое кол-во, то просмотрю вручную и выберу десяток-два. Если больше сотни, имеет смысл спарсить старинный словарь, спарсить современный словарь, а затем вычислить дельту, то есть расхождение между первым и вторым.
>>550736 Ну например для кошки нужна координата поближе к мышкам, а для мышки наоборот - подальше от них. Балы хода высчитываются же из расстояния от искомых животных.
>>550719 Когда мы принтуем какое либо Животное, из-за ссылки в нем на Мир, происходит бесконечная рекурсия: Животное которое содержит Мир, который содержит Животных, которые содержат Мир, который содержит Животных, которые ...
С этим все нормально? print_r помечает эти рекурсии.
>>550731 >Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка: А можно я хотя бы сейчас буду писать несколько изменений одним коммитом? У меня просто очень много ошибок которые как снежный ком вытекают друг за другом, и мне хочется их исправить все за один присест.
>>550719 Уф, тогда придется писать метод rateMoves() для каждого животного. Сделаю.
>>550734 Хм, давай я попробую разобраться на конкретном примере:
Допустим в моем классе Животное есть функция searchAnimalsAroundByType(...), которая будет полезна для любого типа животных и переопределять её нет смысла, и есть функция move(), которая для каждого типа животного должна быть своя. Значит мне нужно будет написать в классе Животного так:
public function searchAnimalsAroundByType(...) { //do something }
> из-за ссылки в нем на Мир, происходит бесконечная рекурсия: Это нормально, просто функция вывода на печать должна уметь обнаруживать такие вещи.
> С этим все нормально? Да
> А можно я хотя бы сейчас буду писать несколько изменений одним коммитом? У меня просто очень много ошибок которые как снежный ком вытекают друг за другом, и мне хочется их исправить все за один присест. Можно
> Значит мне нужно будет написать в классе Животного так: > public function searchAnimalsAroundByType(...) > { //do something > } Нет. Какой смысл добавлять функцию которая ничего не делает? Не добавляй ее в базовый класс вообще тогда, а если добавляешь то добавляй конкретный код.
Уточнение. Пустую функцию добавлять в общем можно, но в твоем случае ожидается что функция что-то вернет через return потому совсем пустую функцию добавить нельзя. Ну или надо там написать return []; хотя какой в ней тогда смысл. непонятно.
Обычно пустые функции это функции-обработчики каких-то событий, которые по умолчанию ничего не делают но которые можно переопределить при наследовании.
Что думаете по поводу шаблона Singleton? Насколько уместно создавать объект через getInstance? Алсо, ничего, если пхп - первый язык, который изучаешь? На хабре пишут, что это ухудшает код. И насколько важно знание матана? Всякие там катангенсы углы степени и сложные вычисления?
>>551188 Что такое "антипаттерн", и почему не использовать? Чем тогда заменить? Ведь синглтон хорошо справляется со своей задачей: не допустить создание множества экземпляров одного и того же объекта.
>>551176 >>551179 >Нет. Какой смысл добавлять функцию которая ничего не делает? Не добавляй ее в базовый класс вообще тогда, а если добавляешь то добавляй конкретный код. Ну так она делает что-то. Я просто для сокращения написал так. В ней есть код.
А ты урок про DI читал? Использование синглтона сильно связывает код (так же как создание объект на месте или использование статических методов) и не позволяет использовать внедрение зависимостей, не позволяет нам передать какой-то другой объект вместо того что прописан в коде, не позволяет поменять его настройки.
А чтобы не допустить создания множества объектов достаточно просто создавать их только в одном месте, а не по всему коду. Ну а в фреймворках обычно есть DI контейнеры которые решают эту задачу.
Конечно тема DI сложна для начинающего, если бы ты дошел хотя бы до задачи про список студентов, мы бы могли на ее конкретном примере разобраться как там можно реализовать DI.
Можно ли в задаче про вектор создавать класс под каждую специальность/ранг, т.е. три ранга инженеров, три ранга маркетологов и три аналитиков? Вижу, что это неправильно, потому что рангов и специальностей может быть больше чем по 3, но не понимаю, как тогда решить.
>>551209 >просто создавать их только в одном месте ясно >если бы ты дошел хотя бы до задачи про список студентов Я делал задачу про студентов и файлообменник.
Ну вот там как раз и есть внедрение зависимостей когда ты в маппер передаешь объект PDO:
$pdo = new PDO(...); ... $studentMapper = new StudentMapper($pdo);
Ну а в файлообменнике мы используем реализацию синглтонов Слима чтобы создавать нужные объекты.
В фреймворкх вроде Симфони 2 есть DI контейнер, через который создаются нужные объекты.
Вот примерно так и надо делать.
Ну и странно конечно что ты делаешь Вектор после студентов, это же задача про основы ООП.
> Можно ли в задаче про вектор создавать класс под каждую специальность/ранг, А смысл под каждый ранг? Под разные специальности мы создаем так как они сильно различаются, ну и то это вопрос, надо ли создавать разные классы. Как например ранг повышать в твоем случае?
Надо либо класс на профессию либо вообще один класс.
>>551214 >в файлообменнике мы используем реализацию синглтонов Слима Зачем, если ты говоришь, что их нельзя использовать?
Ну и как тогда хранить коэффициенты для рангов? Я вижу только возможность либо хранить их массивом [1=>1, 2=>1.25, 3=>1.5], либо вообще зашить в коде без возможности изменить, что не выход.
Задание 6 - пофиксил. https://jsfiddle.net/ysvo6hrr/5/ >>551044 Какие факторы влияют на решение "задачи"? Что это за задача - не важно. Очевидно, знание о проблеме в первую очередь, так же видение этой проблемы, размышление над ней. Окей, если не какой рефлексии над проблемой совершено не было, пусть человек попробует сделать это прямо сейчас. Какова вероятность, что он сориентируется и найдет решение? И можем ли говорить о его эффективности при решении задач, основываясь на результате единичной попытки. В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании. Существуют ли границы познания и как оно происходит? Как происходит ориентировка в образе проблемы? Есть целый ряд наук, которые занимаются этим вопросом, подходя к нему с разных сторон. Все мною сказанное можно сократить до одной фразы: hr - очередной долбоеб.
Потому что «синглтоны» Слима это не Class::getInstance(), который мешает делать DI и является антипаттерном. Ну анончик, ну прочитай пожалуйста урок про DI если хочешь понять что плохого в синглтонах.
> Ну и как тогда хранить коэффициенты для рангов? в коде.
Функция посчитать зарплату() { если ранг == 2 берем базовую ставку и умножаем на 1.5 .... }
> либо вообще зашить в коде без возможности изменить, что не выход. Вполне даже выход. Ну если хочешь можешь сделать массив.
> В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании. Подозреваю что как раз имеет. Они хотят не такого программиста который зациклен на паттернах проектирования и которому надо описать алгоритм решения задачи, а такого которого например можно попросить (условно говоря) «определи-ка главные факторы которые влияют на время подачи такси», он залезет в базу и определит. При этом математическая точность не нужна, некоторя погрешность допустима.
Этому можно научиться. Если ты начинающий то тебе конечно надо пока сконцетрироваться на изучении особенностей языков программирования и концепциях вроде ООП, но если ты хочешь расти дальше, то надо именно учиться решать задачи.
Ну а что касается знания предметной области, ну если ты идешь работать в Убер наверно ты должен понимать что это за компания, как организован их бизнес и тд.
Потому что «синглтоны» Слима это не Class::getInstance(), который мешает делать DI и является антипаттерном. Ну анончик, ну прочитай пожалуйста урок про DI если хочешь понять что плохого в синглтонах.
> Ну и как тогда хранить коэффициенты для рангов? в коде.
Функция посчитать зарплату() { если ранг == 2 берем базовую ставку и умножаем на 1.5 .... }
> либо вообще зашить в коде без возможности изменить, что не выход. Вполне даже выход. Ну если хочешь можешь сделать массив.
> В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании. Подозреваю что как раз имеет. Они хотят не такого программиста который зациклен на паттернах проектирования и которому надо описать алгоритм решения задачи, а такого которого например можно попросить (условно говоря) «определи-ка главные факторы которые влияют на время подачи такси», он залезет в базу и определит. При этом математическая точность не нужна, некоторя погрешность допустима.
Этому можно научиться. Если ты начинающий то тебе конечно надо пока сконцетрироваться на изучении особенностей языков программирования и концепциях вроде ООП, но если ты хочешь расти дальше, то надо именно учиться решать задачи.
Ну а что касается знания предметной области, ну если ты идешь работать в Убер наверно ты должен понимать что это за компания, как организован их бизнес и тд.
>>551244 > Ну и как тогда хранить коэффициенты для рангов? > в коде. > либо вообще зашить в коде без возможности изменить, что не выход. > Вполне даже выход. Ну если хочешь можешь сделать массив. Не верю своим глазам. Ну ладно, сделаю сначала так, но по-моему это как раз неприемлемо: если второму рангу повысят ставку с 25 до 30 процентов, бегать поиском по коду и искать этот коэффициент? Хорошо, сделаю пока хоть так, но это никуда не годится.
Задача про сайт студентов простая как валенок или гостевая книга, а проектирование сложной архитектуры как раз высший пилотаж, не знаю что у тебя вызывает удивление.
> Задача про сайт студентов простая как валенок или гостевая книга, даже удивительно. А ты код показывал на проверку? Ее никто еще с первого раза без замечаний не сделал.
Посоветуйте какой-нибудь годной литературы по архитектуре веб приложений чтобы повысить свой скилл. Имею 2 года опыта и чувствую что стою на месте и навык не растет в последнее время.
>>551254 Полгода назад, уже не помню. Твои замечания можно исправлять бесконечно. Это не тот случай, где нужно вылизывать код.
А вот это тот случай. Говно какое-то. http://ideone.com/E4ILEM Написал как мог, знаю что это неправильно, но не знаю как исправить. Я если честно не понимаю твою технику преподавания: дать сложную задачу и решай как хочешь. Приходится со стыдом постить явную хуйню, лишь бы хоть что-то. Затем ты пишешь простыню с мутными замечаниями, которые тоже хуй знает как исправлять. Почему сразу не показать несколько примеров? И я говорю не о готовом решении стандартной задачи, а примеры построения алгоритмов решения нестандартных заданий. Как рассуждать, чем руководствоваться, потому что без этого бесполезно, приходится брать терпением, теряя огромное количество времени.
Анон, помоги. Открой эту ущербную страницу. http://s-u-r.ru/video/rasstrel-imac-5k-iz-protivotankovoy-pushki/ Видишь какой же большой тут видос с ютуба? И какое бы разрешение не поставил, он таким и останется. Как пофиксить, чтобы я задавал разрешение? А не шаблон вордпресса диктовал свои правила.
Задачи я даю потому, что подробный урок с объяснениями никто пока не написал и лучше иметь хоть что-то (задачу, полностью решив которую со всеми моими замечаниями можно чему-то научиться) чем вообще ничего.
Ты говоришь что замечания можно исправлять бесконечно, но есть люди которые с ними со всеми разобрались.
Возможно тут есть непонимание. Возможно ты подумал что главное написать приложение которое соответствует описанию, а какой в нем код это не важно. Но это не так. Мы делаем задачу на файлообменник не для того чтобы иметь возможность пересылать файлы.
Цель этих 2 задач, про студентов и файлообменник, это научиться тем вещам которые используются в реальных приложениях (MVC, шаблоны, работа с формами, с БД. уязвимости, микрофреймворки). К задаче даны комментарии + если что-то не так, я пишу что именно не так и что надо исправить.
По поводу задачи на Вектор. Это задача не на архитектуру, а на знание ООП, то есть на знание языка PHP (ООП это часть языка). От тебя требуется лишь определить какие в задаче должны быть классы, поля, методы.
---------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент) — какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо. — что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег. — как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.
Теперь посмотрим на твой код. Ты спроектировал код так, что например, если мы поменяем сотруднику ранг, его зарплата никак не изменится. Это надо поменять. Также держи вторую часть задачи. Эту вторую часть я даю всем, чтобы проверить насколько гибок их код, насколько его просто менять под требования заказчика. Если код спроектирован правильно то вторая часть решается легко и быстро.
------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
------------
> Затем ты пишешь простыню с мутными замечаниями, которые тоже хуй знает как исправлят Я не знаю какой у тебя уровень знаний. Если тебе что-то непонятно, можно что-то переспросить. У меня нет цели запутать.
Вдобавок, у нас есть люди которые пропускают задачи, они думают что последняя задача, самая сложная и охватывает все темы и достаточно решить только ее. Это разумеется не так, пропуская задачи они не получают важные знания, и в итоге вообще ничего не решают. Таким людям я советую вернуться и решить сначала предыдущие задачи.
Еще замечания по твоему коду:
В ООП если у ты меняешь свойство (например ранг), от которого зависят другие, то они должны пересчитываться. лучший способ решить эту проблему это заменить такие зависящие от других свойства на методы. Например вместо свойства зарплата сделать метод ее вычисления.
> switch ($profession) { > case 'manager': Это магические строки, их надо заменить на константы класса. Константы делают код понятнее и защищают от опечаток.
> default: exit("Profession \"$profession\" not found."); В мире ООП для этого используют исключения: default: exit("Profession \"$profession\" not found.");
> $report->salary += $employee[0]->salary * $employee[1]; Во-первых, [0] абсолютно нечитаемо, что значит 0? Как догадаться? как минимум надо тут исплоьзовать строку а не число в качестве индекса.
Также, это неудачная схема. Как в твоей схеме поменять зарплату только одному работнику? Ты как-то все переусложнил, лучше сделать по-простому, то есть в департаменте сделать массив объектов работников и если там работает 10 менеджеров то создать и положить туда 10 объектов.
Еще ошибка в том что ты один объект кладешь в несколько департаментов. Ну сам подумай, где тут логика? Один работник работает и там и там одновременно? Нет, там разные работники значит нужны разные объекты потому что иначе мы например не сможем их независимо повышать или наказывать.
Далее, я могу смириться с публичными свойствами вроде ранга, но массив работников сложной структуры не должен быть публичными. Ибо это пости 100% вероятность что в него запишут что-нибудь не то. Должны быть методы добавления и увольнения работников, а сам массив надо сделать приватным.
Класс Report имеет очень абстрактное название, кажется что это класс для любых видов отчетов. Но на самом деле, он используется только для отчета по работникам потому логичнее его назвать EmployeeReport.
Еще мне кажется, компания тут это отдельная сущность, почему бы и для нее класс не сделать?
Ну и еще мелочь, таблица у тебя какая-то перекошенная, надо будет над ней поработать, там вроде в примечании к задаче написано как это делать.
Анон, а ты HTML/CSS изучил? Отладчиком в браузере умеешь пользоваться? Если нет, то придется сначала изучить, а потом вернуться к интересующей тебя проблеме.
Если да, то давай конкретные подробности как сверстан блок и какие свойства ведут себя не так, как должны.
>>551340 >если там работает 10 менеджеров то создать и положить туда 10 объектов А если 173? Создавать 173 экземпляра объекта? Нет, мне кажется, департаменты должны заполняться работниками в конструкторе в зависимости от переданного конфига.
Ну хорошо, я подумаю, ты натолкнул меня на некоторые мысли.
>>551347 Мне надоело быть начинающим, уже почти год я этим маюсь.
Да, 173, а почему нет? Если это действительно разные люди, у них разный опыт, разный график работы, ухода в отпуск и тд. Если бы они были одинаковые, может быть и можно было бы как-то хранить только количество и профессию, а для расчета сделать отдельные функции.
Вообще проще всего делать 1 работник = 1 объект. Ты пытаешься это оптимизировать и переусложнить, хотя такого требования нет. И вторую часть задачи с твоим подходом не реализовать.
Надо чтобы твои примечания работали в любом тексте а не только содержащем p. Также не очень понял зачем margin-top на первом элементе? Ты пытаешься компенсировать margin-top у p? А что если после примечания идет не p, а h1-h6? Элемент без маргин-топа? Гм, хороший вопрос я придумал, как же это сделать правильно.
Прочитай также комментарий к задаче (или может он в другой задаче) про маргины и паддинги.
> } else { > ($anonSum < $compSum); Что это значит? Это не идет после if и потому ни на что не влияет, зачем тогда писать? Такое выражение, результат которого не используется, PHP просто посчитает и выбросит результат. Ну то есть он сравнит числа и выбросит результат так как ты его не сохранил никуда и не использовал вместе с if
else не требует условия так как это «иначе», он выполняется если ни одно из условий в if/elseif не сработало.
> if (($anonDice1 == $compDice1) && ($anonDice2 == $compDice2)) { Немного непраивльно, дабл это когда у одного участника 2 одинаковых числа
> 2) Рулетка Ок, верно
> 3) Про рост анона Правильно
> 4) Вопрос и варианты ответа (массивы) Ок, все хорошо
> 5) Шифровка и дешифровка (там, кстати, я так и не понял, как использовать array_flip, поясните плиз) > Как это использовать? Подумай, вообще ты не обязан это использовать и можешь сделать по-своему
> Почему выдает Array? Потому что в $code хранится массив, а echo не позволяет выводить массивы, оно выводит только строки и числа. Чтобы вывести содержимое массива, напиши цикл или var_dump($code);
Шифрование — ок, а вот расшифровку надо доделать.
> 6) Генератор стихов (почему-то иногда пропадают некоторые слова) > mt_rand(1, count($word1) Индексы в массиве начинаются с нуля а не единицы
Обрати внимание, по этой же причине там ошибка:
> PHP Notice: Undefined offset: 4 in /home/9A6BwE/prog.php on line 20
У тебя иногда выпадает слишком большой индекс которого нет в массиве.
> 7) Айпад и кредит > $totalAmount += ... > $creditSum -= ... Это повторяется 2 раза. Попробуй избавиться от повторения. После этого попробуй избавиться от if, заменив его на max или min.
> Если в урл попадает точка либо любой другой спец символ апач отдает 404, а надо чтобы обрабатывал. Ну так в твоей регулярке нет ни точки ни какого-то другого спецсимвола
> Так же, пробовал добавлять а-Я Так нельзя, нет гарантии что большие буквы идут после маленьких, надо писать а-яёА-ЯЁ (ё идет отдельно от алфавита).
> то апач отдает крякозябры Не понял, опиши подробнее что происходит.
И кстати, я не понял зачем у тебя там регулярка? Почему бы просто любые обращения которые не соответствуют файлам, не перенаправить на index.php? Опиши подробнее постановку задачи.
> Следовательно незнакомые мне слова будут являться устаревшими Нет. Ты вряд ли наизусть знаешь все современные слова так как разговорный запас человека ограничен.
> то просмотрю вручную и выберу десяток-два. Это неправильно и неэффективно
> Если больше сотни, имеет смысл спарсить старинный словарь, спарсить современный словарь, а затем вычислить дельту, то есть расхождение между первым и вторым. Я думаю надо вычислить дельту между словарем 15 и 18 веков.Это скорее всего и есть правильный ответ. И разумеется вручную делать это долго и неэффективно.
Я заметил что у тебя нет модели поля (то есть например массива с информацией о состоянии ячеек), а ты хранишь все в DOM. В простых случаях это упрощает код, но в более сложных делает его запутаннее, и сложность этой задачи приближается к тому моменту когда модель становится нужна.
Также, стоит вынести все стили в CSS а в JS коде работать только с классами.
Также, получение элементов (getElementBy...) стоит вынести из кода отдельно.
> table { А это не помешает если мы на страницу какую-то другую таблицу захотим добавить, например таблицу рекордов? Я думаю, хоть тут и нет дру.....
Аноны, кто умеет нормально 4-100500 байтовые кодировки в мускул засовывать. Мне надо смайлик тенниса из ВК запихать в базу. В принципе похуй на смайлик, но сука текст иногда обрезается из-за всякой хуйни и из похапэ не сравнить вот так: == Ща юзаю utf8md4 или хуй знает что с сотней костылей. Что делать блять? Инглиш непонимаю, русичи, помогите бля
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Почему 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.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:
Подскажи сайты для поиска работы, я не умею гуглить? brainstorage.me, geekjob.ru, hh.ru
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.