Это копия, сохраненная 14 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>629822 (OP) (почти 1000 постов!)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам 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
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175 и получи личную немного устаревшую копию сайта
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Подскажи сайты для поиска работы, я не умею гуглить? — hh.ru, geekjob.ru, moikrug.ru (склеен с brainstorage.me), fl.ru, upwork.com (бывший одеск). Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.
Не придирайся к знанию английского языка, анон пишет как умеет.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
Написать препроцессор, который будет вставлять $ за тебя.
Это вопрос?
Если коротко, то большинство не использует, потому что лень.
Но если стремишься попасть в хорошую контору, то таки используют активнейшим образом.
http://www.phpclasses.org/blog/post/237-7-Reasons-Why-TDD-Failed-to-become-Mainstream.html
Ну и дальше google.com:php test driven development
Это же мой кот, лол.
Добрый день! Мое имя - Сергей, мне 26 лет. "Cижу" я на php, наверно, уже полтора-два года.
Сначала (в первый раз) меня уговорил попробовать php мой шеф. Мы были на работе, в офисе, и говорили о Web-технологиях, как вдруг он сказал, что нужно отредактировать простой php-скрипт: "Я знаю, у тебя получится!".
Сначала я, конечно, был против - "Это же PHP!", я, естественно, был в курсе о слухах, ходивших про него, ОЧЕНЬ МНОГО нехороших слухов. Я предлагал нанять программиста на стороне, но начальник был непреклонен.
Я знал, что php вызывает привыкание - зависимость, если хотите.
Шеф был настойчив и приводил неопровержимые аргументы. Он сказал, что в нашей жизни необходимо попробовать все, и я под влиянием согласился. Скрипт с виду мне показался совсем не опасным, и я попробовал...
Это был шаг в бездну...
Ощущения от внесения правок в безвредный php-скрипт невозможно передать!
Ты ощущаешь безграничную власть и эйфорию, ты можешь выполнять любые преобразования над переменной и приводить ее к любому типу, ты можешь выводить ее в любом виде... Ты можешь использовать функции, массивы, классы... И даже ООП...
Такое ощущение, что тебе УЖЕ подвластен весь веб, а ведь ты даже еще толком не знаешь тонкостей употребления php...
После этого я сознательно пробовал php еще несколько раз... И с каждым разом мне становилось все хуже. Php затягивал меня. Я украдкой читал форумы про него. Сделал пару сайтов.
Через полгода я понял, что уже не могу остановиться.
По прошествии совсем небольшого периода времени, используя php, я написал свою первую функцию геолокации. Конечно уже только в настоящее время я понял, каким опасным и непредсказуемым было это решение, но в то время я совсем этого не осознавал, ведь php мне очень нравился.
Я и не успел понять, как следом за первой реализованной на сайте функцией, меня затягивало дальше. И это "дальше" было все хуже и хуже. На этом этапе я осмелился попробовать нечто потяжелее - попробовал мой первый фреймворк.
Ооооо, это были непередаваемые ощущения... К сожалению, одновременно с этим - это был путь вниз, из которого не выбраться.
На то время родные уже потеряли надежду мне помочь, а моя любимая нашла учебник по php...
И чуть не рассталась со мной. Я пообещал ей завязать.
С каждым днем я все дальше и дальше отдаляюсь от родственников и близких. Я сижу на форумах php-разработчиков и обсуждаю с ними свои проблемы.
А иногда... Мне стыдно об этом говорить....
Мы списываемся по скайпу и вместе программируем. На php.
Моя любимая женщина это видит. Мы много раз с ней говорили на эту тему. "Или я или PHP..." - говорит она.
Я пишу скрипты пока она спит. Я зависим от php...
Даже кот пытается побороть эту зависимость во мне...
Но я не могу... Это сильнее меня... Помогите...
Это же мой кот, лол.
Добрый день! Мое имя - Сергей, мне 26 лет. "Cижу" я на php, наверно, уже полтора-два года.
Сначала (в первый раз) меня уговорил попробовать php мой шеф. Мы были на работе, в офисе, и говорили о Web-технологиях, как вдруг он сказал, что нужно отредактировать простой php-скрипт: "Я знаю, у тебя получится!".
Сначала я, конечно, был против - "Это же PHP!", я, естественно, был в курсе о слухах, ходивших про него, ОЧЕНЬ МНОГО нехороших слухов. Я предлагал нанять программиста на стороне, но начальник был непреклонен.
Я знал, что php вызывает привыкание - зависимость, если хотите.
Шеф был настойчив и приводил неопровержимые аргументы. Он сказал, что в нашей жизни необходимо попробовать все, и я под влиянием согласился. Скрипт с виду мне показался совсем не опасным, и я попробовал...
Это был шаг в бездну...
Ощущения от внесения правок в безвредный php-скрипт невозможно передать!
Ты ощущаешь безграничную власть и эйфорию, ты можешь выполнять любые преобразования над переменной и приводить ее к любому типу, ты можешь выводить ее в любом виде... Ты можешь использовать функции, массивы, классы... И даже ООП...
Такое ощущение, что тебе УЖЕ подвластен весь веб, а ведь ты даже еще толком не знаешь тонкостей употребления php...
После этого я сознательно пробовал php еще несколько раз... И с каждым разом мне становилось все хуже. Php затягивал меня. Я украдкой читал форумы про него. Сделал пару сайтов.
Через полгода я понял, что уже не могу остановиться.
По прошествии совсем небольшого периода времени, используя php, я написал свою первую функцию геолокации. Конечно уже только в настоящее время я понял, каким опасным и непредсказуемым было это решение, но в то время я совсем этого не осознавал, ведь php мне очень нравился.
Я и не успел понять, как следом за первой реализованной на сайте функцией, меня затягивало дальше. И это "дальше" было все хуже и хуже. На этом этапе я осмелился попробовать нечто потяжелее - попробовал мой первый фреймворк.
Ооооо, это были непередаваемые ощущения... К сожалению, одновременно с этим - это был путь вниз, из которого не выбраться.
На то время родные уже потеряли надежду мне помочь, а моя любимая нашла учебник по php...
И чуть не рассталась со мной. Я пообещал ей завязать.
С каждым днем я все дальше и дальше отдаляюсь от родственников и близких. Я сижу на форумах php-разработчиков и обсуждаю с ними свои проблемы.
А иногда... Мне стыдно об этом говорить....
Мы списываемся по скайпу и вместе программируем. На php.
Моя любимая женщина это видит. Мы много раз с ней говорили на эту тему. "Или я или PHP..." - говорит она.
Я пишу скрипты пока она спит. Я зависим от php...
Даже кот пытается побороть эту зависимость во мне...
Но я не могу... Это сильнее меня... Помогите...
Задача 1: https://jsfiddle.net/5bzh0qbz/
Задача 2: https://jsfiddle.net/cc92hueh/
Задача 3: https://jsfiddle.net/2xkms9a5/
Задача 4: https://jsfiddle.net/09hbdraq/
Задача 5: https://jsfiddle.net/kqk41sea/
Задача 6: https://jsfiddle.net/m5yrao5k/
Задача 7: https://jsfiddle.net/xh763seo/
Задача 11: https://jsfiddle.net/0Lvxs3yu/
http://ideone.com/EzCByL
Точнее поясните, => используется для того, чтобы обьявить значение ключа в массиве?
да. И не только.
1. когда ты самолично объявляешь ключи в массиве. (как ты и сказал)
2. когда ты в цикле foreach как аргумент хочешь использовать ключ массива наравне со значением.
Ну а вдруг просто рассматривается сам ключ, типо по имени. Ну хотя да, глупо предположил.
Сам недоумеваю, вместе с php идут JS, HTML, CSS, MySQL и это такой вагон информации, что я лично начинаю думать, что мне не осилить всего
>>639261
К слову, html & css это разметка, не так уж и тяжело.
JavaScript да, но если собираешься быть backend-разработчиком то не думаю что надо прям все тонкости знать.
Ну и MySQL как я слышал не очень тяжел.
>Хочу задать вопрос - как определять, стоит ли впихать php в html или создавать .php и внутри него писать html?
Вообще желательно чтобы логика была в одном файле, а шаблоны в другом. Ну и очевидно что в таком случае логика работы будет подключать шаблоны по необходимости.
В /pr/, по моему, вообще все языки обсирают.
И вообще чувствую большую дыру между учебником ОПа и задачей на студентов/файлообменник. Как вы через неё перешагиваете?
Вот, MySQL с самого начала.
https://www.khanacademy.org/computing/computer-programming/sql?ref=resume_learning
Спасибо
http://sqlfiddle.com/#!9/ee13f2/2
Полгода назад решал ее два дня, теперь справился "всего" за сорок минут.
Опередил, содомит.
Проверь настройки кеширования в своей определенной cms.
Также заметил, что можно спокойно придумать свой тег типа <pidor> и спокойно использовать его, присваивая ему class или style. Если тестить в редакторе, то всё работает, но почему так никто не делает?
Спасибо. Есть несколько непонятных моментов.
> error_reporting отвечает за игнорирование ошибок и предупреждений, и не очень понятно почему ты их хочешь игнорировать при отключенном дебаге?
Но здесь http://php.net/manual/en/function.error-reporting.php написано
> error_reporting — Sets which PHP errors are reported
и ниже в примерах:
> // Report all PHP errors
> error_reporting(-1);
Плюс, разве я не должен их игнорировать при отключенном дебаге? Чтобы на боевом сервере пользователю это всё не сыпалось в браузер?
> Также, лучше не использовать при формировании URL конструкции вроде {$_SERVER['SCRIPT_NAME']} - надежнее просто прописать конкретное название скрипта. Ведь лучше когда результат вызова функции возвращает один и тот же URL, а не надеется на то, что скрипт называется определенным образом.
Ничего не понял. Кто на что надеется?
Что если нам понадобится переименовать наш index.php? Менять названия руками?
Ещё говорят в Postgres'е нет unsigned типов.
Нужно сделать, чтобы 200 долларов можно было обменять на 6448 рублей. Не думаю, что ссылки на код тут помогут.
А зачем ты там вообще используешь error_reporting? Мне кажется легче было бы настроить интерпретатор так, чтобы он выводил все ошибки. А потом, кому надо смогут у себя выключить\включить ошибки в php.ini, без необходимости лезть в код.
>Нужно сделать, чтобы 200 долларов можно было обменять на 6448 рублей.
Ты что, дурак? Ну удачи тебе в поиске курса доллара на момент составления ОПом этой задачи.
Я помню когда-то похожие треды с похожими картинками в /b/ создавались. Это было года 3 - 4 назад.
Чтобы кому надо смогли у себя выключить\включить ошибки в config.php, без необходимости лезть в php.ini.
Нужно установить вишмастер.
>>639300
Какая-то странность с русской локализацией. Не удается добиться названия месяца в именительном падеже, упрямо возвращает родительный.
http://sqlfiddle.com/#!9/6a4b8c/1
update:
Таки удалось получить именительный, за счет установки украинской локали.
http://sqlfiddle.com/#!9/6a4b8c/2
Очень странно. Недоделанный перевод или перемога?
Пили кулстори, сколько прошел, что учил сам, конкретно ты столько учил до того, как пошел работать.
А еще размер члена, номер страховки и телефона.
>Нужно установить вишмастер.
Это не ты там шутил про курс доллара в одной из первых задач ОПа?
Двоих одним ударом
ДС не интересно, изи мод.
Почему отшил те компании?
Какое тестовое было?
Что было на собеседовании с дядьками в чОрных костюмах?
Какие у тебя были навыки кроме того, что выложил ОП?
Потому что битриксы.
Набросать архитектуру мини-приложения;
вытащить данные из таблицы с внешним ключом на собственное поле (которое является первичным ключом) и построить по ним древовидную иерархию в виде многомерного массива;
написать SQL-запрос.
Спрашивали, упарываю ли я вещества, есть ли судимость, есть ли тян и другие подобные вопросы.
>>639504
У php-джуниоров в ДС сейчас от 20 до 40 тысяч зарплаты.
Проверка номера телефона по пасте Опа.
мимо верстала, далек от PHP
http://php.net/manual/ru/regexp.reference.assertions.php
Скорее всего так, хотя я ни разу не пользовался данными фишками регулярных выражений:
"/(?<=flv-url=).*(?=;)/"
Либо просто используй подмаски.
Там модификаторы Ui на конце забыл, ну ты понел.
Не работает, братишь. Я с регулярками на Вы. Знаю самое простое ^[a-zA-Z]$ и т.п
Что значит "не включать", там какой-то текст должен быть между ними и именно он нужен?
Что означает ?<= в регулярках? И почему далее работает ?= с точкой с запятой?
Не нашел ответа в Гугле, не сталкивался с такой конструкцией раньше.
Я же скинул выше http://php.net/manual/ru/regexp.reference.assertions.php
Символы, идущие после (?<= должны предшествовать выражению, которое мы ищем, а после (?= должны идти после него.
echo "что-то ($n) еще что-то";
У меня круглые скобочки в результате тоже выводятся, а если без них, то норм всё.
що?
>Там фигурные скобки же должны быть?
Тоже не понимаю. Раньше вроде когда писал без фигурных скобок "$var", то выводилось $var, а теперь значение переменной. Что-то поменялось?
Так кроме ОПовских задач ещё какой-нибудь опыт был? Может, сайт свой запилил или ещё чего
Вообще да, тоже как-то решал задачу - заработало только после того, как в двойных кавычках поставил переменную в фигурные скобки.
Сейчас смотрю - вроде бы всё работает и без фигурных скобок, выводит значение переменной именно.
Это все равно, что спрашивать нужна ли физику математика, а то чёто лень производные с интегралами учить.
>Сейчас смотрю - вроде бы всё работает и без фигурных скобок, выводит значение переменной именно.
Тоже сейчас проверил на своем хосте и тоже самое! Мистика прям!
Версия 5.6.3
Годный ОП. Годный тред. Всем добра!
И тебе добра!
Господи, какой же уродливый язык, как вы на нем вообще пишете?
Потому что украинский здесь никто не понимает.
Потому что это максимум тупо не любить язык потому что тебе не нравиться синтаксис!!! Каждый язык заточен под свои задачи!
Ну тут ти правий, звичайно.
Ничего против пхп не имею, но синтаксис у него действительно хуёвый
Но не это не меняет уродливости синтаксиса, засраности глобального неймспейса и общей непродуманности внутренностей.
Лучше бы настоящих, их там много же.
Но ведь настоящие тян не нужны!
Уже и поговорить нельзя, да? Ну и все равно на этой доске треды спокойно доживают до тысячи постов.
Я не про в вебе, но мне кажется, что другим людям будет тяжело поддерживать код со всякими <pidor>ами
Всмысле не несут никакой смысловой нагрузки? У каждого тега есть свое назначение, можешь почитать об этом тут http://www.w3schools.com/tags/
Да в том-то и дело, что браузером эти теги показываются одинаково. Что article что p, что span или div. Они не имеют как такового различия
Считает правильно, но копипастишь, можно сделать лучше, вот эти строки
>}else{
> $monthlyPayment = $gg;
> $creditBalance=$gg - $monthlyPayment;
> $paymentTotal = $paymentTotal+$monthlyPayment;
>\techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
>}
можно сократить
>Считает правильно
Как же я рад это слышать. Как сократить подумаю завтра, 3 часа сегодня над ней просидел.
Ну молодец, домучил.
Но анон верно говорит про копипасту.
>$creditBalance = $creditBalance $percent+$servicePayment-$monthlyPayment;
>$gg=$creditBalance $percent + $servicePayment;
>$creditBalance=$gg - $monthlyPayment;
Вот это вообще везде повторяется, вполне можно вынести и поставить перед всеми условиями.
Звёздочки-звёздочки.
Ну что ты как маленький, заходишь на пхп.нет, смотришь есть ли такая функция, если нет значит кто-то по-любому её написал(а если нет, значит она нахуй не нужна) и выложил в комментарии
http://php.net/manual/ru/function.substr-replace.php#90146
Я об этом и говорю. Каждый раз нужно искать и вставлять эту функцию?
>каждый раз
Ты в каждом проекте собираешься её использовать? Я вообще только сейчас узнал о существовании substr_replace, настолько это важная и незаменимая функция.
Да, действительно годная замена. Спасибо
У каждого тега есть свое назначение. В HTML коде ты размечаешь текст тегами по смыслу, а не по тому как он должен выглядеть.
За внешний вид отвечает CSS.
> <article> <span> <p> <div>, они не несут какой-то смысловой нагрузки и отличия, их только принято использовать для разных целей.
Несут.
<p> размечает абзац в тексте
<article> обозначает блок с текстом статьи или новости
span/div это теги общего назначения, конкретный смысл задается классами на них.
На русском про их смысл сложно что-то найти, вот я нашел:
http://html5book.ru/html5-semantic-elements/
Зато на англ. информации полно:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element
https://www.w3.org/TR/html-markup/elements.html
Там можно узнать разницу между em и i:
> The HTML <i> Element represents a range of text that is set off from the normal text for some reason, for example, technical terms, foreign language phrases, or fictional character thoughts.
Тег i помечает текст, который отделен от обычного текста, например, технический термин, фраза на ин. языке, мысли персонажа
Пример
<i>The ship sailed away on Thursday</i>, he
dreamt.
> The HTML element emphasis <em> marks text that has stress emphasis. The <em> element can be nested, with each level of nesting indicating a greater degree of emphasis.
Тег em помечает текст, который выделен по смыслу. Теги можно вкладывать друг в друга для усиления степени выделения.
Вот пример из спецификации:
<p>Cats are <em>cute</em> animals.</p>
То, что они выглядят одинаково по умолчанию ничего не значит, так как ты всегда это можешь переопределить. Теги надо выбирать исходя из смысла, а не как они выглядят.
Использовать неправильные теги конечно можно, страница будет отображаться, но код-то будет плохой. Понятно что вместо заголовка можно просто сделать див с увеличенным шрифтом, выглядеть будет так же, но тогда твой HTML код будет менее осмысленным, менее понятным.
У каждого тега есть свое назначение. В HTML коде ты размечаешь текст тегами по смыслу, а не по тому как он должен выглядеть.
За внешний вид отвечает CSS.
> <article> <span> <p> <div>, они не несут какой-то смысловой нагрузки и отличия, их только принято использовать для разных целей.
Несут.
<p> размечает абзац в тексте
<article> обозначает блок с текстом статьи или новости
span/div это теги общего назначения, конкретный смысл задается классами на них.
На русском про их смысл сложно что-то найти, вот я нашел:
http://html5book.ru/html5-semantic-elements/
Зато на англ. информации полно:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element
https://www.w3.org/TR/html-markup/elements.html
Там можно узнать разницу между em и i:
> The HTML <i> Element represents a range of text that is set off from the normal text for some reason, for example, technical terms, foreign language phrases, or fictional character thoughts.
Тег i помечает текст, который отделен от обычного текста, например, технический термин, фраза на ин. языке, мысли персонажа
Пример
<i>The ship sailed away on Thursday</i>, he
dreamt.
> The HTML element emphasis <em> marks text that has stress emphasis. The <em> element can be nested, with each level of nesting indicating a greater degree of emphasis.
Тег em помечает текст, который выделен по смыслу. Теги можно вкладывать друг в друга для усиления степени выделения.
Вот пример из спецификации:
<p>Cats are <em>cute</em> animals.</p>
То, что они выглядят одинаково по умолчанию ничего не значит, так как ты всегда это можешь переопределить. Теги надо выбирать исходя из смысла, а не как они выглядят.
Использовать неправильные теги конечно можно, страница будет отображаться, но код-то будет плохой. Понятно что вместо заголовка можно просто сделать див с увеличенным шрифтом, выглядеть будет так же, но тогда твой HTML код будет менее осмысленным, менее понятным.
Ты плохо понял смысл настройки. За вывод сообщений на экран отвечает display_errors. Если его отключить, ошибки будут писаться только в логи, а на экран не выведутся. Его ты должен отключать, но лучше наверно это делать в php.ini а не в коде.
А вот настройка error_reporting отвечает именно за полное игнорирование ошибок, то есть не писать ошибки даже в логи и вообще притвориться что их нет. Ее очень любят всякие быдлокодеры, а я считаю таких настроек вообще в языке не должно быть.
Фраза в мануале "Sets which PHP errors are reported" наверно сбила тебя с толку. Имеется в виду именно полное игнорирование определенных видов ошибок.
Не беда, многие программисты с опытом тоже толком не понимают как все это работает, и тоже ставят бредовые настройки.
> Что если нам понадобится переименовать наш index.php? Менять названия руками?
Сейчас у тебя функция очень ненадежная - она возвращает разный результат в зависимости от того, из какого скрипта ее вызвать. Это по моему ненормально и не позволяет писать надежный код.
Переименуешь файл - поменяешь руками. Это ведь всего в одной функции надо сделать, так? Да и я не представляю когда это может понадобиться.
Поэтому кстати и хорошо генерацию ссылок выносить в отдельный класс, чтобы если что было легко менять.
Я считаю, можно улучшить жизнь людей другим способом, например сократить рабочий день с 8 до 4-5-6 часов - мне всегда сколько я помню, времени свободного не хватало. Я только завтракаю часа два.
Что бы можно было учить пхп не думая о деньгах
По идее, такое должно подстегнуть инфляцию, общий рост цен. Чем больше денег у народа, тем они менее цениться начинают и тем дороже становятся вещи и услуги.
Как говорил богатый папа у Кийосаки, помогать надо богатым, а не бедным. Уменьшать налоги, чтобы богатые выходили из тени и тех же бедных обеспечивали.
В Германии вот пособие по безработице около 1к евро, но хорошая биржа труда, где человеку действительно ищут работу по специальности. Безусловный доход - это что-то неясное, не понимаю этого.
> Уменьшать налоги, чтобы богатые выходили из тени и тех же бедных обеспечивали.
Не вижу логики. От того что больше заплатят налогов, помощь бедным не увеличится так как сейчас им денег не дают.
Да и зачем помогать богатым, это же обычно всякие жулики и взяточники.
Пособие по безработице тоже не одобряю, это неправильно. Нет работы - иди тележки в супермаркете катай хотя бы.
В европе сейчас идёт тенденция к переходу на 6-ти часовой день. В швеции уже приняли такое, в других странах пока 7 часов.
Ну там и не дураки сидят, они, наверное, просчитали последствия. Читал, что одно из таковых: люди раюотают там, где нравится, а не где много платят
Там логика не прямая, а опосредованная. Больше налогов - больше вливаний в социальные сферы, благоустройство, работу инициативных групп, развитие муниципальной инфраструктуры и тому подобного.
Больше денег в бюджете - больше возможностей создавать муниципальные же рабочие места.
Помогать ведь надо тому, кто стремится. Был бы, например, толк для самих стремящихся изучить РНР, если бы ОП или кто-то из анонов сразу выкладывал решение задач, той же с кредитом на Айфон?
Нет ведь, человек должен заработать сам - знания или деньги.
Бедность же не порок, бедным и стремящимся таким вот образом и помогают: становишься на биржу труда, показываешь своё желание и стремление.
А просто так раздавать деньги - это глушить здравые побуждения в человеке.
>Нет работы - иди тележки в супермаркете катай хотя бы.
К счастью, такого в развитых странах не хотят и стараются не допускать. Это же прямой путь к деградации общества. Это только у нас зимой ездовые академики встречаются - и всем нормально.
Исправил замечания.
http://integer64.github.io/site-layout/exercise/mainTask/index.html
>На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.
Перемерил в ФШ с боков у всех кнопок разный паддинг, поставил 20px. сверху и снизу поставил 12px, шрифт брал из ФШ.
> & # 64 ;
>есть же & copy ;
В макете стоит @ , а не значок копирайта.
>Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?
Потому что в PNG8 появляется белая обводка , хз почему, может быть у меня такой фотошоп.
Два вопроса:
1. Как себя правильно оценить в столь сложное кризисное время, мне скоро говорить о повышение зарплаты с уровня дна, до...не известно какого уровня. Есть какой нибудь тест или что такое, что покажет вырос ли я уже из джину и стал мидл-джуном или типо того? И сколько сейчас такому, как я уместно платить, потому что сейчас я уже ниже 500$
2. Слышал что у сайтов на бутстрапе, какие то проблемы с СЕО и выдачей в поиске? Это так? Если да, то почему?
>Как себя правильно оценить в столь сложное кризисное время, мне скоро говорить о повышение зарплаты
Джим Кэмп, «Сначала скажите “Нет”»
Сергей Филиппов, «Продажи вверх!»
Стивен Шиффман, «Техники холодных звонков»
Зиг Зиглар, «Секреты заключения сделок»
эм, мне скорее интересно сколько действительно мои навыки стоят сейчас на рынке, а не как выбить зп по выше.
>сколько действительно мои навыки стоят сейчас на рынке
Это случайная величина, у изд-ва O'Reilly была книга по этому поводу... кажется, «Statistics in a Nutshell».
А есть кто-нибудь, кто как я 3 года учил пхп, сделал 3 небольших проекта на разных фреймворках, нихрена не устроился и сейчас даже продаваном работу найти не может?
Ну я 2 с половиной "учу", но я еще даже не искал.
Мне за это не пла тят.
Предпринимаю попытки, даже на вакансии верстальщика резюмеху отсылаю. Пока что все мимо.=(
> Потому что в PNG8 появляется белая обводка
Это потому что в этом формате нет полупрозрачности (с альфа-каналом), а только полная прозрачность. Потому полупрозрачные пиксели превращаются в непрозрачные. Почитай википедию например про PNG или еще что-нибудь.
Можно сделать как на rghost. Информацию о файле получить с помощью библиотеки id3 и закешировать в базе.
Если (файл->являетсяКартинкой) { подключить шаблон с выводом информации по изображению }
иначе если (файл->являетсяВидео) { подключить шаблон с выводом информации по видеофайлу }
и т.д.
У класса файл методы для проверки типа файла вида
if (in_array($this->mime_type, $imageTypes)) return true;
return false;
Медиа информацию (разрешение картинки, длительность видео, битрейт и т.д.) определять при помощи getId3 или другой библиотеки.
Ну или если нужен только mime type, то сойдет встроенный в php finfo.
>>640280
>>640256
>>640245
Съебите в лузер-тред. Нам неинтересно читать вашу нытье.
бамп вопросу
Всю нужную инфу о файле я уже получил и добавил в БД. Интересовал именно вывод инфы оттуда
>>640281
Давно занимаюсь. Файлообменник решил делать чтоб освоить работу с другими библиотеками и Silex
>>640283
>Если (файл->являетсяКартинкой) { подключить шаблон с выводом информации по изображению }
иначе если (файл->являетсяВидео) { подключить шаблон с выводом информации по видеофайлу }
и т.д.
Тоже так думал, точнее единственный вариант к которому пришел. Просто думал может можно это замутить как-то по-другому
Считает всё верно, молодец!
Но ОП не одобрит из-за копипасты:
>$creditBalance = $sum - $monthlyPayment;
Это повторяется в нескольких местах и может быть выведено в цикл до всех условий.
В какой-то момент введение лишней переменной помогает понять, как надо действовать. Я именно поэтому советовал так делать.
Попробуй сейчас от неё избавиться, это вроде бы несложно.
1. В пхп всё еще море вакансий?
2. Фреймворки тоже нужны?
3. Почему вы форматируете код как в питоне?
Я просто тот анон, который ебётся с этой задачей с той недели. Это просто пиздец, что я только не перепробовал... И проценты отдельно считал, и отдельно платёж за сервис, и сначала вычитал платёж за сервис, а потом процент... Вчера вечером пришла идея, что одну и ту же переменную можно подсчитать в одном цикле несколько раз, например:
Например:
A = 2
B = 5
C = 9
A = A + B
A = A + B * C
Из-за чего я так долго ебался - if можно вставить между действиями, а не только в конце. Из-за этого, я думаю, все долго сидят на этой задаче. Где ты вставишь If, там он и сработает (между строчками).
Так вот, я могу привести код в порядок теперь, просто когда заливал - подумал: работает - не трожь!
Ахаха, ты - это я чуть больше месяца назад, я уже говорил как-то. Я сейчас насквозь вижу ошибки в этой задаче, могу даже по словесному описанию происходящего понять, что там в коде происходит.
Просто я это всё попробовал с этой задачей. И не один раз.
Вообще иногда на верное решение наталкивает и то, без чего вполне можно обойтись. Без подсчёта в одном условии переменных там вполне себе можно обойтись.
if можно ставить где угодно, это да.
Но вообще у тебя там недочёт и в том, что не стоят действия в else - которые выполняются при условии, когда не сработал if.
Ещё одна загвоздка - ОП предлагает выводить "С меня хватит!" в самом конце. Попробуй и этого добиться.
Это крайне полезно - так долго ковыряться с задачами, я базарю.
1. Да, но зависит от дислокации.
2. Да, обязательно. А ещё и Wordpress или другие популярные CMS.
3. Я хз.
а я прикинь линукс установил, а тут фотошопа нет, и как мне теперь верстать? пиздец. сейчас пытаюсь через вайн открыть. а еще флешку надо iso винды записать, а ее нет. сплошная боль. вот а еще среди вакансий одно разводилово.
Ставь виртуалку и не мучайся
GIMP уже попробовал? Я долго плевался от него на Ubuntu.
Там единственные два плюса - возможность вкладки передвигать в удобное место и возможность обдуманно растягивать квадратик для копирования/вырезания изображения (там можно дополнительно стороны переместить). Остальное - сплошные минусы.
гимп на винде пробовал, до сих пор плююсь. да не винду надо поверх линукса ставить, если влезет.
Я долго с нулём парился, чтоб 0 выводилось по долгу в конце. Собственно, из-за этого первый раз и застрял в этой задаче. Сейчас с основной работой разберусь (я юрист) и исправлю свой код. А у тебя какой код получился?
Я такой же как ты, уже гуглил и тоже провёл исслеование данного вопроса. Для пхп вышка не нужна, можешь спокойно начать учить и вкатываться на джуна. Не переживай
То же самое через if - elseif
http://ideone.com/oi92pI
>ОП предлагает выводить "С меня хватит!" в самом конце. Попробуй и этого добиться.
Просто дописал после нуля.
Неплохо, но всё равно копипаста остаётся, можно ещё сократить.
>>640399
Хм, нет, считает неверно. Там должно получиться 10600000 с лишним за 49 лет, Анончику должно быть 65 к тому моменту.
Ориентир для работы цикла выбран неверно: мы не знаем, за сколько лет соберётся нужная сумма.
Подумай, какие у нас есть несомненные ориентиры для остановки цикла?
Также он просто положил в банк 10к, он не кладёт ещё каждый год по столько же - вот поэтому и неверно считает, на второй год уже в два раза больше 10к - 23.1к.
Я с телефона сейчас, чуть позже покажу задачу про Айфон и далее подскажу.
Пятигорск.
Ааа, а я думал, что он каждый год подкидывает 10 косых.
> какие у нас есть несомненные ориентиры для остановки цикла?
Ээээ... только один - достижение 1 млн руб на счету или больше. Годы - это переменная, от которой ничего не зависит, а больше ничего в задаче и нет. Я думаю, что зацикливаем на годах до тех пор, пока не перепрыгнет миллион.
Всё верно, достижение миллиона или больше - несомненный ориентир. Вот такие и желательно использовать всегда.
Я когда уже решил задачу про Айфон, всё не мог угомониться: там ориентир для работы цикла мы же с потолка берём ($month < 20).
А потом один братишка решил через проверку состояния $creditBalance: если он становится равным нулю - завершаем цикл.
И вот тут-то я окончательно успокоился с этой задачей, ахаха!
Да, я по такой логике тоже пробовал решить на той неделе) Косяк только в других строчках был, лол.
спс
Хорошая книга, рекомендую.
Нет, только ОПовские задачи.
Особенно "эстетично" получился черный кот на полу.
ОРУ НА ВЕСЬ ПАДИК.
Вот поправленный твой вариант: http://ideone.com/rSeWRZ
Вроде бы сокращать дальше некуда.
Я вот точно помню, что не менял условие для цикла - вроде как ОП сразу дал ориентир, я по нему и шёл. А вариантов у меня была куча просто.
Аа, да, это вариант без дополнительной переменной, которую я сам же советовал ввести.
Эта переменная помогает понять, чего надо добиться, но без неё легко можно обойтись, как видишь.
Ещё помогает доведение до максимума: поставить небольшой баланс и добиться выплаты сразу же в первом цикле - а дальше уже многое становится совсем очевидным.
Все равно копипастишь,
>if ($creditBalance <= $monthlyPayment)
условие можно сократить до одной строчки.
Чтобы в условии с if была только одна строчка с одним действием?
И как же?
>$monthlyPayment = $monthlyPayment - ($monthlyPayment - $creditBalance);
Не поменялось сразу на $monthlyPayment = $creditBalance;, сейчас увидел.
В условии проверяешь если $monthlyPayment больше чем $creditBalance. Затем, если условие выполняется, подставляешь значение $creditBalance в $monthlyPayment, после этого выплачиваешь кредит и выводишь всю информацию. И никаких тебе else и копипаст одного echo два раза.
Не представляю, как тогда будут выплачиваться промежуточные $paymentTotal?
Просто один раз выплатить окончательную сумму - и всё?
>Не представляю, как тогда будут выплачиваться промежуточные $paymentTotal?
Всмысле промежуточные $paymentTotal? $paymentTotal это сколько всего отдал банку анон.
>Просто один раз выплатить окончательную сумму - и всё?
Ну да. Правда в таком случае, с твоим циклом не выйдет вывести "С меня хватит" в конце, но это тоже можно исправить.
>Там же это три раза повторяется в разных местах?
Да, это можно вынести в отдельную переменную при желании, я этого делать не стал.
>>640740
http://ideone.com/W5PcDY
Вот такой укороченный вариант будет, если вынести в отдельную переменную.
Да, это самое короткое решение, пожалуй.
Я и не думал, что там можно правильно обойтись одним echo.
А если условием для работы цикла поставить $creditBalance > 0 - идеал будет.
>А если условием для работы цикла поставить $creditBalance > 0 - идеал будет.
Тогда не выйдет вывести "С меня хватит" после завершения оплаты. Хотя конечно эту строку можно выводить после цикла, но я не знаю правильно ли так делать.
Чего за ошибка в задаче с процентами на вклад? Ошибка выполнения\ttime: 0.02 memory: 61592 signal:25
Это тип комп захлёбывается или я криворукий?
поставил цикл for ($balance = 10000; $balance <= 1000000; $balance * $percent)
Вряд ли правильно. А вдруг цикл не будет работать, потому что условие для его работы не выполняется - а echo "С меня хватит!" всё равно вылезет.
>>640801
Можно высчитать, конечно.
Я вообще просто слегка сократил код анончика, даже особо не вдумывался.
Там ещё и $paymentTotal = $paymentTotal + $monthlyPayment; у меня повторяется в разных условиях.
>>640816
Скорее всего, цикл не может остановиться в принципе.
А дальше что в цикле, какое тело?
>for ($balance = 10000; $balance <= 1000000; $balance * $percent)
Да можно было и в предыдущий подставить только условие насчёт миллиона.
Вроде бы и так должно работать, покажи код на Идеоне.
Сделал, но очень примитивно http://ideone.com/m2rUad
в данном случае, как и в предыдущей задаче, обязательно ставить elseif? Для чего вообще нужно elseif, если цикл и так будет выполняться до тех пор, пока if не сработает?
>for ($balance = 10000; $balance <= 1000000; $balance * $percent)
Тут понятно: зациклить, пока меньше миллиона
>$anonOld = $anonOld ++;
Плюсовать Анону год каждый цикл
Что я делаю не так?
Вообще желательно вписываться в elseif, чтобы можно было понять большой код. Сейчас ты не запутаешься, а когда много условий - уже сложнее ориентироваться.
Вообще конкретно в этой задаче elseif не нужен, без него можно обойтись, даже просто else там ни к чему - одно ведь условие всего.
>>640837
Да всё нормально, в принципе. Наверное, только привязка к 100 годам не вполне корректна. Как и с 20 месяцами в задаче про Айфон.
Тут всё-таки лучше 1 миллион использовать для ориентира, мне так кажется.
>>640838
А в чём ты запускаешь? На Идеоне же конкретно указывается, что там не нравится интерпретатору.
>>640843
А, код! http://ideone.com/mktMgC
Он в бесконечность уходит и не плюсует. Запускаю всё через ideone
и
http://ideone.com/iDMQOh
разные братишки делали?
Я что-то запутался.
>for ($balance = 10000; $balance <= 1000000; $balance * $percent)
У тебя там при каждом прохождении цикла $balance = 10000, ахаха, отжёг!
Каждый цикл возвращается к тому, с чего начинал, из-за первого выражения в круглых скобках.
Нет, этот делал один брат. Первый способ очень простой, поэтому я решил решить задачу по-другому, через >for ($balance = 10000; $balance <= 1000000; $balance * $percent)
>Каждый цикл возвращается к тому, с чего начинал, из-за первого выражения в круглых скобках.
А как же предыдущая задача? Тут всё аналогично:
for ($month = 1; $month <= 20; $month ++) {
Да, я сообразил.
>for ($balance = 10000; $balance <= 1000000; $balance $percent)
>$balance $percent
Так не будет работать - никакая переменная не меняется же.
Там надо определить, куда будут записываться изменения - можно обычное выражение записать. $balance = $balance * $percent
Ох щи, действительно. Неожиданный поворот.
Но попробуй вынести определение этой переменной за пределы цикла - всё начинает работать.
Спасибо, я уяснил это.
Действительно, не это имеет значение, а то, что у тебя $balance * $percent без определения $balance указано.
Также года не считаются - выражение $anonOld = $anonOld++ какого-то чёрта не работает!
Но работает просто $anonOld++, я сам уже запутался теперь.
Да exit там не обязателен.
Он обычно нужен, чтобы скрипт принудительно оборвать из-за какого-то условия, а там и так вся работа скрипта - выкинуть кубики и сравнить результаты.
Спасибо!
>>640855
http://ideone.com/mktMgC
Вот так работает, но есть пара вопросов:
1. Почему работает ++ в этой задаче?
for ($month = 1; $month <= 20; $month ++) {
и почему не работает $balance умножить $percent в этой
>for ($balance = 10000; $balance <= 1000000; $balance х $percent)
Пишу "х", потому что звёздочка в прошлый раз не отобразилась.
При этом когда я цикл записал так, всё заработало:
> for ($balance = 10000; $balance <= 1000000; $balance = $balance х $percent)
Почему в задаче с айфоном достаточно написать $month ++, а с выплатами по кредиту нельзя $balance х $percent, а надо $balance = $balance х $percent? Потому что ++ специальное действие и комп всё понимает, а умножение должно иметь равенство?
2. Второй вопрос только что понял сам. Нельзя писать
>$anonOld = $anonOld ++
надо писать просто
> $anonOld ++
И да, можно как-то вывести эхо, в котором отображается сумма, перевалившая за миллион? В моём решении в 65 лет анону выдаётся сумма 900 тысяч с копейками, т.е. один шаг до миллиона.
1. $month ++ - это всё равно, что $month = $month + 1. То есть это готовое выражение.
А $balance х $percent никуда не записывается, нужно определить, в какую переменную идёт это умножение.
>Потому что ++ специальное действие и комп всё понимает, а умножение должно иметь равенство?
2. Да, вот как раз и подтверждение тому, что это готовое выражение: $anonOld ++. Можно поставить $anonOld = $anonOld + 1, тоже будет работать, разумеется.
>можно как-то вывести эхо, в котором отображается сумма, перевалившая за миллион?
Получается, у тебя цикл обрывается до того, как срабатывает echo для последнего вывода суммы выше миллиона.
Если поставить основное выражение с подсчётом баланса в тело цикла - всё начинает работать верно: http://ideone.com/6Ayz1p
Чёрт его знает, что такое.
Казалось бы, я уже уверенно себя чувствовал с циклами - а сам сижу и туплю сейчас.
Как раз в последний момент должен посчитаться баланс выше миллиона, должен вывестись в echo, а потом цикл должен завершиться, так как баланс стал больше миллиона.
Почему этого не происходит - загадка.
Надо на свежую голову подумать, наверное.
>Если поставить основное выражение с подсчётом баланса в тело цикла - всё начинает работать верно
Я думал, что для запуска цикла нужно 3 "элемента".
Да, можно даже и без условия (среднего выражения) делать цикл, а оборвать его потом с помощью break изнутри, когда какая-нибудь переменная достигнет определённого значения.
Короче, причина, почему не выводилась окончательная сумма больше миллиона в том твоём цикле, в том, что условие проверяется после каждой итерации. Поэтому когда у тебя $balance = $balance х $percent даёт сумму больше миллиона, условие сразу же не даёт циклу продолжаться.
Подробности в самом начале: http://php.net/manual/ru/control-structures.for.php
От души!
/ Считает общее число отработанных часов */
public function getTotalHoursWorked()
{
// Просто складываем значения часов в массиве
return array_sum($this->hours);
}
почему не даём функции аргумент $this ? Это же не логично, опечатка?
всё, отбой
http://ideone.com/2dXlqV
$rates = array (3, 5, 3, 2, 1, 8, 4, 3, 4, 3, 2, 3);
$ratesSum = array_sum($rates);
$ratesCount = count($rates);
$averangeCount = $ratesSum / $ratesCount;
echo "Анону поставили $ratesCount оценок. Их сумма - $ratesSum, средняя оценка - $averangeCount";
Да. Ты, видимо, посмотрел код по ссылке, когда я начал с бубном плясать. Изначально было как в пасте count($rates), но почему-то не запускалось. Спасибо за ответ. Довольно замороченная тема с массивами.
Это ещё цветочки с массивами.
Дальше многое будет связано с массивами в массивах, вот где первые ягодки пойдут.
В ОП посте есть советы по установке Апача и PHP. А в туториале PHP есть пример того как можно написать простой скрипт: http://php.net/manual/ru/tutorial.php
Предыдущие задачи тоже 4 строки, но эти 4 строчки в итоге мусолили чуть ли не полтреда. Возможно, какие-то другие варианты, более эффективные, или решено не тем методом, как завещал ОП (в частности, может вместо if есть какие-то операции и array) и т.д. Странный вопрос.
Да нет, эти задачи довольно простые и там комментировать особо нечего. Про айфон тоже простая, не знаю почему все её долго не могут сделать.
Потому-что там даётся код, в котором из суммы кредита сразу отнимается месячная плата и это нужно поменять, что для большинства не очевидно.
только в жаве я понял, как использовать уникальные индексы. сасайти лахи.
Да, и последнее число тоже. mt_rand(1,4) может выдавать 1, 2, 3 и 4
Если $lol - это простой массив, то там нумерация ключей идёт с нуля, count($lol) будет показывать неверный ориентир для mt_rand() - на единицу больше, поскольку считает с единицы, а не нуля.
Вроде бы и учил, и верстал с ПСД и даже получалось, но иногда сталкиваюсь с проблемой, которую не могу решить.
Попробую
У внешнего дива clearfix, паддинг слева.
Картинки с подписью (теги figure + figcaption) плавают влево, отрицательный margin.
>>641383
Это как в языках: знания синтаксиса недостаточно.
Если сделаешь оповские задачи, проблем не будет возникать.
Сравни с девятой задачей например https://gist.github.com/codedokode/58ebc90bd006baf4b35c#Задание-9
>Слишком просто? Ок, давай усложним задачу. Добавим в банкомат банкноты номиналом 200 и 2000 р. После чего выставляем такое число банкнот: 1 по 5000, 4 по 2000, 1 по 500, 3 по 200 и пытаемся выдать 6600 р.
Правда учусь на питоне, так что не бейте. Делаю через два вложенных перебора от большего к меньшему, спотыкаюсь на 500, когда вместо этого нужно ему использовать 200. Весь мозг сломал какое условие туда вставить
http://ideone.com/ezgx69 <- гавнокод
Шо, попробовать рекурсией переписать?
Хочется универсальный алгоритм, а не под задачу подгонять
in4b питономразь в питонотред
Ебать, шо это за говно, где фигурные скобки, как мне понять где заканчивается условие?
Надо либо:
- перебирать все возможные комбинации купюр, например рекурсией
- либо почитать про задачу о ранце:
https://ru.wikipedia.org/wiki/Задача_о_ранце
http://acm.khpnets.info/w/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.A0.D0.B0.D0.B7.D0.BC.D0.B5.D0.BD_.D0.BC.D0.B8.D0.BD.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.BC_.D0.BA.D0.BE.D0.BB.D0.B8.D1.87.D0.B5.D1.81.D1.82.D0.B2.D0.BE.D0.BC_.D0.BC.D0.BE.D0.BD.D0.B5.D1.82
http://webcache.googleusercontent.com/search?q=cache:MNr3TwWY8AMJ:http://neerc.ifmo.ru/wiki/index.php?title%3D%25D0%2597%25D0%25B0%25D0%25B4%25D0%25B0%25D1%2587%25D0%25B0_%25D0%25BE_%25D1%2580%25D1%258E%25D0%25BA%25D0%25B7%25D0%25B0%25D0%25BA%25D0%25B5%2B%D0%B7%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+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D0%BD&gws_rd=cr&hl=ru&&ct=clnk
Что не так делаю то?
По логике, должна удалиться ненужная функция, а остальные остаться и посчитаться.
А что-то нифига..
Зачем там unset? Не легче будет сделать инкремент переменной $num?
Хотя, я понял что ты пытаешься тут сделать, только это не будет работать. Чтобы твой способ работал, скорее всего нужен будет цикл for.
Или можешь попробовать unset($classHigh[$name])
Переменные, идущие после as в циле foreach как бы временные, их изменение никак не влияет на оригинальный массив.
$high это не сам элемент массива, а лишь переменная хранящая копию значения. Делая unset ты уничтожаешь эту переменную.
Чтобы удалить элемент из массива надо сделать unset($array[$key]), но тут это не лучшая идея так как ты по этому же массиву проходишь циклом, это запутывает код.
Лучше просто увеличивать переменную на 1 когда видишь высокого ученика.
Благодарю! Тоже к такому выводу пришел. Терять нечего, буду дерзать. И тебе удачи, анончик.
Впервые вижу скрипт на Пистоне.
Забавно, многое понятно.
Я только пока до этой задачи и на РНР не дошёл, ничего не могу подсказать.
Лучше будет $number++;
elseif ($creditBalance > $monthlyPayment) желательно поменять на else
$monthlyPayment = $monthlyPayment - ($monthlyPayment - $creditBalance);
это то же самое, что и
$monthlyPayment = $creditBalance;
лучше заменить, т.к. короче и нагляднее
$paymentTotal = $paymentTotal + $monthlyPayment;
короткий вариант этой строчки:
$paymentTotal += $monthlyPayment;
Еще замечание: у тебя код плохо структурирован, большая глубина вложенности. надо переворачивать ифы, то есть вместо
if
.... много строк
писать
if not ...
return
...много строк
И названия переменных не очень хорошие.
Почаны, как сделать задачу на палиндром верно, а то уже голова ломается.
http://ideone.com/0xXrrt
питоно-программист
Понял, спс. Буду дальше разминать мозг.
>>641447
Да все однохуйственно, если в детали не лезть.
>>641475
Часть вложенности согласен, можно убрать, и переменные переназвать. Просто не РЕФАКТОРИЛ новое модное слово узнал в IDEшке :3.
Поясни по переворачиванию ифов, что-то не вкуриваю в каких случаях это используется. Если можно маленький примерчик :3 :3 :3 пазязя, можно на пыхе.
>>641538 - вопросы по регуляркам и по записи чисел прописью
>>641539 - числа прописью, как получить ввод от ползователя, про сборки
>>641540 - баг в select2, про айфон
>>641541 - яваскрипт, электросети и вопросы по инъекции зависимостей
>>641542 - айфон в кредит, вклад в банк
Если кого-то пропустили или забыли - напомните в новом треде.
Не флудите. Здесь только обсуждение программирования. Сколько лет вы не можете найти работу и что вы съели на завтрак никому не интересно, есть другие треды и разделы для этого.
> Задача 1: https://jsfiddle.net/5bzh0qbz/
Тег <p> лишний, его бы надо убрать. А почему цвета не те? А ты можешь сделать точно так же как на картинке? Если не умеешь то надо научиться.
> margin-left: 34%;
> width: 66%;
Тут одно из правил лишнее. Да и ты не учел ширину бордера, у тебя там больше 100% выходит.
> Задача 2: https://jsfiddle.net/cc92hueh/
Ок, верно
> Задача 3: https://jsfiddle.net/2xkms9a5/
> style="font-weight: bold; font-size: 200px; "
Нет, стили должны быть в CSS файле, не надо HTML замусоривать
Плюс, у тебя текст выведен курсивом, а надо не курсивом.
> Задача 4: https://jsfiddle.net/09hbdraq/
Межстрочный интервал слишком большой - надо уменьшить. <p> тут непраивльно использовать так как он значит "абзац текста", а тут ни текста ни абзацев нет. Тег <p> это не замена для перевода строки.
> style="vertical-align: middle;
Стили должны быть в CSS
Расстояние от левого края до первого оранжевого блока не равно 10px, а больше. Расстояние между блоками не равно 10px. Читай подсказки к задаче.
> Задача 5: https://jsfiddle.net/kqk41sea/
Тег <p> исплоьзован неправильно, им размечают абзацы текста, а тут единственный кусок текста. Не используй теги от балды, используй осмысленно.
> Задача 6: https://jsfiddle.net/m5yrao5k/
> font-family: "Trebuchet MS";
В конце списка шрифтов дложен стоять одтин из стандартных вроде serif.
Расстояние между пунктами меню надо сделать больше, как на макете, точки перед ними убрать.
Заголовк должен быть нежирным шрифтом.
> box-sizing: border-box;
Не очень понятно зачем это, если тут нет ни паддингов ни бордера. Также, надо в таких случаях добавлять вендорные префиксы для старых браузеров.
Сама идея верстки правильная.
> Задача 7: https://jsfiddle.net/xh763seo/
Там не 10px между полем и кнопкой
> box-sizing: border-box;
Надо вендорные префкисы для старых браузеров
> .element1 {
Нужны осмысленные имена, чтобы код было удобно читать
>Задача 11: https://jsfiddle.net/0Lvxs3yu/
Что-то выглядит как-то стремно. Можешь сделать как на картинке, чтобы показать что умеешь правильно сверстать макет?
> font-family: "Malgun Gothic";
Нужен стадартный шрифт в конце списка
> background-color: rgba(160, 238, 157, 0.22);
А зачем там прозрачность?
> overflow: auto;
Зачем?
> width: 100px;
Не, ширина должна определяться содержимым кнопки + паддинги
> float: left;
зачем тут испльзован флоат?
Также, прочитай примечания к задаче - надо бы сделать поддержку клавиатурной навигации.
> Задача 1: https://jsfiddle.net/5bzh0qbz/
Тег <p> лишний, его бы надо убрать. А почему цвета не те? А ты можешь сделать точно так же как на картинке? Если не умеешь то надо научиться.
> margin-left: 34%;
> width: 66%;
Тут одно из правил лишнее. Да и ты не учел ширину бордера, у тебя там больше 100% выходит.
> Задача 2: https://jsfiddle.net/cc92hueh/
Ок, верно
> Задача 3: https://jsfiddle.net/2xkms9a5/
> style="font-weight: bold; font-size: 200px; "
Нет, стили должны быть в CSS файле, не надо HTML замусоривать
Плюс, у тебя текст выведен курсивом, а надо не курсивом.
> Задача 4: https://jsfiddle.net/09hbdraq/
Межстрочный интервал слишком большой - надо уменьшить. <p> тут непраивльно использовать так как он значит "абзац текста", а тут ни текста ни абзацев нет. Тег <p> это не замена для перевода строки.
> style="vertical-align: middle;
Стили должны быть в CSS
Расстояние от левого края до первого оранжевого блока не равно 10px, а больше. Расстояние между блоками не равно 10px. Читай подсказки к задаче.
> Задача 5: https://jsfiddle.net/kqk41sea/
Тег <p> исплоьзован неправильно, им размечают абзацы текста, а тут единственный кусок текста. Не используй теги от балды, используй осмысленно.
> Задача 6: https://jsfiddle.net/m5yrao5k/
> font-family: "Trebuchet MS";
В конце списка шрифтов дложен стоять одтин из стандартных вроде serif.
Расстояние между пунктами меню надо сделать больше, как на макете, точки перед ними убрать.
Заголовк должен быть нежирным шрифтом.
> box-sizing: border-box;
Не очень понятно зачем это, если тут нет ни паддингов ни бордера. Также, надо в таких случаях добавлять вендорные префиксы для старых браузеров.
Сама идея верстки правильная.
> Задача 7: https://jsfiddle.net/xh763seo/
Там не 10px между полем и кнопкой
> box-sizing: border-box;
Надо вендорные префкисы для старых браузеров
> .element1 {
Нужны осмысленные имена, чтобы код было удобно читать
>Задача 11: https://jsfiddle.net/0Lvxs3yu/
Что-то выглядит как-то стремно. Можешь сделать как на картинке, чтобы показать что умеешь правильно сверстать макет?
> font-family: "Malgun Gothic";
Нужен стадартный шрифт в конце списка
> background-color: rgba(160, 238, 157, 0.22);
А зачем там прозрачность?
> overflow: auto;
Зачем?
> width: 100px;
Не, ширина должна определяться содержимым кнопки + паддинги
> float: left;
зачем тут испльзован флоат?
Также, прочитай примечания к задаче - надо бы сделать поддержку клавиатурной навигации.
А ты гуглил? Погугли что такое вообще крон и как он работает для начала, а потом можешь задавать уточняющие вопросы если что-то непонятно.
>>641533
http://ideone.com/d76xVL
Лень разбираться что с вашей пыхой не так и почему столько варнингов =3
Там две ошибки в цикле:
$check_text += $text;
В результате всегда палиндром.
$check_text .= $text[$i];
Ты бы хоть пробежал глазом по учебнику ОПа.
Кажется это у лайтсофта или кого-то еще лет 5 в тестовом задании.
Гугли алгоритм Манакера.
http://phpforum.su/index.php?s=8455e93fcf85297369049ccb1b41581d&showtopic=43124&st=15
А тут решение в ооп стиле, сильно не оптимальное, наверно о(n^2), если не хуже
>А почему цвета не те? А ты можешь сделать точно так же как на картинке?
да, могу(пипеткой определяю и в ргб выставляю значения), просто баловался с возможностями по-разному указывать цвета
>Тут одно из правил лишнее...
ты прав, спасибо
>Стили должны быть в CSS
Хотел таким способом избежать дробления классов, т.к. они отличались только этим параметром, не стоит даже в таком случае так делать?
>В конце списка шрифтов дложен стоять одтин из стандартных вроде serif.
Это не понял, почему так? И шрифтов должно быть несколько?
>Что-то выглядит как-то стремно.
С кнопкой мучился полдняда, дебил.
>зачем тут испльзован флоат?
Если его убрать, кнопку распидорасит полностью, я очень много методом проб и ошибок делал, так что держится на соплях, дай совета как исправить, нет сил уже с кнопкой бороться.
Вообще спасибо большое, вернусь к КСС, подправлю задачи и новые добавлю и снова выложу. Только не знаю когда, правда. Гнилая тема для меня какая-то. Насколько критично разбираться в тонкостях КСС? Голова от этого болит.
ОП, привет, глянь "опечатки", пожалуйста: http://ideone.com/YR9zJZ
Ты мне в прошлый посоветовал
> Лушче бы если checkText ничего не выводил а только возвращал результат.
> $patternRus, $patternEng никогда не меняются, лучше внести их внутрь функции и убрать из скобок. То же самое с $replacementRus, $replacementEng
поэтому я разделил проверку и подсветку, тогда регулярки пришлось оставить снаружи, они таки стали повторяться, а массивы замен спрятал внутрь
>> $array = explode (" ", $text);
>array -> words
Вот это совсем не понял, можешь прояснить, что ты имел в виду? В гугле забанили, не нашёл, где используются подобные конструкции.
Читни учебник ОПа, базарю, ещё захочешь.
У тебя там вообще нет функции mb_substr(), которая будет по кусочку отрывать от текста с обеих сторон и сравнивать.
Вообще алгоритм у тебя неверный, подход неверный.
Там должно быть, как минимум, два условия, а лучше даже три:
1. Буквы спереди и сзади текста совпадают - продолжаем цикл, можем вывести эти буквы с начала и с конца.
2. Буквы с начала текста и с конца не совпадают - выводим результат "Это не палиндром" и обрываем цикл.
3. Переменная $i равняется переменной $halflength - выводим результат "Это палиндром".
>А, еще, сделай тогда, чтобы в качестве gen можно было указать функцию с аргументами, и при вызове эти аргументы бы передавались функции gen. Аргументов может быть любое количество.
Как это сделать?
Я получаю все аргументы из arguments, но получается массив.
Как передать в функцию аргументы другой функции в виде чисел, а не массива?
Я совсем запутался.
я в комплектовщики товара, лол
Вот тебе два чая, постараюсь сделать следуя твоим указаниям.
Я так понимаю для каких-то конкретных случаев больше подходит один сервер, а для других второй. Иногда даже пишут о связке nginx+apache, типа потому что у апача есть некие модуля(какие?), которых нет в nginx.
В общем коротко в чем преимущества этих серверов, и в каких случаях предпочесть один другому?
Плюс еще более нубский вопрос: если я поставлю оба, они не будут конфликтовать? Наверное нужно как-то прописать им разные порты, или что-то в этом роде.
Поставлю лучше вагрантом готовую виртуалку.
>2) сделать контейнер или сервис локатор, который умеет их создавать. Создать контейнер в скрипте инициализации и передавать в контроллер. А контролллер из контейнера получает нужные ему объекты-сервисы. Только не злоупотребляй этим - не надо контейнер передавать везде, иначе мы опять получаем что неясно от чего зависит класс.
Так, значит я буду писать
init.php
$container = new Pimple();
$container['RegistrationHelper'] = $container->share(function ($c) {
return new RegistrationHelper();
};
$container['RegisterAction'] = $container->share(function ($c) {
return new RegisterAction($c['RegistrationHelper']); //RegisterAction.php __construct($reghelper) {$this->reghelper = $reghelper;}
};
$regaction = $container['RegisterAction'];
index.php
$regaction->SignUp('someLogin', 'somePassword');
Далее
https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php
У меня есть еще такие зависимости как $pdo, $studentgtw и $student (не уверен что это зависимость). Для них тоже нужно делать контейнеры, но тут мне не очень понятно с этим
Мне кажется что вот так писать pdo будет не правильно:
$container['pdo']->container->share(function () use ($config) {
$pdo = new Pdo(...);
$pdo->setAttribute...
return $pdo;
}
$pdo = $container['$pdo'];
$query = $pdo->prepare("SET sql_mode = 'STRICT_ALL_TABLES'");
$query->execute();
>>641541
>> Извиняюсь что так много вопросов, просто я совсем не понимаю это.
>Задавай еще. Важно разобраться
Да, мне пока еще много что не понятно, но пока я даже не могу сформулировать вопрос. Тяжело оттолкнутся - как будто пытаюсь прочитать на непонятном мне языке.
Спасибо.
>2) сделать контейнер или сервис локатор, который умеет их создавать. Создать контейнер в скрипте инициализации и передавать в контроллер. А контролллер из контейнера получает нужные ему объекты-сервисы. Только не злоупотребляй этим - не надо контейнер передавать везде, иначе мы опять получаем что неясно от чего зависит класс.
Так, значит я буду писать
init.php
$container = new Pimple();
$container['RegistrationHelper'] = $container->share(function ($c) {
return new RegistrationHelper();
};
$container['RegisterAction'] = $container->share(function ($c) {
return new RegisterAction($c['RegistrationHelper']); //RegisterAction.php __construct($reghelper) {$this->reghelper = $reghelper;}
};
$regaction = $container['RegisterAction'];
index.php
$regaction->SignUp('someLogin', 'somePassword');
Далее
https://github.com/someApprentice/Students/blob/master/app/Controller/RegisterAction.php
У меня есть еще такие зависимости как $pdo, $studentgtw и $student (не уверен что это зависимость). Для них тоже нужно делать контейнеры, но тут мне не очень понятно с этим
Мне кажется что вот так писать pdo будет не правильно:
$container['pdo']->container->share(function () use ($config) {
$pdo = new Pdo(...);
$pdo->setAttribute...
return $pdo;
}
$pdo = $container['$pdo'];
$query = $pdo->prepare("SET sql_mode = 'STRICT_ALL_TABLES'");
$query->execute();
>>641541
>> Извиняюсь что так много вопросов, просто я совсем не понимаю это.
>Задавай еще. Важно разобраться
Да, мне пока еще много что не понятно, но пока я даже не могу сформулировать вопрос. Тяжело оттолкнутся - как будто пытаюсь прочитать на непонятном мне языке.
Спасибо.
зачем
двачую, годно было бы.
>матаном, графами и паскалем
>пусть только заикнутся о педах-медах-дизинах-рокгруппах
Не хотел бы я быть твоим ребенком. Я бы сел на наркотики чтобы уйти от реальности где только твое давление и вымещение твоих неудач на себе. Не все хотят тоже самое что и ты! Лучше не заводи детей никогда, потому что со своим взглядом на мир, со своей навязчивостью своего мнения, и боюсь представить какие еще мерзкие черты характера ты в себе держишь - ты обрекаешь душу вырванную из небытия на вечные страдания, и в следствии, по законам кармы, добавляешь каплю страданий для всего мира.
Лучше забудь о своей боле и давай людям то что они хотят.
В каждом человеке — солнце. Только дайте ему светить. © Сократ.
Двачну. Если хочешь сделать из него умного человека, прочитай "Вы конечно шутите, мистер Фейнман".
<?php
error_reporting(-1);
$creditBalance = 40000; / Долг анона перед банком /
$percent = 1.03; / Банк начисляет 3% в месяц от суммы /
$servicePayment = 1000; / А также 1000 рублей в месяц комиссии за обслуживание счета /
$monthlyPayment = 5000; / Анон платит 5000 р в месяц, это все, что ему дает мама на завтраки /
$paymentTotal = 0; / Сколько всего отдал банку анон /
/ Посчитаем расходы 20 раз на 20 месяцев вперед /
for ($month = 1; $month <= 20; $month ++) {
\t
\t$creditBalance = ( $creditBalance $percent ) + $servicePayment - $monthlyPayment;
\t$paymentTotal = $paymentTotal + $monthlyPayment;
\techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
if ($creditBalance < 5000) {
\t
$monthlyPayment=$creditBalance;
$creditBalance=( $creditBalance $percent ) + $servicePayment - $monthlyPayment;
$paymentTotal=$paymentTotal+$monthlyPayment;
$month++;
echo "С меня хватит! На $month месяце кредит был оплачен. Сумма последней оплаты составляла $creditBalance. Сумма оплаты составила $paymentTotal рублей.\n";
break;
}
}
?>
<?php
error_reporting(-1);
$creditBalance = 40000; / Долг анона перед банком /
$percent = 1.03; / Банк начисляет 3% в месяц от суммы /
$servicePayment = 1000; / А также 1000 рублей в месяц комиссии за обслуживание счета /
$monthlyPayment = 5000; / Анон платит 5000 р в месяц, это все, что ему дает мама на завтраки /
$paymentTotal = 0; / Сколько всего отдал банку анон /
/ Посчитаем расходы 20 раз на 20 месяцев вперед /
for ($month = 1; $month <= 20; $month ++) {
\t
\t$creditBalance = ( $creditBalance $percent ) + $servicePayment - $monthlyPayment;
\t$paymentTotal = $paymentTotal + $monthlyPayment;
\techo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n";
if ($creditBalance < 5000) {
\t
$monthlyPayment=$creditBalance;
$creditBalance=( $creditBalance $percent ) + $servicePayment - $monthlyPayment;
$paymentTotal=$paymentTotal+$monthlyPayment;
$month++;
echo "С меня хватит! На $month месяце кредит был оплачен. Сумма последней оплаты составляла $creditBalance. Сумма оплаты составила $paymentTotal рублей.\n";
break;
}
}
?>
http://ideone.com/wy3Mso
Сори, туплю. Это я еще немного поковырялся. Но так и не пришел к правильному ответу.
Ошибки:
1. $creditBalance = ( $creditBalance х $percent ) + $servicePayment - $monthlyPayment;
Когда этот $creditBalance становится меньше $monthlyPayment, то становится после этого выражения с отрицательным значением (от него же отнимается $monthlyPayment). От этого многие ошибки возникают.
2. Просто так echo "{$month} месяц спустя: долг = {$creditBalance} руб, выплачено всего {$paymentTotal} руб. \n"; в основную часть цикла ставить не желательно, для подобного надо использовать else.
Несколько способов, как не топтаться на месте с этой задачей.
1. Ввести переменную для подсчёта $creditBalance с $percent и $servicePayment. Не отнимать от неё никакие $monthlyPayment.
2. Заставить программу выплатить $creditBalance с $percent и $servicePayment (или введённую переменную) при первом же прохождении цикла. Для этого $creditBalance или введённая для этого переменная должны быть сразу меньше 5000 и должны уже содержать умножение $creditBalance на проценты и с прибавленной комиссией за обслуживание кредита. Итоговая цифра должна быть меньше 5000.
3. Обрывать цикл при сумме, равной нулю, а не меньшей нуля. Отрицательного $creditBalance не должно получиться при верном решении этой задачи.
http://ideone.com/2fHdsg
Вроде как ответ правильный, как у тебя, но смущает в выводе строка
"13 месяц спустя: долг = -3729.8132554793 руб, выплачено всего 65000 руб. "
Это так и надо?
Нет, в минус не должно уходить. А ответ правильный только для 40000: если подставить 1000 в кредитбаланс, то будет -2970, а должно быть 2030.
Сообщение выше прочитай, там я о таком минусе и говорю.
>array -> words
Это совет как правильно надо называть переменные. array ничего не значит, не надо давать такие имена.
Попробую пока сделать выводы из того что нашел.
Откопал опо-пасту по многопоточности.
http://pastebin.com/1wYpD8NS
Из нее вроде бы следует, что nginx больше подходит для случаев с высокой нагрузкой, когда нужно обрабатывать сотни и тысячи параллельных запросов. Плюс с раздачей статики справляется лучше благодаря асинхронности.
Статья на хабре:
https://habrahabr.ru/post/267721/
Краткие выводы:
1. Nginx подходит для приложений с высокой нагрузкой (тысячи одновременных запросов), раздачи статики.
2. Apache имеет встроенный модуль для обработки запросов к динамическому контенту (это должно означать: "автоматически взаимодействует с интерпретатором php"). У nginx из коробки ничего такого нет, так что админ должен осмысленно прописывать настройки для всяких fastCGI. В общем, более гибко, но кому-то может показаться "усложнением".
3. Apache позволяет задавать конфигурацию на уровне директорий (создавать файлы .htaccess). Удобно для всяких шаред-хостингов, где каждый васян может подогнать настройки под свой вордпресс. Nginx не имеет "локальных" настроек, так что больше популярен у хипсторов с личными серверами и стартапами.
Но с точки зрения производительности вроде это лучше, потому что не нужно сканировать все директории проекта в поисках .htaccess.
4. Модули в apache подключаются/отключаются по мере необходимости, в nginx выбираются на этапе компиляции. (Э, я что не смогу поставить nginx апт-гетом?)
5. Совместное использование. Тут я плохо понял, что значит "размещение Nginx перед Apache в качестве реверс-прокси". Типа nginx будет отдавать статику, но как только увидит запрос к динамическому контенту, отдаст управление апачу?
>Э, я что не смогу поставить nginx апт-гетом?
Сможешь.
>Типа nginx будет отдавать статику, но как только увидит запрос к динамическому контенту, отдаст управление апачу?
Ни разу не видел чтобы такие велосипеды строили. Для динамического контента на php лучше к nginx ставить php-fpm.
Мощи моих мозгов для решения той задачи не хватает. я как какаши с шаринганом - могу только впитывать новое, но не творить. пока что. прости мужик.
Подправил, но в итоге выходит, что я выплатил больше 60000, хотя долг был 4138
Ошибка или я невнимательный?
блять как я обосрался с разметкой.
Тебе надо ввести новую переменную, которая будет содержать сумму остатка с процентами и комиссией 1000р. И уже от этой переменной двигать дальше. В твоем случае у тебя уравнение выполняется для переменной $creditBalance, от которой ВЫЧИТАЕТСЯ $monthPayment.
Такие костыли строят на любом шареде, мамкин админус 300р вдсок. Потому что быдло не умеет в оторвать от своего говнопресса .htaccess и прочую хуиту от апача.
Ты в цикл ввел условие, которое при остатке долга меньше суммы выплаты сокращает выплату до суммы долга. Ну, решение хорошее, сам бы я вряд ли допер.
Скобки гарант твоей безопасности, что ты или кто-то еще не пропустишь ничего в спешке и не влепишь мимо условия, а сократить огромный код на 2 строчки это так себе оптимизация.
Анус ты там себе не пофиксил? Что было бы, если бы аноны и тебе перед этим пофиксили код, а не намёками довели до своего решения?
Нельзя так делать.
На самом деле, привычка везде пихать скобки в рашке берёт начало с перла - там без них написать можно, но будет выглядеть совсем не похоже. А именно на перле и уебкодили до массового появления пыха.
В сишке, плюсах (сярпе, жабе, ещё 100500 ЯП) и внезапно пыхе - можно просто выкинуть.
А можно ещё сократить if/else до (усл) ? действие 1 : действие 2;
>С#
Выкинуть можно, но никто так не делает, официальным там вообще считается такой стиль, что на строчку больше
if ((divisor != 0) && (dividend / divisor > 0))
{
Console.WriteLine("Quotient: {0}", dividend / divisor);
}
https://msdn.microsoft.com/en-us/library/ff926074.aspx
Можно ещё везде начать хуярить названия типов типа ZLPKNSKJA LPZALOOOPA {
.....
}
Тоже смешно будет. Благо сярп - не уёбищный одноглазый питон, и конвенция туда не прибита гвоздями.
Ах, да, и перед второй залупой звёздочек побольше.
>Можно ещё везде начать хуярить названия типов типа ZLPKNSKJA LPZALOOOPA
Нельзя, об этом написано.
https://msdn.microsoft.com/en-us/library/xzf533w0(v=vs.71).aspx
http://www.dofactory.com/reference/csharp-coding-standards
Я не читаю никаких тематических ресурсов и даже про пхп7 узнал читая чужие доки.
Это норма? Что имеет смысл читать, что бы узнавать про очередные модные Gilp'ы и прочие хреновины, что читаете вы?
Я к тому же совсем с динозаврами работаю, которые не проч и на таблицах поверстать
Есть рекомендация PSR-2: http://www.php-fig.org/psr/psr-2/ru/#5-Управляющие-структуры
> Тело каждой управляющей структуры НЕОБХОДИМО заключать в фигурные скобки. Это стандартизирует вид управляющих структур и уменьшает вероятность возникновения ошибок при добавлении новых строк в тело.
Есть PSR, а советы по оформлению кода от Васянов не нужны. Никому не интересно как принято писать код в вашем Урюпинске.
Раздражает когда не ставят скобки, так как когда хочешь что-то дописать надо ставить скобки за них.
Иди читай рекомендации, а не смотри пиратские видеокурсы от быдлокодеров с рутрекера. Ну сейчас его вроде заблокировали, может теперь люди будут больше по правильным учебникам учиться.
И что за намеки про число строк? Простыни на 200 строк пишут только быдлокодеры, а нормальные люди пишут небольшие функции их проблема количества строк не беспокоит.
> Благо сярп - не уёбищный одноглазый питон, и конвенция туда не прибита гвоздями.
Да, отсутствие стандартов - рай для быдлокодера.
На хабре есть еженедельный дайджест:
https://habrahabr.ru/company/zfort/blog/276283/
Также есть хаб по php:
https://habrahabr.ru/hub/php/
>>642033
>>642037
И по мне так самый красивый язык это руби с его ВСЁ объекты, кучей сахара и подобного.
И то там я всегда пишу end в не зависимости от количества строк до.
И вообще что это за стремление к сокращению? Типо "э, смотрите, как я круто умею, усе локанично".
Ну так в Руби опять же можно таким путём код раза в 3-4 сократить, вот только никто так не пишет.
В настоящий момент мой скрипт разросся до значительных размеров и переводит числа всего лишь до 9 999 999: http://ideone.com/7bSfev
При этом изначально я уже знал, что идея для трёх, двух и одного числа делать отдельные функции - провальная. Однако решил довести решение в таком виде до конца.
Сейчас уже понятно, что обработка десятков миллионов и сотен миллионов в этом решении даст ещё около ста строк кода, причём там будет много копирования.
Поэтому, пожалуй, уже и нет смысла доделывать всё таким неблагополучным образом.
Снова стираю всё и начинаю писать с нуля.
В одной функции должно быть разложение трёх чисел, причём количество чисел от трёх до одного должно в ней и определяться.
В эту функцию должно входить определение "рублей" - мы просто на это место будем подставлять "тысячи" и миллионы", когда будем соответствующие числа переводить.
Также там сразу будут меняться "1" и "2" в единицах - будут переводиться в "одна" и "две". Чтобы такого не было в тех местах, в которых это нам не нужно, - будем дополнительно переводить эти цифры и в "один", "два". В нужном месте будем указывать нужный массив с верным вариантом.
В целом оставляю начало прежнего подхода: перевод числа в строку, подсчёт количества символов, а далее разбиение числа на куски математическими способами и перевод в слова.
За время решения задачи узнал много нового, более крепко уяснил пройденный материал.
Всем рекомендую.
Решил довести работу.
Также можно попробовать сделать вывод "рублей", "тысяч" и "миллионов" с помощью условий в if, как советовал ОП.
Всё будет в одной функции, так будет в целом лучше, наверное.
Меня останавливало то, что я не мог в одном условии несколько элементов сравнивать. ОП дал намёк на то, как это делается, спасибо ему, попробую реализовать.
Спасибо. apply это то, что нужно.
https://github.com/disbeliever/php_training/blob/master/students/src/UrlHelper.php
и есть желание как-то обобщить код getSortingUrl и getPagerUrl. Но в getPagerUrl "&page=$page" нельзя передавать в http_build_query, потому что в $page лежит плейсхолдер, который похерится urlencode'ом.
Any ideas?
Сосачую.
Ёбнутая венгерская нотация - как раз поделие некрософта, но из винапи.
У них стандарты меняются раз в 5 лет, а то и чаще.
Твой ноутбучек не позволяет прочитать условие и вызов кода на одной строке? Ну купи гейбук с ретиной, для тебя ж делали.
Для самых маленьких - да, это те самые надписи капсболдом с проёбанными звёздами - LPSTR HPTR HWND DWORD WONNI T PRNS
Причём самое ужасное, когда авторы левых проектов начинали ей следовать и рожать срань вида LPSTR MyHuiRazberiWtoZdEd(HWND WND hvnd)...
А из некроновских особенно вырвиглазны были недокументированные функции ntos.dll - от вида этой ЛеСенкиБукаф и КАПСА в параметрах просто глаза выпадали.
http://ideone.com/d9HsXL
Почему в $a больше на одну итерацию(выводит н в отличии от $b), хотя по сути в $a и $b присутствует $i. Поясните как можно реализовать это более грамотно пожалуйста
Оригинально пошёл как, обычно просто идут с конца с -$i.
Тогда дальше читай >>641682
1. Буквы спереди и сзади текста совпадают - продолжаем цикл, можем вывести эти буквы с начала и с конца.
2. Буквы с начала текста и с конца не совпадают - выводим результат "Это не палиндром" и обрываем цикл.
3. Переменная $i равняется переменной $halflength - выводим результат "Это палиндром".
Тебе осталось в условия это всё добавить, чтобы решить задачу.
Та я на счет условий знаю, меня интересует именно возможность сделать все именно с i++
Всё возможно и именно с $i++ и надо делать.
Я только что форкнул твой код и исправил - всё работает.
Но тебе не покажу, пока сам не решишь.
Спасибо, Антоний.
Аа, обрати ещё внимание на то, какой именно символ даёт каждый раз выражение $lastElement=$lastElement-$i;
Там не совсем то, что нужно.
Подсказка: Там на один больше символ даёт, чем нужно. Далее сам догадаешься.
Стоит.
У тебя два раза просто повторяется в echo "{$word1} {$word2} {$word3}\n".
Ясно же, что оба раза вставит имеющееся на тот момент значение в этих переменных.
Надо использовать цикл в этой задаче, чтобы выводило сначала"{$word1} {$word2} {$word3}\n" два раза, а потом выводило "Я {$word4} {$word5}\n".
Также используй лучше array_rand(), а не mt_rand(). Базарю.
Иначе ты запутаешься во вторых значениях для выбора номера.
>W5.2 Некто кладет в банк 10000 р. Банк начисляет 10% годовых (то есть, каждый год на счету становится на 10% больше, чем в прошлом году). Напиши программу, считающую, через сколько лет в банке будет миллион? Сколько лет будет этому некто? Доживет ли некто до этого дня, если сегодня ему 16 лет?
Я погугли, в php же есть цикл while, а сколько нужно сделать проходов мы не знаем. Или я чего-то не понимаю?
Через while удобнее, действительно.
А в случае с for работу цикла надо ограничивать миллионом: когда он или сумма больше оказывается на счету - цикл завершается.
>А в случае с for работу цикла надо ограничивать миллионом:
Не надо, ставь условие $creditBalance > 0
http://ideone.com/1BtAA3
Почему-то всегда считал, что в цикле for следует ставить условием только значение той переменной, которую увеличиваешь(уменьшаешь).
Такая строка говнокодом не будет?
А почему она должна быть говнокодом?
for (i = 0, Console.WriteLine("Start: {0}",i); i < j; i++, j--, Console.WriteLine("i={0}, j={1}", i, j))
{
// Body of the loop.
}
Используй preg_match_all().
Регулярка неверна, так у тебя и "сын", "сыч", "сыт" и подобное найдёт.
А слова типа "сычевальня" выведет ещё и целиком.
>Почему должна быть говнокодом?
Не знаю. Видел только как его для простых счетчиков используют и подумал, что есть какие-то причины для этого. Да и в примерах во всех тоже условие указывается для изменяемой переменной. Буду знать теперь, что это не обязательно.
Аа, да: то, что находится в квадратных скобках в регулярке - это "один любой из указанных символов в любом порядке".
Почему не работает такой вариант
http://ideone.com/xPD917
>$regexp = "/[а-я][с]{1}[ы]{1}+[а-я][ ]+/";
Это ведь любой символ любое количество раз, включая 0 + с + ы +любой символ любое количество + пробел минимум 1 раз?
Не могу понять, почему выдает ошибку на 23 строке.
Там же оператор "if", после которого должна открываться {
В чем проблема, аноны?
Уже понял, что ошибся с переменной $height, но если она берется из массива, почему до этого было обозначено {$height}, а затем {} ставить не нужно?
Я не дебил, правда
Убери фигурные скобки вокруг переменных в 23, 25 и 26 строках. они там не нужны.
Можешь объяснить, почему в эхо нужно писать скобки, а в операторе нет?
Или скажи, как это гуглить ._.
Я сам ньюфаг, особо не вникал. Просто синтаксис такой. Вообще кажется очевидным, что эти скобки в эхо нужны, чтобы напечатать значение нужно переменной, а не её название. Хотя как тут выше писали сейчас и без скобок работать будет. Но лучше все равно по-нормальному писать.
Ладно, спасибо, анон. Держи котика.
Да, их надо объединить, по сути ведь это одна функция формирования ссылки на список студентов. Необязательные параметры надо сделать необязательными.
Насчет плейсхолдера - тут есть несколько вариантов:
- отказаться от плейсхолдеров вообще, зачем они нужны, кто тебе мешает генерировать ссылки на каждую страницу через UrlHelper? Например так:
$pager->setUrlTemplate(function ($page) {
return ...
});
Или вообще вынести формирование ссылок из пейджера, в принципе логика тут есть, пусть он только страницы считает.
- сделать в UrlHelper готовую функцию которая возвращает URL с шаблоном, вроде getStudentsUrlTemplatе или переделать функцию формирования ссылки на список так, чтобы она принимала и плейсхолдеры, например:
$urlHelper->getSudentListUrl([
'search' => 'hello',
'{page}' => '',
...
]);
В общем вариантов тут много. Надо бы выбрать такой который лучше соответствует принципам ООП, разделения обязанностей, инкапсуляции, который наиболее удобен в использовании, понятен и который нельзя исплоьзовать неправльно.
А что нужно добавить?
>>642325
Это пример как писать не надо: слишком много действий в заголовке цикла, и смотрится плохо. Вывод в консоль надо переставить в тело цикла. Алсо мне не нравится идея менять 2 переменные, из-за этого трудно понять как идет цикл, надо либо избавиться от j-- либо унести это в тело цикла.
>>642344
> Обычно одинарными отдельные символы отображают, но тут вроде нет такой фигни.
Это только в Си/Си++ так. В PHP разница есть, но другого рода: http://php.net/manual/ru/language.types.string.php
> И зачем тут вручную задаются ключи для элементов массива, если это то же самое, что и по умолчанию, но плюс 1 везде?
я думаю чтобы проще было тем кто привык с 1 считать. Вообще, достаточно указать только первый ключ, то есть
$x = [ 1=> 'hello', 'world', 'something'];
Так согласен, нелогично как-то, лучше сразу привыкать с нуля считать.
>>642349
Почитай мануал http://php.net/manual/ru/language.types.string.php#language.types.string.parsing
Спасибо. Буду думать.
Непонятно!
Если $regexp = "/[а-я]*/u"; то в массив заносятся все слова и пробелы.
А если $regexp = "/[а-я]+/u"; то только слова.
Почему так?
Потому что звездочка может значить и отсутствие символа, а + только если символ имеется
>В PHP разница есть, но другого рода: http://php.net/manual/ru/language.types.string.php
Судя по этой ссылке одинарные кавычки - это просто ущербная версия двойных. Есть вообще какой-нибудь смысл их где-то использовать?
По идее это было задумано в perl, чтобы экранировать одни кавычки при выводе других и наоборот, ну и эта идея передалась в php как некий рудимент.
Например, тебе надо вывести строку с наличием определенного типа кавычек, тогда ее можно заключить в другие.
т.е.
echo "Привет, 'Юзернейм'";
echo 'Привет, "Юзернейм"';
Может быть ты хочешь чтобы $x выводилось как есть, а не как значение переменной. Тут-то одиночные кавычки и пригодятся. Или написать строку с двойной кавычкой в ней.
Что такое вкладки со структурой проекта?
Та хрень с изображением дерева папок и файлов?
Этим никто не пользуется, есть поиск по файлам и классам https://www.jetbrains.com/phpstorm/help/navigating-to-class-file-or-symbol-by-name.html
>>642223
Малость мнительная подсказка, не находишь?
Вот сделал, вроде все верно.
http://ideone.com/Qbiffu
>Та хрень с изображением дерева папок и файлов?
Да
>Этим никто не пользуется, есть поиск по файлам и классам
Я знаю, мне удобнее видеть древовидную структуру, чем каждый раз вбивать в поиске нужное место.
К тому же для удалённого репозитория поиск не будет работать.
Да и вообще у этих функций разные задачи.
Норм. Решай дальше.
Что значит "мнительная подсказка"? Больше подсказал, чем следовало? Возможно. Просто ночь впереди - вдруг бы ты возился с этим ночью, когда никого в треде нет.
Считает сейчас верно.
А я вот так исправил предыдущий твой вариант: http://ideone.com/qiSoaL
Можно всё проще сделать: просто $i ставить там, где у тебя $firstElement и $lastElement. На месте последнего - с отрицательным значением, чтобы бралось всё с конца текста.
>Подскажите, как занести в массив все слова содержащие (сы)?
Аа, ну вот тут понятно, что тебе нужно.
1. Функция preg_match_all.
2. Регулярка с сочетанием "сы", по обеим сторонам "любые символы, могут встречаться, а могут и не встречаться".
3. Читать все сообщения, которые относятся к твоему посту.
>[с]{1}[ы]{1}
Не имеет смысла ставить {1} после символа да ещё его заключать в квадратные скобки. Квадратные скобки - это "любой указанный символ в любом порядке".
Мнительная подсказка: да просто поставь в регулярку "сы", а вокруг то, что я написал в предыдущем сообщении, чего тут мудрить?
Wordpress скоро изживёт себя как CMS @
https://kievsmi.net/novosti/sport/144090-xakery-vnedrili-vredonosnuyu-reklamu-v-wordpress.html
например $text = "я ебу собак";
как тут найти вес предложения?
Чтобы не выходить за пределы диапазона значений. Сount же количество элементов считает, а они с нуля начинаются, а не с единицы. Но с array_rand это не нужно.
Спасибо.
http://ideone.com/UGrGI7
Все на 1С Битрикс перейдут. Многоходовочка
Не представляю как можно короче написать.
Неправильно жи есть.
Где переплата, сколько анон вообще заплатил бы в разных банках?
Там софтобанк должен ту же сумму дать, чтои в задаче с кредитом на Айфон - для ориентира.
Сколько мы переплачиваем - это кредитбаланс х персент + пейсервис. Так везде должно быть с их комиссиями. И далее минус манслипеймент.
Названия переменных плохие и вообще с ошибками - нельзя же так
Долго. Года 2. Но с перерывами, иногда месяцами нихуя не делал. В целом, я только дойдя до файлообменника перестал прокрастинировать и начал кодить каждый день, почти.
Конгратс
А чому показывает двойки рядом с бомбой?
Сейчас открылся ряд двоек, надо было продолжать - и прямо рядом с двойкой бобахнуло.
Define "большой"
http://ideone.com/ksuDVA
>для разминочки
Это не для разминочки, я её весь день писал. За 2 года ты и не такое научишься делать, если хуи пинать не будешь, как я.
Не бросай, просто эти люди изучают уже довольно длительное время, ты тоже так сможешь если не забросишь и будешь учить.
Ну не знаю. Я только вчера сел за этот ваш пхп, поэтому считаю свою криворукость естественной на данном этапе. Чего печалиться, все когда-то с хэллоу ворда начинали.
И сразу вопрос. Вот эта штука
>PHP Notice: Use of undefined constant time - assumed 'time' in /home/5hg7qx/prog.php on line 24
Как-бы намекает, что я что-то сделал неправильно. Но ведь работает вроде. Как так то?
Ты это я, бро. Учу третий месяц. Все уже студентов доделывают и на собеседования ходят, а я ебусь с ХТЛМ, КСС И ООП. Я бесполезный кусок говна, уже думаю бросать всё к чертям
Я и не собираюсь бросать, я просто делаю, но когда делаешь, а все время не получается, случаются когнитивные диссонансы, а мозг их не любит и пытается логически объяснить.
>Ты это я, бро.
Да, только я не бесполезный кусок говна, да и ты тоже, просто лукавишь. Человек всегда мыслит позитивно, что бы он не делал, и в глубине души ты считаешь себя хорошим аноном.
>В процессе. Пока запилено только первые три пункта.
Ты это я. Тоже джва года вкатываюсь в кодинг, но только с прошлой осени каждый день пишу. И тоже сейчас файлообмнник пилю. Правда уже первые 4 пункта выполнил.
Ты Slim или Silex используешь?
Но это ты за меня отвечаешь, толстяк. Тут прекрасно видно, что слим
https://github.com/MindiMakridi/filehosting
В смысле "не нужно обращать внимание"? С какой-то целью этот совет дали же.
Хорошим аноном, да, но отнюдь не программистом
Не слушай его, нотисов не должно быть в коде.
Бля, я тоже
Нотисы дают, чтобы писать православно. Если тебе нравится писать код так, как ты его пишешь, это твоего ума дело.
Жил бы в мск, сразу после рулетки пошел бы.
Тогда читай ошибки и гугли их.
У меня страх того, что скажут что-то делать, а я не буду знать как
$result[time] тут у тебя в индексе константа. Нужно либо $time, если нужна переменная, либо 'time', если строка.
Я не помню, тут кто-то недавно делал эту задачу, пусть он подскажет.
У меня в городе на джуна нужно знать как минимум один модный фреймворк и уметь пояснить за него.
Читаю описание "фреймворка" на вики и ничего не понимаю, можешь своими словами пояснить что это?
Если ты понимаешь MVC, а я так понимаю студентов с использованием этого подхода делают, то разобратся в фреймверке труда не составит.
Очевидно, что этого слишком мало, чтобы устраиваться на работу. Надо выучить базы данных + парочку фрейворков, это минимум.
Я понимаю MVC, но очень часто пишу говнокод и не знаю задачки с собеседований. Хочу улучшить скиллы, потом изучить фреймворк и попробовать на вакансию джуна.
Ну как я понимаю джун это?
html/css на уровне сверстать форму, что-то подправить и т.п.
основы js
php(OOP, MVC), mysql на уровне селектов с джоинами, инсертов
Вот, здесь нормально, не ломает вёрстку, раньше помню и тут даже вёрстка ломалась из-за такого.
Знаю 4 фреймворка и еще один Яп (помим жс и фронта) усе равно не берут.
Значит хуево знаешь
Знаешь на уровне "могу рассказать что это такое" или "могу сделать TestHub из оп-поста за пару дней"?
Но как это сделать? Текст уходит за границы дива и не переносится на другую строку, выводится как одна строка.
Спроси в /abu или /d.
\t$result = array(
\t\t'time' => $month,
\t\t'money'=> $paymentTotal
\t\t);
Интересная какая реализация!
Получается, так многое можно доставать из этих функций, меня очень напрягало в них то, что один-единственный return там можно ставить, конкатенацию делать, если несколько значений нужны (а потом их сложно разделить, если нужно разделение для чего-либо при выходе).
Спасибо!
Ты сам до такого додумался или где подсмотрел?
Кто каких студентов тут доделывает? Тут пара анонов третий год доделывает студентов.
О, да точно, это то что надо.
Резать.
Да вроде сам. Первое, что в голову пришло, когда захотел две переменных вернуть.
Вот такие как ты будут более или менее успешными, такие как ты постоянно генерируют в своей голове идеи, а такие как мы будут постоянно писать велосипеды и постоянно учить одну и ту же хуйню, которую не сможем применить на практике.
>>643061
Фреймворк это готовый к повторному использованию код. Например делаешь сайт, нужна валидация форм. Пишешь дофига кода, тратишь уйму времени и сил.
На следующей неделе другой проект. В нем тоже пишешь валидацию форм.
Прошла еще неделя, новый проект. Внезапно в нем тоже нужна валидация форм. До тебя начинает доходить, что наверное писать каждый раз с нуля не очень правильно. Пытаешься скопипастить из предыдущего проекта. Не получается, потому что там все завязано на тот проект, и там есть проверка имени и даты рождения, а тебе нужна еще проверка имейла.
В четвертом проекте тебе нужна проверка пароля.
После глубокомысленного совещания с коллегами приходишь к выводу, что было бы здорово иметь готовый код для проверки форм, который можно использовать в любом проекте (универсальность), и в котором будут все виды проверок, какие только существуют в природе.
Пишете этот код, оформляете на packagist как "superYobaFormValidator2016".
Фактически это библиотека, а не фреймворк. Фреймворк это совокупность таких библиотек, которые связаны общим кодом. Плюс в больших фреймворках есть дополнительные удобные фичи для дебага, для генерации кода, консоль и т.д.
Эх, а я всегда думал, что это такая йоба-программа с няшным интерфейсом, в которой ты делаешь программы, заточенные под что-то определенное.
Подождем еще пару дней.
Глуповато как-то. И слишком пессимистично. Что ты будешь "писать" потом, какой-то невозможный йоба-проект? Будешь править чужой код, фреймворки ставить и на них поднимать средние проекты - максимум.
>>643084
Мне приходило только в массив с помощью array_push забивать, а потом из него вытаскивать.
Так всё уже написано, до нас.
В фреймворках уже всё есть, как я понимаю.
Зачем вообще тратить врем на написание "superYobaFormValidator2016", если всё уже есть в фреймворке Yii каком-нибудь?
Зачем ее резать? Выдаешь сообщение об ошибке, "{$fieldName} слишком длинный"
На стороне сервера тоже должна быть валидация, js ведь можно отключить в браузере, ну или хакер вообще отправит тебе данные курлом.
Нужно дублировать клиентскую валидацию на сервере.
То есть ты хочешь сказать, что все задачи ОПа чисто академические и в реальной жизни в таком виде не встретятся? В банк я точно устраиваться не собираюсь работать.
Представь, что нет никакого ЮИ и прочитай еще раз.
Ты все воспринимаешь дословно, это просто пример того как люди приходят к тому что код нужно делать универсальным, чтобы его можно было повторно использовать.
Естественно в общих случаях используются большие фреймворки.
Хотя для какой-то специфической задачи часто приходится писать и свои библиотечки.
Для того же юи пишут экстеншены например.
>>629809
Исправил замечания.
http://integer64.github.io/site-layout/exercise/mainTask/index.html
>На кнопках ALL GRAPHIC ... правильный ли размер шрифта и паддинги? Что-то они у меня пикселя на 4 выше чем на макете.
Перемерил в ФШ с боков у всех кнопок разный паддинг, поставил 20px. сверху и снизу поставил 12px, шрифт брал из ФШ.
> & # 64 ;
>есть же & copy ;
В макете стоит @ , а не значок копирайта.
>Спрайты соц иконок вроде бы в PNG8, а не в PNG24 - почему?
Потому что в PNG8 появляется белая обводка , хз почему, может быть у меня такой фотошоп.
Всё может быть. Какой-нибудь калькулятор закажут для проекта - вот и пригодится.
Задачки так-то на овладение синтаксисом, понятиями и основными элементами. Это уже пригодится само по себе.
Ну вот что будет, если я сейчас просто забью на эту задачу и пойду дальше? Основные принципы функции я понял.
Да особо ничего, я сам пропускал некоторые
В работе все изучается гораздо быстрее
Если есть возможность нужно идти, да и просто ходить по собеседованиям полезно
Ну я не хочу ходить, потому что мне могут задать вопрос на который я не отвечу, или дать задачу которую я не смогу решить. Тогда подумают что я какой-то дебил и в эту компанию вход считай что закрыт. Я еще не до конца в себе уверен, да и в работе боюсь накосячить.
Такие и зададут если контора норм.
Обычно важно показать гибкость ума и то что у тебя есть идееи для решения. А не вызубрить ответы.
Алсо меня редко звали в который у которых на собеседование были задачи из книги Собеседование на PHP и ебучие HRы. Наверное подбородок не той формы.
Какой задачи? Не вдвоём же тут с тобой сидим.
http://ideone.com/8AvsLP
По результатам с моей сходится.
Расмус Лердорф советует использовать вордпресс в случаях, когда нужно сделать что-то блогоподобное.
http://www.youtube.com/watch?v=DuB6UjEsY_Y
В какой последовательности правильно изучать языки для WEB?
Сss, html, JS, PHP?
Или как-то по другому?
html + css затем js (скрипты на клиенте, в браузере) и php(скрипты на сервере, логика работы сервера)
У меня есть определенный опыт говнокода и чистки веба вилкой, но когда я вижу всю эту серьезную хуйню с фреймворками, которые нужно устанавливать через командную строку, у меня просто руки опускаются. Это ж СОВСЕМ ВСЕ ДРУГОЕ блджад, непонятно с какого боку подойти к этим ларавелам.
Поставил апач (линупс мята inb4: убунта - не линупс), мускул, похапе, немного поредактировал конфиги. А что ещё бы сделать то лол? Хочу поставить nginx для фронта, поднять почтовый сервер (на одном компе можно же несколько сервов поднять? А один сервер может, обрабатывать и php код и, например, ruby код? Я это всё совсем незнат), SSL запилить. Все правильно делаю? Направь меня, анон :3
В них нет ничего такого сверхсложного, они просто большие и это может отталкивать. Как один анон выше писал, если ты понимаешь MVC и применял его на практике, освоить фреймворк будет легче. Попробуй ОПовскую задачу на список студентов.
Спасибо, написано неплохо вроде как.
Но вообще пиздец, все написанные мною пхп-уродцы не готовили меня к миру, где даже для установки jquery используется отдельная консольная утилита. Но что-то нужно делать, иначе всю жизнь плагины для вордпресса ковырять буду да баннеры править.
Учись писать правильно, потом когда будешь Юи осваивать - легче пойдет. Ну и ты всегда сможешь спросить совета в треде.
npm
Код советую показать на проверку (хотя конечно ОП будет традиционно слоупочить, но для через 3 дойдет и до тебя).
Задача на айфон просто сложнее предыдущих (и следующих), на ней все запинаются, некоторые ее с 10-й попытки только делают. Проверяет твою силу воли и целецстремленность.
Скорее всего ты забыл кавычки вокруг 'time' или знак доллара если это переменная. Скорее всего написал time вместо 'time'. Нотисов в программе, разумеется, быть не должно.
Задачи из учебника - они на изучение самого языка. То есть, тебе надо ведь знать что такое циклы, массивы, функции, классы, уметь с ними работать. На работу с такими знаниями ты вряд ли попадешь.
А вот после учебника в задаче на студентов и файлообменник начинаются более сложные вещи - HTML, базы данных, работы с формами, взаимодействие с пользователем, микрофреймворк, MVC. С этими знаниями ты уже почти джун.
Ну а освоив все это ты можешь либо пытаться устроиться на работу либо изучить тот же Юи.
И заметь, что эти этапы обязательны. Не разобравшись в более простых вещах, ты не сможешь делать более сложные.
То есть если упростить то, что я написал то:
Учебник - изучение основ языка PHP
Задачи на студентов/файлообменник - изучение MVC, HTML, веб-приложений, баз данных. То есть как использовать PHP для написания веб-приложений.
Фреймворк Юи 2/Симфони 2 - изучение более продвинутых и высокоуровневых подходов написания веб-приложений.
Это идея разделения кода приложения на 3 части (в противовес подходу когда код пишут в один длинный файл простыней вперемешку), начни отсюда: https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
> ЮИ
> юи
> Юи
Yii произносится как [ji:] (йи). YUI это другой Javascript-фреймворк.
Сам ты фреймворк.
задача про льва толстого
https://ideone.com/37u4Qe
какойто длиннокот получается. чтобы первые две строчки не повторялись, планирую сделать цикл. Но может я рак, и все надо по другому сделать?
чет я херню пишу, нужна помощь
1. неправильная эскейп-последовательность. Правильно: \n
2. нет пробелов между склеенными стрингами. $a . $b будет давать значениеАзначениеБ, подумай, как от этого избавиться.
3. count($array) - тут надо доработать, у нас отчёт в массивах с нуля, что ты и указал. Теперь подумай, чему равно count и что будет, если твой рандом выберет максимальную величину.
Ну и от себя добавлю, что оче много переменных, я бы сократил количество ненужных строк, т.е.
$random5 = A
$randomWord5 = $word5[$A];
можно записать просто как
$word5[$A] = А
4. Дважды просто повторяется в echo:
>$line1 = $randomWord1 . $randomWord2 . $randomWord3;
>$line2 = $randomWord1 . $randomWord2 . $randomWord3;
$randomWord1 и $randomWord2 просто повторяются в разных строках.
Чтобы не повторялись, надо или циклом их изменять, или как-то их по-другому называть, что не будет правильным решением задачи.
Эээ, нет, задача решена не верно!
Вот как у ОПа в учебнике:
> слово1 слово2 слово3
> слово1 слово2 слово3
> Я слово4 слово5
Я же специально и написал:
>как-то их по-другому называть, что не будет правильным решением задачи.
Попробуй сделать с помощью цикла.
1 проход цикла - слово1 слово2 слово3.
2 проход цикла - слово1 слово2 слово3.
3 проход цикла - Я слово4 слово5.
Трипл не врёт!
Если нужна подсказка:
Тебе поможет переменная $i и условие, когда она стала равной 2 - вернуть строку "Я слово4 слово5".
ОП, подскажи!
Теперь всё верно.
>Тебе поможет переменная $i и условие, когда она стала равной 2 - вернуть строку "Я слово4 слово5".
Но зачем лишнее условие внутри цикла? Почему бы не сделать цикл с двумя проходами, а "Я слово4 слово5" сделать уже после цикла?
http://ideone.com/R2KY7S
Вот это:
>$higherAnon = $height > $anonHeight;
>$number = count($higherAnon);
Пролистай назад на урок про условия.
Я не про перевод спрашивал. Я знаю, что там должно быть, но ты сам-то понимаешь что в ней находится?
Вообще за пределами цикла ставить echo надо с осторожностью. Лучше всё в цикле делать для одного решения - моё скромное мнение.
>Вообще за пределами цикла ставить echo надо с осторожностью.
Почему? Как echo вообще с циклом связано?
>Лучше всё в цикле делать для одного решения - моё скромное мнение.
Можешь обосновать? Я просто ньюфаг и не разбираюсь в php, но как не погляди, если в коде того анона просто вынести нужные строки из цикла, то строк кода станет меньше, не будет выполнятся лишних действий(Цикл считает $i от нуля до двух и каждый раз дополнительно проверяет не равно ли оно двум. Во втором случае мы просто считаем от нуля до одного.) и читаемость вроде не страдает.
потому что ты букву пропустил. должно быть if($height > $anonHeight){ , а у тебя if($height > $anonHeigh);{
Вот тут плохо
>if($height > $anonHeigh);{
1)Пропустил t в названии переменной $anonHeight
2)Неверный синтаксис, точка с запятой после скобки не нужна.
И тут
>$number = $sum ++;
Просто $number++; Переменной $sum у тебя даже не создано ранее, а если бы и была, то ты бы не увеличивал $number, а присваивал ему одно и то же значение каждый раз. Тебе бы теорию почитать, что-то понимания синтаксиса совсем нет.
Потому что в большом скрипте может так быть, что в цикл придут переменные, которые уже не будут соответствовать условию для работы цикла, а echo всё равно потом выведется - а вдруг оно уже тоже не нужно?
Для такой небольшой задачи всё нормально. Для более значительных скриптов - надо с осторожностью.
Всё хорошо.
>Потому что в большом скрипте может так быть, что в цикл придут переменные, которые уже не будут соответствовать условию для работы цикла, а echo всё равно потом выведется - а вдруг оно уже тоже не нужно?
Не совсем понял. Ты про то, что в цикле переменная может измениться и echo выведет не то, что нужно? Ну так ведь ошибку с echo найти куда проще, чем если мы просто будем использовать переменную после цикла. А пытаться запихнуть всё решение в один цикл - это как-то странно же, особенно в большом скрипте. И к тому же появляются проблемы с читаемостью кода.
Теперь годно. Разве что строку внутри if табуляцией(или пробелами) выделить рекомендуется, но это уже о красоте и читаемости кода, а не о функциональности.
>Ты про то, что в цикле переменная может измениться и echo выведет не то, что нужно?
Ноуп, я про то, что цикл может вообще не заработать, а echo всё равно выведется.
>А пытаться запихнуть всё решение в один цикл - это как-то странно же, особенно в большом скрипте.
Нормально, это нормально.
приму к сведению, спасибо
>Ноуп, я про то, что цикл может вообще не заработать, а echo всё равно выведется.
Ну да, если нам не нужно echo вне цикла, то логично писать его в цикле. Но это же далеко не всегда справедливо. Собственно в той задаче про Льва Толстого у нас в любом случае будет работать цикл, а для вывода последней строки вообще свои переменные, не связанные с тем, что в цикле делается.
>Нормально, это нормально.
Честно, я даже представить не могу большой скрипт в таком виде. Особенно если там какие-нибудь матрицы, предполагающие цикл в цикле или рекурсия(в php же есть рекурсия?).
Вот тут посмотри, например: >>642118
Или сам скрипт: http://ideone.com/7bSfev
Обрати внимание на какую-нибудь функцию, например, threeNumeralsToText($num, $number, $spelling, $roubles, $i, $x, $femaleSpelling).
Сама задача решена неверно (я её переделываю сейчас, осталось немного), но вот тебе один большой цикл, внутри которого куча других циклов, - так, чтобы просто ты себе такое представил.
Нужно быть осторожным с простым вынесением echo за пределы разных циклов - я только это и говорю с самого начала.
Никаких ошибок в том, что ты предложил, тоже нет, всё там хорошо.
Но ведь каждый вправе сам выбирать подход к написанию гармоничного скрипта. Как, конечно, вправе сам же и решать, что считать гармоничным в этой ситуации.
Уже разобрался, я квадратные скобки ставил внутри других, а надо было после.
Нам нужно две таблицы сделать, в первой - ид юзера и имена. А во второй что сколько колумн должно быть? Какие?
И ещё - как считать взаимные лайки? Значит ли это, что нужно прописывать КОМУ ставили лайки? Очень непонятно
>Пробежался по решениям анонов
Ясн. Жулик в треде, все на курсы повышения РНР с обязательными экзаменами в присутствии преподавателя.
Что ж ты бомбишь, в прошлом треде вбрасывал анон 2 решения своих.
я помощи прошу, чтобы понять, как делать самому.
foreach($array as $key => $value)
5.6. Напиши генератор случайного имени для кошки, собаки, брата или сестры на основе пикрелейтед.
объясните пожалуйста что происходит вот в этой строчке - $randomText = $letters[$random];
ой я понел случайно
Первая таблица - информация о пользователе, да. Id, имя, может еще какие-нибудь данные.
Тут нужно привыкнуть думать объектами: есть объект (пользователь например) - делаем под него таблицу.
Лайк это объект? Естественно, значит делаем под него тоже таблицу.
>во второй что сколько колумн должно быть? Какие?
А какие тебе могут понадобиться для решения задачи, исходя из условия?
В условии сказано, что нужно вывести для каждого пользователя, сколько лайков он поставил, сколько получил, а также взаимные.
Разве не очевидно, что в таблице лайков мы должны хранить информацию о том, кто этот лайк поставил, и кому? (Только не самого пользователя, не имя, а только ссылку на него - гугли внешний ключ).
Если мы сгруппируем записи по id пользователя, то при помощи агрегатных функций можем получить информацию по полученным и поставленным лайкам для каждого, сумму в данном случае.
Гугли: группировка, агрегатные функции.
Эта задача еще учит дробить большое задание на мелкие.
Выведи сначала отдельно кол-во полученные лайки для каждого пользователя вида
id | имя | от кого
Потом поставленные
id | имя | кому
Потом попробуй объединить эти две таблицы (гугли join, inner join, outer join, left join).
id | имя | кому | от кого
Как закончишь с этим можно вернуться к взаимным лайкам. Их можно не хранить, а вычислить на лету при помощи функций mysql.
Что такое взаимный лайк? Это когда пользователь поставил лайк другому пользователю, и получил от него в ответ.
На предыдущем шаге мы получили таблицу, где были колонки кому_поставил и от_кого_получил. Если в них одинаковое значение, значит лайк взаимный. Это нужно как-то отметить, чтобы на выходе получить еще одну колонку 'взаимный'
id | имя | кому | от кого | взаимный?
В поле 'взаимный' можно выставить либо 1/0, либо 1/null.
Эту колонку не обязательно хранить в базе, мы можем получить ее при помощи функций mysql (гугли Функции потока управления программой, control flow functions).
Оператор SELECT используется не только для выборки данных из таблицы, которая хранится в базе данных. Можно создавать данные на лету.
Попробуй написать в консоли (или на sqlfiddle, чтобы не мучиться с кодировкой, если ты с винды)
select 1 as 'one', 2 as 'two', 25 as 'двадцать пять'.
Или
select if(curdate() = '2016-02-05', 'пятое февраля', curdate()) as 'сегодня';
Первая таблица - информация о пользователе, да. Id, имя, может еще какие-нибудь данные.
Тут нужно привыкнуть думать объектами: есть объект (пользователь например) - делаем под него таблицу.
Лайк это объект? Естественно, значит делаем под него тоже таблицу.
>во второй что сколько колумн должно быть? Какие?
А какие тебе могут понадобиться для решения задачи, исходя из условия?
В условии сказано, что нужно вывести для каждого пользователя, сколько лайков он поставил, сколько получил, а также взаимные.
Разве не очевидно, что в таблице лайков мы должны хранить информацию о том, кто этот лайк поставил, и кому? (Только не самого пользователя, не имя, а только ссылку на него - гугли внешний ключ).
Если мы сгруппируем записи по id пользователя, то при помощи агрегатных функций можем получить информацию по полученным и поставленным лайкам для каждого, сумму в данном случае.
Гугли: группировка, агрегатные функции.
Эта задача еще учит дробить большое задание на мелкие.
Выведи сначала отдельно кол-во полученные лайки для каждого пользователя вида
id | имя | от кого
Потом поставленные
id | имя | кому
Потом попробуй объединить эти две таблицы (гугли join, inner join, outer join, left join).
id | имя | кому | от кого
Как закончишь с этим можно вернуться к взаимным лайкам. Их можно не хранить, а вычислить на лету при помощи функций mysql.
Что такое взаимный лайк? Это когда пользователь поставил лайк другому пользователю, и получил от него в ответ.
На предыдущем шаге мы получили таблицу, где были колонки кому_поставил и от_кого_получил. Если в них одинаковое значение, значит лайк взаимный. Это нужно как-то отметить, чтобы на выходе получить еще одну колонку 'взаимный'
id | имя | кому | от кого | взаимный?
В поле 'взаимный' можно выставить либо 1/0, либо 1/null.
Эту колонку не обязательно хранить в базе, мы можем получить ее при помощи функций mysql (гугли Функции потока управления программой, control flow functions).
Оператор SELECT используется не только для выборки данных из таблицы, которая хранится в базе данных. Можно создавать данные на лету.
Попробуй написать в консоли (или на sqlfiddle, чтобы не мучиться с кодировкой, если ты с винды)
select 1 as 'one', 2 as 'two', 25 as 'двадцать пять'.
Или
select if(curdate() = '2016-02-05', 'пятое февраля', curdate()) as 'сегодня';
Cпасибо, буду сейчас разбираться
Гугл выдает либо книжки для чайников с описанием кнопочек юнити, либо профессиональные книги по администрированию, там естественно ничего не понятно.
Вот у меня сегодня случилась какая-то ошибка, а я понятия не имею как проанализировать и вылечить.
В линукс-тред в /s ходил, но на мою убунту там как обычно только поссали и выебали мамку (хуже бе, чесслово).
Прикреплю описание на всякий случай.
Крашится vlc при попытке запустить конкретную webm (прикрепляю к посту, в браузере нормально проигрывается). Ubuntu 14.04, xfce.
Кусок сислога /var/log/syslog на пастбин http://pastebin.com/Gi3cU8E7
Что нужно выучить, чтобы самостоятельно мочь разбираться в таких вещах?
>Вот у меня сегодня случилась какая-то ошибка, а я понятия не имею как проанализировать и вылечить.
Пишешь в гугле и читаешь форумы. В /s/ лучше не заходить, ты уже сам понял почему.
vlc может падать при отсутствии кодека или если вебм кодировали чем-то нестандартным.
> Крашится vlc
Для начала можно запустить его не кликом по файлу, а из терминала, командой вроде
vlc some-file.webm
и посмотреть что там выведется.
По линуксу - надо изучать архитектуру юникса (процессы, файлы, права), bash и консольные команды.
Вот я нагуглил
http://heap.altlinux.org/issues/textbooks/linux_intro/index.html
http://rus-linux.net/MyLDP/BOOKS/inst-322/node1.htm
https://www.debian.org/doc/manuals/debian-reference/
https://www.debian.org/doc/manuals/debian-handbook/
http://linuxgeeks.ru/bash-1.htm
http://www.opennet.ru/docs/RUS/bash_scripting_guide/
Ну и русские записи в логе это конечно кошмар. Как ты их гуглить будешь? Гуглятся только англоязычные сообщения об ошибках. Изучай английский если не знаешь.
Ну и в сислоге нет ничего по поводу vlc.
Господи действительно заработало, сам бы додумался до этого не скоро наверное http://ideone.com/02nSiT
http://ideone.com/lTvJ0P - неправильно работает.
Ты не сверяешь буквы с обеих сторон текста, а просто проверил первую и последнюю на соответствие - и выдал результат, что палиндром.
Уясни первым делом, как работает функция mb_substr с начала текста и - особенно - с конца. Далее пробуй разобраться с условиями.
Разве оно не возвращает от нулевого символа до конца и также от -25 в начало? Я понял именно так. Тогда пойду почитаю еще где-нибудь.
Переводит слова без ошибок.
Однако есть "костыли", от которых мне либо не удалось избавиться, либо показалось не таким важным в этой ситуации.
1. $femaleSpelling и $menSpelling - в основной функции, переводящей тройки чисел в текст, постоянно числа 1 и 2 переводятся по массиву $femaleSpelling в "одна" и "две", а дальше в конкретную функцию для перевода конкретного числа в слова я просто подставляю в нужных местах $menSpelling - функция переводит "один" и "два" опять же в нужные "один" и "два". Получается, во многих местах числа переводятся туда-сюда безо всякого смысла.
2. Формы слов "рубль", "тысяча" и "миллион" подбираются именно с помощью массивов и цикла foreach, а не с помощью условий, как советовал ОП. В принципе, это совсем не сложно (всего три условия для подбора форм), однако целесообразно ли? Функцию я для этого сделаю одну, а формы слов снова будут в тех же массивах. Либо и функций для этого тоже делать несколько. Не вижу или просто не понимаю целесообразности.
Но - тем не менее - чувствую радость и от такого решения задачи, испытываю облегчение, ощущаю себя полным сил для решения следующих задач.
>>644357
-25 у тебя будет той же самой буквой, что и 0 с начала, такие дела.
У тебя же в цикле есть переменная $i, которая с каждым прохождением меняется.
Тебе нужно отрывать по одной букве с конца и с начала текста и сравнивать их.
1. Буквы спереди и сзади текста совпадают - продолжаем цикл, можем вывести эти буквы с начала и с конца.
2. Буквы с начала текста и с конца не совпадают - выводим результат "Это не палиндром" и обрываем цикл.
3. Переменная $i равняется переменной $halflength - выводим результат "Это палиндром".
По-барабану откуда его вызывать, крашится даже не vlc, а наверное xfce: тухнет экран на 1-2 секунды, потом появляется окошко с вводом пароля. Все запущенные приложения закрываются. То есть я не могу посмотреть, что там вывелось в терминале, потому что терминал закрыт.
Команды консоли, права и т.п. поверхностно знаю, хочется как раз углубиться. Ссылки посмотрю, спасибо.
Как написал другой комментатор >>644197 , там скорее всего дело в кодировании вебм, потому что проблема возникает только с некоторыми файлами.
Чтобы гуглить, нужно хотя бы знать, в каком направлении. Если бы я мог найти место в логе, где говорится об ошибке, то смог бы хотя бы загуглить по тексту ошибки. Если в syslog ничего нет, то больше не знаю, куда смотреть.
Можно конечно забить, проблема несерьезная, но дальше может придется иметь дело с другими дистрибутивами, где подобная фигня на каждом шагу, а я же типа около-программист, хочется уметь разбираться в таких вещах.
http://ideone.com/d9mCvn
Задание - надо добавить проверку, выше или ниже этот человек, чем анон, и подсчитать число тех, кто выше. Помогите нубу, наверняка загвоздка пустяковая, но я не могу её найти :С
Чуваки, помогите, пожалуйста, с проверкой на грамматику (Grammar Nazi)
http://ideone.com/g4hvOM
Не все ошибки выводит, хз тот ли способ
СУКА, сработало. А почему так? В мануале написан такой метод записи как у меня.
Ну ты создал из массива еще две переменные - из ключей имена одноклассников и из значений рост.
В условии нужно сравнить просто переменную рост с ростом анонима
Это обычная переменная, как-то так
Нет. xfce это просто десктопное окружение, то есть панель задач, меню пуск, рабочий стол (по моему в отдельных процессах). Если они падают, все программы не должны завершиться.
Соответственно из-за ошибки в раскодировании видеофайла в vlc должен падать только vlc.
За вывод изображения и окон отвечает X-сервер, а также композитор (он добавляет всякие эффекты перемещения окон за счет аппаратного ускорения на видеокарте).
Таким образом, падают либо иксы, либо композитор (не уверен что эта программа так называется по-русски), и падают скорее всего из-за бага в драйверах видеокарты. Новая ли версия драйверов у тебя? Какие драйвера используешь, от производителя или свободные?
Также, посмотри все остальные логи кроме syslog, например, /var/log/messages. Может там что есть.
Насчет терминала - можно перенаправить вывод и поток ошибок в файл
vlc file.x 2>&1 > /tmp/log.txt
Но возможно что по умолчанию vlc ничего не выводит и надо добавлять какую-то опцию. Судя по https://wiki.videolan.org/VLC_command-line_help
надо добавить еще -vvv для подробного логгирования, то есть
vlc -vvv file.x 2>&1 > /tmp/log.txt
Вот тебе в помощь основы командной строки:
https://gist.github.com/codedokode/10539568
https://gist.github.com/codedokode/420c8c12a1edae25f0ec#file-linux1-md
Нет. xfce это просто десктопное окружение, то есть панель задач, меню пуск, рабочий стол (по моему в отдельных процессах). Если они падают, все программы не должны завершиться.
Соответственно из-за ошибки в раскодировании видеофайла в vlc должен падать только vlc.
За вывод изображения и окон отвечает X-сервер, а также композитор (он добавляет всякие эффекты перемещения окон за счет аппаратного ускорения на видеокарте).
Таким образом, падают либо иксы, либо композитор (не уверен что эта программа так называется по-русски), и падают скорее всего из-за бага в драйверах видеокарты. Новая ли версия драйверов у тебя? Какие драйвера используешь, от производителя или свободные?
Также, посмотри все остальные логи кроме syslog, например, /var/log/messages. Может там что есть.
Насчет терминала - можно перенаправить вывод и поток ошибок в файл
vlc file.x 2>&1 > /tmp/log.txt
Но возможно что по умолчанию vlc ничего не выводит и надо добавлять какую-то опцию. Судя по https://wiki.videolan.org/VLC_command-line_help
надо добавить еще -vvv для подробного логгирования, то есть
vlc -vvv file.x 2>&1 > /tmp/log.txt
Вот тебе в помощь основы командной строки:
https://gist.github.com/codedokode/10539568
https://gist.github.com/codedokode/420c8c12a1edae25f0ec#file-linux1-md
Условие задачи здесь http://archive-ipq-co.narod.ru/l1/pasta.html
Догадываюсь, что это потому, что эти же ошибки уже были занесены в предыдущий тип ошибок.
Не знаю, как исправить.
Пробовал заменить ИЛИ между скобками, но не сработало, и не знаю, почему
$regexp = '/([а-я]+[,|:][а-я]+)([а-я][жш]ы[а-я])(координально|сдесь|зделаю)([а-я]+\\sа)/ui';
*на звездочки после каждой скобки заменил
Там всё верно с ИЛИ у тебя - ()|() - так и надо отделять разные ошибки друг от друга.
Но проблемы в самих выражениях в скобках.
Например, в четвёртой скобке - ([а-я]+\\sа) - сработает и на сочетании "лалка азаза".
>array(null)
Это что ещё за перда? Впервые такое вижу.
Для обозначения, что переменная является массивом, можно просто array() поставить.
>array_diff($m[$i], array(null))
Вообще ни хрена не понимаю, что это и для чего.
Дожил.
Ты не с нуля идёшь, есть какой-то опыт в программировании? У ОПа такого нет просто, всё решается в разы легче и проще.
спасибо большое, исправил
нагуглил, т.к. хотел удалить пустые элементы массива - они выводились в кавычках в ошибках
пытался использовать просто preg_match, т.к. preg_match_all уже после задачи идет, но тогда еще меньше ошибок выводит
https://ideone.com/nfbTod
>>643515 кун
Не рановато ли куда-то устраиваться?
>>644950
Нормально, только мудрости с $end можно было и сократить: в первом случае поставить в первое действие цикла $i = 1, далее для нахождения первого символа с начала текста поставить $i - 1 (будет 0 - как раз начнёт считаться "А" первая), а для нахождения первого символа с конца поставить -$i - будет сразу -1 (начнёт идти с конца строки, выдаст букву "а" последнюю).
Скинь потом в тред.
Мне надо делать запрос к странице и проверять её ответ по расписанию. Нагуглил, что запрашивать страницу можно через fsockopen, взял пример кода:
<?php
$fp = fsockopen ("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
fputs ($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
while (!feof($fp)) {
echo fgets ($fp,128);
}
fclose ($fp);
}
?>
Без изменений код вполне работает и возвращает страницу example.com. Однако, при попытке смены хоста на тот, что мне нужен, возвращает 403 ошибку. Из браузера запрашиваемая страница грузится.
ЧЯДНТ?
Я 3 года пхп учу, что же тут рановатого?
Ты наши задачи на SQL решал? Решения мне показывал? Если нет, считай что ты даже на уровне джуна не знаешь базы данных.
Нормальный вопрос на джуна, чего тебе не понравилось? Какой из тебя программист если ты даже этого не можешь?
Если бы это задание было на джуна, я бы его уже нагуглил. Но это задание вовсе не на джуна.
ОДно минимальное значение выводится вот так.
SELECT MIN(CONCAT(first_name, last_name) from manager JOIN claim ON manager.id = claim.manager_id
А как вывести два минимальных я в душе не ебу, ибо кол-во полей заранее неизвестно, а задачи свои на палиндромы шкальникам оставь плз.
Ну-ка выведи мне это мразь, раз такой умный. Вангую ты просто шкальник с палиндромом, решивший выебнутся, уткнись в свои регулярки и не высовывайся.
Задание 3. Напишите запрос, который выведет двух менеджеров, у которых количество связанных заявок меньше, чем у остальных.
При этом, объедините значения first_name и last_name в одно поле full_name.
так, погуглил и прочее и понял что надо пользоваться курлом. Но, так же в задании говорится про отправляемые данные в виде
<taxi:RegNum>SomeNum</taxi:RegNum>
попробовал такую конструкцию
$ch = curl_init("http://82.138.16.126:8888/TaxiPublic/Service.svc?wsdl");
$xml = array("xml"=>"<taxi:RegNum>ем33377</taxi:RegNum>");
$fp = fopen("example_homepage.txt", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_exec($ch);
curl_close($ch);
fclose($fp);
но ответ почему-то пустой. Может я неправильно запрос пересылаю?
>>645084
Алгоритмов тут может быть несколько.
Например, я сам делал через массив, у которого в ключах регулярки для выявления ошибок, а в значениях описание сути ошибки.
Такого типа:
$regexp = array(
'/[а-яё]\\s?координально\\s[а-яё]+/ui' => 'Ошибка в слове \"кардинально\"!',
'/[а-яё]\\s?сдесь\\s[а-яё]+/ui' => 'Ошибка в слове \"здесь\"!',
'/[а-яё]*\\s?[^а-яё]здела[лнoюет]\\s[а-яё]+/ui' => 'Приставки \"з\" не бывает!'
) - и так далее.
Далее циклом foreach раскладываешь этот массив на ключи и значения, функцией preg_match_all находишь все ошибки под каждую регулярку-ключ в массиве, выводишь их рядышком со значениями.
>>645151
Какой, дай ссылку.
Твою же мать, забываю всё время про звёздочки...
Вот тут этот массив: http://pastebin.com/5n8wcvgg
Вот чужой пример, но он работает как мой, только не определяя тип ошибки: http://ideone.com/T4ewwV
Огромное спасибо за ответ, хорошее решение
Вот да, там всё то же, только массив с регулярками и описаниями ошибок сделать - и выводить ключи и значения друг напротив друга.
Большое спасибо, попробую разобраться и сделать сейчас
эко грузана порвало, как там твоя жируха из пятирочки, все жирее за кассой?
действительно. спасибо
Есть такое: http://httpbin.org/ для тестирования HTTP запросов вообще.
Ты зря возишься с курлом, надо брать нормальную высокоуровневую библиотеку-клиента вроде guzzle. И конечно надо хорошо изучить протокол HTTP перед тем как вообще за это браться. А то ты сам не понимаешь что делаешь. Если ты копируешь код не понимая как он работает то ничего хорошего не выйдет.
>[,|:]
Квадратные кавычки означают "один любой из указанных символов в любой последовательности".
Поэтому знак ИЛИ там не нужно ставить.
Далее '/здела[люн]/ui' сработает и на "Разделан под орех".
И контекст у ошибок непонятен - слишком мало чего берётся за пределами ошибки, не понятно, где её искать в тексте.
Поэтому ОП не одобрит такого, инфа соточка.
Но ты на верном пути, ещё немного тебе поправить осталось в самих регулярках.
Хотел ещё больше "автоматизировать" - удалить порядковые номера у элементов массивов, но почему-то не удалось.
Мне все знакомые программисты со стажем советуют бросать решать задачки ОПа после регулярных выражений и переходить к его пастам, к ООП сразу, даже минуя HTML и CSS.
Потому что якобы для реальных проектов всё равно куча чужих костылей понадобится, разбирать чей-то проект всё равно придётся, можно таким вот образом сэкономить на обучении.
Не знаю, не верится.
Пока иду и ничего не пропускаю, но уже точно знаю, что некоторые бонусные задачи ОПа мне будут не по зубам, поэтому спокойно через них перешагну.
Попутно посмотрел первый урок слитого на YouTube курса от Школы программирования по Yii2 - вполне всё как-то неплохо и вполне понятно звучало, то запустить, там-сям то-то и то-то прописать.
Жажду перейти к ООП.
Я, когда читаю задачи ОПа, пытаюсь их решить сразу, ещё не смотреть код полностью. Получаются такие вот решения. Потом сверяюсь с ОПом.
Чому не получилось?
Всё получилось:
http://ideone.com/pbo7xi
Возможно, ты где-то ошибся в запятых или кавычках.
Руки отрывать. "Да' никогда не будет выпадать, в одном из вариантов будет ошибка Undefined offset на массиве. Вы бы хоть свой код тестировали, наркоманы.
Благодарю, откорректировал.
Смущает только одно сообщение, не выводит "ши" перед "пишы"
Ошибка в буквосочетании: пишы с
Не, это я погорячился, у тебя же там индексы массива вручную от 1 проставлены, так что все правильно. А c count да, ошибка будет.
>даже минуя HTML и CSS
Будешь как наш коллектив на работе - прислали задачу переделать дизайн, фронтенд в отпуске, все пизды получили за срыв сроков презентации, ибо не осилили существующую верстку.
Вот я тоже так рассуждаю.
А они, типа, всё равно же придётся копаться в чужом говнокоде, вот тогда всё и уяснишь.
Траллишь?
$array = ['хуй','хуй','хуй'];
$value = $array[count($array)]; // 3
Результат - ошибка offset, ибо в массиве нет члена под номером 3.
если без нумерации, то счет с 0
Например, 0 1 2 3
Всего элемента 4, но ключи выбираем от 0 до 4-1=3
Аа, это.
Я тоже с таким столкнулся, когда делал, сейчас вспомнил.
Придётся смириться: при пересечении ошибок уже выданный одной регуляркой кусок не выдаст снова.
ОП что-то там говорил про callback функцию, ещё что-то, но я удовлетворился тем, что есть.
Значит, все правильно. Спасибо.
А есть ещё такая хуйня. Я в мануале вычитал, что если элементу массива дать какой-то номер, то все остальные безномерные массивы будут считаться с последнего присвоенного номера. Поэтому можно просто первому элементу присвоить номер 1, а остальные сами пронумеруются начиная с 1. Таким образом, потребность в -1 должна отпасть.
Это просто охуенно
> что некоторые бонусные задачи ОПа мне будут не по зубам, поэтому спокойно через них перешагну.
Ты поступаешь глупо. Ладно, если бы они были слишком элементарные - тогда можно было бы и пропустить.
Я в последний день вышел перед презентацией, а там страниц править целая гора была. Кое-что успел поправить конечно, но пизды все равно получили.
По аналогии следующая задача: http://ideone.com/3Qp5OY
Только тут рандомом считается и количество слогов.
Там, где буквы в круге и нужна тригонометрия?
Не-не, я тут три недели делал числа прописью, жду разбора от ОПа сейчас.
А подобные задачи я до конца этого года буду решать.
И надо ещё дойти до этой задачи, я пока калькулятор делаю ещё только.
Ну норм, пойдет.
Оп не все время тут сидит. Я подрессировать захожу время от времени. Еще несколько анонов бывает проверяют.
Респект таким парням
Да, падает "x-сервер".
Понятия не имею, какие драйвера. Разве их нужно обновлять вручную? Я думал, что upgrade обновляет все зависимости.
Не успевает он ничего записать в файл, 0 байт. Успеваю заметить с огромной скоростью пробегающие в терминале строки, через 0.5 секунды черный экран и приглашение залогиниться. Все запущенные программы помирают.
/var/log/messages нет такого файла
Основы командной строки знаю, только cp и mkdir мне тут не особо помогут.
http://sqlfiddle.com/#!9/4ffa58/1
оцените, кто-нибудь
Там в этом окне наверно еще интересные подробности есть?
Насчет консоли - ты наверно не перенаправил поток ошибок, то есть не дописал 2>&1 к команде, потому они не пошли в файл.
Насчет драйверов - погугли про то какие видедрайвера бывают в убунте. Ну и надо подробности ошибки посмотреть, и лог от vlc, может там что интересное будет.
> elseif ($age>100) {
Тут лучше написать просто else без условия
> $year = $year + 1;
Можно $year++; А можно вообще убрать переменную $year и вычилять число лет по разнице возрастов.
В остальном верно.
>>639262
Стоит размещать HTML и PHP код в отдельных файлах. Читай: http://www.phpinfo.su/articles/practice/shablony_v_php.html
>>639269
В ОП посте есть задачи по SQL, там же и ссылки на туториалы.
>>639294
Имейте в виду, уровень очень ознакомительный - ни про нормализацию, ни про связи особо не рассказывают.
>>639300
Правильное решение.
Гитхаб ОПа: https://github.com/codedokode/ - правда я его никому ИРЛ не показываю, да и при поиске работы у меня гитхаб ни разу не справшивали.
>>639407
По поводу кавычек - смотри PSR, если там ничего не написано то можешь использовать любые.
>>639449
Получается ты дублируешь функционал php.ini (и .htaccess), есть ли смысл? Ну и если и делать так, то менять надо display_errors, а не error_reporting.
>>639440
Ты уже 4 года на бордах? Не пора ли задуматься и остановиться (для нашего треда конечно можно сделать исключение)?
>>639462
Интересный вопрос про локализации. Локаль ru_UA не совсем украинская - это значит "русский язык, используемый на территории Украины". По моему это баг (можешь даже написать о нем в багтрекер). Очевидно что в обоих случаях название месяца должно выводиться в одном и том же виде.
Если тебе надо выводить название месяца, лучше использовать свою таблицу или массив месяцев. Так как после исправления бага форма слова может поменяться.
>>639534
> [\\s"()-]
Зачем разрешена кавычка?
Также, можно упростить реглярку: вместо разделения на группы по 3 и 7 цифр можно просто сделать правило, что должно быть ровно 10 цифр с любым количеством дополнительных символов между ними (скобок, пробелов, кавычек).
Также, не экономь на названиях перемнных:
$bnumbers -> $badNumbers
Если тебе неудобно писать длинные имена на идеоне, поставь нормальный редактор или IDE.
Так, в общем идея верная, но неплохо бы упростить регулярку.
>>639559
Не стоит парсить HTML регулярками.
Гитхаб ОПа: https://github.com/codedokode/ - правда я его никому ИРЛ не показываю, да и при поиске работы у меня гитхаб ни разу не справшивали.
>>639407
По поводу кавычек - смотри PSR, если там ничего не написано то можешь использовать любые.
>>639449
Получается ты дублируешь функционал php.ini (и .htaccess), есть ли смысл? Ну и если и делать так, то менять надо display_errors, а не error_reporting.
>>639440
Ты уже 4 года на бордах? Не пора ли задуматься и остановиться (для нашего треда конечно можно сделать исключение)?
>>639462
Интересный вопрос про локализации. Локаль ru_UA не совсем украинская - это значит "русский язык, используемый на территории Украины". По моему это баг (можешь даже написать о нем в багтрекер). Очевидно что в обоих случаях название месяца должно выводиться в одном и том же виде.
Если тебе надо выводить название месяца, лучше использовать свою таблицу или массив месяцев. Так как после исправления бага форма слова может поменяться.
>>639534
> [\\s"()-]
Зачем разрешена кавычка?
Также, можно упростить реглярку: вместо разделения на группы по 3 и 7 цифр можно просто сделать правило, что должно быть ровно 10 цифр с любым количеством дополнительных символов между ними (скобок, пробелов, кавычек).
Также, не экономь на названиях перемнных:
$bnumbers -> $badNumbers
Если тебе неудобно писать длинные имена на идеоне, поставь нормальный редактор или IDE.
Так, в общем идея верная, но неплохо бы упростить регулярку.
>>639559
Не стоит парсить HTML регулярками.
Там наверно можно поставить свои шаблоны для форм? Надо либо найти либо сделать шаблоны, совместимые с бутстрапом. Алсо, ОПу не нравится когда этот бутстрап суют везде. Если ты делаешь дизайн сайта то стоит как минимум пересобрать свою версию бутстрапа, взяв только нужное и убрав лишнее (вроде всем надоевшего Ариала 14-го размера).
>>639606
Значит надо подучить регулярки.
>>639723
Нужно обе технологии.
>>639729
Не знаю. Временем запуска?
>>639731
Может кавычки были одинарные?
>>639845
Ты пишешь код не только для браузера, но и для коллег-разработчиков, для роботов, поисковых ботов. Всем им удобнее когда разметка сематичная, то есть теги расставлены правильно.
>>639865
Много кода, надо убрать копипасту. Число 5000 в коде надо заменить на переменную.
>>639896
Можно сделать класс-библиотеку с нужными функциями, выложить на гитхаб, добавить в packagist чтобы она была доступна через композер. Никто не хочет заняться?
Хотя сначала стоит погуглить, может уже кто-то сделал.
>>639902
Можно сделать библиотеку и подключать где требуется.
Там наверно можно поставить свои шаблоны для форм? Надо либо найти либо сделать шаблоны, совместимые с бутстрапом. Алсо, ОПу не нравится когда этот бутстрап суют везде. Если ты делаешь дизайн сайта то стоит как минимум пересобрать свою версию бутстрапа, взяв только нужное и убрав лишнее (вроде всем надоевшего Ариала 14-го размера).
>>639606
Значит надо подучить регулярки.
>>639723
Нужно обе технологии.
>>639729
Не знаю. Временем запуска?
>>639731
Может кавычки были одинарные?
>>639845
Ты пишешь код не только для браузера, но и для коллег-разработчиков, для роботов, поисковых ботов. Всем им удобнее когда разметка сематичная, то есть теги расставлены правильно.
>>639865
Много кода, надо убрать копипасту. Число 5000 в коде надо заменить на переменную.
>>639896
Можно сделать класс-библиотеку с нужными функциями, выложить на гитхаб, добавить в packagist чтобы она была доступна через композер. Никто не хочет заняться?
Хотя сначала стоит погуглить, может уже кто-то сделал.
>>639902
Можно сделать библиотеку и подключать где требуется.
Мельком глянул, вижу такое:
- ради логотипа не стоит тянуть целый шрифт, надо либо сделать логотип картинкой, либо вырезать лишние буквы из шрифта (и назвать его другим именем на случай если он где-то потом понадобится!)
да и работы увидят текст ebpaint без первой буквы, плохо.
Позже гляну еще.
> <i class="service-block-icon icon-android"></i>
Это бесполезный тег, и от него надо избавиться, например заменив на псевдоэлемент.
Я не могу решить третье задание. Бросать или пытаться что-то там решить и отправить фирме?
http://pastebin.ru/yvVHxv0o
Бросай. Сомневаюсь, что кому-то нужен такой агрессивный уёбок, как ты
Вместо того чтобы расстраиваться, лучше изучить темы, которые ты не знаешь: проектирование БД, нормализация, джойны, группировки, чтобы в следующий раз чувстовать себя увереннее. У нас кстати в ОП посте есть задачки на SQL.
http://ideone.com/HmEaE7
$str2 создал думая что вызывая переменные из массива по новой оно будет генерировать новое рандомное число в переменной каждый раз и будет получаться, но нихуя. Более того, у меня почему- то каждый раз проебывается первое слово,а иногда и третье. Помоги плиз.
Ошибки внизу для кого пишут? У тебя там обращение к несуществующему индексу массива.
Оу, спасибо. В глаза ебусь, буду внимательнее, а как сделать чтобы при обращении к переменной оно каждый раз брало рандомное слово? Получается что $str1 и $str2 выводят одинаковые слова.
Все, спасибо, уже не нужно. Придумал как сделать. Можешь проверить (ссылка та-же).
Поправь отступы в выводе. Но и лично я бы советовал вместо mt_rand(0, число) использовать mt_rand(0, count($arrayName)-1). Читая чужой код никто не любит, когда из ниоткуда появляются константы т.к. далеко не всегда очевидно о чем думал автор кода, когда их писал.
Изначально так и думал сделать, но посчитал что математика не будет работать в значении рандома и отбросил этот вариант.
Чтобы выводилось содержимое переменной, а не её название.
>Попробуй подумать. Или хотя бы погуглить.
Проблема в том, что всё работает и без скобок. Во всяком случае в ideone
По цифрам в результате всё верно. Но, во-первых, как тебе намекает вот это:
>PHP Notice: Undefined variable: paymentTotal in /home/ixNm2b/prog.php on line 9
Неплохо бы написать что-то типо $paymentTotal = 0 прежде чем писать $paymentTotal = $paymentTotal + $creditBalance; Оно хоть и прокатило, но по сути ты создавая переменную пока еще без значения присваеваешь ей саму себя, что не ок.(Ну и плюс для кртакости можно $paymentTotal += $creditBalance; юзать вместо $paymentTotal = $paymentTotal + $creditBalance;)
И лично мне не понравился вариант решения через 20 итераций. Он делает твою функцию неуниверсальной. Да, эту задачу она решает правильно, но вставить туда сумму побольше и она остановится раньше чем нужно.
$paymentTotal я добавлял, но потом убрал, глянул что и так работает, и не стал возвращать
можно сделать бесконечный цикл, но тогда он будет бесконечным, лол. не совсем понимаю, как убрать ограничения $i и при этом не сделать цикл бесконечным.
>можно сделать бесконечный цикл, но тогда он будет бесконечным, лол. не совсем понимаю, как убрать ограничения $i и при этом не сделать цикл бесконечным.
В условии не обязательно должно быть именно $i.
> бесконечным, лол. не совсем понимаю, как убрать ограничения $i и при этом не сделать цикл бесконечным.
а какая разница, если есть break?
так или иначе цикл завершится
меняем ежемесячный платеж, сумма кредита не будет уменьшаться, и тормоз никогда не наступит... АПОКАЛИПСИС бесконечный цикл
Вставь проверку тогда. если после платежа сумма кредита не уменьшилась, то echo "Ты будешь расплачиваться за свой айпад ВЕЧНОСТЬ" и exit();
остальные переменные так же могут дать конечный\бесконечный цикл, зачем делать дополнительное условие для выхода из цикла, если и так все хорошо? объясните нубу
хорошая идея. щас сделаю
Я бы еще копейки округлил
Где там что верно, если в return идёт $paymentTotal, а результат - всё по нулям?
Надо форкать.
Лучше оставлять недоделанные варианты, чтобы потом ОП объяснил, где там были проблемы. Часто уже после разбора анонов он приходит и по хардкору поясняет, что там было не так.
А ты уже переделал код.
По-моему, смириться приходится только когда выводишь через массив, как я в самом начале делал.
А тут просто регулярку отредактировал, и нормально выводит все.
После задачи на вывод чисел прописью это всё показалось не таким уж и сложным.
Следующую неделю буду пробовать решить бонусные задачи.
Если мне будет слишком тяжело из-за необходимости использовать сложные математические уравнения - перехожу к HTML и CSS.
Также сделал большую таблицу или прогресс-бар с возможностью отмечать выполненные задания и следить за общим прогрессом обучения.
Когда буду способен - сделаю для братишек и себя подобную же интерактивную таблицу.
>>646236
А теперь не показывает ошибку "пишы", разве нет? Выдаёт "Ошибка в буквосочетании: Жы,ши пишы с", но там ведь две ошибки.
Вот именно, что приходиться мириться с подобным в этой ситуации.
Вот что забыл: не смог сообразить, как ввести поддержку дробных чисел - хард-мод в решении этой задачи.
"Приходиться мириться" - боже, какой позор, только полюбуйтесь на это...
>>646268
ОП что-то говорил про callback-функцию, про отсчёт в цикле байтов от каждой ошибки - там всё сложно.
Поэтому не обращай внимания: у тебя полностью подходящий для этой ситуации вариант.
http://ideone.com/cEOdpw
Поменял на единицу - не робит. Я правильно понял что если поменять знак на $from функции mb_substr - то оно будет брать аналогичный символ с конца?
Если я всё правильно понял, то у тебя конечный результат зависит от последних сравниваемых символов, а не от строки вцелом
мимоДелаюЭтуЖеЗадачу
Две ошибки. Ты сравниваешь не те символы. И >>646304.
Модифицировал что бы было видно:
http://ideone.com/gZSbey
Ещё вопрос - mb_substr($text, -0, 1) = mb_substr($text, -1) ?
Нормальное решение.
Да.
Мне всё еще не нравится у тебя вот эта часть:
else {
$result = "Палиндром";
}
По сути ты тут много раз в цикле переприсваеваешь переменную одним и тем же значением. Зачем? Не проще до цикла при создании переменной сразу написать $result = "Палиндром"; ?
В студентах можно вообще не делать классы-контроллеры, а использовать обычные скрипты. Там всего 2 контроллера (список студентов и форма).
- под картинками портфолио должно быть больше паддинга, сравни с макетом
- логотип надо сделать картинкой. я посмотрел - в том же ИЕ шрифт не подключается и логотип выводится ариалом
Насчет знака копирайта - это явно ошибка дизайнера, ну ладно, пусть будет, только зачем его писать через код символа, если можно написать просто @ ?
В адаптивной версии возможно стоит добавить небольшой паддинг (5px) на блок с заголовком, а то там текст "digital & branding agency ..." упирается в края слева и справа.
В адаптивной версии возможно стоит уменьшить расстояние между пунктами меню по горизонтали, чтобы они не спешили переноситься на новую строку.
На мобильных устройствах обычно нет ховера и потому в адаптивной версии для портфолио стоит отключить greyscale.
> <li class="item-menu">
Тут можно было схитрить, не ставить класс, а использовать селектор .menu > li. Но можно и так.
> <p class="slider-text">
Мне конечно кажется что p тут не очень семантичен, так как это подзаголовок, а не абзац в тексте. Следовательно, логичнее использовать div. Но это опять же, не критично, можешь так оставить.
> <i class="service-block-icon icon-android"></i>
Это надо заменить псевдоэлементом
> href="tel:0247 541 65 87"
Тут номер стоило записать без пробелов
> 0247 541 65 87
А вот тут стоило поставить неразрывный пробел (почитать: https://www.artlebedev.ru/kovodstvo/sections/62/ http://webstyle.sfu-kras.ru/nerazryvnyj-probel http://lurkmore.to/%D0%A2%D0%B8%D0%BF%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0 ). Не используй пробел вставляемый через Alt + 0160 так как его не отличить от обычного, лучше явно писать nbsp.
https://github.com/Integer64/site-layout/blob/gh-pages/exercise/mainTask/css/styles.css#L104
> display: inline-block;
> float: right;
float подразумевает display: block
> font-family: "Lato", sans-serif;
Это что-то часто повторяется в CSS, можно бы убрать лишние упоминания.
> We are <span>Webpaint</span>
> <span>digital <span class="amp">&</span> branding</span>
Здесь надо применить em или strong. Не очень понял зачем для амперсанда отдельный класс.
> we would love <br>to turn ideas
Лучше бы конечно чтобы оно само собой переносилось, например за счет ограничения по ширине. Да и с адаптивностью это лучше работает. А сейчас на небольшой ширине экрана из-за этого надпись переносится на 3 строки.
> .vcard {
> .fn {
Эти классы могут встретиться и на других страницах сайта. Надо ограничить действие этих правил только подвалом.
Я тут еще посмотрел скриншоты в разных браузерах: https://www.browserstack.com/screenshots/8997c7b89054e6ed1c369b70a1d3edf2ef1a9972
Там явно видна проблема с br в подзаголовке на слайдере и с шрифтом в логотипе. В ИЕ8 не подлючился шрифт - можешь глянуть по этому поводу статью (а также, у тебя нет eot-шрифтов):
https://habrahabr.ru/post/113136/
Хотя если это только в ИЕ8 и ниже, а в ИЕ9 все ок, то можно особо не заморачивается - текст читается и на том спасибо.
Квадратные кнопки в ИЕ8, проблемы в ИЕ7/6 можно не смотреть, это вполне нормально для этих браузеров.
В спрайте https://github.com/Integer64/site-layout/blob/gh-pages/exercise/mainTask/img/sprite-soc.png стоит оставлять промежутки между картинками, так как например при масштабировании страниц там могутт 1-2 пикселя от соседней картинки вылезти.
Так, в общем, хорошая работа, исправь замечания выше, и я думаю все будет готово.
> Потому что в PNG8 появляется белая обводка , хз почему, может быть у меня такой фотошоп.
Это такой формат, там нет полупрозрачных пикселей с альфа-каналом (только полностью прозрачные) и потому они превращаются в непрозрачные. Надо при сохранении выбрать цвет matte под цвет фона на сайте, то есть темно-серый. Почитай про различия между PNG8 и PNG24.
- под картинками портфолио должно быть больше паддинга, сравни с макетом
- логотип надо сделать картинкой. я посмотрел - в том же ИЕ шрифт не подключается и логотип выводится ариалом
Насчет знака копирайта - это явно ошибка дизайнера, ну ладно, пусть будет, только зачем его писать через код символа, если можно написать просто @ ?
В адаптивной версии возможно стоит добавить небольшой паддинг (5px) на блок с заголовком, а то там текст "digital & branding agency ..." упирается в края слева и справа.
В адаптивной версии возможно стоит уменьшить расстояние между пунктами меню по горизонтали, чтобы они не спешили переноситься на новую строку.
На мобильных устройствах обычно нет ховера и потому в адаптивной версии для портфолио стоит отключить greyscale.
> <li class="item-menu">
Тут можно было схитрить, не ставить класс, а использовать селектор .menu > li. Но можно и так.
> <p class="slider-text">
Мне конечно кажется что p тут не очень семантичен, так как это подзаголовок, а не абзац в тексте. Следовательно, логичнее использовать div. Но это опять же, не критично, можешь так оставить.
> <i class="service-block-icon icon-android"></i>
Это надо заменить псевдоэлементом
> href="tel:0247 541 65 87"
Тут номер стоило записать без пробелов
> 0247 541 65 87
А вот тут стоило поставить неразрывный пробел (почитать: https://www.artlebedev.ru/kovodstvo/sections/62/ http://webstyle.sfu-kras.ru/nerazryvnyj-probel http://lurkmore.to/%D0%A2%D0%B8%D0%BF%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0 ). Не используй пробел вставляемый через Alt + 0160 так как его не отличить от обычного, лучше явно писать nbsp.
https://github.com/Integer64/site-layout/blob/gh-pages/exercise/mainTask/css/styles.css#L104
> display: inline-block;
> float: right;
float подразумевает display: block
> font-family: "Lato", sans-serif;
Это что-то часто повторяется в CSS, можно бы убрать лишние упоминания.
> We are <span>Webpaint</span>
> <span>digital <span class="amp">&</span> branding</span>
Здесь надо применить em или strong. Не очень понял зачем для амперсанда отдельный класс.
> we would love <br>to turn ideas
Лучше бы конечно чтобы оно само собой переносилось, например за счет ограничения по ширине. Да и с адаптивностью это лучше работает. А сейчас на небольшой ширине экрана из-за этого надпись переносится на 3 строки.
> .vcard {
> .fn {
Эти классы могут встретиться и на других страницах сайта. Надо ограничить действие этих правил только подвалом.
Я тут еще посмотрел скриншоты в разных браузерах: https://www.browserstack.com/screenshots/8997c7b89054e6ed1c369b70a1d3edf2ef1a9972
Там явно видна проблема с br в подзаголовке на слайдере и с шрифтом в логотипе. В ИЕ8 не подлючился шрифт - можешь глянуть по этому поводу статью (а также, у тебя нет eot-шрифтов):
https://habrahabr.ru/post/113136/
Хотя если это только в ИЕ8 и ниже, а в ИЕ9 все ок, то можно особо не заморачивается - текст читается и на том спасибо.
Квадратные кнопки в ИЕ8, проблемы в ИЕ7/6 можно не смотреть, это вполне нормально для этих браузеров.
В спрайте https://github.com/Integer64/site-layout/blob/gh-pages/exercise/mainTask/img/sprite-soc.png стоит оставлять промежутки между картинками, так как например при масштабировании страниц там могутт 1-2 пикселя от соседней картинки вылезти.
Так, в общем, хорошая работа, исправь замечания выше, и я думаю все будет готово.
> Потому что в PNG8 появляется белая обводка , хз почему, может быть у меня такой фотошоп.
Это такой формат, там нет полупрозрачных пикселей с альфа-каналом (только полностью прозрачные) и потому они превращаются в непрозрачные. Надо при сохранении выбрать цвет matte под цвет фона на сайте, то есть темно-серый. Почитай про различия между PNG8 и PNG24.
> Слышал что у сайтов на бутстрапе, какие то проблемы с СЕО и выдачей в поиске? Это так? Если да, то почему?
Сомневаюсь. Также, СЕО это темная магия и подтвердить или опровергнуть это невозможно, если только в документации поисковых систем такого не написано.
> Как себя правильно оценить
Посмотри на вакансии, сколько за них предлагают, посмотри резюме (если есть в свободном доступе), сколько люди просят. Зарплата определяется рынком как комппромисс между пожеланиями работника и работодателя.
Если ты начинающий то возможно для тебя самым эффективным способом повысить зарплату будет смена работы.
>>640271
> if (floor(($number % 100) / 10) == 1) {
> $word = $word5;
> $word = $word1;
> break;
Тут лучше сразу писать return $word5. Вместо вложенных ифов и свитча наверно лучше сделать блок ифов на одном уровне.
> $num = floor($number / 100);
Название переменной плохое, лучше $hundreds
> $num = $number % 100;
Тут лучше сделать новую переменную с новым именем, а не исплоьзовать старую
В функции function smallNumberToText проще всего в самом начале написать отдельный if для числа ноль.
Вместо того, чтобы склеивать строку по частям, может быть удобнее сделать массив и класть в него отдельные слова, а в конце склеить их.
> $num = floor($number / 1000);
Тут тоже надо нормальное название переменной, а еще лучше сделать 3 переменнх: millions, thousands, units.
>>640313
Никак. Ну разве что сделать сайт картинкой. Подумай, как другие сайты живут без этого.
>>640340
Гимп может быть не совместим с ПСД макетами, в нем например нет эффектов слоев. С другой стороны, фотошоп используют так часто только потому что доступны пиратские версии, надо было бы платить может быть макеты бы делали в других программах, inkscape например хорош.
>>640401
Не знаю.
>>640610
Может это порода такая просто?
> Слышал что у сайтов на бутстрапе, какие то проблемы с СЕО и выдачей в поиске? Это так? Если да, то почему?
Сомневаюсь. Также, СЕО это темная магия и подтвердить или опровергнуть это невозможно, если только в документации поисковых систем такого не написано.
> Как себя правильно оценить
Посмотри на вакансии, сколько за них предлагают, посмотри резюме (если есть в свободном доступе), сколько люди просят. Зарплата определяется рынком как комппромисс между пожеланиями работника и работодателя.
Если ты начинающий то возможно для тебя самым эффективным способом повысить зарплату будет смена работы.
>>640271
> if (floor(($number % 100) / 10) == 1) {
> $word = $word5;
> $word = $word1;
> break;
Тут лучше сразу писать return $word5. Вместо вложенных ифов и свитча наверно лучше сделать блок ифов на одном уровне.
> $num = floor($number / 100);
Название переменной плохое, лучше $hundreds
> $num = $number % 100;
Тут лучше сделать новую переменную с новым именем, а не исплоьзовать старую
В функции function smallNumberToText проще всего в самом начале написать отдельный if для числа ноль.
Вместо того, чтобы склеивать строку по частям, может быть удобнее сделать массив и класть в него отдельные слова, а в конце склеить их.
> $num = floor($number / 1000);
Тут тоже надо нормальное название переменной, а еще лучше сделать 3 переменнх: millions, thousands, units.
>>640313
Никак. Ну разве что сделать сайт картинкой. Подумай, как другие сайты живут без этого.
>>640340
Гимп может быть не совместим с ПСД макетами, в нем например нет эффектов слоев. С другой стороны, фотошоп используют так часто только потому что доступны пиратские версии, надо было бы платить может быть макеты бы делали в других программах, inkscape например хорош.
>>640401
Не знаю.
>>640610
Может это порода такая просто?
Нужно выносить
>>640747
> if($creditPayment < $monthlyPayment) $monthlyPayment = $creditPayment;
Это можно заменить на min/max. Также, иф надо писать в 3 строки.
> $paymentTotal = $paymentTotal + $monthlyPayment;
$paymentTotal += $monthlyPayment;
>>640788
> Хотя конечно эту строку можно выводить после цикла, но я не знаю правильно ли так делать.
Можно так сделать.
>>640853
$x++; равносильно $x = $x + 1;
Если ты никуда не сохраняешь значение выражения (с помошью знака равно), то переменные не меняются.
>>640886
Любую из 3 частей можно пропустить.
Первая часть - инициализация - понятно, без нее тоже будет работать.
Вторая часть - условие - ее можно пропустить, но тогда цикл будет бесконечным (если только ты не выйдешь из него через break)
Третья часть - выполняется после каждого шага - ее тоже можно пропустить.
Но точки с запятой должны быть в любом случае. Также, в первой и третьей части можно писать несколько выражений через запятую.
То есть это все правильные циклы:
for (;;) { .... } // бесконечный цикл
for (; $x < 10; ) { ... }
for ($x = 1; ; $x++) { ... } // бесконечный цикл
for ($x = 1, $y = 10; $x < 100; $x++, $y++) { ... }
Мануал http://php.net/manual/ru/control-structures.for.php
Нужно выносить
>>640747
> if($creditPayment < $monthlyPayment) $monthlyPayment = $creditPayment;
Это можно заменить на min/max. Также, иф надо писать в 3 строки.
> $paymentTotal = $paymentTotal + $monthlyPayment;
$paymentTotal += $monthlyPayment;
>>640788
> Хотя конечно эту строку можно выводить после цикла, но я не знаю правильно ли так делать.
Можно так сделать.
>>640853
$x++; равносильно $x = $x + 1;
Если ты никуда не сохраняешь значение выражения (с помошью знака равно), то переменные не меняются.
>>640886
Любую из 3 частей можно пропустить.
Первая часть - инициализация - понятно, без нее тоже будет работать.
Вторая часть - условие - ее можно пропустить, но тогда цикл будет бесконечным (если только ты не выйдешь из него через break)
Третья часть - выполняется после каждого шага - ее тоже можно пропустить.
Но точки с запятой должны быть в любом случае. Также, в первой и третьей части можно писать несколько выражений через запятую.
То есть это все правильные циклы:
for (;;) { .... } // бесконечный цикл
for (; $x < 10; ) { ... }
for ($x = 1; ; $x++) { ... } // бесконечный цикл
for ($x = 1, $y = 10; $x < 100; $x++, $y++) { ... }
Мануал http://php.net/manual/ru/control-structures.for.php
Попробуй добавить котика в резюме. Можешь сказать что это демонстрация навыков использования фотошопа.
>>641537
Про переворачивание ифов:
Ты пишешь
if ($x > 0) {
строка 1
строка 2
...
строка 100
}
а надо
if ($x <= 0) {
return ;
}
строка 1
строка 2
....
строка 1000
То есть меняя условие в ифе на противоположное и добавляя return, мы уменьшаем отступ у идущего за ним блока кода.
>>641407
По отступам. Дело вкуса и привычки
>>641449
Верно только лучше $number++;
Попробуй добавить котика в резюме. Можешь сказать что это демонстрация навыков использования фотошопа.
>>641537
Про переворачивание ифов:
Ты пишешь
if ($x > 0) {
строка 1
строка 2
...
строка 100
}
а надо
if ($x <= 0) {
return ;
}
строка 1
строка 2
....
строка 1000
То есть меняя условие в ифе на противоположное и добавляя return, мы уменьшаем отступ у идущего за ним блока кода.
>>641407
По отступам. Дело вкуса и привычки
>>641449
Верно только лучше $number++;
Отправлять нет смысла, если такие задачи кажутся тебе сложными, на работе каждый день будешь сталкиваться с подобным.
Разобраться с решением конечно надо для будущего.
А сколько времени на такое дают? У меня ушло около двух часов, за 15 минут на собеседовании точно не успел бы.
Или это дается на дом?
У меня возникла сложность разве что с четвертым, получилось три джойна и две группировки, что-то многовато.
Потом через неделю выложу, может оп найдет способ решить более кратким путем.
Этому уроку больше лет чем тебе. Может тогда не было стандарта, или оп о нем еще не слышал.
При том, что ideone автоматически табы расставляет, а не пробелы.
http://ideone.com/K5vX2L
От проверки все ещё не отказываюсь, вроде работает правильно, но комментарии гуру - приветствуются.
wet это по моему мокрый, а влажный это moist
https://slovari.yandex.ru/%D0%B2%D0%BB%D0%B0%D0%B6%D0%BD%D1%8B%D0%B9/%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4/#lingvo/
Действительно. Зачем я, как дурак, один раз на таб нажимаю. По четыре раза отсчитывать ведь гораздо удобнее.
Ага. Только на деле во всех английских текстах, что я читал было wet(возможно где-то moist).
Ну или попросись в модераторы и чисти тред, это же невозможно читать.
Вроде нашёл в чем косяк. Ты сразу после платежа проверяешь, чтобы остаток долга не был меньше платежа, а если это не выполняется, то еще и без коммисии его отнимаешь. Т.е. если на конец месяца долг остался 100 рублей, то ты так и записываешь в итоговые выплаты плюс 100 рублей, хотя он должен был увеличиться за счет месячных процентов. Более того, если на конец месяца остается 4900 рублей долга например, то ты тоже их списываешь и заканчиваешь считать, хотя тут очевидно, что через месяц эта сумма станет больше 5к и придется делать дополнительную итеррацию.
>или попросись в модераторы и чисти тред
>ОП
>великодушный анон, который находит время разбирать криворукие поделия каких-то стремящихся долбоебов
>чисти тред
Дурачок неблагодарный.
>4 пробела удобнее чем таб
>настроил редактор, чтобы нажимая таб выдавалось 4 пробела
Ну охуеть теперь.
Ну смотри. Допустим осталось 6к долга. Вот тут ты увеличиваешь эту сумму за счет процентной ставки и отнимаешь ежемесячные 5к:
>$sum = $sum * $monthPer + $monthCom - $monthPay;
В переменной $sum осталось чуть больше 1к. Тотал пока не изменился.
Теперь у тебя сразу идет проверка
>if ($sum <= $monthPay)
И т.к. $sum действительно меньше чем 5к, то ты идёшь к строке.
>$totalPay += $sum;
Во-первых, как я уже говорил выше, хоть и прошёл месяц, но ты уже не увеличиваешь $sum, а просто прибавляешь(проебал процентную ставку за последний месяц).
ВО-вторых, ты прибавил к тоталу около 1к, а дальше у тебя break. Всё, конец, больше к тоталу ничего не прибавляется. А как же 5к, которые мы отняли от $sum в самом начале? Потерялись.
И того ты потерял 5к + месячную прибавку к последней сумме(которая меньше 5к).
Спасибо, анон. Доходчиво объяснил.
>Типы начинок, размеры надо сделать константами. Никаких магических строк не должно быть.
Что это значит? Я должен писать так
Hamburger.SIZE_SMALL = {price: 50, cals: 20};
Или так
Hamburger.SIZE_SMALL = 'small';
var sizes = {small {price: 50, cals: 20}/, ... /}
Последние 5к всё еще не добавляются т.к. теперь ты отнимаешь её обратно в этой строке:
>$totalPay += $sum * $monthPer + $monthCom - $monthPay;
Убери -$monthPay;
К тому же неправильно считается второй банк т.к. теряется месяц из-за условия
>if ($sum <= $monthPay)
Дело в том, что ты тут снова подаешь сумму без увелечения за счет месячной коммисии. В случае со вторым банком вышло, что до начисления комиссии переменная $sum меньше 5к, а после начисления уже больше, что ты не учел.
Оба варианта неправильные:
в первом ты в константе хранишь данные, это неравильно
во втором константа норм, но в словаре sizes ты используешь не ее, а слово small - это неприавльно.
Согласен, что флуд - плохо. Мне ведь тоже все это читать приходится.
Но если обсуждается например решение задачи, то это посты по делу, пусть они хоть 200 постов напишут, главное разобраться. Спасибо тем анонам кто отвечает и помогает начинающим.
А вот обсуждение не по теме треда, типа как я 10 лет не могу устроиться на работу, давайте не будем устраивать.
И вообще хотелось бы отметить, что хотя твой вариант решения и можно исправить до рабочего(инфа 100%), но он довольно загруженный вышел, лично мне было сложно разобраться, что к чему. Когда доделаешь, то можешь посмотреть моё решение, например. Я там схалявил и не сравнивал цены в конце, но суть не в этом, а в том, что основные вычисления выполняются за 7 строчек когда без всяких брейков и ифов.
http://ideone.com/ksuDVA
>>646574
Не догоняю я совсем что-то. Я ведь неправильно делаю? http://codepen.io/anon/pen/yeRwjj?editors=0010
Да, теперь работает правильно.
>$creditBalance = ( $creditBalance * $percent ) + $servicePayment;
Плохо, что вот это у тебя повторяется в двух местах.
От такого надо избавляться.
Это повторяется в двух местах специально, чтобы упростить условие(если убрать эту строку перед циклом, то условием выхода нужно делать не $creditBalance > $monthlyPayment; а ( $creditBalance * $percent + $servicePayment) > $monthlyPayment; т.е. на практике повторяться оно будет значительно чаще). Поэтому я считаю, что тут повторение вполне оправдано, но готов выслушать предложения по поводу того как от него можно избавиться.
Прошерстил мануал, нашел подходящую функцию.
Дальше на строке 36 реализовал её.
Имя всё равно пишется с маленькой. Что я делаю не так? В РНР же построчное выполнение.
http://codepad.org/7C06IpiQ
ucfirst, ucwords (и многие другие) не работает с юникодом (нелатинскими символами).
Для работы с юникодом есть mb_ функции.
http://php.net/manual/ru/ref.mbstring.php
Аналога для ucfirst нет, нужно брать первую букву подстрокой, приводить к верхнему регистру, конкатенировать с mb_substr($word, 1).
И у тебя там зачем-то $name инициализируется пробелом вместо пустой строки (26 строка).
Антоша, сделал я так:
$name1 = mb_strcut($name, 0, 2);
$name2 = mb_strcut($name, 2);
$name1 = mb_strtoupper($name1);
echo "$name1";
$name = $name1 . $name2;
Но в эхо все равно выдает маленькую букву. Где я опять ошибся?
>mb_strcut() вырезает подстроку из строки также, как mb_substr(), но оперирует байтами вместо символов.
http://php.net/manual/ru/function.mb-strcut.php
http://php.net/manual/ru/function.mb-substr.php
http://ideone.com/mNQ3c3
Спасибо! А я как раз искал свой вариант решения этой задачи с подстановкой заведомо правильных и неправильных номеров телефонов из пасты ОПа...
Ты хоть бы названия массивов и вывод уведомлений в echo поменял...
Хотя в самой регулярке, гляжу, изменил определение кода из трёх цифр и семи цифр основного номера на десять цифр. Так советовал ОП.
Ссылочек в студию!
Как раз аноны жаловались, что переход к студентам резкий.
ОП, наверное, забыл ссылки дать на это всё.
Вот на подключение БД через код (но всё равно не оче понятно, сижу разжёвываю всё через сторонние сайты) https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md
Вот про протокол
https://github.com/codedokode/pasta/blob/master/network/http.md
Ссылки
https://github.com/codedokode/pasta/blob/master/network/urls.md
>>646880
Там в гитхабе на главной есть оглавление: https://github.com/codedokode/pasta/ (прокрути вниз).
Ввёл поддержку купюр по 10 рублей, это всё несложным оказалось.
Смотрю на следующую задачу ("Лиличка"), и мне становится немного не по себе...
>>646929
Спасибо, я просто на будущее сохранил, пока ещё не дошёл до этого по учебнику ОПа. Буду знать и об этом.
Опять забыл:
>Слишком просто? Ок, давай усложним задачу. Добавим в банкомат банкноты номиналом 200 и 2000 р. После чего выставляем такое число банкнот: 1 по 5000, 4 по 2000, 1 по 500, 3 по 200 и пытаемся выдать 6600 р.
Сие мне не подвластно...
Когда решал, руководствовался таким порядком действий:
1. присваиваем номера элементам массива;
2. случайным образом через mt_rand получаем число. Это число - номер элемента массива;
3. выводим элемент массива в соответствии с полученным числом.
4 ????
5. НИХУЯ!
В каком направлении думать?
Это чо?
PHP Warning: mt_rand(): max(9) is smaller than min(44) in /home/hYHYcI/prog.php on line 24
PHP Warning: mt_rand(): max(6) is smaller than min(55) in /home/hYHYcI/prog.php on line 25
PHP Notice: Undefined offset: 0 in /home/hYHYcI/prog.php on line 27
PHP Notice: Undefined offset: 0 in /home/hYHYcI/prog.php on line 27
В задаче есть массивы
word1
word3
word2
...
Нужно, чтоб в строчке было 1 слово из первого массива, второе - из второго и т.д. Для этого надо знать номера (обозначения) элементов каждого массива.
если первому элементу массива присвоить 22, то остальные элементы пронумеруются сами от 22. Таким образом можно не присваивать вручную каждому элементу массива свои номера. Звучит по-лоховски, но это первое, о чём я подумал при решении. Присвоение - случайная генерация - вывод.
Тогда добавляй к count() первый индекс иначе у тебя там 22 < x < 7 получается.
И эти индексы можно убрать, у тебя все равно все в разных массивах.
Что ты творишь? У тебя по дефолту все элементы пронумерованы от 0 до count-1. Зачем лишние ключи?
А, например, вот такое не сработает?
$validator = array(
'name' => '$s1',
'surename' => '$s2',
...
)
foreach ($validator as $key => $value) {
if ($key == 'name' || $key == 'surename' || ...) {
$value = "background: #EF8E8E";
}
}
Братишка, функция count() считает количество элементов в массиве вне зависимости от установленных номеров.
Поэтому-то у тебя и выходит, что в mt_rand(8, 6) - count, допустим, считает всего 6 элементов в массиве.
Чё-то ты перемудрил.
Ставь то же самое, только с нуля начинай, а от количества элементов, соответственно, отнимай 1.
Извини, не успел прочитать сообщение, ты уже всё пояснил.
Блять, точно.
Сделал вот так http://ideone.com/BBAnCP , но чувствую, что задачу надо решать как-то по-другому. Если да, то как?
Балять, хуйня какая-то опять. Не считает 2 столб
Тебе уже несколько раз сказали, вместо просто count() юзай count()-1. Если в массиве 6 эллементов, а нумерация идет с нуля, то какой номер будет у последнего эллемента? Правильно, 5. А ты генерируешь число от 0 до 6.
Так ведь count считает не с нуля, а просто количество элементов в массиве, то есть начиная с 1.
Будь внимателен, я уже второй, кто тебе сказал об этом.
Или вот как ещё можно сократить, должно вроде работать:
foreach ($validator as $key => $value) {
if ('name' && 'surname' && ... == $key) {
$value = "background: #EF8E8E";
}
}
Во-первых, не делай переменные s1, s2, s3, s4 - в таких ситуациях надо делать массив с элементами $s[1], $s[2]
Далее, думай о тех кто читает твой код. Что значит s? Что значит s2? С таким же успехом ты можешь писать код китайскими иероглифами.
Имя s не годится - надо, например $cssClass, индексы 1..9 тоже не годятся - надо понятные индексы вроде $cssClass['name']
Попробовать избавиться от копипасты можно через функции, например <?= getErrorClass($errorList, 'name') ?>
Ну и если это задача про студентов, советую почитать замечания к ней и показать код на проверку.
>Далее, думай о тех кто читает твой код. Что значит s? Что значит s2? С таким же успехом ты можешь писать код китайскими иероглифами.
Разве s - это не распространенное название для строковых переменных? Типо String сокращенно.
мимо
> 44 => 'обретаю'
Это не требуется делать. Также непонятна логика выбора цифр. Почему 44, а не другое число?
Ошибки из-за того что ты генерируешь число от 1 до N, а индексы у тебя в массиве например идут от 44 до 49.
> mt_rand(33, count($word3));
Тут ошибка в том что count вернет число элементов в массиве, а не максимальный индекс. Максимальнй индекс это max(array_keys())
Но в твоем случае эти числа вроде 44 надо просто убрать.
А что значит String? Как это мне помогает понять программу? Что s что string ничего не значат. Надо писать, что хранится или для чего предназначена переменная, а не тип данных в ней.
Также, стили должны быть в CSS файле. Надо добавлять CSS класс ошибочным инпутам, а не копипастить стили.
Также, подумай, не лучше ли выводить сообщение об ошибке рядом с инпутом?
>>647106
Внимательно читаю всё, что вы пишите, просто не всегда доходит, как это правильно применить. Всё перепроверил, теперь дошло, спасибо огромное.
Дошло вот что:
- по умолчанию нумерация (индексы) идёт от 0;
- count($array) выдаёт количество элементов, а не наименование индекса (в отличие от var_dump($array));
- чтобы обратиться к случайному элементу в массиве, нужно сгенерировать случайное число в пределах количества элементов массива. Это случайное число будет являться индексом, а не порядковым номером.
- так как индекс начинается с 0, а количество с 1 (т.е. "на 1 больше"), то наименование индекса массива будет равняться порядковый номер - 1.
http://ideone.com/BBAnCP
Вопрос по правильности решения задачи остаётся открытым. Возможно, надо было решить каким-то другим способом?
Еще где искать боксы под вагрант и безопасно ли это? На atlas.hashicorp что-то нет разнообразия.
Может лучше качнуть голую систему, а потом самому на нее накатить lemp/lamp, redis и т.д.?
var_dump($array) тоже не наименование индекса возвращает, а вообще всю инфу о массиве.
Здесь надо делать перебор всех комбинаций купюр. Это можно делать в лоб (например рекурсией), или более эффективно с помощью готового алгоритма.
Теория:
https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B_.D0.BA.D0.BE.D0.BC.D0.B1.D0.B8.D0.BD.D0.B0.D1.82.D0.BE.D1.80.D0.BD.D1.8B.D1.85_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D0.B9_.D0.B8_.D0.B7.D0.B0.D0.B4.D0.B0.D1.87
Нам из этого нужны размещения (выбираем число банкнот каждого номинала).
https://www.google.ru/search?q=%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B9&ie=UTF-8&gws_rd=cr&ei=Ppe4Vu_JNemv6ATL5oHwCA
Это разновидность задачи о рюкзаке, и есть более эффективные решения:
http://informatics.mccme.ru/mod/book/view.php?id=815
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
https://www.google.ru/search?q=%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0+%D0%B1%D0%B0%D0%BD%D0%BA%D0%BE%D0%BC%D0%B0%D1%82&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&gws_rd=cr
>Вопрос по правильности решения задачи остаётся открытым.
Ну, работает же, значит правильно. Теоретически можно сократить количество переменных с помощью переприсваивания, сделать вывод первых двух строк в цикле т.к. действия одинаковые выполняются и использовать array_rand() вместо mt_rand().
1) с помощью CSS стилей только для печати @media print скрыть все остальное
2) открыть данные в новом окне и вызвать print(), возможно такое же сработает в ифрейме
Ну и гугл в помощь https://www.google.ru/search?q=js+print+part+of+page&ie=UTF-8&gws_rd=cr&ei=bpi4Vr7sLOz76ATztK-ICw
Вау, я и не знал, что переход на другую строку в echo можно энтером делать, а не только с помощью \n.
Я просто подумал, что тема связана со строками, а не с массивами, и решать как-то иначе надо. Нет?
Я сам не знал, хули оно переноситься энтером начало
От души, брат!
Клавиша enter как раз вставляет символ перевода строки. Только на разных системах этот символ отличается, в виндовс "\r\n", линукс "\n", в макос кажется вообще "\r". Поэтому в коде нужно писать явно.
В php кстати есть константа PHP_EOL
Ну так у тебя массивы строк там, а не одна длинная строка.
Можно ещё в цикле for проходиться по массивам, два раза вывести строку со словами 1 2 3, а потом, когда $i станет равной 2, вывести строку Я 4 5.
Там же показано на картинке. У тебя есть строка, ты получаешь из неё первые три символа для своих целей(сравнить с другими тремя символами/записать в переменную/вывести через echo/и т.д.)
Спасибо, милый человек :*
Да, это задача про студентов. Я только ее начал, показывать рано. Посмотрите, вот так лучше теперь?
Функция (как встроенная в php, так и написанная тобой) может "вернуть" какое-то значение после ее вызова (вернуть результат).
Например, функция mb_strlen(....) возвращает число символов в строке.
Вот так мы выводим значение, которое вернет функция:
echo mb_strlen("hello"); // выведет 5
Вот так мы сохраняем возвращенное значение в переменную:
$x = mb_strlen("hello");
А вот тут мы вызываем функцию и никуда не сохраняем возвращенное ей значение:
mb_strlen("hello");
Разумеется, в реальном коде такого не должно быть, какой смысл вызывать функцию подсчета числа символов и никуда не сохранить результат?
- не выводи html через echo, это неудобно и плохо читается
- в html шаблонах используй версии оператора if, for, foreach с двоеточием вместо скобок
- неправильно использовать id для обозначения ошибки так как id не могут повторяться. И вообще неудобны в верстке. Для обозначения ошиьки лучше использовать класс, например error
- для числа баллов лучше использовать другой тип input, для ввода чисел
- для ввода email есть специальный тип инпута. Тип инпута влияет например на вид клавиатуры на мобильных устройтвах, на значения которые будет предлагать браузер для автодополнения
- прочитай урок про xss
- добавь HTML5 валидацию, например, чтобы нельзя было ввести запрещенные символы в поле имени
- почему ты выводишь текст перед head и body?
- вставка данных БД должна быть точно не в шаблоне
- название DOB = date of birth не очень удачное
- название переменной registerForm неудачное. Что, в этой переменной хранится форма регистрации?
- подписи к инпутам надо верстать тегом label (удобно в него же засунуть и сам инпут)
http://ideone.com/psxyMg
Это вступление в регулярные выражения, просто хочу понять правильно ли я уловил суть.
Поставил microXP, но там вырезан эксплорер, обратно устанавливаться не хочет. Чо делать?
Винду же можно настраивать, отключать лишние службы, индексирование дисков и тд. XP при большом желании может с 200-300 Мб памяти работать.
> А то на моем нетбуке даже убунта еле дышит
Если есть время, можешь с дебианом поэкспериментировать, вручную ставя и удаляя пакеты. А в убунте по умолчанию много чего лишнего напихано. Есть легкие десктопные окружения вроде xfce, lxde (они и на убунту, и на дебиан ставятся наверно), но конечно придется повозиться, в них часто из коробки что-нибудь не работает.
> боксы под вагрант и безопасно ли это?
Смотря в чем будут эти ОС запускаться. Под виндой вагрант запускает образы в виртуалбоксе и это безопасно. Если под линуксом он использует контейнеры то не факт. Контейнеры это не средство безопасности, а средство изоляции и управления ресурсами.
Всмысле, ты зацитировал мое сообщение, в нем ссылка, которую я кидал и редактировал. В ней вроде все ок. Разбил на 8 - обязательную, код оператора 3 символа и 7 символов самого номера, что не так?
\t$themes=Yii::$app->db->createCommand('SELECT * FROM themes')
->queryAll();
\t$listData=ArrayHelper::map($themes, 'theme_id', 'theme_title'); ?>
<?=var_dump($listData)?>
<?=$form->field($model, 'theme_id')->dropDownList([$listData],
[
'prompt' => 'Выберите категорию...'
])?>
Спасибо огромное, ОП...
Почитаю, сохраню, но пока всё-таки даже начать делать это дополнение не смогу - я застряну на этом надолго и вряд ли вообще осилю.
Я тут "Лиличку" верчу туда-сюда сейчас - только ещё составляю сам алгоритм, даже не приступал ещё к написанию скрипта. Куда мне, филологу, до рекурсии, комбинаторики и подобного...
Я думаю что да. Ты проебешь навык превозмогания. Сам сейчас на них и прекрасно тебя понимаю, с горем пополам сделал первую задачку, сейчас думаю над второй.
http://archive-ipq-co.narod.ru/l1/conditions.html
Вот это задание.
http://ideone.com/z3aZWZ#stdin
Вот я делал. Я нажимаю Submit - пишет успешно, но мне вместо бросков кидает мною же написанное. Где у меня ошибка?
1. Разбиваем весь текст на куски по символам перевода строки и помещаем в массив.
2. Разбиваем каждый получившийся кусок текста на символы и помещаем в массив.
3. Вычисляем самый большой массив с символами, то есть находим самое длинное предложение или фрагмент текста в стихотворении.
4. Текст у нас будет выводиться с низу, поэтому заполняем все имеющиеся в массиве фрагменты текста символами пробела, ориентируясь на самый длинный фрагмент.
5. Выводим символ за символом из массива с фрагментами текста, начиная с конца (либо переворачиваем массив задом наперёд и выводим символы с начала каждого фрагмента).
Вроде всё вполне понятно в плане того, чего надо добиться.
>>647402
Код покажи, такого ещё не было, чтобы сообща не помогли.
Также совет: начинать с минимума в регулярном выражении. Например, ту же задачу на проверку ввода телефонного номера надо начинать с правильного распознавания 8 и +7 во всевозможных комбинациях. Далее пробовать прибавить к этому распознавание и нескольких цифр, далее пробовать распознавание разных знаков. И так до конца.
А потом провернуть все ещё и через массивы из пасты ОПа, где-то тут она должна быть, я её таскаю за собой из треда в тред.
>>647455
Ахаха, ну ты дал!
У тебя неверно обозначено, что это код на РНР: <php? стоит, а должно быть <?php.
Мое мнение:
Обучение должно быть интересным. Пробуй другие разделы. Начни задачи на ООП, начни пилить Студентов, разберись как вообще работает Интернет (если еще не сделал).
Веб это целая куча технологий, нет смысла долбить головой в муторные задачи месяцами.
Выдели два раза по часу в неделю на регулярки и еще пару на алгоритмы, остальное время пили что нравится.
ООП например, куда более важная тема чем регулярки.
Дебил! Сука! бЛять! Как так можно! Идиот!
Я БЛЯТЬ ВПЕРВЫЕ УВИДЕЛ ЧТО ОН ПОКАЗЫВАЕТ В КАКОЙ СТРОКЕ ОШИБКА
Как меня раздражает моя невнимательность. Всю жизнь портит!
Погоди злиться, вот до задачи с кредитом на Айфон дойдёшь, тогда волю себе дашь.
if надо с маленькой буквы писать.
Также вместо ecgo должно быть echo.
Но это ты и сам увидел уже наверняка.
Да, исправил все. Все работает. Ну ладно, раз решил - спать. По часу каждый день перед сном, нормально же для учебы. Всем спасибо и пока.
>нет смысла долбить головой в муторные задачи месяцами
Кому как.
Сужу по себе, мне это помогает лучше уяснить многие моменты из пройденных уроков, лишний раз проработать сложные моменты.
А в итоге само решение - пусть оно и не идеальным выходит - дополнительной мотивации придаёт.
Вот именно, кому как. Мне кажется, если у человека начинают появляться такие вопросы, значит он уже от конкретной темы устал. Нет ничего страшного в изучении другого материала, всегда можно вернуться потом.
Просмотрел твою книгу. Кратко:
Автор хитрый мудак.
Он просто переписал слегка под современность. Заменил mysql функции на PDO. Местами не убрал старое говнецо.
Но самое плохое это лютый, бешеный процедурал.
В общем книга учит старому унылому коду. Если ты ее прочитаешь и сделаешь по ней например Студентов. То ОП тебя отправит переписывать с нуля. В общем только вредных привычек нахватаешься.
Сделай var_dump([$listData]);
Заодно узнаешь как в Юи можно делать группы в селекте.
>>647402
Много. Язык регулярных выражений (как и PHP) надо читать как русский, без словаря.
Если не получается, лучше спроси что непонятно, покажи код, помучай сайт regex101 (только помни что там бекслеш пишут один раз, а не 2).
>>647464
За ООП, а тем более студентов, браться рановато наверно без регулярок.
Всегда можно задать вопрос если что-то непонятно или попросить более простую задачку для понимания.
Ну например, как тебе такая задачка: дана строка, сделай программу которая скажет есть ли в ней хоть одна цифра или нет? Есть ли в ней хоть одна русская гласная или нет? Состоит ли она целиком только из латинских букв? Используя регулярки + if (preg_match...), конечно.
Ты что слепой обсосок? На скрине и есть вар дамп. Вообще ошибка уже нашлась, просто смешно, насколько ты глуповатый и невнимательный.
Годных вуззов почти нет, вузов с вебом еще меньше, на западе кОтируют еще меньше. Да и возможности учится на очном нет.
Можно где то получить бумажу что я крутой прогер?
Что то по типу TOFL и IELTS ?
Сделал первую задачу по HTML/CSS. По пикселям вроде сходится, но код меня не радует.
Ещё непонятно с границей: она должна входить в 66% ширины блока или нет?
http://ideone.com/7JwyiU
Чому ругается на мой preg_match?
И проверьте ещё раз это- >>647271
Не экранируешь дефис, вообще лучше экранируй всё что можно в регулярках.
http://pythex.org/?regex=[!%2C.%3F\-%3A%3B][^33].{5}&test_string=&ignorecase=0&multiline=0&dotall=0&verbose=0
Я правильно понимаю, что твой скрипт считает, что правильно писать "сдоров" и "сдраствуй"?
Сделал, не помогло :С
>>647722
Ты про -
>'/[з][д]([^(есь|ани|оров|раствуй)].{1,5})/'
Нет, я выполняю поиск ошибок в регулярках. В данном случае, должно найти все слова, которые начинаются с "з" и "д" кроме "^" здесь/здани(е,я)/здоров(ье,ые,ый) и т.д. В случае если их находит мой не работающий preg_match - выведет сообщение о ошибке.
Как-то странно. Есть же куча слов, начинающихся с "зд", которые ты не включил. Да и здравствуй же, в любом случае.
Пофиксил здравствуй. Но иф все ещё не выводит нихуя.
P.S - И я там нафантазировал в конце ещё одну функцию, но сомневаюсь что такой метод сработает.
http://integer64.github.io/site-layout/exercise/mainTask/index.html
Вроде все замечания исправил.
А что ты не пониамешь?
> var sizes = {
> small: {
Не используется константа для обозначения размера
Ну и делаешь ты неправильно. Почему ты в поле size хранишь не размер, а какую-то ерунду? Ты ООП изучал? Знаешь, что принято хранить в свойствах объекта? Держи пасту для начала:
Списки цен и калорий лучше вынести из конструктора в метод.
---------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Гамбургер?)
— какие у них есть свойства (размер, например).Цена свойством не является, так как она не задается, а вычисляется из других свойств.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько стоит гамбургер.
— как сущности связаны? Сущность только одна и ни с чем не связана.
Наследование позволяет создавать класс не с нуля. а расширяя существующий класс. Но в этой задаче оно вряд ли нужно.
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов. В JS этого нет.
Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. В JS впрочем этого нет, так что делать не надо.
В общем, чем меньше публичных свойств и методов, тем лучше. Ведь когда другой разработчик или ты сам захочет использовать класс, он будет смотреть только на публичные элементы, и чем их меньше, тем проще разобраться как класс работает. Но не стоит закрывать вообще все: надо думать, является ли метод частью внутренней логики класса или он предназначен для выдачи полезной информации.
Когда ты проектируешь класс, ты можешь представить себе что ты делаешь некую коробочку, из которой торчат переключатели и провода. Публичные свойства и методы - это то, что ты разрешаешь использовать другим программистам. Приватное - это то, что скрыто внутри коробки и что они трогать не должны.
--------------
Также, прочитай все комменарии в задаче тут https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Также, немного можно прочитать про ООП в учебнике PHP из ОП-поста в последней главе. ТОлько там про PHP, но суть ООП примерно та же.
В общем, тебе надо сначала понять сам ОоП, спроектировать класс, а только потом реализовать.
Если что-то непонятно, задавай конкретные вопросы.
А что ты не пониамешь?
> var sizes = {
> small: {
Не используется константа для обозначения размера
Ну и делаешь ты неправильно. Почему ты в поле size хранишь не размер, а какую-то ерунду? Ты ООП изучал? Знаешь, что принято хранить в свойствах объекта? Держи пасту для начала:
Списки цен и калорий лучше вынести из конструктора в метод.
---------
Когда ты решаешь задачу на ООП, ты должен ответить на вопросы:
— какие есть сущности, для которых мы сделаем классы? (Гамбургер?)
— какие у них есть свойства (размер, например).Цена свойством не является, так как она не задается, а вычисляется из других свойств.
— что мы хотим от них получить (какие у них должны быть методы). Например мы хотим узнать сколько стоит гамбургер.
— как сущности связаны? Сущность только одна и ни с чем не связана.
Наследование позволяет создавать класс не с нуля. а расширяя существующий класс. Но в этой задаче оно вряд ли нужно.
«Абстрактный» — это класс, объект которого нельзя создать. Он предназначен для наследования от него других классов. В JS этого нет.
Также, ты должен для всех полей и методов расставить модификаторы доступа (pubic, private, protected - они определяют, откуда можно обращаться к полю или методу). Ты должен подумать логически и для каждого поля/метода определить: это часть кода, которая относится к внутренней логике класса и не должна быть доступна снаружи, или же это часть кода, которая должна быть доступна. В JS впрочем этого нет, так что делать не надо.
В общем, чем меньше публичных свойств и методов, тем лучше. Ведь когда другой разработчик или ты сам захочет использовать класс, он будет смотреть только на публичные элементы, и чем их меньше, тем проще разобраться как класс работает. Но не стоит закрывать вообще все: надо думать, является ли метод частью внутренней логики класса или он предназначен для выдачи полезной информации.
Когда ты проектируешь класс, ты можешь представить себе что ты делаешь некую коробочку, из которой торчат переключатели и провода. Публичные свойства и методы - это то, что ты разрешаешь использовать другим программистам. Приватное - это то, что скрыто внутри коробки и что они трогать не должны.
--------------
Также, прочитай все комменарии в задаче тут https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Также, немного можно прочитать про ООП в учебнике PHP из ОП-поста в последней главе. ТОлько там про PHP, но суть ООП примерно та же.
В общем, тебе надо сначала понять сам ОоП, спроектировать класс, а только потом реализовать.
Если что-то непонятно, задавай конкретные вопросы.
Тогда посоветуй нормальную книгу для обучения. Или хотя бы не говеную. Куда ни глянешь, везде все книги обосраны
Я понял что ты хочешь мне сказать, но я все ещё не понимаю чому не preg_match не работает. $text который я передал - с ошибками, оно не находит их.
> [^(есь|ани|оров|равствуй)]
Это так не работает
[abcdx-z] значит ровно 1 любой из указанных символов (a, b, c, d, x, y, z)
[^ab] значит любой один символ кроме a или b
Внутри квадр. скобок символы вроде () или | не имеют специального значения и обозначают сами себя. Также, последовательнгость в которой написаны буквы не имеет значения и "равствуй" это то же самое что авйрсту, то есть твоя конструкция читатся как:
- один любой символ кроме е, с, ь, а, н, и, р, о, в, т, у, й, скобок, вертикальной черты
В регулярках вообще нет выражения "не ....". Что-то похожее можно сделать с помощью утверждений: http://php.net/manual/ru/regexp.reference.assertions.php
Также preg_match ищет только первое совпадения с регурякой, тебе нужна preg_match_all, чтобы найти все ошибки. Она описана в мануале и ниже в уроке.
> [\!\,\.\?\-\:\;][^ ].{5}
Тогда я не понимаю как эту задачу решить. Пиздец это, а не регулярные выражения.
> [\!\,\.\?\-\:\;][^ ].{5}
тут ошибка найдется только если после нее идет еще минимум 5 символов. Это неправильно.
> [жш][ы][а-я]
Тут скобки вокруг ы не нужны, также, ошибка найдется только если есть буква от а до я далее, а за ней пробел, непонятно зачем такое ограничение
> {1,}
Это равносильно квантификатору "+"
> [з][д]
Скобки не нужны
> [а (но)]
Явно не то что ты задумывал
Не надо копипастить код для 4 орегулярок, сделай массив регулярок и пояснений к ним и обходи в цикле.
>идет еще минимум 5 символов
Так они по любому будут идти, если это не конец текста, где пробела и не должно быть.
Все остальное - ясно. Сейчас попробую через массив.
бамп вопросу
Давай начнем с более простой:
Дана строка, сделай программу которая скажет есть ли в ней хоть одна цифра или нет? Есть ли в ней хоть одна русская гласная или нет? Состоит ли она целиком только из латинских букв? Используя регулярки + if (preg_match...), конечно.
Тебе надо изучить все основыне конструкции регулярных выражений, которые перечислены в уроке, и вдумчиво их составлять, а не писать на авось.
Ну возьмем например ошибку "жы/шы пиши с буквой и". Как выглядит выражение для ее поиска?
- ж или ш, за ней идет ы. По желанию можно взять еще несколько символов до и после, но они должны быть необязательными
Или выражение для поиска слова "сдесь"? ну тут все просто, именно это сочетание букв надо искать, только желательно проверить что это отдельное слово, а не часть большего слова. Для этого тебе поможет констрсукция \\b
Перечитай урое по регуляркам. Почитай официальный мануал, если надо: http://php.net/manual/ru/pcre.pattern.php
И решил ли ты задачу про телефоны? Она чуть проще.
В конце текста тоже может быть ошибка. Откуда у тебя уверенность что там будет еще 5 символов?
Алсо, точка значит "любой символ кроме \n", а не "любой символ" если не стоит флаг s.
Я смотрел один из русских переводов книги, код там ужасного качества, в конце соцсеть = 100% быдлокод. Плюс, как я понимаю, HTML5/CSS3 там нет.
>И решил ли ты задачу про телефоны?
http://ideone.com/psxyMg - вот, вчера сделал.
Сейчас буду курить урок целиком и переписывать.
А их нет для новичков (сколько сюда не вбрасывали, везде треш разной степени). Учебник ОПа и интернет наше все.
Может, ты смотрел старое издание? Я на англ скачал и читаю, ХТМЛ5 точно есть. А какие претензии к самому коду? Мне бы книгу, чтоб вникнуть во всё (как всё работает, оче трудно по ОПу чисто идти, т.к. нет связующих звеньев у него между кластерами ПХП-ДЖС-ХТМЛ и тп)
Решение верное. Главное чтобы ты понимал как ведут себя элементы с display block, как считается их ширина, как можно выравнивать их маргинами.
Насчет бордера/паддинга - это косяк ОПа что он в задаче это не учел.
В оглавлении не вижу ООП, в JS не вижу упоминания DOM. Вызывает у меня сильные сомнения, автор просто пытался запихнуть в книгу побольше технологий, пожертвовав качеством.
Можешь попробовать почитать что-то из книги, но не пиши код как там учат.
Также, почитай туториал тут http://php.net/manual/ru/tutorial.php
Также, комментарии к задаче про студентов.
Cпасибо, буду тогда иногда присматриваться к книге, но пойду по стопам ОПа.
ООП там есть в конце главы про ПХП.
ёбаный врот, по этому гиту ещё огроменный талмуд? Хули тут так много? Без этого не обойтись? Блядь, куда я ввязался вообще
Спасибо.
а вкратце если своими словами? что это за сайт, как им пользоваться? Я так понимаю, туда свои проекты заливают, верно?
java way:
int number = 1000_000_000;
Есть что нибудь такое в PHP?
Зачем искать те слова, которые могут встречаться, не лучше ли искать только ошибочное слово? "Сдесь" - ошибка, а всё остальное идёт лесом.
Гит (Git) - система контроля версий. Гитхаб (GitHub) - сайт, который основан на этой системе контроля версий. Зачем нужны системы контроля версий ты можешь почитать на википедии.
Алсо, у гитхаба есть очень хороший интерактивный учебник, которые учит базовым знаниям по гиту.
https://try.github.io/
Работает неправильно твоя регулярка: http://ideone.com/3bbr8i
>[)]?
Не имеет смысла один символ ставить в квадратные скобки.
Пробелов и минусов там должно быть сколько угодно, твоя регулярка не универсальна.
Спасибо. Да вроде прошёл этот учебник (он оче короткий и из него не понятно вообще нихуя. может, я просто даун)
guides.github.com Пробую через это - описывает, как простой хелооуворлд написать свой на гите, немного ясней становится
Тут школьники решают детские задачки, а тебе во взрослый тред к взрослым людям. Но учти, тебя там могут и нахуй послать по взрослому.
ALTER TABLE `manager`
ADD CONSTRAINT `manager_ibfk_1` FOREIGN KEY (`chief_id`) REFERENCES `chief` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;
то можно ли делать выборку как-то по внешним ключам, а не джойнами.
SELECT COUNT(*) > `chief.claims` FROM `claim`
INNER JOIN `manager` ON `manager.id` = `claim.manager_id`
INNER JOIN `chief` ON `chief.id` = `manager.chief_id`
GROUP BY `manager_id`
Мне кажется, джойнить не очень правильно, когда есть внешние ключи.
Спасибо, теперь работает, как указано в задаче.
Но получилось как-то грязно и мне кажется не правильно.
http://codepen.io/anon/pen/obQdVZ?editors=0011
Хотелось бы получить конструктивную струю мочи в лицо.
Да при чем тут min?
Делаешь order by по нужной колонке, потом выбираешь только первые 2 записи.
Например есть таблица
id | name | value
1 | foo | 3
2 | bar | 1
3 | hello | 4
4 | world | 2
SELECT x FROM tbl_name ORDER BY value LIMIT 2; выберет две строки с минимальным значением value.
Почитай внимательно, как работает group by. Все пять твоих заданий решаются через группировку.
>>647963
Джойн это объединение таблиц. Это значит, что нужно из двух и более таблиц получить одну. Почитай, как они работают. Для внутреннего объединения, если не указано условие, происходит декартово произведение всех строк из объединяемых таблиц.
Например есть две таблицы.
Таблица foo
1 | aaa
2 | bbb
3 | ccc
Таблица bar
1 | 10
2 | 20
Результатом объединения будет таблица
1 | aaa | 1 | 10
1 | aaa | 2 | 20
2 | bbb | 1 | 10
2 | bbb | 2 | 20
3 | ccc | 1 | 10
3 | ccc | 2 | 20
Для объединения можно указать условие ON либо WHERE
foo JOIN bar WHERE foo.id = bar.id
Тогда в результирующем наборе будут только строки, подходящие под условие. Надеюсь, понятно какие.
Внешний ключ это ссылка на запись в другой таблице, он используется в первую очередь как ограничитель для гарантии целостности данных. По нему удобно производить объединение таблиц, но он не для этого предназначен.
Вообще судя по тому что ты пишешь, ты не понимаешь как работают запросы, просто копируешь левые примеры из гугла.
Если тебе так тяжело это дается, то не лучше ли попробовать заняться cms? В этом нет ничего постыдного. Гики их не любят из-за простоты и не очень удачно спроектированной архитектуры, но ты же явно не гик.
>>647953
>>647954
>>647955
>>647958
Преданный поклонник пытается прогнать злого траля, обидевшего священного опа.
Ты понимаешь, что от твоих постов он не испугается и не перестанет писать, что ты только флудишь.
И так всегда, один дебил напишет какую-нибудь хуйню, и тут же стадо хомяков полсотни постов ему в ответ. А мне скроллить это дерьмо.
Да при чем тут min?
Делаешь order by по нужной колонке, потом выбираешь только первые 2 записи.
Например есть таблица
id | name | value
1 | foo | 3
2 | bar | 1
3 | hello | 4
4 | world | 2
SELECT x FROM tbl_name ORDER BY value LIMIT 2; выберет две строки с минимальным значением value.
Почитай внимательно, как работает group by. Все пять твоих заданий решаются через группировку.
>>647963
Джойн это объединение таблиц. Это значит, что нужно из двух и более таблиц получить одну. Почитай, как они работают. Для внутреннего объединения, если не указано условие, происходит декартово произведение всех строк из объединяемых таблиц.
Например есть две таблицы.
Таблица foo
1 | aaa
2 | bbb
3 | ccc
Таблица bar
1 | 10
2 | 20
Результатом объединения будет таблица
1 | aaa | 1 | 10
1 | aaa | 2 | 20
2 | bbb | 1 | 10
2 | bbb | 2 | 20
3 | ccc | 1 | 10
3 | ccc | 2 | 20
Для объединения можно указать условие ON либо WHERE
foo JOIN bar WHERE foo.id = bar.id
Тогда в результирующем наборе будут только строки, подходящие под условие. Надеюсь, понятно какие.
Внешний ключ это ссылка на запись в другой таблице, он используется в первую очередь как ограничитель для гарантии целостности данных. По нему удобно производить объединение таблиц, но он не для этого предназначен.
Вообще судя по тому что ты пишешь, ты не понимаешь как работают запросы, просто копируешь левые примеры из гугла.
Если тебе так тяжело это дается, то не лучше ли попробовать заняться cms? В этом нет ничего постыдного. Гики их не любят из-за простоты и не очень удачно спроектированной архитектуры, но ты же явно не гик.
>>647953
>>647954
>>647955
>>647958
Преданный поклонник пытается прогнать злого траля, обидевшего священного опа.
Ты понимаешь, что от твоих постов он не испугается и не перестанет писать, что ты только флудишь.
И так всегда, один дебил напишет какую-нибудь хуйню, и тут же стадо хомяков полсотни постов ему в ответ. А мне скроллить это дерьмо.
погуглить плагин для вп и функции.
ОП, возвращаюсь со своим файлообменником, поправил твои замечания
Вчера мне отказали в должности Project manager'a так что буду дальше идти по пути fullstack-разработчика
Сразу есть вопрос по твоим замечаниям
>Проблема: при ошибке запись в базу добавится, а файл на диске еще не сохранен. Надо бы завернуть в транзакцию вызов этой функции.
Как мне получить id файла в базе до того как я его внес в базу? Проблема в том что при сохранении файла у меня используется его id в имени.
Не вижу особой разницы между цмс и фреймворком? да и цмс по-моему сложнее, что можно продать на цмс без глубоких знаний пхп и пердолинга с его фиксингом? да ничего, там же стандартный функционал. любой васян себе сайт на цмс шлепнет и программистам там платить не нужно.
>Как мне получить id файла в базе до того как я его внес в базу? Проблема в том что при сохранении файла у меня используется его id в имени.
Почитай про транзакции в PDO. Алгоритм следующий - инициализируешь транзакцию, получаешь id файла, в случае успеха завершаешь транзакцию (PDO::commit), в случае ошибки делаешь роллбэк (PDO::rollBack).
Ссылки на мануал:
http://php.net/manual/en/pdo.begintransaction.php
http://php.net/manual/en/pdo.commit.php
http://php.net/manual/en/pdo.rollback.php
https://github.com/buckyroberts/Social-Network-Website
Не хотите на досуге поковырять?
А это пример хорошего кода? Плохого кода? Можно краткий комментарий для нубасов?
Что там ковырять? Очередной самописный уродец без намека на ооп и хоть какую-то продуманную архитектуру.
Если благодаря раскрутке это говно взлетит, то спустя год-два вместо 87 файлов в корневом каталоге их будет 870, в каждом из них не 50 строчек как сейчас, а по 500.
Никакого порядка в организации кода, все сплошной стеной, даже файлы свалены в кучу.
Представь что ты "долго занимаешься" и тебя пригласили на работу над таким проектом.
Попробуй что-то дописать или пофиксить. Не знаю, вот человек просит хлебные крошки.
https://github.com/buckyroberts/Social-Network-Website/issues/4
Можешь сделать это и послать pull request.
Вот еще один баг с интерфейсом.
https://github.com/buckyroberts/Social-Network-Website/issues/3
Серьезно, попробуй над этим поработать, тогда поймешь хороший это код или плохой. Пока там сотня файлов, то еще ничего, но через год это разрастется в десять раз, и там черт ногу сломит.
>>648105
Задавай конкретный вопрос.
>Задавай конкретный вопрос.
Как соединить SQL через ПХП? Для чего мне использовать ПХП, только для соединения с БД? Какие файлы нужно создавать, как их структурировать? Где? На гитхабе или на своём ПК?
Да, делал
Дело в том, что я делал все задачи довольно аутично сидя в своём манямирке и планомерно выполняя поставленную задачу. В списке студентов же требуется обширное знание всех технологий, как что с чем соединять, а этого не было в отдельных задачкахну не было же.
Поясните, пожалуйста, как запускать чужие проекты из гитхаба? Их скачивать и через собственный сервер открывать? Какой файл "первый" надо открыть, чтоб всё запустилось?
>Как соединить SQL через ПХП?
Что такое "соединить SQL"? Соединиться с базой данных?
В задании на список студентов есть ссылки на хабр и документацию.
https://github.com/codedokode/pasta/blob/master/student-list.md#Работа-с-базой-данных-из-php
>Для чего мне использовать ПХП, только для соединения с БД?
Для извлечения и вставки данных из базы (модели), для подстановки этих данных в html-шаблон (представления), для обработки запроса (контроллеры).
>Какие файлы нужно создавать, как их структурировать?
https://github.com/codedokode/pasta/blob/master/student-list.md#Структура-файлов
https://github.com/codedokode/pasta/blob/master/student-list.md#mvc
>На гитхабе или на своём ПК?
Читай учебник по гиту.
https://git-scm.com/book/ru/v1
Ох, спасибо... какой же я слепой мудак, так всего боюсь и постоянно теряюсь, когда понимаю, что ещё совсем ничего не понимаю...
А свои ты как запускаешь?
Да, скачай с гитхаба (на самом деле из командой строки git clone, но наверное это слишком сложно) и распакуй архив в нужную директорию своего сервера.
"Первый файл" как обычно index.php, его не обязательно писать в адресной строке.
На всяких сборках это будет http://localhost/project.name/ или http://localhost/project.name/index.php
Я скачиваю зип-архив, распаковываю в папку с сервером, ищу индекс.пхп, прописываю путь к нему через браузер, но всегда натыкаюсь на сообщения об ошибке.
Не совсем понял тебячё за vhosts?. Я через этот сервер всегда задачки ОПа проверяю и в принципе он рабочий.
вот например ту Социалную Сеть скачал.
пишу в браузере http://localhost/Social-Network-Website-master/
Получаю
Warning: require_once(C:\xampp\htdocs\Social-Network-Website-master\includes/config.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Social-Network-Website-master\includes\bootstrap.php on line 8
Fatal error: require_once(): Failed opening required 'C:\xampp\htdocs\Social-Network-Website-master\includes/config.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Social-Network-Website-master\includes\bootstrap.php on line 8
Извини, я никогда не ставил веб-сервера на сперму, просто смешно стало.
Никто больше не подскажет, как с этим бороться и загружать гитхабовские проекты?
Винда понимает оба разделителя, так что скорее всего дело не в этом.
http://rmcreative.ru/blog/post/directory_separator-v-php
http://us2.php.net/manual/en/ref.filesystem.php#73954
>>648169
Ты уверен в том, что в папке C:\xampp\htdocs\ у тебя находится папка Social-Network-Website-master, а в ней папка includes с файлом config.php?
С сервером все в порядке? Создай папку C:\xampp\htdocs\example.com, положи в нее файл index.php с содержимым
<?php echo 'hello world';
Попробуй запустить localhost/example.com.
Вообще ты хуйней какой-то занимаешься. Зачем пытаться установить себе какое-то левое приложение, непонятно кем написанное, если у тебя такое слабое представление как это все работает? Что ты собрался с ним делать?
Решай лучше задачи из оп-поста, это полезнее.
Да, у меня работают собственные страницы, которые кладу в папку и запускаю.
>Что ты собрался с ним делать?
ну надо же начинать понимать, что вообще происходит у других людей
>Решай лучше задачи из оп-поста, это полезнее.
как раз пытаюсь начать студентов делать и начать понимать, как создавать страничку с несколькими файлами
Я у тебя еще раз спрашиваю
>Ты уверен в том, что в папке C:\xampp\htdocs\ у тебя находится папка Social-Network-Website-master, а в ней папка includes с файлом config.php?
Короче нет такого файла, зато есть config.php.sample. Автор видимо хочет, чтобы люди переименовывали этот файл. Хотя вообще-то надо упоминать об этом в ридми.
Сразу можешь переименовать db_config.php.sample и functions/secure.php.sample, та же история.
Дальше нужно либо зайти в db_config.php и прописать вместо buckysroom свою базу данных, либо создать новую бд с именем buckysroom.
О том где находится дамп нигде не сказано. Пришлось искать по расширению sql. Дамп нашелся в папке db.
Залить дамп у меня не получилось, потому что выяснилось, что приложение требует версию mysql минимум 5.6 (поддержка полнотекстовых индексов в innodb). Об этом тоже ничего не сказано.
В общем, решайте лучше оповские задания, не тратьте время на такое говно.
Чего стоит только конфиг из сотен констант и гигантских массивов
https://github.com/buckyroberts/Social-Network-Website/blob/master/includes/config.php.sample
разве неочевидно, что эту кашу нужно хранить в бд, написать отдельный интерфейс в админке?
А, ну да, это "слишком сложно", лучше буду скроллить тысячу строк в файле, который лежит хз где, в поисках строки "CNST_SM_STTNG", "MGCSTR"
<?= ListView::widget([
'dataProvider' => $dataProvider,
'itemOptions' => ['class' => 'item'],
'itemView' => function ($model, $key, $index, $widget) {
$string = Html::a(Html::encode($model->title), ['view', 'id' => $model->news_id]) . "<br>" . Html::encode($model->text);
return $string;
},
])
> CNST_SM_STTNG
вот тоже кошмар - человек почему-то пропускает гласные в словах как медведь с двачекартинок.
Если тебе надо отправлять запросы к базе данных из пхп программы, тебе нужна библиотека работы с БД. В PHP есть mysqli и pdo (обе встроенные и под windows поставляются вместе с php как расширения, их может надо будет включить в php.ini), я рекомендую PDO, гугли статью "почему вам стоит использовать PDO".
Ну да, папки и классы вообще не организованы, прост мне понравилось его видео про Java Fx, я подумал, что там норм код.
>>647868
Гит - это система контроля версий (такая программа), которая позволяет создать репозиторий (хранилище исходного кода). Репозиторий нужен для того, чтобы отслеживать историю изменений кода. Если ты работаешь один, с его помощью ты можешь например посмотреть версию кода которую ты написал неделю назад, или посмотреть что ты менял вчера, если забудешь. Если ты работаешь в команде, то гит позволяет нескольким людям работать над проектом, смотреть и объединять изменения друг друга. Если его не использовать, а например просто расшарить папку с кодом, то люди будут перезаписывать изменения друг друга.
То есть гит ведет историю твоего проекта.
По этой причине в любой нормальной компании используют системы контроля версий вроде гита. Потому надо уметь им пользоваться.
Гит - это не язык программирования. На нем нельзя написать хелло ворлд. Это система, которая отслеживает изменения файлов с кодом и ведет архив их версий.
Гит это свободный, бесплатный продукт с открытым кодом.
Про гит можно и нужно почитать эту книгу: https://git-scm.com/book/ru/v1
Гитхаб - это хостинг (хранилище) для репозиториев гит. Ты можешь загрузить свой гит репозиторий на гитхаб и тогда любой сможет его скачать себе или просмотреть файлы. Также, загружая код на гитхаб ты защищаешь себя на случай если что-то случится с твоим жестким диском.
Гитхаб это коммерческий сайт. Хоть он и бесплатный для обычных пользователей вроде тебя, но люди, которые его делают, неплохо зарабатывают на продаже дополнительных услуг компаниям.
Гитхаб - это не гит, и его делают другие люди. Гит это программа создания и управления репозиториями с кодом, гитхаб - сайт, где можно опубликовать свой рпозиторий.
Кроме гитхаба, есть другие компании которые предоставляют похожие услуги, например bitbucket, но они менее известны, у них меньше пользователей.
Если ты изучил гит, то выгрузить свой репозиторий на гитхаб совсем несложно. Потому надо начать с изучения гита.
Мы просим загружать код на сайты вроде github или bitcucket или аналогичный, потому что ОПу так удобнее смотреть код, ему неохота скачивать и распаковывать архивы с файлообменников. Ну а тебе польза от того, что научишься работать с гитхабом и гитом, его во многих компаниях используют.
>>647868
Гит - это система контроля версий (такая программа), которая позволяет создать репозиторий (хранилище исходного кода). Репозиторий нужен для того, чтобы отслеживать историю изменений кода. Если ты работаешь один, с его помощью ты можешь например посмотреть версию кода которую ты написал неделю назад, или посмотреть что ты менял вчера, если забудешь. Если ты работаешь в команде, то гит позволяет нескольким людям работать над проектом, смотреть и объединять изменения друг друга. Если его не использовать, а например просто расшарить папку с кодом, то люди будут перезаписывать изменения друг друга.
То есть гит ведет историю твоего проекта.
По этой причине в любой нормальной компании используют системы контроля версий вроде гита. Потому надо уметь им пользоваться.
Гит - это не язык программирования. На нем нельзя написать хелло ворлд. Это система, которая отслеживает изменения файлов с кодом и ведет архив их версий.
Гит это свободный, бесплатный продукт с открытым кодом.
Про гит можно и нужно почитать эту книгу: https://git-scm.com/book/ru/v1
Гитхаб - это хостинг (хранилище) для репозиториев гит. Ты можешь загрузить свой гит репозиторий на гитхаб и тогда любой сможет его скачать себе или просмотреть файлы. Также, загружая код на гитхаб ты защищаешь себя на случай если что-то случится с твоим жестким диском.
Гитхаб это коммерческий сайт. Хоть он и бесплатный для обычных пользователей вроде тебя, но люди, которые его делают, неплохо зарабатывают на продаже дополнительных услуг компаниям.
Гитхаб - это не гит, и его делают другие люди. Гит это программа создания и управления репозиториями с кодом, гитхаб - сайт, где можно опубликовать свой рпозиторий.
Кроме гитхаба, есть другие компании которые предоставляют похожие услуги, например bitbucket, но они менее известны, у них меньше пользователей.
Если ты изучил гит, то выгрузить свой репозиторий на гитхаб совсем несложно. Потому надо начать с изучения гита.
Мы просим загружать код на сайты вроде github или bitcucket или аналогичный, потому что ОПу так удобнее смотреть код, ему неохота скачивать и распаковывать архивы с файлообменников. Ну а тебе польза от того, что научишься работать с гитхабом и гитом, его во многих компаниях используют.
telnet ya.ru 80
Trying 93.158.134.3...
Connected to ya.ru.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: ya.ru
HTTP/1.1 302 Found
Server: nginx
Date: Tue, 09 Feb 2016 17:16:24 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Location: https://ya.ru/
Expires: Tue, 09 Feb 2016 17:16:24 GMT
Last-Modified: Tue, 09 Feb 2016 17:16:24 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yandexuid=1247493251455038184; Expires=Fri, 06-Feb-2026 17:16:24 GMT; Domain=.ya.ru; Path=/
Начинающему лучше бы немного повозиться с консолькой как описано например в туториале: http://phpclub.ru/mysql/doc/tutorial.html
Также, в ОП посте есть паста про использование командной строки.
Потом, когда выучишь основы, можешь переходить на phpmyadmin или другие аналогичные программы.
>>647895
И что характерно, темп постинга не снижается. Ладно, сделаем новый тред тогда.
>>647922
На гите нельзя ничего написать. Можно только создать гит репозиторий, поместить в него свои файлы, опубликовать его на гитхабе.
>>647939
В JS нет классов, но есть функции-конструкторы для объектов и прототипы функций, в которые добавляют методы. С их помощью имитируют классы из других языков программирования.
>>647942
Никак. Лимит ограничивает число выбранных строк.
>>647950
Забей. Тебе надо начать с изучения баз данных, например в Оп посте есть задачки с туториалами, можешь их решать, начиная с задачи про лайки. ну и туториалы по ссылкам надо почитать.
>>647963
> то можно ли делать выборку как-то по внешним ключам, а не джойнами.
я догадался что ты хотел спросить. Нет, нельзя, но есть один трюк. Если поля назвать одинаково в обоих таблицах, то можно писать (независимо, есть внешние ключи или нет)
a JOIN b ON (x)
Это равноcильно
a JOIN b ON a.x = b.x
Но это требует называть поля одинаково, лучше так не делать.
> Мне кажется, джойнить не очень правильно, когда есть внешние ключи.
Нет, использовать внешние ключи нельзя. Внешние ключи это ограничение, то есть штука которая проверяет вставляемые в поле значения.
Начинающему лучше бы немного повозиться с консолькой как описано например в туториале: http://phpclub.ru/mysql/doc/tutorial.html
Также, в ОП посте есть паста про использование командной строки.
Потом, когда выучишь основы, можешь переходить на phpmyadmin или другие аналогичные программы.
>>647895
И что характерно, темп постинга не снижается. Ладно, сделаем новый тред тогда.
>>647922
На гите нельзя ничего написать. Можно только создать гит репозиторий, поместить в него свои файлы, опубликовать его на гитхабе.
>>647939
В JS нет классов, но есть функции-конструкторы для объектов и прототипы функций, в которые добавляют методы. С их помощью имитируют классы из других языков программирования.
>>647942
Никак. Лимит ограничивает число выбранных строк.
>>647950
Забей. Тебе надо начать с изучения баз данных, например в Оп посте есть задачки с туториалами, можешь их решать, начиная с задачи про лайки. ну и туториалы по ссылкам надо почитать.
>>647963
> то можно ли делать выборку как-то по внешним ключам, а не джойнами.
я догадался что ты хотел спросить. Нет, нельзя, но есть один трюк. Если поля назвать одинаково в обоих таблицах, то можно писать (независимо, есть внешние ключи или нет)
a JOIN b ON (x)
Это равноcильно
a JOIN b ON a.x = b.x
Но это требует называть поля одинаково, лучше так не делать.
> Мне кажется, джойнить не очень правильно, когда есть внешние ключи.
Нет, использовать внешние ключи нельзя. Внешние ключи это ограничение, то есть штука которая проверяет вставляемые в поле значения.
У тебя большая функция-конструктор и в ней много не относящегося к конструированию. Таблицы цен надо вынести в отдельный метод.
Методы надо объявлять не внутри конструктора, а добавлять их в прототип функции-конструктора. Конструкция return { ... } будет не нужна.
Почитай комментарии к задаче, там есть ссылка на learn.javascript.ru где объясняется как это делать.
Нужно сделать имитацию класса именно на прототипах, а не одной гигантской функцией.
Также, добавок может быть выбрано две (или больше, если мы захотим дописать потом программу), а не одна.
> totalCalories = getCalories(sizes[size]) + getCalories(stuffings[stuffing]) + getCalories(toppings[item]);
Не надо хранить переменные totalCalories, я же написал выше что их можно вычислить в любой момент, зная тип гамбургера и добавок, следовательно хранить их не требуется.
Нет проверки, что переданы правильные значения для размера и типа начинки. Нет проверки что та же самая добавка добавляется второй раз.
>>648018
Пусть пишет. У него пока мало знаний чтобы решить это задание, значит надо учиться.
>>648052
> отказали
Обычно на эту должность требуется определенный опыт работы разработчиком, возможно дело в этом?
> Как мне получить id файла в базе до того как я его внес в базу? Проблема в том что при сохранении файла у меня используется его id в имени.
Надо вставить запись в базу сначала. Чтобы до сохранения файла ее никто не увидел, надо завернуть все это в транзакцию и коммитить ее после успешного сохранения файла.
>>648053
Нет. CMS предназначена для разработки сайта мышкой в админке людьми без знания программирования, ну и верстку на нее натянуть особых знаний не требует.
Любой кто прошел наш курс и ООП, в CMS разберется легко, почитав документацию, а может даже интуитивно. Кто не прошел, может даже в CMS запутаться.
Да, транзакция нужна чтобы никто не увидел запись в тот момент когда файл еще не сохранен.
Вы должны всегда помнить что веб сервера работают многопоточно и всегда параллельно может работать несколько скриптов. Потому стоит использовать транзакции для атомарного и изолированного внесения изменений в базу.
>>648058
Перечитай свой пост:
> А вообще зачем знать программирование чтобы делать приложения? Я обычно из гугла копирую строки, этого ведь достаточно?
SQL надо знать, как минимум на том уровне что требуется в моих задачах из ОП поста (или на более хорошем уровне).
> Во фреймвокрах вообще запросы через Актив рекордс делаются.
Это лишь обертка над SQL запросами.
> Так-то надо по ходу поизучать доки сокла
SQL это не программа, у нее нет документации. это язык для написания запросов к базе данных. Ты наверно имел в виду документацию по СУБД MySQL.
Это читал? http://php.net/manual/ru/tutorial.php
Апач себе установил? В ОП посте есть урок по установке Апача и PHP.
Для работы с БД надо изучить библиотеку PDO, статья https://habrahabr.ru/post/137664/ + официальный мануал по PDO читай.
Есть еще mysqli, но она не умеет выбрасывать исключения, потому советую про нее забыть. Ну или написать/найти обертку которая бы умела проверять результат вызова функций и выбрасывать исключения.
PDO это ООП библиотека. ООП надо знать.
>>648063
Код плохой. Человек не освоил архитектуру, ООП, он умел писать простые скрипты и поптался с этими знаниями написать сложный проект - получилась лапша. Еще и велосипед, без фреймворков - это большая глупость.
Ни в коем случае нельзя учиться на таком коде. Реши наши задачки про студентов/файлообменник, изучи фреймворки и тебя тоже начнет трясти от его кода.
Увы, я часто вижу проекты написанные в таком или худшем стиле. Люди не хотят учиться, хотят сразу писать сложные приложения, но знаний у них пока маловато.
Тут в огромной базе всего один внешний ключ https://github.com/buckyroberts/Social-Network-Website/blob/master/db/tnb-database.sql
JS код - неструктурированная лапша: https://github.com/buckyroberts/Social-Network-Website/blob/master/js/edit_forum.js
Файлы лежат все в одной папке - это показывает неумение их организовать правильно. Человек не любит порядок.
https://github.com/buckyroberts/Social-Network-Website/tree/master/includes/classes - названия классов не по PSR.
Этому человеку надо учиться, у него знания науровне хелло ворлда и с этим нельзя писать соцсети.
https://github.com/buckyroberts/Social-Network-Website/blob/master/includes/classes/class.BuckysVideo.php
Запрос строится кусками, человек не знает про Query builder.
Результат в виде массивов сложной структуры.
https://github.com/buckyroberts/Social-Network-Website/blob/master/includes/classes/class.BuckysVideo.php#L95
Человек не додумался вынести работу с АПИ в отдельный класс или функции и просто лепит скопированный из гугла код работы с курлом. Человек явно не понимает как надо разбивать код на функции и классы. Человек не понимает что можно разбивать код, выполоняющий разные задачи на классы или файлы, а лепит все вперемешку.
Этот проект может научить разве что быдлокодингу. Имей в виду, что на нормальную работу быдлокодера не возьмут, тем более в кризис. Работодатели прекрасно умеют их отсеивать вопросами про ООП, фреймворки и паттерны.
Ну и такое ощущение что человек учился по книге Робин Никсон которую тут выше упоминали.
Это читал? http://php.net/manual/ru/tutorial.php
Апач себе установил? В ОП посте есть урок по установке Апача и PHP.
Для работы с БД надо изучить библиотеку PDO, статья https://habrahabr.ru/post/137664/ + официальный мануал по PDO читай.
Есть еще mysqli, но она не умеет выбрасывать исключения, потому советую про нее забыть. Ну или написать/найти обертку которая бы умела проверять результат вызова функций и выбрасывать исключения.
PDO это ООП библиотека. ООП надо знать.
>>648063
Код плохой. Человек не освоил архитектуру, ООП, он умел писать простые скрипты и поптался с этими знаниями написать сложный проект - получилась лапша. Еще и велосипед, без фреймворков - это большая глупость.
Ни в коем случае нельзя учиться на таком коде. Реши наши задачки про студентов/файлообменник, изучи фреймворки и тебя тоже начнет трясти от его кода.
Увы, я часто вижу проекты написанные в таком или худшем стиле. Люди не хотят учиться, хотят сразу писать сложные приложения, но знаний у них пока маловато.
Тут в огромной базе всего один внешний ключ https://github.com/buckyroberts/Social-Network-Website/blob/master/db/tnb-database.sql
JS код - неструктурированная лапша: https://github.com/buckyroberts/Social-Network-Website/blob/master/js/edit_forum.js
Файлы лежат все в одной папке - это показывает неумение их организовать правильно. Человек не любит порядок.
https://github.com/buckyroberts/Social-Network-Website/tree/master/includes/classes - названия классов не по PSR.
Этому человеку надо учиться, у него знания науровне хелло ворлда и с этим нельзя писать соцсети.
https://github.com/buckyroberts/Social-Network-Website/blob/master/includes/classes/class.BuckysVideo.php
Запрос строится кусками, человек не знает про Query builder.
Результат в виде массивов сложной структуры.
https://github.com/buckyroberts/Social-Network-Website/blob/master/includes/classes/class.BuckysVideo.php#L95
Человек не додумался вынести работу с АПИ в отдельный класс или функции и просто лепит скопированный из гугла код работы с курлом. Человек явно не понимает как надо разбивать код на функции и классы. Человек не понимает что можно разбивать код, выполоняющий разные задачи на классы или файлы, а лепит все вперемешку.
Этот проект может научить разве что быдлокодингу. Имей в виду, что на нормальную работу быдлокодера не возьмут, тем более в кризис. Работодатели прекрасно умеют их отсеивать вопросами про ООП, фреймворки и паттерны.
Ну и такое ощущение что человек учился по книге Робин Никсон которую тут выше упоминали.
Вот это >>644831 предел моих знаний на данный момент. Не знаю БД, гит. Стоит ли начинать список студентов, разбираясь по ходу или сначала лучше изучить то, чего не знаю.
И ещё один вопрос. В ближайший месяц мне нужно будет устраиваться на работу, так как начинаются проблемы с деньгами. Реально с такими знаниями за месяц достичь такого уровня, чтобы на работу взяли? И на что вообще делать упор? Раз ты сказал, что в CMS разобраться не сложно, стоит ли углубляться в эту сторону? Во фрилансе ведь это востребовано
Да, промежуточные уроки пока никто не написал. Но если ты прошел весь учебник, то наверно справишься с этим. Превозмогай.
>>648139
Зависит от проекта. Обычно надо сделать виртуал хост в Апаче, скачать файлы, отредактировать конфиг, залить дамп БД. Иногда еще запустить композер. В хороших проектах есть ридми или документация по установке.
>>648142
Глаза боятся - руки делают
>>648158
У меня норм, уезжать не планирую.
>>648175
Ну это твои проблемы. Ты так пишешь как будто под windows нельзя запускать апач или php. Это кроссплатформенный софт.
>>648180
Идиотский совет. Человек спрашивает как ему запустить проект. ты даешь ссылку на дистрибутив серверной операционной системы. Ну хотя бы макбук купить не стал советовать, и
на этом спасибо, а то есть ведь дауны которые думают что без него веб-разработкой заниматься нельзя.
>>648310
> разве неочевидно, что эту кашу нужно хранить в бд, написать отдельный интерфейс в админке?
не согласен. текстовые файлы имеют преимущество: их можно копировать, обрабатывать автоматизированно, искать по ним, публиковать в вебе, генерировать программно. Ну и ты не можешь менять настройки БД в админке. Мне кажется, тут надо сделать по другому:
- убрать все, что нельзя поменять, из конфига
- сделать базовый конфиг с настройками по умолчанию
- сделать пользовательский конфиг где переопрделеляются нужные настройки, например название сайта и реквизиты БД
Таким образом сразу видно что именно изменено.
Да, промежуточные уроки пока никто не написал. Но если ты прошел весь учебник, то наверно справишься с этим. Превозмогай.
>>648139
Зависит от проекта. Обычно надо сделать виртуал хост в Апаче, скачать файлы, отредактировать конфиг, залить дамп БД. Иногда еще запустить композер. В хороших проектах есть ридми или документация по установке.
>>648142
Глаза боятся - руки делают
>>648158
У меня норм, уезжать не планирую.
>>648175
Ну это твои проблемы. Ты так пишешь как будто под windows нельзя запускать апач или php. Это кроссплатформенный софт.
>>648180
Идиотский совет. Человек спрашивает как ему запустить проект. ты даешь ссылку на дистрибутив серверной операционной системы. Ну хотя бы макбук купить не стал советовать, и
на этом спасибо, а то есть ведь дауны которые думают что без него веб-разработкой заниматься нельзя.
>>648310
> разве неочевидно, что эту кашу нужно хранить в бд, написать отдельный интерфейс в админке?
не согласен. текстовые файлы имеют преимущество: их можно копировать, обрабатывать автоматизированно, искать по ним, публиковать в вебе, генерировать программно. Ну и ты не можешь менять настройки БД в админке. Мне кажется, тут надо сделать по другому:
- убрать все, что нельзя поменять, из конфига
- сделать базовый конфиг с настройками по умолчанию
- сделать пользовательский конфиг где переопрделеляются нужные настройки, например название сайта и реквизиты БД
Таким образом сразу видно что именно изменено.
ОП, перед торжественным закрытием распухшего треда, накидай каких-нибудь наводящих ссылок, куда дальше копать.
Ну или может простые задачи на поиграться с тельнетом и курлом.
Потому что я пока не очень в теме.
Например тут
>>648384
я ожидал как бы 200 статуса, а он говорит 302. Яндекс "Временно переехал"? Куда? Или это из-за другого протокола (https)?
Я думал, https это только какое-то внутреннее шифрование данных. Синтаксис заголовков у него тоже отличается что ли?
В общем, я думаю это из-за HTTP/1.1, он наверное ждет что-то другое, только не знаю что.
>>648438
А, ты уже тут.
Накидай ссылок, я не умею гуглить.
Ну ты можешь почитать комментарии к задаче про студентов, и решить, готов ли ты это писать или пока нет. Если да, то изучай параллельно, если нет, начни с HTML/SQL.
Насчет работы - если спешишь то изучай верстку и JS (learn.javascript.ru), какую-нибудь популярную в вашем региона CMS.Может возьмут натягивать шаблоны и править баги.
За месяц ты вряд ли студентов сделаешь нормально.
>Ты понимаешь, что от твоих постов он не испугается и не перестанет писать, что ты только флудишь.
Но ведь из тех постов мой только один, да и то с сажей?
Ясно. Спасибо за ответ
>В JS нет классов, но есть функции-конструкторы для объектов и прототипы функций, в которые добавляют методы. С их помощью имитируют классы из других языков программирования.
>
петушиный язык.
Да, сделал, правда не уверен правильно ли, не знаю как проверить.
В общем будет время, посмотри мой файлообменник https://github.com/V3N0m21/Uppu4
Из того что я вижу, нужно поправить верстку, а то бутстрап у меня там чуть корявенько использован, а также навести порядок с комментариями и аяксом.
кек, цмс-то легче фреймворков? ты тему пытался натянуть на цмс? нюфани не могут даже понять, где там вьюхи спрятаны, что уж говорить про понимание работы моделей и контроллеров.
>Обычно на эту должность требуется определенный опыт работы разработчиком, возможно дело в этом?
Да нет, опыт разработчика там не требовался. Я завалился на собеседовании, пройдя перед этим тестовые. А все потому что надо было готовиться. Эх, такой шанс вкатиться в индустрию ушел, печаль.
На каком вопросе срезался?
Что в итоге сказали, сокровенное "мы вам перезвоним" или сразу всю жестокую правду?
> Я думал, https это только какое-то внутреннее шифрование данных.
Это как бы отдельный протокол, потому надо посылать новый запрос, переключиться внутри одного запроса нельзя. Ну и он по умолчанию использует другой номер порта, так что в любом случае нужно новое соединение.
> Синтаксис заголовков у него тоже отличается что ли?
Нет, https этот тот же http, но данные передаются внутри шифрованного (SSL) соединения. То есть сначала стороны устанавливают соединение, договариваются о способе и ключах шифрования по протоколу SSL, а уже в защищенном канале передают HTTP запрос и ответ.
Руками через телнет SSL ты вряд ли сможешь сделать (там сложная математика, это же криптография), потому если ты хочешь слать HTTPS тебе нужна программа.
Например, ты можешь установить openssl, это программа для командной строки, и запустить входящий в нее клиент:
openssl s_client -connect ya.ru:443
я проверил - работает, выводит информацию о сертификатах, рекомандую попробовать. Openssl доступен под линукс и виндоуз, но под винду официально распространяет только исходный код который надо собрать и скомпилировать. Я нагуглил уже собранную программу тут: http://www.npcglib.org/~stathis/blog/precompiled-openssl/
Также, есть программы для отправки запросов не совсем вручную:
https://www.hurl.it/ (это сайт, а не программа, но тут капча)
https://addons.mozilla.org/en-US/firefox/addon/httprequester/
Есть программа curl для командной строки, она позволяет тоже слать запросы: https://curl.haxx.se/download.html
Я бы советовал разобраться с openssl и curl - они могут помочь тебе позже при отладке приложений.
Также, изучи какие запросы отправляются при открытии сайтов. Это можно сделать в dev tools в Хроме или ФФ (Ctrl + Shift + I), на вкладке Network.
Часто удобно не набирать запрос в команжной строке, а сохранить в файл и отправлять из файла, так:
openssl s_client ... < request.txt
telnet ... < request.txt
Эксперименировать с запросами удобно через сайт http://httpbin.org/ - там есть страницы, которые тебе в ответ на запрос прислывают какую-то информацию о нем.
Тебе надо изучить:
- что такое запрос/ответ, какие есть методы в HTTP
- некоторые коды ответов: 200, 301, 404, 401, 403, 500
- заголовки User-Agent, Referer, Conetnt-Type, Content-Length, Location, Accept, Cookie, Set-cookie, Host
- куки в HTTP
Вот задания:
- попробуй отправляя ГЕТ запрос на http://httpbin.org/user-agent добиться чтобы там отобразилось произвольное название user-agent в ответе сервера
- отправь ГЕТ запрос на http://httpbin.org/headers с заголовком X-Test: hello world, причем разбей заголовок на 2 строки. В ответе должно придти "hello world"
- отправь ПОСТ запрос на /post с данными a=1 и b=hello world. Используй способ кодирования данных application/x-www-form-urlencoded
В гугле почитай также про multipart/form-data, но так как он сложный, руками можешь его не делать. А можешь и попробовать сделать.
- отправь ГЕТ запрос на http://httpbin.org/cookies/set?k2=v2&k1=v1 и посмотри что придет в заголовке Set-Cookie
- отправь ГЕТ запрос с кукой a=%hello% на http://httpbin.org/cookies и добейся чтобы она была в ответе.
- попробуй получить ответ 200 на ГЕТ запрос на http://httpbin.org/basic-auth/ivan/1234 (имя и пароль написаны в URL)
- изучи АПИ яндекса и попробуй получить координаты для какого-нибудь адреса: https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/input_params-docpage/
Обрати внимание как надо кодировать русские буквы в URL (либо в utf-8 либо процентным кодированием).
Этого тебе хватит с запасом.
> Я думал, https это только какое-то внутреннее шифрование данных.
Это как бы отдельный протокол, потому надо посылать новый запрос, переключиться внутри одного запроса нельзя. Ну и он по умолчанию использует другой номер порта, так что в любом случае нужно новое соединение.
> Синтаксис заголовков у него тоже отличается что ли?
Нет, https этот тот же http, но данные передаются внутри шифрованного (SSL) соединения. То есть сначала стороны устанавливают соединение, договариваются о способе и ключах шифрования по протоколу SSL, а уже в защищенном канале передают HTTP запрос и ответ.
Руками через телнет SSL ты вряд ли сможешь сделать (там сложная математика, это же криптография), потому если ты хочешь слать HTTPS тебе нужна программа.
Например, ты можешь установить openssl, это программа для командной строки, и запустить входящий в нее клиент:
openssl s_client -connect ya.ru:443
я проверил - работает, выводит информацию о сертификатах, рекомандую попробовать. Openssl доступен под линукс и виндоуз, но под винду официально распространяет только исходный код который надо собрать и скомпилировать. Я нагуглил уже собранную программу тут: http://www.npcglib.org/~stathis/blog/precompiled-openssl/
Также, есть программы для отправки запросов не совсем вручную:
https://www.hurl.it/ (это сайт, а не программа, но тут капча)
https://addons.mozilla.org/en-US/firefox/addon/httprequester/
Есть программа curl для командной строки, она позволяет тоже слать запросы: https://curl.haxx.se/download.html
Я бы советовал разобраться с openssl и curl - они могут помочь тебе позже при отладке приложений.
Также, изучи какие запросы отправляются при открытии сайтов. Это можно сделать в dev tools в Хроме или ФФ (Ctrl + Shift + I), на вкладке Network.
Часто удобно не набирать запрос в команжной строке, а сохранить в файл и отправлять из файла, так:
openssl s_client ... < request.txt
telnet ... < request.txt
Эксперименировать с запросами удобно через сайт http://httpbin.org/ - там есть страницы, которые тебе в ответ на запрос прислывают какую-то информацию о нем.
Тебе надо изучить:
- что такое запрос/ответ, какие есть методы в HTTP
- некоторые коды ответов: 200, 301, 404, 401, 403, 500
- заголовки User-Agent, Referer, Conetnt-Type, Content-Length, Location, Accept, Cookie, Set-cookie, Host
- куки в HTTP
Вот задания:
- попробуй отправляя ГЕТ запрос на http://httpbin.org/user-agent добиться чтобы там отобразилось произвольное название user-agent в ответе сервера
- отправь ГЕТ запрос на http://httpbin.org/headers с заголовком X-Test: hello world, причем разбей заголовок на 2 строки. В ответе должно придти "hello world"
- отправь ПОСТ запрос на /post с данными a=1 и b=hello world. Используй способ кодирования данных application/x-www-form-urlencoded
В гугле почитай также про multipart/form-data, но так как он сложный, руками можешь его не делать. А можешь и попробовать сделать.
- отправь ГЕТ запрос на http://httpbin.org/cookies/set?k2=v2&k1=v1 и посмотри что придет в заголовке Set-Cookie
- отправь ГЕТ запрос с кукой a=%hello% на http://httpbin.org/cookies и добейся чтобы она была в ответе.
- попробуй получить ответ 200 на ГЕТ запрос на http://httpbin.org/basic-auth/ivan/1234 (имя и пароль написаны в URL)
- изучи АПИ яндекса и попробуй получить координаты для какого-нибудь адреса: https://tech.yandex.ru/maps/doc/geocoder/desc/concepts/input_params-docpage/
Обрати внимание как надо кодировать русские буквы в URL (либо в utf-8 либо процентным кодированием).
Этого тебе хватит с запасом.
Вот у меня массив такого вида:
array(14) {
[0]=>
array(25) {
[0]=>
string(2) "Д"
[1]=>
string(2) "ы"
[2]=>
string(2) "м"
[3]=>
string(1) " "
[4]=>
string(2) "т"
[5]=>
string(2) "а"
[6]=>
string(2) "б"
[7]=>
string(2) "а"
[8]=>
string(2) "ч"
[9]=>
string(2) "н"
[10]=>
string(2) "ы"
[11]=>
string(2) "й"
[12]=>
string(1) " "
[13]=>
string(2) "в"
[14]=>
string(2) "о"
[15]=>
string(2) "з"
[16]=>
string(2) "д"
[17]=>
string(2) "у"
[18]=>
string(2) "х"
[19]=>
string(1) " "
[20]=>
string(2) "в"
[21]=>
string(2) "ы"
[22]=>
string(2) "е"
[23]=>
string(2) "л"
[24]=>
string(1) "."
}
[1]=>
array(9) {
[0]=>
string(2) "К"
[1]=>
string(2) "о"
[2]=>
string(2) "м"
[3]=>
string(2) "н"
[4]=>
string(2) "а"
[5]=>
string(2) "т"
[6]=>
string(2) "а"
[7]=>
string(1) " "
[8]=>
string(1) "-"
}
[2]=>
array(27) {
[0]=>
string(2) "г"
[1]=>
string(2) "л"
[2]=>
string(2) "а"
[3]=>
string(2) "в"
[4]=>
string(2) "а"
[5]=>
string(1) " "
[6]=>
string(2) "в"
[7]=>
string(1) " "
[8]=>
string(2) "к"
[9]=>
string(2) "р"
[10]=>
string(2) "у"
[11]=>
string(2) "ч"
[12]=>
string(2) "е"
[13]=>
string(2) "н"
[14]=>
string(2) "ы"
[15]=>
string(2) "х"
[16]=>
string(2) "о"
[17]=>
string(2) "в"
[18]=>
string(2) "с"
[19]=>
string(2) "к"
[20]=>
string(2) "о"
[21]=>
string(2) "м"
[22]=>
string(1) " "
[23]=>
string(2) "а"
[24]=>
string(2) "д"
[25]=>
string(2) "е"
[26]=>
string(1) "."
}
Вот как мне отдельно посчитать, сколько элементов в массиве $array[0], в массиве $array[1] и так далее?
Пройтись циклом с for по массиву, подставляя $i в $array[$i] считая с помощью count() и набивая другой массив получившимися цифрами?
Есть ли какой-то более очевидный способ просто получить последние ключи из этих массивов (они ведь как раз и будут нужными цифрами)?
Вот у меня массив такого вида:
array(14) {
[0]=>
array(25) {
[0]=>
string(2) "Д"
[1]=>
string(2) "ы"
[2]=>
string(2) "м"
[3]=>
string(1) " "
[4]=>
string(2) "т"
[5]=>
string(2) "а"
[6]=>
string(2) "б"
[7]=>
string(2) "а"
[8]=>
string(2) "ч"
[9]=>
string(2) "н"
[10]=>
string(2) "ы"
[11]=>
string(2) "й"
[12]=>
string(1) " "
[13]=>
string(2) "в"
[14]=>
string(2) "о"
[15]=>
string(2) "з"
[16]=>
string(2) "д"
[17]=>
string(2) "у"
[18]=>
string(2) "х"
[19]=>
string(1) " "
[20]=>
string(2) "в"
[21]=>
string(2) "ы"
[22]=>
string(2) "е"
[23]=>
string(2) "л"
[24]=>
string(1) "."
}
[1]=>
array(9) {
[0]=>
string(2) "К"
[1]=>
string(2) "о"
[2]=>
string(2) "м"
[3]=>
string(2) "н"
[4]=>
string(2) "а"
[5]=>
string(2) "т"
[6]=>
string(2) "а"
[7]=>
string(1) " "
[8]=>
string(1) "-"
}
[2]=>
array(27) {
[0]=>
string(2) "г"
[1]=>
string(2) "л"
[2]=>
string(2) "а"
[3]=>
string(2) "в"
[4]=>
string(2) "а"
[5]=>
string(1) " "
[6]=>
string(2) "в"
[7]=>
string(1) " "
[8]=>
string(2) "к"
[9]=>
string(2) "р"
[10]=>
string(2) "у"
[11]=>
string(2) "ч"
[12]=>
string(2) "е"
[13]=>
string(2) "н"
[14]=>
string(2) "ы"
[15]=>
string(2) "х"
[16]=>
string(2) "о"
[17]=>
string(2) "в"
[18]=>
string(2) "с"
[19]=>
string(2) "к"
[20]=>
string(2) "о"
[21]=>
string(2) "м"
[22]=>
string(1) " "
[23]=>
string(2) "а"
[24]=>
string(2) "д"
[25]=>
string(2) "е"
[26]=>
string(1) "."
}
Вот как мне отдельно посчитать, сколько элементов в массиве $array[0], в массиве $array[1] и так далее?
Пройтись циклом с for по массиву, подставляя $i в $array[$i] считая с помощью count() и набивая другой массив получившимися цифрами?
Есть ли какой-то более очевидный способ просто получить последние ключи из этих массивов (они ведь как раз и будут нужными цифрами)?
Указанный файл не является xml файлом формата CommerceML второй редакции.
Вот так сделал пока:
$countedLetters = array();
for ($i = 0; $i <= count($letters); $i++) {
\t $count = count($letters[$i]);
\t array_push($countedLetters, $count);
}
Всё считает правильно, но хотелось бы уже не так топорно решать, как это всё время у меня выходило, а более изящно...
>они ведь как раз и будут нужными цифрами
То есть они будут нужными цифрами минус один - нумерация в массиве же с нуля идёт.
Ты пробовал сравнить свой файл с описанием файла "CommerceML второй редакции." ? С кодировками проблем нет? Праивльная кодировка стоит? C точки зрения XML файл правильный?
$searchModel = new NewsSearch();
$model = new News();
$dataProvider = Yii::$app->db->createCommand("SELECT group_concat(news_id) as `id`, group_concat(distinct `month`) as `month`, `year` FROM(SELECT news_id, DATE_FORMAT(date, '%M')as `month`, DATE_FORMAT(date, '%Y') as `year` FROM `news` ORDER BY date DESC) as x GROUP by `year`")->queryAll();
foreach($dataProvider as $data){
$pieces = explode(",", $data["month"]);
$pieces2 = explode(",", $data["id"]);
echo $data["year"]."<br>";
for($p=0; $p<count($pieces); $p++)
{
echo $pieces[$p]."<br>";
echo $pieces2[$p]."<br>";
}
}
Это быдлокодерство, так что надо все же почитать документацию. Ну и переменным надо дать нормальные названия.
Ты кстати знаешь про ограничение на 1024 символа (если я не путаю) по умолчанию в group_concat?
И зачем тут подзапросы?
Просто не ожидал от себя такой прыти.
Завтра всё подчищу и покажу, уже сплю.
Хочется горы свернуть, но потом смотрю на "Алфавит по кругу" и другие задачи - сразу становлюсь серьёзнее.
Даже задача "Чай с тортиком" кажется слишком сложной - просто не могу сообразить сходу, что там с чем связать.
Срезался на части где мы на английском разбирали тестовый кэйс. А так как я не знал правильного ответа, ничего толкового я не смог ответить, ну и походу интервьюер подумал что я хреново говорю по английски, и это как мне кажется стало ключевым фактором. Короче у меня до сих пор полыхает от себя, ведь я свободно говорю на английском, и вообще считал это своим ключевым достоинством.
ОП, ты по этой теме вышку получал или нет?
Можешь посоветовать каких-нибудь тем веб-проектов в качестве дипломной работы бакалавра?
Если бы сейчас сам начинал учить, пошел бы в PHP или в питон/ноду, скажем? Думаю, туда ли направил стопы.
И еще, скажи пожалуйста: аддоны для браузеров пишутся на яваскрипте безальтернативно, да? И вообще, меня ужасно бесит внешне этот язык, я совсем его хуево понимаю со всеми этими бесконечными цепочками анонимных функций и прочим. Есть какой-то может простой способ вкатиться и на каком его уровне необходимо знать - хеллоуворлда, надо понимать, недостаточно?
Они зарабатывают сбором информации о пользователе, внедрением рекламы в страницы.
Например расширение "frigate" для Хрома, для обхода блокировок, содержит в себе "Яндекс Советник", скрипт, который встраивается в страниц интернет-магазинов и подсказывает где можно купить этот же товар дешевле. Как минимум оно замедляет загрузку и работу этих сайтов, а может еще и сведения собирает.
Но Яндексовский скрипт еще относительно белый. Другие разработчики расширений менее разборчивы и согласны установить любые скрипты за которые платят.
Расширения часто имеют доступ ко всей информации, которую пользователь просмтривает и вводит. Они могут угонять аккаунты или например ставить лайки вконтакте от твоего имени, и тд.
Попробуй сам скачать какое-нибудь популярное расширение вроде "темы для вконтакте", "скачивание музыки вконтакте" и посмотреть исходники.
Ну и есть более-менее белые способы, например бесплатное расширение может рекламировать какую-то платную улучшенную версию программы.
То есть способы есть разные, главное - иметь аудиторию, чем больше тем лучше.
Если расширение с открытыми исходниками и ничего плохого не делает, оно все равно может например служить рекламой для какого-то сервиса или программы.
Есть примерно 25-30 полей форм (текстовые поля, поля с датами, чекбоксы, скрытые формы выпадающие при определённом действии), есть определённая хтмл таблица, сделанная из файла в экселе, представляет собой официальный документ, установленный законодательством. Скрипт принимает значение, проверяет их и вписывает в форму, вписывает максимально аккуратно, так как надо по законодательству, после чего, появляется возможность распечатать эту форму. Я писал этот скрипт примерно 3 дня (работал каждый день довольно много), чтобы всё совпадало и было как надо, использовал сторонние библиотеки и стили. Сколько стоит примерно такая работа?
Какую цену, мне стоит указать заказчику за такую работу? Скажу что, хоть и на первый взгляд всё просто в этом скрипте, но тем не менее была масса подводных камней, сделать возможность печати только определённой части страницы, перевести таблицу в хтмл, чтобы ничего при этом не нарушить (многое приходилось править руками, конвертеры не всегда хорошо переводят), проверять значения полученные из форм и многое другое.
http://loco.ru/materials/133-yii-archiv-po-mesyacam
Мне очень важно составлять полный подробный текстовый алгоритм решения задачи, без этого реализовать ничего не получается.
Столкнулся с некоторыми неожиданными для новичка вещами:
1. Интерпретатор выводит строки вниз, а не накладывает строку на строку, как я почему-то думал раньше.
Сейчас пересмотрел некоторые свои решения - и почему я так думал, там же всё именно идёт вниз. Со всего размаху прислонил ладонь к лицу.
2. Битый час сегодня возился с ошибкой Undefined offset в строке $count = $symbols[$i]; - и определял переменную массивом, и массив определял переменной (это вообще неправильно), ошибка оставалась. Потом нашёл непонятное решение в Сети: $count = @$symbols[$i]; - ставим "собаку" перед массивом, определяем его таким вот образом именно как массив. Не нашёл в мануале этого, поэтому непонятно, для чего нужно так вот подтверждать массив, когда у нас и так перед этим этот же самый массив создавался, а с помощью [$i] мы просто вытаскиваем конкретные значения из него.
Почти составил текстовый алгоритм для следующей задачи - "Чай с тортиком", некоторые моменты пока не понятны.
Глаза боятся, а руки делают. Ещё во сне многое определяется или когда просто гуляю, отдыхаю - само как-то приходит, потому что периодически возвращаюсь мысленно к проблемным моментам.
Был в похожей ситуации пару лет назад.
Только не 3 года учил, а 3 месяца.
В итоге устроился версталой и рад.
Сейчас полноценный фронтенд.
>Учитывая, что раздел посещает человек 10, то все за три года на пхпистов устроились.
Учитывая, что у анона не всё в порядке с логикой и наблюдательностью. Ну ты понял.
И что дает ob_implicit_flush(false) в этом коде? Для чего его использовали?
ob_start();
ob_implicit_flush(false);
extract($_params_, EXTR_OVERWRITE);
require($_file_);
return ob_get_clean();
https://github.com/V3N0m21/Uppu4/blob/c898ccce2109b5922db88bff43745b3f5f0ec13a/app/Helper/FileHelper.php#L54
>catch (Exception $e)
Ничего не произойдет, потому что стандартные функции пхп при ошибке исключений не выбрасывают. В твоем случае move_uploaded_file при ошибке вернет false и выполнение кода продолжится. Тут тебе нужно проверять что возвращает функция move_uploaded_file, если true - продолжать выполнение, если false - сделать роллбэк и выбросить исключение. Никаких try \ catch не нужно.
http://php.net/manual/en/function.move-uploaded-file.php#refsect1-function.move-uploaded-file-returnvalues
Вот, почитай в мануале.
Старый я стал. Целый час возился. Нужно xdebug поднять, что бы быстрее шло.
http://ideone.com/ZXUlms
Исправил
Хавай что дают, если не можешь самостоятельно установить софт.
Какое простое и изящное решение...
Вот к такому стремлюсь, но ни черта не выходит - моё топорное решение ты видел.
Но я ещё и со многими функциями не знаком (array_map, например, или даже max() не сразу нашёл - до этого пытался просто сравнивать посчитанные вложенные массивы в общем массиве с символами).
Надеюсь, с опытом это и ко мне придёт.
а с функциями особо не надо быть знакомым. Нужно что-то - гуглишь своими словами в гугле функцию(что должна выполнять, скажем, разбивать массив и тп) - втыкаешь в применением - используешь.
Да я так и делаю, но к чему там тот же array_map - сразу и не догадался.
Мне бы и не пришло в голову что-то подобное искать среди функций.
Я тоже про нее не помнил. Нашел по запросу "longest string in php array", когда гуглил как max() с массивами строк работает. Спрашивай у гугля как есть. Все равно на stackoverflow отправит. Только мануал внимательно читай потом по новым вещам. Ты же тот филолог/главред с клевым английским? У тебя все быстрей пойдет чем у плебеев со словорями.
https://github.com/MindiMakridi/filehosting/blob/master/models/Thumbnail.php
Насчет этого класса: у тебя он сделан так, что для каждой превьюшки создается свой объект. Мне конечно кажется, что чуть практичнее было бы сделать чтобы один объект мог обрабатывать много картинок, ну или хотя бы генерировать много превьюшек из одной картинки. Но с другой стороны, этот код тоже вполне работает, так что можно оставить так. Но в следующий раз все-таки лучше сделать многоразовый объект-генератор.
https://github.com/MindiMakridi/filehosting/blob/master/models/Thumbnail.php#L67
Если создавать имена функций таким образом, то их потом нельзя найти поиском (например по слову imagepng). В таких случаях лучше использовать switch, if, массивы с именами - то есть сделать чтобы имена хранились в явном виде, а не собирались по частям.
https://github.com/MindiMakridi/filehosting/tree/master/models
Название папки неудачное - модель это обычно объект, хранящий информацию о какой-то сущности, например File, а у тебя туда еще куча классов кинута. Конечно они являются частью Model из MVC, но с таким подходом придется половину приложения класть в эту папку. Лучше было назвать папку просто src или app. Не знаю, стоит ли переименоывать, может и не стоит.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php
Тут неймспейс написан не в том же регистре что и название папки: helpers и Helpers - это ошибка. На Линуксе имена файлов чувствительны к регистру.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L51
> if (getimagesize($path) && \Filehosting\Thumbnail::isExtensionAllowed(getimagesize($path)[2]))
У тебя есть класс, отвечающий за создание превьюшек - Thumbnail, а почему функция "проверить можно ли из этого файла сделать превьюшку" не находится в этом классе?
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L90
> public function getFileExtension(\Filehosting\File $file)
Расширение наверно проще получить через pathinfo: http://php.net/manual/ru/function.pathinfo.php
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L103
> public static function validateEditorialForm
> $file->setComment(trim($file->getComment()));
Почему функция с названием validate занимается не своим делом? Обрезать пробелу логичнее на этапе когда заполняются поля объекта.
> https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L124
> public function uploadFile(\Filehosting\File $file, \Filehosting\FilesMapper $files, $filePostData, $token){
Нелогично, что мы должны каждый раз передавать сюда объект маппера. Логичнее внедрить его один раз при создании объекта через конструктор.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L173
вардамп забыл убрать
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L52
> $app->filesHelper->uploadFile($file, $files, $_FILES, $app->getCookie('token'));
Не проверяется результат загрузки файла - удалось или нет его сохранить. Ошибка просто игнорируется и код продолжает выполняться. Это из-за того, что ты не хочешь использовать исключения, а используешь return false который сам же забываешь проверить. Переделай код на выброс исключения, если невозможно сохранить файл.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L124
> public function uploadFile(\Filehosting\File $file, \Filehosting\FilesMapper $files, $filePostData, $token){
В функции жестко прописано что имя поля с файлом должно быть userfile. Надо убрать эту привязку, передавая либо сразу нужный массив в функцию, либо объект File.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L140
Функция написана с ошибкой: если файл успещно загрузился, но его размер больше разрешенного, она вернет сообщение "Файл не был загружен".
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L51
> if (!$error=$app->filesHelper->validateFileUpload($_FILES, $app->config('maxsize'))) {
Здесь 2 отдельных действия: присваивание и if, и эту строчку лучше разбить на 2 отдельные команды.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L54
> $app->redirect("/files/$id");
Генерацию ссылки на страницу файла лучше вынести в отдельный метод.
> 'filesHelper' => $app->filesHelper
Чтобы не передавать filesHelper в каждом обработчике, можно передать его в начале в twig как-нибудь через setData() или appendData: http://docs.slimframework.com/view/data/ - или с твигом это не сработает? В твиге тоже есть метод вроде addGlobal.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L16
> <p class="comment">{{file.getComment()}}</p>
Тут теряются переводы строк в описании.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L23
> {% if filesHelper.canEdit(token, file) %}
Я тут подумал - эту проверку все же лучше сделать в обработчике в индекс.пхп, а сюда только передавать переменную с результатом. А то мы логику проверки прав в шаблон переносим.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L53
> скрипт
Этот скрипт ведь не будет работать, у тебя яваскрипты ниже подключаются, перед концом body?
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L35
> "/\.php|\.html|\.htaccess/
Это ненадежно, так как на разных хостингах могут быть и другие исполняемые раширения вроде phtml или php5. Надо переименовывать все файлы (или все файлы кроме белого списка безопасных расширений). Вообще не стоит полагаться на принцип "разрешено все что не запрещено", надо использовать "запрещено все, что не разрешено".
Также, мне кажется переименование должно делаться в методе загрузки файла, а не тут. задача модели файла - хранить информацию о нем, а переименование это часть процесса загрузки.
Также, я придумал еще кое-что для повышения безопасности. Мы ведь отдаем файлы через X-sendFile. Раз так, нам незачем хранить их в публичной папке веб-сервера, можно хранить файл вообще за пределами папки public. Получается небольшое усиление защиты.
И еще, защищена ли форма комментирования файла от CSRF?
Ну в общем, замечания в основном незначительные. Ты будешь дальше доделывать эту задачу, всякие там древовидные комментарии и аякс добавлять?
https://github.com/MindiMakridi/filehosting/blob/master/models/Thumbnail.php
Насчет этого класса: у тебя он сделан так, что для каждой превьюшки создается свой объект. Мне конечно кажется, что чуть практичнее было бы сделать чтобы один объект мог обрабатывать много картинок, ну или хотя бы генерировать много превьюшек из одной картинки. Но с другой стороны, этот код тоже вполне работает, так что можно оставить так. Но в следующий раз все-таки лучше сделать многоразовый объект-генератор.
https://github.com/MindiMakridi/filehosting/blob/master/models/Thumbnail.php#L67
Если создавать имена функций таким образом, то их потом нельзя найти поиском (например по слову imagepng). В таких случаях лучше использовать switch, if, массивы с именами - то есть сделать чтобы имена хранились в явном виде, а не собирались по частям.
https://github.com/MindiMakridi/filehosting/tree/master/models
Название папки неудачное - модель это обычно объект, хранящий информацию о какой-то сущности, например File, а у тебя туда еще куча классов кинута. Конечно они являются частью Model из MVC, но с таким подходом придется половину приложения класть в эту папку. Лучше было назвать папку просто src или app. Не знаю, стоит ли переименоывать, может и не стоит.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php
Тут неймспейс написан не в том же регистре что и название папки: helpers и Helpers - это ошибка. На Линуксе имена файлов чувствительны к регистру.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L51
> if (getimagesize($path) && \Filehosting\Thumbnail::isExtensionAllowed(getimagesize($path)[2]))
У тебя есть класс, отвечающий за создание превьюшек - Thumbnail, а почему функция "проверить можно ли из этого файла сделать превьюшку" не находится в этом классе?
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L90
> public function getFileExtension(\Filehosting\File $file)
Расширение наверно проще получить через pathinfo: http://php.net/manual/ru/function.pathinfo.php
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L103
> public static function validateEditorialForm
> $file->setComment(trim($file->getComment()));
Почему функция с названием validate занимается не своим делом? Обрезать пробелу логичнее на этапе когда заполняются поля объекта.
> https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L124
> public function uploadFile(\Filehosting\File $file, \Filehosting\FilesMapper $files, $filePostData, $token){
Нелогично, что мы должны каждый раз передавать сюда объект маппера. Логичнее внедрить его один раз при создании объекта через конструктор.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L173
вардамп забыл убрать
https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L52
> $app->filesHelper->uploadFile($file, $files, $_FILES, $app->getCookie('token'));
Не проверяется результат загрузки файла - удалось или нет его сохранить. Ошибка просто игнорируется и код продолжает выполняться. Это из-за того, что ты не хочешь использовать исключения, а используешь return false который сам же забываешь проверить. Переделай код на выброс исключения, если невозможно сохранить файл.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L124
> public function uploadFile(\Filehosting\File $file, \Filehosting\FilesMapper $files, $filePostData, $token){
В функции жестко прописано что имя поля с файлом должно быть userfile. Надо убрать эту привязку, передавая либо сразу нужный массив в функцию, либо объект File.
https://github.com/MindiMakridi/filehosting/blob/master/models/helpers/FilesHelper.php#L140
Функция написана с ошибкой: если файл успещно загрузился, но его размер больше разрешенного, она вернет сообщение "Файл не был загружен".
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L51
> if (!$error=$app->filesHelper->validateFileUpload($_FILES, $app->config('maxsize'))) {
Здесь 2 отдельных действия: присваивание и if, и эту строчку лучше разбить на 2 отдельные команды.
> https://github.com/MindiMakridi/filehosting/blob/master/public/index.php#L54
> $app->redirect("/files/$id");
Генерацию ссылки на страницу файла лучше вынести в отдельный метод.
> 'filesHelper' => $app->filesHelper
Чтобы не передавать filesHelper в каждом обработчике, можно передать его в начале в twig как-нибудь через setData() или appendData: http://docs.slimframework.com/view/data/ - или с твигом это не сработает? В твиге тоже есть метод вроде addGlobal.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L16
> <p class="comment">{{file.getComment()}}</p>
Тут теряются переводы строк в описании.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L23
> {% if filesHelper.canEdit(token, file) %}
Я тут подумал - эту проверку все же лучше сделать в обработчике в индекс.пхп, а сюда только передавать переменную с результатом. А то мы логику проверки прав в шаблон переносим.
https://github.com/MindiMakridi/filehosting/blob/master/templates/filePage.html.twig#L53
> скрипт
Этот скрипт ведь не будет работать, у тебя яваскрипты ниже подключаются, перед концом body?
> https://github.com/MindiMakridi/filehosting/blob/master/models/File.php#L35
> "/\.php|\.html|\.htaccess/
Это ненадежно, так как на разных хостингах могут быть и другие исполняемые раширения вроде phtml или php5. Надо переименовывать все файлы (или все файлы кроме белого списка безопасных расширений). Вообще не стоит полагаться на принцип "разрешено все что не запрещено", надо использовать "запрещено все, что не разрешено".
Также, мне кажется переименование должно делаться в методе загрузки файла, а не тут. задача модели файла - хранить информацию о нем, а переименование это часть процесса загрузки.
Также, я придумал еще кое-что для повышения безопасности. Мы ведь отдаем файлы через X-sendFile. Раз так, нам незачем хранить их в публичной папке веб-сервера, можно хранить файл вообще за пределами папки public. Получается небольшое усиление защиты.
И еще, защищена ли форма комментирования файла от CSRF?
Ну в общем, замечания в основном незначительные. Ты будешь дальше доделывать эту задачу, всякие там древовидные комментарии и аякс добавлять?
>Ты будешь дальше доделывать эту задачу, всякие там древовидные комментарии и аякс добавлять?
Конечно буду. Ну по крайней мере комментарии, насчет аякса не уверен, хотя это не должно быть сложно.
Да, я он. Вчера зарегистрировался на Гитхабе под ником "Glavred".
Английский мой за последнее время приуныл, сейчас его подтягиваю в Лингвалео.
Спасибо за советы, братишка, добра.
http://ideone.com/qXKUpj
А для чего там & перед значениями в foreach?
Всё должно работать и без ссылки, тем более, что это никуда не ссылается и там же именно и определяется.
http://ideone.com/b1S4lJ
ОП говорил, что нужна такая регулярка, которая видит кириллицу в слове из латинских букв и латиницу в слове из кириллических букв.
без обид, брат, но будь у тебя хоть мало-мальский английский ты бы знал, что лингвалео - для самых начинающих. Самых-самых
Путь в тысячу ли начинается с шага.
>>649206
Там разная мотивация, может человек для себя делал и ему не жалко поделиться, может компния для себя делала, может еще какие-то причины. Если расширение ничего плохого не делает, то оно ничего не принесет, донат работает только на проектах с огромной аудиторией.
> Хотел таким способом избежать дробления классов, т.к. они отличались только этим параметром, не стоит даже в таком случае так делать?
В таком случае можно либо повесить на элемент 2 класса, либо в CSS перечислить несколько классов через запятую.
> Это не понял, почему так? И шрифтов должно быть несколько?
Потому что нет гарантий что на компьютере установлен указанный тобой шрифт, потому надо указывать запасные варианты и в самом конце стандартный шрифт который гарантированно найдет браузер. Стандартный это один из serif, sans-serif, monospace, cursive и fantasy если я ничего не путаю. http://xiper.net/collect/html-and-css-tricks/typographics/safe-fonts
> С кнопкой мучился полдня
А ты прежде чем придумывать свой дизайн, погугли статьи вроде "красивые кнопки css3" или то же самое на английском и выбирай из готовых вариантов. Ну а в данной задаче - сделай как нарисовано в задании.
>>зачем тут испльзован флоат?
> Если его убрать, кнопку распидорасит полностью, я очень много методом проб и ошибок делал, так что держится на соплях, дай совета как исправить, нет сил уже с кнопкой бороться.
Если ты не знаешь то надо сесть и разобраться, чтобы в дальнейшем не спотыкаться на таких вещах. для того чтобы кнопки шли горизонтально, в CSS есть ровно 3 способа (не считая flexbox):
- inline-block
- float
- display: table, сделать таблицу в 1 строку
Вариант с таблицей плох (или наоборот, хорош) тем, что с ним кнопки никогда не перенесутся на вторую строку. Также, относительно таблицы и ее ячеек нельзя делать позиционирование.
Соответственно, рассмотри эти 3 варианта, и продумай какой больше подходит к задаче.
Также, твои кнопки плохо вписываются в страницу. Я засунул их в див, окружил текстом, и смотри как нехорошо получилось: https://jsfiddle.net/0Lvxs3yu/1/
Нужно чтобы твой виджет хорошо интегрировался в страницу.
> Насколько критично разбираться в тонкостях КСС? Голова от этого болит.
Голова болит если ты не понимаешь CSS и переставляешь свойства наугад. надо разобраться во всех возможных способов расположения элементов (display, float, position) и представлять как каждый из них себя ведет. То есть тебе надо как раз больше заниматься CSS.
>>641667
> [а-яё]+[.,;?!]*)([a-z]+)
Не очень понимаю, зачем здесь знаки препинания? Надо же искать последовательность вроде русская буква - латинская внутри одного слова.
Более того, логика работы функций checkText и showHighlightedText разная, то есть ищутся и подсвечиваются ошибки разными алгоритмами и возможно что одна функция увидит ошибки, а другая - нет. Это неправильно, в данном случае лучше всего сделать одну функцию, которая возвращает и факт наличия ошибок, и фразу с подсветкой ошибок. И echo вынести из нее.
В функции checkText лучше возвращать не фразу, а true/false, тогда можно исплоьзовать ее так:
if (checkText()) ... else ...
В твоем же случае результат можно только вывести, а ничего другого сделать нельзя.
Также, в функциях showHighlightedText и correctText есть явная копипаста. Надо бы избавиться от нее, например объединив функции.
> Хотел таким способом избежать дробления классов, т.к. они отличались только этим параметром, не стоит даже в таком случае так делать?
В таком случае можно либо повесить на элемент 2 класса, либо в CSS перечислить несколько классов через запятую.
> Это не понял, почему так? И шрифтов должно быть несколько?
Потому что нет гарантий что на компьютере установлен указанный тобой шрифт, потому надо указывать запасные варианты и в самом конце стандартный шрифт который гарантированно найдет браузер. Стандартный это один из serif, sans-serif, monospace, cursive и fantasy если я ничего не путаю. http://xiper.net/collect/html-and-css-tricks/typographics/safe-fonts
> С кнопкой мучился полдня
А ты прежде чем придумывать свой дизайн, погугли статьи вроде "красивые кнопки css3" или то же самое на английском и выбирай из готовых вариантов. Ну а в данной задаче - сделай как нарисовано в задании.
>>зачем тут испльзован флоат?
> Если его убрать, кнопку распидорасит полностью, я очень много методом проб и ошибок делал, так что держится на соплях, дай совета как исправить, нет сил уже с кнопкой бороться.
Если ты не знаешь то надо сесть и разобраться, чтобы в дальнейшем не спотыкаться на таких вещах. для того чтобы кнопки шли горизонтально, в CSS есть ровно 3 способа (не считая flexbox):
- inline-block
- float
- display: table, сделать таблицу в 1 строку
Вариант с таблицей плох (или наоборот, хорош) тем, что с ним кнопки никогда не перенесутся на вторую строку. Также, относительно таблицы и ее ячеек нельзя делать позиционирование.
Соответственно, рассмотри эти 3 варианта, и продумай какой больше подходит к задаче.
Также, твои кнопки плохо вписываются в страницу. Я засунул их в див, окружил текстом, и смотри как нехорошо получилось: https://jsfiddle.net/0Lvxs3yu/1/
Нужно чтобы твой виджет хорошо интегрировался в страницу.
> Насколько критично разбираться в тонкостях КСС? Голова от этого болит.
Голова болит если ты не понимаешь CSS и переставляешь свойства наугад. надо разобраться во всех возможных способов расположения элементов (display, float, position) и представлять как каждый из них себя ведет. То есть тебе надо как раз больше заниматься CSS.
>>641667
> [а-яё]+[.,;?!]*)([a-z]+)
Не очень понимаю, зачем здесь знаки препинания? Надо же искать последовательность вроде русская буква - латинская внутри одного слова.
Более того, логика работы функций checkText и showHighlightedText разная, то есть ищутся и подсвечиваются ошибки разными алгоритмами и возможно что одна функция увидит ошибки, а другая - нет. Это неправильно, в данном случае лучше всего сделать одну функцию, которая возвращает и факт наличия ошибок, и фразу с подсветкой ошибок. И echo вынести из нее.
В функции checkText лучше возвращать не фразу, а true/false, тогда можно исплоьзовать ее так:
if (checkText()) ... else ...
В твоем же случае результат можно только вывести, а ничего другого сделать нельзя.
Также, в функциях showHighlightedText и correctText есть явная копипаста. Надо бы избавиться от нее, например объединив функции.
Считается что нгинкс за счет своей архитектуры лучше и быстрее раздает статические файлы. Также, нгинкс помогает снизить нагрузку на сервер за счет того, что проксирует ответ от находящегося за ним Апача: он быстро получает ответ от Апача, сохраняет его в память и не спеша отдает клиентам, а процесс Апача освобождается и может обрабатывать новые запросы. Без нгинкса процесс Апача был бы занят до тех пор пока не отдаст весь ответ клиенту.
Также, на нгинксе удобно делать всякие ограничения трафика вроде числа одновременных соединений или скорости отдачи данных.
Ну и нгинкс вроде как оптимизирован на макс. производительность, а вот Апач в силу своей архитектуры с большим числом соединений не способее так эффективно работать. зато у него много всяких полезных модулей.
Есть 2 популярных варианта использования нгинкса:
- как реверс-прокси: ставится нгинкс, за ним Апач + PHP. Нгинкс раздает статику и проксирует запросы от Апача.
- как основной веб-сервер, за ним ставится PHP без Апача (php-fpm). Недостаток в том что многие CMS требуют поддержки htaccess и каких-то апачевских модулей.
В случае когда у нас много серверов, часто в интернет выставляется один нгинкс-сервер (балансер) который распределяет приходящие запросы по нескольким бекендам с апачами или php-fpm.
Почитай статьи тут для начала: http://ruhighload.com/server
Вообще в других языках программирования использется другая архитетура. У нас запускается PHP либо в составе Апача, либо в составе php-fpm, принимает запрос, запускает скрипт, очищает память за ним и ждет следующего запроса. В других языках обычно запускается само приложение открывает порт и само принимает, разбирает и обрабатывает HTTP-запросы. То есть в отличие от PHP там веб-сервер встроен в приложение. Тут ест преимущества и недостатки:
+ приложение запускается и инциализируется 1 раз, в отличие от пхп скрипта который при каждом запросе инициализируется с нуля
- в php трудно допустить утечку памяти так как скрипт работает недолго. Тут приложение работает долго и утечки памяти представляюит проблему. Быдлокодеры на ноде или руби, не в силах с ними совладать, часто просто ставят в планировщик перезапуск приложения каждые неколько часов
- для приложения нужно искать или писать менеджер процессор, который будет запускать нужное число копий приложения (чтобы задействовать все ядра), отслеживать их, перезапускать
- надо писать или подключать библиотеку веб-сервера
С помощью библиотек вроде ReactPHP программу на PHP можно тоже запускать в таком режиме.
> если я поставлю оба, они не будут конфликтовать? Наверное нужно как-то прописать им разные порты, или что-то в этом роде.
Да, разные порты.
>>641843
> У меня есть еще такие зависимости как $pdo, $studentgtw и $student (не уверен что это зависимость). Для них тоже нужно делать контейнеры, но тут мне не очень понятно с этим
Student это не зависимость. Зависимости - это классы-сервисы которые есть только в одном экземпляре. PDO и гейтвей это зависимость, да.
> Мне кажется что вот так писать pdo будет не правильно:
Почему?
>>641935
В общем, ты правильно все понимаешь.
> Из нее вроде бы следует, что nginx больше подходит для случаев с высокой нагрузкой, когда нужно обрабатывать сотни и тысячи параллельных запросов. Плюс с раздачей статики справляется лучше благодаря асинхронности.
Да. На раздаче статики разница с апачем по моему очень большая, особенно под нагрузкой.
> 5. Совместное использование. Тут я плохо понял, что значит "размещение Nginx перед Apache в качестве реверс-прокси". Типа nginx будет отдавать статику, но как только увидит запрос к динамическому контенту, отдаст управление апачу?
Да. Это исплоьзуют в тех случах когда приложению нужен Апач, но хочется и получить выгоды от исплоьзования нгинкса для статики и для буферизации ответов от Апача (нгинкс может забрать ответ быстрее чем находящийся далеко пользователь).
>>641941
> Ни разу не видел чтобы такие велосипеды строили. Для динамического контента на php лучше к nginx ставить php-fpm.
Сплошь и рядом такое.
Считается что нгинкс за счет своей архитектуры лучше и быстрее раздает статические файлы. Также, нгинкс помогает снизить нагрузку на сервер за счет того, что проксирует ответ от находящегося за ним Апача: он быстро получает ответ от Апача, сохраняет его в память и не спеша отдает клиентам, а процесс Апача освобождается и может обрабатывать новые запросы. Без нгинкса процесс Апача был бы занят до тех пор пока не отдаст весь ответ клиенту.
Также, на нгинксе удобно делать всякие ограничения трафика вроде числа одновременных соединений или скорости отдачи данных.
Ну и нгинкс вроде как оптимизирован на макс. производительность, а вот Апач в силу своей архитектуры с большим числом соединений не способее так эффективно работать. зато у него много всяких полезных модулей.
Есть 2 популярных варианта использования нгинкса:
- как реверс-прокси: ставится нгинкс, за ним Апач + PHP. Нгинкс раздает статику и проксирует запросы от Апача.
- как основной веб-сервер, за ним ставится PHP без Апача (php-fpm). Недостаток в том что многие CMS требуют поддержки htaccess и каких-то апачевских модулей.
В случае когда у нас много серверов, часто в интернет выставляется один нгинкс-сервер (балансер) который распределяет приходящие запросы по нескольким бекендам с апачами или php-fpm.
Почитай статьи тут для начала: http://ruhighload.com/server
Вообще в других языках программирования использется другая архитетура. У нас запускается PHP либо в составе Апача, либо в составе php-fpm, принимает запрос, запускает скрипт, очищает память за ним и ждет следующего запроса. В других языках обычно запускается само приложение открывает порт и само принимает, разбирает и обрабатывает HTTP-запросы. То есть в отличие от PHP там веб-сервер встроен в приложение. Тут ест преимущества и недостатки:
+ приложение запускается и инциализируется 1 раз, в отличие от пхп скрипта который при каждом запросе инициализируется с нуля
- в php трудно допустить утечку памяти так как скрипт работает недолго. Тут приложение работает долго и утечки памяти представляюит проблему. Быдлокодеры на ноде или руби, не в силах с ними совладать, часто просто ставят в планировщик перезапуск приложения каждые неколько часов
- для приложения нужно искать или писать менеджер процессор, который будет запускать нужное число копий приложения (чтобы задействовать все ядра), отслеживать их, перезапускать
- надо писать или подключать библиотеку веб-сервера
С помощью библиотек вроде ReactPHP программу на PHP можно тоже запускать в таком режиме.
> если я поставлю оба, они не будут конфликтовать? Наверное нужно как-то прописать им разные порты, или что-то в этом роде.
Да, разные порты.
>>641843
> У меня есть еще такие зависимости как $pdo, $studentgtw и $student (не уверен что это зависимость). Для них тоже нужно делать контейнеры, но тут мне не очень понятно с этим
Student это не зависимость. Зависимости - это классы-сервисы которые есть только в одном экземпляре. PDO и гейтвей это зависимость, да.
> Мне кажется что вот так писать pdo будет не правильно:
Почему?
>>641935
В общем, ты правильно все понимаешь.
> Из нее вроде бы следует, что nginx больше подходит для случаев с высокой нагрузкой, когда нужно обрабатывать сотни и тысячи параллельных запросов. Плюс с раздачей статики справляется лучше благодаря асинхронности.
Да. На раздаче статики разница с апачем по моему очень большая, особенно под нагрузкой.
> 5. Совместное использование. Тут я плохо понял, что значит "размещение Nginx перед Apache в качестве реверс-прокси". Типа nginx будет отдавать статику, но как только увидит запрос к динамическому контенту, отдаст управление апачу?
Да. Это исплоьзуют в тех случах когда приложению нужен Апач, но хочется и получить выгоды от исплоьзования нгинкса для статики и для буферизации ответов от Апача (нгинкс может забрать ответ быстрее чем находящийся далеко пользователь).
>>641941
> Ни разу не видел чтобы такие велосипеды строили. Для динамического контента на php лучше к nginx ставить php-fpm.
Сплошь и рядом такое.
> "\\b"+klass+"\\b"
\\b сработает если в имени класса есть минус - он считается за не-букву. Пример: https://jsfiddle.net/mqdkab0q/1/
> "i"
А имена классов разве регистронезависимы? http://stackoverflow.com/questions/12533926/are-class-names-in-css-selectors-case-sensitive
> node.className = node.className.replace(regExp, "");
Хорошо бы еще пробелы с краев строки убирать оставшиеся.
Ну и если тебя интересуют оптимизированные версии этих функций, смотри исходники jQuery: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js
>>642083
По клику на черный квадрат он не становится белым. Кнопка "отметить все" не инветирует цвета, а заливает все черным.
В остальном логика верная.
>>642108
Не знаю
>>642118
Да, сплошная копипаста. Надо выделять повторяющиеся куски в функции.
>>642176
Есть PSR, мнение Васянов не очень интересно.
>>642311
Можно и через while, просто в учебнике его пока не изучили.
> "\\b"+klass+"\\b"
\\b сработает если в имени класса есть минус - он считается за не-букву. Пример: https://jsfiddle.net/mqdkab0q/1/
> "i"
А имена классов разве регистронезависимы? http://stackoverflow.com/questions/12533926/are-class-names-in-css-selectors-case-sensitive
> node.className = node.className.replace(regExp, "");
Хорошо бы еще пробелы с краев строки убирать оставшиеся.
Ну и если тебя интересуют оптимизированные версии этих функций, смотри исходники jQuery: https://github.com/jquery/jquery/blob/master/src/attributes/classes.js
>>642083
По клику на черный квадрат он не становится белым. Кнопка "отметить все" не инветирует цвета, а заливает все черным.
В остальном логика верная.
>>642108
Не знаю
>>642118
Да, сплошная копипаста. Надо выделять повторяющиеся куски в функции.
>>642176
Есть PSR, мнение Васянов не очень интересно.
>>642311
Можно и через while, просто в учебнике его пока не изучили.
> opacity: 0.7;
Лучше сделать прозрачным только фон, а не все включая текст.
> figcaption{
> width: 330px;
Так не годится так как твоя верстка должна работать с картинками любых размеров. Представь например сайт где картинки загружает редактор. Более того, ты написал размер картинки дважды - еще и в figure - это очень плохо так как при правке придется тоже менять размер в 2 местах. Все, что можно определить автоматически, должно определяться автоматически.
Цвет линии подчеркивания неправильный - там бледно-оранжевый.
> position: absolute;
> right: 530px;
Опять же, ты вручную вписал сюда ширину страницы, это не годится, надо чтобы работало с любой шириной текста.
> font-family: 'Times New Roman';
Последним в списке должен идти стандартный шрифт
>>642511
Да. Это просто твой мозг пытается найти зависимости в случайнх числах.
>>642517
Задача про айфон - все верно.
Задача про миллион:
> while($deposit <= 1000000) {
Если на счету миллион - надо ждать дальше? По моему, не надо.
Также, тут можно было бы сделать цикл for, переместив $numYears++ в шапку цикла.
> Некто не доживет до дня когда станет миллионером. Его возраст составил бы 95 лет.
Что-то ответ не сходится, там вроде 64 или 65 лет получается. Это скорее всего баг на ideone, если перезапустить код то получается правильный ответ.
>>642574
Нормально, сойдет.
>>642783
array_sum суммирует числа в массиве. Посчитать число символов в строке можно mb_strlen, число байт через strlen (это не то же самое что и число символов!)
> как тут найти вес предложения?
Что такое вес?
>>642784
ортогонально
>>642802
Каждый месяц от суммы текущего долга.
>>642843
У тебя при нажатии кнопки не отжимается предыдущая в Хроме.
> input[type="radio"]{
Это применится ко всем радиокнопкам на странице. Сделай чтобы применялось только к тем что внутри твоего виджета. Это же касается остальеных стилей.
> border-collapse: collapse;
Это еще что? Оно же только к таблицам применимо.
> font-family: Arial;
В конце списка нужен стандартнй шрифт
> .buttons i:hover{
> cursor: pointer;
cursor логично ставить независимо от hover
Еще, у тебя не задан display для label - хорошо ли это?
> input:checked + i:hover{
Тут то же самое что и в input:checked + i
Также, прочитай комментарии к заданию и попробуй сделать клавиатурную навигацию.
> opacity: 0.7;
Лучше сделать прозрачным только фон, а не все включая текст.
> figcaption{
> width: 330px;
Так не годится так как твоя верстка должна работать с картинками любых размеров. Представь например сайт где картинки загружает редактор. Более того, ты написал размер картинки дважды - еще и в figure - это очень плохо так как при правке придется тоже менять размер в 2 местах. Все, что можно определить автоматически, должно определяться автоматически.
Цвет линии подчеркивания неправильный - там бледно-оранжевый.
> position: absolute;
> right: 530px;
Опять же, ты вручную вписал сюда ширину страницы, это не годится, надо чтобы работало с любой шириной текста.
> font-family: 'Times New Roman';
Последним в списке должен идти стандартный шрифт
>>642511
Да. Это просто твой мозг пытается найти зависимости в случайнх числах.
>>642517
Задача про айфон - все верно.
Задача про миллион:
> while($deposit <= 1000000) {
Если на счету миллион - надо ждать дальше? По моему, не надо.
Также, тут можно было бы сделать цикл for, переместив $numYears++ в шапку цикла.
> Некто не доживет до дня когда станет миллионером. Его возраст составил бы 95 лет.
Что-то ответ не сходится, там вроде 64 или 65 лет получается. Это скорее всего баг на ideone, если перезапустить код то получается правильный ответ.
>>642574
Нормально, сойдет.
>>642783
array_sum суммирует числа в массиве. Посчитать число символов в строке можно mb_strlen, число байт через strlen (это не то же самое что и число символов!)
> как тут найти вес предложения?
Что такое вес?
>>642784
ортогонально
>>642802
Каждый месяц от суммы текущего долга.
>>642843
У тебя при нажатии кнопки не отжимается предыдущая в Хроме.
> input[type="radio"]{
Это применится ко всем радиокнопкам на странице. Сделай чтобы применялось только к тем что внутри твоего виджета. Это же касается остальеных стилей.
> border-collapse: collapse;
Это еще что? Оно же только к таблицам применимо.
> font-family: Arial;
В конце списка нужен стандартнй шрифт
> .buttons i:hover{
> cursor: pointer;
cursor логично ставить независимо от hover
Еще, у тебя не задан display для label - хорошо ли это?
> input:checked + i:hover{
Тут то же самое что и в input:checked + i
Также, прочитай комментарии к заданию и попробуй сделать клавиатурную навигацию.
> self = this;
Где var?
Если ты исплоьзуешь new, то лучше испльзовать прототипы, так как у тебя получилась огромная функция-конструктор. Либо не использовать new, а вызывать ее как обычную функцию.
Также, у тебя код инциализации идет вперемешку с объявлением функций, это неудобно читать.
> tbody.innerHTML+="<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td> </td><td></td></tr>";
Это неэффективно. += сначала обходит дерево, генерирует HTMl, а затем из строки строит новое дерево DOM и заменяет старое. Надо готовить HTMl код в отдельной переменной, либо использовать методы DOM. Также, строку из кучи td лучше заменить на цикл.
> leftClick
Названия функций начинаются с глагола
> table.onclick = function(event){
Лучше привыкать использовать addEventListener, так как с onclick нельзя поставить второй обработчик.
> table.oncontextmenu = function(event){
Не то событие. Это вызов контекстного меню, а тебе нужно mouseup/mousedown.
Также, поставленный флажок нельзя снять.
Генерацию бомб проще наверно сделать сразу после создания таблицы. А то где гарантия что ты во все функции поставишь проверку что они сгенерированы? Легко забыть. С другой стороны твой подход дает гарантию что первый ход будет не на бомбу, так что можно его оставить. Просто стоит сделать функцию сгенерироватьПолеЕслиНеСгенерировано(...).
> var firstClicked = ""+x+y;
Тут явно ошибка, что если числа двухзначные? Или одно двухзначное, а другое нет?
Размеры поля должны быть в переменной, ты их скопипастил по всему коду и их неудобно будет менять.
> if(bombs[concatenated] || concatenated==firstClicked ){
> i--;
Это выглядит как хак, попробуй сделать более понятный и простой способ. Например, второй цикл.
> ""+x+y
Это скопипащено много раз. Должна быть функция. Ну и в товем случае, проще просто сделать двухмерный массив.
> target.className = "flagged";
Плохо, можно затереть другие классы.
Ты хранишь список бомб в массиве, а список открытых клеток берешь в DOM. Не логичнее ли его тоже в массиве хранить? Также, вещи вроде "есть ли бомба в клетке x, y" надо выносить в функции а не копипастить по всему коду.
> var maxX = table.rows[0].cells.length;
Должна быть переменная с размером поля
> function getNeighbours(x,y){
Здесь вместо ифов надо использовать циклы.
> var pop = modal.querySelector('.popup-body');
> pop.firstChild.data = text;
Подставлять данные удобнее через html.replace('{{x}}', x). У тебя если поменять шаблон, этот код перестанет работать.
> pop.firstElementChild.onclick
Это легко сломать. Нужно указать конкретный класс для кнопки.
> self = new MineField(options);
Это напоминает хак, надо бы упростить тут логику. Ну например можно просто обнулить нужные перемнные и заново запустить инициализацию.
> var openedCells = table.querySelectorAll(".opened").length;
Лучше бы считать число открытых клеток в массиве.
>>643123
Тебе ответил где-то выше.
>>643227
решено верно
>>643278
Можно перекрасить, сделав саму футболку прозрачной и положив под ней фон нужного цвета.
> self = this;
Где var?
Если ты исплоьзуешь new, то лучше испльзовать прототипы, так как у тебя получилась огромная функция-конструктор. Либо не использовать new, а вызывать ее как обычную функцию.
Также, у тебя код инциализации идет вперемешку с объявлением функций, это неудобно читать.
> tbody.innerHTML+="<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td> </td><td></td></tr>";
Это неэффективно. += сначала обходит дерево, генерирует HTMl, а затем из строки строит новое дерево DOM и заменяет старое. Надо готовить HTMl код в отдельной переменной, либо использовать методы DOM. Также, строку из кучи td лучше заменить на цикл.
> leftClick
Названия функций начинаются с глагола
> table.onclick = function(event){
Лучше привыкать использовать addEventListener, так как с onclick нельзя поставить второй обработчик.
> table.oncontextmenu = function(event){
Не то событие. Это вызов контекстного меню, а тебе нужно mouseup/mousedown.
Также, поставленный флажок нельзя снять.
Генерацию бомб проще наверно сделать сразу после создания таблицы. А то где гарантия что ты во все функции поставишь проверку что они сгенерированы? Легко забыть. С другой стороны твой подход дает гарантию что первый ход будет не на бомбу, так что можно его оставить. Просто стоит сделать функцию сгенерироватьПолеЕслиНеСгенерировано(...).
> var firstClicked = ""+x+y;
Тут явно ошибка, что если числа двухзначные? Или одно двухзначное, а другое нет?
Размеры поля должны быть в переменной, ты их скопипастил по всему коду и их неудобно будет менять.
> if(bombs[concatenated] || concatenated==firstClicked ){
> i--;
Это выглядит как хак, попробуй сделать более понятный и простой способ. Например, второй цикл.
> ""+x+y
Это скопипащено много раз. Должна быть функция. Ну и в товем случае, проще просто сделать двухмерный массив.
> target.className = "flagged";
Плохо, можно затереть другие классы.
Ты хранишь список бомб в массиве, а список открытых клеток берешь в DOM. Не логичнее ли его тоже в массиве хранить? Также, вещи вроде "есть ли бомба в клетке x, y" надо выносить в функции а не копипастить по всему коду.
> var maxX = table.rows[0].cells.length;
Должна быть переменная с размером поля
> function getNeighbours(x,y){
Здесь вместо ифов надо использовать циклы.
> var pop = modal.querySelector('.popup-body');
> pop.firstChild.data = text;
Подставлять данные удобнее через html.replace('{{x}}', x). У тебя если поменять шаблон, этот код перестанет работать.
> pop.firstElementChild.onclick
Это легко сломать. Нужно указать конкретный класс для кнопки.
> self = new MineField(options);
Это напоминает хак, надо бы упростить тут логику. Ну например можно просто обнулить нужные перемнные и заново запустить инициализацию.
> var openedCells = table.querySelectorAll(".opened").length;
Лучше бы считать число открытых клеток в массиве.
>>643123
Тебе ответил где-то выше.
>>643227
решено верно
>>643278
Можно перекрасить, сделав саму футболку прозрачной и положив под ней фон нужного цвета.
Думаю, нужно создать и шаблон и скрипт-обработчик. Почитай доки, посмотри как в самом вордпрессе это реализовано.
>>643354
Ну попробуй настрой еще что-нибудь. Нгинкс например настрой и сравни его производительсность с апачом утилитой apache benchmark. SSL тоже хорошая задача.
>>643390
Лучше в /b вбросить, народу больше там.
>>644027
Берется значение из массива по индексу.
>>644366
> числа прописью
> 'рублей' => array(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900)
Для определения формы слова достаточно проверить последнюю и предпосление цифры, хватит 3 ифов.
> foreach ($spelling as $numbers => $numbersInWords) {
> if ($num == $numbers) {
Значение в массиве по ключу можно найти через $a[$b]
> foreach ($numerals as $array => $numeral) {
> if ($num == $numeral) {
Проверить наличие значения в массиве можно через in_array, найти ключ через array_search, тебе стоит перечитать урок про работу с массивами.
> function smallNumberToText($num, $number, $spelling, $roubles, $femaleSpelling) {
Смотрю на эту строку - непонятно чем num отличается от number.
> $count = mb_strlen($text);
> if ($count == 3) {
Не, с числами не надо работать как со строкой, лучше делать проверки вроде $x < 1000
В функции smallNumberToText повторяющиеся блоки надо вынести в функцию. Пока там много копипасты. То же касается numberToText.
Вообще, этот код можно сделать короме, примерно так:
- сдеать функцию выбора формы слова в зависимости от числа: рубль/рублей
- сделать функцию, берущую число от 0 до 999 и возвращающее его прописью
- сделать функцию, разбивающую число на миллионы, тысячи, рубли, и с помощью описанных выше функций получающую этот же число прописью
записать прописью маленькое число можно так:
- если есть сотни, берем слово для сотен
- если оканчивается на 11-19, добавляем соответствующее слово
- иначе добавляем слово для десятков и единиц, если они есть
Это 3-4 ифа.
> $femaleSpelling и $menSpelling - в основной функции, переводящей тройки чисел в текст, постоянно числа 1 и 2 переводятся по массиву $femaleSpelling в "одна" и "две", а дальше в конкретную функцию для перевода конкретного числа в слова я просто подставляю в нужных местах $menSpelling - функция переводит "один" и "два" опять же в нужные "один" и "два".
Не вижу тут проблемы
> 2. Формы слов "рубль", "тысяча" и "миллион" подбираются именно с помощью массивов и цикла foreach, а не с помощью условий, как советовал ОП.
Короче и универсальнее ифами.
> Либо и функций для этого тоже делать несколько.
Одну универсальную.
Пока проблема в большом объеме копипасты, а копипаста это зло. Твой код тяжело читать и поддерживать, упрощай его.
>>644531
> [а-я]
ё надо указывать отдельно, она в юникоде идет отдельно от алфавита
> [а-я]+\\sа\\s
Что если после "а" не пробел, а запятая? И где проверка на союз "но"?
> for ($i = 1; $i < 5; $i++) {
Как-то нехорошо что цифра 5 не вычисляется автоматически.
Чтобы выделить отдельные ошибки, лушче сделать не одну, а массив регулярок и применять их в цикле. А то у тебя очень сложно и запутанно вышло.
> $m[$i] = array_diff($m[$i], array(null));
Это не нужно, ты просто неправильно понял структуру массива. Ну и удалять пустые элементы удобнее через $x = array_filter($x);
Думаю, нужно создать и шаблон и скрипт-обработчик. Почитай доки, посмотри как в самом вордпрессе это реализовано.
>>643354
Ну попробуй настрой еще что-нибудь. Нгинкс например настрой и сравни его производительсность с апачом утилитой apache benchmark. SSL тоже хорошая задача.
>>643390
Лучше в /b вбросить, народу больше там.
>>644027
Берется значение из массива по индексу.
>>644366
> числа прописью
> 'рублей' => array(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900)
Для определения формы слова достаточно проверить последнюю и предпосление цифры, хватит 3 ифов.
> foreach ($spelling as $numbers => $numbersInWords) {
> if ($num == $numbers) {
Значение в массиве по ключу можно найти через $a[$b]
> foreach ($numerals as $array => $numeral) {
> if ($num == $numeral) {
Проверить наличие значения в массиве можно через in_array, найти ключ через array_search, тебе стоит перечитать урок про работу с массивами.
> function smallNumberToText($num, $number, $spelling, $roubles, $femaleSpelling) {
Смотрю на эту строку - непонятно чем num отличается от number.
> $count = mb_strlen($text);
> if ($count == 3) {
Не, с числами не надо работать как со строкой, лучше делать проверки вроде $x < 1000
В функции smallNumberToText повторяющиеся блоки надо вынести в функцию. Пока там много копипасты. То же касается numberToText.
Вообще, этот код можно сделать короме, примерно так:
- сдеать функцию выбора формы слова в зависимости от числа: рубль/рублей
- сделать функцию, берущую число от 0 до 999 и возвращающее его прописью
- сделать функцию, разбивающую число на миллионы, тысячи, рубли, и с помощью описанных выше функций получающую этот же число прописью
записать прописью маленькое число можно так:
- если есть сотни, берем слово для сотен
- если оканчивается на 11-19, добавляем соответствующее слово
- иначе добавляем слово для десятков и единиц, если они есть
Это 3-4 ифа.
> $femaleSpelling и $menSpelling - в основной функции, переводящей тройки чисел в текст, постоянно числа 1 и 2 переводятся по массиву $femaleSpelling в "одна" и "две", а дальше в конкретную функцию для перевода конкретного числа в слова я просто подставляю в нужных местах $menSpelling - функция переводит "один" и "два" опять же в нужные "один" и "два".
Не вижу тут проблемы
> 2. Формы слов "рубль", "тысяча" и "миллион" подбираются именно с помощью массивов и цикла foreach, а не с помощью условий, как советовал ОП.
Короче и универсальнее ифами.
> Либо и функций для этого тоже делать несколько.
Одну универсальную.
Пока проблема в большом объеме копипасты, а копипаста это зло. Твой код тяжело читать и поддерживать, упрощай его.
>>644531
> [а-я]
ё надо указывать отдельно, она в юникоде идет отдельно от алфавита
> [а-я]+\\sа\\s
Что если после "а" не пробел, а запятая? И где проверка на союз "но"?
> for ($i = 1; $i < 5; $i++) {
Как-то нехорошо что цифра 5 не вычисляется автоматически.
Чтобы выделить отдельные ошибки, лушче сделать не одну, а массив регулярок и применять их в цикле. А то у тебя очень сложно и запутанно вышло.
> $m[$i] = array_diff($m[$i], array(null));
Это не нужно, ты просто неправильно понял структуру массива. Ну и удалять пустые элементы удобнее через $x = array_filter($x);
> $this->setSalary($this->salary);
Ты используешь одно поле (salary) для хранения 2 разных вещей: базовой ставки и итоговой зарплаты. Это разные сущности. В твоем коде если поменять ранг работника (setRank), или назначить его боссом (setIsHead), зарплата не поменяется. это неправильно, и проще всего решить это проблему тем что не хранить зарплату вообще, а вычислять методом. Методы объекта всегда должны возвращать точные и актуальные данные, у тебя это не так.
> default:
> $this->salary = "Ошибка";
Это непраильно. Если так делать, то ошибку никто не заметит. Надо выбрасывать исключение, урок https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> for ($i = 0; $i < $spacesCount; $i++) {
> $string .= " ";
Есть str_repeat
> outputString($str1, $str2, $str3, $str4, $str5, $str6) {
В таких случаях надо использовать массив
В департаменте стоит сделать метод добавления сотрудника - так гораздо удобнее.
Также, держи дополнительное задание для проверки гибкости твоего кода:
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
>>645128
Надо смотреть что отправляется и что приходит в ответ.
>>645620
Не жди ОПа, решай дальше
> $this->setSalary($this->salary);
Ты используешь одно поле (salary) для хранения 2 разных вещей: базовой ставки и итоговой зарплаты. Это разные сущности. В твоем коде если поменять ранг работника (setRank), или назначить его боссом (setIsHead), зарплата не поменяется. это неправильно, и проще всего решить это проблему тем что не хранить зарплату вообще, а вычислять методом. Методы объекта всегда должны возвращать точные и актуальные данные, у тебя это не так.
> default:
> $this->salary = "Ошибка";
Это непраильно. Если так делать, то ошибку никто не заметит. Надо выбрасывать исключение, урок https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
> for ($i = 0; $i < $spacesCount; $i++) {
> $string .= " ";
Есть str_repeat
> outputString($str1, $str2, $str3, $str4, $str5, $str6) {
В таких случаях надо использовать массив
В департаменте стоит сделать метод добавления сотрудника - так гораздо удобнее.
Также, держи дополнительное задание для проверки гибкости твоего кода:
### Антикризисные меры
Задание: напиши программу для учета расходов и результатов работы всего дружного коллектива компании «Вектор».
Пока ты решал задачу по выводу отчета о сотрудниках и департаментах, разразился мировой экономический кризис. Доходы компании начали снижаться, и совет директоров поставил перед руководством задачу принять меры. Менеджеры 3-го ранга, блестящие выпускники топовых экономических вузов столицы, быстро смогли разработать три альтернативных антикризисных решения:
1. Сократить в каждом департаменте 40% (округляя в большую сторону) инженеров, преимущественно самого низкого ранга. Если инженер является боссом, вместо него надо уволить другого инженера, не босса.
2. Увеличить в целях стимуляции умственной деятельности базовую ставку аналитика с 800 до 1100 тугриков, а количество выпиваемого им кофе с 50 до 75 литров. В тех департаментах, где руководитель не является аналитиком, заменить его на аналитика самого высшего ранга из этого департамента (а бывшего руководителя вернуть к обычной работе)
3. В каждом департаменте повысить 50% (округляя в большую сторону) менеджеров 1-го и 2-го ранга на один ранг с целью расширить их полномочия.
Совет директоров в затруднении: какой путь выбрать? Помоги им с этим, распечатав прогноз по потреблению и расходам (аналогичный тому что требуется в задаче) после принятия каждой из мер.
>>645128
Надо смотреть что отправляется и что приходит в ответ.
>>645620
Не жди ОПа, решай дальше
Что-то не открыается, напомните мне перепроверить позже.
>>646125
В линуксе по другому права выставляются.
>>646169
Лучше бы иметь защиту от зацикливания
>>646245
Чтобы искало разные ошибки рядом, лучше сделать не одну регулярку, а на каждую ошибку свою.
> калькулятор
> elseif ($op == "") {
> $result = $result $number;
> } elseif ($op == "+") {
> $result = $result + $number;
Это скопипащено 2 раза, попробуй избавиться, либо вынеся в функцию либо переставив код местами.
В остальном неплохо. Но с копипастой надо бороться.
>>646508
Если ты хочешь добавлять ее на чужие сайты, то надо делать через JS, чтобы человек просто добавил 1 строчку на сайт, она загружала твой скрипт и выводила форму. Если у тебя есть доступ к исходникам сайта, можно сделать и отдельным модулем/классами которые как-то в сайт встраиваются, но тут ведь для каждой CMS и фрйемворка будет свой вариант нужен.
> Как например в Апи яндекс.деньгах и других подобных сервисах.
А ты почитай их документацию по подключению и посмотри как у них сделано.
Что-то не открыается, напомните мне перепроверить позже.
>>646125
В линуксе по другому права выставляются.
>>646169
Лучше бы иметь защиту от зацикливания
>>646245
Чтобы искало разные ошибки рядом, лучше сделать не одну регулярку, а на каждую ошибку свою.
> калькулятор
> elseif ($op == "") {
> $result = $result $number;
> } elseif ($op == "+") {
> $result = $result + $number;
Это скопипащено 2 раза, попробуй избавиться, либо вынеся в функцию либо переставив код местами.
В остальном неплохо. Но с копипастой надо бороться.
>>646508
Если ты хочешь добавлять ее на чужие сайты, то надо делать через JS, чтобы человек просто добавил 1 строчку на сайт, она загружала твой скрипт и выводила форму. Если у тебя есть доступ к исходникам сайта, можно сделать и отдельным модулем/классами которые как-то в сайт встраиваются, но тут ведь для каждой CMS и фрйемворка будет свой вариант нужен.
> Как например в Апи яндекс.деньгах и других подобных сервисах.
А ты почитай их документацию по подключению и посмотри как у них сделано.
Там есть разные уровни же. Я сейчас на pre-intermediate, чтобы всё освежить в памяти.
Кроме как потыкать в мобильный в свободное время - нет возможности что-то ещё делать. Я на изучение РНР целых два часа трачу в сутки.
У Лингвалео есть неплохое расширение для браузеров, вот им тоже пользуюсь, добавляю незнакомые слова для повторения.
Хочу с английскими субтитрами начать смотреть фильмы, что ли, хотя бы - чтобы как-то отдыхать и обучаться, иначе я тронусь.
COUNT(колонка) считает число строк в одной группе, где колонка не равна NULL. Потому там получается либо 0 либо одинаковые числа.
Попробуй убрать во втором запросе COUNT и группировку, добавь вывод from/to из таблицы лайков и посмотри что выбирается. Там будут для каждого пользователя все возможные сочетания лайков. Ну то есть если A поставил лайк B и C, а получил от D, E, F то там будет 6 строк:
B D
B E
B F
C D
C E
C F
Джойн дает нам все взможные комбинации колонок, это называется декартово произведение. Брать просто COUNT тут бессмысленно, надо считать не число строк а число уникальных значений.
Вот выше была подсказка: >>644037
> Лайк это объект? Естественно, значит делаем под него тоже таблицу.
Правильнее сказать что лайк это связь многие-ко-многим между пользователями.
О, загрузилось! У тебя вот тут нехорошо сделано:
> GROUP BY users.name
Что если имена не уникальны? Надо группировать по первичному ключу тут.
> name TEXT
Лучше варчар с ограничением длины.
> CREATE TABLE likes (
Здесь нужно первичный ключ (добавлять новые колонки не надо)
Также, нужно сделать внешние ключи, читай пост http://denis.in.ua/foreign-keys-in-mysql.htm
Все посты до 7 февраля я проверил и тут всем ответил. Остальные я проверю позже и напишу тут ответы.
Переходите в новый тред. не пишите здесь больше. Но заходите посмотреть ответы, если вы запостили код после 7 февраля.
А ты скинь код в тред - мы проверим.
Ну или можешь как-нибудь в екселе посчитать. У меня все равно под рукой ответов нет.
анки, бро.
Можешь посоветовать каких-нибудь тем веб-проектов в качестве дипломной работы бакалавра?
Если бы сейчас сам начинал учить, пошел бы в PHP или в питон/ноду, скажем? Думаю, туда ли направил стопы.
И еще, скажи пожалуйста: аддоны для браузеров пишутся на яваскрипте безальтернативно, да? И вообще, меня ужасно бесит внешне этот язык, я совсем его хуево понимаю со всеми этими бесконечными цепочками анонимных функций и прочим. Есть какой-то может простой способ вкатиться и на каком его уровне необходимо знать - хеллоуворлда, надо понимать, недостаточно?
Слишком много кода для такой задачи. Также, там есть повторы, вот это выражение $creditBalance = ( $creditBalance * $percent ) + $servicePayment повторяется 2 раза и надо бы обойтись без этого.
Название функции должно начинаться с глагола, например calculateCredit()
>>646653
Нет, тут можно сделать без повторов. Условие выхода из цикла - это то, что долг дошел до нуля. Ну и сам подумай, проценты начисляются раз в месяц, значит это можно сделать только в одном месте.
>>646773
Урок про работу с utf-8 строками: https://gist.github.com/codedokode/ff99e357e9860ea169b8
>>646814
Теперь все решено верно.
>>646931
Задача пока что решена неправильно. У тебя в банкомате бесконечно число купюр любых видов, а по условиям задачи их число ограничено.
>>647128
Можно через array_rand(), можно для первых 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' // нет +
);
Также, есть такой сайт: https://regex101.com/r/qF7vT8/3 - там уже вбиты номера и на нем можно простестировать свою регулярку и проверить что она соответствует правильным и не соответствует неправильным номерам. Помни что на этом сайте надо писать бекслеш один раз, например \s, а не \\s. Флаг m там стоит чтобы ^ и $ в регулярке обозначали «начало и конец любой строки», а не «начало и конец всего текста». Флаг g (его нет в PHP, он только на этом сайте) значит что надо искать все совпадения с регуляркой, а не только первое.
Ну как хочешь, а вообще конечно было бы полезно поломать голову немного. Ведь задача по идее сводится к подзадачам: перебрать все комбинации купюр, отобрать из них ту которая дает нужную сумму.
>>647460
> Текст у нас будет выводиться с низу, поэтому заполняем все имеющиеся в массиве фрагменты текста символами пробела, ориентируясь на самый длинный фрагмент
Проще этого не делать, а просто при взятии элемента массива проверять, существует ли он, если нет, выводить пробел вместо него.
>>647757
http://integer64.github.io/site-layout/exercise/mainTask/index.html
На ширине около 700px логотип прилипает к левому краю, добавь-ка паддинга или маргина немного. Ай-я-яй, почему сам не заметил?
https://www.browserstack.com/screenshots/259cbc8563d6d1287b197b96e2f92a8ecaffb5b1
В ИЕ10 синяя рамка вокруг логотипа - так ИЕ подсвечивает ссылки-картинки, отменить это можно через правило a img { ... }
Иконки в блоке Consectetur слишком близко к заголовку и сделано на мой взгляд неудачно. Правильнее было бы так: добавить блоку <div class="service-block"> паддинг сверху под иконку, pos: rel, добавить ему псевдоэлемент и абсолютно отпозиционировать его по центру (left 50% + отриц. маргин). Тогда у нас иконка будет показываться независимо от заголовка. Да и логичнее по моему что иконка принадлежит блоку, а не заголовку.
В адресе, я думаю, ты переборщил с неразрывными пробелами. Их можно ставить например между словами "No: 14/05", но не надо ставить их везде - например после слов Moonshine Street вполне можно разрывать строку. Убери лишнее.
В остальном хорошо.
>>647725
>>647787
Ты допустил серьезную ошибку. Ты забыл флаг u который говорит что строка в кодировке utf-8 и надо поддерживать буквы, закодированные несколькими, а не одним байтом. Далее паста
--------
### Флаг u
Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.
Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.
То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.
А теперь представь что ты пишешь a?. Это значит, может быть русская буква a, может не быть. А что видит движок регулярок?
D0 B0 ?
То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.
Представь, сколько надо времени чтобы понять почему не работает знак вопроса в на первый взгляд правильной регулярке.
Коды я взял тут: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024&number=512
Потому всегда ставь флаг u.
>>647725
>>647787
Ты допустил серьезную ошибку. Ты забыл флаг u который говорит что строка в кодировке utf-8 и надо поддерживать буквы, закодированные несколькими, а не одним байтом. Далее паста
--------
### Флаг u
Без флага u русские буквы будут работать некорректно, причем там все так хитро что ты можешь даже не сразу это заметить и замучаешься искать в чем причина. Всегда ставь этот флаг если ты используешь utf-8.
Если нужны подробности, то суть в том что в utf-8 русские буквы состоят из 2 идущих подряд байт, а движок регулярок по умолчанию думает что 1 байт = 1 символ и он воспринимает русскую букву как 2 независимых символа.
То есть ты пишешь аб (это кодируется байтами D0 B0 D0 B1), а движок регулярок видит 4 отдельных символа c кодами D0, B0, D0, B1. Так как в тексте «аб» кодируется так же, то это сработает. Но не сработает например если в тексте идет АБ так как оно кодируется как D0 90 D0 91.
А теперь представь что ты пишешь a?. Это значит, может быть русская буква a, может не быть. А что видит движок регулярок?
D0 B0 ?
То есть он видит «идет символ с кодом D0, за ним может быть или не может быть символ B0». В utf-8 не бывает просто байта с кодом D0, за ним всегда что-то идет, и это выражение сработает только если в тексте есть буква a с кодом D0 B0. Очевидно что тут будет ошибка и выражение «a?» будет интерпретироваться как «a», то есть знак вопроса не сработает.
Представь, сколько надо времени чтобы понять почему не работает знак вопроса в на первый взгляд правильной регулярке.
Коды я взял тут: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024&number=512
Потому всегда ставь флаг u.
Я написал выше, надо проверить на большом списке телефонов.
>>648440
Мой недописанный урок по HTTP, может что полезное найдешь https://github.com/codedokode/pasta/blob/master/network/http.md
Урок по ссылкам: https://github.com/codedokode/pasta/blob/master/network/urls.md
>>648554
>>648543
Найти макс. длину строки можно проще. Допустим у нас есть массив строк. Функцией array_map + mb_strlen ты можешь получить из него массив длин строк. После чего остается найти максимальное число в массиве стандартной функцией.
> array_push($countedLetters, $count);
короче писать $countedLetters[] = $count;
> for ($i = 0; $i <= count($letters); $i++) {
Для обхода массива удобнее исплоьзовать foreach. Также, если тебе надо обработать массив функцией count, то можно вместо цикла использовать array_map.
>>648581
Не бойся, разберешься.
>>648635
> Если бы сейчас сам начинал учить, пошел бы в PHP или в питон/ноду, скажем? Думаю, туда ли направил стопы.
Вполне возможно, Питон хороший язык, рекомендую, а вот ноду для больших приложений не посоветую - там же ни классов ни тайп хинтов ни ООП нормального. Разве что использовать расширения вроде TypeScript, добавляющие строгости.
> И вообще, меня ужасно бесит внешне этот язык, я совсем его хуево понимаю со всеми этими бесконечными цепочками анонимных функций и прочим.
Потому что ты его плохо знаешь. Пройди наш курс задач на JS/DOM.
> Есть какой-то может простой способ вкатиться и на каком его уровне необходимо знать - хеллоуворлда, надо понимать, недостаточно?
Ну вот наши задачки наверно нужный уровень и дают. Ну или пройди задачи с сайта learn.javascript.ru, они тоже хорошие.
>>648647
>>648648
Стоимость часа умножить на количество потраченных часов. Ну вообще, стоимость работы определяется как компромисс между хотелками заказчика и исполнителя. Если у него есть кто-то кто сделает дешевле - одно дело, если нет и ему очень нужна программа -другое дело.
Обговаривать стоимость и условия оплаты работы (по часам, по дням, за все) надо до ее выполнения.
Я написал выше, надо проверить на большом списке телефонов.
>>648440
Мой недописанный урок по HTTP, может что полезное найдешь https://github.com/codedokode/pasta/blob/master/network/http.md
Урок по ссылкам: https://github.com/codedokode/pasta/blob/master/network/urls.md
>>648554
>>648543
Найти макс. длину строки можно проще. Допустим у нас есть массив строк. Функцией array_map + mb_strlen ты можешь получить из него массив длин строк. После чего остается найти максимальное число в массиве стандартной функцией.
> array_push($countedLetters, $count);
короче писать $countedLetters[] = $count;
> for ($i = 0; $i <= count($letters); $i++) {
Для обхода массива удобнее исплоьзовать foreach. Также, если тебе надо обработать массив функцией count, то можно вместо цикла использовать array_map.
>>648581
Не бойся, разберешься.
>>648635
> Если бы сейчас сам начинал учить, пошел бы в PHP или в питон/ноду, скажем? Думаю, туда ли направил стопы.
Вполне возможно, Питон хороший язык, рекомендую, а вот ноду для больших приложений не посоветую - там же ни классов ни тайп хинтов ни ООП нормального. Разве что использовать расширения вроде TypeScript, добавляющие строгости.
> И вообще, меня ужасно бесит внешне этот язык, я совсем его хуево понимаю со всеми этими бесконечными цепочками анонимных функций и прочим.
Потому что ты его плохо знаешь. Пройди наш курс задач на JS/DOM.
> Есть какой-то может простой способ вкатиться и на каком его уровне необходимо знать - хеллоуворлда, надо понимать, недостаточно?
Ну вот наши задачки наверно нужный уровень и дают. Ну или пройди задачи с сайта learn.javascript.ru, они тоже хорошие.
>>648647
>>648648
Стоимость часа умножить на количество потраченных часов. Ну вообще, стоимость работы определяется как компромисс между хотелками заказчика и исполнителя. Если у него есть кто-то кто сделает дешевле - одно дело, если нет и ему очень нужна программа -другое дело.
Обговаривать стоимость и условия оплаты работы (по часам, по дням, за все) надо до ее выполнения.
> foreach($pieces as $key => $piece) {
> $symbols[$key] = ...
Тут $key не нужен, можно писать $symbols[] = ...
> Считаем количество символов во всех вложенных массивах
Используй array_map вместо цикла.
> @$symbols[$i];
Это быдлокодинг. Надо проверять есть ли символ в массиве, а не делать ошибки, а потом глушить их.
> $count = count($count);
Неправильно использовать одну переменную для разных вещей: массива символов и числа
> array_push($countedSymbols, $count);
можно как $countedSymbols[] = $count
> Сверяем количество символов в других массивах с самым большим массивом, пропускаем через цикл в цикле все массивы, наполняя пробелами те, которые по количеству символов не дотягивают до самого большого массива
Можно (нужно) сделать проще: при выводе просто смотреть, есть ли символ в масиве, если нет то выводить пробел вместо него.
> Выводим построчно первые и последующие символы в массиве
Тут незачем писать результат в переменную, можно сразу выводить через echo
> Интерпретатор выводит строки вниз, а не накладывает строку на строку, как я почему-то думал раньше.
Да, текст выводится слева направо и сврху вниз.
> Потом нашёл непонятное решение в Сети: $count = @$symbols[$i]; - ставим "собаку" перед массивом,определяем его таким вот образом именно как массив
Нет, не так, @ подавляет вывод сообщений об ошибках в выражении: http://php.net/manual/ru/language.operators.errorcontrol.php (я нагуглил по слову "php at operator")
Не используй его.
>>648835
> а что такое неявный сброс буфера?
Когда ты что-то выводишь через echo,для повышения производительности PHP копит данные в буфере, а например по символу перевода строки или по превышению размера буфера отдает данные на вывод (в консоль или апачу для передачи в браузер). Это помогает повысить производительность так как вывести/передать 1 раз 100 символов выгоднее чем 100 раз отдать по 1 символу.
Это не совсем особенность PHP, буферизация работает и в стандартных функциях языка Си, а интерпретатор PHP тоже ведь на нем написан.
Но это иногда вредно. Например если ты в консоли выводишь точку, ждешь 1 с, выводишь еще точку, и через 100 точек выводишь перевод строки, то из-за буферизации точки выведутся только через 100 секунд, одновременно, когда будет получем перевод строки. В таком случае ты можешь явно сбросить данные из буфера командой flush().
http://php.net/manual/ru/function.ob-implicit-flush.php
Эта функция включает неявный брос буфера, то есть сбрасывает буфер (делает flush()) после каждого эхо. Фактически она отключает буферизацию. Не очень понимаю, где это может пригодиться.
В твоем примере кода, мне кажется ob_implicit_flush(false); не нужна, так как там с помощью ob_start() включено сохранение всех выводимых данных в другой, вышестоящий буфер - ты можешь поменять false на true и скорее всего ничего не изменится.
>>648966
Хорошее решение, только я бы еще пробел справа от вертикальной черты добавил.
>>648982
Погугли.
>>648997
Заходит иногда
>>649122
Для начала неплохо, но надо доработать. Твоя программа ищет латинские буквы в русских словах, а как насчет русских букв в латинских словах? Вроде hеllо где E и O - русские.
> foreach($pieces as $key => $piece) {
> $symbols[$key] = ...
Тут $key не нужен, можно писать $symbols[] = ...
> Считаем количество символов во всех вложенных массивах
Используй array_map вместо цикла.
> @$symbols[$i];
Это быдлокодинг. Надо проверять есть ли символ в массиве, а не делать ошибки, а потом глушить их.
> $count = count($count);
Неправильно использовать одну переменную для разных вещей: массива символов и числа
> array_push($countedSymbols, $count);
можно как $countedSymbols[] = $count
> Сверяем количество символов в других массивах с самым большим массивом, пропускаем через цикл в цикле все массивы, наполняя пробелами те, которые по количеству символов не дотягивают до самого большого массива
Можно (нужно) сделать проще: при выводе просто смотреть, есть ли символ в масиве, если нет то выводить пробел вместо него.
> Выводим построчно первые и последующие символы в массиве
Тут незачем писать результат в переменную, можно сразу выводить через echo
> Интерпретатор выводит строки вниз, а не накладывает строку на строку, как я почему-то думал раньше.
Да, текст выводится слева направо и сврху вниз.
> Потом нашёл непонятное решение в Сети: $count = @$symbols[$i]; - ставим "собаку" перед массивом,определяем его таким вот образом именно как массив
Нет, не так, @ подавляет вывод сообщений об ошибках в выражении: http://php.net/manual/ru/language.operators.errorcontrol.php (я нагуглил по слову "php at operator")
Не используй его.
>>648835
> а что такое неявный сброс буфера?
Когда ты что-то выводишь через echo,для повышения производительности PHP копит данные в буфере, а например по символу перевода строки или по превышению размера буфера отдает данные на вывод (в консоль или апачу для передачи в браузер). Это помогает повысить производительность так как вывести/передать 1 раз 100 символов выгоднее чем 100 раз отдать по 1 символу.
Это не совсем особенность PHP, буферизация работает и в стандартных функциях языка Си, а интерпретатор PHP тоже ведь на нем написан.
Но это иногда вредно. Например если ты в консоли выводишь точку, ждешь 1 с, выводишь еще точку, и через 100 точек выводишь перевод строки, то из-за буферизации точки выведутся только через 100 секунд, одновременно, когда будет получем перевод строки. В таком случае ты можешь явно сбросить данные из буфера командой flush().
http://php.net/manual/ru/function.ob-implicit-flush.php
Эта функция включает неявный брос буфера, то есть сбрасывает буфер (делает flush()) после каждого эхо. Фактически она отключает буферизацию. Не очень понимаю, где это может пригодиться.
В твоем примере кода, мне кажется ob_implicit_flush(false); не нужна, так как там с помощью ob_start() включено сохранение всех выводимых данных в другой, вышестоящий буфер - ты можешь поменять false на true и скорее всего ничего не изменится.
>>648966
Хорошее решение, только я бы еще пробел справа от вертикальной черты добавил.
>>648982
Погугли.
>>648997
Заходит иногда
>>649122
Для начала неплохо, но надо доработать. Твоя программа ищет латинские буквы в русских словах, а как насчет русских букв в латинских словах? Вроде hеllо где E и O - русские.
Этот тред закрыт окончательно.
Это копия, сохраненная 14 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.