Вы видите копию треда, сохраненную 14 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>503607
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания. ОП отвечает даже на самые нубские вопросы. ОП заходит где-то раз в день-два, не жди его, решай задачки дальше.
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru/ Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то надо начать с него. Он простой и понятный (по крайней мере в начале). Там есть задачи, их надо решать обязательно (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению.
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Учебник дает основы языка PHP, но чтобы делать сайты, этого недостаточно. Если ты его прошел, то надо переходить в более серьезным задачкам, которые научат тебя как выдавать страницы в браузер, работе с таблицами в БД, работе с формами, MVC.
- Простая, но полезная задача сделать список студентов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Yii2: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование
- Если ты все решил, переходи к Symfony 2/Doctrine 2
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/7054af4a03865c4cc863
Может тебе понадобится пользоваться командной строкой, вот гайд https://gist.github.com/codedokode/10539568
Вот небольшой туториал по тому как начать использовать PHP на сервере для отдачи странички в браузер: https://php.net/manual/ru/tutorial.php Увы, уроков плавно подводящих к тому, как сделать задачи выше, пока нет, так что если что, задавай вопросы.
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://gist.github.com/codedokode/10539213
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.github.io/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git:
Подскажи сайты для поиска работы, я не умею гуглить? brainstorage.me, geekjob.ru, hh.ru
Нужен ли ООП, фреймворки, MVC? — Да, однозначно. Посмотри любую вакансию.
Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.net/45000175
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Где искать работу и заказы — hh.ru, geekjob.ru, brainstorage.me, fl.ru, odesk.com. Имей в виду, что кроме фриланса есть еще постоянная удаленная работа (remote job) когда тебе не надо тратить время на поиск заказов и переговоры с неадекватными заказчиками.
В этом треде ОП постарается сокращать свои графоманские пасты, чтобы тред не достигал бамп лимита так быстро.
Рядом прыгают пхп-макаки яростно размахивая руками, я швыряю парочку в окно и они летят с 10этажа вниз, далее я достаю свой непромытый-трипперно-ганорейно-ебанутый-недоразвитий хуй внезапно в комнату заходит мамаша модератора, но что было дальше вы узнаете в следующем треде...
Чувак, который вот тут абитуриентов делал. Я не понял, зачем ты везде __DIR__ проставляешь. Оно итак ведь включает тот же файл, что лежит в той же папке по дефолту.
https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Это по html осиль, больше тебе не нужно. Фотошоп ПХП программисту вообще не требуется.
https://www.google.com/trends/explore#q=yii%2C%20laravel&cmpt=q&tz=Etc%2FGMT-3
>Что самое главное для программиста? Умение аккуратно оформлять код
Пыха - язык который притягивает ебанутых как магнит.
учи все, не промахнешься.
Просто мимо проходил.
do-while в PHP считается хаком. Рекомендуется использовать goto.
>Не беспокойтесь, если вы не понимаете это сразу или вообще. Вы можете писать скрипты и даже мощные программы без использования этой 'возможности'. Начиная с версии PHP 5.3.0, стало возможным использовать оператор goto вместо подобного "хака".
Господа, срочный вопрос.
Пытаюсь вкатиться в веб-разработку, зная только основы html/css/js. Похапе не знаю в принципе и не хочу особенно знать, но надо набраться опыта в целом, я вообще джавист, но заинтересовался вебом.
Прислали из одной конторы тестовое задание. Если честно, я немного охуел, думал, какую-нибудь визитку заебашить предложат, а тут такое. Суть такова: "социальный видео плеер".
1. есть видео на тытрубе, одно конкретное.
2. юзеры могут кликать на смайлы в процессе просмотра видео, система запоминает момент видео, когда произошел клик
3. когда другой юзер смотрит это видео, у него где-то на экране появляются на 10 секунд те эмоции, которые кликали другие люди.
Можно использовать любые фреймворки, на мой вкус. Появление смайликов))))))00 должно быть реализовано с помощью AJAX, ну это и понятно.
Итак, вопрос, уважаемые знатоки: с помощью чего можно эту хуйню запилить максимально удобно и качественно?
Дохуя че-то для тестового задания. Вангую контора поддельная, на самом деле прислал какой-нибудь Васян с fl.ru, ищущий халявы. Я так один раз тестовое делал 2 дня, потом ни ответа ни привета.
Когда мне влом самому программировать проект, я нанимаю лопуха на удалённую работу из каких-нибудь ебеней. А потом кидаю его на зарплату.
Та не, не поддельная.
http://jobs.dou.ua/companies/i-techs/
Есть идеи, как это симпатично сделать? Какой-нибудь фреймворк для пыха посоветуете с внятной документацией, хотя бы?
>Та не, не поддельная.
>10 лет на рынке
>сайт из одной странички, сделанный за 2 минуты в генераторе htmlа
Проиграно.
Да похуй, я их рассматриваю исключительно как источник опыта.
будем знать и просить бабки за день.
Если ты про это
>Очевидный прозрачный бокс сверху кнопки для ловли события.
>Запись-чтение базы.
>Пишется на Ванилле за день.
то объясняю забыл про тот тред, ушел.
У тебя должно быть 2 места где нужно попрограммить - внутри страницы на js и на сервере, на PHP например, сервис, который будет читать-писать в базу количества смайликов.
"Ванилла" значит "фреймворки не нужны".
Вообще это банальная форма с реакцией на нее.
Итак, что у тебя должно быть.
0. База, в которой буду 3 поля - ID видео, ID смайла, Время добавления. Для простоты - sqlite, ей не требуется сервер, это просто файло. Предполагаю, что ты его сделал и создал в нем таблицу, тулзы для этого есть в интернетике.
1. PHP, принимающий клики. Это что-то вида
<?php
$db = new PDO("sqlite:smiles.sq");
$stmt= $db->prepare('INSERT INTO smiles (videoid,smileid) VALUES (?,?)');
$stmt->execute($_GET['video'], $_GET['smile']);
?>
2. Кликалка на странице. Это простая форма
<form method='get' target='невидимый_Iframe' action='php_из_пункта_1.php'>
<input type='hidden' name='videoid' value=здесь_видео_ид>
<button type=submit name='smileid' value=1>
<button type=submit name='smileid' value=2>
</form>
3. PHP, отдающий смайлы. Он будет принимать время и отдавать все смайлы по видео, прокликанные после этого времени.
<?php
$db = new PDO("sqlite:smiles.sq");
$stmt= $db->prepare('SELECT smileid,stamp FROM smiles WHERE videoid=? AND stamp>=? ORDER BY STAMP ASC');
$stmt->execute($_GET['video'], $_GET['stamp']);
$smileDump= [];
while($arr= $stmt->fetch())
$smileDump+= $arr;
echo json_encode($smileDump);
?>
4. Приемник смайлов на странице. Писать не буду, будет некрасиво. Суть токова:
а. По таймеру вызываешь AJAX запрос пхп из пункта 3, передавая ему время предыдущего подобного запроса (изначально 0).
б. пхп тебе возвращает все смайлики, протыканные с этого времени, отсортированные по времени же.
в. Ты их отображаешь куда полагается (".innerHTML+=" например бгг)
г. Время вызова сохраняешь для следующего вызова пункта a.
И да, тут чистая функциональность, еще по-хорошему проверок немало нужно антихацкерских, но для теста хватит, обосрутся иначе.
Если ты про это
>Очевидный прозрачный бокс сверху кнопки для ловли события.
>Запись-чтение базы.
>Пишется на Ванилле за день.
то объясняю забыл про тот тред, ушел.
У тебя должно быть 2 места где нужно попрограммить - внутри страницы на js и на сервере, на PHP например, сервис, который будет читать-писать в базу количества смайликов.
"Ванилла" значит "фреймворки не нужны".
Вообще это банальная форма с реакцией на нее.
Итак, что у тебя должно быть.
0. База, в которой буду 3 поля - ID видео, ID смайла, Время добавления. Для простоты - sqlite, ей не требуется сервер, это просто файло. Предполагаю, что ты его сделал и создал в нем таблицу, тулзы для этого есть в интернетике.
1. PHP, принимающий клики. Это что-то вида
<?php
$db = new PDO("sqlite:smiles.sq");
$stmt= $db->prepare('INSERT INTO smiles (videoid,smileid) VALUES (?,?)');
$stmt->execute($_GET['video'], $_GET['smile']);
?>
2. Кликалка на странице. Это простая форма
<form method='get' target='невидимый_Iframe' action='php_из_пункта_1.php'>
<input type='hidden' name='videoid' value=здесь_видео_ид>
<button type=submit name='smileid' value=1>
<button type=submit name='smileid' value=2>
</form>
3. PHP, отдающий смайлы. Он будет принимать время и отдавать все смайлы по видео, прокликанные после этого времени.
<?php
$db = new PDO("sqlite:smiles.sq");
$stmt= $db->prepare('SELECT smileid,stamp FROM smiles WHERE videoid=? AND stamp>=? ORDER BY STAMP ASC');
$stmt->execute($_GET['video'], $_GET['stamp']);
$smileDump= [];
while($arr= $stmt->fetch())
$smileDump+= $arr;
echo json_encode($smileDump);
?>
4. Приемник смайлов на странице. Писать не буду, будет некрасиво. Суть токова:
а. По таймеру вызываешь AJAX запрос пхп из пункта 3, передавая ему время предыдущего подобного запроса (изначально 0).
б. пхп тебе возвращает все смайлики, протыканные с этого времени, отсортированные по времени же.
в. Ты их отображаешь куда полагается (".innerHTML+=" например бгг)
г. Время вызова сохраняешь для следующего вызова пункта a.
И да, тут чистая функциональность, еще по-хорошему проверок немало нужно антихацкерских, но для теста хватит, обосрутся иначе.
Такой сайт, что у меня аж в рашке заблокирован. Или теперь все домены ua блокируют?
И да, естественно в таблице поле stamp должно быт вида
>stamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Чтобы заполнялось само.
Там еще будет ебатни с временными зонами, но это уже за деньги.
Да не похуй ли как время жизни потратить - таким образом, или в засмеялся-проиграл тредах.
Так даже лучше.
огромное кол-во раз сталкивался с тем что пхп считается "позорным" языком, спросив однажды у своего знакомого после его шутки "... ну хоть не пхп хахаха" я спросил почему пхп все хуесосят он ответил что и сам не знает.
Ну так в чём причина такого отношения к пхп?
Бро, ты охуенен. Приеду домой - начну ковырять. Цистерну чаю тебе!
Потому что всех кодеров называют макаками, ничего обидного. Я вот временами макака.
Кодер - это когда нужно просто взять и сделать, чтобы работало СЧАС. Многие мамкины и не очень АРХИТЕКТОРЫ считают, что это недостойно - просто делать. Сначала надо разработать. А пхп так уж устроено и так функционирует, что вполне выгодно сначала написать, чтобы работало, а потом уже выкинуть и переписывать как надо.
И многие останавливаются на этапе "чтобы работало". В итоге получаются тонны говнокода, работающего абы как и который потом начинает через копипасты просачиваться в другой код.
НЕОП
>>524245
Средний ПХПшник хуево знает ООП, использует кривые паттерны, пишет спагетти-код, десятиэтажные конструкции, не проверяет инпуты и оставляет кучу дыр для хакеров. Его код плохо расширяется и его трудно заново использовать в других местах. Это все не проблемы PHP, а проблемы кодеров, которые на нем пишут, не разобравшись толком в языке и инструментах. Кто освоил задания из шапки треда и прочел все линки, уже так не будет делать, соответственно таким уже говнокодером не будет, а будет нормальным специалистом, как в других языках.
Пока не побудешь тем и тем, разницы как бы и нет.
Но по факту кодер это подмножество программистов и архитектор это другое подмножество.
Кодер заморачивается тем, чтобы скобочки были на месте, чтобы ссылки были ненулевые, чтобы обрабатывалась ошибка чтения файла, не было переполнений всяких и чтобы синус был не больше 1. Вобщем конкретной реализацией функционала.
А архитектор заморачивается объектными моделями, связанностью базы данных, бизнес-логикой. Он может вообще не знать синтаксиса и фишек языка.
В чистом виде, впрочем, не думаю, что встречаются в природе. Даже железячные ассемблерщики работают в поле понятий железки, а не самого кода.
Но в своей собственной деятельности очень полезно эти штуки разносить. Вот сейчас ты архитектор, и тебе для работы достаточно бумаги и карандаша для блок-схем и каляк-маляк, и таки да, ты пишешь программу. А потом за комп и кодить, кодить, не отвлекаясь.
>чего сагаешь-то, настроение плохое?
Тред без ОПа левый, каноничный тут https://2ch.hk/pr/res/514869.html
http://dou.ua/forums/topic/14427/
Это норма в пхп. В шапке для таких линки с заданиями и лежат, чтобы квалификацию повышали.
юзай тор или зенмейт.
Лично я апи по городам не нашел, значит парсить банки разных городов. Повезет, если у них есть xml.
Как думаете, это битрикс-параша или нет?
Решение задачи из вашего курса для совсем дебилов новичков по теме "Регулярные выражения": http://ideone.com/10F2E2 .
Подскажите как вывести ошибку более-менее цивильно, а то через таблицу он как-то через раз нормально выводит.
Верстка из PSD подразумаеват, что йоба-дизайнер тебе готовую PSD со слоями пришлет. В ней сайт уже нарисован. Тебе остается открыть эту PSD в фотошопе, нарезать на подходящие по размеру куски бэкграунды, потом отключить лишние слои и вырезать кнопки, картинки и другие элементы. Все это сохранить в .jpg с нужным качеством, сверстать html + css, подходящий под картинку и натянуть вырезанные .jpg.
Вас понял. Выдвигаюсь.
Бесплатная масштабируемость. Значит для создания копии продукта ненадо тратить деньги. Не надо платить работнику и вообще кому бы то нибыло. Также это значит, что единожды написанный программный продут закрывает всю нишу, как во времени так и в пространстве! Яркий пример MS Windows + Office. Один раз дал кодерам денег, размножил на весь мир, и вечно суёшь бабки в карман. И никто никогда в мире не залезет на твой пирог! Где билли гейц в форбсе - все знают. А программистишки? Да на свалочке. Виндофс и офис уже написан, баги выловлены, досвидания. Хочешь заняться "своим бизнесом", сделать свой виндофс+форд, даже спиздив код у б. гейца? Валяй! Продукт уже на рынке, ты туда не влезешь, программный рынок не кокурентный.
Подумай над этим, порграммистишко, поверни свой ссохшийся на ООП мозг в сторону мысли. Подумай об этом, когда будешь засирать мир очередной остоёбившей шареварей, очередным ебаным веп ресурсом, когда будешь разрабатывать дяде очередную систему. С каждой рабочей системой жизненное пространство для программиста сжимается. В ближайше годы допишут всё, что надо. Останется 1000 кодеров во всём мире дописывать мульки, остальные на помойку. ВСЁ УЖЕ НАПИСАНО!.
https://github.com/blackberryJam
Я у него задачку списал. Советую почитать мануал по ООП на http://php.net/manual/ru/language.oop5.abstract.php
А потом еще учебник Зандрст "Объекты, шаблоны и методики программирования."
Но ты же тут не один, обиженка.
if
Текущий год
>02.08
else*
Предыдущий год
>2014
в пхп есть функция date, которая определяет текующую дату.
Всё, решил задачку. Отбой.
error_reporting(-1);
$credit = 40000 ;
$payment = 5000 ;
$procent = 1.03 ;
$comission = 1000 ;
$paymenTotal = 0
for ($month = 1 ; $month <= 12 ; $month ++) {
\t$credit= ($credit * $procent) - $payment + $comission ;
\t$paymentTotal = $paymentTotal + $payment ;
\techo "Спустя $month месяцев выплачено $paymentTotal осталось выплатить $credit \n" ;
\tif ($credit <=0){
echo "Выплачено!" ;
break ;}
}
господа почему показывает ошибку в 10 строке?
что не так аноны!?
пишу на пышке анонимный чат, вообще есть смысл его дорабатывать? Прикрепление файлов, емоджи смайлы, и вообще переписать используя что-то типа KPHP, HHVM.
Главное reg_exp делать для любых введенных данных и не ставить переменные пост и гет в сокл запросы.
Эмм...
Вообще-то лучше использовать библиотеки, в которых это делается уже.
Ну там экранировать SQL, использовать готовую авторизацию.
Тред просмотри, ни одного ответа от ОПа, всякие дауны отвечают. ОП в своем каноничном сидит.
>ни одного ответа от ОПа
Божимой, здесь ниправильный оп, все пропало. Больше ведь никто не знает пхп.
А ты не заметил, что вопросы в этом треде как-то получают ответы?
Суть "проблемы" только в том, что оповские задачки не контроллируются им же. Такая пичаль.
Нихуя не получают, тут одни трали. В оповском треде на все вопросы нормальные ответы.
$post = preg_replace("/\[webm\](.*)\[\/webm\]/i", '<video controls="controls" width="480" height="360" id="video1"><source src="\\1" type=\'video/webm; codecs="vorbis"\'></video>', $post);
да угомонись ты уже, что тот, что этот я создавал, так что ты пишешь в обоих моих тредах.
function index() {
$this->posts = $this->db->query('SELECT FROM posts ORDER BY ctime DESC')->all();
$this->out('posts.php');
}
function login() {
$this->out('login.php');
echo "login hi";
}
Что-то у меня не получается второй метод логин вызвать.
Вот роутер, что не так?
class ctrl {
public function __construct(){
$this->db = new db();
}
public function out($tplname, $nested = false) {
if(!$nested) {
$this->tpl=$tplname;
include 'tpl/main.php';
}
else
include 'tpl/'.$tplname;
}
}
class app {
public function __construct($path) {
$this->route = explode('/', $path);
$this->run();
echo $path;
}
private function run() {
$url = array_shift($this->route);
//if(!preg_match('@^[a-ZA-Z0-9.,-]&@', $url)) throw new Exception('Invalid path');
$ctrlName = 'ctrl/'.ucfirst($url);
if (file_exists("app/".$ctrlName . ".php")){
$this->runController($ctrlName);
}
else {
array_unshift($this->route, $url);
$this->runController('ctrlIndex');
}
}
private function runController($ctrlName) {
include "app/". $ctrlName .".php";
$ctrl = new $ctrlName();
if (empty($this->route)|| empty($this->route[0])){
$ctrl->index();
}
else {
if(empty($this->route))
$method='index';
else
$method = array_shift($this->route);
if(method_exists($ctrl, $method)){
$ctrl->$method();
} else throw new Exception('Error 404');
}
}
}
function index() {
$this->posts = $this->db->query('SELECT FROM posts ORDER BY ctime DESC')->all();
$this->out('posts.php');
}
function login() {
$this->out('login.php');
echo "login hi";
}
Что-то у меня не получается второй метод логин вызвать.
Вот роутер, что не так?
class ctrl {
public function __construct(){
$this->db = new db();
}
public function out($tplname, $nested = false) {
if(!$nested) {
$this->tpl=$tplname;
include 'tpl/main.php';
}
else
include 'tpl/'.$tplname;
}
}
class app {
public function __construct($path) {
$this->route = explode('/', $path);
$this->run();
echo $path;
}
private function run() {
$url = array_shift($this->route);
//if(!preg_match('@^[a-ZA-Z0-9.,-]&@', $url)) throw new Exception('Invalid path');
$ctrlName = 'ctrl/'.ucfirst($url);
if (file_exists("app/".$ctrlName . ".php")){
$this->runController($ctrlName);
}
else {
array_unshift($this->route, $url);
$this->runController('ctrlIndex');
}
}
private function runController($ctrlName) {
include "app/". $ctrlName .".php";
$ctrl = new $ctrlName();
if (empty($this->route)|| empty($this->route[0])){
$ctrl->index();
}
else {
if(empty($this->route))
$method='index';
else
$method = array_shift($this->route);
if(method_exists($ctrl, $method)){
$ctrl->$method();
} else throw new Exception('Error 404');
}
}
}
>Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки
https://jsbin.com/yuheteweyi/2/edit?js,console
Решение задачи про электросеть на джаваскрипте. Это ООП, посоны?
Привет, братишки. Я уверен, этот вопрос задавали не единожды, но быстропоиск ответов не дал. Вообщем, я знаю базу пхп, жс, хтмл+цсс, немного мускл (ну и еще кучу баз других языков, штук 8). Могу, к примеру, подгугливая, запилить форму для постинга сообщений с подключением базы данных. Ясно, что этого для трудоустройства маловато будет, но тут я уже чуть ли не полтора года спотыкаюсь и ударяюсь лбом о потолок - что делать дальше? Нигде нету систематизированной информации по сабжу, и я чувствую себя астероидом в огромном космосе информационного пространства.
Просто садиться и разбирать задачки о списке студентов и дальше? Или все же стоит прочесть http://archive-ipq-co.narod.ru/ ?
Плюс, я лет 5 работал с джумлой, хостя у провайдера всё это говно, но до сих пор не имею полного представления как всё устроено.
Все, я уже исправил. Потому что мне важно самостоятельно понять принцип MVC. Потом и до них дойду.
Во-первых, как тут уже писали, в фреймворках учитана безопасность, и даже без них нужно заменять получаемые данные и делать все по правилам, паролль там через md5 пропускать, ты как-то циклишься на "безопасности", обычным одностраничным говносайтам взлом не грозит.
Сага отвалилась.
Слушай, у тебя по ходу какие-то психические проблемы. Хочешь поговорить об этом? Я у тебя заместо психоаналитика буду, а ты меня пхп поучишь?
Аноны, поясните за массивы. У меня стаж 6 лет, а вот как нормально работать с массивами, я так и не понял. Упражнения и прочее подгонититя? :3 В универах оче ебаная тема, мне кажется и не все преподы её освещают. ЧТО С НИМИ ДЕЛАТЬ?
даже не спрашивайте что я 6 лет делал
>У меня стаж 6 лет, а вот как нормально работать с массивами, я так и не понял.
Это нормально для php-программиста. Не парься.
:( но я на другом языке ебашу и строго серверсайд. массивы обхожу стороной, а то что с ними делаю, строго в рамках положенного
Всё равно тема довольно скользкая.
В это треде некому пояснять, тут одни трали. Спроси в каноничном треде с ОПом - https://2ch.hk/pr/res/514869.html
<?php
function longdate($timestamp)
{
\treturn date("l F jS Y", $timestamp);
}
?>
Ты не в том треде спрашиваешь, тут одни трали. На вопросы в этом отвечают https://2ch.hk/pr/res/514869.html
а как ты собрался эту функцию вызывать лол? там же свои параметры в скобки не поставишь.
Все работает, возможно ты передаешь не timestamp, а что-то другое.
мамку твою ебал
плюсадин, затралил траль.
тебе на fl.ru
Любой фреймворк с модулем пользователей. Вот, например, модуль для йии2 который умеет все что тебе нужно и даже немножко больше https://github.com/amnah/yii2-user С помощью композера все это устанавливается и настраивается в течении нескольких минут. Не нравится йии, возьму любой другой современный фреймворк и луркай на гитхабе "%фреймворкнейм% users".
> ткнуть в уже готовый вариант
Любая CMS.
http://phpdes.com/php/aktivaciya-email-posle-registracii/
2 секунды в гугле.
Но за 10 000 рэ могу тебе написать и поставить на хост.
Сам тогда пиши, раз такой умный.
Паттерны-шматерны, методологии, управление командами и проектами, остальная хуйня.
Спрашивайте ответы, мои няши :3
Хватает на хороший виски или текилу.
> Смотря для чего
Ну скажем некий сервис, который первое время будет работать в регионе, с постепенным ростом до федерального уровня. Мобильные приложения.
> ни то, ни другое
Но почему и какие наши альтернативы?
Ну все равно. У программиста же всегда будет любимый инструмент! Будь то пхп или питон, если речь про веб. Руби в пример не привожу, ибо он руби.
лол, да я сам его называю ПЫХА
> Но почему и какие наши альтернативы?
Zend немного сложный (да бля, это всесторонне конфигурируемо-хардкорный пиздец, сам когда то на нем разработки вел), Symfony бандлнутый.
Из вашего списка я бы выбрал Symfony (скорость разработки, миллиарды готовых решений). Сам бы я взял Laravel (скорость разработки, няшности) или Yii2 (скорость работы).
ПЫСЫ: не считаю ни один из представленных выше фреймворком плохим
>>525577
> У программиста же всегда будет любимый инструмент!
Будет, он им и останется, но пренебрегать другими инструментами - плохая мысль.
У нас его называют ПЫШП.\t\t
пи-ах-пи
Благодарю.
Попробуй оператором goto.
http://php.net/manual/ru/function.parse-url.php
Распарсь URL и вызывай в зависимости от содержимого нужный метод.
анус себе распарсь, пес
Я так и делаю, но хотелось бы как-то это автоматизировать в одну строчку.
f ($this->route[1]=='index.php' || empty($this->route[1]))
{
$ctrl->index();
}
elseif($this->route[1]=='?login')
{
$ctrl->login();
}
elseif($this->route[1]=='?add')
{
$ctrl->add();
}
elseif($this->route[1]=='?del')
{
Например
if (method_exists($ctrl, $controller)
{
if($this->route[1]==$controller)
{
$ctrl->$controller();
}
}
>>525641
Пясдуй в официальный тред, там тебе ОП ответит, как освободится. Или кто-нибудь другой.
Официальный тред: https://2ch.pm/pr/res/514869.html
Запили роутер, который и будет вызывать нужный метод. Но судя по тому коду что ты привел у тебя там лютый говнокод.
Есть у вас такое понятие, как время жизни кода? Это косвенный вопрос о том, насколько на продакшне приемлем хуяк-хуяк-в-продакшн-лишь-бы-работало.
>>525571
Пышка, пипирка, вообще не беспокоит. Также я спокоен, когда меня называют макакой или равшаном хотя так меня называет только я сам.
>>525585
Тебя еще не забанили, болезный?
> Есть у вас такое понятие, как время жизни кода?
Есть. Если есть задача на хуяк-хуяк (что очень редко), то есть и задача на рефакторинг этого говна.
Но при этом защиту архитектуры, ревью, тестирование, etc. проходит любой код.
>насколько на продакшне приемлем хуяк-хуяк-в-продакшн-лишь-бы-работало
Приемлем, главное не зарасти в этом говне.
>Выбрал пхп
>ахуел от того, насколько в треде поехавший оп, заставляющий всех писать в бамплимитный тред
И часто у вас такое бывает?
Вы так любите писать свои велосипеды (я хуею просто).
https://github.com/slimphp/Slim
https://github.com/chriso/klein.php
https://github.com/c9s/Pux
Ну если серьезно. Только низкий порог вхождения?
Интересно было бы сравнить скорость разработки на популярных фреймворках пхп и джавы.
Например, бд (или массив) = ("Паттерн", "Французский паттерн", "Коворкинг");
строка = "Съешь ещё этих мягких французских паттернов, да выпей коворкинга";
Как результат хотелось бы позиции подстрок в строке.
Делаю для инглиша, так что на падежи и прочее похуй.
Google://full+text+search
Что нужно уметь, чтобы найти работу пхп-программистом на удалёнке хотя бы за 500$?
>Что нужно уметь
"Мне помог элемент удачи. Я нашёл контору в гермашке, которая работает на оДеске и имеет кучу сделанных проектов там. Они брались найти проект по хорошей ставке за 40% от всей суммы, которую я заработаю. Я согласился и они таки нашли. Четыре проекта я сделал с ними. Всё удаленно. После этого работал на пол-ставки вне оДеска и те деньги стали прибавкой к з/п. Так я понял, что на начальном этапе самое главное - не твой скилл, а скилл того, кто тебя продаёт.
Не лезьте сами на оДеск. Лезьте туда как часть аутсорс-конторы с кучей проектов и репутацией. Иначе будете конкурировать с индусами, что нереально."
Спасибо, полезная инфа.
Смотрел вакансии, требования к джуниору за 500$
>знание php, mysql, html, css, javascript
Требования к разработчику за 1К$
>то же самое + пару фреймворков
Какие реальные навыки нужны? Что нужно уметь делать на пхп, чтобы взяли джуном или разработчиком на удалёнку за 500$?
Что имеется в виду, когда пишут
>хорошее знание php
>отличное знание php
?
Не, это в требованиях к вакансии написано.
Добро пожаловать в наш уютный тредик. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то - делать сайты, кто-то - просто размять мозги и заняться чем-то полезным.
Почему PHP? Потому что фейсбук и википедия на нем написаны, и вакансий море, и учить легко.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (с ним будет удобнее).
Предыдущий тред был тут: >>514869 (OP)
Что самое главное для программиста? Умение аккуратно оформлять код (читай второй пост).
Ссылки и задачки в ОП посте.
Если тебе лень выравнивать код руками, закачай его на 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, то рассказать об этом стоит в каком-нибудь другом треде.
Ах да. Если тебе кажется, что что-то в учебнике или задачах можно сделать лучше — пиши, обратная связь всегда очень полезна.
https://github.com/nsdvw/file-sharing
Другие аноны, которые оставляли за последнюю неделю задачки в старом треде, посмотрите, я там многие проверил:
Ответ анону с 10 задачкой на HTML и на регулярки: >>526137\t
Ответ на задачку про номера телефонов: >>526196\t
Ответ анону с кучей HTML задачек: >>526200\t
Ответ анону с кучей простых заадчек из учебника: >>526203
Ответ про поддрежку utf-8 в ядре: >>526212\t
ну и другие ответы. Если я кого-то пропустил, напомните о себе
Конечно, я сильно сомневаюсь что это правда, так как эта задача не требует вообще ничего думать, профессиональный разработчик решит ее за минуту. В Гугле вряд ли бы стали давать задачу школьного уровня.
Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:
- напишите функцию, переворачивающую бинарное дерево.
Дам пару пояснений. Во-первых, дерево это структура, состоящая из узлов, у каждого узла, кроме корневого, есть родитель:
https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
http://www.intuit.ru/studies/courses/648/504/lecture/11458
Вообще, структура из узлов, которые связаны друг с другом, называется граф. Дерево это частный стучай графа, в котором нет циклов и у каждого узла только один родитель.
С деревьями связано много интересных алгоритмов и задач:
http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php
Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.
«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.
Узел дерева обычно содержит еще какие-то данные. Например, число, букву, строку, или что-нибудь еще. В данной задаче это значения не имеет, но если узлы с числами выстраивать в определенном (отсортированном порядке), мы получим упорядоченное дерево, в котором можно довлоьно быстро делать поиск. Именно упорядоченные двоичные деревья, например, используются в индексах базы данных для ускорения их поиска. Префиксные (не двоичные) деревья можно использовать для поиска слов с опечатками в словаре. Это я к тому что деревья важная штука и много где используются.
Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред), который представляет один узел дерева. Из объектов такого класса можно будет построить дерево.
Потом надо будет придумать способ обхода всех узлов дерева. Для этого нужна либо рекурсивная функция, либо очередь, куда мы складываем новые найденные узлы, которые планируем посетить:
http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/
Ну а имея его, перевернуть дерево, труда, думаю, не составит.
Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
Конечно, я сильно сомневаюсь что это правда, так как эта задача не требует вообще ничего думать, профессиональный разработчик решит ее за минуту. В Гугле вряд ли бы стали давать задачу школьного уровня.
Но вы пока не профессиональные разработчики, почему бы не поломать голову? Вот задача:
- напишите функцию, переворачивающую бинарное дерево.
Дам пару пояснений. Во-первых, дерево это структура, состоящая из узлов, у каждого узла, кроме корневого, есть родитель:
https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_(%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
http://www.intuit.ru/studies/courses/648/504/lecture/11458
Вообще, структура из узлов, которые связаны друг с другом, называется граф. Дерево это частный стучай графа, в котором нет циклов и у каждого узла только один родитель.
С деревьями связано много интересных алгоритмов и задач:
http://algolist.manual.ru/ds/btree.php
http://algolist.manual.ru/ds/walk.php
Бинарное (двоичное) дерево — это дерево, у каждого узла которого может быть не более 2 детей. Их обычно называют «левый» и «правый» ребенок.
«Перевернуть» дерево значит пройтись по всем узлам в дереве и поменять местами «левого» и «правого» детей.
Узел дерева обычно содержит еще какие-то данные. Например, число, букву, строку, или что-нибудь еще. В данной задаче это значения не имеет, но если узлы с числами выстраивать в определенном (отсортированном порядке), мы получим упорядоченное дерево, в котором можно довлоьно быстро делать поиск. Именно упорядоченные двоичные деревья, например, используются в индексах базы данных для ускорения их поиска. Префиксные (не двоичные) деревья можно использовать для поиска слов с опечатками в словаре. Это я к тому что деревья важная штука и много где используются.
Для начала, вам, конечно, надо реализовать само дерево. Для этого в PHP надо сделать класс (любители массивов идут в какой-нибудь другой тред), который представляет один узел дерева. Из объектов такого класса можно будет построить дерево.
Потом надо будет придумать способ обхода всех узлов дерева. Для этого нужна либо рекурсивная функция, либо очередь, куда мы складываем новые найденные узлы, которые планируем посетить:
http://learnc.info/adt/binary_tree_traversal.html
http://hci.fenster.name/304y/lab3/
https://sohabr.net/post/232669/
Ну а имея его, перевернуть дерево, труда, думаю, не составит.
Аноны, попробуйте порешать. Даже если вы будете натягивать шаблоны на битрикс, все равно для мозгов полезно.
Разумеется используя возможности симфони и минимум велосипедостроения. Погугли по словам «symfony авторизация» например (я проверил, все гуглится).
Заметь что ответ на этот вопрос ты бы мог получить гораздо быстрее из гугла.
Быстрее свой написать, чем чужой расковыривать.
>Лезьте туда как часть аутсорс-конторы
Ага и как частью этой конторы стать? Все равно нужно лезть на одеск и искать эту контору.
С такими вобросами тебе в /веб
https://github.com/V3N0m21/Uppu3
Разобрал замечания, есть пару вопросов
>Тут можно (и нужно) прописать связь с файлом. А в файле — обратную связь. Зачем нам id файла когда мы можем прописать связь и доктрина будет возвращать нам сущность-файл?
Я не совсем понимаю как это должно работать.
https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L46
Я сделал так, но я не уверен что уловил суть.
>$deleted = $cache->deleteAll();
Это у меня на время отладки, кэш создал мне много проблем
> `children` int(11) DEFAULT NULL,
>Что хранится в children? Комментария нет, непонятно.
С этим полем children у меня тоже непонятки, по идее туда должны вставляться ID потомков, но я не совсем понимаю почему у меня это не работает, если не сложно, посмотри что у меня там не так, делал как в оф.документации
https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#materialized-path
> https://github.com/V3N0m21/Uppu3/blob/master/public/index.php#L50
> $helper = new FormatHelper();
>Это не нужно, там же все методы статические
А как тогда передать это в шаблон?
>Вот кстати, ты файлообменник доделываешь, самое время за HTML, JS и SQL взяться, если ты их еще не решал. Ну и далее фреймворки мучать.
>Вообще, справедливости ради, выгоднее может быть сначала мучать Yii2 и симфони 2, а потом JS/HTML/SQL, так как на собеседовании это будет весомее, но ведь ты будешь ужасный код писать, будешь тратить много времени на отладку неработающих скриптов или верстки, это все равно надо знать. Мне не нравится когда люди хорошо пишут PHP код, но открываешь JS и там ужас какой-нибудь.
Ну книгу learn.javascript.ru я уже недели две читаю, как-то тяжеловато мне даются сложные задачи оттуда, возможно потому что я слишком тороплюсь. Ну и я не понимаю что там настолько криво в моем коде кроме того что я пока еще не освоил шаблонизаторы? Может есть какие-то типовые решения в виде примеров как правильно оформлять код, куда вставлять файлы и все такое? Еще хотел спросить насичет Аякса, его тоже учить по этой книге, или по нему есть что-то другое?
По поводу sql да, я чувствую что я там совсем плаваю. Был бы благодарен за ссылку на книжку, или хотя бы название книжки по которой можно было бы подтянуть основные моменты.
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L46
> Я сделал так, но я не уверен что уловил суть.
Пока неправильно. Ты знаешь про виды отношений, 1-1, 1-M, M-N? Если нет то начни с повторения: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Определи какое тут отношение. Затем открывай
http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html (англ)
http://odiszapc.ru/doctrine/working-with-associations/ (рус)
И определи как реализуется та или иная связь. ну например в случае ManyToMany у тебя не должно быть аннотации @Column и должна быть @JoinColumn, а само поле $fileId (неудачное название) будет содержать тогда коллекцию связанных с комментарием сущностей.
> Это у меня на время отладки, кэш создал мне много проблем
Ты можешь поставить ArrayCache вместо этого. Ну и по идее там во многих случаях кеш должен обновляться сам при изменении файла с кодом сущности.
> С этим полем children у меня тоже непонятки, по идее туда должны вставляться ID потомков,
Нет. Так никто не делает так как со списом id нельзя работать на уровне SQl, и это противоречит нормализации (в одном поле должно храниться одно значение а не несколько). Надо бы тебе SQL подучить.
> но я не совсем понимаю почему у меня это не работает, если не сложно, посмотри что у меня там не так, делал как в оф.документации
Там $children замаплено не на поле в таблице а на отношение «родитель» - «дети». Если у поля есть аннотация @COlumn это значит, оно мапится на реальную колонку в базе данных. Если там стоит @ManyToOne , @OneToOne и подобное то это отношение, и оно может вообще не соответствовать никакой колонке.
Например чтобы получить детей, мы делаем выборку по условию WHERE parentId = ? и нам не нужно поле для хранения их списка. Потому $children это ассоциация (связь) в доктрине а не поле в таблице. Туда записвается коллекция (объект напоминающий массив) сущностей-деетй комментария и ты можешь пользоваться ей так:
$comment = $em->find(..., $id);
$children = $comment->getChildren(); // возвращает объект PersistentCollection с комментариями внутри
foreach ($children as $child) {
echo $child->getComment(); // выводит текст комментария
Заметь что это так называемая «ленивая коллекция». При обращении $children = $comment->getChildren(); ты получаешь объект в котором нет детей. Там хранится только id родителя (то есть $comment).
А при вызове foreach, когда ты пытаешься перебирать содержимое объекта-коллекции, он делает запрос в базу SELECT .. WHERE parentId = ? и загружает в себя комментарии. И затем происходит цикл по ним.
Это важная концепция, которую надо понять. Почему доктрина это делает? Потому что если бы мы загружали все связанные сущности сразу, мы бы делали очень много лишней работы (особенно когда у сущности много связей). Потому доктрина по умолчанию не загружает связннаые сущности и коллекции, а вставляет в $comment специальные объекты-прокси которые загрузят их при первом обращении. Также опционально ты можешь загрузить часть связанных сущеостей заранее, с помощью жадной загрузки. Она делается либо аннотациями либо пишется в DQL запросе, так:
SELECT com, ch FROM Comment com JOIN com.children ch WHERE ...
В этом случае доктрина сразу жадно загрузит список детей для выбранных комментариев.
Там есть 2 вида прокси: прокси для коллекции (используется в отношениях 1-M и M-N) и прокси для объекта (в отсношениях 1-1 и M-1). У примеру, в поле $file у комментария загрузится прокси-объект для Entity\File. Это объект класса, унаследованного от него:
namespace \Proxy\Entity\;
class File extends \Entity\File {
...
}
Прокси-объект при обращении к любому методу, кроме getId(), делает загрузку сущности в себя и только после этого вызывает метод. Таким образом ленивая загрузка работает прозрачно для пользователя и у него создается видимость то все данные уже изначально загружены.
Ты можешь найти прокси-классы в папке которая указана в конфиге: $config->setProxyDir(sys_get_temp_dir()); Рекомендую посмотреть их.
Этот паттерн разумеется описан в книге Фаулера: http://design-pattern.ru/patterns/lazy-load.html
В общем, попробуй с этим разобраться, как оно работает.
И вторая концепция, которую ты должен осилить, это Identity Map: http://design-pattern.ru/patterns/identity-map.html
Ее суть в том что доктрина никогда не создаст 2 сущности соответствующих одной строке таблице. Вот этот код:
$c1 = $em->find(..., 1); // делает запрос в базу
$c2 = $em->find(..., 1); // берет ранее загруженную сущность из Identity Map
Таким образом в твоей программе никогда не будет 2 сущностей с одинаковым id.
Один анон, чтобы с этим разобраться, даже пылался написать свой ORM с ленивой загрузкой и прокси-классами. Ну тебе я не буду это советовать, но хорошо бы разроратся до такого уровня, чтобы ты понимал все выше написанное.
Как видишь, для новичка доктрина доволно сложная. Но тем не менее, она позволяет нам экономить силы на написании однотипного кода работы с базой, а что касается описанных выше конценпций то они выглядят логично если вспомнитьчто цель ORM абстрагироваться от базы и создать видимость что весь граф сущностей хранится в памяти, а не базе.
> https://github.com/V3N0m21/Uppu3/blob/master/app/Resource/Comments.php#L46
> Я сделал так, но я не уверен что уловил суть.
Пока неправильно. Ты знаешь про виды отношений, 1-1, 1-M, M-N? Если нет то начни с повторения: http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
Определи какое тут отношение. Затем открывай
http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html (англ)
http://odiszapc.ru/doctrine/working-with-associations/ (рус)
И определи как реализуется та или иная связь. ну например в случае ManyToMany у тебя не должно быть аннотации @Column и должна быть @JoinColumn, а само поле $fileId (неудачное название) будет содержать тогда коллекцию связанных с комментарием сущностей.
> Это у меня на время отладки, кэш создал мне много проблем
Ты можешь поставить ArrayCache вместо этого. Ну и по идее там во многих случаях кеш должен обновляться сам при изменении файла с кодом сущности.
> С этим полем children у меня тоже непонятки, по идее туда должны вставляться ID потомков,
Нет. Так никто не делает так как со списом id нельзя работать на уровне SQl, и это противоречит нормализации (в одном поле должно храниться одно значение а не несколько). Надо бы тебе SQL подучить.
> но я не совсем понимаю почему у меня это не работает, если не сложно, посмотри что у меня там не так, делал как в оф.документации
Там $children замаплено не на поле в таблице а на отношение «родитель» - «дети». Если у поля есть аннотация @COlumn это значит, оно мапится на реальную колонку в базе данных. Если там стоит @ManyToOne , @OneToOne и подобное то это отношение, и оно может вообще не соответствовать никакой колонке.
Например чтобы получить детей, мы делаем выборку по условию WHERE parentId = ? и нам не нужно поле для хранения их списка. Потому $children это ассоциация (связь) в доктрине а не поле в таблице. Туда записвается коллекция (объект напоминающий массив) сущностей-деетй комментария и ты можешь пользоваться ей так:
$comment = $em->find(..., $id);
$children = $comment->getChildren(); // возвращает объект PersistentCollection с комментариями внутри
foreach ($children as $child) {
echo $child->getComment(); // выводит текст комментария
Заметь что это так называемая «ленивая коллекция». При обращении $children = $comment->getChildren(); ты получаешь объект в котором нет детей. Там хранится только id родителя (то есть $comment).
А при вызове foreach, когда ты пытаешься перебирать содержимое объекта-коллекции, он делает запрос в базу SELECT .. WHERE parentId = ? и загружает в себя комментарии. И затем происходит цикл по ним.
Это важная концепция, которую надо понять. Почему доктрина это делает? Потому что если бы мы загружали все связанные сущности сразу, мы бы делали очень много лишней работы (особенно когда у сущности много связей). Потому доктрина по умолчанию не загружает связннаые сущности и коллекции, а вставляет в $comment специальные объекты-прокси которые загрузят их при первом обращении. Также опционально ты можешь загрузить часть связанных сущеостей заранее, с помощью жадной загрузки. Она делается либо аннотациями либо пишется в DQL запросе, так:
SELECT com, ch FROM Comment com JOIN com.children ch WHERE ...
В этом случае доктрина сразу жадно загрузит список детей для выбранных комментариев.
Там есть 2 вида прокси: прокси для коллекции (используется в отношениях 1-M и M-N) и прокси для объекта (в отсношениях 1-1 и M-1). У примеру, в поле $file у комментария загрузится прокси-объект для Entity\File. Это объект класса, унаследованного от него:
namespace \Proxy\Entity\;
class File extends \Entity\File {
...
}
Прокси-объект при обращении к любому методу, кроме getId(), делает загрузку сущности в себя и только после этого вызывает метод. Таким образом ленивая загрузка работает прозрачно для пользователя и у него создается видимость то все данные уже изначально загружены.
Ты можешь найти прокси-классы в папке которая указана в конфиге: $config->setProxyDir(sys_get_temp_dir()); Рекомендую посмотреть их.
Этот паттерн разумеется описан в книге Фаулера: http://design-pattern.ru/patterns/lazy-load.html
В общем, попробуй с этим разобраться, как оно работает.
И вторая концепция, которую ты должен осилить, это Identity Map: http://design-pattern.ru/patterns/identity-map.html
Ее суть в том что доктрина никогда не создаст 2 сущности соответствующих одной строке таблице. Вот этот код:
$c1 = $em->find(..., 1); // делает запрос в базу
$c2 = $em->find(..., 1); // берет ранее загруженную сущность из Identity Map
Таким образом в твоей программе никогда не будет 2 сущностей с одинаковым id.
Один анон, чтобы с этим разобраться, даже пылался написать свой ORM с ленивой загрузкой и прокси-классами. Ну тебе я не буду это советовать, но хорошо бы разроратся до такого уровня, чтобы ты понимал все выше написанное.
Как видишь, для новичка доктрина доволно сложная. Но тем не менее, она позволяет нам экономить силы на написании однотипного кода работы с базой, а что касается описанных выше конценпций то они выглядят логично если вспомнитьчто цель ORM абстрагироваться от базы и создать видимость что весь граф сущностей хранится в памяти, а не базе.
> >Это не нужно, там же все методы статические
> А как тогда передать это в шаблон?
Передавать в любом случае смысла нет так как статические методы надо вызыать не через переменную-объект, а через класс:
Class::method
В твоем случае надо либо сделать методы не статическими, либо, что полезнее, объявить функции в твиге как описано тут: http://twig.sensiolabs.org/doc/advanced.html#functions
Заметь что когда тебе надо создать много функций, ты можешь сделать класс-расширение с ними как описано тут: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension
Сделай-ка расширение к твигу, допустим с названием UppuExtension, и добавь туда нужные функции.
А наши задачи на JS решал? Они еще сложнее? Если тебе непонятно что-то из того учебника, задай вопрос тут, может ты какой-то простой вещи не понял и из-за этого все стопорится.
> Ну и я не понимаю что там настолько криво в моем коде кроме того что я пока еще не освоил шаблонизаторы?
Криво писать HTML-код внутри строки. А в твоем случае это вообще не требуется, так как форма есть в дереве DOM, ее надо просто перенести под нужный комментарий.
> Еще хотел спросить насичет Аякса, его тоже учить по этой книге, или по нему есть что-то другое?
По этой, но сначала разумеется надо выучить сам язык JS.
> Был бы благодарен за ссылку на книжку, или хотя бы название книжки по которой можно было бы подтянуть основные моменты.
В задачках из оп поста на SQL есть ссылки на туториалы, для начала их пройди, они простые.
Насчет identity map, это работает примерно так. Представь массив вида id => сущность, изначально пустой. Это и есть простейший пример map:
$map = [];
Затем доктрина при зарузке данных из БД (например при вызове findBy) делает так:
$rows = ... ; //строки с данными из базы
$results = [];
foreach ($rows as $row) {
// определяем id сущности в этой строке
$id = $row['id'];
// Если она есть в identity map, берем ее оттуда, иначе создаем, заполняем данными и кладем в map
if (array_key_exists($id, $map)) {
$entity = $map[$id];
} else {
$entity = new Comment;
// поставляем значения в объект из массива данных черз Reflection API (позволяющее лезть в закрытые снаружи поля)
....
$map[$id] =$entity;
}
$result[] = $entity;
}
return $result;
Насчет identity map, это работает примерно так. Представь массив вида id => сущность, изначально пустой. Это и есть простейший пример map:
$map = [];
Затем доктрина при зарузке данных из БД (например при вызове findBy) делает так:
$rows = ... ; //строки с данными из базы
$results = [];
foreach ($rows as $row) {
// определяем id сущности в этой строке
$id = $row['id'];
// Если она есть в identity map, берем ее оттуда, иначе создаем, заполняем данными и кладем в map
if (array_key_exists($id, $map)) {
$entity = $map[$id];
} else {
$entity = new Comment;
// поставляем значения в объект из массива данных черз Reflection API (позволяющее лезть в закрытые снаружи поля)
....
$map[$id] =$entity;
}
$result[] = $entity;
}
return $result;
Кто-то писал что у Олифера есть уменьшенная версия учебника: >>513854
> Нет, для саморазвития лучше "Основы компьютерных сетей" тех же авторов, семейства Олифер.
Там все излагается гораздо более кратко и доступно. "Компьютерные сети" для гиков, "Основы" для нубов. Сами аффтары тралят в предисловии, говорят мол для ниасиляторов выпускаем лайт-версию, пикрелейтед.
Хотя не знаю, может и эта будет слишком большой для тебя.
Кстати, кому надо команды под линукс, чтобы Oracle Java для Phpstorm поставился, вчера их тоже гуглить заебался:
su
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java7-installer
exit
cd ~
wget http://download-cf.jetbrains.com/webide/PhpStorm-9.0.tar.gz
tar xfz PhpStorm-.tar.gz
cd PhpStorm/bin
./PhpStorm.sh
Большая глупость так вот копировать команды не понимая что огни делают. Ведь они как минимум могут быть устаревшими.
Тут как минимум это есть: https://www.jetbrains.com/phpstorm/help/system-requirements-and-installation.html#d266796e215
В твоих командах в любом случае звездочка потерялась.
Если там неправильно то лучше всего им же в багтрекер об этом написать (если ошибка у них а не ты накосячил в выполнении команд). Я не понимаю, почему для установки продукта надо лезть на какие-то левые сайты, а не официальный.
Потому что на официальном неактуальные команды же. Я на официальный и залез сначала. С дебагом то же самое, на официальном сайте не было, как настроить правильно.
>не работает font: 40px/1.5 #333 "Times New Roman";
>потому что нельзя указывать цвет в font
Что? А почему тогда работает font: 14px/1.2 #000 arial; ?
Ну ладно, мне все равно привычнее писать правила по-отдельности: font-size, font-family, line-height и т.д.
Вопрос не по теме: я недавно пересел на эту вашу убунту, и последнее время стал дико тормозить то ли рабочий стол (xfce), то ли проводник (thunar, иногда вылетает, особенно если быстро кликнуть несколько раз кнопку переходу в папку выше).
Может кто сталкивался, как там его лечить.
Потому что кликаю правой кнопкой по значку на рабочем столе, и жду секунд пять, пока появится контекстное меню. Винчестер скрипит в это время, будто я запускаю yoba-игру.
Почитай синтаксис http://htmlbook.ru/css/font
Если у тебя что-то работает то это ничего не доказывает. Например у тебя это правило могло не работать, а шрифт унаследовался от родительского элемента.
> 4 задание
>Там не 10px между блоками, смотри сам: https://jsfiddle.net/3jok8w7k/1/
А, я понял, inline-block ведет себя как строчный, поэтому появляются пробелы между блоками.
Не знаю, как с этим бороться. Можно конечно поудалять переводы строк, и писать в одну строку, но это как-то тупо.
Я не выспался и не могу сегодня соображать.
Пойду лучше поучу матчасть, чем часами ломать голову над такими заданиями.
>>526428
>шрифт унаследовался
Вот оно че, я понял.
> я недавно пересел на эту вашу убунту, и последнее время стал дико тормозить то ли рабочий стол (xfce), то ли проводник (thunar, иногда вылетает, особенно если быстро кликнуть несколько раз кнопку переходу в папку выше).
> Может кто сталкивался, как там его лечить.
Тормоза лечатся поиском причин (начиная от просмотра загрузки процессора через top и заканчивая профайлингом). В случае с багом, нужно собрать стектрейс и запостить его в баг-трекер разработчиком. либо, что гораздо лучше, исследовать программу отладчиком и найти и исправить причину падений.
Конечно 99% пользователей на это не способны потому они тупо гуглят или устанавливают другую среду. Но это не путь истинного линуксоида, имей в виду. Я предлагаю их считать домохозяйками а не линуксоидами.
> Потому что кликаю правой кнопкой по значку на рабочем столе, и жду секунд пять, пока появится контекстное меню. Винчестер скрипит в это время, будто я запускаю yoba-игру.
Обращения к диску прекрасно отслеживаются через strace. Действительно, я сам сталкивался с тем что некоторые программы могут при запуске читать огромное число елких файлов и на магнитных дисках это медленно. Некоторые кто любит выкидывать деньги на ветер решают проблему установкой SSD или покупкой макбука, некоторые выясняют причины и меняют настройки программ и разбираются почему файлы не кешируются в памяти. Это же открытый код, ты можешь изуить и поменять любую строчку и любую настройку при наличии времени и знаний.
Не то чтобы я эксперт по этой теме, но если есть желание покрасноглазить, я могу что-то подсказать. В твоем случае например можно запускать тормозящую программу под strace (а удобнее наверно присоединяться к ней на время) и анализировать системные вызовы.
> Не знаю, как с этим бороться. Можно конечно поудалять переводы строк, и писать в одну строку, но это как-то тупо.
Ты подсказки под задачей прочел? https://gist.github.com/codedokode/58ebc90bd006baf4b35c#Задание-4
> если тебе никак не удается добиться, чтобы расстояние между блоками по горизонтали было ровно 10px, прочти статью....
>это не путь истинного линуксоида, имей в виду
Я им и не собираюсь становиться, мне линукс для работы нужен, а не для сомнительного самоутверждения.
Мне нужно только чтобы система работала более надежно и удобнее.
Разумеется лезть в код линукса я для этого не собираюсь.
>если есть желание покрасноглазить
Нет, спасибо, я лучше проведу время с семьей на свежем воздухе.
Куплю тогда мак, действительно. А задроты пусть ковыряются в исходниках и гордятся этим говноедством.
>>526440
>Ты подсказки под задачей прочел? http://css-live.ru/articles/zagadochnye-otstupy-mezhdu-inlajn-blokami.html (32 экрана)
Блджад, рака тем людям, которые не могут писать лаконичные статьи.
Придется читать. Я сейчас прочитаю, и перепишу статью так, как она должна была бы выглядеть по моим представлениям о ясности и лаконичности. (Офигенное занятие, а кто-то сейчас на пляже загорает)
Ставь дебиан c GNOME, там ничего не тормозит. Убунта для говноедов, переехавших из последней винды, потому там много свистелок и перделок, от которых тормоза.
На что указывает красный стрелочкэ?
На пикрелейтед же.
Законспектировал 36 строк, 3614 символов. (Оригинальная статья 455 строк, 27634 символа)
Выводы: из-за того что разработчики браузеров не могут реализовать этот несчастный стандарт w3org, мне приходится разбираться во всяких хаках и костылях. Это нихуя не интересно и непрактично. Поэтому в верстке я выберу быдлокодерский путь, а именно тупое запоминание готовых решений.
Одно дело программирование, где каждое приложение уникально и интересно, там да, можно подумать над его реализацией, поломать голову как сделать лучше и надежнее.
А верстка сама по себе неинтересна, и тратить время на заучивание "особенностей" (ошибок) браузеров - не рационально и неинтересно. В конце концов я не верстальщик.
По самой статье: там разбирается несколько "хаков", то есть обходных решений, чтобы избавиться от ошибок в браузерах.
Я для себя выбрал следующий способ: родительскому элементу выставить font-size:0, а у элементов с inline-block соответственно переопределить размер шрифта на нужный. Так мы убиваем пробелы, но проявляются косяки разработчиков Safari. Чтобы этого "бага" избежать, применяем правило display:table родительскому элементу. Что за собой тянет ряд особенностей данного типа поведения, о которых необходимо помнить.
--------------------------------------------------------------------------------------------------
Мой конспект статьи (не знаю, зачем его сюда копипастщчу, наверное из упрямства, чтобы показать, что нужно излагать свои мысли лаконичнее, и не графоманствовать).
В верстке существует проблема с интервалами (пробелами), которые вставляются между словами.
Эти пробелы часто мешают нам при вёрстке того или иного блока. Избавиться от них бывает не так-то просто.
В этой статье мы рассмотрим, что такое inline-block, и почему после себя он ставит эти непонятные интервалы. Ну, и, самое главное, мы увидим несколько универсальных решений данного вопроса и,конечно же, обсудим все их стороны.
inline-block — представляет собой блок, с поведением строки, т.е. по сути является строчно-блочным элементом.
Строчное поведение inline-block позволяет ему оставаться в одной строке с другими строчными элементами, например <span>-ом или попусту сливаться с обычными буквами, т.е. вести себя, как текст в строке.
Ну а благодаря своим блочным способностям, inline-block-у можно смело задавать любые свойства, которые присущи блочным элементам: ширину, высоту, верхний и нижний margin, например, уже будет действовать, как у блоков.
inline-block — как буква
Одна из главных вещей, которые вы должны знать, это то, что inline-block — является по сути обычной буквой — символом, т.е. весь наш строчный блок составляет всего лишь одну букву в строке, одну единицу. Даже не смотря на то, что содержит в себе кучу других символов или элементов. Именно по этой причине inline-block не "разрываются", как строчные элементы, а переносятся на следующую строку целиком. Ну и соответственно, если рядом с inline-block не будет пробелов, то расстояние между ним и соседними буквами будет обычный межбуквенный интервал (трекинг), которым можно управлять (кернинг). Если есть пробелы — до соседней буквы будет этот же интервал плюс ширина пробела.
Варианты решения этой задачи.
1. margin-left (отрицательный) — свойство, с помощью которого можно сдвинуть пункты влево, как бы друг на друга, "избавившись" от пробела между ними.
Недостаток: в разных версиях браузеров могут быть микроскопические отличия, которые тем не менее могут сломать верстку при изменении шрифта или его размера.
В случае фиксированных размеров приемлемый вариант.
2. font-size — свойство, задающее размер шрифта, с помощью которого нашему пробелу (символу) можно выставить размер шрифта, равный нулю, и тем самым сделать его настолько маленьким, что его попусту не будет видно.
Выставляем размер шрифта у обертки-родителя (например ul) в ноль.
Не работает в Safari. Для лечения прописываем родителю display: table.
Соответственно такое решение тянет за собой ряд подводных камней, о который придется помнить при дальнейшей модификации этих элементов верстки.
3. letter-spacing — свойство, определяющее интервал между символами. По умолчанию (normal) задаёт обычный интервал, исходя из размера и типа шрифта.
Можно подогнать отрицательный letter-spacing у родительского элемента (например для Verdana это -.36em). Но это не работает в Opera.
Работает в комбинации с предыдущим решением с font-size. Но опять-таки, в Safari может быть баг, из-за которого некорректно работают относительные величины (em).
Так что способ display:table + font-size предпочтительнее.
4. word-spacing — свойство, определяющее интервал между словами.
Можно попробовать выставить отрицательный word-spacing у родителя, но появляются похожие проблемы, как и в случае использование letter-spacing. На этот раз Safari и Chrome выдают некорректные результаты.
Решается заданием родителю display:table.
5. Прижать элементы друг к другу, т.е. вплотную, тег к тегу, и таким образом убрать межссловный интервал. Либо поставить комментарии между элементами, тем самым убрав между ними отступы.
Недостатки понятны.
6. Не писать закрывающие теги.
Оригинально. Но валидатору это очевидно не понравится.
Законспектировал 36 строк, 3614 символов. (Оригинальная статья 455 строк, 27634 символа)
Выводы: из-за того что разработчики браузеров не могут реализовать этот несчастный стандарт w3org, мне приходится разбираться во всяких хаках и костылях. Это нихуя не интересно и непрактично. Поэтому в верстке я выберу быдлокодерский путь, а именно тупое запоминание готовых решений.
Одно дело программирование, где каждое приложение уникально и интересно, там да, можно подумать над его реализацией, поломать голову как сделать лучше и надежнее.
А верстка сама по себе неинтересна, и тратить время на заучивание "особенностей" (ошибок) браузеров - не рационально и неинтересно. В конце концов я не верстальщик.
По самой статье: там разбирается несколько "хаков", то есть обходных решений, чтобы избавиться от ошибок в браузерах.
Я для себя выбрал следующий способ: родительскому элементу выставить font-size:0, а у элементов с inline-block соответственно переопределить размер шрифта на нужный. Так мы убиваем пробелы, но проявляются косяки разработчиков Safari. Чтобы этого "бага" избежать, применяем правило display:table родительскому элементу. Что за собой тянет ряд особенностей данного типа поведения, о которых необходимо помнить.
--------------------------------------------------------------------------------------------------
Мой конспект статьи (не знаю, зачем его сюда копипастщчу, наверное из упрямства, чтобы показать, что нужно излагать свои мысли лаконичнее, и не графоманствовать).
В верстке существует проблема с интервалами (пробелами), которые вставляются между словами.
Эти пробелы часто мешают нам при вёрстке того или иного блока. Избавиться от них бывает не так-то просто.
В этой статье мы рассмотрим, что такое inline-block, и почему после себя он ставит эти непонятные интервалы. Ну, и, самое главное, мы увидим несколько универсальных решений данного вопроса и,конечно же, обсудим все их стороны.
inline-block — представляет собой блок, с поведением строки, т.е. по сути является строчно-блочным элементом.
Строчное поведение inline-block позволяет ему оставаться в одной строке с другими строчными элементами, например <span>-ом или попусту сливаться с обычными буквами, т.е. вести себя, как текст в строке.
Ну а благодаря своим блочным способностям, inline-block-у можно смело задавать любые свойства, которые присущи блочным элементам: ширину, высоту, верхний и нижний margin, например, уже будет действовать, как у блоков.
inline-block — как буква
Одна из главных вещей, которые вы должны знать, это то, что inline-block — является по сути обычной буквой — символом, т.е. весь наш строчный блок составляет всего лишь одну букву в строке, одну единицу. Даже не смотря на то, что содержит в себе кучу других символов или элементов. Именно по этой причине inline-block не "разрываются", как строчные элементы, а переносятся на следующую строку целиком. Ну и соответственно, если рядом с inline-block не будет пробелов, то расстояние между ним и соседними буквами будет обычный межбуквенный интервал (трекинг), которым можно управлять (кернинг). Если есть пробелы — до соседней буквы будет этот же интервал плюс ширина пробела.
Варианты решения этой задачи.
1. margin-left (отрицательный) — свойство, с помощью которого можно сдвинуть пункты влево, как бы друг на друга, "избавившись" от пробела между ними.
Недостаток: в разных версиях браузеров могут быть микроскопические отличия, которые тем не менее могут сломать верстку при изменении шрифта или его размера.
В случае фиксированных размеров приемлемый вариант.
2. font-size — свойство, задающее размер шрифта, с помощью которого нашему пробелу (символу) можно выставить размер шрифта, равный нулю, и тем самым сделать его настолько маленьким, что его попусту не будет видно.
Выставляем размер шрифта у обертки-родителя (например ul) в ноль.
Не работает в Safari. Для лечения прописываем родителю display: table.
Соответственно такое решение тянет за собой ряд подводных камней, о который придется помнить при дальнейшей модификации этих элементов верстки.
3. letter-spacing — свойство, определяющее интервал между символами. По умолчанию (normal) задаёт обычный интервал, исходя из размера и типа шрифта.
Можно подогнать отрицательный letter-spacing у родительского элемента (например для Verdana это -.36em). Но это не работает в Opera.
Работает в комбинации с предыдущим решением с font-size. Но опять-таки, в Safari может быть баг, из-за которого некорректно работают относительные величины (em).
Так что способ display:table + font-size предпочтительнее.
4. word-spacing — свойство, определяющее интервал между словами.
Можно попробовать выставить отрицательный word-spacing у родителя, но появляются похожие проблемы, как и в случае использование letter-spacing. На этот раз Safari и Chrome выдают некорректные результаты.
Решается заданием родителю display:table.
5. Прижать элементы друг к другу, т.е. вплотную, тег к тегу, и таким образом убрать межссловный интервал. Либо поставить комментарии между элементами, тем самым убрав между ними отступы.
Недостатки понятны.
6. Не писать закрывающие теги.
Оригинально. Но валидатору это очевидно не понравится.
Ясно, значит это искусственный разум. ПХП программисты все-таки смогли его сделать, чтобы было удобно передавать свой опыт другим.
Как решить вторую задачу? http://archive-ipq-co.narod.ru/i-am-smart.html
Через explode("," $str) я смог получить массив, но вида "порядковый номер" => 'intKey'=6. Дальше никак.
Вангую, он один из разрабов PHP или кодит какой-нибудь известный фреймворк в опенсорсе.
Он хотел сказать, что кодить лучше давай пойдем, а не выбирать на кого тут аноны мастурбировать будут, на котейку или собаку.
https://jsfiddle.net/3jok8w7k/4/
Убрал пробелы при помощи font-size:0 и display:table у родителя.
В шестом задании применил clearfix-метод против выпадения плавающих блоков.
http://jsfiddle.net/8mk9bc62/1/
Девятое:
>сделай это клеарфиксом, как написано в подсказке под задачей
>убери div-обертку над текстом
http://jsfiddle.net/9grpj1hf/1/
Одиннадцатое.
>Ты поверх скругленного label выводишь квадратный серый span вот он и закрывает уголки. Увеличь масштаб и увидь.
Да блин вижу я это, вижу. Но не знаю как исправить.
Пойду лучше учить фреймворки, в жопу верстку.
> Да блин вижу я это, вижу. Но не знаю как исправить.
Очевидно скруглить уголки у спана тоже.
Думал об этом, но меня останавливало то, что радиусы могут не совпасть. Это ведь концентрические окружности, у них по идее разные радиусы.
Ну ладно.
http://jsfiddle.net/9tLfgyej/3/
В шрифтах не разбираюсь, поставил ариал, хотя это явно не он.
Что касается тени, то на картинке в задании не могу рассмотреть, как она должна выглядеть: кажется, у верхней рамки тень сильнее, справа и слева слабее, а внизу едва заметна. Не знаю, как это реализовать. Сделал простой box-shadow.
Что-то я не в форме сегодня. Надо поспрать.
Хотя в общем я доволен. Хоть и заманался с этими вашими "задачками", узнал много нового об инлайн-блоках, анимации/transition, псевдокласс :checked и т.д.
Пасть закрой, макака.
в лецо мне это сказать не зассыш?
Ебать я мудак, есть же Trim.
Сильно не бейте, я джве недели как начал что то пытаться писать.
Нет. В говноконторах, где верстку от бэкендов требуют, уровень верстки обычно на уровне видеолекций из вконтакта, там пойдет любой вводный курс или копипаст темплейтов. А в нормальных конторах распределение обязанностей четкое, и бэкенды обычно ничего не верстают.
Кто бэкенд? Ты бэкенд.
Они не верстают не потому, что не умеют, а потому что выгоднее отдать это верстальщику. А вы лентяши просто учиться не хотите. Хороший специалист это фуллстек специалист, посмотрите например кого ищут калифорнийские стартапы — там слишком разборчивых клоунов которым нужен персональный верстальщие и написатель SQL запросов, не жалуют.
Благодарю.
Фронтенд отдельная профессия и в калифорнийских стартапах везде отдельный фронтенд есть, либо на аутсорс профессиональному фронтенду отдают. Смысл давать бэкенду задачи фронтенда нет, даже если он фуллстек, он все равно как профессиональный фронтенд не сработает, у которого на этом специализация ежедневная. Так что бэкенда фронтендом заставляют работать только в совковых говноконторах, где за любую копейку трясутся, но никак не в калифорнийских стартапах, где бабла на зарплаты не жалеют.
Нужен конкретный пример.
>>526597
> Так что бэкенда фронтендом заставляют работать только в совковых говноконторах
Так верстальщики же дешевле стоят, где экономия? А фуллстек нужен чтобы он мог при разработке фичи сразу и серверный код написать, и запрос написать, и аяксовое окошечко приделать не тратя времени. А фронтендеры занимаются более глобальными вещами вроде верстки больших разделов или подготовки набора виджетов.
А в арче yaourt -S phpstorm, лол.
>Нужен конкретный пример.
Я тот кун который делает макет. Сел исправлять ошибки и сейчас занимаюсь кнопкой SEE PORTFOLIO. Возможно маргин на ней не работает потому что это тег <a>.
Посмотреть код можно здесь.
http://maketi.esy.es/
Только предупреждаю, что исправляю все в онлайн режиме и скоро код там будет уже другой, но пока минут 10 трогать ничего не буду. Как видно на кнопку я поставил маргин-топ 1000 и никакого эффекта, так что это даже не схлопывание.
мамку твою ипал
Фронтенды занимаются как раз версткой + всякие css тулы, клиентские фреймворки, бутстрапы и javascript c библиотеками. Бэкенды занимаются серверной стороной, БД, архитектурой и оптимизацией. Всю верстку и сопутствующую поебень бэкенд получает готовой, остается только в шаблоны ее всунуть (а часто и этим фронтенд занят, ибо шаблоны специально под них пишутся доступным языком). У фронтенда колоссальный опыт и он свои задачи выполняет быстрее и профессиональнее, причем стоит дешевле бэкенда. Если бэкенда сажают делать и то и другое, выходит хуже в фронтеде, плюс страдает бэкенд, поэтому отдельного фронтенда нет только в самых говнистых конторах.
Но унтерменш тут только ты.
Ссылка это инлайн-элемент по умолчанию. У инлайн элементов нельзя задавать высоту, ширину (она определяестя заключенным в него текстом), вертикальные маргины. Вертикальные паддинги можно задавать, но они не влияют на раскладку, а только на размеры закрашенной фоном области.
Горизонтальные маргины и паддинги работают.
В твоем случае кнопка должна быть помещена внутрь блочного элемента.
Также, я вижу, ты явно пропустил изучение основ CSS. Ты сдавал предыдущие задачки? Читал этот учебник? http://softwaremaniacs.org/blog/category/primer/ Если нет, то прочти, он небольшой но очень полезный. И про особенности инлайновых элементво там по моему написано. А если этого мало то есть такой хороший подробный цикл статей:
http://css-live.ru/articles/vvedenie-v-inlajnovyj-kontekst-formatirovaniya-ikf-osnovnye-ponyatiya-1-ya-publikaciya-cikla-tajny-css2-1.html
http://htmlbook.ru/samlayout/blochnaya-verstka/strochnye-elementy
> У фронтенда колоссальный опыт
Опыт перестановки CSS свойств наугад пока не заработает и опыт верстки толкьо под последнюю версию сафари.
Да что собственно сложно в этой верстке? Там учить нечего, все CSS тэги за один вечер учатся вместе с адаптивностью, бутстрап и жквери туда же. Да и что уж говорить, никому на постсоветском пространстве эта красота с плагинами, скролами и свг не упала. Те, которые высокооплачиваемые фронтендеры, должны еще в дизайн, свг и рисование логотипов и макетов уметь, уже не говоря про хорошее знание js. Мне лично js со всеми его фреймворками не нравится (они еще и бэкэнд на нем делают, лол). Проэтому фронтендеров я презираю, а верстка - вообще однотипное говно, где все за вечер учится и больше там учить нечего, рутинно одно и то же повторяешь.
Ну никто и не говорит, что фронтенд особо сложен. Все же до профессионального фронтенда у тебя несколько дольше уйдет, чем пару дней, погугли что-ли блоги нормальных фронтендеров или доклады с их конф. В фирмах есть четкое деление и на всем фронтенде сидит отдельный чувак, а в крупных и несколько. Так выходит выгоднее для фирмы, чем бэкенда нагружать несвойственными ему задачами.
Я читал статьи на htmlbook, потом решал те 12 задач, но сюда не присылал и вот взялся за макет.
Почитай учебник на softwaremaniacs, он небольшой, но многие важные вещи освещает. Ну и не страшно что ты пока делешь ошибки, ты же начинающий. Если что, потом еще какой-нибудь макет сверстаешь.
И кстати освой инспектор в браузере (Ctrl + Shift + i). Многие вещи можно делать через него, например менять стили и сразу же видеть результат, удобно.
Статья: http://habrahabr.ru/post/143767/
Кстати, по поводу шаблонов. Я вот смотрю, некоторые шаблоны еще хуй распарсишь.
Я пользуюсь инспектором.
Я там бывает поэксперементирую, а потом сохраняю в нотпаде и гружу на сайт. Хотя обычно гружу каждый раз, когда что-то меняю. Я так с самого начала делал и уже дискомфорта не чувствую, до автоматизма дошло.
И спасибо за литературу, все ссылки сохранил, пожалуй даже ознакомлюсь сначала с учебником а потом продолжу исправлять макет.
Да вот только в верску любой школьник может, а заказов по сравнению с исполнителями гораздо меньше. На любом бутстрапе можно магаз написать.
Тебе не обязательно кстати что-то выгружать на сайт. Ты можешь просто с диска перетащить html файл в браузер и он откроется.
>xfce
Может у тебя в контекстном меню включен пункт "Приложения" ("Applications" или как-то так, не помню)?
Ничего, флоаты и блочные элементы со времен CSS2.1 не изменились и сам CSS3 это набор расширений для CSS2.1
Попробуй Brackets. Live update там очень хорошо работает. Видишь все без перезагрузок и сразу.
>Ты сдавал предыдущие задачки?
Я вот только вкатываюсь, начиная с каких задачек можно сдавать решения в тред?
Эту http://codepad.org/aLSx8geV про депозит на миллион можно проверить?
нюфак
О, точно.
Погуглил, когда-то в этом xfce-appfinder был баг https://bugs.launchpad.net/ubuntu/+source/xfce4-appfinder/+bug/1048805
Говорят его лечить при помощи
xfconf-query -c xfce4-keyboard-shortcuts -p '/commands/custom/<Alt>F2' -s "xfrun4 --disable-server"
Что-то не особо помогло. Вроде стало быстрее, но тоже не мгновенно.
Как бы его вообще отключить.
Мимо, я сижу тута не вылезая. Пыху учу, js, немного вёрстку.
...Алсо, у меня тоже бубунта, но с юнити. Ничего не тормозит. Ну только панель ПОИСК НА КОМПЬЮТЕРЕ И В ИНТЕРНЕТЕ бывает тормозит. Но кому она нужна?
азазаза)
Нет, лучше уже тогда мак.
>>526686
В каких настройках? Лучше команду для терминала.
Спросил в треде линукса, там какие-то дауны, спорят какой дистрибутив круче. Они наверное этим все время занимаются.
>>526688
Да, речь именно о долбанном "поиске", который зашит в контекстное меню мыши и главном меню.
>В каких настройках?
Не помню, сейчас xfce у меня нет, но когда ставил, как-то быстро нашёл этот пункт в настройках. Не в редакторе настроек, а в аналоге виндовской панели управления вроде.
Представьте, что вы купили шикарный автомобиль, но чтобы на нем ездить вам необходимо каждый день что-то там подкручивать, лазить под капот, ковыряться в двигателе.
О маке не знаю почти ничего, но в моих маня-мечтаниях это тот же юникс, но за деньги меня избавят от геморроя ковыряния с ним.
Надо бы почитать о нем сначала, вдруг там не все так радужно.
>Да, речь именно о долбанном "поиске", который зашит в контекстное меню мыши и главном меню.
Я про такой поиск.
>каждый день что-то там подкручивать
Но нахуя?
Маны читать требует разве что. Наугад накликать не получится точно.
Алсо xfce действительно кривоват. Я ушёл на gnome 3.
1. html/css
2. javascript
3. jquery
4. sql
5. unix bash
6. apache, nginx
7. git, composer
8. basic php, oop
9. frameworks
10. english intermediate
Чтобы проверить теорию загугли "вопросы на собеседованиях php".
Ну и нужно что-то написать для пробы.
Пройди учебник, уроки, задачи и ссылки из оп-поста, и считай ты принят.
OSI, TCP/IP, HTTP забыл.
1. Не могу в адаптивную верстку, но про теги, селекторы знаю. Пару резиновых сайтов для своих проектов слепил.
2. ЖС на уровне одного консольного мини-приложения на ноде.
3. Делал пару аjax-форм.
Зачем вообще весь этот фронтэнд, который выше?
4. Вроде тут все норм, делал бд, читал/добавлял/удалял.
5. Последний год живу на убунте, с консолью хорошо знаком.
6. Связку LAMP ставил одним пакетом из репозитория, что еще нужно?
7. Завел проект на гитхабе, залил туда пару проектов, в общем знаю про VCS.
8. Около месяца-двух опыта на чистом пхп, ООП использую еще с питона.
9. Не видел в глаза ни одного фрейворка.
10. Плохо изъясняюсь, но хорошо понимаю/читаю инглиш.
Худо-бедно подхожу под требования, но что с фреймфорками? Погуглил, сейчас везде просят Laravel/Symfony, за сколько их можно освоить? Просто очень нужна работа в ближайшее время хотя бы за минимальные деньги.
Более-менее, если из Москвы или Питера то возьмут за минимальные деньги.
Но без фреймворков никак, на голом php никто не пишет.
Yii/Laravel за месяц-полтора, Симфони сложнее конечно, и требует знания других вещей (doctrine например).
Пиши, звони, ходи на собеседования.
Помогите с регуляркой, кто может.
/<.(\w{3}).>/im
текст: < azaza azaz oza aza rr > aza aza aza
нужно что бы в "кармашки" пападало и oza и aza. В текущем состоянии попадает только последнее.
Спасибо!
Почему символы русского алфавита у меня на локальном компе (PHP 5.4.44 в режиме built-in web server, Windows XP) занимают два байта (пик), а на айдеоне один байт? http://ideone.com/2AsANE
Дело в настройках интерпретатора? В php.ini у меня default_charset = "UTF-8"
Есть функции, которые считают количество символов в строке, а не байт?
>функции, которые считают количество символов в строке
Нашёл iconv_strlen(), но она даёт тот же результат, что mb_strlen() — на локальном компе показывает 12, на айдеоне 6.
Кодировка для mb-функций устанавливается с помощью mb_internal_encoding(). Мануал: http://php.net/manual/ru/function.mb-internal-encoding.php
Скорее всего, по умолчанию у тебя стоит не utf-8.
Сделай echo mb_internal_encoding(). Если выведет НЕ "UTF-8", прописывай в начале скрипта mb_internal_encoding('utf-8');
>>526734
Понял.
Можно же указать mbstring.internal_encoding = UTF-8 (и iconv.internal_encoding = UTF-8) в php.ini.
Но наверное это может быть чревато проблемами в случае, если не будет возможности настраивать php на реальном хостинге или если проект сложный/старый и в других скриптах используется, например, стандартная ISO-8859-1?
Получается, лучше всегда объявлять кодировку в начале скрипта и не трогать глобальные настройки?
>Deal with it
А если исключить элементы с пустыми строками?
preg_split("//u", $text, 0, PREG_SPLIT_NO_EMPTY);
В задаче «Лев Толстой» (http://ideone.com/ao47z3) уместно использовать array_rand()?
- Нужно отправлять письмо и файл на сервер за нажатие кнопки;
Причем:
- файл должен загружаться, меняться имя на unix дату и отдавать ссылку на файл (не на страницу, а в принципе, из финальной папки);
- письмо должно улетать адресату уже со ссылкой на файл;
Не могу домозговать порядок ебучих процедурок. Как бы это выглядело в законченном виде?
- Загружается во временную;
- Перемещается в конечную папку;
- Переименовывается;
- Отправляем письмо со ссылкой на файл;
И ещё не понимаю как с помощью pathinfo получить расширение файла, заебался чет.
Информация о загруженный пользователем файле попадает в массив $_FILES, переместить (и соответственно переименовать) файл можно при помощи функций типа move_uploaded_file. Подробно здесь:
http://php.net/manual/ru/features.file-upload.post-method.php
Временную метку возвращает time http://php.net/manual/ru/function.time.php
Письмо отправляется при помощи функции mail. Естественно нужен почтовый сервер.
http://php.net/manual/ru/function.mail.php
Функция pathinfo
http://php.net/manual/ru/function.pathinfo.php
Полагаться на расширение небезопасно, потому что хакер может загрузить php-скрипт под невинным расширением (или вообще без него). Лучше проверять mime-тип (например объектом finfo, есть еще сторонние библиотеки типа getId3).
В базу ты ничего не собираешься записывать что ли?
> В базу ты ничего не собираешься записывать что ли?
Не, нахуй. Там просто надо долбоёбам файл отдать. По уму - в базу бы, но нет необходимости.
> Полагаться на расширение небезопасно
Тоже так думаю. А то чет прост увидел pathinfo, решил попробовать.
> файл должен загружаться, меняться имя на unix дату
Ты так ненавидишь своих пользователей?
> не понимаю как с помощью pathinfo получить расширение файла,
Мануал по функции читал?
Пости код хоть какой, а мы уже советовать будем, что поправить/доделать. Смысла нет болтать без кода.
Делать описание элементов по порядку, как они идут в html или группировать по типу:
-шрифты
-цвета
и т.д.
По смыслу - шапка, футер, меню навигации, страница логина, страница создания заказа и т.д. Каждая группа в отдельном файле, собирать через gulp / фреймворк.
Алсо, верстка по бэм.
мимо-3-года-веб-макака
Каким в пизду рекурсивным?
Что будет в этом случае:
{} = {};
Правильно - будет создана ссылка, а изменение первого затронет остальные и наоборот.
Когда-то давно встречал ссылки на пошаговый видеокурс типа от 1 (простого) до 4 (гуру), подскажите название? (Обучение+лабы) Помнится анон весьма лестно отзывался об этом курсе.
Игорь Борисов / учебный центр "Специалист", курсы php 1-4 (трекер nnm-club.me, на рутрекере кажется закрыли копирасты).
Годится только если ты полный новичок. Никакого "гуру", дает базовые джуниорские знания. Разве что на четвертом курсе пытается объяснять паттерны и mvc, крайне неудачно на мой взгляд.
Да, в этом треде.
В оп-посте учебник и задания разных уровней сложности, ссылки на полезные статьи и т.д.
Читай учебник, решай задачи, выкладывай в тред.
Тред постоянно мониторят 1-2 сеньора, подсказывают и дают советы по решению. Сам понимаешь это лучше всяких дурацких курсов.
мимо-начинающий
Какой еще "обход"?
Получить все записи из бд можно простым sql-запросом "SELECT х FROM tbl_name".
Для работы с бд есть объект pdo с соответствующими методами.
http://php.net/manual/ru/book.pdo.php
Результат может быть как массивом, так и объектом, даже пользовательского класса. Это задается при помощи setFetchMode.
Если записей в таблице реально много, то наверное лучше выдергивать их по частям в цикле.
мимо-нуб
Я имел в виду парсер для стороннего сайта.
Неточно выразился, простите.
Там таблица в HTML, надо ее спарсить и занести в массив/переменные, чтобы потом вывести.
DOM в php
http://php.net/manual/ru/book.dom.php
Если тебе нужно спарсить контент какого-то говносайта, то наверное ради него не стоит париться, а использовать готовые библиотечки, например
http://habrahabr.ru/post/176635/
https://ideone.com/IYkhZ3
И короче никак в них не врублюсь. Во-первых, это каждый раз такой адок нужно будет составлять? Мб упростить как-то можно? Во-вторых у меня не до конца правильно, что исправить?
Нужно почитать про функции в JS: https://learn.javascript.ru/function-basics
Если ты про этот пункт
> А, еще, сделай тогда, чтобы в качестве gen можно было указать функцию с аргументами, и при вызове
> Эти аргументы бы передавались функции gen. Аргументов может быть любое количество.
То надо почитать про псевдопеременную arguments и методы call/apply:
https://learn.javascript.ru/arguments-pseudoarray
https://learn.javascript.ru/call-apply
>>527050
Твое выражение неверное, оно определяет правильные номера как неправильные и наоборот.
> Во-первых, это каждый раз такой адок нужно будет составлять?
А не надо составлять такое сложное выражение. Надо написать: номер начинаеся с +7 или 8, за ними идут ровно 10 цифр между которыми может быть любое число скобок, минусов, пробелов.
Есть ссылка: http://site.ru/a/b/c/d/1.html
Нужно спарсить только b и 1.
Каким образом это сделать?
Нужны только эти значения чистые, без слешей и расширения страницы.
>>527059
Короче это шаманство какое-то, убираю пробел - одни результаты, ставлю - другие. Сам цикл же правильный у меня?
https://ideone.com/IYkhZ3
>>527060
Просто удобнее, регистр менять не надо.
реквест урле $this->route
$this->route = explode('/', $path);
$this->route[1]
че за вопросы тупые и нубские?
Трусы на голову однь, обосрешся еще, а они тебя запомнят и опознают.
$site = 'http://site.ru/a/b/c/d/1.html';
preg_match('/site\.ru\/[a-z]{1}\/([a-z]{1})\/[a-z]{1}\/[a-z]{1}\/([a-z0-9_]+)\.html/',$site,$matches);
echo $matches[1] . '<br>' . $matches[2];
Так это делается.
А лучше даже так:
$site = 'http://site.ru/a/b/c/d/1.html';
preg_match('/site\.ru\/[\w]+\/([\w]+)\/[\w]+\/[\w]+\/([\w]+)\.html/',$site,$matches);
echo $matches[1] . '<br>' . $matches[2];
Задание на файлообменник сделал? Там используется slim или silex. Это микрофреймворки, с них нужно начинать.
Я хуею, когда нубы после изучения синтаксиса хватаются за symfony или zend, а потом жалуются, что нипонятно.
Strawberry банк неправильно посчитан, должно 61336.87 выйти.
>$StrawberryBankTotal
Переменные с маленькой буквы начинать надо. Имена классов с большой.
Какой прасти синтаксис, я уже два сайта на ООП и MVC написал, нахуй пошел со своим обменником. Задания научись сначала давать правильно, обрыган.
слишком сложное задание для тебя, попробуй еще поучить фреймворки и поделать сайты.
Никаких фреймворков, только велосипеды.
Дебильное задание. Я еще могу понять, что время смайла отслеживается через функцию date(), но как его привязать к началу видео? Можно конечно с момента нажатия кнопки проиграть выставить функцию daеe(),а потом вычесть из этого дату смайлика. Но что если видео остановят? Что если начнут сначала, что если несколько пользователей будут проигрывать, то значит каждого ложить в куки и вызывать ему отдельно эти функции? У меня бы вышел лютейший гонокод.
Картинки через <img src="adreskartinki"> вставляй.
Напиши скрипт, который странички их парсит и ссылки все найденные обходит. Где найдет <?xml, там значит оно.
Гуглит кусок текста, переходит по ссылкам, парсит и сравнивает строки. Текст себе в базу добавляет, чтобы следующий раз не гуглить.
Сосака хайлоад сайт же. В хайлоаде проблема не в том, чтобы подгрузку сделать, а чтобы сайт не падал, когда эта подгрузка начнет у тысяч анонов сама включаться.
http://ideone.com/1qqCxO
Нет, мне надо xml многих сайтов, хочу создать агрегатор товаров с разных сайтов, звонить же каждому не будешь.
Данное расширение устарело, начиная с версии PHP 5.5.0 и не поддерживается. Юзай PDO или mysqli.
Если в очередь ставить все запросы к гуглу и из очереди с достаточно большим временным интервалом обрабатывать, то не забанят. Юзеру в это время крутить какой-нибудь индикатор обработки на js.
function longdate($timestamp)
{
return date("l F jS Y", $timestamp);
}
echo longdate(time());
?>
В результате выполнения этого кода, я получаю ошибку
>PHP Fatal error: date(): Timezone database is corrupt - this should never happen! in /home/Yzj5mx/prog.php on line 4
Что с ним не так? Ведь просто создается функция, а потом вызывается результат с параметром, так почему же не работает?
Перейди на php.net и узнай, как работает функция date, чему соответствуют паттерны типа l F jS и т.д.
Не копируй код, если не понимаешь как он работает. Если это какой-то учебник, где дают код без объяснений, выбрасывай его.
Здесь проблема в Timezone, настройках даты/времени на твоем компьютере. Автор очевидно американец, и о существовании других временных зон не догадывается, или пренебрегает.
Проверь, у тебя все нормально с локалью? ( https://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C )
Вбей в терминале команду locale, в первой строке должно быть что-то вроде LANG=ru_RU.UTF-8
В php-скрипте попробуй setlocale(LC_ALL, 'ru_RU'); или setlocale(LC_ALL, 'ru_RU.UTF-8');
Поищи в php.ini строку date.timezone. Если ее нет, пропиши сюда настройку для своего часового пояса.
http://profiphp.ru/directives/4-date_timezone.html
Не забудь перезапустить сервер (sudo service apache2 restart)
> /home/Yzj5mx/prog.php
Блджад, это же идеоне, а я ему о настройках локали и php.ini
Тогда это вопрос к опу, почему идеоне не работает с функциями времени.
У меня работает твой код, выдает Sunday August 9th 2015. Попробуй другую сборку PHP скачать.
я правильно понял, что push с опцией -u нужно писать только первый раз, чтобы оно в .git/config прописало для текущего бранча репозиторий?
Дальше можно писать просто git push, "оно само" разберется какой remote и какой бранч соответствует данному?
Благодарю тебя анон, но я таки пользователь окошек, но разберусь.
> l F jS
Чмтал.
>Если это какой-то учебник, где дают код без объяснений, выбрасывай его.
Пикрелейтед, разжёвано неплохо, но локализация страдает, да. Взял эту книгу для того, что бы понять как эти все технологии работают вместе, и для начальных знаний. ООП буду познавать позже.
По отдельности конечно.
Если собираешься работать программистом, то на работе естественно не будет никаких денверов, да и виндоус тоже не будет.
Сборки для быдлокодеров-фрелансеров, которым насрать, что их приложение не будет работать на реальном сервере.
Поставь себе детский линукс какой-нибудь.
Ставь сборку xampp для линукса. Будет почти как на реальном серваке все.
http://www.oldnix.org/install-xampp-linux/
Не обязательно. Мануал в этом плане как-то особенно уклончив: http://php.net/manual/ru/function.include.php но из него видно что есть разница между например формами './dir/file.php' и 'dir/file.php'. Потому надежнее нормально прописать полный путь.
> Оно итак ведь включает тот же файл, что лежит в той же папке по дефолту.
А ты уверен что это именно папка с файлом в котором написан require, а не папка в которой лежит index.php? Это могут быть разные папки вообще-то.
>>523911
Если брать не тренды в гугле, а число вакансий и заказов на fl.ru то лаварел в глубоком проигрыше. Похоже что у него либо пиара больше либо на нем только хобби проекты делают.
>>524119
Не делай. Умение скачивать и распаковывать архивы у тебя останется в любом случае.
>>524121
Slim
> Появление смайликов))))))00 должно быть реализовано с помощью AJAX, ну это и понятно.
Мне не понятно, по моему данные о смайликах проще изначально внедрить в страницу, минус один запрос к серверу, минус время на написание обработчика запроса.
>>524214
Тестовое задание проверяет твои знания. Если ты его не можешь сделать, ты и с работой не справишься.
>>524236
> PHP, отдающий смайлы
Проще сразу JSON со смайлами в страницу внедрить
>>524245
Завидуют наверно.
>>524249
Такой сайт уже есть, banki.ru и не знаю, разрешит ли он тебе с него собирать данные. А для официаьного курса ЦБ у них на сайте есть API.
>>524251
Они пишут плохой код не потому что быстро, а потому что у них низкий уровень знаний, они мало времени уделили обчуению, они исплоьзовали некачественные учебные материалы (авторы которых сами не очень грамотные), также возможно из-за низкого культурного уровня (люди не думают о тех кому потом придется поддерживать код). Выдели им в 3 раза больше времени — получишь то же. Опытный программист прекрасно умеет делать «сейчас», при этом минимизируя урон нанесенный архитектуре.
Да и справедливости ради, какая архитектура в вебе? MVC + фреймворки используй, вот и вся архитектура, придумывать ничего не надо, все уже придумано.
>>524259
Дополню, в вебе все архитекутуры давно придуманы, надо просто взвесить плюч и минусы и выбрать подходящее решение.
>>524261
> Например тут у меня пример чистого макакства.
Да, потому что ты не использовал микрофреймворк, а решил лепить все чистым PHP. Но то, что ты используешь плейсхолдеры в запросах, уже большой плюс.
>>524267
Это его выбор, он выбирает верстку сайтов под вордпресс, мы выбираем карьеру профессионального фуллстек разработчика.
Не обязательно. Мануал в этом плане как-то особенно уклончив: http://php.net/manual/ru/function.include.php но из него видно что есть разница между например формами './dir/file.php' и 'dir/file.php'. Потому надежнее нормально прописать полный путь.
> Оно итак ведь включает тот же файл, что лежит в той же папке по дефолту.
А ты уверен что это именно папка с файлом в котором написан require, а не папка в которой лежит index.php? Это могут быть разные папки вообще-то.
>>523911
Если брать не тренды в гугле, а число вакансий и заказов на fl.ru то лаварел в глубоком проигрыше. Похоже что у него либо пиара больше либо на нем только хобби проекты делают.
>>524119
Не делай. Умение скачивать и распаковывать архивы у тебя останется в любом случае.
>>524121
Slim
> Появление смайликов))))))00 должно быть реализовано с помощью AJAX, ну это и понятно.
Мне не понятно, по моему данные о смайликах проще изначально внедрить в страницу, минус один запрос к серверу, минус время на написание обработчика запроса.
>>524214
Тестовое задание проверяет твои знания. Если ты его не можешь сделать, ты и с работой не справишься.
>>524236
> PHP, отдающий смайлы
Проще сразу JSON со смайлами в страницу внедрить
>>524245
Завидуют наверно.
>>524249
Такой сайт уже есть, banki.ru и не знаю, разрешит ли он тебе с него собирать данные. А для официаьного курса ЦБ у них на сайте есть API.
>>524251
Они пишут плохой код не потому что быстро, а потому что у них низкий уровень знаний, они мало времени уделили обчуению, они исплоьзовали некачественные учебные материалы (авторы которых сами не очень грамотные), также возможно из-за низкого культурного уровня (люди не думают о тех кому потом придется поддерживать код). Выдели им в 3 раза больше времени — получишь то же. Опытный программист прекрасно умеет делать «сейчас», при этом минимизируя урон нанесенный архитектуре.
Да и справедливости ради, какая архитектура в вебе? MVC + фреймворки используй, вот и вся архитектура, придумывать ничего не надо, все уже придумано.
>>524259
Дополню, в вебе все архитекутуры давно придуманы, надо просто взвесить плюч и минусы и выбрать подходящее решение.
>>524261
> Например тут у меня пример чистого макакства.
Да, потому что ты не использовал микрофреймворк, а решил лепить все чистым PHP. Но то, что ты используешь плейсхолдеры в запросах, уже большой плюс.
>>524267
Это его выбор, он выбирает верстку сайтов под вордпресс, мы выбираем карьеру профессионального фуллстек разработчика.
>Slim
ОП, а его изучение даст мне что-то в сравнении с изучением Silex, например?
Просмотрел оглавления мануалов, вроде возможности обоих примерно одинаковые. Да и в целом они довольно похожи, как мне показалось.
А то скоро файлообменник делать буду, а фреймворк всё никак не выберу.
Денвер - костылль для винды
Я набираю в гугле «web proxy» и открываю через него. Браузерные расширения это бекдоры, VPN читает весь твой трафик. А веб прокси маусимум рекламу вставит.
>>524214
Кстати обратите вимание, на комментарий в статье:
> За последнее время провёл с два десятка собеседований на вакансию пхп-джуна. В итоге взяли двоих, хотя собирались одного — не смогли выбрать :). Что их выгодно отличало от остальных:
> — начальные знания ООП, некоторых паттернов ООП и архитектурных (больше половины кандидатов вообще сказали, что об ООП ничего сказать не могут — не было необходимости, остальные валились на простейших вопросах типа «что такое инкапсуляция»)
> — без практической необходимости разбирались (пускай и поверхностно) с несколькими пхп-фреймворками (один из них даже начал писать свой в учебных целях, который и показал на собеседовании, что было большим плюсом, собственно последней каплей, приведшей к открытию двух позиций)
> — смогли что-то сказать о нормализации и денормализации таблиц в РСУБД
> — есть базовые навыки использования git
Все это изучается в нашем треде. А вот в сомнительных видеокурсах вас только научат по кнопкам щелкать.
>>524383
На banki.ru есть сервис но без АПИ наверно.
>>524398
Тебе дают PSD, а от тебя ждут образцовый HTML + CSS + JS.
>>524402
Если в старом треде то наверно уже дали. Если нет, перепости ссылку, я мог пропустить.
>>524404
> Все это сохранить в .jpg с нужным качеством
Либо в png или gif в зависимости от ситуации.
>>524431
На западе некоторые дизайнеры сами и верстают (хотя я подозреваю они могут быть не очень хороши как дизайнеры). А верстать в PSD нельзя хотя бы потому что там размер картинки фиксированный, а HTML адаптивный и мржет отображаться на разных устройствах с разными экранами. Есть плагины, которые превращают PSD в HTML, но я не знаю какое качество получается у кода на выходе.
>>524500
> В ближайше годы допишут всё, что надо.
В ближайшие годы нас ждет робореволюция и тотальная автоматизация, работы будет выше крыши. Ну и интернет сейчас используют меньше миллиарда человек из 7. Место для роста еще есть.
>>524784
Не знаю. Не факт что АПИ поможет.
>>524799
>>524798
> $paymenTotal = 0
Точку-запяточку не поставил в конце команды и он думает что for это часть команды:
$paymenTotal = 0 for ($month = 1 ; $month <= 12 ; $month ++) { ...
И не пониамет что это значит.
>>524839
Не знаю, смотря какая у тебя цель. Для HHVM особо много переписывать не придется, а вот для KPHP надо отказываться как минимум от ООП (что по моему фейл).
>>524868
От SQL инъекций используй плейсхолдеры
ПРо XSS https://github.com/codedokode/pasta/blob/master/security/xss.md
Про CSRF https://github.com/codedokode/pasta/blob/master/security/xsrf.md
Ну и при загрузке файлов будь внимателен чтобы тебе php файл или htaccess не закачали.
По хорошему конечно язык и библиотеки должны быть устроены так, чтобы по умолчанию все было наиболее безопасно. В случае с PHP это не так.
>>525010
Офиц док-ю читал?
>>525178
Посмотри дял начала какой HTML код на выходе получается. Алсо у тебя тут XSS, злоумышлениик через шорткод может вставить любой HTML и яваскрипт на страницу. Если к примеру разрешить этот шорткод в комментариях.
>>525190
Код какой-то странный. Почему имена классов с маленькой буквы? Что за названия функций out? Почему используется file_exists хотя логичнее class_exists? Почему include вместо автозагрузчика? Я бы советовал остерегаться учебника который ты читаешь.
Чтобы понять почему код не работает, натыкай там var_dump и посмотри что в какой переменной и сделай вывод почему то или иное условие не срабатывает.
Я набираю в гугле «web proxy» и открываю через него. Браузерные расширения это бекдоры, VPN читает весь твой трафик. А веб прокси маусимум рекламу вставит.
>>524214
Кстати обратите вимание, на комментарий в статье:
> За последнее время провёл с два десятка собеседований на вакансию пхп-джуна. В итоге взяли двоих, хотя собирались одного — не смогли выбрать :). Что их выгодно отличало от остальных:
> — начальные знания ООП, некоторых паттернов ООП и архитектурных (больше половины кандидатов вообще сказали, что об ООП ничего сказать не могут — не было необходимости, остальные валились на простейших вопросах типа «что такое инкапсуляция»)
> — без практической необходимости разбирались (пускай и поверхностно) с несколькими пхп-фреймворками (один из них даже начал писать свой в учебных целях, который и показал на собеседовании, что было большим плюсом, собственно последней каплей, приведшей к открытию двух позиций)
> — смогли что-то сказать о нормализации и денормализации таблиц в РСУБД
> — есть базовые навыки использования git
Все это изучается в нашем треде. А вот в сомнительных видеокурсах вас только научат по кнопкам щелкать.
>>524383
На banki.ru есть сервис но без АПИ наверно.
>>524398
Тебе дают PSD, а от тебя ждут образцовый HTML + CSS + JS.
>>524402
Если в старом треде то наверно уже дали. Если нет, перепости ссылку, я мог пропустить.
>>524404
> Все это сохранить в .jpg с нужным качеством
Либо в png или gif в зависимости от ситуации.
>>524431
На западе некоторые дизайнеры сами и верстают (хотя я подозреваю они могут быть не очень хороши как дизайнеры). А верстать в PSD нельзя хотя бы потому что там размер картинки фиксированный, а HTML адаптивный и мржет отображаться на разных устройствах с разными экранами. Есть плагины, которые превращают PSD в HTML, но я не знаю какое качество получается у кода на выходе.
>>524500
> В ближайше годы допишут всё, что надо.
В ближайшие годы нас ждет робореволюция и тотальная автоматизация, работы будет выше крыши. Ну и интернет сейчас используют меньше миллиарда человек из 7. Место для роста еще есть.
>>524784
Не знаю. Не факт что АПИ поможет.
>>524799
>>524798
> $paymenTotal = 0
Точку-запяточку не поставил в конце команды и он думает что for это часть команды:
$paymenTotal = 0 for ($month = 1 ; $month <= 12 ; $month ++) { ...
И не пониамет что это значит.
>>524839
Не знаю, смотря какая у тебя цель. Для HHVM особо много переписывать не придется, а вот для KPHP надо отказываться как минимум от ООП (что по моему фейл).
>>524868
От SQL инъекций используй плейсхолдеры
ПРо XSS https://github.com/codedokode/pasta/blob/master/security/xss.md
Про CSRF https://github.com/codedokode/pasta/blob/master/security/xsrf.md
Ну и при загрузке файлов будь внимателен чтобы тебе php файл или htaccess не закачали.
По хорошему конечно язык и библиотеки должны быть устроены так, чтобы по умолчанию все было наиболее безопасно. В случае с PHP это не так.
>>525010
Офиц док-ю читал?
>>525178
Посмотри дял начала какой HTML код на выходе получается. Алсо у тебя тут XSS, злоумышлениик через шорткод может вставить любой HTML и яваскрипт на страницу. Если к примеру разрешить этот шорткод в комментариях.
>>525190
Код какой-то странный. Почему имена классов с маленькой буквы? Что за названия функций out? Почему используется file_exists хотя логичнее class_exists? Почему include вместо автозагрузчика? Я бы советовал остерегаться учебника который ты читаешь.
Чтобы понять почему код не работает, натыкай там var_dump и посмотри что в какой переменной и сделай вывод почему то или иное условие не срабатывает.
>Браузерные расширения это бекдоры
Прямо-таки все? Я этим пользуюсь просто, ничего не замечал: https://chrome.google.com/webstore/detail/browsec/omghfjlpggmjjaagoclmmobgdodcjboh?hl=ru
Код расширений никто не проверяет, туда любой мимокрокодил закачать что угодно может. Недавно вскрывалась история, что из пользователей одного подобного расширения ботнет сделали, который кого-то там ДДОСил. Еще они могут пиздить личные данные из браузера и ОС.
Я не смог открыть вторую версию кода, открыл вместо нее http://jsbin.com/yuheteweyi/1/edit?html,js,output
Это неправильно:
> if(power < 1 || power > 100) power = Math.floor(Math.rand() × 100);
Что за ерунда? мы даем неправильные данные на вход и программа вместо того чтобы сообщить об этом, заменяет их на случайные? Чтобы найти ошибку труднее было? Это неправильно, надо выбрасывать исключение при неверных данных.
-----
В FF24 этот кривосайт jsbin не работает. Ну там и быдокодеров понабирали. Уверен, они используют grunt, node и пишут на кофескрипте — это обязательные признаки вестальщика-быдлоокодера.
Первый попавшийся кусок кода многое говорит об уровне этих фронтенд «специалистов»:
> if (jsbin.user && jsbin.user.name) {
То есть у нас может быть юзер, но без имени и это надо проверить отдельно.
Алсо что за дебилы сделали в Хроме функцию которая на каждой второй странице предлагает ее перевести? Во-первых, я не такой даун как вам кажется и могут читать английский текст, во-вторых, гуглотранслейт все равно переводит текст так, что он ничуть понятнее не становится.
Почитай в нашем учебнике те разделы, которые тебе не очень понятны, порешай задачки. Как миниумм раздел про ООП надо прорешать, и может быть про регулярки. После них переходи к студентам и файлообменнику (задачи в оп посте).
> Могу, к примеру, подгугливая, запилить форму для постинга сообщений с подключением базы данных.
Надо уметь сделать это на ООП с нормальным кодом, а не просто чтобы работало. Ну и какой-нибудь фреймворк желательно знать.
> Плюс, я лет 5 работал с джумлой, хостя у провайдера всё это говно, но до сих пор не имею полного представления как всё устроено.
это плохо. но джумла умерла 5 лет назад, так что фиг с ней.
>>525349
Ты не прав. Если учиться по плохим урокам и видеокурсам то проблемы с безопасностью как раз грозят.
>>525367
В учебнике из ОП поста почитай раздел про массивы и прорешай все задачи из раздела «Повторим». Там есть работы с массивами.
>>525387
А что сколького? В PHP массив это просто стурктура данных, в которой есть упорядоченные ключи и знаечния, ключи могут быть числом или строкой и не могут повторяться, значения могут быть любого типа.
>>526021
На PHP быстрее, на Яве код призводительнее и вообще она круче. Но изучать ее раз в 5 сложнее и дольше чем PHP. Если ты ньюфажина то кроме самой Явы надо изучить и знать кучу концепций и мастертски владеть командной строкой и т д.
>>526024
«энтерпрайзная суть» это способность писать и поддерживать код большой командой в течение долгого времени, использовать лучшие практики и подходы, большая инфраструктура библиотек и инструментов. Не вижу что здесь плохого. Гугл и Яндекс используют Яву.
Почитай в нашем учебнике те разделы, которые тебе не очень понятны, порешай задачки. Как миниумм раздел про ООП надо прорешать, и может быть про регулярки. После них переходи к студентам и файлообменнику (задачи в оп посте).
> Могу, к примеру, подгугливая, запилить форму для постинга сообщений с подключением базы данных.
Надо уметь сделать это на ООП с нормальным кодом, а не просто чтобы работало. Ну и какой-нибудь фреймворк желательно знать.
> Плюс, я лет 5 работал с джумлой, хостя у провайдера всё это говно, но до сих пор не имею полного представления как всё устроено.
это плохо. но джумла умерла 5 лет назад, так что фиг с ней.
>>525349
Ты не прав. Если учиться по плохим урокам и видеокурсам то проблемы с безопасностью как раз грозят.
>>525367
В учебнике из ОП поста почитай раздел про массивы и прорешай все задачи из раздела «Повторим». Там есть работы с массивами.
>>525387
А что сколького? В PHP массив это просто стурктура данных, в которой есть упорядоченные ключи и знаечния, ключи могут быть числом или строкой и не могут повторяться, значения могут быть любого типа.
>>526021
На PHP быстрее, на Яве код призводительнее и вообще она круче. Но изучать ее раз в 5 сложнее и дольше чем PHP. Если ты ньюфажина то кроме самой Явы надо изучить и знать кучу концепций и мастертски владеть командной строкой и т д.
>>526024
«энтерпрайзная суть» это способность писать и поддерживать код большой командой в течение долгого времени, использовать лучшие практики и подходы, большая инфраструктура библиотек и инструментов. Не вижу что здесь плохого. Гугл и Яндекс используют Яву.
> https://github.com/nsdvw/file-sharing/blob/master/db.sql#L17
> size INT UNSIGNED NOT NULL,
В курсе что у INT ограничение на 4 млрд? Если нужно больше, бери BIGINT или DECIMAL.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L16
> define('UPLOAD_DIR', 'upload');
Надежнее определять полный путь, с использованием _ _ DIR _ _ а не относительный. Ну и что-то констант многовато.
> как отключить это долбанное кеширование?
Ты наверно читал доки по 2-й версии, а в доках 3-й версии управление кешированием сделано через методы: http://www.smarty.net/docs/en/caching.tpl
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L43
> $login = ($id and $hash) ? true : false;
> $loginEmail = '';
> $loginPassword = '';
Чтобы не копипастить, то, что связано с логином, логично проверять в начале index.php и ставить через $app->view->appendData. Также, код залогинивания/разлогинивания/проверки логина не должен быть размазан по всему index.php, вынеси его в LoginService или LoginManager.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L77
> session_start();
> session_destroy();
Не понимаю, какой смысл создавать сессию чтобы ее уничтожить. Также, ниже там какой-то бардак с установкой и проверкой кук. Весь код, отвечающий за логин, надо отрефакторить и переделать. Нужна функция залогинивания под данным id, разлогинивания и проверки залогинености.
Для Регистрации, Входа на сайт, Выхода, надо сделать отдельные роуты (урлы). Например /register, /logout, а не помещать все это в код главной страницы. Логаут надо защитить CSRF-токеном: https://github.com/codedokode/pasta/blob/master/security/xsrf.md иначе злоумышленник может разлогинивать всех, кого хочет, заманивая людей на свою страницу.
Код сохранения файла почему-то дублируется 2 раза, в $app->post('/') и $app->post('/ajax/upload'). Надо сделать единый обработчик.
> $loginError = '';
> $loginEmail = '';
> $loginPassword = '';
> $registerError = '';
> $registerLogin = '';
> $registerEmail = '';
Не надо передавать поля по отдельности. Сделай объект User и передавай его. Для ошибок можно сделать массив например, вида 'имя поля' => 'текст ошибки' или объект ErrorList с удобными методами. Также, почитай про алгоритм работы с формами: https://github.com/codedokode/pasta/blob/master/forms.md
> $registerForm = new RegisterForm(
> array(
> 'login'=>$_POST['register']['login']
Я думаю, лучше использовать не массив, а объект User. Хотя конечно тут появляется проблема, где хранить подтверждение пароля? Эти поля придется либо хранить в массиве либо оставить массив для всех полей.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L299
> $user->fromForm($registerForm);
Я думаю, код работы с формой надо поместить не в юзера, а в форму. $registerForm->setAttributes($user)
> $mapper = new UserMapper($app->connection);
UserMapper надо сделать сигнлтоном в Слиме.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/FileMapper.php
Это не модель и потому стоит положить его например в папку Mapper
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/FileMapper.php#L44
> $limit = Pager::PER_PAGE
Я думаю, этой константы в Pager быть не должно, это значение надо хранить где-нибудь в конфиге или в контроллере. А то получается какой-то неунивесальный пагинатор.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php
Это лучше поместить в папку Form. Также, предлагаю подумать, можно ли сделать чтобы форма работала не с массивом данных, а с моделью? Там появляется проблема в том, что в форме регистрации могут быть поля которых нет в модели (в модели есть хеш и соль, а в форме регистрации пароль и подтверждение). В сифмони эта проблема решена тем, что поля которых нет в модели, хранятся в массиве. Ты мог бы хранить их в полях объекта-наследника Form (в модели формы) и превращать их в хеш при обработке формы.
С другой стороны, форма, которая работает напрямую с моделью, удобна, так как нам не надо возиться с преобразованиями между массивом и объектом. А сейчас у тебя фактически модель дублируется 2 раза: модель-класс и данные модели внутри формы.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php#L5
> public $errorMessage;
Это плохая идея. Ты должен предоставить удобные методы для работы с ощибками («есть ли ошибка в этом поле?», «есть ли ошибки вообще?», «получить текст ошибки»), а не давать массив без методов. Более того, я не уверен, а должны ли мы хранить массив ошибок в форме? Не логичнее ли когда validate возвращает массив или объект с ошибками, никуда их не сохраняя?
> public function notEmpty($field, $flag = true)
Лучше дать функциям-валидаторам общий префикс, например validateNotEmpty
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php#L36
> mb_internal_encoding('UTF-8');
Неправильно. Функция-валидатор не должна менять глобальные настройки. Это надо перенести в index.php
С данными, пришедшими в форму, надо делать trim() иначе из-за одного пробела они не пройдт валидацию.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L12
> public static function fromUser($fileName)
Что значит fromUser?
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L39
> public static function fromDataBase(\stdClass $obj)
Все что работает с базой должно быть в маппере. Я советую переименовать метод в fromArray, и заменить StdClass на массив. stdClass это и есть по сути массив, только без функций для работы с ним. Не вижу ни одной ситуации где его вообще уместно использовать.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L42
> foreach ($obj as $property => $value) {
Тут нет никакой проверки что такие поля есть в объекте. Это плохо.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/User.php#L14
> public function fromForm(Form $form)
Это праильнее перенести в форму
> https://github.com/nsdvw/file-sharing/blob/master/app/Helper/HashGenerator.php
Советую почитать статью про стандартные функции работы с паролями, добавленные в 5.5: http://habrahabr.ru/post/194972/
> https://github.com/nsdvw/file-sharing/blob/master/app/Helper/Pager.php
Я думаю это не задача пагинатора работать с базой. Его задача помнить на какой мы странице и генерировать данные для виджета со ссылками на другие страницы. Тогда мы получим универсальный пагинатор, а не как у тебя, намертво завязанный на таблицу file.
> https://github.com/nsdvw/file-sharing/blob/master/views/header.tpl#L44
> <input type="text" name="login[email]" placeholder="email" value="{$loginEmail}">
Где защита от XSS и escape ? Читай https://github.com/codedokode/pasta/blob/master/security/xss.md
На этом пока все, исправь это а потом дальше посмотрим. Для начинающего неплохо, но код требует рефакторинга. Древовидные комментарии с аяксом не хочешь еще потом сделать?
> https://github.com/nsdvw/file-sharing/blob/master/db.sql#L17
> size INT UNSIGNED NOT NULL,
В курсе что у INT ограничение на 4 млрд? Если нужно больше, бери BIGINT или DECIMAL.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L16
> define('UPLOAD_DIR', 'upload');
Надежнее определять полный путь, с использованием _ _ DIR _ _ а не относительный. Ну и что-то констант многовато.
> как отключить это долбанное кеширование?
Ты наверно читал доки по 2-й версии, а в доках 3-й версии управление кешированием сделано через методы: http://www.smarty.net/docs/en/caching.tpl
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L43
> $login = ($id and $hash) ? true : false;
> $loginEmail = '';
> $loginPassword = '';
Чтобы не копипастить, то, что связано с логином, логично проверять в начале index.php и ставить через $app->view->appendData. Также, код залогинивания/разлогинивания/проверки логина не должен быть размазан по всему index.php, вынеси его в LoginService или LoginManager.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L77
> session_start();
> session_destroy();
Не понимаю, какой смысл создавать сессию чтобы ее уничтожить. Также, ниже там какой-то бардак с установкой и проверкой кук. Весь код, отвечающий за логин, надо отрефакторить и переделать. Нужна функция залогинивания под данным id, разлогинивания и проверки залогинености.
Для Регистрации, Входа на сайт, Выхода, надо сделать отдельные роуты (урлы). Например /register, /logout, а не помещать все это в код главной страницы. Логаут надо защитить CSRF-токеном: https://github.com/codedokode/pasta/blob/master/security/xsrf.md иначе злоумышленник может разлогинивать всех, кого хочет, заманивая людей на свою страницу.
Код сохранения файла почему-то дублируется 2 раза, в $app->post('/') и $app->post('/ajax/upload'). Надо сделать единый обработчик.
> $loginError = '';
> $loginEmail = '';
> $loginPassword = '';
> $registerError = '';
> $registerLogin = '';
> $registerEmail = '';
Не надо передавать поля по отдельности. Сделай объект User и передавай его. Для ошибок можно сделать массив например, вида 'имя поля' => 'текст ошибки' или объект ErrorList с удобными методами. Также, почитай про алгоритм работы с формами: https://github.com/codedokode/pasta/blob/master/forms.md
> $registerForm = new RegisterForm(
> array(
> 'login'=>$_POST['register']['login']
Я думаю, лучше использовать не массив, а объект User. Хотя конечно тут появляется проблема, где хранить подтверждение пароля? Эти поля придется либо хранить в массиве либо оставить массив для всех полей.
> https://github.com/nsdvw/file-sharing/blob/master/public_html/index.php#L299
> $user->fromForm($registerForm);
Я думаю, код работы с формой надо поместить не в юзера, а в форму. $registerForm->setAttributes($user)
> $mapper = new UserMapper($app->connection);
UserMapper надо сделать сигнлтоном в Слиме.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/FileMapper.php
Это не модель и потому стоит положить его например в папку Mapper
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/FileMapper.php#L44
> $limit = Pager::PER_PAGE
Я думаю, этой константы в Pager быть не должно, это значение надо хранить где-нибудь в конфиге или в контроллере. А то получается какой-то неунивесальный пагинатор.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php
Это лучше поместить в папку Form. Также, предлагаю подумать, можно ли сделать чтобы форма работала не с массивом данных, а с моделью? Там появляется проблема в том, что в форме регистрации могут быть поля которых нет в модели (в модели есть хеш и соль, а в форме регистрации пароль и подтверждение). В сифмони эта проблема решена тем, что поля которых нет в модели, хранятся в массиве. Ты мог бы хранить их в полях объекта-наследника Form (в модели формы) и превращать их в хеш при обработке формы.
С другой стороны, форма, которая работает напрямую с моделью, удобна, так как нам не надо возиться с преобразованиями между массивом и объектом. А сейчас у тебя фактически модель дублируется 2 раза: модель-класс и данные модели внутри формы.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php#L5
> public $errorMessage;
Это плохая идея. Ты должен предоставить удобные методы для работы с ощибками («есть ли ошибка в этом поле?», «есть ли ошибки вообще?», «получить текст ошибки»), а не давать массив без методов. Более того, я не уверен, а должны ли мы хранить массив ошибок в форме? Не логичнее ли когда validate возвращает массив или объект с ошибками, никуда их не сохраняя?
> public function notEmpty($field, $flag = true)
Лучше дать функциям-валидаторам общий префикс, например validateNotEmpty
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/Form.php#L36
> mb_internal_encoding('UTF-8');
Неправильно. Функция-валидатор не должна менять глобальные настройки. Это надо перенести в index.php
С данными, пришедшими в форму, надо делать trim() иначе из-за одного пробела они не пройдт валидацию.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L12
> public static function fromUser($fileName)
Что значит fromUser?
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L39
> public static function fromDataBase(\stdClass $obj)
Все что работает с базой должно быть в маппере. Я советую переименовать метод в fromArray, и заменить StdClass на массив. stdClass это и есть по сути массив, только без функций для работы с ним. Не вижу ни одной ситуации где его вообще уместно использовать.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/MediaInfo.php#L42
> foreach ($obj as $property => $value) {
Тут нет никакой проверки что такие поля есть в объекте. Это плохо.
> https://github.com/nsdvw/file-sharing/blob/master/app/Model/User.php#L14
> public function fromForm(Form $form)
Это праильнее перенести в форму
> https://github.com/nsdvw/file-sharing/blob/master/app/Helper/HashGenerator.php
Советую почитать статью про стандартные функции работы с паролями, добавленные в 5.5: http://habrahabr.ru/post/194972/
> https://github.com/nsdvw/file-sharing/blob/master/app/Helper/Pager.php
Я думаю это не задача пагинатора работать с базой. Его задача помнить на какой мы странице и генерировать данные для виджета со ссылками на другие страницы. Тогда мы получим универсальный пагинатор, а не как у тебя, намертво завязанный на таблицу file.
> https://github.com/nsdvw/file-sharing/blob/master/views/header.tpl#L44
> <input type="text" name="login[email]" placeholder="email" value="{$loginEmail}">
Где защита от XSS и escape ? Читай https://github.com/codedokode/pasta/blob/master/security/xss.md
На этом пока все, исправь это а потом дальше посмотрим. Для начинающего неплохо, но код требует рефакторинга. Древовидные комментарии с аяксом не хочешь еще потом сделать?
> Разумеется лезть в код линукса я для этого не собираюсь.
Ну лезть это последняя мера, а под strace программу запустить это не то.
> Куплю тогда мак, действительно
Я ставил хакинтош (взломанная мак ос работающая на обычном железе), как-то впечатления не произвело. В нем нет ни гибкости линукса ни скорости работы винды и большого количество софта. как по мне так Эппл просто бедет втридорога за красивый корпус и второразрядное ПО (в смысле менее разнообразное и качественное чем под винду).
> А задроты пусть ковыряются в исходниках
Так программирование и есть ковыряние в исходниках
> Офигенное занятие, а кто-то сейчас на пляже загорает
Иди загорай, потом почитаешь
И заметь, тебе посоветовали наверно лучшую и наиболее подробную статью по теме (которую тебе не посоветуют в других сомнительных уроках и видеокурсах) и что? Ты все равно недоволен.
>>526465
Но убунта распространненнее и все ее поддерживают. Хотя если бы я ставил линукс я бы тоже наверно дебиан + какой-нибудь DE поставил.
>>526467
На второй картинке пункты меню в сумме занимают на 1 пиксель меньше чем ширина оранжевой полоски под ними. Также, линии между пунктами разные, некоторые сдвоенные, а некоторые нет. Автор хотел скзать этим что попытка угадать сколько именно места займет тот или иной символ это очень ненадежная вещь, так как симолы рендерятся по разному в разных браузерах и при разных условиях.
>>526499
> Выводы: из-за того что разработчики браузеров не могут реализовать этот несчастный стандарт w3org, мне приходится разбираться во всяких хаках и костылях
Не совсем верный вывод. Ведь пробелы между блоками как раз логичны, они есть в коде. Проблема другая, стандарты HTML исторически заточены на оформление текста (блочные элементы — это абзацы, инлайновые — это слова в строке, флоаты это вынесенные сбоку рисунки), а не на создание сложных меню и интерфейсов. Но другого языка у нас все равно нет, так что затянем пояса и полезем в это болото.
> Поэтому в верстке я выберу быдлокодерский путь, а именно тупое запоминание готовых решений.
Лучше понимать как что работает.
> А верстка сама по себе неинтересна,
А ты попробуй в ней разобраться.
> Я для себя выбрал следующий способ: родительскому элементу выставить font-size:0, а у элементов с inline-block соответственно переопределить размер шрифта на нужный.
Мне больше нравится вариант не оставлять пробелов в HTML коде либо ставить комментарии. Тем, что у него нет побочных эффектов. Ну и если что, еще есть вариант использоват флоаты, которые не оставляют пробелов.
> Мой конспект статьи
У тебя там по моему тоже графоманства немного осталось:
> Одна из главных вещей, которые вы должны знать, ..
Это можно было смело вырезать.
> 6. Не писать закрывающие теги.
> Оригинально. Но валидатору это очевидно не понравится.
Для таких тегов как li, p, стандарт разрешает не ставить закрывающие, если они идут друг за другом.
> Разумеется лезть в код линукса я для этого не собираюсь.
Ну лезть это последняя мера, а под strace программу запустить это не то.
> Куплю тогда мак, действительно
Я ставил хакинтош (взломанная мак ос работающая на обычном железе), как-то впечатления не произвело. В нем нет ни гибкости линукса ни скорости работы винды и большого количество софта. как по мне так Эппл просто бедет втридорога за красивый корпус и второразрядное ПО (в смысле менее разнообразное и качественное чем под винду).
> А задроты пусть ковыряются в исходниках
Так программирование и есть ковыряние в исходниках
> Офигенное занятие, а кто-то сейчас на пляже загорает
Иди загорай, потом почитаешь
И заметь, тебе посоветовали наверно лучшую и наиболее подробную статью по теме (которую тебе не посоветуют в других сомнительных уроках и видеокурсах) и что? Ты все равно недоволен.
>>526465
Но убунта распространненнее и все ее поддерживают. Хотя если бы я ставил линукс я бы тоже наверно дебиан + какой-нибудь DE поставил.
>>526467
На второй картинке пункты меню в сумме занимают на 1 пиксель меньше чем ширина оранжевой полоски под ними. Также, линии между пунктами разные, некоторые сдвоенные, а некоторые нет. Автор хотел скзать этим что попытка угадать сколько именно места займет тот или иной символ это очень ненадежная вещь, так как симолы рендерятся по разному в разных браузерах и при разных условиях.
>>526499
> Выводы: из-за того что разработчики браузеров не могут реализовать этот несчастный стандарт w3org, мне приходится разбираться во всяких хаках и костылях
Не совсем верный вывод. Ведь пробелы между блоками как раз логичны, они есть в коде. Проблема другая, стандарты HTML исторически заточены на оформление текста (блочные элементы — это абзацы, инлайновые — это слова в строке, флоаты это вынесенные сбоку рисунки), а не на создание сложных меню и интерфейсов. Но другого языка у нас все равно нет, так что затянем пояса и полезем в это болото.
> Поэтому в верстке я выберу быдлокодерский путь, а именно тупое запоминание готовых решений.
Лучше понимать как что работает.
> А верстка сама по себе неинтересна,
А ты попробуй в ней разобраться.
> Я для себя выбрал следующий способ: родительскому элементу выставить font-size:0, а у элементов с inline-block соответственно переопределить размер шрифта на нужный.
Мне больше нравится вариант не оставлять пробелов в HTML коде либо ставить комментарии. Тем, что у него нет побочных эффектов. Ну и если что, еще есть вариант использоват флоаты, которые не оставляют пробелов.
> Мой конспект статьи
У тебя там по моему тоже графоманства немного осталось:
> Одна из главных вещей, которые вы должны знать, ..
Это можно было смело вырезать.
> 6. Не писать закрывающие теги.
> Оригинально. Но валидатору это очевидно не понравится.
Для таких тегов как li, p, стандарт разрешает не ставить закрывающие, если они идут друг за другом.
>В курсе что у INT ограничение на 4 млрд?
В курсе. Это же учебный проект, я не рассчитываю на большую нагрузку.
>что-то констант многовато
Всего четыре ведь.
Меня больше смущает кол-во импортированных классов. А если у меня их будет под сотню?
>Код сохранения файла почему-то дублируется 2 раза, в $app->post('/') и $app->post('/ajax/upload')
Так ведь один для обращения обычной отправкой формы, а второй через аякс. Да, логика там одинаковая, но разный результат: первая вызывает шаблонизатор и тот генерирует html, а вторая только возвращает responseText.
Но да, надо подумать, как вынести повторяющийся код в одно место.
>Ты наверно читал доки по 2-й версии
Упс, таки да.
composer show -i (зацени как я могу)
smarty/smarty v3.1.27
Я только еще не разобрался с этими суффиксами для версий пакетов, типа ~, ^ и т.д.
И наверное настало время перекатиться на twig, как и обещал. Как раз читал документацию, когда ты написал.
Сделаю наверное отдельным бранчем (подтянул знания гита, теперь разбираюсь во многих тонкостях). Кстати гит учил по превосходному видеокурсу от линда.ком, там очень подробно как раз объясняется принцип работы гита, например что такое указатель HEAD, как происходит слияние, что такое конфликт и как его избежать и многое другое. Так что видеокурсы бывают разные, это зависит от преподавателя. И от ученика зависит, будет ли он бездумно повторять действия из ролика, или вникнет в суть. Не от формы урока зависит его качество.
По гиту не до конца понял один нюанс, бампну вопрос >>527491
Первые впечатления: твиг разве не использует пространства имен?
И вот эта строка require_once '/path/to/lib/Twig/Autoloader.php';
Чего композер этот класс сам не подключил?
Остальные замечания переварю и исправлю, данке шон.
Ты потом еще глянь верстку, только не сильно стукай. Это мой первый сверстанный сайт вообще в жизни, понятно что верстка там не идеальна. Нужны общие советы.
И в джаваскриптах не силен. В целом работает, но как-то похоже на лапшу. Наверное по js тоже не помешало бы освоить какой-нибудь фреймворк.
Мне советовали backbone. Что по нему можешь сказать?
>В курсе что у INT ограничение на 4 млрд?
В курсе. Это же учебный проект, я не рассчитываю на большую нагрузку.
>что-то констант многовато
Всего четыре ведь.
Меня больше смущает кол-во импортированных классов. А если у меня их будет под сотню?
>Код сохранения файла почему-то дублируется 2 раза, в $app->post('/') и $app->post('/ajax/upload')
Так ведь один для обращения обычной отправкой формы, а второй через аякс. Да, логика там одинаковая, но разный результат: первая вызывает шаблонизатор и тот генерирует html, а вторая только возвращает responseText.
Но да, надо подумать, как вынести повторяющийся код в одно место.
>Ты наверно читал доки по 2-й версии
Упс, таки да.
composer show -i (зацени как я могу)
smarty/smarty v3.1.27
Я только еще не разобрался с этими суффиксами для версий пакетов, типа ~, ^ и т.д.
И наверное настало время перекатиться на twig, как и обещал. Как раз читал документацию, когда ты написал.
Сделаю наверное отдельным бранчем (подтянул знания гита, теперь разбираюсь во многих тонкостях). Кстати гит учил по превосходному видеокурсу от линда.ком, там очень подробно как раз объясняется принцип работы гита, например что такое указатель HEAD, как происходит слияние, что такое конфликт и как его избежать и многое другое. Так что видеокурсы бывают разные, это зависит от преподавателя. И от ученика зависит, будет ли он бездумно повторять действия из ролика, или вникнет в суть. Не от формы урока зависит его качество.
По гиту не до конца понял один нюанс, бампну вопрос >>527491
Первые впечатления: твиг разве не использует пространства имен?
И вот эта строка require_once '/path/to/lib/Twig/Autoloader.php';
Чего композер этот класс сам не подключил?
Остальные замечания переварю и исправлю, данке шон.
Ты потом еще глянь верстку, только не сильно стукай. Это мой первый сверстанный сайт вообще в жизни, понятно что верстка там не идеальна. Нужны общие советы.
И в джаваскриптах не силен. В целом работает, но как-то похоже на лапшу. Наверное по js тоже не помешало бы освоить какой-нибудь фреймворк.
Мне советовали backbone. Что по нему можешь сказать?
Не работает если значение содержит знаки равно: https://ideone.com/PJflPF
>>526567
> Убрал пробелы при помощи font-size:0 и display:table у родителя.
Ок, но этот метод вообще имеет тот недостаток что надо заново восстанавливать размер шрифта внутри, мы не можем использовать нследование шрифта от родительских элементов.
> box-sizing: border-box;
> width: 100%;
Тут можно обойтись ьез border-box, используя width auto. А если используешь box-sizing, то надо писать еще вендорные префиксы для более старых браузеров.
> font-size: 18px;
Когда указываешь font-size укаызвй рядом line-height, она сама не вычисляется, а наследуется.
В остальном, хорошо. Я надеюсь ты из задачи понял как можно использовать inline-block для выстраивания блоков по горизонтали. Например, кнопок на панели инструментов.
> В шестом задании применил clearfix-метод против выпадения плавающих блоков.
> font-family: "Trebuchet MS";
В конце списка шрифтов должен идти один из универсальных: http://htmlbook.ru/css/font-family
> article:before,
> article:after {
> content: " ";
> display: table;
> }
Что делает элемент :after, я понимаю, а для чего тут :before?
Ну и вообще, я подумал, тут клеарфикс не нужен. Клеарфикс используют, когда мы хотим чтобы родитель охватывал находящиеся в нем флоаты. У нас внутри article нет флоатов. Что касается проблемы заползания текста под меню, она решается margin-left на article.
Объясни-ка, зачем тут клеарфикс?
Клеарфикс нужен в задаче где серые квадраты в желтых блоках находятся.
По поводу «агросервис» — все нормально, но пункты меню поставь по вертикали чуть дальше друг от друга.
>>526579
> Думал об этом, но меня останавливало то, что радиусы могут не совпасть. Это ведь концентрические окружности, у них по идее разные радиусы.
Так ты можешь это учесть, ты же знаешь ширину бордера. Если посмотреть MDN:
https://developer.mozilla.org/ru/docs/Web/CSS/border-radius
https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip
То увидим что радиус относится к кромке, определяемой свйоством background-clip, по умолчанию это border-box то есть наружная кромка бордера. Следовательно, внутренний радиус (радиус угла спана) равен внешнему радиусу label минус ширина бордера.
> Что касается тени, то на картинке в задании не могу рассмотреть, как она должна выглядеть: кажется, у верхней рамки тень сильнее, справа и слева слабее, а внизу едва заметна. Не знаю, как это реализовать. Сделал простой box-shadow.
Ты правильно рассмотрел. Это размытая тень, которая чуть смещена вниз. Изучи свойство box-shadow и какие у него есть параметры. Там есть 2 парамера, отвечающих за смещение тени. Вот как примерно можно определить параметры:
- радиус размытия мы определяем по левой и правой кромке тени. Так как они равны, то их размер определяет радиус размытия. Если бы он был нулевой, кромок бы не было.
- далее, мы определяем прозрачность тени (которая используется в цвете тени), на глаз, по этим же кромкам
- далее, остается только подобрать вертикальное смещение, глядя на верхнюю и нижнюю кромки
У тебя прозрачность тени не используется. Ты используешь #999 то есть полностью непрозрачный цвет. Обычно тень задается как rgba(0, 0, 0, 0.3) то есть черный цвет с определенным уровнем прозрачности. Обычно делают 0.0.5-0.2 в качестве значения прозрачности.
Тень должна появляться при вжатии кнопки, не при наведении. При наведении можно просто серым цветом подсвечивать.
Подбери размер шрифта (там Тахома либо Ариал, пусть будет Ариал) и паддинги так, чтобы пропорции кнопок соответствовали рисунку. Твои слишком высокие.
> input[type="radio"] {
> display: none;
Так не годится. Этот код действует на любые радиокнопки а должен скрывать только кнопки внутри твоего виджета.
Также, у тебя если добавить пару опций, некоторые линии становятся двойными: https://jsfiddle.net/71q5wwtg/1/
>>526582
> string[] splittedSrr = rawStr.Split(new Char[] {','});
Это не сработает если в значениях строк есть запятые. Алсо, именование переменных у тебя ужасное, что за pKey? Почему не key? Что за rawStr? тяжело читать конечно.
Почему rawStr сделан публичным свойстом? Смысл? Его можно менять?
> public Dictionary<string,string> Dict;
Это неудачное свойство, так как до вызова FillDict оно равно null. Как можно надежно работать с объектом в котором непонятно есть значение или нет?
Мне кажется правильнее бы сделать просто класс, с методом который получает строку и возвращает Dict, без всяких лишних свойств.
Что-то у тебя в ООП пробелы.
Не работает если значение содержит знаки равно: https://ideone.com/PJflPF
>>526567
> Убрал пробелы при помощи font-size:0 и display:table у родителя.
Ок, но этот метод вообще имеет тот недостаток что надо заново восстанавливать размер шрифта внутри, мы не можем использовать нследование шрифта от родительских элементов.
> box-sizing: border-box;
> width: 100%;
Тут можно обойтись ьез border-box, используя width auto. А если используешь box-sizing, то надо писать еще вендорные префиксы для более старых браузеров.
> font-size: 18px;
Когда указываешь font-size укаызвй рядом line-height, она сама не вычисляется, а наследуется.
В остальном, хорошо. Я надеюсь ты из задачи понял как можно использовать inline-block для выстраивания блоков по горизонтали. Например, кнопок на панели инструментов.
> В шестом задании применил clearfix-метод против выпадения плавающих блоков.
> font-family: "Trebuchet MS";
В конце списка шрифтов должен идти один из универсальных: http://htmlbook.ru/css/font-family
> article:before,
> article:after {
> content: " ";
> display: table;
> }
Что делает элемент :after, я понимаю, а для чего тут :before?
Ну и вообще, я подумал, тут клеарфикс не нужен. Клеарфикс используют, когда мы хотим чтобы родитель охватывал находящиеся в нем флоаты. У нас внутри article нет флоатов. Что касается проблемы заползания текста под меню, она решается margin-left на article.
Объясни-ка, зачем тут клеарфикс?
Клеарфикс нужен в задаче где серые квадраты в желтых блоках находятся.
По поводу «агросервис» — все нормально, но пункты меню поставь по вертикали чуть дальше друг от друга.
>>526579
> Думал об этом, но меня останавливало то, что радиусы могут не совпасть. Это ведь концентрические окружности, у них по идее разные радиусы.
Так ты можешь это учесть, ты же знаешь ширину бордера. Если посмотреть MDN:
https://developer.mozilla.org/ru/docs/Web/CSS/border-radius
https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip
То увидим что радиус относится к кромке, определяемой свйоством background-clip, по умолчанию это border-box то есть наружная кромка бордера. Следовательно, внутренний радиус (радиус угла спана) равен внешнему радиусу label минус ширина бордера.
> Что касается тени, то на картинке в задании не могу рассмотреть, как она должна выглядеть: кажется, у верхней рамки тень сильнее, справа и слева слабее, а внизу едва заметна. Не знаю, как это реализовать. Сделал простой box-shadow.
Ты правильно рассмотрел. Это размытая тень, которая чуть смещена вниз. Изучи свойство box-shadow и какие у него есть параметры. Там есть 2 парамера, отвечающих за смещение тени. Вот как примерно можно определить параметры:
- радиус размытия мы определяем по левой и правой кромке тени. Так как они равны, то их размер определяет радиус размытия. Если бы он был нулевой, кромок бы не было.
- далее, мы определяем прозрачность тени (которая используется в цвете тени), на глаз, по этим же кромкам
- далее, остается только подобрать вертикальное смещение, глядя на верхнюю и нижнюю кромки
У тебя прозрачность тени не используется. Ты используешь #999 то есть полностью непрозрачный цвет. Обычно тень задается как rgba(0, 0, 0, 0.3) то есть черный цвет с определенным уровнем прозрачности. Обычно делают 0.0.5-0.2 в качестве значения прозрачности.
Тень должна появляться при вжатии кнопки, не при наведении. При наведении можно просто серым цветом подсвечивать.
Подбери размер шрифта (там Тахома либо Ариал, пусть будет Ариал) и паддинги так, чтобы пропорции кнопок соответствовали рисунку. Твои слишком высокие.
> input[type="radio"] {
> display: none;
Так не годится. Этот код действует на любые радиокнопки а должен скрывать только кнопки внутри твоего виджета.
Также, у тебя если добавить пару опций, некоторые линии становятся двойными: https://jsfiddle.net/71q5wwtg/1/
>>526582
> string[] splittedSrr = rawStr.Split(new Char[] {','});
Это не сработает если в значениях строк есть запятые. Алсо, именование переменных у тебя ужасное, что за pKey? Почему не key? Что за rawStr? тяжело читать конечно.
Почему rawStr сделан публичным свойстом? Смысл? Его можно менять?
> public Dictionary<string,string> Dict;
Это неудачное свойство, так как до вызова FillDict оно равно null. Как можно надежно работать с объектом в котором непонятно есть значение или нет?
Мне кажется правильнее бы сделать просто класс, с методом который получает строку и возвращает Dict, без всяких лишних свойств.
Что-то у тебя в ООП пробелы.
Слева - хром, справа - файрфокс. Как видно, в хроме кнопка съезжает на пару пикселей вниз. В чем проблема?
Хорошо бы. А то залезет программист в верстку, набылокодит, а потом кому-то разгребать это.
>>526651
Нет. У нас свой, хороший, курс HTML/CSS и мы тут его изучаем. О чем в ОП-посте написано для особо умненьких.
>>526697
> но меня убивает необходимость вечно что-то искать, прикручивать, настраивать.
Он вообще-то и сделан для любителей прикручивать и настраивать.
> О маке не знаю почти ничего, но в моих маня-мечтаниях это тот же юникс, но за деньги меня избавят от геморроя ковыряния с ним.
Тебя избавят от денег в первую очередь.
>>526704
Абсолютно бесполезная вещь, так как в некоторых браузерах (сафари) адресная строка заполняется по мере загрузки страницы. Зачем дублировать функции браузера, непонятно. Алсо такая полоса уже полгода на ютубе, странно что вы не замечали.
>>526714
> 9. Не видел в глаза ни одного фрейворка.
Плохо
> Погуглил, сейчас везде просят Laravel/Symfony, за сколько их можно освоить?
По моему просят больше Yii2/Symfony2
>>526725
Тебе наверно нужен preg_match_all а не preg_match который находит только первое совпадение
>>526727
> mb_detect_encoding
Это функция-пустышка. Она не дает верный результат: http://habrahabr.ru/post/107945/
100% способа определить кодировку нет. Но можно попробовать угадать ее по статистике распределения букв.
Проверь чему равен mb_internal_encoding
>>526734
В новых версиях по идее должна иметь, если mb_internal_encoding не задан: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=php+ini+default+charset
>>526737
> Можно же указать mbstring.internal_encoding = UTF-8 (и iconv.internal_encoding = UTF-8) в php.ini.
да, но это действует на все проекты сразу
> Получается, лучше всегда объявлять кодировку в начале скрипта и не трогать глобальные настройки?
Лучше и там и там
>>526752
> А если исключить элементы с пустыми строками?
> preg_split("//u", $text, 0, PREG_SPLIT_NO_EMPTY);
Да, так и надо
> В задаче «Лев Толстой» (http://ideone.com/ao47z3) уместно использовать array_rand()?
да, твое решение верное.
>>526905
По моему без разницы, но можно вынести в начало самые распространенные и глобальные вещи (стили body, ссылок). И можно сгруппировать по страницам, да.
Мне кажется стили для разных разделов сайта удобно помечать разными префиксами. Типа reg-form, reg-notice и тд.
>>526918
Ради маленького сайта разбивать на файлы и прикручивать сборку излишество.
>>527069
> [0-9 \\-?\\(?\s?\\)?]{10}
Это неправильно. Почитай что это значит:
Ровно 10 раз встречаются такие символы: цифры, пробел, минус, знак вопроса, скобка. Но ведь тогда получается если у тебя есть 2 пробела то под цифры остается только 8 знаков.
А надо — ровно 10 цифр + любое число дополнительных знаков между ними.
> \\-?
Знак вопроса внутри квадратных скобок значит просто «знак вопроса». Квадратные скобки вообще значат «один из перечасленных символов» и в них спецсимволы не работают.
Хорошо бы. А то залезет программист в верстку, набылокодит, а потом кому-то разгребать это.
>>526651
Нет. У нас свой, хороший, курс HTML/CSS и мы тут его изучаем. О чем в ОП-посте написано для особо умненьких.
>>526697
> но меня убивает необходимость вечно что-то искать, прикручивать, настраивать.
Он вообще-то и сделан для любителей прикручивать и настраивать.
> О маке не знаю почти ничего, но в моих маня-мечтаниях это тот же юникс, но за деньги меня избавят от геморроя ковыряния с ним.
Тебя избавят от денег в первую очередь.
>>526704
Абсолютно бесполезная вещь, так как в некоторых браузерах (сафари) адресная строка заполняется по мере загрузки страницы. Зачем дублировать функции браузера, непонятно. Алсо такая полоса уже полгода на ютубе, странно что вы не замечали.
>>526714
> 9. Не видел в глаза ни одного фрейворка.
Плохо
> Погуглил, сейчас везде просят Laravel/Symfony, за сколько их можно освоить?
По моему просят больше Yii2/Symfony2
>>526725
Тебе наверно нужен preg_match_all а не preg_match который находит только первое совпадение
>>526727
> mb_detect_encoding
Это функция-пустышка. Она не дает верный результат: http://habrahabr.ru/post/107945/
100% способа определить кодировку нет. Но можно попробовать угадать ее по статистике распределения букв.
Проверь чему равен mb_internal_encoding
>>526734
В новых версиях по идее должна иметь, если mb_internal_encoding не задан: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=php+ini+default+charset
>>526737
> Можно же указать mbstring.internal_encoding = UTF-8 (и iconv.internal_encoding = UTF-8) в php.ini.
да, но это действует на все проекты сразу
> Получается, лучше всегда объявлять кодировку в начале скрипта и не трогать глобальные настройки?
Лучше и там и там
>>526752
> А если исключить элементы с пустыми строками?
> preg_split("//u", $text, 0, PREG_SPLIT_NO_EMPTY);
Да, так и надо
> В задаче «Лев Толстой» (http://ideone.com/ao47z3) уместно использовать array_rand()?
да, твое решение верное.
>>526905
По моему без разницы, но можно вынести в начало самые распространенные и глобальные вещи (стили body, ссылок). И можно сгруппировать по страницам, да.
Мне кажется стили для разных разделов сайта удобно помечать разными префиксами. Типа reg-form, reg-notice и тд.
>>526918
Ради маленького сайта разбивать на файлы и прикручивать сборку излишество.
>>527069
> [0-9 \\-?\\(?\s?\\)?]{10}
Это неправильно. Почитай что это значит:
Ровно 10 раз встречаются такие символы: цифры, пробел, минус, знак вопроса, скобка. Но ведь тогда получается если у тебя есть 2 пробела то под цифры остается только 8 знаков.
А надо — ровно 10 цифр + любое число дополнительных знаков между ними.
> \\-?
Знак вопроса внутри квадратных скобок значит просто «знак вопроса». Квадратные скобки вообще значат «один из перечасленных символов» и в них спецсимволы не работают.
> \t// Если в последнем месяце получилась переплата
Что-то мне не нравится идея с переплатой. Подправь код чтобы никогда не платить больше чем требуется.
Считает вроде верно.
>>527166
> Strawberry банк неправильно посчитан, должно 61336.87 выйти.
Почему? Там 0 комиссия и всего 2%.
> Переменные с маленькой буквы начинать надо.
Это верно.
>>527229
Средствами CSS
>>527262
> $regexp = '/^\s?(8|\+[\s]?7)(\d{10}|-\d{3}-\d{1}-\d{3}-\d{3}|\s?[(-]?\s?\d{3}\s?[)]?\s?(\d{2}-\d{2}-\d{2}|[-]?\d{7}|\d{2}\s?\d{3}\s?\d{2}|[-]\s?\d{3}\s-
Ну не, ты издеваешься, анон? Вот скажи, как это проверять? Выписывать на листочек и тщательно пересчитыать? Нет, код должен быть проще. Регулярку надо записать так:
- в начале идет +7 или 8, за ними ровно 10 цифр между которыми может быть любое число скобок, пробелов, минусов.
>>527263
Что ты забыл тут, грубиян?
>>527277
Можно через АПи узнавать текущее время воспроизведения. Алсо тестовое задание должно проверять твои знания и сообразительность.
>>527291
Можно гуглом, изучи синтаксис запросов.
>>527337
Бессмысленное дублирование функций браузера.
> \t// Если в последнем месяце получилась переплата
Что-то мне не нравится идея с переплатой. Подправь код чтобы никогда не платить больше чем требуется.
Считает вроде верно.
>>527166
> Strawberry банк неправильно посчитан, должно 61336.87 выйти.
Почему? Там 0 комиссия и всего 2%.
> Переменные с маленькой буквы начинать надо.
Это верно.
>>527229
Средствами CSS
>>527262
> $regexp = '/^\s?(8|\+[\s]?7)(\d{10}|-\d{3}-\d{1}-\d{3}-\d{3}|\s?[(-]?\s?\d{3}\s?[)]?\s?(\d{2}-\d{2}-\d{2}|[-]?\d{7}|\d{2}\s?\d{3}\s?\d{2}|[-]\s?\d{3}\s-
Ну не, ты издеваешься, анон? Вот скажи, как это проверять? Выписывать на листочек и тщательно пересчитыать? Нет, код должен быть проще. Регулярку надо записать так:
- в начале идет +7 или 8, за ними ровно 10 цифр между которыми может быть любое число скобок, пробелов, минусов.
>>527263
Что ты забыл тут, грубиян?
>>527277
Можно через АПи узнавать текущее время воспроизведения. Алсо тестовое задание должно проверять твои знания и сообразительность.
>>527291
Можно гуглом, изучи синтаксис запросов.
>>527337
Бессмысленное дублирование функций браузера.
Попробовал вычленить хедер и все стили, на него влияющие - поплыло вообще полностью.
И в хроме все равно на пиксель съезжает.
http://pastebin.com/ZVV7ka0h
> $matches[1][$key]
лучше использовать в preg_match_all другой порядок заполнения массива чтобы было просто $match[1]
Алсо, сделай чтобы определяло еще опечатку в английских словах.
>>527430
Ты бы мог участвовать в разных партнерских системах типа адмитад, они не только предоставляют готовые XML с товарами по куче компаний, но еще и деньги платят за переход по ссылке в магазин (или за покупку, не помню).
Автоматического способа искать ссылки нет. Яндекс-маркет их не ищетЮ владельцв магазинов сами их присылают.
>>527431
Да. Гугл не любит тех кто им пользуется и не смотрит рекламу.
>>527447
Просто хочу предупредить что никто так не пишет и ты учишься по учебнику 10-летней давности. Почитай про PDO.
Если у тебя много времени, бросай свой учебник и делай наши задания, они на порядок лучше.
Алсо проверка авторизации бессмысленная: ты отправляешь заголовок но код продолжает выполняться.
В panel.php вообще ты пытаешься отправлять заголовок после вывода HTML, это делать нельзя.
>>527448
Вместо того чтобы брать данные из POST, пропиши их в коде и проверь заработает ли. Код надо сохранять в utf-8 без BOM.
>>527452
Ждать замучаешься и все равно в итоге забанят.
>>527472
Судя по http://stackoverflow.com/questions/8751221/php-timezone-database-is-corrupt-error какой-то баг в самом PHP.
У меня в PHP 5.4 все работает, а клоуны, которые сидят на самых последних и непротестированных версиях PHP, должны страдать.
Сделай phpinfo() и выясни какая версия PHP, какие настройки даты/времени.
Вот аналогичные баги в старых PHP:
https://bugs.php.net/bug.php?id=48882
https://bugs.php.net/bug.php?id=42856
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492025
Гугл тут твой лучший помощник.
>>527480
Баг не у анона а в PHP.
>>527486
Баг в PHP (или в дистрибутиве на ideone) видимо. Там же написано should never happen то есть мы не должны ни при каких условиях это были увидеть.
Сделай phpinfo() и выясни какая версия PHP, какие настройки даты/времени.
>>527491
Я обычно явно пишу git push origin HEAD (запушить текущую ветку)
А так да, ты вроде прав.
>>527494
Это плохая книга и код там плохой.
>>527504
По отдельности. У меня уроки есть:
https://gist.github.com/codedokode/7054af4a03865c4cc863
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/10539568
>>527523
На линуксе апач и PHP вообщ парой команд ставится, зачем сборки?
>>527524
Не разберешься, для новичка там все запутанно.
>>527537
Если ты Silex знаешь то изучение займет час-два. А так да, примерно то же, так что не знаю.
Можешь брать Sliex, он не плох. Тогда советую сразу взять шаблонизатор Twig и Doctrine для работы с БД. Они все равно пригодятся когда до симфони дойдешь.
> $matches[1][$key]
лучше использовать в preg_match_all другой порядок заполнения массива чтобы было просто $match[1]
Алсо, сделай чтобы определяло еще опечатку в английских словах.
>>527430
Ты бы мог участвовать в разных партнерских системах типа адмитад, они не только предоставляют готовые XML с товарами по куче компаний, но еще и деньги платят за переход по ссылке в магазин (или за покупку, не помню).
Автоматического способа искать ссылки нет. Яндекс-маркет их не ищетЮ владельцв магазинов сами их присылают.
>>527431
Да. Гугл не любит тех кто им пользуется и не смотрит рекламу.
>>527447
Просто хочу предупредить что никто так не пишет и ты учишься по учебнику 10-летней давности. Почитай про PDO.
Если у тебя много времени, бросай свой учебник и делай наши задания, они на порядок лучше.
Алсо проверка авторизации бессмысленная: ты отправляешь заголовок но код продолжает выполняться.
В panel.php вообще ты пытаешься отправлять заголовок после вывода HTML, это делать нельзя.
>>527448
Вместо того чтобы брать данные из POST, пропиши их в коде и проверь заработает ли. Код надо сохранять в utf-8 без BOM.
>>527452
Ждать замучаешься и все равно в итоге забанят.
>>527472
Судя по http://stackoverflow.com/questions/8751221/php-timezone-database-is-corrupt-error какой-то баг в самом PHP.
У меня в PHP 5.4 все работает, а клоуны, которые сидят на самых последних и непротестированных версиях PHP, должны страдать.
Сделай phpinfo() и выясни какая версия PHP, какие настройки даты/времени.
Вот аналогичные баги в старых PHP:
https://bugs.php.net/bug.php?id=48882
https://bugs.php.net/bug.php?id=42856
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=492025
Гугл тут твой лучший помощник.
>>527480
Баг не у анона а в PHP.
>>527486
Баг в PHP (или в дистрибутиве на ideone) видимо. Там же написано should never happen то есть мы не должны ни при каких условиях это были увидеть.
Сделай phpinfo() и выясни какая версия PHP, какие настройки даты/времени.
>>527491
Я обычно явно пишу git push origin HEAD (запушить текущую ветку)
А так да, ты вроде прав.
>>527494
Это плохая книга и код там плохой.
>>527504
По отдельности. У меня уроки есть:
https://gist.github.com/codedokode/7054af4a03865c4cc863
https://gist.github.com/codedokode/10774100
https://gist.github.com/codedokode/10539568
>>527523
На линуксе апач и PHP вообщ парой команд ставится, зачем сборки?
>>527524
Не разберешься, для новичка там все запутанно.
>>527537
Если ты Silex знаешь то изучение займет час-два. А так да, примерно то же, так что не знаю.
Можешь брать Sliex, он не плох. Тогда советую сразу взять шаблонизатор Twig и Doctrine для работы с БД. Они все равно пригодятся когда до симфони дойдешь.
>в начале идет +7 или 8, за ними ровно 10 цифр между которыми может быть любое число скобок, пробелов, минусов
Что-то как-то просто совсем. Я думал, это хитровыебанное задание на отлов всех скобочек, дефисов и проблелов с различным количеством цифр между ними.
Вот новый вариант по 10 цифрам:
http://ideone.com/WfMgUi
Полезно для развития мозгов, только начинать надо с простых (которые решены максимальное число раз). Параллельно читай книги про алгоритмы/структуры данных, например http://aliev.me/runestone/ и книги по решению олимпиадных задач:
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BE%D0%BB%D0%B8%D0%BC%D0%BF%D0%B8%D0%B0%D0%B4%D0%BD%D1%8B%D1%85+%D0%B7%D0%B0%D0%B4%D0%B0%D1%87
Ну и можешь тут запостить задачу, я подскажу.
В простых сайтах это не требуется, но если ты надеешься в дальнейшем заниматься чем-то более сложным то пригодится. Ну и если ты хочешь как-нибудь попробовать в яндекс/гугл пролезть, это обязательно нужно.
>>527546
Нет никаких механизмов безопасности. Сегодня это хорошее расширнение, а завтра автор решит заработать и начнет подменять рекламу на сайтах, следить за твоими запросами, сидеть от твоего имени вконтакте, ставить лайки, подменять поисковую выдачу, осуществлять атаки с твоего компьютера, рассылать спам. Или просто будет следить за тобой. Или продаст расширение злым людям, а они уже затроянят его.
Гугл стоит в стороне от этого и никак не проверяет расширения. А ведь расширение видит все твои данные, включая https сайты, например интернет-банки.
Особенно подозрительны расширения для обхода блокировок, для скаичвания пиратских файлов — нет никаких гарантий что они не имеют какие-то другие функции.
Причем как я помню, в хроме в расширении может быть даже dll с нативным кодом, а она с твоим компьютером вообще что хочешь сделает.
> Меня больше смущает кол-во импортированных классов. А если у меня их будет под сотню?
Если использовать кеш опкодов (встроен начиная с 5.5) то это не проблема.
> Так ведь один для обращения обычной отправкой формы, а второй через аякс. Да, логика там одинаковая, но разный результат: первая вызывает шаблонизатор и тот генерирует html, а вторая только возвращает responseText.
Сделай один обработчик с ифом в конце. Не копипасть, не дублируй код.
> Я только еще не разобрался с этими суффиксами для версий пакетов, типа ~, ^ и т.д.
Обычно хватает 2.× то есть зафиксировать мажорную версию.
> И наверное настало время перекатиться на twig, как и обещал.
Ну смотри, не жалко написанный под смарти код выкидывать? Но твиг конечно лучше на мой взгляд и современнее.
> Первые впечатления: твиг разве не использует пространства имен?
> И вот эта строка require_once '/path/to/lib/Twig/Autoloader.php';
> Чего композер этот класс сам не подключил?
Это инструкция для тех у кого нет композера.
> твиг разве не использует пространства имен?
Использует.
> Ты потом еще глянь верстку, только не сильно стукай. Это мой первый сверстанный сайт вообще в жизни, понятно что верстка там не идеальна. Нужны общие советы.
У нас есть Путь HTML/CSS, там изучение идет с основ, в ОП посте. Советую найти время на прохождение.
> И в джаваскриптах не силен. В целом работает, но как-то похоже на лапшу. Наверное по js тоже не помешало бы освоить какой-нибудь фреймворк.
Мне советовали backbone. Что по нему можешь сказать?
Советую начать с jQuery. Это библиотека для работы с DOM так что сначала надо изучить его.
Backbone это для написания клиентских приложений (Single page App), он один не используется, к нему как минимум шаблонизатор или что-то аналогичное надо. Пежде чем за него браться надо изучить хорошо JS, DOM, jQuery.
У нас кстати и на JS задачки есть. С роботом-проверяльщиком.
> Меня больше смущает кол-во импортированных классов. А если у меня их будет под сотню?
Если использовать кеш опкодов (встроен начиная с 5.5) то это не проблема.
> Так ведь один для обращения обычной отправкой формы, а второй через аякс. Да, логика там одинаковая, но разный результат: первая вызывает шаблонизатор и тот генерирует html, а вторая только возвращает responseText.
Сделай один обработчик с ифом в конце. Не копипасть, не дублируй код.
> Я только еще не разобрался с этими суффиксами для версий пакетов, типа ~, ^ и т.д.
Обычно хватает 2.× то есть зафиксировать мажорную версию.
> И наверное настало время перекатиться на twig, как и обещал.
Ну смотри, не жалко написанный под смарти код выкидывать? Но твиг конечно лучше на мой взгляд и современнее.
> Первые впечатления: твиг разве не использует пространства имен?
> И вот эта строка require_once '/path/to/lib/Twig/Autoloader.php';
> Чего композер этот класс сам не подключил?
Это инструкция для тех у кого нет композера.
> твиг разве не использует пространства имен?
Использует.
> Ты потом еще глянь верстку, только не сильно стукай. Это мой первый сверстанный сайт вообще в жизни, понятно что верстка там не идеальна. Нужны общие советы.
У нас есть Путь HTML/CSS, там изучение идет с основ, в ОП посте. Советую найти время на прохождение.
> И в джаваскриптах не силен. В целом работает, но как-то похоже на лапшу. Наверное по js тоже не помешало бы освоить какой-нибудь фреймворк.
Мне советовали backbone. Что по нему можешь сказать?
Советую начать с jQuery. Это библиотека для работы с DOM так что сначала надо изучить его.
Backbone это для написания клиентских приложений (Single page App), он один не используется, к нему как минимум шаблонизатор или что-то аналогичное надо. Пежде чем за него браться надо изучить хорошо JS, DOM, jQuery.
У нас кстати и на JS задачки есть. С роботом-проверяльщиком.
Причин может быть много, посмотри инспектором. margin например.
>>527614
Простое решение лучше сложного.
> '/^\s?(8|\+[\s]?7)([\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,}\d{1}[\s()-]{0,})$/';
Это пока еще не простое решение. Что это такое? Укороти регулярку минимум в 4 раза.
> \d{1}
Это то же самое что и \d
> {0,}
Это то же самое что звездочка
> [\s()-]{0,}\d{1}[\s()-]{0,}\d{1}
Избавься от копипасты
>Это не сработает если в значениях строк есть запятые
>В условии не было же. Но да, не сработает, увы. Алсо, именование переменных у тебя ужасное, что за pKey? Почему не key?
Потому что это регэксп шаблон. Вот и назвал p (preg) Key
>Что за rawStr?
Сырая строка же. Необработанные входные данные. Английский жи.
>Это неудачное свойство, так как до вызова FillDict оно равно null. Как можно надежно работать с объектом в котором непонятно есть значение или нет?
Можно было бы в конструкторе проинициализировать.
>Что-то у тебя в ООП пробелы.
Я две недели как учусь.
W5.1 Исправь и переделай программу, чтобы она работала нормально. Например, эта версия позволяет школьнику переплатить за кредит, так, что банк ему становится должен — это плохо! Подсказка: перед тем, как платить, надо проверять, сколько осталось долга, и если он меньше 5000, то платить только остаток и завершать цикл через break
Второй вечер не могу решить, предыдущие задание с удовольствием прошел.
http://ideone.com/L3bJ5d
>перед тем, как платить, надо проверять, сколько осталось долга
Смотрим твой код:
for ($month = 1; $month <= 20; $month ++) {
$creditBalance = ( $creditBalance * $percent ) + $servicePayment - $monthlyPayment;
Первой же строчкой идет оплата и только потом проверка. Условие уже не выполнено.
Но это уже будет решением задачи. Боюсь я тем самым окажу тебе медвежью услугу. Могу только пояснить тебе логику программы, а код ты как-нибудь сам уже из этого делай. Сперва мы вычисляем сумму оставшегося кредита на данном месяце (но ни в коме случае не отнимаем от него месячную плату), затем идет проверка на то, больше ли эта сумма нашей ежемесячной платы или меньше, и в зависимости от проверки уже отнимаем либо ежемесячную плату, либо сумму кредита.
Все по инструкции сделал, нихуя не работает
Пиздец, нахую столько сложностей
Зачем в этих примерах модификатор u? В шаблоне же только цифры.
Лучше привыкнуть всегда его ставить ем забыть и долго искать причину почему не работает. Вреда-то от него нету.
@
ЗНАЕШЬ МАЙСОКЛ ХТМЛ ЦСС ПХП ЖКВЕРИ УЧИШЬ ПХП ФРЕЙМВОРКИ
@
ПОШЕЛ РАБОТАТЬ ПРОДАВАНОМ
Задачу про список студентов сделал? Ее надо делать до файлообменника и там работа с базой как раз отрабатывается. И там подробные комментарии к задаче.
Ах, жиненна)))
СИЖУ С ПЕРВЫХ ТРЕДОВ
@
КАЖДЫЙ РАЗ ВОЗВРАЩАЮСЬ СЮДА, В НАДЕЖДЕ, ЧТО ЗА МЕНЯ РЕШАТ МЕЛКУЮ ЗАДАЧКУ
Ок.
Не могу понять, как решать задачу "Grammar Nazi" (пик).
Допустим есть переменная $text, содержащая
>Нет пробела,после запятой;точки с запятой!Восклицательного знака?Вопросительного знака:двоеточия.После точки. Жы-шы пешы с «и». Сдесь координально пока не зделал но потом зделаю и он будет зделан а может быть и нет.
Какой алгоритм действий? Резать текст по пробелам не нужно ведь? Должно быть одно регулярное выражение, которое будет искать все ошибки и заносить найденные в массив? А потом нужно ещё что-то пользователю вывести, желательно чтобы он быстро нашёл это место в тексте, значит на выводе должно получиться что-то вроде
>,после
>;точки
>!Восклицательного
>?Вопросительного
и т.д.
Для этого нужно, чтобы регулярка искала слово целиком, до следующего за ним пробела. Что-то вроде /(,|;|!)\\S+/
Чё делать посаны? Киньте свой код
Картинку забыл.
https://github.com/toppestkek/List-Ofstudents
Списал у блэкджерри. Эй, ебло, я тебя не спрашиваю, как вообще к бд подключаться. я спрашивая, где в слиме это говно все спрятано, туториал говно
Зая, а зачем тебе это?
Нормальный у слима туториал, это ты глупенький. Слим из коробки не умеет в базы данных. Накатывай какую-либо библиотеку, которая умеет в бд, и уже с ней работай.
Сажа приклеилась.
Есть. Но когда у тебя в БД больше 3х таблиц, то уже надо что-то, что умеет в абстракции.
Нет, туториал правда говно, мне кажется, зря я убил целый день на его чтение я нихуя непонел, лучше бы просто лазил по папкам и смотрел классы.
Использовал, mopa_bootstrap, делал всё по инструкции через LESS, в итоге стили н загружаются
вот кофиг
https://ideone.com/hobYki
вот шаблон
https://ideone.com/RsbJQ7
официальный тоже пробовал, тот же результат
а вот что выпадает при
sudo php app/console assetic:dump --env=prod --no-debug
[Symfony\Component\Debug\Exception\ContextErrorException]
Catchable Fatal Error: Argument 2 passed to Assetic\Filter\LessFilter::__construct() must be of the type a
rray, string given, called in /var/www/FinanceTest/app/cache/prod/appProdProjectContainer.php on line 301
and defined
> Пости код хоть какой, а мы уже советовать будем, что поправить/доделать. Смысла нет болтать без кода.
Да чет стыдно, пиздец. Вот есть у васянов вот такая функция на отправку почты http://pastebin.com/hF2zTstC с проверочками и прочим. А мне надо вписать в неё возможность отправки файла. Причем если файла нет, то хуй с ним, а если файл есть, то, хотя бы, проверить его на MIME тип и размер. Загружается файл, отсылается письмо. Письмо улетает адресату со ссылкой на файл внутри. Вот моё быдлятство на отправку файла, лел http://pastebin.com/zPSgJg5u
Молость опух чет. Помогите вписать, с меня щитонибудь.
>Без корочки все равно нихуя не устроишься
Да ты поехавший, как там в 80-ых? Кто на это вообще смотрит, нужны люди которые умеют писать код либо смогут научиться это делать а не корочкообладатели, которые ничего не могут.
Забей, я тут регулярки, ООП, паттерны и БД все освоил уже по урокам, а в верстку с CSS и что тут по ней постят до сих пор не врубаюсь. Для верстки по ходу талант нужен, начни лучше с бэкенда.
Очевидно приходит с опытом.
Попробуй порешать задачи на развитие логики и абстрактного мышления, если с этим есть проблемы.
Нет ничего стыдного, чтобы попробовать детские развивающие задачи (между прочим, я ради интереса смотрел "тесты на айкью", которые любят люди, желающие показаться умнее, чем есть на самом деле: там большинство заданий именно для дошкольников).
Большинство кстати даже не заморачивается с изучением основ веб-технологий, а тупо зазубривает готовые решения типичных задач, или копипастит один и тот же код, не понимая, что он делает. Таких мы называем быдлокодерами.
Так что если есть желание вникать в процесс программирования, это уже хорошо. Нужно только терпение и трудолюбие.
(Чужие яблоки есть нельзя.)
Ответ: платье золотое
for ($i = 1; $i < $counts; $i++)
{
$maps[]= "myPlaces.push(new Place('".$points[$i]['name']."',".$points[$i]['coordinate'].", ''))"."\r\n";
}
то-есть каждый элемент массива вставить в код js, каким образом это сделать? с одиночным элементом выходит хорошо, но когда элементов больше одного - не работает, видимо перенос строки корректно не работает. Либо как это можно организовать по другому? У меня есть массив с ответом базы данных с названиями и координатами, есть их количество, мне надо построить карту с указанными точками на js. Я к сожалению с JS знаком очень плохо.
точнее я пробовал вот так
for ($i = 1; $i < $counts; $i++)
{
$maps.= "myPlaces.push(new Place('".$points[$i]['name']."',".$points[$i]['coordinate'].", ''))"."\r\n";
}
$code = "кусок js кода".$maps."второй кусок JS кода";
>видимо перенос строки корректно не работает
Не перенос, а отсутствие точки с запятой в js-коде.
После myPlaces.push() нужна точка с запятой.
Открой исходный код страницы (ctrl + u), и посмотри на полученный яваскрипт.
А почему не сформировать массив myPlaces прямо из php?
Тогда это выглядело бы
<script>var myPlaces = <?php echo $myPlaces;?>; ... </script>
>зазубривает готовые решения типичных задач, или копипастит один и тот же код
И очень действенный и понятный метод между прочим, не понимаю, что там понимать, если есть уже хорошие готовые решения.
Да, точки с запятой не хватало, но карту не рисовало оказывается потому, что результатов больше 40 было.
Использование шаблонизатора может помочь избежать такого корявого кода.
Например в твиг можно объединить массив в строку прямо в шаблоне
Фильтр join возвращает строку, содержащую объединенные строки последовательности. Разделитель по-умолчанию - пустая строка, но его можно определить как параметр:
{{ [1, 2, 3]|join('|') }}
{# вернет 1|2|3 #}
{{ [1, 2, 3]|join }}
{# вернет 123 #}
Так что тебе было бы достаточно передать php-шный массив в шаблон, а в шаблоне преобразовать его в строку
places.push( {{ php_places|join(',') }} );
Теперь я спокоен.
-----------------------------------------------------------------
Наверное, многие задумались, как же все таки выглядит человек с явно выраженным абстрактным мышлением. У такого человека постоянно в голове протекают рассуждения, мысли, факты, цепочки и т.д. они говорят языком сложных понятий, символов, им доставляет это огромное удовольствие. Чаще всего ярко развитым абстрактным мышлением обладают мужчины, женщин намного реже. Такие люди идут учиться на физико-технические, математико-механические факультеты, это их стихия. Они небрежно одеваются, не задумываются о стиле, могут не заметить расстегнутые пуговицы. Энергии в физическом плане не наблюдается, вся ее активность заключена в головном мозге. Невнимательны к другим людям, в разговоре строят сложные цепочки, иногда забывают с чего начат разговор, или о чем он. Домашние проблемы для них несущественны, они не уделяют им особого внимания. Такие люди живут в своем мире, иногда далеком от реальности.
Основные качества:
Большая работоспособность, увлеченность профессией;
Могут представлять ситуацию с разных ракурсов, мыслят сложно;
Могут отказаться от физического плана. (че?)
Недостатки:
эгоисты, сосредоточены только на себе;
невнимательны к родственникам и друзьям, рассеяны;
чересчур активное абстрактное мышление приводит к непрактическим выводам;
усердствуют в теории, но пассивны в практике.
http://ideone.com/wdTpjo
Результат не такой. какого я ожидал. Пикрелейтед: слева результат выполнения программы, справа то, как должно быть по логике, если я конечно правильно понял суть кропа.
>$x = floor($newWidth/2-$width/2);
Зачем?
Те четыре координаты int $dst_x , int $dst_y , int $src_x , int $src_y определяют смещение слоя изображения относительно холста.
Это координаты левого верхнего угла исходного и результирующего изображения, они должны быть выставлены в ноль.
> $tempImage = imagecreatetruecolor($newWidth, $newHeight);
>$newImage = imagecreatetruecolor($width, $height);
Зачем два раза создавать новое изображение?
Разберись в работе этих функций.
Алгоритм такой:
1. Создаем канвас (холст, пустышку) при помощи imagecreatetruecolor с размерами превью.
Высоту превью кстати лучше не фиксировать, а высчитывать из пропорций исходного изображения, чтобы не искажать. Например, ширина превью 100, а ориг.картинки 800, это 100/800. Но высота ориг.картинки 600, тогда высота превью 600*1/8 = 75.
2. Подгружаем ресурс при помощи imagecreatefromjpeg (кстати, почему только jpeg? как насчет gif, а также png, где еще нужно позаботиться о прозрачности?)
3. imagecopyresampled($canvas, $resource, 0, 0, 0, 0, $preview_width, $preview_height, $original_width, $original_height).
4. Отдаем в рабузер или сохраняем на диск при помощи imagejpeg.
А, тебе нужно именно вырезать участок изображения, а не создать уменьшенную копию?
Что-то я туплшю сегодня.
>есть 2 режима уменьшения, когда например мы пытаемся вписать картинку 1000×200 в квадрат 100×100: CROP — уменьшает картинку до 500×100 и отрезает правую и левую части, SCALE — уменьшает картинку до 100×20
SCALE (то, что ты описал) у меня уже сделан. Нужно сделать CROP
>другой порядок заполнения массива
>сделай чтобы определяло еще опечатку в английских словах
Сделал, проверьте:
http://ideone.com/ZJjOOQ
Ладно, я понял, что было не так. В src_w и src_h нужно было писать не размеры исходного изображения, а нужное разрешение конечной превьюшки. Вот скрипт:
http://ideone.com/wdTpjo
Пикрелейтед оригинал и кропнутая превьюшка. Всё верно?
В анусе твоём ошибка.
12
Репозиторий как бы не предназначен, чтобы что-то удалять и перезаписывать с нуля.
Ну удали репозиторий и создай новый с тем же именем. Ссылка же не поменяется.
Если по каким-то причинам не имеешь права удалить репо, то создай новые ветки branch1 и branch2, удали свои старые негодные ветки master и gh-pages, а потом переименуй branch1 и branch2 в master и gh-pages. (Попробуй сначала на фейковом репозитории, чтобы не ошибиться)
Команды:
branch <branch_name> // создает новый бранч
checkout <branch_name> // переключиться на ветку
branch // без аргументов показывает все ветки в локальном репозитории
branch -r // показывает отслеживаемые ветки удаленного репозитория; чтобы ветка была отслеживаемой, нужно пушить ее с опцией -u (push -u)
branch -a // все ветки
branch -m <старое_имя> <новое_имя> // переименовать ветку
branch -d <имя_ветки> // удалить бранч
Спасибо за ответ!
Как мне сделать такой вывод?
Джаваскриптом?
setInterval(function(){
// взять значение из свойств объекта, присвоить это значение innerHTML соответствующих элементов
}, 2000);
У него там гиф, ссылки и описание циклически меняются.
http://ideone.com/MFQNLK
Я так понимаю, надо получить текущее значение страницы и сравнять с массивном, и то, что ниже значения < отсеивается. Но как это сделать — не понимаю.
Прочитал кстати, ОП, тот учебник который ты рекомендовал, а именно http://softwaremaniacs.org/blog/category/primer/, действительно очень неплохой, помог разобраться во многих вещах, так что если кто не читал, прочтите.
Теперь к самому макету:
>Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>
Учел. Сделал через ul, хотя html вышел бы вроде даже короче с nav делал через nav изначально, но была одна ошибочка, думал исправлю ее сделав через ul, но нет, исправил другим способом, а возвращать обратно nav уже не стал.
>Сейчас используют тег strong.
Учел. Статьи прочитал, смысл понял. На сайте переделал.
>Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.
Если что, это сказано было про 4 изображения: андроид, монитор...
Схему понял, переделал.
>-Куча замечаний насчет текста и использования тегов hN-
Разобрался с тем для чего нужны теги и что они не для обозначения размера текста (изначально так и думал). На сайте все переписал.
>У input нет закрывающего тега.
Просто по невнимательности поставил, остаток неудавшегося эксперимента.
>all наверно можно не писать
Класс у работ в портфолио Действительно можно было не писать, переделал, правда чуть увеличился css, зато html стал меньше, ведь в том и смысл?
>Что у тебя за странные отступы перед селектором в CSS?
Привык так делать с начала обучения, показалось красивым, удобным и читаемым. Но со следующей работы буду делать как надо, в этом макете уже оставил как делал.
>Также, сохрани css файл в utf-8.
И как я сам не догадался. И кстати, открыв его в utf-8 без BOM русские буквы были иероглифами, а вот в обычном utf-8 все в порядке. Странно, ведь в редакторе все открывалось нормально, ну да ладно, теперь в курсе как нужно сохранять.
>У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html
Логично, все понял, переделал.
>Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).
Сделал, все работало. Но затем сделав адаптивный дизайн пришлось убрать.
>Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.
Сделал переставлние блоков на ширине 800 и 400. Столкнулся с проблемой что если @media в коде выше того, что оно исправляет, то эта медиа не работает. Помогло только использование !important но в коде это выглядит адски.
Так же переделал шапку при уменьшении экрана, знаю что некрасиво, но я вообще не дизайнер, и даже рисовать не умею, сделал как смог.
>Для лого можно объединить теги div и a.
Логично, переделал.
>При наведении на меню оно окрашивается в какой-то не очень подходящий красный цвет. Я думаю, оттенок красного лучше взять с кнопки. Или хотя бы сделать его более светлым, он же на темном фоне.
Почему-то думал что использую правильный цвет, пока не посмотрел на макет. Действительно не то, все переделал.
Хотя я бы не сказал, что красный ховер на черном фоне плохо выглядит. В этом макете скорее да, но в общем очень даже неплохо.
>Старайся указывать как можно меньше фиксированных размеров. Идея CSS в том что мы стараемся все, что можно, определять автоматически. Тут высота блока должна определяться по содержимому + паддинги сверху и снизу.
Смысл понятен, все осознал, фиксированную высоту отовсюду убрал разве что в шапке оставил.
>Вот это плохо, что ты копипастишь эти width 900px.
Убрал отовсюду эту ширину. Сейчас правда 1100. Оставил в ксс только в одном месте в wrapper. Но пришлось добавить пару дивов-врапперов в html, за что, после прочтения учебника, как я понял, заслуживаю места в аду.
>Вот это все равно плохое имя для класса
Названия классов по цифровому порядку убрал.
>Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.
Учел, исправил во всех случаях.
>Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.
Вроде бы даже изначально он был, но главное что сейчас он присутствует.
>text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
Логично, объединил.
>Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.
Переделал. Тогда центрование мне казалось чем-то сложным почему-то.
>по моему тут проще вообще отключить бордер
Сказано было про бордер вокруг кнопок. Его цвет был одинаковым с фоном. Логично, что он не нужен, убрал.
>Укажи анимируемые свойства явно.
Сказано было про transition: 0.5s;
Это мне нужно объяснить какие свойства я там анимирую и сказать или там что-то прописывать. Если сказать, то у кнопок это плавное изменение цвета при наведении и переключении. У работ в портфолио плавное срезание углов. Так же при переставлении из ряда 4 работы, в ряд из 2 работ это происходит плавно.
>По моему тут не нужны nth-of-type.
Не придумал ничего лучше, да и код лично мне понятен, думаю можно оставить.
>Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента.
Начал переделывать, все развалилось. В новой работе сделаю флоат там где нужно, но в этом случае нужно было переделывать много судя по тому, что у меня не получилось это сделать сразу. Главное это работает. Присвоил каждой работе свою ссылку, переходы идут как надо.
> font-size: 0; Что за грязные трюки?
Вот здесь обидно. Кстати ошибка про которую я говорил выше, когда говорил про ul и nav это пробел после слов, он был некрасив, курсор возле него изменялся, да и можно было выделить этот пробел после слова. Было некрасиво, тем более это кликабельные слова. А нулевой фонт-сайз помог все исправить, никаких левых пробелов теперь нет, да и крашей никаких не наблюдал.
>Социальные иконки надо выводить без img
Сделал.
>Также для них надо сделать эффект при наведении. Например потемнение или осветление.
Немного необычно как мне кажется, но сделал.
>div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно
С этим разобрался. Лишние дивы выкинул.
>У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
Смотрим на пик. Как исправить не знаю. Сам сижу с хрома, поэтому проблемы не заметил. Теперь все проверяю с разных браузеров.
>Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответвует размерами макету, возможно из-за отсутствия шрифта у меня.
Логотип сделал точно таким же как и на psd. И теперь вопрос. Все нужно делать пиксель-в-пиксель как и на том изображении? Я делал на глаз. Это ведь издевательство все высчитывать.
А теперь то, что я не осилил. Шрифты. Оставил их на самый конец. Прочитал только что статьи и понял что ничерта не понял. Попробую еще разобратья завтра на свежую голову. Но пока я ничего не могу сделать. Просто не понимаю что там нужно конвертировать, что загружать на те сайты и т.д. Отдаленно представляю, но пока не могу сделать. И еще. Я загрузил папку со шрифтами ничего оттуда не вырезал лишнего, так 1.2мб загрузил, прописал все в css. Но вот проверить работоспособность не могу, т.к. на моем компьютере этот шрифт был установлен изначально.
Твои посты про мой макет, чтобы их не искать
>>526186
>>526187
Прочитал кстати, ОП, тот учебник который ты рекомендовал, а именно http://softwaremaniacs.org/blog/category/primer/, действительно очень неплохой, помог разобраться во многих вещах, так что если кто не читал, прочтите.
Теперь к самому макету:
>Традиционно меню делают с помощью списка ul/li (типа меню это список ссылок). Также, можно делать его через тег <nav>
Учел. Сделал через ul, хотя html вышел бы вроде даже короче с nav делал через nav изначально, но была одна ошибочка, думал исправлю ее сделав через ul, но нет, исправил другим способом, а возвращать обратно nav уже не стал.
>Сейчас используют тег strong.
Учел. Статьи прочитал, смысл понял. На сайте переделал.
>Я думаю этот пустой див можно либо заменить на padding + backgorund либо (если используется спрайт) на псевдоэлемент. А класс обозначающий картинку перенести на родителя.
Если что, это сказано было про 4 изображения: андроид, монитор...
Схему понял, переделал.
>-Куча замечаний насчет текста и использования тегов hN-
Разобрался с тем для чего нужны теги и что они не для обозначения размера текста (изначально так и думал). На сайте все переписал.
>У input нет закрывающего тега.
Просто по невнимательности поставил, остаток неудавшегося эксперимента.
>all наверно можно не писать
Класс у работ в портфолио Действительно можно было не писать, переделал, правда чуть увеличился css, зато html стал меньше, ведь в том и смысл?
>Что у тебя за странные отступы перед селектором в CSS?
Привык так делать с начала обучения, показалось красивым, удобным и читаемым. Но со следующей работы буду делать как надо, в этом макете уже оставил как делал.
>Также, сохрани css файл в utf-8.
И как я сам не догадался. И кстати, открыв его в utf-8 без BOM русские буквы были иероглифами, а вот в обычном utf-8 все в порядке. Странно, ведь в редакторе все открывалось нормально, ну да ладно, теперь в курсе как нужно сохранять.
>У блочных элементов ширина 100% по умолчанию. min-width лучше указывать на html
Логично, все понял, переделал.
>Насчет ширины — давай сделаем так. На совсем узкой странице пусть допустим ширина серединки будет 900px + 10px поля с краев. На более широкой странице ширина середины увеличивается до 1100px, а дальше растут уже поля с краев. Это достигается с помощью min (на html) и max-width (на wrapper).
Сделал, все работало. Но затем сделав адаптивный дизайн пришлось убрать.
>Также, чтобы научиться адаптивному дизайну, попробуй сделать версию страницы для малекнькой (<= 800) ширины, когда страница перестраивается в виде вертикальной цепочки из блоков. Такие страницы удобно смотреть на смартфоне например. Для этого надо использовать media queries и @media. После того как это сделаешь, добавь meta viewport чтобы мобильные устройства знали что страница под них оптимизирована и не отображали ее в уменьшенном виде.
Сделал переставлние блоков на ширине 800 и 400. Столкнулся с проблемой что если @media в коде выше того, что оно исправляет, то эта медиа не работает. Помогло только использование !important но в коде это выглядит адски.
Так же переделал шапку при уменьшении экрана, знаю что некрасиво, но я вообще не дизайнер, и даже рисовать не умею, сделал как смог.
>Для лого можно объединить теги div и a.
Логично, переделал.
>При наведении на меню оно окрашивается в какой-то не очень подходящий красный цвет. Я думаю, оттенок красного лучше взять с кнопки. Или хотя бы сделать его более светлым, он же на темном фоне.
Почему-то думал что использую правильный цвет, пока не посмотрел на макет. Действительно не то, все переделал.
Хотя я бы не сказал, что красный ховер на черном фоне плохо выглядит. В этом макете скорее да, но в общем очень даже неплохо.
>Старайся указывать как можно меньше фиксированных размеров. Идея CSS в том что мы стараемся все, что можно, определять автоматически. Тут высота блока должна определяться по содержимому + паддинги сверху и снизу.
Смысл понятен, все осознал, фиксированную высоту отовсюду убрал разве что в шапке оставил.
>Вот это плохо, что ты копипастишь эти width 900px.
Убрал отовсюду эту ширину. Сейчас правда 1100. Оставил в ксс только в одном месте в wrapper. Но пришлось добавить пару дивов-врапперов в html, за что, после прочтения учебника, как я понял, заслуживаю места в аду.
>Вот это все равно плохое имя для класса
Названия классов по цифровому порядку убрал.
>Для расширения охвата браузеров добавь версии с вендорными префиксами, -webkit-box-sizing и -moz-box-sizing. Аналогично с border-radius и transition.
Учел, исправил во всех случаях.
>Проверь отступы. На макете например под 4 колонками есть паддинг снизу, пикселей 70-80, у тебя нет.
Вроде бы даже изначально он был, но главное что сейчас он присутствует.
>text-before-portfolio и portfolio-buttons-and-works это одна секция, не две.
Логично, объединил.
>Кнопки надо центрировать, а не подбирать отступ на глаз, который развалится как только мы добавим еще кнопку или поменяем текст. Вряд ли твои коллеги будут рады этому.
Переделал. Тогда центрование мне казалось чем-то сложным почему-то.
>по моему тут проще вообще отключить бордер
Сказано было про бордер вокруг кнопок. Его цвет был одинаковым с фоном. Логично, что он не нужен, убрал.
>Укажи анимируемые свойства явно.
Сказано было про transition: 0.5s;
Это мне нужно объяснить какие свойства я там анимирую и сказать или там что-то прописывать. Если сказать, то у кнопок это плавное изменение цвета при наведении и переключении. У работ в портфолио плавное срезание углов. Так же при переставлении из ряда 4 работы, в ряд из 2 работ это происходит плавно.
>По моему тут не нужны nth-of-type.
Не придумал ничего лучше, да и код лично мне понятен, думаю можно оставить.
>Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента.
Начал переделывать, все развалилось. В новой работе сделаю флоат там где нужно, но в этом случае нужно было переделывать много судя по тому, что у меня не получилось это сделать сразу. Главное это работает. Присвоил каждой работе свою ссылку, переходы идут как надо.
> font-size: 0; Что за грязные трюки?
Вот здесь обидно. Кстати ошибка про которую я говорил выше, когда говорил про ul и nav это пробел после слов, он был некрасив, курсор возле него изменялся, да и можно было выделить этот пробел после слова. Было некрасиво, тем более это кликабельные слова. А нулевой фонт-сайз помог все исправить, никаких левых пробелов теперь нет, да и крашей никаких не наблюдал.
>Социальные иконки надо выводить без img
Сделал.
>Также для них надо сделать эффект при наведении. Например потемнение или осветление.
Немного необычно как мне кажется, но сделал.
>div можно выпилить. Ты всегда можешь сделать <a> блоком или инлайн-блоком или чем угодно
С этим разобрался. Лишние дивы выкинул.
>У тебя есть скругление при наведении на картинку портфолио. Но там какое-то странно скругление, как будто оно обрезано как-то.
Смотрим на пик. Как исправить не знаю. Сам сижу с хрома, поэтому проблемы не заметил. Теперь все проверяю с разных браузеров.
>Логотип у тебя по моему меньше чем в макете. Кнопка See Portfolio не соответвует размерами макету, возможно из-за отсутствия шрифта у меня.
Логотип сделал точно таким же как и на psd. И теперь вопрос. Все нужно делать пиксель-в-пиксель как и на том изображении? Я делал на глаз. Это ведь издевательство все высчитывать.
А теперь то, что я не осилил. Шрифты. Оставил их на самый конец. Прочитал только что статьи и понял что ничерта не понял. Попробую еще разобратья завтра на свежую голову. Но пока я ничего не могу сделать. Просто не понимаю что там нужно конвертировать, что загружать на те сайты и т.д. Отдаленно представляю, но пока не могу сделать. И еще. Я загрузил папку со шрифтами ничего оттуда не вырезал лишнего, так 1.2мб загрузил, прописал все в css. Но вот проверить работоспособность не могу, т.к. на моем компьютере этот шрифт был установлен изначально.
Твои посты про мой макет, чтобы их не искать
>>526186
>>526187
Ну что-то вроде этого:
foreach ($array as $member){
$mask = 'http:\/\/site\.com\/\w+\/w+\/(\d+)';
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
preg_match($mask, $actual_link, $matches);
$curNumber = $matches[1][0];
preg_match($mask, $member['url'],$matches);
$number = $matches[1][0];
if ($number > $curNumber)
echo $member['url'];
}
Плюс ко всему вот что.
1й и 2й скриншоты мои, 3й скриншот сделал мой знакомый. У него в шапке видно, что блок со словами сдвинут немного слева. Я полагаю, что это padding который дают сами браузеры для ul, вот только до этого такая проблема была у меня на пк и вылечилась обнулением всех паддингов. На моем телефоне тоже все ровно, а вот у знакомого почему-то нет. Почему понять не могу.
Сам съеби в бе, даун малолетний.
Эм, я вообще-то делаю задания ОПа и макет, который дал ОП. Тот который легитимный. Так что мне не нужно никуда укатываться.
>Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Забыл спросить - а как со второго компьютера получить доступ к удаленному репозитарию? Допустим, мне нужно в мастер ветку добавить файл?
Так же, как и с первого: ввести логин и пароль, когда спросит при пуше.
remote add origin https://github.com/login/repo_name.git
Ты так много "забыл", что лучше начать учить с самого начала.
https://git-scm.com/book/ru/v1
http://dkab.github.io/jasmine-tests/?spec=4
Алсо, мне больше нравится первое. Но не будет ли такая проверка наличия аргументов избыточной?
Сделай у социальных ссылок изменение прозрачности плавным, пока ОП не видит. Так будет пизже.
Не получается...Я создаю на другом компьютере новую папку в которой инициализирую версионный контроль, в папке создаю файл, который хочу добавить в существующий удаленный репозитарий - команда $git remote add origin <SSH-путь (или HTTPS)> мне выдает ошибку:
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Но в тоже время, когда я в эту папку клонирую весь проект с удаленного репозитария, добавляю новый файл в папку клона и пушу его (файл) на сервер, все нормально.
В общем, я не могу понять, почему так, и как нужно настраивать ключи, чтобы работать с проектами, не клонируя их каждый раз.
Может есть годные курсы? (вот тут точно нужны курсы, английские идиомы хуй выучишь по словарю, пикрелейтед)
Сгенирируй новый ключ:
ssh-keygen -t rsa -b 4096 -C "mylo@moe.com"
и постаавь его в настройках своего акка на гитхабе
Сирики смотрю с фильмами в оригинале. По моему большинство так и учит.
На http://php.net/manual/en/ заходишь, открываешь в параллельных вкладках http://www.lingvo-online.ru/ и google translate и читаешь все статьи подряд, незнакомые слова суешь в лингву и гуглтранслейт. Через пару месяцев такого будешь уже нормально все понимать.
Да ну, я половину слов не понимаю, и они еще так быстро говорят, а американцы часто с реднекским акцентом.
Разве что с субтитрами попробовать, и через каждых пять секунд ставить на паузу.
>>528066
http://www.correctenglish.ru/reference/idioms/cup-of-tea/
Особенно все эти выражения с get, take, put и т.д., у которых стопицот значений, а гугл выдает херню.
Ну ладно, качну сериал с субтитрами.
Так я с субтитрами и смотрю. Сейчас уже почти не ставлю паузы, буквально 1 или 2 раза за весь фильм. И тё, только для того, чтобы посмотреть заинтересовавшее меня слово, которое никак не влияет на сюжет и моё понимание фильма в целом.
1. Берём два случайных id (можно сгенерировать)
2. Делаем запрос на получение всех друзей id#1, и ищем среди этого массива id#2, если не находим то уже делаем запрос по каждому другу из полученного массива и ищем id#2, если и тут ничего не получаем то формируем массив из всех друзей второго уровня (друзей друзей друзей) и ищем уже по ним и так дальше.
Короче скрипт не желает работать уже после того как я просто ищу по друзьям друзей, работает если например ограничить обход 50 друзьями друзей, в итоге у меня получается примерно 15 000 уникальных id из которых можно искать нужный id#2, но получить большее количество весьма проблематично.
У меня вопрос, это впринципе не решаемая задача в домашних условиях? Либо я слишком утяжелил скрипт и пройтись так по 3-4 уровням вполне реально?
Html нужен для каркаса, css для представления ("разукраски" этого каркаса), javascript для того чтобы страница реагировала на действия пользователя, в основном на движения и клики мыши, а также подгрузки данных с сервера без перезагрузки страницы (технология ajax). Javascript встроен в браузер.
Php крутится на сервере. И поскольку держать тысячи однотипных html страниц на сервере не выгодно, php занимается в основном тем, что берет информацию из базы данных (нужно знать язык запросов к базе SQL), и собирает страницу из этих данных и кусков html из шаблонов. Так мы получаем страницу для конкретного пользователя, например.
Блог с учебником для начинающих и задачами в оп-посте.
>Блог с учебником для начинающих и задачами в оп-посте.
Да, но там сразу уроки PHP и нет ни html, ни javascript
Сделал. Но, по ходу, все равно приходиться делать пулл (скачивать весь репозитарий) в папку с новым файлом, чтобы иметь возможность вносить в проект изменения. Это так и задумано?
Использую не класс VK API а file_get_contents. Конечно можно разбить задачу на несколько этапов и на несколько скриптов, например вначале по нажатию одной кнопки проверить первый уровень друзей (записать id в файл, примерно 250-300 id), потом проверить второй уровень по нажатию другой кнопки (записать все ид в файл это уже примерно 60000 id), потом разбить по частям и проверить третий уровень (записать в файл это уже примерно 18000000) то есть на третьем уровне уже очень большая вероятность найти нужный ид. Но хотелось бы сделать всё одним скриптом за одну загрузку, или слишком много информации для такого придётся обрабатывать?
Дело в том что я хочу исследовать соц.сеть, и суть в том что бы не только 2 или 3 клика до необходимого человека а например 2,6 или 1,9 кликов (взависимости от ранжировки друзей в списке мои друзья), а также проверить всё это по гендерному и географическому принципу.
>Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
htmlbook.ru, htmlacademy.ru, видеокурсы центра "Специалист"
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
learn.javasript.ru
- MySQL: https://gist.github.com/codedokode/10539213
По верстке и MySQL можно еще попробовать загуглить какие-нибудь книжки.
По js и php хороших книг для новичков нет.
Ясно, спасибо
а где нужно писать на js?
на форчане сижу
Парни, как вывести первое значения без изменений, а потом уже учитывая step.
не могу придумать.
Проверить шрифт можно поменяв его имя. Напиши временно в @font-face другое имя, например OpenSans2 и аналогично в font-family. И тестируй. Не забудь только потом назад поменять.
Игнорируйте этого тролля. Верстка это часть разработки веб-приложений и разрываться на 10 тредов по каждой отдельной технологии я не собираюсь. В шапке написано что мы изучаем тут и HTML и CSS в том числе.
Если каким-то троллям это не нравится их никто тут не удерживает, валите в любой другой тред.
>>528040
Это ты всего лишь дополнение которое тут никому не нужно. Проваливай, клоун.
>>528029
Клонировать.
>>528062
ОП изучал в школе, универе (пару лет), читал мануалы и форумы на английском, а потом чтобы не забыть, начал смотреть фильмы исключительно на языке оригинала с английскими субтитрами.
Вот вам кстати пару сайтов на английском, с относительно несложными текстами:
http://news.ycombinator.com/ (IT тематика типа нашего хабра)
reddit.com (просто всякая ерунда, по тематике напоминает /b )
Вообще, мне кажется, сейчас изучать английский гораздо проще, у вас и интернеты есть, и ютубы, бери и изучай.
>>528075
> Да ну, я половину слов не понимаю, и они еще так быстро говорят, а американцы часто с реднекским акцентом.
Это нормально, так как произношение всех звуков в английском другое, но со временем ты привыкаешь. Я когда первый раз решил посмотреть «Друзей» на английском, я вообще ничего не понял из того что они говорят, так как я текст лучше воспринимал, чем речь. А на японском наоборот, я речь лучше воспринимаю чем текст.
Ну и в сериалах хорошо то, что часто смысл понятен из картинки, выражений лиц и тд.
>>528093
> , все равно приходиться делать пулл (скачивать весь репозитарий) в папку с новым файлом, чтобы иметь возможность вносить в проект изменения. Это так и задумано?
Гит это не FTP сервер. Тебе нужно иметь копию репозитория чтобы что-нибудь с ним сделать.
В этом и идея гита, что у каждого участника есть полная копия репозитория (с полной историей). pull и push всего лишь позволяют синхронизировать новые изменения. Почитай учебник по гиту.
Это позволяет работать с репозиторием даже при отсутствии связи и делает систему более надежной (так как у каждого участника есть полная копия данных).
Раньше были системы типа SVN где репозиторий хранился на центральном сервере, а на компьютере только файлы из одной текущей ревизии. На практике SVN оказлся менее удобен и менее надежен. Ну к примеру без интернета ты не можешь даже историю смотреть, не говоря о том чтобы делать коммиты. А если владелец сервера грохнет репозиторий, то никто его уже не восстановит.
И в чем проблема клонировать репозиторий? У тебя там терабайт файлов что ли?
Игнорируйте этого тролля. Верстка это часть разработки веб-приложений и разрываться на 10 тредов по каждой отдельной технологии я не собираюсь. В шапке написано что мы изучаем тут и HTML и CSS в том числе.
Если каким-то троллям это не нравится их никто тут не удерживает, валите в любой другой тред.
>>528040
Это ты всего лишь дополнение которое тут никому не нужно. Проваливай, клоун.
>>528029
Клонировать.
>>528062
ОП изучал в школе, универе (пару лет), читал мануалы и форумы на английском, а потом чтобы не забыть, начал смотреть фильмы исключительно на языке оригинала с английскими субтитрами.
Вот вам кстати пару сайтов на английском, с относительно несложными текстами:
http://news.ycombinator.com/ (IT тематика типа нашего хабра)
reddit.com (просто всякая ерунда, по тематике напоминает /b )
Вообще, мне кажется, сейчас изучать английский гораздо проще, у вас и интернеты есть, и ютубы, бери и изучай.
>>528075
> Да ну, я половину слов не понимаю, и они еще так быстро говорят, а американцы часто с реднекским акцентом.
Это нормально, так как произношение всех звуков в английском другое, но со временем ты привыкаешь. Я когда первый раз решил посмотреть «Друзей» на английском, я вообще ничего не понял из того что они говорят, так как я текст лучше воспринимал, чем речь. А на японском наоборот, я речь лучше воспринимаю чем текст.
Ну и в сериалах хорошо то, что часто смысл понятен из картинки, выражений лиц и тд.
>>528093
> , все равно приходиться делать пулл (скачивать весь репозитарий) в папку с новым файлом, чтобы иметь возможность вносить в проект изменения. Это так и задумано?
Гит это не FTP сервер. Тебе нужно иметь копию репозитория чтобы что-нибудь с ним сделать.
В этом и идея гита, что у каждого участника есть полная копия репозитория (с полной историей). pull и push всего лишь позволяют синхронизировать новые изменения. Почитай учебник по гиту.
Это позволяет работать с репозиторием даже при отсутствии связи и делает систему более надежной (так как у каждого участника есть полная копия данных).
Раньше были системы типа SVN где репозиторий хранился на центральном сервере, а на компьютере только файлы из одной текущей ревизии. На практике SVN оказлся менее удобен и менее надежен. Ну к примеру без интернета ты не можешь даже историю смотреть, не говоря о том чтобы делать коммиты. А если владелец сервера грохнет репозиторий, то никто его уже не восстановит.
И в чем проблема клонировать репозиторий? У тебя там терабайт файлов что ли?
Дружище, тут суть не только в CSS, к сожалению.
>>527857
Спасибо за советы. Пердолился весь вечер и таки осилил селекторы.
>>528037
Нет, воспринимаю с трудом практически любую информацию. Во время изучения чего - то мозг будто бы превращается в желе. С воображением лучше, чем надо. Сотни безумных идей, придуманных вселенных ну и так далее.
У меня получилось. Теперь как зациклить, чтобы показывало и A, и B в конце?
A
B
G
J
А я хочу, чтобы было:
G
J
A
B
Добавить ещё один цикл по массиву с противоположным знаком сравнения во внутреннем условном операторе.
Правда я не понял, что ты делаешь, и вообще ньюфаг.
Как теперь лимит, чтобы выводились не все массивы, а только пять значений?
http://ideone.com/jWrrod
Всё, решил задачу. Оказалось на до прикрутить array_slice.
Бамп вопросу. Я правильно понял задание?
$i = 0;
foreach($posts as $post) {
$i++;
if ($i > 5) break;
if ($actual_title > $post['title']) {
if ($actual_title > $post['title']) {
\t echo $post['title']."<br>\n";
}
}
}
Регулярка умеет искать по пробелам же. ,\s для запятой с пробелом например.
Резать ничего не нужно, нужно универсальную маску регуляркой.
> А потом нужно ещё что-то пользователю вывести, желательно чтобы он быстро нашёл это место в тексте, значит на выводе должно получиться что-то вроде
Да, все найденные куски текста с ошибкой вывести.
>Для этого нужно, чтобы регулярка искала слово целиком, до следующего за ним пробела.
Скорее слово+знак препинания+пробел+слово. Под это маску и пиши.
>(,|;|!) - это группа для
Вряд ли тут группа нужна, скорее брэкет []
Сейчас какие-то хомячьи, т.е. обывательские треды уровня жж.
Даже не знаю, как к этому относиться. Впрочем, мне уже похуй и я почти не сижу на бордах, а занимаюсь полезным делом.
Спасибо абу опу.
Перед экзаменами там как-то полезные треды кидали про написание заданий для лабораторки. Впрочем решить никто не смог, это же /b.
Спасибо, буду разбираться.
> Вряд ли тут группа нужна, скорее брэкет []
Да, уже тоже сообразил.
Я немного обосрался. Всё работает, только когда вывожу все тайлы в массиве. Но когда уменьшаю array_slice($posts, 0, 5), то значения обрезаются сразу в двух массивах.
Как прикрутить эту считалку сюда?
http://ideone.com/X8pjLM
>$i++;
>if ($i > 5) break;
if ($actual_title < $post['title']) {
\t\t\techo $post['title'] . "<br />\n";
\t\t\t}
Сюда сунь.
Всего тебе самого хорошего!
верстка тут нахуй не нужна. все начинают с верстки в воркаче, а не приходят учиться верстке в пхп треде, проваливай клоун из моего треда бтв.
я на duolingo + memrise. По 5-6 повторений на memrise+15 новых слов и 2-3 урока на duolingo в день. Читать что-то труднее "It is a book", пока не могу. Когда подтяну, попытаюсь перевисти мануал по slim'у. И себе польза и анонам будет.
>если на соседних по горизонтали, вертикали, диагонали с >мышкой клетках есть еще 2 мышки, то кошка не может >съесть мышку и встать на ее клетку (мыши объединяются и >защищают друг друга).
Как я понимаю только мышка в центре ,окруженная другими мышами, защищена, а мыши с края ? Их можно съесть?
. . M <-- вот эту можно съесть ?
. M К
. M .
>memrise
О, помню пол-года назад тоже решил подтянуть свой словарный запас там. После прохождения курса мотивация повторять из него слова постепенно улетучивалась, слова накапливались и я забросил это дело.
Тогда это уже не мыши, а самые настоящие крысы
вот ссыль
https://nnm-club.me/forum/viewtopic.php?t=916985
Сам сижу на 8 ломанном под линухом, качал с этого же трекера
Что за маркер строк? У меня ничего не пропадает. А кодировку он по дефолту и так в cp1251 ставит, там внизу справа надпись есть, на нее кликаешь и жмешь UTF-8, он тебе окошко показывает, где Convert нажать, и будет utf8.
На андроиде есть годные упражнялки «полиглот». Установи бесплатно с помощью блекмарта.
https://play.google.com/store/apps/details?id=ru.descbook.polyglot
https://play.google.com/store/apps/details?id=com.kostosha.poliglot16.full
https://play.google.com/store/apps/details?id=com.axidep.polyglotfull
https://play.google.com/store/apps/details?id=com.axidep.polyglotarticles
Settings - в поиске encoding - project encoding - utf-8
> Сырая строка же. Необработанные входные данные. Английский жи.
Тогда стоило назвать sourceString. А регулярку keyRegexp (или keyRe сокращенно). А класс StringParser, а метод parse или parseString. Не стоит делать лишние сокращения, так как это усложняет понимание кода читателем.
Ну и я бы убрал поля rawStr и Dict так как никакой необходимости хранить их постоянно нет. Строку ты даешь методу на вход, словарь получаешь на выходе.
Но в первую очередь надо конечно заставить код работать.
Кстати, код я советую постить на ideone, так как там его можно сразу же выполнить.
>>527638
Ответ должен быть около 61270.
У тебя ошибка как минимум тут:
> $paymentTotal = $creditBalance + 50000;
Откуда взялось 50 000 ? Оно в условии задачи не фигурирует. Ты может хотел написать 5 000?
А также: надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда он маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>527704
Я думаю тебе стоит почитать уголовный кодекс, раздел про мошенничество, осуществляемое организованной группой. Также я не уверен, но может быть к этому можно еще прикрутить статью за подделку документов.
>>527708
Через pdo, фреймворк этим не занимается.
>>527722
> Должно быть одно регулярное выражение, которое будет искать все ошибки и заносить найденные в массив?
да, одно или несколько. Имея регулярку, ты можешь вызвать функцию preg_match_all которая находит все места в тексте соответствующие регулярке, и кладет в сложный двухмерный массив. preg_match не годится так как она ищет только первое совпадение с шаблоном.
> А потом нужно ещё что-то пользователю вывести, желательно чтобы он быстро нашёл это место в тексте, значит на выводе должно получиться что-то вроде
Можно вывести так:
Ошибка: нет пробела после знака препинания: ,после
Ошибка: жи-ши пишутся с буквой «и»: жызнь
А можно так:
Результат проверки, ошибок: 5
Нет пробела[,]после запятой[;]точки с запятой[!]:ж[ы]знь
> Для этого нужно, чтобы регулярка искала слово целиком, до следующего за ним пробела.
Лучше использовать условие «искать все идущие далее буквы», так как пробела может и не быть.
> Сырая строка же. Необработанные входные данные. Английский жи.
Тогда стоило назвать sourceString. А регулярку keyRegexp (или keyRe сокращенно). А класс StringParser, а метод parse или parseString. Не стоит делать лишние сокращения, так как это усложняет понимание кода читателем.
Ну и я бы убрал поля rawStr и Dict так как никакой необходимости хранить их постоянно нет. Строку ты даешь методу на вход, словарь получаешь на выходе.
Но в первую очередь надо конечно заставить код работать.
Кстати, код я советую постить на ideone, так как там его можно сразу же выполнить.
>>527638
Ответ должен быть около 61270.
У тебя ошибка как минимум тут:
> $paymentTotal = $creditBalance + 50000;
Откуда взялось 50 000 ? Оно в условии задачи не фигурирует. Ты может хотел написать 5 000?
А также: надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда он маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;
Попробуй переписать код внутри цикла примерно так:
- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
«Платим» здесь значит уменьшаем долг и увеличиваем общую сумму выплаченного.
>>527704
Я думаю тебе стоит почитать уголовный кодекс, раздел про мошенничество, осуществляемое организованной группой. Также я не уверен, но может быть к этому можно еще прикрутить статью за подделку документов.
>>527708
Через pdo, фреймворк этим не занимается.
>>527722
> Должно быть одно регулярное выражение, которое будет искать все ошибки и заносить найденные в массив?
да, одно или несколько. Имея регулярку, ты можешь вызвать функцию preg_match_all которая находит все места в тексте соответствующие регулярке, и кладет в сложный двухмерный массив. preg_match не годится так как она ищет только первое совпадение с шаблоном.
> А потом нужно ещё что-то пользователю вывести, желательно чтобы он быстро нашёл это место в тексте, значит на выводе должно получиться что-то вроде
Можно вывести так:
Ошибка: нет пробела после знака препинания: ,после
Ошибка: жи-ши пишутся с буквой «и»: жызнь
А можно так:
Результат проверки, ошибок: 5
Нет пробела[,]после запятой[;]точки с запятой[!]:ж[ы]знь
> Для этого нужно, чтобы регулярка искала слово целиком, до следующего за ним пробела.
Лучше использовать условие «искать все идущие далее буквы», так как пробела может и не быть.
Боюсь, что с такой манерой задавать вопросы тебе отвечать никто не станет. Если ты считаешь, что я написал что-то неправильно, то можно нормально об этом сказать. С одноклассниками своими можешь в таком тоне разговаривать.
>>527726
Почему ты решил, что не устроиться? И почему ты думаешь что аноны из нашего треда нигде не учатся?
>>527732
Надо доктрину. К счастью, в файлообменнике база простая и можно ручками сделать data mapper-ы заодно потренировавшись в их написании.
Хотя вообще, я видел как с большими базами без всяких абстракций работают. Не уверен, правда, что это хорошо.
>>527745
Можно и то и другое делать параллельно.
>>527752
Ну так посмотри что ты передаешь в конструктор LessFilter. Возможно ты не напрямую его вызываешь, а через какую-то функцию или опцию в конфиге, тогда поменяй ее.
Например вот это вот:
> filter='less,cssrewrite,?yui_css'
Правильно? Тут строка должна быть, а не массив?
>>527812
Тебе нужна ссылка на файл или приложить файл к письму? Если первое то тебе надо как-то сохранять файл в папку, переименовывать (например дописыват уникаьное число чтобы можно было загружать файл с одинаковым названием несколько раз), формировать ссылку и отправлять.
Если второе, то тебе наверно стоит использовать библиотеку для отправки писем вроде Swiftmailer. Ну и вообще, мне кажется, с ней код может лучше получиться и например не будет проблем с русскими буквами.
Чтобы нормально с этим работать, тебе надо знать особенности устройства писем, и что можно в них передавать.
> $fileExt = substr(strrchr($_FILES['filename']['name'], '.'), 1);
Лучше использовать регулярку или pathinfo() чем городить такие странные конструкции. Что, например, если в имени нет точки?
> echo 'Данный файл не разрешен к загрузке на сервер';
Без заголовка Content-Type или тега meta надпись может вывестись не в той кодировке
>>527840
Ну не знаю, если что-то непонятно, ты можешь тут задать конкретный вопрос, может окажется что ты просто какой-то вещи не знал и из-за этого тупишь.
Насчет таблеток, я сильно сомневаюсь что они что-то полезное делают. Если бы можно было улучшить работу мозга каким-то веществом, организм бы давно научился его вырабатывать в ходе эволюции.
>>527850
Для верстки надо читать теорию, а не переставлять наугад свойства пока оно не заработает.
Ну и ты тоже, задал бы вопросы, может ты просто что-то не понимаешь.
>>527871
Подсказка: попробуйте обозначить число съеденных Сашей яблок переменной x.
Боюсь, что с такой манерой задавать вопросы тебе отвечать никто не станет. Если ты считаешь, что я написал что-то неправильно, то можно нормально об этом сказать. С одноклассниками своими можешь в таком тоне разговаривать.
>>527726
Почему ты решил, что не устроиться? И почему ты думаешь что аноны из нашего треда нигде не учатся?
>>527732
Надо доктрину. К счастью, в файлообменнике база простая и можно ручками сделать data mapper-ы заодно потренировавшись в их написании.
Хотя вообще, я видел как с большими базами без всяких абстракций работают. Не уверен, правда, что это хорошо.
>>527745
Можно и то и другое делать параллельно.
>>527752
Ну так посмотри что ты передаешь в конструктор LessFilter. Возможно ты не напрямую его вызываешь, а через какую-то функцию или опцию в конфиге, тогда поменяй ее.
Например вот это вот:
> filter='less,cssrewrite,?yui_css'
Правильно? Тут строка должна быть, а не массив?
>>527812
Тебе нужна ссылка на файл или приложить файл к письму? Если первое то тебе надо как-то сохранять файл в папку, переименовывать (например дописыват уникаьное число чтобы можно было загружать файл с одинаковым названием несколько раз), формировать ссылку и отправлять.
Если второе, то тебе наверно стоит использовать библиотеку для отправки писем вроде Swiftmailer. Ну и вообще, мне кажется, с ней код может лучше получиться и например не будет проблем с русскими буквами.
Чтобы нормально с этим работать, тебе надо знать особенности устройства писем, и что можно в них передавать.
> $fileExt = substr(strrchr($_FILES['filename']['name'], '.'), 1);
Лучше использовать регулярку или pathinfo() чем городить такие странные конструкции. Что, например, если в имени нет точки?
> echo 'Данный файл не разрешен к загрузке на сервер';
Без заголовка Content-Type или тега meta надпись может вывестись не в той кодировке
>>527840
Ну не знаю, если что-то непонятно, ты можешь тут задать конкретный вопрос, может окажется что ты просто какой-то вещи не знал и из-за этого тупишь.
Насчет таблеток, я сильно сомневаюсь что они что-то полезное делают. Если бы можно было улучшить работу мозга каким-то веществом, организм бы давно научился его вырабатывать в ходе эволюции.
>>527850
Для верстки надо читать теорию, а не переставлять наугад свойства пока оно не заработает.
Ну и ты тоже, задал бы вопросы, может ты просто что-то не понимаешь.
>>527871
Подсказка: попробуйте обозначить число съеденных Сашей яблок переменной x.
Это да, тоже заметил, что читая длиннопосты с прокруткой при наведении на ссылку пост появляется хрен знает где внизу.
Приходится искать его через поиск по номеру.
Ты делаешь неправильно. Не надо формировать JS код программой на PHP так как получается нечитаемая лапша. Ну и в твоем случае вообще нет гарантий что код окажется верным.Например, что если $points[$i]['name'] содержит одиночную кавычку или перевод строки?
Для передачи данных из PHP в JS код есть проверенные способы:
Если тебе нужно заложить какие-то данные в DOM-элемент, можно использовать data-атрибуты, например:
<img src="small.jpg" data-full-size="big.jpg" alt="">
Разумеется, таким образом можно передавать только строки, так как атрибут тега это строка. Не забудь использовать htmlspecialchars() для корректной передачи любых символов (включая двойные кавычки).
Но тут все еще проще. Тебе можно передать данные напрямую в JS-скрипт:
<script>
var places = [{ name: 'place 1', coordinates: ... }, {name: 'place 2', coordinates: ...}];
showPlaces(places);
</script>
При этом функция showPlaces может быть во внешнем JS файле.
Как корректно подставить данные из PHP в JS-строку, соблюдая все правила экранирования спецсимволов? Раньше я писал для этого свою функцию, но потом обнаружил что существует готовая:
var data = <?= json_encode($phpData) ?>;
Так как JSON это подмножество JS то любое JSON-закодированное значение является корректным значением в яваскрипте и мы можем смело присвоить его переменной, и не бояться что полуим ошибку JS. Таким образом можно передавать значения null, false|true, цифры, строки, массивы и словари.
Заметь что мы не используем здесь htmlspecialchars. Почему? Потому, что теги script и style имеют особый тип содержимого: в них не интерпретируются html-сущности вроде < и в них угловые скобки не обознгачают теги, а передаются js- или css-движку как есть. Потому при вставке данных внутрь style/script не надо их экранировать. Единственное, в этих данных не должна встречаться последовательность
</
которая браузером можт интерпретироватся как конец тега script/style. json_encode заменяет / на \/ потому в ее результате такая последовательность встретчиться не может.
Это относится только в тегами script/style. Если ты хочешь вставить js-переменную, например в атрибутт тега, ты обязан ее экранировать по всем правилам:
<div onclick="doSmth(<?= htmlspecialchars(json_encode($value), ENT_QUOTES) ?>)">
В общем, json_encode генерирует валидный код на языке яваскрипт, представляющий переданное значение.
В твоем случае тебе надо сделать PHP-массив и превратить его в JS массив именно таким способом.
> Я к сожалению с JS знаком очень плохо.
Если твоих знаний JS не хватает, придется либо подучить его либо спросить совету а того кто его знает.
Думаю этот пост пригодится не только тебе но и другим анонам.
Ты делаешь неправильно. Не надо формировать JS код программой на PHP так как получается нечитаемая лапша. Ну и в твоем случае вообще нет гарантий что код окажется верным.Например, что если $points[$i]['name'] содержит одиночную кавычку или перевод строки?
Для передачи данных из PHP в JS код есть проверенные способы:
Если тебе нужно заложить какие-то данные в DOM-элемент, можно использовать data-атрибуты, например:
<img src="small.jpg" data-full-size="big.jpg" alt="">
Разумеется, таким образом можно передавать только строки, так как атрибут тега это строка. Не забудь использовать htmlspecialchars() для корректной передачи любых символов (включая двойные кавычки).
Но тут все еще проще. Тебе можно передать данные напрямую в JS-скрипт:
<script>
var places = [{ name: 'place 1', coordinates: ... }, {name: 'place 2', coordinates: ...}];
showPlaces(places);
</script>
При этом функция showPlaces может быть во внешнем JS файле.
Как корректно подставить данные из PHP в JS-строку, соблюдая все правила экранирования спецсимволов? Раньше я писал для этого свою функцию, но потом обнаружил что существует готовая:
var data = <?= json_encode($phpData) ?>;
Так как JSON это подмножество JS то любое JSON-закодированное значение является корректным значением в яваскрипте и мы можем смело присвоить его переменной, и не бояться что полуим ошибку JS. Таким образом можно передавать значения null, false|true, цифры, строки, массивы и словари.
Заметь что мы не используем здесь htmlspecialchars. Почему? Потому, что теги script и style имеют особый тип содержимого: в них не интерпретируются html-сущности вроде < и в них угловые скобки не обознгачают теги, а передаются js- или css-движку как есть. Потому при вставке данных внутрь style/script не надо их экранировать. Единственное, в этих данных не должна встречаться последовательность
</
которая браузером можт интерпретироватся как конец тега script/style. json_encode заменяет / на \/ потому в ее результате такая последовательность встретчиться не может.
Это относится только в тегами script/style. Если ты хочешь вставить js-переменную, например в атрибутт тега, ты обязан ее экранировать по всем правилам:
<div onclick="doSmth(<?= htmlspecialchars(json_encode($value), ENT_QUOTES) ?>)">
В общем, json_encode генерирует валидный код на языке яваскрипт, представляющий переданное значение.
В твоем случае тебе надо сделать PHP-массив и превратить его в JS массив именно таким способом.
> Я к сожалению с JS знаком очень плохо.
Если твоих знаний JS не хватает, придется либо подучить его либо спросить совету а того кто его знает.
Думаю этот пост пригодится не только тебе но и другим анонам.
А в data-атрибуты htmlspecialchars(json_encode(javascript код)) можно совать?
И как его читать оттуда потом?
> А почему не сформировать массив myPlaces прямо из php?
Ты мыслишь в верном направлении, но тут надо использовать json_encode вместо echo так как echo не выводит массивы. А формировать JS код руками когда есть готовая надежная функция, которая корректно передает любые символы — не лучшая идея.
>>527891
Ну так и решить он сможет только эти задачи, а если будет ошибка то не сможет ее отладить. Программирвание это не работа по сборке деталей на конвеере, тут важнее понимание а не заучивание.
>>527893
Почитай пост выше про json_encode.
>>527895
Twig это хорошо, но тут надо использоать json_encode, читай пост выше. Не надо генерирвать JS код на PHP или twig. Кстати в twig тоже есть json_encode.
>>527899
> Чаще всего ярко развитым абстрактным мышлением обладают мужчины, женщин намного реже.
дальше можно не читать
>>527900
> Пикрелейтед: слева результат выполнения программы, справа то, как должно быть по логике, если я конечно правильно понял суть кропа.
Ты искажаешь пропорции (отношение ширины к высоте), отсюда ошибка. Поправь свои формулы, чтобы и высота и ширина делились/умножались на одно и то же число.
CROP реализуется тем, что ты вырезаешь часть картинки, там у imagecopyresampled есть параметры определяющие какую часть (отступ и размеры) картинки скопировать. Ну условно если у нас есть картинка размером 400×100 а мы хотим 50×50 то нам надо вырезить из исходной квадрат посередине, размером 100×100, отстоящий от левого края на (400 -100) / 2 = 150 пикселей. Попробуй на бумаге это нарисовать.
>>527910
Чтобы вырезать надо укзать как раз ненулевые значения в imagecopyresampled.
>>527941
Делились же аноны в других тредах.
>>527944
> [а-яёА-ЯЁ]*[a-zA-Z]*)*)
Это можно записать проще, засунув диапазоны букв в одну общую пару квадратных скобок
> $word = ltrim($match[0]);
А зачем ltrim? Там разве могут попасть пробелы?
А вообще, неплохо сделано.
>>527950
Выглядит верно, проверь еще обработку полупрозрачных (а не просто прозрачных) PNG, пример картинки: https://ru.wikipedia.org/wiki/PNG#/media/File:PNG_transparency_demonstration_1.png
>>527964
> . Буду рад рад, если вкратце напишете мне последовательность действий, советы вроде "юзай $git clone" мне мало помогут.
Клонируешь репо с гитхаба на компьютер 2:
git clone http//lalala . (точка значит в текущую папку, без нее гит создаст подпапку в ней)
переходишь в нужную ветку, git checkout (увидеть спсиок веток: git branch)
меняешь что надо, делаешь git add . /git commit -m "..."
заливаешь изменения текущей ветки на гитхаб: git push origin HEAD
Если ты работаешь с репозиторием с некольких устройств, тебе надо на каждом имеь полный клон. Также, перед тем как делать push придется сделать git pull origin master (для ветки master) чтобы сначала скачать изменения сделанные с других компьютеров.
Подробнее это описано тут:
https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8
https://git-scm.com/book/ru/v1/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8
> А почему не сформировать массив myPlaces прямо из php?
Ты мыслишь в верном направлении, но тут надо использовать json_encode вместо echo так как echo не выводит массивы. А формировать JS код руками когда есть готовая надежная функция, которая корректно передает любые символы — не лучшая идея.
>>527891
Ну так и решить он сможет только эти задачи, а если будет ошибка то не сможет ее отладить. Программирвание это не работа по сборке деталей на конвеере, тут важнее понимание а не заучивание.
>>527893
Почитай пост выше про json_encode.
>>527895
Twig это хорошо, но тут надо использоать json_encode, читай пост выше. Не надо генерирвать JS код на PHP или twig. Кстати в twig тоже есть json_encode.
>>527899
> Чаще всего ярко развитым абстрактным мышлением обладают мужчины, женщин намного реже.
дальше можно не читать
>>527900
> Пикрелейтед: слева результат выполнения программы, справа то, как должно быть по логике, если я конечно правильно понял суть кропа.
Ты искажаешь пропорции (отношение ширины к высоте), отсюда ошибка. Поправь свои формулы, чтобы и высота и ширина делились/умножались на одно и то же число.
CROP реализуется тем, что ты вырезаешь часть картинки, там у imagecopyresampled есть параметры определяющие какую часть (отступ и размеры) картинки скопировать. Ну условно если у нас есть картинка размером 400×100 а мы хотим 50×50 то нам надо вырезить из исходной квадрат посередине, размером 100×100, отстоящий от левого края на (400 -100) / 2 = 150 пикселей. Попробуй на бумаге это нарисовать.
>>527910
Чтобы вырезать надо укзать как раз ненулевые значения в imagecopyresampled.
>>527941
Делились же аноны в других тредах.
>>527944
> [а-яёА-ЯЁ]*[a-zA-Z]*)*)
Это можно записать проще, засунув диапазоны букв в одну общую пару квадратных скобок
> $word = ltrim($match[0]);
А зачем ltrim? Там разве могут попасть пробелы?
А вообще, неплохо сделано.
>>527950
Выглядит верно, проверь еще обработку полупрозрачных (а не просто прозрачных) PNG, пример картинки: https://ru.wikipedia.org/wiki/PNG#/media/File:PNG_transparency_demonstration_1.png
>>527964
> . Буду рад рад, если вкратце напишете мне последовательность действий, советы вроде "юзай $git clone" мне мало помогут.
Клонируешь репо с гитхаба на компьютер 2:
git clone http//lalala . (точка значит в текущую папку, без нее гит создаст подпапку в ней)
переходишь в нужную ветку, git checkout (увидеть спсиок веток: git branch)
меняешь что надо, делаешь git add . /git commit -m "..."
заливаешь изменения текущей ветки на гитхаб: git push origin HEAD
Если ты работаешь с репозиторием с некольких устройств, тебе надо на каждом имеь полный клон. Также, перед тем как делать push придется сделать git pull origin master (для ветки master) чтобы сначала скачать изменения сделанные с других компьютеров.
Подробнее это описано тут:
https://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8
https://git-scm.com/book/ru/v1/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8
Кстати вот еще пара вещей тебе в помощь. git push по умолчанию пушит только текщую (или указанную ветку). Но ты можешь пушить изменения во всех ветках командой
git push --all origin
Почему гит не пушит все по умолчанию? Потому что у тебя могут быть свои личные ветки которые не нужны другим разработчикам. Но в твоей ситуации ты работаешь один и тебе удобнее пушить все что есть на сервер, чтобы не было такого что одна ветка на одном компьютере есть, а на другом нет.
Также вроде бы доступна git pull --all но она скачивает все ветки в твой репозиторий, но мержит только текущую. То есть если ты сидишь в мастере и у тебя есть ветки a, b то изменения в master она скачает и смерджит, а изменения в a и b cкачаются в origin/a и origin/b но сами a и b останутся прежними (надо будет потом сделать либо pull либо merge перейдя в них).
>Это можно записать проще, засунув диапазоны букв в одну общую пару квадратных скобок
Хм, да, действительно, вообще не заметил это, спасибо.
>А зачем ltrim? Там разве могут попасть пробелы?
Всегда попадают, там же регулярка с /\s начинается.
И еще, если ты используешь репо для github pages ты можешь удалить master и сделать основной веткой gh-pages, разобравшись с советами тут: http://stackoverflow.com/questions/1485578/change-a-git-remote-head-to-point-to-something-besides-master
>>527981
Не надо ничего удалять, надо склонировать репозиторий и сделать нужные изменения.
>>527987
Циклом foreach
>>527990
зачем тут яваскрипт, это все делается на стороне PHP
>>527996
> Но как это сделать — не понимаю.
Через if. Ты PHP знаешь?
Почитай еще про шаблоны: http://www.phpinfo.su/articles/practice/shablony_v_php.html
Не пойму такую конструкцию:
class IndexControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$ctrl = new IndexController();
$ctrl->setGreetingService(
$serviceLocator->getServiceLocator()->get('greetingService')
);
return $ctrl;
}
}
Вот этот момент:
$serviceLocator->getServiceLocator()
Экземпляр ServiceLocator уже приходит в аргументе функции createService, зачем из него снова getServiceLocator() вызывается? В createService аргументом разве не он уже пришел?
>Не надо ничего удалять, надо склонировать репозиторий и сделать нужные изменения.
Ну я так понял, что ему нужно как раз начисто перезалить репозиторий, потому что он стесняется своего старого говнокода и хочет от него избавиться.
А ты предлагаешь только закоммитить сверху изменения. Старые коммиты ведь будут видны.
Целый день провозился. Данные за 15 лет.
xml → array → sparklines
Динамика курса валют. Слева мыльный пузырь, проклятые бумажки, а справа — наше всё. Завтра попробуй сложить эти данные, чтобы увидеть разницу.
https://2ch.hk/pr/res/528349.html
Нахуй пошел.
Нет, съесть можно только центральную. В этом смысл объединения мышей.
Решение: https://jsfiddle.net/sthhauuj/1/
Вроде работает как надо, но что я сделал не так, как ожидалось?
> Прочитал кстати, ОП, тот учебник который ты рекомендовал,
Ну наконец-то! По хоршему ты (и другие аноны, берите на заметку) должен был это читать еще при решении первых задач.
> зато html стал меньше, ведь в том и смысл?
Скорее смысл в том что для отображения всех без исключения элементов дополнительный класс и не нужен. Кстати, знаешь, такие переключатели долгое время делали яваскриптом,а сейчас с CSS3, как видишь, можно и без него обойтись. Правда для поддержки старых браузеров без селектора ~ (или что там испльзуется) яваскрипт пока все равно нужен. Не беда, еще год-два и это станет неактуальным.
Кстати, давай тебе как сообразительному, дадим дополнительное задание: сделай чтобы при переключении категорий портфолио каринки менялись не скачком, а с анимацией (можно использовать как transition так и animation, на выбор). Изучи какие есть способы и возможности и выбери какой-нибудь. Вот статьи для вдохновения:
http://habrahabr.ru/company/nordavind/blog/209462/
http://habrahabr.ru/post/141780/
https://cssanimation.rocks/list-items/
http://www.webmasters.by/images/articles/css/circle-hover-effects/index.html
Ну первый пример который приходит в голову это скрытие элемента через плавное уменьшение его размеров до нуля (заодно можно попробовать слегка увеличить оставшиеся картинки), но тут надо проверить, как это будет смотреться. Также ты можешь сопроводить это 2d- или 3d-трансформацией, например одновременно наклоняя картинку от зрителя.
Не забудь про вендорные префиксы -moz- и -webkit- для не совсем новых браузеров (в новых от них отказались, но добавление префиксов добавляет поддержку браузеров выпущенных за последние 2-3 года).
> Сделал переставлние блоков на ширине 800 и 400
Насчет цифры 400, я посмотрел сайт http://mydevice.io/devices/ и вижу что у некоторых телефонов (видимо это «лопаты» с большим экраном) ширина больше 400. Мне кажется вместо 3 версий страницы можно сделать 2, для ширины больше 800 и меньше 800. Или может для ширины больше 1024 и меньше 1024? Если больше то у нас полноценный сайт, если меньше то вертикально сложенный. Таким образом ты облегчишь себе работу.
То есть я предлагаю упростить себе жизнь, сделав одно «узкое» разрешение вместо двух.
Хотя конечно вертикально выстроенные колонки лучше наверно все же сделать с 2 токами перехода, чтобы было 4 колонки - 2 колонки - 1 колонка.
Для отладки адаптивной верстки (если ты вдруг не знаешь) и в фаероксе, и в хроме в инспекторе есть опции где можно менять размер и DPI экрана. В фаерфоксе вроде бы это доступно без расширний, у меня это Tools - Web Developer - Responsive Design View (или это и есть расширение? не помню).
> Столкнулся с проблемой что если @media в коде выше того, что оно исправляет, то эта медиа не работает. Помогло только использование !important но в коде это выглядит адски.
Да, лучше повышать приоритет селектора добавлением лишних классов, хотя это тоже по сути хак. Ты читал про приоритеты селекторов? Прочти:
http://habrahabr.ru/post/137588/
http://htmlbook.ru/samcss/kaskadirovanie
> Так же переделал шапку при уменьшении экрана, знаю что некрасиво, но я вообще не дизайнер, и даже рисовать не умею, сделал как смог.
В мобильном дизайне меню часто убирают в иконку-бутерброд (посмотреть можно тут: http://m.siliconrus.com/ ). Я не люблю эту иконку и думаю что для меню из 5 пунктов удобнее когда они видны. Но ты посмотри как выглядит этот вариант с иконкой и попробуй хотя бы мысленно представить как это реализуется (я думаю что в кнопку придется спрятать чекбокс чтобы реализовать запоминание нажатого/отжатого состояния а далее сделать по аналогии с переключателем в портфолио).
> Оставил в ксс только в одном месте в wrapper. Но пришлось добавить пару дивов-врапперов в html, за что, после прочтения учебника, как я понял, заслуживаю места в аду.
Вообще, можно же проставить ширину нескольким классам сразу (и если ты этого не знал, почитай про синтаксис CSS селекторов):
.wrapper, .something-else {
width: 900px;
}
Если это не работает, можно оставить лишние пару тегов.
> Это мне нужно объяснить какие свойства я там анимирую
Да, в CSS прописать явно, например transition-property: top, width, color;
Почитай http://htmlbook.ru/css/transition
http://htmlbook.ru/css/transition-property
>>По моему тут не нужны nth-of-type.
> Не придумал ничего лучше, да и код лично мне понятен, думаю можно оставить.
Я имел в виду что кнопки переключателя вместо номеров можно различать по имени класса (аналогично с классами у картинок). В этом случае проще добавлять, удалять, переставлять местами кнопки (в твоем случае это все требует их перенумеровыать). У тебя у кнопок есть id, можно как раз их использовать в селекторах.
>>Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента.
> Начал переделывать, все развалилось.
Значит придется взять отладчик и разобраться, почему. Что это за верстальщик, у которого магия творится в коде? Магии не должно быть. Я тебе сразу говорю, что вырывать флоат (img) из блока (a) это гиблое дело так как в блоке не остается содержимого (он становится нулевой высоты) и он позиционируется черт знает как. Надо сделать флоатами именно внешний блок у картинки, тег <a>, а саму картинку сделать например блоком чтобы убрать лишние отступы снизу.
> Главное это работает.
Не, надо чтобы ты понимал что и как работает.
> Смотрим на пик. Как исправить не знаю. Сам сижу с хрома, поэтому проблемы не заметил. Теперь все проверяю с разных браузеров.
Ок, я проверю это.
> Логотип сделал точно таким же как и на psd. И теперь вопрос. Все нужно делать пиксель-в-пиксель как и на том изображении?
Вообще, да, там где это возможно. Например отступ под текстом вполне реально померять линейкой в фотошопе и сделать соответствующий маргин/паддинг. Размеры картинок также надо померять. А вот например ширину текста точно угадать не получится так как текст рендерится по-разному.
Ну и тебе не нужны все размеры, например высота блока тебе не нужна, достаточно задать правильный размер шрифта и отступы, а высота определяется автоматически. Аналогично с кнопкой, задаешь только размер шрифта и паддинги, а размеры определяются автоматически. Могу сказать также, что обычно дизайнер старается выдерживать «вертикальный ритм» и вертикальные отступы обычно равны или кратны какой-то величине.
На глаз делать сложно так как нужен хороший глазомер, чтобы сохранить и передать все заложенные дизайнером пропорции и соотношения, проще мерять.
Например, посмотри на серый блок с 4 колонками. На макете паддинг снизу (расстояние от низа блока до низа ближайшей колонки) гораздо больше чем у тебя. В адаптивной версии, кстати, паддинги стоит уменьшить, а то они гигантские будут.
> Это ведь издевательство все высчитывать.
Зачем высчитвать, линейкой в фотошопе меряешь основные размеры отступов, блоков только.
Шрифты надо подключить, так как без них трудно оценивать макет. Но даже сейчас могу сказать, что например в блоках где 4 колонки, надо сделать межстрочное расстояние гораздо больше. Межстрочное расстояние можно померять линейкой в фотошопе и поделить его на размер шрифта. Там как минимум 1.5 стоит, если не больше.
Надписи «ALL GRAPHIC ILLUSTRATION MOTION» у тебя серые, на макете белые.
Картинки из портфолио увеличены. Не увеличивай растровые картинки так как они мылятся и теряют качество, сравни то что в браузере и то что в макете. Увеличивать можно например как часть эффекта, если человек не успевает заметить искажения, но в твоем случае видно что картинки некачечтвенные. Вырежи из макета их и отображай в размере 1:1.
У тебя картинка http://maketi.esy.es/img/pick1.png имеет размер 160×131 пикс, а отображается как 270×223. И выглядит замыленной (посмотри например на то как выглядит серая мелкая сетка на ней на макете и в браузере или шум на зеленом фоне).
Для адаптивных версий подбери размер картинок так, чтобы они не увеличивались ни при какой ширине, только уменьшались (например сделай 3 колонки вместо 2).
Объедини картинки телефона и значка на карте в футере в один спрайт, они все равно одного цвета. Объедини картинки андроида, монитора, часов в один спрайт. Также, лучше сделать их с прозрачным фоном — если например ты захочешь чуть поменять цвет футера тебе не придется переделывать картинки. Это правда их немного утяжелит (так как в них будет содержаться больше информации), но они мелкие и тут мы выбираем удобство изменения верстки, а не размер.
> Прочитал кстати, ОП, тот учебник который ты рекомендовал,
Ну наконец-то! По хоршему ты (и другие аноны, берите на заметку) должен был это читать еще при решении первых задач.
> зато html стал меньше, ведь в том и смысл?
Скорее смысл в том что для отображения всех без исключения элементов дополнительный класс и не нужен. Кстати, знаешь, такие переключатели долгое время делали яваскриптом,а сейчас с CSS3, как видишь, можно и без него обойтись. Правда для поддержки старых браузеров без селектора ~ (или что там испльзуется) яваскрипт пока все равно нужен. Не беда, еще год-два и это станет неактуальным.
Кстати, давай тебе как сообразительному, дадим дополнительное задание: сделай чтобы при переключении категорий портфолио каринки менялись не скачком, а с анимацией (можно использовать как transition так и animation, на выбор). Изучи какие есть способы и возможности и выбери какой-нибудь. Вот статьи для вдохновения:
http://habrahabr.ru/company/nordavind/blog/209462/
http://habrahabr.ru/post/141780/
https://cssanimation.rocks/list-items/
http://www.webmasters.by/images/articles/css/circle-hover-effects/index.html
Ну первый пример который приходит в голову это скрытие элемента через плавное уменьшение его размеров до нуля (заодно можно попробовать слегка увеличить оставшиеся картинки), но тут надо проверить, как это будет смотреться. Также ты можешь сопроводить это 2d- или 3d-трансформацией, например одновременно наклоняя картинку от зрителя.
Не забудь про вендорные префиксы -moz- и -webkit- для не совсем новых браузеров (в новых от них отказались, но добавление префиксов добавляет поддержку браузеров выпущенных за последние 2-3 года).
> Сделал переставлние блоков на ширине 800 и 400
Насчет цифры 400, я посмотрел сайт http://mydevice.io/devices/ и вижу что у некоторых телефонов (видимо это «лопаты» с большим экраном) ширина больше 400. Мне кажется вместо 3 версий страницы можно сделать 2, для ширины больше 800 и меньше 800. Или может для ширины больше 1024 и меньше 1024? Если больше то у нас полноценный сайт, если меньше то вертикально сложенный. Таким образом ты облегчишь себе работу.
То есть я предлагаю упростить себе жизнь, сделав одно «узкое» разрешение вместо двух.
Хотя конечно вертикально выстроенные колонки лучше наверно все же сделать с 2 токами перехода, чтобы было 4 колонки - 2 колонки - 1 колонка.
Для отладки адаптивной верстки (если ты вдруг не знаешь) и в фаероксе, и в хроме в инспекторе есть опции где можно менять размер и DPI экрана. В фаерфоксе вроде бы это доступно без расширний, у меня это Tools - Web Developer - Responsive Design View (или это и есть расширение? не помню).
> Столкнулся с проблемой что если @media в коде выше того, что оно исправляет, то эта медиа не работает. Помогло только использование !important но в коде это выглядит адски.
Да, лучше повышать приоритет селектора добавлением лишних классов, хотя это тоже по сути хак. Ты читал про приоритеты селекторов? Прочти:
http://habrahabr.ru/post/137588/
http://htmlbook.ru/samcss/kaskadirovanie
> Так же переделал шапку при уменьшении экрана, знаю что некрасиво, но я вообще не дизайнер, и даже рисовать не умею, сделал как смог.
В мобильном дизайне меню часто убирают в иконку-бутерброд (посмотреть можно тут: http://m.siliconrus.com/ ). Я не люблю эту иконку и думаю что для меню из 5 пунктов удобнее когда они видны. Но ты посмотри как выглядит этот вариант с иконкой и попробуй хотя бы мысленно представить как это реализуется (я думаю что в кнопку придется спрятать чекбокс чтобы реализовать запоминание нажатого/отжатого состояния а далее сделать по аналогии с переключателем в портфолио).
> Оставил в ксс только в одном месте в wrapper. Но пришлось добавить пару дивов-врапперов в html, за что, после прочтения учебника, как я понял, заслуживаю места в аду.
Вообще, можно же проставить ширину нескольким классам сразу (и если ты этого не знал, почитай про синтаксис CSS селекторов):
.wrapper, .something-else {
width: 900px;
}
Если это не работает, можно оставить лишние пару тегов.
> Это мне нужно объяснить какие свойства я там анимирую
Да, в CSS прописать явно, например transition-property: top, width, color;
Почитай http://htmlbook.ru/css/transition
http://htmlbook.ru/css/transition-property
>>По моему тут не нужны nth-of-type.
> Не придумал ничего лучше, да и код лично мне понятен, думаю можно оставить.
Я имел в виду что кнопки переключателя вместо номеров можно различать по имени класса (аналогично с классами у картинок). В этом случае проще добавлять, удалять, переставлять местами кнопки (в твоем случае это все требует их перенумеровыать). У тебя у кнопок есть id, можно как раз их использовать в селекторах.
>>Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента.
> Начал переделывать, все развалилось.
Значит придется взять отладчик и разобраться, почему. Что это за верстальщик, у которого магия творится в коде? Магии не должно быть. Я тебе сразу говорю, что вырывать флоат (img) из блока (a) это гиблое дело так как в блоке не остается содержимого (он становится нулевой высоты) и он позиционируется черт знает как. Надо сделать флоатами именно внешний блок у картинки, тег <a>, а саму картинку сделать например блоком чтобы убрать лишние отступы снизу.
> Главное это работает.
Не, надо чтобы ты понимал что и как работает.
> Смотрим на пик. Как исправить не знаю. Сам сижу с хрома, поэтому проблемы не заметил. Теперь все проверяю с разных браузеров.
Ок, я проверю это.
> Логотип сделал точно таким же как и на psd. И теперь вопрос. Все нужно делать пиксель-в-пиксель как и на том изображении?
Вообще, да, там где это возможно. Например отступ под текстом вполне реально померять линейкой в фотошопе и сделать соответствующий маргин/паддинг. Размеры картинок также надо померять. А вот например ширину текста точно угадать не получится так как текст рендерится по-разному.
Ну и тебе не нужны все размеры, например высота блока тебе не нужна, достаточно задать правильный размер шрифта и отступы, а высота определяется автоматически. Аналогично с кнопкой, задаешь только размер шрифта и паддинги, а размеры определяются автоматически. Могу сказать также, что обычно дизайнер старается выдерживать «вертикальный ритм» и вертикальные отступы обычно равны или кратны какой-то величине.
На глаз делать сложно так как нужен хороший глазомер, чтобы сохранить и передать все заложенные дизайнером пропорции и соотношения, проще мерять.
Например, посмотри на серый блок с 4 колонками. На макете паддинг снизу (расстояние от низа блока до низа ближайшей колонки) гораздо больше чем у тебя. В адаптивной версии, кстати, паддинги стоит уменьшить, а то они гигантские будут.
> Это ведь издевательство все высчитывать.
Зачем высчитвать, линейкой в фотошопе меряешь основные размеры отступов, блоков только.
Шрифты надо подключить, так как без них трудно оценивать макет. Но даже сейчас могу сказать, что например в блоках где 4 колонки, надо сделать межстрочное расстояние гораздо больше. Межстрочное расстояние можно померять линейкой в фотошопе и поделить его на размер шрифта. Там как минимум 1.5 стоит, если не больше.
Надписи «ALL GRAPHIC ILLUSTRATION MOTION» у тебя серые, на макете белые.
Картинки из портфолио увеличены. Не увеличивай растровые картинки так как они мылятся и теряют качество, сравни то что в браузере и то что в макете. Увеличивать можно например как часть эффекта, если человек не успевает заметить искажения, но в твоем случае видно что картинки некачечтвенные. Вырежи из макета их и отображай в размере 1:1.
У тебя картинка http://maketi.esy.es/img/pick1.png имеет размер 160×131 пикс, а отображается как 270×223. И выглядит замыленной (посмотри например на то как выглядит серая мелкая сетка на ней на макете и в браузере или шум на зеленом фоне).
Для адаптивных версий подбери размер картинок так, чтобы они не увеличивались ни при какой ширине, только уменьшались (например сделай 3 колонки вместо 2).
Объедини картинки телефона и значка на карте в футере в один спрайт, они все равно одного цвета. Объедини картинки андроида, монитора, часов в один спрайт. Также, лучше сделать их с прозрачным фоном — если например ты захочешь чуть поменять цвет футера тебе не придется переделывать картинки. Это правда их немного утяжелит (так как в них будет содержаться больше информации), но они мелкие и тут мы выбираем удобство изменения верстки, а не размер.
> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
Слеш в конце тегов не ставится, так же прочитай что она делает, например тут http://xiper.net/manuals/html/meta-tags/http-equiv/x-UA-Compatible или в моем уроке про ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c
Если кратко то он просит ИЕ не переходить в режим совместимости с древними браузерами и разрешает использование Chrome Frame (это плагин для ИЕ который использует движок от Chrome для отображения страниц как решение проблемы отображения сайтов в этом браузере).
> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
Опять же, прочитай описание этого тега (он говорит мобильным устройствам что страница под них адаптирована и им не надо притворяться устройством шириной 1024 пикселя): http://frontender.com.ua/mobile-web/wtf-viewport/
Я не уверен, нужен ли здесь minimun-scale? Почему ты хочешь запретить пользователю уменьшать масштаб?
На версии сайта с маленькой шириной, я думаю, надо уменьшить размер гиганского текста, так, чтобы он по- прежнему был большим и выглядел как заголовок, но не таким большим, и может быть уменьшить вертикальные отступы под и над ним, а то надпись великовата.
Номер телефона надо сделать кликабельным и звонибельным в мобильной версии. Он распознается браузером автоматически? Если нет, то надо завернуть его в ссылку с протоколом tel:, например tel:012345, как описано тут:
http://html5.by/blog/href-tel-mobile-browser/
http://nikitakiselev.ru/post/49
http://osxdev.ru/blog/ios/9.html (о! там написано про ссылки на карты, сделай-ка адрес тоже ссылкой)
Мне кажется, ссылка надежнее так как алгоритмы распознвания номеров могут быть разные в разных браузерах и ОС, а ссылка все же вещь унивесальная.
> bottom-dark-gray-block
> top-dark-gray-block
> four-pictures-with-text-block
Вот это плохие названия, так как при смене внешнего вида они могут потерять актуальность. Лучше назвать их по смыслу, например block-features, block-contacts, features-list.
> <a href="#rss" id="rss"></a>
> <a href="#facebook" id="facebook"></a>
Давай тут внутрь ссылок добавим текст вроде «наш твиттер»(а в CSS его скроем). Тогда например если не загрузится CSS файл, ссылка все равно будет видна на странице, робот от гугла сможет лучше проиндексировать ссылку, и устройство чтения страниц сможет прочитать эту ссылку (иначе для незрячих она будет вообще недоступна).
Что я хочу сказать, что если полностью убрать CSS (как это протестировать? отладчик в Chrome на вкладке Sources позволяет редактировать файлы, ты можешь там удалить все содержимое CSS файла), то твоя страница все равно должна быть читабельной. В этом случае и роботам и программам чтения текста гораздо удобнее ориентироваться на сайте. В твоем случае все хорошо, кроме ссылок на соцсети, которые не видны без CSS.
> * {
> padding: 0px;
Вот так делать не стоит. Ты ведь этим удаляешь паддинги по умолчанию, которые есть у разных тегов, вроде списков или ячеек таблиц или инпутов. И соответственно ты потом должен их вернуть назад, чтобы текст с этими тегами корректно отображался (ведь на сайте будут и другие страницы, возможно с текстом который добавляют редакторы а не программисты). Но какой смысл сбрасывать стили чтобы вернуть их потом обратно? Логичнее убирать паддинг только там, где тебе надо, а не везде. Это аналог CSS reset и это в общем плохая штука. Не используй селектор «звездочка», не удаляй лишние стили.
> body {
> font-family: "Open Sans", Arial, sans-serif;
задай тут же размер и line-height для основного шрифта (например для того, который использован в блоке с 4 колонками)
> box-sizing: border-box;
Добавь вендорные префиксы. Также, на мой взгляд, для .wrapper можно легко обойтись без этого свойства вообще (и для адаптивных версий тоже, просто убирая max-width).
> .android-with-text, .pc-with-text, .phone-with-text, .clock-with-text {width: 50% !important;}
Тут проще было добавить один общий класс на все элементы или использовать селектор .four-pictures-with-text-block > div
> font: 40pt arial;
Всегда вместе с размером шрифта указывай line-height.
> .light-gray-block {
> display:inline-block;
Зачем это? Имей в виду , что ответ «подобрал опытным путем» не годится. Либо объясняй, либо удаляй.
> .android-with-text {
> .pc-with-text {
> .phone-with-text {
Тут куча копипасты, избавься от нее. Ну и шрифт незачем определять для каждого блока индивидуально — 12 или 14-пиксельный основной шрифт можно сразу задать на body чтобы он действовал на всей странице по умолчанию.
> .four-pictures {
> text-align: center;
text-align наследуется от родителя, не надо его переопределять на каждом элементе отдельно.
> .portfolio-text-buttons-and-works input:nth-of-type(1):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(2):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(3):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(4):checked + label > span
А тут точно надо писать это 4 раза, нельзя просто написать .portfolio ... input:checked + label > span ?
> .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .graphic, .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .illustration, .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .motion, .portfolio-text-buttons-and-works input:nth-of-type(2):checked ~ .graphic, .portfolio-text-buttons-and-works input:nth-of-type(3):checked ~ .illustration, .portfolio-text-buttons-and-works input:nth-of-type(4):checked ~ .motion
Это можно упростить, убрав перечисление категорий и сделав что-то вроде
.portfolio-text-buttons-and-works input#button-all:checked ~ .portfolio-item { ... }
.portfolio-text-buttons-and-works input#button-motion:checked ~ .motion { ... }
То есть мы упрощаем выражение для «all» и заменяем номера инпутов на id или классы.
>.bottom-dark-gray-block
> font-size: 0;
Это еще зачем тут?
>      
используй margin-right
> <br>
br используется только в верстке стихов, почтовых адресов, образцов кода для вставки разрыва строки. Тут он не требуется, тут нужен CSS. Тем более там дальше все равно див идет.
> .social-icons {
> height: 30px;
> width: 170px;
Это еще зачем? Пусть вычисляется автоматически.
> #rss:hover, #facebook:hover, #twitter:hover, #pink-boll:hover, #p:hover {
Лучше .social-icons > a - меньше переписывать придется при добавлении новых иконок.
> @font-face {
> font-family: "OpenSansBold";
Тебе надо почитать теорию по @font-face (например http://htmlbook.ru/css/font-face ), тут ты указываешь не имя файла, а имя под которым шрифт будет доступен в CSS (также указываешь font-weight и font-style для которых применим этот шрифт. У тебя там везде стоит normal и это неправильно). Если этот код тебе сгенерировал font squirrel, значит надо его исправить.
То есть правило font-face выглядит так:
@font-face {
font-family: название шрифта которое используется в font-family в других местах
font-weight: вес этого шрифта
font-style: курсивность
src: ссылки на файл с шрифтом в разных форматах и с хаками для ИЕ. Тут же можно указать конструкцию local('name') чтобы поискать шрифт с таким именем на компьютере пользователя
}
Вот про src и хаки тут описано в статье 2011 года: http://habrahabr.ru/post/113136/ и тут
Чуть более новый образец кода тут: https://github.com/CSSLint/csslint/wiki/Bulletproof-font-face и он отличается только добавлением #iefix в хак для ИЕ (чтобы он не видел то, что идет дальше)
> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
Слеш в конце тегов не ставится, так же прочитай что она делает, например тут http://xiper.net/manuals/html/meta-tags/http-equiv/x-UA-Compatible или в моем уроке про ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c
Если кратко то он просит ИЕ не переходить в режим совместимости с древними браузерами и разрешает использование Chrome Frame (это плагин для ИЕ который использует движок от Chrome для отображения страниц как решение проблемы отображения сайтов в этом браузере).
> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
Опять же, прочитай описание этого тега (он говорит мобильным устройствам что страница под них адаптирована и им не надо притворяться устройством шириной 1024 пикселя): http://frontender.com.ua/mobile-web/wtf-viewport/
Я не уверен, нужен ли здесь minimun-scale? Почему ты хочешь запретить пользователю уменьшать масштаб?
На версии сайта с маленькой шириной, я думаю, надо уменьшить размер гиганского текста, так, чтобы он по- прежнему был большим и выглядел как заголовок, но не таким большим, и может быть уменьшить вертикальные отступы под и над ним, а то надпись великовата.
Номер телефона надо сделать кликабельным и звонибельным в мобильной версии. Он распознается браузером автоматически? Если нет, то надо завернуть его в ссылку с протоколом tel:, например tel:012345, как описано тут:
http://html5.by/blog/href-tel-mobile-browser/
http://nikitakiselev.ru/post/49
http://osxdev.ru/blog/ios/9.html (о! там написано про ссылки на карты, сделай-ка адрес тоже ссылкой)
Мне кажется, ссылка надежнее так как алгоритмы распознвания номеров могут быть разные в разных браузерах и ОС, а ссылка все же вещь унивесальная.
> bottom-dark-gray-block
> top-dark-gray-block
> four-pictures-with-text-block
Вот это плохие названия, так как при смене внешнего вида они могут потерять актуальность. Лучше назвать их по смыслу, например block-features, block-contacts, features-list.
> <a href="#rss" id="rss"></a>
> <a href="#facebook" id="facebook"></a>
Давай тут внутрь ссылок добавим текст вроде «наш твиттер»(а в CSS его скроем). Тогда например если не загрузится CSS файл, ссылка все равно будет видна на странице, робот от гугла сможет лучше проиндексировать ссылку, и устройство чтения страниц сможет прочитать эту ссылку (иначе для незрячих она будет вообще недоступна).
Что я хочу сказать, что если полностью убрать CSS (как это протестировать? отладчик в Chrome на вкладке Sources позволяет редактировать файлы, ты можешь там удалить все содержимое CSS файла), то твоя страница все равно должна быть читабельной. В этом случае и роботам и программам чтения текста гораздо удобнее ориентироваться на сайте. В твоем случае все хорошо, кроме ссылок на соцсети, которые не видны без CSS.
> * {
> padding: 0px;
Вот так делать не стоит. Ты ведь этим удаляешь паддинги по умолчанию, которые есть у разных тегов, вроде списков или ячеек таблиц или инпутов. И соответственно ты потом должен их вернуть назад, чтобы текст с этими тегами корректно отображался (ведь на сайте будут и другие страницы, возможно с текстом который добавляют редакторы а не программисты). Но какой смысл сбрасывать стили чтобы вернуть их потом обратно? Логичнее убирать паддинг только там, где тебе надо, а не везде. Это аналог CSS reset и это в общем плохая штука. Не используй селектор «звездочка», не удаляй лишние стили.
> body {
> font-family: "Open Sans", Arial, sans-serif;
задай тут же размер и line-height для основного шрифта (например для того, который использован в блоке с 4 колонками)
> box-sizing: border-box;
Добавь вендорные префиксы. Также, на мой взгляд, для .wrapper можно легко обойтись без этого свойства вообще (и для адаптивных версий тоже, просто убирая max-width).
> .android-with-text, .pc-with-text, .phone-with-text, .clock-with-text {width: 50% !important;}
Тут проще было добавить один общий класс на все элементы или использовать селектор .four-pictures-with-text-block > div
> font: 40pt arial;
Всегда вместе с размером шрифта указывай line-height.
> .light-gray-block {
> display:inline-block;
Зачем это? Имей в виду , что ответ «подобрал опытным путем» не годится. Либо объясняй, либо удаляй.
> .android-with-text {
> .pc-with-text {
> .phone-with-text {
Тут куча копипасты, избавься от нее. Ну и шрифт незачем определять для каждого блока индивидуально — 12 или 14-пиксельный основной шрифт можно сразу задать на body чтобы он действовал на всей странице по умолчанию.
> .four-pictures {
> text-align: center;
text-align наследуется от родителя, не надо его переопределять на каждом элементе отдельно.
> .portfolio-text-buttons-and-works input:nth-of-type(1):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(2):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(3):checked + label > span, .portfolio-text-buttons-and-works input:nth-of-type(4):checked + label > span
А тут точно надо писать это 4 раза, нельзя просто написать .portfolio ... input:checked + label > span ?
> .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .graphic, .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .illustration, .portfolio-text-buttons-and-works input:nth-of-type(1):checked ~ .motion, .portfolio-text-buttons-and-works input:nth-of-type(2):checked ~ .graphic, .portfolio-text-buttons-and-works input:nth-of-type(3):checked ~ .illustration, .portfolio-text-buttons-and-works input:nth-of-type(4):checked ~ .motion
Это можно упростить, убрав перечисление категорий и сделав что-то вроде
.portfolio-text-buttons-and-works input#button-all:checked ~ .portfolio-item { ... }
.portfolio-text-buttons-and-works input#button-motion:checked ~ .motion { ... }
То есть мы упрощаем выражение для «all» и заменяем номера инпутов на id или классы.
>.bottom-dark-gray-block
> font-size: 0;
Это еще зачем тут?
>      
используй margin-right
> <br>
br используется только в верстке стихов, почтовых адресов, образцов кода для вставки разрыва строки. Тут он не требуется, тут нужен CSS. Тем более там дальше все равно див идет.
> .social-icons {
> height: 30px;
> width: 170px;
Это еще зачем? Пусть вычисляется автоматически.
> #rss:hover, #facebook:hover, #twitter:hover, #pink-boll:hover, #p:hover {
Лучше .social-icons > a - меньше переписывать придется при добавлении новых иконок.
> @font-face {
> font-family: "OpenSansBold";
Тебе надо почитать теорию по @font-face (например http://htmlbook.ru/css/font-face ), тут ты указываешь не имя файла, а имя под которым шрифт будет доступен в CSS (также указываешь font-weight и font-style для которых применим этот шрифт. У тебя там везде стоит normal и это неправильно). Если этот код тебе сгенерировал font squirrel, значит надо его исправить.
То есть правило font-face выглядит так:
@font-face {
font-family: название шрифта которое используется в font-family в других местах
font-weight: вес этого шрифта
font-style: курсивность
src: ссылки на файл с шрифтом в разных форматах и с хаками для ИЕ. Тут же можно указать конструкцию local('name') чтобы поискать шрифт с таким именем на компьютере пользователя
}
Вот про src и хаки тут описано в статье 2011 года: http://habrahabr.ru/post/113136/ и тут
Чуть более новый образец кода тут: https://github.com/CSSLint/csslint/wiki/Bulletproof-font-face и он отличается только добавлением #iefix в хак для ИЕ (чтобы он не видел то, что идет дальше)
По шрифтам, тебе надо сделать следующее:
- полностью разобраться с синтаксисом font-face (вот описание на англ: https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face )
- понять что разные браузеры поддерживают разные форматы файла шрифта ( тут есть краткая табличка: https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face#Browser_compatibility )
Суть в том что наше будущее это WOFF (точнее WOFF2) но старые браузеры предпочитают другие форматы: IE это EOT, Хром это TTF, для старого мобильного сафари это SVG. Также надо понимать что конвертация может лишить шрифт некоторых фич, например кернинга (подобранное дизайнером расстояние между парами букв) или оптимизаций для рендеринга на мелких размерах.
- прчитать и скопировать хак в свойстве src для старых ИЕ (который думает что все что идет после src это одно имя файла и который не умеет выбирать из нескольких форматов, потому нам приходится его обманывать)
- пойти на font-squirrel и скрепя сердце сконвертирвать шрифт. При этом можно за счет указания диапазона символов уменьшить вес файлов.
- подправить сгенерированный CSS
- протестировать
Выглядеть может по-разному из-за разных версий браузера. Я затрудняюсь точно ответить почему так произошло и советую прописать явно margin:0, padding: 0 (кроме тех мест где ненулевые значения) на ul и li внутри меню (не на всей странице!) в адаптивном варианте.
Если устройство есть у тебя на руках, то есть такая возможность:
https://developer.chrome.com/devtools/docs/remote-debugging (как видишь придется повозиться но зато получишь доступ к потрохам браузера через отладчик)
В новых iOS устройствах также сделали удаленную отладку: http://stackoverflow.com/a/12762449
Если в данном случае у тебя нет возможности этим воспользоваться, можешь оставить как есть, чуть съехавший пункт меню в старой версии андроида это не страшно.
Также. я могу тебе посоветовать еще такой сервис (он правда частично платный но тебе хватит и бесплатных возможностей):
https://www.browserstack.com/screenshots
https://www.browserstack.com/responsive
(замечу что ссылки на бесплатные страницы убраны за кнопочку меню если заходить с главной, но я-то знаю где искать).
Вот например твой сайт в ИЕ и на айпадах: https://www.browserstack.com/screenshots/7ec55f9e39d8330ac427281f673a1396a34d5b76
Он поможет тебе протестировать поддержку шрифтов.
Также вот мой урок по работе с ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c (в твоем случае, к счастью, почти все нормально работает в ИЕ)
Я вижу синюю рамку вокруг картинок в ИЕ, он так подсвечивает картинки внутри ссылок, лечится через border: 0 на конкретных картинках (не надо это ко всем применять наверно).
ИЕ9 и выше должны работать безупречно, в ИЕ8 хорошо бы чтобы в общем текст читался и ссылки были, отображение может немного разъехаться, слишком много времени на него тратить не стоит. Для ИЕ7 и ИЕ6 мы ничего не делаем, но как вариант можно засунуть тег link в conditional comment чтобы в этих браузерах CSS не подключался и отображался чистый HTML. Так по крайней мере сайт можно читать в этих браузерах. Не хотят поддерживать CSS3 и CSS2.1 — пусть сидят без CSS вообще.
Выглядеть может по-разному из-за разных версий браузера. Я затрудняюсь точно ответить почему так произошло и советую прописать явно margin:0, padding: 0 (кроме тех мест где ненулевые значения) на ul и li внутри меню (не на всей странице!) в адаптивном варианте.
Если устройство есть у тебя на руках, то есть такая возможность:
https://developer.chrome.com/devtools/docs/remote-debugging (как видишь придется повозиться но зато получишь доступ к потрохам браузера через отладчик)
В новых iOS устройствах также сделали удаленную отладку: http://stackoverflow.com/a/12762449
Если в данном случае у тебя нет возможности этим воспользоваться, можешь оставить как есть, чуть съехавший пункт меню в старой версии андроида это не страшно.
Также. я могу тебе посоветовать еще такой сервис (он правда частично платный но тебе хватит и бесплатных возможностей):
https://www.browserstack.com/screenshots
https://www.browserstack.com/responsive
(замечу что ссылки на бесплатные страницы убраны за кнопочку меню если заходить с главной, но я-то знаю где искать).
Вот например твой сайт в ИЕ и на айпадах: https://www.browserstack.com/screenshots/7ec55f9e39d8330ac427281f673a1396a34d5b76
Он поможет тебе протестировать поддержку шрифтов.
Также вот мой урок по работе с ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c (в твоем случае, к счастью, почти все нормально работает в ИЕ)
Я вижу синюю рамку вокруг картинок в ИЕ, он так подсвечивает картинки внутри ссылок, лечится через border: 0 на конкретных картинках (не надо это ко всем применять наверно).
ИЕ9 и выше должны работать безупречно, в ИЕ8 хорошо бы чтобы в общем текст читался и ссылки были, отображение может немного разъехаться, слишком много времени на него тратить не стоит. Для ИЕ7 и ИЕ6 мы ничего не делаем, но как вариант можно засунуть тег link в conditional comment чтобы в этих браузерах CSS не подключался и отображался чистый HTML. Так по крайней мере сайт можно читать в этих браузерах. Не хотят поддерживать CSS3 и CSS2.1 — пусть сидят без CSS вообще.
> [].unshift.call(arguments
arguments это не массив и ты не можешь в него засовывать новые элементы. Проверь отладчиком ( https://learn.javascript.ru/debugging-chrome ) работает ли такое вообще и вставляются ли элементы в arguments? И даже если вставляются, все равно замени это на добавление аргументов в массив через concat.
> return func.apply(null, arguments);
Вместо null лучше сразу привыкать указыват this чтобы он тоже передавался в функцию.
>>528268
>>528460\t
Мышь в центре несъедобна, с краев съедобны. Чтобы мышь нельзя было съесть рядом с ней должно быть 2 других мыши, для крайних это не выполняется.
А вообще мне нравится идея, которую кто-то предложил, что если много мышей (наример 4) соберутся вместе то они могут съесть кота. Не все коту масленица, как говорится.
>>528450
Не перекатываемся никуда, сидим тут в уютном тредике.
>>528448
Насчет курса рубля, я слышал что есть интересная зависимость если помножить его на цену за нефть, произведение стремится к постоянной величине. http://habrahabr.ru/post/253285/
Насчет самой цены на нефть, есть такая (возможно конечно американцы просто сами себя ободряют) инфографика: http://www.bloomberg.com/graphics/2014-america-shakes-off-oil-addiction/
Стоит помнить только что экономика сложная штука, это взаимодействие сотен факторов и вряд ли там все так просто.
Алсо меня конечно рост курса огорочает. Вроде никогда такого не было, и вот опять. В таких случаях непонятно стоит ли сбережения переводить по завышенному курсу или сидеть с рублями.
>>528432
Тогда надо все удалять, да. Но по моему лучше не удалять.
>>528426
> Экземпляр ServiceLocator уже приходит в аргументе функции createService, зачем из него снова getServiceLocator() вызывается?
Там не ServiceLocator а ServiceLocatorInterface может в этом дело (не, вроде не в этом)? Алсо, это может быть ошибка в коде если ты не официальный мануал смотришь.
Вот тут вот http://framework.zend.com/manual/2.3/en/modules/zend.service-manager.intro.html я ничего подобного не вижу.
Скорее всего просто ошибка.
>>528383
Можно, но придется его доставать и раскодировать средсвами JS/DOM:
var json = div.getAttribute('data-x');
var data = JSON.parse(data); // выбросит исклбчение при ошибке
Для jQuery это будет var json = $(...).attr('data-x');
Для старых браузеров также нужна библиотека jsonтак как в них нет объекта JSON.
Я бы советовал избегать этого, если у тебя несколько свойств просто сделай несколько data-атрибутов.
>>528345
Неправильно вычисляют позицию на странице очевидно, наверно старым способом через обход offsetparent и сложение оступов, он глючит на элементах с прокруткой в разных браузерах.
Я предпочитаю getElementBoundingRect либов в данной ситуации можно попап засовывать внутрь поста и позиционировать через CSS.
Если ты готов, то можешь исправить и отправить админам патч.
> [].unshift.call(arguments
arguments это не массив и ты не можешь в него засовывать новые элементы. Проверь отладчиком ( https://learn.javascript.ru/debugging-chrome ) работает ли такое вообще и вставляются ли элементы в arguments? И даже если вставляются, все равно замени это на добавление аргументов в массив через concat.
> return func.apply(null, arguments);
Вместо null лучше сразу привыкать указыват this чтобы он тоже передавался в функцию.
>>528268
>>528460\t
Мышь в центре несъедобна, с краев съедобны. Чтобы мышь нельзя было съесть рядом с ней должно быть 2 других мыши, для крайних это не выполняется.
А вообще мне нравится идея, которую кто-то предложил, что если много мышей (наример 4) соберутся вместе то они могут съесть кота. Не все коту масленица, как говорится.
>>528450
Не перекатываемся никуда, сидим тут в уютном тредике.
>>528448
Насчет курса рубля, я слышал что есть интересная зависимость если помножить его на цену за нефть, произведение стремится к постоянной величине. http://habrahabr.ru/post/253285/
Насчет самой цены на нефть, есть такая (возможно конечно американцы просто сами себя ободряют) инфографика: http://www.bloomberg.com/graphics/2014-america-shakes-off-oil-addiction/
Стоит помнить только что экономика сложная штука, это взаимодействие сотен факторов и вряд ли там все так просто.
Алсо меня конечно рост курса огорочает. Вроде никогда такого не было, и вот опять. В таких случаях непонятно стоит ли сбережения переводить по завышенному курсу или сидеть с рублями.
>>528432
Тогда надо все удалять, да. Но по моему лучше не удалять.
>>528426
> Экземпляр ServiceLocator уже приходит в аргументе функции createService, зачем из него снова getServiceLocator() вызывается?
Там не ServiceLocator а ServiceLocatorInterface может в этом дело (не, вроде не в этом)? Алсо, это может быть ошибка в коде если ты не официальный мануал смотришь.
Вот тут вот http://framework.zend.com/manual/2.3/en/modules/zend.service-manager.intro.html я ничего подобного не вижу.
Скорее всего просто ошибка.
>>528383
Можно, но придется его доставать и раскодировать средсвами JS/DOM:
var json = div.getAttribute('data-x');
var data = JSON.parse(data); // выбросит исклбчение при ошибке
Для jQuery это будет var json = $(...).attr('data-x');
Для старых браузеров также нужна библиотека jsonтак как в них нет объекта JSON.
Я бы советовал избегать этого, если у тебя несколько свойств просто сделай несколько data-атрибутов.
>>528345
Неправильно вычисляют позицию на странице очевидно, наверно старым способом через обход offsetparent и сложение оступов, он глючит на элементах с прокруткой в разных браузерах.
Я предпочитаю getElementBoundingRect либов в данной ситуации можно попап засовывать внутрь поста и позиционировать через CSS.
Если ты готов, то можешь исправить и отправить админам патч.
По поводу недостаточно круглых уголков: наблюдаю эффект в старом Хроме, там он лечится убиранием паддинга (паддинг можно поставить на тег <a> например, заодно перенеся на него и флоат). Видимо в старых браузерах радиус как-то учитывал паддинг (возможно виноват также box-sizing). То есть он скругляет не только саму картинку но и паддинг. Поставь например .work { background: yellow } и увидишь что радиус применяется и к паддингу.
Я бы перенес паддинг с флоатом на внешний элемент, <a>.
>>528525
>>528528
>>528539
Чую в следующий раз у меня будет уже 8 полных постов.
>Ну наконец-то! По хоршему ты (и другие аноны, берите на заметку) должен был это читать еще при решении первых задач.
Ну понимаю как я его пропустил, я даже помню что читал о том что его нужно смотреть снизу вверх, но как-то затерялся он видимо.
><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
Эти строчки я просто нашел в гугле. Что они обозначают я не знаю. Скопировал, начало работать, оставил. Разберусь.
>.bottom-dark-gray-block
> font-size: 0;
>Это еще зачем тут?
Легче убрать и увидеть. У ссылок социальных иконок появляются левые пробелы в итоге все смещается.
>Выглядеть может по-разному из-за разных версий браузера. Я затрудняюсь точно ответить почему так произошло и советую прописать явно margin:0, padding: 0 (кроме тех мест где ненулевые значения) на ul и li внутри меню (не на всей странице!) в адаптивном варианте.
Пробовал прописывать нулевые паддинги и маргины. Не помогало. Браузер сам задает этот паддинг и игнорирует мои нули. Общее обнуление помогает. Тем более оно ничего кроме этого не меняет.
И да, если что картинки работ в портфолио я уже изменил, загрузил их точный размер и качество по макету.
Второе как более простое. Незачем делать там частный случай для 0 аргументов.
>>528052
Только я бы не затемнял при наведении, а наоборот, делал светлее. И можно (может быть) добавить свечение вокруг за счет box-shadow. А за счет анимации можно сделать его не постоянным, а тепло мерцающим.
>>528057
Permission denied значит что ты логин/пароль не ввел.
>>528086
В Оп посте ссылки и задачи смотрел?
>>528096
В соцсети миллионы пользователей, понадобится много памяти либо места на диске в любом случае. Можно использовать базы данных кстати, они могут работать с большими объемами но будет медленее чем держать все в памяти.
>>528097
По JS что-то есть, вроде Фленаган, но не знаю для новичков ли. learn,javascript.ru — наше все.
>>528123
Можно его скопировать в другую переменную, первую увеличить, сохраненное значение вернуть.
> if (start == undefined){
Надо тройное равно для undefined: https://learn.javascript.ru/comparison#строгое-равенство
>>528161
Неплохой сайт, если ангийский понимать. Но какой там синтаксис регулярок, из PHP или из JS? Это важно.
>>528232
Только ты тут не нужен
>>528556
> Легче убрать и увидеть. У ссылок социальных иконок появляются левые пробелы в итоге все смещается.
Тогда это надо применить только к блоку социальных иконок а не ко всему темному блоку сразу.
> Пробовал прописывать нулевые паддинги и маргины. Не помогало. Браузер сам задает этот паддинг и игнорирует мои нули. Общее обнуление помогает.
Скорее всего ты делал как-то так:
padding-left: 0;
padding: 1 2 3 4 // перекрывает предыдущее свойство
Звездочка имеет наименьший приоритет из всех селекторов и значит у тебя просто была какая-то ошибка.
Второе как более простое. Незачем делать там частный случай для 0 аргументов.
>>528052
Только я бы не затемнял при наведении, а наоборот, делал светлее. И можно (может быть) добавить свечение вокруг за счет box-shadow. А за счет анимации можно сделать его не постоянным, а тепло мерцающим.
>>528057
Permission denied значит что ты логин/пароль не ввел.
>>528086
В Оп посте ссылки и задачи смотрел?
>>528096
В соцсети миллионы пользователей, понадобится много памяти либо места на диске в любом случае. Можно использовать базы данных кстати, они могут работать с большими объемами но будет медленее чем держать все в памяти.
>>528097
По JS что-то есть, вроде Фленаган, но не знаю для новичков ли. learn,javascript.ru — наше все.
>>528123
Можно его скопировать в другую переменную, первую увеличить, сохраненное значение вернуть.
> if (start == undefined){
Надо тройное равно для undefined: https://learn.javascript.ru/comparison#строгое-равенство
>>528161
Неплохой сайт, если ангийский понимать. Но какой там синтаксис регулярок, из PHP или из JS? Это важно.
>>528232
Только ты тут не нужен
>>528556
> Легче убрать и увидеть. У ссылок социальных иконок появляются левые пробелы в итоге все смещается.
Тогда это надо применить только к блоку социальных иконок а не ко всему темному блоку сразу.
> Пробовал прописывать нулевые паддинги и маргины. Не помогало. Браузер сам задает этот паддинг и игнорирует мои нули. Общее обнуление помогает.
Скорее всего ты делал как-то так:
padding-left: 0;
padding: 1 2 3 4 // перекрывает предыдущее свойство
Звездочка имеет наименьший приоритет из всех селекторов и значит у тебя просто была какая-то ошибка.
>Там не ServiceLocator а ServiceLocatorInterface может в этом дело (не, вроде не в этом)?
Не знаю, я пока в архитектуре Zend Framework 2 плохо ориентируюсь, поэтому и спросил.
>Алсо, это может быть ошибка в коде если ты не официальный мануал смотришь.
Вроде бы нет, я этот код запустил, все работает.
В туториале стояло, чтобы создать свою Factory для создания контроллера, нужно добавить в module.config.php в factories:
'Helloworld\Controller\Index' => 'Helloworld\Controller\IndexControllerFactory'
и потом в файл IndexControllerFactory.php тот код, что в >>528426
Если поменять на $serviceLocator->get('greetingService'), просто перестает все работать, пишет ошибку:
Service "greetingService" has been requested to plugin manager of type "Zend\Mvc\Controller\ControllerManager", but couldn't be retrieved.
A previous exception of type "Zend\ServiceManager\Exception\ServiceNotFoundException" has been raised in the process.
By the way, a service with the name "greetingService" has been found in the parent service locator "Zend\ServiceManager\ServiceManager": did you forget to use $parentLocator = $serviceLocator->getServiceLocator() in your factory code?
Откуда там parent какой-то, я вообще не пойму.
А, все догнал, это наверное какая-то обертка присылается в createService, а не сам ServiceManager или унаследованный от него класс.
Так и должно же быть.
Типо перевод строки не срабатывает?
echo '<pre>'; под <?php поставь
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
>> [].unshift.call(arguments
>arguments это не массив и ты не можешь в него засовывать новые элементы. Проверь отладчиком ( https://learn.javascript.ru/debugging-chrome ) работает ли такое вообще и вставляются ли элементы в arguments? И даже если вставляются, все равно замени это на добавление аргументов в массив через concat.
А метода slice это тоже касается? И лучше создавать новый массив перебирая свойства объекта arguments?
Просто вот что я прочёл в учебнике: http://learn.javascript.ru/call-apply#ещё-пример-slice-call-arguments
Ну и пикрилейтед.
Алсо, MDN противоречит сам себе.
Тут сказано "используйте slice с arguments": https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice#Array-like_objects
а тут предупреждение: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
>Important: You should not slice on arguments because it prevents optimizations in JavaScript engines (V8 for example). Instead, try constructing a new array by iterating through the arguments object.
Я, пожалуй, какое-то время отдохну от этого макета. 2 часа его сейчас переделывал а в итоге только развалил и уже вообще ничего не понимаю.
Чуть позже вернусь к работе. На свежую голову.
Надеюсь, не у меня одного такое, что желание есть, но не получается вообще ничего. Может сказывается то, что я его без перерыва делал его около двух недель или сколько там, я уже даже не помню сидя по 10-12 часов в сутки и поглощая все статьи и учебники и переделывая макет. Хотя я бы это же время и сидел в интернете тупил, если бы макетом не занимался.
И да, спасибо тебе ОП, не один час на меня потратил. Обещаю, что обязательно всей данной тобою информацией воспользуюсь, но не сейчас. Вообще ничего не могу сделать.
Я вообще фронтэнд ненавижу, у меня уже после 20 минут работы с версткой начинает голова болеть ужасно.
Аналогично. Я хз, кто себе фронтенд основной профессией выбирает, странные люди. В бэкенде все логично и последовательно, а тут мазохизм же сплошной.
Да уж эти вселенские проблемы уровня У МЕНЯ ФОРМА ПОЕХАЛА НА 2 ПИКСЕЛЯ ВНИЗ В САФАРИ ШТА ДЕЛАТЬ просто убивают. Фронтендеры чистят говно вилкой.
Фронтендеры - это такие боги.
Объясните как склеить текст по-нормальному. И что делать с первой функцией? Она не работает, а как сделать по-другому не придумал.
slice читает из arguments, не меняет их. А unshift пытается менять.
Вот в Es5 написано что slice применяется к чему угодно: http://es5.javascript.ru/x15.4.html#x15.4.4.10
про unshift тоже написано что можно применять к чему угодно (главное чтобы там было свойство length и свойства 0, 1 .... N): http://es5.javascript.ru/x15.4.html#x15.4.4.13
> ПРИМЕЧАНИЕ Функция slice является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода.
А с помощью unshift ты пытался менять arguments как будто это массив.
Я почитал определение arguments http://es5.javascript.ru/x10.html#x10.6 но не нашел, можно его менять или нет. Думаю, что не стоит.
> Important: You should not slice on arguments because it prevents optimizations in JavaScript engines (V8 for example). Instead, try constructing a new array by iterating through the arguments object.
Ну тут речь только о том что какие-то оптимизации могут не сработать, ну и фиг с ними, ты все равно это не угадаешь.
По поводу твоего кода: может быть массивы надо склеивать в обратном порядке? Сначала внешние аргменты, потом внутренние?
>По поводу твоего кода: может быть массивы надо склеивать в обратном порядке? Сначала внешние аргменты, потом внутренние?
Так вроде так и есть. Переданные в partial() ставятся на первые места в возвращаемой функции.
Заменил slice в теле функции partial() на перебор свойств arguments -- роботу понравилось (пикрилейтед).
Предыдущий вариант неправильный так как в нем ты пытаешься переопределить псевдопеременную arguments:
arguments = ...
Так делать нельзя. Относись к arguments как к псевдопеременной только для чтения. Это вообще не полноценная переменная и с ней нельзя делать что угодно.
Этот вариант кстати тоже неправильный по той же причине.
Также, ты создаешь глобальные переменные: argsAdded = ....
Это тоже плохо, ты замусориваешь глобальную область видимости и рискуешь создать конфиликт с какой-нибудь другой функцией (более того скорее всего из-за этого тест и падает так как он создает несколько функций, исплоьзующих одну глобальную переменную).
Если бы ты использовал строгий режим (поставил "use strict"; в начале функции), эта ошибка бы не осталась незамеченной. Используй строгий режим.
Вместо arguments[0] лучше и нагляднее прописать func в скобках как аргумент функции.
Насчет самого теста, ты можешь попробовать глянуть его исходный код и посмотреть как именно идет проверка (только не подгоняй решение под тесты): https://github.com/dKab/jasmine-tests/blob/gh-pages/5.js#L30
Он не очень очевиден, потому обрати внимание на блок beforeEach: именно его результаты там проверяются. spy это функция-обертка которая фиксирует сколько раз она была вызвана и с какими аргументами (а тест потом проверяет что твоя функция ей передала).
Также, давай я попробую научить тебя как отлаживать такие ситуации. Вообще, это непросто так как там тест запускается так: в шапку <head> добавляется и сразу же удаляется скрипт с кодом теста (это функция globalEval в eval.js). Поставить в таком скрипте точку останова отладчиком нереально, так как отладчик его не видит.
Но мы все же можем найти причину проблемы. При ошибке тест выбрасывает исключение, потому открой отладчик, и на вкладке Script нажми кнопку «pause on exceptions» со значком паузы, и поставь галочку «pause on caught exceptions». Теперь запускай тест, и отладчик остановится на исключении. Посмотри на стектрейс в панели call stack и найди там место в тесте (это будет нелегко, у меня оно помечено в стектрейсе как (anonymous function) VM: 82:32 ). Найдя это место, ты увидишь 2 вещи:
- какой именно тест упал (не буду писать чтобы не лишать тебя удовольствия от самостоятельного поиска)
- подробности ошибки в панели Scope Variables, если раскрыть пункт «exception» и посмотреть на значение поля message.
Это были действия для Хрома, для файерфокса все примерно также должно быть.
Я посмотрел строчку с ошибкой, и у меня есть подозрения что ошибка связана с тем что если несколько раз подряд вызвать твою функцию, она работает неправильно. Посмотри этот код например: https://jsfiddle.net/j1yj8y28/1/ - он выдает неверные результаты, там должно быть не [4, 10, 11] а [2, 3, 10, 11].
И еще советую тебе показать предыдущие задачи, робот не идеален и стиль кода не проверяет, вдруг там тоже что-то не так.
Предыдущий вариант неправильный так как в нем ты пытаешься переопределить псевдопеременную arguments:
arguments = ...
Так делать нельзя. Относись к arguments как к псевдопеременной только для чтения. Это вообще не полноценная переменная и с ней нельзя делать что угодно.
Этот вариант кстати тоже неправильный по той же причине.
Также, ты создаешь глобальные переменные: argsAdded = ....
Это тоже плохо, ты замусориваешь глобальную область видимости и рискуешь создать конфиликт с какой-нибудь другой функцией (более того скорее всего из-за этого тест и падает так как он создает несколько функций, исплоьзующих одну глобальную переменную).
Если бы ты использовал строгий режим (поставил "use strict"; в начале функции), эта ошибка бы не осталась незамеченной. Используй строгий режим.
Вместо arguments[0] лучше и нагляднее прописать func в скобках как аргумент функции.
Насчет самого теста, ты можешь попробовать глянуть его исходный код и посмотреть как именно идет проверка (только не подгоняй решение под тесты): https://github.com/dKab/jasmine-tests/blob/gh-pages/5.js#L30
Он не очень очевиден, потому обрати внимание на блок beforeEach: именно его результаты там проверяются. spy это функция-обертка которая фиксирует сколько раз она была вызвана и с какими аргументами (а тест потом проверяет что твоя функция ей передала).
Также, давай я попробую научить тебя как отлаживать такие ситуации. Вообще, это непросто так как там тест запускается так: в шапку <head> добавляется и сразу же удаляется скрипт с кодом теста (это функция globalEval в eval.js). Поставить в таком скрипте точку останова отладчиком нереально, так как отладчик его не видит.
Но мы все же можем найти причину проблемы. При ошибке тест выбрасывает исключение, потому открой отладчик, и на вкладке Script нажми кнопку «pause on exceptions» со значком паузы, и поставь галочку «pause on caught exceptions». Теперь запускай тест, и отладчик остановится на исключении. Посмотри на стектрейс в панели call stack и найди там место в тесте (это будет нелегко, у меня оно помечено в стектрейсе как (anonymous function) VM: 82:32 ). Найдя это место, ты увидишь 2 вещи:
- какой именно тест упал (не буду писать чтобы не лишать тебя удовольствия от самостоятельного поиска)
- подробности ошибки в панели Scope Variables, если раскрыть пункт «exception» и посмотреть на значение поля message.
Это были действия для Хрома, для файерфокса все примерно также должно быть.
Я посмотрел строчку с ошибкой, и у меня есть подозрения что ошибка связана с тем что если несколько раз подряд вызвать твою функцию, она работает неправильно. Посмотри этот код например: https://jsfiddle.net/j1yj8y28/1/ - он выдает неверные результаты, там должно быть не [4, 10, 11] а [2, 3, 10, 11].
И еще советую тебе показать предыдущие задачи, робот не идеален и стиль кода не проверяет, вдруг там тоже что-то не так.
Спасибо за развёрнутый ответ. С тестом попробую разобраться.
Эх, похоже, не разберусь я с JS по-быстрому, как планировал.
>И еще советую тебе показать предыдущие задачи, робот не идеален и стиль кода не проверяет, вдруг там тоже что-то не так.
Вот они:
№1 http://jsfiddle.net/1qhvmwx6/
№2 http://jsfiddle.net/uf0spa52/
№3 http://jsfiddle.net/mz7ozr0c/
№4 http://jsfiddle.net/o2th9671/
>Также, ты создаешь глобальные переменные: argsAdded = ....
Это я случайно. Привычка, порождённая PHP.
Включи строгий режим внутри функции и перепроверь:
https://learn.javascript.ru/strict-mode
(в первой строчке функци надо поставить "use strict"; )
> Если второе, то тебе наверно стоит использовать библиотеку
Ну обычно мне требуется делать правки в рамках говнокода. Очень редко я психую и переписываю всё по новой. На данный момент файлики нормально заливаются, идёт проверка по MIME да похуй, тащемта, не такой и важный сайтец, переименовывается файл на юник-время. Просто не могу вписать загрузку в их код, туплю торможу. Сейчас вот снова вернусь к проблеме.
DateTime::ATOM
DATE_ATOM
Atom (пример: 2005-08-15T15:52:01+00:00)
DateTime::ISO8601
DATE_ISO8601
ISO-8601 (пример: 2005-08-15T15:52:01+0000)
Кароче, чтобы потом впасть в технозависимость. Какой лучше стандарт выбрать?
DateTime::RSS
DATE_RSS
RSS (example: Mon, 15 Aug 2005 15:52:01 +0000)
не впасть*
RSS же самый распространенный.
Ну и правильно. Даже сраная кошка знает, что такие книжки годятся только для туалета.
У кота глаза как у программиста на PHP. Видно прочитать все же успел, прежде чем порвал.
Есть простятская cms, в которой меня попросили добавить раздел добавление/редактирование меню, чтобы было как в wordpress.
Нашел библиотеку - nestable. Отлично подходит для моих нужд.
И все вроде ничего, но! Когда расставляю элементы меню в нужной последовательности, и сохраняю, то они правильно сохраняются. Затем захожу в редактирование созданного меню, там они отображаются точно так же, как я и сохранил. Тут же нажимаю на Сохранить (в смысле не изменяя ничего нажимаю сохранить) и в результате получается что падает последовательность у последних двух элементов.
Выводя массив $_POST, определил что при сабмите последний элемент который должен наследовать parent_id предпоследнего, стоит перед этим предпоследним. А предпоследний, естественно последним. Как такое может быть? Если судя по html все стоят в нужной последовательности.
Всем привет. Я тут новенький, не кидайте ссаными тряпками.
Погружаюсь в SQL, решаю задачки на sql-ex.ru
Теория там написана сложным для меня языком, наверно я дебил, и она в большинстве случаев мне не помогает.
Сейчас решаю задачу, видел, что некоторые запихивают в FROM скобки с SELECTом. Почему при таком вложении возникает ошибка? Где вообще почитать правила вложения в FROM? В примере я пытаюсь присвоить переменную avg_p первым скобкам и avg_l вторым чтобы позже сложить SUM'ом значения из этих двух переменных в одну. Если интересно, это задание №26 с вышеупомянутого сайта.
SELECT SUM(AVG_Price)
FROM (
SELECT AVG(price) AS AVG_Price
FROM pc p
JOIN product pr ON p.model=pr.model
WHERE maker='A') avg_p, (SELECT AVG(price)
FROM laptop l
JOIN product pr ON l.model=pr.model
WHERE maker='A'
) avg_l
No column name was specified for column 1 of 'avg_l'.
Kek, там задания с подъебками, я уж начал джойны и вложенные селекты на одном писать, а надо было всего лишь другое поле в той же таблице смотреть.
Скинь сюда условие задачи, на сайте требуют регистрацию.
По теории: "селекты в скобках" называются вложенными запросами, или подзапросами, и они не являются вообще хорошей вещью, потому что несколько запросов хуже одного.
Лучше их заменять joinами.
Почитай лучше бложик ОПа https://gist.github.com/codedokode/10539213 , там много хороших ссылок на учебники и статьи, а также задачи-головоломки.
По sql есть еще несколько неплохих книг, где объясняется теория.
Например мне понравилась "MySQL. Учебное пособие" Люк Веллинг, Лора Томпон.
Что значит "судя по html"? При помощи css можно как угодно отобразить последовательность элементов, неважно как они идут в коде.
Скидывай код, тут нет экстрасенсов.
Нет, но рилли, оп-петух с котиками еще пару сотнетредов знатно обосрался, так что это легко.
Аноны должны знать своих героев.
Там слева пишут обычно, какие темы пригодятся для решения.
>>529018
Спасибо за ссылку. И бложик и книги почитаю, но пока хотелось бы понять такие базовые вещи как вложение запроса в FROM на практике.
Вот условия самой задачи:
Схема БД состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, price, screen)
Printer(code, model, color, type, price)
Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер). Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов. В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price. Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах). В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price.
Задание: 26 (Serge I: 2003-02-14)
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена.
· Справка по теме:
Явные операции соединения
Подзапросы
Объединение
Получение итоговых значений
Вот ссылка на саму схему БД:
http://www.sql-ex.ru/help/select13.php#db_1
Решения гуглятся, но собраны от разных людей, поэтому иногда проще от них не становится.
Там слева пишут обычно, какие темы пригодятся для решения.
>>529018
Спасибо за ссылку. И бложик и книги почитаю, но пока хотелось бы понять такие базовые вещи как вложение запроса в FROM на практике.
Вот условия самой задачи:
Схема БД состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, price, screen)
Printer(code, model, color, type, price)
Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер). Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов. В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price. Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах). В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price.
Задание: 26 (Serge I: 2003-02-14)
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена.
· Справка по теме:
Явные операции соединения
Подзапросы
Объединение
Получение итоговых значений
Вот ссылка на саму схему БД:
http://www.sql-ex.ru/help/select13.php#db_1
Решения гуглятся, но собраны от разных людей, поэтому иногда проще от них не становится.
Посоны, поставил апачь на убунту, создал тестовый файл, запустил в браузере localhost/test.php а он мне-
>The requested URL /test.php was not found on this server.
>Apache/2.4.10 (Ubuntu) Server at localhost Port 80
Что может быть не так?
Открой httpd.conf, проверь DocumentRoot "C:/directory" или поменяй
настрой <Directory "C:/directory">, выставь там права доступа.
И потов эту директорию клади test.php
Ничего не поменялось.
Делаю по этому гайду http://ussoff.narod.ru/, может там что-то не так.
Если можешь, то дай норм гайд для настройки ПХП\апач\мускуль и IDE Eclipse для винды или убунты, пожалуйста.
Тут гайд
http://www.oldnix.org/install-xampp-linux/
>IDE Eclipse
Это ж жопа, юзай Netbeans или PHPStorm.
>Тут гайд
Но это же сборки типа денвера, тут анон меня отговаривал от них.
А чем эклипс плох, бесплатный же.
Eclipse лучше для Java подходит.
Для PHP, насколько я пробовал, netbeans быстрее, проще в освоении и универсальнее, все без шаманств заводится за 5 мин, подсветка везде где надо, лишних назойливых фич нет и доки подробные. Он бесплатный тоже кстати. PHPStorm сложнее нетбинса, возможностей и удобностей поболее, но платный и тормозной, к тому же часто ненужные фичи сами включаются. Также пикрелейтед. Как видишь Eclipse на работах совсем мало юзают в PHP, в основном Netbeans, PHPStorm и Sublime.
Есть li в нем есть данные в input`ах.
Если в li есть еще один li с данными, то он является его чилдреном.
Когда нажимаем сабмит, то по логике в $_POST должны идти данные вначале из первого li, а затем из второго. Но на деле они почему-то меняются местами. Как такое может быть?
через js структура не меняется
Решается через джойн с группировкой. То что там выше с подзапросами, это явно неправильно и некрасиво.
Тем более в «справка по теме» намекают:
— Явные операции соединения
> то по логике в $_POST должны идти данные вначале из первого li, а затем из второго.
По какой такой логике? Это ты сам придумал. Не надо полагаться на порядок в котором идут данные, пронумеруй их явно, например value[1], value[2] и т д.
Стандарт w3c ведь, что $_POST идет в такой же последовательности как элементы на старинце
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, price, screen)
Printer(code, model, color, type, price)
Задание:
Найдите номера моделей и цены всех продуктов (любого типа), выпущенных производителем B (латинская буква).
Мое решение:
SELECT Product.model, price FROM Product JOIN Laptop ON Product.model = Laptop.model WHERE Product.maker = 'B' UNION SELECT Product.model, price FROM PC JOIN Product ON Product.model = Pc.model WHERE Product.maker = 'B' UNION SELECT Product.model, price FROM Printer JOIN Product ON Product.model = Printer.model WHERE Product.maker = 'B'
ОП, а такое решение, как у меня с кучей UNION и JOIN для 3х таблиц, это нормально, или еще как-то проще можно? Смущает, что WHERE условие 3 раза повторяется.
Можно поподробнее?
У меня уже используются два джоина во вложенных запросах. К тому же, в справке по теме есть и использование подзапросов. Да, может некрасиво, но на данном этапе мне в первую очередь нужно понять, как используются вложения во FROM. За оптимизацией я буду гнаться когда смогу решать такие задачи разными способами. Кстати, вероятно, при неиспользовании подзапросов сайт не засчитает мне задачу, потому что там есть не только проверка на совпадение результата, но и проверка правильности запроса "если бы там были другие данные, то результат уже не совпал бы".
Я пытался объединить эти запросы вычисления средней цены через UNION (в справке значатся объединения), но получил соединение в отдельные строки, понял, что это не то, так как мне нужно получить одну строку - сумму этих двух строк.
Если решение прошло, то можешь зайти в форум с обсуждением задания, и там будет несколько страниц вариантов от разных людей, зачастую вводящих меня в панику используемыми операторами и конструкциями. Ну и скорость обработки запроса они любят публиковать к своим вариантам.
под ссылкой на обсуждение есть "Анализ плана выполнения решения."
Total cost, как я понимаю, и есть скорость обработки запроса
var arr = [];
for (int i = 0; i<count; i++){
arr=fn();
}
return arr[];
}
Чувствую, я совсем не в ту сторону капаю. Помогите.
>на данном этапе мне в первую очередь нужно понять, как используются вложения во FROM
Ну что же вы, котейки, никто не знает?
Эбать. Вот это палитра. Тёма негодуэ.
> как используются вложения во FROM
Что тут сложного? ты можешь вместо таблицы указать подзапрос, возвращающий таблицу:
SELECT inn.id, inn.x FROM (SELECT ...) inn WHERE inn.y = ....;
Подзапрос можно использовать совместно с другими таблицами (FROM tablre, (SELECT ...) ) и в джойнах (FROM table JOIN (SELECT ...)).
Также позапрос можно использовать в списке полей, в условии WHRE x IN (SELECT), в условии вроде WHERE x > (SELECT ...), и в условиях HAVING. И может где-то еще.
Учебник:
http://www.pyramidin.narod.ru/rusql/ch11.html
http://www.pyramidin.narod.ru/rusql/ch12.html
http://www.pyramidin.narod.ru/rusql/ch13.html
Но писать так не стоит, код с JOIN получается аккуратнее, читабельнее и оптимальнее. Я не понимаю зачем ты так упираешься в подзапросы.
А ты learn.javascript.ru читаешь? Если нет то открой и начинай читать.
arr=fn();
Что это делает? Помещает в переменную arr вместо массива результат вызова функции?
> return arr[];
Где это ты увидел такой синтаксис?
>>529149
> Кто-то знает, как такую на обычном mysql серваке получить?
EXPLAIN SELECT:
http://habrahabr.ru/post/211022/
http://habrahabr.ru/post/31129/
http://habrahabr.ru/post/203320/
https://dev.mysql.com/doc/refman/5.0/en/explain.html
>>529095
Мне не нравится эта задача так как база в ней спроектирована неправильно. При использовании нормализации мы не должны создавать таблицы с одинаковыми полями, а должны вынести их в общую таблицу «устройства».
Помни об этом и не делай такие таблицы как на том сайте.
В твоем случае, да без UNION никак не обойтись. У нас есть 2 варианта:
— сделать 3 индивидуальных выборки и объединить через UNION
— (чуть умнее) объединить таблицы через UNION, а объединенную таблицу джойнить на таблицу производиетлей. Код будет короче.
> ОП, а такое решение, как у меня с кучей UNION и JOIN для 3х таблиц, это нормально, или еще как-то проще можно? Смущает, что WHERE условие 3 раза повторяется.
Можно сначала делать юнион а только потом джойн.
А ты learn.javascript.ru читаешь? Если нет то открой и начинай читать.
arr=fn();
Что это делает? Помещает в переменную arr вместо массива результат вызова функции?
> return arr[];
Где это ты увидел такой синтаксис?
>>529149
> Кто-то знает, как такую на обычном mysql серваке получить?
EXPLAIN SELECT:
http://habrahabr.ru/post/211022/
http://habrahabr.ru/post/31129/
http://habrahabr.ru/post/203320/
https://dev.mysql.com/doc/refman/5.0/en/explain.html
>>529095
Мне не нравится эта задача так как база в ней спроектирована неправильно. При использовании нормализации мы не должны создавать таблицы с одинаковыми полями, а должны вынести их в общую таблицу «устройства».
Помни об этом и не делай такие таблицы как на том сайте.
В твоем случае, да без UNION никак не обойтись. У нас есть 2 варианта:
— сделать 3 индивидуальных выборки и объединить через UNION
— (чуть умнее) объединить таблицы через UNION, а объединенную таблицу джойнить на таблицу производиетлей. Код будет короче.
> ОП, а такое решение, как у меня с кучей UNION и JOIN для 3х таблиц, это нормально, или еще как-то проще можно? Смущает, что WHERE условие 3 раза повторяется.
Можно сначала делать юнион а только потом джойн.
Если стандарт так говорит то браузер скорее всего ему следует и ошибка где-то в твоем коде который разбирает данные. Но в любом случае код который полагается на порядок данных, хрупкий, порядок надо указыать явно. Я рекомендую переписать код.
Если ты считаешь что браузер не следует стандарту, покажи минимальный готовый HTML с формой которая отправляется в неправильном порядке, я проверю.
$_POST не описан ни в каких стандартах w3c. Стандарты w3c описывают способ кодирования данных формы в теле POST запроса. Массив POST создается интерпретатором PHP и порядок его создания не описан ни в каких стандартах, разве что в документации по PHP.
И интуиция подсказывает мне что у тебя просто кривой код.
В любом случае, я конечно могу ошибаться или что-то не понять, так что было бы хорошо если ты приложил:
— кусок HTML кода
— кусок данных, отправляемых при откправке формы, со вкладки Network в отладчике браузера (Ctrl + Shift + I)
— что выводит print_r($_POST) в PHP
Задание 1
Автор задания и разбора — Олег Olegbl4 Мохов. В Яндексе руководит разработкой интерфейсов нескольких сервисов, а вне Яндекса организует конференции FrontTalks, EkbJS и ChellyJS и читает спецкурс по разработке интерфесов в УрФу
Сверстайте всплывающее окно (попап) — элемент, который показывается поверх содержимого веб-страницы. Он должен всегда находиться в её центре, при этом размер контента может меняться. Предложите максимальное количество решений и объясните, какие у каждого из них есть недостатки и преимущества.
Задание 2
Автор задания и разбора — Максим KidsKilla Гришаев. В Яндексе занимается разработкой Элементов для Firefox
Есть страница с «эквалайзерами» — контейнеры произвольных размеров (квадраты 100px, 200px и 300px) заполняются столбцами шириной по 2px (задаётся параметром).
Каждую секунду столбцам задаётся случайная высота в пределах размеров контейнера. Далее при помощи анимации высота столбцов возвращается к середине контейнера. Реализация находится в файле: http://github.com/yandex-shri-minsk-2014/jade-task . Исходный код работает медленно и приводит к зависанию браузера. Нужно улучшить его так, чтобы анимация стала плавной. Изменять вёрстку необязательно, однако вы можете это сделать, если это поможет решить задачу. Работоспособность в IE ниже 8 не требуется. Желательно добавить помимо анимации «спада» ещё и анимацию «роста». По возможности оформите в качестве jQuery-плагина или напишите без jQuery.
Задача 3
Автор задания и разбора — Илья Довбан. Илья руководит группой поисковых интерфейсов в минском офисе Яндекса
Все больше и больше различных технологий становятся доступны в браузере, тем самым расширяя потенциальный инструментарий фронтедера. Очевидно, что никаких навыков не хватит, чтобы уверенно разбираться в разработке интерфейсов, трехмерной графике, модификации звука, расчетах больших объемов данных. И, разумеется, все и сразу оно в итоге не надо. Но современный фронтенд-разработчик должен уметь разобраться в новой области и освоить непривычный инструментарий, как только придет необходимость. Именно об этом и было третье (на звездочку) вступительное задание.
При помощи d3.js сделайте интерактивную визуализацию произвольного массива точек, которые плавно и неравномерно меняют цвет от красного к жёлтому и обратно, находятся в броуновском движении и «убегают» от курсора.
Разбор решений и правильные ответы: http://habrahabr.ru/company/yandex/blog/264631/
Аноны, попробуйте хотя бы полчаса-час голову поломать, думаю, будет полезно. От себя скажу что какое-то время назад я экспериментировал с разными способами реализации попапа (без яваскрипта), ну а задачу на оптимизацию хорошо решать, используя вкладку Timeline в отладчике Хрома.
Я в свою очередь могу прокомментировать ваши идеи и решения, если вы не хотите сразу смотреть правильный ответ. Могу дать подсказку если вы зашли в тупик.
Задание 1
Автор задания и разбора — Олег Olegbl4 Мохов. В Яндексе руководит разработкой интерфейсов нескольких сервисов, а вне Яндекса организует конференции FrontTalks, EkbJS и ChellyJS и читает спецкурс по разработке интерфесов в УрФу
Сверстайте всплывающее окно (попап) — элемент, который показывается поверх содержимого веб-страницы. Он должен всегда находиться в её центре, при этом размер контента может меняться. Предложите максимальное количество решений и объясните, какие у каждого из них есть недостатки и преимущества.
Задание 2
Автор задания и разбора — Максим KidsKilla Гришаев. В Яндексе занимается разработкой Элементов для Firefox
Есть страница с «эквалайзерами» — контейнеры произвольных размеров (квадраты 100px, 200px и 300px) заполняются столбцами шириной по 2px (задаётся параметром).
Каждую секунду столбцам задаётся случайная высота в пределах размеров контейнера. Далее при помощи анимации высота столбцов возвращается к середине контейнера. Реализация находится в файле: http://github.com/yandex-shri-minsk-2014/jade-task . Исходный код работает медленно и приводит к зависанию браузера. Нужно улучшить его так, чтобы анимация стала плавной. Изменять вёрстку необязательно, однако вы можете это сделать, если это поможет решить задачу. Работоспособность в IE ниже 8 не требуется. Желательно добавить помимо анимации «спада» ещё и анимацию «роста». По возможности оформите в качестве jQuery-плагина или напишите без jQuery.
Задача 3
Автор задания и разбора — Илья Довбан. Илья руководит группой поисковых интерфейсов в минском офисе Яндекса
Все больше и больше различных технологий становятся доступны в браузере, тем самым расширяя потенциальный инструментарий фронтедера. Очевидно, что никаких навыков не хватит, чтобы уверенно разбираться в разработке интерфейсов, трехмерной графике, модификации звука, расчетах больших объемов данных. И, разумеется, все и сразу оно в итоге не надо. Но современный фронтенд-разработчик должен уметь разобраться в новой области и освоить непривычный инструментарий, как только придет необходимость. Именно об этом и было третье (на звездочку) вступительное задание.
При помощи d3.js сделайте интерактивную визуализацию произвольного массива точек, которые плавно и неравномерно меняют цвет от красного к жёлтому и обратно, находятся в броуновском движении и «убегают» от курсора.
Разбор решений и правильные ответы: http://habrahabr.ru/company/yandex/blog/264631/
Аноны, попробуйте хотя бы полчаса-час голову поломать, думаю, будет полезно. От себя скажу что какое-то время назад я экспериментировал с разными способами реализации попапа (без яваскрипта), ну а задачу на оптимизацию хорошо решать, используя вкладку Timeline в отладчике Хрома.
Я в свою очередь могу прокомментировать ваши идеи и решения, если вы не хотите сразу смотреть правильный ответ. Могу дать подсказку если вы зашли в тупик.
В общем имеем такую структуру как на пикче(я про элементы справа).
Составили ее только что, еще не сохраняли. То есть сейчас ее html такой: http://pastebin.com/cFAFk8Zz
Сохраняем. $_POST выглядит следующим образом: http://pastebin.com/YS38m8z1
Все отлично, parent_id - это ключ элемента.
Открываем сохраненную менюху. И блять, тут вылетел баг, которого я еще не видел. Почему-то элемент test4 принадлежит еще и родителю test2, хотя в базе четко сохранилось 4 значения только, с правильной вложенностью. http://prntscr.com/83wxg6
Ладно. Упустим этот момент, где-то ошибка, потом исправлю. Удаляю. html получается такой: http://pastebin.com/xZjqRaFD
То что ключи теперь такие большие - это не важно, просто теперь они берутся из базы.
Так вот. Сейчас данные с ключом 456 идут послу ключа 455 и в parent_id ссылаются на него. То есть по логике все правильно. Но выведем $_POST и... бля. Получим правильный массив. Все как должно быть, того бага про который я говорил нет. Нах все это расписывал...
Значит баг в выводе элементов...
>\tВуз, факультет, специальность, кафедра
>\tГод окончания вуза\t
Это оскорбляет мои плебейские чувства. Отметили бы эти пункты как необязательные.
https://events.yandex.ru/lib/talks/1564/
Или такие:
https://www.lektorium.tv/ (тут правда с поиском беда)
>>529223
Вот и хорошо, что разобрались.
Но все же порядок элементов лучше указывать явно, в твоем случае например там могло бы быть menu[1][order] который хранит номер элемента по порядку. Ну это так, если ты будешь сам такие вещи делать.
>>529224
Я думаю, там можно указать что образования нет.
Судя по тексту ошибки, там тебе передается не service locator, а Zend\Mvc\Controller\ControllerManager который реализует интерфейс. А уже у него есть метод для получения service locator. Не знаю, почему так сделано.
Тут https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application написано про разные Service Manager, видимо в зенде их много и для создания контроллеров есть свой менеджер.
Надо указывать ссылки такого типа:
href="/css/style.css"
Ты изучал относительные и абсолютные ссылки в HTML? Почитай: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5+%D0%B8+%D0%B0%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B5+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8+url
Если твой проект находится не в корне сайта, а в папке (например http://localhost/project/ ) то у Slim есть метод $app->request->getRootUri() для определения пути к папке (/project/).
Тогда ты должен с его помощью формировать ссылки вроде
/project/css/style.css
Там мало (по php я вообще ничего не нашел), нет практических занятий.
И если лектор уважаемый разраб, это не значит, что он классный препод, который способен что-то объяснить.
>lektorium.tv
Там ничего нет. По крайней мере если вбить в поиск php, выдает
>Комбинаторные виды и теория представлений симметрической группы
>Группы и теория гомотопий
и т.д.
На русском в принципе вообще материалов нет, что в печатном виде, что в человекоприятном формате.
На английском ситуация гораздо лучше. Зацени курс от Линды по Гиту. Все грамотно и профессионально. https://www.youtube.com/watch?v=o49ywgiM6uA
Уверен, что даже ты не знаешь некоторых вещей, о которых там рассказывается.
Например неделю назад я тут спрашивал как откатить гит на 3-4... коммита назад, то есть стереть изменения. Вы мне предложили хуйню из гугла.
>>526046
>>526077
Нет. Лучше сделать жесткий ресет (reset --hard). Revert действует только на последний коммит, фактически он просто создает копию предпоследнего коммита.
Отложил пока php, засел за английский. Кто-то выше вбросил memrise.com, рекомендую.
Самое то для аутирования, пикрелейтед. За двенадцать часов набампал 1200 слов. Правда там начальный уровень.
Но дело идет споро, я доволен.
В фронтенде много интересного, надо просто хорошо понимать используемые технологии а не переставлять строчки наугад пока не заработает. Сейчас в браузер куча технологий вплоть до того что ты можешь делать работающие без связи с сервером приложения или генерировать звук.
>>528667
Надо разбираться в CSS, хотя начинающему, да, бывает сложно. По моему опыту проблемы обычно быают не когда делаешь верстку с нуля. а когда правишь чужую, а человек работает именно по принципу «переставляем свойства пока не заработает».
>>528710
> $text = ucfirst($text);
Ты внимально читал мой учебник? ucfirst работает толко с латинницей. Вот подробнее написано: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Используй mb-функции. В данном случае надо отрезать первую букву, перевести в нужный регистр и приклеить хвост строки.
Убрать лишние пробелы перед точкой можно с помощью функции trim()
>>528726
> №1
Ок, верно
> №2
Правильно
> №3
Правильно
> №4
Все верно, хотя я бы не стал писать частный случай с if.
>>528727
Строгий режим помогает отучиться. Также, ты можешь (если разберешься с настройкой) установить jshint в свой редактор кода, он такие вещи видит и подчеркивает. У меня например в саблайме он работает, но под виндой с настройкой придется помучаться так акк плагину нужна node.js и надо чтобы он ее мог найти.
>>528730
> args = argsDefined.concat(argsAdded);
var пропущен
> var func = arguments[0];
Лучше явно указать func в скобках ради читабельности
>>528751
Больше нет
>>528761
Эти форматы сделаны для конкретных случаев, ATOM — как следует из названия, для RSS в формате ATOM, а ISO8601, как показывает гугление (http://microformats.org/wiki/iso-8601 ) используется тоже в RSS и в атрибутах тегов.
Есть еще форматы используемые в HTTP заголовках.
Это компьютерные форматы. Если ты выводишь дату на странице для людей, используй человекопонятный формат, например:
Опубликовано 1 сентября 2015 в 12:20
>>528993
> В примере я пытаюсь присвоить переменную avg_p первым скобкам и avg_l вторым чтобы позже сложить SUM'ом значения из этих двух переменных в одну.
Ты неправильно называешь вещи.
- то что в скобках это подзапрос
- avg_l это не переменная, а алиас (синоним, псевдоним) для подзапроса. Он используется чтобы указывать на поля в результате выполнения этого подзапроса, например avg_l.xyz
Ты мало читаешь теории. Надо сначала изучить каждую часть запроса, а не писать код переставляя слова наугад пока не заработает. Я вижу что ты почему-то предпочитаешь второй подход, зря.
Прочитай например тут про алиасы:
http://dimonchik.com/sql-alias.html
далее, разберем сообщение об ошибке:
> No column name was specified for column 1 of 'avg_l'.
Ты не задал алиас для первой колонки в подзапросе avg_l и из-за этого не можешь к ней обратиться (так как AVG(price) это не имя)
Далее, разберем код:
SELECT SUM(..) FROM (....) avg_p, (.....) avg_l
Объясни что по-твоему происходит, когда мы уакзываем 2 таблицы через запятую в секции FROM? Ответ происходит джойн (объединение таблиц), который генерирует полное декартовое произведение строчек из них
Разумеется так ты нужный тебе результат не получишь. Если ты гонишься за числом решенных задач, то зря, решение методом перестановки знаний не дает.
Тебе надо почитать теорию вот например тут:
http://www.pyramidin.narod.ru/rusql/index.htm
Или тут:
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-2.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
У тебя пока недостаточно знаний для решения этой задачи, и надо начать с теории.
В фронтенде много интересного, надо просто хорошо понимать используемые технологии а не переставлять строчки наугад пока не заработает. Сейчас в браузер куча технологий вплоть до того что ты можешь делать работающие без связи с сервером приложения или генерировать звук.
>>528667
Надо разбираться в CSS, хотя начинающему, да, бывает сложно. По моему опыту проблемы обычно быают не когда делаешь верстку с нуля. а когда правишь чужую, а человек работает именно по принципу «переставляем свойства пока не заработает».
>>528710
> $text = ucfirst($text);
Ты внимально читал мой учебник? ucfirst работает толко с латинницей. Вот подробнее написано: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Используй mb-функции. В данном случае надо отрезать первую букву, перевести в нужный регистр и приклеить хвост строки.
Убрать лишние пробелы перед точкой можно с помощью функции trim()
>>528726
> №1
Ок, верно
> №2
Правильно
> №3
Правильно
> №4
Все верно, хотя я бы не стал писать частный случай с if.
>>528727
Строгий режим помогает отучиться. Также, ты можешь (если разберешься с настройкой) установить jshint в свой редактор кода, он такие вещи видит и подчеркивает. У меня например в саблайме он работает, но под виндой с настройкой придется помучаться так акк плагину нужна node.js и надо чтобы он ее мог найти.
>>528730
> args = argsDefined.concat(argsAdded);
var пропущен
> var func = arguments[0];
Лучше явно указать func в скобках ради читабельности
>>528751
Больше нет
>>528761
Эти форматы сделаны для конкретных случаев, ATOM — как следует из названия, для RSS в формате ATOM, а ISO8601, как показывает гугление (http://microformats.org/wiki/iso-8601 ) используется тоже в RSS и в атрибутах тегов.
Есть еще форматы используемые в HTTP заголовках.
Это компьютерные форматы. Если ты выводишь дату на странице для людей, используй человекопонятный формат, например:
Опубликовано 1 сентября 2015 в 12:20
>>528993
> В примере я пытаюсь присвоить переменную avg_p первым скобкам и avg_l вторым чтобы позже сложить SUM'ом значения из этих двух переменных в одну.
Ты неправильно называешь вещи.
- то что в скобках это подзапрос
- avg_l это не переменная, а алиас (синоним, псевдоним) для подзапроса. Он используется чтобы указывать на поля в результате выполнения этого подзапроса, например avg_l.xyz
Ты мало читаешь теории. Надо сначала изучить каждую часть запроса, а не писать код переставляя слова наугад пока не заработает. Я вижу что ты почему-то предпочитаешь второй подход, зря.
Прочитай например тут про алиасы:
http://dimonchik.com/sql-alias.html
далее, разберем сообщение об ошибке:
> No column name was specified for column 1 of 'avg_l'.
Ты не задал алиас для первой колонки в подзапросе avg_l и из-за этого не можешь к ней обратиться (так как AVG(price) это не имя)
Далее, разберем код:
SELECT SUM(..) FROM (....) avg_p, (.....) avg_l
Объясни что по-твоему происходит, когда мы уакзываем 2 таблицы через запятую в секции FROM? Ответ происходит джойн (объединение таблиц), который генерирует полное декартовое произведение строчек из них
Разумеется так ты нужный тебе результат не получишь. Если ты гонишься за числом решенных задач, то зря, решение методом перестановки знаний не дает.
Тебе надо почитать теорию вот например тут:
http://www.pyramidin.narod.ru/rusql/index.htm
Или тут:
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-2.html
http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
У тебя пока недостаточно знаний для решения этой задачи, и надо начать с теории.
погугли http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=eclipse+web+launch+already+running
>>529242
> var func = arguments[0];
ради читабельности этот аргумент лучше указать явно в скобках
> var args = [].slice.call(argsDefined);
Почему не просто slice? Это же массив а не псевдомассив. Трюк нужен только для псевдомассивов у которых нет метода slice.
Код выглядит верно. Робота проходит? Если да то все ок.
И тебе как умненькому, советую потом после этих задач глянуть задачи от яндекса из поста выше.
>>529248
> И если лектор уважаемый разраб, это не значит, что он классный препод, который способен что-то объяснить.
Это да, согласен, я послушал нменого, объясняют иногда не очень хорошо. Но зато там самой полезной информации все же больше, и она часто очень разносторонняя.
Ну и у яндекса есть уникальный опыт, который вряд ли есть у фоилансера с ютуба.
>>lektorium.tv
> Там ничего нет
Там по базам данных вроде курс есть:
https://www.lektorium.tv/medialibrary?search_api_views_fulltext=%D0%B1%D0%B0%D0%B7%D1%8B+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&type=All&recorded_from%5Bdate%5D=&recorded_to%5Bdate%5D=&sort_by=created&sort_order=ASC
https://www.lektorium.tv/course/22828
Ну и вот этот список курсов от Computer Science Center: https://www.lektorium.tv/university/2932
Там конечно сейчас поиск ужасный сделали и все захламили гуманитарными курсами, раньше там в основном по тезнологиям были курсы.
Как видишь там курсы не конкретно по PHP, зато есть более крутые вещи вроде машинного обучения.
> На английском ситуация гораздо лучше
Согласен. Я сам смотрел курс по AI, там и теория, и задачки над которыми немного придется поломать голову: https://www.udacity.com/course/intro-to-artificial-intelligence--cs271
Да, на западных сайтах есть курсы от ведущих мировых вузов. Но то, что у нас есть хоть что-то на русском, на мой взгляд тоже неплохо.
> Уверен, что даже ты не знаешь некоторых вещей, о которых там рассказывается.
Возможно, гит я не очень знаю и сам иногда гуглю. Я например не отвечу даже на вопрос что такое HEAD или FETCH_HEAD, но я знаю что git diff HEAD~1 покажет разницу между с предыдущим коммитом.
> Revert действует только на последний коммит, фактически он просто создает копию предпоследнего коммита.
Боюсь, ты ошибся. В мануале написано можно указать конкретный коммит: http://git-scm.com/docs/git-revert
Да, он отменяет изменения, добавляя новый коммит. И это вполне нормальный вариант.
reset это кое-что другое, reset --hard возвращает состояние рабочей области к указанному коммиту (и далее ты можешь это состояние закоммитить). Получается в общем то же, но за большее число шагов.
Аналогично можно получить файлы из определенного коммита с помощью git checkout SHA.
погугли http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=eclipse+web+launch+already+running
>>529242
> var func = arguments[0];
ради читабельности этот аргумент лучше указать явно в скобках
> var args = [].slice.call(argsDefined);
Почему не просто slice? Это же массив а не псевдомассив. Трюк нужен только для псевдомассивов у которых нет метода slice.
Код выглядит верно. Робота проходит? Если да то все ок.
И тебе как умненькому, советую потом после этих задач глянуть задачи от яндекса из поста выше.
>>529248
> И если лектор уважаемый разраб, это не значит, что он классный препод, который способен что-то объяснить.
Это да, согласен, я послушал нменого, объясняют иногда не очень хорошо. Но зато там самой полезной информации все же больше, и она часто очень разносторонняя.
Ну и у яндекса есть уникальный опыт, который вряд ли есть у фоилансера с ютуба.
>>lektorium.tv
> Там ничего нет
Там по базам данных вроде курс есть:
https://www.lektorium.tv/medialibrary?search_api_views_fulltext=%D0%B1%D0%B0%D0%B7%D1%8B+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&type=All&recorded_from%5Bdate%5D=&recorded_to%5Bdate%5D=&sort_by=created&sort_order=ASC
https://www.lektorium.tv/course/22828
Ну и вот этот список курсов от Computer Science Center: https://www.lektorium.tv/university/2932
Там конечно сейчас поиск ужасный сделали и все захламили гуманитарными курсами, раньше там в основном по тезнологиям были курсы.
Как видишь там курсы не конкретно по PHP, зато есть более крутые вещи вроде машинного обучения.
> На английском ситуация гораздо лучше
Согласен. Я сам смотрел курс по AI, там и теория, и задачки над которыми немного придется поломать голову: https://www.udacity.com/course/intro-to-artificial-intelligence--cs271
Да, на западных сайтах есть курсы от ведущих мировых вузов. Но то, что у нас есть хоть что-то на русском, на мой взгляд тоже неплохо.
> Уверен, что даже ты не знаешь некоторых вещей, о которых там рассказывается.
Возможно, гит я не очень знаю и сам иногда гуглю. Я например не отвечу даже на вопрос что такое HEAD или FETCH_HEAD, но я знаю что git diff HEAD~1 покажет разницу между с предыдущим коммитом.
> Revert действует только на последний коммит, фактически он просто создает копию предпоследнего коммита.
Боюсь, ты ошибся. В мануале написано можно указать конкретный коммит: http://git-scm.com/docs/git-revert
Да, он отменяет изменения, добавляя новый коммит. И это вполне нормальный вариант.
reset это кое-что другое, reset --hard возвращает состояние рабочей области к указанному коммиту (и далее ты можешь это состояние закоммитить). Получается в общем то же, но за большее число шагов.
Аналогично можно получить файлы из определенного коммита с помощью git checkout SHA.
> Кто-то выше вбросил memrise.com, рекомендую.
О, там и японский есть, хорошо, можно будет попробовать.
> Там мало (по php я вообще ничего не нашел), нет практических занятий.
> И если лектор уважаемый разраб, это не значит, что он классный препод, который способен что-то объяснить.
Да, там нет практических занятий по PHP, но зато есть много полезного для расширения кругозора, а по той конкретной ссылке — по фронтенду.
>>529250
Ты можешь ей не пользоваться. мне тоже не нравится мода давать значки за какие-то элементарные вещи, это больше отвлекает (в играх) чем дает пользу. Уж если и давать достижения то за какие-то сложные вещи.
>>529252
Выглядит верно, если робот примет, то ок.
>> var func = arguments[0];
>ради читабельности этот аргумент лучше указать явно в скобках
>
>> var args = [].slice.call(argsDefined);
>Почему не просто slice? Это же массив а не псевдомассив. Трюк нужен только для псевдомассивов у которых нет метода slice.
>
Это рудименты решения предыдущего задания. Исправил в js-файлах у себя на компьютере.
>Код выглядит верно. Робота проходит? Если да то все ок.
Робота проходит.
#9: http://jsfiddle.net/qy1Ldbkj/
#10: http://jsfiddle.net/ufafa82x/
А ты думал в сказку попал? Погоди, сейчас оп пригрузит тебя вопросами с собеседований яндекса и гугла.
В 10 варианте стоит сделать проверку через hasOwnProperty чтобы не считать лишние свойства, которые кто-нибудь может добавить на прототип объекта: https://learn.javascript.ru/prototype#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-hasownproperty
Но так как ты не изучал прототипы (пока) то можно не делать.
А так, верно.
оп, так можно на аяксе это запилить вместо айфрейма
> Но если вам нравятся видео/аудиокурсы, почему вы смотрите сделанные непонятно кем, а не например видеолекции от разработчиков компаний вроде Яндекса?
Но это не видеокурс. Там стоит мужик и что-то непонятное рассказывает, я даже не всегда догоняю о чем. В нормальном видеокурсе как от Lynda двигают по экрану все, печатают код, тут же показывают что изменилось и акцентируют внимание на элементах, показывают полезные определения или подсказки. Получается наглядно и понятно, хотя бы что-то в голове остается.
Спасибо большое, аноним. Это то, что мне было нужно.
Если кому-то интересно, решение:
SELECT avg(price) AS 'одна общая средняя цена'
FROM (
SELECT price
FROM pc p
JOIN product pr ON p.model=pr.model
WHERE maker='A'
UNION ALL
SELECT price
FROM laptop l
JOIN product pr ON l.model=pr.model
WHERE maker='A'
) a
>>529255
И тебе спасибо, хоть ты и поздновато ответил. Я понимаю, что бегу вперёд поезда, но на то есть причины.
Все-таки решил уже дошаманить этот макет.
>Кстати, давай тебе как сообразительному, дадим дополнительное задание: сделай чтобы при переключении категорий портфолио каринки менялись не скачком, а с анимацией (можно использовать как transition так и animation, на выбор). Изучи какие есть способы и возможности и выбери какой-нибудь.
Статьи я благополучно не открывал но все сохранил и позже обязательно прочту, после того как услышал о процентах и transition, я понял, как сделаю анимацию.
>>>Флоат по моему правильнее применять не к картинке а к ссылке, а то как-то странно, ты флоатом вырываешь картинку из содержащего ее инлайн-элемента.
>> Начал переделывать, все развалилось.
>Значит придется взять отладчик и разобраться, почему. Что это за верстальщик, у которого магия творится в коде? Магии не должно быть. Я тебе сразу говорю, что вырывать флоат (img) из блока (a) это гиблое дело так как в блоке не остается содержимого (он становится нулевой высоты) и он позиционируется черт знает как. Надо сделать флоатами именно внешний блок у картинки, тег <a>, а саму картинку сделать например блоком чтобы убрать лишние отступы снизу.
Флоаты с img перенес на ссылки.
Проверь, пожалуйста, ОП, как я сделал именно анимацию лично я минут 5 сидел туда-сюда переключал кнопки и на анимацию смотрел и не начудил ли чего с переносом флоатов.
Остальное все после этого буду делать.
А шрифты когда будут? Я бы с этого начал.
Анимация неплохая, но есть один нехороший момент: если мы переходим от graphic к illustration то высота страницы прыгает: сначала уменьшается, потом увеличивается. Реально ли это обойти? Если нельзя это просто решить, то ладно.
Кстати что мне нравится что если инспектором менять классы на портфолио то все обновляется само.
И анимация выглядит интереснее, если классы расположить не по 4 а более хаотично.
>А шрифты когда будут? Я бы с этого начал.
Сделаю обязательно в ближайшее время.
>Анимация неплохая, но есть один нехороший момент: если мы переходим от graphic к illustration то высота страницы прыгает: сначала уменьшается, потом увеличивается. Реально ли это обойти? Если нельзя это просто решить, то ладно.
Как-то нужно заставить блок ссылки развернуться сразу на 100% а картинка в нем чтобы плавно 1 секунду вырастала. Пока поковырялся, не смог сделать. Может попозже мысль придет.
И на самом деле это мне в глаза неочень бросается, а вот что не нравится так это когда переключаешь с ALL на ILLUSTRATION или MOTION. Там видно что вначале 4я работа не влезает и она вылезает на вторую строчку а потом резко встает на место. И уж вот это я понятия не имею как исправлять и можно ли вообще, оставив такую анимацию.
> И на самом деле это мне в глаза неочень бросается, а вот что не нравится так это когда переключаешь с ALL на ILLUSTRATION или MOTION. Там видно что вначале 4я работа не влезает и она вылезает на вторую строчку а потом резко встает на место. И уж вот это я понятия не имею как исправлять и можно ли вообще, оставив такую анимацию.
Яваскрптом, сделав абс. позиционирование блоков, транзишен для top/left и скриптом вычислять новые позиции блоков при переключении как тут (там впрочем тоже не идеально):
http://vestride.github.io/Shuffle/
> Как-то нужно заставить блок ссылки развернуться сразу на 100% а картинка в нем чтобы плавно 1 секунду вырастала. Пока поковырялся, не смог сделать.
Можно менять размер картинки с помощью transform: scale который не меняет занимаемое место в раскладке, но тогда высота будет прыгать скачками, а не плавно. Наверно, не стоит.
Кстати, интересно, что в ФФ при перезагрузке страницы положение переключателя сохраняетя. А в Хроме вроде нет.
Вы спросите зачем я это искал? У меня какая-то пиратская порезанная версия винды и я руками копирую файлы чтобы установить поддержку ввода кандзей (который очевидно из моей винды вырезали). А на этом сайте можно увидеть какие файлы где должны лежать.
Мораль: нечего пользоваться порезанным софтом. Качайте только официальный софт, а не левые сборки.
Нужна следующие функции:
Разделение на страницы и собственно на сам интернет магазин. Как собственно в любых cms бывает. Страницы под статьи, где могут быть категории и подкатегории.
В интернет-магазине будет возможность добавления-удаления товара соответственно, также категории-подкатегории. У товара будет возможность добавления цены, артикула, параметров (цвет, размер, габариты и т.д., то есть будет возможность добавлять свои параметры у каждого товара). Также описание товара, и краткое описание товара, загрузка изображений, ну и мета-теги проставлять.
В целом ничего нестандартного и сложного с виду. Оп, с чего начать?
Будет конфиг.php например, где будут заданы данные от базы, а также все функции вывода и статей, категорий, товаров и тд, а в index.php запилю шаблонизатор, который case 'page'; выводит определенный товар, а case 'product_list';, то другую, а также передавать в шаблон необходимые переменные.
А в main.html, я буду выводить этот шаблон. Любой хтмл там написанный будет выводиться на всех страницах, а если я начну писать условия <?php if($cat = 'page') echo $item['text']; ?>, то будет выводиться определенный раздел в нужной мне форме. Что-то типа того.
Оп, что скажешь? Как выше расписал - написать просто, но это же не правильный подход? Нужно ООП, разделение? Оп, с чего начать? Хочу без фреймворка, он будет лишнее место занимать. Мне нужно, что бы был только необходимый функционал, а остальное я мог добавить, когда будет нужно.
memrise.com - там фишка в повторении же, 50 новых слов в день уже считается много, я делаю review 5-6 раз в день, но это кому как. Кстати, по моим наблюдениям сервис не эффективен для запоминания предлогов, местоимений и слов которые похожи между собой и имеют более 5 значений, а вот всякие take, give, keep.. на ура.
https://github.com/Integer64/myTestSite.dev/tree/master/CatMouse
Нужна не большая подсказка. Не могу логически выстроить поведение кошки. Скорей всего придется переписывать ... опять.
Вот курс в 2007-м был 26,1481$ или 34,5390€, но это по отношению к рублю. А как использовать эти данные, чтобы узнать, за сколько покупали казахи доллары и евро, когда известно, что тогда 100 тенге стоили 21,0008 рублей?
не хватает оперативки
Узнай, сколько тенге нужно было отдать за 34 рубля.
100 тен. = 21 руб.
Х тен. = 34 руб.
Помнишь, что перемножать и на что делить?
Бери Magento и не еби мозг.
Шаблонизатор не в index.php, а в отдельном .phtml файле лежать должен, причем лучше в отдельной папке. В index.php только контроллер лежит, который вызывает модель из model.php или еще откуда, там вся бизнес логика и возврат переменных в контроллер, контроллер потом их в view класс сует, который потом шаблон просто через include ставитс. Оп выше ссылку кидал, как правильно делать:
http://www.phpinfo.su/articles/practice/shablony_v_php.html
Про MVC еще читани.
21.0008/100 = 0.21008 курс тенге к рублю
теперь чтобы посчитать любую сумму в рублях в тенге, просто надо поделить сумму на курс тенге
26.1481 / 0.21008 = 124,467346 тенге к доллару
34,5390 / 0.21008 = 164,4088 тенге к евро
https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a
>При этом обычно в сущности делается метод, возвращающий информацию о соответствии полей объекта таблице и полям в базе данных (чтобы можно было правильно составить SQL запрос)
Зачем там этот метод, т.е. как он используется? Представить что-то не смог. Чтобы запрос составить, просто же метод save() или getNews() какой-нибудь пишут, где уже готовый запрос.
В ActiveRecord обычно запросы INSERT/UPDATE не пишут руками, а генерируют автоматически. То есть в базовом классе есть универсальный метод save(или update/insert) который работает для всех наследников и может сохранить любую из сущностей в БД. Ну к примеру к нас есть классы
class Post extends ActiveRecordBase { ... }
class User extends ActiveRecordBase { ... }
class Comment extends ActiveRecordBase { ... }
И у них нет своей реализации save(), они используют метод базового класса ActiveRecordBase#save.
Для того чтобы сгенерировать запрос INSERT или UPDATE мы должны знать как минимум список полей (а также их типы если мы хотим например при сохранении автоматически преобразовывать объекты DateTime в строку с датой в формате БД).
Также базовый класс должен знать имя таблицы.
Взять список полей можно 2 способами:
— определить функцию или поле, которую переопределит класс-потомок и которая вернет этот список:
class User extends ActiveRecordBase {
public $name;
public $surname;
public $email;
public funtion getFields() {
return ['name', 'surname', 'email'];
}
...
}
— взять список из базы данных (запросом типа DESC table ) и сопоставить его со списком полей в классе. Эти метаданные часто еще кешируют чтобы не делать такие запросы каждый раз.
В Yii исплоьзуется первый вариант. В ZF вроде бы использовался второй.
Аналогично, чтобы сообщить базовому классу имя таблицы заводят поле, функцию, или вычисляют имя из имени класса.
Чтобы программист не забыл определить нужные методы, их можно сделать абстрактными в базовом классе.
Я думаю, что тебе стоит посмотреть на конкретные реализации ActiveRecord.
Вот первая попавшаяся мне библиотека:
https://github.com/jpfuentes2/php-activerecord
Вот в ней базовый класс модели: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Model.php
Вот метод insert: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Model.php#L800
Он сам не генерирует запрос вставки, а использует экзепляр класса Table: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Table.php#L351
имя таблицы в нем вычисляется по имени класса-наследника вот этой функцией: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Table.php#L462
Список полей берется из информации о таблице в базе.
Можешь разобрать код, он там не особо сложен. а я подскажу если что. Если есть большое желание разобраться еще лучше, можешь написать свою библиотеку AR, без отношений она довольно просто пишется.
Имей в виду что AR проще в реализации чем DataMapper, но имеет архитектурные недостатки вроде смешивания кода модели и кода работы с БД. А datamapper позволяет модели ничего не знать о базе данных и мапить любые объекты на любые таблицы.
Если захочешь изучить Data Mapper, придется изучать доктрину 2. Она конечно сложная, но очень продвинутая.
В ActiveRecord обычно запросы INSERT/UPDATE не пишут руками, а генерируют автоматически. То есть в базовом классе есть универсальный метод save(или update/insert) который работает для всех наследников и может сохранить любую из сущностей в БД. Ну к примеру к нас есть классы
class Post extends ActiveRecordBase { ... }
class User extends ActiveRecordBase { ... }
class Comment extends ActiveRecordBase { ... }
И у них нет своей реализации save(), они используют метод базового класса ActiveRecordBase#save.
Для того чтобы сгенерировать запрос INSERT или UPDATE мы должны знать как минимум список полей (а также их типы если мы хотим например при сохранении автоматически преобразовывать объекты DateTime в строку с датой в формате БД).
Также базовый класс должен знать имя таблицы.
Взять список полей можно 2 способами:
— определить функцию или поле, которую переопределит класс-потомок и которая вернет этот список:
class User extends ActiveRecordBase {
public $name;
public $surname;
public $email;
public funtion getFields() {
return ['name', 'surname', 'email'];
}
...
}
— взять список из базы данных (запросом типа DESC table ) и сопоставить его со списком полей в классе. Эти метаданные часто еще кешируют чтобы не делать такие запросы каждый раз.
В Yii исплоьзуется первый вариант. В ZF вроде бы использовался второй.
Аналогично, чтобы сообщить базовому классу имя таблицы заводят поле, функцию, или вычисляют имя из имени класса.
Чтобы программист не забыл определить нужные методы, их можно сделать абстрактными в базовом классе.
Я думаю, что тебе стоит посмотреть на конкретные реализации ActiveRecord.
Вот первая попавшаяся мне библиотека:
https://github.com/jpfuentes2/php-activerecord
Вот в ней базовый класс модели: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Model.php
Вот метод insert: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Model.php#L800
Он сам не генерирует запрос вставки, а использует экзепляр класса Table: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Table.php#L351
имя таблицы в нем вычисляется по имени класса-наследника вот этой функцией: https://github.com/jpfuentes2/php-activerecord/blob/master/lib/Table.php#L462
Список полей берется из информации о таблице в базе.
Можешь разобрать код, он там не особо сложен. а я подскажу если что. Если есть большое желание разобраться еще лучше, можешь написать свою библиотеку AR, без отношений она довольно просто пишется.
Имей в виду что AR проще в реализации чем DataMapper, но имеет архитектурные недостатки вроде смешивания кода модели и кода работы с БД. А datamapper позволяет модели ничего не знать о базе данных и мапить любые объекты на любые таблицы.
Если захочешь изучить Data Mapper, придется изучать доктрину 2. Она конечно сложная, но очень продвинутая.
Firebird по моему встраиваемая (в приложение) база данных, а postgres и mysql многопользовательские клиент-сервеные. Их сравнивать некорректно. Кстати из встраиваемых сейчас гораздо популярнее открытая база sqlite, она используется в афйфонах, хроме и скайпе.
https://en.wikipedia.org/wiki/Firebird_(database_server)
Вроде бы не только встраиваемая, серваки там под все операционки есть. Просто в одном туториале рекомендовали присмотреться к Postgres и Firebird как альтернативам Mysql, вот и интересно стало.
https://ideone.com/eJbXlm
Подскажите, пожалуйста, почему работает 20-я строка и правильное ли объяснение 17-й неработающей строки?
Даже здесь написано, что "можно". Но почему - не написали. Это дебри, в которые лучше не лезть? >>529940
А в учебнике из оп поста не смотрел урок по массивам и урок «Повторим»? там вроде во всех задачах массивы используются. Почитал бы и если что непонятно, спросил бы тут.
Ну а от себя скажу что у массива в PHP есть 2 основных применения (в других языках для каждого назначения есть своя структура, например в JS это массивы и словари, а в PHP решили их объединить):
— список чего-то, например список оценок за четверть:
$marks = [3, 4, 5, 5, 5, 2, 3];
Или список сданных и несданных экзаменов:
$passed = ['физика', 'литература'];
$notPassed = ['математика'];
— карта/словарь, задающая соответствие между 2 величинами. Например предмет и средняя оценка по нему:
$score = [
'математика' => 4,
'физика' => 5
];
Иногда еще массив используют для хранения свойств какого-то объекта, например информации о пользователе:
$user = [
'name' => 'Иван',
'email' => 'ivan@example.com'
];
Но для этого лучше использовать объекты.
Для работы с массивами в PHP есть множество функций, про некоторые из них написано в моем учебнике, остальные в мануале:
http://php.net/manual/ru/ref.array.php
http://php.net/manual/ru/language.types.array.php
А в учебнике из оп поста не смотрел урок по массивам и урок «Повторим»? там вроде во всех задачах массивы используются. Почитал бы и если что непонятно, спросил бы тут.
Ну а от себя скажу что у массива в PHP есть 2 основных применения (в других языках для каждого назначения есть своя структура, например в JS это массивы и словари, а в PHP решили их объединить):
— список чего-то, например список оценок за четверть:
$marks = [3, 4, 5, 5, 5, 2, 3];
Или список сданных и несданных экзаменов:
$passed = ['физика', 'литература'];
$notPassed = ['математика'];
— карта/словарь, задающая соответствие между 2 величинами. Например предмет и средняя оценка по нему:
$score = [
'математика' => 4,
'физика' => 5
];
Иногда еще массив используют для хранения свойств какого-то объекта, например информации о пользователе:
$user = [
'name' => 'Иван',
'email' => 'ivan@example.com'
];
Но для этого лучше использовать объекты.
Для работы с массивами в PHP есть множество функций, про некоторые из них написано в моем учебнике, остальные в мануале:
http://php.net/manual/ru/ref.array.php
http://php.net/manual/ru/language.types.array.php
Это я, получается, не дочитал до самого нужного, лол. Спасибо за ответ.
> Он должен быть очень легковесным, аж в пределах 1-2мб
Почему?
> Оп, с чего начать?
C того, почему тебе нужен именно самописный магазин? Я вижу только 2 сценария когда он нужен:
1) маленький магазин всего с несколькими товарами, для которого не подходя большие CMS и для которого мы хотим сделать красивый уникальный дизайн. Например ты делаешь какие-нибудь крутые хендмейд вещи и вид стандартных CMS с рядами картинок и фильтрами слева тебя не устраивает.
В этом случае нет смысла писать с нуля, выгоднее взять фреймворк. Фреймворк позволяет нам сделать любую структуру и дизайн. Те. кто не осилил фрейморк, обычно берут вордпресс и мучаются с ним. Это все равно лучше чем писать с нуля.
2) в качестве тестового задания. В этом случае скорее всего фрейморки использовать нельзя, пользоваться подсказками нельзя и тебе придется делать его без нас.
3) научиться делать сайты. Интернет-магазин — не лучший вариант для начинающего, так как перед этим тебе придется выбрать и изучить фреймворк.
Во всех остальных случаях нет никакого смысла писать что-то с нуля когда есть десятки CMS. Цель интернет- магазина — продавать товар и приносить прибыль, а не служить местом для реализации извращенных желаний разработчика. Жизнь не такая длинная чтобы тратить ее на велосипеды.
Какой у тебя слуачай?
> Оп, с чего начать?
С выбора готовой CMS или фреймворка.
> Будет конфиг.php например, где будут заданы данные от базы, а также все функции вывода и статей, категорий, товаров и тд, а в index.php запилю шаблонизатор
Боюсь тебе с такими представлениями рано писать магазины. Посмотри мое задание на список студентов (оно без фреймворка и весит меньше мегабайта) и посмотри сколько там всего надо знать: https://github.com/codedokode/pasta/blob/master/student-list.md
Интернет-магазин раз в 5 сложнее (это самый простой). И его надо писать на фрейморке.
> Нужно ООП, разделение?
Нужно
> Оп, с чего начать?
С изучения ООП и решения задачи про список студентов. Или изучения какой-нибудь CMS. Тебе еще рано писать магазины.
> Мне нужно, что бы был только необходимый функционал, а остальное я мог добавить, когда будет нужно.
Проще взять блоьшую CMS и отключить лишнее.
Я прекрасно знаю. что ты хочешь сделать. Ты не хочешь учиться, а хочешь написать адский велосипед с нечитаемым кодом и забросить его так и не доделав. Не вижу смысла поддерживать это начинание.
> Он должен быть очень легковесным, аж в пределах 1-2мб
Почему?
> Оп, с чего начать?
C того, почему тебе нужен именно самописный магазин? Я вижу только 2 сценария когда он нужен:
1) маленький магазин всего с несколькими товарами, для которого не подходя большие CMS и для которого мы хотим сделать красивый уникальный дизайн. Например ты делаешь какие-нибудь крутые хендмейд вещи и вид стандартных CMS с рядами картинок и фильтрами слева тебя не устраивает.
В этом случае нет смысла писать с нуля, выгоднее взять фреймворк. Фреймворк позволяет нам сделать любую структуру и дизайн. Те. кто не осилил фрейморк, обычно берут вордпресс и мучаются с ним. Это все равно лучше чем писать с нуля.
2) в качестве тестового задания. В этом случае скорее всего фрейморки использовать нельзя, пользоваться подсказками нельзя и тебе придется делать его без нас.
3) научиться делать сайты. Интернет-магазин — не лучший вариант для начинающего, так как перед этим тебе придется выбрать и изучить фреймворк.
Во всех остальных случаях нет никакого смысла писать что-то с нуля когда есть десятки CMS. Цель интернет- магазина — продавать товар и приносить прибыль, а не служить местом для реализации извращенных желаний разработчика. Жизнь не такая длинная чтобы тратить ее на велосипеды.
Какой у тебя слуачай?
> Оп, с чего начать?
С выбора готовой CMS или фреймворка.
> Будет конфиг.php например, где будут заданы данные от базы, а также все функции вывода и статей, категорий, товаров и тд, а в index.php запилю шаблонизатор
Боюсь тебе с такими представлениями рано писать магазины. Посмотри мое задание на список студентов (оно без фреймворка и весит меньше мегабайта) и посмотри сколько там всего надо знать: https://github.com/codedokode/pasta/blob/master/student-list.md
Интернет-магазин раз в 5 сложнее (это самый простой). И его надо писать на фрейморке.
> Нужно ООП, разделение?
Нужно
> Оп, с чего начать?
С изучения ООП и решения задачи про список студентов. Или изучения какой-нибудь CMS. Тебе еще рано писать магазины.
> Мне нужно, что бы был только необходимый функционал, а остальное я мог добавить, когда будет нужно.
Проще взять блоьшую CMS и отключить лишнее.
Я прекрасно знаю. что ты хочешь сделать. Ты не хочешь учиться, а хочешь написать адский велосипед с нечитаемым кодом и забросить его так и не доделав. Не вижу смысла поддерживать это начинание.
Обосрался и подправил номинал. Теперь всё правильно.
Как насчет такой логики для выбора хода, я по моему про нее писал:
— собираем список всех допустимых ходов (то есть туда где есть клеточки на котторые можно сходить + вариант стоять на месте)
— вычисляем для каждого вариант число очков (в зависимости от того много ли там мышей и далеко ли они)
— выбираем ход с наибольшим числом очков, если их несколько то случайный из них
— ходим
Обрати внимание какой это простой, но при этом гибкий алгоритм. Как он идеально разложен на отдельные части. Фактически поведение кошки в нем определяет функция оценки числа баллов. мы смогли математической формулой описать жизнь кошки.
Заметь что этот же алгоритм подход и мыши, только надо поменять функцию оценки.
Что скажешь?
Сама формула оценки может быть примерно такой:
Для каждой мыши на поле:
- считаем расстояние от нее до клеточки
- ситаем число соседних мышей (чтобы проверить защищена ли она или нет)
- вычисляем оценку съедобности мыши в зависимости от расстояния и защищенности. То есть если мышь близко то даем ей больше баллов, если очень далеко то ноль. Если мышь защищена другими то уменьшаем число баллов в N раз (так как не факт что удастся съесть)
Имея число баллов для каждой мыши, мы их складваем и получаем общую оценку хода на данную клетку. Клетка, на которой незащщищенная мышь, получает максимальнео число баллов. Клетка которая дальше всех от мышей, получит наименьшее число баллов.
Дополнительно можно учитывать (делая небольшую попраку к числу балллов):
— наличие собаки рядом
— наличие других кошек (они могут състь мышей раньше нас)
В общем, как видишь задача написания алгоритма для кошки сводится к вычислению числа баллов для хода. А задача определения числа баллов для хода сводится к выбору факторов которые мотивируют/отталкивают совершить ход и взешиванию их в виде числа баллов.
Заметь что наш алгоритм очень примитивен, у кошки нет памяти и она не помнит что было в преддущем ходе и не строит планы на будущие ходы и не пытается угадать ходы мышей, она живет только сегодняшним днем. Тем не менее для поимки мышей этого вполне может хватить.
Аналогичный алгоритм, с взвешиванием всех вариантов ходов можно написать например для игры в крестики-нолики, блекджек или шашки — хотя играть он сможет только против очень слабого игрока (из-за отстуствия памяти). преимущество алгоритма — простота и скорость работы.
Попробуй. Тут кто-то предлагал сделать перевод документации по Слиму.
>>529814
Можно попробовать написать формулы и вывести через них. Ну например если R это число рублей, а D число долларов то их можносвязать формулой
R = D × 26,1481
А из нее можно вывести обратную формулу:
D = R / 26,1481
Теперь имея форулы для R и D мы можем подставлять их в другие формулы и получить формулу перевода любой валюты в любую. Ну например переведем доллары в евро. Формула для евро это
E = R × 34,5390
Поставим сюда вместо R выражение D × 26,1481 из формул выше и получим:
E = ( D × 26,1481 ) × 34,5390
Вот мы и получили формулу перевода долларов в евро.
Аналогично можно нати связь между любыми другими валютами.
>>529937
Никогда ее не исплоьзовал и не слышал где используют. В википедии написано:
> Это коммерчески независимый проект C и C++ программистов, технических советников и разработчиков мультиплатформенных систем управления базами данных, основанный на исходном коде, выпущенном корпорацией Borland 25 июля 2000 года в виде свободной версии Interbase 6.0.
И это вызывает у меня подозрение что ее любят те кто до сих пор использует древние технологии вроде дельфи (тоже борландовский продукт), работали раньше с этой базой и не хотят переучиваться. Это чистая догадка, я могу и ошибаться, но если это так то тебе незачем ворошить древные пыльные продукты.
>>529940
> правильное ли объяснение 17-й неработающей строки? Да
> $obj->staticMethod(); //а это почему-то зработало
Это потому что разработчики делавшие ООП в PHP сами толком в нем не разбираются и наломали там дров. Разумеется в правильном ООП нельзя (и нет смысла) вызывать статические методы как обычные, это просто странность PHP. Я не советую так писать так как возникает вопрос, почему ты не хочешь вызвать метод как положено, через двоеточие и все ли с тобой в порядке.
>>529941
Просто видимо разработчики решили от себя добавить дополнителных фич. Не представляю когда это может понадобиться. Ты либо делаешь обычный метод и вызываешь его на объекте либо делаешь статический и вызыаешь его на классе.
>>529943
Нет, неверно, позднее статическое связывание это когда мы пишем
static::someMethod() вместо self::someMethod()
мануал: http://php.net/manual/ru/language.oop5.late-static-bindings.php
Я от себя замечу что эта идея тоже не очень здоровая и лучше не переопределять статические методы вообще, тем более в праивльном ООп они не часто используются. Если ты хочешь переопределять методы в потомке то сделай их нестатическими и не путай людей.
Попробуй. Тут кто-то предлагал сделать перевод документации по Слиму.
>>529814
Можно попробовать написать формулы и вывести через них. Ну например если R это число рублей, а D число долларов то их можносвязать формулой
R = D × 26,1481
А из нее можно вывести обратную формулу:
D = R / 26,1481
Теперь имея форулы для R и D мы можем подставлять их в другие формулы и получить формулу перевода любой валюты в любую. Ну например переведем доллары в евро. Формула для евро это
E = R × 34,5390
Поставим сюда вместо R выражение D × 26,1481 из формул выше и получим:
E = ( D × 26,1481 ) × 34,5390
Вот мы и получили формулу перевода долларов в евро.
Аналогично можно нати связь между любыми другими валютами.
>>529937
Никогда ее не исплоьзовал и не слышал где используют. В википедии написано:
> Это коммерчески независимый проект C и C++ программистов, технических советников и разработчиков мультиплатформенных систем управления базами данных, основанный на исходном коде, выпущенном корпорацией Borland 25 июля 2000 года в виде свободной версии Interbase 6.0.
И это вызывает у меня подозрение что ее любят те кто до сих пор использует древние технологии вроде дельфи (тоже борландовский продукт), работали раньше с этой базой и не хотят переучиваться. Это чистая догадка, я могу и ошибаться, но если это так то тебе незачем ворошить древные пыльные продукты.
>>529940
> правильное ли объяснение 17-й неработающей строки? Да
> $obj->staticMethod(); //а это почему-то зработало
Это потому что разработчики делавшие ООП в PHP сами толком в нем не разбираются и наломали там дров. Разумеется в правильном ООП нельзя (и нет смысла) вызывать статические методы как обычные, это просто странность PHP. Я не советую так писать так как возникает вопрос, почему ты не хочешь вызвать метод как положено, через двоеточие и все ли с тобой в порядке.
>>529941
Просто видимо разработчики решили от себя добавить дополнителных фич. Не представляю когда это может понадобиться. Ты либо делаешь обычный метод и вызываешь его на объекте либо делаешь статический и вызыаешь его на классе.
>>529943
Нет, неверно, позднее статическое связывание это когда мы пишем
static::someMethod() вместо self::someMethod()
мануал: http://php.net/manual/ru/language.oop5.late-static-bindings.php
Я от себя замечу что эта идея тоже не очень здоровая и лучше не переопределять статические методы вообще, тем более в праивльном ООп они не часто используются. Если ты хочешь переопределять методы в потомке то сделай их нестатическими и не путай людей.
〒 это же символ японской почты!
Кстати тогда можно было и вместо USD/EUR использоват их символы. Хотя не, не стоит, как потом код править.
>Разумеется в правильном ООП нельзя (и нет смысла) вызывать статические методы как обычные, это просто странность PHP.
Спасибо за ответ. Правда статью про позднее статическое связывание я так и не осилил, так как ООП начал изучать лишь пару дней назад.
>Если ты хочешь переопределять методы в потомке то сделай их нестатическими и не путай людей.
Так и буду, благодарю ещё раз.
Но на собеседовании тебя будут все равно спрашивать про позднее статическое связывание, имей в виду.
> Это чистая догадка, я могу и ошибаться, но если это так то тебе незачем ворошить древные пыльные продукты.
http://www.itexto.net/devkico/?p=398
Вот нашел наконец описание внятное. Пишут что вполне современная, по производительности между Mysql и Postgres, но документация плохая и никто ее не продвигает из крупных фирм, поэтому популярность низкая.
Большой плюс, что можно нахаляву в коммерческих проектах юзать и экономить по 40к долларов на заказах. С PHP нельзя в pdo юзать, т.к. реализация pdo ее в PHP вся забагована, поэтому вся работа только через ibase_ (аналог mysqli_). В конце 2015 выходит версия 3 с новой архитектурой.
> Почему?
Чем меньше вес, тем лучше, нет? Если это на качество не влияет.
> Какой у тебя слуачай?
Я делаю мини интернет-магазины, статейники, и мне не нужны цмски со всеми их зависимостями. Мне нужен свой какой-то универсальный вариант.
> Посмотри мое задание на список студентов
Окей, выполню это задание сначала.
Абитуриенты. Допилил.
Надо сделать основу сайта по металлообработке бесплатно с постоянными последующими доработками. Сайт должен работать по принципу интернет банка, т.е. общая информация для всех. Работа, обсуждение заказов, сам заказ делается на закрытой странице. От вас умение делать такие сайты, постепенно дорабатывая под мои запросы уже за деньги. Сайт визитка не интересует! От вас примеры сайта, разрисовывать не нужно! Достаточно предоставить ваши потенциал. Например сайт пустая страница, в любом месте кнопка. Нажимаем на кнопку, входим без регистрации, видим картинку, рядом список из трех пользователей. Пользователей 3 шт. 1, 2 и 3. У каждого свой вход на сайт. Любой из трех заходит, видит картинку, пишет в неком месте свою стоимость. Далее заходит другая тройка пользователей, загружает фото и видит цену за это фото. Рядом трех первых юзеров и их цены, наводят мышку на юзеров и видят информацию о них, пусть будут любые буквы. Нажимаем на юзеров и развернутую информацию о них на отдельной странице. Нажимает кнопку заказать. Думаю для начала достаточно.
class A {
private function foo() {
echo __CLASS__ . " class ! <br>";
}
public function test() {
$this->foo();
}
}
class B extends A {
}
class C extends A {
public function foo() {
\techo __CLASS__ . ' !<br>';
}
}
$b = new B();
$b->test();
$c = new C();
$c->test();
Чому так получается, если в этом коде в классе A поставить private foo(), то печатается A class! 2 раза, а если поставить public foo(), то печатается A class! C class!
>Например сайт пустая страница
Такое могу бесплатно сделать.
>в любом месте кнопка
Тебе чудится. Нет там кнопки, это же сайт пустая страница.
Вот ты какой, русский фриланс!
>Пользователей 3 шт. 1, 2 и 3
>У каждого свой вход на сайт
>Далее заходит другая тройка пользователей
На сайт только группами по 3 пускают?
> Salary: 50 USD/hr
Странно правда что в названии написано Crossover а в тексте другое название
> Join DevFactory and you’ll be given
Кому интересно, можете требования почитать. Всего то HTML/CSS/JS.
>>530554
Интересный пример. Во-первых, я должен предупредить что тем кто пишет такой код в реальных проектах, надо отрывать руки. Теперь обсудим почему это так работает.
Приватный метод — это метод который принадлежит и видим только одному классу , а не его предкам или потомкам. Ты можешь объявить приватные методы с одинаковым именем в нескольких классах (но лучше не стоит) и они никак не влияют друг на друга, это разные методы, хоть и одинаково называющиеся.
Публичные и защищенные методы — это другое. Если ты определяешь в потомке метод с таким же именем то он переопределяет, перекрывает (override) метод базового класса.
Так как foo приватный то конструкция в методе test:
$this->foo();
может пониматься только одним образом: «вызвать метод foo класса A» (а не «поискать метод с именем foo в текущем классе и его предках»). От того что ты в наследнике добавил (не переопределил!) метод foo ничего не меняется.
Таким образом в первом случае у тебя 2 метода: приватный foo{A} и публичный foo{C}. Во втором у тебя один метод foo{A}, который переопределен в классе C.
Я посмотрел, в яве то же самое: http://stackoverflow.com/questions/10623913/can-i-override-a-private-method-in-java
И еще раз напомню, код пищется для человека. Использовать такие трюки в реальном коде недопустимо. Кстати, мне пришлось гуглить чтобы ответить на вопрос. Если бы ты спросил что выведет данный код, я бы мог ошибиться (и увы, такие вопросы любят на собеседованиях и из-за этого у людей создается ощущение что ООп это что-то сложное хотя это всего лишь концепция хранения свойств сущностей и методов для работы с ними в одном объекте).
> Salary: 50 USD/hr
Странно правда что в названии написано Crossover а в тексте другое название
> Join DevFactory and you’ll be given
Кому интересно, можете требования почитать. Всего то HTML/CSS/JS.
>>530554
Интересный пример. Во-первых, я должен предупредить что тем кто пишет такой код в реальных проектах, надо отрывать руки. Теперь обсудим почему это так работает.
Приватный метод — это метод который принадлежит и видим только одному классу , а не его предкам или потомкам. Ты можешь объявить приватные методы с одинаковым именем в нескольких классах (но лучше не стоит) и они никак не влияют друг на друга, это разные методы, хоть и одинаково называющиеся.
Публичные и защищенные методы — это другое. Если ты определяешь в потомке метод с таким же именем то он переопределяет, перекрывает (override) метод базового класса.
Так как foo приватный то конструкция в методе test:
$this->foo();
может пониматься только одним образом: «вызвать метод foo класса A» (а не «поискать метод с именем foo в текущем классе и его предках»). От того что ты в наследнике добавил (не переопределил!) метод foo ничего не меняется.
Таким образом в первом случае у тебя 2 метода: приватный foo{A} и публичный foo{C}. Во втором у тебя один метод foo{A}, который переопределен в классе C.
Я посмотрел, в яве то же самое: http://stackoverflow.com/questions/10623913/can-i-override-a-private-method-in-java
И еще раз напомню, код пищется для человека. Использовать такие трюки в реальном коде недопустимо. Кстати, мне пришлось гуглить чтобы ответить на вопрос. Если бы ты спросил что выведет данный код, я бы мог ошибиться (и увы, такие вопросы любят на собеседованиях и из-за этого у людей создается ощущение что ООп это что-то сложное хотя это всего лишь концепция хранения свойств сущностей и методов для работы с ними в одном объекте).
>Приватный метод — это метод который принадлежит и видим только одному классу
Спасибо, понятно. Видимо лучше вместо $this->foo() в классах с наследованием писать self::foo() или static::foo(), чтобы было однозначно и не запутаться потом с областями видимости.
Все правильно там, Crossover шарага по найму, ищет народ для DevFactory в Техасе, которая сама дочка https://en.wikipedia.org/wiki/Trilogy_(company)
Судя по объяве, им вообще американец на удаленку нужен и не в Москве.
Требования читал, клоун?
Skills & Requirements
Qualifications for this Opportunity
A successful Front End Architect at DevFactory will demonstrate the following qualifications:
At least 6 years of hands-on experience working with front-end web development of custom web content (This should be custom HTML/CSS and animations, NOT Wordpress, CMS based, or template based work)
At least 4 years of hands-on experience working with data backed front-end web applications (REST, Soap, etc)
At least 4 years of front-end experience where you were the one responsible for architecture decisions
You should be familiar with the tried and true JS best practices / frameworks, as well as recent developments in web development tools. You should be having an opinion on when the use of these tools is necessary, and pushing for their adoption.
Good working knowledge of back-end web development. You should have an opinion about what a good UX focused API is, and push back on non-optimal APIs
While not proficient in use, at least a working knowledge of the various types of databases, and what they should be used for (Think TDD, NoSQL (MongoDB or Cassandra), Relational DBs (MSSQL, MySQL, Oracle ), SOA, EDA, etc)
Excellent understanding of current enterprise software technologies and development practices/tools, including virtual environments, source control, remote development, issue tracking, build and test automation, and networking management
Ability to engage sophisticated global customers in deep technical discussions, making them confident that you know their problem better than they do
Bachelor’s Degree or above in Computer Science or related field
Excellent communication skills (in English)
Proficiency in the following skills and technologies is mandatory:
HTML5, CSS2/3 (including animations), JQuery
Deep knowledge in at least 1 MV* JS Framework (Angular, BackendJS, Ember, etc)
Deep knowledge in at least 1 Responsive Framework (Bootstrap, Toast, Less)
Knowledge in Sass and at least 1 Framework built on it (Compass, Bourbon, Susy)
Требования читал, клоун?
Skills & Requirements
Qualifications for this Opportunity
A successful Front End Architect at DevFactory will demonstrate the following qualifications:
At least 6 years of hands-on experience working with front-end web development of custom web content (This should be custom HTML/CSS and animations, NOT Wordpress, CMS based, or template based work)
At least 4 years of hands-on experience working with data backed front-end web applications (REST, Soap, etc)
At least 4 years of front-end experience where you were the one responsible for architecture decisions
You should be familiar with the tried and true JS best practices / frameworks, as well as recent developments in web development tools. You should be having an opinion on when the use of these tools is necessary, and pushing for their adoption.
Good working knowledge of back-end web development. You should have an opinion about what a good UX focused API is, and push back on non-optimal APIs
While not proficient in use, at least a working knowledge of the various types of databases, and what they should be used for (Think TDD, NoSQL (MongoDB or Cassandra), Relational DBs (MSSQL, MySQL, Oracle ), SOA, EDA, etc)
Excellent understanding of current enterprise software technologies and development practices/tools, including virtual environments, source control, remote development, issue tracking, build and test automation, and networking management
Ability to engage sophisticated global customers in deep technical discussions, making them confident that you know their problem better than they do
Bachelor’s Degree or above in Computer Science or related field
Excellent communication skills (in English)
Proficiency in the following skills and technologies is mandatory:
HTML5, CSS2/3 (including animations), JQuery
Deep knowledge in at least 1 MV* JS Framework (Angular, BackendJS, Ember, etc)
Deep knowledge in at least 1 Responsive Framework (Bootstrap, Toast, Less)
Knowledge in Sass and at least 1 Framework built on it (Compass, Bourbon, Susy)
>Будет конфиг.php например, где будут заданы данные от базы, а также все функции вывода и статей, категорий, товаров и тд, а в index.php запилю шаблонизатор
кекнул
Нестатические методы нельзя (ну или можно но неправильно) вызвать через двоеточие. Чтобы не было путаницы, надо стьараться не называть разные методы одинаково.
>>530918
Зачем тогда Москва указана? Мне кажется это америнкацев только отпугнет и она указана именно для россиян.
>>530944
Первый раз слышу так что могу посоветовать только Google: http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=%D1%81%D0%B9%D0%BA%D1%8B#newwindow=1&q=cqrs
Вот тут напимер подробная, хоть и малопонятная статья: http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html
Вот тут еще статья, там есть важный момент: http://habrahabr.ru/post/146429/
> Первое что бросается в глаза это то что у вас уже две модели данных, одна для чтения (Queries), одна для записи (Commands). И обычно это значит что у вас еще и две базы данных. И так как мы используем CQRS + Event Sourcing, то write-база (write-модель) — это Event Store, что-то вроде лога всех действий пользователя (на самом деле не всех, а только тех которые важны с точки зрения бизнес-модели и влияют на построение read-базы). А read-база — это в общем случае денормализировнное хранилище тех данных, которые вам нужны для отображения пользователю.
Если так то все становится понятнее. Такую схему например используют в плтежных и банковских системах: они хранят для каждого пользователя не текущий баланс, а тсьорию транзакций. Баланс вычисляется как сумма транзакций и является избыточной величиной, которую может быть можно хранить в кеше но который незачем хранить в самой базе данных.
Тут видимо аналогичную схему испоьзуют и для других данных. «read база» из той статьи это фактически и есть кеш.
Мне что-то это не очень нравится и выглядит переусложнением. Сначала мы создаем проблему, потом мужественно с ней боремся. Но конечно может есть какие-то аргументы в пользу этого подхода.
>>530955
ЧТо ты сказкть-то хотел?
>>531055
Пока официальный. Нет, не обижаюсь, с чего бы? У нас все аноны рано или поздно уходят дальше своей дорогой.
Нестатические методы нельзя (ну или можно но неправильно) вызвать через двоеточие. Чтобы не было путаницы, надо стьараться не называть разные методы одинаково.
>>530918
Зачем тогда Москва указана? Мне кажется это америнкацев только отпугнет и она указана именно для россиян.
>>530944
Первый раз слышу так что могу посоветовать только Google: http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=%D1%81%D0%B9%D0%BA%D1%8B#newwindow=1&q=cqrs
Вот тут напимер подробная, хоть и малопонятная статья: http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html
Вот тут еще статья, там есть важный момент: http://habrahabr.ru/post/146429/
> Первое что бросается в глаза это то что у вас уже две модели данных, одна для чтения (Queries), одна для записи (Commands). И обычно это значит что у вас еще и две базы данных. И так как мы используем CQRS + Event Sourcing, то write-база (write-модель) — это Event Store, что-то вроде лога всех действий пользователя (на самом деле не всех, а только тех которые важны с точки зрения бизнес-модели и влияют на построение read-базы). А read-база — это в общем случае денормализировнное хранилище тех данных, которые вам нужны для отображения пользователю.
Если так то все становится понятнее. Такую схему например используют в плтежных и банковских системах: они хранят для каждого пользователя не текущий баланс, а тсьорию транзакций. Баланс вычисляется как сумма транзакций и является избыточной величиной, которую может быть можно хранить в кеше но который незачем хранить в самой базе данных.
Тут видимо аналогичную схему испоьзуют и для других данных. «read база» из той статьи это фактически и есть кеш.
Мне что-то это не очень нравится и выглядит переусложнением. Сначала мы создаем проблему, потом мужественно с ней боремся. Но конечно может есть какие-то аргументы в пользу этого подхода.
>>530955
ЧТо ты сказкть-то хотел?
>>531055
Пока официальный. Нет, не обижаюсь, с чего бы? У нас все аноны рано или поздно уходят дальше своей дорогой.
>Пока официальный. Нет, не обижаюсь, с чего бы? У нас все аноны рано или поздно уходят дальше своей дорогой.
Тогда я продолжу писать. Прошлый раз забросил работать над кодом с кошками-мышками, потому что я ни как не мог понять много вещей. Сейчас я пробежался по коду и вспомнил что именно это было. Скоро я вылажу тот старый код и задам вопросы которые мне непонятны.
Ждем с нетерпением.
Как решить второе задание. Перечитал уже все что можно
function take(fn, count) {
var arr = [];
var x = count;
for (int i = 0; i<x; i++){
arr=fn;
}
return arr;
}
Ты учебник learn.javascript.ru читал? В частности, работу с массивами? Без чтения теории, а по аналогии или переставляя слова наугад, ты задачи не решишь.
Что например это значит?
arr = fn ;
?
Я где-то неделю ковырял YII, более менее ориентируюсь, какие там классы.
Но с этими твоими хелловорлдными заданиями я до сих пор не представляю, как выглядит реальный сайт.
Что можно придумать сделать попроще? Ну блог с регистрацией и комментариями, идет в демках в комплекте с фреймворком. Что еще?
Все, я больше даже не знаю, какой вообще может быть функционал.
В общем, придумай пожалуйста ТЗ, или как эта байда называется, чтобы я попробовал наконец написать что-то на фреймворке.
Интернет-магазин наверное слишком сложно.
Может примитивный форумок? Что-то типа борды?
Ну в общем придумай какой-то квест, чтобы можно было попрактиковаться.
А из ОП поста тебе чем не нравятся задания?
- Простая, но полезная задача сделать список студентов: 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
Первые две сделал. Третья сулит трехмесячное задротство, у меня нет времени и желания.
Нет, нужно что-то простое, тупо набить руку, чтобы с уверенностью можно было сказать, что я знаю фреймворк.
Что мне теперь, дублировать файлообменник на yii? А вообще не помешало бы, да. Я например еще не разобрался, как там происходит загрузка файлов. Кажется, нужно тянуть какое-то расширение.
Какие вообще бывают виды функционала на сайте?
1. Поиск.
2. Регистрация / аутентификация.
3. Пагинация.
4. Загрузка файла.
5. Комментарии.
???
Дополни список, ты жопытный.
Я буду считать что знаю фреймворк, когда смогу реализовать на нем все виды функционала.
У меня крыша походу едет, перечитываю свои посты, какой-то даунский стиль и тон. Вот до чего доводят двачи и недопсыание.
><?php if ($expression == true): ?>
><p>Это будет отображено, если выражение истинно.</p>
><?php else: ?>
><p>В ином случае будет отображено это.</p>
><?php endif; ?>
Это специальный код для шаблонов же. Читай http://www.phpinfo.su/articles/practice/shablony_v_php.html
Спасибо. Так и подумал, но показалось что это нарушает принципы MVC. Очевидно, я не шарю, а автор там упомянул про таких
>Так получилось, что огромная программистская общественность в буквальном смысле слова не поняла посыл неизвестного автора — отделять PHP от HTML не нужно! Нужно отделять логику приложения от логики отображения
В MVC же за вывод отвечает View. Вот это View и есть, точнее шаблон в нужном View подключается.
>$regexp = '#\\d-?\\(?\\d{3}\\)?-?\\d{2,3}\\s?-?\\d{2,3}\\s?-?\\d{2,3}\\s?-?$#';
http://ideone.com/4t6fb2
новый-анон
В реальности по 10 цифрам проверка, плюс префикс 8 или +7 спереди. У тебя кстати ^ отсутствует.
А код где? Если не понял - 10 цифр, между которыми может быть любое количество скобок, пробелов и дефисов. У тебя твоя регулярка ловит непонятные группы разной длины, это совсем другое задание.
Если просто FOREIGN KEY (parent_id) REFERENCES parent(id) без указания ON DELETE CASCADE, то что будет, если удалить строку с ключем в parent таблице?
А если поставить RESTRICT, то что будет?
Еще чем NO ACTION от RESTRICT отличается?
Код
http://ideone.com/4t6fb2
Задание:
>Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
Я сделал регулярку только под данные примеры т.е. не верно?
$goodnumbers = 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');
$badnumbers = 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' // нет +
);
По этим прогони. Если норм, то пойдет. Если нет, пиши по 10 цифрам.
http://denis.in.ua/foreign-keys-in-mysql.htm
https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html
> Если просто FOREIGN KEY (parent_id) REFERENCES parent(id) без указания ON DELETE CASCADE, то что будет, если удалить строку с ключем в parent таблице?
Запрет на удаление:
> Specifying RESTRICT (or NO ACTION) is the same as omitting the ON DELETE or ON UPDATE clause.
> А если поставить RESTRICT, то что будет?
Смотри ссылки
> Еще чем NO ACTION от RESTRICT отличается?
Ничем:
> NO ACTION: A keyword from standard SQL. In MySQL, equivalent to RESTRICT.
https://github.com/never3ver/vector
>>528525
>>528528
>>528539
>>528556
>>528563
>>528628
>>529587
>>529619
>>529621
Все, ОП, сдаюсь.
>Не забудь про вендорные префиксы -moz- и -webkit- для не совсем новых браузеров
Запомнил это.
transition border-radius и box-sizing теперь с ними.
>> Сделал переставлние блоков на ширине 800 и 400
>Насчет цифры 400, я посмотрел сайт http://mydevice.io/devices/ и вижу что у некоторых телефонов (видимо это «лопаты» с большим экраном) ширина больше 400. Мне кажется вместо 3 версий страницы можно сделать 2, для ширины больше 800 и меньше 800. Или может для ширины больше 1024 и меньше 1024? Если больше то у нас полноценный сайт, если меньше то вертикально сложенный. Таким образом ты облегчишь себе работу.
С табличкой ознакомился, сохранил. Сделал адаптивный дизайн на ширине 720 для мобильных устройств и 480 для переставления работ и блока преимуществ по 1 работе в ряд.
>Надписи «ALL GRAPHIC ILLUSTRATION MOTION» у тебя серые, на макете белые.
Исправил.
>Картинки из портфолио увеличены. Не увеличивай растровые картинки так как они мылятся и теряют качество, сравни то что в браузере и то что в макете. Увеличивать можно например как часть эффекта, если человек не успевает заметить искажения, но в твоем случае видно что картинки некачечтвенные. Вырежи из макета их и отображай в размере 1:1.
Подобрал размеры так, чтобы работы не увеличивались больше своих размеров.
>Объедини картинки телефона и значка на карте в футере в один спрайт, они все равно одного цвета. Объедини картинки андроида, монитора, часов в один спрайт.
Вот насчет этого не понял. Хоть я и не сильно разобрался в теме спрайтов и скорее всего в этом проблема, но вроде как это просто одно изображение которое поделено на несколько? Я просто не могу понять как объединить в одно несколько изображений которые то в одной строчке, то переставляются в несколько и у которых расстояние друг от друга постоянно меняется.
>> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
Слеш в конце тегов не ставится, так же прочитай что она делает, например тут http://xiper.net/manuals/html/meta-tags/http-equiv/x-UA-Compatible или в моем уроке про ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c
>Если кратко то он просит ИЕ не переходить в режим совместимости с древними браузерами и разрешает использование Chrome Frame (это плагин для ИЕ который использует движок от Chrome для отображения страниц как решение проблемы отображения сайтов в этом браузере).
>> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
>Опять же, прочитай описание этого тега (он говорит мобильным устройствам что страница под них адаптирована и им не надо притворяться устройством шириной 1024 пикселя): http://frontender.com.ua/mobile-web/wtf-viewport/
Эти строки я просто нашел в интернете, вставил и забыл.
Сейчас уже разобрался и все исправил.
>> bottom-dark-gray-block
>> top-dark-gray-block
>> four-pictures-with-text-block
>Вот это плохие названия, так как при смене внешнего вида они могут потерять актуальность. Лучше назвать их по смыслу, например block-features, block-contacts, features-list.
Сменил на смысловые.
>> <a href="#rss" id="rss"></a>
>> <a href="#facebook" id="facebook"></a>
>Давай тут внутрь ссылок добавим текст вроде «наш твиттер»(а в CSS его скроем). Тогда например если не загрузится CSS файл, ссылка все равно будет видна на странице, робот от гугла сможет лучше проиндексировать ссылку, и устройство чтения страниц сможет прочитать эту ссылку (иначе для незрячих она будет вообще недоступна).
Не лишено смысла, сделал и взял на заметку.
>> * {
>> padding: 0px;
>Вот так делать не стоит. Ты ведь этим удаляешь паддинги по умолчанию, которые есть у разных тегов, вроде списков или ячеек таблиц или инпутов. И соответственно ты потом должен их вернуть назад, чтобы текст с этими тегами корректно отображался (ведь на сайте будут и другие страницы, возможно с текстом который добавляют редакторы а не программисты). Но какой смысл сбрасывать стили чтобы вернуть их потом обратно? Логичнее убирать паддинг только там, где тебе надо, а не везде. Это аналог CSS reset и это в общем плохая штука. Не используй селектор «звездочка», не удаляй лишние стили.
Магия какая-то. С первого раза починилось. Хотя помню сначала выставлял и маргины и паддинги для ul, но ничего не работало.
>> .light-gray-block {
>> display:inline-block;
>Зачем это? Имей в виду , что ответ «подобрал опытным путем» не годится. Либо объясняй, либо удаляй.
Клеарфикс выучил, а применить сюда забыл. Убрал это, сделал нормально.
>>      
>используй margin-right
Использовал. И там еще в адаптивной версии убрал, сделал перенос строки чтобы обе они были по середине. Это в блоке контактов.
>> .social-icons {
>> height: 30px;
>> width: 170px;
>Это еще зачем? Пусть вычисляется автоматически.
Там же только фон, исчисляться нечему.
>> #rss:hover, #facebook:hover, #twitter:hover, #pink-boll:hover, #p:hover {
>Лучше .social-icons > a - меньше переписывать придется при добавлении новых иконок.
Сделал.
>Номер телефона надо сделать кликабельным и звонибельным в мобильной версии.
>о! там написано про ссылки на карты, сделай-ка адрес тоже ссылкой
Телефон скликабельным сделал. Протестировал с мобильного, все работает.
А вот с картой я не знал какой адрес нужно указать, Там ведь Юпитер указан. Сделал ссылку на поиск той улицы. Ну главное, если дать адрес, я пойму как его прикрутить.
Так же для мобильной версии я уменьшил некоторые большие шрифты и увеличил слегка маленькие, ну и убрал ненужные большие паддинги и маргины у блоков.
А вот шрифты так и не осилил. До сих пор не понимаю что там нужно загружать на font-squirrel, какие критерии выставлять. Все как-то сложно. Да и на английском, а я его не понимаю.
Единственное что сделал это переименовал корневую папку font в fonts как и должно быть, возможно это поможет.
Вообще ОП я в бэкэнд изначально хотел как и сейчас хочу, даже уже начинал когда-то твой учебник по php, правда совсем недолго около двух недель всего изучал, недалеко даже ушел, только до регулярных выражений. Но понял тогда, что хочу все с самых основ начать изучать, так как в программировании вообще ничего не смыслил, вот и пошел по курсу HTML\CSS. Я не говорю, что фронтенд это плохо, он мне даже понравился, но наверное это не мое, не осилю. Да и знакомый мой говорит, что для бэкенда мне полученных знаний уже достаточно и что я сейчас просто на месте стою, а мог бы уже и дальше продвигаться. Может действительно уже хватит и стоит идти дальше, а не ковырять этот макет?
>>528525
>>528528
>>528539
>>528556
>>528563
>>528628
>>529587
>>529619
>>529621
Все, ОП, сдаюсь.
>Не забудь про вендорные префиксы -moz- и -webkit- для не совсем новых браузеров
Запомнил это.
transition border-radius и box-sizing теперь с ними.
>> Сделал переставлние блоков на ширине 800 и 400
>Насчет цифры 400, я посмотрел сайт http://mydevice.io/devices/ и вижу что у некоторых телефонов (видимо это «лопаты» с большим экраном) ширина больше 400. Мне кажется вместо 3 версий страницы можно сделать 2, для ширины больше 800 и меньше 800. Или может для ширины больше 1024 и меньше 1024? Если больше то у нас полноценный сайт, если меньше то вертикально сложенный. Таким образом ты облегчишь себе работу.
С табличкой ознакомился, сохранил. Сделал адаптивный дизайн на ширине 720 для мобильных устройств и 480 для переставления работ и блока преимуществ по 1 работе в ряд.
>Надписи «ALL GRAPHIC ILLUSTRATION MOTION» у тебя серые, на макете белые.
Исправил.
>Картинки из портфолио увеличены. Не увеличивай растровые картинки так как они мылятся и теряют качество, сравни то что в браузере и то что в макете. Увеличивать можно например как часть эффекта, если человек не успевает заметить искажения, но в твоем случае видно что картинки некачечтвенные. Вырежи из макета их и отображай в размере 1:1.
Подобрал размеры так, чтобы работы не увеличивались больше своих размеров.
>Объедини картинки телефона и значка на карте в футере в один спрайт, они все равно одного цвета. Объедини картинки андроида, монитора, часов в один спрайт.
Вот насчет этого не понял. Хоть я и не сильно разобрался в теме спрайтов и скорее всего в этом проблема, но вроде как это просто одно изображение которое поделено на несколько? Я просто не могу понять как объединить в одно несколько изображений которые то в одной строчке, то переставляются в несколько и у которых расстояние друг от друга постоянно меняется.
>> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
Слеш в конце тегов не ставится, так же прочитай что она делает, например тут http://xiper.net/manuals/html/meta-tags/http-equiv/x-UA-Compatible или в моем уроке про ИЕ: https://gist.github.com/codedokode/855e3970124687b26a1c
>Если кратко то он просит ИЕ не переходить в режим совместимости с древними браузерами и разрешает использование Chrome Frame (это плагин для ИЕ который использует движок от Chrome для отображения страниц как решение проблемы отображения сайтов в этом браузере).
>> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
>Опять же, прочитай описание этого тега (он говорит мобильным устройствам что страница под них адаптирована и им не надо притворяться устройством шириной 1024 пикселя): http://frontender.com.ua/mobile-web/wtf-viewport/
Эти строки я просто нашел в интернете, вставил и забыл.
Сейчас уже разобрался и все исправил.
>> bottom-dark-gray-block
>> top-dark-gray-block
>> four-pictures-with-text-block
>Вот это плохие названия, так как при смене внешнего вида они могут потерять актуальность. Лучше назвать их по смыслу, например block-features, block-contacts, features-list.
Сменил на смысловые.
>> <a href="#rss" id="rss"></a>
>> <a href="#facebook" id="facebook"></a>
>Давай тут внутрь ссылок добавим текст вроде «наш твиттер»(а в CSS его скроем). Тогда например если не загрузится CSS файл, ссылка все равно будет видна на странице, робот от гугла сможет лучше проиндексировать ссылку, и устройство чтения страниц сможет прочитать эту ссылку (иначе для незрячих она будет вообще недоступна).
Не лишено смысла, сделал и взял на заметку.
>> * {
>> padding: 0px;
>Вот так делать не стоит. Ты ведь этим удаляешь паддинги по умолчанию, которые есть у разных тегов, вроде списков или ячеек таблиц или инпутов. И соответственно ты потом должен их вернуть назад, чтобы текст с этими тегами корректно отображался (ведь на сайте будут и другие страницы, возможно с текстом который добавляют редакторы а не программисты). Но какой смысл сбрасывать стили чтобы вернуть их потом обратно? Логичнее убирать паддинг только там, где тебе надо, а не везде. Это аналог CSS reset и это в общем плохая штука. Не используй селектор «звездочка», не удаляй лишние стили.
Магия какая-то. С первого раза починилось. Хотя помню сначала выставлял и маргины и паддинги для ul, но ничего не работало.
>> .light-gray-block {
>> display:inline-block;
>Зачем это? Имей в виду , что ответ «подобрал опытным путем» не годится. Либо объясняй, либо удаляй.
Клеарфикс выучил, а применить сюда забыл. Убрал это, сделал нормально.
>>      
>используй margin-right
Использовал. И там еще в адаптивной версии убрал, сделал перенос строки чтобы обе они были по середине. Это в блоке контактов.
>> .social-icons {
>> height: 30px;
>> width: 170px;
>Это еще зачем? Пусть вычисляется автоматически.
Там же только фон, исчисляться нечему.
>> #rss:hover, #facebook:hover, #twitter:hover, #pink-boll:hover, #p:hover {
>Лучше .social-icons > a - меньше переписывать придется при добавлении новых иконок.
Сделал.
>Номер телефона надо сделать кликабельным и звонибельным в мобильной версии.
>о! там написано про ссылки на карты, сделай-ка адрес тоже ссылкой
Телефон скликабельным сделал. Протестировал с мобильного, все работает.
А вот с картой я не знал какой адрес нужно указать, Там ведь Юпитер указан. Сделал ссылку на поиск той улицы. Ну главное, если дать адрес, я пойму как его прикрутить.
Так же для мобильной версии я уменьшил некоторые большие шрифты и увеличил слегка маленькие, ну и убрал ненужные большие паддинги и маргины у блоков.
А вот шрифты так и не осилил. До сих пор не понимаю что там нужно загружать на font-squirrel, какие критерии выставлять. Все как-то сложно. Да и на английском, а я его не понимаю.
Единственное что сделал это переименовал корневую папку font в fonts как и должно быть, возможно это поможет.
Вообще ОП я в бэкэнд изначально хотел как и сейчас хочу, даже уже начинал когда-то твой учебник по php, правда совсем недолго около двух недель всего изучал, недалеко даже ушел, только до регулярных выражений. Но понял тогда, что хочу все с самых основ начать изучать, так как в программировании вообще ничего не смыслил, вот и пошел по курсу HTML\CSS. Я не говорю, что фронтенд это плохо, он мне даже понравился, но наверное это не мое, не осилю. Да и знакомый мой говорит, что для бэкенда мне полученных знаний уже достаточно и что я сейчас просто на месте стою, а мог бы уже и дальше продвигаться. Может действительно уже хватит и стоит идти дальше, а не ковырять этот макет?
> Я не говорю, что фронтенд это плохо, он мне даже понравился, но наверное это не мое, не осилю. Да и знакомый мой говорит, что для бэкенда мне полученных знаний уже достаточно и что я сейчас просто на месте стою, а мог бы уже и дальше продвигаться.
Тут вопрос не только и не столько именно изучения, как подключить кастомный шрифт на странице. Смотри, программирование (разработка нормальных продуктов) это не работа на конвеере, где достаточно один раз посмотреть как работают другие и потом 10 лет повторять одни и те же действия. Ты постоянно будешь сталкиваться с вещами, которые ты не знаешь, фреймворками, библиотеками, расширениями, платформами, и каждый раз тебе придется разбираться, искать причину почему все не работает. И если ты сейчас не хочешь разобраться в том, как подключить произвольный шрифт, то как же ты будешь разбираться в более сложных задачах? Программисту приходится постоянно изучать что-то новое.
Есть конечно компании, где работа больше напоминает конвеер, но поверь, тебе там не понравится. Да и карьерного роста на конвеере быть не может.
Потому предлагаю все же собраться с силами и решить проблему. Может быть, удобнее сначала подключить шрифты не к макету, а просто сделать HTMl файл с одним заголовком и абзацем текста и потренироваться на нем. И вместо 8 начертаний использовать только одно. И не конвертировать файл в разные форматы, а использовать тот, что у тебя есть (ttf).
Начни с теории. В CSS есть правило @font-face, которое указывает браузеру где надо брать шрифт с данными именем если его нет на компьютере. В нем ты указываешь имя шрифта (которое используется в другиъх местах CSS), его начертание (жирность/курсивность) и ссылку на скачивание с указанием формата файла.
http://htmlbook.ru/blog/svoi-shrift-na-stranitse
http://xiper.net/collect/html-and-css-tricks/typographics/font-face-non-standart-fonts-on-css
Для начала, как я написал выше, попробуй сделать чтобы работало на простой странице и без кучи форматов шрифтов. И желательно, покажи результат, я подскажу если что не так.
Когда ты с этим разберешься, надо разобраться как конвертировать шрифт в разные форматы и как указать ссылки на них в CSS коде. Конвертирует файлы font squirrel, и есть статьи про это:
http://htmlbook.ru/blog/vstraivaem-shrifty-pri-pomoshchi-font-squirrel-font-fac
Он же генериурет CSS код с правилами @font-face, но его возможно придется править.
Наконец когда ты получишь сконвертированные файлы, надо будет написать правило чтобы их подключить ( писать его с нуля не надо, бери из статьи и измени под себя ).
Когда ты с этим справишься, ты можешь перенести эти правила в макет.
Есть конечно еще вариант подключать шрифт через Google Fonts но это слишком просто и неинтересно. Это не поможет тебе разобраться как работают кастомные шрифты и потому не подойдет для нашего задания.
Насчет PHP, почему бы и нет, ты можешь параллельно его изучать или после того как разберешься с макетом.
> Может действительно уже хватит и стоит идти дальше, а не ковырять этот макет?
Там немного вроде осталось, кроме шрифтов там только если мелкие замечания могут быть. Не жалко на 90% доделанную работу бросить на полпути?
Ну и если тебе что-то непонятно, покажи код, задай вопрос. Я никого не бросаю один на один с мануалами, всегда могу дать подсказку.
> До сих пор не понимаю что там нужно загружать на font-squirrel, какие критерии выставлять. Все как-то сложно. Да и на английском, а я его не понимаю.
Там в статье вроде описано, путь примерно такой:
- жмешь Upload fonts, выбираешь файлы шрифтов
- жмешь галочку что ты не нарушаешь лицензии: Yes, the fonts I'm uploading are legally eligible for web embedding.
- из вариантов выбираешь Optimal (она уже выбрана)
- жмешь Download и получаешь архив с сконвертированными файлами шрифтов и CSS кодом, который надо чуть подправить и добавить на сайт. А также в архиве лежит HTML файл на котором можно увидеть работает ли шрифт.
В CSS коде может быть придется поменять имя шрифта, путь к нему, указать начертание (что этот файл соответствует жирному или курсивному шрифту).
Также, там есть вариант «Expert» который предлагает больше опций и который гораздо интереснее. Раз ты не знаешь ангийский, опишу какие там есть опции:
— Font Formats: какие форматы файлов генерировать
— Truetype Hinting: откуда брать информацию для хинтинга (хинтинг это выравнивание шрифта относительно границ пикселей на экране на маленьких размерах, чтобы шрифт смотрелся более четко, а не размыто, вики:https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D0%BD%D1%82%D0%B8%D0%BD%D0%B3 ). FontSquirrel позволяет либо оставить информацию для хинтинга, взятую из шрифта, либо сгенерировать ее автоматически (я сильно сомневаюсь что в этом есть польза так как хинтинг в хороших шрифтах делают люди на глаз. Например многие стандартные шрифты из Windows содержат информацию для хинтинга).
— Rendering: дополнительные опции
— Fix Vertical Metrics не знаю, как это работает
— Fix GASP Table не знаю что это
— Remove Kerning удалить из шрифта информацию для кернинга. Кернинг это индивидуально задаваемое дизайнером расстояние между отдельными парами букв. Ну например дизайнеру шрифта может показаться что определенные буквы должны быть ближе или дальше друг от друга. Это помогает тексту выглядеть более читаемо и красиво. опять же, в хороших шрифтах эта информация есть. Вырезать ее имеет смысл только если это какой-то некачественный шрифт где эта информация неточная. Вики: https://ru.wikipedia.org/wiki/%D0%9A%D0%B5%D1%80%D0%BD%D0%B8%D0%BD%D0%B3
— Fix Missing Glyphs: добавить в шрифт автоматически сгенерированные символы пробела и дефиса если их там нет. Наверно это нужно для исправления некачественных шрифтов
— X-height Matching: изменить метрики шрифта чтобы он выглядел крупнее или мельче при данном размере. Скорее всего нужно для исправления некачественных шрифтов.
— Protection: добавить в шрифт пометку о запрете использования не на веб-страницах
— Subsetting: вырезать из шрифта часть символов для уменьшения веса
— Western languages — оставить только символы латинницы
— Custom Subsetting.. — указать диапазон символов явно
— No Subsetting — не трогать ничего
— OpenType Features позволяет удалять из шрифта информацию о лигатурах, альтернативные начертания того же символа и другие open type фичи. Что это за фичи, ты можешь увидеть на картинках тут: http://ilovetypography.com/OpenType/opentype-features.html
Лигатуры это более тесный вариант написания 2 или более букв: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%B3%D0%B0%D1%82%D1%83%D1%80%D0%B0_(%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B1%D1%83%D0%BA%D0%B2)
Опять же, эта опция позволяет удалить их из шрифта. Не знаю, зачем, ведь текст станет менее красивым.
— OpenType Flattening что-то аналогичное
— CSS: опции для генерации CSS кода
— Advanced Options: Em Square Value, Adjust Glyph Spacing — настройки для исправления кривых шрифтов.
Что-то тут получился довольно тяжелый для понимания текст. Ну что поделать, типографика это отдельная наука. Тебе все равно из всех этих опций не надо ничего менять, разве что Subsetting (удаление лишних символов из шрифта) и то в твоем макете это можно не делать.
> Я не говорю, что фронтенд это плохо, он мне даже понравился, но наверное это не мое, не осилю. Да и знакомый мой говорит, что для бэкенда мне полученных знаний уже достаточно и что я сейчас просто на месте стою, а мог бы уже и дальше продвигаться.
Тут вопрос не только и не столько именно изучения, как подключить кастомный шрифт на странице. Смотри, программирование (разработка нормальных продуктов) это не работа на конвеере, где достаточно один раз посмотреть как работают другие и потом 10 лет повторять одни и те же действия. Ты постоянно будешь сталкиваться с вещами, которые ты не знаешь, фреймворками, библиотеками, расширениями, платформами, и каждый раз тебе придется разбираться, искать причину почему все не работает. И если ты сейчас не хочешь разобраться в том, как подключить произвольный шрифт, то как же ты будешь разбираться в более сложных задачах? Программисту приходится постоянно изучать что-то новое.
Есть конечно компании, где работа больше напоминает конвеер, но поверь, тебе там не понравится. Да и карьерного роста на конвеере быть не может.
Потому предлагаю все же собраться с силами и решить проблему. Может быть, удобнее сначала подключить шрифты не к макету, а просто сделать HTMl файл с одним заголовком и абзацем текста и потренироваться на нем. И вместо 8 начертаний использовать только одно. И не конвертировать файл в разные форматы, а использовать тот, что у тебя есть (ttf).
Начни с теории. В CSS есть правило @font-face, которое указывает браузеру где надо брать шрифт с данными именем если его нет на компьютере. В нем ты указываешь имя шрифта (которое используется в другиъх местах CSS), его начертание (жирность/курсивность) и ссылку на скачивание с указанием формата файла.
http://htmlbook.ru/blog/svoi-shrift-na-stranitse
http://xiper.net/collect/html-and-css-tricks/typographics/font-face-non-standart-fonts-on-css
Для начала, как я написал выше, попробуй сделать чтобы работало на простой странице и без кучи форматов шрифтов. И желательно, покажи результат, я подскажу если что не так.
Когда ты с этим разберешься, надо разобраться как конвертировать шрифт в разные форматы и как указать ссылки на них в CSS коде. Конвертирует файлы font squirrel, и есть статьи про это:
http://htmlbook.ru/blog/vstraivaem-shrifty-pri-pomoshchi-font-squirrel-font-fac
Он же генериурет CSS код с правилами @font-face, но его возможно придется править.
Наконец когда ты получишь сконвертированные файлы, надо будет написать правило чтобы их подключить ( писать его с нуля не надо, бери из статьи и измени под себя ).
Когда ты с этим справишься, ты можешь перенести эти правила в макет.
Есть конечно еще вариант подключать шрифт через Google Fonts но это слишком просто и неинтересно. Это не поможет тебе разобраться как работают кастомные шрифты и потому не подойдет для нашего задания.
Насчет PHP, почему бы и нет, ты можешь параллельно его изучать или после того как разберешься с макетом.
> Может действительно уже хватит и стоит идти дальше, а не ковырять этот макет?
Там немного вроде осталось, кроме шрифтов там только если мелкие замечания могут быть. Не жалко на 90% доделанную работу бросить на полпути?
Ну и если тебе что-то непонятно, покажи код, задай вопрос. Я никого не бросаю один на один с мануалами, всегда могу дать подсказку.
> До сих пор не понимаю что там нужно загружать на font-squirrel, какие критерии выставлять. Все как-то сложно. Да и на английском, а я его не понимаю.
Там в статье вроде описано, путь примерно такой:
- жмешь Upload fonts, выбираешь файлы шрифтов
- жмешь галочку что ты не нарушаешь лицензии: Yes, the fonts I'm uploading are legally eligible for web embedding.
- из вариантов выбираешь Optimal (она уже выбрана)
- жмешь Download и получаешь архив с сконвертированными файлами шрифтов и CSS кодом, который надо чуть подправить и добавить на сайт. А также в архиве лежит HTML файл на котором можно увидеть работает ли шрифт.
В CSS коде может быть придется поменять имя шрифта, путь к нему, указать начертание (что этот файл соответствует жирному или курсивному шрифту).
Также, там есть вариант «Expert» который предлагает больше опций и который гораздо интереснее. Раз ты не знаешь ангийский, опишу какие там есть опции:
— Font Formats: какие форматы файлов генерировать
— Truetype Hinting: откуда брать информацию для хинтинга (хинтинг это выравнивание шрифта относительно границ пикселей на экране на маленьких размерах, чтобы шрифт смотрелся более четко, а не размыто, вики:https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D0%BD%D1%82%D0%B8%D0%BD%D0%B3 ). FontSquirrel позволяет либо оставить информацию для хинтинга, взятую из шрифта, либо сгенерировать ее автоматически (я сильно сомневаюсь что в этом есть польза так как хинтинг в хороших шрифтах делают люди на глаз. Например многие стандартные шрифты из Windows содержат информацию для хинтинга).
— Rendering: дополнительные опции
— Fix Vertical Metrics не знаю, как это работает
— Fix GASP Table не знаю что это
— Remove Kerning удалить из шрифта информацию для кернинга. Кернинг это индивидуально задаваемое дизайнером расстояние между отдельными парами букв. Ну например дизайнеру шрифта может показаться что определенные буквы должны быть ближе или дальше друг от друга. Это помогает тексту выглядеть более читаемо и красиво. опять же, в хороших шрифтах эта информация есть. Вырезать ее имеет смысл только если это какой-то некачественный шрифт где эта информация неточная. Вики: https://ru.wikipedia.org/wiki/%D0%9A%D0%B5%D1%80%D0%BD%D0%B8%D0%BD%D0%B3
— Fix Missing Glyphs: добавить в шрифт автоматически сгенерированные символы пробела и дефиса если их там нет. Наверно это нужно для исправления некачественных шрифтов
— X-height Matching: изменить метрики шрифта чтобы он выглядел крупнее или мельче при данном размере. Скорее всего нужно для исправления некачественных шрифтов.
— Protection: добавить в шрифт пометку о запрете использования не на веб-страницах
— Subsetting: вырезать из шрифта часть символов для уменьшения веса
— Western languages — оставить только символы латинницы
— Custom Subsetting.. — указать диапазон символов явно
— No Subsetting — не трогать ничего
— OpenType Features позволяет удалять из шрифта информацию о лигатурах, альтернативные начертания того же символа и другие open type фичи. Что это за фичи, ты можешь увидеть на картинках тут: http://ilovetypography.com/OpenType/opentype-features.html
Лигатуры это более тесный вариант написания 2 или более букв: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%B3%D0%B0%D1%82%D1%83%D1%80%D0%B0_(%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B1%D1%83%D0%BA%D0%B2)
Опять же, эта опция позволяет удалить их из шрифта. Не знаю, зачем, ведь текст станет менее красивым.
— OpenType Flattening что-то аналогичное
— CSS: опции для генерации CSS кода
— Advanced Options: Em Square Value, Adjust Glyph Spacing — настройки для исправления кривых шрифтов.
Что-то тут получился довольно тяжелый для понимания текст. Ну что поделать, типографика это отдельная наука. Тебе все равно из всех этих опций не надо ничего менять, разве что Subsetting (удаление лишних символов из шрифта) и то в твоем макете это можно не делать.
Ты понимаешь, что ты поехавший максималист, или ты не понимаешь этого?
Зачем ты грузишь нубов до посинения?
Да, нужно знать много. Но это требуется от разраба с over пятилетним стажем, который претендует на соответствующую зарплату.
Я понимаю, что тебя заебала "конвеерная" работа, но для джуна-стажера который в жизни не написал ни одного проекта кроме твоего всратого файлообменника полгода-год такой рутинной работы не то что не помешают, даже необходимы чтобы твердо и уверенно стоять на ногах и ориентироваться в охулиарде технологий со всеми их нюансами.
>Ты понимаешь, что ты поехавший максималист, или ты не понимаешь этого?
Это моя любимая черта в ОПе. ОП, ипошь в том же стиле.
Да, ОП, ты в очередной раз прав. Я закончу все это. Опять какие-то отмазки детские себе придумал.
Сегодня уже не успеваю, но завтра точно весь день потрачу, но сделаю. Сайт создать и на нем результат показать успехи тоже не проблема.
И да, спасибо большое за подробное разъяснение, теперь все более-менее понятно стало, осталось статьи прочитать. А то я даже и не знал где информацию брать.
>>531761
А как еще учить если не загружать? По верхам прыгать? Все ОП правильно сказал, надо разбираться а не на полпути бросать.
>Насчет PHP, почему бы и нет, ты можешь параллельно его изучать или после того как разберешься с макетом.
PHP я бы в последнюю очередь хотел начать изучать. Имея уже знания в остальном. По крайней мере планировал после HTML/CSS приступить к Яваскриптам. И спросить какие темы мне там нужно затронуть, а то ведь это полноценный язык. Не изучать же его весть? Или изучать?
Вообще, для работы с XML есть несколько расширений:
— DOM
— SimpleXML (работает поверх дома, так что придется изучить его)
— XMLReader/XMLWriter (для потокового чтения/записи гигантских файлов)
Также, есть язык XPath для поиска узло в дереве DOM.
Соответственно ответ на твой вопрос, научиться работать с XML и использовать DOM или SimpleXML.
Кто-то скажет что XML можно парсить регуярками. Это верный путь в быдлокодеры, потому что когда есть специально предназначеннные для этой задачи библиотеки, зачем использовать обходные и ненадежные способы?
>>531386
Смотри внизу:
> PHP Notice: Undefined offset: 0 in /home/uXGGcK/prog.php on line 30
Это ошибка. ты обращаешься к элементу с индексом 0 которого нет в массиве.
Также, регулярка не работает для всех случаев. Надо написать ее так:
— в начале +7 или 8
— за ними ровно 10 цифр, между которыми идет любое число пробелов, минусов, скобок.
>>531338
Три месяца это если делать полностью и не очень спеша. Ты можешь сделать только первую часть задания, например редактор теста + прохождение, без пользователей, регистраций, соцсетей и тд.
Ну и я могу сказать что там довольно много подводных камней которые заставят тебя думать как решить ту или иную проблему. Это не туториал где ты просто жмешь те же кнопки что в видео. И соответственно польза гораздо больше. По сложности сайт с тестами сопоставим с реальными проектами. А благодаря довлоьно строгой проверке кода нашем треде твой код будет качественнее чем в реальных проектах.
> Что мне теперь, дублировать файлообменник на yii?
Юи слишком большой для такого просто сайта.
В Юи много всего, например:
— работа с Бд и ActiveRecord
— миграции
— связи (отношения) в БД
— права/роли (RBAC)
— админка
— виджеты (например виджет таблицы с сортировкой и поиском)
— расширения
> Я буду считать что знаю фреймворк, когда смогу реализовать на нем все виды функционала.
Предлагаю тогда начать с чтения мануал где этот функционал описан: https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
Вообще, для работы с XML есть несколько расширений:
— DOM
— SimpleXML (работает поверх дома, так что придется изучить его)
— XMLReader/XMLWriter (для потокового чтения/записи гигантских файлов)
Также, есть язык XPath для поиска узло в дереве DOM.
Соответственно ответ на твой вопрос, научиться работать с XML и использовать DOM или SimpleXML.
Кто-то скажет что XML можно парсить регуярками. Это верный путь в быдлокодеры, потому что когда есть специально предназначеннные для этой задачи библиотеки, зачем использовать обходные и ненадежные способы?
>>531386
Смотри внизу:
> PHP Notice: Undefined offset: 0 in /home/uXGGcK/prog.php on line 30
Это ошибка. ты обращаешься к элементу с индексом 0 которого нет в массиве.
Также, регулярка не работает для всех случаев. Надо написать ее так:
— в начале +7 или 8
— за ними ровно 10 цифр, между которыми идет любое число пробелов, минусов, скобок.
>>531338
Три месяца это если делать полностью и не очень спеша. Ты можешь сделать только первую часть задания, например редактор теста + прохождение, без пользователей, регистраций, соцсетей и тд.
Ну и я могу сказать что там довольно много подводных камней которые заставят тебя думать как решить ту или иную проблему. Это не туториал где ты просто жмешь те же кнопки что в видео. И соответственно польза гораздо больше. По сложности сайт с тестами сопоставим с реальными проектами. А благодаря довлоьно строгой проверке кода нашем треде твой код будет качественнее чем в реальных проектах.
> Что мне теперь, дублировать файлообменник на yii?
Юи слишком большой для такого просто сайта.
В Юи много всего, например:
— работа с Бд и ActiveRecord
— миграции
— связи (отношения) в БД
— права/роли (RBAC)
— админка
— виджеты (например виджет таблицы с сортировкой и поиском)
— расширения
> Я буду считать что знаю фреймворк, когда смогу реализовать на нем все виды функционала.
Предлагаю тогда начать с чтения мануал где этот функционал описан: https://github.com/yiisoft/yii2/tree/master/docs/guide-ru
Если хочешь простое с виду задание, но с подвохом, как насчет сделать клон ютуба? Функционал: загрузка видео, просмотр видео, комментирование, поиск видео по названию, админка модерации роликов и комментариев, статистика. Регистрация не нужна, дизайн в стиле черный текст на белом фоне, структура аналогична существующему сайту. Необходимо также сделать очередь задач на основе Gearman или аналогичной библиотеки для конвертации видео в фоновом режиме в нужные форматы. Конвертирвать можно с помощью ffmpeg, он кроссплатформенный вроде бы. Очередь должна быть организована качественно, с обработкой и логгированием ошибок и таймаутами.
Если ты не знаком с командной строкой, с тем что такое процесс, стандартный поток вывода, код возврата, сигнал, то тебе предстоит изучить много нового.
>А как еще учить если не загружать?
Я имел ввиду, что все равно не получится сразу прыгнуть с нулевого на максимальный уровень.
Сначала основы, потом более продвинутые вещи, только потом сложные нюансы. Лично у меня в голове каша, когда сразу вываливают такую массу информации.
Впрочем дело ваше конечно. Если есть время месяцами заниматься хелловордлами, то почему бы и нет.
> PHP я бы в последнюю очередь хотел начать изучать.
Давай я тебе зависимости напишу, чтобы ты мог выстроить карту:
Чистый PHP + ООП (весь мой учебник): не требует предв. знаний
HTML/CSS: не требует знаний
JS: не требует предв. знаний
SQL: не требует знаний
Написание простых приложений на PHP (Задача на студентов): PHP, HTML/CSS, SQL
Написание простых приложений 2 (файлообменник): PHP, HTML/CSS, SQL, JS, DOM
DOM: надо знать JS, HTML/CSS
jQuery: надо знать DOM
Вот, имея список зависимостей ты можешь нарисовать схему что в каком порядке изучается. Как видишь, основы PHP, HTML/CSS, JS. SQL не зависят друг от друга и их можно учить в любом порядке или параллельно.
По JS есть отличный сайт learn.javascript.ru и есть задачи на JS в шапке треда.
Во-первых, я бы не назвал «до посинения». Каждый раз когда я придумываю задачи, я сдерживаю себя и стираю половину написанного. Во-вторых, с чего ты решил что это какие-то заоблачные требования? Это нормальные вещи которые должен знать программист. Я бы сказал это ниже нормального.
Почитай программу любого западного вуза по Computer Science. Все задания из нашего треда уместятся в одно полугодие курса «Веб программирование». Все что мы тут изучаем. И причем это будет где-то на первом-втором курсе, чисто для разминки, потому что дальше идет совсем другой уровень знаний.
Но зато эти выпускники потом идут в топовые стартапы, делают свои стартапы и тд. И Билл Гейтс, и Цукерберг учились по подобным программам. А у нас люди только ноют как им трудно жить, и мы имеем то что имеем.
То, что где-то в подвальной студии «сайт за 3000 рублей» требования ниже — не значит что мы будем на них ориентироваться. Мы готовим разработчиков, а не кассиров для макдональдса.
Ну и наконец, я уверен, что труды окупятся, когда на собеседовании наш анон легко уделает других кандидатов учившихся у нетребовательных преподавателей и по пиратским видеокурсам. Хотя спрос на разработчиков высок, но это спрос на квалифицированных разработчиков, а не на тех кто пишет как попало и кто не сможет нормально пройти испытания.
> Да, нужно знать много. Но это требуется от разраба с over пятилетним стажем, который претендует на соответствующую зарплату.
У нас даже близко такого нет. Не знаю, почему ты так решил. Тебе наши задания кажутся сложными? Испытания на собеседовании в хорошую компанию могут быть сложнее.
Если ты ориентируешься на другие курсы или учебники, то зря. Многие учебные пособия по PHP и вебу, статьи в блогах написаны низкоквалифицированными авторами и на них смотреть не стоит. Те кто по ним учатся потом плачутся на форумах что работы нет и кризис.
>>531783
Это не максимальный уровень. Задания в нашем треде идут на уровень крепкого джуниора или пониже. И мы конечно ориентируемся на нормальные компании в крупных городах, а не на провинциальные подвальные студии делающие сайт за 2 дня.
Более того, во многих странах рынок разработки ориентирован на аутсорсинг на западных заказчиков. В таких компаниях хорошие условия труда, но требования к кандидатам выше чем в нашем треде. Со знаниями уровня провинциальной вебстудии тебя даже на собеседование не позовут.
Во-первых, я бы не назвал «до посинения». Каждый раз когда я придумываю задачи, я сдерживаю себя и стираю половину написанного. Во-вторых, с чего ты решил что это какие-то заоблачные требования? Это нормальные вещи которые должен знать программист. Я бы сказал это ниже нормального.
Почитай программу любого западного вуза по Computer Science. Все задания из нашего треда уместятся в одно полугодие курса «Веб программирование». Все что мы тут изучаем. И причем это будет где-то на первом-втором курсе, чисто для разминки, потому что дальше идет совсем другой уровень знаний.
Но зато эти выпускники потом идут в топовые стартапы, делают свои стартапы и тд. И Билл Гейтс, и Цукерберг учились по подобным программам. А у нас люди только ноют как им трудно жить, и мы имеем то что имеем.
То, что где-то в подвальной студии «сайт за 3000 рублей» требования ниже — не значит что мы будем на них ориентироваться. Мы готовим разработчиков, а не кассиров для макдональдса.
Ну и наконец, я уверен, что труды окупятся, когда на собеседовании наш анон легко уделает других кандидатов учившихся у нетребовательных преподавателей и по пиратским видеокурсам. Хотя спрос на разработчиков высок, но это спрос на квалифицированных разработчиков, а не на тех кто пишет как попало и кто не сможет нормально пройти испытания.
> Да, нужно знать много. Но это требуется от разраба с over пятилетним стажем, который претендует на соответствующую зарплату.
У нас даже близко такого нет. Не знаю, почему ты так решил. Тебе наши задания кажутся сложными? Испытания на собеседовании в хорошую компанию могут быть сложнее.
Если ты ориентируешься на другие курсы или учебники, то зря. Многие учебные пособия по PHP и вебу, статьи в блогах написаны низкоквалифицированными авторами и на них смотреть не стоит. Те кто по ним учатся потом плачутся на форумах что работы нет и кризис.
>>531783
Это не максимальный уровень. Задания в нашем треде идут на уровень крепкого джуниора или пониже. И мы конечно ориентируемся на нормальные компании в крупных городах, а не на провинциальные подвальные студии делающие сайт за 2 дня.
Более того, во многих странах рынок разработки ориентирован на аутсорсинг на западных заказчиков. В таких компаниях хорошие условия труда, но требования к кандидатам выше чем в нашем треде. Со знаниями уровня провинциальной вебстудии тебя даже на собеседование не позовут.
За карту спасибо. Как раз то, что мне нужно. Но все равно из всего, не требующего предварительных знаний я PHP оставлю на потом. И параллельно учить не хочу. Лучше учится когда концентрируюсь на чем-то одном, не люблю разделяться.
>По JS есть отличный сайт learn.javascript.ru и есть задачи на JS в шапке треда.
Помню когда сдал макет в первый раз на проверку и было нечего делать, я спросил по чему мне изучать JS, ты советовал http://learn.javascript.ru/ а аноны что-то другое, где побыстрее курс, но я все-таки по твоей рекомендации пошел. Даже успел пару тем пройти и небольшой скриптик написать. Язык в принципе мне понравился. Не отторгает, думаю так же с удовольствием учить буду. А то помню когда только выбирал что изучать JAVA или PHP, глянул JAVA и уже на первых уроках понял, что это идиотизм какой-то а не язык. Все с самого начала какое-то громоздкое, конструкции непонятные и большие. То ли дело PHP, мне он показался очень легким, интуитивно понятным даже.
И еще, я задам сейчас, наверное, даже еще более нубовский вопрос чем "А сколько я все это примерно буду изучать?". Что такое ООП? Да гугл выдает "Объектно-ориентированное программирование". Но что это? Стиль написания кода? Какие-либо программы? Языки? Что значит изучать ООП? Вообще это понять не могу.
Так же еще непонятно что такое фреймворки. Знаю, что лезу куда-то вперед и что это только предстоит выучить, но все-таки часто здесь вижу эти понятия, а значения не знаю.
Я тебе о том, что информацию нужно давать постепенно, от простого к сложному, а ты мне про дноконторы и быдлокодеров.
Ну и хуй с тобой. Ты же поехавший.
>>531797
>Что такое ООП? Да гугл выдает "Объектно-ориентированное программирование". Но что это?
> что такое фреймворки
Не хочешь порешать задачки с собеседования гугла или яндекса?
> А то помню когда только выбирал что изучать JAVA или PHP, глянул JAVA и уже на первых уроках понял, что это идиотизм какой-то а не язык. Все с самого начала какое-то громоздкое, конструкции непонятные и большие.
Тем не менее есть много сфер где PHP не конкурент Яве. Например, банковский или телекомовский софт никто не рискнет писать на PHP, а Ява вполне подходит. Гугл и Яндекс используют Яву. Смартфоны андроид работают на Яве.
Да, она сложнее, код пишется дольше, но он получается надежнее, качественнее, работает быстрее, для явы есть много библиотек и инструментов.
Может быть он просто не очень подходит в качестве первого языка для начинающего, конечно, яваскрипт, питон или PHP гораздо проще освоить. Но кто знает, потом может тебе захочется и за Яву или C# bkb какой-нибудь Rust взяться.
> Что такое ООП? Да гугл выдает "Объектно-ориентированное программирование". Но что это? Стиль написания кода?
А ты почитай в моем учебнике главу про ООП. ООП это подход когда мы разносим код по отдельным классам и сипоьзуем в программе объекты этих классов.
Объект это штука у которой есть свойства (переменные) и методы (функции для работы с ними). Однотипные объекты относятся к одному классу. Ну например в игре у нас может быть класс Пехотинец, а свойствами объектов этого класса будут координаты на карте и уровень здоровья. А методами будут функции для перемещения по карте и атаки противника. Или если взять серьезную программу, там может быть класс Сотрудник, объекты которого хранят в свойствах имя, фамилию, должность и зарплату сотрудника.
В приложении-форуме могут быть объекты класса Тред, Пост, Пользователь, хранящие информацию о соответствющих сущностях. И объекты-мапперы, которые сохраняют и загружают их из базы для вывода на странице.
Лучше почитай главу в учебнике, там это на примерах с кодом описано.
ООП нужен для того чтобы большие, сложные программы были разбиты на отдельные кусочки (классы) а не выглядели как огромная куча спутанного кода в которой невозможно разобраться. Так как почти все веб приложения это большие программы то без ООП их писать трудно и неудобно. Запутанный код значит что надо много времени чтобы в нем разобраться и что в нем легко наделать ошибок.
> А то помню когда только выбирал что изучать JAVA или PHP, глянул JAVA и уже на первых уроках понял, что это идиотизм какой-то а не язык. Все с самого начала какое-то громоздкое, конструкции непонятные и большие.
Тем не менее есть много сфер где PHP не конкурент Яве. Например, банковский или телекомовский софт никто не рискнет писать на PHP, а Ява вполне подходит. Гугл и Яндекс используют Яву. Смартфоны андроид работают на Яве.
Да, она сложнее, код пишется дольше, но он получается надежнее, качественнее, работает быстрее, для явы есть много библиотек и инструментов.
Может быть он просто не очень подходит в качестве первого языка для начинающего, конечно, яваскрипт, питон или PHP гораздо проще освоить. Но кто знает, потом может тебе захочется и за Яву или C# bkb какой-нибудь Rust взяться.
> Что такое ООП? Да гугл выдает "Объектно-ориентированное программирование". Но что это? Стиль написания кода?
А ты почитай в моем учебнике главу про ООП. ООП это подход когда мы разносим код по отдельным классам и сипоьзуем в программе объекты этих классов.
Объект это штука у которой есть свойства (переменные) и методы (функции для работы с ними). Однотипные объекты относятся к одному классу. Ну например в игре у нас может быть класс Пехотинец, а свойствами объектов этого класса будут координаты на карте и уровень здоровья. А методами будут функции для перемещения по карте и атаки противника. Или если взять серьезную программу, там может быть класс Сотрудник, объекты которого хранят в свойствах имя, фамилию, должность и зарплату сотрудника.
В приложении-форуме могут быть объекты класса Тред, Пост, Пользователь, хранящие информацию о соответствющих сущностях. И объекты-мапперы, которые сохраняют и загружают их из базы для вывода на странице.
Лучше почитай главу в учебнике, там это на примерах с кодом описано.
ООП нужен для того чтобы большие, сложные программы были разбиты на отдельные кусочки (классы) а не выглядели как огромная куча спутанного кода в которой невозможно разобраться. Так как почти все веб приложения это большие программы то без ООП их писать трудно и неудобно. Запутанный код значит что надо много времени чтобы в нем разобраться и что в нем легко наделать ошибок.
Я и даю постепенно. Открой первую страницу учебника и скажи, сложный ли там материал? А к концу сложность постепенно повышается. ну а тем кто прошел учебник я даю еще более сложные задания, чтобы не расслаблялись.
>>531797
Фреймворк значит «каркас». Это набор функций которые используются в большинстве приложений и идея в том чтобы не писать их самому, а взят готовые.
Ну например возьмем такое приложение как форум. В нем есть как код относящийся только к данному форуму (например код вывода постов на странице) так и универсальный код который можно использовать где угодно (например код для выполнения запросов к базе данных или код для авторизации пользователя). Идея в том, чтобы программисты не писали каждый заново этот общий код, наступая на грабли и делая свои велосипеды, а взяли готовый, качественный, написанный и проверенный большим числом людей, код.
Также если сайт написан на фреймворке то в нем проще разбираться так как часть кода (функции фреймворка) ты уже знаешь. А в самописном коде тебе придется разбирать его весь.
Если я кому-то не ответил или не проверил задачу, напомните о себе в новом треде
Чтобы не тормошить фронтендщиков когда тебе надо добавить раздел или сделать попап или еще что-нибудь. Чтобы не тупить разбирая яваскрипт код.
Я тебе советую поменять направление с бекендщика на фуллстек разработчика. Кризис же, не время быть разборчивым. Никто тебе не будет персонального верстальщика выделять.
Заметь я не говорю, что ты будешь верстать страницы. Но знать верстку надо.
Алсо мы уже в новом треде.
Что такое нужно доставть в arch, что бы БЛЕАТЬ появилась библиотека с slqite3? И какого хуя ебаные ментейнеры пишут на своем ебаном сайте в документации что все идет из коробки, если из коробки там >> Fatal error: Class 'SQLite' not found in /srv/http/index.php on line 3
У меня багет с этого
php-sqlite
сам нашел только что, но потратил на это минут 40, настучите кто-нибудь разрабам по башке, что б, ссуки, думали перед тем как писать что то в документации и/или вкидывать/выкидывать что то из ядра.
Совсем охуели.
>>503607
Вы видите копию треда, сохраненную 14 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.