[alg] fraaiste prog voorbeelden.

Pagina: 1 2 Laatste
Acties:
  • 1.152 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-09 07:50

momania

iPhone 30! Bam!

Ik heb ooit nog eens een query van ongekende lengte (ben er zelf iig wel trots op :) )
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.

SQL:
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*


Acties:
  • 0 Henk 'm!

Verwijderd

JonkieXL 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]
Maar minder generiek ;)

[ Voor 86% gewijzigd door Verwijderd op 08-04-2003 15:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Mooi geneste code is niet lelijk.
Java:
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 ;)

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Eerlijk gezegd vind ik niets fraais aan lange SQL's of grote lappen code.

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]

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 08 April 2003 @ 15:22:
Mooi geneste code is niet lelijk.
Mooi geneste code idd niet ;)

Dit ding moet je gewoon opsplitsen in een aantal methodes. Ik kom zelden meer dan 2 nivo`s diep.

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Wat ik toch een van de mooiste stukjes code vind is RSA decryptie en encryptie in drie regels Perl:
Perl:
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 ]


Acties:
  • 0 Henk 'm!

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

ik moet zeggen;
verrektes interresant topic
ik ben nog een beginnende php'er (ja zo'n doxa dude :))
maar wil 't wel echt leren, hier vind je toch toch de uitleg (soms) om toch 't .'je op de I te zetten ;)

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


Acties:
  • 0 Henk 'm!

  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 16:42
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 O-)
Da's toch een doodgewone 'bubble sort' :)
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

InZane 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..
Bubblesort? Dan vraag ik me toch af wat die recursieve aanroep in z'n code doet ;)

"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


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Mijn LR(k) parser. :P Parst mbv een action/goto table tokenstreams. action/goto tables zijn gegenereerd met eigen parser generator. Layout is erg breed, sue me ;)

De parser generator bevat ook veel leuke routines, maar om die allemaal te posten wordt wat veel ;)

Java:
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


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
riezebosch 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 O-)
Lijkt wel erg op de quicksort van Sedgewick

[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


Acties:
  • 0 Henk 'm!

  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Varienaja 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]
Ja, die is inderdaad erg mooi. En het mooiste is nog dat je dit letterlijk in Haskell kan intikken en dan werkt het :o
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!


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 19:38
Scarecrow 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 :)
Zo, stuk netter :P

|>


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
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 :o
Haskell? WTF is Haskell? Een erg mooi functioneel taaltje: www.haskell.org Met gratis interpreter.
[insectensex]

in haskell moet het net even anders:
Haskell:
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:
Haskell:
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:
Haskell:
1
priemGetallen = filter (\p -> [f | f <- [1..p], p `mod` f == 0] == [1,p]) [1..]

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik zit me zo nu en dan af te vragen of ik wel in het juiste topic zit! ;)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
Ik vraag me af of er wel mensen zijn die uberhaupt al die lappen code doornemen. :o

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
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! ;)
Als ik me niet vergis, hebben we nog geen code van jou gezien. ;) :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

10 print "Alarmnummer is cool"
20 goto 10

:P

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

* ACM denkt dat er een af en toe 'mooi' met 'knap' verward wordt :+

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? :P

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dit is trouwens ook nog een heel leuk stukje code:

code:
1
2
3
record List<Alpha>{
    List<List<Alpha>> _field;
}


En nou maar hopen dat alles een beetje lui is ;)

Acties:
  • 0 Henk 'm!

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 16:23
wat ik niet snap is dat mensen soms hun variabele _ voorzetten. Waarom eigenlijk?? Ik zie dat bij alarmnummer en bij whoami stukjes code :)

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Volgens mij om aan te geven dat een variabele een private oftewel een member variabele van een class is. Ik gebruik zelf altijd de m_ prefix

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Wat ik zelf wel aardig gevonden vind en in de praktijk ook best nuttig is een enumerator die filtert op bepaalde waardes. Dit betekent dat een client-programmere van je library zeer gemakkelijk door 'verschillende' lijsten kan enumeraten, terwijl deze in feite in 1 lijst staan (en hierdoor de integriteit wordt bewaard en de rest van het programma veel simpeler werkt)

De onderstaande code is eigenlijk in C# geschreven, maar de C# tag ondersteunt geen syntax-coloring :'(
Java:
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
Java:
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'

Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
Afleiding door ir W.H.J. Feijen _/-\o_
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 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
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 :)
Ik doe dat gewoon om aan te geven dat een variabele een member-variabele (of field) is van die class.
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/


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
persoonlijk was ik hier wel blij mee: (bepaalt adhv een gegeven int value voor unix-style bestandspermissies of een HTML checkbox al dan niet "CHECKED" moet zijn, en de juiste "caption" bij de checkboxes zet. ja nee het gaat "nergens" over, maar IK was er blij mee :P

PHP:
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;     
        }
    }
}

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
Ik heb hier ook nog ergens een UML liggen van een errorlogger waar ik een aantal maanden geleden mee bezig was. Het bijhorende topic kan je hier ook nog wel vinden.

Afbeeldingslocatie: http://users.pandora.be/fgzone/schema5.jpg

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:28

Robtimus

me Robtimus no like you

marcelk schreef op 08 April 2003 @ 20:17:
Afleiding door ir W.H.J. Feijen _/-\o_
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.
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 zo :)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Ik vind react wel een mooi framework. Maar dat ga ik niet posten hier :P

Ook de RML parser zullen jullie moeten ontberen :+ zo ook de Disector en de xml-output generator.

Saai he? :+

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
Hoe kan dat nu chem. :?
Hoe kan je nu PHP rijmen met 'fraaie code'? :+

tot zover deze flame

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

whoami 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
Fraaie code is wat anders dan een degelijk framework. Alhoewel natuurlijk sterk gerelateerd :)

De mooiste oplossingen kunnen helaas niet in PHP.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
Waar blijft de topicstarter trouwens met zijn voorbeelden? :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Wie komt er met een functie die voor elke preconditie, elke mogelijke postcoditie realiseerd? ;)

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
IceManX 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 :)
Bij mij op de TU/e ook ;) . Ik moest alleen effe snel een URL neerzetten. Het klopt inderdaad dat Feijen dat spul produceert als ware het proza ;) , kort en bondig.

offtopic:
IceManX, heb je nu ook Multiprogramming ?

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:28

Robtimus

me Robtimus no like you

marcelk schreef op 08 April 2003 @ 23:18:
offtopic:
IceManX, heb je nu ook Multiprogramming ?
offtopic:
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


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:05

crisp

Devver

Pixelated

Uiteraard ben ik trots op de code waarmee ik deze contest (zo goed als) gewonnen heb. Is iets teveel code om hier te plaatsen, maar de laatste versie (inclusief nog wat verbeteringen tov de originele ingezonden code) is hier te vinden.
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):

JavaScript:
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


Acties:
  • 0 Henk 'm!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Stukje om bit 0 met 15 te wisselen, 1 met 14, 2 met 13 enz...
code:
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


Acties:
  • 0 Henk 'm!

Verwijderd

wisseltruukjes zijn ook leuk ja, bijvoorbeeld de waardes van 2 vars omwisselen zonder de declaratie van een derde:
code:
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

Acties:
  • 0 Henk 'm!

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 16:52
Dit zijn twee stored procedures die handig zijn voor sql tree structuren.
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
SQL:
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
SQL:
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 :D

Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
Sinds ik het 'Nested Set model' ken om trees in een dbms op te slaan, maak ik bijna nooit meer gebruik van het 'Adjacency model'.
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.

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Sjaaky: dat is een structuur ooit bedacht door Joe Celko, een van de SQL-standaardisatie commissieleden. Hij heeft dit uitgebreid uitgelegd in de sql newsgroups. Het is inderdaad een zeer slimme vondst die goed de kracht van sql benut (set based).

(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


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10:39
[...]

Da's toch een doodgewone 'bubble sort' :)
Een iets minder efficiente manier van sorteren, maar werkt verder wel oke..
Bedankt voor het compliment dat je de routine er net zo eenvoudig uit vindt (?) zien als een bubblesort ;) Okok, 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...

[ 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


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 17-09 21:27

pistole

Frutter

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 bubblesort ;) Okok, 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 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! ;)

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 21:53

Tux

chem schreef op 08 April 2003 @ 21:14:
Ik vind react wel een mooi framework. Maar dat ga ik niet posten hier :P

Ook de RML parser zullen jullie moeten ontberen :+ zo ook de Disector en de xml-output generator.

Saai he? :+
De RML parser is volgens mij qua source ook zo lang dat PHP bij het weergeven van het topic dan spontaan time-outs geeft :+

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
* whoami wacht nog altijd op code van mbravenboer..... :+

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

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.
whoami schreef op 10 April 2003 @ 21:32:
* whoami wacht nog altijd op code van mbravenboer..... :+
Hum >:)

Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:00

Tomatoman

Fulltime prutser

Niet geniaal, niet bijzonder prachtig, maar wel een nuttig (en herbruikbaar!) resultaat met weinig regels code:
Delphi:
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.


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

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 :P

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
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());
         }
      }
   }
}
Ik heb er dagen aan gesleuteld, om het zo te krijgen. Elke functie, elk object, elke structure, elke enum en elke constante die aangeroepen wordt zit in mijn framework en is zelf geschreven.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
hmm hier is iets dat ik ooit eens tijdens het werk heb gedaan, tussen de soep en de patatten so to speak - toen nog in Excel 97 zie ik net, Een nuttig gebruik voor een spreadsheet imho.

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 ]


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

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 :P
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.

Java:
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.

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 19:14
Dit gaat meer naar de kant van mongers. Hier heb je er één van:
code:
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 :P.

code:
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 :D.

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • himlims_
  • Registratie: Juni 2000
  • Niet online

himlims_

🐧 Linux HOoligan

ZeRoXcOoL: ik vind 't maar verrektes onoverzichtelijk, maar wel 'mooi' gedaan :+)

⭐Game Profiles: 🕹️Steam - 🎮PSN - 🇪🇦 GoT_Hollandhards


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
whoami: * whoami wacht nog altijd op code van mbravenboer..... :+
Het probleem is met name dat ik tegenwoordig vooral in talen programmeer die niemand kent :o . M'n oude Java zooi zie ik niet meer als fraai, dus die post ik in ieder geval niet ;) . Ik kan wel Stratego code gaan posten, maar als dat toch niet echt overkomt heeft het niet zoveel nut ...

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 Afbeeldingslocatie: http://www.mbravenboer.org/images/valid-xml.gif onderscheiding.

XML:
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:

code:
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


Acties:
  • 0 Henk 'm!

Verwijderd

Rataplan schreef op 08 April 2003 @ 13:44:
Blijft briljant:
C:
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()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_-_
            _-_-_-_
}
...berekent Pi.
[...]
Ben benieuwd ;)
huh leg eens uit :? |:(

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
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 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.
waarom je dit fraai vindt is mij onduidelijk >:) (sorry, ben een beetje melig :p).
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 :9.

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Apollo_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.
Aardige poging ;) . Ik zal het maar uitleggen, want ik vermoed dat er niet veel strijd zal ontstaan over de juiste werking ;) .

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.
waarom je dit fraai vindt is mij onduidelijk >:)
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.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
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.

Erg slim, bravenboer :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
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.
Exact!
Erg slim, bravenboer :)
Ik hoop dat m'n afstudeerbegeleider en de programma commissie van het paper wat er aan komt dit ook vinden ;) . Het is een klein, maar grappig, onderdeel van m'n afstudeerwerk.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
mbravenboer 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.
het is bijzonder creatief bedacht, dat ten eerste _/-\o_ !
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.
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.


Acties:
  • 0 Henk 'm!

Verwijderd

mbravenboer, is dat idee van jou niet al ontzettend oud? Ik kan me herinneren dat je weleens eerder zoiets gepost had hier of anders op Javahova, of een discussie erover had gehad in de tijd dat Arien en Tomato hier nog regelmatig posten?
/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.

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
doet me een beetje denken aan OJB waar ik nu mee bezig ben - gek genoeg vind het ik inlezen naar class objecten veel te oriented naar de taal toe - vandaar dat ik mijn huidige app een heel losse approach heb van 'objecten' (kun je voorstellen als XML-elements, maar ook als een Field in een table , of zelfs een tabel). Maakt niet uit ... persoonlijk vind ik xsl nog altijd een verschrikking voor performance (we gebruiken Cocoon voor de webpages - en dat is enorm traag vind ik) Wel mooi , misschien te mooi voor praktisch te zijn... JXPath vind ik dan wel mooi als losse omgeving voor data-managment.

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 ]


Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

Ik mis nog DUFF'S DEVICE:

C:
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


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
MrX: mbravenboer, is dat idee van jou niet al ontzettend oud?
Klopt, ik heb het weleens eerder aan mensen uitgelegd, maar helaas heb ik het nog steeds niet verwerkt in een publicatie.
de gegevens in de te verwerken XML file moet dan wel te mappen zijn op een object binnen je software.
Het mogen ook meedere objecten zijn, maar zelfs ook gewoon een verzameling (dat zie je hierboven gebeuren met java.util.ArrayList).

Overigens komt de transformatie uit een concreet produkt:
http://europe.knwv.nl/statistieken/index.html
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.
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.

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.
hobbit_be: persoonlijk vind ik xsl nog altijd een verschrikking voor performance
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.

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 ...
neko? wat heeft en kat met dit alles te maken?
"en kat" :?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Alarmnummer schreef op 08 April 2003 @ 18:48:
112 print "Alarmnummer is cool"
999 goto 112

:P
:*)

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
mbravenboer 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
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 implementeren ;)

Oh die 'Neko' = Kat in Japans..

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:26
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
Dat noem ik nu eens geen voorbeeld van fraaie code.
Dit zou imo eerder thuishoren in dat ander topic, over slechte code. :)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
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.
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.
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.
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.
Soms heb ik het gevoel dat XML teveel wordt toegepast terwijl het eigenlijk ook wel 'lekker' is.
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.
Helaas is XML nog steeds te hierarchisch en kan bepaalde dingen niet voorstellen
Te hierarchisch :? XML gaat over de uitwisseling van gestructureerde boom-achtige data. Ik zou niet weten hoe dat ooit te hierachisch kan zijn ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
effe snel tussendoor - looming deadline...
mbravenboer schreef op 12 April 2003 @ 14:55:
Te hierarchisch :? XML gaat over de uitwisseling van gestructureerde boom-achtige data. Ik zou niet weten hoe dat ooit te hierachisch kan zijn ;) .
idd :) het probleem zit het dat sommige data helemaal niet hierachish is. Ik heb het dan zoals een web - structuur of recursive gevallen. Zo'n 'stoten' zijn vooral goed voor hergebruik. Ook 'rechte' ie tabel data vind ik erg rot om door te sturen - wordt zo'n grote bloat (NS helpen wel, maar toch). Wel is het zo dat je het laatste
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...

Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

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. :)
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...)

FireFox - neem het web in eigen hand


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Die gast gaat en image doorgeven met xml - das allemaal wel mooi maar zijn file was 300KB groot waartegen het ook in 10KB kon.
Paul Graham in The Hundred-Year Language (je hebt vast geen tijd om het te lezen nu, dus stop hem in je bookmarks ;) ).
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.
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.

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


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

code:
1
2
3
10 DO
20   PRINT "AlarmNummer is een pruts0r"
30 LOOP WHILE 1=1

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

dusty schreef op 12 April 2003 @ 17:56:
code:
1
2
3
10 DO
20   PRINT "AlarmNummer is een pruts0r"
30 LOOP WHILE 1=1
Lukt het je ook nog om dat te onderbouwen? Of is al je creativiteit hier al in komen te zitten ;)

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

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.
Ja, Nu wordt in onder andere SOAP base64 encoding gebruikt voor het meesturen van attachments/binaire data; betekend toch dat de xml twee/drie keer zo groot wordt dan orginele binaire bestand :(

Dat is dan niet bij dat nieuwe formaat?!?!

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
{offtopic / ontopic regarding binary xml}

zullen we samen es een commisie oprichten? zo moeilijk is dat formaat ECHT niet :) kan men
in een dagje implementeren... 'gat in de markt'?

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Alarmnummer schreef op 12 april 2003 @ 18:31:
[...]


Lukt het je ook nog om dat te onderbouwen? Of is al je creativiteit hier al in komen te zitten ;)
Zelfde functionaliteit, minimale bytes die extra worden verbruikt t.o.v. jouw code echter wordt er geen jump gebruikt waardoor je wiskundig kan aantonen dat het programma precies doet wat het hoort te doen, met jouw methode kan je alleen aantonen met benadering dat je programma doet wat het hoort ( dus kan je niet 100% wiskundig bevestigen dat je programma exact doet wat het hoort te doen.)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
dusty schreef op 13 april 2003 @ 13:21:
Zelfde functionaliteit, minimale bytes die extra worden verbruikt t.o.v. jouw code echter wordt er geen jump gebruikt waardoor je wiskundig kan aantonen dat het programma precies doet wat het hoort te doen, met jouw methode kan je alleen aantonen met benadering dat je programma doet wat het hoort ( dus kan je niet 100% wiskundig bevestigen dat je programma exact doet wat het hoort te doen.)
Nerd ;)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

Verwijderd

/me *

ik ben de afgelopen dagen bezig geweest met colourspace conversion routines voor een media library waar ik al enkele jaren aan werk. Hierbij moet je denken aan conversies tussen RGB (datgene waar je beeldscherm is opgebouwd) - packed, YUV/Y'Cb'Cr (vwordt veel voor video gebruikt) - zowel packed als planar, eventueel later uitbreidbaar met CMYK (wordt soms in de graphics industrie gebruikt). Het lullige is dat er werkelijk tig van die formaten zijn, waarbij je zelfs als je alleen de meest standaard formaten in beschouwing neemt, je al op meer dan tien formaten komt (YUV9 (bv. Sorensen), YUY2 (bv. MJPEG), I420 (bv. MPEG), IYU2 (professioneel, non-subsampled), RGB-32/24/16/15 BE/LE (alle native RGB formaten). Oftewel, een any-to-any convertor moet generieke routines hebben (en daarnaast gespecialiseerde routines voor conversies die vaak voorkomen). Zeker als je later ook de meer gespecialiseerde formaten zoals Y41P, YVU9, UYVY, YVYU e.d. wilt supporten. Voor gedetailleerde informatie over elk van deze formaten, zie http://www.fourcc.org/.

Kortgezegd, het verschil tussen deze formaten zit in het volgende:
• planar of packed - planar betekent dat eerst alle componenten van het ene type komen, dan alle componenten van de andere. Bij packed komen ze door elkaar heen in groepen (GOPCs, Group Of Pixel Component, als variant op de MPEG GOP (Group Of Pictures)).
• component subsampling - bij YUV9 komen bijvoorbeeld voor elke 4x4 Ys slechts 1 U en V component. Het formaat heet dan ook alternatief "YUV-4:1:0 planar". Je hebt ook YUV-4:1:1 planar (Y41B), waarbij alleen horizontaal 4x gesubsampled is.
• component bitdepth - RGB16 heeft bijvoorbeeld 5 Red/Blue bits en 6 Green bits, terwijl RGBA32 er 8 heeft voor elk, plus nog 8 voor alpha.

Ik moet nu dus routines schrijven om dit alles te kunnen zonder specifiek een formaat te bschrijven. Nu zal ik niet alle code hier neerpoten, maar eentje kon ik jullie toch niet onthouden. Ik heb - in plaats van per-formaat - een per-type conversie schema gemaakt. Hiervoor heb ik slechts 9 functies nodig, omdat ik slechts 3 formaat types heb (YUV-planar, YUV-packed en RGB-packed). Hieronder volgt, bij wijze van voorbeeld, de RGB-to-RGB routine, incl. structures en pre-defined datatypes. Code is nog niet getest overigens, dus misschien zit er een schandalige fout in, maar dat zien we later wel weer. 7(8)7.

Even wat algemene info over RGB: RGB is niet byte aligned, en de endianness staat niet vast. Dat maakt 't een enorm irritant formaat, omdat de eigenlijke byte layout (in een array van unsigned char's) dus omgekeerd kan zijn dan zoals 't eigenlijk hoort. RGB15 ziet er bv zo uit in LE: GGGBBBBBxRRRRRGG. Toevalligerwijs is dit per ongeluk niet zo bij RGB24/32, omdat de components dan elk 8-bit zijn, maar omdat je in de toekomst ook extendible wil zijn naar de bestaande 10-bit formaten en de opkomende 16-bit formaten (oh, the horror - dan krijg je dus per-component endianness issues als je binary gaat lezen :X), lezen we alles toch maar in via conversie naar de host endianness order. Hierna halen we via een on-the-fly gecreeerde colour mask de kleurcomponent eruit die we willen hebben en die resamplen we, waarna we hem weer terug omzetten naar de benodigde endianness (niet per se host endianness).

Ohja, de functie declaraties staan al vast, omdat dat nou eenmaal zo in de colourspace conversion routine library is vastgelegd, dat kan ik ook niet helpen... De code hieronder is trouwens samengeplompt tussen verschillende source en header files, in 't echt staat al dit gewoon over meerdere filetjes uitgetypt. :). Last but not least, code is licensed under LGPL en (c) ikke. ;).

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
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
#define LCS_MAX_PLANES 4

/* RGB array order */
#define LCS_R   0
#define LCS_G   1
#define LCS_B   2
#define LCS_A   3
#define LCS_RGB_COMPONENTS 4

typedef enum {
  /* planar YUV */
  LCS_FORMAT_YUV_PLANAR = 0,

  /* packed YUV */
  LCS_FORMAT_YUV_PACKED = 1,

  /* packed RGB */
  LCS_FORMAT_RGB_PACKED = 2
} LCSFormatType;

typedef struct _LCSFormat {
  /* format type */
  LCSFormatType type;

  /* bits per pixel, total */
  unsigned int bits_per_pixel;
} LCSFormat;

typedef struct _LCSRGBPackedFormat {
  LCSFormat parent;

  /* position of component (in given endianness) */
  unsigned int component_bit_offset[LCS_RGB_COMPONENTS],
               bits_per_component[LCS_RGB_COMPONENTS];

  /* endianness */
  LCSEndianness endianness;
} LCSRGBPackedFormat;

/*
 * routines for reading/writing RGB bytes to/from host endianness
 */

static inline void
lcs_fallback_rgb_read_pixel (const unsigned char *buf,
                 unsigned long long  *num,
                 unsigned long        size,
                 LCSEndianness        endianness)
{
  /* move one pixel internally into our own byte order,
   * so that the pixel is in the lowest bytes of the integer */
  if (endianness == LCS_BYTE_ORDER) {
#if (LCS_BYTE_ORDER == LCS_BIG_ENDIAN)
    memcpy (((unsigned char *) num) + sizeof (*num) - size, buf, size);
#else
    memcpy (num, buf, size);
#endif
  } else {
    unsigned int n;
    *num = 0;
    for (n = 0; n < size; n++) {
#if (LCS_BYTE_ORDER == LCS_BIG_ENDIAN)
      /* first byte is highest */
      *num |= buf[n] << ((size - 1 - n) * 8);
#else
      /* first byte is lowest */
      *num |= buf[n] << (n * 8);
#endif
    }
  }
}

static inline void
lcs_fallback_rgb_write_pixel (unsigned char            *buf,
                  const unsigned long long  num,
                  unsigned long             size,
                  LCSEndianness             endianness)
{
  /* move one host-byte-order pixel into the requested byte order */
  if (endianness == LCS_BYTE_ORDER) {
#if (LCS_BYTE_ORDER == LCS_BIG_ENDIAN)
    memcpy (buf, ((const unsigned char *) &num) + sizeof (num) - size, size);
#else
    memcpy (buf, num, size);
#endif
  } else {
    unsigned int n;
    for (n = 0; n < size; n++) {
#if (LCS_BYTE_ORDER == LCS_BIG_ENDIAN)
      /* first byte is highest */
      buf[n] = (num >> ((size - 1 - n) * 8)) & 0xff;
#else
      /* first byte is lowest */
      buf[n] = (num >> (size * 8)) & 0xff;
#endif
    }
  }
}

/*
 * extract a component from a RGB pixel
 */

static inline unsigned int
lcs_fallback_rgb_pixel_extract_component (unsigned long long rgb_pixel,
                      unsigned int       bit_size,
                      unsigned int       bit_offset)
{
  return (rgb_pixel >> bit_offset) & ((1 << bit_size) - 1);
}

/*
 * resample a RGB pixel component
 */

static inline unsigned int
lcs_fallback_rgb_pixel_resample_component (unsigned int component,
                       unsigned int from_bitsize,
                       unsigned int to_bitsize)
{
  if (from_bitsize >= to_bitsize) {
    /* Bitshifting. We lose significance but that's the whole
     * point of downsampling so it doesn't matter. */
    return component >> (from_bitsize - to_bitsize);
  } else {
    /* simple bit-shifting isn't enough, we'll loose the lowest
     * bits then, which means that 0xff would become 0xff00 instead
     * of 0xffff. So we multiply. There's still a rounding error,
     * but we don't care. */
    return (component * ((1 << to_bitsize) - 1)) / ((1 << from_bitsize) - 1);
  }
}

/*
 * put a component back into a pixel
 */

static inline unsigned long long
lcs_fallback_rgb_pixel_insert_component (unsigned int component,
                     unsigned int bit_size,
                     unsigned int bit_offset)
{
  return (component & ((1 << bit_size) - 1)) << bit_offset;
}

LCSResult
lcs_fallback_rgbpacked_to_rgbpacked_wrap_c (LCSConverter        *converter,
                        const unsigned char *src[LCS_MAX_PLANES],
                        unsigned char       *dest[LCS_MAX_PLANES],
                        const unsigned int   src_stride[LCS_MAX_PLANES],
                        const unsigned int   dest_stride[LCS_MAX_PLANES],
                        unsigned int         width,
                        unsigned int         height)
{
  LCSRGBPackedFormat *src_fmt, *dest_fmt;
  unsigned int x, y, n;
  const unsigned char *src_row;
  unsigned char *dest_row;
  unsigned long long src_pixel, dest_pixel;
  unsigned long src_bytes, dest_bytes;

  /* format shortcuts */
  src_fmt  = (LCSRGBPackedFormat *) lcs_converter_get_src_format (converter);
  dest_fmt = (LCSRGBPackedFormat *) lcs_converter_get_dest_format (converter);
  src_bytes  = ((LCSFormat *) src_fmt)->bits_per_pixel >> 3;
  dest_bytes = ((LCSFormat *) dest_fmt)->bits_per_pixel >> 3;

  for (y = 0; y < height; y++) {
    /* set our own position within */
    src_row  = &src[0][y * src_stride[0]];
    dest_row = &dest[0][y * dest_stride[0]];

    for (x = 0; x < width; x++) {
      lcs_fallback_rgb_read_pixel (&src_row[src_bytes * x],
                   &src_pixel, src_bytes,
                   src_fmt->endianness);

      /* some explanation on the routine below...
       * We're going to isolate the four pixel components,
       * R/G/B/A. First, we'll shift these to the left (so that
       * they become elementary, with their components' LSB
       * being 1). Then, we create a mask based on their BPC
       * and apply it to this value. We now have the component's
       * individual value.
       * Next, we change the BPC of this (by shifting it to the
       * left/right), so that we're now working in the dest_fmt's
       * BPC count, and shift this to the left of its offset
       * in the dest format. And if we do this for all R/G/B/A
       * together, we've converted one pixel!
       */
      dest_pixel = 0;
      for (n = 0; n < LCS_RGB_COMPONENTS; n++) {
        dest_pixel |= lcs_fallback_rgb_pixel_insert_component (
              lcs_fallback_rgb_pixel_resample_component (
                  lcs_fallback_rgb_pixel_extract_component (
                  src_pixel,
                  src_fmt->bits_per_component[n],
                  src_fmt->component_bit_offset[n]),
                  src_fmt->bits_per_component[n],
                  dest_fmt->bits_per_component[n]),
              dest_fmt->bits_per_component[n],
              dest_fmt->component_bit_offset[n]);
      }

      lcs_fallback_rgb_write_pixel (&dest_row[dest_bytes * x],
                    dest_pixel, dest_bytes,
                    dest_fmt->endianness);
    }
  }

  return LCS_RESULT_OK;
}


Als laatste nog enkele voorbeelden van RGB formaten die je hiermee kan omzetten (pre-defined):

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
35
36
37
38
39
40
41
42
43
44
45
46
47
static const struct {
  char *name;
  LCSRGBPackedFormat fmt;
} rgb_formats[] = {
  /* 32 bit formats with 8-bit transparency */
  { "RGBA8888_BE", { { LCS_FORMAT_RGB_PACKED, 32 },
             { 24, 16, 8, 0 }, { 8, 8, 8, 8 }, LCS_BIG_ENDIAN } },
  { "RGBA8888_LE", { { LCS_FORMAT_RGB_PACKED, 32 },
             { 24, 16, 8, 0 }, { 8, 8, 8, 8 }, LCS_LITTLE_ENDIAN } },

  /* 32 bit formats without transparency (i.e. 24-bit padded) */
  { "XRGB8888_BE", { { LCS_FORMAT_RGB_PACKED, 32 },
             { 16, 8, 0, 0 }, { 8, 8, 8, 0 }, LCS_BIG_ENDIAN } },
  { "XRGB8888_LE", { { LCS_FORMAT_RGB_PACKED, 32 },
             { 16, 8, 0, 0 }, { 8, 8, 8, 0 }, LCS_LITTLE_ENDIAN } },

  /* 24 bit formats */
  { "RGB888_BE", { { LCS_FORMAT_RGB_PACKED, 24 },
           { 16, 8, 0, 0 }, { 8, 8, 8, 0 }, LCS_BIG_ENDIAN } },
  { "RGB888_LE", { { LCS_FORMAT_RGB_PACKED, 24 },
           { 16, 8, 0, 0 }, { 8, 8, 8, 0 }, LCS_LITTLE_ENDIAN } },

  /* 16 bit formats */
  { "RGB565_BE", { { LCS_FORMAT_RGB_PACKED, 16 },
           { 11, 5, 0, 0 }, { 5, 6, 5, 0 }, LCS_BIG_ENDIAN } },
  { "RGB565_LE", { { LCS_FORMAT_RGB_PACKED, 16 },
           { 11, 5, 0, 0 }, { 5, 6, 5, 0 }, LCS_LITTLE_ENDIAN } },

  /* 16 bit formats with 1-bit transparency */
  { "RGBA5551_BE", { { LCS_FORMAT_RGB_PACKED, 16 },
           { 11, 6, 1, 0 }, { 5, 5, 5, 1 }, LCS_BIG_ENDIAN } },
  { "RGBA5551_LE", { { LCS_FORMAT_RGB_PACKED, 16 },
           { 11, 6, 1, 0 }, { 5, 5, 5, 1 }, LCS_LITTLE_ENDIAN } },

  /* 15 bit formats */
  { "XRGB1565_BE", { { LCS_FORMAT_RGB_PACKED, 16 },
             { 10, 5, 0, 0 }, { 5, 5, 5, 0 }, LCS_BIG_ENDIAN } },
  { "XRGB1565_LE", { { LCS_FORMAT_RGB_PACKED, 16 },
             { 10, 5, 0, 0 }, { 5, 5, 5, 0 }, LCS_LITTLE_ENDIAN } },

  /* 8 bit formats */
  { "RGB323", { { LCS_FORMAT_RGB_PACKED, 8 },
        { 5, 3, 0, 0 }, { 3, 2, 3, 0 }, LCS_NO_ENDIANNESS } },

  /* FILL ME */
  { NULL, }
};


Ik vind dit toch best wel mooi, en dus een topickick waard. :).

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Aangezien ik ook in het 'andere' topic heb gepost, kan ik hierin niet achterblijven. Mijn fraaiste stukje code valt te bewonderen (in het commentaar) op php.net. Voor een kalender-script moest ik kunnen berekenen op welke dag pasen valt in een willekeurig jaar. Daar heeft php een standaard functie voor, maar de library waar die in zit wordt niet standaard meegecompileerd. Mijn functie was uit nood geboren zeg maar. Vergelijk het voor de grap met de andere functie uit de comments...

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Dit is mijn code voor een MCMC sampler van een dirichlet posterior, onder gelijk en ongelijkheids restricties.

Het probleem dat er mee wordt opgelost is de volgende:

Een arts keurt kinderen met astma. Dit is een dure tijdsintensieve aangelegenheid. De vraag is of een vragenlijst bestaat, die de arts kan vervangen. Een vragenlijst is ontworpen, waarbij kinden met astma voor een aantal items moeten aangeven of dit voor hen van toepassing is of niet. De test is over een periode meerdere malen afgenomen. We modelleren de uitkomsten van deze test per kind als het product van een set binomiaal processen.

De arts keurt het kind ook na elke test, en geeft een prognose voor herstel. Deze prognose kan worden vertaald in ongelijkheid en gelijkheids restricties op de parameters van het model. Bv het kind gaat vooruit, of, het kind blijft eerst stabiel, en daarna gaat het beter.

We kijken vervolgens of het door de arts voorspelde patroon overeen komt met de uitkomsten van de vragenlijst.


In de code worden de restricties berekend, en daarna worden de parameters van het model onder de (on)gelijkheden gesampeld.


Fortran:
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
!########################## restrictions ###################################

            data2(i,:)   =matmul(data1(i,:)   ,  equal(:,:,j))              !
            tot_items1   =matmul(tot_items    ,  equal(:,:,j))              !
            par(:,j)     =matmul(par(:,j)     ,  equal(:,:,j))              !handle equality constraints
            alpha(:,j)   =matmul(alpha(:,j)   ,  equal(:,:,j))              !
            beta(:,j)    =matmul(beta(:,j)    ,  equal(:,:,j))              !
            post=0
            do k=1,iterations                                                !do for all iterations
                do l=1,size(par,1)                                          !do for all parameters
                    mask1(:)=.true. ;mask1(l)=.false.                       !
                    lbound1=0; ubound1=1
                        
                    lbound1=maxval((par(:,j)  * lower(l,:,j)),mask=mask1 )    !calulate bounds
                    ubound1=minval((par(:,j)  * upper(l,:,j)),mask=(mask1 .and. upper(l,:,j)>0) )   
                    if (ubound1>1000000000) ubound1=1

!########################## sampling #######################################

                    call drnun(1,unif)                                      ! random number
                    post_a=alpha(l,j)+data2    (i,l)                          ! parameters for posterior
                    post_b=beta (l,j)+tot_items1(l)  -data2(i,l)              !

                    if (post_a >0 .and. post_b>0) then
                        par(l,j)=dbetin((dbetdf(lbound1,post_a,post_b))+ &    ! transform uniform to beta 
                                 unif*(dbetdf(ubound1,post_a,post_b)-dbetdf(lbound1,post_a,post_b)),post_a,post_b)
                    end if

                    par(:,j)=matmul(par(:,j),transpose(equal(:,:,j)))         !rebuild parameters according to equality
                
                    if (k>burnin) post(:,k-burnin)=par(:,j)              !save sample
 
    

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

M'n nieuwe grid class:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <
    class FormatPolicy = Raw16Format,
    class SourcePolicy = StreamSource,
    template <class Format, class Source> 
        class CachingPolicy = NoCache,
    class IndexPolicy = CartesianIndex
>
class Grid :
    public CachingPolicy<FormatPolicy, SourcePolicy>,
    public IndexPolicy
{
public:
    typedef CachingPolicy<FormatPolicy, SourcePolicy> Cache;
    typedef FormatPolicy Format;
...

    inline Vertex getVertex(const typename IndexPolicy::Index& i) {
        return Vertex(
            IndexPolicy::getVertexX(i),
            FormatPolicy::getElevation(Cache::requestItem(IndexPolicy::toLinear(i))),
            IndexPolicy::getVertexZ(i)
        );


gebruikt om multi-gigabyte grids uit te lezen, met compile-time plugable cache, formaat (ie. 32bit float, 16bit float, rgb, raw16, etc), source (netwerk, mpi, stream, etc) en indexing (cartesian, z-curve, etc) en het mooiste is de uiteindelijk code die zonder snelheids verlies is.

[ Voor 21% gewijzigd door Zoijar op 24-03-2004 23:29 ]


Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Niet fraai, maar wel komisch is dat deze constructie in c++ mogelijk is

C++:
1
char d = 3["abcde"]; // d is nu 'd'

Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Tja en deze vind ik nou geweldig:
Perl:
1
2
3
4
5
my $number = 16;
if ((1 x $number) =~ m/^(11+)(\1)+$/)
{
  print "$number is not a prime\n";
}

Ik weet helaas niet wie de auteur is. Dit dingetje laat de kracht van regular expressions zien.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • jlrensen
  • Registratie: Oktober 2000
  • Laatst online: 06-09 23:23

jlrensen

plaatjes vullen geen gaatjes

(helaas) niet zelf geschreven, maar wel erg handig voor het debuggen van php code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function dump_array($var)
{
    switch (gettype($var)) {
    case 'integer':
    case 'double':
    case 'string':
        echo $var;
        break;
    case 'array':
        echo '<table border="1">' . "\n";
        do {
            echo '<TR><TD>';
            echo key($var);
            echo '</TD><TD>';
            dump_array($var[key($var)]);
            echo '</TD></TR>';
           } while (next($var));
        echo '</TABLE>';
        break;
    default:
        echo 'unknown data type';
        break;
    }
}


maakt een tabel van (meerdimensionale) array's

Men moet het denken bijbrengen, niet wat al gedacht is. ~C. Gurlitt


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hoe meer ik jullie voorbeeldjes fraaie code zie hoe meer ik mijn docenten gelijk ga geven als ze zeggen dat bijvoorbeeld Peterson's algoritme briljant is.

(In dit geval gaat het om docent R.R. Hoogerwoord aan de TU/e.)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Hier een class die de sessions in de DB opslaat, deze class heb ik niet helemaal zelf gemaakt, maar is voor z'n 80% aangepast door mij
PHP:
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
<?php
  class session {
    var $resource;
    function session($options) {
      $this->error                           = (bool)false;
      $this->sh_sid                          = (bool)false;
      $this->db['host']                      = "DB-Server";
      $this->db['user']                      = "DB-User";
      $this->db['pass']                      = "DB-Password";
      $this->db['dbas']                      = "DB-Database";
      $this->sess['expire']                  = 20;
      $this->sess['name']                    = "sessionid";
      $this->sess['cookies']                 = true;
      $this->sess['only_cookies']            = false;
      $this->sess['probability']             = 100;
      $this->sess['sid_len']                 = false;
      $this->set_ini();
      session_set_save_handler(array(&$this, 'open'), array(&$this, 'close'), array(&$this, 'read'), array(&$this, 'write'), array(&$this, 'destroy'), array(&$this, 'gc'));
      if ((!isset($_REQUEST[$this->sess['name']])) && ($this->sh_sid)) {
        session_id($this->new_sid());
        session_start();
      } else {
        session_start();
      }
    }

    /***************************************************
    Functie voor het instellen van de INI settings
    ***************************************************/
    function set_ini() {
      ini_set('session.save_handler', 'user');
      ini_set('session.name', $this->sess['name']);
      ini_set('session.use_cookies', $this->sess['cookies']);
      ini_set('session.gc_maxlifetime', $this->sess['expire']);
      ini_set('session.gc_probability', $this->sess['probability']);
      ini_set('session.use_only_cookies', $this->sess['only_cookies']);     
    }

    /***************************************************
    Functie voor het openen van de database connectie
    ***************************************************/
    function open($a, $b) {
      $this->resource = @mysql_connect($this->db['host'], $this->db['user'], $this->db['pass']) or $this->error .= mysql_error();
      @mysql_select_db($this->db['dbas']) or $this->error .= 'Could Not Select DB';
      return( $this->error );
    }

    /****************************************************
    Functie die de database connectie sluit
    ****************************************************/
    function close() {
      return ((bool)true);
    }

    /****************************************************
    Functie die data leest van de huidige sessie
    ****************************************************/
    function read($id) {
      $query = @mysql_query("SELECT * FROM `sessions` WHERE `session_id`='$id' AND `session_expire`>".time());
      if (@mysql_num_rows($query) > (int)0) {
        $info = @mysql_fetch_assoc($query);
        return($info['session_data']);
      } else {
        return((bool)false);
      }
    }
    
    /****************************************************
    Functie die data naar de huidige sessie schrijft
    ****************************************************/
    function write($id, $data) {
      $expires = time() + ($this->sess['expire'] * 60);
      $_q = "SELECT `session_id` FROM `sessions` WHERE `session_id`='".session_id()."'";
      $result = @mysql_query($_q, $this->resource);
      if (!@mysql_num_rows($result)) {
        $query = "INSERT INTO `sessions` (`session_id`, `session_expire`, `session_data`) VALUES ('$id', '$expires', '$data')";
      } else {
        $query = "UPDATE `sessions` SET `session_expire`='$expires', `session_data`='$data' WHERE `session_id`='$id' AND `session_expire`>".time();
      }
      return(@mysql_query($query, $this->resource));
    }
    
    /****************************************************
    Functie die de huidige sessie verwijderd
    ****************************************************/
    function destroy($id) {
      $query = "DELETE FROM `sessions` WHERE `session_id`='$id'";
      if (isset($_COOKIE[$this->sess['name']])) {
        unset($_COOKIE[$this->sess['name']]);
      }
      return(@mysql_query($query, $this->resource));
    }

    /****************************************************
    Functie die verlopen sessies verwijderd
    ****************************************************/
    function gc($a) {
      $query = "DELETE FROM `sessions` WHERE `session_expire`<".time();
      return(@mysql_query($query, $this->resource));
    }

    /****************************************************
    Functie om een Error af te handelen (Koppeling naar een error Class)
    ****************************************************/
    function connection_error() {
      return($this->error);
    }

    /****************************************************
    Functie die een nieuwe sessie id genereerd
    ****************************************************/
    function new_sid() {
      $_sid  = (bool)false;
      $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
      $count = (int)strlen($chars);
      for($i = (int)0; $i < $this->sess['sid_len']; $i++ ) {
        $_sid .= $chars[mt_rand((int)0, $count - (int)1)];
      }
      return($_sid);
    }
  }
?>

Acties:
  • 0 Henk 'm!

Verwijderd

jlrensen schreef op 26 maart 2004 @ 00:54:
(helaas) niet zelf geschreven, maar wel erg handig voor het debuggen van php code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function dump_array($var)
{
    switch (gettype($var)) {
    case 'integer':
    case 'double':
    case 'string':
        echo $var;
        break;
    case 'array':
        echo '<table border="1">' . "\n";
        do {
            echo '<TR><TD>';
            echo key($var);
            echo '</TD><TD>';
            dump_array($var[key($var)]);
            echo '</TD></TR>';
           } while (next($var));
        echo '</TABLE>';
        break;
    default:
        echo 'unknown data type';
        break;
    }
}


maakt een tabel van (meerdimensionale) array's
Ooit gehoord van de functie print_r($array); in php?

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
... Of de functie var_dump, als je ook het datatype enzo wilt weten?

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • riotrick
  • Registratie: Mei 2002
  • Laatst online: 08-07 18:48
De source van ilse.nl is ook best grappig:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<pre>
#!/usr/bin/perl
eval eval '"'.
          ('['
        ^'+').(      ('[')^
        (')')).(     ('`')|
         ')').(      ('`')|
                     '.').(
                     ('[')^              '/'                 ).+
         '\\'.+      "\"".(         '`'^'!').('`'        ^',').('`'^
         ',').(      ('{')^        '[').('{'^'"')      .('`'^'/').('{'
         ^'.').      ("\{"^       "\)").(      ((     "\{"))^    '[').(
         ('{')^      '(').(       '`'^'%'             ).('`'     ^'!').
         ("\{"^      ')').(       '`'^('#')).(       '`'^'('     ).('{'^
         '[').(      ('`')^        '!').('{'^')')    .('`'^'%').('{'^'['
         ).('`'      ^'"').          ('`'^('%')).(   '`'^',').('`'^'/').
         ("\`"^      '.').(                '`'^"'")   .('{'^
         '[').(      ('{')^        (        '/')).(   ('`')^
         '/').(      '{'^'['      ).('{'   ^'.').(     '{'^'('    ).((
         '\\'))      .('\\').(   '`'|'.').('\\').       '"'.';'.(('!')^
         "\+").       "\"";$:=      '.'^'~';$~=           '@'|'(';#;#
__END__
</pre>

Als je het uitvoert krijg je het volgende:

code:
1
2
$ lynx -source www.ilse.nl|perl -x
ALL YOUR SEARCH ARE BELONG TO US

Facebook :: Twitter :: PSN


Acties:
  • 0 Henk 'm!

Verwijderd

*is trots op zijn simpele AI functie :) *

Nadeel/voordeel ervan is dat elke stap opnieuw de volgende actie bepaald wordt. Binnenkort ook maar ns proberen of het werken met een plan beter werkt :).

PHP:
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
    /* calcNextMove: this function contains the AI of a robot */
    function calcNextMove ($robots, $mykey, $ball) {
      global $input, $drawingarea;
      
      list($trajectory, $time) = $this->extrapolateBallTrajectory();
      list($robot_x, $robot_y, $robot_angle, $robot_speed) = $input->getRobotPosition($mykey);
      
      list($goto_x, $goto_y) = $input->getBallPosition();
      
      /* Loop through predicted locations of ball */
      foreach ($trajectory as $balllocation) {
        /* Now, compare the (predicted) time for the ball to reach this point to the time
           the robot can reach this point */
        $robotmovetime = $this->calculateMoveTime($robot_x, $robot_y, $robot_angle,
                                                  $balllocation[0], $balllocation[1]);

        $robottoolate = ($robotmovetime > $balllocation[4]);
        
        if ($robottoolate != $prevrobottoolate && $prevrobottoolate) {
          $goto_x = $balllocation[0];
          $goto_y = $balllocation[1];
          $time = $robotmovetime;
          break;
        }
        
        $prevrobottoolate = $robottoolate;
      }
      
      echo "AI: ($goto_x, $goto_y), hit in " . round($time * 1000) / 1000 . " seconds\n";
      
      $this->drawHittingPoint($drawingarea, $goto_x, $goto_y);
      
      /* Calculate shortest route */
      if ($goto_x >= $robot_x && $goto_y < $robot_y)
        $required_angle = rad2deg(atan(($goto_x - $robot_x) / ($robot_y - $goto_y)));
      if ($goto_x > $robot_x && $goto_y >= $robot_y)
        $required_angle = rad2deg(atan(($goto_y - $robot_y) / ($goto_x - $robot_x))) + 90;
      if ($goto_x <= $robot_x && $goto_y > $robot_y)
        $required_angle = rad2deg(atan(($robot_x - $goto_x) / ($goto_y - $robot_y))) + 180;
      if ($goto_x < $robot_x && $goto_y <= $robot_y)
        $required_angle = rad2deg(atan(($robot_y - $goto_y) / ($robot_x - $goto_x))) + 270;
      
      $diff_angle = $required_angle - $robot_angle;
      
      if (abs($diff_angle) < 30) { /* We're about right, proceed with moving */
        $this->goForward($mykey);
      } elseif (abs($diff_angle > 180)) { /* Turn the other way! */
        $this->goRotateRight($mykey);
      } else {
        $this->goRotateLeft($mykey);
      }
      
    }

[ Voor 4% gewijzigd door Verwijderd op 22-07-2004 11:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 22 juli 2004 @ 08:50:
Hier een class die de sessions in de DB opslaat, deze class heb ik niet helemaal zelf gemaakt, maar is voor z'n 80% aangepast door mij
PHP:
1
2
3
4
5
6
7
8
9
10
11
...
    /*************************************************** 
    Functie voor het openen van de database connectie 
    ***************************************************/ 
    function open($a, $b) { 
      $this->resource = @mysql_connect($this->db['host'], $this->db['user'], 
             $this->db['pass']) or $this->error .= mysql_error(); 
      @mysql_select_db($this->db['dbas']) or $this->error .= 'Could Not Select DB'; 
      return( $this->error ); 
    }
...
Dit topic gaat over fraaiste prog. voorbeelden. Iedereen zit zichzelf hier een schouderklopje te geven, maar niemand zegt wat hij/zij nou fraaie code vindt.
Wat ik bijvoorbeeld zeer slecht vind aan de code hierboven, is dat het commentaar letterlijk nergens voor nodig is. Je moet alleen commentaar zetten bij dingen die onduidelijk kunnen zijn of waarvan je vermoedt dat je er later niets meer van snapt. We zijn allemaal programmeur, en we zien echt wel dat bij een functie open in een database class, dat daar een connectie gemaakt wordt. Hoeft niet becommentarieerd te worden.

Als ik mezelf dan toch op de schouders mag kloppen:

Java:
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
// Copyright 2004 NextAvenue. All rights reserved.
//-----------------------------------------------------
//
// class.xml.js
//
// This file contains the XML class for NextAvenue. The class itself is portable, it
// runs on its own and has no dependancies.
//
// class name: XML
// properties: - onload => the function that should be fired after
//                         loading the XML file
// methods:    - load ( string sFile )
//
//               The function loads the XML file, and fires the onload function. The
//               onload parameter must be set before calling this function.
//
//             - getElementsByTagName ( string sTagNames, node StartNode )
//
//               The function gets all tags that match the sTagNames pattern. Example:
//               books/book/title, to get all titles from all books.
//               If StartNode is set to NULL or omitted the function starts parsing from
//               the most upper node. If StartNode is set, the function starts from that
//               node.
//
//             - getNodeValue ( node Node )
//               Gets the value of a node, if the childLength is 1 and the childNode is a
//               textnode return the text. If the childLength > 1 but some childNode is
//               CDATA node return the value of that node. Else the function returns NULL
//
//  @author Jorgen Horstink - www.nextavenue.com
//
function XML() {

  this.doc = null;
  this.onload = null;

  this.load = function (sFile) {
    /**
     * If one tries to load an unexisting xml file, it's clear that loading will fail.
     * IE does not throws an exception, but Gecko does. That's why this try-catch
     * statement is for.
     */
    try {
      if (sFile) {
        if (window.ActiveXObject){
          this.doc = new ActiveXObject("Microsoft.XMLDOM");
        } else if (document.implementation && document.implementation.createDocument) {
          this.doc = document.implementation.createDocument("","",null);
        }
        if (typeof this.doc != "undefined") {
          this.doc.async=false;
          this.doc.load(sFile);
          /**
           * This is for IE only. I do not need to check the browser, because Mozilla
           * has already thrown an exception. So if the root element had no childnodes
           * you can be pretty sure the file does not exist.
           *
           * N.B. It is also possible the user tried to load an empty document!!!
           */
          if (!this.doc.hasChildNodes()) {
            return (false);
          }
          if (typeof this.onload == "function") {
            this.onload();
          }
        }

        return (this.doc);
      }
    } catch (e) {
      /**
       * On every throw by the browser: return false. Something went seriously wrong so
       * returning false is the only right thing to do. Gecko throws an exception when
       * the filename does not exist.
       */
      return (false);
    }
  }

  
  this.getElementsByTagName = function (sTagNames, nStartNode) {
    var hasStartNode = true;
    if (nStartNode == null) {
      hasStartNode = false;
      nStartNode = this.doc;
    }
    var a = (sTagNames + "").split("/");
    var aPossibleMatches = new Array();
    /**
     * This is important. If no startnode is set, it is possible the
     * document node has multiple childNodes. If one sets the startnode,
     * there is only on node to start with...
     */
    if (hasStartNode) {
      aPossibleMatches[0] = new Array();
      aPossibleMatches[0][0] = nStartNode;
    } else {
      aPossibleMatches[0] = nStartNode.childNodes;
    }

    for (var i = 1; i < a.length; i++) {
      aPossibleMatches[i] = new Array();
      for (var j = 0; j < aPossibleMatches[i-1].length; j++) {
        for (var k = 0; k < aPossibleMatches[i-1][j].childNodes.length; k++) {
          var oItem = aPossibleMatches[i-1][j].childNodes[k];
          if (oItem.nodeName == a[i]) {
            aPossibleMatches[i].push(oItem);
          }
        }
      }
    }
    return (aPossibleMatches[a.length-1].length == 0 ? false : aPossibleMatches[a.length-1]);
  }

  /**
   * Gets the value of a give node
   *
   * @param   element nNode
   * @return  null | the value of the node
   *
   * The function walks through all childnodes of the given node. If the nodeType is 3, it
   * means a TEXT_NODE has been found. The first TEXT_NODE that has been found, may be returned
   * or not. That depends on whether or not a CDATA_NODE will be found. The value of a CDATA
   * node has a higher priority...
   *
   * I.E.
   *
   * <foo>
   *   bar
   * </foo>
   *
   * There is only one childNode of the type: TEXT_NODE, so that value will be returned
   *
   * <foo>
   *   <![CDATA[
   *     bar
   *   ]]>
   * </foo>
   *
   * In Gecko there are three childNodes. The first childNode is a TEXT_NODE with value "    "
   * some whitespace. A TEXT_NODE is found, so this value may be returned. But wait, the second
   * node is a CDATA node. The CDATA node has a higher priority, so the value of the CDATA node
   * (the first CDATA node) will be returned: the value 'bar'
   */
  this.getNodeValue = function (nNode) {
    var sRet = null;
    for (var i = 0; i < nNode.childNodes.length; i++) {
      switch (nNode.childNodes[i].nodeType) {
        case 3:
          if (sRet == null) {
            sRet = nNode.childNodes[i].nodeValue;
          }
          break;
        case 4:
          return (nNode.childNodes[i].nodeValue);
      }
    }
    return (sRet);
  }
}


Deze simpele kleine XML class is voor zover ik kan zien netjes becommentarieerd. Goed commentaar zie ik als nette code. Dat niet alleen, maar wel één van de vereisten. Logische variabelname zijn ook een must en verder ben ik fan van hongaarse notatie of een variant daarop; aangeven met een letter wat het datatype van de variabele is.

[ Voor 12% gewijzigd door Verwijderd op 22-07-2004 13:09 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 22 juli 2004 @ 11:45:

Deze simpele kleine XML class is voor zover ik kan zien netjes becommentarieerd. Goed commentaar zie ik als nette code. Dat niet alleen, maar wel één van de vereisten. Logische variabelname zijn ook een must en verder ben ik fan van hongaarse notatie of een variant daarop; aangeven met een letter wat het datatype van de variabele is.
Commentaar is 1 ding, maar halve verhalen gaat mij iets te ver ("but wait, bla bla bla")
En je commentaar is incompleet. Je meld dat er 3 nodes zijn in Gecko en je beschrijft er maar twee :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
this.getNodeValue = function (nNode) { 
    var sRet = null; 
    for (var i = 0; i < nNode.childNodes.length; i++) { 
      switch (nNode.childNodes[i].nodeType) { 
        case 3: 
          if (sRet == null) { 
            sTempRet = nNode.childNodes[i].nodeValue; 
          } 
          break; 
        case 4: 
          return (nNode.childNodes[i].nodeValue); 
      } 
    } 
    return (sRet); 
  }

Leuk dat commentaar in je code. Maar wat is case3 ? Wat is case 4? Magic number zijn naar mijn idee nou niet echt een voorbeeld van fraaie code, had er dan in elk geval constanten of een enumeratie van gemaakt.

En waarom vul je de variabele sTempRet en doe je er vervolgens niks meer mee?

[ Voor 10% gewijzigd door Creepy op 22-07-2004 12:54 ]

"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


Acties:
  • 0 Henk 'm!

Verwijderd

Creepy schreef op 22 juli 2004 @ 12:50:
[...]

Commentaar is 1 ding, maar halve verhalen gaat mij iets te ver ("but wait, bla bla bla")
En je commentaar is incompleet. Je meld dat er 3 nodes zijn in Gecko en je beschrijft er maar twee :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
this.getNodeValue = function (nNode) { 
    var sRet = null; 
    for (var i = 0; i < nNode.childNodes.length; i++) { 
      switch (nNode.childNodes[i].nodeType) { 
        case 3: 
          if (sRet == null) { 
            sTempRet = nNode.childNodes[i].nodeValue; 
          } 
          break; 
        case 4: 
          return (nNode.childNodes[i].nodeValue); 
      } 
    } 
    return (sRet); 
  }

Leuk dat commentaar in je code. Maar wat is case3 ? Wat is case 4? Magic number zijn naar mijn idee nou niet echt een voorbeeld van fraaie code, had er dan in elk geval constanten of een enumeratie van gemaakt.

En waarom vul je de variabele sTempRet en doe je er vervolgens niks meer mee?
Kijk, nu wordt de discussie zinnig. Ik noem in het commentaar inderdaad drie nodeType, ik noem de eerst en de tweede aangezien de functie ze ook zo bekijkt. Nadat de tweede (een CDATA node) gevonden is, kan de functie al retouneren. Bovendien hoef je niet geniaal te zijn om te zien dat de derde Node ook een TEXT_NODE is.

Die sTempRet was idd nog een foute bij het intikken van het bericht, was vergeten die om te zetten naar sRet.

Case 3 is natuurlijk een nodeType en wel een TEXT_NODE, Case 4 is ook een nodeType en een CDATA_NODE. Voor mij erg logisch en ik denk dat elke programmeur die met DOM werkt die nummers wel uit zijn kop kent. Daarom zet ik er geen commentaar bij. Misschien is gebruik maken van de constanten voor leken wat duidelijker, maar je programmeert niet voor leken. Toch?
Is hier een punt van discussie ontstaan? ;)


Ik ga je gelijk geven, had een discussie NMe84 op MSN en ik dacht opeens aan OpenGL... Zou er niet aan moeten denken dat ik voor al die constanten de nummers zou moet weten... :Y)
TEXT_NODE gebruiken i.p.v. 3 is inderdaad veel beschrijvender. O-)


// Edit
Dat stuk commentaar had natuurlijk betrekking op het voorbeeld erboven...

[ Voor 15% gewijzigd door Verwijderd op 22-07-2004 13:29 ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Verwijderd schreef op 22 juli 2004 @ 11:45:
...

Als ik mezelf dan toch op de schouders mag kloppen:

Java:
1
2
3
4
5
6
...
    /**
     * If one tries to load an unexisting xml file, it's clear that loading will fail.
     * IE does not throws an exception, but Gecko does. That's why this try-catch
     * statement is for.
     */
....
Klop niet te hard, anders is straks al je Engels er uit. :Y)

"That's why this try-catch statement is for."

Wat ik bedoel is eigenlijk dat als je commentaar er bij zet, en je doet dit in het Engels, hoeft het eigenlijk alleen maar begrijpbaar te zijn, niet correct. Maar correct (en wellicht zelf proper English) staat wel stukken beter en professioneler, niet dan?
offtopic:
Ikzelf heb in Amerika gewoond, en proper English zit er helaas niet in, maar grammaticaal correct Engels wel...

Acties:
  • 0 Henk 'm!

  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06 16:50

BoomSmurf

Am-Ende!

Wel, moge het even duidelijk zijn dat ik gestopt ben met Informatica twee jaar geleden omdat het zo godsgruwelijk saai was (op de TU/e) en er een 99% ultranerd mentaliteit hing (dan is Natuurkunde toch boeiender ;)). Ingewikkelde - of liever, moeilijk en duur verwoorde - dingen zal je van mij dus ook niet horen. En of m'n proc's meer dan 2 niveau's diep zijn zal me al helemaal een worst zijn :) Ik zal m'n eigen code dus ook niet opdringen als mooi of briljant. Wat ik echter wel een hele slimme was Garbage collection onder Delphi <= 7 dmv interfaces. Bv:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
var SL: TStringList;
      O: TObject;
      MijnObject: TMijnClass;
begin
  Garbage.StringList(SL);
  // vereist natuurlijk wel die specifieke procedure

  Garbage.Generic(TStringList, O);
  SL := (O as TStringList);
  // Die minder mooi is en als je em vaker dan één keer gebruikt is het makkelijker 
  // om gewoon die proc te definieren.

  MijnClass.CreateGarbage(MijnObject);


Hoe heel die class werkt ga ik niet posten, is welbekend. Google er maar op of zo. Heb em zelf geschreven (voor de oefening) maar er zijn er meerdere te vinden door ander volk. Mijn eigen classes hebben ook vrijwel allemaal een class method CreateGarbage(...) voor dit doel. Natuurlijk is dit gewoon standaard in een hoop andere talen maar op deze manier is het toch wat meer expliciet.


Verder vindt ik het altijd wel leuk om wat met MMX en SSE aan te kloten, de resultaten mogen er wezen. Het volgende bijvoorbeeld:

(NB deze kan waarschijnlijk nog veel sneller en dat je toch al die info krijgt, maar het hoefde alleen maar veel sneller te zijn dan de pascal versie want daar kon ik ondertussen koffie gaan zetten)
code:
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
procedure SubImage(DestRGB, Src1, Src2: TBitmap; var SubInfo: TSubInfo);
var
    BaseDestRGB, BaseSrc1, BaseSrc2,
    IncDestRGB, IncSrc1, IncSrc2: Cardinal;
    pDestRGB, pSrc1, pSrc2: PDWORD;
    W, H: Cardinal;

    DiffMin, DiffMax, DiffTotH, DiffTotL: Int64;
    DiffMinC, DiffMaxC: Cardinal;
    DiffTotR, DiffTotG, DiffTotB, DiffTotal: Cardinal;
begin
  BaseDestRGB := Cardinal(DestRGB.Scanline[0]);
  BaseSrc1 := Cardinal(Src1.Scanline[0]);
  BaseSrc2 := Cardinal(Src2.Scanline[0]);

  IncDestRGB := Cardinal(DestRGB.Scanline[1]) - Cardinal(DestRGB.Scanline[0]);
  IncSrc1 := Cardinal(Src1.Scanline[1]) - Cardinal(Src1.Scanline[0]);
  IncSrc2 := Cardinal(Src2.Scanline[1]) - Cardinal(Src2.Scanline[0]);

  W := Src1.Width div 2; { Handle 2 bytes at a time }
  H := Src1.Height;

  DiffMin := $FFFFFFFFFFFFFFFF; { = MM4}
  DiffMax := $0; { = MM5}

  DiffTotH := 0; { = MM6}
  DiffTotL := 0; { = MM7}

asm
{  for i := 0 to DestR.Height - 1 do begin}
  mov ecx, H

  pxor mm3, mm3
  movq mm4, DiffMin
  movq mm5, DiffMax
  movq mm6, DiffTotH
  movq mm7, DiffTotL

@OuterLoop:
      mov eax, BaseDestRGB
      mov pDestRGB, eax

      mov eax, BaseSrc1
      mov pSrc1, eax

      mov eax, BaseSrc2
      mov pSrc2, eax

{    for j := 0 to DestR.Width - 1 do begin}
      mov edx, W

@InnerLoop:
{ RGB := Absolute(PSrc1 - PSrc2) }
        mov eax, PSrc1
        movq mm0, [eax]
        movq mm1, mm0

        mov eax, PSrc2
        movq mm2, [eax]

        pminub mm1, mm2
        pmaxub mm0, mm2

        psubusb mm0, mm1

        mov eax, PDestRGB
        movntq [eax], mm0

{ DiffMin }
        pminub mm4, mm0

{ DiffMax }
        pmaxub mm5, mm0

{ DiffTotal }
{1}
        movq mm1, mm0
        movq mm2, mm0
        psrld mm1, 16

        punpcklbw mm1, mm3
        punpcklwd mm1, mm3
        punpcklbw mm2, mm3
        punpcklwd mm2, mm3

        paddd mm6, mm1
        paddd mm7, mm2
{2}
        movq mm1, mm0
        movq mm2, mm0
        psrlq mm1, 32
        psrlq mm2, 32
        psrld mm1, 16

        punpcklbw mm1, mm3
        punpcklwd mm1, mm3
        punpcklbw mm2, mm3
        punpcklwd mm2, mm3

        paddd mm6, mm1
        paddd mm7, mm2

{ Inc pointers }
        add pDestRGB, 8
        add pSrc1, 8
        add pSrc2, 8

        dec edx
        jnz @InnerLoop
{ end InnerLoop }

{ Inc Pointers }
      mov eax, IncDestRGB
      add BaseDestRGB, eax

      mov eax, IncSrc1
      add BaseSrc1, eax

      mov eax, IncSrc2
      add BaseSrc2, eax

      dec ecx
      jnz @OuterLoop
{ end OuterLoop }

      movq mm0, mm4
      psrlq mm0, 32
      pminub mm4, mm0
      movd DiffMinC, mm4

      movq mm0, mm5
      psrlq mm0, 32
      pmaxub mm5, mm0
      movd DiffMaxC, mm5

      movd DiffTotR, mm6

      movq mm0, mm7
      psrlq mm0, 32
      movd DiffTotG, mm0

      movd DiffTotB, mm7

      emms
  end;

  SubInfo.DiffTotR := DiffTotR;
  SubInfo.DiffTotG := DiffTotG;
  SubInfo.DiffTotB := DiffTotB;

  SubInfo.DiffMinR := (DiffMinC AND $00FF0000) shr 16;
  SubInfo.DiffMinG := (DiffMinC AND $0000FF00) shr 8;
  SubInfo.DiffMinB := (DiffMinC AND $000000FF);

  SubInfo.DiffMaxR := (DiffMaxC AND $00FF0000) shr 16;
  SubInfo.DiffMaxG := (DiffMaxC AND $0000FF00) shr 8;
  SubInfo.DiffMaxB := (DiffMaxC AND $000000FF);

  SubInfo.DiffAvgR := DiffTotR div (W * H * 2);
  SubInfo.DiffAvgG := DiffTotG div (W * H * 2);
  SubInfo.DiffAvgB := DiffTotB div (W * H * 2);

  DiffTotal := DiffTotR + DiffTotG + DiffTotG;
  SubInfo.DiffTotal := DiffTotal;
  SubInfo.DiffAverage := DiffTotal div (W * H * 2 * 3);
end;


Berekend wat zooi aan twee 32bit RGB plaatjes, wat voor de meeste code zorgt. De output zelf maken is het kleinste deel. Was puur om wat te onderzoeken voor mezelf. Heb er ook versies van die bv de standaard deviatie berekenen van de afwijking van de plaatjes. Ik heb ergens ook nog een retesnelle SSE versie van RGB32 naar YUY2 conversie (voor overlay gebruik) maar die kan ik zo snel niet terugvinden. En natuurlijk alphablending support routines, die zijn ook het makkelijkst in MMX / SSE :)

Allemaal niet zo boeiend dus :|

[ Voor 5% gewijzigd door BoomSmurf op 22-07-2004 16:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

RwD schreef op 22 juli 2004 @ 14:27:
[...]
Klop niet te hard, anders is straks al je Engels er uit. :Y)

"That's why this try-catch statement is for."

Wat ik bedoel is eigenlijk dat als je commentaar er bij zet, en je doet dit in het Engels, hoeft het eigenlijk alleen maar begrijpbaar te zijn, niet correct. Maar correct (en wellicht zelf proper English) staat wel stukken beter en professioneler, niet dan?
offtopic:
Ikzelf heb in Amerika gewoond, en proper English zit er helaas niet in, maar grammaticaal correct Engels wel...
Als we grammaticaal gaan mierenneuken, dan zie ik nog wel 2 fouten in dat stukje tekst van mij. 1.) it's clear that loading will fail -> that is overbodig en mag/moet weggelaten worden 2.) IE does not throws an exception 8)7

Punt is dat je beter Engels commentaar kan zetten waar wat fouten in zitten, dan vlekkeloos Nederlands. Tuurlijk staat voutloos beter/professioneler, maar English is nou eenmaal niet mijn natieve taal. Dat ik vouten maak is dus loochies.

Ik snap je punt dus niet helemaal. Foutloos staat beter, maar ik ben niet bij machte om perfect Engels te schrijven.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:26

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 22 juli 2004 @ 13:02:
[...]
Case 3 is natuurlijk een nodeType en wel een TEXT_NODE, Case 4 is ook een nodeType en een CDATA_NODE. Voor mij erg logisch en ik denk dat elke programmeur die met DOM werkt die nummers wel uit zijn kop kent. Daarom zet ik er geen commentaar bij. Misschien is gebruik maken van de constanten voor leken wat duidelijker, maar je programmeert niet voor leken. Toch?
Is hier een punt van discussie ontstaan? ;)


Ik ga je gelijk geven, had een discussie NMe84 op MSN en ik dacht opeens aan OpenGL... Zou er niet aan moeten denken dat ik voor al die constanten de nummers zou moet weten... :Y)
TEXT_NODE gebruiken i.p.v. 3 is inderdaad veel beschrijvender. O-)
En niet te vergeten dat ondanks dat ik met DOM heb gewerkt ik de nummers toch niet ken. In delphi bijv. zijn die nummers niet nodig :)

"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


Acties:
  • 0 Henk 'm!

Verwijderd

Een aantal weken terug was ik bezig mij te verdiepen in xsl-fo (Hiermee kun je onderandere pdf bestanden maken). Tijdens mijn zoektocht op internet kwam in op de volgende pagina:

http://www.renderx.com/chess.html
The power of XSL lies in its ability to perform radical transformations of the XML data source. This page contains yet another proof for this fact: you can build a chessgame viewer with a stylesheet!

The source document is a transcription of a chess game played by Garry Kasparov against a chess supercomputer -- IBM Deep Blue. The game is encoded in a form resembling the well-known Portable Game Notation (PGN) format. The source is very compact: a sample game on this page [DeepBlue.xml] is less than 4 kBytes in size.

The stylesheet converts this arid text into a sequence of board diagrams, drawing every intermediate position as a graphical image (a special chess font is used). Applying a 23 kB stylesheet [chess.xsl], we get a 415 kBytes (!) FO stream [DeepBlue.fo]. These numbers give an idea of how deep the transformation is.
Deze stylesheet geeft duidelijk de kracht van xsl aan. Helaas is dit voor mij nog allemaal iets te moeilijk om zelf te schrijven.

Acties:
  • 0 Henk 'm!

Verwijderd

Een van de beste (C++) progsels vind ik toch wel auto_ptr hoor ^^

Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

Helaas geen source of link, maar ik herinner mij het volgende uit de tijd dat ik nog een C=64 hackert was >:) :
Zoals je wellicht weet bevatte de 1541 disk-drive van de c=64 ook een 6502 microprocessor inclusief een hoeveelheid RAM.
Welnu. Waarom zouden we de diskdrive dan niet als 2e computer gebruiken :o
Zodoende had iemand een fractal-programma gemaakt (notoir traag natuurlijk) dat de ene helft van de fractal op de C=64 zelf uitrekende, en de andere helft tegelijkertijd op de diskdrive 8)

Hatsaa, multiprocessing op zolder, eind jaren 80 :*)

FireFox - neem het web in eigen hand


Acties:
  • 0 Henk 'm!

Verwijderd

PommeFritz schreef op 27 juli 2004 @ 00:18:
Helaas geen source of link, maar ik herinner mij het volgende uit de tijd dat ik nog een C=64 hackert was >:) :
Zoals je wellicht weet bevatte de 1541 disk-drive van de c=64 ook een 6502 microprocessor inclusief een hoeveelheid RAM.
Memories, sweet memories :)

Het (Disk)OS dat op de 1541 draaide was overigens een stuk interessanter dan dat van de C64 zelf. Omdat er geen controllers in die drive zaten moest de 6502 dus zowel de communicatie met de C64 als het aansturen van de drive hardware regelen en was multitasking nodig. Er draaiden dus twee concurrerende threads die alletwee tijdcritisch waren, als jeugdige hacker is me bij het bestuderen van de (gedisassemblede) source dan ook menig lichtje gaan branden.

Wat ik in die tijd deed was het wiel vaak opnieuw uitvinden en me vervolgens heel slim vinden. :) Ik heb eens maanden op een compressor zitten schrijven en zo zelfstandig fibonacci coding en wat later shannon-fano coding uitgewerkt. Toen ik tijdens een computerbeurs een geek trof die me uitlegde hoe huffman coding in zijn werk gaat was ik nogal gedesillusioneerd, vooral toen hij vertelde dat het met arithmetische coding nog strakker kan. :)

Tegenwoordig (na zo'n 25 jaar programmeren) heb ik niet meer het idee dat ik zelf zo geweldig/geniaal ben. Ik heb wel eens een aardig idee waarmee ik enkele malen de big-O verslagen heb, maar ik maak me niet meer wijs dat ik in de zelfde divisie speel als Huffman, Hoare, Knuth, Peterson en consorten.
Pagina: 1 2 Laatste