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 [ Пн окт 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/ |