Tag Archives: SOFT

Proto mankšta: SVG kalbos interpretatorius

Viskas prasideda nuo mažos nesamonės: nutariau ant vieno 3D spausdinto gaminio padaryti USB jungties logotipą. Kokio nors STL failo greitai nusikrauti niekur neradau (for free arba download be registracijos). Tada sau galvoju- nu yra gi SVG iliustracija, ten gi grynas vektorius, tereikia jį tik “ištempti” į viršų (extrude) ir viskas bus čiki.

Ir tada pradidėjo… Mano 3D printeriavimo ir modeliavimo programa tokių failų nepriima. Gerai, ji netobula ir ne tam skirta. Online konverteris kažko irgi neveikia:
Defektuotas STL
Matom kaip nukando gabaliuką nuo kvadratėlio.
Continue reading →

VB.NET ir bitai, bei tekstai

Kaip apsukti bitų seką iš LSB į MSB? Galima padaryti ciklą ir kiekvieną bituką perkopijuoti į kitą baitą. Atrodo paprasta užduotis ir šiuolaikiniam 32/64 bitų kompui paprastas reikalas. Taip ir atrodė, kol nepabandėm prasukti megabaitus… Chmm, atrodo lėtokai. Galima daryti su 256 variantų look-up lentele. Keista atrodo, bet irgi ne taip greita kaip atrodo… x86 ar 64 tikrai turi kokias nors komandas tokioms operacijom… bet VB.NET nusprendė, kad to nereikia…

O ką siūlo internetiniai maniakai…? Wow:

a = ((buferis(i) * &H202020202UL And &H10884422010UL) Mod 1023UL) ' no way! 3 operacijos

Kas per? Bet veikia! Ir gana greitai veikia… geras. Buvo dar keli variantai kurie veikia su C ar C# ar C++, bet perrašius į VB jau neveikia. Spėju dėl “overflow”, nes VB neleidžia daryti perpildymo tokiose operacijose.

O kas dėl teksto? Ogi vėl lėtai veikia. Visose VB.NET pavyzdukuose naudojama:

tekstas="Tekstas"+kazkas.ToString+"dar kazkas"+vbCrLf
arba
sampleStr = "Hello" & " World"

Viskas kaip ir veikia. O bet tačiau! Jei pabandytumėm tokias operacijas padaryti su keliais milijonais teksto gabaliukų, pastebėtume, kad kompas intensyviai dirba. Tačiau lėtai. Kame reikalas? Ogi MS programuotojai nusprendė, kad nafig optimizuoti tą kodą (matyt dėl suderinamumo- tai dėl atminties rezervavimo subtilybių) ir kiekviena operacija tai naujo “string” sukurimas ir kopijavimas į jį. Techniškai du stringai nesusijungia, o sukuriamas trečias stringas i kurį kopijuojama pirmų stringų turinys. Darant milijonus operacijų, tai labai pasijunta.
Kaip tai sprendžiasi? Juk stringų klijavimas yra viena iš pamatinių demokr….ptfu programavimo principų. Yra net specialios stringų programavimo kalbos (perlas?) ir panašiai.

MS sukūrė dar vieną kintamųjų tipą: System.Text.StringBuilder(). Va į šitą galima klijuoti kiek nori visokiausių teksto stringų. Ir tai darosi tikrai greitai. Milijonus teksto gabaliukų suklijuoja akimirksniu palyginus su senu metodu (dešimtys sekundžių).

Kas moka programuoti, tai tokie reikalai visiškai nestebina. O man tai tikrai atradimai. O jei dar pašnekėti apie Multi Thread… 🙂

8 bitų šriftų įrankis

Laikas nuo laiko programuoju visokius niekalus ir kartais prireikia rašyti tekstą į grafinį ekraniuką. Kad ir į tokį:
8 bit font on graphics lcd
(tai ekraniukas iš Husqvarnos automatinės žoliapjovės. Iš broko)

Ir kad nesukti galvos dėl šriftų aš naudojų “klasiką”- vogtus šriftus iš Atari, Commodore, ZX Spectrum ar net Texas Instruments TI99/4A kompiuteriukų. Dar galima naudoti šriftus iš IBM PC video plokščių BIOSo. Svarbu tik nenaudoti tokį specifinį šriftą kur naudoja visi Kinijos programuotojai. Dabar, jau tik pamatęs ekraniuko tekstą galiu atpažinti ar tai Kinijos programuotojų darbas.

Ekraniukai skirtingi- jų ekrano atminties rodymo sistema skiriasi, todėl kartais reikia šriftą manipuliuoti- apversti, veidrodinti, pasukti ar pastumti. Kartais nereikia visų simbolių ar reikia papaišyti kažką specifinio. Tokiam darbui jau reikia specialaus softo. Tačiau čia bėda- softas iš interneto dažnai daro biški ne taip, kaip man reikia. Vieną dieną “triuko plionkė” ir per kelius vakarus gimė mano softas. Jis skirtas man, bet gali pasinaudoti ir blogo skaitytojai. Gal pravers. Bėda ta, kad programa skirta šiuolaikiniams kompams, o šie reikalauja, kad programa turėtų elektroninį parašą. Deja, parašas kainuoja, o aš tikrai iš to nedarau pelno. Todėl softas yra “self signed” ir instaliavimo metu iššoka visokie gąsdinantys įspėjimai.

8 bit font editor rotator C exporter for MCU

Mano programa minimalistinė. Ji gali užkrauti binarinį failą- kokį nors sena ROM dumpą, sukompiliuotą “firmwarą” ir leidžia jį kiek paredaguoti. Jei binarinis failas turi kokį nors 8 bitų pločio sriftą ar grafiką, galima tai surasti ir panaudoti.
Programa gali: redaguoti pixelius, įterpti baitą, ištrinti baitą, sukeisti bitų seką (MSB-LSB), pastumti bitus į abi puses su praradimu ar be jo (cikliškai), dirbant su 8 baitų blokais- pasukti 8×8 taškelių matricą pagal ar prieš laikrodžio rodyklę ar sukeisti baitų seką: manipuliacijų rezultatas- 8 bitų šriftas sukinėjasi į bet kurią pusę, apsiverčia ar gaunasi veidrodiškas atspindys.
Visos šitos manipuliacijos reikalingos kai reikia pakeisti rodymo kryptį ar vaizdą LCD ekrane.
Gautą rezultatą galima išsaugoti binariniam faile arba išeksportuoti į C kalbos “source code”.

Pati programa kartas nuo karto atnaujinama, todėl jį turi specialų puslapį: FontRotator install page.

Programa parašyta naudojant nemokamą Microsoft Visual Studio 2019, Basic kalboje. Deja reikalauja naujoviško kompiuterio. Turėtu veikti ir 32 bitų sistemoje, tačiau neturiu kur išbandyti,

Angliškos mini instrukcijos: Fontrotator- free bitmap font editor manual.

ARM:0020 smurtinis hardcorinis žaidimas Rogue

Jau rašiau, kad internetuose radau Rogue žaidimo source code kuris netikėtai susikompiliavo ant mano kompiuterio. Deja ant kitų kompiuterių jis neveikė. Bandžiau tokį iškrypimą, kaip perkelti source code į Microsoft Visual Studio Express, bet ten tikriausiai iš principo negali veikti jokie senoviški C kalbos failai- microsofto programa pranešinėjo keistas klaidas. Numojau į tai ranka ir pagalvojau- jei kompiliuojasi su gcc, tai kodėl jis nesikompiliuoti ir su ARM gcc (AVR tai gal per silpnas). Pasirodo, puikiausiai kompiliuojasi. Teko tik išpjauti dali paprogramiu susijusiu su failais ir prikabinti savo. Taip gavosi toks monstras:

Rogue running on STM32F103 MCU USB

Tai USB-COM-Rogue su STM32F103. Tereikia tik USB terminalo. Po tiekos programinimo, manau UART versija dar greičiau gautusi. Dar beliko viską sukultūrinti, nes dar liko visokių bugų- pvz. po žaidėjo mirties, jis kaip zombis toliau gali vaikščioti po labirintą. Nesvarbu, kad jau parodė mirties ekraną- turėjo pasileisti žaidimas iš naujo, bet kažkaip neišsivalė buferiai ir viskas liko iš seno žaidimo. Visiškai nesupratau dėl TERMCAP failo- vieną įdėjau ir veikia, įdėjau antrą- neveikia. Vėl įdėjau pirmą- neveikia. Veikia tik iš vakar dienos backupo. Originalus source kodas gana užsuktas. Užtat ir ant ARM gcc kompiliuojasi be jokių “warningų”.

Žaidimo source code ir kompiliuotas HEX. Dėmesio! Binaras gaunasi didelis (92kB ir neaišku kiek RAM jam reikia) ir tikrai neveiks ant BluePill. Jis veikia ant mano “white pill“, su pilnaverčiu STM32F106RET6.

Rogue: hardcorinis smurtinis žaidimas

Yra toks tekstinis (!) žaidimas pavadinimu Rogue. Pasinorėjau pažaisti, pajusti tikrą 2D grafiką (smegenyse), todėl paieškojau guglėje. Radau, bet nepatiko valdymo mygtukai. Todėl nutariau persidaryti į savo variantą, tuo labiau, kad source kodas yra. Kompiliuojant pasipylė srautas “warningų”, o aš mėgstu, kai kompiliuojasi visiškai be nieko… Teko pavargti kelias dienas- senovės programišiai labai mėgo “nutylėjimus” ir ignoravo viską iš eilės. Dabar rezultatas sumažėjo iki vieno įspėjimo:


> "make.exe" all
cc -g -c -DUNIX -DUNIX_SYS5 -Iinc -MMD -MP -MF"build/levo.d" src/levo.c -o build/levo.o
cc -g build/monster.o build/ring.o build/rogue.o build/levo.o build/random.o build/machdep.o build/object.o build/zap.o build/play.o build/main.o build/inventory.o build/save.o build/pack.o build/room.o build/level.o build/instruct.o build/init.o build/hit.o build/move.o build/score.o build/trap.o build/throw.o build/use.o build/message.o build/spec_hit.o build/lcurses.o -lcurses -Wl,-Map=build/../rogue.exe.map,--cref -Wl,--gc-sections -o build/../rogue.exe
/usr/lib/gcc/i686-pc-msys/6.4.0/../../../../i686-pc-msys/bin/ld: symbol `stdscr' missing from main hash table
size build/../rogue.exe
text data bss dec hex filename
114789 22240 5405 142434 22c62 build/../rogue.exe

> Process Exit Code: 0
> Time Taken: 00:01

Mano indelis- kogero visi “h” failai ir “makefile”. Sekantis etapas- šis smurtinis žaidimas turi suktis ant mikrokontrolerio.

Rogue source code C ir sukompiliuotas EXE failas. Veikia ant Windows 10.

Kaip susikompiliavo? Tikrai nežinau. Mano kompe pilna visokių C kompiliatorių ir kažkuris pasirodo kompiliuoja ir windowsinius exe failus.

Atari kompiuterio OS ROM darymas

Labai lėtai remontuoju senoviška Atari 800XL kompiuteriuką. Jis jau buvo kiek tobulintas mūsų meistrų, plėsta atmintis, dėtos rusiškos mikroschemos ir šiaip kūšis laidų. Jis vos vos veikė ir ekranas mirgėjo dėl atminties problemų. RAM čipų keitimas nepadėjo, todėl nutariau atstatyti pradinį, fabrikinį variantą. Deja nuardžius visas ataugas, kompiuteriukas nepasileido. Tiesa, oscilografas kažką rodė, bet vaizdelio nebuvo. Poto sekė pertraukos matuojamos metais. Prieš kokią savaite nutariau- reikia rašyti testinį ROMą ir žiūrėti kas ten blogai. Firminio testinio ROMo kažkaip greitai internete neradau.
Todėl teko kiek prisiminti 6502 asemblerį:
Atari ROM linker
Tik pradėjau ne su šiuo, o online versija. Tik buvo bėda, kad HEX kodukus reikėjo rankutėmis perrašyti į ROM čipo failą ir tik vėliau paleisti pradžiai emuliatorių, o poto viską perkelti į hardwarę.
Continue reading →

IP telefonija “ant greičio”

Mano darbe įvairūs skyriai yra skirtinguose pastatuose ir visur išvedžiotas vietinis telefoninis tinklas. Tam tinklui jau niolika metų, o vietomis signalai perduodami per senus, dar tarybinių laikų kabelius. Viskas kaip ir veikė, kol vieną diena dingo ryšis tarp keletos pastatų. Kaip ir niekas labai nesiparino, bet visdėlto, net šiais internetiniais laikais pasirodo žmonės mėgsta laidinius telefonus. Todėl vieną dieną buvo pasakyta- reikia sutvarkyti. Visa problema, kad to chaoso niekas neprisimena apart vieno žmogaus kuris vedžiojo ir biški prisiminiau aš. Dokumentacija tikrai buvo duota, bet per tiek metų ji pradingo. Ir tik dėl vedžiojusio asmens pareigingumo ir atsakingumo viską galima pataisyti. Bėda ta, kad tas geras žmogus, dėl savo pareigingumo ir geros darbų kokybės tikrai neturi laiko. Teko galvoti kaip čia išsisukti… kol netikėtai į šiukšlyną nebuvo išmesta arti dešimties IP telefonų.

IP telephones and linux debian or mint as PBX
Taip atrodo pilnai veikianti IP telefonijos sistema: du abonentai, PBXas ir tinklo šakotuvas
.

Aišku ne kokių nors prabangių, bet eilinės kiniškos piguvos (viestiek tie telefoniukai apie 50 kainuoja). Matyt kas tvarkė padarė tokią pat išvadą kaip ir mūsų sandėlio darbuotojai- įjungė į telefono tinklą ir jis neveikė.
Taigi- yra proga, yra priemonės ir vienas ilgas vakaras. Papildomai prireikė seno kompiuteriuko ir linux (manau tiktu ir koks rasberis). Užteko linuksinį kompą pakabinti kažkur įmonės backbone (nes skirtingos sub įmonės turi izoliuotus LAN tinklus, o backbone matosi visiems), instaliuoti biški softo ir sukonfiguruoti telefonus. Gerai, kad telefonų slaptažodžiai tai 123 arba 1234, tai nereikėjo nieko laužyti ar hackinti.

Darom taip:
Instaliuojam “asterisk”. Tai kaip ir virtuali telefonų stotis.

apt-get install asterisk

Redaguojam du asterisko konfiguracinius failus (tiksliau darom copy-paste, prie esamo defaultinio teksto):
/etc/asterisk/extensions.conf

[internal]
exten=> _XXX,1,Dial(SIP/${EXTEN})

Tai buvo komanda kuri išsišifruoja taip: kai surenkam trys skaičius, jungiam prie vietinio numerio
/etc/asterisk/sip.conf

[common](!) ; this is template
type=friend
context=internal
host=dynamic
disallow=all
allow=ulaw
allow=alaw
allow=g723
allow=g729
dtmfmode=rfc2833

Tai greičiausiai apibrėžiami leistini garso kodavimo standartai ir dar kažkas. Papildomai reikia aprašyti kiekvieną abonentą. Kad per daug nesiparinti, kiekvienas numeris turėjo loginą ir slaptažodį kuris atitiko telefono numeriui. Kaip čia:

[112](common)
username=112
secret=112

Tai rašosi į tą patį sip.conf failą.

Pačiuose telefonuose kaip serveris nurodamas Linuxinis kompas (IP pas mane, bet galima ir domeininį variantą), login, pass ir viskas. Tikrai viskas.
Balso kokybė buvo puiki…. kodėl buvo? Ogi todėl, kad testavom sistemą tik dvi dienas. Poto atėjo minėtas žmogus ir viską sutaisė.

P.S. nuotraukoje telefonai nerodo datos. Todėl, kad iliustracija daryta po visko, tas demo LANas neturi interneto, o telefonai sukonfiguruoti viešam laiko serveriui.

Vamzdžių sujungimas kampu

Tai tik teorinis eksperimentas!

Prasidėjo viskas nuo to, kad radau seną žurnalą “Наука и Жизнь” ir jame buvo aprašoma dviejų vamzdžių sujungimo- suvirinimo problema. Tiksliau, kaip tiksliai nupjauti vamzdį, kad jį privirinti prie kito vamzdžio balno jungtim. Ir kokią skylę išpjauti kitame vamzdyje. O dar buvo noras pažaisti su Corel Draw programa ir joje esančiu beisikų.
Tačiau viskas greitai nesigavo, nes algoritmas buvo aprašytas su klaidom, o softas- programuojamam kalkuliatoriui. Teko kiek pavargti.

vamzdziu suvirinimas
(paveikslėlis skolintas iš interneto).
Continue reading →

Elegantiškas windowsų 7 nulaužimas

Kartais reikia iš šrotinio kompo padaryti veikiantį produktą. Aišku galima ten viską perinstaliuoti, bet mano tingumas pasiekė jau gana dideles aukštumas, todėl jei yra galimybė pasinaudoti esama operacine sistema, tai ir ją ir laužiam ir naudojam. Ypač jei tai legalūs 7 windowsai. Kartais kompai papuola ir su domeinu, ir lokalus administratoriaus slaptažodis nežinomas… Seniau ten leisdavo specialų softą, kuris dar traukdavo kažką iš registro ir kartais neveikdavo. O štai šiandien prisireikė vieną kompą ištraukti iš domeino, pravalyti ir atiduoti second-hand naudojimui. Internetas pasiūlė paprastą sprendimą ir jis suveikė. Kad neužmiršti, surašau čia, nes tai labai elegantiškas sprendimas:

  1. Bootinam kompą iš live-CD, aš naudojau linux mint kompaktą.
  2. Einam į C:\windows\system32\ direktoriją ir ten surandam failą “sethc.exe”. Jį persikeliam kur nors, kad į C:\ disko root direktoriją.
  3. Tame pat system32 folderyje, kopijuojam cmd.exe į sethc.exe. T.y. pakišam kitą failą vietoje sethc.exe
  4. Perkraunam kompą į windows ir sulaukiam login screen. Tada penkis kartus spaudžiam shift klavišą.
  5. Iššokusiam komandinės eilutės ekrane rašom komandą: net user administrator naujasslaptazodis. Arba vietoje admino rašom bet kurį kitą vartotoją.
  6. Logino ekrane suvedam naują slaptažodį ir siautėjam windowsuose.

Kaip ir viskas…

Aišku, gal reikėtu atstatyti “sethc.exe” programą, bet kam? Geriau pasilikti “backdorą” 😛

Biški C optimizacijos

Jau ne pirmą kartą randu svetimam softe vieną dalykėlį. Įdedu čia du fragmentus- originalų ir mano rašyta:

Originalus:

for(int8_t bit = 7; bit >= 0; bit--)
{
L(PORTC, SS1306_OLED_CLK);
if((1 < < bit) & data) { H(PORTC, SS1306_OLED_DAT); } else { L(PORTC, SS1306_OLED_DAT); } H(PORTC, SS1306_OLED_CLK); }

Mano:

for(unsigned char bit=0;bit<8;bit++)
{
L(PORTC, SS1306_OLED_CLK);
if(data & 0x80) {H(PORTC,SS1306_OLED_DAT);} else { L(PORTC, SS1306_OLED_DAT); }
data = data < < 1; H(PORTC, SS1306_OLED_CLK); }

H() ir L() procedūros tai ne mano rašytos ir jos neturi įtakos. Pagrindinis skirtumas yra pakeisti “(1<<bit)” į “(data=data1<<1)”. Atrodo paprastas pakeitimas, bet pagalvokim koks bereikalingas darbas stumti tuos bitus per visą ciklą… 7+6+5+4+3+2+1 bitų pastumimai originaliam softe ir 7 pastumimai mano softe. Skirtumas gerai matosi oscilografo ekrane…

AVR GCC optimization
Čia originalus softas.

AVR GCC optimization
Čia mano.

Grubiai šnekant, su tuo pačiu MCU greitis padidėjo nuo 22μs iki 9μs vienam perduotam baitui, du su biškiu karto (ir 16 baitų mažesnis softas). O čia gi grafinis ekraniukas!
Ir kaip sakiau, jau ne pirmas kartas randu šitą klaidelę svetimam softe, kai daroma duomenu serializacija programiškai.

Aišku vienas loginis niuansas, mano algoritmas sunaikina kintamąjį data. Tačiau jį galima ir atsiminti, bet dažniausiai jis jau nereikalingas.

Kodėl tokios klaidos? Manau todėl, kad mąstoma šabloniškai- tikrinam duomenų bitus su “maske” ir pagal rezultatą išsiunčiam. Čia labai žmogiška, tačiau reikia galvoti plačiau- kam generuoti “maskę”, jei galima taip pat stumdyti pačius duomenis. O jei tai būtų ciklinis stumimas ROL/ROR, tai netgi duomenys nesusigadintu- galima “apsukti” visą baitą ir vėl viskas bus kaip pradžioje.

[dar galimi kiti variantai, kai “maskę” galima irgi “sukti” ir ciklo sąlygas tikrinti pagal tai. Kodas gausis dar geresnis. Laukiam skaitytojų versijų.]