Játék a homokozóban – Comodo Antivirus Sandbox

És megint belefutottunk. A Comodo Antivirus “most ezt berakom egy homokozóba, mert szerintem nem biztonságos” művelete egy kicsit idegesítő. A Symbol Ügyvitelt az esetek 15-25%-ában, nem mindig elhelyezi egy virtuális karanténban. Amíg a Norton Antivirus a karanténban nem enged futtatni, addig a Comodo engedi futtatni, de nem engedi hogy hozzáférjen például a temp fájlhoz vagy a globális temp könyvtárhoz.

comodo

Tudom, tudom, hogy a felhasználót figyelmezteti erre valami, de a felhasználó az felhasználó, mindent az OK gombbal old meg. Ezúton hívjuk fel a rendszergazdák figyelmét a Comodo ezen komédiájára.

Ami hiányzik a .NET-ből

Mindig is irigykedtem, hogy sok fejlesztő publikál példa kódokat, amelyek másoknak is jók lehetnek. Most mi is összegyűjtöttünk egy párat, hátha…

 

Tömb összefűzés, rendezési opcióval

public static T[] Concatenate<T>(params T[][] arrays)
{
  return Concatenate<T>(null, arrays);
}
public static T[] Concatenate<T>(Comparison<T> comparison, params T[][] arrays)
{
  List<T> result = new List<T>();
  foreach (T[] array in arrays)
    result.AddRange(array);
  if (comparison != null)
    result.Sort(comparison);
  return result.ToArray();
}


Tömb "egyszeresítés"
public static T[] Distinct<T>(T[] array)
{
  return Distinct(array, null);
}
public static T[] Distinct<T>(T[] array, Comparison<T> comparison)
{
  List<T> result = new List<T>();
  foreach (T item in array)
    if (!result.Contains(item))
  result.Add(item);
  if (comparison != null)
    result.Sort(comparison);
  return result.ToArray();
}


Tömb összekavarás
public static T[] Shuffle<T>(T[] array)
 {
  Random rnd = new Random();
  int n = array.Length;
  while (n > 1)
  {
    int k = rnd.Next(n);
    n--;
    T temp = array[n];
    array[n] = array[k];
    array[k] = temp;
  }
  return array;
 }


Várakoztató kurzor kezelő

public class WaitCursor : IDisposable
{
  public WaitCursor()
  {
    ContextHandler.WaitCursorOn();
  }
  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
  private bool disposed = false;
  protected virtual void Dispose(bool disposing)
  {
    if (!this.disposed)
    {
      if (disposing)
     {
     }
     ContextHandler.WaitCursorOff();
   }
   disposed = true;
 }
 ~WaitCursor()
 {
   Dispose(false);
 }
}


X64 kezelő
public static class X64Handler
{
  public static bool IsX64 { get { return IntPtr.Size == 8; } }
  public static string Display(bool suppress32) { return IsX64 ? "x64" : suppress32 ? null : "x86"; }
}
 

NAV adószám nyilvántartás – köszi a teljesítményt!

Cégünk az 1.100-as verzióban beépítette a publikus ÁFA alany nyilvántartást. A NAV-nak van egy ilyen szolgáltatása, gondoltuk ügyfeleink örülni fognak ennek. Többször nem működik, mint ahányszor működik!  Vicc…

Az ÁFA alanyok lekérdezése funkció  szépen is tudna működni, 1.7M céget tartanak benne nyilván. Nyilván rendelkezésre áll a megfelelő infra (infrastruktúra), hogy ez szépen is működtethető lenne. De nem. Cégekre keresve hamar kiderül, hogy az ORACLE-t (biztos az van) SELECT LIKE-kal hajtják meg. “Symbol Tech”-re keresve lefuttatják a LIKE ‘%Symbol%Tech%!’ lekérdezést, amely nem erre lenne való. (GyK: a cégnevet fordítva beírva nem ad találatot, ez a tipikus LIKE % jellemzője). Ismét egy példa, amellyel elektronikussá alakíthatnánk az országot, de sajnos egyelőre nem megy.

navlogo

Szoftverünk hibajavító verziójából a cégnévre való keresést ki is vettük. Ha nem megy a NAV-nak, akkor nem megy.

A vicces mondat az oldalon: “Felhívjuk figyelmüket, hogy néhány ezer adószám lekérdezése – főleg csúcsidőben (10 és 14 óra között) – hosszabb ideig is eltarthat. Kérjük, ne indítsák feleslegesen újra a lekérdezést!

Windows 8 bumm (nem)sokára

A Microsoft már hónapokkal ezelőtt elkezdte csepegtetni a Windows 8 újdonságait, mára már tisztán látjuk, hogy mi és hogyan fog megvalósulni. Emiatt itt volt az ideje egy átfogó Windows 8 tesztnek.

Szokásos teszt számítógépeinken, amelyek több paraméter szerint szándékosan le vannak lassítva (hálózat, vírusírtó, HDD átviteli sebesség) egy Windows 8 Enterprise fejlesztői teszt változatot futtattunk és megnéztük, hogy viselkedik a Symbol Ügyvitel Windows 8 környezetben.

.NET telepítése

A .NET telepítése kicsit átalakult, az operációs rendszer automatikusan észreveszi (végre!) ha a program futtatásához .NET keretrendszer szükséges, ezzel a jövőbeni telepítőkészleteink 20MB-tal tudnak kisebbek lenni, illetve az x64-es .NET 2.0-t nem kell a Symbol Tech szervereiről letölteniük.

Nem is tudnánk telepíteni a .NET 2.0-t! A Windows 8 operációs rendszer nem engedi telepíteni a hagyományos készletet, helyette a saját (Microsoft?) tárhelyéről tölti le a 3.5-öt, amely tartalmazza a 2.0-t is. Egyébként is régóta tervünk, hogy ne kelljen nekünk telepíteni a .NET-et…

 

Felhasználói felület, ergomómia

Eddig is Microsoft technológiát használtunk (értsd: nem Delphi és Clipper), emiatt a szoftvereink a Windows különböző változatain megfelelően jelentek meg. Ez Windows 8 alatt sincs másképp. Félig áttetsző ablakaink igazodva a Windows 8 stílusához, a kiválasztott (Windows 8 alatt felhasználó név mellé felhasználói színt is kell választani) színnel jelennek meg. A szalagok (ribbon) is probléma mentesen működnek.

 

És a fürdőszobában, a csempén?

A Windows 8 újítása, a csempés felhasználói felület ikonjai között megjelenik a Symbol Tech mindkét ikonja (program parancsikon és az eltávolító ikon), azokat a kezdőképernyőre lehet mozgatni/másolni. A program indítása pedig automatikusan átváltja az operációs rendszert a hagyományos Desktop környezetbe. És ott futtatja azt.



Windows 8 integráció?

Hiszem, hogy a Windows 8 csempe felülete 2014-ig nem fog vírus szerűen elterjedni hazánkban, már csak azon rendszergazdai félelem miatt is, hogy az összes felhasználót újra ECDL tanfolyamra kell küldeni. Ezen hitre alapozva a csempe megjelenésre cégünk idén még nem koncentrál. Jövő évi terveink között szerepel csak, hogy a csempe felületen alap információkat meg tudjunk jeleníteni.


Ékezetes e-mail címek

Már régóta (2004-2005) lehet ékezetes domain neveket regisztrálni, de ennek sokak szerint csak marketing és SEO értéke van. A cégnek biztosan van egy “rendes” domainje, amelyeken a weboldal és a levelező szolgáltatás üzemel és mellette van egy kereső-barát domain ékezettel. Azzal még nem találkoztunk, hogy valakinek ékezetes email címe legyen. Nemrég befutott ez az igény is…

A hosszú ékezetekkel van a legnagyobb baj

Körülnéztünk a meglévő megvalósítások között (Gmail, Outlook, böngészők) és azt tapasztaltuk, hogy az ékezetes domain neveket mindegyik kezeli, azaz küldéskor a rendszer átalakítja a domain-t, ez alapján megtalálja a megfelelő szervert és oda a leveleket elküldi. A teljes folyamat során sehol sem látszik az ékezetes domainek kódolása. Ez remek hír volt.

 

De mi ez a kódolás?

UTF8/Unicode helyett valaki megálmodta, hogy a “@levelező.cégemékezetrevált.hu” domain-t a levelezőszerverek és webkiszolgálók az alábbi formában azonosítják:

@xn--levelez-8mb.xn--cgemkezetrevlt-6gb0jd.hu

Azaz szavanként kell kódolni és “xn--“-lel jelölni, ha ékezetet tartalmaz.

 

Mi a helyzet a @ előtti adatokkal?

Ezen lepődtünk meg a legjobban, mert a példa@symboltech.hu e-mail címet nem tudtuk megcímezni semmilyen eszközzel. A @ előtti részben nem szerepelhet ékezet? Pedig létre tudunk hozni ilyen felhasználót. A specifikációban nem találtunk erre vonatkozó leírást, talán nem is a domain felügyelet dolga a @ előtti részről dönteni. De erre is kell valami megoldás!

 

Eredmény

Rászántuk az időt, kerestünk egy ékezetes domain nevet a tarsolyunkban (nem árulom el melyik az, mert nemsokára új termékkel jelenünk meg a piacon) és elkezdtük megvizsgálni, majd megoldani a problémát helyzetet.

Sikeres eredmény született, kollégáink megoldották, hogy közvetlen SMTP illetve Symbol Comm Center-rel történő levél küldés esetén is hibátlanul átküldésre kerülnek az e-mail üzenetek, azt a fogadó oldal levelező programja is helyesen jeleníti meg. Programunk új verziójában (v1.90) az ékezetes levél küldés is működőképes lesz, még akkor is, ha a @ előtt van benne ékezet. Köszönjük LAB!

Időzónák hatása az ügyvitelben

Próbálták-e már a Symbol Ügyvitelt Londonban elindítani? És Los Angelesben? Londoni kiruccanásunk alatt a Temze partján elindítottuk a szoftvert és egy ablak fogadott minket, miszerint a számítógépünk órája eltér a szerver idejétől. Miért írja ki és miért fontos ez?

A szoftver korai verziójában biztonsági célból beépítésre került egy dátum/idő ellenőrzés, hogy a számítógép rosszul beállított órája ne okozzon eltérést a bizonylatok folytonosságában. 10 percnyi eltérésre már figyelmeztet, 6 óránál nagyobb eltérés esetén nem is engedi a programot elindítani. A felhasználói bejelentések között két alkalmat találtunk, amikor ügyfeleknél megjelent a dátum eltérés információs ablak. Most a saját bőrünkön tapasztaltuk meg és gondolkozni kezdtünk…

Időzónák

Miért ne fordulhatna elő, hogy valaki külföldről éri el a céges szervert? Ilyenkor mit jelent, hogy nála 17 óra van, nálunk csak 14? Mi legyen a “fő-idő”? Jó lenne erre a Greenwich Mean Time, azaz a GMT? Az a logikus döntés született, hogy a Symbol Ügyvitel szerverének ideje lesz a mérvadó. Ezt kell (fizikai helytől függetlenül) GMT+1-re (Budapest, Bukarest) beállítani és minden kliens alkalmazás ehhez fog igazodni.

A gyakorlatban ez azt jelenti, hogy a szerver dátuma/ideje az az érték, amely alapján létrejönnek a bizonylatok, elkészülnek a hozzászólások, naptárbejegyzések. Hogy a felhasználónak ne okozzon gondot a dátum anomália, 30 percnyi eltérés után (vannak fél órás időzónák is!) a főablakon, a jobb alsó sarokban megjelenik a szerver idő, amely eltér a számítógép idejétől és attól az időtől is, amit az ablakon kinézve látunk.

