LINUX.ORG.RU

Metaprog: универсальная графическая среда программирования [в разработке] часть 4

 , , ,


4

3

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

FAQ

1. Где скачать?

Релиза еще не было. Идет разработка, темы посвящены ей. Есть сделанный на LabVIEW прототип (его работа показана в примерах).

2. Почему не открыт код LabVIEW-прототипа Метапрога?

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

3. Почему не Дракон, MIT App Inventor, Unreal Blueprints?

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

4. Чем плохи LabVIEW или MyOpenLab?

LabVIEW пропиетарный, а MyOpenLab - хоть и опенсорсный, но какой-то недоделанный (пытался у себя запустить - выдало джава эксепшоны). Да-да, опенсорсный «клон» LabVIEW написанный на джаве! LabVIEW хотя бы на C++, а это все же меньшее зло. Обе эти системы даже не сделаны «сами на себе» в графике. Они даже не пытаются претендовать на универсальную замену всем текстовым языкам, хотя LabVIEW могло бы, если бы не тупость копирастов. Эти системы написаны на текстовых языках, их код (даже если б LabVIEW был опенсорсным) невозможно редактировать, ни разу не обращаясь к текстовым языкам. Метапрог изначально предполагает полный отрыв от текста и текстовых языков, за исключением Си как бэкенда. И то пользователям никогда не придется иметь дело с текстовым Си за исключением блоков сишных вставок (для особых случаев типа арифметических операций, ассемблерных вставок итп).

5. Почему как бэкенд выбран именно Си?

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

6. В Си указатели и ручное управление памятью. Это же так сложно!

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

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

Пункт 6 касается разработки программ, то есть исполняемых файлов и библиотек. Для задач типа браузерных/игровых скриптов, разумеется, будут свои подмножества Метапрога без указателей.

8. Почему в Метапроге будут предпочитаться бинарные форматы и чем это лучше?

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

http://zone.ni.com/reference/en-XX/help/371361R-01/glang/flatten_to_string/

http://zone.ni.com/reference/en-XX/help/371361R-01/glang/unflatten_from_string/

Что-то подобное будет и в Метапроге. При открытом коде никаких сложностей с чтением бинарных файлов не будет.

9. А как будет обеспечиваться совместимость со старыми файлами, сетевыми протоколами итп, если будет изменен тип?

Если менять тип - надо использовать версионированный формат. Так будет несложно менять форматы файлов, сетевые протоколы итп, сохраняя обратную совместимость.

Примеры

Metaprog: универсальная графическая среда программирования [в разработке]

Metaprog: универсальная графическая среда программирования [в разработке] часть 2

Metaprog: универсальная графическая среда программирования [в разработке] часть 3

Прокручиваемая и выделяемая строка с автопереносом

https://i.postimg.cc/Gm6KMJBs/image.png

https://pastebin.com/SWJJwvvC

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

Скрины подфункций в следующем примере.

Тот же пример, но покрасивее

Что можно сделать для большего удобства? Убрать инициализацию, подвязку коллбэка на закрытие окна и главную петлю гтк в подддиаграму «главное окно»:

https://i.postimg.cc/vm5DYjsw/image.png

На сей раз не поленюсь сделать скрины и объяснить их суть.

В подфункциях есть три вида контейнеров с данными: константа (стала, constant), контроль и индикатор (сверху вниз):

https://i.postimg.cc/gJkfRVBd/image.png

Значение константы задается прямо в диаграмме. В Си константа превращается в объявление переменной с инициализатором. Контроли и индикаторы в теле подфункции превращаются в терминалы, к которым можно подключаться в «вызывающей» функции.

Сама подфункция «главное окно»:

https://i.postimg.cc/fbsDKR61/image.png

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

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

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

Подфункция для подцепки асинхронных функций:

https://i.postimg.cc/3r0rYVCS/image.png

Добавить объект в контейнер:

https://i.postimg.cc/SNGBhf51/image.png

Создаем лейбл из заданной строки (к сожалению, нуль-терминированной - типичный тупизм сишных библиотек), делаем его выделяемым и заодно вводим возможность переноса по словам:

https://i.postimg.cc/xjv7vP0j/image.png

Делаем лейбл (и любой другой нужный виджет) прокручиваемым:

https://i.postimg.cc/R0PtCmkd/image.png

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

https://pastebin.com/16bq1Jbs

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

Каст типов и тактическая победа над нуль-терминированными строками

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

https://i.postimg.cc/s2hrDj6b/image.png

Беззнаковое 32-битное, означающее размер массива (темно-синий провод) кастуется в знаковое 32-битное (светло-синие провода и пустая константа, задающая тип). Функция gtk_text_buffer_set_text в качестве размера строки берет беззнаковое, а не знаковое, как принято - видимо, чтобы через "-1" говорить, что строка нуль-терминированная. Но из-за этого вместо 4 гб строки туда можно подать лишь 2 гб - аж в 2 раза меншье! Что за люди?

Тем не менее, с нуль-терминированными функциями в текстовых полях покончено - и это победа!

https://pastebin.com/hQRMSZ1s

Также там был изменен текст. В остальном пример соответствует скринам выше.



Последнее исправление: CYB3R (всего исправлений: 7)

Ответ на: комментарий от metaprog

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

vq156 ★★
()
Ответ на: комментарий от rebforce

Это у него универсальный аргумент в стиле «Сперва добейся». Хотя о своих достижениях молчит или окукливается сразу.

vq156 ★★
()
Ответ на: комментарий от rebforce

Похоже, образцов для подражания в твоем исполнении мы не увидим. Или увидим? Жду до 3 мая твой концепт «визуальной среды». Осталось 3 дня.

metaprog
() автор топика
Ответ на: комментарий от metaprog

И даже не ставят цель перенести код проекта с джавы «сам на себя». Или таки ставят?

Вряд ли. Это не позиционируется как язык общего назначения.

curufinwe ★★★★★
()
Ответ на: комментарий от metaprog

Достижения? Не смеши, хотя ты тут полЛОРа рассмешил своими «достижениями» за 4 треда.
Скрины не равны достижениям.
Куски полурабочего вырвиглазного кода с 500 варнингами тоже на достижение не тянет.
ЗЫ ответ будет с стиле «давай свои достижения»

vq156 ★★
()
Последнее исправление: vq156 (всего исправлений: 1)
Ответ на: комментарий от vq156

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

А как насчет твоих достижений, о высшая мудрость ЛОРа?

metaprog
() автор топика
Ответ на: комментарий от rebforce

Я уже незнаю стоит ли дальше тратить время на него. Лулзы генерировать перестал, ведет себя агрессивно, теперь еще и с аргументацией проблемы...

vq156 ★★
()
Ответ на: комментарий от rebforce

Этот бот завис
Этот бот завис
Сразу видно, что ты не имеешь отношения ни к одной серьёзной разработке.
Сразу видно, что ты не имеешь отношения ни к одной серьёзной разработке.
Сразу видно, что ты не имеешь отношения ни к одной серьёзной разработке.
Сразу видно, что ты не имеешь отношения ни к одной серьёзной разработке.
Сразу видно, что ты не имеешь отношения ни к одной серьёзной разработке.

Deleted
()
Ответ на: комментарий от metaprog

ЗЫ ответ будет с стиле «давай свои достижения»
А как насчет твоих достижений,

Этот «погромист» сломался, почините кто-нибудь!

vq156 ★★
()
Ответ на: комментарий от metaprog

Так что в достижения себе я это засчитать могу.


Ты можешь засчитать себе все что угодно. Даже победу в Бородинском сражении.

vq156 ★★
()
Ответ на: комментарий от rebforce

Сферический в вакууме тест сферического Тьюринга в вакууме.

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

vq156 ★★
()
Ответ на: комментарий от rebforce

Но ты только и делаешь что пишешь глупости, показываешь свой нулевой опыт во всем чем только можно, поэтому это очень смешно от тебя такое слышать. Хотя я уже практически на 100% уверен что ты специально тупишь, эдакий злюка-тролль, возможно даже ты второй аккунт vq156, который испугался что звезды все же снимут.

Deleted
()
Ответ на: комментарий от vq156

О себе я все что надо уже сказал. Теперь хочется убедиться, что ты с rebforce - не обиженные жизнью рабы галер, срущие на форуме, чтобы поднять свое ЧСВ:

— Просто жить, и считать себя говном — слишком тяжело. Самоутверждение нужно мне, как воздух. Я научился не быть токсичным на работе, но стало ещё хуже. Потому что я существую не только на работе. Сижу в каком-нибудь чатике человек на тридцать, и срываюсь на бедолагах, которые ещё не поняли, что за моей самооценкой у меня ничего больше нет, и мои тяжеловесные синьорские аргументы втаптывают их в грязь только потому, что они меня уважают. Я ненавижу себя, когда так делаю, но кайф от превосходства хотя бы над кем-то — сильнее презрения к себе. Надеюсь, люди, которых я обижал когда-нибудь перестанут воспринимать это дерьмо всерьёз. https://habr.com/ru/post/443466/

metaprog
() автор топика
Ответ на: комментарий от Deleted

Второй аккаунт vq156? А почему не metaprog?

ты только и делаешь что пишешь глупости, показываешь свой нулевой опыт во всем чем только можно

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

rebforce
()
Ответ на: комментарий от rebforce

Да прекратите уже их кормить, сами же загаживаете дискуссию бесполезными и ребяческеми «ДОКАЖИ ЧТО НЕ ЛОХ». Давайте все покинем эти темы и вернемся через два месяца.

balsoft ★★
()
Ответ на: комментарий от q0tw4

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

if (my_enum == HTTP) { ... }
if (my_enum == JSON) { ... }
if (my_enum == TOR) { ... }
// Ещё 1000 таких вариантов

Замени это хоть на свитч, хоть на паттерн матчинг, сопровождать код проще не станет. А вот при грамотной декомпозиции и разбиении на разные классы/функции - будет очень легко.

arturianec100
()
Ответ на: комментарий от metaprog

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

vq156 ★★
()
Ответ на: комментарий от Deleted

возможно даже ты второй аккунт vq156

Достаточно просто посмотреть на даты регистрации чтобы убедиться в обратном. Хотя про ваши с Метапрогом аккаунты такого не скажешь.

vq156 ★★
()
Ответ на: комментарий от balsoft

Я тоже сначала думал, что игнор — лучшая тактика борьбы с такими страдающими СДВГ пациентами, однако пришёл к выводу, что без постоянного информирования новоприбывших о том, что это за перец, оставлять темы без присмотра опасно. Поясняю, как я вижу эту великую комбинацию наших доморощенных Остапов Бендеров:

  1. Есть Мегапрогер — ни черта не знающий десятиклассник (максимум второкурсник), педалящий говносхемки в лабвью. И тут в один прекрасный и фатальный для его моска день его осенило: «А чем я хуже Торвальдса? Я же хений! За джва месяца смогу полностью запилить принципиально новое революционное IDE! Всё бабло и все тёлки мои!» Но, поняв, что амбиции знаниям не соответствуют аж ни разу, он решает развести более-менее грамотную аудиторию технических ресурсов на халявную помощь. Не забывая при этом, что главная цель - таки бабло, а не продукт, и донаты понад усе.

  2. Есть Варфолохей — типичный ретроград-неудачник, недотролль и «админ локалхоста», не имеющий никакого опыта и навыков. Однако по сравнению с ТС даже он — Эйнштейн, и поэтому он не преминул воспользоваться такой возможностью потешить своё ЧСВ — в кои-то веки хоть кто-то начал его уважать и считать авторитетом.

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

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

rebforce
()
Ответ на: комментарий от rebforce

Этот бот завис, запускайте следующий.

потом бота перепишут на метапроге, и все будет хорошо

Deleted
()
Ответ на: комментарий от arturianec100

Замени это хоть на свитч, хоть на паттерн матчинг, сопровождать код проще не станет.

Именно, что проще (ну если код весь твой). Что может быть удобнее, чем собрать каждое действие разных сущностей в одно место. Сразу видно, какие есть варианты поведения в разных случаях, удобно добавлять новые действия, при добавлении новой сущности компилятор за ручку проведет по всем действиям. Все классы запихиваются в один файл - не надо бегать по ФС в поисках нужного класса. Бывало дело, заглянешь в чей-то софт и тупо не можешь найти, а где же код. Куча папок, в них классы с парой методов, реализация которых вызывает методы других классов и нигде не видно никакой логики. Запускашь - опп оно работает. В общем зачастую это ваше ООП превращается в нечитабельную магию, в то время как энумы со свичами последовательно описывают происходящее.

q0tw4 ★★★★
()
Ответ на: комментарий от rebforce

Странное это дело то чем ты занимаешься, ведь достаточно выше крутануть и убедиться в том что ты имеешь нулевые знания, и вообще почти все что ты пишешь какие то шизофренические выдумки, но мне все же интересно как объяснишь то что я «ретроград» (по твоим же словам).

Deleted
()
Ответ на: комментарий от q0tw4

не надо бегать по ФС в поисках нужного класса

Полностью поддерживаю!

Deleted
()
Ответ на: комментарий от rebforce

без постоянного информирования новоприбывших о том, что это за перец, оставлять темы без присмотра опасно

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

А переход на оскорбления, вангование и «нет ты», который я здесь наблюдаю — это тупиковый путь. Ещё раз предлагаю всем сторонам разойтись по своим IDE и выкладывать сюда либо то, что можно пощупать, либо __технические__ вопросы к ТСу, если он опять будет ляпать что-то эпохальное. Последние две страницы — это просто мусор в стиле «нет ты».

P.S. Я не верю, что донаты тут — главная цель, затмевающая проект. Если бы это было так, разводку можно было бы провести куда грамотнее. Я верю, что у ТСа есть положительные намерения (правда, есть ещё гипотеза, что он тонкий тролль, тончайший из когда-либо приходивших на ЛОР — но это опять-таки не про деньги).

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 4)
Ответ на: комментарий от rebforce

P.S. Страсти вокруг открытия исходников лабвьюшного прототипа вообще не понимаю. Мне они нафиг не упёрлись, например, я не буду из-за них Лабвью ни покупать, ни пиратить. Вот тарболл с сишными исходниками, когда они будут, я бы скачал и потестил. Но его ТС вроде бы и так обещал выложить без всяких условий. Ну так подождём, куда торопиться-то :)

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Страсти вокруг открытия исходников лабвьюшного прототипа вообще не понимаю. Мне они нафиг не упёрлись, например, я не буду из-за них Лабвью ни покупать, ни пиратить

Вот именно. Некоторым оппонентам просто хочется чего-то взять да потребовать. Что ж, пускай требуют, но прислушаться я готов только к просьбам адекватных участников дискуссии. Или пускай выкладывают 10 тысяч долларов, если хотят иметь моральное право от меня чего-то требовать:)

По готовности код Метапрога (уже настоящего) будет выложен под GPL v3. 3 версия это против тивоизации? Еще думаю как копирайт написать - metaprog team? Все равно ж GPL, перелицензировать его я не буду, главное написать так, чтоб никто из копирастов не мог его законно присвоить.

metaprog
() автор топика
Ответ на: комментарий от q0tw4

Если весь код твой

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

В больших проектах, где паттерны необходимы, декомпозиция по 100500 классов и файлов небходима - ради разделения кода между членами команды. Например, надо сделать реализацию функционала через 20 протоколов. Сделал интерфейс «Стратегии по работе с данными через любой протокол» и делегируешь работу команде. Вася - http, Петя - json, Вова - тор, и так далее, все делают свою часть работы в своём файле, а не общем. Если Петя наговнокодил, то запачкал только свой файл(ы), а не общий. Когда много файлов - проще изолировать говнокод от нормального.

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

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

Конечно же, «если код весь твой», то можно не заморачиваться со всем этим и писать как лично тебе удобнее. Покажи мне хоть ОДИН большой проект (много строк кода), где КАЖДЫЙ, а не только несколько ведущих разрабов полностью понимают все сущности и файлы с кодом.

arturianec100
()
Ответ на: комментарий от metaprog

metaprog team?

Можно и так. Ещё можно зарегистрировать торговую марку, чтобы обезопаситься от шустрых пареньков. Исходники в случае с GPL они у тебя не отнимут, но крови с переименованием проекта попортить могут.

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

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от rebforce

«Постоянное информирование» пожирает твоё личное время. Почти весь ЛОР составили своё личное мнение о метапроге и забили болт ещё в первом треде.

arturianec100
()
Ответ на: комментарий от hobbit

крови с переименованием проекта попортить могут

Типа зарегистрировать торговую марку «Метапрог»? Это как зарегистрировали торговую марку «Ардуино»?

metaprog
() автор топика
Ответ на: комментарий от metaprog

Не знаю, что там было с Ардуиной, но вот Линусу в своё время таки пришлось оторвать попу от кресла и зарегистрировать название Linux на себя. Ты же читал JFF, там эта история мельком упоминается.

hobbit ★★★★★
()
Ответ на: комментарий от arturianec100

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

Ладно, попробую пока сосредоточиться на разработке Метапрога и сутки не заходить на ЛОР. Попытаюсь наконец-то сделать графический аналог if...else

metaprog
() автор топика
Ответ на: комментарий от hobbit

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

Попытаюсь наконец-то сделать графический аналог if…else

ЛОЛ, я уже почти заплатил за metaprog.org, metaprog.net, metaprog.tech и metaprog.io за год, но тут ОП наконец-то убедил меня в том, что он просто троллирует.

balsoft ★★
()
Ответ на: комментарий от metaprog

Кстати, вот тут вы всё ноете про «никому ничего не должен». Как насчёт такого плана: я покупаю metaprog.org, metaprog.tech или metaprog.net на ваш выбор (один домен, на год) и передаю вам, а вы публикуете лабвюшные исходники. Сойдёт?

balsoft ★★
()
Последнее исправление: balsoft (всего исправлений: 1)
Ответ на: комментарий от balsoft

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

metaprog
() автор топика
Ответ на: комментарий от hobbit

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

P.S. Сейчас специально проверил - доменных зон .og, .rog, .prog и .ram тоже не существует, чтобы красиво было.

rebforce
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.