Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
en jij gaat de code beoordelen zeker?
Doet iets met Cloud (MS/IBM)
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
Ik hoop toch dat schoonheid ook in andere terreinen dan whitespace nog te vinden is
[ Voor 62% gewijzigd door mbravenboer op 08-04-2003 13:48 ]
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #define _ F-->00 || F-OO--; long F=00,OO=00; main(){F_OO();printf("%1.3f\n", 4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_ } |
Ben benieuwd
[ Voor 11% gewijzigd door Rataplan op 08-04-2003 13:45 ]
Journalism is printing what someone else does not want printed; everything else is public relations.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| #ifdef s z r( ){z k=0,l =0,n,x XQueryPointer(i ,XRootWindow (i,j),&m, &m,&o,&p,&n,&n,( ghj)&n),(o >=s(g)||s(o )<=0)&&(k=1), (p>=h||p<=0)&& (l=1),(e==1)&&( c=o,d=p,e=0,1)||( (k==0&&o-c-(z)(a+y (a)*.5)!=0)&&(a=o-c ),(l^-1==-1&&p-d-(z)( b+y(b)*.5)!=0)&&(b=p-d),a/=f,b/=f ,k=0,l=0);(o >=s(g)||o<=0)&&(a=-a),( p>=h||s(p)<=0) &&(b=-b),c=o,d=p,I(XWarpP ,ointer)(i,None,None,0,0,s (g),h,(z)(a+y(a)*.5),(int)( b+y(b)*.5 JJ(float B;int)C,D; #else/*Egads! something has */ #include<X11/Xlib.h>/*taken a*/ #include<stdio.h>/*huge bite o-*/ #include<stdlib.h>/*ut of the m-*/ #include<time.h>/*ouse pointer!!!*/ #define H(a, b) (((a)&(7<<3*(b)))>>3*(b)) #define G(c,d) ((H(c,d)<<3*(d+1))|((H(c,d+1)<<3*d)|/* _XSetPointer(display, screen,GREASY|BOUNCY)*/c&~(63<<3*(d)))) #define s(e) (G(G(G(G(G(G(e,(z)0),1),2),1),0),1)) typedef int z;float a=0,b=0,c,d,f=1.03;z e =s(512),g,h,j; Display/**/*i; #define y(X)((X>0)-(X<0)) #define x o,p; Window m; #define ghj unsigned int* #define I(aa,bb)aa##bb #define JJ(X)\ ));return 0;}X z r();int main (z X,char**Y){ clock_t q=0;(X ==2)&&(f=atof(Y[1])),((i =XOpenDisplay(0) )==0)&&(exit(1 ),1),j=I(Defa, ultScreen)(i), g=s(I(Display, Width)(i,j)-1) ,h=I(DisplayH, eight)(i,j)-1; for(;;((I(clo, ck)()-q)*100>( CLOCKS_PER_SEC ))&&(r(),q=clock()));} #include __FILE__ #endif |
Journalism is printing what someone else does not want printed; everything else is public relations.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| template <class OBJ> void sort(Item<OBJ> * start, Item<OBJ> * end) { Item<OBJ> * i = start; Item<OBJ> * j = end; OBJ temp; while (i != j) { while (i != j && i->CurrItem <= end->CurrItem) { i = i->NextItem; } while (i != j && j->CurrItem >= end->CurrItem) { j = j->PrevItem; } temp = j->CurrItem; j->CurrItem = i->CurrItem; i->CurrItem = temp; } temp = end->CurrItem; end->CurrItem = j->CurrItem; j->CurrItem = temp; if (start != i && start->NextItem != i) sort(start, i->PrevItem); if (end != j && end->PrevItem != j) sort(j->NextItem, end); } |
Sorry voor het gebrek aan commentaar

[ Voor 13% gewijzigd door riezebosch op 08-04-2003 22:21 . Reden: arrrg, sorteert moet natuurlijk met een T ]
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| CREATE PROCEDURE dbo.GetJaartotals @jaar INT AS SELECT *, Tot_aantal_kaart_orders + Tot_aantal_kaart_blanco as Totaal_aantal_kaarten , Tot_aantal_order_orders + Tot_aantal_order_blanco as Totaal_aantal_orders FROM (SELECT (SELECT COUNT(*) from dbo.TblOrders WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) as Tot_aantal_kaart_orders, (SELECT COUNT(*) from dbo.TblBlancoCards WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) as Tot_aantal_kaart_blanco, (SELECT COUNT(DISTINCT(UID)) from dbo.TblOrders WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) as Tot_aantal_order_orders, (SELECT COUNT(DISTINCT(UID)) from dbo.TblBlancoCards WHERE (Status='1' OR status='2') AND YEAR(Bezorgdatum) = @jaar) as Tot_aantal_order_blanco, (SELECT ROUND(SUM(PostZegels),0) FROM (SELECT UID, Bezorgdatum, COUNT(*) as Aantal_Kaarten, PostZegels FROM (SELECT Bezorgdatum, CONVERT(float, PostZegels) as PostZegels, UID FROM TblBlancoCards WHERE (Status = '2' OR Status = '1') AND YEAR(Bezorgdatum) = @jaar) DERIVEDTBL GROUP BY UID, Bezorgdatum, PostZegels)SubTotalsMaand) As Tot_aantal_zegels, (SELECT COUNT(*) FROM (SELECT UID, Bezorgdatum FROM (SELECT Bezorgdatum, UID FROM tblOrders WHERE (Status = '2' or Status = '1') AND YEAR(Bezorgdatum) = @jaar)DERIVEDTBL GROUP BY UID, Bezorgdatum HAVING COUNT(*)=1) DERIVEDTBL) as SWP, (SELECT COUNT(*) FROM (SELECT UID, Bezorgdatum FROM (SELECT Bezorgdatum, UID FROM tblOrders WHERE (Status='2' OR Status='1') AND YEAR(Bezorgdatum) = @jaar) DERIVEDTBL GROUP BY UID, Bezorgdatum HAVING COUNT(*)>1)DERIVEDTBL) as Bibit) DERIVEDTBL |
Dit is van mij. En ja, ik ben er behoorlijk trots op!
Het gaat hier uiteraard om een Sproc, die 2 compleet verschillende Tabellen koppelt en in 1 result waardes teruggeeft.
Dit heeft me 3 dagen gekost, en dit kwam voornamelijk omdat ik het niet voor elkaar kreeg om @'s door te geven.
Verder is de indent een beetje rot, maar anders bleef er helemaal niks van de layout over!
Nogmaals, er zullen mensen zijn die dit een slecht voorbeeld vinden, maar zelf ben ik er trots op! Gezien het feit ik meestal alleen maar aan een simpele SELECT, INSERT of UPDATE genoeg had!
[ Voor 5% gewijzigd door TeeDee op 08-04-2003 13:56 . Reden: code=asp toegevoegd ]
Heart..pumps blood.Has nothing to do with emotion! Bored
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
| int a[4] ={1,2,4,2}, //het goede antwoord b[4] ={2,1,1,3}, //antwoord van de gebruiker e[2] = {0,0}; //e[0] = juisteplek, e[1] = juiste getal for (int i = 0; i < 4; i++){ e[0] += a[i] == b[i]; for (int j = 0; j < 4; j++) e[1]+= (i != j) && (a[i] == b[j]) && !(a[j]=0); } |
Ik heb m'n IRC bot als volgt geschreven:
- de bot zelf zit in een DLL.
- om de bot aan te sturen heb ik een Windows programma geschreven waarin je de bot mee kunt laten inloggen, waarmee je kunt zien wat er allemaal op het kanaal verschijnt, etc....
Om in m'n windows-app te laten zien wat er allemaal op het kanaal verschijnt (een soort log dus), maak ik gebruik van het observer pattern.
Zie hier een code-snippet. (De irrelevante code is eruit geknipt).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| class AbstractIrcBot { protected string _message; protected ArrayList _observers; protected string PutMessage { set { _message = value; this.NotifyObservers(); } } private void NotifyObservers() { foreach( IBotObserver bo in _observers ) { bo.Update(); } } } |
In m'n windows programma heb ik dan volgende code:
1
2
3
4
5
6
| string nickname = txtNick.Text; string descr = txtDescr.Text; bot = new MyBot( nickname, descr); bot.ChannelName = txtChannel.Text; bot.AddObserver(new WindowsLogObserver(bot, txtLog)); bot.Connect(txtServer.Text, Convert.ToInt32(txtPort.Text)); |
De WindowsLogObserver ziet er ongeveer als volgt uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class WindowsLogObserver : IBotObserver { private RichTextBox _txtLogScreen; private AbstractIRCBot _subject; public WindowsLogObserver( AbstractIRCBot subject, RichTextBox viewer) { _txtLogScreen = viewer; _subject = subject; } public void Update() { _txtLogScreen.AppendText(_subject.Message + "\r\n"); } } |
https://fgheysels.github.io/
In m'n eigen applicaties heb ik al heel vaak een procedure geschreven die ini-bestandjes kan lezen en schrijven. Na verloop van tijd werd ik er zat van, en dat resulteerde in een functie die een form bekijkt, en alle editboxen, listboxen, checkboxen, etc. netjes in een ini-bestandje zet. Als je een nieuwe instelling op het preferences-scherm maakt, dan komt dat automatisch ook in het .ini-bestandje.
De code geef ik niet. Die is niet origineel, iedereen kan 't bedenken en het is ook niet eens mooi. De schoonheid zit 'm in de zeer bruikbare aard.
Onderstaand stukje code is eerlijk gezegd ook niet mooi. Het is ook niet geavanceerd. Ik heb een eigen muziek-speel programma gemaakt, en de 'volgende' track wordt gekozen uit een lijst met kandidaten. De best passende wordt vervolgens daadwerkelijk gespeeld. De procedure die de best-passende track selecteerd vind je hieronder:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| function TSongSelector.CalcScore(Q:TQuery):integer; var i:integer; Ratio:double; Verschil:integer; TempScore:integer; Resultaat:Extended; begin // Er is een record met laatstetrack(s). // Hiermee kan vergeleken worden met het record in Q // -> punten toekennen op basis van instellingen. Resultaat:=0; for i:=1 to CompareWith.Value do begin TempScore:=0; if (Q.Fields[3].AsInteger>0) and (LastList[i].GenreID>0) then begin //score voor genre Verschil:=Abs(Q.Fields[3].AsInteger-LastList[i].GenreID); if Verschil=0 then inc(TempScore,GenreScore[4].Value) else if Verschil<256 then inc(TempScore,GenreScore[3].Value) else if Verschil<65536 then inc(TempScore,GenreScore[2].Value) else if Verschil<16777216 then inc(TempScore,GenreScore[1].Value); end; Resultaat:=Resultaat+LastList[i].Weight*TempScore; TempScore:=0; if Q.Fields[1].AsInteger=LastList[i].AlbumID then inc(TempScore,AlbumEqual.Value); if Q.Fields[2].AsInteger=LastList[i].BandID then inc(TempScore,BandEqual.Value); Resultaat:=Resultaat+TempScore; end; if Q.Fields[4].AsInteger+Q.Fields[5].AsInteger=0 then begin //ratio van -1..1 Ratio:=0; end else begin Ratio:=(2*Q.Fields[4].AsInteger/(Q.Fields[4].AsInteger+Q.Fields[5].AsInteger))-1; end; Resultaat:=Resultaat+Ratio*RatioScore.Value+ //Ratio Q.Fields[4].AsInteger*PlaysScore.Value; //Playcount Result:=Round(Resultaat); end; |
Bij nader inzien denk ik niet dat er iemand is die iets snapt van deze code
Ik denk niet dat iemand de genialiteit van dit in zal zien ;-)
[ Voor 12% gewijzigd door Varienaja op 08-04-2003 14:46 ]
Siditamentis astuentis pactum.
Dit vind ik dus minder elegant, een boolean bij een numerical optellen.
1
| e[0] += (a[i]==b[i])?1:0; |
Dit snap ik nietC:
1 !(a[j]=0);
Journalism is printing what someone else does not want printed; everything else is public relations.
Je kunt het beste een interface gebruiken voor die IRCBot, en daar een convenience abstract implementatie van maken die andere classes kunnen hergebruiken. Hierdoor zit je niet vast aan een implementatie (vrijheid) en toch re-use (gemak).
Wat bv het nut van een interface is in jouw geval, is dat je een soortement van controlerende condoom om jouw irc-bot kan plaatsen om bv allerlei loggings/controles uit te voeren (proxy design pattern).
[ Voor 4% gewijzigd door Alarmnummer op 08-04-2003 14:38 ]
Verwijderd
Het ging ook om zo min mogelijk regelsRataplan schreef op 08 April 2003 @ 14:36:
[...]
Dit vind ik dus minder elegant, een boolean bij een numerical optellen.
C:doet hetzelfde, is formeel juister. "Kort" is niet altijd hetzelfde als fraai... Doe het zelf trouwens ook fout, hoor
1 e[0] += (a[i]==b[i])?1:0;
Nope, niet als een eerdere voorwaarde false is, dan wordt de rest niet geevalueerd[...]
Dit snap ik nietMoet er niet == staan? En waarom moet er een (beperkte, ook nog) rangecheck op het goeie antwoord? Volgens mij evalueert wat er nu staat altijd naar true...
Mijn timmermansoog zegt dat je niet netjes bent ingeprongen en je commentaar klopt niet.Scarecrow schreef op 08 April 2003 @ 14:41:
![]()
PHP:
1 echo "GoT"; // Geeft de tekst 'Got' als output
Nou wat is daar aan mis
Siditamentis astuentis pactum.
Maar wat doet dat stuk daar nouVerwijderd schreef op 08 april 2003 @ 14:43:
Nope, niet als een eerdere voorwaarde false is, dan wordt de rest niet geevalueerd
%@*!& ik ziet 'm

[ Voor 9% gewijzigd door Dido op 08-04-2003 14:47 ]
1
2
3
4
5
6
7
8
| showTime :: Integer -> String showTime t = stringImplode ", " . map fromJust . filter isJust . zipWith f ["day","hour","minute","second","millisecond","microsecond","nanosecond","picosecond"] . reverse . g t $ [1,10^3,10^6,10^9,10^12,60 * 10^12,3600 * 10^12,24 * 3600 * 10^12] where f _ 0 = Nothing f s 1 = Just $ "1 " ++ s f s n = Just $ show n ++ ' ' : s ++ "s" g t (a:b:r) = mod t b `div` a : g t (b:r) g t [c] = [t `div` c] g _ [] = [] |
geeft een tijdsduur in picoseconden 'mooi' weer: "1 day, 6 hours, 27 seconds, 427 nanoseconds"
(zou het nog korter kunnen?)
Pas de replâtrage, la structure est pourrie.
Verwijderd
Zorgen dat er niet dubbel getelt wordt, als de elementen hetzelfde waren zetten we waarde op 0 zodat deze niet meer vergeleken kan worden...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| procedure TekenBoom(var F:AJVF;B:integer;C:TCanvas;X,Y,N,O,Up:integer); var Tree:BoomT; begin if B<>0 then begin Seek(F.F,B); Tree:=RdBoom(F); if Tree.Kleiner<>0 then begin C.MoveTo(O,Y); C.LineTo(O-(X div 4),Y+N+10); TekenBoom(F,Tree.Kleiner,C,X div 2,Y+N+10,N+1,O-(X div 4),B); end; if Tree.Groter<>0 then begin C.MoveTo(O,Y); C.LineTo(O+(X div 4),Y+N+10); TekenBoom(F,Tree.Groter,C,X div 2,Y+N+10,N+1,O+(X div 4),B) end; end; end; |
Resultaat (3 bomen door elkaar heen in dit geval):

[ Voor 9% gewijzigd door Varienaja op 08-04-2003 14:55 ]
Siditamentis astuentis pactum.
Ik zag gewoon het nut niet in van een interface in dat geval. (Mijn observer implementeert dan weer wel een interface, en erft niet over van een abstracte class).Alarmnummer schreef op 08 April 2003 @ 14:37:
*ziet die rare belg weer met zijn abstract classes*
Je kunt het beste een interface gebruiken voor die IRCBot, en daar een convenience abstract implementatie van maken die andere classes kunnen hergebruiken. Hierdoor zit je niet vast aan een implementatie (vrijheid) en toch re-use (gemak).
Wat bv het nut van een interface is in jouw geval, is dat je een soortement van controlerende condoom om jouw irc-bot kan plaatsen om bv allerlei loggings/controles uit te voeren (proxy design pattern).
M'n abstracte class bevat heel wat 'sealed' methods, er zitten ook data-members in, dus nog eens een interface schrijven die dan geimplementeerd wordt door m'n abstracte class vind ik gewoon overkill.
Je mag zo niet geilen op interfaces Alarmnummer.
https://fgheysels.github.io/
Varienaja schreef op 08 April 2003 @ 14:43:
[...]
Mijn timmermansoog zegt dat je niet netjes bent ingeprongen en je commentaar klopt niet.
Verwijderd
Mijn pogingen in .NET. Niet veel code, maar ik neem aan dat dat niet uit maakt?
[ Voor 6% gewijzigd door Verwijderd op 08-04-2003 16:37 ]
Geen single quotes gebruikt.Scarecrow schreef op 08 April 2003 @ 14:41:
![]()
PHP:
1 echo "GoT"; // Geeft de tekst 'GoT' als output
Nou wat is daar aan mis
Programmer - an organism that turns coffee into software.
Doet iets met Cloud (MS/IBM)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| function build_table($cols, $rows) { /* Deze functie bouwt aan de hand van de opgegeven arrays een tabel op $cols = 2 dimensionaal array met namen en breedte van de kolommen $cols[0]['name'] = <naam kolom 1> $cols[0]['width'] = <breedte kolom 1> $cols[0]['colspan'] = eventueel aantal kolommen om te mergen $cols[0]['align'] = eventueel uitlijning default = left $rows = 3 dimensionaal array (rij,kolom) met rij informatie $rows[0][0]['data'] = Data rij 1 kolom 1 $rows[0][0]['width'] = Breedte rij 1 kolom 1 $rows[0][0]['colspan'] = eventueel aantal kolommen om te mergen voor rij 1 kolom 1 $rows[0][0]['align'] = eventueel uitlijning default = left */ if ( (!is_array($cols)) && (!is_array($rows)) ) { return(''); } // Maak table heads aan $temp = "<table border='0' cellpadding='5' cellspacing='1'><tr>"; for ($i = 0; $i < count($cols); $i++) { if ( (isset($cols[$i]['name'])) && (isset($cols[$i]['width'])) ) { // Check alignment en colspan if (!isset($cols[$i]['colspan'])) { // Default colspan = 0 $cols[$i]['colspan'] = 0; } if (!isset($cols[$i]['align'])) { // Default align = left $cols[$i]['align'] = 'left'; } // Maak table head cell aan $temp .= '<th bgcolor="#336699" width="' . $cols[$i]['width'] . '" align="' . $cols[$i]['align'] . '" colspan="' . $cols[$i]['colspan'] . '">' . $cols[$i]['name'] . '</th>'; } } $temp .= '</tr>'; // Maak tabel rijen aan $color = 0; $bgcolor[0] = '#E0DDDD'; $bgcolor[1] = '#eeeeee'; for ($i = 0; $i < count($rows); $i++) { // Maak elke kolom aan voor elke rij $temp .= '<tr>'; for ($j = 0; $j < count($rows[$i]); $j++) { if ( (isset($rows[$i][$j]['data'])) && (isset($rows[$i][$j]['width'])) ) { // Check alignment en colspan if (!isset($rows[$i][$j]['colspan'])) { // Default colspan = 0 $rows[$i][$j]['colspan'] = 0; } if (!isset($rows[$i][$j]['align'])) { // Default align = left $rows[$i][$j]['align'] = 'left'; } if (!isset($rows[$i][$j]['color'])) { $rows[$i][$j]['color'] = $bgcolor[$color]; } // Maak table cell aan $temp .= '<td valign="top" bgcolor="' . $rows[$i][$j]['color'] . '" width="' . $rows[$i][$j]['width'] . '" align="' . $rows[$i][$j]['align']; $temp .= '" colspan="' . $rows[$i][$j]['colspan'] . '">' . $rows[$i][$j]['data'] . '</td>'; } } $color = $color ^ 1; $temp .= '</tr>'; } $temp .= '</table>'; return($temp); } |
It’s nice to be important but it’s more important to be nice
Code om het detailscherm vanaf het lijstscherm te openen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| procedure TfrmLstKlanten.OpenButtonClick(Sender: TObject); var frmDetail : TfrmDetKlant; SelItem : TListItem; begin // of OpenButtonClick inherited; SelItem := ListView.Selected; if SelItem <> nil then begin frmDetail := TfrmDetKlant.Create (Self); frmDetail.DoAfterOK := UpdateListItem; frmDetail.Execute (Integer(SelItem.Data)); end; end; // of OpenButtonClick |
DoAfterOk is dus een property van het type TNotifyEvent (in Delphi) op m'n detailscherm. Aan die property ken ik dus een method toe die ik in m'n lijstscherm heb gedefinieerd.
Op die manier kan je dat detailscherm ook nog hergebruiken bij andere lijstschermen, of zonder lijstscherm. Je zorgt er dus voor dat het detailscherm iets uitvoert, maar dat het niet expliciet gekoppeld is met het lijstscherm.
De UpdateListItem method (die dus aan de DoAfterOk toegekend werd), ziet er als volgt uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| procedure TfrmLstKlanten.UpdateListItem(Sender: TObject); var SelKey : Integer; SelItem : TListItem; begin // of UpdateListItem SelKey := TfrmDetKlant(Sender).PrimKey; SelItem := ListView.Selected; if (SelItem = nil) or (Integer(SelItem.Data) <> SelKey) then begin SelItem := ListView.FindData(0, Pointer(SelKey), True, False); end; SelItem.Caption := TfrmDetKlant(Sender).CodeDBEdit.Text; SelItem.SubItems[0] := TfrmDetKlant(Sender).NaamDBEdit.Text; end; // of UpdateListItem |
Natuurlijk moet die method ook nog uitgevoerd worden. Om dat te verwezenlijken zit de volgende code onder de ApplyButton van m'n detailscherm:
1
2
3
| if Assigned (DoAfterOk) then begin DoAfterOk (Self); end; |
Zoiets heb ik trouwens hier ook al eens uitgelegd. (In C# dan wel).
[ Voor 4% gewijzigd door whoami op 08-04-2003 15:15 ]
https://fgheysels.github.io/
Het is een query die een totaal laat zien van het aantal coupures, pasmunt en overige waardes(cheques etc) die binnen zijn gekomen in een geld tel centrale van een bank.
Uitgesplitst per coupure soort (tientjes, twintigjes, etc) en valuta)
Het resultaat kon ook zo in z'n geheel in een tabel gegoten worden, zonder verdere opmaak en liet dan evengoed een duidelijk overzicht zien.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| WITH TIMES AS( SELECT MAX(SUB.TIMESTAMP) AS TIME FROM DBORC01.ORCT046 SUB WHERE SUB.TIMESTAMP BETWEEN ? AND ? GROUP BY SUB.DEELSTROOM_ID, SUB.COUPURE_ID ), SUB_TEL AS ( SELECT X.DEELSTROOM_ID AS DEEL_ID, X.DEELSCOUPTEL_ID AS ID, X.COUPURE_ID AS COUP_ID, DEEL.STORTING_ID AS STORT_ID FROM (TIMES T JOIN DBORC01.ORCT046 X ON T.TIME = X.TIMESTAMP JOIN DBORC01.ORCT038 DEEL ON X.DEELSTROOM_ID = DEEL.DEELSTROOM_ID) ), STORT AS ( SELECT STORT_ID AS ID FROM SUB_TEL GROUP BY STORT_ID ) SELECT VALUTA.VAL_ISO_CD AS VALUTA, SUM(DEELCOUPTEL.DEELSCOUPTELANT) AS AANTAL, 'X' AS "X", COUPURE.WAARDE AS COUPURE, COUPURE.PRIORITEIT AS VOLGORDE, '=' AS "=", SUM(DEELCOUPTEL.DEELSCOUPTELANT * COUPURE.WAARDE) AS TOTAAL, INTEGER(SUM(DEELCOUPTEL.DEELSCOUPTELANT)) / INTEGER(COUPURE.BATCHAANTAL) AS AANTALBATCHES, MOD(INTEGER(SUM(DEELCOUPTEL.DEELSCOUPTELANT)), INTEGER(COUPURE.BATCHAANTAL)) AS LOSSECOUPURES FROM SUB_TEL, DBORC01.ORCT046 DEELCOUPTEL, DBORC01.ORCT009 COUPURE, DBORC01.ORCT030 VALUTA, DBORC01.ORCT038 DEELSTR WHERE SUB_TEL.ID = DEELCOUPTEL.DEELSCOUPTEL_ID AND SUB_TEL.COUP_ID = COUPURE.COUPURE_ID AND COUPURE.VALUTA_ID = VALUTA.VALUTA_ID AND DEELCOUPTEL.DEELSTROOM_ID = DEELSTR.DEELSTROOM_ID AND ( SELECT MAX(GETELD_JN) FROM DBORC01.ORCT038 TMP WHERE TMP.STORTING_ID = DEELSTR.STORTING_ID) = 'J' GROUP BY VALUTA.VAL_ISO_CD, COUPURE.WAARDE, COUPURE.PRIORITEIT, COUPURE.BATCHAANTAL UNION SELECT VALUTA.VAL_ISO_CD AS VALUTA, COUNT(DEELSTROOM.GETELD_BEDRAG) AS AANTAL, 'X' AS "X", 0 AS COUPURE, 99 AS VOLGORDE, '=' AS "=", SUM(DEELSTROOM.GETELD_BEDRAG) AS TOTAAL, SUM(0) AS AANTALBATCHES, SUM(0) AS LOSSECOUPURES FROM (DBORC01.ORCT024 STOR JOIN DBORC01.ORCT038 DEELSTROOM ON STOR.STORTING_ID = DEELSTROOM.STORTING_ID JOIN DBORC01.ORCT030 VALUTA ON DEELSTROOM.VALUTA_ID = VALUTA.VALUTA_ID) WHERE STOR.GETELD_TIMESTAMP BETWEEN ? AND ? AND DEELSTROOM.SOORT_DEELST_ID = 2 AND ( SELECT MAX(GETELD_JN) FROM DBORC01.ORCT038 TMP WHERE TMP.STORTING_ID = STOR.STORTING_ID) = 'J' GROUP BY VALUTA.VAL_ISO_CD UNION SELECT VALUTA.VAL_ISO_CD AS VALUTA, COUNT(DEELSTROOM.GETELD_BEDRAG) AS AANTAL, 'X' AS "X", 0 AS COUPURE, 100 AS VOLGORDE, '=' AS "=", SUM(DEELSTROOM.GETELD_BEDRAG) AS TOTAAL, SUM(0) AS AANTALBATCHES, SUM(0) AS LOSSECOUPURES FROM (DBORC01.ORCT024 STOR JOIN DBORC01.ORCT038 DEELSTROOM ON STOR.STORTING_ID = DEELSTROOM.STORTING_ID JOIN DBORC01.ORCT030 VALUTA ON DEELSTROOM.VALUTA_ID = VALUTA.VALUTA_ID) WHERE STOR.GETELD_TIMESTAMP BETWEEN ? AND ? AND DEELSTROOM.SOORT_DEELST_ID = 3 AND ( SELECT MAX(GETELD_JN) FROM DBORC01.ORCT038 TMP WHERE TMP.STORTING_ID = STOR.STORTING_ID) = 'J' GROUP BY VALUTA.VAL_ISO_CD ORDER BY VALUTA, VOLGORDE, COUPURE FOR READ ONLY; |
Deze query werd afgeschoten op een DB2 server en deed er ongeveer 2 sec. over om met resultaat te komen
Neem je whisky mee, is het te weinig... *zucht*
Verwijderd
Maar minder generiekJonkieXL schreef op 08 April 2003 @ 15:13:
Hieronder een PHP functie om een HTML tabel aan te maken. En ga nou niet aankomen met XSLT en template parsers, de functie is gewoon geniaal
[snip]
[ Voor 86% gewijzigd door Verwijderd op 08-04-2003 15:20 ]
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| private void closure2() { int size = this.size; boolean[] done = new boolean[size]; boolean[] busy = new boolean[size]; int[] index = new int[size]; int[] bitpos = new int[size]; int ndone = 0; while (ndone < size) { if ((rows[ndone] != null) && !done[ndone]) { int stackpos = 0; index[0] = ndone; bitpos[0] = 0; busy[ndone] = true; BitVector current = rows[ndone]; while (stackpos >= 0) { if (bitpos[stackpos] < 0) { if (stackpos > 0) { rows[index[stackpos-1]].or(rows[index[stackpos]]); current = rows[index[stackpos-1]]; } done[index[stackpos]] = true; busy[index[stackpos--]] = false; } else { int nextbitpos = current.getLowestSetBit(bitpos[stackpos]); if (nextbitpos < 0 || nextbitpos >= size) bitpos[stackpos] = -1; else { bitpos[stackpos] = nextbitpos+1; if (rows[nextbitpos] != null) { if (done[nextbitpos]) { rows[index[stackpos]].or(rows[nextbitpos]); } else { if (!busy[nextbitpos]) { busy[nextbitpos] = true; index[++stackpos] = nextbitpos; bitpos[stackpos] = 0; current = rows[index[stackpos]]; } else { if (index[stackpos] != nextbitpos) { int tempsp = stackpos-1; BitVector cyclicmask = new BitVector(size); do { bitpos[tempsp] = -1; rows[index[stackpos]].or(rows[index[tempsp]]); cyclicmask.set(index[tempsp]); } while (index[tempsp--] != nextbitpos); current = (BitVector)current.clone(); current.andNot(cyclicmask); bitpos[stackpos] = 0; } } } } } } } } ndone++; } reflexive = true; } |
/me is van stiekem fan van diep geneste code
Niets is zo geniaal als de formele specificatie van Quicksort:
1
2
3
| sort x:xs = (sort kleintjes) ++ x ++ (sort groten) where kleintjes = [ k | k<-xs ; k<x] groten = [ g | g<-xs ; g>=x] |
Siditamentis astuentis pactum.
Mooi geneste code idd nietVerwijderd schreef op 08 April 2003 @ 15:22:
Mooi geneste code is niet lelijk.
Dit ding moet je gewoon opsplitsen in een aantal methodes. Ik kom zelden meer dan 2 nivo`s diep.
1
2
3
| #!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/) |
http://www.cypherspace.org/~adam/rsa/story2.html
Knap gedaan vindt ik.
Had thuis volgens mij nog een iets nettere versie van iemand anders... strax ff posten.
[ Voor 12% gewijzigd door SWfreak op 08-04-2003 15:43 ]
Da's toch een doodgewone 'bubble sort'riezebosch schreef op 08 april 2003 @ 13:53:
Nogal "trots" op m'n eigen quicksort routine (die mijn eigen LinkedList sorteerd):
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 template <class OBJ> void sort(Item<OBJ> * start, Item<OBJ> * end) { Item<OBJ> * i = start; Item<OBJ> * j = end; OBJ temp; while (i != j) { while (i != j && i->CurrItem <= end->CurrItem) { i = i->NextItem; } while (i != j && j->CurrItem >= end->CurrItem) { j = j->PrevItem; } temp = j->CurrItem; j->CurrItem = i->CurrItem; i->CurrItem = temp; } temp = end->CurrItem; end->CurrItem = j->CurrItem; j->CurrItem = temp; if (start != i && start->NextItem != i) sort(start, i->PrevItem); if (end != j && end->PrevItem != j) sort(j->NextItem, end); }
Sorry voor het gebrek aan commentaar
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
Bubblesort? Dan vraag ik me toch af wat die recursieve aanroep in z'n code doetInZane schreef op 08 April 2003 @ 16:30:
[...]
Da's toch een doodgewone 'bubble sort'
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
De parser generator bevat ook veel leuke routines, maar om die allemaal te posten wordt wat veel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
| /// <summary> /// Parses the tokens supplied using the LR(k) algorithm by using the action and the goto tables. /// When the parser reduces a rule, it will call the handler corresponding to the non-terminal on the /// left hand side of the rule. All stack entries popped from the stack are passed along to the handler. /// </summary> /// <returns>The last stack entry from the parsestack which holds the reduce info of the 0-production rule.</returns> public ParseStackEntry ParseLR() { ParseStackEntry pseToReturn, pseToPush; pseToReturn.EmitterResult=null; pseToReturn.Type = ParseStackEntryType.Unknown; pseToReturn.State=0; pseToReturn.NonTerminalReduced=0; pseToReturn.TokenScanned=null; // push on the stack the state 0. pseToPush = new ParseStackEntry(); pseToPush.EmitterResult=null; pseToPush.Type = ParseStackEntryType.Unknown; pseToPush.State=0; pseToPush.NonTerminalReduced=-1; pseToPush.TokenScanned=null; m_stkParseStack.Push(pseToPush); try { // for each token in the queue, use the action table to perform actions. Use the // goto table to produce states when reducing non-terminals. // set accepted flag to false so we can see at the end of the loop if we should do // error recovery or not. bool bTokenStreamAccepted=false; while(m_qTokenList.Count > 0) { // grab the token from the queue IToken toToken = (IToken)m_qTokenList.Peek(); // With the current state on the stack and the Token read from the queue, we can determine an // action in the action table. Parser will crash when a wrong actiontable is passed into // this engine and/or wrong tokenid's. ActionGotoTableEntry agteToExecute = m_arrActionTable[toToken.TokenID, ((ParseStackEntry)m_stkParseStack.Peek()).State]; // check what to do switch((ActionGotoTableEntryType)agteToExecute.Type) { case ActionGotoTableEntryType.Accept: // done. Pop stack object from stack, which should hold the complete parse result or at least // info to retrieve the complete parse result in the special parser // Call the rule handler and store it into the stackitem to return pseToReturn.EmitterResult = ReduceRule(agteToExecute); pseToReturn.Type = ParseStackEntryType.RuleReduceResult; pseToReturn.NonTerminalReduced = -1; pseToReturn.TokenScanned = null; // pop the token from the queue. By definition this is an EOF token and by definition this can be ignored. toToken=(IToken)m_qTokenList.Dequeue(); bTokenStreamAccepted = true; break; case ActionGotoTableEntryType.Error: // remove the token from the token stream toToken=(IToken)m_qTokenList.Dequeue(); // Push the token as an Error onto the stack. When the stack elements are reduced, this // element is taken into account and passed along to the specialized parser. pseToPush = new ParseStackEntry(); pseToPush.EmitterResult=null; pseToPush.Type = ParseStackEntryType.Error; // Copy the state located currently onto the stack, so this error will have no effect on the // further execution of the LR(0) parser. pseToPush.State = ((ParseStackEntry)m_stkParseStack.Peek()).State; pseToPush.NonTerminalReduced=-1; pseToPush.TokenScanned = toToken; // push the token onto the tack m_stkParseStack.Push(pseToPush); break; case ActionGotoTableEntryType.Goto: // bad action table throw new ApplicationException("Internal Error: bad action table: goto statement in action table."); // no break statement needed. case ActionGotoTableEntryType.Reduce: ProductionRule prToReduce = (ProductionRule)m_alGrammar[agteToExecute.Value]; object oReduceResult = ReduceRule(agteToExecute); // Read from the Goto table the new state to push onto the stack. We use the current // top state on the stack and the lefthand side of the reduced production rule. LeftHandSide id's are 1 based (0 is reserved for 'S', the start symbol) // and therefor we have to decrease that number for indexing into the 0-based gototable ActionGotoTableEntry gtteNewState = (ActionGotoTableEntry)m_arrGotoTable[prToReduce.LeftHandSide-1, ((ParseStackEntry)m_stkParseStack.Peek()).State]; if(gtteNewState.Type == ActionGotoTableEntryType.Goto) { // add new state to stack pseToPush = new ParseStackEntry(); pseToPush.EmitterResult = oReduceResult; pseToPush.State= gtteNewState.Value; pseToPush.TokenScanned = null; pseToPush.Type = ParseStackEntryType.RuleReduceResult; pseToPush.NonTerminalReduced = prToReduce.LeftHandSide; m_stkParseStack.Push(pseToPush); } else { // error in goto table throw new ApplicationException("Internal Error: wrong goto table."); } break; case ActionGotoTableEntryType.Shift: // remove the token from the token stream toToken=(IToken)m_qTokenList.Dequeue(); // Perform the shift pseToPush = new ParseStackEntry(); pseToPush.State = agteToExecute.Value; pseToPush.TokenScanned = toToken; pseToPush.Type = ParseStackEntryType.TerminalShift; pseToPush.NonTerminalReduced = -1; // will be ignored, since IsResultOfReduce is false. pseToPush.EmitterResult = null; m_stkParseStack.Push(pseToPush); break; } } if(!bTokenStreamAccepted) { // the stack is still filled with elements and due to some error the // parsing was stopped, and the final rule can't be reduced. Do a recovery, reduce // the complete stack as the rule number 0 and call the rule 0 handler. Return the result // of that handler. pseToReturn.EmitterResult = ReduceRule(0, m_stkParseStack.Count-1, false); pseToReturn.Type = ParseStackEntryType.RuleReduceResult; pseToReturn.NonTerminalReduced = -1; pseToReturn.TokenScanned = null; } return pseToReturn; } catch(Exception ex) { // bubble throw new Exception("Internal Error occured in LR(1) engine.", ex); } } |
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Lijkt wel erg op de quicksort van Sedgewickriezebosch schreef op 08 April 2003 @ 13:53:
Nogal "trots" op m'n eigen quicksort routine (die mijn eigen LinkedList sorteerd):
(code)
Sorry voor het gebrek aan commentaar
[edit]Dat is dus niet zo. Die van Sedgewick zie ik nu is ong de helft qua grootte
[ Voor 24% gewijzigd door EfBe op 08-04-2003 17:06 ]
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Ja, die is inderdaad erg mooi. En het mooiste is nog dat je dit letterlijk in Haskell kan intikken en dan werkt hetVarienaja schreef op 08 April 2003 @ 15:23:
Niets is zo geniaal als de formele specificatie van Quicksort:
code:
1 2 3 sort x:xs = (sort kleintjes) ++ x ++ (sort groten) where kleintjes = [ k | k<-xs ; k<x] groten = [ g | g<-xs ; g>=x]
Haskell? WTF is Haskell? Een erg mooi functioneel taaltje: www.haskell.org Met gratis interpreter.
Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!
Zo, stuk netterScarecrow schreef op 08 april 2003 @ 14:41:
![]()
PHP:
1 2 3 <?php echo "GoT"; // Geeft de tekst 'GoT' als output ?>
Nou wat is daar aan mis
|>
[insectensex]WildernessChild schreef op 08 April 2003 @ 17:12:
[...]
Ja, die is inderdaad erg mooi. En het mooiste is nog dat je dit letterlijk in Haskell kan intikken en dan werkt het
Haskell? WTF is Haskell? Een erg mooi functioneel taaltje: www.haskell.org Met gratis interpreter.
in haskell moet het net even anders:
1
2
3
| sort (x:xs) = (sort kleintjes) ++ [x] ++ (sort groten) where kleintjes = [ k | k<-xs , k<x] groten = [ g | g<-xs , g>=x] |
of in 1 regel:
1
| sort (m:xs) = [ x | x <- xs , x < m] ++ m : [ x | x <- xs , x >= m] |
[/insectensex]
in dezelfde categorie (oneliners) valt ook de volgende methode om alle priemgetallen in een lijst te zetten:
1
| priemGetallen = filter (\p -> [f | f <- [1..p], p `mod` f == 0] == [1,p]) [1..] |
Pas de replâtrage, la structure est pourrie.
https://fgheysels.github.io/
Als ik me niet vergis, hebben we nog geen code van jou gezien.Alarmnummer schreef op 08 april 2003 @ 17:33:
Ik zit me zo nu en dan af te vragen of ik wel in het juiste topic zit!
https://fgheysels.github.io/
20 goto 10
Een perl-one-liner vind ik zelden tot nooit mooi. Het is wel enorm knap dat iemand zoiets kan bedenken
Alarmnummer: goto's worden toch als "vies" beschouwd?
1
2
3
| record List<Alpha>{ List<List<Alpha>> _field; } |
En nou maar hopen dat alles een beetje lui is
It’s nice to be important but it’s more important to be nice
De onderstaande code is eigenlijk in C# geschreven, maar de C# tag ondersteunt geen syntax-coloring
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| public class ContactList : Hashtable { /// <summary> /// Enumerating through this list will only process contacts which are on your forward list: /// these are the contacts on YOUR contactlist. /// </summary> public class ForwardListEnumerator : ContactList.ListEnumerator { public ForwardListEnumerator(IDictionaryEnumerator listEnum) : base(listEnum) { } /// <summary> /// Used by the foreach language structure /// </summary> /// <returns>True when there are still items left</returns> public override bool MoveNext() { while(baseEnum.MoveNext()) { // filter on the forward boolean if((((Contact)baseEnum.Value).lists & MSNList.ForwardList) > 0) return true; } return false; } } } |
En dan verderop een public property. Programmeurs kunnen dan dus:
foreach(Contact contact in contactList.ForwardList) { .. }
intikken
1
2
3
4
| public ContactList.ForwardListEnumerator ForwardList { get { return new ContactList.ForwardListEnumerator(contacts.GetEnumerator()); } } |
En tja mooie code is zeer subjectief (lelijke code is meestal gewoon een feit
Wat ik zelf belangrijk vind is als een 3rd party component of library intuitief werkt en dat je het idee hebt dat ze het niet moeilijker proberen te maken dan het feitelijk is.
Maar dit valt misschien eerder onder mooi 'ontwerp'
www.cs.olemiss.edu/~hcc/reports/feijen_cubes.pdf
afleiding van een programmaatje dat de machten van n^3 berekent, voor n=0,..,99, zonder gebruik te maken van vermenigvuldigen o.i.d. , alleen optellen. En dit in een O(n) algoritme !
Zie pagina 8 in het PDF bestand voor het complete programmaatje.
[ Voor 12% gewijzigd door marcelk op 08-04-2003 20:20 ]
Ik doe dat gewoon om aan te geven dat een variabele een member-variabele (of field) is van die class.Just_a_Gamer schreef op 08 April 2003 @ 19:45:
wat ik niet snap is dat mensen soms hun variabele _ voorzetten. Waarom eigenlijk?? Ik zie dat bij alarmnummer en bij whoami stukjes code
De properties die die variabelen accessen hebben dan dezelfde naam als die member-variabele, behalve dan zonder underscore, en beginnend met een hoofdletter.
https://fgheysels.github.io/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| define("SUB_OTHER_EXECUTE",1 << 0); define("SUB_OTHER_WRITE" ,1 << 1); define("SUB_OTHER_READ" ,1 << 2); define("SUB_GROUP_EXECUTE",1 << 3); define("SUB_GROUP_WRITE" ,1 << 4); define("SUB_GROUP_READ" ,1 << 5); define("SUB_OWNER_EXECUTE",1 << 6); define("SUB_OWNER_WRITE" ,1 << 7); define("SUB_OWNER_READ" ,1 << 8); .. class SUB_PermissionsField extends SUB_FormField { .. function setPermissionCheckBoxes($iPermissions) { $aCaptions = array("X", "W", "R"); $m = 0; for($n = SUB_OTHER_EXECUTE; $n <= SUB_OWNER_READ; $n <<= 1) { $this->m_aPermissions[$n] = ($iPermissions & $n) ? "CHECKED" : ""; $this->m_aCaptions[$n] = $aCaptions[$m]; $m = ($m < count($aCaptions)-1) ? $m+1 : 0; } } } |

https://fgheysels.github.io/
Aangezien ik al 4 jaar lang les van Wim Feijen, Rob Hoogerwoord en wijlen Netty van Gasteren (de volgers van Dijkstra) heb gehad, moet ik zeggen dat dit eigenlijk vrij basic is. Het verbaast me alleen wel dat Feijen het zo eenvoudig opschrijft, maar dat komt omdat ik zovaak heb gewerkt met Hoare tripples en zo. Bij ons op de TU/e vertelt ie hetzelfde in de helft van de pagina's of zomarcelk schreef op 08 April 2003 @ 20:17:
Afleiding door ir W.H.J. Feijen![]()
www.cs.olemiss.edu/~hcc/reports/feijen_cubes.pdf
afleiding van een programmaatje dat de machten van n^3 berekent, voor n=0,..,99, zonder gebruik te maken van vermenigvuldigen o.i.d. , alleen optellen. En dit in een O(n) algoritme !
Zie pagina 8 in het PDF bestand voor het complete programmaatje.
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Ook de RML parser zullen jullie moeten ontberen
Saai he?
Klaar voor een nieuwe uitdaging.
Hoe kan je nu PHP rijmen met 'fraaie code'?
tot zover deze flame
https://fgheysels.github.io/
Fraaie code is wat anders dan een degelijk framework. Alhoewel natuurlijk sterk gerelateerdwhoami schreef op 08 April 2003 @ 21:16:
Hoe kan dat nu chem.
Hoe kan je nu PHP rijmen met 'fraaie code'?
tot zover deze flame
De mooiste oplossingen kunnen helaas niet in PHP.
Klaar voor een nieuwe uitdaging.
https://fgheysels.github.io/
putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]
Bij mij op de TU/e ookIceManX schreef op 08 april 2003 @ 21:11:
[...]
...Hoare tripples en zo. Bij ons op de TU/e vertelt ie hetzelfde in de helft van de pagina's of zo
IceManX, heb je nu ook Multiprogramming ?
al gehaald met een 7, maar vraag me niet hoe... ik kon niet eens het vraagstuk oplossen
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Een preview is echter misschien nog leuker: http://therealcrisp.xs4all.nl/contest/dno.php?method=display
klein stukje copy-paste dan van de javascript implementatie van de iteratieve floodfill (waarvan het origineel trouwens niet helemaal van mezelf is; ik heb 'm enkel verbeterd):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| function lookUp(y,x,color) { var block = new Array([y,x]); var count = 0; var i = 0; var u,d; sy = y; ey = y; sx = x; ex = x+1; do { y = block[i][0]; x = block[i][1]; u = 1; d = 1; while (grid[y][--x] === color); if (++x < sx) sx = x; while (grid[y][x] === color) { grid[y][x] = 0; gridDisplay[y][x].backgroundColor = colors[9]; count++; if (grid[y-1][x] !== color) u=1; else if (u) { block[i++] = [y-1, x]; u = 0; if (y === sy) sy--; } if (grid[y+1][x] !== color) d=1; else if (d) { block[i++] = [y+1, x]; d = 0; if (y === ey) ey++; } x++; } if (x > ex) ex = x; } while (i--); return count; } |
[ Voor 10% gewijzigd door crisp op 09-04-2003 22:14 ]
Intentionally left blank
1
2
3
4
| a = ((a&0xFF00)>>8) | ((a&0x00FF)<<8) a = ((a&0xF0F0)>>4) | ((a&0x0F0F)<<4) a = ((a&0xCCCC)>>2) | ((a&0x3333)<<2) a = ((a&0xAAAA)>>1) | ((a&0x5555)<<1) |
Niet zelf verzonnen, stond een keer in een linux login
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| int x = 5; int y = 2; x = x - y; y = x + y; x = y - x; //of y = x ^ y x = x ^ y y = x ^ y //of x ^= y ^= x ^= y |
Er wordt geen gebruik gemaakt van recursie, aangezien je maar 200 geneste stored procedures kan hebben.
Er wordt gebruik gemaakt van temp tables die elke keer opnieuw wordt opgebouwd als er veranderingen komen in de tabel Nodes.
Code die het pad van en naar nodes in een tabel zet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| ALTER PROCEDURE cu_Nodes_BuildParentTable ( @Start Int, @End Int ) AS SET NOCOUNT ON DECLARE @Parent INT DECLARE @SortID INT SELECT @SortID = 1 SELECT @Parent = @End DELETE FROM NodeParents WHERE FromNodeID = @Start AND ToNodeID = @End INSERT INTO NodeParents VALUES ( @Start, @End, @End, @SortID ) WHILE @Parent <> @Start AND NOT @Parent IS NULL BEGIN SELECT @SortID = @SortID + 1 SELECT @Parent = ParentNodeID FROM Nodes WHERE NodeID = @Parent INSERT INTO NodeParents VALUES ( @Start, @End, @Parent, @SortID ) END SELECT NodeParents.NodeID, Nodes.NodeTypeID, Nodes.ParentNodeID, Nodes.NodeName, Nodes.NodeDesc, Nodes.Publish, Nodes.CreationDate, Nodes.PublishDate, Nodes.LastModified, Nodes.CreatedByUserID, Nodes.PublishedByUserID, Nodes.LastModifiedByUserID, Nodes.StartDocumentID, NodeParents.FromNodeID, NodeParents.ToNodeID FROM Nodes INNER JOIN NodeParents ON Nodes.NodeID = NodeParents.NodeID WHERE (NodeParents.FromNodeID = @Start) AND (NodeParents.ToNodeID = @End) ORDER BY SortID DESC SET NOCOUNT OFF |
Code die alle childs van een node ophaalt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| ALTER PROCEDURE cu_Nodes_BuildChildTable ( @NodeID int ) AS SET NOCOUNT ON DECLARE @curNodeID int DECLARE @curParentNodeID int DECLARE @TreeLevel int DECLARE @NodeCount int DECLARE @NodeName varchar(50) SET @NodeCount = 0 CREATE TABLE #stack (stkNodeID int, stkParentNodeID int, TreeLevel int) DELETE FROM NodeChilds WHERE NodeID = @NodeID --Insert the first record INSERT NodeChilds SELECT @NodeID, NodeID, ParentNodeID, 1, @NodeCount FROM Nodes WHERE NodeID = @NodeID INSERT #STACK SELECT NodeID, ParentNodeID, 1 FROM Nodes WHERE ParentNodeID = @NodeID ORDER BY NodeID DESC SELECT @TreeLevel = 1 WHILE @TreeLevel > 0 BEGIN IF EXISTS (SELECT TOP 30000 * FROM #stack WHERE TreeLevel = @TreeLevel ORDER BY stkNodeID DESC) BEGIN SELECT @curNodeID = stkNodeID, @CurParentNodeID = stkParentNodeID FROM #stack WHERE TreeLevel = @TreeLevel ORDER BY stkNodeID DESC INSERT NodeChilds VALUES(@NodeID, @curNodeID, @curParentNodeID, @TreeLevel, 0) UPDATE NodeChilds SET Children = Children + 1 WHERE ChildNodeID = @curParentNodeID DELETE FROM #stack WHERE TreeLevel = @TreeLevel AND stkNodeID = @curNodeID INSERT #stack SELECT NodeID, ParentNodeID, @TreeLevel+1 FROM Nodes WHERE ParentNodeID = @curNodeID ORDER BY NodeID DESC IF @@rowcount > 0 SELECT @TreeLevel = @TreeLevel+1 SET @NodeCount = @NodeCount + 1 END ELSE BEGIN SELECT @TreeLevel = @TreeLevel-1 END END |
Geen comments.....komt nog...
some credits go to Raptorix
Het voordeel is dat bovenstaande stored procedures door 1 query vervangen kunnen worden. Het invoegen van nodes is iets meer werk dan normaal, maar lang niet zoveel werk als de sp's hierboven.
Ik liep tegen deze fraaie datastructuur aan op webgoeroe.net.
(zie o.a.: http://www.google.com/gro...1%40nnrp1.deja.com&rnum=9 )
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Bedankt voor het compliment dat je de routine er net zo eenvoudig uit vindt (?) zien als een bubblesort[...]
Da's toch een doodgewone 'bubble sort'
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
Het was niet mijn bedoeling om gelijk deze hele topic af te kappen...
[ Voor 12% gewijzigd door riezebosch op 09-04-2003 19:11 ]
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Ik heb nog niet de moeite genomen om je routine te doorgronden, maar, al was het alleen maar om dit topic weer onder de aandacht te brengen: leg maar uit!riezebosch schreef op 09 April 2003 @ 13:32:
[...]
Bedankt voor het compliment dat je de routine er net zo eenvoudig uit vindt (?) zien als een bubblesortOkok, ik heb hem niet zelf bedacht, maar wel zelf gesnapt en ook zelf gemaakt
En kan 'm nog uitleggen ook. Als daar liefhebbers voor zijn... Of snapt iedereen de quicksort al?
edit:
Het was niet mijn bedoeling om gelijk deze hele topic af te kappen...
Ik frut, dus ik epibreer
De RML parser is volgens mij qua source ook zo lang dat PHP bij het weergeven van het topic dan spontaan time-outs geeftchem schreef op 08 April 2003 @ 21:14:
Ik vind react wel een mooi framework. Maar dat ga ik niet posten hier
Ook de RML parser zullen jullie moeten ontberenzo ook de Disector en de xml-output generator.
Saai he?
The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.
https://fgheysels.github.io/
Verwijderd
mbravenboer schreef op 08 April 2003 @ 13:38:
[...]
Uiteraard zijn we altijd geinteresseerd in schoonheid. Lelijke zaken probeer je te verstoppen en ga je zeker niet tentoonstellen.
Hum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| unit PassEdit; interface uses Windows, Controls, StdCtrls; type { TPasswordEdit is a password edit box with theme support } TPasswordEdit = class(TEdit) protected procedure CreateParams(var Params: TCreateParams); override; end; implementation procedure TPasswordEdit.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); { Windows XP: If the edit control is from user32.dll, each character is displayed as an asterisk. However, if the edit control is from comctl32.dll version 6, characters are displayed as black circles. } Params.Style := Params.Style or ES_PASSWORD; end; end. |
Een goede grap mag vrienden kosten.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
| /* void DispatchMouseEvents(): dispatches mouse events params: none returns: nothing remarks: this function should only be called from within CDesktop::HandleEvents() */ void CDesktop::DispatchMouseEvents() { // see if there's anything to be done... SPoint ptRelPos = g_poMouse->GetRelativePos(); SPoint ptMousePos = g_poMouse->GetAbsolutePos(); CWnd *pwMouseOverWindow, *pwChildWindow; SPoint ptClientPos; // check if mouse moved if (ptRelPos.x || ptRelPos.y) { // see if we're already clicking... if (g_poMouse->GetButtons() & 3) { CWnd *pwClickedWindow = this; // find the input focus window while (pwClickedWindow->GetInputFocusWindow()) pwClickedWindow = pwClickedWindow->GetInputFocusWindow(); SPoint ptWinPos = ptMousePos; // see if the input focus window is the window under the cursor if (WindowFromPoint(ptMousePos.x, ptMousePos.y, ERecurse) != pwClickedWindow) { // see if the window the mouse was over the previous frame // *was* the clicked window, if so send mouse leave message if (WindowFromPoint(ptMousePos.x - ptRelPos.x, ptMousePos.y - ptRelPos.y, ERecurse) == pwClickedWindow) { pwClickedWindow->Message(AWM_MOUSE_LEAVE, 0, 0); } } else { // translate the coordinate and send a mouse move message pwClickedWindow->ScreenToWindow(&ptWinPos); pwClickedWindow->Message(AWM_MOUSE_MOVE, (ptWinPos.x << 16) | ptWinPos.y, 0); } } else { // find window under mouse cursor step by step CWnd *pwFirstDeferFocusWindow; SPoint ptClientPos; ptMousePos = g_poMouse->GetAbsolutePos(); pwMouseOverWindow = this; pwFirstDeferFocusWindow = NULL; ptClientPos = ptMousePos; while (true) { // translate screen coordinates ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToClient(&ptClientPos); // find window at coordinate pwChildWindow = pwMouseOverWindow->WindowFromPoint(ptClientPos.x, ptClientPos.y, ENoStatics); if (pwChildWindow != pwMouseOverWindow->GetMouseFocusWindow() && !pwFirstDeferFocusWindow) { pwFirstDeferFocusWindow = pwMouseOverWindow->GetMouseFocusWindow(); } else if (pwFirstDeferFocusWindow) { if (pwChildWindow == pwMouseOverWindow) break; // translate screen coordinates to window-space ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToWindow(&ptClientPos); pwMouseOverWindow->Message(AWM_MOUSE_MOVE, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState()); pwMouseOverWindow->GetParent()->SetMouseFocusWindow(pwMouseOverWindow, true); } if (pwChildWindow == pwMouseOverWindow) break; pwMouseOverWindow = pwChildWindow; } // translate screen-space to window-space (aot client-space) ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToWindow(&ptClientPos); pwMouseOverWindow->Message(AWM_MOUSE_MOVE, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState()); if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetMouseFocusWindow(pwMouseOverWindow, true); // notify all windows that have lost focus (all windows below // pwFirstDeferFocusWindow) while (pwFirstDeferFocusWindow) { pwFirstDeferFocusWindow->Message(AWM_MOUSE_LEAVE, (long) pwMouseOverWindow, 0); if (pwFirstDeferFocusWindow->GetParent()) { pwFirstDeferFocusWindow->GetParent()->SetMouseFocusWindow(pwFirstDeferFocusWindow, false); } pwFirstDeferFocusWindow = pwFirstDeferFocusWindow->GetMouseFocusWindow(); } } } // check to see if buttons were pressed/released if (g_poMouse->GetButtonChanges()) { WORD nChanges = g_poMouse->GetButtonChanges(); CWnd *pwInputFocusWindow, *pwActiveWindow; long lMessage; // see if any buttons went down if (nChanges & (CMouse::ELeftDown | CMouse::ERightDown | CMouse::EMidDown)) { bool bDiffFocusFound = false; pwActiveWindow = pwMouseOverWindow = this; pwInputFocusWindow = GetInputFocusWindow(); while (pwActiveWindow->GetInputFocusWindow()) pwActiveWindow = pwActiveWindow->GetInputFocusWindow(); // find window under cursor and blur focus from current input focus // tree while (true) { // translate screen coordinates ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToClient(&ptClientPos); // find window at position pwChildWindow = pwMouseOverWindow->WindowFromPoint(ptClientPos.x, ptClientPos.y, ENoStatics); if (pwChildWindow == pwMouseOverWindow) break; // see if the window found is different than the input focus window if (pwChildWindow != pwInputFocusWindow) bDiffFocusFound = true; // next please... pwMouseOverWindow = pwChildWindow; if (!bDiffFocusFound) pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow(); if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetInputFocusWindow(pwMouseOverWindow, true); } // see if we found a different focus if (bDiffFocusFound || pwInputFocusWindow != pwChildWindow) { // set all windows below the input focus window to defocused... if // you get what I mean... :) while (pwInputFocusWindow) { if (pwInputFocusWindow->GetParent()) pwInputFocusWindow->GetParent()->SetInputFocusWindow(pwInputFocusWindow, false); pwInputFocusWindow->Deactivate(); pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow(); } } // set the mouse over window's input focus to none pwMouseOverWindow->SetInputFocusWindow(pwMouseOverWindow->GetInputFocusWindow(), false); pwMouseOverWindow->Deactivate(); // focus to this window if (pwMouseOverWindow->GetParent()) pwMouseOverWindow->GetParent()->SetInputFocusWindow(pwMouseOverWindow, true); // find out mouse-down coordinate ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToWindow(&ptClientPos); // see what message we should send if (nChanges & CMouse::ELeftDown) lMessage = AWM_MOUSE_LEFT_DOWN; else if (nChanges & CMouse::ERightDown) lMessage = AWM_MOUSE_RIGHT_DOWN; else if (nChanges & CMouse::EMidDown) lMessage = AWM_MOUSE_MID_DOWN; // see if it's a double click (iow if the last click was less than half // a second ago, and at the same window, and within the specified // radius) if (g_oAurora.GetClock() - m_dwLastClickTime <= m_dwDoubleClickTime && pwMouseOverWindow == pwActiveWindow && abs(ptMousePos.x - m_ptLastClick.x) <= m_nDoubleClickRadius && abs(ptMousePos.y - m_ptLastClick.y) <= m_nDoubleClickRadius) { // double click messages are (down_message + 3) lMessage += 3; m_dwLastClickTime = 0; } else { m_dwLastClickTime = g_oAurora.GetClock(); m_ptLastClick = ptMousePos; } // send message if (!(pwMouseOverWindow->GetStyle() & CWnd::EDisabled)) pwMouseOverWindow->Message(lMessage, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState()); // activate and bring to front while (pwMouseOverWindow) { pwMouseOverWindow->BringToFront(); pwMouseOverWindow->Activate(); pwMouseOverWindow = pwMouseOverWindow->GetParent(); } } // see if any buttons went up else if (nChanges & (CMouse::ELeftUp | CMouse::ERightUp | CMouse::EMidUp)) { bool bDiffFocusFound = false; // first find the window under the cursor pwMouseOverWindow = WindowFromPoint(ptMousePos.x, ptMousePos.y, ERecurse); // then find the actual input focus window pwInputFocusWindow = this; while (pwInputFocusWindow->GetInputFocusWindow()) pwInputFocusWindow = pwInputFocusWindow->GetInputFocusWindow(); CWnd *pwMOWP; pwMOWP = pwMouseOverWindow; // give input focus to all windows in the route to the window the mouse is over while (pwMOWP) { if (pwMOWP->GetParent()) pwMOWP->GetParent()->SetInputFocusWindow(pwMOWP, true); pwMOWP = pwMOWP->GetParent(); } // see if the windows match if (pwInputFocusWindow != pwMouseOverWindow) { // see which button was clicked if (nChanges & CMouse::ELeftUp) lMessage = AWM_MOUSE_LEFT_UP; else if (nChanges & CMouse::ERightUp) lMessage = AWM_MOUSE_RIGHT_UP; else if (nChanges & CMouse::EMidUp) lMessage = AWM_MOUSE_MID_UP; // send message pwInputFocusWindow->Message(lMessage, (long) pwMouseOverWindow, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState()); // send MouseLeave message (for windows that don't need to // respond to MouseOut but do respond to MouseLeave) if (!(pwInputFocusWindow->GetStyle() & CWnd::EDisabled)) pwInputFocusWindow->Message(AWM_MOUSE_LEAVE, (long) pwMouseOverWindow, 0); // activate window that mouse was left over... while (pwMouseOverWindow) { pwMouseOverWindow->BringToFront(); pwMouseOverWindow = pwMouseOverWindow->GetParent(); } } else { // translate coordinates ptClientPos = ptMousePos; pwMouseOverWindow->ScreenToWindow(&ptClientPos); // see what button was clicked if (nChanges & CMouse::ELeftUp) lMessage = AWM_MOUSE_LEFT_CLICK; else if (nChanges & CMouse::ERightUp) lMessage = AWM_MOUSE_RIGHT_CLICK; else if (nChanges & CMouse::EMidUp) lMessage = AWM_MOUSE_MID_CLICK; // send message if (!(pwMouseOverWindow->GetStyle() & CWnd::EDisabled)) pwMouseOverWindow->Message(lMessage, (ptClientPos.x << 16) | ptClientPos.y, (g_poMouse->GetButtons() << 10) | g_poKeyboard->GetShiftState()); } } } } |
.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?
http://www.onnos.com/bob.xls
Hij werkt met een macrootje maar wees gerust gaat niet iets doen met je harddisk - wel effe volgen wat ie zegt
edit:
het gekke is dat ie nog net zo traag gaat als 5 jaar geleden
[ Voor 10% gewijzigd door hobbit_be op 11-04-2003 01:42 ]
Je kan dit veel beter opsplitsen in een paar functies hoor. Dit is een onplezierige lap code om mee te werken. En het dispatchen kan je veel beter doen mbv een visitor design pattern als je zelf ook de events maakt.Korben schreef op 10 April 2003 @ 23:45:
Dit is een functie uit mijn GUI-framework in progress. De functie zorgt ervoor dat windows de juiste messages ontvangen mbt muis-events. Btw: layout-fucker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| interface MouseEvent{ public void accepts(MouseEventVisitor v); } class MouseMoveEvent extends MouseEvent{ public void accepts(MouseEventVisitor v){ v.visit(this); } } class MousePressedEvent extends MouseEvent{ public void accepts(MouseEventVisitor v){ v.visit(this); } } class MouseReleasedEvent extends MouseEvent{ public void accepts(MouseEventVisitor v){ v.visit(this); } } interface MouseEventVisitor{ public void visit(MouseMoveEvent e); public void visit(MousePressedEvent e); public void visit(MouseReleasedEvent e); } class EventHandler implements MouseEventVisitor{ public void handle(MouseEvent e){ e.accepts(this); } public void visit(MouseMoveEvent e){ ...mouse move afhandeling } public void visit(MousePressedEvent e){ ...mouse pressed afhandeling } public void visit(MouseReleasedEvent e){ ...mouse released afhandeling } } |
Er zijn trouwens nog wel meer manieren om te dispatchen. Maar ik zou het dispatchen en het afhandelen dus echt uit elkaar gaan halen, omdat die lap code te groot is.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| #!/usr/bin/perl -w use strict; $_='ev al("seek\040D ATA,0, 0;");foreach(1..2) {;}my @camel1hump;my$camel; my$Camel ;while( ){$_=sprintf("%-6 9s",$_);my@dromedary 1=split(//);if(defined($ _=)){@camel1hum p=split(//);}while(@dromeda ry1){my$camel1hump=0 ;my$CAMEL=3;if(defined($_=shif t(@dromedary1 ))&&/\S/){$camel1hump+=1<<$CAMEL;} $CAMEL--;if(d efined($_=shift(@dromedary1))&&/\S/){ $camel1hump+=1 <<$CAMEL;}$CAMEL--;if(defined($_=shift( @camel1hump))&&/\S/){$camel1hump+=1<<$CAMEL;}$CAMEL--;if( defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1<<$CAME L;;}$camel.=(split(//,"\040..m`{/J\047\134}L^7FX"))[$camel1h ump];}$camel.="\n";}@camel1hump=split(/\n/,$camel);foreach(@ camel1hump){chomp;$Camel=$_;tr/LJF7\173\175`\047/\061\062\063 45678/;tr/12345678/JL7F\175\173\047`/;$_=reverse;print"$_\040 $Camel\n";}foreach(@camel1hump){chomp;$Camel=$_;y/LJF7\173\17 5`\047/12345678/;tr/12345678/JL7F\175\173\047`/;$_=reverse;p rint"\040$_$Camel\n";}#japh-Erudil';;s;\s*;;g;;eval; eval ("seek\040DATA,0,0;");undef$/;$_=;s$\s*$$g;( );;s ;^.*_;;;map{eval"print\"$_\"";}/.{4}/g; __DATA__ \124 \1 50\145\040\165\163\145\040\157\1 46\040\1 41\0 40\143\141 \155\145\1 54\040\1 51\155\ 141 \147\145\0 40\151\156 \040\141 \163\16 3\ 157\143\ 151\141\16 4\151\1 57\156 \040\167 \151\164\1 50\040\ 120\1 45\162\ 154\040\15 1\163\ 040\14 1\040\1 64\162\1 41\144 \145\ 155\14 1\162\ 153\04 0\157 \146\ 040\11 7\047\ 122\1 45\15 1\154\1 54\171 \040 \046\ 012\101\16 3\16 3\15 7\143\15 1\14 1\16 4\145\163 \054 \040 \111\156\14 3\056 \040\ 125\163\145\14 4\040\ 167\1 51\164\1 50\0 40\160\ 145\162 \155\151 \163\163 \151\1 57\156\056 # camel code, copywrite 2000 by Stephen B. Jenkins # The use of a camel image with the topic of Perl # is a trademark of O'Reilly & Associates, Inc. |
Hier komen dan drie kameeltjes te staan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #!/usr/bin/perl -s @x=qw/e n d/;if( $kg){$e=13;$_="setrand(@{[int((rand)*90)]}) ;K=vector(2,g,nextprime(random(10^$s)));e=$e;n=K[1]* K[2];d=e^-1%((K[1]-1)*(K[2]-1));";s/\s//sg;for( `echo "$_ e\nn\nd\n"|gp -q`){print$x[$j++] ,"=",`echo "10i16o$_ p"|dc`}exit}$t= unpack'H*',join'',<>;$l=length$n;$y =$e?$l-2:$l;$i="16dio";while (){$M= ($e&&1+int(rand 8)).(substr $t,$p ,$y or last);$i.="\U$M $k $n\E| pc";$p+=$y}for(reverse `echo "$i"|dc`){chop ;$d&&s/^(.)//||($_= sprintf"%0${l}s" ,$_); $f .=$_}# print pack 'H*' ,$f # RSA Encryption, Decryption and Key Generation with Perl/dc/gp. # Copyright (c) 1998-2000, Vipul Ved Prakash. |
Het RSA algoritme is in deze dolfijn gepropt
Het probleem is met name dat ik tegenwoordig vooral in talen programmeer die niemand kentwhoami: * whoami wacht nog altijd op code van mbravenboer.....
Ik heb echter nog wel een aardige. Het is eigenlijk een voorbeeld van een concept. De uitwerking die ik hier geef is erg verbose, maar ik ben met een nieuwe uitwerking bezig die dit probleem oplost. Wie kan uitleggen wat er hier gebeurt, waarom ik dit zo doe, en waarom ik dit fraai vind, krijgt een

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
| <?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- root --> <xsl:template match="/"> <java version="1.4.0" class="java.beans.XMLDecoder"> <xsl:apply-templates/> </java> </xsl:template> <!-- <xsl:template name="get-by-id"> <xsl:param name="item"/> <xsl:param name="id"/> --> <xsl:template match="participations"> <object class="java.util.ArrayList"> <xsl:for-each select="participation|unknown-participation"> <void method="add"> <xsl:apply-templates select="current()"/> </void> </xsl:for-each> </object> </xsl:template> <xsl:template name="series"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSeries"> <int> <xsl:value-of select="/participations/@series-ref"/> </int> </object> </xsl:template> <!-- participation --> <xsl:template match="unknown-participation"> <object class="org.mbravenboer.neko.domain.mem.MemSeriesParticipation"> <!-- rank & points --> <int> <xsl:value-of select="rank/text()"/> </int> <int> <xsl:value-of select="points/text()"/> </int> <!-- series --> <xsl:call-template name="series"/> <!-- sailor & sail --> <xsl:apply-templates select="sailor|unknown-sailor"/> <xsl:apply-templates select="sail|unknown-sail"/> <!-- race results --> <xsl:for-each select="race-results/race-result"> <void method="addRaceResult"> <xsl:apply-templates select="current()"/> </void> </xsl:for-each> </object> </xsl:template> <xsl:template match="participation"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSeriesParticipation"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> <!-- sailor --> <xsl:template match="unknown-sailor"> <object class="org.mbravenboer.neko.domain.mem.MemSailor"> <string> <xsl:value-of select="name/text()"/> </string> <xsl:apply-templates select="gender|unknown-gender"/> <xsl:apply-templates select="country|unknown-country"/> </object> </xsl:template> <xsl:template match="sailor"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSailor"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> <!-- gender --> <xsl:template match="unknown-gender"> <null/> </xsl:template> <xsl:template match="female"> <object class="org.mbravenboer.neko.domain.Gender" field="FEMALE"/> </xsl:template> <xsl:template match="male"> <object class="org.mbravenboer.neko.domain.Gender" field="MALE"/> </xsl:template> <!-- sail --> <xsl:template match="unknown-sail"> <object class="org.mbravenboer.neko.domain.mem.MemSail"> <int> <xsl:value-of select="number/text()"/> </int> <xsl:apply-templates select="country|unknown-country"/> <xsl:apply-templates select="sailor|unknown-sailor"/> </object> </xsl:template> <xsl:template match="sail"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getSail"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> <!-- country --> <xsl:template match="unknown-country"> <object class="org.mbravenboer.neko.domain.mem.MemCountry"> <null/> <string> <xsl:value-of select="abbr/text()"/> </string> </object> </xsl:template> <xsl:template match="country"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getCountry"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> <!-- race-result --> <xsl:template match="race-result"> <object class="org.mbravenboer.neko.domain.mem.MemRaceResult"> <!-- points --> <int> <xsl:value-of select="points/text()"/> </int> <!-- race & status --> <xsl:apply-templates select="race"/> <xsl:apply-templates select="status"/> <!-- series participation --> <null/> </object> </xsl:template> <!-- race --> <xsl:template match="race"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getRace"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> <!-- status --> <xsl:template match="status"> <object class="org.mbravenboer.neko.apps.input.xml.TransformationTools" method="getRaceResultStatus"> <int> <xsl:value-of select="@ref"/> </int> </object> </xsl:template> </xsl:transform> |
De input voldoet aan dit schema in RELAX NG compacte syntax:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| start = element participations { attribute series-ref { xsd:integer }, participation.class+ } ref.class = attribute ref { xsd:integer } # participation participation.class = element unknown-participation { sailor.class, sail.class, element points { xsd:integer }, element rank { xsd:integer }, element race-results { race-result.class* } } | element participation { ref.class } # sailor sailor.class = element unknown-sailor { country.class, element name { text }, gender.class } | element sailor { ref.class } # sail sail.class = element unknown-sail { sailor.class, country.class, element number { xsd:integer } } | element sail { ref.class } # country country.class = element unknown-country { element abbr { text } } | element country { ref.class } # gender gender.class = element unknown-gender { empty } | element male { empty } | element female { empty } # race-result race-result.class = element race-result { element race { ref.class }, element status { ref.class }, element points { xsd:integer } } |
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Verwijderd
huh leg eens uitRataplan schreef op 08 April 2003 @ 13:44:
Blijft briljant:
C:...berekent Pi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #define _ F-->00 || F-OO--; long F=00,OO=00; main(){F_OO();printf("%1.3f\n", 4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_ }
[...]
Ben benieuwd

je transformeert een xml document met uitslagen van een zeilwedstrijd in een xml document met een java programma.mbravenboer schreef op 11 April 2003 @ 10:01:
Ik heb echter nog wel een aardige. Het is eigenlijk een voorbeeld van een concept. De uitwerking die ik hier geef is erg verbose, maar ik ben met een nieuwe uitwerking bezig die dit probleem oplost. Wie kan uitleggen wat er hier gebeurt, waarom ik dit zo doe, en waarom ik dit fraai vind, krijgt een [afbeelding] onderscheiding.
(code)
je doet dit om willekeurige in java geschreven functies te kunnen gebruiken bij het transformeren van de gegevens in een uitvoerformaat.
waarom je dit fraai vindt is mij onduidelijk
de transformatielogica wordt verspreid over twee (of meer) bestanden.
als je weet wat de aan te roepen java code doet, is deze transformatie waarschijnlijk goed te begrijpen, maar overigens is het nogal lastig om niet direct te kunnen zien wat de transformatie doet (alhoewel een 'pure' xslt die hetzelfde doet vermoedelijk ook niet in één keer te overzien zou zijn
als je in je xslt bij elk geproduceerd stukje code zou vermelden wat de betreffende code doet, zou het denk ik wel een mooi abstractiemechanisme zijn
Pas de replâtrage, la structure est pourrie.
Aardige pogingApollo_Futurae: je transformeert een xml document met uitslagen van een zeilwedstrijd in een xml document met een java programma. Je doet dit om willekeurige in java geschreven functies te kunnen gebruiken bij het transformeren van de gegevens in een uitvoerformaat.
De XSL Transformatie transformeert een XML document met de uitslagen van wedstrijden van het Java Beans XML formaat. Het Java Beans XML formaat wordt gebruikt voor de long-persistance van Java Beans, maar het is in feite gewoon een representatie van Java objecten in XML. Ik transformeer dus een XML document naar een XML representatie van Java objecten. Deze objecten kunnen ingelezen worden door de Java Beans XML decoder.
De transformatie is een suggestie voor de aanpak van het inlezen van XML. Inlezen van XML is op dit moment nog een groot probleem. Er zijn verschillende oplossingen: interfaces naar een XML parser (SAX, DOM, Pull) gebruiken om zo in de programmeertaal de data te verwerken, of data binding oplossingen zoals JAXB toepassen om een klassen en de mapping naar die klassen te genereren vanuit een schema.waarom je dit fraai vindt is mij onduidelijk
De aanpak hierboven heeft als idee dat het inlezen van XML gezien kan worden als een transformatie van de in te lezen XML gebaseerde taal naar een Object taal, gebaseerd op XML. Door de mapping op deze manier te implementeren krijg je een compacte specificatie van de transformatie: als je dit met SAX/DOM zou gaan inlezen zou je veel meer code kwijt zijn en is de kans op bugs veel groter.
Het doel van de transformatie is dus niet de transformatie op zich (en daarin het gebruik van Java functies), maar het inlezen van XML.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Erg slim, bravenboer
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Exact!EfBe: In feite kun je dit dus in .NET doen door de xml te transformeren naar de format voor een SOAP geserialiseerde groep objects die je dan in 1 keer deserialized en zodoende meteen de data in handen hebt, ipv dat je de xml file zelf moet gaan parsen.
Ik hoop dat m'n afstudeerbegeleider en de programma commissie van het paper wat er aan komt dit ook vindenErg slim, bravenboer
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
het is bijzonder creatief bedacht, dat ten eerstembravenboer schreef op 11 April 2003 @ 16:53:
De transformatie is een suggestie voor de aanpak van het inlezen van XML. Inlezen van XML is op dit moment nog een groot probleem. Er zijn verschillende oplossingen: interfaces naar een XML parser (SAX, DOM, Pull) gebruiken om zo in de programmeertaal de data te verwerken, of data binding oplossingen zoals JAXB toepassen om een klassen en de mapping naar die klassen te genereren vanuit een schema.
De aanpak hierboven heeft als idee dat het inlezen van XML gezien kan worden als een transformatie van de in te lezen XML gebaseerde taal naar een Object taal, gebaseerd op XML. Door de mapping op deze manier te implementeren krijg je een compacte specificatie van de transformatie: als je dit met SAX/DOM zou gaan inlezen zou je veel meer code kwijt zijn en is de kans op bugs veel groter.
Het doel van de transformatie is dus niet de transformatie op zich (en daarin het gebruik van Java functies), maar het inlezen van XML.
maar ik begrijp niet dat deze extra tussenstap nodig is.
de enige taal die ik goed genoeg ken om hem in dit opzicht te kunnen beoordelen (haskell, je kent het denk ik wel
is dit in java zo slecht geregeld, dat deze omweg (een mooie omweg, dat wel) nodig is?
Pas de replâtrage, la structure est pourrie.
Verwijderd
/me wil daarme overigens niets afdoen aan het goede idee
Een voetnoot: de gegevens in de te verwerken XML file moet dan wel te mappen zijn op een object binnen je software. Vaak zul je zien dat een XML file een verzameling van gelijksoortige gegevens bevat, dus bijv niet 1 zeiluitslag maar een heel weekend van zeilwedstrijden. Je zult dan dus inderdaad ook een implementatie moeten maken voor een collectie van zinvolle dataobjecten die vanuit een XML formaat de de-serializen is.
Hier is is het dus XML+XSL -> Java Classes -> XML
Bij Ons is het ?Persitant DataSource? -> 'Data-Objects' (een methode) -> Persistant.
die data-objects kunnen dan heel eenvoudig in elke taal worden gebruikt .... Ik geef er grif aan toe dat op het moment die Data-Objects dan nog eens gemapped worden naar een Java Class maar alle extra info (wat voor type, validation rule, ...) word afzonderlijk bijgehouden... (die mapping is alleen omdat OJB het gemakkelijk maakt voor te save
Wel wist ik niet dat JavaBeans zo lekker naar XML konden weggeschreven...
edit:
neko? wat heeft en kat met dit alles te maken?
[ Voor 5% gewijzigd door hobbit_be op 11-04-2003 20:23 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| register n = (count + 7) / 8; /* count > 0 assumed */ switch (count % 8) { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while (--n > 0); } |
Zie uitleg
[ Voor 7% gewijzigd door PommeFritz op 12-04-2003 17:10 ]
FireFox - neem het web in eigen hand
Klopt, ik heb het weleens eerder aan mensen uitgelegd, maar helaas heb ik het nog steeds niet verwerkt in een publicatie.MrX: mbravenboer, is dat idee van jou niet al ontzettend oud?
Het mogen ook meedere objecten zijn, maar zelfs ook gewoon een verzameling (dat zie je hierboven gebeuren met java.util.ArrayList).de gegevens in de te verwerken XML file moet dan wel te mappen zijn op een object binnen je software.
Overigens komt de transformatie uit een concreet produkt:
http://europe.knwv.nl/statistieken/index.html
Het gaat met name om de verwerking van de XML in native data structuren. Parsen is op zich is niet zo'n punt: een DOM representatie krijgen van een XML bestand is natuurlijk een fluitje van een cent. Maar wat daarna? Verder werken met de DOM is een optie, maar geen aantrekkelijke. Zowel niet in Haskell als in Java/C#/Python.Apollo_Futurae: maar ik begrijp niet dat deze extra tussenstap nodig is. de enige taal die ik goed genoeg ken om hem in dit opzicht te kunnen beoordelen (haskell, je kent het denk ik wel ) is prima in staat om XML te parsen, in aanzienlijk minder regels dan een xslt met dezelfde werking.
Wat je op dit moment veel ziet is dat er een mapping geimplementeerd wordt naar native data typen. Deze mapping kan je genereren (JAXB, Castor, Dtd2Haskell), maar het probleem daarvan is dat de native data structuren dan nog steeds erg veel lijken op het XML formaat. Er kan bij zo'n gegenereerde mapping ook bijna geen data genegeerd worden, iets wat je wel vaak wilt.
Een handmatige implementatie kost veel werk in een verbose taal als Java/C#. Ik ben het volstrekt met je eens dat dit in Haskell als veel compacter en duidelijker kan. Je zou de transformatie daarom ook het beste kunnen vergelijken met een in Haskell/Stratego/XSLT/XDuce geimplementeerde mapping. Je moet altijd een mapping implementeren en dat wil je ze compact en duidelijk mogelijk doen. Java/C# zijn hiervoor geen geschikte oplossing, XML transformatie talen zijn daarvoor wel een goede oplossing.
Idd, dit is ook slechts 1 mogelijke uitwerking van het idee. Andere mogelijke uitwerkingen zijn andere transformatie talen (Stratego), directe compilatie naar Java code, compilatie van XSLT naar Java code, gebruik van concrete syntax enz enz.hobbit_be: persoonlijk vind ik xsl nog altijd een verschrikking voor performance
Het belangrijkste aspect is de vrijheid: met systemen als JAXB zal het nooit echt lekker aan gaan voelen omdat je klasse structuren te dicht bij de XML liggen en vaak gegenereerd worden. Met het transformatie systeem wat ik voorstel heb je volledige vrijheid om de mapping zo gek te maken als je maar wilt, terwijl je toch nog een (relatief) compacte specificatie over houdt. De XSLT oplossing kan nog veel mooier: XSLT is van zichzelf al verbose en met het gebruik van concrete syntax kan je nog veel gaan oplossen wat betreft het XML formaat voor Java objecten ...
"en kat"neko? wat heeft en kat met dit alles te maken?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
hmm vind ik wel een interssant punt - verwijs je hier nu eigenlijk naar het gebruik van een 'functie' of method op die dom structuur? XPath is een toch al tamelijk mooie eenvoudig structuur. Een soort van functie taal die je kun toepassen op xml zou wel leuk zijn, maar dat is dan de toch iets te ingewikkelde xsl. Soms heb ik het gevoel dat XML teveel wordt toegepast terwijl het eigenlijk ook wel 'lekker' is. Helaas is XML nog steeds te hierarchisch en kan bepaalde dingen niet voorstellen (daar zal XLink wel mee helpen). Een holy grail bestaat vast niet - wie zei ook alweer dat je aan een programmeur een job geeft met een bepaald probleem hij na een paar weken terugkomt met een taal om het op te lossen zonder het eigenlijk te implementerenmbravenboer schreef op 11 April 2003 @ 21:18:
Verder werken met de DOM is een optie, maar geen aantrekkelijke. Zowel niet in Haskell als in Java/C#/Python
Oh die 'Neko' = Kat in Japans..
Dat noem ik nu eens geen voorbeeld van fraaie code.PommeFritz schreef op 11 April 2003 @ 20:32:
Ik mis nog DUFF'S DEVICE:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 register n = (count + 7) / 8; /* count > 0 assumed */ switch (count % 8) { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while (--n > 0); }
Zie uitleg
Dit zou imo eerder thuishoren in dat ander topic, over slechte code.
https://fgheysels.github.io/
XPath is aardig om knopen te vinden en is ook zeker een goede tool om data uit een DOM te halen, maar het is geen volledige oplossing. Je moet de conversie nog steeds zelfs implementeren in een imperatieve tool. XPath helpt alleen met het zoeken naar de juiste data.hobbit_be: verwijs je hier nu eigenlijk naar het gebruik van een 'functie' of method op die dom structuur? XPath is een toch al tamelijk mooie eenvoudig structuur.
XSLT is een transformatie taal voor XML. Ik begrijp niet waarom mensen zo snel beginnen te klagen als je een keer een lastige transformatie wilt schrijven in XSLT. Je moet niet buiten het terrein van XML transformaties gaan, dat is de enige beperking. In de aanpak hierboven staat het idee centraal dat je het inlezen van XML als een XML transformatie kan zien. Daar pak je dan toch een taal voor waarin je XML fraai kan transformeren? XSLT ligt dan voor de hand net zoals een oplossing met XDuce, Haskell of Stratego mogelijk is.Een soort van functie taal die je kun toepassen op xml zou wel leuk zijn, maar dat is dan de toch iets te ingewikkelde xsl.
XML kan niet genoeg toegepast worden, althans: de uitwisseling van gestructureerde data tussen software onderdelen kan niet genoeg toegepast worden. Het kan lekkerder dan XML, maar XML is al erg lekker. Overal waar data uitgewisseld moet worden, zou dit op een gestructureerde manier moeten gebeuren om zo samenwerking beter mogelijk te maken.Soms heb ik het gevoel dat XML teveel wordt toegepast terwijl het eigenlijk ook wel 'lekker' is.
Te hierarchischHelaas is XML nog steeds te hierarchisch en kan bepaalde dingen niet voorstellen
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
iddmbravenboer schreef op 12 April 2003 @ 14:55:
Te hierarchischXML gaat over de uitwisseling van gestructureerde boom-achtige data. Ik zou niet weten hoe dat ooit te hierachisch kan zijn
.
in ieder geval wel kan doorgeven wat dan wel mooi is. Ik haal hier een voorbeeld van webdesign aan. Die gast gaat en image doorgeven met xml - das allemaal wel mooi maar zijn file was 300KB groot waartegen het ook in 10KB kon.
Weet jij toevallig of er een binaire vorm van XML bestaat? ie niets anders dat pure parsed XML? Maar dan als standaard. Dat dit niet te lezen valt is natuurlijk zo maar 1 generieke notepad / parser en die problemen zijn weg. Kun je er ook ineens Security bijzetten en Meta Data... Iedereen kan dit maken maar ik vroeg me ad of er een standaard voor was... Heeft super veel voordelen: snel (parsing is 'dumb' -> geen nood aan echt gezoek), klein (zip kan er bijvoorbeeld standaard op, elements kunnen met ID's vervangen worden, data hoeft niet Encoded/Decoded te worden) en een API is al de DOM zelf... In den begin tijde van XML had ik er wel van gehoord maar nu kom ik het niet meer tegen...
Hm misschien heb je wel gelijk. Maar ik vind het een geniaal gebruik van de ANSI-C definitie van een switch statement (dat het in feite gewoon labels zijn...)whoami schreef op 12 April 2003 @ 13:49:
Dat noem ik nu eens geen voorbeeld van fraaie code.
Dit zou imo eerder thuishoren in dat ander topic, over slechte code.
FireFox - neem het web in eigen hand
Paul Graham in The Hundred-Year Language (je hebt vast geen tijd om het te lezen nu, dus stop hem in je bookmarksDie gast gaat en image doorgeven met xml - das allemaal wel mooi maar zijn file was 300KB groot waartegen het ook in 10KB kon.
Idd. Er is geen standaard voor een binaire (compacte) uitwisselingsvorm van XML. Er zijn echter wel veel ideeen (en uitwerkingen) in die richting. Ik acht de kans echter niet erg groot dat er binnen afzienbare tijd een standaard voor XML zal komen.Weet jij toevallig of er een binaire vorm van XML bestaat? Maar dan als standaard. Dat dit niet te lezen valt is natuurlijk zo maar 1 generieke notepad / parser en die problemen zijn weg.
Alternatieven voor XML laten de mogelijkheden al zien. Het ATerm formaat bevat een aantal zaken die je wilt hebben in een formaat zoals XML: meerdere external formaten (binary en tekst), meer structuur in de vorm van lijsten, tuples, onderscheid tussen integers en tekst, en last but not least, gestructureerde annotaties (attributen). Met name dit laatste is ook een populair punt van discussie op XML mailing lijsten.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment