Новый сервис Dropbox: диалог выбора файлов Dropbox Chooser с поиском и галереей для встраивания в веб-приложения

image

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

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

Чтобы воспользоваться новым сервисом, пользователи сначала должны зарегистрироваться и создать приложение на странице «My apps». Как только приложения созданы (и приложение стороннего разработчика зарегистрировано), разработчик может встраивать кнопку или JavaScript.

Для тех, кто пользуется дропбоксом, новый функционал действительно удобен.

Больше информации: официальный блог, programmable web

ссылка на оригинал статьи http://habrahabr.ru/post/160917/

Применение принципа DRY в RSpec

DRY(Don’t Repeat Yourself) — один из краеугольных принципов современной разработки, а особенно в среде ruby-программистов. Но если при написании обычного кода повторяющиеся фрагменты обычно легко можно сгруппировать в методы или отдельные модули, то при написании тестов, где повторяющегося кода порой еще больше, это сделать не всегда просто. В данной статье содержится небольшой обзор средств решения подобных проблем при использовании BDD-фреймворка RSpec.

1. Shared Examples

Самый известный и часто используемый метод создания многократно используемого кода для Rspec. Отлично подходит для тестирования наследования классов и включений модулей.

shared_examples "coolable" do   let(:target){described_class.new}    it "should make cool" do     target.make_cool     target.should be_cool   end end  describe User do   it_should_behave_like "coolable" end 

Кроме того Shared Example Groups обладают и некоторым дополнительным функционалом, что делает их гораздо более гибкими в использовании: передача параметров, передача блока и использование let в родительской группе для определения методов.

shared_examples "coolable" do |target_name|   it "should make #{ target_name } cool" do     target.make_cool     target.should be_cool   end end  describe User do   it_should_behave_like "coolable", "target user" do     let(:target){User.new}   end end 

Подробнее о том, где и как будут доступны определенные методы, можно прочитать у Дэвида Челимски[2].

2. Shared Contexts

Данная фича несколько малоизвестна в силу своей относительной новизны(появилась в RSpec 2.6) и узкой области применения. Наиболее подходящей ситуацией для использования shared contexts является наличие нескольких спеков, для которых нужны одинаковые начальные значения или завершающие действия, обычно задаваемые в блоках before и after. На это намекает и документация:

shared_context "shared stuff", :a => :b do   before { @some_var = :some_value }   def shared_method     "it works"   end   let(:shared_let) { {'arbitrary' => 'object'} }   subject do     'this is the subject'   end end 

Очень удобной вещью в shared_context является возможность их включения по метаинформации, заданной в блоке describe:

shared_context "shared with somevar", :need_values => 'some_var' do   before { @some_var = :some_value } end  describe "need som_var", :need_values => 'some_var' do   it “should have som_var” do     @some_var.should_not be_nil   end end 

3. Фабрики объектов

Еще один простой, но очень важный пункт.

@user = User.create(   :email => ‘example@example.com’,   :login => ‘login1’,   :password => ‘password’,   :status => 1,   … ) 

Вместо многократного написания подобных конструкций следует использовать гем factory_girl или его аналоги. Преимущества очевидны: уменьшается объем кода и не нужно переписывать все спеки, если вы решили поменять status на status_code.

4. Собственные матчеры

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

it “should make user cool” do   make_cool(user)   user.coolness.should > 100   user.rating.should > 10   user.cool_things.count.should == 1 end 

После:

RSpec::Matchers.define :be_cool do   match do |actual|            actual.coolness.should > 100 && actual.rating.should > 10 && actual.cool_things.count.should == 1   end end  it “should make user cool” do   make_cool(user)   user.should be_cool end 

Согласитесь, стало в разы лучше.
RSpec позволяет задавать сообщения об ошибках для собственных матчеров, выводить описания и выполнять чейнинг, что делает матчеры гибкими настолько, что они просто ничем не отличаются от встроенных. Для осознания всей их мощи, предлагаю следующий пример[1]:

RSpec::Matchers.define :have_errors_on do |attribute|   chain :with_message do |message|     @message = message   end   match do |model|     model.valid?     @has_errors = model.errors.key?(attribute)     if @message       @has_errors && model.errors[attribute].include?(@message)     else       @has_errors     end   end   failure_message_for_should do |model|     if @message       "Validation errors #{model.errors[attribute].inspect} should include #{@message.inspect}"     else       "#{model.class} should have errors on attribute #{attribute.inspect}"     end   end   failure_message_for_should_not do |model|     "#{model.class} should not have an error on attribute #{attribute.inspect}"   end end 

5. Однострочники

