Eerst het probleem, dan de oplossing
Komt daar via de (JIT) compiler niet overal dezelfde machinecode uit?lier schreef op dinsdag 19 oktober 2010 @ 08:44:
[...]
Het is nog vroeg, maar je had het willen optimaliseren naar:
SQL:
1 2 WHERE LN_LINETYPE_ID > 9 AND LN_LINETYPE_ID < 20
of zoiets:
SQL:
1 WHERE LN_LINETYPE_ID BETWEEN 9 AND 20
Vast, maar dat wil niet zeggen dat het brakke code is.Davio schreef op dinsdag 19 oktober 2010 @ 09:11:
[...]
Komt daar via de (JIT) compiler niet overal dezelfde machinecode uit?
Anders zou je ook hele lappen dezelfde geneste if statements kunnen schrijven "omdat de compiler het toch wel optimaliseert"

418O2 schreef op vrijdag 15 oktober 2010 @ 11:06:
Ah, heb er zelf ook 1 op mijn naam zie ik net
C#:
1 2 3 4 5 6 public virtual void Birthday(Employee em, DateTime date) { this.date = new DateTime(2009, date.Month, date.Day); this.message = em.FullName + " wordt " + this.getAge(date); this.employee = em; }
Mijn eerste C# project, zon 2 jaar gelden. Nu bezig met een revisie.
Vroeg me al of waarom die set niet goed werd gesorteerd.
Is het vandaag glazen-bollen-dag ofzo?Wijnbo schreef op dinsdag 19 oktober 2010 @ 08:35:
SQL:
1 2 WHERE LN_LINETYPE_ID >= 10 AND LN_LINETYPE_ID < 20
![]()
![]()
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
JaH vandaag ook weer eentjeuh:.oisyn schreef op dinsdag 19 oktober 2010 @ 12:14:
[...]
[...]
Is het vandaag glazen-bollen-dag ofzo?
1
| Bol bol = new GlazenBol(1337); |







