Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт фев 07, 2025 13:13

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Блог программиста любителя
Автор Сообщение
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
WARNING!!!
Предыдущий пример не будет работать с build-tools поздних версий,
в частности build-tools 34.0.0 и android-33
Там нет утилиты dx Вместо нее утилита d8 с другими параметрами.
Помучавшись, удалось скомпилировать проект, но пока на телефон не устанавливал.
Решил отложить разбирательство с d8 и пока пользоваться более старыми версиями.

Поэтому скачиваем старые пакеты

sdkmanager --sdk_root=path_to_SDK "platforms;android-28"
sdkmanager --sdk_root=path_to_SDK "build-tools;30.0.2"

Временно отказавшись от новейших средств, в плане эффективности вряд ли чего то потеряем
Сообщение Добавлено: Ср фев 05, 2025 01:20
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Внимание!!! Вместо $java_files в предыдущем примере надо писать $java_files/*java

Утилита dx преобразует только что полученные файлы class в android формат
и записывает результат в build/dex

Код:
$BUILD_TOOLS/dx --dex --output=$build_dest/dex/classes.dex $build_dest/classes/

Опять вызывается утилита aapt, чтобы упаковать файлы ресурсов XML, полученные dex файлы,
файлы в каталоге assets и манифест в apk файл.
Он пока еще не выравнен и не подписан.
Код:
apk_name=myapp
$BUILD_TOOLS/aapt package -f -M $main/AndroidManifest.xml \
-S $main/res/  -I "${PLATFORM}/android.jar" \
        -A $main/assets  \
        -F  $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/dex/

Выравниваем
Код:
"${BUILD_TOOLS}/zipalign" \
-f 4 $build_dest/apk/$apk_name.not_aligned.unsigned.apk $build_dest/apk/$apk_name.aligned.apk       

И подписываем
Код:
$BUILD_TOOLS/apksigner sign --ks keystore.jks \
        --ks-key-alias androidkey --ks-pass pass:android \
              --key-pass pass:android --out $build_dest/apk/$apk_name.apk \
              $build_dest/apk/$apk_name.aligned.apk

Далее про генерацию ключей для подписки файла
Сообщение Добавлено: Ср фев 05, 2025 00:49
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
На самом деле файл R.java появится в каталоге build/res/com/mycompany/myapp/R.java , добавится package.

Компиляция
Код:
mypkg=com/mycompany/myapp
main=path_to_main         # путь к каталогу main
java_files=$main.java$mypkg   # main+package
build_dest==path_to_build  # путь к каталогу build 
PLATFORM=PLATFORM=./platforms/android-33

javac -source 1.8 -target 1.8 \
  -bootclasspath "${JAVA_HOME}/jre/rt.jar"  \
-classpath "${PLATFORM}/android.jar" -d $build_dest/classes \
  $build_dest/res/$mypkg/R.java   $java_files
 

Здесь
-source 1.8 -target 1.8 - насколько я понимаю, для совместимости с java 8, используемой android.

Забирает только что собранный R.java и java файлы из каталога main/java и помещает результат (файлы class) в
каталог build

Если все прошло без ошибок, дальше проблем быть не должно.
Сообщение Добавлено: Вт фев 04, 2025 01:56
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Исходники лучше собрать в отдельный каталог, например main
Код:
        main/
            assets      -  тут файлы и каталоги, которые просто переписываются в apk-файл
                            Каталог assets необязателен.
            res         -  файл ресурсов
            java        -  java программы
            AndroidManifest.xml - файл  манифеста

Результаты компиляции можно помещать в каталог, например build
Код:
  build/     - файлы, получающиеся  в процессе компиляции
        res     - тут файл R.java, получающийся в процессе компиляции ресурсов
        classes - тут class файлы, после компиляции программы на java
        dex     - тут скомпилированные class-файлы в формат андроид
        dest  - apk файлы

Перед компиляцией желательно очистить подкаталоги в build от старого содержимого
Первым делом необходимо собрать файл R.java из ресурсов в каталоге main/res .

Скрипт для сборки будет выглядить примерно так.
Код:
определим переменные
BUILD_TOOLS=./buid-tools/30.0.0 #путь к ранее скачанной утилите, где находятся
                                #исполняемые файлы   aapt, dx, apksigner и др.
PLATFORM=./platforms/android-33  #путь к ранее скачанной утилите, где находится
                                 # android.jar 
main=path_to_main         # путь к каталогу main
build_dest=path_to_build  # путь к каталогу build 

  (30.0.0 и android-33 заменить на нужные значения)

сама команда
$BUILD_TOOLS/aapt package -f -m -J $build_dest/res  \
   -S $main/res  \
   -M  $main/AndroidManifest.xml \
   -I $PLATFORM/android.jar 

После выполнения команды в каталоге build/res должен появится файл R.java
Сообщение Добавлено: Пт янв 31, 2025 21:20
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
К предыдущему
Код:
Чтобы установить CMake или NDK, используйте следующий синтаксис:

sdkmanager --install
           ["ndk;major.minor.build[suffix]" | "cmake;major.minor.micro.build"]
           [--channel=channel_id] // NDK channels: 0 (stable), 1 (beta), or 3 (canary)


Чтобы устанавливать обычные пакеты параметр --install не обязателен

Проект HelloWord , который генерирует aide, можно скачать здесь
https://disk.yandex.ru/d/5ufypLUFOOWTcQ

Тут
package="com.mycompany.myapp"

Лучше избегать называть начала пакетов с "com" , как здесь,
а предпочитать то, что ближе по алфавиту, чем "com" .
Cам android имеет кучу приложений, которые начинаются с "com",
и найти свое среди них будет трудно.

java класс MainActivity.java

Код:
package com.mycompany.myapp;

import android.app.*;
import android.os.*;
public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Имя пакета (package) тут com.mycompany.myapp
соответственно файл MainActivity.java должен находиться в каталоге
com/mycompany/myapp
В aide java классы находятся в каталоге java, поэтому путь будет выглядить так
java/com/mycompany/myapp

В каталоге res хранятся файлы ресурсов
описание окон находится в каталоге res/layout
Каждому окну соответствует свой xml файл,
имена файлов тут должны почему то состоять из строчных букв.
У нас один файл
main.xml.
Код:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


В MainActivity.java ссылка на этот скомпилированный файл выглядит так

setContentView(R.layout.main);

Еще в каталоге res находятся подкаталоги res/values и res/values-v21

В следующих каталогах находятся иконки приложения для разных размеров экрана
Файлы называются ic_launcher.png имеют свой размер и располагаются в нижеследущих
каталогах
Код:
   каталог       размер картинки
drawable-hdpi       72x72
drawable-xhdpi       96x96
drawable-mdpi        48x48
drawable-xxhdpi     144x144


Можно еще создать каталог assets, содержимое этого каталога с файлами и подкаталогами
компилятор просто переписывает в apk-файл.
Есть методы чтения данных оттуда.

И наконец важнейший файл AndroidManifest.xml
Код:
<?xml version="1.0" encoding="utf-8"?>
<manifest
   xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.mycompany.myapp"
   android:versionCode="1"
   android:versionName="1.0">

   <uses-sdk
      android:minSdkVersion="14"
      android:targetSdkVersion="29"/>

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:resizeableActivity="true">

      <activity
         android:name=".MainActivity"
         android:label="@string/app_name">

         <intent-filter>

            <action
               android:name="android.intent.action.MAIN"/>

            <category
               android:name="android.intent.category.LAUNCHER"/>

         </intent-filter>

      </activity>

   </application>

</manifest>
Сообщение Добавлено: Ср янв 29, 2025 02:31
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Для начала c
https://developer.android.com/sdk/index.html
скачиваем утилиту коммандной строки для своей системы
(linux mac или windows)
Ищем файл вида
commandlinetools-linux-7302050_latest.zip

Дальше разархивируйте согласно инструкции
https://developer.android.com/tools/sdkmanager?hl=ru

Можно не создавать каталог latest
тогда в при вызове утилиты надо указывать параметр
--sdk_root=path_to_SDK

Наберем ( или обернем скриптом )

path_to_sdkmanager/sdkmanager --list [--sdk_root=path_to_SDK] > lists
в файле lists будут пакеты, доступные sdkmanager.

На этом этапе какие либо трудности маловероятны. У меня были какие-то странности, связанные с
java_run time

[spoiler]

работает
java --version
openjdk 17.0.11 2024-04-16 OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9) OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-alt1) (build 17.0.11+9, mixed mode, sharing)

не работает
java --version
openjdk 17.0.12 2024-07-16
OpenJDK Runtime Environment (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.12.0.7-alt1) (build 17.0.12+7, mixed mode, sharing)

Почему то работает с более старой версией java.

то, что не работает, выдает ошибку

./sdkmanager
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:621)

В общем столкнуться с этой проблемой маловероятно, скорее всего у меня криво встал linux

[/spoiler]

Дальше надо скачать "build-tools" и "platforms;android" используя sdkmanager.
При необходимости также скачивается ndk
На этом этапе трудности маловероятны.
В указаной ранее статье
https://www.hanshq.net/command-line-android.html
показывался способ скачивания пакетов напрямую с сервера, но делать этого не стоит,
скорее всего, статья старая, многое может измениться.
Поэтому лучше использовать sdkmanager.

Пусть android платформа = 28, что соответствует android 9
Соответствия версий api и android

[spoiler]
Имя. Версия Уровень API Выпущено Код версии сборки
К 10.0 29 Авг 2020 BuildVersionCodes.Q
Круговая 9.0 28 Авг-2018 BuildVersionCodes.P
Oreo 8.1 27 Дек 2017 BuildVersionCodes.OMr1
Oreo 8.0 26 Авг 2017 BuildVersionCodes.O
Nougat 7.1 25 Декабрь 2016 г. BuildVersionCodes.NMr1
Nougat 7.0 24 Август 2016 г. BuildVersionCodes.N
Marshmallow 6,0 23 Август 2015 г. BuildVersionCodes.M
Lollipop 5.1 22 Мар 2015 г. BuildVersionCodes.LollipopMr1
Lollipop 5,0 21 Ноя 2014 BuildVersionCodes.Lollipop
Kitkat Watch 4.4W 20 Июн 2014 BuildVersionCodes.KitKatWatch
Kitkat 4.4. 19 Октябрь 2013 г. BuildVersionCodes.KitKat
Желе-боб 4.3 18 Июл 2013 BuildVersionCodes.JellyBeanMr2
Желе-боб 4.2-4.2.2 17 Ноябрь 2012 г. BuildVersionCodes.JellyBeanMr1
Желе-боб 4.1-4.1.1 16 Июнь 2012 г. BuildVersionCodes.JellyBean
Ice Cream Sandwich 4.0.3-4.0.4 15 Декабрь 2011 г. BuildVersionCodes.IceCreamSandwichMr1
Ice Cream Sandwich 4.0-4.0.2 14 Окт 2011 BuildVersionCodes.IceCreamSandwich
Соты 3.2 13 Июнь 2011 г. BuildVersionCodes.HoneyCombMr2
Соты 3.1.x 12 Май 2011 г. BuildVersionCodes.HoneyCombMr1
Соты 3.0.x 11 Февраль 2011 г. BuildVersionCodes.HoneyComb
Пряник 2.3.3-2.3.4 10 Февраль 2011 г. BuildVersionCodes.GingerBreadMr1
Пряник 2.3-2.3.2 9 Ноя 2010 BuildVersionCodes.GingerBread
Froyo 2.2.x 8 Июнь 2010 г. BuildVersionCodes.Froyo
Eclair 2.1.x 7 янв 2010 BuildVersionCodes.EclairMr1
Eclair 2.0.1 6 Декабрь 2009 г. BuildVersionCodes.Eclair01
Eclair 2.0 5 Ноябрь 2009 г. BuildVersionCodes.Eclair
Кольцо 1,6 4 Сентябрь 2009 г. BuildVersionCodes.Donut
Кекс 1.5 3 Май 2009 г. BuildVersionCodes.Cupcake
База 1,1 2 Февраль 2009 г. BuildVersionCodes.Base11
База 1.0 1 Октябрь 2008 г. BuildVersionCodes.Base

https://learn.microsoft.com/ru-ru/previ ... api-levels
[/spoiler]



path_to_sdkmanager/sdkmanager --sdk_root=path_to_SDK "platform-tools" "platforms;android-28" "build-tools;30.0.2"

если нужно ndk, то добавляем, например "ndk;26.2.11394342"
подробнее про ndk тут
https://developer.android.com/tools/sdkmanager?hl=ru

Если все прошло успешно, то пора скомпилировать первую программу.
Сообщение Добавлено: Пн ноя 18, 2024 22:25
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Основные средства разработки программ для android.
Android studio - официальное
https://developer.android.com/sdk/index.html
Есть архивы старых sdk
https://developer.android.com/studio/archive?hl=ru
Насколько я помню, в старых версиях была собственная java,
что в принципе может пригодиться.

Следущее, aide - разработка или компиляция програм прямо на android устройствах.
Ныне заброшен, поддерживается энтузиастами.
https://4pda.to/forum/index.php?showtop ... 69&st=4960
Сам я до последнего его использовал.

Разработка android программ из командной строки.
Скачивается там же, где android studio, чуть ниже.
Преимущества:
Эти утилиты входят в состав самой android studio и aide.
Утилиты командной строки, это java программы, соответственно,
можно организовать средство разработки android программ на любом
устройстве, где есть полноценная java. Такие проекты есть.

Android SDK
https://github.com/AndroidIDEOfficial/a ... es/tag/sdk
https://github.com/AndroidIDEOfficial/a ... /tree/main

Но есть доводы разрабатывать свои средства на коленке, можно собрать
под себя. Например, любители си и ассемблеров могут подключить NDK

https://www.hanshq.net/command-line-android.html

Замечу, что основные вопросы по Aide на 4pda это как раз про NDK.

Далее подробнее.
Сообщение Добавлено: Сб ноя 16, 2024 20:31
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Спасибо большое!
Сообщение Добавлено: Ср сен 25, 2024 03:08
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
В Help написано как убрать заглавные буквы

Особенности SPF
Краткое вступление для тех, кто уже знаком с какой-либо Форт-системой и стандартом ANS'94.

Последнее обновление: $Date: 2008/11/14 20:13:12 $

[Русский] [Английский]

Содержание
Установил SPF4. И где здесь что-куда?
Как запускать и подключать файлы?
REQUIRE
Пути поиска файлов для INCLUDED
Модули
Регистро-зависимость
Ввод чисел
Вещественные числа (числа с плавающей точкой)
Структуры
Где FORGET?
Где NOT?
Где DEFER?
Как одним словом очистить стек?
Комментарии
Строки
Многозадачность
Словари
Локальные и временные переменные
Генерация исполняемых модулей (exe-файлов)
Подключение dll-библиотек
Средства отладки
Оптимизатор
Поддержка ANS
Callback'и
Слово NOTFOUND
Scattered colons
Область видимости
Обработка исключений

Установил SPF4. И где здесь что-куда?
Первое и самое важное - расположение ваших рабочих файлов. В дистрибутиве SPF есть каталог DEVEL, предназначенный для разработчиков (в том числе и вас). Создайте в ней ваш подкаталог, например, ~vasya. И теперь вы можете подключать ваши файлы написав сокращённый путь в виде ~vasya/prog/myprog.f. Это упрощает взаимный доступ к библиотекам и программам. Общепринято библиотеки класть в подкаталог lib, а примеры программ в prog.

В каталоге DEVEL собраны наработки других SP-Forth'еров, с кратким (очень кратким) их обзором вы можете ознакомиться в SPF_DEVEL, либо пройтись по файлам самому.

В каталоге samples/win/spfwc вы найдёте GUI фронтенд для SPF. Просто запустите compile.bat и скопируйте полученный бинарный файл spf4wc.exe в корневой каталог установки (рядом с spf4.exe).


Как запускать и подключать файлы?
В командной строке скормить файл SPF'у можно просто указав путь к нему в параметрах запуска,

spf.exe ~vasya/prog/myprog.f
Заметьте, что путь для включения могут быть как абсолютным, так и относительно каталога devel.

В консоли SPF (в режиме интерпретации) достаточно набрать имя файла:

~vasya/prog/myprog.f
В целях совместимости лучше подключать явно:

S" ~vasya/prog/myprog.f" INCLUDED
Но правильнее всего использовать REQUIRE.


REQUIRE
В SPF есть нестандартное слово REQUIRE ("word" "file" -- ), где word - некоторое слово определённое в библиотеке file. Если слово word присутствует в контекстном словаре, REQUIRE считает, что библиотека уже была подключена и не загружает её. Так избегается двойная загрузка библиотек. Если же найти word не удаётся - библиотека подключается обычным образом (через INCLUDED). Например:

REQUIRE CreateSocket ~ac/lib/win/winsock/sockets.f
REQUIRE ForEach-Word ~pinka/lib/words.f
REQUIRE ENUM ~nn/lib/enum.f
NB: В качестве word выбирайте всегда наиболее уникальное слово из подключаемой библиотеки.


Пути поиска файлов для INCLUDED
S" file.f" INCLUDED будет искать в перечисленных ниже местах в именно таком порядке

короткое имя файла file.f (т.е. в текущем каталоге)
PATH_TO_SPF.EXE/devel/file.f (т.о. удобно использовать чужие наработки),
PATH_TO_SPF.EXE/file.f (так подключаются стандартные либы и другие файлы из поставки SPF).
Если требуется указать больше путей поиска (например использовать форт код разделяемый между системами, или неважно - любой код вне дерева каталогов SPF который не может быть адресован относительно текущего файла), то можно либо переопределить FIND-FULLNAME (который VECT) либо использовать внешнюю либу - ~ygrek/spf/included.f.

TODO: Вынести отдельно

Тогда потребуется только прописать в spf4.ini

~ygrek/spf/included.f
with: my_path\
S" my path with spaces/" with
и все файлы будут искаться в my_path в дополнение к описанному выше алгоритму (my_path может быть как абсолютным так и относительно spf.exe).


Модули
В SPF есть модули, которые позволяют скрывать некоторые внутренние слова библиотек выводя наружу только слова для взаимодействия.

MODULE: vasya-lib
\ внутренние слова
EXPORT
\ слова взаимодействия, видные снаружи, компилируются во внешний словарь.
DEFINITIONS
\ опять внутренние слова
EXPORT
\ ну вы поняли :)
;MODULE
Код MODULE: vasya-lib можно писать много раз - последующие вызовы будут докомпилировать слова в тот же модуль. На самом деле слово определённое через MODULE: это обычный словарь.


Регистро-зависимость
SPF регистрозависим, то есть для него слова CHAR , Char и char - три разных слова. Сделать SPF независимым от регистра слова можно подключив файл lib/ext/caseins.f. По умолчанию, регистро-независимость включается сразу после подключения lib/ext/caseins.f.

Чтобы регистро-независимость временно выключать/включать, используйте переменную CASE-INS:

REQUIRE CASE-INS lib/ext/caseins.f
2 dup * .
CASE-INS OFF \ вернуть обратно режим зависимости от регистра
2 DUP * .
CASE-INS ON \ включить регистро-независимость
2 dup * .
Сообщение Добавлено: Пн сен 23, 2024 09:38
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Вообще, разруха не только у меня. Altlinux, которым без проблем пользовался больше 20 лет,
начал выдавать странности. Из проекта исчезла опера,( уже давно), не запускается avidemux,
нечем редактировать видеофайлы. Исчез gfort, что крайне неприятно. Не с чем стало сравнивать
свой форт. Сходу собрать gfort из исходников не удалось, ковырятся не хотелось.

к счастью в http://forth.org.ru/ Russian FORTH Interest Group

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

В общем, можно приступать.
Еще, кажется окончательно разобрался с компилятором командной строки для android проектов.
Сообщение Добавлено: Пт сен 13, 2024 02:44
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
После перерыва, решил возобновить разработку.

Перерыв был вызван причинами в основном технического порядка, когда проект, над которым я упорно работал, написанный
на java 17, отказавлся компилироваться на java, который использовался в android Ide.

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

(В общем, для меня, все разговоры, что стремление к стандартизации не нужно - побоку.)

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

Но недавно благорастворение закончилось, навигационная программа начала бешено выжирать
заряд батареи. Просто кэщирование было организованно самым примитивным способом -
тайл карты загружался из интернета и сохранялся на sd карте. Имя тайла - типа (z6x45y2345),
присоединялось к строке, в которой таким же образом были записанны имена предыдущих,
загруженных из интернета тайлов. Прежде, чем загрузить из интернета картинку, осуществлялся
поиск по строке. Если находил, загружался с SD, если нет - с интернету. В конце концов размер строки
стал килобайт 300 наверное!
В общем поправить не трудно, да за два года образовалась полная разруха.
Я забыл, из каких проектов скомпилировал нынешние, находящиеся в эксплуатации apk - файлы.
Реально, их там куча. Это сохраненные промежуточные проекты, и развитие существующих, и оставленные на будущее.

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

Но тут напасть - авторы aide забросили проект и гугол удалил его из play по причине отсутствия обновлений.
(я сперва подумал, присоединились к санкциям, когда разобрался, решил задонатить, гугл плай не пропустил платеж)

В общем, если кому нужен aide, можно сюда
https://4pda.to/forum/index.php?showtopic=319369

там лежит крякнутая версия, в отличии от бесплатной, которая может собрать проект не больше чем из 5 файлов,
в этой можно собрать проект из любого кол-ва файлов. Можно взять у меня apk-файл, скачанный из google play давно.

Вчера удалось собрать android проект из командной строки, думаю развивать это направление

Утилиты командной строки можно скачать с официального
https://developer.android.com/studio?hl=ru
Далее буду описывать, как всем этим пользоваться.

ps. Тяжеленную android studio ставил, проблевался.
Вдобавок отказалась компилировать мои aide-проекты, никаких дел с ней больше иметь не буду, даже по приговору суда.
Сообщение Добавлено: Вт авг 27, 2024 03:15
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Работа продолжается. Основная трудность - неопределенность предполагаемой системы, для которой
пишешь интерфейс. Когда система наконец создана, становится очевидны дефекты интерфейса,
которые должны поддерживать систему. Работа идет на новый круг, что психологически тяжело и неприятно.
Сейчас прорабатываю функцию assign.
Она назначает параметры устройствам ввода-вывода, куда и откуда forth скрипт будет выдавать
и забирать данные, не заботясь, куда эти данные попадут на самом деле.
Устройством ввода вывода может быть что угодно, его даже можно написать на форте.

Остановился на следущем дизайне функции assign
Код:
  \  .s" name" - оставляет на стеке адрес и длину слова name
.s" protocol  param1 ... paramN" 
.s" filename"
channal  assign   \ int int   int int  int assign

сейчас развиты следущие протоколы
Код:
s" file" s" anyFileName"  5 assign \ тут все понятно файл назначается 5 каналу
( url =  IP_or_HOSTNAME:port  or  user:password@IP_or_HOSTNAME:port/path )
s" udp  url"  s" filename" 5 assign
s" tcp  url"  s" filename" 5 assign
s" ftp url"   s" filename" 5 assign

Запись - чтение осуществляется функциями
readchan writechan - для текстов
writebytes readbytes - массивы байт

Это все у меня уже находится в эксплуатации, скрипты буду понемногу выкладывать.
Сам forth пока выкладывать не буду, код еще пока грязный.
Сообщение Добавлено: Вс ноя 13, 2022 03:06
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
По причине отсутствия опыта работы с сокетами, довольно много кода пришлось переписывать
много раз. Пока идет чистка кода после всех экспериментов.
Но уже есть сетевые разработки, Wake on lan, ftp-клиент.
Не сложно также оснастить каждое приложение, содержащее форт, своим ftp-сервером,
что бы можно было без геморойно обмениваться с ним данными.
Сейчас выложу рабочую версию самодельной wol.
( удаленное включение компьютеров.
https://admcomp.ru/wol.html
)
К сожалению технология сбойная, иногда не срабатывает.
Но вероятность сбоя самодельной wol и "официальной" программы wol примерно равно.

Для запуска нужно реализовать ф-ции
adrString lenString index getchar
и
adrByte len send - которая посылает udp-пакет определенному хосту
Код:
  2variable mk    s" 00:1A:4D:2F:89:0C"  mk 2!  \   адрес и размер строки mac-адреса
 
  variable aa  variable bb variable er
 
   :  dps  \   int n  int a int b   a>b   диапазон a < n < b ,-1 a n b > 0   
     0 er !
     bb !  aa !
     dup aa @ -  0> 
     if
       DUP bb @ - 0<
       if -1 er !
       then
      then 
     drop
     er @ 
    ;  \  -1 -- входит в диапазон  между a и b
   
  : ifdig16  \ char - log ( num | -1 )  0 - 9 , a - f ; -1 false
     dup 47 59 dps         \ 0-9
         if 48 -
    else
      dup 96 103  dps  \ a-f
      if 87 - 
      else
        dup 64 71 dps  \ A-F
        if 55 -
        else drop -1   
        then   
            then
          then
    ;  \ 0 - Н или -1
   
  : sum16  ( dig1 dig2 - byte or -1000  )
      swap
      dup 0<  if  \ error (-1)
              drop drop -1000
              else
         swap
         dup 0< if
                drop drop -1000
           else   
                     4 shl or \ сдвигает и складывает
                     then
         then     
  ; 
   
    variable qu 0 qu !
 
  : to_byte \  ..  - byte  два соседних символа из строки mk превращает в байт
    mk 2@ qu @ getchar \ char from string
    1 qu +!   
    ifdig16            \    dup .
    mk 2@ qu @ getchar
    1 qu +!   
    ifdig16             \    dup .
    swap
    sum16
   ;  \ qu приращается
 

  : mac     \  Читает mac-строку и укладывает байты           
      to_byte  1 qu +!  c,
      to_byte  1 qu +!  c,
      to_byte 1 qu +!   c,
      to_byte 1 qu +!   c,
      to_byte 1 qu +!   c,
      to_byte           c,
   0 qu !
   ;
variable macm
  here macm  !
mac  \  в macm - адрес байтов mac
   
6  6 16 * +  constant dtg.length  \ 102 
create datagram[]  dtg.length allot
0 qu !

: fillFF  \ заполнить 6 байтов структуры datagram байтом ff
   datagram[] dup 5 + swap
   do 255  i  c! loop 
;   
 
: movMak \ копировать байты mak адреса
   6 qu +!
   \ qu dup 5 + swap   \ qu текущий адрес в datagram
   5 0
   do
     macm @  i + c@   qu @ i + c!
  loop
  ;

: 4mv  movMak  movMak  movMak  movMak ;

: 16mv 4mv 4mv 4mv 4mv ; 

: pre
   fillff  \ 16mv
   datagram[] qu !
   16mv
  ;
  pre
  datagram[]  dtg.length  send

Реализовано конечно аляповато, но ковырятся времени нет.
Сообщение Добавлено: Ср окт 26, 2022 15:06
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Все это время выгуливал эту программу в велосипедных поездках.
Программа умеет работать с одним загруженным треком и отображать
текущий, формируемый трек. В принципе, несложно было бы написать
форт-программу, которая давала бы, например, звуковое оповещение в случае
отклонения от заданного трека, но почему-то поленился это сделать.
Вместо этого, используя Intent, реализовал вызов фотографической
программы пользователя Longer
http://fforum.winglion.ru/viewtopic.php?p=44257#p44257

(Кстати, много кода я надергал с его camSnap'a, на тот момент
я был чайником в андроид программировании)
Intent вызывается при нажатии на кнопку wpt, что позволяет
не только зафиксировать координаты путевой точки, но и отфотографировать ее
со всех сторон. Для этого ослабил крепление смартфона на руле так,
что бы можно было переворачивать его вертикально, для фотографирования,
или горизонтально, для навигации.
В целом, две взаимодействующие примитивные программы оказались
гораздо удобнее каких-то иных средств. Когда же в обоих окажется
отлаженный forth, использование таких программ станет еще
на порядок гибче.

Работа над фортом продолжается - введено много улучшений.
Прорабатывается многозадачность, каналы.
Добавилась возможность работать не только с файлами, но и с датаграммами.
Сообщение Добавлено: Вс окт 09, 2022 07:46
  Заголовок сообщения:  Re: Блог программиста любителя  Ответить с цитатой
Цитата:
А просто писать на ФОРТЕ, использую всю красоту и мощь можно?


Нельзя. Скорее всего для андроида нет форта, пригодного для написания скриптов,
чтоб переправлять данные между процессами, как это делают в мире Юникс уже
пол столетия. Кстати, на такие возможности, мне кажется мало обращают
внимание. А они радикально облегчают любительское программирование,
оставляя реализацию всякой организационной хрени на "потом", которую
можно доработать скриптами.

Хорошая новость. Написал отображение карты за один вечер,
хотя ожидал закончить работу за месяц другой. Осталось только
написать кеширование загруженных из интернета тайлов, и можно
считать реализацию черновика сделанной.
Запись фрагмента недавней велопрогулки.

Изображение

На телефоне карту можно перемещать, написал свою реализацию перемещения
экрана, та, что используется в android api ужастна, экран залипает.

Код:
  float Xdown, Ydown;// координаты касания
  @Override
    public boolean onTouch(View v, MotionEvent event ) {

    float x,y;
    x = event.getX();   y = event.getY();
   
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN: // нажатие
      Xdown=x; Ydown=y;
      break;
      case MotionEvent.ACTION_MOVE: // движение .. на некоторых моделях работает муторно
      break;
    case MotionEvent.ACTION_UP: // отпускание  !! убрать инт
       int dxp=(int)(Xdown-x); // смещение в пикселях 
       int dyp=-(int)(Ydown-y);                       
       double  dxm=dxp*PixelSizeMetres;  // смещение в метрах
       double dym=dyp*PixelSizeMetres;
       float klat=111111.0f;  // метров  в градусе по широте
       float kLon=(float ) (40000*Math.cos( Math.toRadians(  centrLat) )/360 ) *1000; // по долготе     
       double dxg = dxm/kLon;
       double dyg = dym/klat;
       centrLat=centrLat+dyg; 
       centrLon=centrLon+dxg;
       PixelSizeMetres = AU.calcMetrsPix(centrLat, zoom);
            dispCorner = AU.calcDispCorner(centrLat,centrLon,PixelSizeMetres, displaywidth , displayheight);       
        navView.tileArray=macroTileArray(   centrLat, centrLon,   zoom,    displaywidth  ,    displayheight);   
        if (AU.Wpt!=null)updateWP(  AU.Wpt,    dispCorner , PixelSizeMetres);
        if (AU.TRK!=null) updateTRK(AU.TRK);
        if (TRKp!=null)  updateGPS(TRKp);
        navView.invalidate();
      break;
    case MotionEvent.ACTION_CANCEL: 
      break;
    }
    return true;
  }


В работе использовал только сферическую геометрию и информацию отсюда
https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Никакими сторонними библиотеками не пользовался.
Сообщение Добавлено: Вс авг 14, 2022 03:32

Часовой пояс: UTC + 3 часа [ Летнее время ]


cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB