Pull to refresh
45
0
Артём Курапов @tot_ra

Пользователь

Send message

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

Reading time 11 min
Views 6.5K

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

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

Читать далее
Total votes 11: ↑10 and ↓1 +9
Comments 3

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

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

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

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

Читать дальше →
Total votes 27: ↑25 and ↓2 +23
Comments 30

Гуглобаг

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

image
Total votes 21: ↑7 and ↓14 -7
Comments 15

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

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

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

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

Пишем Facebook приложение

Reading time 4 min
Views 1K
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.



Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Comments 4

Транзакции InnoDB

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

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


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

Читать дальше →
Total votes 13: ↑12 and ↓1 +11
Comments 2

Диа(в)логи от bloggingheads.tv

Reading time 1 min
Views 591

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

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

Оригинал
Total votes 3: ↑2 and ↓1 +1
Comments 1

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

Reading time 1 min
Views 492
Я думаю самая главная ошибка — между креслом и клавиатурой, но если разбирать больше чем «не заметил» и предположить что новички не совсем знают о критических ошибках которые могут вызвать серъёзные последствия типа потери данных, вызова инородного кода, недоступность сервиса или кражи данных, то чёрный список выстроится следующим образом:
  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. Валидация на стороне клиента но не на стороне сервера
Читать дальше →
Total votes 22: ↑16 and ↓6 +10
Comments 18

Пишем Flex приложение с BlazeDS, Jboss и JMS

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

Читать дальше →
Total votes 13: ↑10 and ↓3 +7
Comments 5

Об информационной войне

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

Читать дальше →
Total votes 22: ↑15 and ↓7 +8
Comments 5

Пространство имён в php 5.3 и php 6

Reading time 2 min
Views 6.2K
Пространство имён (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;

Читать дальше →
Total votes 38: ↑33 and ↓5 +28
Comments 78

Кэширование js сжатием gzip

Reading time 2 min
Views 4K
Cache — временные данные или устройство по их хранению, созданные для ускорения чтения/записи. Все программисты это знают. Ускорение загрузки web-сайтов тема обширная, начинающаяся с сервера и заканчивающаяся клиентом. К сожалению я не нашёл более-менее подходящих решений по объединению и кэшированию js-кода, поэтому к своему блогу я написал свою схему, о которой вкратце и расскажу..
Существует сжатие «packer», которое убирает все символы форматирования и переименовывает имена функций и переменных в js и предоставляет т.н. minified-версию скрипта. Все с этим прекрасно знакомы на примере больших библиотек jQuery, TinyMCE, prototype. Кроме того что код становится совершенно не читаемым, это может вызвать неработоспособность кода, когда имена переменных динамические.
Моя идея простая — разделять js/css по файлам разработчикам надо для поддержания модульной структуры. Обычно я в контроллере создаю список файлов которые надо присоединить к данному документу, вместо того что-бы прописывать это вручную в темплейте. Но теперь надо сделать так, что-бы до показа темплейта вызывалась функция кэширования, которая проходилась бы по списку, проверяла из них локальные файлы на время изменения, объединяла в один файл и создавала или перезаписывала gz-файл с именем, сформированным из md5-хэша имён входящих файлов.
Всё просто и в сумме заняло часа 4 на раздумье. Привожу метод cache_js из класса Controller.
Читать дальше →
Total votes 28: ↑24 and ↓4 +20
Comments 29

MySQL rownum

Reading time 1 min
Views 3.1K

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


Есть таблица меню в БД с полем порядка 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;



Оригинал
Total votes 9: ↑9 and ↓0 +9
Comments 1

Десять забытых тэгов

Reading time 2 min
Views 556
Тэги как кирпичи всякого документа основанного на 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.

Читать дальше →
Total votes 37: ↑32 and ↓5 +27
Comments 35

Редакторы кода с помощью javascript

Reading time 2 min
Views 1.3K
Очень часто в web-проектах надо использовать визуальный редактор кода (richtext code editor), похожий на существующие IDE, с номерами строк и подсветкой кода. Наиболее часто он используется в редактировании исходного кода статьи или шаблонов в админке. В этой статье я перечислю существующие скрипты по аналогии со списком WYSIWYG-редакторов.
Практически все существующие визуальные редакторы создают iframe и генерируют внутри страницу в соответсвии с данными javascript-объекта, занимающимся всеми задачами по генерации кода и обработке клавиш.
Основанные на iframe:
  • EditArea — наиболее популярный редактор благодаря табуляции, gzip, совместимость пространства имён с другими библиотеками
  • CodePress — парсит SQL, Perl, C#, XSL, ASP, VBscript. Отдельные движки для разных браузеров (gecko=firefox, ie, opera). Создаётся iframe со внутренним CodePress'объектом с обращением через contentWindow. Сразу внутри скрипта идёт поиск textarea-элементов по классу, так что с динамическими ajax-редакторами прийдётся изменять скрипт. Кроме того нумерация (до 1500) строк сделана при помощи одной картинки
  • CodeMirror — парсит JS, HTML, CSS

Напомню что iframe не соответсвует XHTML спецификации, а с использовать
предложенный тэг object с не сильно получится, из-за ограничения на
доступ внутренних dom-элементов (поправьте если я неправ).
Основанные на div'ах
  • MDK-editor — самый нормальный редактор, есть контекстное меню. В минусы можно отнести некрасивый скин, небольшую тормознутость и неизвестную лицензию на использование.
  • Helene — вместо iframe используется фоновый div и динамически позиционируемая textarea поверх. Поскольку изменяется только один ряд, то невозможно выделить нескольких строк сразу
  • 9ne — похож на консоль, но нет возможности выделения всей строки Shift+End. Эмулирует каретку мигающим div'ом.

PS. Аннонсирую что в скором времени выйдет блог-движок моего производства…

Оригинал
Total votes 17: ↑16 and ↓1 +15
Comments 7
1

Information

Rating
Does not participate
Location
Таллин, Эстония, Эстония
Registered
Activity