Pull to refresh
126
0.4
Александр Рябиков @rsashka

Системный архитектор

Send message

Девайс HabrScore для хаброзависимых с блекджеком и …

Level of difficultyMedium
Reading time8 min
Views6.7K

|300


Понравилась статья HabraTab — девайс для хаброзависимых, где описана разработка устройства для визуализации рейтинга пользователя на Хабре.


И мне очень захотелось подобное устройство, вот только было несколько но:


  • Очень лень было делать, заказывать и паять печатную плату
  • Еще хотелось выводить рейтинг последней статьи, но хардкодить адрес и каждый раз пересобирать прошивку показалось очень муторно.
  • Разработка на С/С++ меня не пугает, так как занимаюсь этим более 20 лет, но писать что-то под Arduino у меня душа не лежит. И это не говоря про необходимость настройки системы сборки под конкретный микроконтроллер.

Короче, немного поразмыслив, было принято решение делать свое устройство для визуализации рейтингов на Хабре, и как обычно с блекджеком и… ну вы поняли. И самое главное, чтобы можно было собирать устройство из покупных деталей с Алиэкспресса для максимально простого повторения и кодить на чем-нибудь попроще, чем на С/С++.

Читать дальше →
Total votes 37: ↑37 and ↓0+37
Comments15

Неожиданная проблема с макросами (точнее без макросов)

Level of difficultyMedium
Reading time3 min
Views5.5K

image


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


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


Если же говорить о простых реализациях макросов, например как для языков С и С++, то умные люди и умные книжки советуют избегать использования макросов и по возможности заменять их шаблонами, константами и inline-функциями. Ведь с помощью макросов можно не только упростить код, но и не менее изящно стрелять в ноги себе или своих товарищей.


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

Читать дальше →
Total votes 5: ↑3 and ↓2+1
Comments29

Доработка фильтра обратного осмоса

Level of difficultyEasy
Reading time4 min
Views25K

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


Хотя фильтры под мойкой менялись не очень давно, я решил поменять их еще раз, и к своему ужасу увидел неприглядную картину, примерно вот такую:


грязные


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


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


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

Читать дальше →
Total votes 23: ↑13 and ↓10+5
Comments266

DSL (domain-specific language) implementation with macros

Level of difficultyMedium
Reading time8 min
Views2.4K

image
This is a translation of my own article


The release of NewLang language with a brand new "feature" is coming, a remodeled version of the preprocessor that allows you to extend the language syntax to create different DSL dialects using macros.


What is it about?


DSL (Subject Oriented Language) is a programming language specialized for a specific application area. It is believed that the use of DSL significantly increases the level of abstractness of the code, and this allows to develop more quickly and efficiently and greatly simplifies the solution of many problems.

Conditionally, we can distinguish two approaches to DSL implementation:


  • Development of independent syntax translators using lexer and parser generators to define the grammar of the target language through BNF (Backus–Naur form) and regular expressions (Lex, Yacc, ANTLR, etc.) and then compiling the resulting grammar into machine code.
  • Development or integration of the DSL dialect into a general-purpose language (metalanguage), including the use of various libraries or special parsers / preprocessors.

We will talk about the second option, namely the implementation of DSL on the basis of general-purpose languages (metalanguages) and the new implementation of macros in NewLang as the basis for DSL development.

Read more →
Total votes 2: ↑2 and ↓0+2
Comments2

Вариант реализации DSL (domain-specific language) с помощью макросов

Level of difficultyMedium
Reading time8 min
Views3.9K

image


Близится релиз языка NewLang с принципиальной новой «фишкой», переделанным вариантом препроцессора, который позволяет расширять синтаксиса языка для создания различных диалектов DSL за счет макросов.


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


О чем идет речь?


DSL (Предметно-ориентированный язык) — язык программирования, специализированный для конкретной области применения. Считается, что использование DSL существенно повышает уровень абстрактности кода, а это позволяет вести разработку более быстро и эффективно и существенно упрощает решение многих задач.

Условно, можно выделить два подхода к реализации DSL:


  • Разработка независимых трансляторов синтаксиса с помощью генераторов лексеров и парсеров для определения грамматики целевого языка посредством БНФ и регулярных выражений (Lex, Yacc, ANTLR и т. д.) и последующей компиляцией полученной грамматики в машинный код.
  • Разработка или встраивание диалекта DSL на языке (метаязыке) общего назначения, в том числе за счет применения различных библиотек или специальных парсеров / препроцессоров.

Далее речь пойдет о втором варианте, а именно, о реализации DSL на базе языков (метаязыков) общего назначения и новом варианте реализации макросов в NewLang как основы для разработки DSL.

Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments22

Простой лайфхак для ввода символа "#" в русской раскладке клавиатуры под Linux

Level of difficultyEasy
Reading time2 min
Views27K

знак решетки


Давно полюбил формат Markdown за простоту и легкость его использования при документировании исходного кода и за возможность его применения при оформлении статей для Хабра. Потом добавился Obsidian для ведения заметок. И формат Markdown стал по сути основным способом форматирования набираемого текста.


Единственной, но весьма большой ложкой дегтя, оставалась проблема ввода символа решетки «#» при использовании русской клавиатуры. А так как знак решётки (октото́рп, хеш, знак номера, дие́з, sharp), в русской раскладке клавиатуры отсутствует, то каждый раз переключаться на английскую раскладку, меня немного утомляло. И «немного утомляло» еще мягко сказано, так как символ решетки, кроме указания заголовков в Markdown и тегов в Obsidian, еще часто используется как начало комментария до конца строки (в Bash, Python, NewLang).


А так как предлагаемые на просторах интернета способы ввода символа решетки в русской раскладке клавиатуры меня совсем не вдохновляли (и если Alt+35 на Numpad под виндой еще сойдет, но этот способ не работает под Linux, а занимать буфер обмена ради вставки одного символа, вообще не вариант), то пришлось потратить некоторое время на эксперименты, результатами которых я и хочу поделиться.

Простой лайфак ввода # в русской раскладке под Linux
Total votes 24: ↑16 and ↓8+11
Comments45

Встречайте, новая стратегия Embrace, Extend, and Expropriate для Linux?

Level of difficultyMedium
Reading time2 min
Views8.7K

image


Помните, несколько лет назад была проведена согласованная клеветническая компания против Ричарда Столлмана, в которой он был ложно обвинён в одобрении изнасилований, и по результатом которой его вынудили уволиться с поста президента Фонда Свободного Программного Обеспечения?


Уже тогда многие предполагали, что данная спланированная акция является подготовкой к атаке производителей проприетарных программ на экосистему свободного программного обеспечения. Многие в это не верили (типа, «не приписывайте обычную глупость злому умыслу»), а кто-то не верит и сейчас. Ведь гораздо проще и удобнее игнорировать якобы не существующую опасность, ведь в противном случае на нее нужно как-то реагировать (хотя бы морально).


И вот сейчас, в релизе ядра Linux 6.2, произошло очень важное изменение — разрешён приём кода в ядро Linux под лицензией Copyleft-Next, для которой заявлена совместимость с GPLv2, что подтверждено юристами компаний SUSE и Red Hat (кто бы сомневался?).


Данная лицензия также содержит пункт о предоставлении прав на запатентованные технологии, что делает Copyleft-Next совместимой и с Apache 2.0. А для обеспечения полной совместимости с GPLv2, в тексте Copyleft-Next явно указано, что производная работа может поставляться не только под исходной лицензией Copyleft-Next, но и под лицензией GPL.


Но как говорится, «есть нюанс».

Читать дальше →
Total votes 42: ↑28 and ↓14+22
Comments66

Релиз языка программирования NewLang 0.3

Reading time9 min
Views7.2K
image

NewLang — это язык программирования высокого уровня общего назначения. Основной особенностью языка является простой, логичный и не противоречивый синтаксис, который основан на строгой системе грамматических правил. За счет использования макросов, синтаксис языка легко расширяется до более привычного вида на основе ключевых слов.


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

Читать дальше →
Total votes 10: ↑7 and ↓3+5
Comments51

А слабо собрать скоринговую базу доверчивых клиентов лох̶терей?

Reading time2 min
Views6.8K


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

С самим лотереями особо не заморачивался и покупал билеты, которые не требуется заполнять. Какие нибудь 100-Лото и тому подобные. И вчера, я как и обычно, попросил несколько билетов на сдачу и… покупка не состоялась, потому что у меня потребовали номер мобильного телефона!
Читать дальше →
Total votes 9: ↑5 and ↓4+2
Comments25

История одного перехода с gcc на clang

Reading time5 min
Views12K


На прошлой неделе, после нескольких месяцев разработки, вышла очередная версия языка программирования NewLang. Одной из технических особенностей данного релиза является переход на использования компилятора clang вместо gcc.

Данная статья описывает причины смены компилятора, некоторые особенности этого процесса, проблемы, которые приходилось решать и итоговые выводы.

Автор надеется, что эта информация может оказаться полезной и позволит сэкономить кучу времени, если заранее знать некоторые подводные камни, а так же положительные стороны от перехода на clang.
Читать дальше →
Total votes 11: ↑8 and ↓3+11
Comments5

Релиз языка программирования NewLang 0.2

Reading time5 min
Views8.3K

image


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


Основной особенностью языка является простой, логичный и не противоречивый синтаксис, который основан не на использовании зарезервированных ключевых слов, а на строгой системе грамматических правил с использованием знаков препинания (в список которых входят и операторы языка).


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

Читать дальше →
Total votes 9: ↑4 and ↓5+2
Comments22

Релиз языка программрования NewLang

Reading time21 min
Views13K

КДПВ


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


Основной особенностью языка является простой, логичный и не противоречивый синтаксис, который основан не на использовании зарезервированных ключевых слов, а на строгой системе грамматических правил с использованием знаков препинания (в список которых входят и операторы языка).


Новое по сравнению с прошлым выпуском:


  • Реализованы все основные алгоритмические конструкции: проверка условий, различные варианты циклов, сравнение по образцу, прерывание последовательности команд и возврат данных, обработка ошибок и т.д.
  • Переработан основной синтаксис для отдельных языковых конструкций.
  • Реализованы большинство операций с переменными, включая операторы раскрытие списков и тензоров.
  • Серьезно переработана система встроенных типов, реализованы функции для их преобразования и для определения данных (последнее можно назвать data comprehensions).
  • Добавлены новые тесты и пр.
Читать дальше →
Total votes 14: ↑11 and ↓3+10
Comments32

Свободное ПО и государственное регулирование проприетарных решений как способ спасения ИТ отрасли России?

Reading time5 min
Views16K
Хабр, как центральный пишущий/читающий хаб российских ИТ специалистов лучше всего подходит для обсуждения вопросов, связанных с дальнейшим путем развития ИТ отрасли Российской Федерации. И меня, как программиста и железячника, не может не напрягать ситуация, которая продолжает складываться.

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

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

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

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

Читать дальше →
Total votes 36: ↑17 and ↓19+1
Comments53

Новый язык программирования

Reading time23 min
Views21K
image
Более года назад я начал публикацию статей с описанием особенностей нового языка программирования. С тех пор утекло много воды, было протестировано множество идей, в итоге несколько раз все поменялось кардинальным образом и сейчас представляю на суд читателей описание предфинальной версии языка и его особенностей.

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

Этот проект очень долго был без собственного названия и в публикациях назывался просто и абстрактно «новый язык». Но после нескольких статей, временное название «новый язык» постепенно превратилось в имя собственное NewLang, которое я и решил в конечном итоге оставить (что еще раз подтверждает поговорку, что нет ничего более постоянного, чем что-то временное).

Читать дальше →
Total votes 24: ↑19 and ↓5+20
Comments49

Почти детективная история одной «кровавой» ошибки

Reading time2 min
Views8.6K


Дополнение статьи «Размещение кучи FreeRTOS в разделе CCMRAM для STM32», и в продолжение серии статей про различные полезности для STM32 (1, 2 и 3), хочу обратить внимание на одну особенность работы с CCM RAM памятью, которая может быть причиной совершенно не очевидных ошибок в работе устройств, одна из которых выпила у автора достаточно много крови, так что с чистой совестью её действительно можно назвать «кровавой».

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

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

Читать дальше →
Total votes 20: ↑18 and ↓2+27
Comments28

Динамическая JIT компиляция С/С++ в LLVM с помощью Clang

Reading time10 min
Views9.4K


При создании компилятора для собственного языка программирования я сделал его как транспайлер в исходный код на С++, вот только реализация сильно подкачала. Сначала приходится генерировать динамическую библиотеку с помощью вызова gcc, который и сам по себе не очень быстрый, так еще его может и не быть на целевой машине, особенно на другой платформе (например Windows). Конечно, для первых экспериментов и такой реализации было достаточно, но сейчас, когда я начал готовить код компилятора к публикации, стало понятно, что текущий вариант с фоновым запуском gcc никуда не годится.

Из-за этого, я решил не откладывать перевод компилятора на использование LLVM, который планировался когда нибудь в будущем, а решил сделать это уже сейчас. И для этого нужно было научиться запускать компиляцию C++ кода с помощью библиотек Clang, но тут вылезло сразу несколько проблем.

Оказывается, интерфейс Clang меняется от версии к версии и все найденные мной примеры были старыми и не запускались в актуальной версии (Сlang 12), а стабильный C-style интерфейс предназначен для парсинга и анализа исходников и с помощью которого сгенерировать исполняемые файлы не получится*.

Дополнительная проблемой оказалось, что Clang не может анализировать файл из памяти, даже если для этого есть соответствующие классы. Из объяснений выходило, что в экземпляре компилятора проверяется, является ли ввод файлом**.

А теперь публикую результат своих изысканий в виде рабочего примера динамической компиляции С++ кода с последующей его загрузкой и выполнением скомпилированных функций. Исходники адаптированны под актуальную версию Clang 12. Пояснения к коду я перевел и дополнил перед публикацией, а ссылки на исходные материалы приведены в конце статьи.

  • *) Кажется в 14 версии планируется реализовать C интерфейс для генерации исполняемых файлов.
  • **) На самом деле, Clang может (или теперь может) компилировать файлы из оперативной памяти, поэтому в исходники я добавил и эту возможность.
Читать дальше →
Total votes 10: ↑9 and ↓1+14
Comments12

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

Reading time9 min
Views8.4K


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

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

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

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

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

Читать дальше →
Total votes 8: ↑5 and ↓3+3
Comments31

Осторожно! Развод и фишинг одновременно по нескольким каналам

Reading time4 min
Views25K


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

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

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

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

И тот факт, что при атаках начинают применяться приемы социальной инженерии с использованием сразу несколько независимых каналов одновременно, значительно повышает их достоверность и вероятность срабатывания!
Читать дальше →
Total votes 41: ↑34 and ↓7+41
Comments78

Лаконичный итератор для декларативного синтаксиса

Reading time7 min
Views2.6K


Итератор (от англ. iterator ― перечислитель) — интерфейс, предоставляющий доступ к элементам коллекции (массива или контейнера) и навигацию по ним. В различных системах итераторы могут иметь разные общепринятые названия. В терминах систем управления базами данных итераторы называются курсорами.

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

Ну и судя по моим наблюдениям Хабр — ума палата, буду рад любым комментариям и предложениям, которые помогут протестировать или улучшить предлагаемое решение.
Читать дальше →
Total votes 5: ↑3 and ↓2+2
Comments9

Необычная концепция синтаксиса языка программирования

Reading time8 min
Views8.8K


Хочу представить на обсуждение читателей немного необычный концепт языка программирования, в котором отсутствует проблема, присущая практически всем промышленным языкам — постоянное увеличение сложности синтаксиса языка из-за его естественного развития по мере выхода новых версий и добавления новых фич. Эта проблема описана в материале Простое сложное программирование и Какая «идеальная» цель развития у языков программирования?

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

Особенности языка:

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

Ну и в соответствии с собственным наблюдением Хабр — ума палата, буду рад любым комментариям и предложениям, которые помогут протестировать или улучшить предлагаемое решение.
Читать дальше →
Total votes 10: ↑6 and ↓4+2
Comments42

Information

Rating
2,064-th
Location
Россия
Works in
Date of birth
Registered
Activity

Specialization

Embedded Software Engineer, Software Architect
Lead
C++
OOP
Linux
Programming microcontrollers
Embedded system
C
Qt
Software development