...

суббота, 25 октября 2014 г.

Pirate Bay начал продвигать новый бесплатный VPN

Последние несколько дней на главной странице «Пиратской бухты» вместо их собственного лого висит промо нового бесплатного VPN — FrootVPN. На странице проекта написано, что сервис базируется в Швеции и находится под защитой шведских законов, предоставляет свои услуги бесплатно, используя несколько 10-гигабитных каналов и не ведёт никаких логов.



Что мы знаем о тех, кто разместил эту ссылку, кроме удивительной толерантности к jpg-артефактам на логотипах?



Это не первый пример промо на главной «Пиратской бухты», но обычно там висят видео с YouTube.


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



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


Люди, которые стоят за FrootVPN, поддерживают свободу и хотят, чтобы интернет был неподцензурным =)





Тонкость ситуации в том, что мы не знаем не только создателей FrootVPN, но и последние публично известные руководители «Пиратской бухты» — Петер Сунде и Готтфрид Свартхольм — сейчас в тюрьме. С одной стороны, это объясняет осторожность всех причастных к проекту, с другой — как можно доверять неизвестно кому, да ещё предлагающему бесплатный сыр? В конце концов, людям, которые выбирают «бесплатно и без SMS» и VPN, как правило, ни к чему.

Издание TorrentFreak связалось с командой «Пиратской бухты», и узнали от них, что FrootVPN — сторонний проект, а лого на главной размещён бесплатно, в поддержку дружественному проекту людей, которых они знают. Впрочем, как бы убедительно это ни звучало — вопрос, на чьи деньги делается проект, остаётся открытым.


[предложить andorro новость]


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Сбалансированная денежная единица и многосторонний клиринг

В статье «Деньги, товар и немного статистики» я описывал метод построения диверсифицированного продукта (набора товаров с минимальной дисперсией относительной цены) и ввел понятие привязанной к нему СДЕ — сбалансированной денежной единицы.

Здесь я попробую описать модель международных расчетов, основанную на СДЕ.


В этой статье википедии можно найти данные по внешнему долгу всех государств. Суммарный долг всех стран составляет более 70.6 триллионов долларов США, или 98% ВВП планеты Земля.

Кому же все должны? Очевидно — друг другу.

Возникает вполне естественный вопрос — зачем?


Существует такое понятие как клиринг — безналичные расчёты между странами, компаниями, предприятиями за поставленные, проданные друг другу товары, ценные бумаги и оказанные услуги, осуществляемые путём взаимного зачёта, исходя из условий баланса платежей (определение из википедии).

Попробуем смоделировать многостороннюю клиринговую систему, основанную на сбалансированной денежной единице.




Диверсифицированный продукт (ДП) был построен из следующих товаров: нефть, природный газ, золото, серебро, платина, алюминий, медь, свинец, никель, олово, цинк и железная руда.


Настройка и тестирование ДП проводились на разных временных интервалах.


Состав ДП получился следующий:



















































Нефть11,7505949778лМедь983,4995710507г
Природный газ718,1162730843тыс. БТЕСвинец2,6031165919кг
Золото166,4229537553мгНикель119,9509014613г
Серебро4,5929515717гОлово151,5663941567г
Платина75,9120922782мгЦинк1,7434019956кг
Алюминий1,3749551917кгЖелезная руда45,5404705547кг



Стандартное отклонение относительной цены на тестовом интервале (около 20 лет) — 2.27%.

Теперь, собственно о системе взаиморасчетов.

Положим 1 СДЕ равным стоимости этого диверсифицированного продукта.

Баланс каждого участника в момент вступления в систему равен нулю, СДЕ используется в качестве единицы измерения баланса.

При каждой транзакции стоимость товара переводится в СДЕ, соответствующая сумма идет в плюс продавцу и в минус покупателю.


Рассмотрим пример.

Допустим, в нашей системе участвуют Россия, Индия и Китай.

Стоимость 1 СДЕ на сегодняшний день примерно равна 2000 рублей, 3000 рупий или 300 юаней.


Момент времени 0.

Балансы всех участников равны нулю.

Транзакция 1.

Россия продает Китаю товар на сумму 1 миллион рублей — 500 СДЕ.

Момент времени 1.

Баланс России: +500; Баланс Китая: -500; Баланс Индии — 0;

Транзакция 2.

Китай продает Индии товар на сумму 150 тысяч юаней — 500 СДЕ.

Момент времени 2.

Баланс России: +500; Баланс Китая: 0; Баланс Индии: -500;

Транзакция 3.

Россия закупает у Индии товар на сумму 1.5 миллиона рупий — 500 СДЕ.

Момент времени 3.

Балансы всех участников снова равны нулю.


Результат — никакого накопления долгов.


Немного о реализации.

Система вполне может работать децентрализованно.

Для этого достаточно, чтобы каждая сторона предоставляла всем остальным данные о своем балансе и списке транзакций.

Таким образом, баланс всегда может быть сверен со списком транзакций.

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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


EFF запустил обновлённый сайт с инструкциями по безопасности и приватности в интернете

image

Фонд электронных рубежей запустил существенно обновлённую и дополненную версию сайта Surveillance Self-Defense, на котором собраны инструкции и рецепты для обычных пользователей, желающих сделать своё пребывание в интернете безопаснее. На сайте есть как обзорные статьи по криптографии, классификации угроз в интернете, инструментам безопасности, так и пошаговые инструкции по работе с программами шифрования, менеджерами паролей, безопасными мессенджерами, TOR, а так же комплексные сценарии безопасности для разных типов пользователей — журналистов, активистов и просто неравнодушных пользователей, желающих обезопасить себя.



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


Идея собрать в одном месте всю необходимую обычному пользователю информацию по безопасности в сети впервые была реализована EFF в 2009 году. С тех пор изменилось многое, мир вошел в «постсноуденовскую» эпоху, когда не только специалисты и параноики-любители стали задумываться о сетевой безопасности и приватности. Поэтому сотрудники фонда решили радикально обновить сайт и серьёзно расширить языковой охват аудитории.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Lego WeDo — робототехника для самых маленьких

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

Но как подготовить подрастающее поколение к этим изменениям, выработать у них правильное отношение к проблеме, ознакомить с принципами и правилами функционирования роботов?





Компания Lego очень серьезно подошла к этому вопросу и несколько лет назад выпустила специальный образовательный конструкторский набор LEGO Education WeDo. Несмотря на то, что набору уже несколько лет, только сейчас на него начали обращать внимание отечественные учебные заведения.



LEGO WeDo разрабатывался для учеников начальной школы (1-4 класс), но ничто не запрещает его использование для детей постарше.


В набор входят 158 деталей (все совместимы с прочими кубиками и компонентами Lego), а также:


USB-коммутатор, через который происходит управление моторами и датчиками;


мотор (направление вращения и мощность которого можно настраивать с помощью специального ПО);


датчик наклона (различает шесть положений — «Носом вверх», «Носом вниз», «На правый бок», «На левый бок», «Нет наклона», «На любой бок»);


датчик расстояния (обнаруживает объекты на расстоянии до 15 см);


программное обеспечение (представляет собой урезанный вариант графической среды программирования для «старших братьев» Mindstorms);



инструкции по сборке и программированию 12 базовых моделей моделей.


Кроме этого существует специально разработанные учебные программы и методические рекомендации вплоть до организации рабочего пространства на русском языке (чем не могут похвастаться другие образовательные комплекты Lego, преподаватели робототехники на основе Mindstorms меня поймут).


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


Здесь можно найти видео работающих моделей из комплекта.


WeDo также рекомендуется родителям — it-шникам для игр со своим чадом.


P.S. Традиционный вопрос к читателям — какие подобные наборы для обучения детей 6-9 лет вы знаете? Буду рад за информацию в комментариях или в facebook.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Из песочницы] Мелкосерийное производство несложной электроники: в России или в Китае?

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

Замечу, что настоящая заметка — это не маркетинговое исследование или что-то подобное, претендующее на объективное освещение вопроса. Это исключительно один частный личный опыт.



