Открываем сайт из списка по случайному закону   

                                   Наш девиз:    Вот тебе хомут и дуга, а я тебе не слуга.

Адрес документа

http://shabronov_s2.dyn-dns.ru/temp/melodii_rnd/melodii_rnd.doc     инд: 2-22-2    

Архив программ

http://shabronov_s2.dyn-dns.ru/temp/melodii_rnd/melodii_rnd.zip   

 

От автора:

·        Приведена программа  поиска текста в тексте и последующих действий с "найденышем";

·        Действия -  открыть ссылку на сайт, выбрав ее случайным образом;

·        Программа  написана на языке FORTH, имеет статус «свободного» применения, предназначена для  изучающих  FORTH и доступна всем желающим  без возрастных ограничений;

·        Возможно, данная программа  позволит вылечить ипохондрию, депрессию, и надеяться на лучшие события, но рассчитывать худшие варианты.

·        Список сайтов - это музыкальные и фото фрагменты автора в разных событиях наших реалий;

 

Вступление

·        Данная программа, из  области задач поиска. Автор на своем авторском сайте для себя и своих знакомых располагает музыкальные фото события. Где бывал, кого видал. Соединил все, или почти все ссылки в  один html-ный файл и поместил на своем сайте. 

·        Выбрал ссылку, перешел на нее. Смотри и радуйся. А потом это утомило - выбирать!

·        Вот и поскольку лень движет человечеством и автором тоже - он и написал такую программку, которая выбирает ссылки и открывает их.

·        Теперь пусть "мучается" компьютер "проблемой  выбора". Хотя по компьютеру,  это не заметно.

 

Текст программы.

·         Программа находиться в архиве  , это текстовый файл melodii_rnd.f и дополнительно он приведен ниже в таблице.

 

 

\ программа на языке ФОРТ = ОТКРЫТЬ САЙТ ИЗ СПИСКА БОЛЬШОГО КОЛИЧЕСТВА ПО СЛУЧАЙНОМУ ЗАКОНУ=

\  -------------------------------------------------------------------------------

\

\ Описание алгоритма программы:

\ - выполняется поиск по тексту в файле  ссылок, которые начинаются  http:..... 

\   Текст ссылки обязательно должен заканчиваться пробелом! Это поисковый признак. 

\  после пробела любая комментирующая информация. Не должна содержать поисковый компонент.

\  - список сайтов - это текстовый файл, формируется блокнотом, кодировка WIN-1251 ANSI-кирилица

\    в данной программе этот файл называется melodii_rnd.txt

\  Автор приводит ссылки своих музыкальных поздравлений и путешествий со своего сайта.

\  Вы можете заполнить  список ссылками своих телевизионных программ или любимых книг или музыкальных

\  произведений. Даже можно из раздела xxx, если Вам <16 и у Вас есть либидо. Шутка.;

\ - первый проход - подсчет количества ссылок;

\ - из количества выбирается случайное число;

\ - второй проход по случайному числу находится ссылка и открывается  браузером, установленным по умолчанию;

\ - программа закрывается;

\ - программа компилируется forh компилятором 100_spf4.exe   и создает исполняемый файл melodii_rnd.exe

\ - текст программы - melodii_rnd.f  

\

\ архив программы с текстом и компилятором расположен на авторском сайте

\ по адресу http://90.189.213.191:4422/temp/melodii_rnd/  

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

\ Успехов и здоровья!  

\ автор Шабронов Андрей Анатольевич тс +7-913-905-8839  shabronov@ngs.ru

\

\ начало текста программы

\  далее слова для   контроля и отладки ?KEY1 STOP1

: ?KEY1  ( K --> код клавиши без останова  )   KEY? IF  PENDING-CHAR @  ELSE 0  THEN ;

: STOP1 BEGIN ?KEY1 DUP 0x1B = IF BYE THEN 0x20 = UNTIL ( останов, выход по нажатию ESC продолжить - Пробел  ) ;

CREATE KKS_B  0 ,  ( переменная для временного хранения системы счисления )

: KKS (  контроль стека с предупреждением о  исчерпании стека )

  BASE @ KKS_B ! ( систему счисления  на сохранение )

  CR ."  ctk,N--> " DECIMAL

  DEPTH DUP 1 < IF  DUP 0= IF  .  ."  STEK PUSTO!" ( при 0 )

                           ELSE  DROP ." ОШИБКА! - СТЕК ИСЧЕРПАН !!! "

                           THEN

                ELSE  DUP  .  HEX ."  = "     .SN

                THEN      ."   -->  "

       KKS_B @ BASE ! ( вернули систему счисления  )

     ;

\ далее слова для выполнения действий по программе    

WINAPI:   GetTickCount      KERNEL32.DLL  ( системная подпрограмма получить время c начала загрузки мс в системе )

WINAPI:   ShellExecuteA     SHELL32.DLL   (  системная подпрограмма  выполнение текста ссылки )

 

VARIABLE RND ( переменная для получения случайного числа из случайного времени включения )

0x10450405 CONSTANT generator ( константа такая вот, можно что то и другое поставить )

: RANDOMIZE GetTickCount RND ! ;

: RANDOM  ( -- n )  RND @ generator UM* DROP 1+ DUP RND ! ;

: CHOOSE ( n -- 0..n-1  случайное число ) RANDOM UM* NIP ;

 

: START_link_clik ( An n  -  PZout -  выполняется ссылка по тексту Аn N )

   DROP  5  0 0    ( An K1 K2 K3 -- )  3 ROLL   ( K1 K2 K3 An -- )

   S" open" DROP    0 ShellExecuteA  (  pz- ---  )  DROP

; 

 

: POISK_WWW_IN_MEM (  Af Nf --  Af Nf  Ns  )

      2DUP (  Af Nf Af Nf --  дублируем расположение  )

           0 (   Af Nf Ns=0 --  Ns    cчетчик  установили 0 )

     ROT ROT (  Ns=0 Af Nf -- )

      S" http:" ( Ns=0 Af Nf  Ap Np -- указываем адрес строки текста поиска )

          2SWAP (  Ns=0  Ap Np Af Nf --  поисковый компонент подготовлен в стеке )

     BEGIN   (  Ns=0 Ap Np Af Nf -- )

          2OVER   ( дублируем поисковый компонент )        

          SEARCH  ( выполняем поиск если нашли то -1 если нет то 0 и выходим за repeat )

    WHILE  ( Ns=0 Ap Np Af' Nf' --  Аf  сместился на место найденого слова Nf - уменьшилось на тоже значение )

         >R >R >R >R 1+ R> R> R> R>  (  увеличиваем счетчик из глубины стека на 1 т.к. нашли одно совпадение )

         >R  OVER + R>  ( сместил адрес поиска )

    REPEAT ( Ns=0 Ap Np Af' Nf' -- )

   2DROP 2DROP (  Ns - оставили только результат найденого количества ) 

   DUP 0= IF DROP  7 EMIT 7 EMIT BYE THEN ( выходим с пиком если нет в файле нужных строк )

;

 

: OPEN_FILE_IN_MEM ( An n -  Af Nf --  файл  открывается и переписывается в память начиная с Аf и размер Nf )

     R/O OPEN-FILE-SHARED  0<>   IF DROP  7 EMIT 7 EMIT BYE THEN ( выходим с пиком если нет файла )

      ( fr -- ) DUP ( fr fr --  открыли файл получили дескриптор и продублировали далее считаем размер файла  )

      FILE-SIZE ( fileid -- ud ior  ) 2DROP ( fr N2 -->  подсчитали Nf и перевели  в одинарное значение из двойного слова )

      DUP  ALLOCATE THROW    (  fr Nf Af  -- заняли память под exe файл начало Af в количестве Nf   )

      SWAP ( fr Af Nf --- в стеке данные выделенной памяти под размер проверяемого файла ) 

      2DUP ( fR Af Nf Af Nf - задублировали  )

      4 PICK ( fr Af Nf Af Nf fr - достали из глубины стека дескриптор открытого файла )

      READ-FILE ( c-addr u1 fileid -- u2 ior )  2DROP (  -->  считали файл в память  и убрали значение считанных байт )

     ( fr Af Nf --  )   ROT CLOSE-FILE ( fr -- ior ) DROP  ( и закрыли тот файл который ужо в памяти  )      

     ( An Nf -- )

;

 

: RND_NS_UST (  An Nf Ns --  An Nf Nsrnd'  из полученного количества случайным образом выбираем число )

   RANDOMIZE  ( случайно время системы )

   CHOOSE ( n -- 0..n-1  )

;

 

:  POISK_NS_IN_MEM_P1 (  An Nf Nsrnd -- An Nf Ac Ns -- получаем строку выбранную случайно )

     ROT ROT ( Nrnd An Nf -- )

     2DUP ( Nrnd Af Nf Af Nf --  дублируем расположение  )

           0 (   Af Nf Ns=0 --  Ns    cчетчик  установили 0 )

     ROT ROT (  Ns=0 Af Nf -- )

      S" http:" (  Ns=0 Af Nf  Ap Np -- указываем адрес строки текста поиска )

          2SWAP (  Ns=0  Ap Np Af Nf --  поисковый компонент подготовлен в стеке )

     BEGIN   (  Ns=0 Ap Np Af Nf -- )

          2OVER   ( дублируем поисковый компонент )        

          SEARCH  ( выполняем поиск если нашли то -1 если нет то 0 и выходим за repeat )

    WHILE  ( Nsrn Af Nf Ni Ap Np  Af' Nf' --   повторный поиск и сравниваем Nsrn c Ni  )

          4 PICK  8 PICK  = IF   EXIT THEN

         ( вводим проверку и выход из слова если нашли совпадение оно должно быть всегда это второй поиск )

         >R >R >R >R 1+ R> R> R> R>  (  увеличиваем счетчик из глубины стека на 1 т.к. нашли одно совпадение )

         >R  OVER + R>  ( сместил адрес поиска )

    REPEAT ( Ns=0 Ap Np Af' Nf' -- )

    2DROP 2DROP DROP (  тут выхода нет )   BYE

  ;

 

: POISK_NS_IN_MEM (  An Nf Nsrnd -- Ac Ns -- получаем строку выбранную случайно )

  POISK_NS_IN_MEM_P1 (  An Nf Nsrnd --  Nsrn Af Nf Ni Ap Np  Af' Nf' -- получаем строку выбранную случайно )

   2DUP  S"  "  (  поисковый компонент пробелл )

  SEARCH  ( выполняем поиск окончания строки по коду ПБ если нашли то -1 если нет то 0 и выходим  )

  IF   DROP ( удаляем количество поиска по пробелу )

       2 PICK - ( получаем количество до пробела )

       SWAP DROP ( Ac Ns -  убираем общее количество и оставляем количество до пробела получили строку )    

       2DUP +  0 SWAP C!  (  пишем байт 0 после количества т.е. формируем строку со счетчиком )

  ELSE  DROP  7 EMIT 7 EMIT BYE  THEN

   >R >R  2DROP 2DROP DROP  R> R>  ( убрали из стека все адреса оставили строку )

;

 

: START_WWW_RND_TEST ( -- запуск  ссылок содержащихся в файле  )

      S" melodii_rnd.txt"   ( An N --  имя файла в котором выполняется поиск  )

      OPEN_FILE_IN_MEM      ( An n -  Af Nf --  файл переписывается в память начиная с Аf и размер Nf )

      POISK_WWW_IN_MEM      ( Af Nf -- An Nf  Ns --   выполняется поиск cтрок в выделенной памяти )

      RND_NS_UST            ( An Nf Ns --  An Nf Nsrnd'  из полученного количества случайным образом выбираем число )

      POISK_NS_IN_MEM       ( An Nf Nsrnd -- Ac Ns -- получаем строку выбранную случайно )

      START_link_clik       ( An n -- выполняем текст ссылки открываем ее браузером )

      BYE                   ( все ок, программа прекращает работу - выделенная память системой закрывается )  

;

 

'  START_WWW_RND_TEST   TO <MAIN> ( установили выполняемое слово )

   S" melodii_rnd.exe" SAVE       ( записали файл выполнения )

   BYE   ( вышли из компиляции текста  )

\ текст программы окончен

 

 

Получение программы из текста.

·        Текст есть, нужен компилятор языка программирования FORTH. Это файл  100_spf4.exe  Он так же находиться в архиве.

·        Создать новый  файл melodii_rnd.exe – выполнить в каталоге компиляцию текста компилятором FORTH spf4.exe   \\100_spf4.exe  melodii_rnd.f <enter>   Сформируется новый исполняемый файл.

·        В файле melodii_rnd.txt  расположены ссылки автора. Но Вы можете заменить их на свои.

·        Редактировать txt файл можно любым ТЕКСТОВЫМ редактором, например БЛОКНОТОМ.

·        Формат файла текстовый, кодировка 1251 WIN русская.

·        Для открытия сайтов браузером требуется два файла melodii_rnd.exe  и melodii_rnd.txt 

·        Выполнить файлы можно в любом месте. Важно, что бы они были вместе.  

 

Выводы  

·        Данная  программа предназначена для заставок и показывает как  перенести "проблему выбора"  в область машинного интеллекта.

·        Есть ли у машины интеллект?  Но, если нет машинного интеллекта? Но что, же тогда выбирает? Во общем не понятно, но работает.

·        Принцип действий "нажал раз и получил результат".  Выбирает датчик случайных чисел.

·        Автор постарался дать текст упрощенный, "ученический" и  в максимально подробном стиле, для уяснения алгоритма. Задача темы показать основные принципы работы FORTa

·        Программа не устанавливается, не прописывается в системные библиотеки.

·        Программа работает под операционными системами WINDOWS 95/98/NT/2000/XP/Vista/Win7/8/10 и использует только функции api- ядра системы

·        Программа написана на языке Форт версия  spf4.exe – автор  А. Черезов  http://www.forth.org.ru

·        Программа доступна для использования, изучения и модификации всем желающим.

·        За модифицированный  тест отвечает сам модификатор. Автор может, при наличии времени, только кратко провести консультацию по используемым им forth-словам.

·        Автор оставляет за собой право на модификацию и улучшение алгоритма и отображения.

·        Сторонние ссылки в работе даны для пояснения материала, взяты в свободном доступе и не нарушают других авторских прав.

·        Сторонние  ссылки могут не работать, по причине изменений их владельцами ссылок и автор просит об этом помнить при чтении работы и понимать, что все течет и все изменяется;

·        Архив данной работы продублирован на облачном хранилище по адресу:  https://cloud.mail.ru/public/KNsy/ccShS6QnP

 

---------------------------------------------------------------------------------------------------------------------------------

Автор - Шабронов Андрей Анатольевич  Тс.  +7 913-905-8839     e_mail -  shabronov@ngs.ru  

ред. 2017-8-20  .

    Успехов и здоровья!