Had er al een toevoeging bij gezet he.oisyn schreef op dinsdag 19 oktober 2010 @ 12:14:
[...]
[...]
Is het vandaag glazen-bollen-dag ofzo?
YopY schreef op dinsdag 19 oktober 2010 @ 12:36:
[...]
JaH vandaag ook weer eentjeuh:
code:
1 Bol bol = new GlazenBol(1337);
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
1
| Bol bol = new (Bol)GlazenBol(1337); |
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.
Of was het grappig bedoelt, en niet als verbetering?
Edit: Spuit 94358304
[ Voor 9% gewijzigd door !null op 19-10-2010 16:19 ]
Ampera-e (60kWh) -> (66kWh)
Verwijderd
1
| Bol bol = (Bol)new GlazenBol(1337); |
Maar ja, echt nodig is het niet.
1
| Bol bol = bol; Bol punt = com; |
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
ReSharper zal dan ook aangeven dat het een overbodige cast is.Verwijderd schreef op dinsdag 19 oktober 2010 @ 17:13:
Zelfs zn cast is fout XD
C#:
1 Bol bol = (Bol)new GlazenBol(1337);
Maar ja, echt nodig is het niet.
R#
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
We are shaping the future
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
| private void SetAccount(RequisitionData.RequisitionItem requisitionItem, AccountData.Account account, bool automation) { bool allowSetAccount = false; if(account != null) { // if the account entry is being set by automation, ensure that // the user hasn't already set a value if (automation) { if (!requisitionItem.IsAccountCodeNull()) { if (requisitionItem.AccountCode == string.Empty) allowSetAccount = true; else allowSetAccount = true; } else allowSetAccount = true; } else allowSetAccount = true; if (allowSetAccount) { requisitionItem.AccountID = account.ID; requisitionItem.AccountCode = account.Code; } } } |
Er ontspon wel een discussie dat het misschien opzettelijk was met het oog op toekomstige wijzigingen en dan niet zo gek was.
Opgave was om te kijken of een bepaalde lijst getallen allen gelijk waren
Simplified code die er dan als oplossing gegeven was:
Los van de paar schoonheidsfoutjes die erin zitten, is het hele concept wat hier gebruikt wordt nogal vaag....
1
2
3
4
5
6
7
8
| public boolean allEqual(List<Integer> numbers){ int first = numbers.get(0); int counter = 1; while(counter < numbers.size() && numbers.get(counter) == first){ counter++; } return counter == numbers.size(); } |
Verwijderd
Maar vooral het aparte gebruik van de counter vond ik wel een pareltje
.get(0) op een lege lijst throws NullReferenceException (oid, weet de Java term niet)Verwijderd schreef op dinsdag 19 oktober 2010 @ 23:00:
Ik ben nu even heel erg in de war of allEqual ongedefiniëerd mag zijn voor lege lijsten. Verder vind ik het een geweldig voorbeeld hoe je een oplossing niet moet uitleggen
Going for adventure, lots of sun and a convertible! | GMT-8
Het zijn allemaal integers, dus equals is niet echt nodig (tenzij de List ook null elements kan bevatten).
Herhaaldelijk aanroepen van size() is meestal niet inefficiënt, dus kan geen kwaad. Voor de rest vind ik het wel een goede code, al had het ook met een for-loop gekund.
[ Voor 15% gewijzigd door CoolGamer op 19-10-2010 23:18 ]
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public boolean allEqual(List<Integer> numbers) { if (numbers == null || numbers.size() == 0) return false; int first = numbers.get(0); for (int i : numbers) { if (i != first) return false; } return true; } |
Zo zou ik 'm dan doen, is denk ik iets logischer.
@ Silentuz; even m'n IndexOutOfBoundsException gefixed in dat geval. Dank u.
[ Voor 14% gewijzigd door iBasch op 19-10-2010 23:19 ]
Op een null variable krijg je NullPointerException.Snake schreef op dinsdag 19 oktober 2010 @ 23:07:
[...]
.get(0) op een lege lijst throws NullReferenceException (oid, weet de Java term niet)
Op een lege lijst vraag je gewoon een element buiten de index range op, en krijg je dus een IndexOutOfBoundsException.
@iBasch
Dat kan nog steeds een IndexOutOfBoundsException opleveren op een lege lijst, je moet daar expliciet de size voor checken.
edit:
Maar wat mij betreft is dat allemaal standaard lelijk programmeren wat er fout is. Het hele concept van je counter gebruiken om te kijken of je sequence van gelijke getallen even lang is als je lijst, vind ik nogal bizar.
[ Voor 33% gewijzigd door Silentuz op 19-10-2010 23:18 ]
Mja, dan voeg je 'YAGNI' toe, en implementeer je pas op het moment dat het nodig is (en de requirements daadwerkelijk afgemaakt / duidelijk worden). Voor hetzelfde veranderen die requirements nooit, en dan zie je vijf jaar terug je code terug op TDWTF.YellowOnline schreef op dinsdag 19 oktober 2010 @ 18:56:
Er ontspon wel een discussie dat het misschien opzettelijk was met het oog op toekomstige wijzigingen en dan niet zo gek was.
En dan hadden ze dat er als commentaar bij moeten zetten, eventueel met een opmerking richting degene die de requirements maakt (of niet afgemaakt heeft) en degene die besloten heeft dat ze een overbodig stuk code uit moeten werken ;D.
Bijna goed, het is NullPointerException..get(0) op een lege lijst throws NullReferenceException (oid, weet de Java term niet)
En een controle daarvoor is dodelijk eenvoudig:
1
| if (numbers == null) return true; // niks == niks, ;D |
of beter nog:
1
2
3
4
5
| /** * (bla bla bla) * @param numbers The numbers to check. Please don't pass nulls, unless you actually enjoy NPE's. */ public boolean allEqual(List<Integer> numbers){ |
wat ook nog kan:
1
2
| public boolean allEqual(List<Integer> numbers){ assert numbers != null : "The Numbers list cannot be null"; |
waar je java in development omgevingen met -ae (asserts enabled) laat draaien. Zo krijg je alleen controles tijdens het ontwikkelen, en als het goed is is dat de enige keer dat iemand nulls naar zo'n functie stuurt (als het geen publieke API is). Als het wél een publieke API is doe je
1
| if (numbers == null) throw new IllegalArgumentException("Numbers cannot be null"); |
of
1
| Validator.notNull(numbers) |
(apache commons validator, op zich eenvoudig stukje code, maar toch).
Verwijderd
En null moet gewoon dood. Ik heb veel liever een expliciete nullability (zoals in C#) of een apart type (de Maybe monad in Haskell) dan het "is m'n parameter misschien null?"-feest dat Java heet. Wat dat betreft hoort heel Java in dit topic thuis.
[ Voor 3% gewijzigd door Verwijderd op 19-10-2010 23:27 ]
1
2
3
4
5
6
7
8
9
10
11
12
| public static bool areEqual(List<int> numbers) { if(numbers == null || numbers.count <= 0) return true; for(int i = 1; i < numbers.count; i++) if(numbers[i] != numbers[i-1]) return false; return true; } |
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
| public static bool areEqual(List<int> numbers) { if(numbers == null) return true; for(int i = 1; i < numbers.count; i++) if(numbers[i] != numbers[i-1]) return false; return true; } |
zo werkt hij precies hetzelfde.
waarschijnlijk kan je die == null ook wel weghalen, afhankelijk van wat numbers.count teruggeeft als numbers niet bestaat (een error?)
[ Voor 58% gewijzigd door Verwijderd op 19-10-2010 23:42 ]
Je kan beter een scenario teveel meenemen dan te weinig
**edit, over die for lus skippen.
Daar had ik niet eens over nagedacht

[ Voor 13% gewijzigd door TJHeuvel op 19-10-2010 23:43 ]
Verwijderd
Mijn punt blijft dat het niet juist gespecificeerd is wat het gedrag moet zijn als de lijst leeg is. Je kunt namelijk beredeneren dat er in een lege lijst geen getallen zijn, dus ze kunnen ook nergens aan gelijk zijn, dus mag je geen lege lijsten meegeven.
Niet dat dit in dit geval een probleem is, maar het is wel het soort fouten die toekomstige Climate Orbiters op Mars laten neerstorten, simpelweg omdat verschillende programmeurs verschillende invullingen geven aan gaten in een specificatie.
[ Voor 9% gewijzigd door Verwijderd op 19-10-2010 23:50 ]
Maar qua leesbaarheid zou ik de isEmpty() method gebruiken.
http://download.oracle.com/javase/6/docs/api/index.html
Edit: Oh wacht, men gaat ineens over op C#.
[ Voor 12% gewijzigd door yade op 20-10-2010 00:01 ]
Verwijderd
En het gebruik van isEmpty en iterators is inderdaad een heel stuk leesbaarder dan het gebruik van size en get. Maar het gaat in dit topic niet om leesbaarheid, maar om hele foute voorbeelden
Niemand.yade schreef op dinsdag 19 oktober 2010 @ 23:52:
Edit: Oh wacht, men gaat ineens over op C#.Wie begint een method nou met een lowerCase in c#?
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
1
2
3
4
| public static bool AreEqual( List<int> list) { return list == null || list.TrueForAll(x => x == list.First()); } |
Zo kan hij ook nog.
Da's een goed stukje code. Alleen Chuck Norris heeft lijsten met negatieve lengte. En laat het nou net ook Chuck Norris zijn die wél door 0 kan delen.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Redelijkerwijs kun je echter het gedrag vinden voor een lege lijst. Als je de volgende twee functies hebt:Verwijderd schreef op dinsdag 19 oktober 2010 @ 23:49:
Mijn punt blijft dat het niet juist gespecificeerd is wat het gedrag moet zijn als de lijst leeg is. Je kunt namelijk beredeneren dat er in een lege lijst geen getallen zijn, dus ze kunnen ook nergens aan gelijk zijn, dus mag je geen lege lijsten meegeven.
1
2
| allElementsAreEqual :: [a] -> Bool containsDifferentElements :: [a] -> Bool |
Dan wil je dat de volgende vergelijking geldt:
1
| allElementsAreEqual = not . containsDifferentElements |
Met deze vergelijking in het achterhoofd, welke invulling in onderstaande code is dan het meest logische?
1
2
| allElementsAreEqual [] = ? containsDifferentElements [] = ? |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php $resolution_id = addslashes(trim($_POST["id"])); $resolution_description = addslashes(trim($_POST["description"])); $resolution_width = addslashes(trim($_POST["width"])); $resolution_height = addslashes(trim($_POST["height"])); $resolution_name = $resolution_width . "x" . $resolution_height; $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionW = " . $resolution_width . " WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionH = " . $resolution_height . " WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionName = '" . $resolution_name . "' WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionDescription = '" . $resolution_description . "' WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); echo("<b>Resolution " . stripslashes(trim($resolution_name)) . " was updated.</b><br />\n"); ?> |
Oh en wtf @ trim
Die kan ik wel verklaren tho, alle velden in de database waren char(n) ipv varchar(n) in MSSQL
[ Voor 5% gewijzigd door Noxious op 20-10-2010 09:56 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Ehm..

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Geven UPDATE queries een resultaat terug; Heeft "free" enig nut na een UPDATE? Volgens mij geven die queries totaal geen resultaat terug.Noxious schreef op woensdag 20 oktober 2010 @ 09:54:
Ik heb een collega die niet helemaal snapt dat je in een UPDATE query meerdere velden kan meegeven geloof ik
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php $resolution_id = addslashes(trim($_POST["id"])); $resolution_description = addslashes(trim($_POST["description"])); $resolution_width = addslashes(trim($_POST["width"])); $resolution_height = addslashes(trim($_POST["height"])); $resolution_name = $resolution_width . "x" . $resolution_height; $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionW = " . $resolution_width . " WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionH = " . $resolution_height . " WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionName = '" . $resolution_name . "' WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); $stmt = sqlsrv_query($conn, "UPDATE Resolutions SET ResolutionDescription = '" . $resolution_description . "' WHERE ID = " . $resolution_id); sqlsrv_free_stmt($stmt); echo("<b>Resolution " . stripslashes(trim($resolution_name)) . " was updated.</b><br />\n"); ?>
Oh en wtf @ trim
Die kan ik wel verklaren tho, alle velden in de database waren char(n) ipv varchar(n) in MSSQL
Let op: Mijn post bevat meningen, aannames of onwaarheden
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Neuh en sowieso:Gamebuster schreef op woensdag 20 oktober 2010 @ 11:54:
[...]
Geven UPDATE queries een resultaat terug; Heeft "free" enig nut na een UPDATE? Volgens mij geven die queries totaal geen resultaat terug.
Only needs to be called if you are worried about using too much memory while your script is running.
All statement memory will automatically be freed when the script ends.
Dikke onzin al die free's dus.
Helaas, is een intern beheersysteemCodeCaster schreef op woensdag 20 oktober 2010 @ 11:56:
Ik zou trouwens wel eens width "0--" willen posten. Heb je een url?
[ Voor 18% gewijzigd door Noxious op 20-10-2010 11:57 ]
Echter wordt ook overal trim() gebruikt bij de exports uit de database, omdat het dus char velden waren
Ja want resources vrij geven op het moment dat je ze niet meer nodig hebt, is echt onzinNoxious schreef op woensdag 20 oktober 2010 @ 11:56:
[...]
Neuh en sowieso:
Only needs to be called if you are worried about using too much memory while your script is running.
All statement memory will automatically be freed when the script ends.
Dikke onzin al die free's dus.
“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.”
In PHP is het getest dat het soms zelfs meer tijd kost dan de automatische vrijgave van resources als het script op het einde beland. Gezien het stateless is kan dit best voor te stellen zijn.Woy schreef op woensdag 20 oktober 2010 @ 13:29:
[...]
Ja want resources vrij geven op het moment dat je ze niet meer nodig hebt, is echt onzin
Waar zeg ik dat?Woy schreef op woensdag 20 oktober 2010 @ 13:29:
[...]
Ja want resources vrij geven op het moment dat je ze niet meer nodig hebt, is echt onzin

Ik vind het in een script waar deze 4 regels de enige query's zijn zonder enige return (het zijn updates, geen select oid met veel data) waar ze aan het einde van de pagina van slechts 20 regels worden vrijgegeven onzin ja.
ik ben niet zo erg thuis in C#, daarom het volgende, wat gebeurd er als er maar 1 int in de array/list zit
Krijg je dan een index out of bounds voor je kiezen
1
| for(int i = 1; i < numbers.count; i++) |
1
| for(int i = 1; i <= numbers.count; i++) |

Maar @ .oisyn : Net als java(script) krijg je dus een keiharde index out of bounds voor je kiezen (als er i <= numbers.count had gestaan?)
[ Voor 37% gewijzigd door LinuX-TUX op 20-10-2010 15:03 ]
Dan returnt ie true, duh. De for-loop wordt dan nooit uitgevoerd.LinuX-TUX schreef op woensdag 20 oktober 2010 @ 14:31:
Beste Verwijderd in "[alg] Slechtste programmeervoorbeelden d..." & CyCloneNL in "[alg] Slechtste programmeervoorbeelden d...",
ik ben niet zo erg thuis in C#, daarom het volgende, wat gebeurd er als er maar 1 int in de array/list zit
.edit: oh wacht. Ik begreep je edit niet.
[ Voor 4% gewijzigd door .oisyn op 20-10-2010 14:43 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Je geeft ook nergens aan dat het de enige 4 regels in het script zijn. Als dat zo is, dan zijn ze in dit geval misschien overbodig, maar ik zou het nog steeds geen onzin noemen om de resources expliciet vrij te geven. Het is hooguit overbodig in die situatie, maar niet slecht IMHO.Noxious schreef op woensdag 20 oktober 2010 @ 14:25:
[...]
Waar zeg ik dat?
Ik vind het in een script waar deze 4 regels de enige query's zijn zonder enige return (het zijn updates, geen select oid met veel data) waar ze aan het einde van de pagina van slechts 20 regels worden vrijgegeven onzin ja.
[ Voor 6% gewijzigd door Woy op 20-10-2010 15:16 ]
“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.”
Maargoed, da's offtopic
Edit: overigens; uit hetzelfde pareltje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| //Resolutions case "resolutions": include("/pages/resolutions.page.php"); break; case "deleteresolution": include("/pages/deleteresolution.page.php"); break; case "newresolution": include("/pages/newresolution.page.php"); break; case "saveresolution": include("/pages/saveresolution.page.php"); break; case "editresolution": include("/pages/editresolution.page.php"); break; case "updateresolution": include("/pages/updateresolution.page.php"); break; |
Dat moet toch eenvoudiger kunnen zou je zeggen
[ Voor 75% gewijzigd door Noxious op 20-10-2010 15:24 ]
1
2
3
4
5
6
7
8
| <?php $filename = "pages/".$page.".page.php"; if (file_exists($filename)) { include($filename); } ?> |
Al introduceer ik daarmee wel een beveiligingslek wat de code in jouw post niet heeft.
[ Voor 9% gewijzigd door AtleX op 20-10-2010 15:42 ]
Sole survivor of the Chicxulub asteroid impact.
Zoals je zegt is het zomaar includen van bestanden behoorlijk gevaarlijk.
White listing toepassen en controlleren met bijvoorbeeld een in_array? Dat lijkt me toch beter te zijn dan die gehele switch.AtleX schreef op woensdag 20 oktober 2010 @ 15:42:
Al introduceer ik daarmee wel een beveiligingslek wat de code in jouw post niet heeft.
Onzin is het niet. Je wilt dat geheugen zo snel mogelijk weer vrij hebben. Normaal gesproken haal je wat data op en wordt het vrijgegeven aan het einde van het script, wanneer de gehele heap van het script verwijderd wordt (neem ik aan). Dit is niet erg als er weinig geheugengebruik is door bijv. enkele kleine queries, of wanneer er niet veel meer gerekend wordt wanneer de data er is. (ophalen, weergeven, einde script)Noxious schreef op woensdag 20 oktober 2010 @ 11:56:
[...]
Neuh en sowieso:
Only needs to be called if you are worried about using too much memory while your script is running.
All statement memory will automatically be freed when the script ends.
Dikke onzin al die free's dus.
[...]
Helaas, is een intern beheersysteem
Wanneer je echter enorme lijsten met data ophaalt en daarna, wanneer je het niet meer gebruikt, nog eens andere zware berekeningen gaat draaien in PHP... dan zou je kunnen overwegen "free" te gebruiken om de extra paar microseconden aan extra rekentijd in te ruilen (hoeveel load kost een "free" op een groot query-resultaat nou eigenlijk? lijkt mij erg weinig) voor een aanzienlijk korter gebruik van veel geheugen, zodat je meer scripts naast elkaar kan draaien dan wanneer je geen "free" zou gebruiken; het geheugen wordt eerder vrijgegeven en dus kan dat vrijgegeven geheugen sneller gebruikt worden door andere scripts.
Let op: Mijn post bevat meningen, aannames of onwaarheden
Ik zou het doen met:AtleX schreef op woensdag 20 oktober 2010 @ 15:42:
PHP:
1 2 3 4 5 6 7 8 <?php $filename = "pages/".$page.".page.php"; if (file_exists($filename)) { include($filename); } ?>
Al introduceer ik daarmee wel een beveiligingslek wat de code in jouw post niet heeft.
1
2
3
4
5
| <?php $arrayMetLegaleFilenames = new Array("pagina1.php", "pagina2.php", "pagina3.php"); if($arrayMetLegaleFilenames->indexOf($filename) == -1) include($filename); ?> |
Alleen maak je zo geen Array's in PHP, maar je snapt wat ik bedoel
[ Voor 9% gewijzigd door Gamebuster op 20-10-2010 15:55 ]
Let op: Mijn post bevat meningen, aannames of onwaarheden
Verwijderd
PHP is niet inherent onveilig, de gemiddelde PHP programmeur is gewoon wat minder ervaren en daarom komt de taal als onveilig over.
Psst in_array()Gamebuster schreef op woensdag 20 oktober 2010 @ 15:54:
Ik zou het doen met:
code:
1 2 3 4 5 <?php $arrayMetLegaleFilenames = new Array("pagina1.php", "pagina2.php", "pagina3.php"); if($arrayMetLegaleFilenames->indexOf($filename) == -1) include($filename); ?>
Alleen maak je zo geen Array's in PHP, maar je snapt wat ik bedoel
If money talks then I'm a mime
If time is money then I'm out of time
Waarom niet? Ik draai een vrij druk gebruikte applicatie (~150 hits/second) op een machientje met 256MB geheugen. Er hangt een DB achter van zo'n 7GB en daaruit wordt random data gehaald. Dat werkt prima met een vrij stabiele CPU-belasting van zo'n 25-30%.Verwijderd schreef op woensdag 20 oktober 2010 @ 15:56:
Waarom zou je nog PHP gebruiken als je bezorgd bent over snelheid en geheugengebruik?
[ Voor 7% gewijzigd door AtleX op 20-10-2010 15:59 ]
Sole survivor of the Chicxulub asteroid impact.
Nou, omdat dat langzaam ontwikkelen is. Zelfs Facebook maakt hun websites in PHP, en zet het daarna automatisch om naar C++.
[ Voor 3% gewijzigd door TJHeuvel op 20-10-2010 16:11 ]
Daar zat ik ook aan te denken ja
Overigens, ik bedoel niet dat free's altijd onzin zijn, maar in dit specifieke geval wel.
Afaik gebruiken ze een andere runtime, die de boel JIT maar omzetten naar C++, volgens mij nietCyCloneNL schreef op woensdag 20 oktober 2010 @ 16:06:
Nou, omdat dat langzaam ontwikkelen is. Zelfs Facebook maakt hun websites in PHP, en zet het daarna automatisch om naar C++.
Overigens over high-level vs low-level: Met bijvoorbeeld .NET's ngen (native assembly generator) kan je .NET assemblies naar native assemblies omzetten. Dit hoef niet altijd sneller te zijn, omdat bijvoorbeeld in een .NET assembly de JIT security checks zou kunnen overslaan in bepaalde condities, wat bij een native assembly niet zou gebeuren.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Al denk ik zelf dat er meer baat is bij het minder CPU gebruik dan het minderen van laad tijd. Stel dat je op je gigantische serverpark (wat Facebook ongetwijfeld beschikt) 1% minder CPU kunt gebruiken scheelt dat natuurlijk onwijs in kosten.PHP HipHop
HipHop transforms your PHP source code into highly optimized C++ and then compiles it with g++ to build binary files. You keep coding in simpler PHP, then HipHop executes your source code in a semantically equivalent manner and sacrifices some rarely used features – such as eval() – in exchange for improved performance.
Sebazzz schreef op woensdag 20 oktober 2010 @ 16:18:
[...]
Afaik gebruiken ze een andere runtime, die de boel JIT maar omzetten naar C++, volgens mij niet
Overigens over high-level vs low-level: Met bijvoorbeeld .NET's ngen (native assembly generator) kan je .NET assemblies naar native assemblies omzetten. Dit hoef niet altijd sneller te zijn, omdat bijvoorbeeld in een .NET assembly de JIT security checks zou kunnen overslaan in bepaalde condities, wat bij een native assembly niet zou gebeuren.
HipHop for PHP isn't technically a compiler itself. Rather it is a source code transformer. HipHop programmatically transforms your PHP source code into highly optimized C++ and then uses g++ to compile it. HipHop executes the source code in a semantically equivalent manner and sacrifices some rarely used features — such as eval() — in exchange for improved performance.
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
http://github.com/facebook/hiphop-php/wiki
HipHop transforms your PHP source code into highly optimized C++ and then compiles it with g++ to build binary files. You keep coding in simpler PHP, then HipHop executes your source code in a semantically equivalent manner and sacrifices some rarely used features – such as eval() – in exchange for improved performance.
C-c-c-combobreakerkaesve schreef op woensdag 20 oktober 2010 @ 16:23:
toch wel, volgens mij:
http://github.com/facebook/hiphop-php/wiki
[...]
Van wat ik mij kon herinneren van de Tweakers.net FP was het een andere runtime, niets meer, maar blijkbaar zat ik fout.
[ Voor 13% gewijzigd door Sebazzz op 20-10-2010 16:26 ]
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Het performanceverschil tussen een PHP-programma dat werkt op een array (wat een ingewikkelde hashtable-achtige constructie is, intern) met bijvoorbeeld een C++-programma dat een std::vector gebruikt, is daardoor nog steeds gigantisch groot. Waarschijnlijk is dat ook niet praktisch op te lossen. Het enige voordeel dat je van HipHop hebt, is dat de PHP code zelf efficiënter uitgevoerd kan worden.
Maar de interpreter van de Zend Engine is niet zo traag. Meestal zit de bottleneck elders. Dus valt er met HipHop weinig te winnen, naar mijn idee, en is het nogal een zinloos project. Ik weet niet of ik de enige ben die HipHop daadwerkelijk uitgeprobeerd heeft? Zo niet, wat zijn jullie ervaringen daarmee?
[ Voor 15% gewijzigd door Soultaker op 20-10-2010 16:57 ]
Tja, niet iedereen verwacht dat zijn site zwaar belast zal worden. Als je PHP site opeens veel bezoekers krijgt kan overwegen de sourcecode te optimaliseren of de site herschrijven naar een andere omgeving. (of PHP optimzers/caches/compilers/whatever)Verwijderd schreef op woensdag 20 oktober 2010 @ 15:56:
Waarom zou je nog PHP gebruiken als je bezorgd bent over snelheid en geheugengebruik? Zeg ik nu iets heel stoms als ik dat vergelijkbaar vind met een botte bijl gebruiken voor een openhartoperatie, terwijl je bang bent voor complicaties?
Let op: Mijn post bevat meningen, aannames of onwaarheden
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Vast wel, maar of het ook sneller is is een tweede. Er zijn niet veel programmeurs slimmer dan een compiler qua optimalisaties.CyCloneNL schreef op woensdag 20 oktober 2010 @ 16:06:
Waarom bouwen we uberhaupt nog applicaties op een compiler, en typen we niet gewoon nulletjes en eentjes. Daarme haal je het meeste uit je CPU!
Ik heb het voor de lol wel even gedraaid, maar niet echt gemeten wat de prestatieverschillen waren. Het verschil was iig niet enorm.Soultaker schreef op woensdag 20 oktober 2010 @ 16:55:
Zo niet, wat zijn jullie ervaringen daarmee?
[ Voor 27% gewijzigd door AtleX op 21-10-2010 11:26 ]
Sole survivor of the Chicxulub asteroid impact.
Een compiler is ook gemaakt door mensenAtleX schreef op donderdag 21 oktober 2010 @ 11:25:
Vast wel, maar of het ook sneller is is een tweede. Er zijn niet veel programmeurs slimmer dan een compiler qua optimalisaties.
Maar was het prestatieverschil in het voordeel van HipHop of niet?Ik heb het voor de lol wel even gedraaid, maar niet echt gemeten wat de prestatieverschillen waren. Het verschil was iig niet enorm.
If money talks then I'm a mime
If time is money then I'm out of time
Verwijderd
Maar mensen kunnen in de praktijk toch wel alle instanties van het halting-probleem oplossen, en daar kan geen enkel algoritme tegen op. Op vergelijkbare manier kunnen mensen met ervaring inzichten hebben die je niet zomaar kunt abstraheren in een optimizer.
Ja door een groep mensen die jaren erover hebben gedaan om alle optimalisaties in te bouwen.
Ja.[...]
Maar was het prestatieverschil in het voordeel van HipHop of niet?
Sole survivor of the Chicxulub asteroid impact.
[ Voor 5% gewijzigd door .oisyn op 21-10-2010 11:47 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ah ja, vandaar dat iedereen chinezen inhuurt om dat te doen. Ga jij dat ook doen als je je code wilt compilen? Plus het feit dat die chinezen gebruik maken van macro's en scripts. Wat dat betreft is WoW gewoon een ontzettend slecht voorbeeld omdat je nou eenmaal gelimiteerd bent aan de real-time progressie van het spel, wat bij compilen niet het geval is (een compiler kan heel veel sneller combinaties uitproberen dan een miljoen chinezen dat kunnen)Verwijderd schreef op donderdag 21 oktober 2010 @ 12:53:
Wat betreft dat eerste: zie WoW
[ Voor 40% gewijzigd door .oisyn op 21-10-2010 14:52 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Precies, weg met die ondingen
Ohnee, doe maar niet. Anders mag ik vanaf maandag een nieuwe baan zoeken
If money talks then I'm a mime
If time is money then I'm out of time
Verwijderd
Een schoonheid die ik onlangs aantrof:
1
2
3
4
5
6
7
8
9
10
| def p = processor.process(item) if (p) { def l = [] l << p l = l.flatten() l.each { pr -> result << pr } } |
Err, ik gebruik geen compiler omdat die beter code kan genereren dan ik, maar omdat ik dan op een hoger niveau kan programmeren en daarmee m'n tijd aanzienlijk nuttiger kan besteden. Als ik het eeuwige leven had en performance van de gegenereerde code het enige criterium was (en leesbaarheid, onderhoudbaar, portabiliteit, correctheid enzovoorts geen rol speelden) zou ik aanzienlijk meer in assembly coden.AtleX schreef op donderdag 21 oktober 2010 @ 11:25:
Er zijn niet veel programmeurs slimmer dan een compiler qua optimalisaties.
Vertel dat tegen deze lui: http://www.termination-po...mination_Competition_2010Verwijderd schreef op donderdag 21 oktober 2010 @ 11:35:
Maar mensen kunnen in de praktijk toch wel alle instanties van het halting-probleem oplossen, en daar kan geen enkel algoritme tegen op.
Tenzij je hem moet modelleren met een polygon.Verwijderd schreef op zaterdag 23 oktober 2010 @ 06:41:
Ik vind dit wel een bijzonder slecht programmeervoorbeeld:
[afbeelding]
?Verwijderd schreef op zaterdag 23 oktober 2010 @ 06:41:
Ik vind dit wel een bijzonder slecht programmeervoorbeeld:
[afbeelding]
Of bedoel je die site die er achter zit

Verwijderd
Kater? Eerst water, de rest komt later
Def P!Verwijderd schreef op zaterdag 23 oktober 2010 @ 02:40:
Jongens, doe eens weer een beetje ontopic?
Een schoonheid die ik onlangs aantrof:
code:
1 2 3 4 5 6 7 8 9 10 def p = processor.process(item) if (p) { def l = [] l << p l = l.flatten() l.each { pr -> result << pr } }

Weten we meteen wat hij deed voordat hij de muziek in ging
Kater? Eerst water, de rest komt later
Krijg ik zojuist een mailtje van de ING-servicebalieMatis schreef op vrijdag 22 oktober 2010 @ 14:28:
fuuuuuuuuuuu IK kom er zojuist (ook) achter dat Mijn ING dus niet hoofdlettergevoelig is
Is capslockday toch nog ergens goed voor
Over slecht programmeervoorbeeld gesprokenGeachte Matis,
De beantwoording van uw e-mail is vertraagd. Onze excuses hiervoor.
Het klopt dat het wachtwoord voor Mijn ING niet hoofdlettergevoelig is en de gebruikersnaam wel.
Uit onderzoek is gebleken dat de hoofdlettergevoeligheid van de gebruikersnaam en de voorwaarden die gesteld zijn aan beide inlogcodes de veiligheid van onze klanten waarborgen. Uw melding hierover hebben wij wel geregistreerd en doorgestuurd naar de verantwoordelijke afdeling. Deze afdeling neemt dit mee in het verbeteringsproces.
Bedankt voor uw melding.
Met vriendelijke groet,
ING Klantenservice
Dhr. A.L. #####
Manager Verkoop en Service

If money talks then I'm a mime
If time is money then I'm out of time
Je gaat het niet gelovenVerwijderd schreef op zaterdag 23 oktober 2010 @ 06:41:
Ik vind dit wel een bijzonder slecht programmeervoorbeeld:
[afbeelding]

edit: Als je goed oplet zie je dat het zelfs dezelfde (echt waar) banaan is

[ Voor 9% gewijzigd door Aloys op 25-10-2010 19:14 ]
Zie hier het vak dat dit jaar zo vreselijk slecht gemaakt wordt dat zelfs onze legendarische Harm Bakker ingehuurd wordt als practicum assistent...Aloys schreef op maandag 25 oktober 2010 @ 19:13:
[...]
Je gaat het niet geloven, maar wij hebben een dictaat hier op de RUG:
[afbeelding]
edit: Als je goed oplet zie je dat het zelfs dezelfde (echt waar) banaan is.
* roy-t schaamt zich voor de mensen die moeite hebben met dat vak, maar vraagt zich wel heel erg af of er wat anders aan de hand is.
Verwijderd
Die mag Arnold Meijster in zijn zak steken!Aloys schreef op maandag 25 oktober 2010 @ 19:13:
Je gaat het niet geloven, maar wij hebben een dictaat hier op de RUG:
[afbeelding]
edit: Als je goed oplet zie je dat het zelfs dezelfde (echt waar) banaan is.

What are the odds...
't wordt continue overhoop gehaald en men loopt elk jaar weer te verschuiven wat het nou moet doen. Nogal logisch dat't een brak vak is wat je snel moet halen en vergeten.roy-t schreef op maandag 25 oktober 2010 @ 19:47:
* roy-t schaamt zich voor de mensen die moeite hebben met dat vak, maar vraagt zich wel heel erg af of er wat anders aan de hand is.
De logica van eerst functioneel programmeren in JAVA en daarna OOP in C++ is me ook nooit helemaal duidelijk geworden, al schijnt dat voor OOP in C++ nu iets van datastructuren in de plaats is gekomen. Ze werken er wel aan.. 't lijkt alleen nooit heel erg te lukken
Dit topic is gesloten.
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes.