Search
Write a publication
Pull to refresh
1
0
Константин @Lord_Prizrak

Программер

Send message

Hyperboria: Как все устроено

Reading time4 min
Views66K


В прошлой статье был общий обзор сети Hyperboria, в этой мы рассмотрим её структуру, какие она решает проблемы и её прямое назначение — Mesh сеть между wi-fi устройствами.
Читать дальше →

Часть 1: «Всё что вы хотели знать и боялись спросить о I2P»

Reading time7 min
Views81K
Я достаточное время пользовался I2P и читал все статьи об этой сети доступные в русскоязычной части интернета, но не одна из них не даёт всеобъемлющего знания о ней. Учитывая пожелания людей в предыдущих публикациях об I2P, я занялся переводом официального источника.
Из-за большого объёма информации, я буду выкладывать переводы частями.

Если кого то действительно это интересует, прошу под «спойлер».
Читать дальше →

Как стать датасайнтистом, если тебе за 40 и ты не программист

Reading time8 min
Views151K
Бытует мнение, что стать датасайентистом можно только имея соответствующее высшее образование, а лучше ученую степень.

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

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



Сейчас я ведущий аналитик в группе больших данных в QIWI, но еще три года назад я был довольно далек от датасайнс и об искусственном интеллекте слышал только из новостей. Но потом все изменилось, во многом благодаря Coursera и Kaggle.

Итак, обо всем по порядку.
Читать дальше →

Проектирование процессора Verilog

Reading time6 min
Views23K

Часть I
Часть II
Часть III
Часть IV


Спроектируем Little Man Computer на языке Verilog.


Статья про LMC была на Хабре.


Online симулятор этого компьютера здесь.


Напишем модуль оперативной памяти RAM/ОЗУ, состоящий из четырех (N=2) четырёхбитных (M=4) слов. Данные загружаются в ОЗУ из data_in по адресу adr при нажатии на кнопку:


module R0 #(parameter N = 2, M = 4)
(
input RAM_button, //кнопка
input [N-1:0] adr, //адрес
input [M-1:0] data_in, //порт ввода данных
output [M-1:0] RAM_out //порт вывода данных
);
reg [M-1:0] mem [2**N-1:0]; //объявляем массив mem
always @(posedge RAM_button) //при нажатии на кнопку
mem [adr] <= data_in; //загружаем данные в ОЗУ из data_in 
assign RAM_out = mem[adr]; //назначаем RAM_out портом вывода данных
endmodule
```<cut/>
В качестве внешнего генератора подключим КМОП <b>таймер 555</b> (работающий от 3.3V).
Подключим <b>таймер 555</b> к счётчику, подключим счётчик к адресному входу <b>ОЗУ</b>:
```verilog
module R1 #(parameter N = 2, M = 4)
(
input timer555, RAM_button,
//input [N-1:0] adr,
input [M-1:0] data_in,
output [M-1:0] RAM_out
);
reg [1:0]counter; //объявляем счётчик
always @(posedge timer555) //при поступлении тактового сигнала
 counter <= counter + 1;  // счетчик увеличивается на 1
 wire [N-1:0] adr;
 assign adr = counter; // подключаем счётчик на адресный вход ОЗУ
reg [M-1:0] mem [2**N-1:0];
always @(posedge RAM_button)
 mem [adr] <= data_in;
assign RAM_out = mem[adr];
endmodule

Здесь при описании счетчика counter и памяти mem используются неблокирующие присвоения <= Операторы присвоения рассматриваются на сайте marsohod.org здесь
Описание работы счетчика есть на сайте marsohod.org здесь


Добавим в счетчик функцию загрузки.
Загрузка осуществляется командой Counter_load:


//input Counter_load; 
wire [3:0] branch_adr; // адрес перехода
assign branch_adr = data_in; 
always @(posedge timer555)
begin
 if(Counter_load) //по команде "Counter_load"  переходим по адресу  "branch_adr"
  counter <= branch_adr;
 else
  counter <= counter + 1; 
