web-development

Начнем с того, как НЕЛЬЗЯ. Увы, так часто поступают верстальщики и сильно ухудшают ситуацию, так как очень многие письма при этом не доходят и об этом Вы не узнаете. Ведь они даже не то что в спам могут не свалиться, а просто быть отброшены почтовиком еще до перемещения в почту.

Почему так делать нельзя?

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

  • Ваш сервер, с которого будет отправка сайта не адаптирован под отправку, не будет нужных заголовков
  • IP не прогрет
  • Ваш домен или IP хостинга легко может находиться в черном списке и вы даже не будете знать об этом
  • Еще куча причин вдаваться в которые нет предмет этого материала.

Если вы не получаете письмо, с большой долей вероятности вы теряете клиента, а значит такой код просто недопустим.

А как нужно делать?

А вот теперь о том как нужно: ...

Я начинал верстать когда flexbox-ом еще никто не верстал даже близко и везде использовалось позиционирование с помощью float-ов. Сейчас конечно в большей степени использую флексбоксы и надеюсь что вскоре все-таки поддержка Grid CSS достигнет максимума, выжду небольшой момент устаревания старых браузеров и возьму его на вооружение. Стоит всего-лишь еще немного подождать, когда доля обновленных браузеров будет достаточно высокой. А пока тем кто изучает верстку стоит ознакомиться что к чему.

Второе видео CSS Grid:


Оба канала наполнены большим количеством качественного контента и стоят рассмотрения.
Типичный Верстальщик
Web Developer Blog

Я уже несколько лет использую cloudflare.com во многих проектах с которыми работаю. И на это действительно есть причины. Некоторые из них я уже упоминал в материале про инструменты которыми я пользуюсь.. Тем не менее, стоит еще раз пройтись по моментам, которые клаудфлер помогает решить.

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

CDN(Content Delivery Network) - система доставки контента. Позволяет пользователям с разных стран получать статические файлы(скрипты, картинки, стили) быстро, не зависимо где находиться ваш сервер/сайт и сам его посетитель(клиент). Тем же самым снимает нагрузку с сервера/хостинга кешируя эти файлы у себя.

Защита - используя запросы DNS и проксируя трафик через себя клаудфлер пропускает трафик через себя не показывая реальный IP вашего сервера/хостинга. Конечно если делать запросы напрямую по IP, вместо доступа через доменное имя...

Постепенно расширяя свой опыт и знаний сталкиваешься с пониманием того, что логи постоянно проверять не будешь, да и не удобно это делать через ту же консоль, но что несут сами ошибки:

  • Потенциальную потерю клиентов если не устранить ошибку
  • Потеря репутации проекта/компании, так как ошибки никто не любит
  • Увеличивает вероятность взлома проекта и даже других проектов на том же сервере, со всеми вытекающими
  • Множество других проблем

И именно по этой причине приходишь к тому чтобы использовать какое-то онлайн-хранилище для сохранения логов.

Можно заморочиться и поставить...

Попалось следующее интересное видео, о том как установить и настроить подсистему Linux внутри вашей Windows. Так же настроить ее так, чтобы легко использовать эту подсистему прямо из винды. Да и работать это будет быстрее чем через виртуалку на расшареных директориях. Есть только пару Но..., которые в случае использования Homestead мне нравятся больше:
  • Вы можете легко переносить свою рабочую среду копируя образ виртуалки между машинами. Вы можете даже винду перебить, а сохраненные файлы виртуалки у вас легко и просто заработают, просто поднимите вы софт который их запускает.
  • Уже настроенное окружение сервера и под разработку в том же Homestead, чем пилить свое в подсистеме. Да, вероятно у многих есть в мыслях настроить "свое" и "более удобное" окружение для разработки заточив под себя. Но тоже самое вы можете сделать и в хостеде.

Единственным большим минусом хостеда является потеря производительности, она достаточно значительна на серьезных проектах и это действительно существенный минус.

Итак, видео:

С чего начать обучение в IT? Меня часто об этом спрашивают. При этом зачастую это не поступающие в ВУЗы люди, а чаще всего уже работающие в какой-либо другой сфере. Но ответит на вопросы и тех, и других. Все что описано ниже взято из моего опыта работы в этой сфере, в целом больше 10-ти лет и веб-разработчика конкретно не менее 5+ лет.

Начинать нужно с вопроса о том, кем хочешь быть. Но, до этого нужно понять кто есть кто...

Есть такой, довольно известный, блогер и программист Хауди Хо. Я так же подписан на него и просматриваю его видео, так как темы он поднимает интересные и даже иногда полезные. Считаю его канал полезным и стоящим к просмотру и наблюдению. Но вот, видать от скуки и недостатка материала решил он поднять волну хайпа о супер-софте на ПК. Да вот только 99% того софта что он указывает - не полезные, а просто плюшки для повышения красивостей, которые на практике использовать не то что не получиться, они просто будут мешать. А работаю я в сфере разработке, в целом не менее 6-ти лет, так что есть на что опираться.

У меня...

Когда на моей прошлой работе нагрузка на меня достигла пика, я понял что нужно что-то решать. Решить сложные ситуации в разработке помогают часто несколько моментов:

  • Увеличить количество ресурсов которыми оперируешь в работе(стоки, стили, темы и т.д.)
  • Улучшить и расширить инструментарий
  • Сократить лишнюю нагрузку
  • Улучшить ментальное состояние за счет определенных техник. Разгрузить мозг

И вот подумав о тех техниках что я применяю время от времени и инструментах которые я использую решил что лучшим вариантом является как-раз таки гибридная система. Инструменты которые помогают работать и разгружают мозг, позволяют решить ментальные ловушки. Зная о том как много людей страдают подобными сложностями, будь то менеджеры или разработчики, дизайнеры или кто-либо еще, решил систему сделать публичной и совершенствовать по мере возможности.

Ну вот, 3-я часть материалов по полезным сервисам и инструментам. Уверен, даже после окончания текущей части мне все еще будет что рассказать по инструментам, но на сегодня я закончу на текущей. Прошлые две части:

Windows 10 Pro лицензия - знаю как многие любят халяву, да, я тоже ей пользовался в виду того что лицензия стоит не дешево. Но если заниматься разработкой достаточно профессионально то система обрастает софтом и настройками на столько, что переустановка системы становиться реальной головной болью. Да, я очень не плохо работаю с Linux-ами на серверах, на десктопе я использовал его в течении многих лет как основную ось. В качестве дистрибутива предпочитаю Debial GNU\Linux. Но... Есть некоторый софт, который приходиться использовать для парсинга и работы с графикой которому нету замены под никсами. На некоторых сайтах можно найти официальные ключи на про всего за 14.у.е. что несравнимо меньше чем обычная лицензия. Стоит ли говорить что на корпоративной, крякнутой, или даже на ултимейт винде у вас могут возникнуть проблемы с некоторым софтом таким как докер из-за ограниченной поддержки виртуализации на данных сборках. Стоит ли говорить что автоматические обновления...

В продолжении первой части, в текущей статье я добавлю еще несколько программ и сервисов которые я использую в работе. Каждый из них проверен в бою и занял уверенную позицию в моем списке полезных и важных инструментов.

Сервис сжатия картинок - это один из лучших сайтов для сжатия картинок используемых как элементами сайта, так и в содержимом. Да и даже чтобы поставить картинку просто на...

В последнее время задач по разным проектам очень много. По основной работе тем более. Но все эти задачи даже близко нельзя было бы потянуть если бы не некоторые удобные и качественные инструменты. Да, конечно, некоторые стоят достаточно не мало для обычного веб-разработчика, другие же в некоторой степени "излишни", но не для меня.

Итак, для веб-разработки я использую:

PHPStorm - IDE для веб-разработки самых разных форматов и масштабов проектов. Стоит ли говорить что конкуренты даже близко не приблизились к этой IDE? Я когда-то тоже участвовал в холиварах Emacs VS VIM, но...

Проектов у меня достаточно много, но некоторые заслуживают дополнительного внимания. Хочу представить тебе, читатель:

Lavpak.com.ua - подарки с любовью!

Этот проект мы начали командой из трех человек, каждый специалист своего дела. Нашей целью является сделать максимально удобный, интересный и удобный для покупателей сервис. Мы развиваем, дополняем и улучшаем его каждый день.

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

Итак, в этом материале мы возьмем тему из прошлой моей статьи:
Скачать Тему
В ней будут все необходимые нам файлы.
И следуем по шагам.

За основу я взял этот материал, но и разница в подаче материала будет. Вы можете смотреть и здесь, и там. Будет только лучше.

Итак, поехали...

Themeforest theme

Хех... Шутка, с первого раза получил hard reject. Но я в курсе что это обычное явление, а значит старт положен.

«Если бы у меня было восемь часов для того, чтобы срубить дерево, я бы шесть часов потратил на заточку моего топора». Авраам Линкольн. Президент США, в молодости лесоруб.

Введение

Я не дизайнер, и не верстальщик. В целом я ближе к Backend-девелоперу и системному администратору разом. Но, в жизни нужно попробовать многое. И вот, после того как я накидал очередной прототип на bootstrap 4, я понял что ни моих навыков верстки, ни навыков дизайна не хватает. А значит нужно набирать. Благо интернет полон информации и вооружившись ею, я погнал ваять.

Точить топор...

Еще до дизайна, я начал с изучения что есть Gulp...

Расширяем Chrome/Chromium

Часто по работе приходиться вкручивать всякого разного. В данном случае понадобилось делать расширение для хрома и собирать информацию по кусочкам.
Не могу не упомянуть хороший блог посвященный расширениям для хрома.
В этом материале я расскажу об основах но чуть больше чем многие введения.
Если вы попали на мой материал то скорее всего уже видели что само расширение состоит из нескольких базовых файлов:
  1. icon.png - иконка расширения
Пропустил я их в свое время и многие методы освоил по кускам из разных материалов =) а тут все скопом. Берем и проходим. Каждое видео минуты 2-3 длиться, потом простенькая задачка. Все удобно. Но на английском, если кто не понимает английский - печаль.

Ссыль на туториал: http://discover-devtools.codeschool.com/
Лаборатория хакера Книга дает практический упор на взлом и поиск уже существующих для софта уязвимостей, применения эксплоитов и нескольких методов взлома. Не сказал бы что ожидал от книги чего-то сверхестественного, ведь там где крутятся большие деньги никто не будет светить рецептами на миллион. В общем, для введения в хакинг книга очень практична. Книга понравилась, но теперь хочется чего-то более углубленного.
Вот как все просто:
postresql=> \o /путь/к/файлу.txt
postresql=> postgresql query ( запрос к базе )
postresql=> \o ( возвращаем стандартный вывод )
Все.
Публикую скорее как памятку самому себе и всем кому может помочь.
Задача тривиальная, импортировать файл-дамп базы данных PostgreSQL в Windows.
1) Запускаем pgAdmin III
2) Plugins->PSQL Console
3) Создаем базу данных командой create database mydbname;
4) Создаем пользователя. Так как это Windows, в котором я занимаюсь лишь разработкой то пользователь будет иметь все права на публичную схему.
create user myuser with password 'somepassword';
grant all privileges on all tables in schema public to myuser;
5) Загружаем дамп базы данных командой из консоли Windows:
"C:\Program Files\PostgreSQL\9.5\bin\psql.exe" mydbname myuser < E:\somedump.sql


После этого в консоли будет вывод импорта базы данных. На этом все.
PHP обьекты, шаблоны и методики программирования.  Мэтт Зандстра Сложно взять и оценить то все что дает такая книга веб-разработчику... Методологию разработки, схемы, подсказки, инструменты. Сейчас достаточно много книг которые помогу подняться на уровень junior, их не тяжело узнать, все они называются подобно "как создать сайт с помощью PHP+MySQL" и т.д. Эта же книга уровнем выше. Рассмотрение ООП, шаблоны проектирования, систем контроля версий, юнит-тестов(то что я для себя считал тратой времени), развертывания приложения, сервер непрерывной интеграции(НИ). Все это значительно выше уровнем чем просто создать сайтик. Для тех кто создает или собирается создавать проекты средней и высокой сложности, такую книгу стоит взять на вооружение. Периодами книга была достаточно тяжелой, и начинающим явно не подойдет, но столько информации для уровня middle и senior... Must Have.
Моя личная оценка книге 5+. Автору огромное спасибо за труд. P.S. Пошел настраивать сервер НИ...
Наверное все веб-разработчики знают как PageSpeed Insights относиться к подгрузке CSS и JS файлов в верху страницы. Не становятся исключением в этом плане и шрифты самого Google: Google Fonts. А используются они достаточно часто. Но и на этот случай у гугла есть решение. Нужно всего-лишь подключить специальный лоадер для шрифтов. Подключаем таким образом:
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js"></script>
    <script>
        WebFont.load({
            google: {
                families: ['Open+Sans:400,300,600,700,800:latin,cyrillic,cyrillic-ext']
            }
        });
    </script>
В families как не трудно догадаться мы и прописываем шрифт и его настройки. Все. Более подробно можно ознакомиться тут. Разработчики заявляют о поддержке разными браузерами и подгрузке шрифтов с Google Fonts, Typekit, Fonts.com и Fontdeck. А соразработчиками выступают Google и Typekit.
nofollow link Небольшая функция, прогнав через которую текст на выходе получаем закрытыми атрибутом rel="nofollow" все ссылки кроме внутренних...
Как применять HTML5 теги Вот такой перевод небольшой и вольный сделал. Ссылка
chrome расширения Стала небольшая задача выполнять по клику на кнопку определенную функцию на странице. Вроде все бы ничего, да вот общение между расширением и самой страницей происходит достаточно изолированно, с весьма ограниченными механизмами обмена. Так, чтобы выполнить свой скрипт на странице расширение должно вставить свой скрипт на страницу. В тоже время чтобы его выполнить придется использовать обмен сообщениями и события.

Теперь немного более приземленно.
Создаем папку с расширением, например myclickbtn
В ней создаем файл manifest.json, ...
После обновления Windows на 10 версию PHPStorm не смог запустить терминал. В решении помогает гугл давая ссылку.
Решение сводиться к запуску обычного терминала, клику по управляющей окном панели правой кнопкой мыши и выбора Properties(Свойства).
windows terminal
Внизу ставим галочку на "Use legacy console"(Использовать прежнюю версию консоли)
Использовать прежнюю версию консоли
ОК.
После переходим в PHPStorm и запускаем новый терминал. Все.
youtube image У нас есть текст фрейма поделиться, но нужно получить картинку превью.
Для этого нам нужно выпарсить ID видео и подставить в нужную ссылку:
Youtube генерирует несколько таких ссылок: http://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg http://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg http://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg http://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg Что соответствует размерам и аналогично ссылкам в том же порядке: По умолчанию: http://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg Для картинок в высоком качестве: http://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg Среднее качество: http://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg Стандартный размер картинки: http://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg Максимальный размер картинки: http://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg Просто выбираем подходящую ссылку.
Я парсил из кода следующей регуляркой:
//кусок кода выбирающий превью для ютуба
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $this->body, $matches);
            //preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&"'>]+)/", $this->body, $matches);
            if (!empty($matches[1])) $vid_id = $matches[1];
            if (!empty($vid_id)) return "http://img.youtube.com/vi/".$vid_id."/0.jpg";

Такой код вернет нам ссылку с подставленным айди видео, что нам и требовалось.
Может кому пригодиться. Код найден где-то на stackoverflow. Если у ссылки путь начинается с hash(#), то при клике код скролит страницу к нужному элементу на странице.
$(function() {
    $("a[href*='#']:not([href='#'])").click(
        function()
        {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname)
        {
            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
            if (target.length)
            {
                $('html,body').animate({
                    scrollTop: target.offset().top
                }, 1000);
                return false;
            }
        }});
    });
Нужна была возможность добавлять новый элемент в список если такого элемента у нас еще не было, благо select2 предусматривает подобную возможность. Загвоздка заключалась только в том что мы использовали список с числовыми id как значение и брался из базы данных. Имеем классическую конструкцию из трех таблиц:
материал(id, ..., ..., ...); теги(id,...,...,...); материал_тег(id_material, id_tag);
Так вот, сам select2 мы используем так:
<select id="multiple" class="form-control select2-multiple" multiple name="tags[]"  >
                                {foreach $labels as $label}
                                    <option value="{$label->id}" {if !empty($exists.{$label->id})}selected{/if} >{$label->title}</option>
                                {/foreach}
                            </select>
<script>

    $(document).ready(function () {

        $("#multiple").select2({
            placeholder: "Select or add tags",
            tags: true,
            tokenSeparators: [",", " "],
            createSearchChoice:function(term, data) {
                if ( $(data).filter( function() {
                            return this.text.localeCompare(term)===0;
                        }).length===0)
                {
                    return { id: term, text:term };
                }
            }
        });
</script>
На стороне сервера я использую фреймворк Laravel 5 и в контроллере использую такую часть кода:
//...
//материал
$record = Linkedin_GroupLabel::find($id);
//...
//Сбрасываем связи с тегами
                        $record->tags()->detach();
                        $rtags  = array();
                        foreach ($request->input('tags') as $tag){
//если значение элемента селекта число, значит это id
                            if (is_numeric($tag)){
                                $rtags[] = $tag;
                            }
                            else //в противном случае это новое значение
                            {
                                $new = Linkedin_Label::where('title','=',trim($tag))->first();
                                if (empty($new->id)){
                                    $new = new Linkedin_Label();
                                }
                                $new->title = trim($tag);
                                $new->save();
                                $rtags[] = $new->id;
                            }
                        }
//аттачим айдишники между записями
                        $record->tags()->attach($rtags);

Единственное НО при таком, записи тегов не должны быть только числом, иначе is_numeric подумает что добавлен айдишник, а не новый тег. Очень вероятно что у кого-то есть вариант получше, но данный случай для меня работает.
Пришлось все вот это чудо поднимать, так как нужно делать серверную и клиентскую часть под одну задачу. Искренне не понимаю тех веб-девелоперов которые работают веб-разработкой под Windows )) ну да ладно, это их личное дело.

Итак, проблема следующая:
Windows 7+Apache2.4+PostgreSQL+Laravel = PDO Exception: driver not found
При этом команда:
php -m
Показывает что как pgsql так и pdo_pgsql есть, но Laravel 5 уверенно доказывает обратное. При этом в php.ini:
extension=php_pdo_pgsql.dll
extension=php_pgsql.dll
раскомментированны.

Но вот команда:
php -a
Вызывающая интерактивную консоль php, так же сообщает:
Unable to load dynamic library `D:\WebServer\php\ext\php_pgsql.dll` - тут вместо сообщения какая-то каша, но явно что-то не в порядке.

Оказалось, не хватает dll для данных расширений.

Нужны библиотеки:


libpq.dll, libiconv-2.dll и libintl-8.dll Взять их можно в установленном PostgreSQL, в папке:
C:\Program Files\PostgreSQL\9.4\bin\
вместо 9.4 может быть ваша версия.
Копируем их в:
apache\bin\

Вместо libiconv-2.dll у меня лежала iconv.dll, на всякий случай скинул как есть, так и копию переименованную в libiconv-2.dll
Перезапускаем apache и видим что Laravel 5 на эту проблему больше не ругается.
В один прекрасный момент заметил что до этого работающий парсер начал вместо нормального текста показывать крокодилов. Недолгие поиски привели к решению:
<?php
$url = file_get_contents('your-xml-file.xml');
//именно эти строчки и выравнивают всю кривость кодировки
$url = mb_convert_encoding($url, 'utf-8', mb_detect_encoding($string));
$url = mb_convert_encoding($url, 'html-entities', 'utf-8');
$dom = new DOMDocument();
$dom->loadHTML($url);
$page_content = $dom->saveHTML();
Все.

Задача:

Выводить собственную страницу 404

Решение:

Открываем файл app/Exceptions/Handler.php и немного меняем код функции render:
//...
public function render($request, Exception $e)
{
//customize 404 page
if ($this->isHttpException($e)) {

$statusCode = $e->getStatusCode();

switch ($statusCode) {
case '404':
//путь к файлу с HTML разметкой
return response()->view('front/notfound');
}
}
return parent::render($request, $e);
}
//...
Вот собственно и все. Нашел как-то на страницах интернета, ссылку на источник не помню.

Задача создавать Sitemap.xml по крону.

Как и говорит нам документация по Laravel 5. В нем уже есть готовый планировщик, достаточно добавить его один раз в крон, а все нужные задачи подключать уже в него. Создаем задачи для планировщика
#php artisan make:console XMLSitemap
Console command created successfully.
Новый файл будет создан по пути...

Задача

Если в конце ссылки присутствует символ "/" делать редирект 301 на страницу без него самого.
Задача типичная, значит решение найти не сложно
Итак, создаем Middleware:
#php artisan make:middleware RedirectTrailingSlash
Middleware created successfully.
Заполняем наш файл (app/Middleware/RedirectTrailingSlash.php) соответствующим кодом:
<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;

class RedirectTrailingSlash {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (preg_match('/.+\/$/', $request->getRequestUri()))
{
//в исходном коде использовалась другая функция редиректа, выбивало ошибку
return redirect(rtrim($request->getRequestUri(), '/'), 301);
}
return $next($request);
}
}

Регистрируем наш Middleware в Http/Kernel.php:
'front.trailingslash'=>'App\Http\Middleware\RedirectTrailingSlash',

Используем. Я использовал его в конструкторе базового контроллера, чтобы все наследующие контроллеры его выполняли:
//...
class BaseController extends Controller {

//...
public function __construct()
{
$this->middleware('front.trailingslash');
//...
}
//...
}

Все. Теперь при переходе на ссылку вида /our/url/ нас перешлет на /our/url
CKEditor Нужно мне к очередному проекту прикрутить CKEditor + простой загрузчик файлов. Использовать внешний загрузчик не вижу смысла, а тот интерфейс который предоставляет нам CKEditor для загрузки файлов нам вполне годиться. Сам проект использует базовый фреймворк Laravel 5.
Создаем контроллер для загрузки файлов, выполнив команду из консоли:
Получил ошибку в MySQL/MariaDB:
Table 'sources_template_fields_value' doesn't exist in engine

До этого переносил базу файлами, просто скопировав /var/lib/mysql

Чтобы починить нужно для нужной таблицы выполнить следующие команды:
alter table sources_template_fields_value discard tablespace;
alter table sources_template_fields_value import tablespace;

После этого табличка снова в строю.
Там где обычная логика не действует, действует какая-то сказочная. Вот так и в этом случае, неожиданно, в сложном запросе с подзапросом нужно выбрать сумму товаров всех, и отнять сумму товаров с определенной категории.
select (sum(total_price)-(select sum(z_sum) from user_orders where user_id=4  and zennobox=1 and status=2)) as sum from user_orders where user_id=4;


И тут так получилось что все время на тестовый запрос я получал NULL. Начал проверять и оказалось что число-NULL = NULL. Печально, когда даже не догадываешься о таком. Но решение тут простое, добавляем функцию ifnull(value,default):
select (sum(total_price)-ifnull((select sum(z_sum) from user_orders where user_id=4  and zennobox=1 and status=2),0)) as sum from user_orders where user_id=4;


Получаем то что нужно. Очередная мелочь, которая привносит небольшие приключения в нашу жизнь.
Собственно для тех кто не знает что такое PhantomJS, вещает хабр:
PhantomJS это все плюшки WebKit из консоли с управлением на JS и поддержкой различных стандартов и технологий: DOM, CSS, JSON, Canvas и SVG.

Прикручивают его для разных целей, для тестирования, парсинга и для любой другой автоматизации связанной с загрузкой страниц, особенно с поддержкой JavaScript.

CasperJS - это надстройка над PhantomJS позволяющая более удобно его использовать. Добавляется сохранение скриншота части страниц, более удобная работа со страницей и другие плюшки.

Стала задача для сайта все-таки подключить свой домен и перенести комментарии на него. Решается все просто. В контакте, внизу страницы, переходим по ссылке "Разработчикам", переключаемся на "Мои приложения", напротив нужного нам нажимаем "Редактировать"->"Настройки".
Смотрим поле "Базовый домен" и добавляем новый.

Вот и вся проблема.
На любопытную страничку наткнулся на просторах интернета. А искал я сравнение производительности XMLHttpRequest с jQuery get и post. И в общем-то на страничке можно провести сразу тест для конкретной своего браузера и посмотреть результаты других.

И получилось у меня что xhr3 всех быстрее, ну и раза в два быстрее jQuery методов. Оно в принципе и не удивило бы ни кого, скорее удивило бы обратное. Но все же интереснее смотреть на цифры.

P.S. К сожалению время от времени сайт не доступен, хотел картинку сюда вставить, но увы. Пробуйте, время от времени он все же работает.

Страницы