RSpec предоставляет возможность использования однострочного синтаксиса при написании простых спеков.

Пример из реального opensource-проекта(kaminari):

context 'page 1' do   subject { User.page 1 }     it { should be_a Mongoid::Criteria }     its(:current_page) { should == 1 }     its(:limit_value) { should == 25 }     its(:total_pages) { should == 2 }     it { should skip(0) }   end end 

Явно гораздо лучше, чем:

context 'page 1' do   before :each do     @page = User.page 1   end           it  “should be a Mongoid criteria” do     @page.should be_a Mongoid::Criteria   end    it “should have current page set to 1” do     @page.current_page.should == 1   end    ….   #etc 

6. Динамически создаваемые спеки

Ключевым моментом здесь является то, что конструкция it (как впрочем и context и describe) является всего лишь методом, принимающим блок кода в качестве последнего аргумента. Поэтому их можно вызывать и в циклах, и в условиях, и даже составлять подобные конструкции:

it(it("should process +"){(2+3).should == 5}) do   (3-2).should == 1 end 

Оба спека кстати проходят успешно, но страшно даже подумать, где такое можно применить, в отличие от тех же циклов и итераторов. Пример из той же Kaminari:

[User, Admin, GemDefinedModel].each do |model_class|   context "for #{model_class}" do     describe '#page' do       context 'page 1' do         subject { model_class.page 1 }           it_should_behave_like 'the first page'         end        …      end   end end 

Или же пример с условиями:

if Mongoid::VERSION =~ /^3/   its(:selector) { should == {'salary' => 1} } else   its(:selector) { should == {:salary => 1} } end 

7. Макросы

В 2010 году, после введения нового функционала shared examples, Дэвид Челимски заявил, что макросы больше не нужны. Однако если вы все же считаете, что это наиболее подходящий способ улучшить код ваших спеков, вы можете создать их примерно так:

module SumMacro   def it_should_process_sum(s1, s2, result)     it "should process sum of #{s1} and #{s2}" do       (s1+s2).should == result     end   end end  describe "sum" do   extend SumMacro    it_should_process_sum 2, 3, 5 end 

Более подробно останавливаться на этом пункте смысла не вижу, но если вам захочется, то можно почитать [4].

8. Let и Subject

Конструкции let и subject нужны для инициализации исходных значений перед выполнением спеков. Конечно все и так в курсе, что писать так в каждом спеке:

it “should do something” do   user = User.new   … end 

совсем не здорово, но обычно все пихают этот код в before:

before :each do   @user = user.new end 

хотя следовало бь для этого использовать subject. И если раньше subject был исключительно “безымянным”, то теперь его можно использовать и в явном виде, задавая имя определяемой переменной:

describe "number" do   subject(:number){ 5 }    it "should eql 5" do     number.should == 5   end end 

Let схож с subject’ом, но используется для объявления методов.

Дополнительные ссылки

1. Custom RSpec-2 Matchers
solnic.eu/2011/01/14/custom-rspec-2-matchers.html
2. David Chelimsky — Specifying mixins with shared example groups in RSpec-2
blog.davidchelimsky.net/2010/11/07/specifying-mixins-with-shared-example-groups-in-rspec-2/
3. Ben Scheirman — Dry Up Your Rspec Files With Subject & Let Blocks
benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks
4. Ben Mabey — Writing Macros in RSpec
benmabey.com/2008/06/08/writing-macros-in-rspec.html

А в заключение могу только сказать могу только сказать — старайтесь меньше повторяться.

ссылка на оригинал статьи http://habrahabr.ru/post/160915/

О скраме, фокус-факторе и плюшках

Навеяно очередной прочитанной книгой по управлению проектами. Это «Scrum и XP: заметки с передовой» Хенрика Книберга.

Скрам – это круто и красиво. Особенно красиво (и, на мой взгляд, реально применимо только в этом случае), когда решены все инфраструктурные проблемы, когда усилия всей компании (а не только скрам-команды) направлены на выпуск качественного продукта вовремя и когда задача программистов – именно разрабатывать ПО (т. е. никто не будет выдёргивать разработчика «из потока» для выполнения фантастически несвойственных ему задач).

Одна из фраз из книги Книберга: «В качестве значения по умолчанию фокус-фактора для новых команд мы обычно используем 70 %». Под «фокус-фактором» понимается некий коэффициент, отражающий отношение производительности существующей команды к производительности «идеальной» команды программистов. А как насчет программистов, которым постоянно приходится отвлекаться на решение хозяйственных проблем, техподдержку (ввиду страшной недоукомплектованности из-за экономии хозяйственного и суппортерского отделов) и прочие ужасно снижающие фокус-фактор проблемы?

В другой книге («Человеческий фактор…» Тома Демарко и Тимоти Листера) написано, что в идеальном рабочем помещении для программиста должно быть по окну на каждого сотрудника (чтобы он мог более вдохновенно заниматься разработкой и потому, что мы работаем, чтобы жить, а вовсе не наоборот). А как насчёт комнат на 10-20 человек с двумя окнами каждая (выходящими на промпейзаж, куда и смотреть-то лишний раз не захочется)?

Обсудим отечественные реалии, которые убивают теорию уважаемых Демарко и Листера и практику не менее уважаемого Книберга на корню. Начнем с соцпакета.

Недавно разговаривал с коллегой – руководителем PMO из соседней программерской фирмы (PMO – это Project Management Office, само его наличие говорит о том, что фирма придерживается современных взглядов на управление проектами; у нас вот – классическая функциональная структура, в лучшем случае – слабая матрица, нам PMO не светит). Так вот, они в ближайшее время будут завозить в офис и давать сотрудникам неограниченно потреблять всякие перекусы и питьё: чипсы/орешки, печенье/булки, соки и т. п. Как сказал коллега: «Предположим, нашему программисту ближе к вечеру захотелось перекусить. И у него возникает сложная дилемма: уйти поесть или поработать всё-таки еще пару часов. Плюшки в офисе склонят его в пользу поработать». А действительно, рассмотрим дилемму повнимательнее. Итак, таблица (цифры взяты «с потолка», но я в них почти уверен):

10 % Проигнорируют чувство голода и останутся работать.
10 % Перекусят тем, что принесли с собой с утра (я всегда так делаю).
10 % Пойдут купят что-нибудь в ближайшем ларьке, потом вернутся поработать.
70 % Уйдут домой, вернутся на работу только завтра утром.

Мы потеряли 70 % программистов из-за банального голода! А они могли бы работать и работать. И, между прочим, есть немало людей, которые именно вечером выходят на пик производительности. За ту же зарплату! Вот вам и вопрос: окупятся ли плюшки? Да в три раза минимум! А представьте, в нашей конторе не то, что нет плюшек, а регулярно кончается туалетная бумага. Это же вообще преступление перед собственным персоналом! Нарисовать табличку про эту дилемму?

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

Плюшка Лидер рынка Наш середнячок
Конкурентноспособная зарплата + ±
Бонусы + -/+
100 % оплата больничного +
Мед. страховка (включая детей) +
Дополнительные материальные выплаты в различных случаях (например, при рождении ребёнка) + +
Оплата занятий спортом +
Бесплатные обеды, чай, кофе +
Оплата мобильной связи +
Курсы иностранных языков +
Корпоративное обучение +
Помощь в связи с переездом при трудоустройстве +
Регулярные корпоративы + +
Регулярные командные тимбилдинги +
Комфортный офис с зонами отдыха, теннисными столами и т. п. +

О, фантастика! Наша контора набрала несколько плюсиков и «полуплюсиков» в сравнении с суперлидером рынка! Сам удивляюсь. Действительно, не так всё и плохо, но я знаю массу компаний, для которых минус стоял бы в каждой графе. Я бы на такого работодателя работать не стал бы. Но ведь люди там работают. Почему???
Получается парадоксальная ситуация – руководство компаний привыкло никак не заботиться о сотрудниках – т. е. людях, от которых зависит благополучие этого самого руководства (что ещё более справедливо в случае, когда руководитель фирмы является и её владельцем, что нередко). Складывается впечатление, что это издержки именно отечественного менталитета, а на Западе всё иначе (работал я когда-то программистом в Лондоне – там ведь действительно всё было иначе). Естественно, на «незаботу» наши люди отвечают примерно тем же – кто-то ведёт личные проекты в рабочее время, другие работают по 5 часов вместо восьми (игнорируя систему учёта рабочего времени); я вот в рабочее время пишу это.

Результат – боюсь, что фокус-фактор не превышает 40-50 %. И это даже очень оптимистично. Следовательно, легко вычислить потери работодателя только на зарплате:
<Потери работодателя на зарплате> = <зарплата сотрудников> * (70 — 50) %,
где 70 % – фокус-фактор, взятый из Книберга (идеальный фокус-фактор мы рассматривать не будем, поскольку он сильно похож на 100 % КПД).

Или стоит посмотреть на это всё с другой стороны – может быть, это мы, программисты (ну и примазавшиеся менеджеры), – зажравшийся народ, которому всяких жирных плюшек подавай, да побольше. Другие-то работают только за зарплату. А нам дополнительная мотивация нужна для вдохновения (какая же работа без вдохновения?). Поправьте меня, если я не прав.

P.S. Наверняка, много раз на Хабре обсуждалось. Если так, извиняйте, чисто наболело.
P.P.S. В общем, хочется попробовать плюшек на халяву! Пойду в вашу компанию менеджером проектов, если у вас есть плюшки и никогда не кончается туалетная бумага. Затраты на съеденные мной плюшки и прочие радости жизни обязуюсь сполна отработать.

ссылка на оригинал статьи http://habrahabr.ru/post/160907/

ООН разрабатывает новый мировой порядок для интернета

Российские власти, которые за последнее время отличились целым рядом законодательных новаций в сфере регулирования интернета, в своем стремлении поставить под контроль всемирную сеть вовсе не одиноки. О том, каким образом вмешиваться в веб намерена Организация объединенных наций, подробно рассказывает журналист The Verge Ади Робертсон.

Будущее интернета по сути будет решаться в кабинетах бюрократов ООН — в этом уверены Google и другие влиятельные оппоненты Международного телекоммуникационного союза (МТС). Эта структура ООН разработала 25-летний план по реформированию сети. Судя по неофициальной информации, тренд МТС выбрала однозначный — усиление регулирования. Стороны спорят, о чем в данном случае идет речь — о цензуре или о законности.

Дискуссия возобновится с новой силой 3 декабря, когда члены МТС встретятся в Дубае для обсуждения своих инициатив. Впрочем, эксперты заранее предрекают, что ни к каким конечным решениям на мероприятии прийти не удастся — дискуссия о правах и свободах пользователей интернета носит скорее философский характер и слабо представима в виде записанных на бумаге договоренностей.

МТС — агентство ООН, объединяющее представителей 193 государств, примерно 700 компаний и исследовательских институтов, специализирующихся на проблеме коммуникаций. Организация еще с 1990-х годов занимается вопросами регулирования сети. Изначально предполагалось, что МТС станет куратором глобальной доменной системы, но в конечном итоге эта функция была возложена на ICANN. Тем не менее в ООН амбиции сохранились. Секретарь МТС Хамадун Туре настаивал на том, что агентство лишь хочет разобраться с вопросами кибербезопасности, спама и защиты детей от противоправного контента. По его версии, ни о каком управлении сетью чиновники не грезят. Так это или нет, можно будет убедиться по итогам конференции в Дубае
Читайте подробнее на Forbes.ru:

via forbes.ru

ссылка на оригинал статьи http://habrahabr.ru/post/160909/

Microsoft Security Essentials провалил сертификацию AV-Test

Каждые два месяца немецкий независимый институт информационной безопасности AV-Test проводит тесты популярного антивирусного программного обеспечения. В своём последнем тесте, который она проводила на Windows 7 в сентябре и октябре, Microsoft Security Essentials не набрал достаточно баллов, чтобы получить сертификацию.

Хотя, это само по себе не так уж впечатляюще, ПО от Microsoft было единственным, которое не получило сертификат от AV-Test. Для сравнения, три других бесплатных антивирусных продукта — Avast, AVG и Panda Cloud — его получили.

Существует три категории, где антивирусы зарабатывают очки: защита, восстановление и юзабилити. Когда очки суммируются, ПО должно набрать как минимум 11 очков из 18, чтобы получить сертификат. Security Essentials заработал только 10,5 очков, что наводит на вопрос: что явилось причиной этого ухудшения?

Причиной стало то, что Security Essentials не удалось распознать достаточного количества вредоносного ПО “нулевого дня” (zero-day). Его показать составил 69% в сентябре и 64% в октябре. В это время средний показатель среди тестируемого ПО составил 89%! Остальные баллы остались без значительных изменений по сравнению с предыдущими тестами. Справедливости ради отметим, что у большинства тестируемого ПО результаты оказались ниже, чем в мае и июне.

Победителем же по количеству баллов оказался Bitdefender Internet Security, который набрал 17 из 18 баллов. Комлексы от F-Secure и Касперского заняли второе и третье места соответственно с 15,5 и 15,0 баллами. Из бесплатного ПО ZoneAlarm Free Antivirus + Firewall удостоился наивысших 14,5 очков.

Отметим, что в аналогичном тесте для продуктов корпоративной защиты Microsoft Forefront Endpoint набрал всего лишь 9,5 баллов.

Таблица с описанием тестов и набранными в них баллах для Microsoft Security Essentials

ссылка на оригинал статьи http://habrahabr.ru/post/160905/