Pull to refresh
12
0
Максим @mrpostrock

User

Send message

Как работают замыкания (под капотом) в JavaScript

Reading time11 min
Views76K
Привет, Хабр!

Мы в Хекслете используем JavaScript не только для очевидных задач во фронтэнде, но и, например, для реализации браузерной среды разработки (наш опен-сорсный hexlet-ide) на React'е. У нас есть практический курс по JavaScript, и один из уроков там посвящен замыканиям. Это важная тема не столько в рамках JS, сколько в программировании вообще. Мы освещаем ее и в других курсах.

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


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

"use strict";
 
var myClosure = (function outerFunction() {
 
  var hidden = 1;
 
  return {
    inc: function innerFunction() {
      return hidden++;
    }
  };
 
}());
 
myClosure.inc();  // возвращает 1
myClosure.inc();  // возвращает 2
myClosure.inc();  // возвращает 3
 
// Ага, круто. А как это реализовано?
// И что происходит под капотом?
Читать дальше →
Total votes 54: ↑47 and ↓7+40
Comments11

Доставляем голос в мобильной сети: шаг 2 — Аналого Цифровое Преобразование

Reading time8 min
Views24K
В первой части цикла статей мы рассмотрели преобразование человеческого голоса в электрический сигнал. Теперь, казалось бы, самое время передать этот сигнал до местонахождения собеседника и начать разговор! Именно так первоначально и поступали. Однако чем более востребованной становилась услуга и чем на большие расстояния было необходимо передавать сигнал, тем понятнее становилось, что аналоговый сигнал для этого не годится.
Для того чтобы обеспечить передачу информации на любое расстояние без потери качества, нам потребуется произвести второе преобразование из Аналогового сигнала в Цифровой.



Эта картинка дает самое наглядное представление о том, что происходит при Аналого Цифровом Преобразовании (АЦП) а далее мы рассмотрим зачем это нужно, как происходило развитие технологии, и какие требования накладываются на такое преобразование в мобильных сетях.
Читать дальше →
Total votes 15: ↑13 and ↓2+11
Comments12

Первичный ключ – GUID или автоинкремент?

Reading time7 min
Views111K
Зачастую, когда разработчики сталкиваются с созданием модели данных, тип первичного ключа выбирается «по привычке», и чаще всего это автоинкрементное целочисленное поле. Но в реальности это не всегда является оптимальным решением, так как для некоторых ситуаций более предпочтительным может оказаться GUID. На практике возможны и другие, более редкие, типы ключа, но в данной статье мы их рассматривать не будем.
Читать дальше →
Total votes 27: ↑24 and ↓3+21
Comments72

Загрузка видео «без единого разрыва»

Reading time9 min
Views33K
Видео – один из самых популярных сервисов на Одноклассниках. Чего только не грузят наши пользователи: от милых сюжетов с детского утренника до снятых на видеорегистратор аварий. Поэтому быстро и стабильно работающая загрузка видео важна нам не только как одна из самых востребованных пользователями функций, но и как необходимое условие для генерации контента.

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


Да, это



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

Видеосервис Одноклассников в деталях
Total votes 48: ↑37 and ↓11+26
Comments12

Собираем базу людей из открытых данных WhatsApp и VK

Reading time15 min
Views219K
Etan Hunt
кадр из фильма Миссия Невыполнима II

Эта история началась пару месяцев назад, в первый день рождения моего сына. На мой телефон пришло СМС-сообщение с поздравлением и пожеланиями от неизвестного номера. Думаю, если бы это был мой день рождения мне бы хватило наглости отправить в ответ, не совсем культурное, по моему мнению, «Спасибо, а Вы кто?». Однако день рождения не мой, а узнать кто передаёт поздравления было интересно.

Первый успех


Было решено попробовать следующий вариант:
  • Добавить неизвестный номер в адресную книгу телефона;
  • Зайти по очереди в приложения, привязанные к номеру (Viber, WhatsApp);
  • Открыть новый чат с вновь созданным контактом и по фотографии определить отправителя.

Мне повезло и в моём случае в списке контактов Viber рядом с вновь созданным контактом появилась миниатюра фотографии, по которой я, не открывая её целиком, распознал отправителя и удовлетворенный проведенным «расследованием» написал смс с благодарностью за поздравления.

Сразу же за секундным промежутком эйфории от удачного поиска в голове появилась идея перебором по списку номеров мобильных операторов составить базу [номер_телефона => фото]. А еще через секунду идея пропустить эти фотографии через систему распознавания лиц и связать с другими открытыми данными, например, фотографиями из социальных сетей.
Далее перебор аккаунтов WhatsApp и VK по Москве и Ненецкому АО и распознание лиц
Total votes 128: ↑127 and ↓1+126
Comments34

Слепая подпись на основе ГОСТ 34.10-2001

Reading time5 min
Views22K
Прошедшим и будущим выборам посвящается.

После вбросов, скандалов, интриг, расследований, которые были на думских выборах, невольно задаешься вопросом: а как сделать так, чтобы было все честно? Ну а применительно к ИТ, как сделать так, чтобы все было честно, да еще и с помощью высоких технологий? Я читал и про пробивание дырочек, и про QR-коды, поэтому решил внести скромную математическую лепту.
В этом топике мы поговорим с вами о том, как решить две взаимно противоположные проблемы с помощью криптографии: проблему верификации избирателя и проблему тайны голосования. Я немного расскажу о так называемой «слепой подписи» и даже представлю демонстрационное приложение, которое показывает, каким образом могут быть решены задачи верификации и анонимности одновременно, причем на основе криптоалгоритмов ГОСТ 34.10 и 34.11, которые официально одобрены ФСБ.
Читать дальше →
Total votes 57: ↑55 and ↓2+53
Comments46

Хеш-функция Стрибог или в городе новый шериф

Reading time16 min
Views70K
В 2012 году вся общественность, более или менее причастная к информационной безопасности, пристально следила за выборами нового стандарта хеширования данных SHA-3. На хабре достаточно широко освещалось это важное событие: публиковались результаты каждого раунда конкурса (раз, два, три), приводилось описание нового стандарта, и даже объяснялось почему новый стандарт так крут.
Однако, за всем этим ажиотажем совсем незамеченным осталось другое, не менее значимое событие: 1 января 2013 года в РФ также сменился стандарт хеш-функции.
Итак, встречайте: полное описание нового стандарта и его реализация на C#. Как говорится, лучше поздно, чем никогда.
Читать дальше →
Total votes 77: ↑71 and ↓6+65
Comments56

Маленькие хитрости сбора паспортных данных

Reading time5 min
Views59K
Хочу поделиться своим опытом, приобретённым при разработке и сопровождении информационной системы учёта физических лиц в одной организации. Масштаб — несколько десятков тысяч реальных людей. Разумеется, производился сбор в том числе и паспортных данных. Как это часто бывает, исчерпывающего ТЗ сформулировано не было и некоторые вещи пришлось доделывать в процессе. О тонкостях учёта физлиц для программистов, впервые сталкивающихся с такой задачей, я и хотел бы рассказать. В статье будут затронуты только вопросы ФИО, гражданства и документов, удостоверяющих личность. Материал получился несколько сумбурным в связи с тем, что содержит только личный опыт без пересказа общеизвестных фактов и цитирования официальных документов.
Итак, поехали
Total votes 27: ↑24 and ↓3+21
Comments34

Мой интернет вещей: Гостевой замок

Reading time17 min
Views80K
Так сложились обстоятельства, что имеется у меня однокомнатная квартира, в которой я не живу, а сдавать ее «обычным способом» мне не интересно. Попробовал я ее сдать через сервис Airbnb, понравилось. И не то, что бы это выгоднее, но точно интереснее, процесс захватывает. Но я не об этом…

Было у меня пару раз ситуация, когда я не мог лично встретить гостя и вручить ему ключ. Обычно в таких ситуациях приходится придумывать различные способы, от закладывания ключа под коврик до передачи через консьержку. Мне же не хочется посвящать в свои дела посторонних и как-то не комильфо прятать ключ под ковриком.
Читать дальше →
Total votes 27: ↑27 and ↓0+27
Comments58

Устройство уровней в NES-играх

Reading time8 min
Views42K
В этой статье я попробую рассказать о способе хранения уровней в ROM-памяти картриджей для приставки NES.
Я опишу все основные способы и подробно остановлюсь на наиболее часто используемом (из нескольких десятков исследованных мной игр он встречался практически в каждой).

Данный способ я назвал «блочным» (оговорюсь, что многие термины в статье были придуманы мной, так как материалов на данную тему на русском нет; после исследования нескольких игр я занялся изучением англоязычных материалов и документации к редакторам игр для старых платформ, тогда уже нашлись некоторые аналогии, в таких случаях буду приводить свои термины с объяснением их значения и их английские версии). В качестве примеров я буду приводить уровни из игры «Darkwing Duck», а также других игр компании «Capcom», разобранных мной несколько лет назад.

Я постараюсь пропустить описание использования дизассемблера и техническую часть исследования (если будет интерес, можно сделать на эту тему отдельную статью), а остановлюсь на описании, как именно разработчики хранили данные. Зная, что именно искать, найти это внутри образа ROM станет намного проще. Бонусом я покажу готовый редактор уровней и несколько созданных на нём хаков классических NES-игр.
Читать дальше →
Total votes 94: ↑94 and ↓0+94
Comments35

Отправляем SMS из .Net приложения на C#

Reading time7 min
Views61K

Все что нам понадобится для отправки SMS это 3G USB модем, SIM карта, Visual Studio и немного времени. Моей целью не является описать все возможные настройки COM порта или формата PDU. Я хотел бы предоставить вам готовое решение, которое можно использовать в качестве сниппета в своих проектах.
В качестве примера рассмотрим 2 консольных приложения. Почему консольных? Да потому, что в них нет ничего лишнего и проще разобрать код. Почему два? Потому, что есть два распространенных варианта отправки сообщений. Самый простой вариант – это отправка сообщений в текстовом режиме. Минусом этого варианта является то, что он не поддерживает отправку кириллицы. Плюсом то, что возможна отправка 160-ти символов. Второй вариант, более сложный, позволяет отправлять текст длиной до 70-ти символов в формате Unicode.
Читать дальше →
Total votes 24: ↑20 and ↓4+16
Comments22

Принципы Getting Real (Часть 1)

Reading time12 min
Views25K
Продолжаем читать хорошие книги вот из этого списка от Milfgard и я продолжаю писать конспекты. Сегодня это, пожалуй, одна из самых важных книг в жизни IT-специалиста: Getting Real от 37signals. Она переворачивает мозги и даёт прекрасные рабочие принципы организации работы небольших компаний.


Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments3

Понимание областей видимости или Scope в AngularJS

Reading time10 min
Views78K
В Ангуляре, дочерняя область видимости обычно прототипически наследуется от родительской. Единственным исключением является директива, в которой используется scope: { ... }, создающая «изолированную» область видимости, не наследуемую прототипически. Такая конструкция часто используется при создании директив для компонентов «многоразового использования»
Читать дальше →
Total votes 38: ↑34 and ↓4+30
Comments6

ФИАС или КЛАДР: выбираем справочник адресов

Reading time9 min
Views184K
1 июля 2014 года произошло одно из самых значимых событий в истории государства Российского: с этого момента у нас в стране наконец появилась эталонная база адресов по всем, даже самым малым населённым пунктам! Имя этой базе — ФИАС. Собственно, сам по себе справочник ФИАС появился гораздо раньше, но именно 1 июля вступил в силу ФЗ 443, согласно которому все государственные и муниципальные структуры теперь должны опираться на него как на единственно верную базу адресов. Мы решили исследовать, стоит ли переходить на ФИАС, и с какими подводными камнями столкнутся те, кто решит это делать.

Прочитав статью, вы узнаете:
  • Чем отличается ФИАС от КЛАДР
  • Можно ли уже использовать ФИАС вместо КЛАДР
  • Стоит ли беспокоиться о переходе на ФИАС тем, кто уже работает с КЛАДР
  • Решит ли ФИАС текущие проблемы с адресами
  • Что ждёт тех, кто только начинает использовать адресные справочники
  • Какие есть самые заметные и важные проблемы при работе с ФИАС и КЛАДР

Читать дальше →
Total votes 63: ↑62 and ↓1+61
Comments75

Ваш wi-fi расскажет мне, где вы живёте, где работаете и где путешествуете

Reading time3 min
Views146K

Москва вайфайная

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

Пробы WiFi


Чтобы соединиться с уже известными сетями, которые не сообщают о своём присутствии, все ваши мобильные устройства отправляют пробные пакеты, чтобы найти известные им сети. Эти пакеты можно перехватить, когда телефон включается, или когда он отсоединяется от сети. Для этого используются обычные инструменты — airodump / tcpdump. Пример:

# airodump-ng -w wifi-dump wlan0
# tcpdump -n -l -e -r wifi-dump.cap |
    grep 'Probe Request ([^)]'


Вывод содержит время, MAC-адрес устройства и имя сети. Пример:

16:32:26.628209 BSSID:ff:ff:ff:ff:ff:ff DA:ff:ff:ff:ff:ff:ff SA:50:ea:d6:aa:bb:cc
    Probe Request (SUBWAY) [1.0 2.0 5.5 11.0 Mbit]


То бишь, устройство 50:ea:d6:aa:bb:cc проверяло, есть ли сеть SUBWAY в пределах доступности.

Ну и что тут плохого?


Ну испускают они эти пакеты с именами сетей. Подумаешь.
Читать дальше →
Total votes 64: ↑61 and ↓3+58
Comments51

Как упростить жизнь iOS разработчику

Reading time8 min
Views16K
Наверное, каждый разработчик, когда начинает осваивать новую технологию, хочет опробовать все самостоятельно, реализовать все с самого низкого уровня, чтобы потом наслаждаться результатом своей работы. Однако с накоплением опыта многие задачи становятся достаточно скучными и хочется избавить себя от этой нужной, но неинтересной рутины. В этой статье я хочу поделиться тем, какие способы и средства помогут упростить жизнь разработчику и сэкономить нервы.
Читать дальше →
Total votes 14: ↑12 and ↓2+10
Comments3

Подборка интересных CSS-рецептов «Голые пятницы #4»

Reading time5 min
Views61K
голые пятницы

Здравствуй, дорогой читатель хабра!
Сегодня мы поговорим о «липких» блоках, новом свойстве для изображений object-fit, продвинутом использовании CSS-счетчиков, ключевом слове currentColor, и о том, есть ли анимация в z-index.
Читать дальше →
Total votes 39: ↑36 and ↓3+33
Comments32

Ламповый усилитель

Reading time2 min
Views175K


Коротко, в основном фото (перезалил в хорошем качестве). Сразу скажу, что опыта и познаний в радиотехнике было мало, сделал много ошибок. Не являясь фанатичным любителем теплого лампового звука, для меня был интересен сам процесс сборки.
Читать дальше →
Total votes 115: ↑109 and ↓6+103
Comments143

Интересные моменты работы Linq to Sql

Reading time14 min
Views16K
Прошло уже больше года с моего предыдущего поста на похожую тему. За это время мы как-то не приблизились к переходу на Entity Framework (по текущей легенде, мы перейдём, когда появится стабильная версия EF 7), ну а у меня накопилось некоторое количество опыта, которым я бы хотел поделиться. Думаю, что эта статья будет интересна тем, кто, как и мы, до сих пор пользуются этой в общем-то неплохой, но позабытой Microsoft технологией.

DbType


Указание подсказки DbType (за исключением enum'ов, об этом ниже) не является обязательным для свойств сущностей в Linq 2 Sql. И уж точно не стоит указывать неправильный DbType. Например, не стоит, если в базе колонка имеет тип nvarchar(50), указывать Linq 2 Sql, что колонка имеет тип nchar(50). И особенно не стоит так делать, если это поле является дискриминатором, как в следующем примере:

	[Table(Name = "directcrm.OperationSteps")]
	[InheritanceMapping(Code = "", Type = typeof(OperationStep), IsDefault = true)]
	// ...
	[InheritanceMapping(Code = "ApplySegment", Type = typeof(ApplySegmentOperationStep))]
	public class OperationStep : INotifyPropertyChanging, INotifyPropertyChanged, IValidatable
	{

		// Некоторое количество кода
		...

		[Column(Storage = "type", DbType = "nchar(50) NOT NULL", CanBeNull = false, IsDiscriminator = true)]
		public string Type
		{
			get
			{
				return type;
			}
			set
			{
				if ((type != value))
				{
					SendPropertyChanging();
					type = value;
					SendPropertyChanged();
				}
			}
		}
	}

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

Как делать простые анимации строительства в стратегических играх

Reading time2 min
Views44K
Во многих типах игр, не только стратегических, у вас есть участок земли, и на нём нужно что-то строить. Знакомая схема, не правда ли?

image

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

Но что, если вы хотите более тонкие анимации, чтобы было видно, как здание постепенно растёт к небу?
Читать дальше →
Total votes 101: ↑90 and ↓11+79
Comments19

Information

Rating
Does not participate
Location
Петрозаводск, Карелия, Россия
Date of birth
Registered
Activity