{"__typename":"PageLikeAction","action_type":"LIKE","label":{"text":"Like"}
В 2009 году Facebook добавила в интерфейс своей социальной сети код, изменивший мир — кнопку «Like». «Лайк» был детищем нескольких программистов и дизайнеров — Лии Перлман и Джастина Розенштейна. Они предположили, что пользователи Facebook часто бывают слишком заняты, чтобы оставлять комментарии к постам своих друзей, и что поэтому им нужна простая кнопка, нажав которую можно было бы дать понять друзьям, что их пост вам понравился. Так оценивать и поощрять друг друга пользователям стало бы легче, а значит и делали бы они это чаще.
Это сработало — и даже слишком хорошо. К 2012 году пользователи прожали «лайк» триллион раз. У этого оказались и побочные эффекты. Многие стали публиковать фото/видео, чтобы потом сидеть и с тревогой обновлять страницу, ожидая, когда же число лайков возрастёт. Все стали гадать, почему кто-то другой получает больше лайков. Люди подсели на иглу одобрения (вместо того, чтобы сесть на чьё-то лицо), что отразилось на их повседневной онлайн-активности: старались публиковать как можно больше постов, чтобы казаться смешнее, умнее, красивее, спортивнее.
Небольшой фрагмент кода, который внёс почти незаметное изменение в пользовательский интерфейс социальной сети, изменил поведение людей. Ниже представлен список из примеров подобных важных фрагментов кода, которые изменили мир. И на самом деле это неполный список, учитывая огромное количество кода, который был написан.
❯ Бинарные перфокарты (первый код)
Двоичное кодирование появилось задолго до компьютеров. Базиль Бушон считается первым, кто проделал отверстия в бумаге и использовал её для управления машиной: в 1725 году он изобрел ткацкий станок, который ткал узоры на основе инструкций, содержащихся в перфорированной бумаге. Отверстие — это «единица», а отсутствие отверстия — это «ноль». Как бы многое ни изменилось с тех пор, основной «строительный блок» кода остался прежним.
❯ Первый современный код
ENIAC был первым программируемым электронным компьютером. Завершённый в 1945 году, он настраивался для каждой новой задачи путём прокладки соединений между его многочисленными компонентами. Несколько лет спустя Клара Дан фон Нейман и Николас Метрополис подключили ENIAC к к первому запуску кода современного вида: сотни числовых инструкций, выполняемых из постоянной памяти (переключатели таблицы функций ENIAC). Они смоделировали взрыв нескольких атомных бомб, оцениваемых в Лос-Аламосской национальной лаборатории в Нью-Мексико, с использованием метода Монте-Карло, когда сложная система моделируется шаг за шагом, чтобы многократно отобразить распределение вероятностей возможных результатов. Дальние потомки этого кода до сих пор используются в Лос-Аламосе.
❯ Компилятор Грейс Хоппер
Обнаруженный Грейс Хоппер первый компьютерный «баг» — мотылёк, залетевший в компьютер Mark II и вызвавший замыкание
Грейс Хоппер программировала один из первых компьютеров и решила упростить это, внедрив в него человеческий язык, так как большинство людей с трудом понимают двоичный код. Она подумала, что если бы языки программирования могли основываться на английском языке, работа была бы менее подвержена ошибкам и была бы более доступной для тех, у кого нет докторской степени в математике.
Некоторые насмехались над этой идеей, но к началу 1950-х годов она разработала компилятор — набор инструкций, который преобразует код, состоящий из слов, в код более низкого уровня, непосредственно обрабатываемый машиной. С помощью этого инструмента она и её лаборатория разработали FLOW-MATIC, первый язык программирования, включающий английские слова на основе этого процесса.
(0) INPUT INVENTORY FILE-A PRICE FILE-B ; OUTPUT PRICED-INV FILE-C UNPRICED-INV
FILE-D ; HSP D .
(1) COMPARE PRODUCT-NO (A) WITH PRODUCT-NO (B) ; IF GREATER GO TO OPERATION 10 ;
IF EQUAL GO TO OPERATION 5 ; OTHERWISE GO TO OPERATION 2 .
(2) TRANSFER A TO D .
(3) WRITE-ITEM D .
(4) JUMP TO OPERATION 8 .
(5) TRANSFER A TO C .
(6) MOVE UNIT-PRICE (B) TO UNIT-PRICE (C) .
(7) WRITE-ITEM C .
(8) READ-ITEM A ; IF END OF DATA GO TO OPERATION 14 .
(9) JUMP TO OPERATION 1 .
(10) READ-ITEM B ; IF END OF DATA GO TO OPERATION 12 .
(11) JUMP TO OPERATION 1 .
(12) SET OPERATION 9 TO GO TO OPERATION 2 .
(13) JUMP TO OPERATION 2 .
(14) TEST PRODUCT-NO (B) AGAINST ; IF EQUAL GO TO OPERATION 16 ;
OTHERWISE GO TO OPERATION 15 .
(15) REWIND B .
(16) CLOSE-OUT FILES C ; D .
(17) STOP . (END)
Сэмпл программы FLOW-MATIC
❯ Spacewar!
hp1, dap hp2
count i ma1, hp2
law hp3 / next step
dac i ml1
law 7
dac i mb1
random
scr 9s
sir 9s
xct hr1
add i mx1
dac i mx1
swap
add i my1
dac i my1
random
scr 9s
sir 9s
xct hr2
dac i mdy
dio i mdx
setup .hpt,3
lac ran
dac i mth
hp4, lac i mth
sma
sub (311040
spa
add (311040
dac i mth
count .hpt,hp4
xct hd2
dac i ma1
hp2, jmp .
Эта процедура позволяет в игре Spacewar! кораблям не сталкиваться друг с другом.
В конце 1961 года группа молодых сотрудников MIT получила доступ к компьютеру DEC PDP-1, который имел 18-битную длину слова и использовал бумажную ленту для хранения программ. В течение пяти месяцев эти программисты создали игру, где два игрока управляют космическими кораблями, которые сражаются в космической битве один на один.
Spacewar! быстро распространилась среди раннего «хакерского» сообщества. Позже DEC распространяла его с каждым PDP-1, предварительно загружая в основную память. Программа значительно повлияла на небольшое сообщество программистов 1960-х годов и вдохновила поколения создателей видеоигр. Игра продолжает жить в эмуляциях и регулярно демонстрируется в Музее компьютерной истории на последнем действующем PDP-1, которому более 50 лет (Жалоб от пользователей нет. Отчетов о сбоях нет. И поддержка по-прежнему доступна).
❯ Электронной почта
WHENEVER A(1).E.FENCE.OR.A(2).E.FENCE.OR.A(3).E.FENCE
PRFULL.($'R'1INSTRUCTIONS:$)
PRFULL.($ '4MAIL NAME1 NAME2 PROB1 PROG1 PROB2 PROG2 ...$)
PRFULL.($ WHERE '=NAME1 NAME2'= IS THE FILE TO BE MAILED,$)
PRFULL.($ AND '=PROBN PROGN'= ARE DIRECTORIES TO WHICH '8$,
1 $IT IS TO BE SENT.'B$)
CHNCOM.(0)
END OF CONDITIONAL
В том же 1961 году программисты того же MIT создали систему, позволяющую нескольким пользователям входить в один и тот же компьютер, и они начали оставлять друг другу небольшие сообщения. В 1965 году группа программистов решила создать формальную систему команд для отправки, получения и отображения этих маленьких цифровых посланий. Высшее руководство поначалу сопротивлялось команде MAIL
, думая, что это немного легкомысленно, но её использование стало настолько популярным, что к 1971 году Массачусетский технологический институт даже увидел первый спам: сообщение против войны во Вьетнаме.
❯ Код спасения лунного модуля «Аполлон-11»
POODOO INHINT
CA Q
TS ALMCADR
TC BANKCALL
CADR VAC5STOR # STORE ERASABLES FOR DEBUGGING PURPOSES.
INDEX ALMCADR
CAF 0
ABORT2 TC BORTENT
OCT77770 OCT 77770 # DONT MOVE
CA V37FLBIT # IS AVERAGE G ON
MASK FLAGWRD7
CCS A
TC WHIMPER -1 # YES. DONT DO POODOO. DO BAILOUT.
TC DOWNFLAG
ADRES STATEFLG
TC DOWNFLAG
ADRES REINTFLG
TC DOWNFLAG
ADRES NODOFLAG
TC BANKCALL
CADR MR.KLEAN
TC WHIMPER
У управляющего компьютера «Аполлона» (AGC) было меньше вычислительной мощности, чем у сегодняшних поздравительных открыток, и всё же он работал. Эта ограниченная мощность и объём памяти означали, что задачи должны были тщательно продуманы. Команда разработчиков программного обеспечения AGC знала, что всегда существуют непредвиденные обстоятельства. Поэтому они создали BAILOUT
. Когда на компьютере возникал риск нехватки места, AGC запускал BAILOUT
, чтобы «запаузить» менее важные операции, чтобы поддерживать работу жизненно важных.
Когда посадочный модуль Eagle опускался на поверхность Луны, на высоте 15 000 метров AGC высветил сигнал тревоги «1202», который ни Нил Армстронг, ни диспетчер полётов в Хьюстоне сразу не распознали. Но менее чем через 30 секунд компьютерные эксперты из Центра управления полётами сообщили, что программное обеспечение AGC делает именно то, что и должно: откладывает менее приоритетные задачи и запускает важные (так быстро, что это незаметно для экипажа). Армстронг и Базз Олдрин продолжали получать то, что им было необходимо от AGC, чтобы не сбиться с пути.
❯ Hello, world!
main( ) { printf("hello, worldn"); }
Когда вы садитесь изучать новый язык программирования, первое, что вам нужно сделать, — заставить компьютер отобразить фразу «Hello, world!». Самый известный ранний пример взят из меморандума Bell Laboratories под названием «Programming in C — A Tutorial», написанного в 1974 году.
«Hello, world!» это хороший пример педагогики. Это небольшая достижимая задача, которая быстро даёт чувство выполненной работы. Это стандарт, поэтому он помогает проиллюстрировать различия между разными языками программирования. Это также быстрый и простой способ для программистов убедиться, что всё работает правильно после установки новой среды.
❯ Строка с завершающим нулём
char yellow[26] = {'y', 'e', 'l', 'l', 'o', 'w', ''};
Самая катастрофическая ошибка проектирования в истории вычислительной техники
В 1972 году Деннис Ритчи принял судьбоносное решение: представить текст на своём новом языке с помощью чего-то, что называется строкой с нулем в конце. Эта концепция существовала и раньше, но он закрепил её в своем новом языке, который назвал C, и с тех пор наследие этого решения остаётся с нами.
Чрезвычайно распространённая ошибка в коде C — копирование длинной строки в более короткую, что означает переполнение строки и уничтожение других данных. Помимо простого нарушения работы программы, такие ошибки можно использовать для изменения поведения программы. Почти все эксплойты безопасности, о которых вы когда-либо слышали, берут свои истоки отсюда, начиная с червя Морриса в 1988 году.
Вы можете аккуратно кодировать на C, чтобы избежать подобных ошибок, но язык делает этот класс ошибок лёгким для совершения и трудным для обнаружения. Почти все современные языки избегают строк с завершающим нулем, но C и C++ по-прежнему 50 лет спустя имеют этот класс багов.
❯ IRC
/join #cats
Internet Relay Chat (IRC), появился ещё до того, как большинство людей смогли бы рассказать, что такое Интернет. Это был первый популярный способ общаться в режиме реального времени с другими людьми в групповом канале. Первые пользователи входили в систему, чтобы делиться новостями. Сам чат требовал своего рода код: чтобы присоединиться к каналу, нужно было ввести /join #[название канала]
. Если вы хотели сообщить что-то о себе, надо было набрать /так устал
, и ваше имя отмечалось звездочкой со словами «так устал». Не смотря на кажущуюся простоту, для многих это была первая проба пера с использованием команды на компьютере.
❯ Червь Морриса
/join #cats
checkother() /* 0x57d0 */
{
int s, l8, l12, l16, optval;
struct sockaddr_in sin; /* 16 bytes */
optval = 1;
if ((random() % 7) == 3)
return; /* 612 */
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
return;
Это выдержка из ключевой функции в коде червя Морриса.
И Роберт Моррис, и сам Интернет были молоды, когда 23-летний аспирант Корнелла, выпустил «червя Морриса», запустив то, что было названо «первой крупной атакой в Интернете». Приблизительно 10 % из 60 000 компьютеров, подключённых к Интернету, были повреждены. Был нанесён ущерб на миллионы долларов, что вынудило New York Times впервые напечатать слово «Интернет». Даже технически подкованные люди были удивлены, увидев, насколько обширен охват действия червя. Моррис, который говорил, что никогда не собирался причинять такой большой ущерб, стал первым человеком, которому было предъявлено обвинение в соответствии с Законом о компьютерном мошенничестве и злоупотреблениях. После того, как его приговорили к трём годам условно, он стал соучредителем знаменитого инкубатора стартапов Y Combinator и доцентом компьютерных наук в MIT (и снова MIT).
❯ HTML-гиперссылка
<a href = "https://habr.com/">Habr</a>
Тим Бернерс-Ли изменил мир, когда представил гиперссылку, фрагмент кода, который позволяет любому сёрфить по Всемирной паутине. Концепция связывания информации не была особенно новой. Что было в новинку, так это знаки препинания, которые были собраны вместе из различных соглашений компьютерных систем, чтобы получить формат «URL-адреса двоеточие-слэш-слэш». Концепция гиперссылки на что угодно сделала эту идею перспективной. Гиперссылка Бернерса-Ли могла бесплатно стать кнопкой «Купить сейчас», «Like», «ретвитом» и многим другим.
❯ JPEG
double *NaiveDct_transform(double vector[], size_t len) {
if (SIZE_MAX / sizeof(double) < len)
return NULL;
double *result = malloc(len * sizeof(double));
if (result == NULL)
return NULL;
double factor = M_PI / len;
for (size_t i = 0; i < len; i++) {
double sum = 0;
for (size_t j = 0; j < len; j++)
sum += vector[j] * cos((j + 0.5) * i * factor);
result[i] = sum;
}
return result;
}
Дискретное косинусное преобразование, лежащее в основе JPEG.
Сегодня стало само собой разумеющимся, что можно заполнять память смартфонов огромным количеством фотографий. Но раньше изображения требовали огромных объёмов данных. В 1992 году Объединённая группа экспертов по фотографии опубликовала спецификации стандарта JPEG, чтобы уменьшить размер файлов. Хотя в то время были доступны и другие форматы сжатия, JPEG стал мировым стандартом, отчасти потому, что он был бесплатным. Файлы JPEG используют сжатие с потерями — процесс, который удаляет аспекты изображения, невидимые для человеческого глаза, такие как небольшие различия в цвете. Сжатие с потерями было также важно для изобретения кое-чего ещё, представленного в 1992 году: MP3, формата аудиофайлов, который стал возможен благодаря отбрасыванию битов данных, неразличимых человеческим ухом.
❯ Браузер Mosaic
MakeImage(dsp, data, width, height, depth, img_info, clip)
Display *dsp;
unsigned char *data;
int width, height;
int depth;
ImageInfo *img_info;
int clip;
{
int linepad, shiftnum;
int shiftstart, shiftstop, shiftinc;
int bytesperline,bpp;
int temp;
int w, h;
XImage *newimage;
unsigned char *bit_data, *bitp, *datap;
Visual *theVisual;
int bmap_order;
unsigned long c;
int rshift, gshift, bshift;
#ifdef NEW
switch(bpp=bits_per_pixel(dsp,depth))
#else
switch(depth)
Рождение Интернета, каким мы его видим.
Предыдущие браузеры были неуклюжими, хоть и отображали текст хорошо, но вынуждали просматривать изображения в отдельном окне. В 1993 году разработчикам во главе с Марком Андриссеном потребовался браузер, в котором изображения и текст располагались бы рядом. И они создали Mosaic. Благодаря им сеть стала выглядеть так, как если бы это был классный цифровой журнал или газета. Это также подтолкнуло стандарты HTML к ускоренному развитию, поскольку веб-мастера по всему миру начали требовать всё больше тегов, чтобы сайты выглядели круче.
❯ Пиксель отслеживания
<img height="1" width="1" style="display:none"src="https://www.facebook.com/tr?id=166975463695820&ev=PageView&noscript=1"/>
Пиксель отслеживания просмотра страниц Facebook.
Эти крошечные фрагменты HTML являются основой цифровой рекламы, что ставит их в центр многих современных проблем: слежки, консолидации СМИ и даже дезинформации. Ещё в 1990-х веб-дизайнеры использовали прозрачные однопиксельные изображения для настройки макетов страниц. Но компьютер должен загрузить каждое изображение на веб-странице — даже один незаметный пиксель. В 1993 году компании начали извлекать из этого выгоду: отслеживая загрузки пикселей, они узнавали, кто и где находится, и инициировали загрузку файла cookie в их браузер. Этот файл cookie позволяет рекламодателям следить за пользователями на сайтах.
Именно успех отслеживания пикселей привел к появлению кнопки «Like» в Facebook, которая отслеживает вас на каждом веб-сайте, где она встроена. Этот массивный сбор данных позволил реализовать гипертаргетинг, который сделал рекламу в Facebook такой успешной, уведя миллиарды доходов от медиакомпаний. Это привело к процветанию целенаправленной дезинформации и распространению бизнес-моделей, основанных на слежке.
❯ Wiki
Начало для Википедии.
sub AsLink {
local($num) = (@_);
local($ref) = $old{"r$num"};
defined $ref
? ($ref =~ /.(?:gif|jpg|jpeg|png)$/i
? "<img src="$ref">"
: "<a href="$ref">[$num]</a>")
: "[$num]";
}
WikiBase от WikiWikiWeb, последний раз редактировалось 13 июня 2000 г.
Уорд Каннингем впервые разработал Wiki на своём сайте WikiWikiWeb, который он представлял как простейший способ обмена информацией. Он использовал базовый язык разметки, который включает в себя скобки, объединение слов без пробелов и апострофы вокруг текста, чтобы редакторы могли обновлять и упорядочивать информацию, связанную между страницами, — система, которая до сих пор широко используется в Википедии, запущенной в 2001 году.
❯ Первая всплывающая реклама
window.open('https://timeweb.cloud/')
Базовый код для открытия нового окна с заданным URL-адресом.
Всплывающая реклама была разработана для решения реальной проблемы: компания Tripod позволяла людям размещать любой контент, который они хотели, на бесплатной домашней странице. Чтобы субсидировать сервис, владельцы компании продавали рекламу. Но рекламодателям не всегда нравился контент страницы, на которой они размещались, поэтому было принято решение отделить рекламу от пользовательского контента. Так появился этот бич Интернета.
❯ Алгоритм PageRank от Google
import numpy as np
def pagerank(M, num_iterations=100, d=0.85):
N = M.shape[1]
v = np.random.rand(N, 1)
v = v / np.linalg.norm(v, 1)
iteration = 0
while iteration < num_iterations:
iteration += 1
v = d * np.matmul(M, v) + (1 - d) / N
return v
До PageRank поисковые системы пытались найти информацию, основываясь на том, соответствуют ли слова запроса словам на сайтах. Но у Ларри Пейджа и Сергея Брина возникла блестящая идея: они создали алгоритм, который ранжирует известность страницы в зависимости от того, сколько других страниц в Интернете ссылаются на неё. Именно это отвечает за доминирование среди браузеров, которым сегодня пользуется Google.
❯ Пропорциональное справедливое планирование для беспроводных сетей
[~, b_user] = max(drc(i, :)/_avg_thruput(i, :));
avg_thruput(i+1, :) = (i/(i+1))*avg_thruput(i, :);
avg_thruput(i+1, b_user) = (i/(i+1))*avg_thruput(i, b_user)+drc(i, b_user)/(i+1);
«Управляемая передатчиком система с несколькими приёмниками, использующая разнесение путей для справедливого увеличения пропускной способности», Патент США № 6449490, 10 сентября 2002 г.
Всего три строки кода, которые заставляют работать все сотовые сети 3G и 4G по всему миру.
Часто в каком-либо населённом пункте имеется намного больше мобильных телефонов, чем могут обслуживать вышки базовых станций. Это может препятствовать надежной передаче данных. Таким образом, вышкам необходимо решить проблему расстановки приоритетов: убедиться, что все пользователи могут завершить свои звонки, принимая во внимание тот факт, что пользователям в более «шумных» местах необходимо предоставить больше ресурсов для получения того же качества обслуживания. Решение? Компромисс между потребностями отдельных пользователей и общей производительностью всей сети. Пропорциональное справедливое планирование гарантирует, что все пользователи имеют хотя бы минимальный уровень обслуживания при максимальной общей пропускной способности сети. Это делается путём предоставления более низкого приоритета пользователям, которым, как ожидается, потребуется больше ресурсов.
❯ Биткоин
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
Код, без которого не существовал бы Биткоин.
Являетесь ли вы сторонником биткоина, скептиком или не совсем уверены, что это такое, вы, вероятно, знаете, что это хайповая тема. Сам Биткоин привлёк сотни миллиардов долларов прямых инвестиций, но более важно то, что лежащий в основе технологический принцип, блокчейн, был исследован для бесконечных приложений, от обеспечения демократических выборов до прекращения сексуальных контактов без согласия.
Все началось в 2008 году, когда Сатоши Накамото опубликовал официальный документ, в котором объявил о запуске Биткоин. Документ включал в себя эти строки кода, которые вычисляют бесконечно малую вероятность того, что злоумышленник сможет захватить блокчейн Биткоина. Математика убедила мир в том, что системе, созданной ненадёжными людьми, тем не менее, можно доверять. Это проложило путь к созданию как минимум около 3000 других криптовалют.
Поначалу не всегда ясно, когда какой-то код станет эпохальным. Часто это начинается как странный эксперимент, простой прикол или даже ошибка. Как и все списки, этот предназначен для того, чтобы мы задумались над тем, как код меняет нашу жизнь и как решения программистов влияют на будущее.
Автор:
TilekSamiev