Обновить
146.93

Ненормальное программирование *

Извращения с кодом

Сначала показывать
Период
Уровень сложности

Логично, но незаконно

Время на прочтение6 мин
Охват и читатели22K
Полагаю, что многие пришедшие в славный мир .NET из славного мира С++ прекрасно помнят, как им приходилось буквально впиваться в стандарт, чтобы разобраться, почему язык ведет себя именно так, а не иначе. Многие вещи, которые казались им совершенно очевидны, при ближайшем рассмотрении оказались не то, что неочевидны — а просто-таки прямо противоположны здравому смыслу, на который мы все привыкли полагаться.

Впрочем, вероятнее всего, это проблема многих языков программирования. Многие, думаю, помнят известный ролик WAT, посвященный проблемам некоторых «очевидностей» языков JavaScript и Ruby. Логика привычного мира выходит покурить тогда, когда появляются пограничные области — те, в которые нормальные люди не лазят.

Впрочем, я предлагаю несколько отвлечься от этих высоких материй и взглянуть на язык C# несколько с другой, непривычной стороны. А именно посмотреть некоторые конструкции, которые, с одной стороны, совершенно понятны и легко описываются в терминах языка, а с другой — совершенно отказываются компилироваться.

Я даже не собираюсь спорить с тем, должны ли они компилироваться и работать. Я просто еще раз в очередной раз напомню, что все то, что для нас «логично и понятно» на самом деле может быть совершенно нелогично и непонятно.

И, да — я не буду в очередной раз ныть на тему того, что хотелось бы вернуть из функции тупл без использования громоздких структур и получить имя переменной с помощью простого оператора. Это не сюда — это к Майкрософту в фич-реквесты. У нас пятиминутка юмора. Итак, все то, что вы ежедневно хотите написать, но не пишете, потому что знаете — оно не скомпилируется. Поехали!
Читать дальше →

Учимся верстать под… QIP?

Время на прочтение2 мин
Охват и читатели1.7K
Вечер добрый, хабралюди.

Сегодня, после долгих недель мучений, на меня снизошло озарение. Раньше постоянно замечал, что скопированный в сообщение аськи код очень часто терял часть символов и видоизменял текст. Озарением послужило то, что начиная с Infium 9044, этот мессенджер поддерживает BB-codes.

Гугление поддерживаемых кодов привело к тому, что была найдена страница с перечнем всех поддерживаемых кодов (ссылка внизу топика), среди которых было [table](вспоминаете былые времена верстки на таблицах?). Ниже краткое описание того, как сверстать красивое рекламное (и не только) сообщение для отправки через QIP.

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

Пишем интерпретатор для своего эзотерического языка

Время на прочтение4 мин
Охват и читатели5.2K
За основу я взял язык Brainfuck он настолько мал, что можно немного расширив получить практически новый и достаточно функциональный язык программирования. И при этом не потерять изюминку исходного языка – мой язык будет все так же терзать мозг программиста, как и его родитель!

Итак, Brainfuck. Вкратце, идея такая, есть N регистров/ячеек. У программиста есть доступ к ним всем но перемещения по ним делаются явным образом. Т.е. из ячейки 2 нельзя перейти к ячейке 7 сразу, нужно последовательно.

“Ключевые слова” языка:

  • > – перейти на ячейку вправо.
  • < – перейти на ячейку влево.
  • + – увеличить значение ячейки на единицу.
  • — – уменьшить значение ячейки на единицу.
  • , – прочесть значение в ячейку со стандартного устройства ввода.
  • . – напечатать значение ячейки стандартным устройством вывода.
  • [ – начать цикл while если значение текущей ячейки не равно 0 и перейти к следующей ячейке.
  • ] – конец блока while. Продолжить цикл, если значение “условной” ячейки не равно 0 ( “условная ячейка” — ячейка на которой начался цикл ).

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

«Чашка чая» на разных языках

Время на прочтение5 мин
Охват и читатели2.9K
Какой язык программирования Вы предпочитаете? C++? Или чистый C? Или Вы поклонник скриптовых языков — Python или PHP?
Конечно, Вы ответите, что это зависит от задач, которые перед Вами стоят.
Хорошо. Давайте попробуем реализовать простой алгоритм — приготовить чашку чая — на разных языках программирования.
Можете посмотреть, что получилось у меня. Реализации не претендуют на право быть идеальными, да и результаты отличаются. Но ведь дело не в чае — дело в языке! Итак...
Читать дальше →

FTP-протокол + WinSocks на примере простого FTP-клиента (зеркала) на ASM!

Время на прочтение15 мин
Охват и читатели15K
Это еще одна статья «давно гуляющая» по интернету, и опять, как автор, сделаю перепост. Думаю пригодиться и тут.

Введение


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

QMS: Мастерим лунолёт

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

В процессе разработки некоторого количества достаточно сложных текстовых квестов, пришло понимание связанных с этим сложностей. Работа в графическом редакторе увлекательна, но крайне неудобна, по целому ряду причин. В ответ на эти проблемы, родилась идея текстового языка разметки, а уже в процессе его разработки появилась возможность сделать кое что неожиданное. Мне требовался вычислительный блок, для выполнения нетривиальных вычислений и система команд МК-61 показалась неплохим выбором. Ну а чтобы убедиться что всё работает, пришлось воссоздать “Лунолёт”. Внутри текстового квеста…

Читать далее

BGGP3: Хороший тамада и конкурсы интересные

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели1.1K

Продолжаю рассказывать широкой аудитории о «гусарских забавах» компьютерной элиты — третий по счету Binary Golf Grand Prix.

Читать далее

Аватар программист, или Гегель — ты был прав ч.2

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели686

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

Читать далее

Вайб-кодинг с ИИ: разработка без кода или шаг в бездну?

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели6.4K

Вайб‑кодинг (от англ. vibe coding) — новый способ программирования, где вместо ручного написания кода вы описываете задачу AI‑модели, а она генерирует код сама​. Как метко заметил Андрей Карпати, один из пионеров этого подхода, «это не совсем программирование — я просто вижу что‑то, говорю что‑то, запускаю что‑то и копирую‑вставляю что‑то, и это в основном работает»​. В 2025 году вайб‑кодинг из эксперимента энтузиастов превратился в реальный инструмент: появились мощные облачные LLM, способные писать сложный код, и уже до 90% кода может создаваться с участием ИИ. Ниже — обновленный гайд, как начать вайб‑кодить, какие модели использовать и на что они способны, а также какие возможности открываются перед бизнесом.

Читать далее

Интересный case

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели787

Ковыряясь в скриптах наткнулся на интересный case. Чё тут интересного то? Подсказка, это не цикл. Да, вот эти вот break'и выглядят тут совершенно инородно. Возможно когда-то этот кусок эм, кода работал в цикле и break каким-то боком был нужен? Но сейчас цикла нет а brake есть. Бомбит? Бомбит до такой степени что я решился писнуть небольшую статейку про case.
На 100%-ю полноту освещения не претендую, все мои эксперименты лишь очень поверхностные но несколько точек постараюсь расставить.

Рассмотрим case

Программист-4chan'овец

Время на прочтение4 мин
Охват и читатели1.2K

Мы используем Go для создания Dolt, первая в мире БД SQL с контролем версий. Как и большинство кодовых баз, основанных Go, мы используем каналы и горутины(от переводчика, автора этой статьи на Хабре: у меня есть хорошая статья на тему параллелизма в Go) для реализации параллелизма. Как правило мы используем эти конструкции очень скучным и обычным путем, ведь параллелизм и так сложен без всяких выдумок. Но в одном месте мы все-таки взяли маленький кусочек кода из другого open-source проекта, который использует каналы очень интересным способом...

Читать далее

Как мы WASM в PWA на Flutter прикручивали

Время на прочтение6 мин
Охват и читатели3.8K

— Парни, у нас PWA тормозит! — в голосе Димы чувствовались нотки интриги.

Вообще-то мы разрабатываем на Flutter кроссплатформенное приложение для мобильных устройств, но коль уж фреймворк позволяет, на сдачу запустили и веб-версию. Поначалу с PWA мы отхватили немало проблем, но со временем большую часть из них победили. Только вот производительность (из песни слов не выкинешь) так и осталась ахиллесовой пятой приложения — даже на достаточно мощных устройствах нет-нет, да проскакивали микрофризы.

Новостью это не было ни для нас, ни для Димы, поэтому причина озвучивания этого факта ни с того, ни с сего была не ясна.

Читать далее

Ближайшие события

Как (и зачем) я писал README в Jupyter-ноутбуке для Node.js-приложения

Время на прочтение4 мин
Охват и читатели2.6K

На одном из прошлых мест работы я поддерживал консольную Node.js-утилиту, которая публиковалась в NPM. Утилита использовала commander, содержала довольно большое количество подкоманд, и все они требовали описания в README-файле, которое нужно было не забывать обновлять при каждом изменении. Несколько лет спустя я нашел решение, используя не слишком привычные для экосистемы Node.js технологии.

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

Читать далее

Продолжение серии статей про работу исключений в С++ «под капотом»

Время на прочтение3 мин
Охват и читатели3.7K

Когда я работал над своей курсовой про то, как передавать С++ исключения из ядра ОС пользовательским программам, я изучал, как работают исключения в С++ и в этом мне очень помогла эта серия статей с Хабра. Теперь я хочу дополнить некоторые мометны, которые недостают в этой серии статей.

Читать далее

Как я делал serverless поиск для мейлинг листов OpenJDK

Время на прочтение5 мин
Охват и читатели1K
Совсем недавно мне захотелось поискать какую-то информацию в amber-dev мейлинг листе. Оказывается, что никакого встроенного поиска тут нет. Нужно либо пользоваться гуглом и использовать site: оператор, либо использовать поиск почтового клиента. В целом, оба варианта — рабочие, но мне захотелось сделать еще одну опцию, попутно немного поиграв с WebAssembly.

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

Инди-дев-(б|в)лог: 1.0.0 — Инициализация

Время на прочтение10 мин
Охват и читатели1.6K

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

В моей голове подобный проект всегда выглядит, как несбыточная мечта, однако, на протяжении моей карьеры, где на данный момент я - Lead Full Stack Software Development Engineer, где Full Stack - это полный цикл разработки включающий Technical writing, QA, SDET, SDE, Architecture, BA, DBA, UI/UX и так далее, наконец-то сформировался концепт проекта мечты и, собственно, план по реализации, осталось дело за малым.

Читать далее

Как правильно верстать 2, или зачем я написал еще одну UI-библиотеку, мой первый npm-модуль?

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

Это работа является логическим продолжением моего первого подробного текста для сообщества об актуальных подходах к верстке Как верстать веб-интерфейсы быстро, качественно и интересно. Но, если в первом трактате, внимание уделялось, прежде всего, стилю кода, его качеству и эффектным современным возможностям различных препроцессоров и фреймворков, что демонстрировалось на некоторых конкретных специфических задачах, теперь хочется сфокусироваться на архитектурных или даже организационных аспектах веб-производства. Если вы не читали мой первый текст, но собираетесь при этом прочесть этот — не поленитесь перейти по ссылке и пробежать глазами самые последние разделы каждой из двух частей первого пособия: «Готовые решения» и «Песочницы». Этот текст начинает прямо с этих мест и развивает именно эти идеи: и о пагубности применения раскрученных-популярных «на все готовых» UI-«дизайн-систем»-фреймворков для создания кастомизированных веб-морд любой сложности и, о, по сути, полезности использования хотя бы минимального документирования и явных соглашений при разработке веб-GUI на фронтенде. Но я не стану тратить время, доказывая, что «ни в коем случае нельзя использовать Vuetify или AntDesign» для создания крупных UI-систем с полностью кастомным оформлением. Вам не нужно прикручивать себе огромный геморрой непроницаемый слой плохо кастомизируемого готового GUI для того чтобы написать кнопку или поле ввода! Если вам нужен датапикер — найдите и допилите что-нибудь под себя. Это понимание может только прийти или так и не придти с годами тяжелого опыта, когда вы будете постоянно тратить непростительно много своего времени на то, чтобы написать очевидно отвратительный CSS — «кряки с !important`ами поверх стилей библиотеки», выдумывать чудные костыли на javascript чтобы изменить дефолтное поведение виджетов на кастомное и хитрое-нестандартное затребованное вашими дизайнерами... И при этом ваши шаблоны, стили и js-обвязки будут превращаться во все менее читаемые запутанные нагромождения разнообразно оформленного кода, с различным подходом к наименованию и прочими бедами… Этот текст и написанный для него проект призваны наглядно показать «а как надо?».

Читать далее

E-learning на костылях. Тестовое задание для непростого e-learning мастера

Время на прочтение7 мин
Охват и читатели4.4K

В этой статье я покажу «хрустальную туфельку» с помощью которой я ищу довольно необычного спеца в e-learning.

Под катом будет несколько задач на знание сильно устаревшего, но широко используемого стандарта, одного из десятков авторских средств и чуть-чуть ненормального JavaScript.

Если интересно поупражняться, прошу в комментарии. Ответы добавлены.

Читать далее

Можно ли использовать декларативный и императивный стили написания программ одновременно?

Время на прочтение9 мин
Охват и читатели9.8K


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

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

Но сейчас я думаю, что это не верно. Императивный и декларативный стили программирования не являются взаимоисключающими, а писать программы только в одной из указанных парадигм подталкивают правила синтаксиса, реализованные в языке!

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

Данная статья — размышление о совместимости декларативной и императивной парадигм программирования и возможности их одновременного использования в рамках одного языка программирования одновременно.

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

Вклад авторов