SymbolTouch iPhone

Érintsd meg! – Symbol Touch

A technológia és a társadalom fejlődése kéz a kézben jár. Az elmúlt tíz évben a mobil eszközök fejlődése nagy utat járt be. Számos technológiai újítást azonban a nagyközönség nem fogadott el, a legtöbbnek nagyobb volt a füstje, mint a lángja. Mára azonban kialakult egy irányvonal, amelyre a nagy cégek is komoly figyelmet fordítanak. Gesztusok és érintőképernyők.

Az ún. finommotorikus mozgásokat a gyermekek 2-4 éves korukban elsajátítják. A felnőtteknek pedig most kell ezeket megtanulniuk!

Ügyviteli rendszerünk fejlesztése mellett erőforrásaink megengedik, hogy megtegyük első szárny próbálgatásainkat az érintőképernyős területen is. Az ötlet maga egy belső, alulról jövő kezdeményezés eredménye. Az általam irányított kollégákat mindig inspirálják az újdonságok, sőt nem ritkán a lehetetlennek tűnő dolgok is. Az érintőképernyős platformunk is ilyen!

 

Megoldásnak indult, alkalmazás lett belőle

A tervezett megoldás egy olyan fejlesztői platform lett volna, amely lehetővé teszi a Symbol Ügyvitelhez szervesen kapcsolódó (ugyanazon adatokat kezelő) mobil alkalmazások kialakítását. A cél az volt, hogy minden modern, érintéssel vezérelhető okostelefonon és táblagépen (iPhone, iPad, Android telefon és Android táblagép) futó alkalmazásokat készítsünk. Megrendelői igények alapján.

Azonban, ahogy azt a Symbol Ügyvitellel kapcsolatban megtanultuk, csak arról tud álmodni az ügyfél, amit lát. Ezért kollégáim, igazi csapatmunkával, sok szakmai vitával fűszerezve elkészítették a Symbol Touch-ot. A Symbol Touch egy kész alkalmazás, a Symbol Ügyvitel legfontosabb funkcióit érhetjük el vele. Olyan funkciókat, amilyenekre az érintőképernyő és a felbontás lehetőséget ad.

 

Akkor ez egy APP?

Vezető fejlesztő kollégám egy blog bejegyzésben összeszedte gondolatait arról, hogy miért nem lehet app-okból építkezni.

[learn_more caption=”APP-okból állna a világ?”] Az APP-ok világát éljük. Kicsit, könnyű, olcsó, gyorsan elkészíthető, ingyen van (általában). Az egyszerű embernek pedig a világképe átalakulhat és azt gondolhatja, hogy majd sok-sok app-ból épít egy irodát magának. Másik app-okból pedig bejárónőt, a harmadik napon pedig egy komplett családot.

Elhisszük, mert el akarjuk hinni, hogy app-okból fel tudunk építeni egy céges infrastruktúrát. Kell egy határidő-app, egy naptár-widget, egy rss-app a hírek miatt, google-app a weboldalam karbantartásához, egy mail-app, hogy legyenek bejövő leveleim, majd egy office-app, hogy a doksikat meg tudjam nyitni. Ebből csak ambiciózus kisfiúk színes játszótere lesz, de nem cég.

Tovább olvasom >>[/learn_more]

A Symbol Touch nem egy APP. Sokkal inkább egy multi-platform alkalmazás, amely a mai moziműsor vagy időjárás helyett a cégem ügyviteléhez enged hozzáférést. A Symbol Touch csapata megoldotta, hogy több tízezer vevővel, nyitott számlák százaival is megbirkózzon a rendszer. Nálunk nem csak az utolsó számlát lehet megnézni.

Symbol Touch Symbol Tech Zrt.

 

Mikor lesz elérhető?

Személy szerint én a praktikum híve vagyok. MacBook Pro számítógépet használok, de nincs okostelefonom. Sokkal fontosabb számomra, hogy a telefonban négy SIM kártya is elférjen. De a Symbol Touch termék olyannyira megmozgatta a fantáziámat, hogy rövid időn belül valamilyen okostelefon vagy tablet megoldásra fogok áttérni. (Emlékezzenek, a technológia és a társadalom fejlődése kéz a kézben jár!)

Még sok fejlesztést kell elvégeznünk, de házon belül már használjuk. A mindennapi (táv)munkát szeretnénk kényelmessé tenni! Ehhez pedig még több hétnyi tesztelés, pozitív és negatív, gyakorlati visszajelzések tömkelege szükséges. Ettől függetlenül ne lepődjenek meg, ha egyik-másik tanácsadó kolléga a jövő héten már a saját táblagépével fog megérkezni Önökhöz!

Hagyja, hogy Önt is megérintsék a modern kor innovációi!

 

Hogyan készült az Objektum?

A C#/.NET kombináció alapértelmezetten nem igényli a memória felszabadítását. Erről sok cikk jelent meg az elmúlt években. Általában csak az okoz problémát, ha nincs ideje (alacsony prioritású szálban fut, azaz nem jut neki idő) a GC-nek felszabadítania a memóriát. Általában…

Amíg az egyetemi tanulmányokban szereplő objektum hierarchia (Jármű, Gépjármű, Autó, stb.) valósul meg, nincs is szükség ezen dolgok vizsgálatára. A program memóriatérképe kicsi, lassabban történnek a dolgok, mint ahogy a GC futni tud. De mi a helyzet, amikor az objektum hierarchia összetett, túlságosan is összetett? Azaz nem triviális.

 

Túl sok a foglalt objektum!

A probléma nem is probléma, csak szépséghiba. Felhasználói környezetben (új számítógép, 4GB ram, x64) nem is jelentkezik, de programozói szemmel nem szép. Felesleges objektumok pihennek a memóriában várva a program befejezését. Ugyanis akkor minden felszabadul.

 

Honnan látjuk, hogy sokan vannak?

Jó programozó “érzi”, amikor a program nem úgy fut, mint kellene. Nemrégiben a DELL notebook-om átkapcsolt 90%-os üzemmódba (akku visszajelzés probléma). Ezt a gazdájának illik érezni. Így vagyunk a szoftverünkkel is. Érezzük, ha túl sok az adatbázis művelet vagy a memóriafoglalás. Ez a szakmánk.

Ezen túl pedig persze vannak eszközeink arra, hogy lássuk, miből mennyi készült, mennyi szabadul fel, mennyi van jelenleg. Egy erőforrás-figyelővel ősosztályonként és konkrét osztályonként is meg tudjuk vizsgálni a darabszámokat.

Kinyitva őket a konkrét példányokról is kapunk információt, bele tudunk nézni minden publikus és privát propertybe, mezőbe. A végtelenségig nyitogathatjuk az elemeket.

 

Hogyan készült az objektum?

Régóta szeretnénk tudni, hogy mikor és hol készült az a lebegő objektum, ami (mint fent láttuk) ott van. Ma megvalósítottunk (unalmas volt a napsütötte délután) egy úgynevezett Create Trace funkciót, amivel meg tudjuk állapítani, hogy mikor és milyen metódusok hívásán keresztül jött létre egy objektum. Sok minden kiderül ám ebből! A létrehozó metódus mellett a forráskód és a sor száma is látható, ahol az objektum elkészült.

Sok tennivalónk lesz ezzel az eszközzel. De legalább az eszköz megvan. Van kalapácsunk! Munkára fel…

Azért kár, hogy a régi jó dolgokból nem maradt semmi

A szoftveriparban nagyon gyorsan történnek a dolgok! Ezeket a lufikat a bulvárhírek is fújják, de alapvetően a sebesség elképesztő. Ha valaki tavaly nem volt szabadságon és idén vesz ki egyben 4 hetet, akár le is maradhat egy új programozási nyelv vagy felület bevezetéséről. És handicap-pel indul.

 

Minden napra egy platform

Napról napra jönnek az újabb hírek a különböző platformokról. Andorid, iOs, iPhone 3,4,5,6…, majd ugyanez iPad-ből is. És a felfogás szerint ezeken az eszközökön mind meg kell jelenni. Mert nem a szoftver gyártója, hanem a vevő dönt, hogy milyen eszközt vesz. És arra követeli is az alkalmazását.

App-okból áll a világ is?

Apropó, APP-ok

Az APP-ok világát éljük. Kicsit, könnyű, olcsó, gyorsan elkészíthető, ingyen van (általában). Az egyszerű embernek pedig a világképe átalakulhat és azt gondolhatja, hogy majd sok-sok app-ból épít egy irodát magának. Másik app-okból pedig bejárónőt, a harmadik napon pedig egy komplett családot.

Elhisszük, mert el akarjuk hinni, hogy app-okból fel tudunk építeni egy céges infrastruktúrát. Kell egy határidő-app, egy naptár-widget, egy rss-app a hírek miatt, google-app a weboldalam karbantartásához, egy mail-app, hogy legyenek bejövő leveleim, majd egy office-app, hogy a doksikat meg tudjam nyitni. Ebből csak ambiciózus kisfiúk színes játszótere lesz, de nem cég.

App-ok közötti kattintgatásból nem lett még olyan cég,
ami előállít valamit, fontos gazdasági szereplője lesz a társadalomnak
és egyáltalán viszi majd valamire.

Arra jó, hogy az esti TV nézés helyett (családok 60-70%-a tölti ezzel az idejét!) tapogassuk az Android vagy az iPhone kijelzőjét. Semmi több. Szvsz.

 

És ezeknek mind van egy külön-külön platformja

Mindent szabványosítunk. Kivéve a platformokat. Nem is vagyok ellene annak, hogy mindenki a saját ötleteit piacra dobja. Majd a nagyközönség kideríti, hogy melyik a “nyerő”. Sőt, nincs is nyerő, csak kedvenc van. Mindenkinek más. És ez a szokás szüli a hurrá-programozókat!

 

Kuplung szerint ebben van a bót…

Sok hurrá-programozó képezte ki magát. Sok O’Reilly könyv született a témában, 21 nap alatt sikerült mindenkinek Android és iOs programozóvá képeznie magát. Mert “Kuplung szerint ebben van a bót” (Papírkutyák, 2008). És itt gondolkoztam el azon, hogy mivé lesz a programozás, ha a PHP-s utat folytatjuk és minden program lefordul, amiben a pontosvesszőket (sorok végét lezáró karakter) jó helyre tettük. Talán mindannyian ismerjük a PHP-nek hívott webes játszóteret, amelyben csak nemrég (pár éve) jelent meg egyáltalán az objektum-orientáltság. De ez akkor is csak egy script-nyelv.

 

De mégis találtam valami újat

Már kezdtem világvége hangulatba kerülni, amikor rátaláltam. HTML5 (WebKit) böngészőkre optimalizált, webes (nem app-os!), érintőképernyős működést előtérbe helyező JS keretrendszer. A JavaScript nem is lényeg, mert nem látom. Helyette MVC (Model+View+Controller) elveken működő valódi keretrendszer. Komponensekből építkezhetek, tároló, megjelenítők vannak és csak azok vannak. Na és némi JS kód. Ami persze script jellegű, azaz mindig lefut csak nem azt csinálja, amit szeretnék. De mégis lehet(ett) rá építeni. Elkészült a Symbol Touch framework.

 

Érints meg!

A Symbol Touch framework egy nagyon vékony réteg, amely a SyX-ek által megvalósított webszerverben fut. Nem kell hozzá Apache vagy IIS. Elég a Symbol Touch SyX. És máris megjelenik az érintőképernyőn (Android tablet, iPhone, iPad) az ügyvitelnek egy része. Az a rész, amely kattintható, tapogatható. Bizonylatot nem tudok érintéssel kiállítani, de cégvezetőként meg tudom nézni, hogy…

? ? ?

…és ez legyen titok. A hivatalos bejelentésig még várni kell ezzel. Csak a neve van meg: Symbol Touch

Symbol Ügyvitel 1.92 “Amsterdam”

Aktuális, v1.92-es verziónk az Amsterdam fantázianevet kapta. A fantázianeveket a kiadás napján döntjük el, találjuk ki, az alapján, hogy a verzióban megvalósított dolgok milyen érzéseket keltenek kollégáinkban. Most az az érzésünk, hogy az amsterdami lakosok pont úgy alkalmazkodnak a természeti adottságokhoz, ahogy mi alkalmazkodtunk az ügyfél igényekhez.

[learn_more caption=”Ha többet szeretne megtudni Amsterdamról…”] A város névadója az Amstel folyócska, amely itt ömlik az IJssel-tó délnyugati öblébe, az IJbe. Az IJ valaha az Északi-tenger nagy öblének, a Zuiderzeenek a nyúlványa volt, de 1932-ben ezt lezárták, és egy tavat hoztak létre. A tengerszakasz elzárása lehetővé tette azt, hogy a város megmeneküljön a gyakori áradásoktól,és hogy a tengerfenék egy részét kiszárítsák. A várost az Északi-tengerrel és a Rajnával csatorna köti össze. Az IJ most az Ijssel-tó vizének egy részét vezeti a Nordzeekanal csatornán át az Északi-tengerbe, vize így folyóvíznek tekintendő. Amszterdam 207 négyzetkilométeres területének ötödrészét az öböl, a kikötőmedencék, a csatornák, és a folyók vízfelületei foglalják el. A város körútjait, sugárútjait, a csatornák (grachtok) alkotják, melyeknek hosszúsága 44 km. A város így kb. 100 szigetre tagolódik, melyeket a grachtok fölött átívelő hidak kapcsolnak össze egymással. Méltán nevezhetik a vizek városának, és Észak Velencéjének is. A város központjában található a Dam tér. Az amszterdamiak általában könnyű kis faházakat emelnek, mert a talaj süppedős, ingatag, puha homokréteg alkotja. A házakat valamikor facölöpök, most azonban betonoszlopok tartják. A rengeteg víz ellenére kevés az iható, ezt is az Északi tenger parti dűnék kútjaiból kapják. Hogy ezek a kutak el ne apadjanak, csővezetéken át a Rajna tisztított vizét szivattyúzzák a dűnevidékre, ahol a homok természetes szűrőként tovább javítja a minőséget. Mivel a zsúfolt fővárosban alig van beépíthető terület, ezért fejlesztik az északabbra fekvő kisvárosokat is, innen mára rengeteg dolgozó ember jár be Amszterdamba.[/learn_more]

Számos dolgot nem terveztünk bele számlázó és készletkezelő szoftverünkbe, de az ügyfél elégedettség miatt megvalósítottuk az igényeket. Szoftverünk pár percen belül letölthető lesz, illetve az automatikus szoftver frissítésben is elérhetővé válik. Lássuk, mik a változások a v1.92-es verzióban:

Csomagküldés Royal-Sprint-tel
Csomagküldő modulunk a Royal-Sprint-tel kézbesített küldemények kezelésére is alkalmas. Megadható a csomagok száma, amely az export állományban is megjelenik.

Árajánlat raktár
Árajánlaton is van lehetőség raktár megadására. Ez segíti a későbbi bizonylatok előállítását és már árajánlat szinten elérhetővé teszi a terméklistában a készletet.

Leltárív fordulónap
Leltárív nyomtatványokon megjelenik a leltár fordulónapja.

Leltár korrekció hiány/többlet érték
Leltár korrekciós listán a hiány/többlet mennyiségek és értékek (beszerzési áron és lista áron) is megjelennek.

Leltár korrekció exportálása
Leltár korrekciós lista adatai XLS formátumban exportálhatóak.

Rendelés mennyiség ellenőrzés
Enterprise rendszerünk rendelés mennyiség ellenőrzés funkcióval vonalkód olvasó segítségével ellenőrizni lehet a fellelt mennyiségeket.

Termék gyorsinfo a főablakon
Termék gyorsinfo a főablakon az árakat nettó és bruttó formában is megjeleníti.

Termékcímke CE jelölés
A termékcímkéken megjeleníthető a CE (Conformité Européenne = európai megfelelőség) jelölés.

Termékcímke piktogramok
A termékcímkéken megjeleníthetőek a termékhez rendelt piktogramok (törékeny, víztől óvni, stb.).

Termékcímke színesen
A termékcímkéken megjeleníthető címkék/adatok színe is egyedileg állítható.

Termékcímke papírméret és perforáció
A termékcímkék szerkesztő ablakán a hivatalos papírméretek segítenek a precíz méret beállításában, az opcionálisan bekapcsolható perforáció pedig segít a címkék darabolásakor.

Kiszerelési adatok mennyiségei
Termék kiszerelési adatok mennyiségei 99999/9999 maximum értéken kerültek beállításra.

Díjbekérőn gyári szám megadása
Díjbekérőn (raktár nélküli, pénzügyi bizonylatok) gyári szám megadása nem lehetséges.

Előleg felhasználások listája, fizetési mód
Előleg felhasználások listáján megjelenik és szűrhető is a fizetési mód.

Bankbizonylat(tétel) kiegyenlítésben nem vesz részt
Bankbizonylatokon és azok tételein egyenként is beállítható, hogy a kiegyenlítésben nem vesznek részt. Ilyen bankbizonylatokat nem kell számlához pontozni és nem szerepelnek az egyenlegközlőn sem.

Raktárhely nélküli raktár elrejtése
Raktárhelyen tárolt mennyiségek és megadott raktárhely mennyiségek összehasonlító listája elrejti azokat a raktárakat, ahol nincs definiálva raktárhely.

Raktárközi átadás raktárhely nélküli helyre
Raktárközi átadás raktárhely nélküli helyre fel sem ajánlja a raktárhelyek megadását.

SyX365, HTTP hibák részletesen
SyX365 plugin esetén keletkező HTTP (500) hibák részletesen kerülnek megjelenítésre a kliens oldalon is.

Egységárak elrejtése jogosultság
Vevő alkalmazható árak elrejtése mellett felhasználói jogosultságként is beállítható, hogy a felhasználó nem láthat minden, a termékhez elérhető árat.

Nyomtatás előnézet XLS, MHT export
Nyomtatás előnézet XLS és MHT export funkciója a bizonylatok összetettsége miatt megszűnt.

Rendelések kezelése, postakönyv
Rendelések kezelése során a kiválasztott rendelések egy kattintással postakönyvre helyezhetőek.

Bizományos raktár, vevő árai
Bizományos raktárba történő raktárközi átadás esetén a bizományos vevő árai kerülnek felajánlásra.

Termékcímke lapméretek
Termékcímke tervezésekor lehetőség van az elfogadott, szabványos lapméretek közül is választani.

XLS export nagy adatmennyiség
XLS exportkor nagy adatmennyiség esetén (több mint 10000 cella) a rendszer a vágólapra másolást ajánlja fel az Excel export helyett.

Hibajavítás: HTML editor üresen
HTML editor üresen is tartalmazta a paragrafus HTMP tag-eket.

Hibajavítás: Díjbekérő védett raktárra
Raktár beállítással rendelkező termék díjbekérőn nem szerepelhetett.

Hibajavítás: Névjegy megjelenítése
Névjegy megjelenítése több bizonylatnál nem működött megfelelően.

Hibajavítás: Waberer’s raklapkísérő
Waberer’s raklapkísérőn nem jelent meg minden vevői szállítási információ.

Hibajavítás: Szűrőfeltételek mentése, címkék
A felhasználóhoz menthető szűrőfeltételek esetén a címkék nem kerültek elmentésre.

Hibajavítás: Vevői rendelés raktár
A vevői rendelések raktár adata nem került átvételre, amikor szállítólevél vagy számla készült belőle.

Hibajavítás: Termékcímke nyomtatás ablak módosítható mező fejléce
Termékcímke nyomtatás ablakon a módosítható mennyiség mező fejléce nem volt vastag betűvel szedve.

Hibajavítás: Irányítószámok, városok
Irányítószám törzsben néhány város nevében helyesírási hiba volt.

Hibajavítás: Villáminformációs panel beállítások
Villáminformációs panel beállítások ikonja bizonyos esetekben eltűnt.

Hibajavítás: Szállítói ajánlatkérő módosítások
Szállítói ajánlatkérő nyomtatványon: nem látható a sorrend, látható a tételcsoport megjegyzése és a beállított sorrend szerint jelennek meg a tételek.

Hibajavítás: Kiadható mennyiség múlt és jövő
A kiadható mennyiség nem számolta precízen a bizonylathoz képest jövőben, de a kiállítás napjához képest múltban kiállítandó készletmozgató bizonylatok kiadható mennyiség értékét.

Hibajavítás: Lista nyomtatás, kijelölt sorok összesítése
Lista nyomtatásakor a csak kijelölt sorok összesítése nem jelent meg.

Hibajavítás: Tételes listák, projekt és divízió szűrés
Bizonylatok tételes listáin a projekt és divízió szűrések nem működtek megfelelően.

Hibajavítás: Helyettesítés más mennyiséggel
Termék helyettesítés funkció nem vette figyelembe, ha a terméket egy másik termék 1-től eltérő mennyiségben helyettesít.

Hibajavítás: Termék-Szállítói kódok mátrix szűrése
Termék-Szállítói kódok mátrix szűrése bármely mezőre hibát okozhatott.

Hibajavítás: Boríték nyomtatás letiltása
Amennyiben a partnernek a boríték nyomtatás letiltásra került, a megerősítő ablak után mégis nyomtatott egy DEMO adatokkal feltöltött borítékot.

Piktogramok (és CE) megjelenítése a termékcímkéken

Ügyféligényként érkezett a megkeresés, hogy a CE (Conformité Européenne = európai megfelelőség) jelölést és néhány más piktogramot lehessen a termékcímkéken megjeleníteni. A grafikával (is) foglalkozó kolléga elkezdte keresni, hogy honnan lehet beszerezni szép (nagy?) méretű piktogramokat. Gyúlékony, Nem érheti víz, Nem pakolható egymásra, stb.

CE

A megoldáson már elkezdtünk dolgozni, sőt néhány ügyfél már látta is, de a verziókiadásunk után szokásos Code-Freeze (kód pihentetés, nem kell minden nap megváltani a világot) miatt jelenleg még nem teljes a megoldás. Türelmüket kérjük!

Annyit elárulhatok, hogy nagyon frappáns, pofon-egyszerű megoldással jelentkezik a Symbol LAB.

RunTimer, azaz mennyi ideig fut egy kódrészlet?

Ha egy program működik és azt csinálja, amit kell, akkor arra azt mondják jó. Hogy a jóból kiváló legyen, ahhoz a minőségre is hangsúlyt kell fektetni. A minőségi program egyik ismérve, hogy nem akad, nincsenek benne lassú műveletek.

Ahhoz, hogy mérni tudjuk a kód sebességét, sok eszköz áll rendelkezésre, de minden eszköz sokat lassít a programon (közben persze precízen mér!), beépül, beleül minden hívásba… pedig én csak egy pici kódot, egy metódust szeretnék mérni. Erre kerestünk megoldást az alábbi ismérvekkel:

  1. Könnyen be lehessen építeni a forráskódba
  2. Tudjon többféle kimenetet produkálni
  3. Precízen mérje az időt

Megint az IDisposable lett a barátunk! A using segítségével könnyen beépíthető a kódba, pofon egyszerű a használata, sőt kikommentezni is könnyedén lehet.

Az alábbi minimál kód lett a megoldás:

public delegate void RunTimerResult(long ticks);
public class RunTimer : IDisposable
{
  private long starttick;
  private RunTimerResult runtimerresult;
  public RunTimer() : this(null) { }
  public RunTimer(RunTimerResult runtimerresult)
  {
    this.runtimerresult = runtimerresult;
    starttick = DateTime.Now.Ticks;
  }
  public void Dispose()
  {
    long endtick = DateTime.Now.Ticks;
    if (runtimerresult != null)
      runtimerresult(endtick - starttick);
    else
      Debug.WriteLine(String.Format("{0}ms", (endtick - starttick) /
                      TimeSpan.TicksPerMillisecond));
  }
  public static void RunTimerResultMessageBox(long ticks)
  {
    MessageBoxInfo.Show("Time elapsed", String.Format("{0}ms", ticks /
                                        TimeSpan.TicksPerMillisecond));
  }

Használata például (Console/Debug ablakba írja a futásidőt)

using(new RunTimer())
  DoSomethingSlowly()

vagy (MessageBox-szal jeleníti meg a futásidőt)

using(new RunTimer(RunTimer.RunTimerResultMessageBox))
  DoSomethingSlowly()