Ответы пользователя по тегу Веб-разработка
  • Почему на некоторых сайтах страницы не открываются в новом окне при ctrl+click?

    nowm
    @nowm
    Это происходит из-за того, что ссылка находится внутри элемента, на который навешано прослушивание события click. При этом это навешанное событие не проверяет ни источник клика, ни использование модификаторов (shift, alt, ctrl и так далее). Далее, когда вы кликаете по ссылке, при условии, что навигация происходит не в текущей вкладке, событие клика передаётся по цепочке всем родителям этой ссылки, и если один из родителей слушает click, он его обработает.

    Это обычное следствие кривых рук отсутствия опыта — никакой стратегии тут нет. Люди просто не умеют просчитывать варианты того, в каких обстоятельствах будет работать их код.

    И если перейти на частности, то на сайте, который вы упомянули, на строку таблицы, внутри которой находится ссылка, навешано событие, которое при клике открывает страницу /en/subtitles/***. Если вы просто кликаете по ссылке, то вы переходите по корректному адресу, потому что используется та же самая вкладка, но если вы открываете ссылку в новом окне, кликая не правой клавишей мыши, а левой плюс кнопка-модификатор Ctrl, событие клика передаётся в тег TR, который переадресовывает текущую вкладку на адрес /en/subtitles/***.
    Ответ написан
    2 комментария
  • Что это за sublime?

    nowm
    @nowm
    Это Seti UI.

    Оригинальная версия, если не ошибаюсь, работает только на версии 2. Есть порт для ST3, который требует ST3 Build 3062 и выше.
    Ответ написан
    5 комментариев
  • Какой применить способ вывода символа рубля на сайте?

    nowm
    @nowm
    Самый элегантный способ — подключить и использовать шрифт, в котором есть знак рубля. PT Sans, например. Это шрифт без засечек (sans-serif family) — выглядит вполне нормально для веба (единственное, мне в нём не нравится «Q» (заглавная) — как-то неестественно смотрится). Подключение шрифтов поддерживается в данный момент большинством браузеров. Так что не придётся дополнительно танцевать с разными марками бубнов.
    Ответ написан
    Комментировать
  • CSS, как настроить background сайта?

    nowm
    @nowm
    Непосредственно после тега BODY добавьте DIV с абсолютным позиционированием, отрицательным z-index и сокрытием overflow и задайте ему высоту в половину сайта и ширину 100%. Внутрь DIV-блока вставьте картинку (обычным тегом IMG) и сделайте ему минимальную высоту 100% и минимальную ширину — тоже 100%. Для псевдоэлемента :after DIV-блока задайте блоковое отображение, абсолютное позиционирование, и высоту, достаточную для вашего «помаленьку». Сделайте ему 100% ширины и bottom: 0, а так же градиентный фон от белого до прозрачного, направленный вверх.

    По-моему, это хорошая и понятная инструкция. Если нужен готовый код, есть смысл заглянуть на freelansim.ru — потому что есть ньюансы во время реализации.
    Ответ написан
    1 комментарий
  • Безопасен ли такой код?

    nowm
    @nowm
    Да, в принципе, вполне безопасен. Здесь вы не вызываете никакой пользовательский код. $controller у вас вызывается ваш, который вы вручную прописывали внутри массива $routes.
    Ответ написан
    Комментировать
  • Как улучшить навыки построения веб-приложения (php)?

    nowm
    @nowm
    Ссылка на мое убожество

    Первый и очень важный совет: если у вас возникает желание написать: «Ссылка на мое убожество», лучше сразу сотрите весь код и не отвлекайте людей по пустякам. Смотрите: вы называете его убожеством. Значит вы знаете почему он убогий. В этом случае поправьте его до такой степени, чтобы у вас не появлялось желание самому называть его убогим. Поправили — публикуйте. Если же вы его называете убогим только потому, что кто-то ещё называет его убогим, то просите того человека делать обзор, а не всех вподряд.

    Сегодня мне сказали что я имею фундаментальные навыки построения веб-приложений, но они не дотянут до junior уровня.

    Спросите у того, кто вам это сказал. Поинтересуйтесь, что можно исправить и в каком направлении работать. Просто в одной компании у Senior PHP Programmer может быть даже меньше навыков, чем у Junior PHP Programmer в другой компании. Если кто-то говорит, что код — гавно, попросите объяснить, почему он плохой. Если люди не объясняют, просто забейте и программируйте в своё удовольствие.

    Чётких критериев деления на Junior, Middle и Senior нет. Но есть признаки, по которым можно примерно ориентироваться.

    1. Если человек пишет программу так, что вывод нарушает семантику выходного формата, это явный признак юниорства. Для примера, в файле /framework/index.php есть такой код:

    echo '<!-- Код выполнен за '.number_format(microtime(1)-$t,3).' секунды -->';


    Это выведет примерно такой код:
    <html>
    . . .
    </html>
    <!-- Код выполнен за 0.531 секунды -->


    Семантически это неправильно, так как после закрывающего тега HTML больше не должно ничего быть.

    2. Русские и английские комментарии смешиваются. Вообще, лучше писать комментарии на английском, так как код вы выкладываете на ресурс, где большинство посетителей англоговорящие (я про GitHub, а не про Тостер). При этом, без проблем можно писать комментарии на русском, если вам глубоко параллельно на англоязычную аудиторию. Но в этой ситуации нужно писать все комментарии на русском. У вас же там мешанина — автоматически сгенерированные фреймворком англоязычные комментарии и рядом комментарии на русском языке. В вашем случае нужно либо переписать английские комментарии на русский, либо русские комментарии перевести на английский.

    Дополнительно, не нужно писать комментарии для обыденной фигни, вроде:
    $config['per_page'] = 10; // сколько записей показывать на странице

    Это тоже самое, что наклеить на монитор заметку, что Земля вращается вокруг Солнца. Вам лично нужно постоянно самому себе напоминать этот факт? Возможно, есть смысл напоминать какие-то сложные моменты, вроде расстояния между Солнцем и Землёй в миллиметрах, но не обыденные вещи.

    3. Не-единообразный подход к оформлению кода. Например, фреймворк сгенерировал такой код:

    if (defined('ENVIRONMENT'))
    {
        switch (ENVIRONMENT)
        {
            case 'development':
                error_reporting(E_ALL);
            break;
    
            case 'testing':
            case 'production':
                error_reporting(0);
            break;
    
            default:
                exit('The application environment is not set correctly.');
        }
    }


    Это код по стандарту PSR-2

    Код, написанный вами, не попадает под этот стандарт. Для примера:

    if (strlen($uri)>1) {// если не главная страница...
      if (rtrim($uri,'/')!=$uri) {
        header("HTTP/1.1 301 Moved Permanently");
        header('Location: http://'.$_SERVER['SERVER_NAME'].str_replace($uri, rtrim($uri,'/'), $_SERVER['REQUEST_URI']));
        exit();
      }
    }


    Я предлагаю самостоятельно определить, что здесь не соответствует PSR-2. В целом, я чаще всего забиваю на PSR-2. Но я пишу так, как написан основной код. Если основной код написан по стандарту PSR-2, я свои правки тоже делаю в этом стиле. Мешать стандарты, делать в одном месте отступ в два пробела, в другом — в четыре пробела, а в третьем в один TAB — это тоже признак юниорства. Сразу видно, что вы писали мало и не можете понять, что в коде должно быть единообразие, чтобы он выглядел не-юниорским.

    4. Велосипеды — ещё один признак новичка. Раз уж вы таким способом (как в листинге выше) пытаетесь определить главную страницу, можно сократить код (про «велосипед» объяснение в пунктах «в» и «г»):

    a) Нафига добавлять в блок IF единственный блок IF? Такая вложенность блоков нужна только если у вас внутри первого блока IF есть несколько IF-операций, а не одна единственная. Например:

    if (x = 0) {
        if ( isset(y) ) {
            echo 'The Y is set';
        }
    
        if ( isset(z) ) {
            echo 'The Z is set';
        }
    
        echo "Echo something";
    }


    Нужно так писать в вашем случае:

    if (strlen($uri) > 1 && rtrim($uri, '/') != $uri) {
        // some code
    }


    б) Если вы несколько раз пытаетесь использовать вызов функции с одними и теми же параметрами, и функция определённо возвращает один и тот же результат, лучше один раз присвоить её результат переменной и использовать переменную. Например, «rtrim($uri,'/')» вызывается несколько раз. Совершенно понятно, что она всё время будет возвращать один и тот же результат. Конечно, rtrim работает быстро и разницы не будет заметно в итоге. Но вот, например, если у вас функция будет делать запрос в БД, и вы будете её таким способом каждый раз дёргать, это скажется на производительности.

    Возьмите за правило: результат работы функции нужно присваивать переменной в том случае, если этот результат всё время один и тот же и будет использоваться в нескольких местах данной области видимости. С другой стороны, если переменная используется только один раз в данной области видимости, нет смысла её определять — достаточно в нужном месте просто вызвать код, возвращающий результат. Например:

    // Плохой подход
    echo 'У меня есть ' . get_my_apples_from_database() . ' яблок, потому что ' . get_my_apples_from_database() . ' яблок — это круто';
    
    // Хороший подход
    $my_apples = get_my_apples_from_database();
    echo "У меня есть $my_apples яблок, потому что $my_apples яблок — это круто";
    
    // Плохой подход
    $my_apples = get_my_apples_from_database();
    echo "У меня есть $my_apples яблок";
    
    // Хороший подход
    echo 'У меня есть ' . get_my_apples_from_database() . ' яблок';


    в) Если вы пользуетесь CodeIgniter, почему бы не пользоваться его возможностями определения факта, что сейчас открыта главная страница?

    г) Вобще, редиректы со слеша на страницу без слеша нужно делать средствами веб-сервера, а не средствами PHP-интерпретатора.

    Если у вас установлен Apache, можно добавить в .htaccess в корне веб-сайта такой код:

    RewriteCond %{REQUEST_URI} ^.+
    RewriteRule ^(.*)/$ /$1 [L,R=301]


    Это только для иллюстрации. Я не гарантирую, что эта конструкция будет работать идеально, но как пример она хорошо подходит.

    5. Вот такой интересный код в контроллере application/mvc/controllers/blog.php:
    $query = $this->db->query("SELECT count(`id`) FROM `blog_page` WHERE `category`='$id'");//Считаем


    CodeIgnitor — это MVC-фреймворк, он помогает понять, что такое MVC и как правильно писать MVC-приложения. Куча документации же на эту тему. Предлагается разделять код на модель, контроллер и представление. Это означает, что каждая часть выполняет свои какие-то функции. Модель, например, кроме прочего, занимается добычей данных из базы данных. Только модель этим должна заниматься. SQL-запросы в контроллере — это... есть такое выражение: «толстые тупые уродливые контроллеры». Это обычное определение, ничего обидного. Так называются контроллеры, которые делают запросы к БД и частично генерируют HTML-код. Они появляются в ситуации, когда разработчику влом прыгать по файлам и он начинает лепить всё в контроллер. Или когда у него нет достаточного количества знаний по MVC, чтобы правильно разделять код.

    * * *

    Вот. У вас куча таких вещей (и ещё дохрена вещей, которые можно покритиковать) в коде. Они показывают, что вы только недавно начали программировать, у вас небольшой «словарный запас», много велосипедов в коде, много неоптимальных подходов, вроде такого:

    $i = 0;
    
    foreach($query->result_array() as $row)
    {
    	$myrow[$i]['url'] = $row['url'];
    	$myrow[$i]['title'] = $row['title'];
    	$myrow[$i]['text'] = substr(strip_tags($row['text']),0,255);
    	$i++;
    }


    Вместо этого можно было написать так:

    $myrow[] = array();
    
    foreach($query->result_array() as $row)
    {
    	$myrow[] = array(
    		'url' => $row['url'],
    		'title' => $row['title'],
    		'text' => substr(strip_tags($row['text']),0,255)
    	);
    }


    Переменная $i тут не нужна. Можно нормально обойтись без неё. А вот $myrow обязательно нужно определить, чтобы не сталкиваться с неожиданными ошибками, если $query->result_array() вернёт 0 запией.

    Читайте разный код. Понятно, что это универсальный совет, на который вы ответите: «я знаю». Но если вы не будете читать, останетесь безграмотным, вне зависимости от того, знаете вы про полезность этого совета или нет.

    Если пишете на CodeIgniter, почитайте его исходники и документацию. Не почитаете — будете плодить велосипеды, вместо которых можно было бы использовать API фреймворка.

    Используете MVC? Почитайте, для начала: ru.wikipedia.org/wiki/Model-View-Controller Там про толстые контроллеры тоже есть.

    * * *

    Вообще, очень тонкий момент, когда заходит разговор про Junior'a, значит где-то рядом есть и Middle и Senior, значит вы хотите работать в конкретном месте с конкретными людьми. Есть смысл подоставать этих людей, набиться в ученики. Если вы так не думаете, пошлите их на три буквы и программируйте, как считаете нужным.

    DISCLAIMER: Я на всякий случай уточню, что не занимаюсь обучением или поиском чужих косяков в коде. У меня было немного свободного времени, которое я потратил на ответ. Это не значит, что я готов с кем-то няньчиться. Сам ничего не умею.
    Ответ написан
    2 комментария
  • Русский шрифт roboto slab или альтернатива?

    nowm
    @nowm
    Он вполне себе поддерживает кириллицу. Вот для примера: www.fontsquirrel.com/fonts/roboto-slab

    Откройте вкладку «Test Drive» и введите русский текст, он нормально его отображает.

    С Google Fonts опять же можно скачать: www.google.com/fonts#UsePlace:use/Collection:Robot...

    Просто поставьте галочку на «Cyrillic» в разделе «2. Choose the character sets you want:»
    Ответ написан
    Комментировать
  • Путь из фрилансера в аутсорс контору. Как?

    nowm
    @nowm
    Когда начинают закидывать работой, лучший способ — повышать цену.

    Кстати, у многих заказчиков на одеске совершенно нормальная практика: платить 5-10 долларов программистам из Индии, 15-25 долларов — программистам из России и 50-60 долларов — программистам из США. Даже если сложность работы совершенно одинаковая в каждом случае.

    Вот тот владелец студии, которого вам удалось допросить, просто притворился американским программистом. И совершенно логично и нормально, что ему платят в несколько раз больше, чем другим, ведь все думают, что он из США, ведь у него там офис и реклама. А он в России платит намного меньшие ставки местным работникам. При этом, для этих работников ставки выглядят вполне прилично по местным меркам. А себе просто забирает всё, что осталось после расходов.

    Я пишу как обычный мелкий фрилансер — меня пока что не заваливают там работой. Но я просто читаю и анализирую очень много предложений. Именно отсюда моё мнение, что дела обстоят именно так. Кстати, очень часто видел — прямым текстом пишут, что будут платить максимум 20 долларов, но «если вы из США, то вот вам ссылка на вакансию для тех, кто из США». Открываешь ссылку, а там цены ровно в два раза выше при тех же требованиях.

    Вообще, это очень сложный момент, когда начинаешь себе в пару/триплет/квартет брать дополнительных людей. Ты и так делаешь кучу работы, а тут на тебя сваливаются ещё и организационные моменты, а иногда ещё и бессонные ночи, потому что твой напарник пропал/запил/бабушка заболела, а работу нужно делать, потому что за сделанную работу именно ты отвечаешь. Получается, что ты тратишь на работу ещё больше времени, но денег больше уже не получаешь. И это уже не «работать по 4 часа в день, а всё остальное время заниматься своими личными делами», о котором мечтают, когда начинают заниматься фрилансом.

    Лучше всего копить деньги, а потом их крутить — вложить в стартап; отдать в брокерскую контору (не самому играть, а отдать им и пусть с ними крутятся и платят тебе обещанные 100% в год); положить в банк под проценты; создать контентный сайт, нанять туда копирайтера средней руки, вложиться в раскрутку и повесить туда рекламу, которая в итоге всё будет окупать и т.д. — в общем, все те вещи, в которых тебе нужно принимать минимальное участие. Это всё рисково, конечно, но если вкладывать их в несколько разных мест, то больше шансов, что они будут приносить доход, а не просто сгорать.
    Ответ написан