
Не собирался смотреть этот фильм, но надысь Баженов выложил на него обзор, и на одном из кадров мелькнул фрагмент, по очертаниям очень похожий на ассемблерный код. Пришлось ознакомиться.
Весь фильм, то тут, то там показывают разного рода мониторы, но ничего конкретного на них не разобрать. Жуткое мыло.
Но в конце, в ключевой сцене таки случилось интересное.
Сцена запуска мандулы "супер-оружия":

Внизу чётко виден ассемблерный код. Это фрагмент из учебника по программированию. Рисуем на экране девять звёздочек в ряд.
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
После такой годной зацепки становится возможным разобрать мыльные фрагменты.
Сцена с таймером самоуничтожения:

Фрагмент с кодом очень размытый:

но, благодаря подсказке в предыдущей сцене, его получается идентифицировать. Слева код из того же учебника, вычисляет и выводит на экран сумму чисел 3 и 4. А справа код чуть сложнее: вычисляется сумма чисел 12345 и 23456 в двоично-десятичном представлении.
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax,'3'
sub eax, '0'
mov ebx, '4'
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,sum
mov edx, 1
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db "The sum is:", 0xA,0xD
len equ $ - msg
segment .bss
sum resb 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov esi, 4 ;pointing to the rightmost digit
mov ecx, 5 ;num of digits
clc
add_loop:
mov al, [num1 + esi]
adc al, [num2 + esi]
aaa
pushf
or al, 30h
popf
mov [sum + esi], al
dec esi
loop add_loop
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,5 ;message length
mov ecx,sum ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'The Sum is:',0xa
len equ $ - msg
num1 db '12345'
num2 db '23456'
sum db ' '
Теперь можно попробовать по смутным очертаниям догадаться, что там было в середине фильма, в сцене, где герои пытались деактивировать своё “супер-оружие”:

Тут сложнее! Так просто не деактивировать! Слева вычисляем факториал числа 3. А в правом фрагменте - пример модификации строк в памяти на примере замены имени: “Zara” -> “Nuha”. Программа выводит “Zara Ali Nuha Ali”.
Да, авторы учебника - индусы.
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov bx, 3 ;for calculating factorial 3
call proc_fact
add ax, 30h
mov [fact], ax
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,1 ;message length
mov ecx,fact ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
proc_fact:
cmp bl, 1
jg do_calculation
mov ax, 1
ret
do_calculation:
dec bl
call proc_fact
inc bl
mul bl ;ax = al * bl
ret
section .data
msg db 'Factorial 3 is:',0xa
len equ $ - msg
section .bss
fact resb 1
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
;writing the name 'Zara Ali'
mov edx,9 ;message length
mov ecx, name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov [name], dword 'Nuha' ; Changed the name to Nuha Ali
;writing the name 'Nuha Ali'
mov edx,8 ;message length
mov ecx,name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
name db 'Zara Ali '
А в сцене стрельбы из этого оружия теперь становится понятно, что вычисления нужны те же, что и для самоуничтожения: посчитать сумму 3 и 4. И сложить 12345 с 23456.

Код в фильмах: Кракен 2025
read more at deadem // Dead Emotion

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

Слева внизу нечёткие, но явные фрагменты x86-ассемблера:

Это фрагмент программы, реализующей протокол последовательной передачи данных. Тони через компьютер настраивает режимы работы двигателя?
SEND_CHAR SLIP_END
jcxz @@bailout
@@nextchar:
lodsb
cmp al,SLIP_END
jne @@check_esc
SEND_CHAR SLIP_ESC
mov al,SLIP_ESC_END
jmp @@ordinary
Во второй половине фильма тоже есть фрагмент с ассемблером.

Когда Пеппер листает документы в секретной папке “SECTOR_16”, слева на некоторых изображениях костюма есть панель ASSEMBLER DECODING, где действительно отображён листинг ассемблерных команд. На первой картинке вместо операндов написано “N/A”

а затем операнды проявляются по мере отображения надписи “File Access...”

В итоге это какой-то RISC, но последовательность команд бестолковая. Тупой рандом или отсылка к чему-то?

LW Z1,W2(Z0)
LW Z2,W3(Z0)
NOP
NOP
ADD &3,&1,&2
SUB #4,Q1,Q2
SLL &5,*1,1&
SRL -06,+2,16
CMPL -7,+3
OR -11,+5,=2
SW ++1,W4(=0)
ADDI [8,W1]
NOP
NOP
LW &9,4(&8)
ADDI &10,8(&8)
NOP
NOP
SW Q3,0(Q10)
WORD 0x11111111
WORD 0x22222222
WORD 0x33333333
WORD 0x44444444
Но самое интересное происходит в начале фильма, между этими сценами. Когда Тони попадает в плен, он собирает первый прототип робота. В момент первого запуска на экране чётко виден код на C, который и на самом деле является кодом для управления роботами. Вот только роботы эти небольшие. Это код для управления деталями конструкторов LEGO Technic (Mindstorms).

На скриншоте - фрагмент функции image_dl, которая, собственно, и заливает программы в Лего-контроллер роботов.

А тут, в числах, которые отображаются слева, закодирована небольшая прошивка лего-робота с текстом “Do you byte, when I knock?” - это такой интересный способ проверить работоспособность интерфейса: увидев эту команду, контроллер Лего должен ответить “Just a bit off the block!”.
Костюм “Железного человека” работает на LEGO. Забавно.
Код в фильмах: Железный человек (Iron Man) 2008
read more at deadem // Dead Emotion

Сомнительного качества фильм, по духу напоминающий “Куб”. Код мелькает всего в двух сценах.
В самом начале Тим пишет код. Он же работает программистом игр, поэтому, наверное, какое-то отношение к играм должно быть?

Но нет. Это часть ядра Линукса. Файл groups.c: код для поддержки групп в правах доступа. Не удивлюсь, если в этом фрагменте отсылка к hackertyper.com - сайту, где каждый может почувствовать себя “элитным хакером”. Нужно просто изо всех сил долбить по клавиатуре и на экране будет появляться код из того самого groups.c. Это не первый фильм, где я его встречаю.
Та же сцена, следующий кадр: онлайн-конференция с коллегами. Обсуждение рабочих процессов. А на фоне два фрагмента кода.

Маленький кусочек сверху:

Это цитата со StackOverflow. Ответ на вопрос “Как написать класс на языке C”. На экране учебный пример организации классов на языке C (это нетривиально, т.к. в этом языке нет встроенного механизма работы с классами).
/// Object.h
typedef struct Object {
uuid_t uuid;
} Object;
int Object_init(Object *self);
uuid_t Object_get_uuid(Object *self);
int Object_clean(Object *self);
/// Person.h
typedef struct Person {
Object obj;
char *name;
} Person;
Слева внизу занятный франкенштейн:

Командная строка Windows, которая имитирует работу в Linux: C:\root\system\. Далее фрагмент команды подключения к сети, правда, с ошибкой: пропущен атрибут name. А затем фрагмент профиля для подключения к Wi-Fi, только почему-то замаскированный под локальное подключение: WLANProfile заменён на LAN-Profile. И в версии xml какая-то самодеятельность: 3,1 вместо 1.0.
Этот фрагмент кто-то перепечатывал вручную? В слове keyType пропущена p. И адрес неймспейса вместо microsoft.com указывает на aeseacont.biz. Домен ничейный, можно зарегистрировать.
Возможно, что этот фрагмент кода тоже взяли со StackOverflow: “Как подключиться к Wi-Fi из командной строки”. Очень уж сильно он повторяет киношный фрагмент.
Вторая сцена с кодом ближе к концу фильма. Тим опять печатает на клавиатуре:

По центру, в редакторе, появляются по одному символы. Ничего не напоминает?

Да. Это в точности тот же самый кусочек кода, который был показан в начале фильма. Из руководства о написании классов на языке C. Отличается только передвинутой вверх пустой строкой. Зачем Тиму этот код писать ещё раз, интересно?
Слева экрана - фрагмент из ядра Линукса, файл timer.h. Вероятно, он набран вручную, т.к. в нём есть опечатки. Причём, версия файла не свежая, а редакция 2016-2017 года.

stringsвместоsticks- пропущено подчёркивание и появилась лишняя скобочка в
void *private_data; - пропущена
u, подчёркивание, точка с запятой в строкеstruct snd_timer_hardware hw; - задвоилась
nи подчёркивание вместо пробелаspinlock_t lock; - подчёркивание вместо пробела
struct list_head open_list_head; struct tasklist_structвместоstruct tasklet_struct. Интересно, что точно такая же опечатка была в первом издании книги “Linux Kernel Development”. Отсылка к этому факту или просто аналогичная опечатка?
Код в фильмах: Кирпич (Brick) 2025
read more at deadem // Dead Emotion

Готовился ребёнок поступать в ВУЗ, одним из вариантов рассматривал ВМК МГУ. И для самостоятельной подготовки приобрели книжку для подготовки к ЕГЭ, собственного мгушного производства.
Книжка как книжка, правда, все задачи и примеры на Паскале. Как оказалось, и неудивительно - на ВМК до сих пор преподают программирование на Паскале. В 21 веке. Караул!
Листая эту книжку, наткнулся на занятную задачку: сама по себе она довольно простая, и, вроде бы, ничем не примечательная:
- Вводится основание системы счисления (переменная
Sis), допустим, ввели 17 - Вводится количество цифр в числе (переменная
K), допустим, 4
А далее выглядит так, как будто программа должна предложить ввести “Цифры числа в 17-ичной системе счисления”.
Но на самом деле, вокруг переменной Sis стоят кавычки, так что получается: “Цифры числа в Sis-ичной системе счисления”.
Гыгы. Она сказала: “В сисечной”, Бивис!
Больше похоже на пасхалку, чем на случайную опечатку.


В этом фильме мало прямых заимствований. Весь код и его подобие, похоже, создавались специально для фильма. Одни и те же фрагменты кода повторяются в разных сценах. Такие повторы буду пропускать.
05:08 (здесь и далее - время от начала фильма)
В сцене разглядывания спутниковых снимков слева виден интерфес с именами программных файлов:

Editor 01
- exe_VideoComm...
- FindOptionsWid...
- Contribution.md
- DDI_usr.txt
- Package.json
Editor 02
- DDI_Compiler.js
- .metntion.bot
- .travis.yml
- .yarnrc
- Licence Plate Te...
- Contribution.md
- DDI_usr.md
- video_fileSource...
- .gulpfile.js
- package.json
- contentmenu.ts
- FindOptionsWid...
- Contribution.md
- Developer.txt
- dddos.Tools.ys
Выглядит, как какой-то проект на Тайпскрипте. Но ничего конкретного тут нет, и, вероятно, допущены опечатки: должно быть package.json, а не Package.json, опечатка в слове metntion (mention?), и расширение файла, вероятно, должно быть не .ys, а скорее .ts (клавиша t находится рядом с y).
Вот это сокращение “DDI” в начале файлов дальше будет мелькать весь фильм. Какого-то внятного объяснения, что это может значить, нет. Инициалы технического консультанта?
05:11
А тут вполне понятные команды установки связи. С логичным отображением процесса.

# Initializing Secure Satellite Network Connection...
$ ./initiate_secure_link.sh --satellite SAT-47 --encryption AES-256
# Authentication Required
Enter Access Key: ************
Enter Biometric Verification: [Verified]
Access Granted
Secure Uplink Established
Connected to CIA-SAT-47 at Lat: 34.0535° N, Long: -118.2449° W
Initializing Encrypted Communication Channels...
Encryption Protocol: AES-256-GCM
Session ID: 8FA79C90-20BE-4A38-AF18-349C12A6F4A7
Handshake Successful
# Loading Satellite Control Interface...
05:16
Фрагмент кода, вычисляющий орбитальный период спутника Земли, в секундах, по формулам Ньютона и Кеплера. Уж не знаю, зачем такое может понадобиться рядовому работнику, который смотрит на спутниковые картинки, но код рабочий.

import numpy as np
def orbital_period(a):
G = 6.67430e-11
M = 5.972e24
mu = G * M
T = 2 * np.pi * np.sqrt(a**3 / mu)
return T
И сразу же пример вызова этого кода. Видимо, тестировали корректность его работы:
a = 7000000
period = orbital_period(a)
06:27
По сюжету Чарльз пытается открыть зашифрованный файл, который ну никак не хочет открываться. Но картинка выглядит так, как будто открыли самый обычный вордовый “.doc” в текстовом редакторе, типа блокнота.

07:37
Только что у нас были зашифрованные документы, а теперь мы почему-то пытаемся расшифровать outright-libdes-dev-1_1-s_rh.bin. Интересно, откуда он взялся? В изначальном листинге файлов такого нет.

08:56
Но, видимо, мощности ноутбука не хватает, и Чарльз идёт в бункер к мощному компьютеру.
Запускает его и появляется код. Странный:

Тут намешан синтаксис нескольких языков программирования: Java (System.out.println), JavaScript (document.write), макрос или прагма (#execute), Windows-путь? (E:admin 851212118/bin.files), строчка Linux-шелла? ({ (VAULT_user_851212518@DDI_terminal):~$)
Никакого смысла в этом фрагменте нет. Просто наброс команд.
09:25
И вот пароль подобран, файлы расшифрованы, и в мелькающих фрагментах мешанины из разных языков добавляются фрагменты на C:

В них содержатся намёки на софт для камер наблюдения (CONFIG_CCTV), фрагменты из кода ядра Линукса, из подсистемы работы с таймерами для чипов picoXcell, предназначенных для использования в небольших и компактных устройствах (dw_apb_timer_of.c)
Этот фрагмент далее будет мелькать в разных сценах и окошках.
19:44
Чарльз не доверяет никому и начинает самостоятельное расследование. Опять какая-то мешанина из Java с непонятно чем:

20:49
А тут пошёл креатив. Взяли фрагмент кода из упомянутого выше ядра Линукса dw_apb_timer_of.c и перемешали строки с JavaScript-примером из совета на StackOverflow

goto try_clock_freq;
switch (num_called) {
for (let i = 0, k; i < str.length; i++) {
h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
function cyrb128(str) {
for (let i = 0, k; i < str.length; i++) {
pr_debug("%s: found clockevent timer\n", __func__);
21:27
Когда Чарльз готовит для демонстрации начальству 3D-модель уличной сцены, кто-то (он сам?) пишет код на Three.js - JavaScript-библиотеке для создания 3D-графики в браузере.
Он что, в браузере делает презентацию?

if (j > 0) geometry.faces.push(new THREE.Face3(0, j, j + 1));
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
{
import_3D MODELER
media_source == collate_media_sources
И тут не обошлось тут без включения абсолютно чужеродного фрагмента про import_3D_MODELER.
Вот такое он в браузере намоделировал, получается:
Неплохо!
26:34
Опять мелькают два якобы редактора кода, но на этот раз на экране код на C под Windows, который является фрагментом драйвера, который скрывает рабочие процессы в Windows. В основном этот трюк используется вирусами и прочими малварями. Но и без творческого исправления тут не обошлось: в коде системные префиксы заменены на те самые “DDI”.
И оно вполне соответствует сюжету: в этой сцене Чарльз готовит разные отвлекающие штуки для слежения за коллегами и маскировки.

27:16
Фрагмент редактирования файла DDI_buildfile.py. Тут небольшой скрипт, которые использует библиотеку OpenCV для распознавания объектов на видео. Видимо, проиллюстрирован процесс отладки программы, которая будет следить за коллегами.

cap = cv2.VideoCapture('object_tracking_video.mp4')
tracker = cv2.TrackerKCF_create()
success, frame = cap.read()
bbox = cv2.selectROI(frame, False)
tracker.init(frame, bbox)
while cap.isOpened():
ret, frame = cap.read()
1:27:08
Чарльзу с подругой приходится убегать от преследователей, а на фоне запущен процесс удаления улик. И тут много чего удалятельного мелькает на экране. Каждый кадр удаляется что-то новое.

Повторения приводить не буду, перечислю только уникальные строчки:
- Удалим записи из логов, но почему-то только устаревшие. Свежие оставим
DELETE FROM system_logs WHERE timestamp < 2023-02-12; - Удаляем всю директорию логов
rm -rf /var/logs/* - И безопасно удалим какой-то один очень-очень важный файлик
shred -u /path/to/sensitive_file - Удаляем записи из логов ошибок, но только записи с низким приоритетом. Всё важное оставляем
DELETE FROM error_logs WHERE severity = 'low'; - И грохнем таблицу с записями об активных сессиях пользователей
TRUNCATE TABLE user_sessions; - И что-то удаляем кодом (на
Java?JavaScript?)db.systemData.remove({ ... }); - И удаляем кеш скачанных
deb-пакетовsudo apt-get clean - И удаляем файлики логов через поиск
find /path/to/directory -type f -name "*.log" -exec rm -f {} - И удаляем таблицу со старыми бэкапами
DROP TABLE IF EXISTS old)_backup_data; - А! Так это PostgreSQL тут у вас
VACUUM FULL; - Затираем записи в
syslogecho "" > /var/log/syslog - А теперь удалим из базы временные файлы, причём, только обработанные
DELETE FROM temp_files WHERE status = 'processed'; - И очередь отправки писем почистим. Удалим из очереди те, что уже были отправлены. Неотправленные оставим
DELETE FROM email_queue WHERE sent = true; - И, традиционно, микс из разных языков,
SQL+JavaScriptDELETE FROM db.temporary.remove({}); - И
SQL+shellLOG ROTATE --delete-system-files - Удалим информацию о временных файлах
TRUNCATE TABLE temporary_files; - И сами временные файлы
rm -rf /var/tmp/*
Очень похоже на то, что авторы загуглили как удалить информацию и нашли кучу примеров на разных языках об освобождении места на диске и в БД, и всё подряд добавили в фильм.
Почистили, смотрю, в основном только кеши, временные файлы и всё несерьёзное. Всю важную информацию при этом оставили нетронутой.
1:30:49
И, напоследок, сцена прошивки джейлбрейкнутого телефона, который за минуту до этого был куплен в уличной лавочке.

Код в фильмах: Новичок (Amateur) 2025
read more at deadem // Dead Emotion
Отбираю кандидатов в айтишечку, читаю резюме. Охреневаю. Кто ж, вас, блин, учил резюме составлять? И хорошо если в “обо мне” хоть что-то человеческое напишут…
Вы же все одинаковые!!! Всё по одному дурацкому шаблону: “разрабатывал…”, “оптимизировал…”, “поддерживал…”, “…и это привело к приросту количества посетителей”, “сборка теперь занимает минуту, а не две”. Это не твои заслуги! Это менеджмент или инструмент постарались. А ты - просто дал им возможность сделать свою работу.
Цитаты из достижений:
- Разрабатывал интерфейс
CRM-системы для обработки лидов, управления воронкой продаж и взаимодействия с потенциальными покупателями; - Реализовал интерфейсы для карточки клиента, ленты звонков, задач и напоминаний, фильтрации и поиска;
- Использовал
ReactиTypeScriptдля построения типобезопасных, масштабируемых компонентов и модулей; - Сократил количество ошибок при работе операторов за счёт улучшения
UXи валидации форм; - Разрабатывал и поддерживал пользовательский
uiдля складских систем; - Отвечал за поддержку ключевых модулей
UI, интеграциюREST API; - Внедрил новый функционал для отслеживания статуса заказов;
- Оптимизировал процесс загрузки и кэширования данных;
- Оптимизировал код основного проекта;
- Взаимодействовал с заказчиками: презентовал проекты, оперативно принимал решения;
- Провёл большой рефакторинг структуры;
- Разработал модуль “График работ” с календарём расписания;
- Реализовал систему уведомлений с
real-timeдоставкой черезsocket.io; - Покрывал код
unit-тестами; - …
И у всех такое. Хочется заорать: “и чоо?!” Это обычные типовые обязанности на нормальной работе. Что именно ты сделал и достиг? Где твои достижения? Чем ты отличаешься от другого кандидата, который тоже что-то “разработал”, “покрыл”, “сократил”?
Ссылки на Гитхаб, бывает, проскакивают, но он почти всегда или пуст, или в нём пара учебных проектов. Хорошо, если там окажется тестовое задание на какую-то соседнюю вакансию.
А как насчёт где-то поучаствовать, куда-то законтрибутить, что-то сделать именно потому, что лично тебя не устроило, а не потому, что руководитель попросил или такая задача в таск-менеджере была?
Из сотни только один выделился из толпы: написал, что пропатчил свой драйвер принтера, потому что производителем он был снят с поддержки и не работал в нужном режиме под Линуксом. Вот! Хочу таких!
Пишите, блин, в резюме о своих личных достижениях, а не о том, что вы как попка фигачили, потому, что менеджер задачу поставил, тимлид попросил, Дядя Боб написал в умной книжке.
![]()
В этом сериале заметил довольно много всякого кода, поэтому начал пересматривать второй раз, останавливаясь на интересных кадрах.
Хотел было сразу про все сезоны написать, но, оказалось, что тут полно информации и тяжело разом всё подготовить, поэтому буду выкладывать посезонно.
Заимствований кода в этом сериале немного. Похоже, что довольно приличную часть фрагментов программ писали специально для фильма.
Сезон 1, Серия 1
“Большеголовый” показывает работу приложения NipAlert:
![]()
На экране Visual Studio. Судя по именам и интерфейсам, написано оно на C# и сборка предназначается для Windows Phone: на экране горизонтально расположенный эмулятор телефона.
![]()
Эта табличка с магическим числом не так проста, как кажется. Weissman score - реальная метрика для оценки качества алгоритмов сжатия без потерь. Была придумана в Стенфорде профессором Цахи Вайсманом и аспирантом Винитом Мисрой по заказу HBO специально для этого сериала. После телевизионного успеха эта метрика использовалась некоторыми учёными и в реальных проектах.
Серия 2
Ричард вымучивает бизнес-план, а на стене у него за спиной знаковые портреты:
![]()
- слева Лена Сёдерберг, основная заслуга которой - появление в 1972 году на развороте журнала Плейбой. Так получилось, что фрагмент этого разворота, как раз тот, что на картинке, был использован в научной работе по сжатию изображений в 1973 году. Требовался квадратный рисунок 512x512 пикселей, а под рукой был сканер на сотню DPI и журнал. С тех пор это изображение широко используется в качестве тестового для проверки качества работы алгоритмов компресии изображений.
- справа Дэвид Хаффман, автор алгоритма кодирования данных, “код Хаффмана”, который применяется во многих алгоритмах сжатия:
JPEG,ZIPи т.д.
Ещё одно демо проекта NipAlert:
![]()
на этот раз на экране эмулятор iPhone. В качестве IDE используется IntelliJ IDEA. Постарались, сделали по версии под платформу. Вот только под Андроид версии так и не покажут, хотя в 2014 году он уже был пятой версии и занимал 80% рынка смартфонов.
![]()
Код написан на Objective C, но по фрагменту назначение толком не понятно: тут только перевод секунд в минуты и проверка времени работы программы. Возможно, это код, отвечающий за показ сплеш-скрина при запуске приложения.
На пару секунд мелькает в кадре экран с кодом:
![]()
Этот экран дальше будут часто издалека показывать в разных эпизодах, но тут удалось его более-менее разглядеть:
![]()
В верхней части фрагмент на C. Похоже, что это часть некоторой программы по обработке звука, взаимодействующей с OpenAL (Open Audio Library), открытой звуковой библиотеке от Creative, авторов Саунд Бластера, что вполне укладывается в сюжет - в этих эпизодах серии вовсю разрабатывается аудио-кодек.
В нижней - минифицированный код на JavaScript от системы телеметрии для сайтов: “Foresee” (слежение за пользователями, встраивание голосовалок и т.п.) Конкретный источник этого фрагмента уже не определить, т.к. это общая библиотека и код раздавался всем желающим, а к сегодняшнему дню её код значительно поменялся.
Серия 6
Ричард пишет в BinTree.java код на Python для работы с деревом. На ноутбуке Sony под управлением OS X. Эээ…
![]()
Следом - прогон автотестов в Jenkins:
![]()
На фоне тот же файл, BinTree.java:
![]()
…и снизу выглядывает он же:
![]()
…но на этот раз код в этом файле написан на JavaScript: это модуль для работы с БД PostgreSQL.
А на правой панели выглядывает небольшой фрагмент из библиотечного кода: реализация алгоритма компрессии LZMA из JavaSDK:
![]()
В сцене, где Джаред оказывается на корабле, виден QR-код:
![]()
Это ссылка на сайт ravigacapital.com - фирму Питера Грегори, название которой мелькает в офисах в середине сезона. Однако, на этом сайте так ничего и не открыли - на момент выхода серии там висела заглушка. Возможно, на этот ресурс были какие-то планы, которые пришлось пересматривать в связи со внезапной смертью актёра, который играл Грегори. А потом домен перестали продлевать и его засквоттили всякие нехорошие люди.
Серия 8
Конференция ТехКранч:
![]()
Опять Лена. На этот раз - в презентации Гэвина Белсона. Он тут рассказывает про алгоритмы компрессии, конечно.
И Ричард рассказывает про новый алгоритм сжатия изображений:
![]()
В 2016 году, через два года после выхода в эфир сериала, Dropbox разработал алгоритм сжатия JPEG-картинок на 22% без потерь. Использовался факт, что в JPEG не бывает резких переходов и, разбив картинку на блоки 8x8 пикселей, можно сэкономить, вычисляя яркость блока относительно его соседей. Авторы его называют, с некоторой натяжкой, конечно, реализацией алгоритма “Изнутри наружу” (MIDDLE OUT!!), про который и рассказывал Ричард на ТехКранче.
Проект Lepton. В 2023 году он был закрыт в пользу более популярных Brotli и WebP.
Код в фильмах: Кремниевая долина, сезон 1 (Silicon Valley S01)
read more at deadem // Dead Emotion
Хоть я и ненавижу задачки на тему “поработайте компилятором языка программирования X”, эта понравилась.
Предлагается распарсить небольшой фрагмент кода и попробовать угадать, что будет выведено в консоль, если выполнить этот код в браузере:
x
= 1
x
--> 0
Результат, на самом деле, неожиданный.
Показать ответ
1В чём же тут дело, давайте разбираться.
Приведённый фрагмент эквивалентен следующему фрагменту:
x = 1
x; // 0
Строка, начинающаяся с символов --> трактуется в JS как комментарий.
Но почему? А приветы следует направлять в начало девяностых, когда в Netscape Navigator 2 появился Javascript, и фрагменты кода следовало писать так:
<script>
<!--
alert("Hello!")
-->
</script>
Делалось это для других браузеров, которые ничего не знали про тег script, и, чтобы они не вываливали код на экран, внутренности полагалось завернуть в обычные html-комментарии <!-- ... -->, а в парсере JS, в свою очередь, был применён хак, чтобы строки <!-- и --> не вызывали ошибку скрипта и игнорировались.
К сегодняшнему дню почти не осталось бразуеров, которые не знают про тег script, но старые последовательности продолжают поддерживаться, так как в интернете полно страниц из девяностых, которые с тех пор не обновлялись. Выдавать JS-ошибку на таких страницах не хотелось бы. Вот и приходится до сих пор поддерживать такой необычный формат комментариев.
Задачка на парсинг Javascript
read more at deadem // Dead Emotion

И снова про код. Сразу скажу, шифрования касаться не буду. Ибо герои фильма несут на эту тему какую-то лютую дичь, а на экране никакого шифрования/дешифрования не происходит. Но зато мелькают любопытные фрагменты кода.
Знаменитая эпичная сцена. “Взломать за 60 секунд”. Получить доступ к какому-то-там ресурсу минобороны. На экране мелко: DES 128 bit. (Алгоритмы шифрования будут упоминаться в том или ином виде весь фильм).

Приступаем… На экране какой-то компилятор (не просто же так надпись Compiler в левом верхнем углу?), и, якобы пишем код.
На экране код из книги Cracking DES, 1998. Фрагмент из комплекта программ по демонстрации уязвимости алгоритма шифрования DES. Search Engine Controller Program, написана Полом Кохером.

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

Продолжаем ультра-взлом за 60 секунд. Теперь на экране список самых частоупотребляемых логинов и паролей из руководства по хакингу 1993 года: “THE NEOPHYTE'S GUIDE TO HACKING”.

COMMON ACCOUNTS:
Username Password
-------- --------
root
daemon
adm admin, sysadm, sysadmin, operator, manager
uucp
bin
sys
123 lotus, lotus123
adduser
admin adm,sysadm,sysadmin,operator,manager
Дальше на экране мелькают числа. К чему они относятся - непонятно. Возможно, стилизация, демонстрирующая процесс хеширования/шифрования пароля. Но, время вышло, а у героя всё получилось: ACCESS GRANTED. Ноутбук у него отнимают.

Квалификация проверена, через какое-то время можно и выдать настоящий компьютер. Нечто крутое, семиэкранное, с декоративной подсветкой и всё такое. На котором нужно написать червя. Да не просто червя, а “многоголовую гидру”.

Благо, писать придётся не с нуля: есть тайная заначка, оставленная в КалТехе на забытом в подвале PDP-10, который до сих пор подключён к сети. Кстати, прикольные там у них браузеры:

Однако, требуется логин. Но, это, понятное дело, не проблема. Процесса не покажут, но зато похвастаются логотипом ещё одного алгоритма шифрования. На этот раз асимметричного: 128-битный RSA.

Начинается работа над червём. На экране - листинг перлового исходника. Фрагмент cmount.pl из испанского гайда по хакингу: INTRODUCCION AL HACKING v2.0, 1998.
Небольшой скрипт для получения списка доступных точек доступа в NFS-серверах. Типа, сканируем сеть, ищем открытые пути. На экран исходник влез почти целиком:

# Assign null list to @URLs which will be added to later.
my(@result) = ();
my(@domains) = ();
my($program) = "showmount -e ";
# Pull off filename from commandline. If it isn't defined, then assign default.
my($DomainFilename) = shift;
$DomainFilename = "domains" if !defined($DomainFilename);
# Do checking on input.
die("mountDomains: $DomainFilename is a directory.\n") if (-d $DomainFilename);
# Open $DomainFilename.
open(DOMAINFILE, $DomainFilename) or
die("mountDomains: Cannot open $DomainFilename for input.\n");
while (<DOMAINFILE>) {
chomp($_);
print "Now checking: $_";
# Note difference in program output capture from "geturl.pl".
open (EXECFILE, "$program $_ |");
@execResult = <EXECFILE>;
next if (!defined($execResult[0]));
if ($execResult[0] =~ /^Export/) {
print " - Export list saved.";
open (OUTFILE, ">$_.export");
foreach (@execResult) {
print OUTFILE;
}
close (OUTFILE);
}
close(EXECFILE);
print "\n";
}
# We are done. Close all files and end the program.
close (DOMAINFILE);
0;
А следом за ним экран “Connection routing”. Герою обещали, что “можно одновременно подключиться к семи разным сетям”. Вот. На выбор. Это перепечатка таблицы региональных X.25 подсетей из “The Hackers' Handbook”, 1985, Хьюго Корнуолл, стр. 71. Точнее, первые её 18 строк.

А, это, видимо, рабочий интерфейс. С копирайтом, как полагается: Worm generator tool v.1.2 (Jobson, S.).
Занятная опечатка в команде. Интересно, специально? cat /ect/passwrd (должно быть cat /etc/passwd)
Справа фрагмент кода на чём-то перлоподобном, которым разбираются строки: пропускаем # (видимо, комментарии), и бьём на фрагменты по точке или ~. А судя по тому, что код с теми же переменными встречается и в куске листинга слева и перемешан с дампом passwd, этот экран, похоже, иллюстрирует работу сетевого сниффера: слушаем сетевую активность и следим за ней, вываливая на экраны пакеты в порядке захвата:

Запускаем сборку:

Ещё один фрагмент из уже упоминавшейся INTRODUCCION AL HACKING v2.0, 1998. Теперь это - листинг утилиты getdomain.pl: парсинг списка записей о доменах с rs.internic.net. Да, в те времена можно было скачать всю базу доменов одним архивом. (В наши дни доменами теперь занимается ICANN) Список записей затем скармливается сканеру cmount.pl. Помните скриншот первого листинга с сервера КалТеха? Вот ему.

#!/usr/bin/perl
# GetDomain By Nfin8 / Invisible Evil
# Questions /msg i-e or /msg i^e
#
# Retrieve command line arguments.
my($inputfile, $domain) = @ARGV;
usage() if (!defined($inputfile) || !defined($domain));
# Open and preprocess the input file.
open(INFILE, "<$inputfile") or die("Cannot open file $inputfile for reading!\n");
my(@lines) = <INFILE>;
# Initialize main data structure.
my(%hash) = {};
my($key) = "";
foreach (@lines) {
$key = (split(/\ /))[0];
chop($key);
next if ((($key =~ tr/.//) < 1) ||
...
Ещё немного красочного сканирования:

Ещё один листинг. И опять из книги “Cracking DES”, теперь это исходник на VHDL, языке моделирования электронных схем, для реализации алгоритма в железе на ASIC и прочих FPGA.

addr_key.vhd, за авторством Тома Ву. На листинге часть аппаратной системы для взлома алгоритма DES, на то время основной американской системы шифрования.

Ещё чуть-чуть… Готово!

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

Конец.
Код в фильмах: Пароль «Рыба-меч» (Swordfish)
read more at deadem // Dead Emotion
Поучаствовал в ЛШПИ ВШЭ 2024 в качестве, скажем так, стороннего наблюдателя. Настолько оно всё впечатлило, что пришлось брать паузу в несколько месяцев перед тем как поделиться. Если в двух словах: Организация - дно!
Начать с самого механизма поступления: школа бесплатная, поэтому проводится входной отбор в виде тестирования онлайн. Думается, что это из-за того, что в рекламу они не вкладываются вообще, и поэтому про мероприятие знает крайне ограниченное количество людей, чисто интересующиеся “вышкой”. Я случайно увидел мелькнувший анонс в одном из каналов ВШЭ, а через неделю уже было проблемой вспомнить, как эта штука вообще называется, и где же я её видел…
Как следствие: если делать школу платной в неё тупо никто не запишется, ибо никто про неё не знает, а если бесплатной - налетят совсем нубы и будет бардак. В результате участие бесплатное, но есть предварительный отбор. Но, видимо, был такой слабый конкурс, что зачислили кого попало: две трети поступивших на трек про програмиирование игр видели Анрил/Юнити в первый раз, и ждали, что их всему научат в процессе.
После прохождения вступительного теста, школа затаилась на две недели на обработку результатов, а окончательные итоги разослали меньше чем за семь дней до официального старта, чем выключили из участия часть людей, которые планировали добираться в Москву на самолётах.
После прохождения отбора, вплоть до дня, предшествующему началу занятий, никто не знал, что вообще делать, куда ехать, что с собой брать, какой график, план и т.п. В этот самый последний день, меньше чем за сутки до начала, собрали телеграм-чаты из зачисленных студентов, и в двух предложениях написали адрес и время. Почему было не выложить всё это заранее, на сайте, как делали в предыдущие годы - непонятно. Тем более, что это никак не зависит от того, какие люди прошли, а какие - нет. Ну, разве что это требует чуть больше усилий и организованности.
Занятия проходят очно. Иногда читают лекции, но цельной системы нет. На половине направлений преподаватели делились записью лекций и конспектов, на других - нет: после прочтения лекции нельзя было получить её материал вообще никак. Записей не ведётся, в паблик презентация не выкладывается. Можно было бы назвать всё это чисто развлекательным контентом, если бы это было весело. Но и весело тоже не было.
Программ обучения тоже нет. В предыдущие годы планы публиковали заранее на сайте “вышки”, и можно было по ним ориентироваться и понимать, куда стоит идти и для чего. Сейчас же - полный ахтунг. О важном завтрашнем событии расскажут только сегодня.
Участникам игрового направления было предложено придумать для реализации на двухнедельном джеме сюжет игры. Учащиеся устроили брейншторм и поделились на команды. Однако, вся рецензия выбранных проектов преподавателями свелась к “это сложно” и “это не сложно”. Всё, больше ничего о последствиях принятых решений учителя не сказали. За что некоторые команды впоследствии получили по жопе от суровой реальности - далеко не все хотелки было возможно заджемить в такой срок рандомно собранной командой. Хотя, казалось бы: в преподавательский состав специально пригласили людей с опытом, чтобы они поделились и предостерегли, но нет. Всем пофиг.
В течение двух недель организовали два прогона презентаций о составе и механиках реализуемых учащимися игр, и на этом всё. Никакой реальной помощи или наставления. Некоторым она была, правда, и не нужна, но, напомню, количество нубов, прошедших отбор, и две недели тупо втыкающих в монитор шарящего соседа - около двух третей.
Наконец, добрались до финального демо.
Тут тоже весело: не все направления получили список критериев, по которым будет оценен результат. В день защиты проектов о них, конечно, объявили, но некоторые люди, при подготовке проекта и презентации, просто не знали, как их будут оценивать.
Организаторы обещали, что будет проведена оценка по нескольким критериям и по сумме набранных баллов выбран победитель. Оценивать будут сложность, использованные фичи, завершённость проекта, и т.п.
По факту, объявление результатов свелось к простому перечислению победителей. При этом ни о каких баллах речи уже не было. А в ответ на просьбу озвучить хотя бы итоговые набранные суммы, студенты услышали: “Это не соревнование, а школа”.
Так если это, блин, не соревнование, какого чёрта вы раздаёте призовые места?.. И раз так, то получается, что никаких баллов и оценок не было? И выбирали лучших совсем не по ним?
Заявлялось, что первым местом будет отмечен лучший проект каждого направления и лучший проект всей школы 2024 года. В итоге в направлении Анрила, где участвовали только две команды, первые места и наградки дали всем. Первой команде - потому, что их проект объявили абсолютным победителем, лучшим не только в направлении, но и в рамках всей школы. А оставшейся дали первое место в направлении Анрил. Потому, что больше-то команд и не осталось. Я вообще охреневаю, как так возможно награждать и почему. Видимо, сделали специально для разжигания жоп у команд других специализаций, которые не получили ничего. Вообще ничего. Даже бумажки никакой.
Оглядываясь на то, как проводилось первоначальное рецензирование при выборе ребятами проекта: преподаватели же знали, как они будут оценивать, и сразу же понимали, кто точно не победит, а у кого есть шанс. Почему бы тогда с самого начала и не объяснить ученикам, что “если они выберут именно эту тему, то призовых мест за такое точно не будет, и её можно пилить только для собственного удовольствия?” Ах, ну да. “Это же не соревнование”.
Победителям раздали дипломы о первых местах, а всем остальным участникам просто сказали: “Спасибо! До свидания!” И на этом всё закончилось.
Что в итоге:
Реальных знаний тут не дадут. Люди пилили так, как они уже умели до “школы”. Те, у кого не было опыта, были “балластом” и, хотя, в теории, могли поучиться у более скилловых чуваков, но это же дети… С самоорганизацией у них ещё не очень, поэтому слабые, бывало, мешали лидерам тащить проект.
Опыт кранча и упихивания проекта в дедлайн - полезный. Хотя гораздо проще его получить в онлайн-джемах. Тут же была надежда, что окажется полезен опыт офлайновой работы, но - увы. Из-за плохой организации не могу рекомендовать эту школу никому. Разве что любителям потусоваться в своё удовольствие две недели, и, если повезёт, задружиться-зазнакомиться с единомышленниками. Тем более, что отбор очень мягкий.
Хрен пойми что, короче говоря!
PS:
Вот это ниже - “абсолютный победитель”. А некоторые студенты неделю убили только на рисование-выдрачивание-анимацию моделей, персонажей и графики. Кто же знал, что это вообще никак не будет оценено?..

Летняя школа по программной инженерии ВШЭ (ФКН) 2024
read more at deadem // Dead Emotion
Comments
Time to recall this year's moments in the holiday photochallenge. Get 5 random photos uploaded to the blog in 2024 and share them with the audience!
Have an…