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

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

Moderator: Shaos

Post Reply
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

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
Screenshot from 2025-01-19 00-00-29.png (40.33 KiB) Viewed 1289 times

т.е. абсолютно точно также! Отсюда у меня возникла мысль, а не использовать ли форум как способ написания программ пользователями для передачи их в эмуляторы на сайт? Например в http://rk86.net или http://Circuits.CC, которые будут работать на том же самом лондонском сервере? Надо просто обозначать как-то начало программы и конец программы, указывать имя программы в начале (чтобы можно было отличать друг от друга разные программы приведённые на одной и той же страничке форума) и давать ссылку на это сообщение плюс имя программы в некий сервис написанный на PHP, который будет с этой программой что-то делать...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

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

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

Post by Shaos »

Shaos wrote: 19 Jan 2025 07: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, но это уже потом...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

Shaos wrote: 21 Jan 2025 09: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-транспорт плюс добавил кой-какие проверки во избежание...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

Shaos wrote: 21 Jan 2025 09: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 (точнее тогда я задумывал написание троичного компьютера на некоем гипотетическом языке описания троичных автоматов под названием "тримулятор", но оно не получилось)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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"}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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" (при этом никакие артефакты компиляции не создаются)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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-пауки не запускали бы заведомо битую компиляцию много-много раз нагружая сервер попусту...
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 905
Joined: 26 May 2003 13:57
Contact:

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

Post by b2m »

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

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

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

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

Post by Shaos »

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

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

Post by Shaos »

Shaos wrote: 27 Jan 2025 15: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-страничку с контролами и будет компилировать и цеплять управляющего ими робота...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23864
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

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

Post by Shaos »

Shaos wrote: 27 Jan 2025 06: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:
Я тут за главного - если что шлите мыло на me собака shaos точка net
Post Reply