Ha valaki magyar időhöz viszonyítva +12 órában van – azaz nálunk 21h-kor ott már reggel 9h van – azt fogja látni, hogy a bizonylatok még “tegnapi” dátummal kerülnek kiállításra, hiszen a szerver ideje szerint még tegnap este 21h van.

A fentiekkel remélhetőleg kihúztuk a “méregfogát” a világ időzónáinak és univerzális megoldást adtunk arra, hogy a világon bárhol is vagyunk, a magyar időt tekintjük az ügyvitel alapjának.

MsSQL server 2012: Sequences (végre)

Bár nem használunk MsSQL szervereket, de mégis örömmel tölt el, hogy a Microsoft is lépést tart a világgal és a helyes irányba mozdul.

Eddig az automatikus sorszámozást AutoInc mezőkkel (pontosabban egy INT/LONG mező autoinc tulajdonságának beállításával) lehetett elérni. Ezen most változtattak. Példa lehet(ett) az Oracle vagy a Firebird/Interbase, amely évek óta ezt a technológiát használja.

 

Az MsSQL-es megvalósításnak a nyelvi szintaktikája is pont ugyanolyan:

https://www.kodyaz.com/sql-server-2012/number-of-sequences-in-sql-server-2012-using-sequence-objects.aspx

Hangok a Symbol Ügyvitelben

A kezdetek kezdetén elhatároztuk, hogy nem lesznek hangok a Symbol Ügyvitelben, de most eljött ez a pillanat is. Elmesélek egy történetet, ami megvilágítja, hogy miért félek a hangoktól.

Pályafutásom kezdetén, a CCS Hungary Kft-nél szoftverrendszert fejlesztettünk, amely a légitársaságokat és a Malév-ot szolgálta ki. Egyik funkciója volt a csomagok gépre rakása. Ha a gép indulása előtt negyed órával volt még függőben lévő csomag, akkor különleges figyelmeztetést kellett megjeleníteni.

Jött a korszakalkotó ötlet, hogy ne csak vizuális, hanem “audiális” is legyen a figyelmeztetés. A villogó piros mellett 5mp-enként hangot is adott. Kis sípolós kattanás. A szoftver rendben volt, vittük telepíteni.

A telepítésnél ott voltam, ezért én kaptam az első “pofont”. Az automatikus frissítő rendszer kb. 30 gépre lerántotta az alkalmazást és a felhasználó tényleges feladatától függetlenül minden gépen jelzett a csipogó. 5mp-enként szólalt meg ugyan, de 30 számítógép esetén ez 6csipogás/mp-es ütemezést jelentett. Egy nagy terem, ami csipog. A csipogás mellett már sikítottak is a kollégák. Nagy zűrzavart okoztunk :)

Szóval ezért nem szeretjük a hangokat. De az üzleti felhasználás most megkövetelte. A felugró emlékeztető (Partnerkapcsolat modul) és az átküldött jegyzet (Sticky-note) hangot ad, amikor megjelenik. Reméljük, nem lesz belőle hangorkán.

Használat Interneten keresztül – Biztonságos ez?

Rendszerünk használata az infrastruktúra helye megválasztása miatt távolról is lehetőséges. Számos megoldási mód van még a tarsolyunkban, de a legtriviálisabb a direkt Interneten keresztüli csatlakozás.

Ingyenes megoldás

Adatbázis műveleteink optimalizáltsága miatt egy 2/2 Mbit-es kapcsolaton működő szerver (amely lehet Linux is) alkalmas a rendszer kiszolgálására 15 munkaállomásig. A munkaállomások számának növekedésével felfelé skálázni kell a kapcsolat sebességét.

A kapcsolat nyilvánvalóan publikus, bárki számára elérhető, emiatt lehet hozzá egyszerűen csatlakozni. De nézzük meg, milyen információkat kell tudnunk ahhoz, hogy a kapcsolat létrejöhessen. Szükség van tehát:

  • IP címre vagy host névre
  • port számra (alapértelmezett 3050 helyett)
  • adatbázisfájl fizikai helyének megadására

Az első kettő a mai számítógépes teljesítménnyel pár óra alatt kideríthető, ha máshogy nem, próbálkozással. A legutolsó azonban olyan mértékű kombinációs lehetőséget jelent, hogy számítógép legyen a talpán, aki ezt kitalálja. Nézzük, milyen példák lehetnek:

Windows-on: c:SymbolUgyvitelDBkiscegemdb1default.database

Linux-on: /var/lib/database/Symbol/CoMPaNY_1580/default.database

Ez utóbbi még betűnagyság érzékeny is. Matematikus kollégák véleménye szerint a lehetőségek száma elég nagy ahhoz, hogy valaki ezt ne találhassa ki. Konkrétan 26*2+10+5 a 49-ik hatványon, ami egy 3-as és mögötte 89 (!!!) darab nulla. Szemléltetve ez ennyi:

1 :
30000000000000000000000000000
000000000000000000000000000000
0000000000000000000000000000000

Azaz kicsi az esélye, hogy valaki el tudja találni, hol az adatbázisom. Ezt még egy kicsit erősíteni lehet, ha a helyet havonta cseréljük.

Ingyenes, előkészületet igénylő megoldás

Továbbra is ingyenes, de felkészültséget igénylő megoldás a kézzel kiépített SSL tunnel. Ezt például a putty programmal is megtehetjük. Ilyenkor az előző biztonságot növeljük azzal, hogy titkosított csatornán keresztül közlekednek az adatok. A csatorna kiépítése ilyenkor a felhasználó feladata.

Vállalati meegoldás, VPN

Egy igazi megoldás, amely pénzbe kerül a Virtual Private Network. Ez egy virtuálisan kiépített helyi hálózat, amely a számítógépet úgy emulálja, mintha a számítógép az irodában lenne. Ehhez valamilyen VPN szerverre szükség van.

…nevet még nem írhatok

Egy nemsokára megszülető megoldásunk – amelynek van már neve, de nem publikus – célja ponz az lesz, hogy biztonságos és stabil infrastruktúrális megoldást biztosítsunk ügyfeleinknek. Erről majd később.

APEH nyomtatványok – Valaki ezeket is megtervezte…

Már eddig is sokat hallottunk róla, hogy az ABEV nevű program itt-ott botladozik. Főleg akkor, amikor SZJA bevallás van és az átlag polgár (aki alap informatikai ismeretekkel rendelkezik) nem találja felhasználóbarátnak. Informatikus szemmel furcsa, hogy ott az a Console ablak, amiben a JAVA JRM ír ki nekem információkat. Felhasználói szemmel még furcsább, hogy egy kitöltött mező értékébe nem tudok belemódosítani, csak az egész törlésével.

A biztosítékot az csapta ki, hogy az ESZIG nyomtatvány mezőnevei az IMP/XML fájlban ugyanolyan véletlenszerűen vannak, mintha egy jó véletlenszám generátort készítenének az adóhatóságnál. (Bocs, helyesen NAV). Néha láttunk benne szabályszerűséget, de a végén nem sikerült semmilyen elvet ráhúzni. Maradt a kódtáblázat, azaz sor+oszlop-hoz hozzárendeltünk egy számot, ami az azonosítója lett a mezőnek.

Kérdésem az, hogy milyen szabályok alapján határozták meg a mezők azonosítóját. Esetleg több lépcsős módosítás során álltak elő a számok? A lényeg, hogy egyelőre sikerül megvalósítanunk a dolgot, de egy publikus API ennél okosabb/logikusabb is lehetne…