Как вы относитесь к созданию сайта про криптовалюты, где на каждую из них (например, Биткоин) будет создана HTML страница с таблицей минимальной и максимальной стоимости в долларах за каждый год (и чтобы все эти страницы можно было скачать в одном ZIP файле), а также - заработки и потери инвесторов?
Или что бывает если заставить очень опытного разработчика заниматься не своим делом. Думаю после этой статьи термин «overqualified» заиграет для вас новыми красками.
Пять минут вдумчивого изучения этого скриншота могут привести к нервному срыву, я предупредил.
Наш волшебный дикий веб
Что первым делом приходит в голову, когда говорят о «веб-разработке»? Наверное что-то вроде "создание сайтов или веб-приложений"?
Лендинги, сайты-визитки, интернет-магазины или какие-нибудь веб-порталы в ад.
Самые продвинутые из читателей вспомнят PWA или какой-нибудь React Native с Flutter — предел полета фантазии обычного разработчика.
Что плохо:
главное что отделяет человека от великих свершений это его фантазия — точно нельзя сделать только то, что невозможно вообразить.
Поэтому сейчас мы будем расширять ваше воображение — в превентивных мерах, дрелью и дыроколом подручными средствами. Перед вами шесть проектов отборнейшей дичи — реализующих самые безумные идеи с помощью вполне обыденных инструментов современного веб-разработчика.
Пожалуйста не пытайтесь рассказывать о таком на интервью в обычных компаниях — пожалейте интервьюера и его нежную психику.
Дичь первая: HTMLang
Не смог пропустить столь жизнеутверждающее описание от автора этого замечательного проекта:
They were laughing that HTML was not a real programming language... WHO"S LAUGHING NOW!!11
Да, это именно то что вы подумали — кто-то будучи сильно не в духе взял общий синтаксис HTML и создал на его основе полноценный язык программирования.
Не представляю что будет если самому Джоэлу выдать его же знаменитый «FizzBuzz» в такой реализации — есть шанс что старый сишный программист впадет в рекурсию.
Кстати кто там рассказывал на лекциях про «декларативный язык разметки» и «общую неполноценность»?
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык гипертекстовой разметки документов для просмотра веб-страниц в браузере.
Зря старались, автор этого проекта тем временем спокойно пишет в консоль тегами HTML:
А все потому, что не надо нанимать системных программистов, прошедших полноценное обучение по дисциплинам CS (вроде курса по разработке компиляторов) для работы штатным говночистом разработчиком в обычном корпоративном проекте.
Дичь вторая: HTML-as-programming-language
Нехорошие мысли терзают многих опытных разработчиков — все та же идея «полноценной разработки на HTML» не дает покоя и автору данного проекта.
Но только он зашел в этом процессе несколько дальше предыдущего.
Как вам например функция на чистом HTML:
<def multiplyFunction returns=int> <!-- You can create functions --> <param a type=int/> <param b type=int/> <return>a * b</return> </def>
<def main> <var result type=int> <!-- Create variables --> <multiplyFunction> <!-- and store the result of the function in the variable --> <param>5</param> <param>6</param> </multiplyFunction> </var> </def>
Известная библейская истина «многие знания — многие печали» — как раз про этот проект, например я бы очень хотел все это забыть и никогда о подобном не знать.
Но к сожалению уже слишком поздно, поэтому делюсь откровениями:
Замечательный пайплайн с вызовом компилятора HTML, правда?
Да, вы все правильно поняли — это самый настоящий компилятор из HTML в нативный ELF64.
А сейчас совсем поплохеет:
To write code for Adruino/AVR microcontrollers, (Arduino UNO for example) you need to put a DOCTYPE tag in your HTML file.
For example:
<!DOCTYPE avr/atmega328p>
Да, это была оригинальная задумка автора — разработка для микроконтроллеров на HTML, я ничего не придумываю.
К слову, небольшая магия с #include <stdio.h> на скриншоте выше была необходима как раз потому, что компилятор предназначен для микроконтроллеров и не добавляет в генерируемый код на С этот стандартный для обычной ОС заголовок.
Вот так выглядит эта железка, если никогда не видели.
К сожалению у меня не оказалось под рукой такого девайса, так что полноценную работу и весь пайплайн проверить не смог. Но если среди читателей найдутся смелые люди, которые смогут это запустить — с радостью почитаю о впечатлениях.
А мы тем временем переходим к следующему замечательному проекту.
Несмотря на то что автор честно пишет о куче недоработок:
Work in progress: it works, but only about 70% of ES3 specification is currently supported: statements and expressions - 95%, built-in objects - 17%.
Скажу что это самый работоспособный проект из серии, все остальное буквально рассыпается в руках. Рассыпается и валится как и следующий объект исследования.
Дичь пятая: nerd
Как легко и быстро понять что исследуемый проект — дикое, нерабочее и глючное говно?
По описанию, обещающему бесконечные ништяки:
Javascript's God Mode. No VM. No Bytecode. No GC. Just native binaries.
Отсылка к чему-то божественному в описании технического проекта это вообще практически 100% диагноз, можно отбраковывать только по одному этому признаку — врядли ошибетесь.
Как нетрудно догадаться, вместо нормального JavaScript тут тоже что-то свое божественное:
NerdLang is a substract of JS with some additions, focus on efficiency.
И это «свое» скажем так застряло в далеком прошлом:
Supporting EcmaScript 3 standard
На минуточку, 3я редакция стандарта вышла еще в далеком 2000м году.
А сам проект пытается в который раз «натянуть сову на глобус» и залезть туда, где последовательно обломали клыки все крупные корпрорации уровня Google:
Nerd is a JavaScript native compiler aiming to make JavaScript universal, Nerd is able to compile native apps for Windows, Mac, Linux, iOS, Android, Raspberry, STM32 and more.
Разумеется я не мог пройти мимо такого, поэтому всю эту дичь собрал и запустил, хотя и пришлось немного исправлять скрипты сборки.
Пайплайн (присутствует на титульном скриншоте) выглядит вот так:
Автор настолько суров, что запихал инстукции сборки и линковки модуля работы с сокетами в package.json:
Увидев вот такой package.json, знакомый веб-разработчик решил навсегда уйти из профессии и теперь пасет коз в горах Кавказа. Ну а я всего лишь не рискнул адаптировать такое для сборки под Linux, так что вы останетесь без примера запуска HTTP-сервера на этом чудище.
Дичь шестая: lemon
Наконец последний на сегодня проект, который по сравнению с предыдущими является можно сказать нормальным и где-то даже применимым:
Lemon is a framework for building Javascript runtime software, built on the Chrome V8 Javascript Engine.
Мне он понравился своей предельной простотой (по сравнению со всеми остальными проектами) и легкостью встраивания.
Ниже показано как выглядит двойной «Hello, world», в котором есть как часть на JavaScript так и часть на C++ — немного подумав объединил два примера из документации в один.
App.js:
version(); console.log("Превед из JS"); helloworld();
App.hpp:
#ifndef APP #define APP
#include "../engine/Lemon.hpp" using v8::Context;
class App : public Lemon { public: void Start(int argc, char* argv[]); void SetupEnvironment(); }; #endif
for (int i = 1; i < argc; ++i) { // Get filename of the javascript file to run constchar* filename = argv[i]; // Create a new context for executing javascript code Local<Context> context = this->CreateLocalContext(); // Enter the new context Context::Scope contextscope(context); this->CreateGlobalObject("console") .SetPropertyMethod("log", Log) .Register(); // Run the javascript file this->RunJsFromFile(filename); } }
Чудны дела твои Господи, коль даже перебирая запредельную дичь есть шанс найти столь мощный проект.
Спросите с чего столько радости?
Потому что это самый настоящий V8, не самопал с реализацией ECMAScript «в переводе Гоблина», а именно тот самый движок, который используется в браузере Chrome — со всеми оптимизациями и наворотами.
А значит при определенных усилиях, у вас будет работать практически любой JavaScript код — в вашем нативном приложении, без всяких жирных Node.js и всех проблем с линковкой и версиями.
Словом берите на вооружение, пригодится.
Одной строкой
Конечно же интересных проектов в области творения дичи куда больше чем хватит сил описать, поэтому ниже небольшая подборка найденного и интересного, но неработающего.
Compile javascript to LLVM IR, x86 assembly and self interpreting
К сожалению оказался прибит гвоздями к определенной версии MacOS, ни нормально собрать ни прогнать тесты под Linux не удалось. Интересен тем что в одном проекте собран и интерпретатор и компилятор, причем в нативный бинарник.
В CSS давно есть единицы вроде rem, em , но они не всегда хорошо отражают реальные метрики конкретного шрифта. Это особенно заметно в интерфейсах, где важны пропорции текста, иконок, полей ввода и отступов.
Новые корневые единицы rcap, rch, rex и ric как раз решают эту задачу: они позволяют строить размеры не от абстрактного font-size, а от реальных характеристик шрифта корневого элемента <html>.
Перейдем к самим единицам с минимальными примерами:
rcap равен cap height корневого шрифта - номинальной высоте заглавных букв шрифта корневого элемента.
К примеру: rcap может быть полезен для размеров иконок рядом с текстом или логотипов в шапке сайта. Если иконка должна визуально совпадать с высотой заглавных букв, ее можно привязать к rcap, а не подбирать размер вручную.
``` .nav-icon {
width: 1.2rcap;
height: 1.2rcap;
} ``` rch- (root character unit) измеряет ширину символа 0 (ноль),заданную для шрифта корневого элемента <html>.
Как это работает: браузер берет advance measure глифа 0, в шрифте корневого элемента, и это значение становится равным 1rch.
Стоит уточнить что речь идет именно о advance measure-это расстояние, на которое курсор (или печатающая головка) продвигается после отображения символа, до того, как начнет рисоваться следующий символ. Один из самых практичных сценариев для rch — поля ввода, где ширина должна быть привязана к количеству символов. Например, если интерфейс предполагает ввод короткого кода, PIN или номера заказа фиксированной длины, можно задать ширину поля не в px и не в rem, а через rch. Тогда размер будет опираться на реальную ширину символов корневого шрифта.
``` .code-input {
width: 8rch;
padding: 0.5rem 1rch;
} ``` Удобно использовать для элементов, которые должны быть пропорциональны ширине символов основного текста. Например, для ограничения длины строки в статьях или настройки боковых отступов, чтобы они гармонировали с ритмом текста.
rex — корневая версия ex, это x-height шрифта корневого элемента.
rex больше не привязан к конкретному элементу. Это корневая версия ex,он считается не от текущего элемента ,а от корневого элемента html. То есть чтобы точно было понятно rex игнорирует локальные шрифты и всегда смотрит только на глобальный шрифт заданный в html.
Если корневой шрифт, например, 'Georgia', rex всегда будет использовать его метрики, даже если внутри элемента задан другой шрифт
``` html {
font-family: 'Georgia', serif;
font-size: 16px;
}
.button {
font-family: 'Courier New', monospace;
padding: 1rex;
}
```
ric-пожалуй самая не обычная единица про которую хочется сегодня расcказать.
Корневая версия ic, единицы для идеографической метрики в CJK-письменностях. Обычно она соотносится с advance measure символа 水 и полезна прежде всего для китайского, японского и корейского текста. Удобна, когда нужно создать сетку, рассчитанную на иероглифические тексты. Например, поле для ввода на 20 иероглифов.
Единицы rcap, rch, rex и ric описаны в CSS Values and Units Module Level 4. Несмотря на то что спецификация W3C по-прежнему имеет статус Working Draft, сами единицы уже поддерживаются современными браузерами
и могут использоваться в реальных проектах. На практике это уже не эксперимент ради эксперимента, а рабочий инструмент для интерфейсов, где важны именно метрики шрифта корневого элемента, а не только font-size. Особенно ,если вы разрабатываете интерфейсы, где важна точная типографика: лендинги, блоги, сайты с кастомизируемым шрифтом. Для обычных админок разница будет незаметна.
Краткая сводка по css-еденицам :
rch и rex: они понятнее в использовании и хорошо подходят для типографически выверенных интерфейсов, полей ввода и внутренних отступов. rcap полезен там, где нужно соотносить размеры элементов с высотой заглавных букв, например для иконок и логотипов. ric остается более нишевой единицей и в первую очередь нужен в интерфейсах, рассчитанных на CJK-тексты.
На всякий случай для production-проектов: используйте с @Supports или fallback-значениями, так как спецификация ещё не финальная.
Преобразование между HTML, стандартным форматом веб-контента, и Word, универсальным форматом офисных документов, является частой задачей во многих корпоративных приложениях. Будь то генерация отчётов Word из динамического содержимого базы данных или публикация существующих документов Word в виде веб-страниц — владение эффективными методами конвертации значительно повышает производительность.
В этой статье мы расскажем, как с помощью профессионального компонента для работы с документами Spire.Doc for .NET и кода на C# легко выполнять взаимное преобразование между HTML и Word.
Почему стоит выбрать Spire.Doc for .NET?
Сам по себе .NET не предоставляет встроенной поддержки для работы с документами Word или HTML и их преобразования. Хотя существуют открытые решения (например, HtmlAgilityPack в сочетании с OpenXML SDK), они часто требуют от разработчика ручной обработки множества деталей и имеют недостатки в сохранении стилей, встраивании изображений и т.д.
Spire.Doc for .NET предлагает мощный и простой в использовании API, позволяющий создавать, редактировать и конвертировать документы без установки Microsoft Office на сервере. Он обеспечивает высокое качество преобразования:
Сохранение стилей: полная поддержка текстовых форматов, цветов, выравнивания и других CSS-стилей из HTML.
Обработка изображений: автоматическое распознавание и встраивание изображений из тегов <img> в HTML.
Табличная структура: сохранение исходной вёрстки HTML-таблиц без искажений.
Простота разработки: лаконичный API и низкий порог вхождения.
Подготовка: установка Spire.Doc
Перед началом кодирования необходимо добавить ссылку на Spire.Doc в проект. Рекомендуется выполнить установку через консоль диспетчера пакетов NuGet с помощью следующей команды:
Install-Package Spire.Doc
Сценарий 1: преобразование HTML-строки в Word
Этот сценарий очень гибок и подходит для случаев, когда HTML-содержимое получается из базы данных, API-интерфейсов или других динамических источников данных, и требуется мгновенно сгенерировать документ Word.
В приведённом ниже коде показано, как прочитать содержимое HTML-файла (в виде строки) и преобразовать его в файл .docx:
Paragraph.AppendHTML(htmlString) — это основной метод преобразования. Он анализирует переданную HTML-строку и полностью преобразует её форматирование, изображения и структуру в содержимое абзаца Word.
С помощью document.SaveToFile() можно указать формат вывода FileFormat.Docx.
Сценарий 2: прямое преобразование HTML-файла в Word
Если у вас уже есть готовый HTML-файл, который вы хотите напрямую преобразовать в документ Word, код будет ещё более лаконичным:
Этот способ позволяет выполнить преобразование за один шаг — метод Document.LoadFromFile() напрямую поддерживает загрузку файлов в формате FileFormat.Html, избавляя от необходимости вручную считывать содержимое файла.
Важные замечания
На практике следует обратить внимание на несколько аспектов, чтобы добиться наилучшего результата преобразования:
Поддержка CSS-стилей : Spire.Doc поддерживает большинство распространённых CSS-свойств, таких как font-size, color, text-align и др. Однако для очень сложных CSS-макетов возможны незначительные расхождения в итоговом отображении.
Пути к изображениям : теги <img> в HTML автоматически преобразуются в изображения в Word. Убедитесь, что пути к изображениям (как локальные, так и URL-адреса) доступны во время конвертации.
Табличная вёрстка : для сложных таблиц рекомендуется избегать специальных свойств вроде table-layout: fixed, чтобы обеспечить корректное отображение таблиц в Word.
Производительность : для больших файлов с большим объёмом содержимого или изображениями высокого разрешения рекомендуется выполнять преобразование в фоновом потоке или асинхронной задаче, чтобы не блокировать основной поток.
Заключение
С помощью Spire.Doc for .NET разработчики могут реализовать высококачественное и высокоточное взаимное преобразование HTML и Word в проектах на C#, используя минимальный объём кода. Будь то обработка динамически генерируемых HTML-строк или пакетное преобразование существующих HTML-файлов — эта библиотека предлагает стабильное и эффективное решение. Она помогает быстро выстроить автоматизированный процесс работы с документами, позволяя сосредоточиться на бизнес-логике приложения.
Как вы относитесь к тому, чтобы различные физ. и юр. лица создали 100 тысяч HTML страниц с ответами на вопросы об СССР (например, о советских людях, событиях и городах), которые можно скачать в одном ZIP файле?
Как вы относитесь к тому, чтобы различные физ. и юр. лица создавали сайты, на каждом из которых не меньше 1000 HTML страниц (и они скачиваются в ZIP-файлах), на которых для школьников написано про людей, города и события, и они содержат разные секции, например: фильмы, игры, проекты, законы, профессии, языки и т. д.
Пока гиганты кремниевой долины меряются миллиардами параметров в своих GPT, сжигают тераватты электричества и требуют с вас подписку за доллары, я сидел на кухне и думал: «А почему бы не сделать ИИ-помощника, который не сожрет батарею моего старого телефона за пять минут и запустится даже в глухой деревне у бабушки?».
Так появился проект GromAI. Давайте сразу начистоту: это не та нейросеть, которая сама напишет за вас диплом или сочинит поэму о смысле жизни. Это, по сути, огромная, жестко структурированная «Википедия» готовых шаблонов, промптов и текстовых заготовок, терминов, которую я упаковал в суперлегкий интерфейс.
В чём прикол и почему это работает:
Полный офлайн. Скачал базу — и всё. Ей плевать на блокировки, VPN, плохой сигнал в метро или авиарежим. Работает вообще без интернета.
0 рублей, 0 копеек. Без рекламы, скрытых подписок, лимитов на знаки и прочей коммерческой шелухи. Делал для себя, делюсь с народом.
Она не тупит и не врет. Обычные нейросети любят «галлюцинировать» — уверенно выдумывать несуществующие факты. У меня база выверенная (уже около 4000 шаблонов для работы, учебы и самообразования). Результат всегда предсказуем.
Запустится на «утюге». Код легкий, оперативку не жрет, телефон не греется.
Минутка боли и инди-разработки:
Как и положено любому уважающему себя кустарному проекту, я собрал все возможные грабли. Денег на сервера у меня нет, поэтому сайт живет на бесплатном Google Sites (да, выглядит скромно, зато бесплатно).
Но самый дикий финт ушами я провернул с комьюнити. Все нормальные люди создают каналы в Telegram. Я посмотрел на это, представил кашу из сообщений и... ушел в корпоративный мессенджер «Пачка» (это наш аналог Slack). Да-да, проект для обычных людей, а поддержка — в корпоративном софте. Зато там можно разложить баг-репорты, идеи по шаблонам и флуд по разным полочкам (тредам), и никто никого не перебивает.А ещё работает без ВПН, тоже важный плюс.
Зачем я это выложил?
Маркетолог из меня, честно скажу, как из буханки хлеба троллейбус. Проект некоммерческий, рекламировать его бюджетов нет, а пользователям штука может зайти и реально сэкономить время (особенно ученикам и студентам, или тем, кто часто сидит без нормальной связи и хочет узнавать что-то новое, заниматься самообразованием, подходит даже учителям😀).
Если вам скучно в воскресенье или просто нужен полезный текстовый инструмент под рукой — заглядывайте, тестируйте, пинайте в комментариях.
Около года назад я открыл для себя замечательную игру Casual Crusade.
Это браузерный roguelike на HTML canvas, с полностью процедурной генерацией и отрисовкой графики, без богомерзких движков Unity и иже с ним.
Игра написана для конкурса js13k (лимит 13 килобайт) и переросла в одну из самых стройных и реиграбельных браузерных головоломок. С тех пор я возвращаюсь к ней почти каждый день.
Что в ней особенного? Механика проста: размещай цветные плитки на поле, собирай комбо, прокачивайся реликвиями и зельями, выживай против еретиков и боссов. Но за этой простотой скрывается удивительная глубина - каждый забег уникален, билды не повторяются, а случайные проклятия после боссов каждый раз ломают твою стратегию по-новому. Есть ежедневные испытания с набором случайных проклятий.
В игре есть незамысловатая "религиозная философия": герой бредёт вперёд без великой цели, собирая реликвии сомнительного происхождения, торгуясь с призрачными торговцами и принимая проклятия как данность. Никакого избранничества, никакого спасения мира - только Путь.
Игра с черным юмором обыгрывает историческую торговлю индульгенциями: грехи здесь прощаются за успешную резню, а божественное проклятие настигает не за жестокость, а за банальную жадность при вскрытии сундуков.
Есть и секретный квест, который, судя по таблице рекордов, никому еще не удалось разгадать.
Технически это показательная работа: весь игровой движок - рендер, физика, аудио, UI - написан с нуля на TS без единого фреймворка. Никакого Unity, никакого Phaser. Это делает код одновременно изящным и хрупким - идеальный материал для изучения и доработки.
Casual Crusade - это редкий пример игры, где минималистичный интерфейс и базовые правила порождают по-настоящему глубокий и интересный геймплей.
Меня игра, помимо необычной механики, зацепила также необходимостью самостоятельного изучения мира и правил. Есть наполеоновские планы углУбить эту ее строну.
Именно поэтому я деобфусцировал код и начал вносить мелкие правки. Игра затянула уже на уровне кода.
Сейчас я готовлю показать вам свою версию (будет готова в течение пары часов).
Список текущих правок за неделю:
- фикс нижнего отступа колоды/руки
- удалён устаревший код версий таблицы рекордов
- автоскрытие тултипа
- убрана тряска камеры при шаге Чувака
- случайное проклятие после убийства Босса
- добавлен экран проклятия (CurseScreen)
- никнейм скрыт в игре; тултип на полоске здоровья с именем и номером уровня
- режим паузы анимации (watchDog) со статичным экраном
- унификация обработки ввода (Pointer Events)
- максимум 10 карт в руке
- свайп вверх для перехода в полноэкранный режим
- обработка сетевых ошибок в таблице рекордов
- красный переход экрана перед уровнем Босса
- прочее
Для пикабушников будет доступно бесконечное количество попыток в ежедневном испытании (в оригинале только одна попытка).
Есть куча идей для новых механик, проклятий, заклинаний, врагов, ловушек, атласа-справочника по игре и системы ачивок.
В перспективе хочу сделать режим Прохождения с сюжетом.