В далеком 2011 году мир увидел такую игру как Minecraft — воксельную песочницу, где каждый творит все, что душе угодно. Спустя некоторое время народные умельцы стали писать различные модификации для нее, делающие геймплей более разнообразным. Не так давно появился мод под названием «OpenComputers», добавляющий полноценные компьютеры, программируемые на скриптовом языке Lua. И в этой статье я хочу поделиться с вами небольшим опытом, приобретенным при изучении этого крайне интересного мода.
Изучаем мод
Если поставить перед собой компьютер и установить на него стандартную консольную ОС с местных дискет, то можно слегка разочароваться в функционале мода. По сути на старте мы имеем командую строку с довольно противно выглядящим интерфейсом, имеем набор стандартных команд по типу ls, edit <файл>, remove <файл> или mkdir <папка>.
Меня все это дело решительно не устраивало, и я решил добавить более приятные цвета к консоли и русифицировать подсказки для мода, благо автор позволил нам редактировать исходный код всех его наработок. Синтаксис Lua, его структура и возможности меня крайне удивили по сравнению с тем же недружелюбным к новичкам семейством СИ или еще более неказистой Java, в нем есть абсолютно все, что нужно «из коробки», а документация к моду написана простым популярным языком. Сначала я стал писать простенькие скрипты а-ля «Hello world», чуть позже позже я перешел на всякие мелкие программы для контроля дверей или освещения в игровом доме, но все это отдавало душком скуки и простоты. Хотелось хардкора!
Постепенно изучая местные библиотеки и особенности Lua, мы с моим другом смогли делать простенькие GUI-приложения. Пошарив по всяким википедиям, мы нашли несколько алгоритмов работы с цветом — например, для преобразования цвета из RGB в HSB формат или для наложения одного цвета на другой с учетом прозрачности. Немного повозившись, мы сумели реализовать эти алгоритмы на Lua, и так появилась наша первая библиотека для этого мода, мы назвали ее colorlib, а с ее помощью мы смогли накодить вот такую симпатичную палитру:
Решив не останавливаться на достигнутом, мы подумали, что классно было бы сделать графический редактор для этого мода, а также свой формат изображения. Действительно, почему бы нет? Так мы смогли бы легко рисовать красивую графику на мониторе. Провозившись несколько дней, мой товарищ сумел реализовать грамотную структуру файлов будущих картинок, которая кушала крайне мало места на местных жестких дисках, которые, к слову, имеют ограниченный объем в 4 МБ. Аббревиатуру формата мы обозначили как ".pic", а сам формат назвали «OpenComputers Image Format», сокращенно «ocif». После всего этого мы приступили к созданию самого графического редактора, потратив на это около трех дней. В итоге мы имеем вот это:
Структуру файла .pic в шестнадцатеричном виде можно лицезреть на этой картинке:
Первым делом мы добавили в наш графический редактор самые необходимые инструменты — кисть, ластик, а также текст для создания надписей, ведь по сути мы имеем консоль, где каждый пиксель имеет три параметра: цвет текста, цвет фона и символ. Чуть позже вставили алгоритм рекурсивной заливки для более удобного создания картинок, а еще чуть позже сумели приучить наш редактор работать с реальным PNG-форматом изображения (кстати, при помощи статьи с хабра). Итак, мы имеем рабочий формат изображения, но не знаем, где его можно применять. Мы стали писать различные приложения под этот мод, например, вот такой симпатичный календарик:
Или приложение, генерирующее цифровой дождь из всем известного фильма:
В конце концов у нас скопилось столько различных скриптов и библиотек, что мы утомились загружать их вручную cтандартным методом через Pastebin.com. Да, мод имеет интеграцию с пастбином, поэтому все наши файлы мы хранили изначально на нем, загружая их по мере необходимости на компьютеры. Но учитывая количество файлов, нами было принято решение о создании программы-инсталлятора, автоматически загружающей список файлов с нашего репозитория на GitHub, а затем скачивающей файлы по списку в нужную директорию. Было довольно много геморроя с переносом файлов с Pastebin'a, но через пару часов мы управились с задачей и приступили к кодингу инсталлятора. В итоге вышло вот что:
Итак, мы уже могли кодить простые приложения с картинками, имели удобный инсталлятор для них, но хотелось чего-то большего! Идея создания операционной системы пришла как-то сама собой, и, недолго думая, я решил сделать несколько набросков иконок для будущей ОС. К примеру, вот так выглядит папка:
Нарисовав основные иконки, я приступил к созданию самой операционной системы, сразу дав ей название «MineOS». Основная концепция очень проста: в папке MineOS/Desktop/ лежат файлы любого типа. С помощью стандартной функции getFileList() мы получаем список файлов, получаем формат файла через обрезку строкового имени файла, а затем рисуем на нашем экране иконки в соответствии с полученным форматом. Вышло что-то вроде этого:
Затем я приделал нижнее меню в стиле Mac OS, добавил меню сверху, накодил библиотеку контекстного взаимодействия — и в итоге мы имеем уже нечто, достойное названия «графическая оболочка», но до полноценной ОС это пока что не дотягивало.
У всего есть свои недостатки: местные «видеокарты», предоставляемые модом, имеют ограниченное количество операций, которые они могут сделать за игровой тик. Под операциями подразумевается изменение цвета текста, цвета фона, установка символа и т.п. Нетрудно себе представить, какое количество операций требовалось на отрисовку наших картинок и уж тем более на отрисовку рабочего стола. Но самая большая печаль заключалась в том, что мне необходимо было перерисовывать рабочий стол полностью, если, например, открыть контекстное меню или запустить какой-нибудь файл. Но тут на помощь мне пришел еще один товарищ и посоветовал написать алгоритм двойной буферизации изображения. Для тех, кто не в курсе, поясню вкратце его суть: в оперативной памяти у нас находятся два массива изображения: первый содержит информацию о пикселях, которые в данный момент отображены на экране, а второй — информацию о пикселях, которые мы хотим отрисовать. Затем при помощи вызова функции расчета алгоритм сверяет эти два массива и выводит на экран не все пиксели, а только лишь измененные. А затем присваивает первому массиву значение второго.
Также в эту библиотеку я встроил несколько алгоритмов для ускорения работы местных GPU, группирующих соседние пиксели по цветам и объединяющие их в одну строку вместо поочередной отрисовки.
И только теперь моя ОС заработала как надо! Иконки рисовались практически мгновенно, с компьютером стало крайне приятно взаимодействовать. Решив не останавливаться на достигнутом, я добавил несколько функций, симулирующих прозрачность изображения, и с их помощью сумел добиться довольно красивых результатов.
Затем я накодил красивый файловый менеджер в стиле Finder из все той же Mac OS, и интегрировал его в систему. Добавил также сортировку файлов по имени, типу и дате изменения, добавил скрытие формата изображения, добавил меню «избранное». В итоге имеем следующее:
Все это уже выглядит довольно неплохо, но за мной есть такой грешок как сильная любовь к хорошей графике. Поэтому я решил добавить поддержку обоев. Вот несколько примеров:
К слову, сегодня написал HEX-редактор файлов, так как я не люблю платить за готовые решения, продающиеся в интернете. Вот так он выглядит в сочетании с обоями робочего стола.
Итак, наша ОС готова! В совокупности мы имеем порядка 28 собственных библиотек, при этом некоторые из них имеют более 2-х тысяч строк кода. Также мы имеем около 30 качественных GUI-приложений. От начала изучения мода и до нынешнего времени прошел почти год, при этом программировали мы далеко не каждый день и не каждую неделю. Таким вот образом и написалась эта операционная система, а вслед за ней и эта статья.
Как скачать?
Если вам хочется пощупать эту ОС своими руками, то милости прошу, вот краткая инструкция: ставите на землю корпус компьютера, присоединяете к нему монитор, а к монитору прикрепляете клавиатуру. Затем вставляете в корпус лучшую видеокарту, процессор, оперативную память, жесткий диск, Lua-биос, стандартную дискету с OpenOS (скриптами автора мода), а также интернет-карту (не сетевую, а именно интернет).
Затем включаете компьютер, ждете, пока система загрузится с дискеты, а затем вводите в консоль команду install. Далее выбираете цифру жесткого диска, жмете enter, и система поставится. Далее перезагружаете компьютер.
Теперь ваш комп готов к установке уже моей операционной системы. Вводите в консоль команду pastebin run 0nm5b1ju, жмете enter и следуете инструкциям на экране. Желаю приятного использования.
Итог
Зачем, собственно, я писал эту статью? Мне хотелось показать людям, что на любом языке и в любой среде можно создать маленький, не побоюсь этого слова, шедевр. Еще полтора года назад я крайне смутно представлял себе, что такое «функция», «массив» или «класс», а теперь мы с товарищами кодим собственную мини-ОС. Главное — иметь свободное время и желание его потратить с пользой и с удовольствием, лично для меня нет большего кайфа, чем кодить всякую ерунду в любимой игре. Желаю всем начинающим и не очень начинающим программистам творческих успехов!
Исходники
Если кому интересно — можете покопаться в сырцах, там вы найдете все библиотеки, саму ОСь, программы и изображения.
Авторы
На всякий случай хочу перечислить остальных людей, которые так или иначе были связаны с этой ОС, которым так же, как и мне, было интересно изучать эту модификацию, да и язык Lua в целом.
- Глеб Трифонов — разработчик формата изображения, а также половины библиотек.
- Яков (фамилия неизвестна) — разработчик концепции двойной буферизации, помощник в оптимизации кода.
- Максим Пакин — автор нескольких программ для ОСи.
- Тимофей Шестаков — моральная поддержка команды, автор нескольких интересных идей по ускорению работы ОС.
Комментарии (121)
zagayevskiy
04.12.2015 11:32+18Только это не ОС, а графическая оболочка к ней.
KumoKairo
04.12.2015 13:15+4Продолжая логику комментария, было бы интересно прочитать подобную статью про саму OpenOS и принципы её работы внутри Minecraft
Prototik
05.12.2015 07:28+2Обычная машина с Lua, некоторые апи языки переписаны для адаптации под Minecraft (например функция получения текущего времени возвращает игровое время, а не реальное), ну и добавлены апи для работы с блоками и карточками. Шелл, который мимикрирует под bash и вообще OpenOS пытается быть минилинуксом. Ничего сверхординарного там нет.
zviryatko
04.12.2015 11:39+3Ой чувствую что 0x10c таки выйдет. Своя ось уже есть, осталось только добавить космический корабль и перенести главного героя в космос.
iDeBugger
04.12.2015 11:47+6Хм. В команде KolibriOS всегда пригодятся лишние руки ;)
jMas
07.12.2015 15:04+1Именно такие руки там нужны? :)
iDeBugger
07.12.2015 15:13Ну, это можно скриптом выпиливать, если он код нормальный будет писать :D
jMas
07.12.2015 15:56Нет, ну вы посмотрите на это github.com/IgorTimofeev/OpenComputers/commits/master :)
Мне кажется, после прихода этого разработчика, вам прийдется сосредоточить усилия на скрипте, который будет за ним подчищать.
alexcom
04.12.2015 12:01+6Вирусы для майнкрафта ещё не писали?
IgorTimofeev
04.12.2015 14:49+3Писали-писали. Делали и «синие экраны», и полное удаление всех файлов, и инжект в код стандартной OpenOS, чтобы сложнее было обнаружить вирус. Делали так, что раз в 2 минуты компьютер выдавал окно с текстом «требую печеньки». В общем, много чего там можно сделать, чтобы испортить жизнь юзерам.
rstepanov
04.12.2015 18:18+3Предлагаю написать под неё RDP клиент и ходить с него на свое рабочее место.
IgorTimofeev
04.12.2015 19:12Тоже писали, и даже работала система. Правда, медленно, т.к. автор ограничил количество пакетов, передаваемых за раз через игровые модемы. Можно, конечно, сделать через реальные php-скрипты, чтобы, например, управлять игровым компом с браузера, но в php я полный ноль. Такие дела.
Klaster
04.12.2015 12:05>>Затем я добавил поддержку обоев, затем я написал файловый менеджер, затем…
Респект, так между делом несколько тысяч строк кода написал, просто по приколу, круто :)
semenyakinVS
04.12.2015 12:30+14Теперь под эту ось майнкрафт написать нужно.
Lisio
04.12.2015 12:58+10Это было бы одно из самых интересных рекурсивных разбирательств по авторскому праву.
Calc
04.12.2015 16:24Видел в просторах ютуба видюшки с «фотошопом» от этого автора и игрой 2д майнкрафт.
semenyakinVS
04.12.2015 23:50Ну да. Особенно в связи с упомянутой комментарием ниже лицензии для самой ОС.
Mixalych
04.12.2015 12:58+16А лицензия-то шедевральна! Как раз для пятницы.
jrip
04.12.2015 13:13+2Меня вопрос почему-то очень беспокоит, а как вам вообще пришло в голову читать лицензию этой ОС? :)
Mixalych
04.12.2015 13:16+5Я ожидал такого вопроса. Привычка у меня такая, обычно я всегда автоматически лезу в папку вендоров, чтобы посмотреть, какие сторонние решения используются.
vaniaPooh
04.12.2015 13:45+6github.com/IgorTimofeev/OpenComputers/blob/master/MineOS/OS.lua#L6-L12 Давайте плюсовать человека.
painter7
04.12.2015 13:27+1То чувство, когда ты следил за появлением сего проекта ещё на YouTube, а теперь видишь статью на хабре, это, однако, доставляет =)
an24
04.12.2015 19:38+7Идея создания операционной системы пришла как-то сама собой, и, недолго думая, я решил сделать несколько набросков иконок для будущей ОС
Читаю курс в университете по операционным системам. Теперь только понял, что самое главное в ОС :)
qbtarzan
04.12.2015 20:32Игорь, я из QuickBlox, нам было бы интересно запустить чат (мессенджер, звонки, push notifications) для Minecraft, как считаете:
1) будет ли это востребовано в рамках OpenComputers и вне его
2) лучше самим делать или посотрудничать с кем-то типа вашей команды?IgorTimofeev
04.12.2015 22:40На OpenComputers уже имеется мессенджер, подключающийся к IRC, и им пользуются, в основном, гики и крайне узкий круг лиц. Обычным пользователям больше нравится писать скрипты для роботов, как-то взаимодействовать с игровым миром, а не общаться через эти компы (сужу исключительно по опыту администратора сервера), так что не думаю, что еще один сервис будет востребован. Но чисто ради забавы и кодерского любопытства было бы интересно написать клиент для вашего сервиса. Хотя я во всех этих сетевых протоколах довольно слабо разбираюсь, и вряд ли смогу накодить это сам.
qbtarzan
05.12.2015 12:18Спасибо за ответ. А вне OpenComputers имеет смысл или все пользуются обычным IRC подобным / консольным чатом?
IgorTimofeev
05.12.2015 15:19Ну, в самом Minecraft, как правило, пользуются обычным игровым чатом, не заморачиваясь на все эти технологичные приблуды. Иногда на серверах ставят моды для голосовой связи, такие как Gliby's Voice Chat, так что если и делать свой способ общения, то как-то в этом стиле, через модификации или плагины.
VioletGiraffe
04.12.2015 23:12-3По сравнению с «недружелюбным к новичкам семейством СИ», LUA — ОТВРАТИТЕЛЬНЫЙ язык. К сожалению, приходилось по работе на нём кодить.
semenyakinVS
04.12.2015 23:49На вкус и цвет, как говорится… Насколько я его знаю (тоже на работе имел с ним дело немного) — язык как язык. Обычный скриптовый прототип-ориентированный язык, вроде java script.
DmitrySpb79
04.12.2015 23:56+2Да теперь после полугода кодинга на Lua, автор и Си влет освоит :)
Кстати, чтобы не писали про модные свифты-питоны-java, а С — он рулез. Это почти ассемблер, когда смотришь в код, и понимаешь почти до уровня ячейки памяти как это работает. Так что настоятельно советую автору его изучить.
Еще добавлю, лучше купить Raspberry PI и осваивать Си на нем. Это более настоящий хардкор, когда код реально на удаленной железке работает, и куда интереснее, чем нарисованные байты на нарисованном компьютере гонять (имхо конечно).IgorTimofeev
05.12.2015 00:29-7Дело в том, что я не люблю языки с некрасивым синтаксисом или непонятными обозначениями стандартных функций. Не люблю все эти скобочки, звездочки, стрелочки — фу, гадость абстрактная. Я не хочу понимать что-то «до уровня ячейки памяти», мне искренне все равно, как оно там работает. Я хочу просто сидеть и кодить полезные и графонистые штучки без мозготраха.
Вообще, идеального языка пока что не встречал — что в C#, что C++ отсутствует большинство необходимых мне функций для старта написания софта, а если они и есть, то реализованы не для людей. В Lua отсутствует понятие «указатель» и понятие «класс», что порой затрудняет работу и заставляет писать костыли. В Java приходится создавать отдельный класс для каждой мелочи, это я вообще считаю верхом безумия. Про Python лучше промолчу. Но все это, конечно, субъективные впечатления человека, слабо знакомого с этими языками и работавшего с ними от силы пару дней — однако именно по первым ощущениям и складывается общее отношение к языку. Если ты элементарно не можешь перевести int в string одной стандартной функцией — то весь язык я сразу считаю кучкой кала. Интересно, сложно ли написать свой язык…DmitrySpb79
05.12.2015 00:37+1Любой синтаксис — вопрос пары дней и привычки. Главное понимать суть, как это работает. И все эти «звездочки и скобочки» (прикольное определение кстати:) как раз позволяют сделать что-то на низком уровне эффективно и без костылей.
Если хочется «просто и быстро» — питон как раз самое то :)
«сложно ли написать свой язык» — интерпретатор Lua написан на С, кстати.
bevice
05.12.2015 01:14Ну это потому что пару дней,
в С/C++ уже все реализовано, причем, как правило, до вашего и моего рождения.
Python очень удобен, и тоже все что можете придумать, уже реализовано кем-то.
По первым впечатлениям о ЯП можно хоть как-то объективно судить имея огромный опыт работы с другими, иначе первые впечатления ошибочны.
Хотя после скриптовых языков звездочки могут и напугать, но это и есть отличие «низкоуровневых» языков.IgorTimofeev
05.12.2015 04:58Я имел в виду реализацию всех необходимых функций «из коробки», без необходимости поиска встроенных или сторонних библиотек. Люблю, когда даже самый отбитый новичок сразу осваивается в данной среде — это и есть признак хорошего и грамотно сконструированного языка. Имхо, конечно.
Ну, а так-то разобраться в плюсах или шарпе не столь уж и сложно при должном желании — противно в этих дебрях копаться, вот и все :)
lair
05.12.2015 19:05что в C#, что C++ отсутствует большинство необходимых мне функций для старта написания софта, а если они и есть, то реализованы не для людей.
Пример (для C#) можете привести?IgorTimofeev
06.12.2015 14:59-4Легко.
Отсутствует сериализация массивов в строку и наоборот, отсутствуют алгоритмы хеширования SHA2 и MD5, отсутствует адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов. Разумеется, все это легко исправляется поиском по гуглу и скачиванием сторонних библиотек, зачастую очень и очень неплохих, однако сейчас у нас 2015 год на дворе, и в современном языке я хочу видеть максимум удобства, благо не в пещерном веке живем.lair
06.12.2015 16:40+1Вы точно не путаете язык и базовую библиотеку?
Отсутствует сериализация массивов в строку
Вы, наверное, JSON имеете в виду? JavaScriptSerializer (хотя Json.net лучше, не зря более поздние версии на него перешли).
отсутствуют алгоритмы хеширования SHA2 и MD5
Серьезно?
MD5, SHA256, SHA384, SHA512.
адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов
HttpClient.IgorTimofeev
06.12.2015 20:18-4Вы, наверное, JSON имеете в виду? JavaScriptSerializer (хотя Json.net лучше, не зря более поздние версии на него перешли).
Нет, я имею в виду именно массивы, а также сериализацию классов и функций. JSON-генератор и -парсер не нужен.
Серьезно?
MD5, SHA256, SHA384, SHA512.
Вот этого не нашел, сколько ни лазил по форумам — обычно всякую чушь обычно советуют вроде юзеровских библиотек, плагинов и т.д, так что спасибо за ссылочки, буду знать.
HttpClient.
Неадекватная библиотека, чтобы выполнить простую задачу, нужно проделать туеву хучу операций, так что работать с ней будут лишь мазохисты. Она имеет слишком много схожих методов с крайне непродуманными названиями и аргументами, поэтому использую кастомную с забугорного сайта, позволяющую делать то, что мне нужно, в одну строчку.lair
06.12.2015 20:24+1Нет, я имею в виду именно массивы, а также сериализацию классов и функций.
Если вам нужна сериализация в бинарный поток — то берите встроенную. Если в строку, то вам придется выбрать формат. Чем JSON хуже других?
Неадекватная библиотека
Аргументы в студию.
чтобы выполнить простую задачу, нужно проделать туеву хучу операций
Например?
Она имеет слишком много схожих методов с крайне непродуманными названиями и аргументами,
Примеры в студию.
(BTW, библиотека не может иметь методы и аргументы.)IgorTimofeev
06.12.2015 20:52-8Если вам нужна сериализация в бинарный поток — то берите встроенную. Если в строку, то вам придется выбрать формат. Чем JSON хуже других?
Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода. И все тут, безо всяких джсонов, хуенов, потоков и прочей лабуды, которую так часто приходится писать во языках семейства СИ. Хотя надо признать, что в шарпе лабуды в разы меньше, это факт, да.
Аргументы в студию
Без проблем, сейчас пошарюсь по харду, найду старые проекты на шарпе, затерянные под вековой пылью, найду в них костыльный участок кода на HttpClient и немедленно отпишусь, чтобы удовлетворить ваше любопытство, минуток 10 подождите. А если серьезно, то в чем проблема вообще? Я высказал свою позицию, что лично мне не нравится эта либа, ибо прекрасно помню, какой с ней был геморрой на старте изучения шарпа, а если у вас данной проблемы не возникало, то остается только искренне порадоваться за вас, вот и все. Аргументы вам подавай, ишь ты! Говно-либа, сложна в освоении. Годится такой аргумент? Вот и все, не надо разводить демагогию в комментах, лучше кодить пойдемте, это всяко полезнее.lair
06.12.2015 21:10+1Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода.
Зачем?
Я высказал свою позицию, что лично мне не нравится эта либа,
Неа. Вы высказали, что «отсутствует адекватное интегрированное Internet API для осуществления элементарных GET и POST запросов», «Неадекватная библиотека, чтобы выполнить простую задачу, нужно проделать туеву хучу операций» и «Она имеет слишком много схожих методов с крайне непродуманными названиями и аргументами».
Это не «мне не нравится».IgorTimofeev
06.12.2015 21:23-4Зачем?
Вот же ж упорный человек, а? Потому что нужно. Если меня спрашивают о том, как что-либо сделать, я озвучиваю способ (если он мне известен), а в противном случае просто молчу, не затевая бессмысленных диалогов с выяснением причин. Нужно, понимаете? Для работы, для личных грязных целей, для самых мерзопакостных делишек.
Это не «мне не нравится».
Именно по перечисленным вами моим высказываниям данная либа мне не нравится. Это обобщающий речевой оборот, выражающий вкратце мое отношение к либе.lair
06.12.2015 21:42+1Вот же ж упорный человек, а? Потому что нужно.
Это неправильная постановка задачи. Нужно может быть передать данные. Или сохранить данные (что, в общем-то, то же самое). А «записать массив в строку C#-кода» — это не задача, это один из вариантов решения. Почти всегда неправильный.
Именно по перечисленным вами моим высказываниям данная либа мне не нравится.
Она может вам не нравиться по любым причинам, но когда вы что-то высказываете, было бы неплохо свои высказывания подтверждать, а то, простите за прямоту, пока что все ваши «не нравится» можно свести к «я не понял, как это делают, поэтому выкинул».
Собственно, вот: " Говно-либа, сложна в освоении. Годится такой аргумент?".
Нет, не годится. Не либа (омг, в .net вообще нет такого понятия) сложна в освоении, а вы не осилили ее освоить. Чувствуете разницу?IgorTimofeev
06.12.2015 21:59-4Это неправильная постановка задачи.
Что ж тут неправильного и непонятного? Требуется функция, конвертирующая класс, массив или функцию в строку, и возвращающая эту строку. Опционально хотелось бы получать строку в человекочитабельном варианте с \n, чтобы ее впоследствии было легко парсить. Хватит казуистикой заниматься, тут и обезьяна поймет, о чем речь.
Нет, не годится. Не либа (омг, в .net вообще нет такого понятия) сложна в освоении, а вы не осилили ее освоить. Чувствуете разницу?
Ну не годится и не годится, переживу как-нибудь. А разницы не чувствую, ибо не освоить что-то можно лишь по одной причине: осваиваемый объект создает искусственные трудности в освоении. Каким бы ни был юнит, осваивающий этот объект — умным, глупым или одноклеточным — сложность осваиваемости задается именно создателем осваиваемого объекта. Любой объект можно создать универсальным, чтобы его суть понял даже конченный дебил с задержками в развитии (на то и существуют методы рефакторинга кода), а можно создать способом, понятным лишь кругу лиц, в котором находится автор — на все воля автора. Собственно, в случае с HttpClient мы имеем второй вариант. Говно-либа, неудобная в использовании.lair
06.12.2015 22:08Требуется функция, конвертирующая класс, массив или функцию в строку, и возвращающая эту строку.
Ох. Как вы себе представляете конверсию в строку класса или функции?
А для объектов (массив — частный случай объекта) прекрасно работает уже упомянутый выше JSON.
Что ж тут неправильного и непонятного?
То, что вы говорите «хочу сконвертировать х в строку», но не говорите, зачем вам это надо. Хотя то, зачем это надо, важнее — возможно, вам на самом деле надо не в строку, а в передаваемый формат.
А разницы не чувствую, ибо не освоить что-то можно лишь по одной причине: осваиваемый объект создает искусственные трудности в освоении
Неа. Бывает еще так, что осваивающий субъект не приспособлен для освоения.
Любой объект можно создать универсальным, чтобы его суть понял даже конченный дебил с задержками в развитии
Вы про essential complexity никогда не слышали?
Собственно, в случае с HttpClient мы имеем второй вариант. Говно-либа, неудобная в использовании.
Приведите конкретный пример, где вы не поняли, как использовать HttpClient, и вам было неудобно — вот и посмотрим, можно ли сделать проще.
С моей точки зрения, у HttpClient (да и вообще System.Net.Http) как раз один из самых разумных интерфейсов для работы с HTTP, достаточно близкий к протоколу, но при этом еще не избыточно детальный.IgorTimofeev
07.12.2015 01:26-3Ох. Как вы себе представляете конверсию в строку класса или функции?
void funkcia() { print("bla-bla"); } string stroka = toString(funkciya)
А как именно? Что ж, меня это не особо волнует — в опенкомпах из поста есть стандартная либа для сериализации таблиц и функций, в C# нет, вот и все. Собственно, в нашей дискуссии и шла речь о том, каких функций мне не хватает в базовом C#.
А примеры касательно Http мне лень приводить, все равно мое мнение останется на своем должном месте, а ваше на своем. Вы слишком занудный собеседник для меня, акцентирующий внимание на мелочах, на которые я обычно кладу болт. Боюсь, если я приведу примеры, то наша милая беседа затянется на куда большее количество символов, а символы — это, между прочим, физический труд в плане нажатия на клавиши. Так что лень-матушка взяла свое.lair
07.12.2015 10:35+1void funkcia() { print("bla-bla"); } string stroka = toString(funkciya)
А как именно? Что ж, меня это не особо волнует
А, это легко.
Action funkcia = () => {Console.WriteLine("bla-bla");}; string stroka = funkciya.ToString();
в опенкомпах из поста есть стандартная либа для сериализации таблиц и функций
Кстати, а можно ссылочку на эту «стандартную либу»?
А примеры касательно Http мне лень приводить
Подозреваю, что и с его освоением было то же самое — лень разбираться, проще говном назвать.IgorTimofeev
07.12.2015 14:27-4А, это легко.
Что за глупости? Мне нужен не результат выполнения функции, а строковое представление структуры самой функции со всем содержимым и значениями переменных. Т.е. как записал ее в изначальном коде — такой и должен быть вывод, с той лишь разницей, что переменные могут быть изменены извне. То же самое касается и массивов, и классов.
Кстати, а можно ссылочку на эту «стандартную либу»?
Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib. Очень простая и лаконичная библиотека, проходящаяся через цикл по структуре массива или функции, реализовать ее легко даже с базовыми знаниями Lua, ну, и при условии, что вы умеете юзать регулярки. Правда, она не совсем оптимизирована в плане расхода на память, т.к. использует быдлокодерскую конкатенацию строк, но в целом понять ее суть легко.
Подозреваю, что и с его освоением было то же самое — лень разбираться, проще говном назвать.
Именно так. Если либа трудна в освоении по сравнению с остальными либами, идущими вместе с данной либой в комплекте, то данная либа является говном. Все очень просто и логично.lair
07.12.2015 14:40+1Что за глупости? Мне нужен не результат выполнения функции
А это не результат выполнения функции.
Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib.
Это вот это API?
реализовать ее легко даже с базовыми знаниями Lua
Мне на редкостью любопытно, как с базовыми знаниями Lua достать исходный код функции на Lua в рантайме, учитывая, что Lua его не хранит (ну или не хранила несколько лет назад, я не знаю, насколько это поменялось со временем).
Если либа трудна в освоении по сравнению с остальными либами, идущими вместе с данной либой в комплекте, то данная либа является говном.
… а что с ней «идет в комплекте», мне вот интересно? Ну и да, я вас еще раз спрошу: вы про понятие essential complexity не слышали?
Впрочем, не суть. Если кому-то что-то трудно в освоении, но он не может привести конкретных недостатков — то это его личные проблемы. Кому-то вот принципиально не даются указатели — это же не значит, что указатели говно.IgorTimofeev
07.12.2015 16:14-3вы про понятие essential complexity не слышали
Слышал-слышал, забавная статья, которую обосрали уже все, кому только не лень. Моя личная позиция по данному вопросу такова: любая софтина или либа обязана быть одновременно простой для начинающих и максимально гибкой для «шарящих». Любое отклонение в ту (Internet API OpenComputers) или иную (HttpClient) сторону не является правильным и требует рефакторинга кода.
Кому-то вот принципиально не даются указатели — это же не значит, что указатели говно.
Лично мне даются и указатели, и апи для запросов, и все, что я пожелаю. Вопрос лишь в том, как долго я осваиваю указанный материал. Если быстро — система хороша, и я искренне благодарю батьку-девелопера за простоту и доступность этой системы, если медленно — система является скучным говном, как правило, с кучей модульных функций. О чем мы дискуссию-то ведем вообще? Вам нравится этот HttpClient, мне нет. В чем проблема-то? Зачем по пустякам заводить длинные ветки обсуждения?lair
07.12.2015 16:16+1забавная статья
Я не знаю, о какой статье вы говорите.
Вам нравится этот HttpClient, мне нет. В чем проблема-то?
Вот в этом утверждении: «система является скучным говном, как правило, с кучей модульных функций». Вы продолжаете не видеть разницы между «я не осилил» и «система — говно».IgorTimofeev
07.12.2015 16:22-2Я не знаю, о какой статье вы говорите
Вы выписываете термин из довольно изестной статьи, и не знаете, о чем я говорю? Попахивает вредностью.
Вот в этом утверждении: «система является скучным говном, как правило, с кучей модульных функций». Вы продолжаете не видеть разницы между «я не осилил» и «система — говно».
Неверно, ибо либу я осилил. Мне она неудобна в использовании, поэтому перешел на более простую версию с двумя методами, соответствующую моим требованиям.lair
07.12.2015 16:29+1Вы выписываете термин из довольно изестной статьи, и не знаете, о чем я говорю?
Этот термин давно перерос эту статью.
Мне она неудобна в использовании, поэтому перешел на более простую версию с двумя методами, соответствующую моим требованиям.
Вам неудобна. Никакого отношения к ее вкусовым качествам это не имеет.
akaluth
07.12.2015 15:50+1void funkcia() { print("bla-bla"); } string stroka = toString(funkciya)
Качайте мод на майн, ставьте OpenOS, смотрите апи serialization, находится в папке lib. Очень простая и лаконичная библиотека, проходящаяся через цикл по структуре массива или функции, реализовать ее легко даже с базовыми знаниями Lua, ну, и при условии, что вы умеете юзать регулярки. Правда, она не совсем оптимизирована в плане расхода на память, т.к. использует быдлокодерскую конкатенацию строк, но в целом понять ее суть легко.
Вы противоречите сами себе, ибо в документации к этому самому «serialization» написано прямым текстом:
serialization.serialize(value: any except functions[, pretty:boolean]): string
IgorTimofeev
07.12.2015 16:01-2Никто никому не противоречит, ибо эта функция предназначена для сериализации таблиц, в которых может содержать все, что угодно, если это все не закрыто в теле цикла. Функции также сериализуются в виде строки, это проверено мною лично на практике и часто используется для дебага. Ну, а если запихнуть в нее число или просто строку, то она выдаст nil, т. е. ничего. Так что any туда не запихнешь, автор вики неверно указал типы.
lair
07.12.2015 16:07Дайте ссылку на исходник (ну или выложите на gist/pastebin). Текущая реализация прямо противоречит тому, что вы говорите. Ну или вы говорите про другое API вообще.
IgorTimofeev
07.12.2015 16:18-3Эта реализация и есть то, о чем я говорю. Судя по всему, вы не поняли моих требований к ее функционалу, постоянно переспрашивая то про JSON, то еще про что-то, поэтому и возникает такой вот диссонанс. В любом случае, эта либа — именно то, чего мне не хватало в шарпе, на этом и покончим.
lair
07.12.2015 16:26+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 выключен, будет ошибка. Никакой сериализации тела функции в этом апи нет.
В любом случае, эта либа — именно то, чего мне не хватало в шарпе, на этом и покончим.
Э нет. Вот как раз аналогов «этой либы» в шарпе сколько угодно, начиная от встроенной сериализации и заканчивая любой другой на вкус.
akaluth
07.12.2015 16:18+1Назовите хоть одну ситуацию, где может потребоваться тело функции сериализовать в строку и обратно. За все несколько лет что я занимаюсь программированием такой необходимости у меня ни разу не было.
IgorTimofeev
07.12.2015 16:47-3Иными словами, если включен pretty, то вернется tostring от функции
Товарищ, вы бы хоть потестировали либу для начала вместо анализа ее кода. Аргумент Pretty сериализует массив не в таком виде
{["privet"] = 123, ["hello"] = {["test"] = 12}}
А в таком:
{ ["privet"] = 123, ["hello"] = { ["test"] = 12 } }
Иными словами, Pretty добавляет \n в конце каждого элемента для лучшей читабельности, вот и все. Не надо додумывать функционал на основе кода — поработайте с библиотекой сами, а потом уже пишите.akaluth
07.12.2015 16:52+3Иными словами, если включен pretty, то вернется tostring от функции
Товарищ, вы хотя бы потестировали либу для начала вместо анализа ее кода. Аргумент Pretty сериализует массив не в таком виде
Было бы удивительно, если бы при вызове для функции вернулся сериализованный массив.
Вот и все. Не надо додумывать функционал на основе кода — поработайте с библиотекой сами, а потом уже пишите.
Вы додумываете его даже не смотря в код :) В библиотеке нет сериализатора для функций, в документации написано что его нет, но у вас он неожиданно появляется. Быть может, отправите автору библиотеки пулл-реквест с этой фичей?
lair
07.12.2015 16:58+3Иными словами, Pretty добавляет \n в конце каждого элемента для лучшей читабельности, вот и все.
В коде, как мы видим, написано иное.
Товарищ, вы бы хоть потестировали либу для начала вместо анализа ее кода.
А смысл, если в коде все написано? Мне еще не хватало тут среду под Lua разворачивать.
AlexBin
07.12.2015 17:23>> Не хочу я ничего выбирать, мне необходима функция toString(class/array/function), выводящая содержимое аргумента в строку C#-кода. И все тут, безо всяких джсонов, хуенов, потоков и прочей лабуды
Тогда странно, что Вам не понравился питон.AlexBin
07.12.2015 17:34Ну и раз пошла такая пьянка, код (тело) питоновской функции там тоже несложно вывести в виде текста.
akaluth
07.12.2015 17:42+1Вот только… зачем? :)
AlexBin
07.12.2015 17:47+1Вывод структур в stdout для отладки консольных скриптов очень часто бывает полезен. Одной строчкой я получаю список методов или свойств неизвестного мне объекта, который написан кем-то, кто не потрудился оставить документацию. Порой это бывает быстрее, чем лезть в сам модуль и смотреть его методы.
Однако получить текст кода функции на практике не требовалось. Это попахивает какими-то слишком дикими костылями. Если конечно мы не пишем некий анализатор кода…
akaluth
06.12.2015 17:32+2Разумеется, все это легко исправляется поиском по гуглу и скачиванием сторонних библиотек, зачастую очень и очень неплохих, однако сейчас у нас 2015 год на дворе, и в современном языке я хочу видеть максимум удобства, благо не в пещерном веке живем.
В Ruby, к примеру, «поиск и скачивание сторонних библиотек» — это чуть ли не идеология.
Все вышеперечисленное вами в C# уже есть, и ничего искать/качать не нужно. А когда появляется все же такая необходимость, большинство пакетов можно найти в nuget и скачать+подключить их одной кнопкой.
palexisru
06.12.2015 13:14-1> Интересно, сложно ли написать свой язык…
Интересно Ваше мнение по синтаксису для учебного языка из http://habrahabr.ru/post/219419/IgorTimofeev
06.12.2015 15:09Странный он какой-то. Не люблю лишних знаков в основных операторах. Зачем использовать := для присваивания, а == для проверки истинности? И что за =/= для проверки на неравенство, зачем аж 3 символа использовать? Вон, в BASIC было идеально в этом плане: и присваиваешь через =, и условия проверяешь в стиле IF A = B THEN B = C ENDIF, все было элементарно. Опять же, в современном языке все должно быть интеллектуально, он сам должен понимать, где присвоение, а где проверка истины. Да и массивы по вашей ссылке там явно будут в стиле СИ. То ли дело таблицы Lua, в которые пихай что хочешь: хоть функции, хоть другие таблицы, хоть строки, хоть числа, хоть все вместе. В современном языке должны быть именно такие массивы, а то и еще лучше.
lair
06.12.2015 20:33+3в современном языке все должно быть интеллектуально, он сам должен понимать, где присвоение, а где проверка истины
bool a, b, c; a = b = c;
Разбирайтесь.
jMas
06.12.2015 20:43-1В современном языке должны быть именно такие массивы, а то и еще лучше.
Это намек на слабо-типизированные ЯП с динамическими структурами данных?
Для обучения, я бы наоборот отдаю предпочтение строго-типизированному языку с избыточным синтаксисом. Где наглядно видно: какие структуры данных мы имеем, как мы их преобразуем в другие структуры данных. Операции довольно многословны и ясны.
Таким образом ученикам будет понятны процессы, производимые с данными, а для обучения это важно. Но опять таки, обучение чему? Если делаешь из человека повара, который слепит кашу из кода, то слабо-типизированные языки вполне хороши в таком контексте.IgorTimofeev
07.12.2015 01:07-3Это дело вкуса. Мне абсолютно все равно, какие структуры данных мы имеем, мне совершенно не интересно понимать процессы при написании элементарных программ (консольный калькулятор, графопостроитель и прочая элементарная чушь, которую дают в типичных универах как задание чаще всего). При обучении (я подчеркиваю, при обучении) я хочу просто кодить, понимать суть языка, понимать основы. А если потребуются какие-то дополнительные знания по конкретному вопросу, будь то оптимизация воксельного приложения через указатели — это не проблема, я просто беру и изучаю доп. материал при возникновении необходимости.
К слову, на платных курсах по C#, которые ведет моя хорошая знакомая, практически никогда не заостряется внимание на типизации данных. Люди просто получают задание и творят маленькие шедевры, получая за это хорошие деньги, при необходимости, опять же, спрашивая у лектора, как можно оптимизировать проект. Это в моем понимании и есть настоящее обучение программированию, когда ты программируешь, а не страдаешь ерундой, доказывая что-то ноунейму в комментариях.jMas
07.12.2015 12:29Подчеркиваю, для обучения. Вас могут посадить расчитывать полеты ракет после недельного курса математики и физики, но результат будет плачевный.
Вы оглядываетесь вокруг и видите таких же ребят, которые сели писать, и потихоньку подтягивают матчасть.
В свою очередь, я говорю о том, что учить нужно процессам, а поняв процессы, программисты могут спокойно кодить хоть на своем не-типизированном языке, хоть на луа, хоть на джаваскрипте, шарпах, питонах, явах. Но понимая процессы, они не будут лажать на ровном месте.IgorTimofeev
07.12.2015 14:39-2А я тоже подчеркиваю, для обучения я бы не выбрал курсы, где мусолят лишь теоретическую часть, отдавая ей основное предпочтение — это устаревший и непродуктивный метод обучения. Нет ничего плохого в том, чтобы разбираться в типах данных и уметь грамотно их использовать, плохо — когда матчасть занимает основную нишу учебного процесса. Я человек-практик, привык изучать теорию в процессе кодинга, и почему-то я до сих пор никогда не лажал на ровном месте, ровно как и большинство моих товарищей, ибо курсы были хорошие, а преподаватель явлалась крутой, умнющей девкой, и знала свое дело.
lair
07.12.2015 14:41+3почему-то я до сих пор никогда не лажал на ровном мест
Это пишет человек, который не нашел в .net SHA-2?
jMas
07.12.2015 15:03+2Вы пока еще ничего серьезного не сделали, где можно «налажать». «Налажать» очень субъективная оценка. Если оценивать ваш код с позиции модульности, ре-юзабельности, то вдруг окажется, что он не отвечает этим требованиям.
Попробуйте какой ни будь этнерпрайз проект, где будут люди, которые будут указывать на ваши ошибки. Вы сейчас наверное делаете проекты или для себя или для развлечения с ребятами, у которых точно такие же навыки программирования как и у вас. Кто же вам будет указывать на ошибки? Конечно никто, вот у вас и складывается ошибочное впечатление, что все супер, я нигде не лажаю. Но есть работа, где платят деньги и вот как раз там ты и начинаешь набивать все шишки.
где мусолят лишь теоретическую часть, отдавая ей основное предпочтение — это устаревший и непродуктивный метод обучения.
Скажу так — я тоже много времени трачу на практику, но в последнее время приходит понимание, что практика без теории — это хождение в сумерках. Вроде бы ясно, но уверенность и чистота понимания приходят только с прочтением теории, особенностей языков, после разбиения процессов на составные части.
IgorTimofeev
07.12.2015 01:42-2Добавлю еще, что «поваров» я вижу везде: как в шарпе, так и в плюсах, бейсике, луа, питоне или явке. Говнокод неистребим, и нечего винить слабую типизацию языка в безалаберности юных кодеров. Лично у меня все работает одинаково хорошо как на сишных структурах, так и на луавских, а проблем из-за типов данных никогда не возникало.
palexisru
07.12.2015 03:02-1По-доброму завидую Вашему таланту программиста, но напоминаю, что искусство состоит в написании кода, который могут прочитать, оценить и попробовать повторить другие программисты.
На мой взгляд, у Вас есть предпосылки для повторения успеха Гейтса и Джобса, но рекомендую прочитать их биографии. Ну и — смещение современных технологий в сторону нейросетей. Гейтс и Джобс не заморачивались, но создали концепцию языков.
Джобс отказывался от команд, с которыми он добился успеха, и переживал личные трагедии.
Гейтс ценил командную работу, хотя и менял взаимоотношения с членами команды в соответствии с актуальностью их предпочтений.
Ну и про язык — я старался описать версию читаемого человеком языка. Машина любые навороты разберет, и сообщит, что как ею прочитано. На мой взгляд, у Вас есть элементы комплекса: «я так легко понимаю программы, но другие, плохо понимающие, успешны. Почему?»
Потому, что они подстраивают направление разработки под общество.
Вариант — собрать команду, которая будет обеспечивать удобство пользователей.IgorTimofeev
07.12.2015 16:38-1Вообще вы правы: если делаешь что-то для юзеров — изволь обеспечивать максимальное удобство пользования, удовлетворяющее максимально широкую аудиторию. Это применимо к библиотекам, фреймворкам и, разумеется, к готовым приложениям. А биографии читал, правда, не до конца — наскучило где-то на середине, Айзексон пишет скучным языком, как по мне. Да и не особо люблю читать про историю жизни каких-то людей, пусть и великих — фантастику предпочитаю.
На мой взгляд, у Вас есть элементы комплекса: «я так легко понимаю программы, но другие, плохо понимающие, успешны. Почему?»
Вот эту фразу, правда, не совсем понял: никогда в жизни не задавался подобным вопросом, весь свой код я пишу исключительно для себя и собственного удовольствия, редко что-то выкладывая в широкие массы. Кодинг для меня не более чем хобби, которое можно бросить в любой момент, если оно надоест. Плюс, искусство искусством, а деньги деньгами, работодателя редко интересует, насколько искусно написан код — важен результат поставленной задачи в указанные сроки.jMas
07.12.2015 16:45Плюс, искусство искусством, а деньги деньгами, работодателя редко интересует, насколько искусно написан код — важен результат поставленной задачи в указанные сроки.
С точки зрения самого верхнего заказчика это именно так. Но ваш заказчик — это тимлид или сеньер-девелопер, который заказывает у вас хорошую архитектуру или хотя бы читаемый код, который смогут поддерживать после вашего внезапного ухода, он не заказывает у вас «тяп-ляп в продакшн».
palexisru
07.12.2015 22:00-2Рад, что все «Без проблем!» :)
Извиняюсь, дам ссылку на еще одну идею игры, для которой мне рекомендовали Lua
http://habrahabr.ru/post/208044/
Главная сцена:
Вселенная
Солнечная система
Земля
По стране
В себя
На природу
В школу
На завод
В университет
У меня на первом месте транслятор, а потом приложения для него, еще не скоро доберусь :)
rmaksim
05.12.2015 02:46+6хм… github.com/IgorTimofeev/OpenComputers/blob/master/Installer/Installer.lua#L13
--Создаем массив говна local govno = {}
AllexIn
05.12.2015 19:07+3алгоритм двойной буферизации изображения. Для тех, кто не в курсе, поясню вкратце его суть: в оперативной памяти у нас находятся два массива изображения: первый содержит информацию о пикселях, которые в данный момент отображены на экране, а второй — информацию о пикселях, которые мы хотим отрисовать. Затем при помощи вызова функции расчета алгоритм сверяет эти два массива и выводит на экран не все пиксели, а только лишь измененные. А затем присваивает первому массиву значение второго.
Это не верное определение и суть двойной буфферизации.mwizard
06.12.2015 02:16+1Это частично верное определение. Обычно двойную буферизацию реализуют обменом указателей на активную страницу с видеопамятью. Но, как вариант, может применяться и копирование из невидимой страницы.
IgorTimofeev
06.12.2015 15:13-1В Lua отсутствует понятие «указатель», там все работает в автоматическом режиме: если присваешь первому массиву значение второго, то идет не дублирование массива, а именно обмен указателями. Да и понятие «страница видеопамяти» там тоже отсутствует («спасибо» автору мода), поэтому приходится работать с тем, что имеем.
mwizard
06.12.2015 15:16Я не отрицаю ваших заслуг, вы очень много сделали для написания этой графической оболочки (все-таки это не полноценная операционная система, если на то пошло). Мой комментарий, скорее, обращение к тому несогласному, который поставил минус AllexIn-у — ваш подход к двойной буферизации может смело называться двойной буферизацией, хоть вы и вычисляете разницу между кадрами вместо обмена видеостраниц.
jMas
06.12.2015 16:16+7github.com/IgorTimofeev/OpenComputers/blob/master/MineOS/OS.lua
Тут можно было бы написать кучу текста, мол,
вы не имеете прав на использование этой хуйни в
коммерческих целях и прочую чушь, навеянную нам
западной культурой. Но я же не пидор какой-то, верно?
Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
ссылка на ВК: vk.com/id7799889
Стилистика и орфография сохранены.KvanTTT
06.12.2015 17:37+1Неплохо так автор оскорбил программистов, кто вставляет «хуйню» в исходники.
mwizard
06.12.2015 22:05+3Мне кажется, 1994 год рождения автора может подсказать источник столь неуемно-радикального патриотизма.
chesterset
06.12.2015 22:27+1Эй, вы оскорбляет чувства людей, рождённых в 94 году. По комментариям выше видно, что автор весьма специфичной натуры.
mwizard
06.12.2015 22:29+1Быть хорошим инженером 1994 года рождения не дает ни малейшего права считать всех остальных «пидорами» за приверженность к «чуши западной культуры», и «суками» безусловно.
Быть глупым ребенком 1994 года рождения, неспособным осознавать недопустимость своего отношения к других людям — это хотя бы делает попытку объяснить причины.chesterset
06.12.2015 23:54Я не оправдывают автора, просто подметил, что год рождения едва ли является причиной подобного отношения.
IgorTimofeev
07.12.2015 01:27-5Да ну вас, я данный текст от балды написал с целью «заполнения пространства», не надо воспринимать столь серьезным образом.
KvanTTT
09.12.2015 00:33+1Лучше пространство ничем не заполнять, чем таким. В данном случае такая шутка неуместна.
Ununtrium
07.12.2015 15:17+9Мне хотелось показать людям, что на любом языке и в любой среде можно создать маленький, не побоюсь этого слова, шедевр. Еще полтора года назад я крайне смутно представлял себе, что такое «функция», «массив» или «класс», а теперь мы с товарищами кодим собственную мини-ОС.
Просто помни, сука, что эту ОСь накодил Тимофеев Игорь,
ссылка на ВК: vk.com/id7799889
--Создаем массив говна local govno = {}
Рейтинг статьи +95.
Мне тут даже комментировать что-то противно. Это типа наверное новый формат статей.KvanTTT
09.12.2015 00:58Вероятно, многие (чего скрывать, я тоже), плюсуют статьи после прочтения привлекательного заголовка и первого абзаца (чтобы потом не забыть).
ice2heart
А ссылочку на гитхаб?
gwer
github.com
Pe4enie
Оценил шутку только после перехода по ссылке %)
jrip
У вас эта ссылка отобразилась как непосещенная? :)
Pe4enie
Да, на главной гитхаба не бываю, только в репозиториях
KvanTTT
Не активные пользователи оценили шутку только после перехода %)
VLT
github.com/IgorTimofeev/OpenComputers
jrip
Чётко github.com/IgorTimofeev/OpenComputers/blob/master/README.md :D