Foonsearch

[quote]Unicode (waarvan UTF-8 een representatie is)

Moet ik dat zo interpreteren dat als veld lastname = “dijkstra” is 8 * 3= 24 bytes in Unicode. [/quote]

Nee, in Unicode zijn alle karakters 2 bytes groot. In UTF-8 (een representatie van Unicode) is dat tussen de 1 en 4 bytes. Als je tekens gebruikt die normale letters of cijfers zijn dan zijn ze altijd 1 byte groot. Wanneer je tekens gebruikt met diacritische tekens oid dan kan het oplopen tot 4 bytes.

Hoi RGJ,

Ik heb de database GUI programma SQLyog gerenamed naar “Voipe”. Wat ik er mooi van SQLyog vind is dat het CPU gebruik beperkt wordt tot 50% van de totale CPU capaciteit.

Ik heb een project “postcode” aangemaakt om postcodepro te importeren. Alle bronnen en sources hierin stoppen. Mijn doel is om een DLL te maken waarin de specifieke postcode routines zitten.

Vanuit Voipe.exe ga je straks de (business) applicatie “postcode” installeren, door met nullsoft Installersource het postcode project te installeren bij de eindgebruiker, door uit te pakken en DLL bekend te maken binnen het Voipe-framework.

Als je initieel “postcode” database wilt installeren dan laadt Voipe.exe de postcode-dll in en roept routines aan om de database en de tabellen te creëren en initieel te vullen. M.i. blijft het totaal dan onder 50% van de CPU capaciteit. Ik heb vandaag de postcode-dumper in een aparte programma gestart en hierna ging het CPU gebruik wel naar 100%. Je wilt hebben dat de PC niet door 1 applicatie te zwaar belast gaat worden dat hij niet meer bestuurbaar is door de eindgebruiker.

Hierna ga ik 06zoeken (06vinden) met een 06subscriber tabel op een gelijksoortige manier bouwen, alleen haalt deze DLL de initiële gegevens uit Foondump2005 database.

De hartelijke groet Jan Marco

P.S. Ik maak een onderscheid tussen Infrastructuur database(s) en Business databases. De Infrastructuur database wordt door de demon op de peer gebruikt om te kunnen communiceren met andere peers. De business database zijn databases die met andere peers wordt gesynchroniseerd. Denk hierbij een beetje aan het Wiki concept. Iedereen kan info aanpassen, bijvoorbeeld straks de “postcode” database. Mogelijk is wel een verschil met Wiki dat alle business databases die op een pc geïnstalleerd zijn ook de database bevatten. Het is namelijk een decentrale concept. Indien iemand zijn pc uitzet waarop ook de database “postcode” staat blijft deze database nog te benaderen op het netwerk indien er andere peers zijn die deze database ook nog hebben.

Je kan straks ook wel database maken en die met alleen je vrienden onderling te laten synchroniseren. Niet vrienden kunnen hem dan niet zien. Wordt het een soort intern telefoonboekje van een bedrijf.

RGJ,

Ik denk aan de volgende databases om database synchronisatie te testen:

06zoeken: online 06 nummers, laagste resolutie is postcodes + huisnummer, plaats en straat opzoeken in postcode database.
postcode: postcodes van nederland
fsdb: meta gegevens van MySQL
tempdb: database nodig voor database synchronisatie.

De hartelijke groet Jan Marco

Hoi RGJ,

Ben al zo ver dat ik automatisch een record aan kan maken die twee tabellen uitzoekt om onderling te synchroniseren. Je pakt de tabellen met meeste aantal records en ‘dezelfde’ record structuur.

In een voorbeeld van mij fsDb=‘tempdb’, fsTb=‘town5’, fsDbReturn=‘tempdb’, fsTbReturn=‘town2’ en fsState=0.

In de volgende toestand (fsState=1) bepaal je de relevante hash van alle 2454 records van town5. Volgende toestand bepaal je de hashes niet wel in town5 zitten echter niet in town2 en tevens krijg je de records die wel in town2 zitten echter niet in town5. Deze records zet je in SQL formaat in fsSqlReturn. In een volgende toestand ga je deze records inserten in town5. Bij het inserten ga je de SQL records parsen. Eerst checken of ze er al in zitten voordat je gaat inserten.

De hartelijke groet Jan Marco

Appendix A:Voorbeeld record structuur.

[quote]
create table fsTbSinc (
ts timestamp,
id bigint(16) unsigned not null,
importance bigint(15) not null default 0,#The current rating of this content.
priority bigint(15) not null default 0,#How important is this content for the end-user
peerId varchar(255) not null default’’,
fsDb varchar(255) not null default’’,
fsTb varchar(255) not null default’’,
peerIdReturn varchar(255) not null default’’,
fsDbReturn varchar(255) not null default’’,
fsTbReturn varchar(255) not null default’’,
hashSincFields varchar(255) not null default’’,
fsState bigint(15) not null default 0,
hashAllCount bigint(15) not null default 0,
hashAll blob not null default’’,
hashAllMissingCount bigint(15) not null default 0,
hashAllMissing blob not null default’’,
hashAllCountReturn bigint(15) not null default 0,
hashAllReturn blob not null default’’,
hashAllMissingCountReturn bigint(15) not null default 0,
hashAllMissingReturn blob not null default’’,
fsSqlCount bigint(15) not null default 0,
fsSql blob not null default’’,
fsSqlCountReturn bigint(15) not null default 0,
fsSqlReturn blob not null default’’,
owner varchar(255) not null default’’,
status varchar(255) not null default’’,
action varchar(255) not null default’’,
index (peerId(16)),
index (fsDb(16)),
index (fsTb(16)),
index (peerIdReturn(16)),
index (fsDbReturn(16)),
index (fsTbReturn(16)),
index (hashSincFields(16)),
index (fsState),
index (hashAllCount),
index (hashAll(16)),
index (hashAllMissingCount),
index (hashAllMissing(16)),
index (hashAllCountReturn),
index (hashAllReturn(16)),
index (hashAllMissingCountReturn),
index (hashAllMissingReturn(16)),
index (fsSqlCount),
index (fsSql(16)),
index (fsSqlCountReturn),
index (fsSqlReturn(16)),
index (owner(16)),
index (status(16)),
index (action(16)),
index (ts),
primary key (id)
) type=myisam; [/quote]

Hoi RGJ,

Ik heb nu vmware 64 bit draaien op Centos 5.0. Fedora 6.0 lukte mij niet. Niet alle harddisken zag hij en kreeg een zombie proces. De laatste fedora versie start vmare niet op en crasht gehele Linux systeem. Vooralsnog draait Centos erg goed. Je moet niet ‘virtualisatie’ aanklikken bij installatie van Centos en dan volgens http://www.howtoforge.com/vmware_server_centos5.0 het gaan installeren.

Gisteren begonnen om foonsearchd.cpp weer opnieuw op te bouwen met de echte thread code van http://sources.redhat.com/pthreads-win32/ Ik zag dat de fout die ik vroeger zag nu ook onderkend is.Setjmp werkt niet in cpp versie. Je moet de goede compiler parameters meegeven en dan werkt het.

In Foonsearchd.exe (demon) heb ik nu de synchronisatie source gedaan. Ik ga nu scherp naar de code kijken en goed reviewen om daarna weer meer functionaliteit in gaan bouwen.

Vandaag ga ik een project ‘town’ maken waarin ik de tows van Nederland ga doen. Wel 5 maak dezelfde tabel om synchronisatie te testen. In het project town ook de installer source van Nullsoft ( http://nsis.sourceforge.net ) en de updater ( http://www.codeproject.com/tools/updater.asp ) source van Geert van Horrik gaan onderbrengen. Een applicatie start je net als windows installer op en na wat vragen gaat hij in database zetten of je de applicatie data gaat sharen met anderen.

Ik denk dus nu aan drie onderdelen. Demon (=foonsearchd.exe), applicatie programma (=town.exe) en GUI/databasebrowser (= voipe.exe).

De hartelijke groet Jan Marco

Hoi RGJ,

Momenteel ben ik bezig om drie projecten proberen te integreren, namelijk
A) http://www.codeproject.com/system/soviet_protector.asp,
B) http://www.codeproject.com/system/RunUser.asp en
C) C++ Calendar Alarm Class with Repeat Capability - CodeProject

Ad A) Met het eerste project kan je de opgestarte programma’s van je pc afvangen. De code in apart programma gedaan, echter ik krijg nadat ik het weer opstart een fout (1072) “The specified service has been marked for deletion.”. Deze fout is weg als ik hem nog een keer opstart.

De code lijkt erg op service programmeren. Zie ook http://msdn2.microsoft.com/en-us/library/bb540476.aspx Daarom ga ik deze code in een afzonderlijk programma (protector) doen en het gaan hangen in een kopie van mijn serviceprogramma code. Het protector programma gaat kijken of hij de hash al heeft van het opgestarte programma, zo niet, dan hash berekenen. Hij gaat ook een insert doen in een opgestarte programma tabel.

Ad B) RunUser is erg mooie source code. Je kan programma’s onder andere users opstarten. Grijpt best wel diep in OS in. Alleen heb ik het probleem dat het niet op al mijn pc’s goed werkt. Ben aan het uitzoeken waar het aan ligt.

Ad C) De calarmclock code ga ik “voeden” vanuit MySQL programma’s om aanroepen te plegen op vooraf gedefinieerde tijdstippen. Het gaat de RunUser code aansturen. Denk hierbij aan het periodiek aansturen van tabel synchronisatie (“cron”) jobs. Of het periodiek aanroepen van een job die “Mijn postbank” transacties gaat ophalen.

De hartelijke groet Jan Marco

Hoi RGJ,

[quote]Alleen heb ik het probleem dat het niet op al mijn pc’s goed werkt. Ben aan het uitzoeken waar het aan ligt.
[/quote]
Ik kwam er achter dat het account waaruit je opstart en het account waarmee je het programma opstart tenminste de volgende rechten moeten hebben:

SeTcb
SeChangeNotify
SeIncreaseQuota
SeAssignPrimaryToken

In een programmatje geeft ik nu bovenstaande rechten aan een account. N.B. De rechten worden pas actief als je opnieuw met het account hebt aangelogd.

[quote]
Daarom ga ik deze code in een afzonderlijk programma (protector) doen en het gaan hangen in een kopie van mijn serviceprogramma code.[/quote]
Gaat niet zo makkelijk als ik had verwacht. Het installeren en removen en starten van kernel device driver “werkt wel”. Echter bij het stoppen van mijn template service programma crasht de pc. Ik denk momenteel aan om het via een andere route te proberen, namelijk “hooking” d.m.v. injectie van een hook-DLL. Als hooking voorbeeld de DLL structuur van UltraVNC gebruiken. Zie ook http://www.uvnc.com/

De hartelijke groet Jan Marco

Hoi RGJ,

Gisteren begonnen met het (her)ontwerpen van de infrastructuur databases voor de demon foonsearchd.exe:

  1. application
  2. download
  3. fsdb
  4. logdb
  5. peer
  6. queue
  7. scheduler
  8. security
  9. systemdb
  10. tempdb

Als eerste ga ik met, de ‘motor’ van de demon, de ‘scheduler’ database aan het werk. Ik ga 4 tabellen gebruiken, namelijk ‘cron’, ‘master’, ‘ArcCron’ en ‘ArcMaster’. Het verschil tussen ‘cron’ en ‘master’ is dat in de master tabel de records staan die in de tijd herhaald worden. In ‘cron’ de records zetten die een beperkte tijdhorizon hebben. Denk aan 15 minuten. Als je een herhalingsrecord in ‘cron’ zet dan zal de demon hem in ‘master’gaan zetten en de record ‘verwijderen’ uit cron door hem in ‘ArcCron’ te kopiëren.

In veld “Type” kan je kiezen om een executable of een interne procedure in veld “exe” uit te voeren. Denk bij aan interne procedure “wget” of “syncDatabase”. In veld “RunTime” komt hoeveel seconden het heeft geduurd. Het veld “RunTimVar” zet je de parameters die belangrijk zijn voor “RunTime”. Bijvoorbeeld het aantal bytes van de “file” en download/upload snelheid van de verbinding bij “wget”. Je kan dan met factoranalyse de RunTime tijdsduur in de toekomst bepalen als je nog een keer zo’n routine gaat aanroepen. De interne routines ook hashcodes gaan geven. Je kan dan gemakkelijk zien of een verbeterde databasesynchronisatie procedure echt sneller werkt.

Mijn huidige denkrichting: Met SQLyog insert je een record in master/cron. De demon kijkt (d.m.v. timer) elke 10 seconden of er een nieuwe record in master/cron zit. Zo, ja dan vult hij de gegevens aan. Hij zet bijvoorbeeld timestamp (“tsetBegin”) om met UNIX_TIMESTAMP(‘2005-03-27 03:00:00’) in 1111885200 (“tsetBeginSec”).

Hierna controleren of er een “tsetBeginSec” is die binnen 15 minuten uitgevoerd moet worden. Zo ja, dan een workerthread aanmaken die op gewenste tijdstip afgaat.

De andere threads (packets binnenhalen, verwerking van de udp packets) ook vanuit de scheduler (automatisch) gaan starten bij het opstarten van de demon. Je kan ze dan ook handmatige gaan uitzetten met de GUI (SQLyog).

De hartelijke groet Jan Marco

Appendix MySQL cron definitie:

[quote]create table cron ( #02 - deze tabel gaan synchoniseren met andere remote peers.
ts timestamp,
id bigint(16) unsigned not null,
importance bigint(15) not null default 0,#The current rating of this content.
priority bigint(15) not null default 0,#How important is this content for the end-user
peerId varchar(255) not null default’’,
peerIdExecute varchar(255) not null default’’,
ticket varchar(255) not null default’’,
type varchar(255) not null default’’,#native, batch, direct, startup, service
tsetBegin timestamp,
tsetEnd timestamp,
tsetBeginSec bigint(15) not null default 0,
tsetEndSec bigint(15) not null default 0,
exe varchar(255) not null default’’,
hashExe varchar(255) not null default’’,
cmdLine varchar(255) not null default’’,
domainName varchar(255) not null default’’,# "WORKGROUP"
userName varchar(255) not null default’’,# test01
password varchar(255) not null default’’,# test01
desktop varchar(255) not null default’WinSta0\Default’,# WinSta0\Default
createTokenDirectly bigint(10) not null default 0,# 0
tSession bigint(10) not null default -1,# -1
loadProfile bigint(10) not null default 0,# 0
copyTokenPropFromCaller bigint(10) not null default 0,# 0
keepPriv bigint(10) not null default 1,# 1
logonType bigint(10) not null default 2,# 2
logonProvider bigint(10) not null default 0,# 0
repeatSeconds bigint(10) not null default 0,
repeatCount bigint(10) not null default 0,
repeatDayOfWeek bigint(10) not null default 0,
threadId varchar(255) not null default’’,
runTime bigint(10) not null default 0,
runTimeVar varchar(255) not null default’’,
resultcode bigint(10) not null default 0,
hashSincFields varchar(255) not null default’’,
fsSinc varchar(255) not null default’’,
hash varchar(255) not null default’’,
hashUpdate varchar(255) not null default’’,
updateEntry timestamp,
beginEntry timestamp,
endEntry timestamp,
owner varchar(255) not null default’’,
recordCheck bigint(10) not null default 0,
status varchar(255) not null default’’,
action varchar(255) not null default’’,
index (importance),
index (priority),
index (peerId(16)),
index (peerIdExecute(16)),
index (ticket(16)),
index (type(16)),
index (tsetBegin),
index (tsetEnd),
index (exe(16)),
index (hashExe(16)),
index (cmdLine(16)),
index (domainName(16)),
index (userName(16)),
index (password(16)),
index (desktop(16)),
index (createTokenDirectly),
index (tSession),
index (loadProfile),
index (copyTokenPropFromCaller),
index (keepPriv),
index (logonType),
index (logonProvider),
index (repeatSeconds),
index (repeatCount),
index (repeatDayOfWeek),
index (threadId),
index (runTime),
index (runTimeVar(16)),
index (resultcode),
index (hashSincFields(16)),
index (fsSinc(16)),
index (hash(16)),
index (hashUpdate(16)),
index (updateEntry),
index (owner(16)),
index (recordCheck),
index (ts),
primary key (id)
) type=myisam;[/quote]

Hoi RGJ,

Ik ben stevig met het (worker)thread concept bezig. Conceptueel werkt het zo. Je hebt 1 of meerdere workerthreads. Indien ze allen klaar zijn ga je alle opstaande zaken van de demon afbouwen en het demonprogramma stopt dan. Met control-C kan je de worker threads ook laten stoppen. Ik heb het ontvangen van udp packetjes ook in een workerthread staan. Echter deze workerthread stopt pas als hij een nieuw pakketje ontvangt. Om zeker van zijn dat het stopt stuur je 1 byte naar de local host op port dat je ‘luistert’.

Gaande weg kom ik er steeds meer achter dat http://sources.redhat.com/pthreads-win32/ eigenlijk een ‘threadpoolprogramma’ is. Als je afsluit houdt hij bij welke threads nog niet zijn afgesloten. Ik wil graag dat de (worker)threads niet allemaal dezelfde prioriteit hebben. Het ontvangen van udp pakketjes en de cron scheduler mogen wel normale prioriteit hebben, echter synchronisatie worker thead mag wel op een lage prioriteit gaan draaien. Uit Further Threads Programming:Thread Attributes (POSIX) haal ik dat je alleen bij het maken van de workertheads de prioriteit aan kan geven.

[quote]int pthread_attr_setinheritsched(pthread_attr_t *tattr, int inherit);
An inherit value of PTHREAD_INHERIT_SCHED (the default) means that the scheduling policies defined in the creating thread are to be used, and any scheduling attributes defined in the pthread_create() call are to be ignored. If PTHREAD_EXPLICIT_SCHED is used, the attributes from the pthread_create() call are to be used. [/quote]
Als je PTHREAD_EXPLICIT_SCHED optie meegeeft pakt hij de prioriteit waarde van “tattr” anders pakt hij default interne prioriteit waarde.
Moet nog testen hoe het werkt. Mogelijk werkt onderstaande beter:

[quote]
/* set the priority; others are unchanged */
newprio = 30;
param.sched_priority = newprio;

/* set the new scheduling param */
ret = pthread_attr_setschedparam (&tattr, &param);[/quote]

Ik zie ook wel het commando [quote]SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); [/quote]
Alleen dan ga je wel buiten pthreads-win32 zelf wat prutsen. Nog niet uitgezocht of dat kwaad kan.

Ik probeer nu het binnen halen van udp pakketjes in relatie tot de scheduler uit te werken.

De hartelijke groet Jan Marco

Hoi RGJ,

Als ik mijn computer reboot krijg ik een “MySQL server has gone away”. Dit komt doordat de demon service eerder opstart dan de Mysql service. Je kan dit wel met “dependency” variabele in de serviceprogrammering gaan regelen. Ik ga het oplossen door een reconnect van de databaseconnection uit te voeren als je deze fout ziet. Je gaat afhankelijk van de foutmelding (in de ‘fouttak’) dus acties uitvoeren.

Ik ga ook de pthreads in SQLyog inbouwen. Je krijgt dan ‘leven’ in de huidige statische GUI. Nu moet ik vaak op refresh drukken om de nieuwe records te zien. M.i. kan dit ook automatisch worden gemaakt —)

Als site effect ben ik bezig om zaken te "bouwen, die wel in Enterprise versie zitten en niet in de Community versie van SQLyog. Zie ook http://www.webyog.com/en/sqlyog_feature_matrix.php

De hartelijke groet Jan Marco

Hoi RGJ,

Ben nu bezig om een dynamisch menu structuur te maken in SQLyog. Ik heb OnContextMenu() veranderd, zie ook Appendix A.
Elke tabel kan straks een ander popup menu krijgen. Dit is afhankelijk van de eigenschappen van een tabel. In een tussentabel opnemen wat je op een tabel mag doen.

Een andere punt is dat je de acties die je uit het popupmenu (rechtermuis aanklikken) kiest, door een workerthread wordt uitgevoerd. Bijvoorbeeld als je “Insert New Row” aanklikt dan AddNewRow(); in een workerthread laten aanroepen. Het hoofdprogramma blijft dan gewoon doordraaien en stopt niet als je een ‘kunstje’ laat uitvoeren. De code van http://sources.redhat.com/pthreads-win32/ ga ik hiervoor gebruiken.

De hartelijke groet Jan Marco

Appendix A:

[quote]void DataViewTable::OnContextMenu(void *param, LPARAM lParam)
{
HMENU hmenu;
POINT pnt;
wyInt32 row, col, selrow, selcol;
pnt.x = (LONG)GET_X_LPARAM(lParam);
pnt.y = (LONG)GET_Y_LPARAM(lParam);
LPMENUINFO menuinfo = new MENUINFO;
int nRet = 0;
CustomGrid_ApplyChanges(m_hwndgrid, wyTrue);
CustomGrid_GetItemFromPoint(m_hwndgrid, &pnt, &row, &col);

if (row == -1 || col == -1)
{
return;
}
selrow = CustomGrid_GetCurSelRow(m_hwndgrid);
selcol = CustomGrid_GetCurSelCol(m_hwndgrid);

// now if they are different then we try to select the row and because that perticular
// cell will be set to null later on
if (selrow != row)
{
if (!TableGVWndProc(m_hwndgrid, GVN_BEGINCHANGEROW, selrow, selcol))
{
return;
}
else
{
CustomGrid_SetCurSelRow(m_hwndgrid, row, wyFalse);
CustomGrid_SetCurSelCol(m_hwndgrid, col);
}
}
else
{
CustomGrid_SetCurSelCol(m_hwndgrid, col, wyFalse);
InvalidateRect(m_hwndgrid, NULL, FALSE);
UpdateWindow(m_hwndgrid);
}

VERIFY(hmenu = CreatePopupMenu());

InitValuesForExport();
AppendMenu(hmenu ,MF_STRING,1,L"Insert New Row");//ID_RESULT_INSERT
AppendMenu(hmenu ,MF_STRING,2,L"Delete Row");//ID_RESULT_DELETE
AppendMenu(hmenu ,MF_STRING,3,L"Save Changes");//ID_RESULT_SAVE
AppendMenu(hmenu ,MF_STRING,4,L"Cancel Updation");//ID_RESULT_CANCEL
AppendMenu(hmenu ,MF_STRING,5,L"Set to Empty String");//IDC_SETEMPTY
AppendMenu(hmenu ,MF_STRING,6,L"Set to NULL");//IDC_SETNULL
AppendMenu(hmenu ,MF_STRING,7,L"Set to Default");//IDC_SETDEF
AppendMenu(hmenu ,MF_STRING,8,L"Filter");
AppendMenu(hmenu ,MF_STRING,9,L"Export Table data/result as CSV, SQL, Excel, etc… Control+Shift+E");//IDM_IMEX_EXPORTDATA
AppendMenu(hmenu ,MF_STRING,10,L"Copy Cell Data to Clipboard");//IDM_IMEX_EXPORTCELL
AppendMenu(hmenu ,MF_STRING,11,L"Copy All Rows to Clipboard");//IDM_DATATOCLIPBOARD
AppendMenu(hmenu ,MF_STRING,12,L"Copy Selected Row(s) to Clipboard");//IDM_SELDATATOCLIPBOARD
VERIFY(ClientToScreen(m_hwndgrid, &pnt));
nRet =TrackPopupMenu(hmenu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, pnt.x, pnt.y, 0, m_hwnd, NULL);

switch (nRet)
{
case 1: //Insert New Row - ID_RESULT_INSERT
AddNewRow();
break;
case 2: //Delete Row - ID_RESULT_DELETE
DeleteRows();
break;
case 3: //Save Changes - ID_RESULT_SAVE
ApplyChanges();
break;
case 4: //Cancel Updation - ID_RESULT_CANCEL
CancelChanges();
break;
case 5: //Set to Empty String - IDC_SETEMPTY
SetValue(NULL, “”);
break;
case 6: //Set to NULL - IDC_SETNULL
SetValue(NULL, NULL);
break;
case 7: //Set to Default - IDC_SETDEF
SetValue(NULL, “(DEFAULT)”);
break;
case 8: //Filter
break;
case 9: //Export Table data/result as CSV, SQL, Excel, etc… Control+Shift+E - IDM_IMEX_EXPORTDATA - IDM_IMEX_EXPORTDATA:
ExportData();
break;
case 10: //Copy Cell Data to Clipboard - IDM_IMEX_EXPORTCELL
m_ptr->m_isedit = wyTrue;
CopyCellDataToClipBoard(m_datares, m_ptr);
break;
case 11: //Copy All Rows to Clipboard - IDM_DATATOCLIPBOARD
m_ptr->m_isedit = wyTrue;
AddDataToClipBoard(m_datares, m_ptr);
break;
case 12: //Copy Selected Row(s) to Clipboard - IDM_SELDATATOCLIPBOARD
m_ptr->m_isedit = wyTrue;
AddSelDataToClipBoard(m_datares, m_ptr);
break;
default:
break;
}

VERIFY(DestroyMenu(hmenu));
delete menuinfo;
return;
}[/quote]

Hoi RGJ,

Ik wilde pthreads-win32 inbouwen in WinMain.cpp van SQLyog. Kreeg fouten die lijken op dat de volgorde van de include files niet goed is. Momenteel denk ik aan om de code van WinMain.cpp in een kopie van mijn foonsearchd code te gaan hangen. Hierna de rest er in gaan porten. Ik laat de code dan een beetje gelijk optrekken. De demon krijgt een scheduler en de GUI dan ook, etc.

De hartelijke groet Jan Marco

Hoi RGJ,

Ik heb nu één source code voor de demon en het GUI programma. Afhankelijk van een compiler switch pakt hij de juiste begin procedure, namelijk main() of WinMain(). De udp packets binnenhalen en timer workerthread heb ik in beide programma’s draaien. Demon en GUI draaien al naast elkaar. Wel is niet alle code van “SQLyog” actief. Omdat ik de code aan het poorten ben, heb ik alleen het hoofdwindow aan de praat gemaakt. Mijn intentie was om niet SQLyog te gaan veranderen, echter toch maar gedaan, want kreeg de volgorde van include files niet goed. Momenteel zit er m.i. nog een include file probleem in, namelijk defines met L"string" worden niet goed vervangen.

Ik gebruik ook geen class file constructie. In mijn beeld heb je een GUI-hoofdprogramma die de routines aanroept. Indien het meer dan x tijdseenheden kost dan een workerthread gaan aanroepen. Het hoofdprogramma blijft dan aldoor doorlopen.

Ik wil ook van de ini file code af. Ik ga de instellingen in MySQL opslaan.

Eerst heb ik de 55000 regels van foonsearchd in seperate files gedaan, waarbij gelijksoortige routines in dezelfde file heb gedaan. Wel in hoofdprogramma het gaan includen. Ik hield ongeveer 6000 regels hoofdprogramma over. Ik heb nu weer 10000 regels SQLyog er in gekopieerd. Als ik het goed werkend heb dan ga ik het SQLyog gedeelte weer in een aparte include file doen.

Wat ik wel vreemd vond is dat je meer warnings en foutmelding bij windows gui compileren kreeg dan bij de demon compilatie. Ik heb wel de warning level op dezelfde niveau (4) staan.

Ik ga nu meer SQLyog code proberen aan te koppelen en de scheduler proberen te programmeren. In beide programma’s start je één (scheduler) workerthread in het hoofdprogramma op die de andere workerthreads gaat opstarten, denk hierbij aan de udp packets binnenhaal thread.

De hartelijke groet Jan Marco

P.S. M.i. is de menustructuur van SQLyog voldoende voor het GUI programma. Ik ga wel dynamische popupschermen extra er in programmeren.

Hoi RGJ,

Afgelopen weekend met eventlogging bezig geweest. Ik heb naar http://www.codeproject.com/system/sysevent.asp gekeken. Het is mij gelukt om de vier windows logs te kunnen lezen. Ik ga de thread poorten in mijn workerthread concept. Per eventlog heb je straks vier mogelijkheden om hem uit te lezen. N.B. Wel of niet een one-shot thread en wel of niet alle event records lezen vanaf het begin. In de scheduler tabellen ga je aangeven welke optie je kiest.

Eigenlijk ga je de invent logs in mysql zetten en dan kan je in SQLyog blijven om het systeem te besturen. Je kan dan ook programma’s maken die de logs gaan analyseren door op mysql niveau “in te prikken”.

Een ander project ( http://www.codeproject.com/system/sysmangr.asp ) lijkt ook veel op sysevent.asp.

Naast bovenstaande ook bezig geweest met het ‘slopen’ van todolist ( http://www.codeproject.com/tools/todolist2.asp ). Ik gooi zo veel mogelijk weg om alleen het dynamische resource file/controls over te houden.

De hartelijke groet Jan Marco

Hoi RGJ,

Afgelopen weekend ook met ‘hooking’ bezig geweest. Ik heb de code van http://www.codeproject.com/system/APIHookingPart3.asp in ‘fshook.dll’ gedaan. De orginele hook dll ging via een window met het hoofdprogramma communiceren. Dit heb ik er al uit gehaald. Ik wil hooking gebruiken om te zien welke programma opgestart wordt.

Ben momenteel aan het bestuderen hoe hooking werkt. Zie ook http://www.codeproject.com/system/api_spying_hack.asp Ik zie dat ze net als bij APIHookingPart3 een ander programma opstarten. Je kan dus programma´s hook-en, waarvan je geen source code hebt. Probeer het zo te maken dat het in mijn demonprogramma gaat werken.

De hartelijke groet Jan Marco

P.S. In http://www.codeproject.com/system/soviet_protector.asp hebben ze uitgelegd welke routine je moet hook-en om te zien welk programma wordt opgestart.

Hoi RGJ,

Ik heb ook een nsi bestand gemaakt. Je kan de demon, gui en source met deze techniek gaan distribueren. Zie ook appendix voor de details. Ik ga de nullsoft compiler inbouwen in de demon en dan kan je automatisch nieuwe versies aanmaken. Verandert de source code dan kan je een automatisch een nieuwe installer gaan maken. De executabel van de installer ga ik in een blob veld van een applicatie tabel doen. Via database synchronisatie kan je dan een nieuwe versie gaan verspreiden. De eindgebruiker kan dan op deze blobveld gaan klikken en dan wordt de installer (=resultaat van de installer compiler van nullsoft) opgestart. Indien een eindgebruiker een applicatie al heeft geinstalleerd dan zou het ook mogelijk moeten zijn om een nieuwe versie automatisch te installeren/updaten. Moet nog uitwerken hoe dat het beste gebouwd kan worden.

Het probleem waar ik tegen aanliep is dat de exec commando´s in het nsi script niet volgtijdig worden uitgevoerd. Ik heb het opgelost door een lange wachtlus er tussen te zetten. Kan natuurlijk wel oplossen door 1 exec commando te maken met nieuwe parameter die twee kunstjes doet, namelijk “installeren en opstarten” en “stoppen en verwijderen” van de demon. Installer heeft veel raakvlakken met de nog te ontwikkelen scheduler.

De hartelijke groet Jan Marco

Appendix NSI voorbeeld bestand:

[quote]Name “Voipe”

; The file to write
OutFile “Voipe.exe”

InstallDir “$PROGRAMFILES\Voipe”

InstallDirRegKey HKLM “SOFTWARE\Voipe” “”

DirText “Choose a directory for Voipe:”

ShowInstDetails show
ShowUnInstDetails show

Section ""
StrCpy $9 0
SetOutPath $INSTDIR\src
File voipe2\voipe.cpp

SetOutPath $INSTDIR\bin
File voipe2\fshook\debug\fshook.dll
File voipe2\foonsearchd\debug\foonsearchd.exe
File voipe2\dll\Keywords.db
File voipe2\dll\SciLexer.dll
File voipe2\dll\libeay32.dll
File voipe2\dll\ssleay32.dll
File voipe2\voipe\debug\voipe.exe

WriteRegStr HKLM “SOFTWARE\Voipe” “” "$INSTDIR"
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\Voipe” “DisplayName” “Voipe (remove only)“
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\Voipe” “UninstallString” '”$INSTDIR\UnInstVoipe.exe”'
WriteUninstaller “$INSTDIR\UnInstVoipe.exe”

IfFileExists “$SMPROGRAMS\Voipe.lnk” nosc
MessageBox MB_YESNO|MB_ICONQUESTION “Add Start Menu shortcut for Voipe?”
IDNO nosc
CreateShortCut “$SMPROGRAMS\Voipe.lnk” "$INSTDIR\Voipe.exe"
nosc:

Exec '"$INSTDIR\bin\foonsearchd.exe" -install’
Sleep 10000
Exec '"$INSTDIR\bin\foonsearchd.exe" -start’
Sleep 10000
StrCmp $9 1 noprompttorun
MessageBox MB_YESNO|MB_ICONQUESTION “Run Voipe now?” IDNO norun
noprompttorun:
Exec '"$INSTDIR\bin\Voipe.exe"'
norun:

SectionEnd

UninstallText “This will uninstall Voipe. Hit next to continue.”

; special uninstall section.
Section “Uninstall”
; remove registry keys
Exec '"$INSTDIR\bin\foonsearchd.exe" -stop’
Sleep 10000
Exec '"$INSTDIR\bin\foonsearchd.exe" -remove’
Sleep 10000
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Voipe"
DeleteRegKey HKLM SOFTWARE\Voipe
DeleteRegValue HKLM “Software\Microsoft\Windows\CurrentVersion\Run” Voipe
Delete $INSTDIR\bin\fshook.dll
Delete $INSTDIR\bin\foonsearchd.exe
Delete $INSTDIR\bin\Keywords.db
Delete $INSTDIR\bin\SciLexer.dll
Delete $INSTDIR\bin\libeay32.dll
Delete $INSTDIR\bin\ssleay32.dll
Delete $INSTDIR\bin\voipe.exe
Delete $INSTDIR\UnInstVoipe.exe
; remove shortcuts, if any.
Delete "$SMPROGRAMS\Voipe.lnk"
Delete $INSTDIR\src*.*
Delete $INSTDIR\bin*.*
Delete $INSTDIR*.*
RMDir "$INSTDIR\src"
RMDir "$INSTDIR\bin"
RMDir "$INSTDIR"
SectionEnd

; eof[/quote]

Hoi RGJ,

Ik heb een “hook dll” in de Gui en Demon gehangen. Dezelfde code wordt gebruikt om de drie programma’s (Gui, Demon en Hookdll) te compileren.

Hooking werkt door een dll te laden in het Gui- en Demonprogramma. Deze dll zet vooraf bepaalde routines van de onderliggende dll’s van een programma (windowsproces) om naar eigen routines. Het lijkt een beetje op http://www.codeproject.com/system/HookSys/Figure_1.jpg
Vooralsnog ga ik alleen mijn eigen programma’s hooken. Ik ga alles naar mysql schrijven, dat is in het plaatje mijn shared memory. Kan dus met een ander programma gaan testen of alles goed werkt. Denk hierbij aan als je iets opent dat je ook weer iets sluit, etc.

Gisteren ook de source van de installer van nullsoft in 1 file gezet. Het is 30000 regels code. Ik ben nu bezig om het om te zetten naar Unicode.

Hierna wil van de volgende afhankelijkheden afkomen:
#include
#include
#include
#include
#include
#include
#include

using namespace std;
using std::runtime_error;

RGJ, Ik denk dat ik nu voldoende code heb om “06vinden/06zoeken” af te maken,

De hartelijke groet Jan Marco

P.S. Om andere programma’s te hooken, gaat men een remote thread onder deze programma zettten. Deze remote thread gaat de “hook dll” laden, welke de routines gaat omzetten naar eigen routines. N.B. Als je te weten komt dat een nieuw programma is opgestart zou je automatisch de remote thread er onder kunnen laten zetten.

Hoi RGJ,

Ik heb de afhankelijkheden uit de nullsoft installer gehaald. Ben nu bezig om de code weer werkend te krijgen zonder deze afhankelijkheden. Hierna probeer ik van de 52 classes af te komen. Je krijgt dan een betere scheiding tussen structuur, variabelen en routines. De eerste twee doe ik in het hoofdprogramma. De laatste in een aparte file.

De installer code lijkt m.i. erg op ‘scheduler code’, dus als de installer code werkt ga ik het in de scheduler code hangen.

De hartelijke groet Jan Marco

Hoi RGJ,

Vorige weekend geprobeerd van de afhankelijkheden van de installer af te komen. Echter het werkte niet meer. Ik heb te weinig kennis hoe het werkt, dus weer teruggegaan naar een vorig installer versie. De code zit nu in het (demon en gui) programma. De executable wordt 0,5 mb groter. Ik ga nu eerst de functionaliteit in de installer aankoppelen. Denk hierbij aan om de nsi bestand uit mysql te halen en executable naar een blob veld kopiëren. Als ik het beter begrijp hoe het werkt kan ik de afhankelijkheden gaan wegwerken.

Afgelopen weekend naar k-meleon http://kmeleon.sourceforge.net/ . gekeken. Na wat info van deze site te lezen was het mij wel gelukt om het te compileren met vs2005, echter werkte niet. Het zou wel werken met vs (7.1 versie), dus dat ga ik nog proberen. Wel ben ik in een seperate project begonnen om k-meleon te gaan compileren. Ik heb nog 60 externe varabelen die de linker niet kan vinden. Ik ga hiervoor de source uit de mozilla distributie halen.

Mijn doel is om vanuit de GUI Sqlyog te gaan werken. Seperate heb ik standalone GUI applicaties (docking, todolist, k-meleon, alternative MFC, etc) die ik test en probeer te gaan integreren in de doel GUI. Voorals nog ga ik geen mfc gui maken, maar gewoon windows routines. Net zoals de huidige SQLyog versie.

De hartelijke groet Jan Marco

Hoi RGJ,

Ik heb k-meleon ( http://kmeleon.sourceforge.net/ ) gecomplieerd door ‘alle’ code uit de mozilla sourceball te halen.

Het werkt echter niet meer. Dingen heb ik versimpeld (strings class uitgezet) en hoofdprogramma moet nog wel beter aangekoppeld worden.

Mozilla gebruikt veel dll’s. Je moet dus de schermpjes van de seperate dll’s (resource file) naar het hoofdprogramma kopieren.

Je hebt op hoofdlijn een ‘view-class’ en een ‘frame-class’. Ik probeer deze in een andere voorbeeld mfc programma aan te koppelen. Denk hierbij aan ‘controlgrid’.

Ben ook op zoek naar de WinMain’s in de mozilla (firefox) sourceball. Als ik naar http://osdir.com/ml/mozilla.devel.embedding/2003-08/msg00034.html kijk dan moet ik naar nsAppRunner.cpp en regxpcom.cpp gaan kijken.

Ik ga gewoon nieuwe visual studio projecten maken en dan een hoofdprogramma (nsAppRunner.cpp of regxpcom.cpp, etc) meecompileren naast alle andere source files. Mogelijk loop ik vast als ik gtk gebruiken. Ik zou dan voor kunnen kiezen om gtk afhankelijke dlls van firefox te gaan gebruiken.

RGJ, Ik zie wel dat mozilla zelfde type routines gebruikt als ik al heb verzameld. Denk hierbij wel aan integratie.

De vriendelijke groet Jan Marco