Forth
http://fforum.winglion.ru/

Блог программиста любителя
http://fforum.winglion.ru/viewtopic.php?f=12&t=3103
Страница 1 из 8

Автор:  vikt [ Пт сен 02, 2016 01:32 ]
Заголовок сообщения:  Блог программиста любителя

Здравствуйте! Я программист-любитель, пишу программы для себя.
То есть у меня нет проблем в том, что бы поддерживать пользователей,
соблюдения сроков и другой кухни проффессионалов.
Но нет и благотворной критики.
Решил завести небольшой блог, думаю для меня это будет большим стимулом
улучшать качество и опрятность своих работ, раз их придеться демонстрировать
другим людям.

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

Автор:  vikt [ Пт сен 09, 2016 02:34 ]
Заголовок сообщения:  Re: Блог программиста любителя

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

Их три - электронная таблица, навигационная, и программа для фотографирования.
Все они написанны для j2me (старых телефонов с поддержкой ява),
но буду адаптировать их на андроид.

Почемц j2me, а не андроид или айфон?
Дело в том, что я заядлый велосипедист, и в автономе бываю довольно часто.
Андроиды и разные GoPro, навигаторы, зеркалки и прочая лабуда
много весит, занимает место, жрет электричество в огромных
кол-вах. Для запитывания всей этой фигни. возят с собой
еще powerbank. Кто-то пытался использовать солнечные
батареи, но получается очень громоздко.
Все перечисленное может делать старый телефон. Похуже конечно.
Но к нему можно взять легкую запасную батарею, а от
повербанк его можно подзаряжать в течение года.
И еще, попробуйте набрать номер, одной рукой управляя
велосипедом, а другой елозя пальцем по стеклу.
На мой взгляд, здесь дауншифтинг полностью оправдан.
Вообще, туристические форумы переполнены тысячистраничными темами
про электропитание в походах.

Итак, фотопрограмма. После запуска, при нажатии на какую-нибудь клавишу
из правого ряда 3, 6, 9 делается фотография, а при нажатии на левый ряд
1 4 7 записывается 15 секунд звука. Звуковой файл имеет тоже название,
что и последний jpg файл, только расширение amr, Так что к какой картинке
относится конкретный звуковой коментарий, не перепутаешь.
Превью при этом не показывается, так что это еще и скрытая камера.
На самом деле это сделано не для того, чтобы шпионить, а чтоб
экономить энергию. Впрочем, если нажать на клавишу меню, превью появится,
и можно камеру аккуратно навести.
Все это сделано, чтобы было проще снимать, управляя велосипедом.
Во время поездки, у меня выходит по 150-200 фоток и звуковых
коментариев в день. В конце использования, программа пакует все файлы в
tar архив. Это во первых удобно, а во вторых сохраняет время создания
файла, что очень важно. При переброски через блютуз время создания
заменяется на время переброски, а в tar все сохраняется.
пример фоточки, велосипедисты одноколесники
Изображение
В андроид версии будет реализован язык сценариев, возможностей
програмировать камеру столько, что никаких меню не хватит.

Фотопрограмма - самая успешная моя разработка.
Ее у меня выпросили примерно десять человек, в основном туристы.

Навигация: в настоящий момент разложена. Придеться переписывать
заново, как особо нужную. Сейчас вынужден возить устройство под wince.
Программа должна была показывать карты openstreetmap,
положение солнца на небе в определенный час, что бы в прохладу ехать по
освещенным солнцем улицам, а в жару, по затененным домами и прочие хотелки.
Но не справился с астрономией и программа стала врать. Но когда программа
была проста и не такая амбициозная, она была полезна.

Таблица: формулы вводятся в стековой нотации.
В ячейках можно хранить ссылки на другие таблицы, как в html,
и фортскрипты.
Подробней о таблицах позже.

Автор:  vikt [ Вт сен 13, 2016 16:14 ]
Заголовок сообщения:  Re: Блог программиста любителя

Итак таблица. Поддерживает кнопочную клавиатуру и стилус.
Отличается от обычных таблиц

1) В ячейках мохно хранить тексты, содерхащие перенос,
а не просто строки.
2) В ячейкам можно хранить ссылки на другие таблицы, хранящиеся
в памяти телефона или в интернете. При нажатии на эту ячейку
загружается соответствущая таблица. Это очень удобно, можно
мгновенно построить простую информационную систеиу.
3) Формулы используют стековую нотацию, до обычной записи не дошли руки,
да и я являюсь единственным пользователем системы.
4) В ячейках можно размещать псевдоФорт скрипты.

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

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

Изображение
tel2.png


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

Изображение
Tel1.png

Это первое преимущества таблиц.

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

Третье. Еще до того, как встроенная программа начнет разрабатываться,
таблицу можно начинать заполнять данными. То есть ввести в эксплуатацию
программу, которая только еще задумана.

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

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

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

Автор:  vikt [ Пн окт 10, 2016 14:25 ]
Заголовок сообщения:  Re: Блог программиста любителя

Немного о форте, который я использую.
Основан на ретрофорт. http://forthworks.com/retro/
Но имеются очень серьезные отличия. Стек, как и в ретро - 32 битный,
но память для кода 16 битная. Это сделано для того, чтобы код типа
lit 1 lit 2
не занимал 16 байт, состоящих почти целиком из нулей

Еще порты - в ретро это вроде как имитируют "железо",
у меня через порты передается номер внешней функции.
Это нужно, чтобы форт виртуальная машина (FVM) могла вызывать
функции различных API, которые привязаны к соотвктствующим портам.
Есть и другие отличия..

Код на ява, можно рассматрмвать как псевдокод

Стек - почти ничего не изменил из ретрофорт.
Код:
/* from retro forth
http://forthworks.com/retro/
*/
package  forth;

public class STACK {

public int [] stack = null;  //

public int sp;

public void push(int v) {stack[sp++] = v; }

public int pop()        {return stack[--sp];} // --sp
   
public int peek() { return stack[sp - 1];}  // неразрушающее чтение стэка
   
public int peek2() {   return stack[sp - 2];   }
   
public void drop(int i) {sp -= i;   }

public int getDepth() {   return sp; }
}   

Автор:  vikt [ Пт авг 25, 2017 17:34 ]
Заголовок сообщения:  Re: Блог программиста любителя

Примерная реализация ФВМ. Будет уточняться.
Что делать дальше?

Код:
/* Part of the project take  from retro forth
http://forthworks.com/retro/
*/

package forth;   

public class FVM {

        public  int IMAGE_SIZE=1024;  // Размер памяти по умолчанию

   private int sp = 0, rsp = 0, ip = 0; // указатели стека, стека возвратов и адрес команды
   
        public STACK stack,adrStack;    //стеки 

        public short  [] image;  // 16 битная память

        public int [] ports;  // порты ввода вывода
   

   public static final int
    VM_NOP = 0 ,
    VM_LIT = 1 ,  // положить 16 битное значение на стек
    VM_DUP = 2 ,     VM_DROP = 3 ,   VM_SWAP = 4 ,
    VM_PUSH = 5 ,    VM_POP = 6 , 
    VM_CALL = 7 ,    VM_JUMP = 8 ,    VM_RETURN = 9 ,   
    VM_GT_JUMP = 10 ,VM_LT_JUMP = 11 , VM_NE_JUMP = 12 ,   VM_EQ_JUMP = 13 ,  //  >  <  !=  =
    VM_FETCH = 14 ,  VM_STORE = 15 ,  // @  !
    VM_ADD = 16 ,    VM_SUB = 17 ,    VM_MUL = 18 ,   VM_DIVMOD = 19 , // + - *  /   
    VM_AND = 20 , VM_OR = 21 , VM_XOR = 22 ,

    VM_SHL = 23 ,    VM_SHR = 24 ,    VM_ZERO_EXIT = 25 ,
     VM_INC = 26 ,   VM_DEC = 27 , 
     VM_IN = 28 ,   VM_OUT = 29 ,  VM_WAIT = 30, // записсь чтение портов , ожидание
     
     VM_LIT32 = 31. // положить 32 битное значение на стек
     ;

   private void handleDevices() {  // от ретро, // вызывается командой wait
        //зависит от реализации
   }

        private void callService(int x, int y) { вызывается во время записи в порт (out)
        // зависит от реализации
        }


   /**     * Process a single opcode*/   
   private void process() {

  int x, y, z,tmp,  op;
  op = image[ip]; 
        switch(op) {

    case VM_NOP:
      break;
    case VM_LIT:    ip++;stack.push(image[ip]); // положить 16 битное значение на стек
      break;
    case VM_DUP:    tmp=stack.pop(); stack.push(tmp);stack.push(tmp);
      break;
    case VM_DROP:   stack.drop(1);
      break;
    case VM_SWAP:   x = stack.pop(); y= stack.pop(); stack.push(x);stack.push(y);
      break;
    case VM_PUSH:   x = stack.pop();  adrStack.push(x); // со стека данных на адресный стек
      break;
    case VM_POP:    x = adrStack.pop(); stack.push(x); // обратно
      break;


    case VM_CALL:   ip++; adrStack.push(ip); ip=image[ip]-1;
      break;
    case VM_JUMP:   ip++;    ip = image[ip]-1; 
      break;
    case VM_RETURN:
      ip = adrStack.pop();
      break;
    case VM_GT_JUMP:  ip++;    // 
      x = stack.pop(); y= stack.pop(); if (y>x) ip = image[ip] - 1;
      break;
    case VM_LT_JUMP:   ip++;
       x = stack.pop(); y= stack.pop(); if (y<x) ip = image[ip] - 1;
      break;
    case VM_NE_JUMP:  ip++;
      x = stack.pop(); y= stack.pop(); if (y!=x) ip = image[ip] - 1;  // переход если не равно
      break;
    case VM_EQ_JUMP:   ip++;
       x = stack.pop(); y= stack.pop(); if (y==x) ip = image[ip] - 1; // переход если  равно
      break;
     
     
    case VM_FETCH: /// @
      tmp=stack.pop();                        // со стека снимается адрес
      x=image[tmp]; tmp++; y=image[tmp];      // с этого адреса снимаются две соседние
      stack.push(x << 16  | y & 0xffff  );   // 16битные ячейки и с помощью сдвига и AND
      break;               // объединяются в 32 битное значение и кладутся на стек


    case VM_STORE:  //     //  обратная операция 32 битное знач. разлагается
     x = stack.pop(); y= stack.pop(); // на два 16 битных с помощью сдвигов   
     short a=(short)y ,  b = (short) (y >> 16);
     image[x]=b; x++ ;  image[x]=a;
      break;

    case VM_ADD:    x = stack.pop(); y= stack.pop();stack.push(y+x);
      break;
    case VM_SUB:    x = stack.pop(); y= stack.pop();stack.push(y-x);
      break;
    case VM_MUL:    x = stack.pop(); y= stack.pop();stack.push(y*x);/
      break;
    case VM_DIVMOD:    //my relize div 0
      x = stack.pop(); y= stack.pop();     
       stack.push(y % x);  stack.push(y/x); // на стеке остаток и целое
      break;     // иожно добавить проверку /0 если не отлавливаются исключения
    case VM_AND:     x = stack.pop(); y= stack.pop();stack.push(x & y);
      break;
    case VM_OR:      x = stack.pop(); y= stack.pop();stack.push(x | y);
      break;
    case VM_XOR:   x = stack.pop(); y= stack.pop();stack.push(x ^ y);
      break;
    case VM_SHL:    x = stack.pop(); y= stack.pop();stack.push(  y << x );  // сдвиг битов влево
      break;   
    case VM_SHR:   x = stack.pop(); y= stack.pop();stack.push( y >>= x );   //  вправо 
      break;
    case VM_ZERO_EXIT:    // выход из подпрограммы, если на стеке 0
      if (stack.peek() == 0)
      {
        stack.drop(1);
        ip = adrStack.pop();
      }
      break;
    case VM_INC:   x = stack.pop(); x++; stack.push(x); 
     break;
    case VM_DEC:   x = stack.pop(); x--; stack.push(x);
     break;

   case VM_IN:          // чтение порта
      x = stack.pop();
      y = ports[x];
      stack.push(y);
      ports[x] = 0;
      break;
    case VM_OUT:   // вершина номер порта
      x=stack.pop();
      y=stack.pop();
      ports[x]=y;//
      callService(x,y);  //вызов внешней функции
      break;
    case VM_WAIT:   handleDevices(); // наследство от  ретро
      break;

    case VM_LIT32:  // положить 32 битное значение
      ip++; x=image[ip]; ip++; y=image[ip];  stack.push( x << 16  | y & 0xffff );
      break; //2 16 битные ячейки объединяются в 32 битную с помощью сдвигов

  }
}


  boolean _HALT =  false;   //Переменной Halt присваиваются значение во время выполнения
                                //callService, при исполнении инструкции out

  public void processImage( int startIP ) {
  ip=startIP;
  boolean _HALT=false;
  while  (ip<IMAGE_SIZE  && ! _HALT) {
       process();   
       ip++;} 
  } //void





Автор:  Victor__v [ Пт авг 25, 2017 17:57 ]
Заголовок сообщения:  Re: Блог программиста любителя

Насчёт таблиц.
Как дела с SQL?

Автор:  vikt [ Пт авг 25, 2017 21:00 ]
Заголовок сообщения:  Re: Блог программиста любителя

Victor__v писал(а):

Как дела с SQL?

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

Автор:  Victor__v [ Пт авг 25, 2017 22:26 ]
Заголовок сообщения:  Re: Блог программиста любителя

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

Автор:  vikt [ Сб авг 26, 2017 13:10 ]
Заголовок сообщения:  Re: Блог программиста любителя

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

А зачем аксес? Почему не sql?
Кстати в андроид апи уже есть sql
http://developer.alexanderklimov.ru/android/sqlite/

Подмножество sql на форте было бы полезно. Мелкие базы
данных самопальная sql точно потянет.

Автор:  vikt [ Ср окт 25, 2017 02:18 ]
Заголовок сообщения:  Re: Блог программиста любителя

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

Автор:  longer [ Ср окт 25, 2017 02:41 ]
Заголовок сообщения:  Re: Блог программиста любителя

Добрый день!
Интересует фотографическая программа для j2me.
У меня есть простая фотографическая программа для android с исходными текстами.
http://lingerman.ucoz.net/uploads/camSnap2_2.7z

С удовольствием буду отвечать на вопросы по программе и по исходным текстам, если кого-то
заинтересует.
Правда форум http://fforum.winglion.ru/ почему то блокирован в нашей деревне
Роскомнадзором, приходится выходить через тор, который тоже работает не стабильно.
Наверно какой-нибудь террористический сайт вертится на том же хостинге, что
и форум.
И да! Поддерживаю идею написать простую реализацию языка программирования.

Автор:  vikt [ Чт окт 26, 2017 22:05 ]
Заголовок сообщения:  Re: Блог программиста любителя

Здравствуйте! Спасибо за программу. Установилась и работает.
Исходный код скомпилировать не удалось, пока я в программировании
андроида новичок. С фотопрограммой для j2me у меня образовался
бардак, разные телефоны используют разные encoding,
у меня разные исходные тексты для nokia и sonyerrikson.
Я ведь не думал, что буду публиковать. В телефонах
установлены уже скомпилированные версии. Наведение порядка
займет некоторое время. Но если нужно, то конечно выложу весь
бардак. Еще могу выложить код модуля, который непосредственно
осуществляет съемку он вполне отлажен.

Автор:  longer [ Вт окт 31, 2017 12:33 ]
Заголовок сообщения:  Re: Блог программиста любителя

vikt писал(а):
Исходный код скомпилировать не удалось,


Компилировал программу в AIDE
http://www.android-ide.com/
AIDE устанавливается на андроид, на него копируются исходные тексты
и компилируются.
Тут наверно будет проще так. В AIDe создается новый проект.
В каталог, в котором находится MainActivity.java копируются
файлы из моего проекта. В этих файлах в строке
package com.mycompany,,,
заменяется на
package <путь проекта>;
также заменяется
import <этот package>;
Ничего сложного. Просто в AIDE кажется все работает по другому,
чем в эклипс.
Еще важно. В папке res/layout заменить файлы main.xml на мои файлы,
которые находятся в соответствующей директории.

Программу написал на основе кода
http://startandroid.ru/ru/uroki/vse-uroki-spiskom/266-urok-133-kamera-delaem-snimok-i-pishem-video.html
и официального api. Там много полезной информации.

Автор:  vikt [ Сб ноя 04, 2017 15:15 ]
Заголовок сообщения:  Re: Блог программиста любителя

Спасибо. Скомпилировал. Попробую присобачить телефон на руль велосипеда и
использовать как go-pro.

Понемногу начинаю выкладывать свою.
Пока только класс, реализующий фотографирование, для ознакомления.
http://vikt-beliak.narod.ru/save/myphoto.java

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

Кроме того, хочу попробывать AMMS API для более тонкой работы с камерой
http://developer.samsung.com/java/technical-docs/Advanced-Mutlimedia-Supplements-JSR-234

По использованию модуля, могу отвечать здесь, или по
почте
vikt-beliak@yandex.ru

Автор:  longer [ Вс ноя 05, 2017 01:03 ]
Заголовок сообщения:  Re: Блог программиста любителя

vikt писал(а):
Спасибо. Скомпилировал. Попробую присобачить телефон на руль велосипеда и
использовать как go-pro.

По использованию модуля, могу отвечать здесь, или по
почте
vikt-beliak@yandex.ru


Я ее практически так и использую. Выехать на пляж, нафотографировать девушек.
Собачу на руль так
https://toogeza.com/2013/07/29/6197
только не затягивать сильно, что бы можно было переставить вот так
Изображение

моя почта
longerm9@gmail.com

Страница 1 из 8 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/