Убираем из браузера лишнее

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

Отключение рекламы

Для всех браузеров существуют расширения подобные AdBlock: Firefox, Chrome.

Новая вкладка

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

Очистить вкладку в Firefox можно в настройках. В Chrome с помощью расширений, например, Empty New Tab Page.

Читать далее Убираем из браузера лишнее

Отключение оповещений и нотификации

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

SMS

В SMS у меня в основном была реклама и спам из магазинов. Обычно получалось отписаться через форму обратной на сайте компании или магазина. Иногда формы не было и приходилось звонить. От всех подобных sms удавалось отписаться без особых проблем.

Для МТС есть специальный номер 4424. На него нужно отправить сообщение off и имя от кого пришла SMS. Например:

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

Читать далее Отключение оповещений и нотификации

FileZilla — удобный ftp-клиент

FileZilla предоставляет простой и функциональный интерфейс для работы с ftp.

Настройка подключения

Нажимаем кнопку для открытия менеджера сайтов.

Кнопка Менеджер сайтов

Нажимаем Новый сайт и вводим параметры подключения: хост, порт, логин и пароль.

Менеджер сайтов FileZilla

После сохранения, в меню у кнопки менеджера сайтов появляется список сохранённых подключений.

Меню со списком подключений FileZilla

Написание простого DSL компилятора на Delphi (7. Компилятор AST)

Перевод поста Writing a Simple DSL Compiler with Delphi (7. AST Compiler).

Эта статья представляет собой описание компилятора AST используемого для проекта моего языка программирования. Если вы только начинаете читать эту серию, то я бы рекомендовал вам начать с этого поста. Как минимум вы должны прочитать предыдущий пост Intermezzo так как он разъясняет некоторые части компилятора которых я не касаюсь здесь.

В каркасе моего игрушечного компилятора, компилятор (или codegen, как он называется внутри) — часть кода которая реализует интерфейс ISimpleDSLCodegen. Этот интерфейс предоставляет только одну функцию, Generate, которая принимает абстрактное синтаксическое дерево и преобразует его в объект, который реализует интерфейс ISimpleDSLProgram, который позволяет вам вызывать любую функцию скомпилированной программы по имени.

Читать далее Написание простого DSL компилятора на Delphi (7. Компилятор AST)

Написание простого DSL компилятора на Delphi (Intermezzo)

Перевод поста Writing a Simple DSL Compiler with Delphi (Intermezzo).

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

Результатом всего этого является программа introduction.dpr, автономная программа которая содержит полностью язык (очень тривиальный) вместе с полной документацией, написанная в стиле Грамотного программирования. Упрощено — вы можете читать её сверху вниз как историю.

В качестве intermezzo и для упрощения моего объяснения компилятора, я опишу эту программу здесь полностью, отформатировав её как пост в блог.

Читать далее Написание простого DSL компилятора на Delphi (Intermezzo)

Написание простого DSL компилятора на Delphi (6. Дамп AST)

Перевод поста Writing a Simple DSL Compiler with Delphi (6. AST Dumper).

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

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

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

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

Читать далее Написание простого DSL компилятора на Delphi (6. Дамп AST)

Написание простого DSL компилятора на Delphi (5. Фреймворк)

Перевод поста Writing a Simple DSL Compiler with Delphi (5. Framework).

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

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

Мой игрушечный компилятор использует очень простой фреймворк доступ к которому производится через интерфейс ISimpleDSLCompiler (модуль SimpleDSLCompiler). Уместная часть интерфейса показана ниже:

Читать далее Написание простого DSL компилятора на Delphi (5. Фреймворк)

Написание простого DSL компилятора на Delphi (4. Парсер)

Перевод поста Writing a Simple DSL Compiler with Delphi (4. Parser).

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

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

После перерыва я вернулся к серии про мой "игрушечный компилятор". Сейчас я опишу работу парсера — части кода которая читает входной поток (обычно в форме токенов) и генерирует внутреннее представление программы (в моём случае абстрактное синтаксическое дерево).

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

Мой парсер представлен как очень простой интерфейс. Он будет принимать код для разбора (как строку), ссылку на токинизатор которые должен использоваться для чтения входного потока и ссылку на корневой элемент результирующего AST. Функция вернёт False если разбор не удастся, в этом случае вызывающая сторона может преобразовать интерфейс парсера к ISimpleDSLErrorInfo для получения большей информации об ошибке.

Читать далее Написание простого DSL компилятора на Delphi (4. Парсер)

Написание простого DSL компилятора на Delphi (3. Токинезатор)

Перевод поста [Writing a Simple DSL Compiler with Delphi (3. Tokenizer])](https://www.thedelphigeek.com/2017/09/writing-simple-dsl-compiler-with-delphi.html).

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

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

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

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

Читать далее Написание простого DSL компилятора на Delphi (3. Токинезатор)

Написание простого DSL компилятора на Delphi (2. Абстрактное синтаксическое дерево)

Перевод поста Writing a Simple DSL Compiler with Delphi (2. Abstract Syntax Tree).

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

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

Абстрактное синтаксическое дерево является, проще говоря, символическим представлением программы в виде дерева.

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

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

Читать далее Написание простого DSL компилятора на Delphi (2. Абстрактное синтаксическое дерево)