Как стать автором
Обновить
4
0

Пользователь

Отправить сообщение

DreamBerd — идеальный язык программирования

Время на прочтение12 мин
Количество просмотров26K

DreamBerd - идеальный язык программирования. Вот его фичи!

Когда вы закончите знакомиться со всеми фичами, ознакомьтесь с примерами.

Восклицательные знаки!

Будьте смелее! Заканчивайте каждое утверждение восклицательным знаком!

print("Hello world")!

Если вы чувствуете себя особенно смелым, вы можете использовать еще больше!!!

print("Hello world")!!!

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

print("Hello world")?

Возможно, вам интересно, что Dreambird использует для оператора "не", который в большинстве других языков является восклицательным знаком. Это просто - вместо оператора 'не' используется точка с запятой.

if (;false) {

   print("Hello world")!

}

Читать далее

Как работает компьютер: глубокое погружение (на примере Linux)

Уровень сложностиСложный
Время на прочтение48 мин
Количество просмотров163K



Введение


Я делала много вещей с компьютерами, но в моих знаниях всегда был пробел: что конкретно происходит при запуске программы на компьютере? Я думала об этом пробеле — у меня было много низкоуровневых знаний, но не было цельной картины. Программы действительно выполняются прямо в центральном процессоре (central processing unit, CPU)? Я использовала системные вызовы (syscalls), но как они работают? Чем они являются на самом деле? Как несколько программ выполняются одновременно?


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


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


Более удобный формат статьи.

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

SQLAlchemy: а ведь раньше я презирал ORM

Время на прочтение10 мин
Количество просмотров37K

Так вышло, что на заре моей карьеры в IT меня покусал Oracle -- тогда я ещё не знал ни одной ORM, но уже шпарил SQL и знал, насколько огромны возможности БД.

Знакомство с DjangoORM ввело меня в глубокую фрустрацию. Вместо возможностей -- хрена с два, а не составной первичный ключ или оконные функции. Специфические фичи БД проще забыть. Добивало то, что по цене нулевой гибкости мне продавали падение же производительности -- сборка ORM-запроса не бесплатная. Ну и вишенка на торте -- в дополнение к синтаксису SQL надо знать ещё и синтаксис ORM, который этот SQL сгенерирует. Недостатки, которые я купил за дополнительную когнитивную нагрузку -- вот уж где достижение индустрии. Поэтому я всерьёз считал, что без ORM проще, гибче и в разы производительнее -- ведь у вас в руках все возможности БД.

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

SELECT article FROM habr

Организация памяти в текстовом редакторе

Время на прочтение6 мин
Количество просмотров35K
Каждый, кто пытался запрограммировать хотя бы простейший редактор текста на низком уровне, сталкивался с задачей организации памяти для хранения редактируемого текста. Структура данных для хранения текста должна удовлетворять следующим требованиям:
  1. иметь малые накладные расходы по памяти. Большая часть доступной памяти должна использоваться для хранения текста, а не служебной информации;
  2. допускать эффективную вставку и удаление в произвольном месте текста.

Удовлетворить эти требования одновременно непросто. Если рассмотреть широкоизвестные структуры данных, такие как массивы, списки, деревья, стеки, очереди, кольцевые буфера — то такой структуры, которая бы позволила эффективно выполнить оба требования, не встречается. В случае массива имеем незначительные накладные расходы по памяти, но операция вставки имеет сложность O(n), где n — размер редактируемого текста. В случае списка сложность вставки и удаления составляет O(1), однако накладные расходы по памяти в несколько раз превышают размер собственно текста. Деревья, кучи, кольцевые буфера, ассоциативные массивы и прочие структуры и вовсе неприменимы для хранения текста в редакторе.

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

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

Несмотря на то, что эта структура данных была открыта давно и использовалась в текстовых редакторах на старых ЭВМ в 8-битную эпоху, это тайное знание предков было в значительной мере утеряно и в современных редакторах встречается редко. Попробуйте открыть файл, состоящий из одной строки мегабайт на 10, в Notepad или Far. Вставка и удаление символов будет длиться секундами.
Читать дальше →

Выбор структур данных для самописного текстового редактора

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров11K

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

Ресурсы


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

  • Build Your Own Text Editor — наверно, самый фундаментальный пост о создании текстового редактора с нуля, который я видел. Это превосходный туториал на случай, если вы хотите начать писать собственный текстовый редактор. Стоит заметить, что в редакторе из этого туториала в качестве внутренней структуры для текста используется, по сути, вектор строк.
  • Text Editor: Data Structures — отличный обзор множества структур данных, которые можно использовать при реализации текстового редактора. (Спойлер: как минимум одна из них будет рассмотрена в моём посте)
  • Плейлист Ded (Text Editor) на YouTube — это потрясающая серия, в которой @tscoding фиксирует процесс создания с нуля текстового редактора. Эти видео стали для меня источником вдохновения.

Зачем?


Если в сети есть так много хороших ресурсов о создании собственного текстового редактора (не говоря уже о том, что уже существует множество феноменальных текстовых редакторов), то зачем я это пишу? На то есть несколько причин:

  1. Я хотел заняться проектом, непохожим ни на один свой прошлый.
  2. Я хотел создать инструмент, которым смогу пользоваться.
  3. Мне всегда хотелось глубже разобраться с созданием собственных структур данных.
Читать дальше →

Ряд опытов на летние деньки

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров11K
Картинка Freepik

Лето постепенно вступает в свои права, температура на улице повышается, и думать о чём-то серьёзном совершенно не хочется. Тут нам как раз помогут немножко поразвлечься простые опыты, которые может проделать каждый.
Читать дальше →

История о фейлах Amtrak со связью «поезд-земля». Просьба к РЖД — не повторять

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров11K

На форуме ПМЭФ-2023 в очередной раз заговорили о проекте ВСМ (высокоскоростной магистрали) Петербург-Москва. Поездка займет 2.5 часа и на это время пассажирам надо себя чем-то занять. Ж/д оператору скоростной интернет нужен для удаленного видеонаблюдения и возможности продать Wi-Fi скучающим пассажирам. Тут важно не ошибиться с технологиями связи. Как это бывает на других проектах — в истории про фэйлы Amtrak со связью «поезд-земля».

Читать далее ...

Диаграммы без боли и страданий: PlantUML

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров67K

Системный аналитик всегда и везде сталкивается с бесконечным количеством диаграмм разного вида, с нотациями (правилами), чтобы нарисовать данные диаграммы и с бесконечным количеством инструментов для их описания. Но мало кто говорит о таком инструменте, как PlantUML. 

Лично мне завесу тайны приоткрыл Альфа-Банк, здесь документация ведется рядом с кодом, и схемы логичнее описывать тоже кодом. Но это не так страшно и не так сложно (почти) как кажется. Давайте я приоткрою ящик Пандоры и сниму кармическое проклятье с  этого инструмента. 

Читать далее

Моноиды и их приложения: моноидальные вычисления в деревьях

Время на прочтение20 мин
Количество просмотров24K
Приветствую, Хабрахабр. Сегодня я хочу, в своём обычном стиле, устроить сообществу небольшой ликбез по структурам данных. Только на этот раз он будет гораздо более всеобъемлющ, а его применения и практичность — простираться далеко в самые разнообразные области программирования. Самые красивые применения, я, конечно же, покажу и опишу непосредственно в статье.

Нам понадобится капелька абстрактного мышления, знание какого-нибудь сбалансированного дерева поиска (например, описанного мною ранее декартова дерева), умение читать простой код на C#, и желание применить полученные знания.

Итак, на повестке сегодняшнего дня — моноиды и их основное применение для кеширования вычислений в деревьях.

Моноид как концепция


Представьте себе множество чего угодно, множество, состоящее из объектов, которыми мы собираемся манипулировать. Назовём его M. На этом множестве мы вводим бинарную операцию, то есть функцию, которая паре элементов множества ставит в соответствие новый элемент. Здесь и далее эту абстрактную операцию мы будем обозначать "⊗", и записывать выражения в инфиксной форме: если a и b — элементы множества, то c = ab — тоже какой-то элемент этого множества.

Например, рассмотрим все строки, существующие на свете. И рассмотрим операцию конкатенации строк, традиционно обозначаемую в математике "◦", а в большинстве языков программирования "+": "John""Doe" = "JohnDoe". Здесь множество M — строки, а "◦" выступает в качестве операции "⊗".
Или другой пример — функция fst, известная в функциональных языках при манипуляции с кортежами. Из двух своих аргументов она возвращает в качестве результата первый по порядку. Так, fst(5, 2) = 5; fst("foo", "bar") = "foo". Безразлично, на каком множестве рассматривать эту бинарную операцию, так что в вашей воле выбрать любое.

Далее мы на нашу операцию "⊗" накладываем ограничение ассоциативности. Это значит, что от неё требуется следующее: если с помощью "⊗" комбинируют последовательность объектов, то результат должен оставаться одинаковым вне зависимости от порядка применения "⊗". Более строго, для любых трёх объектов a, b и c должно иметь место:
(ab) ⊗ c = a ⊗ (bc)
Легко увидеть, что конкатенация строк ассоциативна: не важно, какое склеивание в последовательности строк выполнять раньше, а какое позже, в итоге все равно получится общая склейка всех строк в последовательности. То же касается и функции fst, ибо:
fst(fst(a, b), c) = a
fst(a, fst(b, c)) = a
Цепочка применений fst к последовательности в любом порядке всё равно выдаст её головной элемент.

И последнее, что мы потребуем: в множестве M по отношению к операции должен существовать нейтральный элемент, или единица операции. Это такой объект, который можно комбинировать с любым элементом множества, и это не изменит последний. Формально выражаясь, если e — нейтральный элемент, то для любого a из множества имеет место:
ae = ea = a
В примере со строками нейтральным элементом выступает пустая строка "": с какой стороны к какой строке её ни приклеивай, строка не поменяется. А вот fst в этом отношении нам устроит подлянку: нейтральный элемент для неё придумать невозможно. Ведь fst(e, a) = e всегда, и если ae, то свойство нейтральности мы теряем. Можно, конечно, рассмотреть fst на множестве из одного элемента, но кому такая скука нужна? :)

Каждую такую тройку <M, ⊗, e> мы и будем торжественно называть моноидом. Зафиксируем это знание в коде:
public interface IMonoid<T> {
    T Zero { get; }
    T Append(T a, T b);
}

Больше примеров моноидов, а также где мы их, собственно, применять будем, лежит под катом.
Читать дальше →

А у вас есть кубернетес? Подборка текстов по k8s для тех, кто не DevOps

Время на прочтение5 мин
Количество просмотров8.9K

В каноничном видео человек грустит, пытаясь ответить на вопрос, зачем ему Kubernetes. В этом тексте на него мы не ответим, зато поможем разобраться с базовыми концепциями, связанными с оркестратором. Будет полезно тем, кто не работает с кубиком напрямую, но кодит приложение под Docker/Kubernetes. И тем, кому нужно будет поддержать умную беседу на кофе-пойнте. Под катом разбираем понятия Cloud Native, микросервисов и готовых кластеров Kubernetes.
Читать дальше →

Механические клавиатуры 2023

Уровень сложностиПростой
Время на прочтение28 мин
Количество просмотров52K

Эта статья возникла как результат моих попыток разобраться в рынке механических клавиатур в 2023 году. На Хабре уже был неплохой материал по этой теме, опубликованный в 2012 году - https://habr.com/ru/post/140454/. Поэтому самые полезные блоки оттуда я честно скопипастил (благо лицензия статьи позволяет), но изменилось на самом деле гораздо больше, чем я ожидал. Для всех интересующихся, я также порекомендую https://wiki.geekboards.ru/, где вы можете найти еще больше технических деталей и несколько исторических экскурсов про устройство клавиатур.

Осторожно, дальше будет много букв и картинок (под спойлерами)

Читать далее

Какие компьютерные игры создавали в СССР и России

Время на прочтение8 мин
Количество просмотров16K

В этой статье расскажем про исследования, которые ещё в 1970-е годы проводили с помощью игровых приставок, поговорим про Тетрис, шахматы и «Петьку и Василия Ивановича», увидим, что «Аллоды онлайн» снова стали популярными, вспомним о том, что Heroes of Might and Magic 5 разработала российская компания, и узнаем, какая связь между Escape From Tarkov и Elden Ring.  

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

Читать далее

Есть проблемы гораздо сложнее, чем NP-Complete

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров11K


Люди часто сравнивают P и NP в таком духе, что проблемы P простые, а NP — сложные. Но это чрезмерное упрощение. На самом деле проблемы могут быть намного, намного сложнее, чем NP.

В этом смысле можно вспомнить интеллектуально-фантастический триллер Travelling Salesman (Коммивояжёр, 2012) о четырёх математиках, нанятых правительством США для решения самой сложной проблемы в истории информатики — равенства классов сложности P и NP (P versus NP problem). И им это удалось. Чиновник министерства обороны США предлагает за их алгоритм вознаграждение $10 млн. Но сами математики слишком хорошо понимают, какие разрушительные последствия принесёт в мир их открытие. Один из лучших фильмов про математику в истории кинематографа…
Читать дальше →

5 книг, которые стоит прочесть С++-разработчику

Время на прочтение4 мин
Количество просмотров17K

Современным разработчикам, чтобы совершенствовать профессиональные навыки, требуется постоянно заниматься самообразованием. Как говорила Алиса из небезызвестной книги Льюиса Кэрролла: «Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее». И это действительно так — останавливаться не стоит.

Один из самых распространённых инструментов самообразования — книги. Сегодня поговорим о полезных для разработчиков С++ изданиях, часть которых — просто must have. Всего в подборке пять вариантов, некоторые из них, вероятно, покажутся читателям необычным выбором. Но все они полезны для программистов. Если у вас есть собственные предпочтения, которые в подборку не попали, пишите о них в комментариях, с удовольствием ознакомимся.

Читать далее

Нетривиальное слияние репозиториев с помощью GitPython

Время на прочтение8 мин
Количество просмотров3.5K

Задача


Дано: проект на основе OpenWRT (а он — на основе BuildRoot) с одним дополнительным репозиторием, подключенным как feed. Задача: слить дополнительный репозиторий с основным.

Предыстория


Мы делаем маршрутизаторы и, однажды, захотели дать клиентам возможность включать свои приложения в прошивку. Чтобы не мучаться с выделением SDK, toolchain и сопутствующими сложностями, решили выложить весь проект на github в закрытый репозиторий. Структура репозитория:

/target   // скрипты для сборки ядер
/toolchain   // скрипты для сборки gcc, musl и прочих инструментов сборки 
/feeds   // дополнительные репозитории с приложениями
/package   // скрипты для сборки приложений
...

Было решено часть приложений собственной разработки перенести из основного репозитория в дополнительный, чтоб никто не подсмотрел. Мы всё это сделали, выложили на github и стало хорошо.

Много воды утекло с тех пор…
Читать дальше →

Единица по Бурбаки. Красота запредельной абстрактности

Уровень сложностиСложный
Время на прочтение10 мин
Количество просмотров17K

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

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

Аккуратный расчет (здесь вы найдете ссылку на статью) показывает, что, если развернуть эти сокращения, то длина этого знакосочетания представляет 2 409 875 496 393 137 300 000 000 000 000 000 000 000 000 000 000 000 000 знаков и 871 880 233 733 949 100 000 000 000 000 000 000 000 000 000 000 000 000 связей. Это безумное число. Если бы мы попробовали записать его обычным шрифтом, то это заняло бы сто миллиардов квинтиллионов квинтиллионов книг.

Первое впечатление (и, согласитесь, обоснованное) - дичайший формализм, доведенный до абсурда.

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

Читать далее

Про Бурали-Форти, Пуанкаре и то самое определение единицы

Время на прочтение11 мин
Количество просмотров81K
Если вы, уважаемый мой читатель, имеете обыкновение проводить много времени в интернете, вы наверняка уже видели эту картинку с цитатой:

image

Наверняка также вы задавались вопросом: что, чёрт подери, здесь написано? Формула из этой цитаты интересна тем, что у человека, имеющего высшее математическое образование, этот вопрос возникает столь же неумолимо, как и у любознательного семиклассника. У нелюбознательных семиклассников несколько иной круг интересов, выходящий за рамки данной статьи; однако даже они не откажут себе в удовольствии похихикать над «этими чокнутыми ботаниками», или как оно там формулируется на современном молодёжном сленге.

В нижеследующем тексте я раскрою перед вами тайну этого загадочного сочетания символов. Пожалуйте под кат, однако помните поучительную историю о любопытной Варваре, которой на базаре рассказали про парадокс Банаха-Тарского, отчего она сошла с ума, разрезала себе нос на конечное количество частей и склеила из них рогатую сферу Александера.
N.B. Я предупреждал.

Полезные TreeMap визуализации для MSSQL, Postgres и MySQL

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров9.8K

Я очень люблю визуализации. Человек лучше всего воспринимает информацию через образы. Для трех часто встречающихся баз (MSSQL, Postgres и MySQL) я смастерил плагины к проекту Bell, хотя этот код на Python можно использовать и отдельно. Поэтому для каждой визуализации я буду в скобочках писать имя файла из репозитория GitHub - вы можете этот файл вытащить и использовать его отдельно от проекта (для этого нудны минимальные модификации).

Отмечу только, что я считаю себя экспертом только в MSSQL, а то что сделал с другими базами - сделал по наитию. Кроме того, в отличие от MSSQL у меня нет реальных баз под большой нагрузкой для Postgres и MySQL. Поэтому ошибки/пожелания для скриптов Postgres и MySQL очень и очень welcome!

В основном я задействовал TreeMap.

Читать далее

Как организовать самостоятельные дальние походы без гида. Личный опыт

Время на прочтение14 мин
Количество просмотров22K

Статья о том, как мы с мужем несколько лет назад придумали себе новое хобби на двоих – пеший туризм – и с тех пор влюбились в него. Здесь делимся ТОП-3 своих маршрутов, советами по снаряжению и его стоимости, нашим опытом путешествий с палаткой, а также про внутреннюю трансформацию и полную перезагрузку мозга во время дальних походов. Надеемся, что наши советы помогут организовать вам свой собственный поход, избежать хотя бы некоторых ошибок и получить от этого времяпрепровождения огромное удовольствие.

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

Читать далее

Как бороться с привычками запрограммированным людям

Время на прочтение6 мин
Количество просмотров48K
Перевод статьи из микроблога биохакера Сержа Фаге.

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

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


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

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность