Программирование через форум

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Программирование через форум

Post by Shaos »

Я когда на днях выискивал то как теперь сообщения форума выглядят в базе данных MySQL и в HTML-выхлопе PHP, то обнаружил что блок code в HTML идёт прям как есть - между парами тэгов <pre><code> и </code></pre> :mrgreen:

Например вот такое:

Code: Select all


        ; i8080 assembler code
prompt  equ 0F86Ch
puts    equ 0F818h

        org 0

        lxi hl, msg
        call puts
        jmp prompt

msg:
        db 1fh,'radio-86rk snowa s nami!',0dh,0ah,0
        
Изнутри выглядит вот так:
Screenshot from 2025-01-19 00-00-29.png
т.е. абсолютно точно также! Отсюда у меня возникла мысль, а не использовать ли форум как способ написания программ пользователями для передачи их в эмуляторы на сайт? Например в http://rk86.net или http://Circuits.CC, которые будут работать на том же самом лондонском сервере? Надо просто обозначать как-то начало программы и конец программы, указывать имя программы в начале (чтобы можно было отличать друг от друга разные программы приведённые на одной и той же страничке форума) и давать ссылку на это сообщение плюс имя программы в некий сервис написанный на PHP, который будет с этой программой что-то делать...
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Внутри PHP-программки может быть команда exec, которая на сервере будет запускать некие бинарные сборки (компиляторы, интерпретаторы и т.д.), которые могут чего-то делать с входным текстом - надо правда следить чтобы не было дыр, позволяющих запускать произвольные каки-бяки, ну и надо запрещать запускать это хозяйство слишком часто (если вдруг поисковики или AI-боты начнут этот PHP массово дёргать), например если это компилятор/ассемблер, то в PHP можно выделить текст программы из странички, потом посчитать его хэш - если хэш совпадает с уже обработанной программой, то выдаём старый бинарь из кэша (всё это на уровне PHP), а если не совпадает (или эта программа запускается первый раз), то PHP будет запускать нативный бинарник для генерации нового результата...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Shaos wrote: 19 Jan 2025 00:57 Отсюда у меня возникла мысль, а не использовать ли форум как способ написания программ пользователями для передачи их в эмуляторы на сервер? Например в http://rk86.net или http://Circuits.CC, которые будут работать на том же самом лондонском сервере? Надо просто обозначать как-то начало программы и конец программы, указывать имя программы в начале (чтобы можно было отличать друг от друга разные программы приведённые на одной и той же страничке форума) и давать ссылку на это сообщение плюс имя программы в некий сервис написанный на PHP, который будет с этой программой что-то делать...
В этот PHP сервис можно вместо имени программ post_id передавать, по которому будет строиться ссылка вида http://www.nedopc.org/forum/viewtopic.php?p=176029 по которой будет забираться HTML-код, внутри которого будет искаться строчка id=“p176029”, после которой надо будет вычитать блок code для дальнейшего использования.

P.S. По идее можно даже автоматические инклуды организовать используя разные post_id, но это уже потом...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Можно это дело расширить до недовики - там preformatted text ( между [@ и @] ) тоже идёт в HTML как есть (между тэгами <pre ...> и </pre>):

Code: Select all

<div class='vspace'></div><pre  style='color: green;' class='escaped'>
   ; abc
abc EQU 100
   END
</pre>
Отличать идентификатор форума от вики очень просто - если идентифицируемся числом, то это форум, а если строкой с / посередине - то это вики

Например Main/WikiSandbox уведёт на http://www.nedopc.org/nedopc/Main/WikiSandbox (где вставлена вышеприведённая кодовая вставка)

P.S. А если точка есть, то можно увести на троичную вику http://3niti.org :lol:
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Сделал прототип, который может брать код из форума:

http://nedopc.org/decode.php?p=176029

Из недовики:

http://nedopc.org/decode.php?p=Main/WikiSandbox

И даже из троичной вики (которая живёт на другом сервере):

http://nedopc.org/decode.php?p=Library.HEADER

Плюс вечером 22 января 2025 года добавил ещё один источник кодовых блоков - ii/IDEC:

http://nedopc.org/decode.php?p=2wOAgh97j7RzkAn6DBHv

Код возвращается с хедером plain/text и далее его можно включать в JS-приложения через AJAX

P.S. Пришлось ещё добавить подмену &lt; на < и &gt; на > т.к. оно бывает в ответах и там, и там :neutral:

P.P.S. Ещё из отличий - в случае форума оно ищет id="pXXXX" (т.к. на страничке будет несколько сообщений и нужно найти правильное) и далее берёт один единственный кодовый блок, а в случае вики оно собирает все кодовые блоки на странице.

P.P.P.S. Надо подумать как прикрутить инклуды для форумных ссылок (а вот для вики инклуды уже есть на уровне движка PmWiki)...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Shaos wrote: 21 Jan 2025 02:39 Надо подумать как прикрутить инклуды для форумных ссылок (а вот для вики инклуды уже есть на уровне движка PmWiki)...
Вроде сделал - если строка начинается с плюса, то это включение:

Code: Select all

+Main/WikiSandbox
+176029
bebebe
+176029
http://nedopc.org/decode.php?p=176132

Плюс ещё сделал защиту от повторного включения одного и того же (на месте второго +176029 будет ERROR) - это для защиты от рекурсивных инклудов, которые будут зазря нагружать сервер и выходить по таймауту :roll:

Исходник PHP-скрипта под спойлером (обновлено 22 января 2025 года):

 decode.php

Code: Select all

<?php header('Content-Type: text/plain; charset=utf-8');

// THIS CODE IS PUBLIC DOMAIN - USE IT ON YOUR OWN RISK!!!

$a = array();

if(isset($_GET["p"])) decode($_GET["p"]);

function decode($param)
{
 global $a;
 $p = substr($param,0,32);
 array_push($a,$p);
 if(strstr($p,"..")!==false) return;
 if(strstr($p,":")!==false) return;
 if(strstr($p,";")!==false) return;
 if(strstr($p,"%")!==false) return;
 if(strstr($p," ")!==false) return;
 if(substr($p,0,1)=="/") return;
 $n = intval($p);
 $nedo = false;
 $idec = false;
 if($n==$p)
 {
  $url = "http://www.nedopc.org/forum/viewtopic.php?p=".$n;
  $nedo = true;
 }
 elseif(strstr($p,"/")!==false)
 {
  $url = "http://www.nedopc.org/nedopc/".$p;
 }
 elseif(strstr($p,".")!==false)
 {
  $url = "http://3niti.org/wiki/?n=".$p;
 }
 elseif(strlen($p)==20)
 {
  $url = "https://sprinternet.io/iii/m/".$p;
  $idec = true;
 }
 else
 {
  $url = "http://www.nedopc.org/nedopc/INC/".$p;
 }
 $lines = explode("\n",file_get_contents("$url"));
 $state = 1;
 if($nedo) $state = 0;
 foreach($lines as $line)
 {
  if($state==0)
  {
   if(strstr($line,"id=\"p".$n)!==false) $state = 1;
  }
  if($state==1)
  {
   if($idec) $pre = strstr($line,"====");
   else $pre = strstr($line,"<pre");
   if($pre!==false)
   {
    $state = 2;
    if($idec) continue;
    $line = strstr($pre,">");
    if($nedo) $line = substr($line,7);
    else $line = substr($line,1);
   }
  }
  if($state==2)
  {
   $end = false;
   if($idec) $end = strstr($line,"====");
   else $end = strstr($line,"</pre>");
   if($end!==false)
   {
    if($nedo) $state = 3;
    else $state = 1;
   }
   else
   {
    if(substr($line,0,1)=="+")
    {
     if(!in_array($line,$a))
      decode(substr($line,1));
    }
    else
    {
     $line = str_replace("&lt;","<",$line);
     $line = str_replace("&gt;",">",$line);
     $line = str_replace("&amp;","&",$line);
     echo $line."\n";
    }
   }
  }
 }
}
?>

https://gitlab.com/nedopc/sdk/-/blob/master/rgrid/decode.php

P.S. Как можно видеть второй кодовый блок (с текстом PHP-скрипта) в выход не включается т.к. в случае форума (числовой идентификатор) берётся первый кодовый блок из указанного сообщения, а все остальные игнорируются!

P.P.S. Вечерком обновил PHP-исходник так, чтобы его можно было инклудить в другие PHP и чтобы амперсанд тоже восстанавливался (см. ниже)

P.P.P.S. 22 января 2025 года обновил PHP-исходник ещё раз, чтобы включить ii/IDEC-транспорт плюс добавил кой-какие проверки во избежание...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

А теперь попробуем исходник на языке Robby :lol:

Code: Select all

// CREATED: 17-JUL-2024
// UPDATED: 20-JUL-2024
ROBOT "TEST-0001"
AUTHOR "SHAOS"
+INC/ROBBY
main()
{
 text "<><><><><><><><><><> MAIN-BEGIN"

 def ar[5] = "XYZ" // ar[0] holds size
 def arr[10] = {100, 101, 102}

 A = &arr
 B = A[0]
 C = A[1]

 say "&A &B &C #&A #&B #&C $&AR[1] SZ=&AR[0] "

 text "<><><><><><><><><><> MAIN-END"
}
http://nedopc.org/decode.php?p=176139

Стандартный инклуд +INC/ROBBY реализован вот через эту недовики-страничку:

http://www.nedopc.org/nedopc/INC/ROBBY

P.S. Балин ещё &amp; надо заменять на & :roll:
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Shaos wrote: 21 Jan 2025 02:39 Плюс вечером 22 января 2025 года добавил ещё один источник кодовых блоков - ii/IDEC:

http://nedopc.org/decode.php?p=2wOAgh97j7RzkAn6DBHv
Поддержал сегодня IDEC - вобщем сейчас алгоритм такой:

1) если это десятичное число без суффиксов, то это форум
2) если в слове есть / то это недовики
3) если в слове есть . то это троичная вики
4) если длина слова 20 символов, то это IDEC
5) иначе пробуем открыть статью недовики INC/слово

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

P.S. Коллективное программирование через троичную вики я планировал ещё в 2008 году: http://ternary.info/wiki/index.php?n=Main.Contribute (точнее тогда я задумывал написание троичного компьютера на некоем гипотетическом языке описания троичных автоматов под названием "тримулятор", но оно не получилось)...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Я уже подошёл вплотную к серверной компиляции роботов на языке Robby - будет другой PHP-скрипт, которому будет передаваться post_id (или имя странички вики), по которому он будет смотреть а нету ли уже скомпилированного робота с таким айдишником - елси есть, то будет возвращён код робота в текстовом виде JSON, а если нет - будет компилировать и уже потом возвращать JSON. Это может пригодиться скажем для экспериментов с nedoPC-стандартом онлайновых приложений так сказать "на лету". Простейший робот для тестирования компилятора:

Code: Select all

robot "useless"
author "me"
start:
end
P.S. Если при компиляции случилась ошибка, то это тоже надо будет сохранить как JSON и больше уже этот айдишник не перекомпилировать (во избежании перегрузки сервера если какой-то паук начнёт эти урлы обходить) - формат может быть таким:

Code: Select all

robot = {"error":"something something"}
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Сделал:

http://nedopc.org/exec/robbyc.php?s=176268

Что возвращает скомпилированного JSON-робота по исходнику в предыдущем сообщении:

Code: Select all

var robot = {"robot":"useless",
 "author":"me",
 "varm":0,
 "vars":[],
 "negs":[],
 "regs":[],
 "color":"#FFFFFF",
 "code":[255],
 "platform":2
}
Плюс к этому на сервере остаются артефакты компиляции:

http://nedopc.org/exec/robots/176268.Robot (сохранённый текст робота со всеми включениями)
http://nedopc.org/exec/robots/176268.Robot! (текст робота после препроцессора)
http://nedopc.org/exec/robots/176268.RLS (листинг после компиляции)
http://nedopc.org/exec/robots/176268.RO (скомпилированный робот в бинарном виде)
http://nedopc.org/exec/robots/176268.rjs (скомпилированный робот в текстовом виде JSON без var robot =)

В случае если в идентификаторе есть / или точка (т.е. робот пришёл из вики), то они заменяются на 0

P.S. Ещё добавил проверку, что в теле программы есть слово robot - если нет, то сразу же пишется ошибка "Not a robot" (при этом никакие артефакты компиляции не создаются)
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Пример с ошибкой:

Code: Select all

robot "фигня"
author "не я"
main()
{
ошибка
}
Компилятор распознаёт ошибку в пятой строке:

Code: Select all

var robot = {"error":"176311.Robot(5): ошибка\nERROR 7: Unknown command after START"}


Артефакты для роботов с ошибками тоже создаются, но без RO:

http://nedopc.org/exec/robots/176311.Robot (сохранённый текст робота со всеми включениями)
http://nedopc.org/exec/robots/176311.Robot! (текст робота после препроцессора)
http://nedopc.org/exec/robots/176311.RLS (листинг после компиляции - в данном случае там сообщение об ошибке)
http://nedopc.org/exec/robots/176311.rjs (сообщение об ошибке в виде JSON)

Повторная попытка скомпилировать робота (даже после исправления) всё равно вернёт то, что уже есть на сервере - поэтому если хочется удалить старые артефакты, чтобы создались новые, то надо будет просить админа (меня) - это сделано для того, чтобы если в форуме останется сломанный робот какие-нибудь AI-пауки не запускали бы заведомо битую компиляцию много-много раз нагружая сервер попусту...
b2m
Devil
Posts: 920
Joined: 26 May 2003 06:57

Re: Программирование через форум

Post by b2m »

Shaos wrote: 26 Jan 2025 23:52Повторная попытка скомпилировать робота (даже после исправления) всё равно вернёт то, что у же есть на сервере - поэтому если хочется удалить старые артефакты, чтобы создались новые, то надо будет просить админа (меня) - это сделано для того, чтобы если в форуме останется сломанный робот какие-нибудь AI-пауки не запускали бы заведомо битую компиляцию много-много раз нагружая сервер попусту...
Может лучше сохранять sha256 исходного кода и если он изменился, то всё же пересоздать артефакты? Всякие "AI-пауки" вряд ли смогут изменить содержимое поста, а вот автор сможет.

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

Ну или так: сохранять артефакты как аттачи к посту от имени автора поста, тогда он сам сможет их удалить.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Я подумаю над возможностью использования хэша - изначально ведь так и хотел, но потом решил сделать по простому:
Shaos wrote: 19 Jan 2025 02:07 Внутри PHP-программки может быть команда exec, которая на сервере будет запускать некие бинарные сборки (компиляторы, интерпретаторы и т.д.), которые могут чего-то делать с входным текстом - надо правда следить чтобы не было дыр, позволяющих запускать произвольные каки-бяки, ну и надо запрещать запускать это хозяйство слишком часто (если вдруг поисковики или AI-боты начнут этот PHP массово дёргать), например если это компилятор/ассемблер, то в PHP можно выделить текст программы из странички, потом посчитать его хэш - если хэш совпадает с уже обработанной программой, то выдаём старый бинарь из кэша (всё это на уровне PHP), а если не совпадает (или эта программа запускается первый раз), то PHP будет запускать нативный бинарник для генерации нового результата...
P.S. Кстати я сохраняю ведь текст программы целиком (причём после применения всех никлудов) - так можно просто тупо сравнивать новый текст со старым текстом и если они равны, то выдавать старый JSON без компиляции - и никаких хэшей...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Shaos wrote: 27 Jan 2025 08:42Кстати я сохраняю ведь текст программы целиком (причём после применения всех никлудов) - так можно просто тупо сравнивать новый текст со старым текстом и если они равны, то выдавать старый JSON без компиляции - и никаких хэшей...
Правда при этом мне придётся при каждом вызове вычитывать исходник для сравнения, а этого бы мне не хотелось - вобщем пока пусть остаётся так:

 exec/robbyc.php

Code: Select all

<?php header('Content-Type: text/plain; charset=utf-8');

// THIS CODE IS PUBLIC DOMAIN - USE IT ON YOUR OWN RISK!!!

include('../decode.php');

if(isset($_GET["s"])) robbyc($_GET["s"]);

function robbyc($source)
{
 $source2 = str_replace('/','0',$source);
 $source3 = str_replace('.','0',$source2);
 $source4 = str_replace('_','0',$source3);
 if(!ctype_alnum($source4)) return;
 $filename = dirname(__FILE__).'/robots/'.$source4;
 if(file_exists($filename.'.rjs'))
 {
  echo 'var robot = '.file_get_contents($filename.'.rjs');
  return;
 }
 ob_start();
 decode($source);
 $robot = ob_get_clean();
 if(empty($robot))
 {
   echo 'var robot = {"error":"Not exist"}';
   return;
 }
 if(stristr($robot,'robot')===false || stristr($robot,'author')===false)
 {
   echo 'var robot = {"error":"Not a robot"}';
   return;
 }
 file_put_contents($filename.'.Robot',$robot,LOCK_EX);
 $output = shell_exec('robbyc -p -l -r -n '.$filename.'.Robot');
 $error = '';
 $prev = '';
 $lines = explode("\n",$output);
 foreach($lines as $line)
 {
   if(strstr($line,'ERROR')!==false)
   {
      $error = $prev.'\n'.$line;
   }
   if(empty($line)) continue;
   $prev = $line;
 }
 echo 'var robot = ';
 if(empty($error))
 {
    echo file_get_contents($filename.'.rjs');
 }
 else
 {
    $errobj = '{"error":"'.$error.'"}';
    echo $errobj;
    file_put_contents($filename.'.rjs',$errobj);
 }
}
?>

https://gitlab.com/nedopc/sdk/-/blob/master/rgrid/exec/robbyc.php

Теперь для nedoPC-стандарта онлайновых приложений надо написать ещё один PHP-скрипт, который по цепочке параметров будет строить HTML-страничку с контролами и будет компилировать и цеплять управляющего ими робота...
User avatar
Shaos
Admin
Posts: 24236
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программирование через форум

Post by Shaos »

Shaos wrote: 26 Jan 2025 23:52 Пример с ошибкой:

Code: Select all

robot "фигня"
author "не я"
main()
{
ошибка
}
Компилятор распознаёт ошибку в пятой строке:

Code: Select all

var robot = {"error":"176311.Robot(5): ошибка\nERROR 7: Unknown command after START"}
Сделал новый BB-код button со скрытым урлом :lol: