Hoofdcategorieën
Device Settings
Topicacties

[alg] Slechtste programmeervoorbeelden deel 4 Vorige deelOverzicht

Pagina: 1 2 3 4 5 6 7 8 9 10 11 12 ... 84 85 86 87 last

Reageer Nieuw Topic
Berichten: 8.069
Reg. datum: 03 november 2002

quote:
Below the fold lies a sufficiently sized code sample with everything you’ll need to understand what happened with the Zune 30 bug.
http://www.aeroxp.org/2009/01/lesson-on-infinite-loops/

bobwarley wijzigde dit bericht 05-01-2009 17:03 (58%)
Reden: Oops: gisteren al gepost..double sowy

Op WP7 kun je niet eens eigen mp3s als ringtone instellen, how smart is that??

Berichten: 309
Reg. datum: 26 november 2008

quote:
darkmage schreef op maandag 05 januari 2009 @ 16:23:
[...]

True.

Ik was even confuus met de integral types (sbyte, uint) enz
Een uint (System.Uint32) en sbyte (System.SByte) zijn toch ook gewoon (niet CLS-compliant) structs, net als System.Int32. Aangezien alle intrinsics van value type erven.

Sintax wijzigde dit bericht 05-01-2009 18:09 (10%)

"Gravitation is not responsible for people falling in love." Albert Einstein

Berichten: 27
Reg. datum: 17 september 2008

quote:
_Erikje_ schreef op vrijdag 26 december 2008 @ 13:14:
[...]

Het gaat om leesbaarheid van de code, en nu vindt niet iedereen hetzelfde leesbaar. Ook speelt het 1337-heidsgehalte van compacte code een rol, I think.
Als je functies zo groot worden dat die brackets het onleesbaar maken (omdat je enorm veel moet gaans scrollen omdat het zoveel ruimte inneemt) is de functie waarschijnlijk ook gewoon te groot.
 
Berichten: 4.068
Reg. datum: 14 oktober 2004

Ik wist niet dat het kon in C#, maar iemand had in een server loop de volgende code:
C#:
1
2
3
4
5
6
public void ServerLoop()
{
    START:
    //server loop gedeelte
    goto start;
}

Ik dacht toch echt dat goto ondertussen al lang en breed verdwenen was. Hoewel het in dit geval niet echt fout of super lelijk is, had ik er zelf toch gewoon een while(true) of while(running) loop van gemaakt :)

Zoekt kamer in Utrecht! ~ Mijn progblog! ~ @royTries

dotnetter
Berichten: 9.032
Reg. datum: 02 februari 2004

goto's zijn in C# en Java nog steeds mogelijk, en waarschijnlijk in andere talen ook wel, alleen gebruikt bijna niemand ze meer ;)

Kater? Eerst water, de rest komt later
Last.fm profiel
Staat open voor nieuwe uitdaging in omgeving Haarlem (ASP.NET)

Python!
Berichten: 1.781
Reg. datum: 24 maart 2004

quote:
Haan schreef op zaterdag 10 januari 2009 @ 11:12:
goto's zijn in C# en Java nog steeds mogelijk, en waarschijnlijk in andere talen ook wel, alleen gebruikt bijna niemand ze meer ;)
In Java en JavaScript niet helaas, ik had het pas nl. nodig. Goto en labels zijn erg handig wanneer je automatisch code laat genereren :)

JanDM wijzigde dit bericht 10-01-2009 11:52 (6%)

 
dotnetter
Berichten: 9.032
Reg. datum: 02 februari 2004

Vreemd, ik dacht echt dat Java het ook nog ondersteunde. Ik zal wel in de war zijn met break en continue statements.
Ik kom net wel deze constructie tegen, die wel schijnt te werken, maar alleen terug kan springen en niet vooruit (halve goto dus)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
search:
for (i = 0i < arrayOfInts.lengthi++)
{
    for (j = 0j < arrayOfInts[i].lengthj++) 
    {
        if (arrayOfInts[i][j] == searchfor)
        {
            foundIt = true;
            break search;
        } 
    }
}

Kater? Eerst water, de rest komt later
Last.fm profiel
Staat open voor nieuwe uitdaging in omgeving Haarlem (ASP.NET)

Rantmeister!

quote:
Haan schreef op zaterdag 10 januari 2009 @ 12:30:
Vreemd, ik dacht echt dat Java het ook nog ondersteunde. Ik zal wel in de war zijn met break en continue statements.
Ik kom net wel deze constructie tegen, die wel schijnt te werken, maar alleen terug kan springen en niet vooruit (halve goto dus)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
search:
for (i = 0i < arrayOfInts.lengthi++)
{
    for (j = 0j < arrayOfInts[i].lengthj++) 
    {
        if (arrayOfInts[i][j] == searchfor)
        {
            foundIt = true;
            break search;
        } 
    }
}

In dit voorbeeld spring je niet terug maar break je de outer loop, waardoor je programma door gaat, lijkt dus absoluut niet op een goto :)

Blog || Probeer eens een echte db, probeer eens PostgreSQL!
Klik hier voor ultieme ranzigheid! - PSN : Kettrick

Spaarnwoude Resort

quote:
Haan schreef op zaterdag 10 januari 2009 @ 12:30:
Vreemd, ik dacht echt dat Java het ook nog ondersteunde.
Bytecode ondersteunt het ook gewoon. :+

Talkin.nl daily photoblog
Day 2307: Spaarnwoude Resort
Foto specs: Canon 50D, Sigma 8-16 HSM, 1/40s, f/9.0, ISO 100

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
JanDM schreef op zaterdag 10 januari 2009 @ 11:52:
[...]

In Java en JavaScript niet helaas, ik had het pas nl. nodig. Goto en labels zijn erg handig wanneer je automatisch code laat genereren :)
Wat is het nut van Java-code genereren, als die toch onleesbaar wordt? Maak er dan bytecode van ofzo :/
 
Kleine wtf van mezelf:
C:
1
2
3
4
5
6
7
8
9
10
11
    for (i = 0i < 128i++)
    {
        if (clients[i].client.sin_addr.s_addr == 0)
        {
            continue;
        }
        else
        {
            sendto(config->sock"bye"30, (struct sockaddr *)&clients[i].clientsizeof(clients[i].client));
        }
    }

En nog een bugje :X
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    for (i = 0i < 128i++)
    {
        pthread_mutex_lock(&clients[i].clientmutex);

        /*this means a client struct is used*/
        if (clients[i].client.sin_addr.s_addr != 0)
        {            
            /*if the last update of a client has timed out, remove the client*/
            if (tv.tv_sec - clients[i].last_update.tv_sec > (long long int)clients[i].timeout)
            {
                free(clients[i].lights);
                free(clients[i].values);
                memset(clients + i0sizeof(struct config));
            }
        }
        
        pthread_mutex_unlock(&clients[i].clientmutex);
    }

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

quote:
MBV schreef op zaterdag 10 januari 2009 @ 16:10:
[...]

Wat is het nut van Java-code genereren, als die toch onleesbaar wordt? Maak er dan bytecode van ofzo :/
Waarom zou je je helemaal moeten gaan verdiepen in Java bytecode generation als je ook gewoon Java code kunt genereren? Al helemaal als je al backends hebt voor talen als C++ en C#, die met minimale aanpassingen ook voor Java code kunnen gaan genereren.
Berichten: 2.597
Reg. datum: 16 augustus 2006

quote:
Raging_Trancer schreef op maandag 05 januari 2009 @ 12:43:
[...]


Volgens mij lees je het verkeerd. Wat de query in dit geval doet is alle waarden ophalen van de user met id = "$_COOKIE[id]" uit de tabel "gebruikers". ;)
Ik lees het prima, maar ik vind het een onzinnige constructie. Ik wil helemaal niet blind alle kolommen ophalen, ik wil bepalen wat ik ophaal. Als ik ALLE kolommen wil, dan geef ik wel een lijstje met alle kolomnamen, ipv die rottige *. Kan best zijn dat het een vreemde karaktertrek van mij is, maar ik vind het niet netjes om een * te gebruiken.

-4 uur cup-a-soup modus-: Ik zie het al, ik schreef 'tabellen', maar ik bedoelde 'kolommen' 8)7

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;

Spaarnwoude Resort

quote:
link0007 schreef op zondag 11 januari 2009 @ 16:24:
Kan best zijn dat het een vreemde karaktertrek van mij is, maar ik vind het niet netjes om een * te gebruiken.
Ligt niet aan jou hoor, altijd lui * selecteren scoort bij praktisch elke bad practice sql lijst vrij goed.

Talkin.nl daily photoblog
Day 2307: Spaarnwoude Resort
Foto specs: Canon 50D, Sigma 8-16 HSM, 1/40s, f/9.0, ISO 100

Berichten: 50
Reg. datum: 15 oktober 2008

Ik heb in mijn jonge jaren in VB toen ik het bestaan van rekenen met rest in VB niet wist, een programma waar je moest bepalen of een getal even of oneven was op volgende manier opgelost:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Dim int x
int x = txtInput.text

while x > 1
    x = x - 2
end while

if x = 0 then
    txtOutput.text = "Even"
else
   txtOuput.text  = "Oneven"
end if

De oplossing met mod was natuurlijk wel een stuk sneller :p
 
achter de duinen

En als je obscuur wilde doen kon je ook nog een binaire operatie erop loslaten :P

It was when I was happiest that I longed most. It was on happy days when we were up there on the hills, the three of us, with the wind and the sunshine ...

heeft een echte avatar

Obscuur?
Visual Basic:
1
2
3
4
5
If (x And 1) = 0 Then
    even
Else
    odd
End If

Vind ik vrij basic hoor.

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

achter de duinen

Bitwise operaties zijn voor veel mensen niet basic.

En ja, dat is een slechte zaak ;)

It was when I was happiest that I longed most. It was on happy days when we were up there on the hills, the three of us, with the wind and the sunshine ...

Berichten: 4.913
Reg. datum: 28 januari 2000

Het zal wel geen goede reclame zijn voor het pakket waar ik dagelijks voor ontwikkel, maar ik heb ooit eens een aantal eigenaardigheden van SugarCRM op 'papier' gezet: http://www.sugardev.net/content/sugar-humor.

Lichtpuntje: Ze leveren dit soort dingen minder af dan vroeger. Maar oude rotzooi refactoren vinden ze vooralsnog niet nodig bij Sugar.

Config wijzigde dit bericht 11-01-2009 23:41 (7%)

 
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
.oisyn schreef op zondag 11 januari 2009 @ 14:53:
[...]

Waarom zou je je helemaal moeten gaan verdiepen in Java bytecode generation als je ook gewoon Java code kunt genereren? Al helemaal als je al backends hebt voor talen als C++ en C#, die met minimale aanpassingen ook voor Java code kunnen gaan genereren.
Zit wat in. Een nadeeltje: o.a. JavaCC liep tegen de beperkingen van verschillende IDE's aan omdat de bestanden toch iets te groot werden ;)
 
Op reis

quote:
IceManX schreef op zondag 11 januari 2009 @ 18:56:
Obscuur?
Visual Basic:
1
2
3
4
5
If (x And 1) = 0 Then
    even
Else
    odd
End If

Vind ik vrij basic hoor.
Slikte VB dat? Wow.
Ik moet zeggen, in de tijd dat ik er mee werkte wist ik daar ook niks vanaf. Nu wel uiteraard. (en nu wens ik VB nooit meer te gebruiken)
heeft een echte avatar

quote:
GreenSky schreef op maandag 12 januari 2009 @ 10:36:
[...]


Slikte VB dat? Wow.
Ik moet zeggen, in de tijd dat ik er mee werkte wist ik daar ook niks vanaf. Nu wel uiteraard. (en nu wens ik VB nooit meer te gebruiken)
Ik heb het ook ooit via-via geleerd, en ik ben het ook met je eens wat betreft VB ;)

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

AWEZOME!!!!

quote:
flijten schreef op dinsdag 06 januari 2009 @ 11:58:
[...]


Als je functies zo groot worden dat die brackets het onleesbaar maken (omdat je enorm veel moet gaans scrollen omdat het zoveel ruimte inneemt) is de functie waarschijnlijk ook gewoon te groot.
Daar ben ik het niet helemaal mee eens. De omvang van de functie heeft niets te maken met de complexiteit (en leesbaarheid) van een stuk code.
In sommige gevallen is het juist een verademing als om een functie van een paar pagina's te laten te staan. Decomposeren van functies kan juist de leesbaarheid verslechteren omdat je dan veel nutteloze functies moet definiëren die een bepaald onderdeel van het algoritme uitvoert (die nergens anders hergebruikt).

Ik ben zelf groot voorstander van compacte code, mits het goed gedocumenteerd is. Ik schaam me niet voor statements met meer dan 4 regels commentaar om het uit te leggen wat er precies gebeurt.

on-topic:
Nu zal ik je vertellen dat ik absoluut geen engel ben. Laats nog een stuk über ranzige code gemaakt voor een schoolopdracht. Echt een voorbeeldje van quick and dirty, and it works, so don't touch it 8)7
ruby:
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
   #arbitrary constructor for rushcheck
   #this enables rushcheck to autogenerate a object of this type
   def self.arbitrary

      interest = ["klantklossen", "motorrijden", "fietsen", "wandelen", "fappen", "rimmen", "paupers_slaan"]

      ## DISCLAIMER ##
      ## BLAME THIS ON ERIK SLAGTER ##
      String.arbitrary.bind do |firstName|
         String.arbitrary.bind do |lastName|
            RushCheck::Gen.choose(0, 1).bind do |genderItr|
           RushCheck::Gen.choose(0, 1).bind do |sexPrefItr|
              RushCheck::Gen.choose(1990, 2000).bind do |birthYear|
                  RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr1|
                         RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr2|
                            RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr3|
                   RushCheck::Gen.choose(0, 2).bind do |eduItr|
                         gender = @@genders[genderItr]
                     sexPref = @@sexualPreferences[sexPrefItr]
                     edu = @@educationLevels[eduItr]
                     nonSexPref = interest[interestItr1].to_s + "+" +
                                 interest[interestItr2].to_s + "+" + 
                          interest[interestItr3].to_s 
                         RushCheck::Gen.unit(new(firstName, lastName, gender, sexPref, birthYear, edu, nonSexPref))
                  end
               end
            end
             end
                  end
           end
            end
         end
      end
  end

Disclaimertje erbij omdat het een groepsopdracht was 8)
Wat het doet: automatisch variabelen genereren gebruikmakend van RushCheck generators.
 
Berichten: 38
Reg. datum: 11 maart 2008

quote:
_Erikje_ schreef op maandag 12 januari 2009 @ 22:30:
Echt een voorbeeldje van quick and dirty, and it works, so don't touch it 8)7
* Drukt op enter O-)

king_charles wijzigde dit bericht 12-01-2009 22:50 (74%)

 
quote:
_Erikje_ schreef op maandag 12 januari 2009 @ 22:30:
[...]
Ik ben zelf groot voorstander van compacte code, mits het goed gedocumenteerd is. Ik schaam me niet voor statements met meer dan 4 regels commentaar om het uit te leggen wat er precies gebeurt.
Och, ik heb soms momenten dat ik tussen de 20 en 80 regels commentaar schrijf als ik het nodig acht :-)

Recent voorbeeldje uit een software rasterizer. Het doel is om het juiste mip-map level te selecteren voor de huidige scanline. (De functie word dus een keer per scanline per triangle uitgevoerd). Door de optimalisatie is de functie uitvoer tussen de 20 en 30 keer sneller geworden, echter is 'ie ineens een stuk minder triviaal en komt er redelijk wat wiskunde bij kijken. Kortom, dat moeten we uitleggen aan de (toekomstige) lezer.
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
// First off a simple explanation about how floating points numbers are 
// stored. Remember scientific notation from high school? 1.34e10 ring a 
// bell? Well, floating point numbers work kinda similar. Except, they use 
// base 2 instead of base 10, so they are stored as 2^n * 0.29834. You 
// can't use n directly though, you have to subtract 127 before it's useful.
// 
// However, this has a very nice property. We can now, quite easily get the 
// integer log2(n) of any floating point number. We simply have to extract n
// somehow. That's easy enough, right? Just ditch the mantissa (eg. the 
// right most 23 bits) and subtract 127.
// 
//        int log2(float a_Float){
//            int log = *(int*)&a_Float;
//            log >>= 23;
//            log -= 127;
//            return log;
//        }
//     
// There are other things you can do with this such as finding the next 
// power of two (just increment n by 1).
// 
// This is one part of the mip-map calculation done. The entire formula that
// I'm sticking to is this:
// 
//        int level = log2(sqrt(area));
// 
// The next problem is tackling the sqrt part. However, it can be shown that
// we can write sqrt(n) in terms of log2.
// 
// First off, as everyone knows,
// 
//        sqrt(n) = n ^ (1/2)
// 
// And also:
// 
//        n = b ^ (log(n) / log(b)) //  b = base
// 
// So:
// 
//        n ^ (1/2) = 2 ^ (log(n ^ (1/2)) / log(2))
// 
// However
//        log(n ^ p) / log(b) = p * (log(n) / log(b))
// 
// So we can reduce the previous expression to:
//        n ^ (1/2) = 2 ^ (1/2 * (log(n) / log(2)))
// 
// So now we have one awesome expression with:
// 
// - 2 ^ something
// - something / 2
// - log2(something)
// 
// This can be written as:
// 
//        int a = 1 >> something; //  2^n
//        a >> 1; //  n / 2
// 
// And a log2(n) function. We already have one of those for floating point
// numbers, but we need one for integers as well (remember, fixed point!).
// 
// Thankfully, though, log2(n) for integers can be done in one instruction
// on the x86! The BSR instruction :-). What that instruction does is count
// the number of bits that are set. How is that log2(n)?
// 
// Well, every number can be expressed as a power of it's base. Eg.
// 
//        b101 = (2 ^ 2 * 1) + (2 ^ 1 * 0) + (2 ^ 0 * 1)
// 
// So 2^n * v. BSR returns the last n that is 1, which is exactly the same
// as the log with base two!
// 
// So, we've solved the puzzle :-) we can now calculate log2(sqrt(n)) in 5
// instructions! (BSR, SAR, MOV, SHL and BSR again)
template<typename _Type>
int mip_map(_Type a_Area){
    return (int)(log(sqrt(a_Area), 2));
}

template<>
int __fastcall mip_map<float>(float a_Area){
    __asm mov ecxa_Area;

    // integer log2(n)
    // int log2 = *(int*)&a_Area;
    // log2 >>= 23;
    // log2 -= 127;
    __asm sar ecx23;
    __asm sub ecx127;

    // sqrt(n) = 2 ^ (.5 * log2(n))
    // int sqrt = (1 << (log2 >> 1));
    __asm sar ecx1;
    __asm mov eax1;
    __asm shl eaxcl;

    // integer log2(n) again
    __asm bsr eaxeax;
}

template<>
int __fastcall mip_map<int>(int a_Area){
    // TODO: decide if this function shifts fixed point, or the caller

    // integer log2(n)
    __asm bsr ecxecx;

    // sqrt(n) = 2 ^ (.5 * log2(n))

    // integer sqrt (notice, off by quite a percentage!)
    __asm sar ecx1;
    __asm mov eax1;
    __asm shl eaxcl;

    // previous error doesn't really matter
    // because we log2(n) again

    // another log2(n)
    __asm bsr eaxeax;
}

Previous titles worked on: Battlefield 3 (Frostbite team), Deus Ex: Human Revolution

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.
quote:
.oisyn schreef op maandag 12 januari 2009 @ 23:41:
Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.
Persoonlijk lees ik in dit geval liever die ~80 regels commentaar dan dat ik over een half jaar zit te peinzen over wat ik heb zitten doen destijds. Daarbij zijn dit soort optimalizaties voor mij ook niet allerdaags en heb ik een deel van de kennis terplekke op moeten doen. Terwijl ik inmiddels toch een jaar met deze materie bezig ben geweest.

Overigens legt het grooste deel van het commentaar de wiskunde achter de optimalizatie uit; iets wat wellicht niet iedereen meteen door heeft. Kortom, voor mezelf kan ik het in ieder geval rechtvaardigen, wat een ander er uiteindelijk mee doet is niet aan mij. Ik heb m'n best gedaan ;-)

Previous titles worked on: Battlefield 3 (Frostbite team), Deus Ex: Human Revolution

Berichten: 143
Reg. datum: 05 juni 2005

Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}
?>

 
Berichten: 3.528
Reg. datum: 20 december 2002

quote:
Ik vind met name het begin stukje heel erg kinderlijk uitgelegd. Dit soort uitleg is an sich goed, maar mag toch wel gecondenseerd worden naar 20 regels.

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

quote:
Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:21:
[...]

Ik vind met name het begin stukje heel erg kinderlijk uitgelegd. Dit soort uitleg is an sich goed, maar mag toch wel gecondenseerd worden naar 20 regels.
20 Regels gaat mij denk ik niet lukken maar het is waarschijnlijk wel een goed idee om het commentaar iets meer to-the-point te schrijven :-)

Previous titles worked on: Battlefield 3 (Frostbite team), Deus Ex: Human Revolution

!litemod
Berichten: 18.698
Reg. datum: 19 oktober 2000

Dat stuk commentaar lijkt meer op een blog entry dan op commentaar. Het commentaar had imho kunnen volstaan met het vertellen dat de exponent wordt gebruikt voor de log operatie tezamen met de afleiding van de gangbare formule naar de geoptimaliseerde formule.

De grootste WTF is trouwens een andere. In je commentaar staat alleen de 'hoe'. Niet de 'waarom'. Nergens staat dat een aanroep naar mip_map het mip_map level terug geeft en wat die level nu eigenlijk inhoud. Wat nu eigenlijk de a_Area inhoud en wat de extremen van de in- en output parameters zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Rantmeister!

quote:
.oisyn schreef op maandag 12 januari 2009 @ 23:41:
Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.
Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
quote:
Tedkees schreef op dinsdag 13 januari 2009 @ 15:01:
Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}
?>

Dit is toch niet enorm vreemd :?

Blog || Probeer eens een echte db, probeer eens PostgreSQL!
Klik hier voor ultieme ranzigheid! - PSN : Kettrick

Berichten: 3.528
Reg. datum: 20 december 2002

quote:
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')

[...]


Dit is toch niet enorm vreemd :?
Een boolean geimplementeerd met een string "on"...

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

Berichten: 143
Reg. datum: 05 juni 2005

quote:
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')

[...]


Dit is toch niet enorm vreemd :?
Ik vind 't toch een vrij omslachtige manier om te checken of een boolean waarde (of iets wat eigenlijk een boolean hoort te zijn) te checken, en die logging is ook nog eens enorm overbodig in mijn ogen. Daarbij lijkt 't me sowieso handiger om deze methode op het object te hebben in plaats van een losse functie.
 
quote:
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:

[...]


Dit is toch niet enorm vreemd :?
En zowel bij true als false wordt het volgende uitgevoerd:

$log->debug("Exiting is_admin method ...");

Dat had dus ook net zo goed voor de if gekund. Als daarnaast de boolean gewoon als boolean geïmplementeerd was, kon je ook nog meteen die waarde returnen en niet eerst door een if halen.
 
Thee-Nerd

Dat en een nietszeggende logmelding maarja dat gebeurd wel meer.

edit: met hierboven dus :)

Guldan wijzigde dit bericht 13-01-2009 15:58 (18%)

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?

Berichten: 1.056
Reg. datum: 23 maart 2004

quote:
Tedkees schreef op dinsdag 13 januari 2009 @ 15:55:
[...]


Ik vind 't toch een vrij omslachtige manier om te checken of een boolean waarde (of iets wat eigenlijk een boolean hoort te zijn) te checken, en die logging is ook nog eens enorm overbodig in mijn ogen. Daarbij lijkt 't me sowieso handiger om deze methode op het object te hebben in plaats van een losse functie.
En het lijkt mij ook handig om te weten of $user wel een instance is van de (neem ik aan) User class :) Is niet zo heel erg veel moeite in PHP :
PHP:

1
<?php
function is_admin(User $user) { /* */ }
?>

Rantmeister!

quote:
Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:49:
[...]

Een boolean geimplementeerd met een string "on"...
Zolang je geen idee hebt waar die boolean vandaan komt kan je weinig over dit stuk code zeggen ;). Als je om wat voor reden dan ook aan die "on" vast zit is dit juist wel een nette oplossing.

Of je het dan in een class of functie zet hangt weer helemaal af van het gebruik/context.

Blog || Probeer eens een echte db, probeer eens PostgreSQL!
Klik hier voor ultieme ranzigheid! - PSN : Kettrick

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
daniëlpunt schreef op dinsdag 13 januari 2009 @ 16:11:
[...]

En het lijkt mij ook handig om te weten of $user wel een instance is van de (neem ik aan) User class :) Is niet zo heel erg veel moeite in PHP :
PHP:

1
<?php
function is_admin(User $user) { /* */ }
?>

Ehm, ik weet nog een betere:
PHP:

1
<?php
$user->isAdmin()
?>

Dan weet je zeker dat het een User is, anders had de functie niet bestaan ;)
quote:
Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:49:
[...]

Een boolean geimplementeerd met een string "on"...
Anders was het er niet makkelijker op geworden hoor, je zal in PHP altijd met variabele types zitten ;) Met boolean had je dan weer $is_admin === true moeten neerzetten.
 
!litemod
Berichten: 18.698
Reg. datum: 19 oktober 2000

quote:
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
Nou, dat valt ook wel weer mee. bitwise operaties zijn gewoon standaard taalconstructies en zeker in dergelijke hoog efficiente code zijn deze behoorlijk triviaal. Dat in een dergelijke context moeten documenteren is hetzelfde als in commentaar zetten dat je met de + twee waarden bij elkaar optelt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

quote:
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
Klopt, maar ik denk dat ik wel in de positie ben om die aanname te kunnen maken. Van mensen die bezig zijn met het optimizen van software rasterization kun je weldegelijk aannemen dat ze hun bitfiddle-kennis op orde hebben. Zo niet dan moeten ze ander werk zoeken.

.oisyn wijzigde dit bericht 13-01-2009 16:40 (25%)

DX

Ik snap nooit dat mensen zulke string booleans gebruiken.
1. Het is langzamer, een bool vergelijken gaat sneller dan een tekenreeks.
2. Je moet een goede standaard voor 'true' en 'false' afspreken.
2b. Het zit mij dwars dat een gegeven dat true of false moet zijn een andere waarde kan hebben waardoor je dus onvoorspelbare dingen krijgt.
Berichten: 4.913
Reg. datum: 28 januari 2000

quote:
Tedkees schreef op dinsdag 13 januari 2009 @ 15:01:
Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}
?>

Das een doorontwikkelde fork van SugarCRM 1.0...holy moly wat je daar al niet tegenkomt..
 
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
Sebazzz schreef op dinsdag 13 januari 2009 @ 18:00:
Ik snap nooit dat mensen zulke string booleans gebruiken.
1. Het is langzamer, een bool vergelijken gaat sneller dan een tekenreeks.
Het was PHP remember? Ik ben wel benieuwd naar een testje waarbij in PHP er een significant verschil is tussen de 2 constructies. PHP moet toch typecasten enzovoort, dus ik denk dat een vergelijking met TRUE ook niet al te snel is.
quote:
2. Je moet een goede standaard voor 'true' en 'false' afspreken.
Inderdaad, maar bij legacy (en PHP is al heel snel legacy geloof ik :/) maakt dat dus niet meer uit.
quote:
2b. Het zit mij dwars dat een gegeven dat true of false moet zijn een andere waarde kan hebben waardoor je dus onvoorspelbare dingen krijgt.
Hier is 'on' gelijk aan true, en verder niks. Bij if($var) is emptystring, null, de string false en false zelf false. Ik kan me voorstellen dat mensen dat overzichtelijker vinden.

Echt WTF-code wordt het pas zodra je het gaat uitbreiden: "superadmin" zou je ook een functie kunnen geven >:)
 
Python!
Berichten: 1.781
Reg. datum: 24 maart 2004

Het valt me tegen dat PHP 'on' niet impliciet cast naar true :+

Bovendien is die "global $log" erg onhandig, en maakt het concat-ten van strings het niet leesbaarder. Een static Log::debug met sprintf-like interface is imho veel mooier:
PHP:

1
<?php
Log::debug('is_admin(%s)'$user->user_name);
?>

En zet in die "Exiting is_admin method" op z'n minst welke waarde je teruggeeft... Of nog beter, voeg ze samen in 1 bericht.

JanDM wijzigde dit bericht 13-01-2009 23:11 (28%)

 
Cheer Bear

Loggen is een klassiek schoolvoorbeeld voor de toepassing van aspect oriented programming om tangling en scattering tegen te gaan, en bij gebrek aan een weaver kunnen we hier denk ik ook gewoon de Proxy pattern toepassen om dit imho eleganter/transparanter op te lossen. Uit de losse sleeve kom ik dan ook op het volgende:
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
<?php
class LogProxy {
    protected $delegatee;
    protected $logger;
    
    public function __construct($delegateeLogger $logger = null) {
        if(is_null($logger)) {
            $this->logger = new Logger();
        }
        
        $this->delegatee = $delegatee;
    }
    
    public function __call($name$args) {
        assert(method_exists($this->delegatee$name));
        
        $this->logger->log("Entering $name method ...");
        $result = call_user_func(array(&$this->delegatee$name), $args);
        $this->logger->log("Exiting $name method ...");
        
        if($result) { // Weet niet precies of dit afdoende is, aan jullie de opdracht om dat uit te zoeken ;-)
            return $result;
        }
    }
}
?>

Voor elk object (en ik realiseer me dat in die CMS van jullie geen sprake is van een object) dien je deze indien je Logger functionaliteit wil gewoon te passen aan LogProxy, e.g.:
PHP:

1
2
3
4
5
6
7
<?php
$obj = new MyClassToBeLoggedInDebugMode();

if(DEBUG) {
    $obj = new LogProxy($obj);
}

$obj->foo("bar");
?>

Natuurlijk rekening meehouden dat $obj instanceof LogProxy is indien DEBUG true is, iets waar je rekening mee moet houden als je $obj in typehinted code gebruikt. Je zult dan even je type goed moeten kiezen mbt covariantheid, maar daar kun je wel creatief in zijn ;)
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

Wat nou als je alles van je eigen Object laat afstammen, met de member functie getType()? Dan kan je idd geen instanceof gebruiken, maar daar zijn trucs omheen.
 
Berichten: 10.798
Reg. datum: 28 april 2000

quote:
MBV schreef op woensdag 14 januari 2009 @ 10:20:
Wat nou als je alles van je eigen Object laat afstammen, met de member functie getType()? Dan kan je idd geen instanceof gebruiken, maar daar zijn trucs omheen.
Kan je niet gewoon de instanceof operator overriden in PHP :+

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

quote:
prototype schreef op woensdag 14 januari 2009 @ 03:04:
PHP:

1
2
3
<?php
        if($result) { // Weet niet precies of dit afdoende is, aan jullie de opdracht om dat uit te zoeken ;-) 
            return $result
        }
?>

Je kunt gewoon direct $result returnen. Wat je nu doet is iig fout, omdat een functie die false, 0, 0.f of een lege string returnt dan genegeerd wordt (en niets returnen is hetzelfde als null returnen)
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
rwb schreef op woensdag 14 januari 2009 @ 10:28:
[...]

Kan je niet gewoon de instanceof operator overriden in PHP :+
Alles kan!* Gewoon even de PHP-source hacken, was toch GPL?
*) thee-kan, koffie-kan, water-kan, wim kan niet meer :+
 
Berichten: 3.528
Reg. datum: 20 december 2002

quote:
MBV schreef op dinsdag 13 januari 2009 @ 21:53:
[...]

Het was PHP remember? Ik ben wel benieuwd naar een testje waarbij in PHP er een significant verschil is tussen de 2 constructies. PHP moet toch typecasten enzovoort, dus ik denk dat een vergelijking met TRUE ook niet al te snel is.
euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

Berichten: 10.798
Reg. datum: 28 april 2000

quote:
Grijze Vos schreef op woensdag 14 januari 2009 @ 14:38:
[...]

euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.
Maar de vraag is of dat in PHP een significant performance verschil oplevert. en als <iets> een constante is dan hoeft het niet perse langzamer te zijn, aangezien er zowiezo een comparison moet plaatsvinden. Al zullen numerieke compares natuurlijk sneller zijn dan een string compare

Woy wijzigde dit bericht 14-01-2009 14:50 (8%)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Berichten: 3.528
Reg. datum: 20 december 2002

Een expressie met een vergelijking tussen twee variabelen (of een var en een constant) is per definitie duurder, aangezien dan die variabelen beiden in de registers moeten worden geplaatst, terwijl dat bij een expressie met maar een variabele natuurlijk niet hoeft.

Of dat verschil significant is hangt af van het aantal expressies waarin dat gebeurd uiteraard.

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

Fulltime #whatpulsert

quote:
Grijze Vos schreef op woensdag 14 januari 2009 @ 14:38:
[...]

euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.
Maar een significant verschil is er daardoor nog niet..

Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.

Berichten: 3.528
Reg. datum: 20 december 2002

quote:
Patriot schreef op woensdag 14 januari 2009 @ 14:53:
[...]


Maar een significant verschil is er daardoor nog niet..
of je leest de laatste regel van mijn post?

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

quote:
Grijze Vos schreef op woensdag 14 januari 2009 @ 14:53:
Een expressie met een vergelijking tussen twee variabelen (of een var en een constant) is per definitie duurder, aangezien dan die variabelen beiden in de registers moeten worden geplaatst, terwijl dat bij een expressie met maar een variabele natuurlijk niet hoeft.
Hoe kom je aan die aanname? Je moet een vergelijking doen. Of die vergelijking met een impliciete true gedaan wordt of een expliciete waarde die je opgeeft, het blijft een vergelijking tussen twee waarden. Als je vergelijkt met een constante (true), dan is het resultaat zelfs exact identiek en is er dus ook geen enkele reden waarom dat op een andere manier gecompileerd zou moeten worden.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdlib>

bool a = rand() & 1;
bool b = a & 1;

int main()
{
    if (a)
        std::cout << "hoi\n";
    if (b != false)
        std::cout << "doei\n";
}


asm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
004124E0  push        ebp  
004124E1  mov         ebp,esp 
004124E3  and         esp,0FFFFFFF8h 
    if (a)
004124E6  cmp         byte ptr [a (41A081h)],0 
004124ED  je          main+1Ch (4124FCh) 
        std::cout << "hoi\n";
004124EF  push        415488h 
004124F4  call        std::operator<<<std::char_traits<char> > (401C00h) 
004124F9  add         esp,4 
    if (b != false)
004124FC  cmp         byte ptr [b (41A080h)],0 
00412503  je          main+32h (412512h) 
        std::cout << "doei\n";
00412505  push        415490h 
0041250A  call        std::operator<<<std::char_traits<char> > (401C00h) 
0041250F  add         esp,4 
}
00412512  xor         eax,eax 
00412514  mov         esp,ebp 
00412516  pop         ebp  
00412517  ret

.oisyn wijzigde dit bericht 14-01-2009 15:11 (40%)

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

Helaas werkt dat kennelijk anders in PHP:
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
<?php
echo "<pre>starting: \n";
list($first_f$first_s) = explode(" "microtime());
$prev = $first_f+$first_s;
$var = true;
for ($i = 0$i < 100000$i++) {
    if ($varecho '.';
    else echo ',';
}
echo "\nafter if(\$var):"echo test_time()."\n";

$var = true;
for ($j = 0$j < 100000$j++) {
    if ($var == trueecho '.';
    else echo ',';
}
echo "\nafter if(\$var == true):"echo test_time()."\n";
$var = "on";
for ($k = 0$k < 100000$k++) {
    if ($var == "on"echo '.';
    else echo ',';
}
echo "\nafter if(\$var == \"on\"):"echo test_time()."\n</pre>";

function test_time(){
     global $prev$prev;
     list($f,$s) =explode(" "microtime());
     $now = $f+$s;
     $time = $now - $prev;
     if ($time < 0$time += 1;
     $prev = $now;
     return $time;
}

after if($var):1.16601610184
after if($var == true):1.66237401962
after if($var == "on"):2.00581383705
nog een keer:
after if($var):1.39411306381
after if($var == true):1.55902409554
after if($var == "on"):1.9059009552

En met een willekeurige string, " std::operator<<<std::char_traits<char> > (401C00h) " op alle plekken:
after if($var):1.12949800491
after if($var == true):2.12889409065
after if($var == "on"):1.52041006088
Nog een keer:
after if($var):1.18337392807
after if($var == true):1.73573708534
after if($var == "on"):1.65470600128

$var = '':
after if($var):1.12168693542
after if($var == true):1.69349598885
after if($var == "on"):1.93431901932

Conclusie? PHP is echt vaag 8)7
 
PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

Beetje rare conclusie, met een willekeurige PHP installatie zonder informatie over eventuele code optimizers e.d.. Wat dat betreft kun je er dan ook geen zinnig woord over zeggen.

Met een goede compiler zullen de drie lussen hier identiek zijn, omdat $var invariant is voor de loop en het derhalve op voorhand bekend is wat het resultaat van de evaluatie zal zijn

Overigens performt $var===true iets sneller dan $var==true en iets langzamer dan $var bij mij.

.oisyn wijzigde dit bericht 14-01-2009 16:23 (44%)

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

Geen optimizer, Debian etch met PHP 4.4.4-8+etch6.
 
Berichten: 10.521
Reg. datum: 13 september 2000

Misgepost in de contest thread, over te grote klassen:

Ah, als we het over te grote source files hebben, weet ik ook nog wel een mooi staaltje. :)

Een aantal universiteiten werken aan een XML database met XQuery support; genaamd MonetDB. Het ding werkt heel aardig (mits je genoeg geheugen hebt) en is modulair opgezet: de basis is een relationele in-memory database server (MonetDB) die alleen binaire tabellen ondersteunt en zorgt voor transacties, persistence, et cetera. De voor gebruikers bedoelde functionaliteit wordt in modules geïmplementeerd die code uitvoeren op de database, waarvoor een low-level (interpreted) taal bestaat (MIL).

Zo is er bijvoorbeeld een module die SQL queries kan vertalen naar MIL code en tabellen omzet in een formaat dat MonetDB efficient kan opslaan. Met die module als front-end en MonetDB als back-end hebben ze dus een efficiënte SQL server gebouwd.

Maar er is dus ook een XML module, genaamd Pathfinder. Die is behoorlijk geavanceerd, vooral waar het optimalisatie van XQuery queries betreft. Voor het verwerken van zo'n query wordt de query eerst geparst in een concrete syntax tree, dan worden er een aantal optimaliserende transformaties overheen gehaald, en tenslotte wordt MIL code gegenereerd om de query daadwerkelijk uit te voeren, en terug te transformeren naar XML.

Ik moet er bij vertellen dat het hele gebeuren geschreven is in C. Er wordt intensief gebruik gemaakt van lex en yacc om allerlei talen (MIL, XQuery, XML, SQL, et cetera) te parsen. Verder wordt er nogal veel gebruik gemaakt van een wat obscure tool genaamd BURG om transformaties op een boomstructuur uit te voeren, wat dus wordt gebruikt om een concrete syntax tree om te zetten in een abstract syntax tree en om alle optimalisaties uit te voeren. Ik had er voor ik dit project tegenkwam ook nooit van gehoord.

Anyway, dit alles om een beetje context te geven. Waar ik naar toe wilde, was de grootte van de broncode. Als ik de handgeschreven broncode van alleen de Pathfinder compiler (nog niet eens de runtime) bekijk, zonder Makefiles of gegenereerde source files, dan tel ik 137603 regels; dat is voor een groot project niet zo schrikbarend, ware het niet dat deze regels verspreid zijn over 103 bestanden. Nu zou je zenuwachtig moeten worden, want dit betekent dat een gemiddelde source file al 1336 regels bevat (bijna 1337 :P).

Neem de top 10 grootste bestanden:
  11792 ./MonetDB4-XQuery/pathfinder/compiler/mil/milprint_summer.c                  
   9631 ./MonetDB4-XQuery/pathfinder/compiler/mil/milgen.brg                         
   6008 ./MonetDB4-XQuery/pathfinder/compiler/sql/lalg2sql.brg                       
   5832 ./MonetDB4-XQuery/pathfinder/compiler/algebra/builtins.c                     
   4551 ./MonetDB4-XQuery/pathfinder/compiler/algebra/logical.c                      
   4082 ./MonetDB4-XQuery/pathfinder/compiler/core/fs.brg                            
   3623 ./MonetDB4-XQuery/pathfinder/compiler/algebra/physical.c                     
   3536 ./MonetDB4-XQuery/pathfinder/compiler/algebra/planner.c                      
   3466 ./MonetDB4-XQuery/pathfinder/compiler/algebra/core2alg.brg                   
   3152 ./MonetDB4-XQuery/pathfinder/compiler/algebra/map/intro_proxy.c

Holy shit! Duizenden regels broncode per bestand! milprint_summer.c heet zo omdat gebaseerd is op code die een student in een zomerproject geschreven heeft. Bijna twaalfduizend regels! Ik moet er niet aan denken al die code te moeten lezen, laat staan schrijven!

Het is overigens behoorlijk nette code. Er staat ook regelmatig zinnig commentaar in (maar minder dan de helft van de tekst; d.w.z. het merendeel is wel echt code) en er zijn geen TheDailyWTF-waardige constructies waarbij een stukje tekst duizend keer gecopypaste wordt omdat de auteur niet bekend is met het fenomeen for-loop.

Overigens zijn dit alleen handgeschreven source files; tools als lex, yacc en BURG genereren hiervan weer C source files die nog véél groter zijn; zo erg zelfs dat ik de boel met GCC niet mét optimalisaties kan compileren omdat de tussentijdse datastructuren niet in mijn 1 GB geheugen passen. (GCC houdt dan alle functies in het geheugen om inter-functie optimalisaties als inlining te kunnen toepassen.)

De moraal van dit verhaal: ik weet niet precies wanneer een source file té groot wordt, maar ik vermoed dat rond een regel of 5000 de grens van het betaambare wel overschreden is.
Berichten: 309
Reg. datum: 26 november 2008

quote:
Soultaker schreef op woensdag 14 januari 2009 @ 16:55:
De moraal van dit verhaal: ik weet niet precies wanneer een source file té groot wordt, maar ik vermoed dat rond een regel of 5000 de grens van het betaambare wel overschreden is.
Dan nodig ik je van harte uit enkele van de Progress source-files te komen bekijken, alles ongedocumenteerd, ongestructureerd, redundant en voorzien van een behoorlijk hoog WTF niveau op een niet gering aantal plekken.
De grootste, die ik tot nu toe gezien heb, is ruimschoots over de 8000 regels, waarvan, naar schatting, 5% (slecht, nietszeggend) commentaar is.
De erfenis van een pakket met roots van +25 jaar oud wat we aan het overbouwen zijn naar .NET, de aspirines liggen altijd binnen handbereik zal ik maar zeggen :+

"Gravitation is not responsible for people falling in love." Albert Einstein

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

@Soultaker: En dat vind je erg? Wat dacht je van 1 bestand met 33642 regels COBOL-code? :+

Ik heb geen idee hoeveel daarvan gegenereerd is, bovenaan staat 'generation result of MAESTRO II', maar wat ik heb gehoord deed dat ding heel weinig.
offtopic:
Ik heb nog steeds geen NDA getekend, dus geen idee of dit al teveel informatie is... :X == WTF op stageplek

MBV wijzigde dit bericht 14-01-2009 17:10 (18%)

 
Berichten: 10.521
Reg. datum: 13 september 2000

quote:
MBV schreef op woensdag 14 januari 2009 @ 17:09:
En dat vind je erg? Wat dacht je van 1 bestand met 33642 regels COBOL-code? :+
Ja, ik vind dat erg ja. :X Als source files van duizenden regels de norm zijn, is je project toch een beetje ontspoort. (Ik zou die code niet willen onderhouden!)
quote:
Sintax schreef op woensdag 14 januari 2009 @ 17:02:
Dan nodig ik je van harte uit enkele van de Progress source-files te komen bekijken, alles ongedocumenteerd, ongestructureerd, redundant en voorzien van een behoorlijk hoog WTF niveau op een niet gering aantal plekken.
Ik denk dat je het niet erg vind als ik dit aanbod afsla. :+

Het verbaast me overigens niet dat dit blijkbaar wel vaker voorkomt, maar toch... 8)7
Cheer Bear

quote:
.oisyn schreef op woensdag 14 januari 2009 @ 11:02:
[...]


Je kunt gewoon direct $result returnen. Wat je nu doet is iig fout, omdat een functie die false, 0, 0.f of een lege string returnt dan genegeerd wordt (en niets returnen is hetzelfde als null returnen)
Yeah ik zat even te twijfelen ook wat er gebeurde in de situatie dat call_user_func een void functie zou aanroepen, maar volgens mij kan je gewoon meteen returnen idd.
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
Soultaker schreef op woensdag 14 januari 2009 @ 17:23:
[...]

Ja, ik vind dat erg ja. :X Als source files van duizenden regels de norm zijn, is je project toch een beetje ontspoort. (Ik zou die code niet willen onderhouden!)
Wat dacht je van het magic word 'COBOL'? Ook software moet je af en toe afschrijven, na 40 jaar trouwe dienst is dat niet onverstandig :X
quote:
[...]

Ik denk dat je het niet erg vind als ik dit aanbod afsla. :+

Het verbaast me overigens niet dat dit blijkbaar wel vaker voorkomt, maar toch... 8)7
Meestal legacy waarbij het voorkomt, niemand begint met 10.000 regels. Soms zou opsplitsen de code alleen maar onoverzichtelijker maken, maar meestal wordt er aan een bestand van 1000 regels 100 regels toegevoegd, en nog eens, en nog eens... Het zou wel leuk zijn om eens naar te kijken, maar ik heb geen geschiedenis van de COBOL-code waar ik het over had. Had ik bij mijn HBO-stage wel kunnen bekijken, maar daar kom ik niet meer in. Shell had de beveiliging best goed opgezet ;)
 
Applig
Berichten: 486
Reg. datum: 03 januari 2008

Niet slecht als in bad, maar slecht als in evil(No worries, geen virussen of malware oid):
http://www.lagzero.net/
en dan de source code even bekijken.

хочет знать все?

Dansende KAME = IPv6 ready
Berichten: 5.745
Reg. datum: 12 februari 2001

Zelfs als ASCII- art ziet het er nog ranzig uit -O-

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett

Lotus Notes Geek

quote:
Blonde Tux schreef op woensdag 14 januari 2009 @ 20:26:
Niet slecht als in bad, maar slecht als in evil(No worries, geen virussen of malware oid):
http://www.lagzero.net/
en dan de source code even bekijken.
De persoon die dit in de source heeft verwerkt heeft een erg zieke geest.
Je genereert wel een boel traffic, door al die mensen die even de source komen bekijken.

http://hawvie.deviantart.com/

dotnetter
Berichten: 9.032
Reg. datum: 02 februari 2004

Die link is niet bepaald GoT-policy proof hè.. >:)

Kater? Eerst water, de rest komt later
Last.fm profiel
Staat open voor nieuwe uitdaging in omgeving Haarlem (ASP.NET)

Efficientieproblemen -.-"
Berichten: 92
Reg. datum: 30 april 2008

Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
Function searchRow($playField$width$heigth) {
    // Horizontal
    for ($o = 1$o <= $heigth$o++) {
        for ($i = 1$i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}
?>

Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.

' Knowledge Beats Power.

Weersverwachting 21 uur:
Berichten: 13.736
Reg. datum: 24 april 2000

quote:
MBV schreef op woensdag 14 januari 2009 @ 16:41:
Geen optimizer, Debian etch met PHP 4.4.4-8+etch6.
Pak je ook wel een goede versie mee, 5.2.8 is alweer een paar weken uit... PHP4 is al jaren depricated.

edit: wat voor slome server test je dat op? Op mijn niet-belachelijk-snelle server:
code:
1
2
3
4
starting: 
after if($var):0.0337429046631
after if($var == true):0.0222730636597
after if($var == "on"):0.0260539054871

Cartman! wijzigde dit bericht 15-01-2009 23:11 (30%)

De minimumtemperatuur ligt vannacht tussen de 2 en 5°C. De wind is matig, kracht 3 uit Z.

Cheer Bear

Vergelijk hem nu eens met if($var == "dit is een hele lange string") waarbij $var = "dit is een hele lange string". Ik wil even kijken of PHP aan string interning doet bij ==, of dat hij gewoon die strings lineair terplekke vergelijkt en dus van de orde O(n) is. Benchmark daarbij dus even met verschillende lengtes, i.e. een string die twee keer zo lang is en kijk of de tijd ook gelijkmatig oploopt. Dat zijn interessantere benchmarks imo. "on" is slechts 2 karakters en geeft niet zo'n goed beeld hierover. Grotere inputsizes geven een beter beeld.

prototype wijzigde dit bericht 16-01-2009 00:11 (5%)

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

K6-2 500MHz, doet het prima als fileserver en de webserver wordt toch wel beperkt door de ADSL-lijn van mijn ouders. 30 watt, beat that! (EEE-box staat te trappelen voor de vervanging, en PHP5 zou veel sneller moeten zijn)
offtopic:
Eigenlijk zou ik mijn server naar mijn kamer met UPC moeten halen, maar dan moet ik het DNS weer aanpassen enzo. Gezien een paar plannen ga ik denk ik voor een hoster die ¤5 vraagt voor een server met 10GB schijfruimte :)


@Prototype: Ja doei, installeer maar XAMPP of pak een livecd van Ubuntu :w

Dit is niet het 'hoe baggertraag is PHP'-topic (heel traag: debian shootout), maar slechte programmeervoorbeelden-topic.

MBV wijzigde dit bericht 16-01-2009 00:17 (31%)

 
Cheer Bear

quote:
MBV schreef op vrijdag 16 januari 2009 @ 00:12:
@Prototype: Ja doei, installeer maar XAMPP of pak een livecd van Ubuntu :w

Dit is niet het 'hoe baggertraag is PHP'-topic (heel traag: debian shootout), maar slechte programmeervoorbeelden-topic.
Hey, ik begon er niet mee he? ;) Hier komt PHP er iig niet op :P
PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

after if($var):0.0260169506073
after if($var == true):0.0304319858551
after if($var == "on"):0.0354740619659
after if($var == "Dit is een heel erg lange string!!!1111pppp"):0.0444598197937
after if($var == "Dit is een heel erg lange string!!!1111pppp" (x10)):0.122269153595


Het mooie is, de code in de laatste loop doet een if ($var == $var2) omdat ik geen zin had de string 10x achter elkaar in de code te zetten. Dus om je vraag te beantwoorden: nee, hij doet niet aan string interning.

PHP 5.6.2 mét Zend optimizer. Prutswerk dus.

.oisyn wijzigde dit bericht 16-01-2009 02:06 (32%)

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

Kijk, dat verklaart ook waarom mijn server een factor 30 langzamer is dan die van Cartman. Zend optimizer is niet echt GPL, dus die zit niet in Debian ;) En zoals al gezegd: voor mij is het niet spannend, die internetverbinding is de bottleneck.
 
Berichten: 3.528
Reg. datum: 20 december 2002

quote:
.oisyn schreef op woensdag 14 januari 2009 @ 15:06:
[...]

Hoe kom je aan die aanname? Je moet een vergelijking doen. Of die vergelijking met een impliciete true gedaan wordt of een expliciete waarde die je opgeeft, het blijft een vergelijking tussen twee waarden. Als je vergelijkt met een constante (true), dan is het resultaat zelfs exact identiek en is er dus ook geen enkele reden waarom dat op een andere manier gecompileerd zou moeten worden.
Ik wist niet dat de compiler dat zo zou implementeren. Met het beetje kennis van Z80 assembly weet ik dat je equality to 0 met een goedkopere processor instructie checken. Bovendien kun je dat ook implementeren als een conditionele jump instructie a.d.h.v. een register value die al dan niet 0 is. Dan hoef je dus helemaal geen compare uit te voeren.

Grijze Vos wijzigde dit bericht 16-01-2009 11:16 (3%)

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

No time for love, doctor Jones
Berichten: 7.612
Reg. datum: 20 september 2001

quote:
Grijze Vos schreef op vrijdag 16 januari 2009 @ 11:13:
Ik wist niet dat de compiler dat zo zou implementeren. Met het beetje kennis van Z80 assembly weet ik dat je equality to 0 met een goedkopere processor instructie checken. Bovendien kun je dat ook implementeren als een conditionele jump instructie a.d.h.v. een register value die al dan niet 0 is. Dan hoef je dus helemaal geen compare uit te voeren.
Volgens mij jump je altijd conditioneel op een status vlag/bit, vnl SF (sign flag) en ZF (zero flag). Een aantal berekeningen zetten die flags, en compares doen dat zonder verdere side-effects. Als je doet "cmp eax,4" dan doet hij intern "eax - 4" en zet dan SF en ZF. Een "jne" is dan "jump if not ZF", een "jg" wordt "jump if SF". Een conditional jump doet dus zelf geen daadwerkelijke berekeningen, maar checked gewoon altijd een of twee vlaggen. In een loop hoef je ook geen compare te doen, want als ik een counter decrease "dec ecx", dan kan ik meteen kijken of het resultaat 0 is door de ZF te inspecteren. Een volgende "jnz" werkt dan gewoon.

( http://books.google.com/b...p;ct=result#PRA1-PA292,M1 )

Zoijar wijzigde dit bericht 16-01-2009 12:03 (10%)

 
PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

Voor de volledigheid, een cmp is identiek aan een sub zonder resultaat, en een test is identiek aan een and zonder resultaat :)
quote:
GuShe schreef op donderdag 15 januari 2009 @ 22:45:
Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
Function searchRow($playField$width$heigth) {
    // Horizontal
    for ($o = 1$o <= $heigth$o++) {
        for ($i = 1$i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}
?>

Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.
Of ik ben scheel, of ik zie echt niet wat hier nu fout gaat, behalve dat je na de 1e rij ($o) FALSE terug geeft omdat de return in de $o loop staat.

Edit: Nevermind.Ik was vergeten dat PHP case sensitive is met variablen :o

ShadowLord wijzigde dit bericht 16-01-2009 13:45 (3%)

Reizen rules! || Syteem specs

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"

quote:
ShadowLord schreef op vrijdag 16 januari 2009 @ 13:40:
[...]

Of ik ben scheel, of ik zie echt niet wat hier nu fout gaat, behalve dat je na de 1e rij ($o) FALSE terug geeft omdat de return in de $o loop staat.
Nouja ik vind het sowieso een heel aparte manier ..trouwens, hij kijkt verticaal niet horizontaal ;)
 
Fulltime #whatpulsert

quote:
Grijze Vos schreef op woensdag 14 januari 2009 @ 15:01:
[...]

of je leest de laatste regel van mijn post?
Daar was ik nog niet met lezen, ik had immers ook een andere post gequote. Ik had niet gekeken of jij het die tweede keer ook was.

Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.

J2EE Developer

quote:
GuShe schreef op donderdag 15 januari 2009 @ 22:45:
Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
Function searchRow($playField$width$heigth) {
    // Horizontal
    for ($o = 1$o <= $heigth$o++) {
        for ($i = 1$i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}
?>

Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.
ik vermoedt het het in de schrijfwijze van $playField zit die niet altijd hetzelfde is :)

Assumption is the mother of all fuck ups

PM FroPod
Berichten: 29.623
Reg. datum: 26 september 2000

Ik vermoed (zonder t) simpelweg het niet aanzetten van error reporting (met iig E_NOTICE). Had een hoop tijd gescheeld.
Berichten: 5.716
Reg. datum: 10 juli 2002

De return FALSE; staat binnen de eerste for loop, dat klopt toch niet?
150/50 Warlock
Berichten: 716
Reg. datum: 13 december 2005

quote:
Michali schreef op vrijdag 16 januari 2009 @ 15:51:
De return FALSE; staat binnen de eerste for loop, dat klopt toch niet?
Da's WTF nummer 2 ;)

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ 5850 1GB

getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

WTF nummer 3 is dat hij nog geen PHP debugger gebruikt. Installeer Eclipse met PDT, en je ziet dit soort fouten direct!
 
Cheer Bear

quote:
.oisyn schreef op vrijdag 16 januari 2009 @ 02:02:
after if($var):0.0260169506073
after if($var == true):0.0304319858551
after if($var == "on"):0.0354740619659
after if($var == "Dit is een heel erg lange string!!!1111pppp"):0.0444598197937
after if($var == "Dit is een heel erg lange string!!!1111pppp" (x10)):0.122269153595


Het mooie is, de code in de laatste loop doet een if ($var == $var2) omdat ik geen zin had de string 10x achter elkaar in de code te zetten. Dus om je vraag te beantwoorden: nee, hij doet niet aan string interning.

PHP 5.6.2 mét Zend optimizer. Prutswerk dus.
En kijk, dit verbaast me nou helemaal niks dus he. Zelfs met een "optimizer" kon deze string literal niet even ge-interned worden om tot een constant time == te komen... De code laat het iig harstikke hard toe... tijdens compiletime was alles bekend zeg maar, immers krijgt $var niet in de tussentijd nog even een andere variabele toegekend die pas tijdens runtime ofzo bekend zou zijn. Dat doen andere talen toch net even iets beter door gewoon in dergelijke situaties de strings te internen en de vergelijking op "object id's/hashcodes" te laten plaatsvinden. Huilie huilie dus...
getfirefox.com
Berichten: 12.034
Reg. datum: 02 februari 2002

quote:
Je bedoelt PHP.NET? :X

Kent iemand trouwens een PHP applicatie van meer dan 3 jaar oud, dat nog niet wordt gezien als Legacy-code? :X

Oh ja, ook minstens 50 KLOC, anders telt het niet als grote applicatie ;)

MBV wijzigde dit bericht 16-01-2009 20:04 (12%)

 
Berichten: 309
Reg. datum: 26 november 2008

Nee, vs.php, een plugin voor Visual Studio :)

Op de site:
quote:
VS.Php is a Php IDE (integrated development environment) based on Visual Studio IDE. With VS.Php you can design, develop, debug and deploy Php applications within the Visual Studio IDE. VS.Php key features are around providing rich Php editor as well as Smarty editing capabilities. Also is the ability to debug Php scripts locally as well as remotely.
Amazing, Mike!

Sintax wijzigde dit bericht 16-01-2009 20:20 (81%)

"Gravitation is not responsible for people falling in love." Albert Einstein

Berichten: 4.913
Reg. datum: 28 januari 2000

*auw auw auw*
PHP:

1
2
3
4
5
6
7
8
9
10
11
<?php
Index5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
===================================================================
--- a/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
+++ b/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
@@ -232,5 +232,5 @@
         function mark_deleted($id) {
                 parent::mark_deleted($id);
-                $q = "update inbound_email set groupfolder_id = null";
+                $q = "update inbound_email set groupfolder_id = null WHERE id = $id";
                 $r = $this->db->query($q);
                 $this->deleteCache();
?>

 
Programeerder

Ja die update is wel handig ja :+

US = the promised land. One day... One day!
.oisyn: [..] Ik kan me geen slechtere zoekterm voorstellen dan "C++ panel". Afgezien van "naveltruitje" oid. [...]

Berichten: 46.292
Reg. datum: 25 februari 2004

Ik hoop dat je die niet in productie gedraaid hebt? :+

Omines - Snel en gratis juridisch advies
Standeman: Ik wil mijn ballen ook wel doneren hoor, ik doe er toch ook niets meer mee.

achter de duinen

quote:
Config schreef op zondag 18 januari 2009 @ 03:16:
*auw auw auw*
PHP:

1
2
3
4
5
6
7
8
9
10
11
<?php
Index5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
===================================================================
--- a/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
+++ b/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
@@ -232,5 +232,5 @@
         function mark_deleted($id) {
                 parent::mark_deleted($id);
-                $q = "update inbound_email set groupfolder_id = null";
+                $q = "update inbound_email set groupfolder_id = null WHERE id = $id";
                 $r = $this->db->query($q);
                 $this->deleteCache();
?>

Bekend :$

Leve PIT-recovery :P

It was when I was happiest that I longed most. It was on happy days when we were up there on the hills, the three of us, with the wind and the sunshine ...

dotnetter
Berichten: 9.032
Reg. datum: 02 februari 2004

Hèhè iets vergelijkbaars heeft mijn voorganger een keer op de productieomgeving van een klant gedaan, waardoor in een klap alle records van een bepaalde entiteit gewist werden. Het werd pas echt zuur toen daarna ook nog eens bleek dat er geen backup gedraaid kon worden, ik weet niet meer precies hoe dat zat, maar het was niet helemaal goed geconfigureerd :X

Kater? Eerst water, de rest komt later
Last.fm profiel
Staat open voor nieuwe uitdaging in omgeving Haarlem (ASP.NET)

Lotus Notes Geek

mmm, misschien lees ik er overheen maar er wordt toch alleen maar een entity verwijderd waarvan de groupfolder null is en het ID klopt met datgene wat er is opgegeven. Dat de parent wordt verwijdert is de echte fout (maar dat kan ik niet bepalen aan de hand van de opgegeven code ,ken de context niet ).
De eerste declaratie van $q is toch overschreven door de tweede?

ik ga er even van uit dat voor het aanroepen van deze methode al is gecontrolleerd of de ID geldig is etc..
Ik blog over ZF

quote:
Webgnome schreef op zondag 18 januari 2009 @ 11:09:
mmm, misschien lees ik er overheen maar er wordt toch alleen maar een entity verwijderd waarvan de groupfolder null is en het ID klopt met datgene wat er is opgegeven. Dat de parent wordt verwijdert is de echte fout (maar dat kan ik niet bepalen aan de hand van de opgegeven code ,ken de context niet ).
De eerste declaratie van $q is toch overschreven door de tweede?

ik ga er even van uit dat voor het aanroepen van deze methode al is gecontrolleerd of de ID geldig is etc..
Het is een diff. Deze patch haalt de regel met een - ervoor weg en plaatst een regel met de + ervoor. Oftewel, de query wordt aangepast want hij was niet zoals bedoeld :p

From Twitter: "For #zf2 you don't need my module for Gedmo Doctrine Extensions integration anymore, you can use Composer for that: http://t.co/RTltxwpR"

Pagina: 1 2 3 4 5 6 7 8 9 10 11 12 ... 84 85 86 87 last



VNU Media logo Hosted by True

© 1998 - 2012 Tweakers.net B.V. - Alle rechten voorbehouden - Contact - Jouw privacy - Algemene Voorwaarden

Uitgever van:

Website van het jaar 2011