Zalogowany jako: gość

Forum

Wątek: Pierwsze kroki w kod Eltena.

Wróć do listy wątków

1 z 8

Następna

1 z 143: grzezlo

Postanowiłem zacząć ten wątek, może jeszcze kogoś zainspiruje teraz lub w przyszłości do własnych eksperymentów.
Nie znam Rubyego, ale kolejny język programowania warto przynajmniej z grubsza poznać jako proste ćwiczenie.
Dawid w wątku o zgłaszaniu propozycji zauważył, że wiele błędów i pomysłów to jest sprawa kilku linijek kodu, a czasem poprawienia literówki jakiejś.
I to mnie przekonało, żeby spróbować zaeksperymentować z kodem Eltena.
Mam jakieś tam proste pomysły ulepszeń, np. żeby odpowiedzi na pytania w prezentacji wyników ankiet, się układały malejąco od największej liczby głosów.
Zanim się wgryzę w monumentalny post o odpalaniu Eltena z kodu źródłowego i modyfikacje tam, pomyślałem o czymś prostszym, czyli tutorialek "Ruby w 20 minut", Elten: narzędzia: konsola i działamy.
"Witaj świecie"
wpisane w konsoli na wejściu powinno na wyjściu dać ten łańcuch, ale tak się nie dzieje.
2+4 powinno dać 6, ale też nic z tego.
Po kontakcie z autorem programu okazuje się, że wykonanie kodu w konsoli Eltena następuje po Ctrl+enter, a nie po samym enterze.
Z innych wyjaśnień od Dawida, interfejsowa część Eltena bazuje na RGSS i Ruby 1.8.6, a agent odpowiedzialny za procesy w tle, jest oparty na Ruby 3.0.
Istotne, gdyby jakieś składnie podane w tutorialach nie chciały działać, może być to problem różnic wersji.
W folderze elten/bin jest ruby.exe, można go użyć do odpalania jakichś prostych programów z konsoli cmd, jest to ruby 3.0.1, nie 1.8.
Wracając do konsoli Eltena.
Wpisanie 2+6 [ctrl+enter] daje wynik na wyjściu, ale puts "takie testy"[ctrl+enter] już nie, pewnie stdout idzie gdzieś indziej.
Czy jest jakaś szybka metoda, żeby coś wypisać na wyjściu konsoli, ewentualnie powiedzieć mową?
Konsola eltena nie ma historii, czyli strzałka w górę nie pokaże nam ostatniego polecenia z mozliwością jego modyfikacji.
Poza tym ile można zrobić w jednej linii.
Przypuśćmy więc, że jakąś przymiarkę do kilku lub kilkunastu linijek chciałbym wykonać w pliku i ją szybko odpalić w kontekście środowiska eltenowego.
require 'd:/elten/test.rb' nie do końca działa, wypisuje mi jakieś true albo false, ale tak jakby niewiele więcej.
eval(readfile('d:/elten/test.rb')) też nie bardzo, gdyż wygląda na to, że wykonuje się ostatnia linijka.
czyli z pliku dwuliniowego:
"blabla"
2+3

się pojawia na wyjściu tylko 5, a po usunięciu 2+3, pojawia się "blabla".
Zresztą przez ten brak historii, odpalanie przez konsolę łączyłoby się z wklejaniem takiej linijki odpalającej plik, do której nie da się dotrzeć ani strzałką w górę, ani przez ctrl+z.
Więc w sumie to można cały taki kodzik przeklejać do konsoli z jakiegoś zewnętrznego pliku w notatniku i na początek spoko.
Ale na marginesie myślę, ile fajnego zrobiły w necie skryptozakładki, że nawet ludzie nieznający JavaScriptu mogli z nich skorzystać, przeklejając sobie jakieś szybkie gotowce.
I może jest to jakieś pole, dla początkujących w kodowaniu rubym i Eltenie, żeby mieć w miarę prostą metodę wrzucenia sobie jakiegoś pliku rb gdzieś i jego odpalania klawiszem skrótu.
Oczywiście że pole jest, po wejściu w roaming/elten/apps mam shooter, tam kod rb, więc raz, że poglądowo można podglądać i się uczyć, a dwa, wiadomo jak swojego appsa wytworzyć i to jest proste.
Brakuje tylko możliwości odpalania appsa z klawisza skrótu, ale może i jest.
W sumie jest: alt, p, pokazuje ten shooter zaznaczony; jeśli mój program się będzie nazywał 1test, pewnie będzie pierwszy na liście pod enterem.
No nie jest, w ogóle nie ma go na liście.
Smuteczek, jak to obejść?
Wracając na chwilę do konsoli, skoro w appsach nie wyszło.
Z podglądu w shooter wiem, że zamiast puts można użyć alert:
alert("Takie sobie proste testy")[ctrl+enter]


19.09.2021 12:45

2 z 143: grzezlo

W pośpiechu przegapiłem plik __app.ini, którego w moim folderze z programem zabrakło.
Problem łatwy do rozwiązania, a plik do zmodyfikowania.
Na wszelki wypadek zmieniłem też nazwę mojego pierwszego appsa na a1test, żeby nie zaczynał się od cyfry.
Plik a1test.rb składa się z jednej linii:
alert "blablabla"
Niestety nie ma go nadal na liście.
Ale jest częściowy sukces - po restarcie eltena słyszę "blablabla" chociaż appsa na liście nadal nie ma.
Zaglądam do kodu shooter, wygląda, że program trzeba obudować prostą klasą.
Po modyfikacji wygląda jak poniżej, ale nie próbujcie tego w domu, gdyż co prawda jest na liście, odpala się, ale powoduje zawieszenie eltena i NVDA generowaniem ciągłego "blablabla".
Tak jakby metoda main była wykonywana w pętli, a nie tylko raz.
Kolejne podglądnięcie shootera i okazuje się, że wystarczy wywołać funkcję finish, aby rozwiązać ten problem.
Czyli odpalenie poniższego a1test w menu programy, generuje raz komunikat "blabla" i info "program został zamknięty".
Sukces nie jest pełny, gdyż po modyfikacjach pliku i uruchomieniu appsa, odpalana jest poprzednia wersja, czyli wygląda na to, że appsy są wczytywane przy starcie Eltena.
Ponadto, jesli popełnimy jakiś błąd w składni appsa, to w ogóle Elten się nie uruchomi.
To ewentualnie można sprawdzić w konsoli, wklejając tam cały kod naszego appsa i ctrl+enter.
A czytając sobie shooter widać, że bardzo prosto da się tworzyć appsy dla Eltena, a w tym i gry audio.
class Program_a1test < Program
Name="a1test"
Version="1.0"
Author="grzezlo"
def main
alert "blabla2"
finish
end
end


19.09.2021 13:24

3 z 143: pajper

Hej!
Wystawiłem na Githuba właśnie kod najnowszej bety z kilkoma nowościami, których jeszcze w binarce nie ma, a mogą pomóc właśnie na początek. Nowości są właściwie dwie, czyli przekierowanie stdouta do konsoli i prosty skrót na wczytanie poprzedniej komendy: CTRL+L.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 13:53

4 z 143: pajper

Co do wyjścia jest funkcja alert i speak. Działają one troszkę inaczej.
funkcja speak po prostu wymawia tekst, ale może zostać przerwana następnym komunikatem.
Funkcja alert ustawia flagi tak, by następne komunikaty zostały wypowiedziane dopiero po zakończeniu aktualnej wypowiedzi.

Warto zauważyć, że ani funkcja speak, ani alert nie opóźniają następnych zdarzeń, jedynie ustawiają odpowiednią flagę na następnej wypowiedzi. To zachowanie celowe, by nie opóźniać sztucznie np. zapytań do serwera i podobnych. Jeśli zależy nam na opóźnieniu działania, mamy funkcję speak_indexed, która pozwala na tworzenie ciągów z indeksami i przechwytywaniu ich, ale to już większa robota. :)
No i funkcja speak_indexed zadziała tylko dla SAPI lub NVDA, gdy dodatek jest włączony.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 13:58

5 z 143: grzezlo

Super, dzięki za te poprawki.
W końcu odpalę Eltena z kodu, ale na ten moment jeszcze eksploruję co może zrobić początkujący developer bez tak radykalnego kroku.
I tu te appsy się wydają ciekawym polem, bo nic nie trzeba instalować a ma się dostęp do środowiska Eltena, natomiast killerem tej ścieżki się wydają dwie rzeczy, czyli ładowanie wszystkich appsów na starcie, i brak info o błędach składni.
Czy byłaby to duża sprawa do zrobienia, żeby apps wybrany się ładował po jego wybraniu z menu programów (po raz pierwszy i kolejne), a nie przy starcie Eltena, co nawet od strony optymalizacji miałoby jakiś tam sens...
A druga kwestia, żeby przy ładowaniu appsa, jeśli wystąpi błąd składni, to żeby jakoś był anonsowany?
Pobawienie się w tworzenie prostych appsów to może być fajna sprawa, bo niewielkim kosztem czasu i kodu, można sporo w Eltenie osiągnąć...
To mógłby być fajny wektor startowy dla ewentualnych nowych developerów...


19.09.2021 14:00

6 z 143: pajper

Jeśli chodzi o błąd appsa, jakiś anons można zrobić, natomiast oczywiście trafi on do logu. ;)
Co do przeładowania aplikacji, jest na to sposób, choć troszkę na okrętkę, a są nim dwie linijki wstukane do konsoli, czy to na raz, czy kolejno:

Programs.delete_all
Programs.load_all
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 14:03

7 z 143: pajper

Programy muszą być ładowane przy starcie. Wynika to z faktu, że one mogą rozszerzać Eltena. Shooter jest prosty, ale już nawet istnieją programy dodające swoje kodeki, pozwalające na wyłapywanie linków do YT z wpisów i takie tam.
Elten ma kilka globalnych hooków, pod które programy mogą się wpiąć i dodawać swoje rzeczy. Najlepszym przykładem jest właśnie rozpoznawanie multimediów po wzorcach.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 14:09

8 z 143: grzezlo

Ok, to ładowanie appsów przy starcie ma faktycznie sens.
Ręczne przeładowywanie programów też fajnie że jest, trzeba sobie zrobić takiego appsa przeładuj programy, który te dwie komendy wykona, to nawet do konsoli nie trzeba zaglądać.
Chociaż i tak trzeba, żeby wkleić swoje dzieło i sprawdzić czy nie ma syntax errorów przed przeładowaniem i wywaleniem eltena całego.
Natomiast zastanawiam się nad prostą scieżką, czyli jakimś szybkim startem po polsku i angielsku od zera do pierwszej jakiejś prostej gry audio...
Wywalenie możliwości startu eltena przez jeden syntax error w pierwszym swoim programie, to nie jest zachęcający user experience.
Ale może właśnie pomysł na appsa, jakiś Elten apps developer starter kit, czy coś, czyli apps, który:
1. Po naciśnięciu jakiegoś globalnego dla Eltena klawisza skrótu po raz pierwszy, poprosi o wskazanie pliku rb do uruchomienia.
2. Po wskazaniu załaduje ten plik i poda ewentualne błędy w przyjazny sposób, czyli najlepiej w dialogu z polem edycyjnym eltena z przyciskiem Wczytaj ponownie i anuluj.
3. Jeśli błędów nie ma, to uruchomi to co dostał.
4. Po ponownym naciśnięciu jakiegoś globalnego klawisza skrótu, załaduje ostatnio wczytany plik i powtórzy punkty 2 i 3.
Albo zamiast punktu 1. zrobić alert, żeby sobie użytkownik zdefiniował nazwę programu, który chce uruchamiać w kodzie tego appsa starterkit, to już od razu miałby pierwsze ćwiczenie z hackowania appsów.


19.09.2021 14:23

9 z 143: pajper

Zerknij na kod Archiwum Klango. ;) Nie dlatego, żeby był jakoś wybitnie uczący czy coś, ale dlatego, że to program pisany już po premierze Eltena 2.4, a co za tym idzie, w pełni wykorzystuje nowe klasy.
Większość pozostałych aplikacji jest starsza i to widać w kodzie.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 14:30

10 z 143: pajper

Elten ma jeszcze fajne, zdarzeniowe API do tworzenia formularzy od wersji 2.4, ale jakoś nie zostało wykorzystane w żadnym programie.

form = Form.new([
edt_firstname = EditBox.new("Twoje imię", 0, "", true),
edt_surname = EditBox.new("Twoje nazwisko", 0, "", true),
btn_hello = Button.new("Przywitaj się"),
btn_bye = Button.new("Pożegnaj się")
], 0, false, true)
btn_bye.on(:press) {
alert("Do widzenia, #{edt_firstname.text} #{edt_surname.text}!")
form.resume
}
btn_hello.on(:press) {
alert("Cześć, #{edt_firstname.text} #{edt_surname.text}!")
}
form.cancel_button = btn_bye
form.accept_button = btn_hello
form.wait
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 14:38

11 z 143: pajper

Albo o tak można urozmaicić sprawę:

form = Form.new([
edt_welcome = EditBox.new("Sekretne pole", EditBox::Flags::MultiLine|EditBox::Flags::ReadOnly, "Tego sekretnego pola prawie nikt nie zauważy!\nA to dlatego, że formularz pokaże się od imienia, a nie tej wiadomości.", true),
edt_firstname = EditBox.new("Twoje imię", 0, "Piotrek", true),
edt_surname = EditBox.new("Twoje bardzo sekretne nazwisko", EditBox::Flags::Password, "", true),
lst_age = ListBox.new((1..100).to_a.map{|s|s.to_s}, "Ile masz lat?", 18-1),
btn_hello = Button.new("Przywitaj się"),
btn_bye = Button.new("Pożegnaj się")
], 1, false, true)
btn_bye.on(:press) {
age=lst_age.index+1
ph="Do widzenia"
ph="Pa pa" if age<18
alert("#{ph}, #{edt_firstname.text} #{edt_surname.text}!")
form.resume
}
btn_hello.on(:press) {
age=lst_age.index+1
if age>30
ph="Dzień dobry"
elsif age>=18
ph="Cześć"
else
ph="Siemanko"
end
alert("#{ph}, #{edt_firstname.text} #{edt_surname.text}!")
}
form.cancel_button = btn_bye
form.accept_button = btn_hello
form.wait
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 14:50

12 z 143: grzezlo

Rzeczywiście fajne, ale kto prócz autora o ty mwiedział?
Mam pomysł na app dev starter kit, żeby w folderze appsa był sobie myprogram.rb, który po wybraniu Run my program, byłby wczytywany z dysku i wykonywany.
Jednak dwa pytania: Jak podpiąć akcję do globalnego dla Eltena klawisza skrótu?
2. Czy jak zrobię readfile('myprogram.rb') to ten plik się wczyta, gdy będzie w folderze danego appsa, pewnie nie, więc jak? A już wiem, appfile('myprogram.rb') załatwia sprawę. Przy okazji, fajne to klango archive, no i nawet wielojęzyczność jest zaimplementowana, to nic tylko się uczyć.

19.09.2021 14:56

13 z 143: pajper

Nie da się tego zrobić, ale da się zdefiniować szybką akcję, którą użytkownik może sobie dać na pulpit i samemu oskrótować.
Tylko tu wychodzi kilka problemów. Po pierwsze musisz w klasie programu stworzyć funkcję self.init. Ona zostanie wykonana zaraz po załadowaniu programu, czyli przy starcie Eltena.
Ta funkcja jest wykonywana w kontekście klasy, a nie instancji, bo instancja programu nie została utworzona. To dość charakterystyczna sytuacja dla Rubiego. W językach z grupy C powiedzielibyśmy, że to funkcja statyczna.

def self.init
register_quickaction(:jakis_unikalny_id, "Nazwa akcji") {
# to się stanie po wywołaniu
# tu można załadować ręcznie program, o tak:
instance = self.new
insert_scene(instance)
}
end
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 15:01

14 z 143: pajper

PS. Tę funkcję oczywiście trzeba wrzucić do klasy programu.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 15:03

15 z 143: pajper

No i jeszcze dla kompletności wyjaśnienia, funkcja insert_scene wysuwa okienko nad obecne okno, nie zastępuje go, tylko otwiera nowe.
A bardziej technicznie, tworzy nowy wątek i w tym wątku wywołuje funkcje main obiektu, który dostaje w parametrze.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 15:07

16 z 143: grzezlo

Robi się ciekawie.
Jako akcja szybkiej akcji, to byłoby uruchomienie myprogram.rb.
Ale prostota tworzenia tych interfejsów, to jest na prawdę duży atut eltena, tylko nikt o tym nie wie... Początkujący programiści a i nawet zaawansowani, nie mają po prostu innych opcji technicznych, żeby tak prosto jakąś grę audio sobie stworzyć, albo okienko dialogowe...

19.09.2021 15:21

17 z 143: pajper

Tu jest jeszcze kilka innych, moim zdaniem bardzo przydatnych funkcji, jak wysyłanie pakietów między użytkownikami jedną linijką. Tylko to by wymagało tak naprawdę pożądnego tutoriala krok po kroku, a ja nie mam czasu takiego napisać.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 15:33

18 z 143: pajper

Inną przydatną rzeczą są AppDB, kolejny pomysł zaimplementowany, a nigdy nie wykorzystany.
To nic innego, jak zapisywane na serwerze tablice. Każda aplikacja może utworzyć taką tablicę, która może być dostępna w kilku ustawieniach dostępu: prywatna, publiczna, współdzielona, tylko do odczytu itd.
Wyobraźmy sobie program szachowy. Mogę współdzielić informacje o grze ze swoim oponentem, wszystkie informacje zapisywane na serwerze i dostępne przez cały czas, np. jak zrobimy sobie przerwę w grze.

Wiadomo, to się nie nada do super tajnych danych i łatwo można zmanipulować zapisywane dane, ale i tak jest dość użyteczne, pozwalając na tworzenie gier multiplayer czy aplikacji z wymianą informacji bez własnego serwera.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
19.09.2021 15:40

19 z 143: grzezlo

Wiadomo, że tutorial byłby nie zły, a jeszcze lepsze api reference, ale oczywiste, że nie ma na to czasu.
Ale jakiś folder samples, z krótkimi przykładami wykorzystania różnych rzeczy, uporządkowanymi wg kategorii albo stopnia skomplikowania, byłby nie zły.
Takie samples możesz albo na kolanie napisać, albo pewnie nawet już je masz z czasów testowania działania różnych funkcji...
I tu jest problem, że tylko autor ma kompletną wiedzę, żeby to szybko wytworzyć.
Takie samples mogłyby być uzupełnieniem do Elten Apps Developer guide, który by omawiał pierwsze kroki.
Właściwie mogłoby to być jedno repo na CC BY SA, czyli tutorial quick start, oraz dowolna ilość samples z ciekawymi sztuczkami.
Jest szansa, że z czasem społeczność dodawałaby swoje samples.
I też jest szansa, że ktoś ktoby wystartował z tworzeniem appsów do Eltena, wgryzłby się z czasem w kod samego klienta.
Nie wiem czy spolszczenie quick startu miałoby sens, skoro sam kod w samples i jego komentarze byłyby pewnie w eng...
Trochę jak z dodatkami NVDA, musiałby się z czasem wyłonić jakiś manager tego repozytorium, ale ktoś z koleżanek czy kolegów nawet lekko programistycznie ogarniętych spokojnie mógłby to zrobić, sam się przy tym nauczyć, no i ułatwić innym edukację programistyczną.
A jak tu w tym wątku widać, no i w tych appsach, to się na prawdę lekko łatwo i przyjemnie robi ciekawe rzeczy.
A instalowanie 10 GB narzędzi, odpalanie z kodu i robienie pull requestów, to jest trochę jakby następny level, do którego prosta dróżka prowadzi przez Elten Apps dev guide.


19.09.2021 16:02

20 z 143: daszekmdn

To co pisze Grzezlo to rzecz ważna. Sam chciałem kiedyś zająć się zrobieniem czegoś, nauczyć się Eapi, ale niestety brak jakiejkolwiek dokumentacji powoduje, że niezbyt wiele można zrobić, bo o wielu rzeczach się nie wie.

19.09.2021 19:20

Wróć do listy wątków

1 z 8

Następna

Nawigacja


Copyright (©) 2014-2024, Dawid Pieper