end 

В отдельном модуле создаем 4bit'ный регистр (аккумулятор):


module register4
(
  input  [3:0] reg_data,
  input reg_button,
  output reg [3:0] q  
);
always @(posedge reg_button)
         q <= reg_data;
endmodule

Добавим в общую схему аккумулятор Acc, мультиплексор MUX2 и сумматор sum.
Сумматор прибавляет к числу в аккумуляторе Acc числа из памяти.
На сигнальные входы мультиплексора подаются числа data_in и sum.
Далее число из мультиплексора MUX2 загружается в аккумулятор Acc:


module R2 #(parameter ADDR_WIDTH = 2, DATA_WIDTH = 4)
(
input timer555, Counter_load, RAM_button,
input MUX_switch,
input Acc_button, 
input [3:0] data_in, 
output [3:0] Acc,
output [DATA_WIDTH-1:0] RAM,
output reg [1:0] counter
);
wire [1:0] branch_adr;
assign branch_adr = data_in[1:0]; 
//Counter
always @(posedge timer555)
begin
 if(Counter_load) 
  counter <= branch_adr;
 else
  counter <= counter + 1; 
end  

wire [ADDR_WIDTH-1:0] adr;
assign adr = counter;  
//RAM
reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0];
always @(posedge RAM_button)
mem [adr] <= Acc;
assign RAM = mem[adr];
//sum
wire [3:0] sum;
assign sum =  Acc + RAM;
//MUX
reg [3:0] MUX2; 
always @*  // Always @* — значит «всегда» 
MUX2 = MUX_switch ? sum : data_in;
//Accumulator
register4 Acc_reg(
.reg_data(MUX2),
.reg_button(Acc_button),
.q(Acc)
);
endmodule

Always @ — значит «всегда». Некоторые синтезаторы не понимают эту конструкцию. Мультиплексор можно написать и без Always @ (тут используется просто для примера).



Вычитание


Для того, чтобы произвести вычитание, надо представить вычитаемое число в дополнительном коде. Про сложение и вычитание двоичных чисел можно прочитать в учебнике "Цифорвая схемотехника и архитектура компьютера" (Дэвид М. Харрис и Сара Л. Харрис) в главе 1.4.6 Знак двоичных чисел


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


wire [3:0] subtract;
assign subract =  Acc - RAM ;

Заменим 2-входовой мультиплексор 4-входовым:


always @*
MUX4 = MUX_switch[1] ? (MUX_switch[0] ? RAM : subtract)
: (MUX_switch[0] ? sum : data_in);

Подключим к аккумулятору устройство вывода (4bit'ный регистр), также подключим к аккумулятору 2 флага:


  1. Флаг "Ноль" — это лог. элемент 4ИЛИ-НЕ. Флаг поднимается, если содержимое Асс равно нулю.


  2. Флаг "Ноль или Положительное число" — это лог. элемент НЕ на старшем разряде 4-разрядного аккумулятора. Флаг поднимается, если содержимое Асс больше или равно нулю.



//флаг "Ноль" 
output Z_flag;
assign Z_flag =  ~(|Acc); // 4-входовой вентиль ИЛИ-НЕ
//флаг "Ноль или Положительное число"
output PZ_flag;
assign PZ_flag =  ~Acc[3]; 

4ИЛИ-НЕ

Здесь мы описали многовходовой вентиль ИЛИ-НЕ как ~(|Acc)
Также в языке Verilog поддерживается набор типов логических вентилей (Gate Types).


Для логических вентилей определены ключевые слова: and (И), nand (И-НЕ), or (ИЛИ), nor (ИЛИ-НЕ), xor (Исключающее ИЛИ), xnor (Исключающее ИЛИ-НЕ), buf (Буферный элемент), not (Отрицание, НЕ).


В Verilog при использовании вентилей необходимо задать входы и выходы элемента, а также (не обязательно) имя вентиля. Например, вентили and и or должны иметь один выход и два и более входов. Так, для вентиля nor имеем
nor name listof arguments
nor mynor(out, in0, in1, in2, in3);



Добавим три команды


  1. загрузка содержимого аккумулятора в устройство вывода data_out
  2. загрузка адреса в счётчик, если поднят флаг "ноль" (JMP if Acc=0)
  3. загрузка адреса в счётчик, если поднят флаг "ноль или положительное число" (JMP if Acc>=0)

module R3 #(parameter ADDR_WIDTH = 2, DATA_WIDTH = 4)
(
input timer555, RAM_button,
input JMP, Z_JMP, PZ_JMP,
input [1:0] MUX_switch,
input Acc_button, 
input Output_button,
input [3:0] data_in, 
output [3:0] Acc,
output [3:0] data_out,
output [DATA_WIDTH-1:0] RAM,
output Z_flag, PZ_flag,
output reg [1:0] counter
);
wire [1:0] branch_adr;
assign branch_adr = data_in[1:0]; 
wire Z,PZ;
assign Z = Z_flag & Z_JMP;
assign PZ = PZ_flag & PZ_JMP;
//Counter
always @(posedge timer555)
begin
 if(JMP|Z|PZ) 
  counter <= branch_adr;
 else
  counter <= counter + 1; 
end  

wire [ADDR_WIDTH-1:0] adr;
assign adr = counter;  
//RAM
reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0];
always @(posedge RAM_button)
mem [adr] <= Acc;
assign RAM = mem[adr];
//sum
wire [3:0] sum;
assign sum =  Acc + RAM;
//subtract
wire [3:0] subtract;
assign subtract =  Acc - RAM;
//MUX
reg [3:0] MUX4; 
always @*
MUX4 = MUX_switch[1] ? (MUX_switch[0] ? RAM : subtract)
: (MUX_switch[0] ? sum : data_in);

register4 Acc_reg(
.reg_data(MUX4),
.reg_clk(Acc_button),
.q(Acc)
);
register4 Output_reg(
.reg_data(Acc),
.reg_clk(Output_button),
.q(data_out)
);
assign Z_flag =  ~(|Acc);
assign PZ_flag =  ~Acc[3]; 
endmodule


Поместим команды и адреса в одно RAM/ОЗУ, а данные — в другое.



Схему можно скачать отсюда.


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


Вообще, загрузка числа в аккумулятор Асс должна производиться после переключения мультиплексора MUX (для команд ADD, SUB, LDA), по спаду тактового сигнала.


Т.о. в нашем компьютере следующая система команд


48х — ADD добавить число из ОЗУ к Асс
50х — SUB вычесть число, хранящееся в ОЗУ из Асс
80x — STA сохранить число из аккумулятора Асс в ОЗУ по адресу х
58х — LDA загрузить число из адреса х в Асс
04х — BRA безусловный переход в ячейку с адресом x
02х — BRZ переход в ячейку с адресом x, если Асс=0 (условный переход)
01x — BRP переход в ячейку с адресом x, если Асс>=0 (условный переход)
40х — INP загрузить число из data_input в Асс
20х — OUT загрузить число из Асс в data_out


Команды HLT у нас не будет.


Возьмём для примера алгоритм поиска максимального из двух чисел с сайта http://peterhigginson.co.uk/LMC/


Алгоритм работает так: сохраняем в память данных два числа из data_in. Вычитаем из второго числа первое:


  • если результат отрицательный, записываем первое число в Асс, записываем в data_out число из Асс;
  • если результат положительный, записываем второе число в Асс, записываем в data_out число из Асс.

00 INP 01 STA 11 02 INP 03 STA 12 04 SUB 11 05 BRP 08 06 LDA 11 07 BRA 09 08 LDA 12 09 OUT


В нашей системе команд этот алгоритм будет выглядеть так


400 80b 400 80c 50b 018 58b 049 58c 200



Элемент НЕ на управляющем входе счётчика, необходимый для загрузки данных в счётчик — это такая особенность программы Logisim, в реальных схемах элемент НЕ на управляющем входе не требуется (по крайней мере я таких счётчиков не знаю).


Quartus II можно скачать с официального сайта.


При регистрации в разделе My Primary Job Function is* необходимо выбрать пункт Student.
Далее необходимо скачать драйвер для программатора (драйвер для usb-blaster'a можно установить из C:\altera...\quartus\drivers\usb-blaster).


Logisim можно скачать здесь.

Бэкдоры в микрокоде ассемблерных инструкций процессоров x86

Reading time6 min
Views69K

Софту мы не доверяем уже давно, и поэтому осуществляем его аудит, проводим обратную инженерию, прогоняем в пошаговом режиме, запускаем в песочнице. Что же насчёт процессора, на котором выполняется наш софт? – Мы слепо и беззаветно доверяем этому маленькому кусочку кремния. Однако современное железо имеет те же самые проблемы, что и софт: секретную недокументированную функциональность, ошибки, уязвимости, малварь, трояны, руткиты, бэкдоры.



ISA (Instruction Set Architecture) x86 – одна из самых долгих непрерывно изменяющихся «архитектур набора команд» в истории. Начиная с дизайна 8086, разработанного в 1976 году, ISA претерпевает постоянные изменения и обновления; сохраняя при этом обратную совместимость и поддержку исходной спецификации. За 40 лет своего взросления, архитектура ISA обросла и продолжает обрастать множеством новых режимов и наборов инструкций, каждый из которых добавляет к предшествующему дизайну, и без того перегруженному, новый слой. Из-за политики полной обратной совместимости, в современных процессорах x86 присутствуют даже те инструкции и режимы, которые на сегодняшний день уже преданы полному забвению. В результате мы имеем архитектуру процессора, которая представляет собой сложно переплетающийся лабиринт новых и антикварных технологий. Такая чрезвычайно сложная среда – порождает множество проблем с кибербезопасностью процессора. Поэтому процессоры x86 не могут претендовать на роль доверенного корня критической киберинфраструктуры.

Читать дальше →

Метеостанция на Arduino от А до Я. Часть 4

Reading time3 min
Views26K

Продолжение. Предыдущая часть.
Оглавление:



Заоконный датчик. Железо


Надо сразу признать, что первая версия заоконного (удаленного) датчика получилась не совсем удачной в плане электропитания и энергопотребления. Как я уже писал, у меня под рукой был только модуль Arduino Pro Mini на 5 В. И я использовал Ni-MH аккумуляторы.


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


Чтобы у вас всё работало гораздо дольше, произведите следующие замены:


  • Купите Arduino Pro Mini на 3,3В
  • Используйте Li-ion аккумулятор типа Panasonic NCR18650A на 3,7 В, 2 шт. примерно за $14 на 3100mAh. Можете попробовать CR123, CR123A батареи. И помните о том, что 9В батарея (типа "Крона") плохой источник питания.
Читать дальше →

EHCI по-людски на русском языке

Reading time13 min
Views41K
image

Введение


Всех приветствую. Сегодня хочу поделиться опытом и всё-таки по-моему внятно объяснить про такой, на первый взгляд, простой стандарт для USB 2.0 хост-контроллера.

Изначально можно представить себе что USB 2.0 порт — это всего лишь 4 пина, по двум из которых просто передаются данные(Как, к примеру, COM-порт), но самом деле всё не так, и даже совсем наоборот. USB-контроллер в принципе не даёт нам возможности передавать данные как через обычный COM-порт. EHCI — довольно замысловатый стандарт, который позволяет обеспечить надежную и быструю передачу данных от софта до самого девайса, и в обратную сторону.

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

Цифровой рентген: от альфы до гаммы

Reading time4 min
Views22K
Привет Хабр!

Давно чесались руки написать что-нибудь доброе и вечное о цифровой рентгенографии, коей занимаюсь уже как 5 лет. О себе – 12 лет в разработке железа. Начинал как конструктор, потом была схемотехника, разработка печатных плат, разработка документации, работа с ЧПУ, интеграция HW/SW, управление проектами, маркетинг. В общем – с миру по нитке.

Мы занимаемся разработкой и производством в РФ цифровых плоскопанельных рентгеновских детекторов для промышленности и медицины. Если кто забыл, что такое рентген – смотрим «Опыт рентгеноскопии в домашних условиях», «Самодельный рентгеновский компьютерный томограф», но не забываем про вред ионизирующего излучения во время домашних экспериментов.

Для кого все это нужно?


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

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

В третьих – производственникам. Это контроль качества сварки, отливок, пайки металлов и монтажа электронных компонентов. Если сварка и отливки еще плотно сидят на аналоге, ибо стандарт по использованию цифрового рентгена вышел в РФ только в 2017 году, то серьезные операторы линий по монтажу плат имеют за душой рентгеновский контроль как-минимум BGA чипов.
Читать дальше →

Праздник к нам приходит: ГКРЧ расширила ISM-диапазон 868 МГц в два раза

Reading time4 min
Views34K
Короткая, но важная для причастных к IoT новость: ГКРЧ официально расширила безлицензионный диапазон 868 МГц, в котором традиционно живут такие сети, как LoRaWAN, Стриж/Вавиот, Sigfox и другие.

Официально это называется «неспециализированные устройства малого радиуса общего применения», а закреплены изменения в Приложении 12 к Решению ГКРЧ № 18-46-03-1 от 11 сентября 2018 года.

Было:

  • 864,0 — 865,0 МГц — мощность до 25 мВт, рабочий цикл до 0,1 % или LBT*, запрещено использование на территории аэропортов
  • 868,7 — 869,2 МГц — мощность до 25 мВт, рабочий цикл без ограничений, использование без ограничений

Стало (жирным выделены изменения):

  • 864,0 — 865,0 МГц — мощность до 25 мВт, рабочий цикл до 0,1 % или LBT*, запрещено использование на территории аэропортов
  • 866,0 — 868,0 МГц — мощность до 25 мВт, рабочий цикл до 1 % или LBT*, запрещено использование на территории аэропортов, спектральная плотность мощности до 1000 мВт/МГц
  • 868,7 — 869,2 МГц — мощность до 100 мВт, рабочий цикл до 10 % или LBT*, использование без ограничений

* Listen Before Talk. Что это означает, правда, никто не знает, так как в российских НПА техническая суть LBT нигде не расшифровывается. Да и, собственно, никто его и не использует.

Что это означает конкретно для сетей LoRaWAN?
Читать дальше →

Видеть невидимое. Поляризация в дальнем ИК (8-12мкм)

Reading time4 min
Views18K
Поляризация используется во многих областях, наиболее известное применение из которых – это разделение стереопары в 3Д фильмах у некоторых телевизоров и в кинотеатрах, это круговая поляризация. При фотосъемке применяют поляризационные фильтры, чтобы избавиться от паразитных бликов за счет эффекта, когда свет приобретает поляризацию при отражении. Но о том, с какой поляризацией фотоны излучаем мы и объекты вокруг нас, информации почти нет. На просторах интернета вы практически не найдёте информации и примеров того, как выглядит истинное собственное поляризованное излучение объектов.

Все началось с того, что мы разработали очень чувствительный тепловизионный модуль VLM640, который обладал чувствительностью не хуже 20мК в диапазоне 8-12мкм, что очень неплохо для неохлаждаемых болометрических камер. Производитель сенсоров обратился к нам и предложил инженерный образец из экспериментальной пластины болометрических детекторов с интегрированными поляризационными фильтрами. Для нас это было очень почетно, но в то же время понимания, что мы должны в итоге получить, не было. Технология и сама идея увидеть собственную поляризацию тепловых квантов-фотонов объектов, которые нас окружают, абсолютно новая, и опыта обработки такой информации у нас не было.

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

Калибровка Kinect v2 с помощью OpenCV на Python

Reading time8 min
Views27K
Не так давно мы начали пару проектов, в которых необходима оптическая система с каналом дальности, и решили для этого использовать Kinect v2. Поскольку проекты реализуются на Python, то для начала нужно было заставить работать Kinect из Python, а затем откалибровать его, так как Kinect из коробки вносит некоторые геометрические искажения в кадры и дает сантиметровые ошибки в определении глубины.

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

image
Читать дальше →

Объяснение SNARKs. Спаривание эллиптических кривых (перевод)

Reading time6 min
Views6.4K
Привет, Хабр! Представляю вашему вниманию перевод статей блога ZCash, в которых рассказывается о механизме работы системы доказательств с нулевым разглашением SNARKs, применяемых в криптовалюте ZCash (и не только).

Источник

Предыдущие статьи:

Часть 1: Объяснение SNARKs. Гомоморфное скрытие и слепое вычисление полиномов (перевод)
Часть 2: Объяснение SNARKs. Знание о принятом коэффициенте и достоверное слепое вычисление полиномов (перевод)
Часть 3: Объяснение SNARKs. От вычислений к многочленам, протокол Пиноккио и спаривание эллиптических кривых (перевод)
Читать дальше →

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

Reading time8 min
Views90K

Новая физическая гипотеза бросает вызов лидирующей «теории всего»




25 июня физик Тимм Вразе [Timm Wrase], живущий в Вене, проснулся, и сонно листал в онлайне список недавно опубликованных физических работ. Один заголовок поразил его так, что он сбросил все остатки сна.

Работа выдающегося специалиста по теории струн Камрана Вафы из Гарварда, выполненная совместно с его коллегами, выдвинула гипотезу о существовании простой формулы, определяющей, каким вселенным дозволено существовать, а каким – нет, в соответствии с теорией струн. Теория струн, ведущий кандидат на "теорию всего", сшивающий вместе гравитацию и квантовую физику, определяет всю материю и взаимодействия в виде вибраций крохотных энергетических нитей. Теория допускает порядка 10500 решений: огромный и разнообразный «ландшафт» возможных вселенных. Специалисты по теории струн, такие, как Вразе и Вафа, годами пытались разместить нашу Вселенную где-нибудь на этом ландшафте возможностей.
Читать дальше →

Технология Solid: пришло время для перестройки веба

Reading time3 min
Views37K

Сэр Тим Бернерс-Ли на Campus Party 2008, фото Jonan Basterra

Сэр Тим Бернерс-Ли, создатель Всемирной паутины и директор консорциума W3C, уверен, что развитие веба достигло критической точки, максимально отклонилось от изначальной концепции. Изначально он задумывался как децентрализованная сеть, где первый браузер одновременно был и редактором документов. Идея состояла в том, что каждый пользователь не только сможет просматривать документы, но и создавать, редактировать их. Веб должен был стать местом совместного творчества и сотрудничества для всего человечества. Но что-то пошло не так.

Есть примеры удачной реализации совместного творчества, как Википедия, децентрализованный хостинг сайтов и пиринговые социальные сети. Это предвестники того, каким может стать веб на основе новой технологии Solid, которую разработал Тим Бернерс-Ли совместно с группой исследователей из Массачусетского технологического института. Это венец десятилетий концептуальной работы, которой занимался Бернерс-Ли.
Читать дальше →

Программное обеспечение для умного дома #2

Reading time6 min
Views38K

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


image

Далее...

Исчезнувший конкурент азбуки Морзе: наборный телеграф

Reading time5 min
Views9.7K

В 1842 году французский часовщик Луи Франсуа Бреге изобрёл более простую в использовании но менее эффективную альтернативу телеграфу




Много лет я игрался с интерактивными телеграфными экспонатами в научных центрах и музеях. Я могу выстучать сигнал бедствия * * * — - — * * * и знаю обозначение букв H (****) и E (*), но за пределами этого последовательности точек и тире из азбуки Морзе путаются у меня в голове. Истории операторов телеграфа, способных расшифровывать сотни символов в минуту до сих пор поражают меня.

Однако недавно я узнал о стрелочном телеграфе Кука и Уитстона. У отправителя и получателя стрелка или стрелки просто показывали на нужную букву на циферблате. Наконец-то я нашёл удобную для пользователя систему телеграфа – если, конечно, пользователь умел читать.
Читать дальше →

Текстовый редактор — это вам не высшая математика, тут думать надо

Reading time17 min
Views98K
Современные текстовые редакторы умеют не только бибикать и не давать выйти из программы. Оказывается, внутри них кипит очень сложный метаболизм. Хотите узнать, какие ухищрения предпринимаются для быстрого пересчета координат, как к тексту приделываются стили, фолдинги и софтврапы и как это всё обновляется, при чем тут функциональные структуры данных и очереди с приоритетами, а также как обманывать пользователя — добро пожаловать под кат!



В основе статьи — доклад Алексея Кудрявцева с Joker 2017. Алексей уже лет 10 пишет Intellij IDEA в JetBrains. Под катом вы найдете видео и текстовую расшифровку доклада.
Читать дальше →

Изучаем дерево исходников Windows 10: от телеметрии до open source

Reading time8 min
Views49K
image

Насколько бы закрытым ни было программное обеспечение Microsoft, информации о своем внутреннем устройстве оно выдает предостаточно. К примеру, экспорт функций из библиотеки по именам дает представление о ее интерфейсах. В свободном доступе есть и отладочные символы, которые повсеместно используются для диагностики ошибок в ОС. Однако на руках у нас все равно имеются только скомпилированные бинарные модули. Становится интересно: а какими они были до компиляции? Давайте попробуем разобраться, как вытащить побольше информации об исходных кодах, не делая ничего незаконного.
Читать дальше →

Newtoo — разработка полноценного браузерного движка с нуля в 2018?

Reading time4 min
Views52K
image

Привет! Меня зовут Дмитрий Козичев.

Сегодня я вам расскажу о моей попытке создать собственный современный веб-браузерный движок с нуля.

Мой движок называется Newtoo.

Что за Newtoo


Итак, Newtoo. Зачем я его создал?

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

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

Идеология Newtoo — показать страницу быстрее, чем остальные.

Как Newtoo работает быстрее


Как я говорил ранее, основные браузерные движки развиваются не первый год. Те ошибки, которые были допущены на начальных стадиях разработки остаются в проекте до конца. Самый яркий пример этому — умные указатели в C++ — это еще более сложный синтаксис, большой оверхед при работе, создании и удалении умных указателей. Кроме того, есть очень много типов умных указателей и нужно знать, какой когда использовать, ведь у каждого есть свои сюрпризы ньюансы. Посмотрите на этот файл из WebKit. Когда видишь такой код, синтаксис умных указателей, пытаешься успокоится и дышать ровно, но такого рода код — это весь вебкит с ног до головы. В моем движке нет таких недостатков.
Читать дальше →

Дверь, которая с нами здоровается по именам и открывает только сотрудникам отдела

Reading time7 min
Views24K

У нас была пара дней промежутка между большими проектами, и мы решили поиздеваться над дверью руководителя подразделения. Just for fun. Потому что дроны нас в лицо уже узнают — чем дверь-то хуже?

На момент старта IT-проекта у нас уже была накладная панель, напечатанная на 3D-принтере. За два дня из железа, готовых библиотек и какой-то матери мы сделали прототип устройства, которое учитывает сотрудников или позволяет проверять, что человек прошёл через турникет именно по своему пропуску.

Никаких денег. Мы использовали только опенсорс.

Вы можете повторить это минут за 15–20 с нашим скриптом.
Читать дальше →

Information

Rating
Does not participate
Location
Сахалин, Россия
Date of birth
Registered
Activity