Мамочкин Кодер
0,0
рейтинг
4 декабря 2015 в 10:50

Разработка → История о том, как я ОС в Minecraft писал из песочницы

Lua*
image

В далеком 2011 году мир увидел такую игру как Minecraft — воксельную песочницу, где каждый творит все, что душе угодно. Спустя некоторое время народные умельцы стали писать различные модификации для нее, делающие геймплей более разнообразным. Не так давно появился мод под названием «OpenComputers», добавляющий полноценные компьютеры, программируемые на скриптовом языке Lua. И в этой статье я хочу поделиться с вами небольшим опытом, приобретенным при изучении этого крайне интересного мода.

Изучаем мод


Если поставить перед собой компьютер и установить на него стандартную консольную ОС с местных дискет, то можно слегка разочароваться в функционале мода. По сути на старте мы имеем командую строку с довольно противно выглядящим интерфейсом, имеем набор стандартных команд по типу ls, edit <файл>, remove <файл> или mkdir <папка>.

image

Меня все это дело решительно не устраивало, и я решил добавить более приятные цвета к консоли и русифицировать подсказки для мода, благо автор позволил нам редактировать исходный код всех его наработок. Синтаксис Lua, его структура и возможности меня крайне удивили по сравнению с тем же недружелюбным к новичкам семейством СИ или еще более неказистой Java, в нем есть абсолютно все, что нужно «из коробки», а документация к моду написана простым популярным языком. Сначала я стал писать простенькие скрипты а-ля «Hello world», чуть позже позже я перешел на всякие мелкие программы для контроля дверей или освещения в игровом доме, но все это отдавало душком скуки и простоты. Хотелось хардкора!

image

Постепенно изучая местные библиотеки и особенности Lua, мы с моим другом смогли делать простенькие GUI-приложения. Пошарив по всяким википедиям, мы нашли несколько алгоритмов работы с цветом — например, для преобразования цвета из RGB в HSB формат или для наложения одного цвета на другой с учетом прозрачности. Немного повозившись, мы сумели реализовать эти алгоритмы на Lua, и так появилась наша первая библиотека для этого мода, мы назвали ее colorlib, а с ее помощью мы смогли накодить вот такую симпатичную палитру:

image

Решив не останавливаться на достигнутом, мы подумали, что классно было бы сделать графический редактор для этого мода, а также свой формат изображения. Действительно, почему бы нет? Так мы смогли бы легко рисовать красивую графику на мониторе. Провозившись несколько дней, мой товарищ сумел реализовать грамотную структуру файлов будущих картинок, которая кушала крайне мало места на местных жестких дисках, которые, к слову, имеют ограниченный объем в 4 МБ. Аббревиатуру формата мы обозначили как ".pic", а сам формат назвали «OpenComputers Image Format», сокращенно «ocif». После всего этого мы приступили к созданию самого графического редактора, потратив на это около трех дней. В итоге мы имеем вот это:

image

Структуру файла .pic в шестнадцатеричном виде можно лицезреть на этой картинке:

image

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

image

Или приложение, генерирующее цифровой дождь из всем известного фильма:

image

В конце концов у нас скопилось столько различных скриптов и библиотек, что мы утомились загружать их вручную cтандартным методом через Pastebin.com. Да, мод имеет интеграцию с пастбином, поэтому все наши файлы мы хранили изначально на нем, загружая их по мере необходимости на компьютеры. Но учитывая количество файлов, нами было принято решение о создании программы-инсталлятора, автоматически загружающей список файлов с нашего репозитория на GitHub, а затем скачивающей файлы по списку в нужную директорию. Было довольно много геморроя с переносом файлов с Pastebin'a, но через пару часов мы управились с задачей и приступили к кодингу инсталлятора. В итоге вышло вот что:

image

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

image

Нарисовав основные иконки, я приступил к созданию самой операционной системы, сразу дав ей название «MineOS». Основная концепция очень проста: в папке MineOS/Desktop/ лежат файлы любого типа. С помощью стандартной функции getFileList() мы получаем список файлов, получаем формат файла через обрезку строкового имени файла, а затем рисуем на нашем экране иконки в соответствии с полученным форматом. Вышло что-то вроде этого:

image

Затем я приделал нижнее меню в стиле Mac OS, добавил меню сверху, накодил библиотеку контекстного взаимодействия — и в итоге мы имеем уже нечто, достойное названия «графическая оболочка», но до полноценной ОС это пока что не дотягивало.

image

У всего есть свои недостатки: местные «видеокарты», предоставляемые модом, имеют ограниченное количество операций, которые они могут сделать за игровой тик. Под операциями подразумевается изменение цвета текста, цвета фона, установка символа и т.п. Нетрудно себе представить, какое количество операций требовалось на отрисовку наших картинок и уж тем более на отрисовку рабочего стола. Но самая большая печаль заключалась в том, что мне необходимо было перерисовывать рабочий стол полностью, если, например, открыть контекстное меню или запустить какой-нибудь файл. Но тут на помощь мне пришел еще один товарищ и посоветовал написать алгоритм двойной буферизации изображения. Для тех, кто не в курсе, поясню вкратце его суть: в оперативной памяти у нас находятся два массива изображения: первый содержит информацию о пикселях, которые в данный момент отображены на экране, а второй — информацию о пикселях, которые мы хотим отрисовать. Затем при помощи вызова функции расчета алгоритм сверяет эти два массива и выводит на экран не все пиксели, а только лишь измененные. А затем присваивает первому массиву значение второго.

image

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

image

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

image

Затем я накодил красивый файловый менеджер в стиле Finder из все той же Mac OS, и интегрировал его в систему. Добавил также сортировку файлов по имени, типу и дате изменения, добавил скрытие формата изображения, добавил меню «избранное». В итоге имеем следующее:

image

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

image

image

image

image

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

image

Итак, наша ОС готова! В совокупности мы имеем порядка 28 собственных библиотек, при этом некоторые из них имеют более 2-х тысяч строк кода. Также мы имеем около 30 качественных GUI-приложений. От начала изучения мода и до нынешнего времени прошел почти год, при этом программировали мы далеко не каждый день и не каждую неделю. Таким вот образом и написалась эта операционная система, а вслед за ней и эта статья.

Как скачать?


Если вам хочется пощупать эту ОС своими руками, то милости прошу, вот краткая инструкция: ставите на землю корпус компьютера, присоединяете к нему монитор, а к монитору прикрепляете клавиатуру. Затем вставляете в корпус лучшую видеокарту, процессор, оперативную память, жесткий диск, Lua-биос, стандартную дискету с OpenOS (скриптами автора мода), а также интернет-карту (не сетевую, а именно интернет).

image

Затем включаете компьютер, ждете, пока система загрузится с дискеты, а затем вводите в консоль команду install. Далее выбираете цифру жесткого диска, жмете enter, и система поставится. Далее перезагружаете компьютер.

image

Теперь ваш комп готов к установке уже моей операционной системы. Вводите в консоль команду pastebin run 0nm5b1ju, жмете enter и следуете инструкциям на экране. Желаю приятного использования.

Итог


Зачем, собственно, я писал эту статью? Мне хотелось показать людям, что на любом языке и в любой среде можно создать маленький, не побоюсь этого слова, шедевр. Еще полтора года назад я крайне смутно представлял себе, что такое «функция», «массив» или «класс», а теперь мы с товарищами кодим собственную мини-ОС. Главное — иметь свободное время и желание его потратить с пользой и с удовольствием, лично для меня нет большего кайфа, чем кодить всякую ерунду в любимой игре. Желаю всем начинающим и не очень начинающим программистам творческих успехов!



Исходники


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

Авторы


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

Игорь @IgorTimofeev
карма
20,0
рейтинг 0,0
Мамочкин Кодер
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (125)

  • +2
    А ссылочку на гитхаб?
    • +85
      • +16
        Оценил шутку только после перехода по ссылке %)
        • +13
          У вас эта ссылка отобразилась как непосещенная? :)
          • +1
            Да, на главной гитхаба не бываю, только в репозиториях
        • +1
          Не активные пользователи оценили шутку только после перехода %)
    • +1
  • +18
    Только это не ОС, а графическая оболочка к ней.
    • +4
      Продолжая логику комментария, было бы интересно прочитать подобную статью про саму OpenOS и принципы её работы внутри Minecraft
      • +2
        Обычная машина с Lua, некоторые апи языки переписаны для адаптации под Minecraft (например функция получения текущего времени возвращает игровое время, а не реальное), ну и добавлены апи для работы с блоками и карточками. Шелл, который мимикрирует под bash и вообще OpenOS пытается быть минилинуксом. Ничего сверхординарного там нет.
  • +3
    Ой чувствую что 0x10c таки выйдет. Своя ось уже есть, осталось только добавить космический корабль и перенести главного героя в космос.
    • 0
      GalactiCraft
      • +1
        StarCraft же!
        • 0
          Я про мод для майна говорил.
    • +5
      Нет, осталось в эту «ось» перенести сам minecraft, дабы играть в minecraft в minecraft'е, ну и далее по рекурсии.
      • 0
        13й этаж, однако
  • +6
    Хм. В команде KolibriOS всегда пригодятся лишние руки ;)
    • +1
      Именно такие руки там нужны? :)
      • 0
        Ну, это можно скриптом выпиливать, если он код нормальный будет писать :D
        • 0
          Нет, ну вы посмотрите на это github.com/IgorTimofeev/OpenComputers/commits/master :)
          Мне кажется, после прихода этого разработчика, вам прийдется сосредоточить усилия на скрипте, который будет за ним подчищать.
          • 0
            Ок, ок, беру свои слова назад. А вам вот печеньку, хотите? :)
  • +6
    Вирусы для майнкрафта ещё не писали?
    • +3
      Писали-писали. Делали и «синие экраны», и полное удаление всех файлов, и инжект в код стандартной OpenOS, чтобы сложнее было обнаружить вирус. Делали так, что раз в 2 минуты компьютер выдавал окно с текстом «требую печеньки». В общем, много чего там можно сделать, чтобы испортить жизнь юзерам.
      • +3
        Предлагаю написать под неё RDP клиент и ходить с него на свое рабочее место.
        • 0
          Тоже писали, и даже работала система. Правда, медленно, т.к. автор ограничил количество пакетов, передаваемых за раз через игровые модемы. Можно, конечно, сделать через реальные php-скрипты, чтобы, например, управлять игровым компом с браузера, но в php я полный ноль. Такие дела.
  • 0
    >>Затем я добавил поддержку обоев, затем я написал файловый менеджер, затем…
    Респект, так между делом несколько тысяч строк кода написал, просто по приколу, круто :)
  • +14
    Теперь под эту ось майнкрафт написать нужно.
    • +10
      Это было бы одно из самых интересных рекурсивных разбирательств по авторскому праву.
      • 0
        Видел в просторах ютуба видюшки с «фотошопом» от этого автора и игрой 2д майнкрафт.
      • 0
        Ну да. Особенно в связи с упомянутой комментарием ниже лицензии для самой ОС.
  • +16
    А лицензия-то шедевральна! Как раз для пятницы.
    • +2
      Меня вопрос почему-то очень беспокоит, а как вам вообще пришло в голову читать лицензию этой ОС? :)
      • +5
        Я ожидал такого вопроса. Привычка у меня такая, обычно я всегда автоматически лезу в папку вендоров, чтобы посмотреть, какие сторонние решения используются.
    • +6
      github.com/IgorTimofeev/OpenComputers/blob/master/MineOS/OS.lua#L6-L12 Давайте плюсовать человека.
    • 0
      шикарная лицензия :) Надо только уточнить, что рабство пожизненное :)
  • +1
    То чувство, когда ты следил за появлением сего проекта ещё на YouTube, а теперь видишь статью на хабре, это, однако, доставляет =)
  • 0
    Существует майнкрафт в майнкрафте: www.youtube.com/watch?v=GwHBaSySHmo
  • +7
    Идея создания операционной системы пришла как-то сама собой, и, недолго думая, я решил сделать несколько набросков иконок для будущей ОС


    Читаю курс в университете по операционным системам. Теперь только понял, что самое главное в ОС :)
    • +2
      Главное – это нескучные обои. Так что автор в итоге всё сделал правильно :)
    • +2
      Автор готов работать в Apple :v
  • 0
    Игорь, я из QuickBlox, нам было бы интересно запустить чат (мессенджер, звонки, push notifications) для Minecraft, как считаете:
    1) будет ли это востребовано в рамках OpenComputers и вне его
    2) лучше самим делать или посотрудничать с кем-то типа вашей команды?
    • 0
      На OpenComputers уже имеется мессенджер, подключающийся к IRC, и им пользуются, в основном, гики и крайне узкий круг лиц. Обычным пользователям больше нравится писать скрипты для роботов, как-то взаимодействовать с игровым миром, а не общаться через эти компы (сужу исключительно по опыту администратора сервера), так что не думаю, что еще один сервис будет востребован. Но чисто ради забавы и кодерского любопытства было бы интересно написать клиент для вашего сервиса. Хотя я во всех этих сетевых протоколах довольно слабо разбираюсь, и вряд ли смогу накодить это сам.
      • 0
        Спасибо за ответ. А вне OpenComputers имеет смысл или все пользуются обычным IRC подобным / консольным чатом?
        • 0
          Ну, в самом Minecraft, как правило, пользуются обычным игровым чатом, не заморачиваясь на все эти технологичные приблуды. Иногда на серверах ставят моды для голосовой связи, такие как Gliby's Voice Chat, так что если и делать свой способ общения, то как-то в этом стиле, через модификации или плагины.
  • –1
    Товарищ разработчик) вещь наикрутейшая) Огромнющий лайк)
  • 0
    Автор забыл прикрепить видео обзор: https://youtu.be/nYvSoLz4JNQ
  • –3
    По сравнению с «недружелюбным к новичкам семейством СИ», LUA — ОТВРАТИТЕЛЬНЫЙ язык. К сожалению, приходилось по работе на нём кодить.
    • 0
      На вкус и цвет, как говорится… Насколько я его знаю (тоже на работе имел с ним дело немного) — язык как язык. Обычный скриптовый прототип-ориентированный язык, вроде java script.
    • +2
      Да теперь после полугода кодинга на Lua, автор и Си влет освоит :)

      Кстати, чтобы не писали про модные свифты-питоны-java, а С — он рулез. Это почти ассемблер, когда смотришь в код, и понимаешь почти до уровня ячейки памяти как это работает. Так что настоятельно советую автору его изучить.

      Еще добавлю, лучше купить Raspberry PI и осваивать Си на нем. Это более настоящий хардкор, когда код реально на удаленной железке работает, и куда интереснее, чем нарисованные байты на нарисованном компьютере гонять (имхо конечно).
      • –7
        Дело в том, что я не люблю языки с некрасивым синтаксисом или непонятными обозначениями стандартных функций. Не люблю все эти скобочки, звездочки, стрелочки — фу, гадость абстрактная. Я не хочу понимать что-то «до уровня ячейки памяти», мне искренне все равно, как оно там работает. Я хочу просто сидеть и кодить полезные и графонистые штучки без мозготраха.

        Вообще, идеального языка пока что не встречал — что в C#, что C++ отсутствует большинство необходимых мне функций для старта написания софта, а если они и есть, то реализованы не для людей. В Lua отсутствует понятие «указатель» и понятие «класс», что порой затрудняет работу и заставляет писать костыли. В Java приходится создавать отдельный класс для каждой мелочи, это я вообще считаю верхом безумия. Про Python лучше промолчу. Но все это, конечно, субъективные впечатления человека, слабо знакомого с этими языками и работавшего с ними от силы пару дней — однако именно по первым ощущениям и складывается общее отношение к языку. Если ты элементарно не можешь перевести int в string одной стандартной функцией — то весь язык я сразу считаю кучкой кала. Интересно, сложно ли написать свой язык…
        • +1
          Любой синтаксис — вопрос пары дней и привычки. Главное понимать суть, как это работает. И все эти «звездочки и скобочки» (прикольное определение кстати:) как раз позволяют сделать что-то на низком уровне эффективно и без костылей.

          Если хочется «просто и быстро» — питон как раз самое то :)

          «сложно ли написать свой язык» — интерпретатор Lua написан на С, кстати.
        • 0
          Ну это потому что пару дней,
          в С/C++ уже все реализовано, причем, как правило, до вашего и моего рождения.
          Python очень удобен, и тоже все что можете придумать, уже реализовано кем-то.
          По первым впечатлениям о ЯП можно хоть как-то объективно судить имея огромный опыт работы с другими, иначе первые впечатления ошибочны.
          Хотя после скриптовых языков звездочки могут и напугать, но это и есть отличие «низкоуровневых» языков.
          • 0
            Я имел в виду реализацию всех необходимых функций «из коробки», без необходимости поиска встроенных или сторонних библиотек. Люблю, когда даже самый отбитый новичок сразу осваивается в данной среде — это и есть признак хорошего и грамотно сконструированного языка. Имхо, конечно.

            Ну, а так-то разобраться в плюсах или шарпе не столь уж и сложно при должном желании — противно в этих дебрях копаться, вот и все :)
            • +2
              Вы сейчас описали PHP как хороший и грамотно сконструированный язык.
              • 0
                Ага. Но ситаксис убог, слишком много «иероглифов», поэтому увы и ах.
        • 0
          что в C#, что C++ отсутствует большинство необходимых мне функций для старта написания софта, а если они и есть, то реализованы не для людей.

          Пример (для C#) можете привести?
          • –4
            Легко.

            Отсутствует сериализация массивов в строку и наоборот, отсутствуют алгоритмы хеширования SHA2 и MD5, отсутствует адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов. Разумеется, все это легко исправляется поиском по гуглу и скачиванием сторонних библиотек, зачастую очень и очень неплохих, однако сейчас у нас 2015 год на дворе, и в современном языке я хочу видеть максимум удобства, благо не в пещерном веке живем.
            • +1
              Вы точно не путаете язык и базовую библиотеку?

              Отсутствует сериализация массивов в строку

              Вы, наверное, JSON имеете в виду? JavaScriptSerializer (хотя Json.net лучше, не зря более поздние версии на него перешли).

              отсутствуют алгоритмы хеширования SHA2 и MD5

              Серьезно?

              MD5, SHA256, SHA384, SHA512.

              адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов

              HttpClient.
              • –4
                Вы, наверное, JSON имеете в виду? JavaScriptSerializer (хотя Json.net лучше, не зря более поздние версии на него перешли).

                Нет, я имею в виду именно массивы, а также сериализацию классов и функций. JSON-генератор и -парсер не нужен.
                Серьезно?
                MD5, SHA256, SHA384, SHA512.

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

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

                  Если вам нужна сериализация в бинарный поток — то берите встроенную. Если в строку, то вам придется выбрать формат. Чем JSON хуже других?

                  Неадекватная библиотека

                  Аргументы в студию.

                  чтобы выполнить простую задачу, нужно проделать туеву хучу операций

                  Например?

                  Она имеет слишком много схожих методов с крайне непродуманными названиями и аргументами,

                  Примеры в студию.

                  (BTW, библиотека не может иметь методы и аргументы.)
                  • –8
                    Если вам нужна сериализация в бинарный поток — то берите встроенную. Если в строку, то вам придется выбрать формат. Чем JSON хуже других?

                    Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода. И все тут, безо всяких джсонов, хуенов, потоков и прочей лабуды, которую так часто приходится писать во языках семейства СИ. Хотя надо признать, что в шарпе лабуды в разы меньше, это факт, да.
                    Аргументы в студию

                    Без проблем, сейчас пошарюсь по харду, найду старые проекты на шарпе, затерянные под вековой пылью, найду в них костыльный участок кода на HttpClient и немедленно отпишусь, чтобы удовлетворить ваше любопытство, минуток 10 подождите. А если серьезно, то в чем проблема вообще? Я высказал свою позицию, что лично мне не нравится эта либа, ибо прекрасно помню, какой с ней был геморрой на старте изучения шарпа, а если у вас данной проблемы не возникало, то остается только искренне порадоваться за вас, вот и все. Аргументы вам подавай, ишь ты! Говно-либа, сложна в освоении. Годится такой аргумент? Вот и все, не надо разводить демагогию в комментах, лучше кодить пойдемте, это всяко полезнее.
                    • +1
                      Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода.

                      Зачем?

                      Я высказал свою позицию, что лично мне не нравится эта либа,

                      Неа. Вы высказали, что «отсутствует адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов», «Неадекватная библиотека, чтобы выполнить простую задачу, нужно проделать туеву хучу операций» и «Она имеет слишком много схожих методов с крайне непродуманными названиями и аргументами».

                      Это не «мне не нравится».
                      • –4
                        Зачем?

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

                        Именно по перечисленным вами моим высказываниям данная либа мне не нравится. Это обобщающий речевой оборот, выражающий вкратце мое отношение к либе.
                        • +1
                          Вот же ж упорный человек, а? Потому что нужно.

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

                          Именно по перечисленным вами моим высказываниям данная либа мне не нравится.

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

                          Собственно, вот: " Говно-либа, сложна в освоении. Годится такой аргумент?".

                          Нет, не годится. Не либа (омг, в .net вообще нет такого понятия) сложна в освоении, а вы не осилили ее освоить. Чувствуете разницу?
                          • –4
                            Это неправильная постановка задачи.

                            Что ж тут неправильного и непонятного? Требуется функция, конвертирующая класс, массив или функцию в строку, и возвращающая эту строку. Опционально хотелось бы получать строку в человекочитабельном варианте с \n, чтобы ее впоследствии было легко парсить. Хватит казуистикой заниматься, тут и обезьяна поймет, о чем речь.
                            Нет, не годится. Не либа (омг, в .net вообще нет такого понятия) сложна в освоении, а вы не осилили ее освоить. Чувствуете разницу?

                            Ну не годится и не годится, переживу как-нибудь. А разницы не чувствую, ибо не освоить что-то можно лишь по одной причине: осваиваемый объект создает искусственные трудности в освоении. Каким бы ни был юнит, осваивающий этот объект — умным, глупым или одноклеточным — сложность осваиваемости задается именно создателем осваиваемого объекта. Любой объект можно создать универсальным, чтобы его суть понял даже конченный дебил с задержками в развитии (на то и существуют методы рефакторинга кода), а можно создать способом, понятным лишь кругу лиц, в котором находится автор — на все воля автора. Собственно, в случае с HttpClient мы имеем второй вариант. Говно-либа, неудобная в использовании.
                            • 0
                              Требуется функция, конвертирующая класс, массив или функцию в строку, и возвращающая эту строку.

                              Ох. Как вы себе представляете конверсию в строку класса или функции?

                              А для объектов (массив — частный случай объекта) прекрасно работает уже упомянутый выше JSON.

                              Что ж тут неправильного и непонятного?

                              То, что вы говорите «хочу сконвертировать х в строку», но не говорите, зачем вам это надо. Хотя то, зачем это надо, важнее — возможно, вам на самом деле надо не в строку, а в передаваемый формат.

                              А разницы не чувствую, ибо не освоить что-то можно лишь по одной причине: осваиваемый объект создает искусственные трудности в освоении

                              Неа. Бывает еще так, что осваивающий субъект не приспособлен для освоения.

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

                              Вы про essential complexity никогда не слышали?

                              Собственно, в случае с HttpClient мы имеем второй вариант. Говно-либа, неудобная в использовании.

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

                              С моей точки зрения, у HttpClient (да и вообще System.Net.Http) как раз один из самых разумных интерфейсов для работы с HTTP, достаточно близкий к протоколу, но при этом еще не избыточно детальный.
                              • –3
                                Ох. Как вы себе представляете конверсию в строку класса или функции?

                                void funkcia()
                                {
                                   print("bla-bla");
                                }
                                
                                string stroka = toString(funkciya)
                                

                                А как именно? Что ж, меня это не особо волнует — в опенкомпах из поста есть стандартная либа для сериализации таблиц и функций, в C# нет, вот и все. Собственно, в нашей дискуссии и шла речь о том, каких функций мне не хватает в базовом C#.

                                А примеры касательно Http мне лень приводить, все равно мое мнение останется на своем должном месте, а ваше на своем. Вы слишком занудный собеседник для меня, акцентирующий внимание на мелочах, на которые я обычно кладу болт. Боюсь, если я приведу примеры, то наша милая беседа затянется на куда большее количество символов, а символы — это, между прочим, физический труд в плане нажатия на клавиши. Так что лень-матушка взяла свое.
                                • +1
                                  string stroka = toString(funkciya)


                                  И что же этот вызов должен вернуть?
                                • +1
                                  void funkcia()
                                  {
                                     print("bla-bla");
                                  }
                                  string stroka = toString(funkciya)
                                  

                                  А как именно? Что ж, меня это не особо волнует

                                  А, это легко.

                                  Action funkcia = () => {Console.WriteLine("bla-bla");};
                                  string stroka = funkciya.ToString();
                                  


                                  в опенкомпах из поста есть стандартная либа для сериализации таблиц и функций

                                  Кстати, а можно ссылочку на эту «стандартную либу»?

                                  А примеры касательно Http мне лень приводить

                                  Подозреваю, что и с его освоением было то же самое — лень разбираться, проще говном назвать.
                                  • –4
                                    А, это легко.

                                    Что за глупости? Мне нужен не результат выполнения функции, а строковое представление структуры самой функции со всем содержимым и значениями переменных. Т.е. как записал ее в изначальном коде — такой и должен быть вывод, с той лишь разницей, что переменные могут быть изменены извне. То же самое касается и массивов, и классов.
                                    Кстати, а можно ссылочку на эту «стандартную либу»?

                                    Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib. Очень простая и лаконичная библиотека, проходящаяся через цикл по структуре массива или функции, реализовать ее легко даже с базовыми знаниями Lua, ну, и при условии, что вы умеете юзать регулярки. Правда, она не совсем оптимизирована в плане расхода на память, т.к. использует быдлокодерскую конкатенацию строк, но в целом понять ее суть легко.
                                    Подозреваю, что и с его освоением было то же самое — лень разбираться, проще говном назвать.

                                    Именно так. Если либа трудна в освоении по сравнению с остальными либами, идущими вместе с данной либой в комплекте, то данная либа является говном. Все очень просто и логично.
                                    • +1
                                      Что за глупости? Мне нужен не результат выполнения функции

                                      А это не результат выполнения функции.

                                      Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib.

                                      Это вот это API?

                                      реализовать ее легко даже с базовыми знаниями Lua

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

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

                                      … а что с ней «идет в комплекте», мне вот интересно? Ну и да, я вас еще раз спрошу: вы про понятие essential complexity не слышали?

                                      Впрочем, не суть. Если кому-то что-то трудно в освоении, но он не может привести конкретных недостатков — то это его личные проблемы. Кому-то вот принципиально не даются указатели — это же не значит, что указатели говно.
                                      • –3
                                        вы про понятие essential complexity не слышали

                                        Слышал-слышал, забавная статья, которую обосрали уже все, кому только не лень. Моя личная позиция по данному вопросу такова: любая софтина или либа обязана быть одновременно простой для начинающих и максимально гибкой для «шарящих». Любое отклонение в ту (Internet API OpenComputers) или иную (HttpClient) сторону не является правильным и требует рефакторинга кода.
                                        Кому-то вот принципиально не даются указатели — это же не значит, что указатели говно.

                                        Лично мне даются и указатели, и апи для запросов, и все, что я пожелаю. Вопрос лишь в том, как долго я осваиваю указанный материал. Если быстро — система хороша, и я искренне благодарю батьку-девелопера за простоту и доступность этой системы, если медленно — система является скучным говном, как правило, с кучей модульных функций. О чем мы дискуссию-то ведем вообще? Вам нравится этот HttpClient, мне нет. В чем проблема-то? Зачем по пустякам заводить длинные ветки обсуждения?
                                        • +1
                                          забавная статья

                                          Я не знаю, о какой статье вы говорите.

                                          Вам нравится этот HttpClient, мне нет. В чем проблема-то?

                                          Вот в этом утверждении: «система является скучным говном, как правило, с кучей модульных функций». Вы продолжаете не видеть разницы между «я не осилил» и «система — говно».
                                          • –2
                                            Я не знаю, о какой статье вы говорите

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

                                            Неверно, ибо либу я осилил. Мне она неудобна в использовании, поэтому перешел на более простую версию с двумя методами, соответствующую моим требованиям.
                                            • +1
                                              Вы выписываете термин из довольно изестной статьи, и не знаете, о чем я говорю?

                                              Этот термин давно перерос эту статью.

                                              Мне она неудобна в использовании, поэтому перешел на более простую версию с двумя методами, соответствующую моим требованиям.

                                              Вам неудобна. Никакого отношения к ее вкусовым качествам это не имеет.
                                    • +1
                                      void funkcia()
                                      {
                                         print("bla-bla");
                                      }
                                      
                                      string stroka = toString(funkciya)
                                      

                                      Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib. Очень простая и лаконичная библиотека, проходящаяся через цикл по структуре массива или функции, реализовать ее легко даже с базовыми знаниями Lua, ну, и при условии, что вы умеете юзать регулярки. Правда, она не совсем оптимизирована в плане расхода на память, т.к. использует быдлокодерскую конкатенацию строк, но в целом понять ее суть легко.

                                      Вы противоречите сами себе, ибо в документации к этому самому «serialization» написано прямым текстом:
                                      serialization.serialize(value: any except functions[, pretty:boolean]): string
                                      • –2
                                        Никто никому не противоречит, ибо эта функция предназначена для сериализации таблиц, в которых может содержать все, что угодно, если это все не закрыто в теле цикла. Функции также сериализуются в виде строки, это проверено мною лично на практике и часто используется для дебага. Ну, а если запихнуть в нее число или просто строку, то она выдаст nil, т. е. ничего. Так что any туда не запихнешь, автор вики неверно указал типы.
                                        • 0
                                          Дайте ссылку на исходник (ну или выложите на gist/pastebin). Текущая реализация прямо противоречит тому, что вы говорите. Ну или вы говорите про другое API вообще.
                                          • –3
                                            Эта реализация и есть то, о чем я говорю. Судя по всему, вы не поняли моих требований к ее функционалу, постоянно переспрашивая то про JSON, то еще про что-то, поэтому и возникает такой вот диссонанс. В любом случае, эта либа — именно то, чего мне не хватало в шарпе, на этом и покончим.
                                            • +2
                                              Эта реализация и есть то, о чем я говорю.

                                              Что, правда?

                                              Ну, а если запихнуть в нее число или просто строку, то она выдаст nil, т. е. ничего.

                                                  elseif t == "number" then
                                                    if v ~= v then
                                                      return "0/0"
                                                    elseif v == math.huge then
                                                      return "math.huge"
                                                    elseif v == -math.huge then
                                                      return "-math.huge"
                                                    else
                                                      return tostring(v)
                                                    end
                                                  elseif t == "string" then
                                                    return string.format("%q", v):gsub("\\\n","\\n")
                                              


                                              Функции также сериализуются в виде строки,

                                                  else --отдельного обработчика для function нет
                                                    if pretty then
                                                      return tostring(t)
                                                    else
                                                      error("unsupported type: " .. t)
                                                    end
                                                  end
                                              


                                              Иными словами, если включен pretty, то вернется tostring от функции, то есть строчка приблизительно вот такого вида: «function: 0xb0bf00» (или вы хотите сказать, что OpenComputers переопределяет tostring для функций?). Если pretty выключен, будет ошибка. Никакой сериализации тела функции в этом апи нет.

                                              В любом случае, эта либа — именно то, чего мне не хватало в шарпе, на этом и покончим.

                                              Э нет. Вот как раз аналогов «этой либы» в шарпе сколько угодно, начиная от встроенной сериализации и заканчивая любой другой на вкус.
                                        • +1
                                          Назовите хоть одну ситуацию, где может потребоваться тело функции сериализовать в строку и обратно. За все несколько лет что я занимаюсь программированием такой необходимости у меня ни разу не было.
                                          • –3
                                            Иными словами, если включен pretty, то вернется tostring от функции

                                            Товарищ, вы бы хоть потестировали либу для начала вместо анализа ее кода. Аргумент Pretty сериализует массив не в таком виде

                                            {["privet"] = 123, ["hello"] = {["test"] = 12}}
                                            

                                            А в таком:

                                            {
                                              ["privet"] = 123,
                                              ["hello"] = {
                                                ["test"] = 12
                                              }
                                            }
                                            


                                            Иными словами, Pretty добавляет \n в конце каждого элемента для лучшей читабельности, вот и все. Не надо додумывать функционал на основе кода — поработайте с библиотекой сами, а потом уже пишите.
                                            • +3
                                              Иными словами, если включен pretty, то вернется tostring от функции

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

                                              Было бы удивительно, если бы при вызове для функции вернулся сериализованный массив.
                                              Вот и все. Не надо додумывать функционал на основе кода — поработайте с библиотекой сами, а потом уже пишите.

                                              Вы додумываете его даже не смотря в код :) В библиотеке нет сериализатора для функций, в документации написано что его нет, но у вас он неожиданно появляется. Быть может, отправите автору библиотеки пулл-реквест с этой фичей?
                                            • +3
                                              Иными словами, Pretty добавляет \n в конце каждого элемента для лучшей читабельности, вот и все.

                                              В коде, как мы видим, написано иное.

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

                                              А смысл, если в коде все написано? Мне еще не хватало тут среду под Lua разворачивать.
                    • 0
                      >> Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода. И все тут, безо всяких джсонов, хуенов, потоков и прочей лабуды

                      Тогда странно, что Вам не понравился питон.
                      • 0
                        Ну и раз пошла такая пьянка, код (тело) питоновской функции там тоже несложно вывести в виде текста.
                        • +1
                          Вот только… зачем? :)
                          • +1
                            Вывод структур в stdout для отладки консольных скриптов очень часто бывает полезен. Одной строчкой я получаю список методов или свойств неизвестного мне объекта, который написан кем-то, кто не потрудился оставить документацию. Порой это бывает быстрее, чем лезть в сам модуль и смотреть его методы.

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

                  www.lmgtfy.com/?q=.net+sha-2
            • +2
              Разумеется, все это легко исправляется поиском по гуглу и скачиванием сторонних библиотек, зачастую очень и очень неплохих, однако сейчас у нас 2015 год на дворе, и в современном языке я хочу видеть максимум удобства, благо не в пещерном веке живем.

              В Ruby, к примеру, «поиск и скачивание сторонних библиотек» — это чуть ли не идеология.
              Все вышеперечисленное вами в C# уже есть, и ничего искать/качать не нужно. А когда появляется все же такая необходимость, большинство пакетов можно найти в nuget и скачать+подключить их одной кнопкой.
        • –1
          > Интересно, сложно ли написать свой язык…

          Интересно Ваше мнение по синтаксису для учебного языка из http://habrahabr.ru/post/219419/
          • 0
            Странный он какой-то. Не люблю лишних знаков в основных операторах. Зачем использовать := для присваивания, а == для проверки истинности? И что за =/= для проверки на неравенство, зачем аж 3 символа использовать? Вон, в BASIC было идеально в этом плане: и присваиваешь через =, и условия проверяешь в стиле IF A = B THEN B = C ENDIF, все было элементарно. Опять же, в современном языке все должно быть интеллектуально, он сам должен понимать, где присвоение, а где проверка истины. Да и массивы по вашей ссылке там явно будут в стиле СИ. То ли дело таблицы Lua, в которые пихай что хочешь: хоть функции, хоть другие таблицы, хоть строки, хоть числа, хоть все вместе. В современном языке должны быть именно такие массивы, а то и еще лучше.
            • +3
              в современном языке все должно быть интеллектуально, он сам должен понимать, где присвоение, а где проверка истины


              bool a, b, c;
              a = b = c;
              


              Разбирайтесь.
              • 0
                а равно истина если б равно ц и ложь, если не равно
                и кстати видел это на практике в 1с :)
                • 0
                  А почему не а и б равно ц?
            • –1
              В современном языке должны быть именно такие массивы, а то и еще лучше.

              Это намек на слабо-типизированные ЯП с динамическими структурами данных?

              Для обучения, я бы наоборот отдаю предпочтение строго-типизированному языку с избыточным синтаксисом. Где наглядно видно: какие структуры данных мы имеем, как мы их преобразуем в другие структуры данных. Операции довольно многословны и ясны.

              Таким образом ученикам будет понятны процессы, производимые с данными, а для обучения это важно. Но опять таки, обучение чему? Если делаешь из человека повара, который слепит кашу из кода, то слабо-типизированные языки вполне хороши в таком контексте.
              • –3
                Это дело вкуса. Мне абсолютно все равно, какие структуры данных мы имеем, мне совершенно не интересно понимать процессы при написании элементарных программ (консольный калькулятор, графопостроитель и прочая элементарная чушь, которую дают в типичных универах как задание чаще всего). При обучении (я подчеркиваю, при обучении) я хочу просто кодить, понимать суть языка, понимать основы. А если потребуются какие-то дополнительные знания по конкретному вопросу, будь то оптимизация воксельного приложения через указатели — это не проблема, я просто беру и изучаю доп. материал при возникновении необходимости.

                К слову, на платных курсах по C#, которые ведет моя хорошая знакомая, практически никогда не заостряется внимание на типизации данных. Люди просто получают задание и творят маленькие шедевры, получая за это хорошие деньги, при необходимости, опять же, спрашивая у лектора, как можно оптимизировать проект. Это в моем понимании и есть настоящее обучение программированию, когда ты программируешь, а не страдаешь ерундой, доказывая что-то ноунейму в комментариях.
                • 0
                  Подчеркиваю, для обучения. Вас могут посадить расчитывать полеты ракет после недельного курса математики и физики, но результат будет плачевный.
                  Вы оглядываетесь вокруг и видите таких же ребят, которые сели писать, и потихоньку подтягивают матчасть.
                  В свою очередь, я говорю о том, что учить нужно процессам, а поняв процессы, программисты могут спокойно кодить хоть на своем не-типизированном языке, хоть на луа, хоть на джаваскрипте, шарпах, питонах, явах. Но понимая процессы, они не будут лажать на ровном месте.
                  • –2
                    А я тоже подчеркиваю, для обучения я бы не выбрал курсы, где мусолят лишь теоретическую часть, отдавая ей основное предпочтение — это устаревший и непродуктивный метод обучения. Нет ничего плохого в том, чтобы разбираться в типах данных и уметь грамотно их использовать, плохо — когда матчасть занимает основную нишу учебного процесса. Я человек-практик, привык изучать теорию в процессе кодинга, и почему-то я до сих пор никогда не лажал на ровном месте, ровно как и большинство моих товарищей, ибо курсы были хорошие, а преподаватель явлалась крутой, умнющей девкой, и знала свое дело.
                    • +3
                      почему-то я до сих пор никогда не лажал на ровном мест

                      Это пишет человек, который не нашел в .net SHA-2?
                    • +2
                      Вы пока еще ничего серьезного не сделали, где можно «налажать». «Налажать» очень субъективная оценка. Если оценивать ваш код с позиции модульности, ре-юзабельности, то вдруг окажется, что он не отвечает этим требованиям.
                      Попробуйте какой ни будь этнерпрайз проект, где будут люди, которые будут указывать на ваши ошибки. Вы сейчас наверное делаете проекты или для себя или для развлечения с ребятами, у которых точно такие же навыки программирования как и у вас. Кто же вам будет указывать на ошибки? Конечно никто, вот у вас и складывается ошибочное впечатление, что все супер, я нигде не лажаю. Но есть работа, где платят деньги и вот как раз там ты и начинаешь набивать все шишки.
                      где мусолят лишь теоретическую часть, отдавая ей основное предпочтение — это устаревший и непродуктивный метод обучения.

                      Скажу так — я тоже много времени трачу на практику, но в последнее время приходит понимание, что практика без теории — это хождение в сумерках. Вроде бы ясно, но уверенность и чистота понимания приходят только с прочтением теории, особенностей языков, после разбиения процессов на составные части.
              • –2
                Добавлю еще, что «поваров» я вижу везде: как в шарпе, так и в плюсах, бейсике, луа, питоне или явке. Говнокод неистребим, и нечего винить слабую типизацию языка в безалаберности юных кодеров. Лично у меня все работает одинаково хорошо как на сишных структурах, так и на луавских, а проблем из-за типов данных никогда не возникало.
            • –1
              По-доброму завидую Вашему таланту программиста, но напоминаю, что искусство состоит в написании кода, который могут прочитать, оценить и попробовать повторить другие программисты.

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

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

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

              Потому, что они подстраивают направление разработки под общество.
              Вариант — собрать команду, которая будет обеспечивать удобство пользователей.
              • –1
                Вообще вы правы: если делаешь что-то для юзеров — изволь обеспечивать максимальное удобство пользования, удовлетворяющее максимально широкую аудиторию. Это применимо к библиотекам, фреймворкам и, разумеется, к готовым приложениям. А биографии читал, правда, не до конца — наскучило где-то на середине, Айзексон пишет скучным языком, как по мне. Да и не особо люблю читать про историю жизни каких-то людей, пусть и великих — фантастику предпочитаю.
                На мой взгляд, у Вас есть элементы комплекса: «я так легко понимаю программы, но другие, плохо понимающие, успешны. Почему?»

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

                  С точки зрения самого верхнего заказчика это именно так. Но ваш заказчик — это тимлид или сеньер-девелопер, который заказывает у вас хорошую архитектуру или хотя бы читаемый код, который смогут поддерживать после вашего внезапного ухода, он не заказывает у вас «тяп-ляп в продакшн».
                • –2
                  Рад, что все «Без проблем!» :)
                  Извиняюсь, дам ссылку на еще одну идею игры, для которой мне рекомендовали Lua
                  http://habrahabr.ru/post/208044/

                  Главная сцена:
                  Вселенная
                  Солнечная система
                  Земля
                  По стране
                  В себя
                  На природу
                  В школу
                  На завод
                  В университет

                  У меня на первом месте транслятор, а потом приложения для него, еще не скоро доберусь :)
  • +6
    хм… github.com/IgorTimofeev/OpenComputers/blob/master/Installer/Installer.lua#L13
    --Создаем массив говна
    local govno = {}
    
  • –7
    привет от DjSapsan :)
    • 0
      чего заминусовали?
  • +3
    алгоритм двойной буферизации изображения. Для тех, кто не в курсе, поясню вкратце его суть: в оперативной памяти у нас находятся два массива изображения: первый содержит информацию о пикселях, которые в данный момент отображены на экране, а второй — информацию о пикселях, которые мы хотим отрисовать. Затем при помощи вызова функции расчета алгоритм сверяет эти два массива и выводит на экран не все пиксели, а только лишь измененные. А затем присваивает первому массиву значение второго.

    Это не верное определение и суть двойной буфферизации.
    • +1
      Это частично верное определение. Обычно двойную буферизацию реализуют обменом указателей на активную страницу с видеопамятью. Но, как вариант, может применяться и копирование из невидимой страницы.
      • –1
        В Lua отсутствует понятие «указатель», там все работает в автоматическом режиме: если присваешь первому массиву значение второго, то идет не дублирование массива, а именно обмен указателями. Да и понятие «страница видеопамяти» там тоже отсутствует («спасибо» автору мода), поэтому приходится работать с тем, что имеем.
        • 0
          Я не отрицаю ваших заслуг, вы очень много сделали для написания этой графической оболочки (все-таки это не полноценная операционная система, если на то пошло). Мой комментарий, скорее, обращение к тому несогласному, который поставил минус AllexIn-у — ваш подход к двойной буферизации может смело называться двойной буферизацией, хоть вы и вычисляете разницу между кадрами вместо обмена видеостраниц.
  • +7
    github.com/IgorTimofeev/OpenComputers/blob/master/MineOS/OS.lua
    Тут можно было бы написать кучу текста, мол,
    вы не имеете прав на использование этой хуйни в
    коммерческих целях и прочую чушь, навеянную нам
    западной культурой. Но я же не пидор какой-то, верно?

    Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
    ссылка на ВК: vk.com/id7799889

    Стилистика и орфография сохранены.
    • +1
      Неплохо так автор оскорбил программистов, кто вставляет «хуйню» в исходники.
      • +3
        Мне кажется, 1994 год рождения автора может подсказать источник столь неуемно-радикального патриотизма.
        • +1
          Эй, вы оскорбляет чувства людей, рождённых в 94 году. По комментариям выше видно, что автор весьма специфичной натуры.
          • +1
            Быть хорошим инженером 1994 года рождения не дает ни малейшего права считать всех остальных «пидорами» за приверженность к «чуши западной культуры», и «суками» безусловно.

            Быть глупым ребенком 1994 года рождения, неспособным осознавать недопустимость своего отношения к других людям — это хотя бы делает попытку объяснить причины.
            • 0
              Я не оправдывают автора, просто подметил, что год рождения едва ли является причиной подобного отношения.
        • –5
          Да ну вас, я данный текст от балды написал с целью «заполнения пространства», не надо воспринимать столь серьезным образом.
          • +1
            Лучше пространство ничем не заполнять, чем таким. В данном случае такая шутка неуместна.
  • +9
    Мне хотелось показать людям, что на любом языке и в любой среде можно создать маленький, не побоюсь этого слова, шедевр. Еще полтора года назад я крайне смутно представлял себе, что такое «функция», «массив» или «класс», а теперь мы с товарищами кодим собственную мини-ОС.


    Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
    ссылка на ВК: vk.com/id7799889


    --Создаем массив говна
    local govno = {}
    


    Рейтинг статьи +95.

    Мне тут даже комментировать что-то противно. Это типа наверное новый формат статей.
    • 0
      Вероятно, многие (чего скрывать, я тоже), плюсуют статьи после прочтения привлекательного заголовка и первого абзаца (чтобы потом не забыть).
  • 0
    а отсыпать можете? я б тоже покурил…

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