За три года Digital Ocean стал любимцем технологичных компаний и команд разработчиков, а для рядовых гиков дроплеты DO уже давно перешли в разряд импульсивных покупок. При этом у Digital Ocean нет многих возможностей, которые предусмотрены у конкурентов, будь то свой CDN, балансировщики нагрузок или поддержка Windows. Зато есть свои козыри: низкая стоимость, удобный интерфейс админки и API, высокая скорость благодаря обязательному SSD и хорошее комьюнити. И судя по тому, что Digital Ocean продолжает открывать для себя новые регионы и придумывать новые фишки, отсутствие излишней серьезности компании только на руку.
Идея
Как возникла идея DO? На рынке уже были тысячи хостинг-провайдеров, не говоря о таких гигантах, как Amazon, Google, Microsoft. Наверняка все говорили, что ваша идея провалится?
До DO мы с братом много лет занимались хостингом, и в какой-то момент стало понятно, что все движутся в сторону «облака». Многие компании начали намного раньше нас — мы и сами тогда работали с различными провайдерами. Все они строили свои облака так, как считали нужным и правильным, но получалось как-то неоправданно сложно.
Так что мы решили, что займемся облаками и сделаем все по-своему, создадим свою версию, которая понравится нам самим, — что, наверно, было не очень разумно. Дело в том, что все, с кем мы это обсуждали, говорили, что это плохая идея и нам вообще не стоит за это браться :).
Так что, пожалуй, в этой истории не было никакой магии. Была хорошо знакомая нам область, в которой мы уже много работали. Нам не нравились представленные на рынке решения, и мы захотели создать свое. Так возникла идея создать нечто, чем мы могли бы пользоваться сами и посмотреть, не захочет ли кто-нибудь еще тоже этим воспользоваться.
Кто был среди основателей, кроме вас? Вы все были программистами?
Основателями выступали я, мой брат Бен, Джефф Кар, Алек Картмен и Митч Вайнер. Все мы были разработчиками, но с разными наборами умений и с разным фокусом. Бен более подкован по части работы с сетями, системного администрирования и управления конфигурациями. Джефф — специалист по бэкендам, низкоуровневому программированию. У меня — смесь из фронтенд-разработки и системного администрирования, плюс у меня есть художественный бэкграунд, поэтому я присматриваю за тем, как выглядит наш продукт. Митч — наш маркетолог, но и он в прошлом много занимался разработкой и успел основать небольшую компанию, выпускавшую CRM-систему. Алек очень хорош в Rails.
В самом начале нашей команды хватало для решения всех задач, но потом, конечно, начали появляться новые проблемы и пришлось расширяться. Все-таки строить облако куда сложнее, чем просто писать софт и его деплоить. Например, многое завязано на физической инфраструктуре и куче серверов.
К концу 2013 года Digital Ocean обошел AWS по темпу роста числа веб-серверов — по данным Netcraft. Естественно, общее число инстансов здесь не учитывается
Изначально вы хотели взять какие-то готовые технологии (вроде OpenStack’а)?
В самом начале разработки мы действительно посматривали на то, что можно было найти в открытом доступе. Мы выбирали между CloudStack, OpenStack, Eucalyptus и еще несколькими проектами, но ни один из них восторга у нас не вызывал. С любым из них пришлось бы все переделывать под себя. Все-таки, когда создаешь высокотехнологичный продукт, ориентированный на разработчиков, то все внутренние технологии и API важны не меньше интерфейса. Даже начинающий разработчик рано или поздно выходит за рамки стандартной админки, и тогда в дело вступает то, что у продукта находится «под капотом».
Успех приходит не сразу
Как вы набрали первых пользователей? Все получилось сразу?
Мы тогда работали в коворкинге и просто положили пачку рекламных листовок в лифте и пригласили людей опробовать наш новый сервис Digital Ocean, получить на тест бесплатный облачный сервер. Разумеется, никто к нам не пришел, зарегистрировалось три человека и на этом все могло закончиться. В общем, запуск как-то не очень удался :). Однако мы вложили в DO такое количество времени и сил, что решили продолжить работать.
Нам неожиданно представился шанс продемонстрировать DO на New York Tech Meetup, которую организует Meetup.com. Среди присутствующих нашлось 700–800 очень подкованных технически людей, все они были в восторге. Помню, когда мы проводили демонстрацию, мы пытались протестировать пару новых штук, например пытались выстроить интеграцию с GitHub’ом, но все было еще не совсем готово, так что на сцене нам пришлось показать фейк и представить его как бета-версию.
Потом, во время афтерпати, к нам подходили люди и задавали вопросы, они были в восторге от того, что мы делаем. У нас зарегистрировалось пятьдесят человек. Так что нашу платформу использовали уже не пять, а пятьдесят человек. Да, это был долгий путь.
А к инвесторам вы обращались, пробовали что-то еще?
Да, например, мы решили попробовать поучаствовать в TechStar и даже стали финалистами New York City TechStars, но Дэвид Тиш сказал нам: «Я не совсем понимаю, чем вы занимаетесь, парни, потому что я не технарь. Так что не уверен, что смогу вам помочь». Как бы то ни было, он посоветовал нам принять участие в программе Boulder. Мы обратились к ним, и они согласились провести техническую экспертизу. Но в итоге мы услышали все то же самое, что нам до этого говорили другие инвесторы: что Amazon AWS — наш крупнейший конкурент, что успеха не будет, что у нас ничего не получится. Мы ответили: «Ладно, вы „очень нам помогли“» — и продолжили заниматься тем, чем занимались.
А потом, в январе, спустя несколько месяцев, мы все-таки запустились. Отклик возник гигантский и почти моментально. До этого у нас подключалось пять-шесть человек, и вдруг все просто взорвалось — каждый день регистрировались сотни разработчиков. Мы осознали, что нам нужно немедленно регистрировать компанию, нанимать поддержку для пользователей, убедиться, что серверов в дата-центре достаточно, и так далее. Этот процесс, в общем-то, завертелся и не прекращается по сей день. Мы очень быстро увеличили штат компании до ста человек, но по сути, мы делаем все то же, что и раньше, просто возникают новые челленджи. При этом нужно постараться не огорчать клиентов, которые в нас поверили и полюбили наш продукт. Мы стараемся сделать все, чтобы отплатить им тем же и продолжить радовать их и дальше.
Digital Ocean изнутри
Как со временем менялся ваш технологический стек? Вы действительно используете Go для разработки?
Любая компания проходит через одни и те же фазы. Все начинают с минимального продукта (MVP), выпускают прототип, который смогли создать, имея в распоряжении малое количество людей. В подобной ситуации отталкиваются не от нормального планирования, а прежде всего от того, что конкретный человек хочет разрабатывать и как он будет это писать. Из-за этого толком не представляешь, когда напорешься на проблему.
В частности, в январе 2013 года, когда все закрутилось и стало расти в геометрической прогрессии, нам пришлось перестроить всю систему, потому что она становилась все более запутанной. В частности, мы распределили все сервисы, чтобы в случае падения одного из сервисов не рухнула вся система.
В общем, мы убили кучу времени на то, чтобы перестроить код и перепланировать всю архитектуру. И вот тогда в наше поле зрения и попал Go, потому что это очень быстрый, новый язык, в котором много интересного. Думаю, это большая редкость — иметь идеальную тестовую площадку для таких вещей. А когда у тебя тысячи серверов, рассредоточенных по всему миру, Go очень естественно ложится в эту распределенную систему.
По сути, мы прошли через все муки роста, наша работа не ограничивалась созданием новых фишек и допиливанием продукта. Например, планирование выглядело следующим образом: мы оценивали свои масштабы, умножали их на десять и уже на эту цифру опирались, работая со своей архитектурой. И почти каждый раз, когда мы практиковали это «упражнение», Go вписывался идеально. К тому же люди, которым интересен Go, как правило, очень хорошие разработчики, и им интересны те проблемы, над которыми работаем мы. Благодаря этому мы смогли набрать большую команду отличных инженеров, готовую как поддерживать существующие продукты, так и делать новые.
Что сейчас находится «под капотом» Digital Ocean? Признаться, я удивлен, что вы используете все свое.
Мы действительно почти не используем сторонние инструменты. Исключение — некоторые низкоуровневые тулзы, но и их мало. Все, что касается управления, планирования, ивентов, управления аккаунтами, мы все делаем сами.
Не спорю, OpenStack — интересная штука. Но его открытость сильно переоценена — все-таки этот проект развивается коммерческой организацией, а это как-то неправильно. Это не типичная опенсорсная история, в которой два-три человека собрались вместе и в свободное время что-то написали, а потом их поддержало комьюнити, помогло им, и все стали пользоваться продуктом. Есть немало примеров проектов, которые не очень поддерживались сообществом и развивались в основном благодаря компаниям. Почти во всех случаях все заканчивается одинаково: разработчики пытаются угодить всем сразу, в процессе участвует слишком много заинтересованных лиц, в итоге — полная дезорганизация. Мы со всех сторон слышим о проблемах с OpenStack и о том, что после деплоя все время разработчиков уходит на отлов багов и попытки заставить все нормально работать. Мы считаем, что если уж тратить свои ресурсы на багфиксы, то пусть это по крайней мере будут наши собственные баги.
Какое железо используете?
В основном Dell и SuperMicro. Они поставляют надежное железо, так что мы работаем с ними уже несколько лет. Они очень хорошо относятся к нам и стараются всячески поддержать. Нам приходится осуществлять закупки в самых разных странах, и каждый новый дата-центр только прибавляет сложностей с логистикой, заказом серверов, их доставкой, сборкой и так далее. Поэтому иметь такого партнера, как Dell, у которого, как правило, в каждой стране есть представительство, очень удобно. Например, мы недавно открыли дата-центр в Амстердаме, и на то, чтобы доставить туда партию серверов, понадобилось 12 дней. Раньше это занимало у нас порядка двух месяцев. Поэтому мы бы и рады собирать собственные серверы, но сейчас для нас основным приоритетом является логистика.
2 000 000 серверов развернуто на данный момент
Безопасность и другие проблемы
Для любого PaaS и хостинга безопасность — головная боль. Особенно когда с твоих мощностей начинают делать всякие гадости. Как вы это отслеживаете, как боретесь?
Безопасность — это большая проблема. Мы общались с разными компаниями и стартапами, спрашивали у них, какие цифры по абьюзу и фроду наблюдают они. Мы говорили со многими крупными компаниями в Нью-Йорке. Порядка 1–2% их транзакций — мошеннические. Но пара процентов — это ничто, потому что нам приходится иметь дело с 30–40%! То есть каждый третий зарегистрированный пользователь Digital Ocean — фейковый.
Это действительно огромная проблема, затрагивающая всю индустрию. Если у тебя есть низкоуровневый доступ к серверу, делать можно что угодно: сканить порты, DDoS’ить, заниматься фишингом, рассылать спам и так далее. То есть список возможных гадостей практически бесконечен, но многие злоумышленники даже не понимают, что наносят кому-то вред. Многие из них просто учатся писать код и разбираются в технологиях, для этого они и занимаются разными сомнительными экспериментами. Они не понимают, что их поступки вызывают множество проблем, просто они любознательны. Наша работа заключается в том, чтобы выявлять такие инциденты и не мешать «законопослушным» пользователям. К сожалению, это скорее искусство, чем наука.
Но каких-то успехов вы добились?
Конечно, мы используем множество разных технологий. Иногда сотрудничаем с другими компаниями, которые специализируются на решении такого рода проблем, но много автоматизации производим и сами. Однако даже компании, для которых это основная работа, где работают мегаумы, гении… даже эти компании скажут вам: «Слушайте, мы постепенно этим займемся, будем работать день за днем, но все равно не гарантируем вам стопроцентного результата. Как только мы найдем какое-то решение, злоумышленники придумают, как его обойти». Но мы это понимаем, нормально к этому относимся.
Самая неприятная ситуация — это когда в результате автоматизированных тестов нормального пользователя отмечают как нарушителя. Естественно, для них это становится полной неожиданностью и приводит к различным проблемам. Мы стараемся общаться с такими пользователями, объясняем им, почему мы так поступаем. К сожалению, это, конечно, портит им весь юзер-экспириенс и огорчает их, и такие пользователи имеют полное право злиться и возмущаться. Но, увы, если ничего не делать, то проблем будет еще больше, в итоге пострадают вообще все пользователи. Обойти этот вопрос просто невозможно. Поэтому нужно продолжать работать, стараться изо всех сил.
Когда речь идет о таких масштабных проектах, как DO, возможно, глупо спрашивать про главные проблемы, с которыми вы сталкивались. Но все же — что вы могли бы выделить отдельно?
Думаю, что главная проблема не на каком языке писать продукт, а как спроектировать оптимальную архитектуру. В нашем случае основные проблемы связаны с объединением распределенных систем — нужно постоянно оптимизировать то, как данные синхронизируются по разным участкам твоей архитектуры. И чем обширнее география твоего проекта, тем острее стоит эта проблема.
У нас был интересный случай, когда мы открыли представительство в Сингапуре. До этого у нас был центральное место, где мы хранили данные, так как задержка между Восточным и Западным побережьями США и Амстердамом была одинаковая и ничего особенно не тормозило. Но когда мы пришли в Сингапур, стало очевидно, что задержка до Сингапура явно куда выше, чем мы предполагали. Плюс помимо проблемы с лагом есть и проблема надежности канала — это еще одна задача, которую решают в рамках распределенных архитектур. Словом, это очень интересный набор проблем.
Когда все продолжает разрастаться, даже у самых банальных проблем обнаруживаются новые аспекты. Собирать аналитику с виртуальных машин в таких масштабах — это уже интересный челлендж, особенно когда ты хочешь получать данные в реальном времени. Как минимум нужно убедиться, что все уведомления рассылаются верно и своевременно. Так что, даже реализуя самые базовые вещи, в таких масштабах приходится разбираться в мельчайших деталях.
DO сегодня
Я довольно активно использую API. За три последних года он уже дважды менялся. В чем была проблема оригинального API?
Существуют ошибки, которые так или иначе совершаются; что-то получается хорошо, что-то хуже. Первый API был потрясающий, им пользовалось огромное количество людей по всему миру. Но наши клиенты «взрослели» и со временем обнаружили ряд ограничений. Было две основных вещи, которые мы хотели изменить.
Первое: мы очень хотели сделать API полностью RESTful. Оригинальная версия этим похвастаться не могла, что создавало определенные проблемы с Google, написанием wrappers и так далее. Это не удовлетворяло многих.
Второе: пользователи стали вытворять с нашим API такое, до чего мы сами бы никогда не додумались. Например, люди начали писать мобильные приложения для работы с DO. Наш API не поддерживал OAuth, поэтому для авторизации приходилось копировать в приложение ID и длиннющий ключ — явно не лучший юзер-экспириенс. Все это мы учли в новой версии.
В новой версии вообще много внимания уделяется интеграции. Благодаря этому стало проще думать о разработке новых сервисов и интеллектуальных приложений. Теперь им можно гибко назначать различные роли и права доступа. Словом, мы начали думать о наших пользователях не как об индивидуальных разработчиках, а как о большой единой экосистеме.
Какая фича в DO самая крутая, на ваш взгляд?
Я считаю, что самая крутая фича любого продукта — это не то, что вы видите, а то, чего вы не видите. Иными словами, лучшие фичи — те, которые мы не стали внедрять. Это особенно важно, когда речь идет о продукте, ориентированном на разработчиков. Когда делаешь что-то для продвинутых пользователей, всегда есть желание напихать побольше функций и настроек. Но в результате получается неудобный интерфейс и плохой юзер-экспириенс. Так что думаю, наше главное преимущество — в умении находить баланс.
Мы всегда думаем о том, зачем добавлять в продукт ту или иную фичу, как нам от нее избавиться в случае чего. Если продукт уже перегружен, мы думаем о том, как его упростить, как забрать часть груза и сложностей на себя, а не заставлять наших пользователей разбираться со всем этим самостоятельно.
200 000 пользователей работают с серверами Digital Ocean
Почему важно комьюнити
Мне нравится, как вы работаете со своим комьюнити и пользователями. Каждый раз, когда ты пишешь в суппорт и получаешь ответ по существу от человека, который явно в теме. Вокруг DO уже сейчас сформировалось серьезное комьюнити, как вам это удалось?
Комьюнити — это, бесспорно, один из наших приоритетов. У нас есть три главных принципа: любовь, простота и комьюнити. Все начинается с любви — мы сами должны любить свой продукт, ведь если даже мы его не любим, то почему его должен полюбить кто-то другой? Также нужно любить своих пользователей. Когда эти условия соблюдены, ты понимаешь, что можешь сделать очень многое, чтобы помочь людям. Думаю, мы так плотно на этом концентрируемся, потому что без поддержки, которую нам оказывает комьюнити, у нас ничего бы не вышло.
Речь даже не о комьюнити вокруг Digital Ocean, которое, конечно же, просто замечательное. Речь о том, что, к примеру, без возможностей, которые сегодня предоставляет Linux, не было бы DO. Linux предоставляет виртуальные серверы, без Linux нас не было бы вовсе. Мы используем языки программирования, за которые не производим никаких отчислений, мы не платим никаким авторам, правообладателям и так далее.
Мне кажется, для нашего поколения и последующих это уже образ жизни и данность, когда-то ведь такого попросту не было. Без этого создать компанию было бы куда сложнее. Сейчас многие говорят о том, что затраты на создание компании стали гораздо меньше, и во многом это происходит благодаря open source. К примеру, если вы решите сегодня запустить собственный облачный хостинг, вы можете либо заплатить кучу денег, либо обратиться к open source альтернативам.
А что вы, со своей стороны, делаете для комьюнити?
Мы спонсируем несколько конференций, чтобы лично общаться с пользователями. Нужно всегда оставаться на связи с комьюнити, потому что, если не делать этого, очень скоро вы перестанете понимать, что для них важно. Они замечательные, они дарят нам столько любви и поддержки, вдохновляют нас работать дальше. А еще прекрасно то, что они предельно честны. Когда мы совершаем ошибки, они почти сразу говорят нам: «Эй, парни, вы накосячили», и это очень здорово. Ведь когда ты совершаешь ошибку, лучшее, что ты можешь сделать, — это признать, что допустил промах, и работать над его исправлением. Это очень высокая планка, но нам приходится соперничать с компаниями, стоящими миллиарды долларов, они вынуждают нас конкурировать на высоком уровне и мотивируют нас делать это с позитивом, а не сидеть в сторонке, глядя на этих гигантов, и думать: «нам такого уровня не достичь никогда». Они буквально принуждают нас оставаться в тонусе, сдерживать свои обещания. Мне кажется, мы обязаны своим успехом именно этому. Если мы продолжим в том же духе, я полагаю, мы достигнем еще большего.
Почти в каждой стране есть список запрещённых сайтов. В Европе блокируют файлообменные сайты, китайские власти не любят западные социальные сети. В последние годы мода с блокировкой сайтов добралась до России, Украины, со своей спецификой.
Так или иначе, но многие пользователи хотят обойти технические преграды. Для грамотного человека не составляет особого труда сделать это через прокси или VPN, но всегда приятно узнать о появлении нового бесплатного решения, которое удобно в использовании. Новым «антицензурным» браузером PirateSnoop легко воспользуется каждая домохозяйка. Конечно, если она сможет скачать его с торрентов (программа распространяется исключительно таким образом).
PirateSnoop сделан на основе SRWare Iron, который, в свою очередь, построен на Chromium. Разработчики SRWare Iron изначально ставили цель защитить пользователей от онлайн-слежки и подобрали набор правильных настроек.
Создатели PirateSnoop с торрент-сайта RARBG добавили ещё одну функцию в стандартный интерфейс Chromium: это симпатичная пиратская кнопочка в правом верхнем углу, рядом с адресной строкой. Нажав её, можно обойти практически любую цензуру.
В отличие от PirateBrowser, здесь не используется сеть Tor, поскольку узлы Tor не допускаются к соединению на многих торрент-сайтах. Вместо этого, трафик идёт по HTTPS через собственную сеть прокси-серверов PirateSnoop. Браузер постоянно обновляет список прокси, если кто-то блокирует их IP-адреса. Новые версии PirateSnoop выходят одновременно с обновлением ядра SRWare Iron.
Группа RARBG уверена, что даже в нацистской Германии не было столько запретов на распространение информации, как в современном демократическом интернете.
Группа лидеров индустрии вместе с компанией Razer представили Open Source систему виртуальной реальности, новый стандарт для игр в режиме погружения, который даст толчок VR-геймингу. Razer поддержит этот проект при помощи OSVR Hacker Dev Kit — VR-устройства и открытого ПО, которое позволяет составлять программы для VR-технологий любого уровня. OSVR обеспечивает поддержку аппаратного и программного обеспечения на каждом уровне VR игр. Начиная с самых популярных игровых движков, включая Unity 3D и Unreal 4 Engine, OSVR также работает с расширениями для других устройств от таких компаний, как Bosch и Razer, и с новинками от Sixense и LeapMotion. Более того, OSVR создана для работы со всеми VR-устройствами, в том числе с Oculus DK 2 и Vrvana Totem.
«Игровое сообщество все внимательней присматривается к платформам виртуальной реальности, и это приносит как огромную пользу, так и новые трудности геймерам любого уровня. OSVR объединяет разработчиков игр, геймеров и изготовителей оборудования для того, чтобы решить эти задачи и сделать игры в режиме виртуальной реальности реальными для масс», — прокомментировал Минь-Лян Тань, соучредитель и генеральный директор Razer.
«Открытая платформа OSVR помогает ускорить развитие инновации и обеспечивает пользователям свободу выбора аппаратных и программных компонентов. Мы рады сотрудничеству с Razer и другими лидерами отрасли, ведь мы создадим OSVR вместе», — заявил Юваль Богер (Yuval Boger), генеральный директор Sensics.
Технические характеристики OSVR Hacker Dev Kit
Модуль шлема виртуальной реальности
Сенсорный хаб со встроенным акселерометром, гироскопом и компасом
Внешние порты USB 3.0 для дополнительных аксессуаров
Два дополнительных порта USB 3.0 для внутренних расширений
Дисплей
5,5-дюймовый Full-HD дисплей, оснащённый плоскими кабелями и специальным интерфейсом для сменных панелей
Full-HD разрешение 1080×1920 с поддержкой 60 кадров в секунду и 401ppi
Дополнительное пространство для дисплея обеспечивает поддержку сменных дисплеев
Оптический модуль
Окулярный минидисплей и двухлинзовая оптика, обеспечивающая отличное качество картинки и понижающая искажение
Поле обзора в 100° по диагонали (Горизонтальный 90° и вертикальный 90°)
Независимая настройка с учётом межзрачкового расстояния и диоптрии для возможности использования без очков
Механические характеристики шлема виртуальной реальности
Съёмная лицевая панель
Слой микрофибровой пены из бамбукового угля для большего комфорта
Поясной модуль
Дополнительные разъёмы USB 3.0
Встроенный кодек объёмного звука
Более комфортное расположение кабелей и эргономика
Усилители сигнала
OSVR Hacker Dev Kit, разработанный компанией Razer, поступит в продажу на территории РФ в июне 2015 года по цене $199,99.
Google Apps Script — это язык для автоматизации работы с онлайн-приложениями, появившийся в 2009 году. Его основа — классический JavaScript, обогащенный расширениями для работы с сервисами Google. После прочтения этой статьи ты овладеешь основами использования этого языка, выучишь пару приемов манипуляции с почтой и документами, а также получишь представление о необозримых возможностях Google Apps Script.
Основы использования
Начать писать Google Apps скрипты очень просто. Первым делом надо открыть редактор скриптов в любом приложении, взаимодействие с которым будем автоматизировать. В Google Docs он находится в меню «Инструменты -> Редактор скриптов». Далее надо выбрать проект, внутри которого будет располагаться скрипт (см. рис. 1). В открывшемся окне пишем код:
function FirstExampleFunc()
{
Browser.msgBox("Это таки JS! ");
}
Рис. 1. Стартовое окно редактора скриптов
Декларированную функцию можно запускать из «Инструменты -> Управление скриптами» или сделать для нее отдельную кнопку. Для этого надо прописать еще одну функцию:
function menu()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var entries = [ {name: "Моя единственная функция", functionName: "FirstExampleFunc"},
ss.addMenu("Мои функции", entries);
}
Теперь в нашем меню есть пункт под названием ExampleFunc, при клике на который открывается однострочное подменю «Моя единственная функция».
Декларированные функции можно использовать в формулах, которые вводятся внутрь ячеек электронных таблиц (см. рис. 3). Теперь перейдем к более практически полезным примерам.
Рис. 2. Редактор кода, заполненный автогенерируемым сырьевым материалом для работы с электронной таблицей
Рис. 3. Вызов пользовательской функции с аргументом
WARNING
Перед запуском скрипта не забудь сделать резервную копию важной информации. Действия, выполненные GS, нельзя отменить нажатием <Ctrl + Z>.
Работа с Google Docs
Когда встает задача автоматизации работы с офисными документами, первым делом на ум приходит VBA, одно упоминание которого оказывает на многих тотальное антиэкстатическое воздействие, вызывая болезненные воспоминания из школьного и университетского прошлого. Google Script однозначно удобнее и доступнее для понимания. Особенно для веб-разработчиков, ведь это же родной, привычный и любимый JS! Разберем пару примеров скриптов для Google Docs. Приведенный код заполняет левую верхнюю ячейку первого листа активной таблицы:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
sheet.getRange("A1").setValue("Содержимое ячейки");
А этот код создает копию текстового документа и кладет его в определенное место:
var source = DocsList.getFileById("SOURCE_ID");
var newFile = source.makeCopy("новое имя файла");
var targetFolder = DocsList.getFolderById("ID папки, в которой будет размещен свежесозданный файл");
newFile.addToFolder(targetFolder);
А вот так можно провести замену строк в текстовом документе:
Следующий пример кода подсвечивает определенные слова в тексте:
var doc = DocumentApp.openById('id документа');
var textToHighlight = 'текст для подсветки';
var highlightstyle="{};"
highlightStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = '#FF0000';
var paras = doc.getParagraphs();
var textLocation = {};
for (i=0; i<paras.length; ++i)
{
textLocation = paras[i].findText(textToHighlight);
if (textLocation != null && textLocation.getStartOffset() != -1)
{
textLocation.getElement().setAttributes(textLocation.getStartOffset(),textLocation.getEndOffsetInclusive(), highlightStyle);
}
}
Если пишешь скрипт, включающий в себя функции поиска/замены текста, помни о том, что GS поддерживает регулярные выражения.
Работа с почтой
Письмо отправляется одной короткой строкой: MailApp.sendEmail(“irairache@gmail.com”, “тема письма”, “текст письма”) Если добавить к ней еще немного кода, то можно организовать рассылку по списку адресов из электронной таблицы (исходник ищи в приложении):
var sheet = SpreadsheetApp.getActiveSheet();
var numRows = sheet.getLastRow();
var dataRange = sheet.getRange(1, 1, numRows, 2)
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i)
{
var row = data[i];
var name = row[0];
var email = row[1];
var subject = "Тема письма";
var message = "Здравствуйте, " + name + "!";
MailApp.sendEmail(email, subject, message);
}
Помимо рассылок, с помощью GS можно производить автоматизированную обработку содержимого почтового ящика. Пример — удаление всех писем от адресата, на которого ты обиделся:
var threads = GmailApp.search('enemy@example.com');
for(var i = 0; i < threads.length; i++)
{
var messages = threads[i].getMessages();
for(var j = 0; j < messages.length; j++)
{
messages[j].moveToTrash();
}
}
Имей в виду, что Gmail не только защищает от входящего спама, но и ограничивает рассылку исходящего. Больше 500 писем за сутки с помощью Google Apps Script не выйдет.
Работа с Google Translate
С помощью Google Apps Script можно переводить текстовые строки с одного языка на другой. Пример:
var word = LanguageApp.translate('кукушка', 'ru', 'es');
Logger.log(word);
// Скрипт выведет в консоль "cuco" — кукушка по-испански
Коды для языков можно посмотреть в адресной строке сервиса Google Translate.
Если выделить код и нажать <Shift + Tab>, то магическим образом расставятся все отступы для условий, циклов, объявленных функций и всех других мест, где им положено быть.
Работа с Google Drive
Google Apps Script может работать с файлами пользователя, размещенными на Google Drive. Этот скрипт выводит в консоль имена всех файлов пользователя:
var files = DriveApp.getFiles();
while (files.hasNext()) {
var file = files.next();
Logger.log(file.getName());
}
К файлам можно применять несколько десятков различных методов. Вот некоторые из них:
addEditor(“email пользователя”) — наделяет пользователя правами на редактирование файла;
getOwner() — узнать владельца файла;
makeCopy(“имя”, “путь”) — создать копию файла;
getLastUpdated() — возвращает пользователя, который внес последнее изменение.
Работа с Google Contacts
Адресная книга также может быть подвергнута автоматизированной обработке. Приведенный ниже код копирует все контакты из группы «Редакция» в лист Google Spread Sheet:
var group = ContactsApp.getContactGroup("Редакция");
var contacts = group.getContacts();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Контакты редакции");
for (var i in contacts) {
// Сохраняем данные о контактах в ячейки: имя, фамилия, номер телефона
sheet.getRange(i, 1, 1, 1).setValue(contacts[i].getGivenName());
sheet.getRange(i, 2, 1, 1).setValue(contacts[i].getFamilyName());
sheet.getRange(i, 3, 1, 1).setValue(contacts[i].getPhones());
// И еще есть метод для получения номера пейджера (!) контакта
sheet.getRange(i, 4, 1, 1).setValue(contacts[i].getPager());
}
С помощью Google Apps Scripts можно работать с сервисом Google Task — создавать новые задачи и парсить уже имеющиеся.
Этот код создает новое дело в списке:
// Найти ID тасклиста можно внутри адресной строки в сервисе Google Task
var taskListId="id тасклиста,";
var newTask = {
title: 'Выбросить финиковые косточки',
notes: 'Не забыть косточки под кроватью'
};
newTask = Tasks.Tasks.insert(newTask , taskListId);
Logger.log ("Задача с ID "%s" создана", newTask.id);
А таким образом можно вывести список нумерованных задач в консоль:
// Кладем все задачи списка в массив
var tasks = Tasks.Tasks.list(taskListId);
for (var i = 0; i < tasks.items.length; i++)
{
var task = tasks.items[i];
Logger.log(i. ". ",%s, task.title, task.id);
}
Задачи можно перемещать из одного списка в другой с помощью метода move, дополнять с помощью метода update и удалять с помощью метода delete.
Создавать события в календаре тоже можно автоматически (и так же, как в случае с рассылкой, формировать информацию о них из строк таблицы). Код для создания события:
var timeZone = CalendarApp.getTimeZone();
var description = Utilities.formatString( '%s from %s to %s', "заголовок события", dateString_( "дата начала события", "часовой пояс" ), dateString_("дата конца события", "часовой пояс" ));
CalendarApp.createEventFromDescription(description);
Есть два основных способа поделиться своим скриптом с другим человеком (без учета непосредственного обмена исходным кодом) — ссылка и гаджет. В первом случае все просто: пользователь получает ссылку на программу, переходит по ней, и скрипт немедленно начинает выполняться (при условии, что человек авторизирован в своем Google-аккаунте).
Гаджет — это приложение-контейнер, которое размещается на веб-странице и исполняет определенные функции. Примеры: мини-блок в углу страницы с прогнозом погоды или календарем. Чтобы поместить Google Script внутрь гаджета, необходимо в меню редактора скриптов выбрать пункт «Publish -> Deploy as web app».
А если нажать <Ctrl + Space>, то включится режим автозавершения, то есть редактор будет дописывать код за тебя.
События
Можно настроить скрипт так, чтобы он выполнялся после определенного события. К примеру, после открытия/редактирования электронной таблицы или отправки данных формы. Подробности о работе с Events
Работа с базами данных
Для этого существует сервис для работы с базами данных Google Cloud SQL. По сути — классический MySQL в облаке. Может взаимодействовать с Google Apps Script по стандарту Java Database Connectivity. Вот пример кода, который производит чтение записей из таблицы:
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var start = new Date();
var stmt = conn.createStatement();
stmt.setMaxRows(1000);
var results = stmt.executeQuery('SELECT * FROM entries');
var numCols = results.getMetaData().getColumnCount();
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++)
{
rowString += results.getString(col + 1) + '\t';
}
Logger.log(rowString)
}
results.close();
stmt.close();
Стоимость использования сервиса — 88 долларов в год за 10 Гб свободного места. С другими базами данных Google Apps Script, к сожалению, работать не может. Если ты запланировал написать скрипт, который должен взаимодействовать с данными, не стоит сразу расстраиваться или истощать свой бюджет пожертвованиями на закупку квадроциклов для жителей Кремниевой долины. Есть два способа выкрутиться из этой ситуации:
первый — хранить данные в виде таблиц на Google Drive;
второй — разместить базу на стороннем сервере, на нем же разместить {php}{hode.js}{python}{и т. д.} скрипт, который будет выполнять к ней запрос и возвращать ответ в формате JSON или XML, а его, в свою очередь, подвергать парсингу внутри GS. Подробности о Google Cloud SQL
Приложения, с которыми может взаимодействовать Google Apps Script
Я думаю, что далеко не каждый из наших читателей успел опробовать все онлайн-сервисы Google. В целях расширения кругозора и стимуляции творческого воображения приведем краткий обзор возможностей приложений, работу которых можно автоматизировать с помощью Google Apps Script.
Google Mail — почтовый клиент. Наиболее интересна в нем возможность отправлять письма людям, адреса которых неизвестны. Для этого надо включить настройку «Отправлять письма пользователям Google+» и ввести имя и фамилию получателя в поле «Кому».
Google Calendar — органайзер. Самое удобное в нем — возможность отправки SMS-уведомлений о событиях на номера российских операторов.
Google Contacts — приложение для хранения контактов. Самый цимес его в том, что если ты случайно синхронизируешь свой список контактов с новым смартфоном и все имена сотрутся, то сможешь попросить у Google резервную копию предыдущей версии, которая навечно сохранена в его архивах.
Google Drive — облачное хранилище данных. 15 Гб, на которых также размещаются данные всех других приложений, доступны бесплатно.
Google Maps — онлайн-карты. Жителям СНГ повезло, у них есть альтернативный инструмент для построения маршрутов и просмотра панорам улиц — Яндекс.Карты. Для жителей большинства других территорий альтернатив нет. Google Maps — единственная всемирная картографическая система, позволяющая искать населенные пункты, вводя названия на языке государства, в котором они находятся. Допустим, не Kotlas, а Котлас, не Vagharshapat, а Վաղարշապատ.
Google Docs — онлайн-редактор офисных документов. Во время написания статьи этот сервис совершил мега-прорыв — появилась возможность редактировать документы, созданные в Microsoft Office. Это произошло после интеграции сервиса с функционалом приложения Quickoffice. Ради интереса попробовала отредактировать в Google Docs пояснительную записку к диплому (как пример документа с простейшим форматированием). Преобразование docx в гугл-формат пришлось ждать около минуты, и внешний вид текста явно отличался от оригинала.
Google Forms позволяет создавать формы для сбора различных данных (онлайн-опрос, страницу регистрации на событие, обратную связь для сайта и прочее), которые можно привязать к таблицам в различных форматах (HTML, CVS, TXT, PDF, RSS, XLS, ODF). Собранные данные хранятся на Google Drive.
Google Sites — бесплатный хостинг (100 Мб) с предельно ограниченным функционалом и собственной wiki-разметкой. Полнофункциональный HTML, а также CSS и JS недоступны.
SRC
По старой доброй традиции, которой уже почти три месяца, мы выложили несколько исходничков на GitHub:
autodeletemail.gs — удаляет письма, с момента получения которых прошло n-ное количество дней;
snoozeemails.gs — скрипт для повторной отправки самому себе прочитанных писем через определенный промежуток времени;
sendsmsaboutemails.gs — настраивает отправку SMS в случае получения писем, соответствующих определенным критериям. Перед его использованием надо указать свой номер телефона Google Calendar;
savemailtopdfindrive.gs — сохраняет содержимое письма в файлах на Google Drive;
fromcalendartospreadsheet.gs — записывает информацию из календаря в электронную таблицу;
sendmailsfromspreadsheet.gs — рассылает письма по списку адресов из электронной таблицы;
createdocsfromspread.gs — генерирует текстовые документы из данных электронной таблицы.
Advanced Google Services
У Google есть множество API для разработчиков, которые можно внедрять в программы, написанные на Google Apps Script. Для этого надо подключить в редакторе скриптов эту возможность (в меню Resources, далее Advanced Google services). После этого можно будет задействовать возможности следующих сервисов:
Google AdSense — сервис для работы с контекстными рекламными объявлениями.
Google Analytics — осуществляет анализ посещаемости веб-сайтов и мобильных приложений.
Google BigQuery — позволяет производить различные манипуляции (запись, чтение, перемещение и так далее) над большими объемами данных, а также анализировать их.
Google Fusion Tables — экспериментальный сервис, позволяющий размещать данные в облаке, отправлять к ним запросы и получать результаты выполнения в формате JSON и CSV. Из которых, в свою очередь, можно формировать электронные таблицы, карты, графики и другие виды визуального представления данных.
Google Domains — сервис для регистрации доменов (новый проект, открылся в конце июня 2014 года).
Google Mirror — API для взаимодействия с Google Glass.
Google Prediction — сервис для анализа данных (основанный на технологии машинного обучения). Позволяет внедрять в приложения следующие фичи: классификатор документов и писем, расчет churn rate (показатель оттока пользователей), детектор спама, оптимизатор маршрутизации сообщений и множество других интересных вещей, достойных отдельной статьи.
Google Tasks — встроенный в Gmail сервис для составления списков дел.
Google URL Shortener — любимый нашим журналом сервис для сокращения длинных ссылок.
YouTube Analytics — сервис для анализа статистики просмотров видео на YotTube. Примечателен возможностью узнать демографические и географические характеристики пользователей, смотрящих определенный видеоролик. Ведь интересно выложить очередную копию клипа на песню «До свидания, кореша» и проанализировать, какого пола, возраста и места жительства ее слушатели. Подробности
В OS X есть масса средств для автоматизации работы. И хоть в Apple считают, что лучше всего это делать с помощью Automator, AppleScript или Objective-C, мы пойдем другим путем и попытаемся использовать Python — потому что так привычнее и удобнее (прим. ред. – начиная с версии 10.10 (Yosemite) в OS X можно писать автоматизации на Java Script, но на момент написания статьи такой возможности не было).
Каждый обладатель компьютера Apple, считающий себя продвинутым пользователем, должен хоть раз в жизни сделать следующее: открыть программу AppleScript Editor, найти пункт Open Dictionary в меню File, а затем выбрать из списка какую-нибудь из программ, поставляющихся с системой (с ними фокус выйдет наверняка), например Finder или iTunes. Появится окно со «словарем» — так называется описание программного интерфейса Open Scripting Architecture (OSA), который каждая приличная маковская программа предоставляет для автоматизации. С его помощью любое приложение можно попросить выполнить то или иное действие или поделиться данными об открытых окнах и документах. А вот как сделать это удобнее и с наименьшей затратой усилий — еще вопрос.
При помощи OSA можно получить полный контроль над маковскими приложениями. Например, попросить почтовик создать и отправить письмо
Есть много способов извлечь пользу из дружелюбности OS X к любителям автоматизировать. Самый простой из них — это Automator, визуальный редактор скриптов, который входит в состав OS X и позволяет создавать незамысловатые линейные сценарии вроде переименования файлов или смены размера картинок. Для случаев посложнее существует тот самый AppleScript, редактор которого мы только что использовали для просмотра словарей.
Проблема с AppleScript заключается в том, что его авторы пытались сделать очень простой язык, освоить который могли бы люди, никогда раньше не программировавшие. В результате им все равно пользуются в основном программисты, но страдают от вычурного синтаксиса. Простые программы на AppleScript выглядят как законченные предложения на английском. Например, чтобы заставить iTunes воспроизводить музыку, можно написать:
tell application "iTunes" to play
Однако стоит попытаться написать на AppleScript что-то длиннее пары строк, как оказывается, что он лишь чинит преграды своими красивыми оборотами. Пара часов борьбы с капризами интерпретатора, и код начинает походить на пирамиду из блоков tell и end tell, пересыпанную английскими союзами и кучей скобочек. Это не значит, что AppleScript плох или что на нем нельзя сделать ничего путного, просто, программируя на нем, быстро начинаешь скучать по знакомым языкам, которые позволили бы решить все проблемы значительно быстрее.
Те же интерфейсы OSA, с которыми работает AppleScript, доступны из другого эппловского языка программирования — Objective-C (и будут доступны из Swift) через механизм под названием Scripting Bridge. К сожалению, для большинства смертных это не решит проблему, а лишь усугубит ее. Знать Objective-C хорошо, но вряд ли кто-то будет изучать его ради автоматизации повседневной работы. Swift, новый язык программирования Apple, будет чуть легче, но что, если все же захочется получить доступ к функциям маковских программ из других языков? Например, если понадобится добавить какие-нибудь вызовы в уже написанный код.
Простой метод решения этой проблемы — запускать свои скрипты из AppleScript, используя команду do shell script и далее в кавычках все, что требуется сделать из командной строки UNIX. Или наоборот — вызывать AppleScript из командной строки, используя утилиту osascript.
Ужасы Scripting Bridge
Для более плотной интеграции тоже существует стандартный способ, по крайней мере в случае с Python и Ruby. Начиная с Mac OS X 10.5 из этих языков можно обращаться к OSA при помощи библиотек Foundation и ScriptingBridge. Если у тебя установлен XCode, значит, они наверняка есть в системе. Вот как будет выглядеть программа на Python, запускающая воспроизведение музыки в iTunes:
from Foundation import *
from ScriptingBridge import *
iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
iTunes.playpause()
Сразу чувствуется, что тут разобраться уже сложнее, и интерфейсы не такие дружелюбные. Проблема в том, что Scripting Bridge для Python и Ruby не существует, и используется сразу два «моста»: один — к Objective-C, второй из Objective-C к OSA. То, что в AppleScript выглядело как одна строка, тут разрастается в пугающую каракатицу. Следующий скрипт на Python просит iTunes создать новый плей-лист с названием Test:
Обрати внимание на вызов alloc() — это и есть тяжелое наследие Objective-C. Советовать такой интерфейс в качестве упрощения было бы издевательством — лучше уж выучить AppleScript. С документацией тоже не все ладно: таким методом пользуются мало (что неудивительно), и сказать, что интернет полон примеров, было бы сильным преувеличением. На портале Apple есть справка по Scripting Bridge, а еще информацию можно добывать при помощи питоновской команды help(). В нашем случае можно запустить интерактивную оболочку Python в командной строке, создать и проинициализировать объект iTunes, как показано в примере, и написать help(iTunes), чтобы получить полный список доступных функций.
Appscript спешит на помощь
Ситуация была бы совсем грустной, если бы не выручило сообщество. Вместо развесистых стандартных интерфейсов можно использовать надстройку под названием appscript. С ней все становится куда интереснее. К примеру, запустить воспроизведение в iTunes даже проще, чем в AppleScript:
from appscript import *
app['iTunes'].play()
А вот эта строка выдаст ссылку на сайт, открытый в текущем окне Safari:
app('Safari').windows[0].document.URL.get()
О подробной документации, как всегда, остается только мечтать, но, если порыться в папке с исходниками appscript, можно найти каталог sample с примерами использования большинства стандартных приложений.
Одно время перспективы appscript были неясными: автор изначальной реализации объявил, что из-за изменений в OS X все его труды вот-вот пойдут насмарку и дальнейшая поддержка проекта не имеет смысла. К счастью, быстро нашлись желающие поддерживать код дальше, так что катастрофа откладывается на неопределенный срок. На GitHub можно найти актуальный форк.
Системные сервисы своими руками
Помимо OSA, в OS X есть еще один механизм, крайне полезный для автоматизации, — это системные сервисы. В главном меню каждой программы есть пункт Services со списком доступных сервисов. В зависимости от содержимого окна они разные — одни работают с файлами, другие — с текстом, третьи — с веб-страницами, четвертые — с картинками. Попробуй выделить кусочек текста в текстовом редакторе и заглянуть в Services — там появятся пункты, позволяющие искать в Google, смотреть в словаре, отправлять цитату по электронной почте и так далее. Сервисы можно создавать самостоятельно. Как? Конечно же, в XCode и на Objective-C! Но энтузиасты, как всегда, нашли лазейку, сильно облегчающую жизнь. Качаем программу ThisService и сколько душе угодно пишем сервисы на Python, Perl, Ruby или даже JavaScript (если в системе есть Node.js).
С виду ThisService очень прост. На деле — тоже
Первое, что нужно сделать после скачивания программы, — скачать еще и файл Starting Points. Это архив с шаблонами скриптов. Здесь на выбор есть разные языки и типы сервисов (выбор типа зависит от того, что сервис делает с текстом: принимает, выдает или пропускает через себя, внося изменения). Все, что будет происходить с текстом, нужно вписывать в функцию main(), входная переменная называется input_text, выходная — output_text, а между ними — огромный простор для творчества.
Закончив с редактированием скрипта, запускаем ThisService, перетягиваем файл с кодом в поле Script, задаем название и параметры (можно задать значок, указать приложения, в которых будет появляться сервис, указать время, отведенное на исполнение скрипта, и еще некоторые опции). Жмем Test Service, балуемся, сколько потребуется, вводя разные входные строки, и смотрим, все ли правильно работает. Кнопка Finish Testing and Create Service запакует скрипт, отправит его в папку ~/Library/Services и заодно активирует его в настройках системы. Чтобы деактивировать сервис или задать ему сочетание клавиш, нужно зайти в системные настройки, выбрать настройки клавиатуры и пункт Services во вкладке, посвященной горячим клавишам. В списке слева должен быть наш сервис.
В настройках системы есть специальный раздел, где сервисам можно задавать горячие клавиши
Вдохновение или готовые сервисы можно черпать на сайте ThisService: там есть готовые сокращалки веб-адресов, сервисы для работы с распространенными маковскими программами и тому подобные полезные вещи.
По итогам 2014 года журнал Wired составил рейтинг тех, кто отличился в 2014 году в хорошую или плохую сторону в области информационной безопасности и защиты конфиденциальных данных.
Победители
Список победителей возглавляет компания Apple, которая внедрила стойкое шифрование в операционную систему iOS 8.
Кроме неё, обозреватели отметили действия WhatsApp, она реализовала end-to-end шифрование в своём сервисе IM-коммуникаций.
Журнал Wired упоминает Верховный суд Флориды за принципиальное решение в деле, которое внимательно отслеживалось правозащитниками. Проявив смелось, суд запретил правоохранительным органам снимать информацию со станций сотовой связи без решения суда. Речь идёт о локационных данных, по которым отслеживается перемещение пользователя. Запрещено также устанавливать фальшивые станции сотовой связи, чем органы активно занимались в последнее время, например, для получения списка всех телефонных номеров, чьи владельцы пересекают границу страны по автодороге или выходят в аэропорту.
Заслужил признание и Верховный суд США, который запретил полицейским обыскивать мобильные телефоны подозреваемых без ордера на обыск. Раньше можно было просто остановить любого человек и посмотреть, что у него там в телефоне, сумке, карманах и кошельке. Теперь остались только сумки, карманы, кошельки.
После скандала с программой PRISM, в соответствии с которой все крупные американские интернет-компании передавали информацию в АНБ и устанавливали «жучки» в своих дата-центрах, выяснилось вдруг, что Yahoo осмелилась оспорить такие действия спецслужб и с 2007 года вела с ними юридическую тяжбу. Правда, в итоге она сдалась в 2008 году, когда федералы пригрозили штрафными санкциями $250 тыс. в день, пока не будет передана запрошенная информация. Но это не умаляет смелости интернет-компании по противодействию спецслужбам, что редко встречается в наши дни.
Наконец, «героем» в сфере информационной безопасности названа Google, которая организовала хакерскую группу в штате своей компании для поиска уязвимостей не только в своих продуктах, но и в программном обеспечении других компаний (Project Zero).
Проигравшие
Главный «лузер» — компания Sony, что для неё вполне привычно. Многие компании подвергались взлому, но произошедшее с Sony может стать хаком десятилетия, учитывая объёмы «слитой» информации и последствия взлома, по поводу которых встало на уши ФБР, а по телевидению выступил президент Обама.
Кстати, именно президент Обама на втором месте в рейтинге. В ушедшем году правительство наконец-то признало, что умышленно скрывает информацию о найденных 0day-уязвимостях в протоколах шифрования и программном обеспечения. Информацию используют для разведки и национальной безопасности. Теперь это официально признанный факт, хотя многие подозревали и раньше.
Введя в трансовое состояние юристов правозащитных организаций, Служба судебных приставов США осуществила незаурядную операцию в городе Сарасота (Флориде). Там Американский союз защиты гражданских свобод в полном соответствии с законом подал запрос на получение открытой информации об использовании фальшивых базовых станций. Полиция ответила, что информация открыта и предоставила адрес хранилища документов, где их можно получить. Но пока активисты добрались туда, в хранилище вломились сотрудники Службы судебных приставов и изъяли документы. Представители властей потом сказали, что никаких документов вообще не было. Мол, это вам показалось. Теперь федералы и полиция всячески затрудняют работу активистов.
Оператор Verizon Wireless попал под обстрел критики, когда выяснились его методы слежки за всеми абонентами сотовой связи. Оператор внедрял своеобразный уникальный идентификатор из 50 символов в интернет-пакеты, которые передавались с мобильных устройств из сети Verizon в интернет. Таким образом, партнёры Verizon, в том числе рекламные сети, могли идентифицировать всех абонентов, на какой бы сайт они не зашли. Другой оператор AT&T тоже тестировал эту технологию, но после скандала с Verizon быстренько прекратил эксперименты.
Наконец, ещё одним крупным «нарушителем» в сфере ИБ названа Gamma International. Это уже серьёзная немецко-британская компания, которая занимается не рекламными шалостями, а разработкой профессиональных троянов FinFisher для прослушки мобильных устройств и забора любой информации с персональных компьютеров пользователей. Такой софт у Gamma International закупают правоохранительные органы многих стран (по крайней мере, он используется в нескольких десятках стран. Фирма действует давно, но в этом году хакерам удалось взломать её и скопировать из локальной сети около 40 ГБ технической информации. Файлы опубликованы в онлайне.