Pull to refresh
27
0
Игорь @CLaiN

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

Send message

Загрузка фото пользователя в Active Directory с помощью PowerShell

Reading time7 min
Views82K
Если вы используете Active Directory у вас используется Exchange, OwnCloud, SharePoint или другая система с возможностью отображения аватара или фото, то после прочтения данный статьи у вас появится возможность загрузить фото пользователя в AD для отображения в Outlook, Lync, на порталах SharePoint и других системах.
Читать дальше →
Total votes 18: ↑18 and ↓0+18
Comments5

Настройка TeamCity в Azure — постоянно-доступная система для командной работы в облаке

Reading time6 min
Views7.7K
Эта статья продолжает цикл, начатый нашими друзьями из Лаборатории Касперского и описывает реальный опыт использования инструментов тестирования от Microsoft (и не только) с рекомендациями и выводами. Автор — инженер по тестированию, Игорь Щегловитов (@ins4n3 на хабре). Наши статьи, посвященные тестированию, помечены тегом #mstesting.

В данной статье я хотел бы поделиться о своём первом опыте настройки процесса Continuous Integration c помощью популярной системы TeamCity, на виртуальной машине в Azure. Это хорошо тем, что у нас всегда будет доступна наша система с удобным доступом и контролем над ресурсами.


Читать дальше →
Total votes 27: ↑23 and ↓4+19
Comments2

Триггерные рассылки

Reading time11 min
Views9.3K
Последнее время в Email-маркетинге все чаще используются автоматические рассылки определенным группам потребителей. Типичные задачи:
  • поздравить с днем рожденья
  • позвать на сайт, если потребитель на него долго не заходил
  • сделать персонализированное предложение (делим потребителей на сегменты и рассылаем каждому сегменту свое письмо)

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

Первые реализации

3 года назад подобные задачи возникали крайне редко и мы каждый раз реализовывали их с нуля. При этом возникали одни и те же вопросы:
  1. Как помечать потребителей, которым мы уже отправили это письмо?
  2. Как максимально быстро обработать всех потребителей и при этом не тормозить работу сайтов (которые обращаются к тем же записям в БД)?

На первый вопрос ответ для нас был очевиден: в нашей системе сохраняется информации о всех значимых действиях, выполняемых потребителем (вход на сайт, изменение персональных данных) или над ним (розыгрыш приза, отправка уведомления). Кроме того, мы используем действия для разнообразных технических пометок потребителей. Так что при отправке автоматической рассылки, мы также решили выдавать потребителю особое действие-маркер, в качестве пометки, что эта автоматическая рассылка ему уже была отправлена. Чтобы повторно не отправлять рассылку, к условию рассылки всегда добавляется условие “у потребителя нет действия-маркера”.

На втором вопросе мы набили множество шишек, связанных с блокировками в БД, и в итоге пришли к следующему шаблону:
  1. Отправка рассылок идет из windows-сервиса, который периодически проверяет не появилось ли новых потребителей, подходящих под условия.
  2. В сервисе первым шагом делается один запрос к БД с уровнем изоляции Read Uncommitted. Этот запрос вытаскивает Id всех потребителей, которым надо отправить письмо. Из-за низкого уровня изоляции такой запрос не накладывает блокировок на записи в БД и, как следствие, крайне слабо влияет на работу сайта. Однако он не гарантирует чистоту данных и их надо повторно проверить с более высоким уровнем изоляции.
  3. После того, как мы вытащили Id потребителей, для каждого потребителя мы выполняем отдельную транзакцию с уровнем изоляции Serializable. В этой транзакции мы заново проверяем подходит ли потребитель под условия и если да, отправляем ему письмо и выдаем действие-маркер. Так как мы обрабатываем каждого потребителя в отдельной транзакции, блокировки накладываются только на данные одного потребителя и на работу остальных потребителей не влияют. Так как такая транзакция очень короткая, у потребителя, которому отправляют письмо, также не будет особых проблем, если он в это время ходит по сайту. Уровень изоляции транзакции должен быть именно Serializable, чтобы ненароком не отправить одно письмо дважды, или не отправить письмо тому потребителю, который внезапно перестал подходить под условия. Хотя, если мы гарантируем, что отправка одной и той же рассылки может идти только из одного потока и с одного сервера, а также забьем на небольшую вероятность того, что одному потребителю могут отправится две рассылки с взаимоисключающими условиями, то можно использовать и Read Committed транзакцию.

Само собой после реализации нескольких рассылок по этому шаблону, мы решили вынести шаблонный код. Для этого был создан класс BatchMailing, и для каждой новой рассылки мы создавали и регистрировали в специальном реестре его наследника. В наследнике необходимо было перегрузить следующие свойства и методы:
  • шаблон действия-маркера (раньше мы называли шаблон типом действия: думаю, для разработчиков это более понятный термин), которое выдается при отправке письма
  • метод, отправляющий письмо
  • метод, выполняющий дополнительные действия (например, вместе с отправкой поздравления с днем рожденья, мы можем выдавать потребителю баллы на счет)
  • метод, который формирует Expression<Func<Customer, bool>>, проверяющий, что потребитель подходит под условие

Свойство и первые два метода никогда никаких проблем не вызывали, но вот составить Expression было довольно таки не просто. Этот Expression использовался два раза — сначала в Read Uncommitted запросе, чтобы вытащить Id потребителей, а затем в Serializable транзакции, чтобы повторно проверить подходит ли потребитель под условие. Его было нужно написать так, чтобы Linq to SQL смог его транслировать в T-SQL. Условия могли быть довольно сложными и в них всегда возникали проблемы. Ни одну рассылку нельзя было завести не написав на нее кучку тестов. Кроме того, для отправки СМС и email мы завели разных промежуточных наследников от BatchMailing. Когда же нам надо было отправить и email и СМС, приходилось копипастить. У меня были идеи как это исправить, но так как автоматические рассылки клиенты просили не так уж и часто, это была низкоприоритетная задача.

Замена наследования композицией

2 года назад при разработке очередной рекламной кампании клиент попросил сделать ему сразу 8 разных автоматических рассылок. При этом частично условия в рассылках повторялись. Тут уже не оставалось сомнений, что больше так жить нельзя, и я взялся за переписывание нашей архитектуры. Для того чтобы справится со всеми описанными выше проблемами достаточно было применить наш любимый прием: замену наследования композицией. Этот прием настолько много раз нам помогал, что я советую использовать композицию вместо наследования везде, где это возможно (ну или как минимум рассматривать такой вариант). Если вы создаете базовый абстрактный класс с мыслью “для каждой конкретной задачи у меня будет наследник перегружающий методы и свойства”, сразу спрашивайте себя “а почему бы мне вместо этого не регистрировать для каждой задачи экземпляр класса, передавая ему разные настройки”. И только если вы уверены, что композиция здесь не подходит, используйте наследование. Если подходит и то и то, всегда склоняйтесь к композиции — так получается гораздо более гибкая и понятная архитектура.

В нашей ситуации:
  • вместо перегрузки свойства, возвращающего шаблон действия-маркера, это свойство проставляется экземпляру класса
  • вместо перегрузки методов отправляющих письма/смс и выполняющих дополнительную логику, у экземпляра класса проставляется произвольная операция, которую нужно совершить над потребителем. При этом операция может быть комбинацией из других операций
  • вместо перегрузки метода формирующего Expression, экземпляру класса проставляется условие. При этом условия можно комбинировать через И/ИЛИ

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

Регистрация триггера выглядела примерно следующим образом:
Add(new Trigger(“Приглашение на сайт для пришедших через канал one-to-one”)
{
	MarkerActionTemplateSystemName = “InvitationMarker”,
	TriggerAction = new TriggerActionCombination(
		new GeneratePasswordForCustomerTriggerAction(),
		new SendEmailTriggerAction(“InvitationMailing”)),
	TriggerCondition = new AndTriggerConditionSet(
		new CustomerHasSubscripionCondition(),
		new CustomerHasEmailTriggerCondition(),
		new CustomerHadFirstActionOverChannelCondition(“OneToOne”)),
});

Интерфейс TriggerAction’а крайне прост:
public interface ITriggerAction
{
	void Execute(
		ModelContext modelContext, // класс для работы с БД 
		Customer customer);
}

Базовый класс для условий триггера выглядит следующим образом:
public class TriggerCondition
{
	private readonly Func<ModelContext, Expression<Func<Customer, bool>>> triggerExpressionBuilder;

	public TriggerCondition(Func<ModelContext, Expression<Func<Customer, bool>>> triggerExpressionBuilder)
	{
		if (triggerExpressionBuilder == null)
			throw new ArgumentNullException("triggerExpressionBuilder");

		this.triggerExpressionBuilder = triggerExpressionBuilder;
	}

	public Expression<Func<Customer, bool>> GetExpression(ModelContext modelContext)
	{
		return triggerExpressionBuilder(modelContext, brand);
	}

	// Используется в Read Uncommitted транзакции для получения спиcка Id потребителей, подходящих под условие
	public IQueryable<Customer> ChooseCustomers(ModelContext modelContext, IQueryable<Customer> customers)
	{
		if (modelContext == null)
			throw new ArgumentNullException("modelContext");
		if (customers == null)
			throw new ArgumentNullException("customers");

		var expression = GetExpression(modelContext);
		return customers.Where(expression).ExpandExpressions();
	}

	// Используется в Serializable транзакции, для проверки, что потребитель все еще подходит под условие
	public bool ShouldTrigger(ModelContext modelContext, Customer customer)
	{
		if (modelContext == null)
			throw new ArgumentNullException("modelContext");
		if (customer == null)
			throw new ArgumentNullException("customer");

		var expression = GetExpression(modelContext);
		// Можно бы было просто вызывать expression.Evaluate(customer),
		// но тогда для сложных условий выполнилось бы несколько запросов в БД вместо одного
		return modelContext.Repositories.Get<CustomerRepository>().Items
			.Where(aCustomer => aCustomer == customer)
			.Where(aCustomer => expression.Evaluate(aCustomer))
			.ExpandExpressions()
			.Any();
	}
}
Для часто используемых условий мы создавали наследников от TriggerCondition, в которых строился конкретный Expression в зависимости от переданных в конструктор параметров.

Все, надоело, сами заводите свои триггеры

С использованием архитектуры, описанной выше, мы заводили триггер менее чем за пол часа, за счет комбинирования уже написанных условий и TriggerAction’ов. Однако и этого нам было мало. Следующим шагом мы захотели полностью исключить разработчиков из процесса заведения триггеров. Причем как это делать в общих чертах я понял уже через пару месяцев после реализации предыдущей версии архитектуры. Условия триггеров были один в один похожи на фильтры, которые мы используем в админке. Наша система фильтров позволяет описывать сложные условия, включая запросы к связанным сущностям, а также позволяет комбинировать их через И/ИЛИ. Фильтр формирует Expression, с помощью которого уже можно отфильтровывать сущности в БД. И для всего этого уже был написан UI и сериализация. Оставалось лишь добавить пару фильтров, которые часто нужны для триггеров, но не имели смысла при обычной работе со списком потребителей (например: “с действия прошло N дней”). Для TriggerAction’ов надо было написать UI и структуру для хранения их в БД, но тут тоже в общем все было понятно. Однако оставались еще небольшие вопросы, над которым пришлось поломать голову:
  • отсылку любого письма мы к этому времени стали регистрировать как действие, и действие-маркер стало лишним — мы и так могли определить, кому мы отправляли письмо, и вообще хотелось бы избавиться от выдачи лишних действий везде, где это было возможно
  • кроме простых триггеров, которые выполняли определенный набор операций один раз над каждым потребителем, у нас появились периодические триггеры. Надо было придумать как это все перенести в БД и при этом позволить использовать произвольные маркеры
  • маркетологи придумывают триггеры не отдельно друг от друга, а в качестве цепочек, в которых есть как триггеры так и операции, выполняемые потребителем на сайте (письмо с предложением зайти на сайт и что-то сделать → потребитель выполняет несколько операций на сайте → начисляются бонусные баллы и посылается письмо об этом). Хотелось бы если и не реализовать это сразу, то оставить задел на будущее, чтобы было не сложно описывать зависимости между триггерами и операциями
Все эти три проблемы связаны с тем, как мы определяем выполнился ли триггер над потребителем или нет. Если заводить для каждого триггера и операции на сайте свой маркер, задача сильно упрощается, но плодить лишние действия в системе очень не хотелось. Была даже идея заставлять менеджеров составлять фильтр таким образом, чтобы он полностью отвечал за то, можно ли сейчас выполнить действие над потребителем (и соответственно частота повторения триггера описывалась бы условием в фильтре), однако данный подход слишком уж располагает к ошибкам. После долгих мучительных размышлений мне все-таки пришла идея, как отслеживать выполнение триггеров без дополнительных сущностей и без усложнения работы менеджера.

Нужно больше Expression’ов

Так как триггер выполняет абстрактный шаг операции (бывший TriggerAction) над потребителем, причем почти всегда этот шаг операции уникален (например, определенное письмо отсылается или определенный приз выдается только из этого триггера), то в этот шаг можно вынести логику проверяющую выполнился ли он. Так как в триггере может быть несколько шагов операции, то менеджеру надо будет выбрать какой из них является маркером (проверять выполнение каждого шага не имеет смысла). Однако просто, реализовать в шаге операции метод, возвращающий Expression<Func<Customer,bool>> нельзя, так как пришлось бы в каждом шаге операции формировать один Expression для одноразовых триггеров, другой для периодических. Тут нас спасает то, что практически любая операция над пользователем в нашей системе выдает ему действие. Соответственно шаг операции может отфильтровать те действия, которые были выдан им. Большинство шагов операции выдают конкретное действие и для них метод, формирующий Expression для фильтрации действий, выглядит вот так:
public sealed override Expression<Func<CustomerAction, bool>> GetIsMarkerExpression(ModelContext modelContext)
{
	return action => action.ActionTemplateId == ActionTemplateId;
}

Но, например, у шага, выдающего приз, он выглядит следующим образом:
public override Expression<Func<CustomerAction, bool>> GetIsMarkerExpression(ModelContext modelContext)
{
	IQueryable
Читать дальше →
Total votes 11: ↑11 and ↓0+11
Comments5

Штампуем окна: автоматизированное развёртывание виртуальных машин Windows на Hyper-V при помощи Vagrant (часть 1)

Reading time7 min
Views21K
Рано или поздно перед любой растущей ИТ-компанией встаёт задача оптимизации ресурсов, которая с точки зрения системного администрирования обязательно предполагает максимальную автоматизацию всех процессов. Нужно это по многим причинам: сокращение затрат времени, минимизация влияния человеческого фактора, повышение за счёт этого масштабируемости и надёжности систем в целом.

Наша компания Wild Apricot занимается разработкой ПО (SaaS), которое работает на ASP и .NET, а в качестве базы данных использует MS SQL Server. Поэтому львиная доля инфраструктуры у нас работает под управлением Windows, преимущественно Server 2012 R2. Соответственно, отделу сисопов периодически приходится поднимать новые машины с ней, а иногда и разворачивать целые фермы, как на живом окружении, так и на тестовом. В настоящее время у нас порядка 20 гипервизоров и, соответственно, более сотни разнообразных машин, из которых абсолютное большинство — это ВМ с Windows. Сейчас планируется установка ещё полудюжины девелоперских окружений, каждое из которых состоит из десятка компонент, которые желательно изолировать друг от друга. Для решения подобных задач мы и задумали автоматизацию всего процесса. Описание всего пути я сделал довольно детальным, так что статья разрослась и поэтому я решил разделить её на три части. В этой части я постараюсь затронуть общие вопросы, объяснить выбор инструментов и рассказать, как подготовить окружение для дальнейшей работы.
Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments12

rusEfi: итоги 2014 года и планы

Reading time3 min
Views40K
В конце лета у открытого блока управлением двигателем внутреннего сгорания rusEfi появилась первая интегрированная плата — Frankenso 0.1, ложкой дёгтя тогда была парочка перепутанных трасс.

image

Читать дальше →
Total votes 61: ↑57 and ↓4+53
Comments19

Исследование причин аномального голосования на сайте РОИ или особенности электронной демократии в России

Reading time7 min
Views126K
За сайтом «Российские общественные инициативы» я наблюдаю давно, примерно с 29 мая 2013 года. Как и другие наблюдатели, я замечал аномалии в ходе голосований за различные инициативы. Но это мало кого беспокоило, пока аномалии приводили по нашим оценкам к росту числа голосов. Видимо, никто не считал чем-то плохим, если очередная инициатива наберет 100 000 голосов раньше срока. Всё изменилось, когда аномалии стали замедлять голосование.

Отзывы голосов на РОИ

Это началось 24 ноября в 13:35 по московскому времени. Счетчик голосов за принятие инициативы 9376 уменьшился на 2. Потом еще на 1 и еще на 2. Вечером уменьшение значения счетчика стало происходить всё чаще и чаще. Кто-то заметил это и сообщил автору инициативы. С этого момента начался тщательный мониторинг хода голосования.

Я расскажу про некоторые странности голосования, которые мы (наблюдатели) заметили за последнюю неделю. Также я попытаюсь сделать предположения о причинах некоторых из них. Выводов довольно мало, т.к. не всегда есть возможность получить нужные данные о ходе голосования.
Читать дальше →
Total votes 244: ↑233 and ↓11+222
Comments261

Маршрутизация в Mac OS при VPN подключении

Reading time2 min
Views101K
Появилась как-то задача подключатся по VPN к рабочей сети, чтобы иметь доступ к внутренним ресурсам.
Средствами Мака это можно сделать создав VPN подключение и 2 варианта:
1. поставить галочку «Слать весь трафик через VPN подключение»
2. статически прописать статически route add -net 192.168.10.0/24 192.168.44.1, где 192.168.10.0/24 — сеть в которой находятся компьютеры на работе, 192.168.44.1 VPN шлюз к которому я подключаюсб.

Итак после каждого подключения нужно делать вторую манипуляцию, так как общий доступ в интернет ограничен и скорость не ахты. Или задача состоит в том чтобы ходить на сайты (например youtube) через более быстрый канал VPN…

Решение ниже
Total votes 27: ↑20 and ↓7+13
Comments32

Как и для чего Яндекс отключает собственные дата-центры

Reading time7 min
Views110K
Раз в неделю Яндекс отключает один из своих дата-центров. Мы называем это учениями. Что это такое? Как возникло? Зачем мы это делаем? А не диверсия ли это? Насколько это опасно? На эти вопросы мне регулярно приходится отвечать как внутри, так и снаружи компании. Сегодня я решила прояснить все эти вопросы разом.



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

Для начала предлагаю обратиться к истории и попытаться понять, как мы пришли к такому решению. Все привыкли к тому, что наши сервисы работают всегда, без перерывов на обед и профилактику. Серьезные сбои происходят настолько редко, что каждый из них становится заметным событием.
Читать дальше →
Total votes 138: ↑133 and ↓5+128
Comments115

8 лучших утилит для OS X, которые должен иметь каждый маковод (ч. 1)

Reading time3 min
Views64K


OS X (Mac OS) поистине одна из лучших, да что там, лучшая операционная система на рынке. Помимо дружелюбия к пользователю, она предоставляет множество функций, упрощающих те или иные бытовые действия. Однако, всегда хочется чего-нибудь еще. Всегда найдутся те, кому стандартных функций будет мало. В случае с iOS применим Jailbrake. C OS X дело обстоит проще. Здесь разработчикам дана полная свобода и можно со всех сторон напичкать систему всевозможными утилитами и дополнениями.
Читать дальше →
Total votes 58: ↑31 and ↓27+4
Comments164

.NET Framework скоро Open Source и на *nix

Reading time1 min
Views92K

Основное

  • Reference Source для .NET 4.6 перелицензируется под MIT;
  • В дальнейшем фреймворк будет с открытыми исходниками и поставляться по частям через NuGet, можно будет с приложением поставлять свою сборку, которая будет изолирована от всего остального;
  • Разработка переезжает на GitHub;
  • Скоро откроют исходники рантайма, включая RyuJit и сборшик мусора;
  • Для всего этого счастья планируется официальная поддержка никсов.





Mono не то чтобы больше не нужен, в дальнейшем с ними будут плотно сотрудничать для портирования, вероятно, этот стек будет некоторое время поставляться в составе Mono, так как открыто ещё далеко не всё и для полноценной работы потребуются вещи из его состава.
На закуску
Total votes 166: ↑155 and ↓11+144
Comments259

Почему по мере заполнения SSD падает скорость записи в RAID, или зачем нужен TRIM

Reading time7 min
Views120K
Эта проблема наиболее актуальна для аппаратных RAID или firmware RAID (таких как Intel RST RAID 1/10/5/6) с непромышленными SSD.

Особенность SSD


SSD пишут и читают данные страницами, записать можно только на очищенные страницы, а очистить страницы можно только большими блоками. Например, у диска размер страницы 8 КБ, в блоке находится 128 страниц, таким образом, размер блока — 1024 КБ (здесь и далее, если не указано иного, КБ и МБ двоичные).

Например, если изменить 40 КБ в одном файле, то на физическом уровне это будет выглядеть так:


Читать дальше →
Total votes 65: ↑64 and ↓1+63
Comments74

Facebook официально доступен в Tor

Reading time1 min
Views62K
Произошло то, что как бы совсем не ждали, совершенно. У Facebook появилось официальное зеркало в Tor.
facebookcorewwwi.onion

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

Зеркало доступно только по HTTPS. Как сообщается в анонсе, это сделано из-за архитектурных особенностей: Tor-демон работает как реверс-прокси в основную инфраструктуру через интернет, и HTTPS применяется для шифрования и аутентификации на транспортном уровне от Tor до серверов Facebook.
Читать дальше →
Total votes 70: ↑60 and ↓10+50
Comments86

Fitbit представила 2 новых фитнес-браслета Charge и Charge HR, а также «суперчасы» Surge

Reading time2 min
Views12K
Последняя громкая новость от Fitbit была малоприятной: компания решила отозвать все браслеты Fitbit Force из-за неудачного материала его корпуса, который мог вызывать раздражение на коже владельца. На замену ему пришло сразу две модели: Charge и Charge HR, официально анонсированные сегодня вместе с “суперчасами” Fitbit Surge.



Разница Charge от своего предшественника минимальна и заключается в первую очередь в измененном корпусе, который приятнее выглядит и точно не вызовет зуда. Это фитнес-браслет начального уровня, позволяющий отслеживать основные показатели, вроде количество шагов или пройденного расстояния. Также Charge умеет уведомлять о входящем звонке, высвечивая на OLED-дисплее имя вызывающего абонента — Force получил такую функцию лишь с обновлением. На сайте компании модель получится заказать за $129.
Читать дальше →
Total votes 16: ↑14 and ↓2+12
Comments19

Как нам улететь с Земли: краткое пособие для выезжающих за орбиту

Reading time5 min
Views138K
Недавно на хабре появилась новость про планируемую постройку космического лифта. Для многих это показалось чем-то фантастическим и невероятным, вроде огромного кольца из Halo или сферы Дайсона. Но будущее ближе, чем кажется, лестница в небо вполне возможна, и может быть мы даже увидим ее на своем веку.
Сейчас я постараюсь показать, почему мы не можем пойти и купить билет «Земля-Луна» по цене билета «Москва-Питер», как нам поможет лифт и за что он будет держаться, чтобы не рухнуть на землю.

С самого начала развития ракетостроения головной болью инженеров было топливо. Даже в самых современных ракетах топливо занимает где-то 98% массы корабля.
Если нам захочется передать космонавтам на МКС пакетик пряников массой в 1 килограмм, то на это потребуется, грубо говоря, 100 килограмм ракетного топлива. Ракета-носитель одноразовая, и на Землю вернется только в виде обгоревших обломков. Дорогие получаются прянички. Масса корабля ограничена, а значит и полезный груз на один запуск строго лимитирован. И каждый запуск требует расходов.
А если мы хотим полететь куда-то дальше околоземной орбиты?

Инженеры со всего мира сели и стали думать: каким должен быть космический корабль, чтобы увезти на нем больше, и долететь на нем дальше?

Читать дальше →
Total votes 111: ↑100 and ↓11+89
Comments215

Компания Fitbit готовится к запуску нового браслета — Fitbit Charge

Reading time2 min
Views5.8K
Небольшое отступление.
Компания Fitbit является лидером на рынке носимых фитнес-браслетов, удерживая долю около 50% на крупнейшем рынке этих устройств (американском).
История носимых фитнес-трекеров и началось с Fitbit, когда в сентябре 2008 года компания анонсировала трекер Fitbit Classic.
Он умел совсем немного — считать шаги, калории и отслеживать качество сна.
С тех пор линейка устройств Fitbit с каждым годом ширилась и сегодня представлена умными весами Aria, трекерами One, Zip и браслетам Flex и Force.
Из-за браслета Force, представленного в январе 2014 года, компания чуть не разорилась, но об этом ниже.
Для читателей GT, возможно, будет интересен тот факт, что у Fitbit есть довольно большой офис в Минске, где компания работает над софтом для своих фитнес-устройств.

Журналистам издания Gizmodo попали в руки материалы, говорящие о том, что Fitbit заменит неудачный Force новой моделью.


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

Мой умный дом на .NET, версия 2.0

Reading time4 min
Views12K
Добрый вечер!

Предлагаю вашему вниманию проект, над которым я работаю последние полтора года. Это программный продукт (если быть точным, .NET Windows Service), с помощью которого вы можете организовать на своем компьютере управляющий центр «умного дома». Хотя это всего лишь мое хобби (моя основная работа — веб-разработчик на .NET), многие люди, которым я показывал мой проект, высоко его оценили. Я пишу эту статью, чтобы попробовать заинтересовать вас.


Читать дальше →
Total votes 30: ↑26 and ↓4+22
Comments31

Заземление. Что это такое и как его сделать (часть 1)

Reading time12 min
Views580K


Мой рассказ будет состоять из трёх частей.

1 часть. Заземление
(общая информация, термины и определения)


2 часть. Традиционные способы строительства заземляющих устройств
(описание, расчёт, монтаж)


3 часть. Современные способы строительства заземляющих устройств
(описание, расчёт, монтаж)


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

Если читатель обладает теоретическими знаниями и интересуется только практической реализацией — ему лучше пропустить первую часть и начать чтение со второй части.

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

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

Некоторая часть текста является компромиссом между точностью и желанием объяснить “человеческим языком”, поэтому допущены упрощения, могущие “резать слух” технически подкованного читателя.

Читать дальше →
Total votes 199: ↑183 and ↓16+167
Comments217

Получение визы США

Reading time3 min
Views1.4K
USA visaНе так давно, в июле, компания Intel прислала мне приглашение на мероприятие AppUp Elements. На момент получения приглашения у меня не было ни паспорта ни, разумеется, визы США. Но я успел получить и то и другое и прибыл на мероприятие точно в срок. О том как это мне удалось я и хочу рассказать в этой статье.

Данная статья может быть полезна тем, кто хочет в будущем или уже готов получить визу для поездки в США.
Читать дальше →
Total votes 40: ↑38 and ↓2+36
Comments25

Создание документации ИС

Reading time9 min
Views47K

Вступление…


Решился продолжить статьи
«История одной инфраструктуры. Решения MS. Часть 1»
«История одной инфраструктуры. Решения MS. Часть 2»
«История одной инфраструктуры. Решения MS. Часть 3»
и более подробно рассмотреть вопрос создания документации информационной системы (ИС) предприятия. Сразу оговорюсь, что не претендую на истину, всего лишь, мой подход и мои соображения по данному вопросу. Надеюсь, что смогу помочь начинающим разработчикам документации в этом нелегком деле.
Читать дальше →
Total votes 18: ↑11 and ↓7+4
Comments9

Компьютер вашей мечты. Часть 2: Реальность и фикция

Reading time19 min
Views18K
Продолжению быть!
Часть 1


Задачи поставлены, и вроде бы самое время перейти к чтению различных обзоров и тестов, но…
С чего начать? В какую сторону вообще смотреть?
image

Вторая часть опуса будет посвящена ключевым компонентам современной системы — центральному процессору, оперативной памяти и видеокарте. В том, что эти компоненты основные, вряд ли кто-то сомневается, вопрос стоит в другом — кто из них главнее? На что следует обратить внимание в первую очередь при сборке машины под определенные задачи? На какой девайс и какие его характеристики?
Читать дальше →
Total votes 124: ↑103 and ↓21+82
Comments127

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity