17. okt 2008

MSSQL : ja limit ?

Mysql sõbrad teavad, et limit käsk aitab neid alati. Limit 0,5 ... esimene offset teine mitu kirjet peale seda. Kuigi Mssqli pean ühte lihtsamaks ning võimsamaks andmebaasiks on seal ka natuke puudusi, just see sama limit. Tahad teha lehekülgi, kus kirjed kuvatud vahemike kaupa, tüüpiline veebinduse teema.

select top 45 * from kliendid top annaks lihtsalt esimesed 45 klienti vastavalt sorteeringule.

Kuidas ikka saada kirjete vahemikud ilma temptabeleid ja muud keemiat kasutamata.


select b.recnr,b.kliendi_id,b.eesnimi,b.perekonnanimi
from
(select top 1000 row_number() over (order by perekonnanimi asc) recnr,kliendi_id,eesnimi,perekonnanimi
from meiekliendid) as b
where b.recnr between 1 and 50

üldiselt over klauslis peate määrama mille järgi on sorteeritud subselect !

That's It!

Räägime ka enda tehtud vigadest...

Enamasti on Eesti programmeerijatel kombeks hirmsasti teisi kritiseerida, kuigi võiks ise oma koodi kriitilise pilguga hinnata !

Mõtlesin, et prooviks midagi uut, räägiks enda poolt tehtud rumalatest vigadest. Ütleme nii, parimad palad leidsin enda poolt tehtud suurimast Eesti teavitussüsteemist :)

Enamus vigu olid kiirustamise põhjused, sest toodet taheti hirmus kiiresti, testperiood minimaalne. Tüüpprobleem Eesti IT arendustes.


1: palake...

services oli globaalne muutuja, var i : integer;

nüüd, kuna tegemist on servisega ning mitmekümne kiuga, siis tore crash toimus.

function Tfastjob.doscanQueue...
begin
i:=jobsinqueue();
while (i<5) do
begin
end;
end;

Kujutage nüüd ette seda olukorda, esiteks see muutuja sünkroniseerimata, väärtustatakse globaalselt. Tulemus; mitu nädalat võib töötada, siis ootamatu crash.

...oleks pidanud olema...

function Tfastjob.doscanQueue...
var
i : integer;
begin
i:=jobsinqueue();
while (i<5) do
begin
end;
end;


Üldse, kui aus olla, on globaalsed muutujad kurjast, võimaluse korral ära kasuta neid ! Või koonda nad kuhugi struktuuri / klassi.

2: palake...

Transaktsioonide mismatch.
Ehk olukord
try
...startTransaction;


....kontrollin asju
if valeaegteavitada then
exit;


...commit tran
except
...rollback tran;
end;


Rollbacki ei tehtud ! Finally sektsioon puudus. Järgmine kord uuesti transaktsiooni avamisel eelmine tõmmati tagasi.

3: palake

Kutsud välja TADOStoredproc aga protseduuris tekib viga, kuid siiski protseduur väljastab dataseti..."viga" kaob kuhugi. Ja kood peale seda läheb programmis siiski täitmisele.


Lahendus, protseduurile anda error parameeter mida kontrollida.


create proc kypsetakoodi(@koodiliik int,@viga varchar(255) output) ...



Kiirustades ei saa ega tohi programmeerida !

16. okt 2008

Jipikajee...uus Lazarus väljas

Lazarus


Mis põhiline !!!

- The LCL now uses Unicode strings UTF-8 encoded on all platforms.
There are docs, tools and functions to help converting old code.

9. okt 2008

Link Delphi 2009 stringide kasutamise kohta

Pole kahjuks saanud Delphi 2009 testida, aga leidsin ühe blogi postituse, kus toimub stringi tüüpide tutvustus.

Delphi 2009 strings explained by example

Ütlen vaid huhh...kui varem oli widestring; string (ansi)...siis nüüd ...

8. okt 2008

YUI Treeview inline editing and dynamic node loading

Sai selline pealkiri pandud ennekõike seetõttu, et emakeeles kõlaks asi päris hirmsalt...

YUI treeview

Üldiselt Yahoo poisid teinud palju Web 2 stiilis komponente. Seekord vaataks Treeviewd.

Tüüpiline laadimise kood (2.6.0 ver):





function overrideSaveValue(v)
{
node=v.node;
//node.data.label = v.inputElement.value;
node.getLabelEl().innerHTML=v.inputElement.value;
alert(node.data);
return true;
}


function idynLoad(node, fnLoadComplete)
{


// lihtne json callback näide, success parameetrid sõltuvad kuidas välja kutsud
var oCallback =
{
success: function(oRequest,oResponse,oPayload)
{

var iNode = new YAHOO.widget.TextNode("test", oPayload.node, false) ;
iNode.data=...mingi json abil saadud elemendi id;
iNode.editable=true; // märgime, et inline editing lubatud
// kavalus laeme nö default handleri üle, et saaksime async stiilis andmebaasi kirjutada andmeid, kui nodet inline stiilsi muudetakse
iNode.saveEditorValue=overrideSaveValue;

// anname teada, et child item laetud !
oPayload.fnLoadComplete();
},

failure: function(oRequest,oResponse,oPayload)
{
oPayload.fnLoadComplete();
},

argument:
{
"node": node,
"fnLoadComplete": fnLoadComplete
},

timeout: 10000
};

// json väljakutse...

...
}

// loome puu...
var tree = new YAHOO.widget.TreeView("container");
var rootnode = tree.getRoot();

tree.setDynamicLoad(idynLoad, "ygtloading ygtvlph ");

// teeme ühe root elemendi...
var myroot = new YAHOO.widget.TextNode('Root node', rootnode, true);
myroot.data=0;
myroot.editable=false;

// võimaldame inline editi !!!!
tree.subscribe('dblClickEvent',tree.onEventEditNode);

// joonistame puu
tree.render();



Nii lihtne see ongi :))))))

5. okt 2008

X-tee, kui veebidisaineri õudusunenägu

Suht harva, kui vaja, pean seda vaheliidest kasutama, aga no liigendus - tule taevas appi ! Siis vahepeal seal tõstetakse menüüpunkte üles / alla (mingi sorteerimise teema, kui uusi linke pannakse). Ei tea, keda peaks paluma, et saaks X-tee disaini normaalseks. Loogiline liigendus 0, tabel-tabel-tabelis disain. Märgistikud paigast ära, mikspärast on mu nimi TAMMEV\304LI. Värvidest ma ei hakka üldse rääkima, sinisel taustal must tekst.

Imelik, et keegi sellel teemal sõna ei võta, sest enamus tuttavaid, kes kasutavad kiruvad samamoodi ?!?

29. sept 2008

Pöidlad pihku, loodan, et EMT 3G sõja ka nö lõpuni viib

Nii, asi selles oli vaja internetti uues elukohas ja valida oli mobiilse interneti ning Kõu vahel. Ehk vanad harjumused, aga otsustasin EMT kasuks, kuigi teadsin, KÕU levib paremini ning kiirem ka...

Kahjuks Audrus Huawei E220 modemiga ühenduses olles sain vaid EDGE kasutada, kuigi Vana-Sauga lähedal 3G mast väidetavalt. HSPA'd ei kusagil. Saatsin kirja ka EMT'i infosse, pigem huvitas proxy teema, et kas EMT ei tahaks teha M-interneti jaoks proxyt rajada. Elioni proxyd ei aktsepteeri EMT ühendust.

Küsisin ka huvipärast, et kas plaanis 3G'd laiendada ka Audru kanti. Öeldi, ärge seda eriti lootke...see pani mind mõtlema, et pean siis peale 2 a kasutuslepingut lõpetama teenuse. Tööd teha 100kb/s kahjuks pole võimalik, lihtsalt serveri SQL andmemahud on suured.


Aga täna meedias nö linke...võimalikust 3G "sõjast", mis jätaks mind EMT interneti kasutajaks. Tasuks kõik suurlinnade lähedased asulad varustada sellega vähemalt 10 km raadiuses. Ajad muutunud, inimesed suurlinnade lähedusse kolinud.

Kurvaks tegi ka see, et olin Kadriorus ja seal sain ka max kiiruseks erinevate testidega vaid 1.2 mb (kusjuures veel HSPA ühendus oli), mul oleks normaalse töö tegemiseks vaja min.2 mb...



Elisa plaanib 3,5G võrku investeerida sadu miljoneid



EMT plaanib järgneva kolme aasta jooksul võrku miljardi investeerida


Siin veel viide ühe kasutaja blogile, kes EMT internetti proovis...

EMT Internet

25. sept 2008

Uhh...kui oled javascripti ära unustanud

Pidevalt pean erinevate programmeerimiskeelte vahel hüplema, nüüd avastasin, et ma ikka väga palju javascriptist ära unustanud. Ega pea polegi prügikast, eks tuletan meelde kiiresti.

2 head lehte, mis tõid nö kohe teadmised tagasi.

Javascript 1

Javascript 2

Aga, mis põhiline HEA redaktor !

Scintilla

Tänaseks levi lõpp, pea pulki täis...

22. sept 2008

Das Hölle: Kuidas YUI 's teha andmede laadimine comboboxi dünaamiliselt JSON abil

YUI siis, mis ta on, ütleme komplekt visuaalseid vahendeid/komponente yahoo javascript failide abil. Täpsemalt lugemiseks soovitan lehte http://developer.yahoo.com/yui/

Nii, minul oli vaja teha dünaamiline andmete laadimine comboboxi. AJAXi inimestele väga tuttav teema, enamasti siis juba ajax vastab õige süntaksiga. JSON vastused natuke teine teema... Küll oli valida, autocomplete, datatablet, buttonit, aga mitte ühtegi korralikku dünaamiliste andmete laadimist.

Et vähendada teiste vaeva (sain pähklist jagu), panen JSON näite siia.


var ds = new YAHOO.util.DataSource("http://myserver.com/users.php?");
ds.responseType = YAHOO.util.DataSource.TYPE_JSON;

ds.responseSchema =
{
resultsList: "ResultSet.Result",
fields: [{key:"ID",parser:YAHOO.util.DataSource.parseNumber},"NAME"]
};


var oCallback = {
success: function(oRequest,oResponse,oPayload)
{

if (!oResponse.error)
{
var jsonresp=oResponse.results;
var dobject=document.getElementById("asyncdata");
if (typeof(dobject)!="undefined")
{

while (dobject.firstChild)
{
dobject.removeChild(dobject.firstChild);
}


for (var i=0;i<jsonresp.length; i++)
{
var newOpt = document.createElement("option");
var txt = document.createTextNode(jsonresp[i].NAME);
newOpt.setAttribute("value",jsonresp[i].ID);
newOpt.appendChild(txt);
dobject.appendChild(newOpt);
// alert(jsonresp[i].NAME+" "+jsonresp[i].ID);
}
}
}
},
failure: function(oRequest,oResponse,oPayload)
{
alert("Error "+oResponse.responseText);
},
argument: ""
}

ds.sendRequest("action=showusers", oCallback);

10. sept 2008

13. aug 2008

.NET/C# klasside omapärad selgeks

Nii pean tunnistama, et viimati kasutasin .NET 2006. Tegin väikese koolituse endale, kogu klasside omapära ja muude trikkide meeldetuletamine võttis vaevalt pool päeva :))

Kui Delphi ja osaliselt ka Java põhi all, ei ole .NET'is midagi keerukat.

Siin ka link mu ühest vanast dokumendist, mida kasutasin õppimisel

Klassid

Nüüd lähiajal tuletan veel meelde mõned SOA trikid ja kiunduse, siis võib öelda, et enamus "eluks vajalik" meelde tuletatud.

11. aug 2008

Vista turvaämber, mis mindki üllatas

See, et Microsoft ja maailm .NET hulluses sain ennemgi aru, aga et selliseid vigu tehakse masendav.

Windows Vista turvalisus murti maha?

...
.NET laeb näiteks .DLL faile internetilehitsejasse ja sellepeale eeldab Microsoft, et tegemist on turvaliste objektidega, kuna need on .NET objektid. Microsoft ei tulnud selle peale, et neid võiks kasutada astmetena teiste rünnakute ülesehitamiseks, sõnas Dai Zovi.
...


Ka mõtlemisainet (nõuab natuke süsteemsete asjade tundmist):

Bypassing PatchGuard 3

4. aug 2008

Mõned abistavad winapid, kui unicode VCL kirjutate

IsTextUnicode
GetGlyphIndices
GetFontUnicodeRanges
GetTextCharsetInfo
TranslateCharsetInfo
GetStringTypeEx
GetCharWidth32
GetTextCharset
IsDBCSLeadByte
IsDBCSLeadByteEx
MultiByteToWideChar
WideCharToMultiByte
BytesToUnicode

28. juuli 2008

Tiburon - Delphi uus tulek ?

Siit blogidest saab infot natuke veelgi

Üldiselt lugedes uutest asjadest, ennekõik lõppude lõpuks suudeti VCL viia Unicode peale. Jessus 8 aastat vist, TNTControls oli ammune abimees inimestel, kes tegid Unicode appse. Andmebaasi osale saadi ka Unicode toetus.
Delphi generic süntaks tegi ka rõõmu ! siin


Üks koht natuke tekitas külmajudinaid...String muutuja on vaikimisi nüüd UnicodeString, ehk endine WideString. Mõtlen enda koodikogumitele jah veelkord korra võpatan. Ehk siis, String muutuja = AnsiString, mis sai Pchar tüübis, see vist PAnsiChar. WideString vist säilis. 3 party komponendid teevad muret, seal palju transleeritud Winapisid.

Stringide juures tulevad muudatused

Kogu tõe saab vast teada alles toote müügile ilmumise hetkest.

Üldiselt võib näha Delphi tagasituleku märke, saaks IDE ka stabiilseks. Parim IDE üldse, Visual Studio oli minu meelest copy ja paste Delphi IDE'st. Loodan, et see .NET osa ka kas tehti eraldi tooteks või anti võimalus see välja rookida. Sorry...Net tore asi - aga missioonkriitilisi rakendusi ma seal ei tee.

Kui saadakse selle valuliku unicode üleminekuga ühele poole, siis ootan veel Commodoret...ehk win64 kompilaator.


Järgmine siht peaks Codegeari meestel olema PDA.

Igatahes soovin Codegeari meestele jõudu ja jäksu konkurentsis püsimisel, ma ka üritan ikka Delphi lippu kõrgel hoida.

Millist xml/xsl parserit kasutada Delphi's ja Freepascalis ?

Tüüp vastus oleks Windowsi programmeerijatelt MSXML, tõesti tore ja lihtsasti kasutatav vahend, aga ajad muutunud. Mida tähendab ajad muutunud: ennekõike seda, et kõik ei keerle enam Windowsi ümber nagu paljud arvavad, Linux teinud kõva hüppe ja 2 kodusel arvutil Ubuntu peal.

Mul oli vaja universaalset parserit, mis töötaks Delphi all ning ka Freepascali all.
Mis mul valida oli?

Open XML

Isenesest täitsa tore ja toimiv parser, SAX osa oli puudulik. Ainus viga, et XSL osa puudub. Kuna oli vajadus ka XSL süntaktsit kasutada.

Nii, vaatasin apache.org poole.

Xerces-C++ lib (xml töötluse jaoks)
Xalan-C++ lib (xsl töötluse jaoks)

Miks need ei sobinud, esiteks, mul tunne, et seal arenduses on pidurit tõmmatud; teiseks prototüüpide tõlkimine Freepascali alla oleks natuke liialt palju aega ära võtnud.

Siis tuli meelde Libxml parser. Elu nigu lill peale seda, olemas olid juba tõlgitud prototüübid Freepascali ja Delphi jaoks.
Nüüd ainus vaev on XSL süntaksite muutmine, kuna seal kasutatud MSXML spetsiifikat, enda vitsad peksavad nö.

Üks kasulik XSL abivahend ka

xsldbg

15. juuni 2008

Uh...mis saab paremat olla, kui Delphi 7 panna toetama Apache 2.0. / Apache 2.2. moodulite formaati

Kui ma oma esimese ISAPI mooduli kirjutasin 1999, olin juba siis vaimustuses selle kiiruses. Moodulis, mis ikka mälus ja sisuliselt masinkoodis...no pole võrreldavat tehnoloogiat veebinduses (kiiruses).

Kahjuks IISiga ei saa enam arvestada, MS on ikka MS.

Vaatasin Apache poole, seal avastamisrõõmu jagub, on küll ISAPI emulaator moodul, mod_isapi...aga ei tahaks ... logisevaid lahendusi toota. Igasugu emuleerimised jura.

Nii suunasin oma pilgu Apache shared module poole, aga oh häda
{Delphi 2005 and Delphi 2006 are no longer able to generate new Apache 1.x or Apache 2.x web server applications}

No selle elame üle, Delphi 7 üks stabiilsemaid. Kuid 2.0. ja 2.2. pole enam toetatud. Natuke googlet ja apache source vaatamist sain asjad tööle :))))

Enamus kavalat Delphi koodi saab taaskasutada, no mida veel tahta.

14. juuni 2008

Vista võib olla ikka paras arendaja õudusunenägu

Astusin sama reha otsa, millele ka see arendaja
ifileoperation-replaces-shfileoperation

Milleks kuramuse pärast peab olemasolevaid asju rikkuma...st MS poolt. Vähe sellest, et Vista emuleerib registrisse kirjutamist, kui reaalselt seda ei toimugi. Teeb mingi system dir sulle programmi kataloogi. Üldse seal niipalju igasugu jamasid, et sure ära.

29. mai 2008

Kas töötada väike- või suurfirmas (IT valdkond)

Üldiselt, nüüd kus 14 aastat programmeerimise valdkonnas olnud, hakkan tugevaid järeldusi tegema. Enamus ajast väikefirmades olnud <=6 inimest, küsimus miks, väikefirmades rohkem vabadust ja ma täiega naudin seda. Vabadus, ehk suudan ise tehnilisi lahendusi pakkuda, mida kasutada, kuidas, parim vahend teostuseks.

Keerukad lahendused nagu pidevat huvi pakkunud, suurfirmades neid eriti ei pakuta. Ütleme nii, et siis kulub osa aega projektijuhile seletamiseks, mis see on ja kuidas see on...kogetud...

Kui antakse valida, kas winapidega/com/driverite trikke teha või tavalist aruannet koostada, siis esimene kohe minu valik.

Aga nüüd pean ka väikefirmade headuse juures minema ka pahupoolele. Igasugused üritused suht harv nähtus, samuti vastutad peaaegu üksinda igasuguste keeruliste süsteemide eest, telefonis pidev support. Nö jooksed ribadeks, seletada muuta konfida...rohkem käsi lihtsalt pole selle jaoks ja mis põhiline kõik pidevalt "põleb" ajaliselt...

IT väikefirmad ei saa samuti riigihangetel osaleda, hankeseadused tehtud SUURTE jaoks, isegi kui sul firmas parimad pead ja arenduse hind palju mõõdukam, ei saa osaleda. Rikas riik, raha laristamine ei anna häbeneda, samuti konkurentsi peab kartma...

Siit tulebki olukord, kuna riigihankeid pole, siis pead leidma suurkliente, kas Eestis või välismaal, nüüd, kus mõned kliendid ära kukuvad, siis peale progemise, disaini, analüüsi muretse veel sellepärast, kas sul homme tööd on.


Kui AUSALT ütlen, enam väikefirmasse tööle ei läheks, huvitav küll, aga see närvikulu liialt suur, ei tasu ära seda jama.


Suured IT firmad võiksid rohkem väärtustada kaugtööd, kuna ise avastasin, et nö vabalt töötadese efektiivsus isegi 40% suurem. Istud metsas ja sisuliselt proged M - Interneti teel, elu nagu lill, töö sujub. Nii, et IT firmad võiksid suhtumist muuta, töötaja ei pea pidevalt kontoris passima, ta pole efektiivne. Skype erand, seal kaugtöö ka täitsa IN.


Vot nii lood...siin Maarjamaal

23. mai 2008

Eesti Loto on tase

Uus tase, see, et veebilehega varem olid ainult probleemid ja muud jurad...


Eesti Loto eksimus sundis võitjaid enammakstud raha tagastama

..."lugupeetud lotovõitja, kandsime natuke palju rulli üle"..kategooriast.

MSSQL : kui üldse kursoreid kasutad, siis kasuta kiireid

Ütleme nii, et kui vähegi võimalik, võiks kursoritest hoiduda. Reaalsuses pole see võimalik. Siin üks näide kursorist, mis serveris suht kiire.


set nocount on

create table #test1(a varchar(25))
insert into #test1(a)
values('esimene')
insert into #test1(a)
values('viimane')

declare @pintcurs cursor,
@amuutuja varchar(25)


set @pintcurs=cursor fast_forward for
select a
from #test1

open @pintcurs
fetch from @pintcurs
into @amuutuja

while (@@fetch_status=0)
begin
select @amuutuja

fetch from @pintcurs
into @amuutuja
end

close @pintcurs
deallocate @pintcurs