Just code IT – Telegram
Just code IT
1.45K subscribers
49 photos
134 links
Верим в everything-as-code. Обсуждаем, как писать чище, ревьюить объективнее, деплоить быстрее.
Download Telegram
Обучение детей программированию

Обучать ли детей программированию, и если да, то когда начинать? А главное как это делать?

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

Совсем необязательно сажать чадо за компьютер — возможно начать обучение вообще без контакта с машиной. Например, существуют карточные настольные игры, способные познакомить ребенка с работой Unix-шелла, или с низкоуровневым программированием. Существуют выдуманные процессорные архитектуры, специально спроектированные для изучения системного программирования на бумаге, например WDR Paper Computer. Любители низкого уровня наверняка оценят детские раскраски, позволяющие моделировать логику на основе NOR вентилей, а приверженцы функционального стиля обрадуются, что смогут обучить чадо основам лямбда-исчисления на основе «Alligator Eggs Puzzle Game».

Есть и куда более продвинутые выдуманные архитектуры, например LC-3. Этот компьютер уже не подойдет для симуляции на бумаге, зато его удобно программировать в шестнадцатеричных кодах, даже без ассемблера.

Есть специальные среды для детского программирования. Наиболее популярная такая среда — Scratch. Здесь можно создавать игры и симуляции на императивном языке программирования.

Много хороших сред с низким порогом входа существует для Lua: одна из наиболее популярных — среда для iPad под названием Codea. Она позволит начинающим программистам достаточно быстро начать создавать простые игры и симуляции. Вдохновившись Codea, автор Redis Сальватор Санфилиппо разработал простую открытую среду load81 именно с целью обучения детей программированию.

Кстати, благодаря простоте освоения Lua появилось множество фентезийных консолей — симуляторов игровых платформ, которых никогда не существовало. Для этих игровых платформ можно разрабатывать игры в довольно простых и понятных для юных разработчиков средах. Самая популярная фэнтези-консоль — PICO-8. Для нее уже создано множество игр, но каждый пользователь может создать что-то свое благодаря встроенным средствам разработки. PICO-8 стоит денег, но есть множество открытых аналогов, например суперпопулярная TIC-80. В качестве более серьезной платформы для программирования на Lua можно рассмотреть LÖVE 2D и ZeroBrane Studio.

Ну и всегда в топе остаются реализации нестареющей классики, языка LOGO.

Мы уверены, что в этом обзоре перечислены далеко не все способы, что могут заинтересовать чадо программированием :)

Пишите ваши варианты/лайфхаки в комментариях.

#digest
👍15🥰2
Логические схемы на… пайпах

Наверняка многие из читателей используют какой-либо вариант Unix: MacOS, GNU/Linux или, например, OpenBSD. Даже MS Windows предоставляет возможность пользоваться благами Unix-мира через WSL.

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

Сама идея пайпов и комбинирования небольших программ принадлежит Дугласу Макилрою (Douglas McIlroy) — одному из авторов Unix.

Все мы используем этот простой механизм, но осознаем ли до конца его возможности? Лайнус Акессон (Linus Åkesson) нашел пайпам очень необычное применение.

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

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

#digest
👍6🤯6
@tim_cook мы тут во внутреннем чатике все придумали и уже посчитали ресурсы :)

#fun
🔥8👎1
Как компьютерная графика подняла сетевой протокол

Один из наших авторов однажды участвовал в проекте, в котором надо было передавать по Wi-Fi видеопоток в DVD-качестве (5-7 мегабит) с устройства, которое не являлось точкой доступа, сразу на несколько принимающих PC.

А надо сказать, в стандартном Wi-Fi все ходит через точку доступа. То есть любой пакет от станции к станции занимает эфир два раза. Вдобавок Wi-Fi был старомодный, 54 мегабита, что с учетом всех зазоров между пакетами давало где-то 22 реальных мегабита по TCP между станцией и точкой доступа, или половину этого между двумя станциями (автор, конечно, использовал UDP, но цифры по TCP уместны для оценки).

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

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

Но как среди N пакетов послать M пробных, более-менее равномерно размазав их среди общего потока?

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

Так, графический алгоритм, придуманный для рисования на экране прямых, нашел свое применение в сетевом протоколе :)

#digest
👏7🤩2🤔1
Случайно придумали свой язык будущего. С “Fuck you, Rust!” и китайскими иероглифами :)

#fun
🔥7
Защищенный режим для Zilog Z80

Знаете ли вы, что такое защищенный режим?
Современные процессоры предоставляют системному программисту средства защиты. Эти средства позволяют защитить область ядра ОС от чтения и записи со стороны пользовательских процессов, а также защитить память процессов друг от друга.

Разные процессоры предоставляют разные механизмы, позволяющие организовать такую защиту.

x86 — наиболее популярная архитектура, применяемая в персональных компьютерах, вводит понятия колец защиты. В этой терминологии ядро ОС исполняется на нулевом кольце, а программы пользователя – на третьем. И третье кольцо сильно ограничивает набор инструкций, доступный программам. Также процессор предоставляет механизмы сегментации и страничной адресации. Они позволяют создавать независимые друг от друга адресные пространства.

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

А что же z80? Это процессорная архитектура из прошлого. Если вы слышали про домашний компьютер ZX Spectrum, то это как раз машина на основе z80. Этот архаичный, хотя и многими любимый процессор, никогда не задумывался для использования в многозадачной среде. Лучший сценарий использования для него — одна программа, занимающая большую часть ОЗУ. Нужно загрузить другую программу? Что же — перезагружаем машину!

Автор видео по ссылке, Энди Ху, не стал мириться с такими ограничениями и попытался придумать нехитрую модификацию для обвязки процессора z80, чтобы он начал поддерживать что-то похожее на защищенный режим. Благодаря его доработкам, z80 приблизился к современным процессорам по возможностям разграничивать доступ к разным участкам памяти, что позволяет создавать для z80 продвинутые многозадачные операционные системы. Конечно же с разумными для восьмибитного процессора ограничениями.

А был ли у вас какой-либо восьмибитный компьютер? ZX Spectrum, Commodore 64? Напишите в комментариях.

#digest
🔥63👍2
Что такое код?

Друзья и родственники спрашивают, чем вы занимаетесь на работе? Как объяснить человеку, незнакомому с программированием, что же это такое? Насколько это непросто, и почему не нужно отвлекать вас, когда вы сидите в отладчике? 🤬

Пол Форд (Paul Ford) постарался рассказать читателям, что такое код и чем занимаются программисты. Статья Пола выполнена в виде интерактивного документа, где читатель может попробовать себя в роли программиста, инженера цифровой электроники или даже проектного менеджера.

P.S. Не пугайтесь, когда столь активная страница запросит у вас разрешение на доступ к камере!

#literature
🤔3😁1🙏1
Мы любим не только писать, но и читать, и слушать. Поэтому ходим на конференции и митапы. И хотя все крупные события в этом сезоне уже отгремели, до конца года осталась парочка ивентов, которые точно заслуживают внимания. Тем более они бесплатные. И регистрация еще открыта.

YaTalks. 3-4 декабря, Онлайн и офлайн (Москва, Белград)
Жизнь и работа в текущей реальности: как развиваться в профессии, строить команды и бороться с кризисами
https://yatalks.yandex.ru/ru

KasperskyOS Night. 7-8 декабря, Онлайн
Как создавать продукты, защищенные от подавляющего большинства типов киберугроз на уровне архитектуры
https://os.kaspersky.ru/night_2022/

Елка для ИТ-директоров. 8 декабря, Офлайн (Сколково)
Неформальная бизнес-встреча с CTO, CXO и CDTO: результаты и достижения, обмен опытом, обсуждение планов
https://vk.company/ru/press/events/952/

#digest
👍4🔥3
Наши коллеги во внутреннем чате настолько мощно шарят в безопасности, что даже придумали свою итерацию для мемчика. А как вы стираете память воды? :)

#fun
😁72👍2
Наверняка вы знаете о SELinux, подсистеме ядра, привносящей в систему механизмы мандатного контроля доступа. SELinux имеет славу сложного ПО, а наиболее популярный вопрос от пользователей — о том как его отключить :)

Разобраться в том, что же это такое, а также как работают Type Enforcement, Multi Category и Multi Level Security в SELinux, поможет эта иллюстрированная статья.

#literature
👍5
Не искушайтесь аудит-логами

На многих системах во имя безопасности появляется сущность аудит-лога. Аудит-лог предназначен для хранения информации о событиях безопасности (например: «пользователь залогинился», «пользователь 3 раза подряд не смог залогиниться», «пользователь удалил бэкап» и так далее).

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

1. Как правило, у аудит-лога и обычного лога разные настройки конфиденциальности. Обычные логи может читать администратор системы или даже простой пользователь во имя debug-ability и возможности самостоятельно решать часть проблем. Аудит-лог читает только аудитор, так как он содержит сенситивную информацию.

2. Аудит-лог и обычный лог чаще всего имеют разные политики целостности. В обычный лог пишут и обычные приложения, и самые разные части системы. А произвольная запись в аудит-лог должна быть ограничена — только TCB-of-TCB может перезаписать данные. Если вообще может.

3. Аудит-лог и обычный лог имеют разные retention policies. Обычные логи ротируются и обрезаются. Аудит-лог хранится долго, и его ротация – это важное событие, которое благословляется высокими кредами, а иногда сопровождается записью на другой носитель.

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

#digest
🔥62
История вычислительной техники

Редкому технарю не интересно, когда и как люди решили автоматизировать вычисления, какие инструменты использовали, как эти инструменты повлияли на настоящее, в котором мы живем?

Следующий, не побоимся этого слова, лонгрид повествует о самых ранних вычислительных устройствах, когда-либо существовавших на планете Земля. Возможно вы сталкивались с одним из таких устройств ранее — например с абаком, который у нас называли просто счётами. Помните как еще на так давно продавщицы подсчитывали сумму за прилавком, ловко перекидывая костяшки туда-сюда? Эх, все же уже давно...

Если же вы интересуетесь историей чего-либо посвежее, заходите на сайт подкаста Advent of Computing и наслаждайтесь длинными рассказами про разные годы развития компьютерной техники. Но учтите, что прослушивание может затянуть надолго :)

Ну а для искателей особо ценных исторических самородков мы подготовили еще несколько ссылок. Слышали ли вы когда-нибудь о памяти на линиях задержки? Это ли не гениальное инженерное решение? А сталкивались ли с пузырьковой магнитной памятью? Такой тип памяти был установлен на первом ноутбуке Grid Compass, достаточно компактном даже по нынешним меркам. И да, он побывал в космосе!

#digest
👍10
Управление атрибутами качества в современных системах

Джулия Эванс (Julia Evans), хорошо известная своими комиксами и журналами о программировании и отладке, однажды опубликовала пост про довольно легко воспроизводящийся баг в ядре MacOS. Запуск достаточно простой программы на C приводил к зависанию утилиты ps.

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

Чтение этого треда навеяло некоторые мысли о том, как качество воспринимается в современных высокотехнологичных компаниях.

Apple и другие гиганты в первую очередь зарабатывают деньги. Компания может провозглашать гуманистические идеалы, формулировать важную для человечества миссию, но ее деятельность всегда будет завязана главным образом на заработок.

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

Любой quality attribute взвешивается на весах управления рисками, и далеко не все качества системы получат максимальное внимание разработчиков и QA.

Но если у Apple хорошо работают штатные приложения из маркета, так ли важно, что некоторые системные вызовы работают не так, как им положено, и иногда нащупываются баги на стыке Mach, BSD и OSKit? Что думаете?

#digest
3🔥3🤔3
Ну что, как вам спится в праздники? :) В какое математическое пространство раскладывается ваше одеяло?

#fun
😁11👍1
Shamir's Secret Sharing

Джефф Мозер (Jeff Moser)
столкнулся со смертью близкого человека. Пришлось ему пережить и множество формальных процедур, связанных с уходом человека из жизни.

Размышления о произошедшем привели Джеффа к важному вопросу — как при жизни распорядиться своими цифровыми активами, чтобы в случае чего, наследники получили к ним доступ? При этом желательно, чтобы родственники не имели доступа к цифровым активам человека, пока он жив и здоров.

Джефф обратился к криптографии, а именно к алгоритму разделения секретных данных Шамира. Высокоуровнево идею можно сформулировать так: секрет, например ключ шифрования, дробится на несколько частей, а эти части раздаются разным людям. Алгоритм разделения выбирается таким образом, чтобы даже в случае сговора малого числа людей, владеющих частями секрета, не удалось его восстановить. Только когда определенное количество «посвященных» соберутся вместе, это станет возможным.

Историю Джеффа, а также математическую подоплеку алгоритма Шамира вы найдете в этой публикации.

#digest
👍9
Подписи, основанные на криптографических хеш-суммах #2

Мы уже писали, что кроме цифровых подписей, основанных на асимметричной криптографии, существуют и другие алгоритмы — например, «подпись Лэмпорта», которая использует всего лишь один криптографический примитив, хеш-сумму.

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

Недавно набрели в сети на хорошую иллюстрированную статью, подробно раскрывающую тему таких «нетрадиционных» механизмов цифровой подписи.

#literature
👍3
Безопасный логгинг

Уж казалось бы, насколько логирование распространенная и очевидная практика, но сколько в ней нерешенных и нерешаемых вопросов! Один из сложнейших – безопасность. А точнее угроза конфиденциальности через утечки чувствительных данных в лог. В чем сложности?

Первая – что считать конфиденциальным. Ну, логин/пароль или данные банковских карт – само собой. Но ведь бывают ситуации, что адрес какой-то структуры/функции тоже становится конфиденциальным, если используется ASLR защита (как, например, в недавнем случае с Samsung).

Вторая – как не допустить утечки. Из подходов на уровне кода есть паттерн типа read-once/read-twice/read-X-times, когда для объекта вы контролируете счетчик чтений и ставите такой максимум, чтобы «лишние» чтения (в том числе в лог) не состоялись. Другой вариант — использовать отдельное хранилище для секретов, чтобы в памяти процесса plain-ом чувствительные данные в принципе не фигурировали. Также подходы уровня кода можно разнообразить расширением процессов — например, более строгие процессы code review, или CI с сервисами, проверяющими на типичные секреты, типа snyk.io.

Третья – как проверить. Для полноценных проверок нужна высокая степень покрытия (юнитами и фаззингом), приправленная прогоном утилит, которые бы искали уже утекшие секреты в логе (DLP-alike). Однако системы, оперирующие сенситивными данными, не должны писать в лог; а если уж писать, то очень боязливо. Хотя лучше никому в лог не писать вообще, потому что неясно, какие данные сенситивные. Но здесь security сталкивается с debugability, удобством отладки. А к debugability прилегает скорость расследования инцидента, которая тоже про безопасность.

В общем, логи нужны, логи важны, но не забывайте правильно их обезопасить.

#digest
👍11🔥1
Легкий рабочий стеб над собственными стеками становится для нас традиционным – раньше мы уже осмысливали архитектуру пива в Haskell и придумывали язык будущего с оператором «Fuck you, Rust!». Теперь пришла очередь типов переменных в Python, JavaScript и C++ :)

#fun
😁8🔥2
Код, как известно, может служить не только силам добра – продуктам, фичам, компонентам и вот этому вот всему – с его помощью можно, увы, создавать и вредоносы :(

Этот хабрапост написал профессиональный исследователь угроз и реверсер. В нем он подробно рассказал о своем «взгляде с обратной стороны»: как он разбирает самплы и читает двоичный код на реальных, «боевых» примерах. Очень полезно для всестороннего понимания разработки.

#digest
👍8🔥3❤‍🔥2
Homebrew CPUs

Хотели ли вы когда-нибудь сделать процессор с собственной архитектурой? Начать с простых вентилей и закончить полноценным устройством, способным выполнять произвольные программы? Для этого уже давно не нужно устраиваться на полупроводниковое производство с современным фотолитографом, достаточно запастись хорошей литературой, например книгой «Цифровая схемотехника и архитектура компьютера», и платой с FPGA.

Но можно пойти и дальше, как сделали члены Homebrew Computers Webring, и попробовать собрать свою вычислительную машину из элементарных микросхем или даже отдельных транзисторов. На странице этого сообщества собраны ссылки на десятки различных проектов, большая часть которых хорошо документирована.

Обратите внимание на такие проекты, как BMOW (Big Mess of Wires) и MyCPU. Кажется, что это уже не совсем игрушечные вычислительные машины, на которых можно выполнять какую-то реальную работу. Например, компьютер на базе MyCPU вполне может хостить сайт о себе любимом.

Ну и на закуску — не совсем традиционные проекты: например, FORTH-машины или даже вычислители без арифметико-логического устройства!

#digest
👏8
В вашем любимом (судя по количеству реакций) нашем внутреннем чатике – баттл мемов :)

И даже интересно, а как скоро к такому баттлу сможет релевантно подключиться нейросеть? Ну а что: она уже не то что диссеры пишет, а на работу устраивается. А бугурты вообще 5 лет назад генерить научилась.

#fun
👍9😁3🌚2