1. Устройство




Сам девайс очень простой и достаточно типичный. Не вдаваясь в подробности: микроконтроллер STM32, LCD индикатор 8x2, четыре кнопки, минимально необходимая обвеска. Разведено на двухслойной плате, монтаж SMD (порядка 70 точек пайки) и выводный (35 точек).

2. Почему сборка на стороне?




Несмотря на то, что я профессионально занимаюсь разработкой электроники, но в данном случае — это мой личный проект, который я делал в свободное время (которого никогда не хватает). Конечно, собрать 50 плат самому в принципе реально (особенно, если есть печка). И это был бы один из самых дешевых вариантов изготовления. Но, поскольку эта деятельность пока не приносит доход, то инвестировать свое время в тупую сборку не самое лучше решение, имхо.

3. Что нужно для начала




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

— Сгенерировать Gerber-файлы для платы. Тут все очевидно, надо только не забыть проверить возможности конкретного производства (зазоры, ширина дорожки, etc) и сделать DRC.


— Подготовить перечень элементов (BOM-лист). Причем желательно найти все компоненты на Digikey или Farnell (или там, где вы планировали закупать) и вписать order code или ссылку на каждый элемент. Некоторые производители, с которыми я переписывался, не принимали BOM-лист без этого. В конечном итоге вы сами будете знать, сколько будет стоить комплектация на плату.


4. Где искать производителя




Я искал на alibaba.com и aliexpress.com

Ключевые слова: PCBA, PCB assembly.

Цены указаны там просто так, на них не стоит обращать внимание. На Minimum Order можно опираться, но как оказалось не всегда.

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


5. Доставка в Россию из Китая




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

6. Выборка




Мне удалось пообщаться с четырьмя производителями из Китая и двумя из России.

Условия были следующие:


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


— С целью оптимизации цены я спрашивал можно ли купить компоненты прямо в Китае, где они очевидно дешевле чем в онлайн-магазинах типа Digikey. К слову, никто не согласился сделать такой подбор. Не исключаю, что все-таки будут поставлены некоторые более дешевые китайские детали, но в расчетной стоимости это не заявлено.


Собственно, результаты в таблице.


Китай


Россия



















ООО «Невская электроника» nelectro.ru $1250
ПК Альтоника www.pk-altonika.ru Быстро ответили, что малые партии не делают, рекомендуют обратиться когда партия будет от 500 штук — так выгоднее
Контракт Электроника http://ift.tt/1yxijg0 Не ответили
Electronics for life e4life.ru Не ответили

Вывод




Я выбрал китайского производителя. И всем коллегам буду рекомендовать, по крайне мере, рассмотреть возможность производства в Китае, независимо от объема партии.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Новый Chromium WebView теперь обновляется через Google Play и поддерживает Web Components

Разработчики Android 5.0 (кодовое имя «Леденец») представили основные изменения компонента WebView, используемого для отображения в приложениях HTML5-содержимого. Начиная с Android 5.0 компонент теперь обновляется через Google Play. Это значит, что когда Google обновляет движок своего браузера, новые функции также становятся доступны для всех разработчиков приложений, вне зависимости от того выпустил ли производитель Android-устройства обновление операционной системы или нет.

Для тех приложений, которые разрабатываются с помощью Apache Cordova или Adobe PhoneGap, новая стратегия распространения дает очевидные преимущества — конечные пользователи могут значительно быстрее получать последние нововведения, которые появляются в Web-платформе, точно также как пользователи настольных браузеров.



WebView основывается на проекте Chromium начианя с вресии Android 4.4, но возможность обновления компонента появилась только с последней версии. В качестве основы WebView Android 5.0 лёг исходный код Chromium M37. Новые функции включают WebRTC (Real Time Communication), WebAudio и WebGL. Новый компонент также включает полную реализацию спецификации WebComponents, то есть вы теперь можете использовать Polymer и элементы material design без полифилов.


Разработчики также обещают стабильно синхронизировать компонент с текущей версией Chromium, тем самым предоставляя более предсказуемую среду для выполнения HTML5-приложений на различных платформах.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Проверка протокола SSL3 в 20 банк-клиентах

image

Прошло уже более недели, как достоянием общественности стала критичная уязвимость протокола SSL3 (CVE-2014-3566). Давайте посмотрим, как отреагировали на эту новость TOP 20 банков.

Для тестирования HTTPS воспользуемся замечательным инструментом www.ssllabs.com

Начнем с чего нибудь большого и зеленого:

И первый результат сразу очень показательный!

This server is vulnerable to the POODLE attack. If possible, disable SSL 3 to mitigate. Grade capped to C.

This server is vulnerable to MITM attacks because it supports insecure renegotiation. Grade set to F.

Комментарии излишни (хотя, справедливости ради надо сказать, что еще 22.10.2014 вечером рейтинг был C.

Ну хорошо, давайте посмотрим на кого-нибудь, допустим, синего из трех букв и двух цифр:

This server is vulnerable to the POODLE attack. If possible, disable SSL 3 to mitigate. Grade capped to C.

Думаю, не стоит дальше повторяться и дам статистику по 20 банкам:

У трех банков SSL3 отключен, у двух банков частично (у физиков отключен, у юр.лиц включен).

В 15 банках SSL3 НЕ отключили.

Минимум два банк-клиента работают ТОЛЬКО через SSL3!

У четырех банков рейтинг безопасности F.

И на скрине, так сказать, Epic F.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


пятница, 24 октября 2014 г.

[Из песочницы] Статистика российских IT-специалистов на stackoverflow.com и github.com

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

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


Вопрос стоял приблизительно таким образом — какова степень присутствия и влияния российских IT-специалистов (постоянно проживающих в России, само собой) на мировое IT-сообщество?


Здесь приводится та часть анализа, в которой говорится о влиянии российских IT-специалистов (к ним причисляются вообще все интересующиеся IT люди) на мировое сообщество на примере анализа двух крупнейших международных IT-сообществ — stackoverflow.com и github.com.


А вот и сам анализ:



Аудитория проекта Stackoverflow составляет 3 580 212 зарегистрированных пользователей (2014), GitHub – 3 955 191 зарегистрированный пользователь (2014). Для сообщества Stackoverflow были проанализированы статистические данные за 2013 и 2014 годы, для GitHub — за 2012, 2013 и 2014 годы. Данные по статистике не полны, так как не все пользователи уточняют страну проживания (около 25% для Stackoverflow и около 70% для GitHub не указали страну проживания), однако имеющихся данных достаточно для понимания общей ситуации и соотношений.


Stackoverflow




Пользователей, указавших страной проживания Россию – 11 319, что составляет 0,38% от общего числа пользователей. Учитывая, что около 25% пользователей не указывают страну проживания, можно предположить, что реальное количество россиян на данном ресурсе может быть в районе 15 000 пользователей или около 0.42% от общего числа пользователей. При этом доля уникальных незарегистрированных посетителей с российскими IP-адресами на ресурсе на 2014 год составила около 1.6% (11 место) от общего количества уникальных незарегистрированных посетителей (для сравнения – Голландия – 1,75%, Бразилия – 2,3%, Индия – 12,5%, Китай – 1,46%).

По общему числу зарегистрированных пользователей Россия входит в топ-10 ресурса Stack Overflow (данные за 2014 год):


























































СтранаЧисло пользователей
1США253452
2Индия67297
3Великобритания33395
4Германия19706
5Канада16685
6Китай14234
7Австралия12592
8Бразилия12325
9Франция12217
10Россия11319



На данном ресурсе присутствует система «репутации». Пользователи с высоким показателем репутации считаются наиболее компетентными. Нами был выбран порог репутации в 1000 для анализа наиболее компетентных и влиятельных пользователей ресурса.

Всего пользователей с показателем репутации более 1000 – 68044, что составляет 1,9% от всего количества пользователей.


На 2014 год пользователей, указавших страной проживания Россию и имеющих репутацию более 1000 – 800 человек, что составляет 1,18% от общего числа пользователей с репутацией более 1000.


При этом в 2013 году пользователей, указавших страной проживания Россию и имевших репутацию более 1000, было 447 человек, что составляло приблизительно 1,25% от общего числа пользователей, указавших страну проживания, в количестве 35786 человек.


Сравнительная таблица топ-10 стран и количество зарегистрированных пользователей с репутацией больше 1000 за 2013 и 2014 годы:




















































































20132014
СтранаЧисло пользователейСтранаЧисло пользователей
1США9592США~18000
2Великобритания2906Индия3460
3Индия2005Великобритания4182
4Германия1461Германия2434
5Канада1397Канада1995
6Австралия1260Австралия1612
7Франция724Франция1178
8Швеция637Нидерланды1075
9Россия447Швеция880
10Польша439Россия800

GitHub




На июль 2012 года на ресурсе было сделано 6 826 827 коммитов. Пользователи, указавшие страной проживания Россию, сделали около 1.8% коммитов от общего количества (10 место, для сравнения: Бразилия — 1.9%, Франция — 2.7%, Япония — 3.8%).

По состоянию дел на 2013 год пользователями, указавшими место проживания (около 26% всех пользователей), было сделано около 28500000 коммитов (около 44% от общего числа коммитов в 65000000). Россияне ответственны за приблизительно 3,5% от данного числа коммитов (8 место, для сравнения: Бразилия — 3%, Франция — 4.5%, Япония — 4%). При этом на ресурсе зарегистрировано около 3% от общего числа интернет-пользователей в РФ (9 место, для сравнения: Бразилия — 4%, Франция — 4.5%, Япония — 2.5%).


На 2014 год ситуация такова, что из около 1050000 активных пользователей, указавших место жительства (из общего количества в 3955191 пользователей), россияне составляют 1,5% (16319 активных пользователей), при этом среди наиболее влиятельной доли пользователей (критерий влиятельности – наличие более 10 последователей) доля россиян составляет 0,91% (в абсолютных числах – 719 из 78470)


Топ-10 стран по количеству активных пользователей:


























































СтранаКоличество пользователей (из 1050000 человек)
1США176910
2Великобритания34628
3Китай32009
4Германия28341
5Индия25761
6Франция18549
7Канада16539
8Россия16319
9Япония16020
10Австралия14565

Топ-10 стран по количеству активных влиятельных пользователей:


























































СтранаКоличество пользователей (из 78470 человек)
1США14675
2Великобритания2659
3Китай2548
4Германия2226
5Япония1708
6Франция1257
7Бразилия1160
8Канада1068
9Австралия977
10Россия719

Выводы и предположения:


1. Удельный вес влиятельных IT-специалистов из России (проживающих в России) в мировом IT-сообществе стабильно составляет около 1%.


2. Удельный вес россиян (проживающих в России), интересующихся IT-сферой (включая влиятельных специалистов), в мировом IT-сообществе составляет около 1,5%, ими производится около 2-3% всего контента.


3. Незнание или недостаточное знание английского языка может являться серьезным барьером для увеличения степени присутствия российских IT-специалистов на мировой арене. Этот вывод можно сделать на основе того, что доля зарегистрированных пользователей из России на Stackoverflow, где знание английского языка хотя бы на среднем уровне (B1-B2) совершенно необходимо, составляет менее 0.5%. При этом доля зарегистрированных русских пользователей на GitHub, где знание английского необходимо только на начальном уровне (A0-A2), составляет около 1.5%.


4. Хотя пользователи из России и входят в топ-10 данных ресурсов по абсолютным показателям, по относительным показателям (таким как, например, количество пользователей на 100 000 населения или количество коммитов на 100 000 населения) отстаёт от других стран. Например, (данные на 2012 год) количество коммитов на GitHub на 100 000 человек населения для России – 88 (для сравнения Украина – 143, Белоруссия – 247, Эстония – 697, Швейцария — 1437).


В общем, как-то так, дамы и господа. Кто виноват и что делать?


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Перевод] Продвинутое использование объектов в JavaScript

Этот пост выходит за рамки повседневного использования объектов в JavaScript. Основы работы с объектами по большей части так же просты, как использование JSON-нотации. Тем не менее, JavaScript дает возможность использовать тонкий инструментарий, с помощью которого можно создавать объекты некоторыми интересными и полезными способами и который теперь доступен в последних версиях современных браузеров.



Последние два вопроса, которые будут затронуты — Proxy и Symbol относятся к спецификации ECMAScript 6, реализованы частично и внедрены только в некоторых из современных браузеров.

Геттеры и сеттеры




Геттеры и сеттеры уже некоторое время доступны в JavaScript, однако я не замечал за собой, чтобы мне приходилось их часто использовать. Зачастую я пишу обычные функции для получения свойств, нечто вроде этого:

/**
* @param {string} prefix
* @constructor
*/
function Product(prefix) {
/**
* @private
* @type {string}
*/
this.prefix_ = prefix;
/**
* @private
* @type {string}
*/
this.type_ = "";
}

/**
* @param {string} newType
*/
Product.prototype.setType = function (newType) {
this.type_ = newType;
};

/**
* @return {string}
*/
Product.prototype.type = function () {
return this.prefix_ + ": " + this.type_;
}

var product = new Product("fruit");
product.setType("apple");
console.log(product.type()); //logs fruit: apple




jsfiddle

Используя геттер можно упростить этот код.



/**
* @param {string} prefix
* @constructor
*/
function Product(prefix) {
/**
* @private
* @type {number}
*/
this.prefix_ = prefix;
/**
* @private
* @type {string}
*/
this.type_ = "";
}

/**
* @param {string} newType
*/
Product.prototype = {
/**
* @return {string}
*/
get type () {
return this.prefix_ + ": " + this.type_;
},
/**
* @param {string}
*/
set type (newType) {
this.type_ = newType;
}
};

var product = new Product("fruit");

product.type = "apple";
console.log(product.type); //logs "fruit: apple"

console.log(product.type = "orange"); //logs "orange"
console.log(product.type); //logs "fruit: orange"




jsfiddle

Код остается немного избыточным, а синтаксис — немного непривычным, однако преимущества применения get и set становятся более явными во время их прямого использования. Я для себя нашел, что:



product.type = "apple";
console.log(product.type);




гораздо более читаемо, чем:

product.setType("apple");
console.log(product.type());




хотя моя встроенная сигнализация плохого JavaScript до сих пор срабатывает, когда я вижу прямое обращение и задание свойств экземплярам объекта. За долгое время я был научен багами и техническими требованиями избегать произвольного задания свойств экземплярам класса, так как это непременно приводит к тому, что информация распространяется между ими всеми. Также есть некоторый нюанс в том, в каком порядке возвращаются устанавливаемые значения, обратите внимание на пример ниже.

console.log(product.type = "orange"); //logs "orange"
console.log(product.type); //logs "fruit: orange"




Обратите внимание, что сначала в консоль выводится “orange” и только потом “fruit: orange”. Геттер не выполняется в то время как возвращается устанавливаемое значение, так что при такой форме сокращенной записи можно наткнуться на неприятности. Возвращаемые при помощи set значения игнорируются. Добавление return this.type; к set не решает этой проблемы. Обычно это решается повторным использованием заданного значения, но могут возникнуть проблемы со свойством, имеющим геттер.

defineProperty




Синтаксис get propertyname () работает с литералами объектов и в предыдущем примере я назначил литерал объекта Product.prototype. В этом нет ничего плохого, но использование литералов вроде этого усложняет цепочку вызова прототипов для реализации наследования. Существует возможность определения геттеров и сеттеров в прототипе без использования литералов — при помощи defineProperty

/**
* @param {string} prefix
* @constructor
*/
function Product(prefix) {
/**
* @private
* @type {number}
*/
this.prefix_ = prefix;
/**
* @private
* @type {string}
*/
this.type_ = "";
}

/**
* @param {string} newType
*/
Object.defineProperty(Product.prototype, "type", {
/**
* @return {string}
*/
get: function () {
return this.prefix_ + ": " + this.type_;
},
/**
* @param {string}
*/
set: function (newType) {
this.type_ = newType;
}
});




jsfiddle

Поведение этого кода такое же как и в предыдущем примере. Вместо добавления геттеров и сеттеров, предпочтение отдается defineProperty. Третьим аргументом в defineProperty передается дескриптор и в дополнение к set и get он дает возможность настроить доступность и установить значение. При помощи defineProperty можно создать нечто вроде константы — свойства, которое никогда не будет удалено или переопределено.



var obj = {
foo: "bar",
};


//A normal object property
console.log(obj.foo); //logs "bar"

obj.foo = "foobar";
console.log(obj.foo); //logs "foobar"

delete obj.foo;
console.log(obj.foo); //logs undefined


Object.defineProperty(obj, "foo", {
value: "bar",
});

console.log(obj.foo); //logs "bar", we were able to modify foo

obj.foo = "foobar";
console.log(obj.foo); //logs "bar", write failed silently

delete obj.foo;
console.log(obj.foo); //logs bar, delete failed silently




jsfiddle

Результат:



bar
foobar
undefined
bar
bar
bar




Две последние попытки переопределить foo.bar в примере завершились неудачей (пусть и не были прерваны сообщением об ошибке), так как это поведение defineProperty по умолчанию — запрещать изменения. Чтобы изменить такое поведение, можно использовать ключи configurable и writable. Если вы используете строгий режим, ошибки будут брошены, так как являются обычными ошибками JavaScript.

var obj = {};

Object.defineProperty(obj, "foo", {
value: "bar",
configurable: true,
writable: true,
});

console.log(obj.foo); //logs "bar"
obj.foo = "foobar";
console.log(obj.foo); //logs "foobar"
delete obj.foo;
console.log(obj.foo); //logs undefined




jsfiddle

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


Если configurable установлен в false (как и есть по умолчанию), попытки вызова defineProperty во второй раз приведут к тому, что будет брошена ошибка.



var obj = {};

Object.defineProperty(obj, "foo", {
value: "bar",
});


Object.defineProperty(obj, "foo", {
value: "foobar",
});

// Uncaught TypeError: Cannot redefine property: foo




jsfiddle

Если configurable установлен в true, то можно изменять свойство в будущем. Это можно использовать для того, чтобы изменять значение незаписываемого свойства.



var obj = {};

Object.defineProperty(obj, "foo", {
value: "bar",
configurable: true,
});

obj.foo = "foobar";

console.log(obj.foo); // logs "bar", write failed

Object.defineProperty(obj, "foo", {
value: "foobar",
configurable: true,
});

console.log(obj.foo); // logs "foobar"




jsfiddle

Также необходимо обратить внимание на то, что значения, определенные при помощи defineProperty не итерируются в цикле for in



var i, inventory;

inventory = {
"apples": 10,
"oranges": 13,
};

Object.defineProperty(inventory, "strawberries", {
value: 3,
});

for (i in inventory) {
console.log(i, inventory[i]);
}




jsfiddle

apples 10
oranges 13




Чтобы позволить это, необходимо использовать свойство enumerable

var i, inventory;

inventory = {
"apples": 10,
"oranges": 13,
};

Object.defineProperty(inventory, "strawberries", {
value: 3,
enumerable: true,
});

for (i in inventory) {
console.log(i, inventory[i]);
}




jsfiddle

apples 10
oranges 13
strawberries 3




Для проверки того, появится ли свойство в цикле for in можно использовать isPropertyEnumerable

var i, inventory;

inventory = {
"apples": 10,
"oranges": 13,
};

Object.defineProperty(inventory, "strawberries", {
value: 3,
});

console.log(inventory.propertyIsEnumerable("apples")); //console logs true
console.log(inventory.propertyIsEnumerable("strawberries")); //console logs false




jsfiddle

Вызов propertyIsEnumerable также вернет false для свойств, определенных выше по цепочке прототипов, или для свойств, не определенных любым другим способом для этого объекта, что, впрочем, очевидно.

И ещё несколько слов напоследок об использовании defineProperty: будет ошибкой совмещать методы доступа set и get с writable: true или комбинировать их с value. Определение свойства при помощи числа приведет это число к строке, как было бы при любых других обстоятельствах. Вы также можете использовать defineProperty чтобы определить value как функцию.


defineProperties


Существует также и defineProperties. Этот метод позволяет определить несколько свойств за один раз. Мне попадался на глаза jsperf, сравнивающий использование defineProperties с defineProperty и, по крайней мере в Хроме, особой разницы в том, какой из методов использовать, не было.



var foo = {}

Object.defineProperties(foo, {
bar: {
value: "foo",
writable: true,
},
foo: {
value: function() {
console.log(this.bar);
}
},
});

foo.bar = "foobar";
foo.foo(); //logs "foobar"




jsfiddle

Object.create


Object.create это альтернатива new, дающему возможность создать объект с определенным прототипом. Эта функция принимает два аргумента: первый это прототип, из которого вы хотите создать объект, а второй — тот же дескриптор, который используется при вызове Object.defineProperties



var prototypeDef = {
protoBar: "protoBar",
protoLog: function () {
console.log(this.protoBar);
}
};
var propertiesDef = {
instanceBar: {
value: "instanceBar"
},
instanceLog: {
value: function () {
console.log(this.instanceBar);
}
}
}

var foo = Object.create(prototypeDef, propertiesDef);
foo.protoLog(); //logs "protoBar"
foo.instanceLog(); //logs "instanceBar"




jsfiddle

Свойства. описанные при помощи дескриптора, перезаписывают соответствующие свойства прототипа:



var prototypeDef = {
bar: "protoBar",
};
var propertiesDef = {
bar: {
value: "instanceBar",
},
log: {
value: function () {
console.log(this.bar);
}
}
}

var foo = Object.create(prototypeDef, propertiesDef);
foo.log(); //logs "instanceBar"




jsfiddle

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



var prototypeDef = {
protoArray: [],
};
var propertiesDef = {
propertyArray: {
value: [],
}
}

var foo = Object.create(prototypeDef, propertiesDef);
var bar = Object.create(prototypeDef, propertiesDef);

foo.protoArray.push("foobar");
console.log(bar.protoArray); //logs ["foobar"]
foo.propertyArray.push("foobar");
console.log(bar.propertyArray); //also logs ["foobar"]




jsfiddle

Этого можно избежать, инициализировав propertyArray со значением null, после чего добавить необходимый массив, или сделать что-нибудь хипстерское, например использовать геттер:



var prototypeDef = {
protoArray: [],
};
var propertiesDef = {
propertyArrayValue_: {
value: null,
writable: true
},
propertyArray: {
get: function () {
if (!this.propertyArrayValue_) {
this.propertyArrayValue_ = [];
}
return this.propertyArrayValue_;
}
}
}

var foo = Object.create(prototypeDef, propertiesDef);
var bar = Object.create(prototypeDef, propertiesDef);

foo.protoArray.push("foobar");
console.log(bar.protoArray); //logs ["foobar"]
foo.propertyArray.push("foobar");
console.log(bar.propertyArray); //logs []




jsfiddle

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


Предыдущий пример демонстрирует необходимость помнить о том, что выражения, переданные любому значению в дескрипторе Object.create выполняются в момент определения дескриптора. Это — причина, по которой массивы становились общими для всех экземпляров класса. Я также рекомендую никогда не рассчитывать на фиксированный порядок, когда несколько свойств определяются вместе. Если это действительно необходимо — определить одно свойство раньше других — лучше использовать для него Object.defineProperty в этом случае.


Так как Object.create не вызывает функцию-конструктор, отпадает возможность использовать instanceof для проверки идентичности объектов. Вместо этого можно использовать isPrototypeOf, который сверяется со свойством prototype объекта. Это будет MyFunction.prototype в случае конструктора, или объект, переданный первым аргументом в Object.create



function Foo() {
}

var prototypeDef = {
protoArray: [],
};
var propertiesDef = {
propertyArrayValue_: {
value: null,
writable: true
},
propertyArray: {
get: function () {
if (!this.propertyArrayValue_) {
this.propertyArrayValue_ = [];
}
return this.propertyArrayValue_;
}
}
}

var foo1 = new Foo();

//old way using instanceof works with constructors
console.log(foo1 instanceof Foo); //logs true

//You check against the prototype object, not the constructor function
console.log(Foo.prototype.isPrototypeOf(foo1)); //true

var foo2 = Object.create(prototypeDef, propertiesDef);

//can't use instanceof with Object.create, test against prototype object...
//...given as first agument to Object.create
console.log(prototypeDef.isPrototypeOf(foo2)); //true




jsfiddle

isPrototypeOf спускается по цепочке прототипов и возвращает true, если любой из них соответствует тому объекту, с которым происходит сравнение.



var foo1Proto = {
foo: "foo",
};

var foo2Proto = Object.create(foo1Proto);
foo2Proto.bar = "bar";

var foo = Object.create(foo2Proto);

console.log(foo.foo, foo.bar); //logs "foo bar"
console.log(foo1Proto.isPrototypeOf(foo)); // logs true
console.log(foo2Proto.isPrototypeOf(foo)); // logs true




jsfiddle

«Пломбирование» объектов, «заморозка» и предотвращение возможности расширения


Добавление произвольных свойств случайным объектам и экземплярам класса только потому, что есть такая возможность, код, как минимум, лучше не делает. На node.js и в современных браузерах, в добавок к возможности ограничения изменений отдельных свойств при помощи defineProperty, существует возможность ограничить изменения и объекту в целом. Object.preventExtensions, Object.seal и Object.freeze — каждый из этих методов налагает более строгие ограничения на изменения в объекте. В строгом режиме нарушение ограничений, налагаемых этими методами, приведет к тому, что будет брошена ошибка, иначе же ошибки произойдут, но «тихо».


Метод Object.preventExtensions предотвращает добавление новых свойств в объект. Он не помешает ни изменить открытые для записи свойства, ни удалить те, которые являются настраиваемыми. Кроме того, Object.preventExtensions также не лишает возможности использовать вызов Object.defineProperty для того, чтобы изменять существующие свойства.



var obj = {
foo: "foo",
};

obj.bar = "bar";
console.log(obj); // logs Object {foo: "foo", bar: "bar"}

Object.preventExtensions(obj);

delete obj.bar;
console.log(obj); // logs Object {foo: "foo"}

obj.bar = "bar";
console.log(obj); // still logs Object {foo: "foo"}

obj.foo = "foobar"
console.log(obj); // logs {foo: "foobar"} can still change values




jsfiddle

(обратите внимание, что предыдущий jsfiddle нужно будет перезапустить с открытой консолью разработчика, т.к. в консоль могут вывестись только окончательные значения объекта)


Object.seal идет дальше. чем Object.preventExtensions. В дополнение к запрету на добавление новых свойств к объекту, этот метод также ограничивает возможности дальнейшей настройки и удаления существующих свойств. Как только объект был «опломбирован», вы больше не можете изменять существующие свойства при помощи defineProperty. Как было упомянуто выше, нарушение этих запретов в строгом режиме приведет к тому, что будет брошена ошибка.



"use strict";

var obj = {};

Object.defineProperty(obj, "foo", {
value: "foo"
});

Object.seal(obj);

//Uncaught TypeError: Cannot redefine property: foo
Object.defineProperty(obj, "foo", {
value: "bar"
});




jsfiddle

Вы также не можете удалять свойства даже если они были изначально настраиваемыми. Остается возможность только изменять значения свойств.



"use strict";

var obj = {};

Object.defineProperty(obj, "foo", {
value: "foo",
writable: true,
configurable: true,
});

Object.seal(obj);

console.log(obj.foo); //logs "foo"
obj.foo = "bar";
console.log(obj.foo); //logs "bar"
delete obj.foo; //TypeError, cannot delete




jsfiddle

В конце концов, Object.freeze делает объект абсолютно защищенным от изменений. Нельзя добавить, удалить или изменить значения свойств замороженного «объекта». Также нет никакой возможности воспользоваться Object.defineProperty с целью изменить значения существующих свойств объекта.



"use strict";

var obj = {
foo: "foo1"
};

Object.freeze(obj);

//All of the following will fail, and result in errors in strict mode
obj.foo = "foo2"; //cannot change values
obj.bar = "bar"; //cannot add a property
delete obj.bar; //cannot delete a property
//cannot call defineProperty on a frozen object
Object.defineProperty(obj, "foo", {
value: "foo2"
});




jsfiddle

Методы позволяющие проверить является ли объект «замороженным», «опломбированным» или защищенным от расширения следующие:

Object.isFrozen, Object.isSealed и Object.isExtensible


valueOf и toString


Можно использовать valueOf и toString для настройки поведения объекта в контексте, когда JavaScript ожидает получить примитивное значение.


Вот пример использования toString:



function Foo (stuff) {
this.stuff = stuff;
}

Foo.prototype.toString = function () {
return this.stuff;
}


var f = new Foo("foo");
console.log(f + "bar"); //logs "foobar"




jsfiddle

И valueOf:



function Foo (stuff) {
this.stuff = stuff;
}

Foo.prototype.valueOf = function () {
return this.stuff.length;
}

var f = new Foo("foo");
console.log(1 + f); //logs 4 (length of "foo" + 1);




jsfiddle

Соединив использование этих двух методов можно получить неожиданный результат:



function Foo (stuff) {
this.stuff = stuff;
}

Foo.prototype.valueOf = function () {
return this.stuff.length;
}

Foo.prototype.toString = function () {
return this.stuff;
}

var f = new Foo("foo");
console.log(f + "bar"); //logs "3bar" instead of "foobar"
console.log(1 + f); //logs 4 (length of "foo" + 1);




jsfiddle

Правильный способ использовать toString это сделать объект хэшируемым:



function Foo (stuff) {
this.stuff = stuff;
}

Foo.prototype.toString = function () {
return this.stuff;
}

var f = new Foo("foo");

var obj = {};
obj[f] = true;
console.log(obj); //logs {foo: true}




jsfiddle

getOwnPropertyNames и keys


Для того, чтобы получить все свойства объекта, можно использовать Object.getOwnPropertyNames. Если вы знакомы с python, то он, в общем, аналогичен методу keys словаря, хотя метод Object.keys также существует. Основная разница между Object.keys и Object.getOwnPropertyNames в том, что последний также возвращает «неперечисляемые» свойства, те, которые не будут учитываться при работе цикла for in.



var obj = {
foo: "foo",
};

Object.defineProperty(obj, "bar", {
value: "bar"
});

console.log(Object.getOwnPropertyNames(obj)); //logs ["foo", "bar"]
console.log(Object.keys(obj)); //logs ["foo"]




jsfiddle

Symbol


Symbol это специальный новый примитив, определенный в ECMAScrpt 6 harmony, и он будет доступен в следующей итерации JavaScript. Его уже сейчас можно попробовать в Chrome Canary и Firefox Nightly и следующие примеры на jsfiddle будут работать только в этих браузерах, по крайней мере на время написания этого поста, в августе 2014.


Symbol могут быть использованы как способ создать и ссылаться на свойства объекта



var obj = {};

var foo = Symbol("foo");

obj[foo] = "foobar";

console.log(obj[foo]); //logs "foobar"




jsfiddle

Symbol уникален и является неизменным



//console logs false, symbols are unique:
console.log(Symbol("foo") === Symbol("foo"));




jsfiddle

Symbol можно использовать вместе с Object.defineProperty:



var obj = {};

var foo = Symbol("foo");

Object.defineProperty(obj, foo, {
value: "foobar",
});

console.log(obj[foo]); //logs "foobar"




jsfiddle

Свойства, определенные при помощи Symbol не будут итерироваться в цикле for in, однако вызов hasOwnProperty сработает нормально:



var obj = {};

var foo = Symbol("foo");

Object.defineProperty(obj, foo, {
value: "foobar",
});

console.log(obj.hasOwnProperty(foo)); //logs true




jsfiddle

Symbol не попадет в массив, возвращаемый функцией Object.getOwnPropertyNames, но зато есть метод Object. getOwnPropertySymbols



var obj = {};

var foo = Symbol("foo");

Object.defineProperty(obj, foo, {
value: "foobar",
});

//console logs []
console.log(Object.getOwnPropertyNames(obj));

//console logs [Symbol(foo)]
console.log(Object.getOwnPropertySymbols(obj));




jsfiddle

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


Proxy


Ещё одно нововведение в ECMAScript 6 это Proxy. Состоянием на август 2014 года прокси работают только в Firefox. Следующий пример с jsfiddle будет работать только в Firefox и, фактически, я тестировал его в Firefox beta, который был у меня установлен.


Я нахожу прокси восхитительными, потому что они дают возможность подхватить все свойства, обратите внимание на пример:



var obj = {
foo: "foo",
};
var handler = {
get: function (target, name) {
if (target.hasOwnProperty(name)) {
return target[name];
}
return "foobar";
},
};
var p = new Proxy(obj, handler);
console.log(p.foo); //logs "foo"
console.log(p.bar); //logs "foobar"
console.log(p.asdf); //logs "foobar"




jsfiddle

В этом примере мы проксируем объект obj. Мы создаем объект handler, который будет обрабатывать взаимодействие с создаваемым объектом. Метод обработчика get довольно прост. Он принимает объект и имя свойства, к которому осуществляется доступ. Эту информацию можно возвращать когда угодно, но в нашем примере возвращается фактическое значение, если ключ есть и «foobar», если его нет. Я вижу огромное поле возможностей и интересных способов использования прокси, один из которых немного похож на switch, такой, как в Scala.


Ещё одна область применения для прокси это тестирование. Кроме get есть ещё и другие обработчики: set, has, прочие. Когда прокси получат поддержку получше, я не задумываясь уделю им целый пост в своем блоге. Советую посмотреть документацию MDN по прокси и обратить внимание на приведенные примеры.

Кроме прочего есть ещё и отличный с доклад с jsconf о прокси, который я очень рекомендую: видео | слайды


Существует много способов использовать объекты в JavaScript более глубоко, чем просто хранилище случайных данных. Уже сейчас доступны мощные способы определения свойств, а в будущем нас ждет, как вы можете убедиться, подумав о том, как прокси может изменить способ написания кода на JavaScript, ещё много интересного. Если у вас есть какие-либо уточнения или замечания, дайте пожалуйста мне знать об этом, вот мой твиттер: @bjorntipling.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Простой клиент OneDrive — всё не так просто

Всем давно уже известен сервис OneDrive от Microsoft, который представляет собой облачное хранилище данных с неплохим Web UI.

Для аналогичных сервисов, в частности, Dropbox, выпущено огромное количество дополнений и расширений, например, MacDropAny и многие другие. Для OneDrive не так много расширений, поэтому он стал площадкой для нас — и мы выпустили альтернативный клиент для OneDrive — syncDriver.



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



Настройка




После подключения мы можем настроить папку для синхронизации и режимы.

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

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

Всё, он работает...




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

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

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

Что умеет




Если есть необходимость добавить в OneDrive произвольную папку с вашего компьютера, syncDriver позволяет использовать симлинки — это реализовано командой Link a folder (или кнопка Add на основной форме).

В syncDriver возможна выборочная синхронизация.

Команда Selective Sync… в окне настроек позволит добавить/исключить папку из синхронизации: все изменения, производимые в ней после этого, не будут отправлены в OneDrive.


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


Простой способ доступа к OneDrive — это назначить букву устройства для папки синхронизации.


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


Работает на всех известных нам версиях Windows начиная от XP до 8.1, на Windows 10 ещё будем тестировать.


Как сделан




Чтобы поддерживать клиент под разные ОС было принято решение использовать .NET. Специфичные для разных систем фрагменты (в основном UI и работа с сервисами/демонами) выделены в отдельные сборки. Текущая версия содержит UI на Windows forms, для версий для других платформ используется Gtk# — но эта версия ещё не выпущена в production.

Для логгирования в системе мы выбрали NLog — работает быстро и конфигурируется крайне просто.

Для модульной SOA мы реализовали свой Framework Context.NET, который доступен на github.

Как работает




syncDriver состоит из двух частей: сервиса и клиента (UI). Общаются они посредством json-пакетов, пересылаемых через сетевое соединение.

Кроме того, все настройки сервиса описаны в .config файле, который настраивается из UI клиента.

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

Весь процесс синхронизации проходит по следующему сценарию:

— каждая файловая система проводит полную индексацию ресурса и сохраняет в локальную базу

— файловая система отвечает за обнаружение изменений и направление сообщения в очередь

— сообщения в очереди обрабатываются в строгом порядке, за исключением особых случаев, которые мы рассмотрим позже

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


Локальная файловая система мониторит изменения через FileSystemWatcher. Кроме того, происходит полный обход дерева с некоторым интервалом, это гарантирует нам подхват изменений, сделанных когда клиент не был запущен.


Получение дерева файловой системы OneDrive реализовано через несколько API, которые дают нам информацию о том, что изменилось при сопоставлении с локальной базой данных.


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


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

В случае конфликтного изменения файла с двух сторон формируется дополнительная копия файла с суффиксом (1), (2) и т.д., автоматическое разрешение конфликтов может быть опцией для будущих версий.


Проблемы




Больше всего проблем было связано с обработкой событий от файловой системы:

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

— при сохранении файла ряд приложений создают временный файл, а затем переименовывают его в файл назначения.

— при попытке повернуть изображение непосредственно в Windows Explorer происходит ряд событий: создание нового временного файла, замещение предыдущего, удаление временного (от предыдущего пункта отличается тем, что временный файл не переименовывается, а копируется).

К настоящему моменту большинство проблем решено, и версия довольно стабильна с момента перехода на OneDrive со SkyDrive.


Зачем




Нашей целью было предложить вам лёгкую, стабильную версию клиента для известного сервиса от MS. Более того, мы планируем выпустить portable версию своего продукта.

Паралельно мы разрабатываем версию для Linux.

И всё-таки зачем?

Сейчас пользователи приходят при к нам для решения следующих задач (в порядке приоритета):

— Работа под Windows 8.1 с локальным accountом

— Работа под Windows XP

— Использование симлинков

— Использование сетевых дисков

— Работа через прокси с авторизацией

и ряд других возможностей.

A больше всего нам хотелось бы услышать в комментариях, какие фичи более всего интересны для вас.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


В некоторых странах Интернет ночью «спит»


На днях были опубликованы результаты интереснейшего исследования, проведенного силами профессора Хайдеманна и его коллег из Университета Южной Калифорнии. В течение 2 месяцев ученые пинговали 3,7 миллиона блоков IP (около 950 миллионов адресов).


Пинговались адреса каждые 11 минут, и спустя 2 месяца были сделаны интересные выводы. Во-первых, из примерно 4 миллиардов доступных IPv4 адресов доступны оказались менее 800 миллионов.


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



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


К слову, Хайдеманн с коллегами еще в 2006 году провел «перепись» сетевых устройств, построив интерактивную карту, получившую название Internet Census.


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



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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Raspberry Pi — что можно сделать на основе «малинки»?


Мини-ПК Raspberry Pi смог быстро стать популярной платформой для разного рода проектов — как коммерческих, так и не очень. Тому есть несколько причин, среди которых — низкая цена компьютера, его относительная универсальность и открытость.


Как результат — интересные проекты стали появляться с завидной регулярностью, и часть таких проектов представлены в этой подборке. Здесь есть и вполне серьезные системы, и проекты, которые можно назвать развлекательными, из серии «а почему бы и нет?».


Суперкомпьютер на базе Raspberry Pi и Lego



Одним из наиболее интересных проектов на основе «малинки» является суперкомпьютер из 64 Raspberry Pi. В качестве элементов для создания «серверных шкафов» послужил обычный конструктор Lego.


В качестве ПЗУ для этой системы использовались карты памяти формата SD, объемом в 16 ГБ. Такие карты были установлены в каждую «малинку».


Как сделать нечто подобное? Подробнейшая инструкция от создателя, профессора университета Саутгемптона Саймона Кокса — по этой ссылке.


Метеозонд на основе Pi



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


Через несколько месяцев работы Дейв действительно смог запустить свой зонд, который пролетел более 30 километров, работал при температурах -50С в очень разреженной атмосфере (1% от стандарта).



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



Интернет-телефон


На основе «малинки» был усовершенствован обычный стационарный телефон с дисковым номеронабирателем. Вместо обычной платы разработчик установил Raspberry Pi.


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


Вот, как это выглядит и работает:



Игровая станция



Это проект хабрапользователя wwakabobik. Интереснейшее устройство, которое позволяет играть в целый ряд старых игр для большого количества консолей, включая NES, SNES, Sega Genesis, PlayStation, а так же SCUMMVM, zxspectrum.


Автор писал, что «вся система базируется на порте RetroArch, основанной на библиотеке libretro, позволяющей использовать эмуляторы различных приставок». Что касается графической оболочки, то использовалась EmulationStation, также RetroPie.


Планшет на основе Raspberry


У этого планшета интересное название — PiPad, а в качестве материала для корпуса использовалось дерево. Выглядит все это вот так:



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


В качестве ОС используется Raspbian Linux с XBMC.


Настенный календарь-органайзер



Пользователь Instructables с ником Piney создал полезный гаджет для себя — настенный интерактивный календарь, с возможностью добавления задач и событий.


Программной платформой служит обычный Google Calendar, все данные из которого транслируются по WiFi на это настенное устройство.


Подробная инструкция о том, как создать нечто подобное — вот.


Собственная радиостанция


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


Правда, покрытие такой радиостанции относительно небольшое: площадь, равная площади стадиона.



DVD ченжер


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



Система освещения для Рождества


До Нового Года и Рождества осталось не так много времени, поэтому, если есть лишняя «малинка», можно создать систему освещения для собственного дома или квартиры. Как сделать такую систему, рассказано вот здесь. А ниже — видео, где показано, как это работает.



В общем-то, сфера использования Raspberry Pi очень широка, гораздо шире, чем создание фоторамок и ноутбуков. Разработчики стараются совершенствовать свое устройство, выпуская новые, обновленные версии мини-ПК и дополнительные модули к нему. К примеру, летом вышел Raspberry Pi B+, на днях компания представила дисплей для «малинки». А через некоторое время (к сожалению, более определенно сказать нельзя) планируется и выпуск Raspberry Pi А+.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Распределенные вычисления для поиска жилья

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

Сегодня я расскажу о распределенных вычислениях, решающих ваши проблемы. Ну не все конечно, а только некоторые, связанные с поиском жилья. Недавно я писал о проекте Sobnik, расширении для Chrome, которое обнаруживает посредников на досках объявлений. Две недели назад была запущена новая версия программы, в которой работа по сканированию и анализу объявлений распределяется по компьютерам пользователей. За прошедшее время было обработано около миллиона объявлений из более тысячи городов России, и это — только начало. Подробности, технические детали и еще немного цифр ждут вас под катом.


Зачем здесь распределенные вычисления?




Для того, чтобы выявить посредника, программе требуется загрузить объявление, распарсить его, проанализировать фотографии, сложить результаты в базу данных и выполнить несколько видов поиска, в частности — по номерам телефонов. Изначально пользователю требовалось открыть конкретное объявление, чтобы плагин выполнил этот анализ. Это неудобно, ведь объявлений сотни, и среди них почти все — посредники. От ручных операций нужно было избавляться, ведь компьютеры для того и существуют, чтобы действовать автоматически!

Первым планом стало создание централизованного сканера объявлений (далее — краулер). Берем PhantomJS, допиливаем под него JS-код плагина, и запускаем сканирование на сервере. Авито, конечно, будет сердиться на масштабное сканирование, и будет блокировать IP сервера, но на тот случай было решено накупить IP-адресов или использовать кучу прокси (Авито — единственная пока доска объявлений, с которой работает плагин). Но чем дольше я работал и думал в этом направлении, тем больше понимал — решение плохое:



  1. Сервера стоят денег, которые тратить не хотелось — проект ведь бесплатный, и я мечтаю его таковым оставить.

  2. Надежности никакой — соревноваться с Avito в поиске незабаненных прокси не было никакого желания.

  3. Масштабируемость такого решения упиралась в еще большие деньги, см. п.1.




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

Распределенный краулер




Активно с Avito в каждый момент времени работает лишь небольшой процент пользователей, однако браузер с работающим плагином запущен почти весь день. Что если в браузере каждого пользователя сканировалось бы, скажем, одно объявление в минуту? Этих суммарных мощностей хватило бы, чтобы быстро сканировать объявления, с которыми в данный момент работают активные пользователи. И Авито бы не расстраивался, ведь перегрузок с определенных IP никогда бы не возникало. Да, вероятно не все захотят делиться мощностями своих компьютеров, однако мне верилось, что «сознательных граждан» будет все же достаточно. Идея выглядела очень заманчиво.

Углубившись в техническую часть нового подхода я осознал, что с возросшими нагрузками текущий сервер просто не справится. Обработка фотографий для обнаружения номеров телефонов и так уже жрала почти весь CPU, а если поток объявлений возрастет на порядок? Бесплатный виртуальный сервер от AWS Free Tier должен был справляться, иначе жизнь проекта была под угрозой. Так что первым шагом стал перенос работы с изображениями в масштабируемую часть системы — на клиента. Код плагина открыт, и конечно были опасения, что публикация алгоритма облегчит злым спамерам поиск слабых мест и путей для обмана. Однако, других вариантов для развития проекта я не видел, и решил — будь что будет.


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


Сознательных граждан, пожелавших поделиться мощностями своего ПК, пока не так уж много — порядка пары сотен. Однако, этого вполне достаточно, чтобы обрабатывать по 60 тысяч объявлений в день, обеспечивая нужды тысячи пользователей плагина. Открытый на Авито список из сотни объявлений обычно обрабатывается в пределах одной минуты.


Звучит все это довольно просто, однако меня до сих пор завораживает возможность использовать сотни чужих компьютеров для решения общей задачи. Браузер — идеальная платформа для приложений такого рода:



  1. JavaScript нынче умеет почти всё.

  2. JS-код — кроссплатформенный (за исключением обращений к API браузера).

  3. Расширение устанавливается в один клик.

  4. Распространением обновлений ПО занимается Webstore.

  5. Браузер запущен большую часть дня.




Если вы задумали свои собственные SETI@HOME — присмотритесь, может вам пора изучать API любимого браузера. Об этом уже многие писали, но расцвета распределенных вычислений, решающих практические проблемы волонтеров, а не абстрактной человеческой цивилизации — пока не видно.

Стоит обратить внимание на один нюанс — людей очень напрягает, когда в браузере самостоятельно открываются вкладки. И если уж открывать их необходимо, стоит потратить достаточно усилий на то, чтобы такое поведение было ожидаемым для пользователей (инструкции, faq, понятные информационные сообщения). Пользуясь случаем, приношу извинения всем, кто был удивлен поведением плагина после выхода новой версии программы — мне следовало потратить больше времени на информирование вас о таких существенных нововведениях.


Эффективный сервер




Сервер, координирующий работу в распределенной вычислительной системе, должен быть очень эффективным, ведь его не так легко масштабировать. Сервер проекта Sobnik занимается не только координацией, но и решением прикладной задачи — поиском по базе данных, поэтому требования к нему еще выше. И если функциональность клиентской части была просто слегка расширена, сервер был переделан почти полностью (напомню, он написан на Go).

Изначально за хранение данных и выполнение поисков отвечала MongoDB, теперь все рабочие данные хранятся в ОЗУ. На сервере запущено два процесса — фронтенд и бекенд. Фронтенд взаимодействует с клиентами, ведет очередь заданий для распределенного краулера, очередь объявлений для передачи в бекенд, и небольшой кэш с информацией о статусе объявлений (посредник/собственник). Бекенд хранит данные в ОЗУ (выжимку из входящих объявлений), выполняет по ним поиски, асинхронно пишет входящие объявления в MongoDB, асинхронно выполняет запросы фронтенда. Взаимодействуют процессы с помощью ZeroMQ.


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


Пока бекенд запускается, наполняя свою базу, фронтенд продолжает обслуживать клиентов — входящие объявления складывает в очередь, запросы статуса объявлений обслуживает из кэша, задания раздает из своей очереди.


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


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


Такая архитектура создавалась с целью обеспечить максимальную надежность и доступность сервиса. И пока что она себя оправдывает — имея в базе почти миллион объявлений и обрабатывая до миллиона http-запросов в день, load_average на виртуальном сервере стабильно держится ниже 10%.


Ищем жилье по-новому!




Sobnik успешно пережил второе рождение — «распределился» и окреп. Месяц назад это была лишь интересная идея, прототип, который многие установили чтобы побаловаться. Теперь — это работающий инструмент, которым удобно пользоваться и который реально помогает фильтровать спам. Это стало возможным благодаря вам, Уважаемые Пользователи, ведь это ваши компьютеры решают общую задачу.

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


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Небольшой рассказ о BlackHat Europe 2014


На прошлой неделе завершилось одно из знаковых ежегодных мероприятий в мире практической информационной безопасности — BlackHat Europe 2014. О том, как оно проходило, чем запомнилось, и пара фото — под катом.


Если BlackHat USA традиционно проводится в Лас-Вегасе, то для проведения конференции в Европе места лучше, чем уютная столица свободы нравов и неколебимых культурных ценностей, сложно себе представить. Этот год не стал исключением, и BlackHat Europe проходил в славном городе Амстердаме, в стенах конференц-центра Amsterdam RAI.



Конференция поделена на две части: первые два дня проходят тренинги, и еще два дня отведено самому интересному.

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




Первый день в качестве keynote открывал живая легенда современной криптографии и infosec вообще — Ади Шамир (на секундочку, он по прежнему «S» во всем знакомой аббревиатуре RSA).

Обычно, keynote-доклады строятся вокруг общей аналитики происходящих в той или иной области процессов, мировых течений и модных трендов.

Но профессор Шамир, после небольшого экскурса в историю громких взломов различных криптосистем и в историю личных достижений (а эти две истории во многом пересекаются), припомнив недавнюю утечку описаний инструментария NSA и одну из своих последних работ, перешел непосредственно к рассказу о любопытном концепте двустороннего канала взаимодействия.




Дано:


  • Обычное с виду многоэтажное здание с функционирующей внутри обыкновенной офисной инфраструктурой.

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

  • Внутри, занесенное каким-то образом, существует троянское ПО.


Необходимо установить двусторонний канал взаимодействия с этим ПО для передачи управляющих команд и получения данных из этой информационной крепости.



Был предложен рецепт в лучших традициях шпионских кинофильмов и параноидальных кошмаров. В качестве коммуницирующего элемента было выбрано обыкновенное сетевое многофункциональное устройство (одно из тех, что печатают, сканируют и управляются через сеть). А именно, для доставки информации в здание инициировался процесс сканирования, а с расстояния в километр с небольшим производилась засветка помещения, в котором находилось МФУ, при помощи мощного лазера, кодирующего биты информации соответственно излучением и паузами между вспышками.

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

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


Затем Jose Selvi поведал о технике обхода HSTS в условиях MitM путем подмены ответов от NTP-сервера и «перематывания» времени на клиентском хосте вперед, вплоть до истечения периода, в течение которого браузер обязан использовать защищенное соединение. В принципе, вектор лежал на поверхности, и нового в NTP-спуфинге немного, но автор представил демо работающего NTP-спуфера (а всегда приятно видеть рабочую боевую тулзу). И, помимо прочего, предоставил некоторую информацию о том, как ведут себя NTP-клиенты в различных ОС. В Windows, как оказалось, самая защищенная от такого типа атак реализация.


image


Следом нас ждал доклад от Alberto Garcia Illera и Javier Vazquez Vidal — безбашенных чуваков из Испании. Альберто ранее можно было увидеть рассказывающим про слабости транспортных систем на Zeronights 0x02. В этот раз они с коллегой распотрошили умный счетчик электроэнергии и продемонстрировали уязвимости встраиваемой платформы, на которой он был построен, и архитектурные слабости сетей, в которые объединяются подобные устройства, с помощью которых злоумышленники могут потенциально скомпрометировать всю систему учета энергопотребления и, конечно же, не платить по счетам. Доклад пестрил техническими подробностями о богатом внутреннем мире умного счетчика и содержал в себе все составляющие классической хакстори: процесс реверс-инжиниринга неведомой железки, обход заводских методов защиты, дамп и последующие реверс и модификация прошивки. Все это сопровождалось лайв-демо прямо со сцены.


Вторая половина дня отметилась крутейшим докладом от Balint Seeber про SDR в общем и целом и конкретные кейсы применения Software Defined Radio для пользы и забавы ради. От игр с RDS, ADS-B, пейджинговыми системами и радиокнопками на столах в ресторанах до таких безумных вещей, как установление связи и программирование космического аппарата, 15 лет безжизненно болтавшегося на орбите. Балинт — специалист по визуализации, фанат SDR и евангелист в компании Ettus, один из тех самых энтузиастов, что, используя чашу радиотелескопа, сотворили это чудо.



Также была представлена в действии еще не запущенная в производство новая модель USRP — e310, самая портативная SDR-платформа от Ettus. С ее помощью на время доклада была развернута полностью функциональная локальная GSM-сеть на OpenBTS и Asterisk, что дало возможность задавать вопросы, непосредственно позвонив или написав SMS на короткий номер докладчику.



Для пущего увеселения публики, во время выступления на частоте 915 МГц в цикле проигрывался сэмпл, waterfall-спектрограмма которого представляла собой различные графические образы.


Следующим докладом отметились наши соотечественники Алексей Осипов и Ольга Кочетова, рассказав, как можно развлечь себя при помощи банкомата, если расширить его функциональность с помощью Raspberry PI. Были подробно раскрыты вопросы методов исследования функционирования внутренних компонентов современных ATM, межкомпонентного взаимодействия, а также продемонстрированы векторы атак на них.



Закрывали первый день мы с Александром Большевым (dark_k3y) докладом о ряде уязвимостей в FDT/DTM-компонентах, обнаруженных в ходе нашего исследования, и о самом исследовании, включавшем в себя разработку ряда специальных программных и аппаратных инструментов для анализа промышленных протоколов и поиска уязвимостей.



Следующий день докладов запомнился рассказом от человека-XSS, Ashar Javed.



Ашар поведал о своей методологии поиска уязвимостей межсайтового скриптинга (XSS) в WYSIWYG-редакторах, о том, как следуя ей, ему удалось обнаружить уязвимости почти во всех популярных визуальных текстовых редакторах, и о специфике последующего общения с вендорами.


Был чрезвычайно познавателен доклад от Gregory Pickett про Software Defined Networks, а представленный инструментарий для работы с openflow, я уверен, найдет свое применение.



И напоследок, Oren Hafif зажег с попыткой обозначить новый тип веб-уязвимости — Reflected File Download.



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


В заключение можно даже не упоминать отдельно, что Blackhat Europe выдался богатым по содержанию, существует даже мнение, что в этом году локальный ивент превзошел своего старшего американского брата по уровню докладов. Ну и, конечно же, BH это не только доклады, но и живое общение, масса новых интересных контактов, свежих взглядов со стороны, огромный полезный опыт и источник новых идей.


Полный список докладов с описаниями и материалами


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.