Sunday, December 27, 2009

Hidden Krento settings

Krento does not use Windows registry to store the settings, but INI file instead. The name of the configuration file is  C:\Documents and Settings\User Name\Application Data\Krento\Krento.ini

[Position]
Left=640
Top=512
Location=ScreenCenter

The 'Location" parameter can have two values: ScreenCenter and Point. When Location is defined as ScreenCenter, then Krento is always appears at the screen center. When the value is Point,  Krento  appears at the point of mouse cursor where you pressed mouse wheel.

Krento screenshot from Download for All site


Reading eID card from VBA using Middleware ActiveX control

Sample code from godot.be

Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
 ' Written by Sylvain Kusters 
 ' Free to use to everyone
 ' If you come with better solution (quicker) please let me also profit from your code.
 ' sk@startnet.be 
 ' Visit also www.filmclub.info     

    Dim lHandle As Integer

        'BEID_ Kaart Info
        Dim strCardNumber As String
        Dim strBegValDag, strBegVal, strBegValMaand As Object
        Dim strBegValJaar As String
        Dim strEndValDag, strEndVal, strEndValMaand As Object
        Dim strEndValJaar As String
        Dim strIssuingMunicipality As String
        'BEID Persoons Info
        Dim strName As String
        Dim strFirstName1 As String
        Dim strBirthPlace As String
        Dim strBirthDate As String
        Dim strGender As String
        Dim strNationality As String
        Dim strNationalNumber As String
        'BEID Adres Info
        Dim strStreet As String
        Dim strZIPCode As String
        Dim strMunicipality As String
        'BEID PICTURE
        Dim PictureFileName As String
        Dim FirstPath As String
        Dim EndPath As String
        Dim Path As String

        Dim RetStatus As EIDLIBCTRLLib.RetStatus
        Dim MapColPicture As New EIDLIBCTRLLib.MapCollection
        Dim MapColID As New EIDLIBCTRLLib.MapCollection
        Dim MapColAddress As New EIDLIBCTRLLib.MapCollection
        Dim CertifCheck As New EIDLIBCTRLLib.CertifCheck

        RetStatus = EIDlib1.Init("", 0, 0, lHandle)
        If (RetStatus.GetGeneral = 0) Then
            RetStatus = EIDlib1.GetID(MapColID, CertifCheck)
            strChipNumber = MapColID.GetValue("ChipNumber")
            strCardNumber = MapColID.GetValue("CardNumber")
            strBegVal = MapColID.GetValue("BeginValidityDate")
            strEndVal = MapColID.GetValue("EndValidityDate")
            strIssuingMunicipality = MapColID.GetValue("IssuingMunicipality")
            strName = MapColID.GetValue("Name")
            strFirstName1 = MapColID.GetValue("FirstName1")
            strBirthDate = MapColID.GetValue("BirthDate")
            strBirthPlace = MapColID.GetValue("BirthPlace")
            strGender = MapColID.GetValue("Gender")
            strNationality = MapColID.GetValue("Nationality")
            strNationalNumber = MapColID.GetValue("NationalNumber")

            'Opsplitsen begindatum

            strBegValDag = VB.Right(strBegVal, 2)
            strBegValMaand = Mid(strBegVal, 5, 2)
            strBegValJaar = VB.Left(strBegVal, 4)
            'Opsplitsen einddatum

            strEndValDag = VB.Right(strEndVal, 2)
            strEndValMaand = Mid(strEndVal, 5, 2)
            strEndValJaar = VB.Left(strEndVal, 4)
            txtbxCardNumber.Text = strCardNumber
            txtbxBeginValidityDate.Text = strBegValDag & "/" & strBegValMaand & "/" & strBegValJaar
            txtbxEndValidityDate.Text = strEndValDag & "/" & strEndValMaand & "/" & strEndValJaar
            txtbxIssuingMunicipality.Text = strIssuingMunicipality
            txtbxName.Text = strName
            txtbxFirstName1.Text = strFirstName1
            txtbxBirthDate.Text = strBirthDate
            txtbxBirthPlace.Text = strBirthPlace
            txtbxGender.Text = strGender
            txtbxNationality.Text = strNationality
            txtbxNationalNumber.Text = strNationalNumber

        End If

        RetStatus = EIDlib1.GetAddress(MapColAddress, CertifCheck)

        strStreet = MapColAddress.GetValue("Street")

        strZIPCode = MapColAddress.GetValue("ZIPCode")

        strMunicipality = MapColAddress.GetValue("Municipality")

        txtbxStreet.Text = strStreet
        txtbxZIPCode.Text = strZIPCode
        txtbxMunicipality.Text = strMunicipality
        ' Picture inladen

        FirstPath = "(unknown)_BELPIC_"
        EndPath = "_4035"
        Path = "c:\Documents and settings\gebruiker\eid-cache"
        PictureFileName = FirstPath & strChipNumber & EndPath
        RetStatus = EIDlib1.GetPicture(MapColPicture, CertifCheck)
        Picture1.Image = System.Drawing.Image.FromFile(Path & "\" & PictureFileName)

        RetStatus = EIDlib1.Exit()

    End Sub

Krento is listed on Download4a

Krento

Krento, software, freeware to quickly launch applications of our computer - Macworld

Krento, software, freeware to quickly launch applications of our computer - Macworld


Krento video on YouTube

Free Software Downloads

Free Software Downloads - Over 3000 Softwares Free downloads

Listing Krento on SoftHolm.com

Product page:
http://www.softholm.com/pad/90477.html

Freeware and Shareware

Krento received a 5 stars rating at Freeware Shareware Center

Krento has been granted Trusted Software Certification

Krento

"Your product Krento was fully tested by our editor. It has been granted the Trusted Software Certification. This means your product does not contain spyware, adware, viruses and other malware.
You can see your product and its certification icon on the download page at:
http://www.topshareware.com/Krento-download-74188.htm"

TopShareware Editorial Team

Krento - 5 stars rated on GearDownload.com



Your product, Krento 1.0, has been tested 100% clean and rated 5 stars on GearDownload.com. Your product can be reached from the following URL:
http://www.geardownload.com/system/krento.html

The GearDownload Team

Hotlib.com award for Krento

Rated 5 stars on hotlib.com

Krento 1.0 - Soft-Go.com Award

Krento 1.0, it has been reviewed by the Soft-Go.com testing department and found to be completely clean of spyware components, your application have been approved.

Krento Download - Soft-Go.com

Krento listed and awarded on Kingdownloads.com

Krento 1.0 has been added to kingdownloads.com software archive and rated with '5 Star Award'.

Krento: 5 Star Award at kingdownloads.com !

Kingdownloads.com - Kingdownloads.com is a software archive with more than 90,000 software programs, shareware and freeware, daily updated.

Krento 1.0 - Soft-Files.com Award

Krento has been tested by the Soft-Files.com editors team and found to be completely clean of adware/spyware components.

Krento review page is located at: http://www.soft-files.com/krento_71233.html.

Krento has received 4 stars award from Soft-Files editors team, based on price, usability, documentation & support.

Krento Download - Soft-Files.com

Krento on AB-Downloads

http://www.ab-downloads.com/english/windows/details-13-139-199985-Serhiy-Perevoznyk-Krento.htm

FreeDownload1.com Team awarded Krento



freedownload1.com

ActualDownload awarded Krento with a highest award.

Exellent Software Award from Actual Download

"Looks awesome! Our team have awarded Krento organizer with a highest award."
ActualDownload team

Friday, December 18, 2009

La librairie EIDNative est un SDK pour la carte Identité électronique belge et pour la carte SIS belge

Librairie EIDNative

La librairie EIDNative est un SDK pour la carte Identité électronique belge et pour la carte SIS belge.

L'API de la librairie EIDNative est native pour:

* Microsoft .NET
* Native Win32
* Visual Basic 6.0 and VBA
* Java (seulement pour Windows)

et supporte les langages de programmation suivants:

* touts les langages .NET (C#, Visual Basic .NET, Delphi .NET, etc...)
* Visual C++
* Visual Basic 6.0
* Visual Basic for applications (Microsoft Office)
* Delphi
* Java

Un projet démo est inclus pour chaque langage supporté.

La librairie EIDNative implémente une API pour tout les langages cibles supportés.
Par exemple la version .NET est écrite en C#, la version Delphi est écrite en Delphi et
la version Java est écrite en Java sans utilisé COM ou ActiveX.

La librairie EIDNative est la première solution feeware pour la carte d'identité belge eID et pour la carte SIS 
compatible avec le middleware officiel ("Belgian eID Middleware") mais ne l'exige pas.
Toutes les applications développées utilisant la librairie EIDNative tourneront sans se préocupper de la présence ou non
du middleware officiel de la eID et surtout sans bloqué la carte.

Quand le middleware eID est installé, la librairie EIDNative redirigera toutes les fonctions l'appelant,
fonctionnant comme un proxy entre l'application et le middleware.
Dans le cas où le middleware n'est pas installé, la librairie accédera directement à la carte en haute vitesse.
L'utilisation du middleware peut être spécifié quand la librairie est initialisée.

Rappelez-vous, vous devez toujours distribuer la librairie EIDReader.dll avec toutes vos applications.
Vous pouvez la copier dans le répertoire de votre application ou dans le répertoire système de windows.
Cela dépends du langage cible que vous utilisez.

Caractéristiques:

* Access directe à la carte électronique belge (eID)
* Access directe à la carte SIS belge
* compatibilité avec les middleware officiel de la carte électronique
* link natif, pas de COM ou d'ActiveX nécessaire
* Implémentation Microsoft .NET, Win32 et Java

Télécharger: http://sourceforge.net/projects/eidnative/files/eidnative/EID%20Native%20Library%202.3/EIDLibrarySetup.2.3.0.34.zip/download

Detecting file changes using file watching thread

An application can monitor the contents of a file by using change notifications.

unit  FileWatch;

interface

uses
  Windows, SysUtils, Classes;

type
  TFileWatch = class(TThread)
  private
    FFileName     : string;
    FOnFileChanged: TNotifyEvent;
    FHandle       : THandle;
    FLastTime     : TFileTime;
    FActive       : boolean;
    procedure ReleaseHandle;
    procedure AllocateHandle;
    procedure SetFileName(const Value: String);
  protected
    procedure Execute; override;
    procedure Notify;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Suspend;
    procedure Resume;
    procedure Reset;
  published
    property OnNotify: TNotifyEvent read FOnFileChanged write FOnFileChanged;
    property FileName: String read FFileName write SetFileName;
    property LastTime: TFileTime read FLastTime write FLastTime;
    property Active: boolean read FActive write FActive;
  end;

implementation

resourcestring
  SErrAllocHandle = 'Could not allocate notification object.' + #13#10 + '%d: %s';

function GetFileLastWrite(const FileName: string): TFileTime;
var
  r: TSearchRec;
begin
  if FindFirst(FileName, faAnyFile, r) = 0 then begin
    SysUtils.FindClose(r);
    Result := r.FindData.ftLastWriteTime;
  end else begin
    Result.dwLowDateTime := 0;
    Result.dwHighDateTime := 0;
  end;
end;

function SameFileTime(t1, t2: TFileTime): boolean;
begin
  Result := (t1.dwHighDateTime = t2.dwHighDateTime) and
    (t1.dwLowDateTime = t2.dwLowDateTime);
end;

{ TFileWatch }

constructor TFileWatch.Create;
begin
  inherited Create(false);
  FreeOnTerminate := false;
  FActive := true;
  Priority := tpLowest;
end;

destructor TFileWatch.Destroy;
begin
  ReleaseHandle;
  inherited Destroy;
end;

procedure TFileWatch.Suspend;
begin
  ReleaseHandle;
  FActive := false;
  inherited Suspend;
end;

procedure TFileWatch.Resume;
begin
  AllocateHandle;
  FActive := true;
  FLastTime := GetFileLastWrite(FFileName);   // Get the latest filetime
  inherited Resume;
end;

procedure TFileWatch.Notify;
begin
  if not SameFileTime(FLastTime, GetFileLastWrite(FFileName)) then begin
    if FActive then begin
      ReleaseHandle;
      if Assigned(FOnFileChanged) then FOnFileChanged(Self);
    end;
    FLastTime := GetFileLastWrite(FFileName);   // Get the latest filetime
    if FActive then AllocateHandle;
  end;
end;

procedure TFileWatch.SetFileName(const Value :String);
begin
  if not SameText(Value, FFileName) then begin
    FFileName := Value;
    FLastTime := GetFileLastWrite(Value);
    Reset;
  end;
end;

procedure TFileWatch.Execute;
begin
  while not Terminated do begin
    if FHandle <> 0 then begin
      if WaitForSingleObject(FHandle, 500) = WAIT_OBJECT_0 then
      begin
        Synchronize(Notify);
        FindNextChangeNotification(FHandle);
      end;
    end else
      Sleep(10);   
  end;
end;

procedure TFileWatch.ReleaseHandle;
begin
  FindCloseChangeNotification(FHandle);
  FHandle := 0;
end;

procedure TFileWatch.AllocateHandle;
  function DoAllocate: THandle;
  var
    ie: integer;
    se: string;
    Folder : string;
  begin
    Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FFileName));
    if Folder = '' then
      Folder := GetCurrentDir;

    Result := FindFirstChangeNotification(PChar(Folder), Bool(0),
      FILE_NOTIFY_CHANGE_LAST_WRITE);
    if Result = INVALID_HANDLE_VALUE then
    begin
      ie := GetLastError;
      se := Format(SErrAllocHandle, [ie, SysErrorMessage(ie)]);
      raise Exception.Create(se);
    end;
  end;
begin
  try
    if FileExists(FFileName) then
      FHandle := DoAllocate
    else
      FHandle := 0;        // File doesn't exist anymore
  except
    ReleaseHandle;
    raise;
  end;
end;

procedure TFileWatch.Reset;
begin
  ReleaseHandle;
  if FileExists(FFileName) then begin
    FLastTime := GetFileLastWrite(FFileName);   // Get the latest filetime
    AllocateHandle;
  end;
end;


end.

Monday, December 14, 2009

Free idDebugger Download

Free idDebugger 1 Download | idDebugger 1 Direct Download

Review by FileBEAST's Nameless_1:

idDebugger is an excellent little freeware application designed to simplify the debugging process by allowing for the testing of CGI and ISAPI applications without the need for an internet server. What this essentially means is the usually laborious, time consuming task of debugging applications during the development process is simplified and streamlined significantly. idDebugger is small and simple in design, and instead of offering a wide range of features it chooses rather to focus specifically on improving one very tedious aspect of the development process, and succeeds tremendously. Of course, this has the added advantage of making the application fast and easy to use, and developers are definitely going to appreciate the new ease with which ISAPI and CGI applications can now be debugged. Being both a solid performer and a great time saver, idDebugger is a very attractive freeware utility indeed.

Friday, December 11, 2009

Simple EAN - 13 barcode generator

Here is a very simple EAN - 13 barcode generator written in C#.

using System;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using Karna.Barcode.Properties;
using System.Globalization;

namespace Karna.Barcode
{
    public class Ean13
    {
        private string barcodeId;
        private Image image;

        public Ean13(Image image)
        {
            this.image = image;
        }

        public string BarcodeId
        {
            get { return barcodeId; }
            set
            {
                if (value == null)
                    return;

                if (value.Length != 13)
                {
                    throw new ArgumentException("Wrong data length");
                }

                barcodeId = value;
                string s = null;


                string[,] encTable = new string[3, 10];
                int[,] parityToEnc = new int[10, 8];

                parityToEnc[1, 2] = 0;
                parityToEnc[1, 3] = 0;
                parityToEnc[1, 4] = 1;
                parityToEnc[1, 5] = 0;
                parityToEnc[1, 6] = 1;
                parityToEnc[1, 7] = 1;
                parityToEnc[2, 2] = 0;
                parityToEnc[2, 3] = 0;
                parityToEnc[2, 4] = 1;
                parityToEnc[2, 5] = 1;
                parityToEnc[2, 6] = 0;
                parityToEnc[2, 7] = 1;
                parityToEnc[3, 2] = 0;
                parityToEnc[3, 3] = 0;
                parityToEnc[3, 4] = 1;
                parityToEnc[3, 5] = 1;
                parityToEnc[3, 6] = 1;
                parityToEnc[3, 7] = 0;
                parityToEnc[4, 2] = 0;
                parityToEnc[4, 3] = 1;
                parityToEnc[4, 4] = 0;
                parityToEnc[4, 5] = 0;
                parityToEnc[4, 6] = 1;
                parityToEnc[4, 7] = 1;
                parityToEnc[5, 2] = 0;
                parityToEnc[5, 3] = 1;
                parityToEnc[5, 4] = 1;
                parityToEnc[5, 5] = 0;
                parityToEnc[5, 6] = 0;
                parityToEnc[5, 7] = 1;
                parityToEnc[6, 2] = 0;
                parityToEnc[6, 3] = 1;
                parityToEnc[6, 4] = 1;
                parityToEnc[6, 5] = 1;
                parityToEnc[6, 6] = 0;
                parityToEnc[6, 7] = 0;
                parityToEnc[7, 2] = 0;
                parityToEnc[7, 3] = 1;
                parityToEnc[7, 4] = 0;
                parityToEnc[7, 5] = 1;
                parityToEnc[7, 6] = 0;
                parityToEnc[7, 7] = 1;
                parityToEnc[8, 2] = 0;
                parityToEnc[8, 3] = 1;
                parityToEnc[8, 4] = 0;
                parityToEnc[8, 5] = 1;
                parityToEnc[8, 6] = 1;
                parityToEnc[8, 7] = 0;
                parityToEnc[9, 2] = 0;
                parityToEnc[9, 3] = 1;
                parityToEnc[9, 4] = 1;
                parityToEnc[9, 5] = 0;
                parityToEnc[9, 6] = 1;
                parityToEnc[9, 7] = 0;

                encTable[0, 0] = "0001101";
                encTable[0, 1] = "0011001";
                encTable[0, 2] = "0010011";
                encTable[0, 3] = "0111101";
                encTable[0, 4] = "0100011";
                encTable[0, 5] = "0110001";
                encTable[0, 6] = "0101111";
                encTable[0, 7] = "0111011";
                encTable[0, 8] = "0110111";
                encTable[0, 9] = "0001011";
                encTable[1, 0] = "0100111";
                encTable[1, 1] = "0110011";
                encTable[1, 2] = "0011011";
                encTable[1, 3] = "0100001";
                encTable[1, 4] = "0011101";
                encTable[1, 5] = "0111001";
                encTable[1, 6] = "0000101";
                encTable[1, 7] = "0010001";
                encTable[1, 8] = "0001001";
                encTable[1, 9] = "0010111";
                encTable[2, 0] = "1110010";
                encTable[2, 1] = "1100110";
                encTable[2, 2] = "1101100";
                encTable[2, 3] = "1000010";
                encTable[2, 4] = "1011100";
                encTable[2, 5] = "1001110";
                encTable[2, 6] = "1010000";
                encTable[2, 7] = "1000100";
                encTable[2, 8] = "1001000";
                encTable[2, 9] = "1110100";

                string lastString = "";

                lastString += "101";

                StringBuilder sb = new StringBuilder();

                for (int i = 2; i <= 7; ++i)
                {
                    string firstDigit_s = value[0].ToString();
                    int firstDigit_i = int.Parse(firstDigit_s, CultureInfo.InvariantCulture);

                    string curDigit_s = value[i-1].ToString();
                    int curDigit_i = int.Parse(curDigit_s, CultureInfo.InvariantCulture);
                    sb.Append(encTable[parityToEnc[firstDigit_i, i], curDigit_i]);
                }
                lastString += sb.ToString();

                lastString += "01010";

                StringBuilder sb2 = new StringBuilder();
                for (int i = 8; i <= 13; ++i)
                {
                    string curDigit_s = value[i-1].ToString();
                    int curDigit_i = int.Parse(curDigit_s, CultureInfo.InvariantCulture);
                    sb2.Append(encTable[2, curDigit_i]);
                }

                lastString += sb2.ToString();
                lastString += "101";

                Bitmap bitmap = new Bitmap(210, 146, PixelFormat.Format32bppArgb);
                Graphics canvas = Graphics.FromImage(bitmap);
                canvas.Clear(Color.White);

                for (int i = 1; i <= 190; i = i + 2)
                {
                    if (lastString[i / 2] == '1')
                    {
                        if (i <= 6 || (i >= 90 && i <= 100) || i >= 184)
                        {
                            canvas.DrawLine(Pens.Black, new Point(i + 14, 10), new Point(i + 14, 136));
                            canvas.DrawLine(Pens.Black, new Point(i + 15, 10), new Point(i + 15, 136));
                        }
                        else
                        {
                            canvas.DrawLine(Pens.Black, new Point(i + 14, 10), new Point(i + 14, 123));

                            canvas.DrawLine(Pens.Black, new Point(i + 15, 10), new Point(i + 15, 123));
                        }
                    }
                }

                canvas.SmoothingMode = SmoothingMode.HighQuality;
                canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                canvas.CompositingQuality = CompositingQuality.HighQuality;

                Font font = new Font("Arial", 11);

                canvas.DrawString(value[0].ToString(), font, Brushes.Black, 4, 116);
                s = value[1] + " " + value[2] + " " + value[3] + " " + value[4] + 
                " " + value[5] + " " + value[6];
                canvas.DrawString(s, font, Brushes.Black, 30, 123);
                s = value[7] + " " + value[8] + " " + value[9] + " " + value[10] + 
               " " + value[11] + " " + value[12];
                canvas.DrawString(s, font, Brushes.Black, 121, 123);

                font.Dispose();
                canvas.Dispose();


                if (image != null)
                {
                    Graphics g = Graphics.FromImage(image);
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.DrawImage(bitmap, 0, 0, image.Width, image.Height);
                    g.Dispose();
                }

                bitmap.Dispose();

            }
        }
    }
}

Thursday, December 10, 2009

De afscheidsplechtigheid voor trein P7349 en P8349

Op vrijdag 11 december 2009 zouden we graag met zijn allen afscheid nemen van onze vertrouwde treinen P7349 en P8349.
Deze afscheidsplechtigheid zal plaatsvinden in het station van Leuven tussen 6:45 en 6:57.


Wij nodigen u vriendelijk uit om in Leuven even uit te stappen en u naar de voorkant van de trein te begeven.
Daar zal een rouwkrans overhandigd worden aan de treinbestuurder met de vraag deze vooraan an de trein te bevestigen.
Er zal ook een kopie van onze petities afgegeven worden voor de directie van de NMBS.

Na deze korte plechtigheid, hopelijk in aanwezigheid van de pers die ook uitgenodigd zal worden,
stappen we allen samen terug op om onze laatste rit verder te zetten.

Friday, December 04, 2009

EIDNative update 2.3.0.30

EIDNative Library 2.3.0.30 is released today and available for download at Sourceforge:
http://sourceforge.net/projects/eidnative/files/eidnative/EID%20Native%20Library%202.3/EIDLibrarySetup.2.3.0.30.zip/download

In this version was improved the support of Visual Basic and VBA, added SIS cards support for VBA and added the card detection with SIS and EID cards support. There are 2 functions available now IsEIDCard and IsSISCard. When SIS card is inserted into reader EIDNative switches automatically to SIS cards reading mode.
As the switch between reading modes is not very fast operation, it is not recommended to close the GUI application when SIS card is still inserted into reader. In this case the application window disappears with some delay. You can also avoid it by reading card in the separate thread (Delphi, C++ and C#).

I also added the documentation for Visual Basic and Visual Basic sample of reading SIS card.

Thursday, December 03, 2009

EIDNativeX update



 New version of EIDNativeX ActiveX control for reading Belgian eID and SIS cards is available for download.
EIDNativeX has no external dependencies and works without eID Middleware.




What's new in this release:
  • GetPicture function returns IPictureDisp interface (stdPicture in Visual Basic)
  • IsSISCard function added in addition to IsEIDCard function
  • CardConnected and ConnectToCard procedures support now SIS card also
I would like to thanks 
  • Christophe Van Ongevalle
  • Peter Mondelaers
  • Wouter Devos
  • Ben De Cat
  • René Boesmans
for helping me, providing useful ideas and bug reports. For freeware projects the support of the users means always a lot. Than you guys!


If you have an idea about the new feature, please use User Voice Forum
 

New design of my web site

I updated my website http://users.telenet.be/serhiy.perevoznyk/index.html and added more information about my current running projects. At the same time this blog remains the most actual place where you can find all latest releases for my products.