486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22

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.
In dit geval is dat natuurlijk totaal niet aan de orde en moet de programmeur netjes de formatteringsfunctionaliteit gebruiken, i.p.v. deze WTF op te leveren.
Valt nog mee dat die "-" niet als char staat dan.Verwijderd schreef op maandag 26 juli 2010 @ 15:10:
Zal vast een weddenschap zijn: Meest obscure code oid.
(char)48, hoe verzin je het?

En de DateTime class heeft zelf nog eens standaard heel wat Format methods beschikbaar...PiepPiep schreef op maandag 26 juli 2010 @ 14:59:
* mompelt iets over Format en in zo'n beetje iedere taal wel beschikbaar...
Ik moest zelfs even opzoeken welke het was

[ Voor 62% gewijzigd door .oisyn op 26-07-2010 15:53 ]
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.
Verwijderd
Een game die niet wil lukken? Even met TD32 de game in duiken, kijken waar de jump naar gameover zit en die eruit noppen, voor je het weet ben je onoverwinnelijk
En het hielp ook goed tegen kopieerbeveiliging
Ooit in het verleden, na wat met QuickBasic gestoeid te hebben, heb ik VB 2 gebruikt, maar die was al windows based, dus geen DOS variant helaas.
Assumptions are the mother of all fuck ups | iRacing Profiel
1
| <div id="homepage-welcome-screen-top" style="background-image: url({$helper->basehref}res/images/style_{$smarty.const.SITE_DESIGN}/homepage_logged_in/welcome_header.{if $smarty.const.SITE == 'LIVE'}gif{else}png{/if});"></div> |
Destijds kende ik het begrip array ook nog niet eens(ik was toen pakweg 10 jaar, ASCII programmeersels deed ik toen ik 6 was in BASIC op de Commodore 64), waardoor ik games/demo's programmeerde (space invaders clone, top down games) met tientallen of honderden variabelen schreef
Commodore BASIC was ook een rotzooitje.
Begon ik met
10 PRINT "bla"
20 INPUT "bla",I$
en dan ging ik later lijnen 11 tm 19 toevoegen, met de : meerdere commands op 1 lijn krijgen en uiteindelijk maar eens RENUMBER gebruiken.
Leuk zon URL.. Waarom gebruikt de "LIVE" site .gif en als die "test" (???) is .png?Megamind schreef op woensdag 28 juli 2010 @ 16:07:
Leuk zo'n website overnemen van een ander bedrijf
code:
1 <div id="homepage-welcome-screen-top" style="background-image: url({$helper->basehref}res/images/style_{$smarty.const.SITE_DESIGN}/homepage_logged_in/welcome_header.{if $smarty.const.SITE == 'LIVE'}gif{else}png{/if});"></div>
Och als dat het enige wasCaelorum schreef op woensdag 28 juli 2010 @ 17:21:
[...]
Leuk zon URL.. Waarom gebruikt de "LIVE" site .gif en als die "test" (???) is .png?
Refactoring of simpelweg find/replace doen, is blijkbaar nogal moeilijk.
Dat kan tegenvallen afhankelijk van de manier waarop geprogrammeerd is. De meeste refactor tools nemen geen reflection en dergelijke mee.Styxxy schreef op woensdag 28 juli 2010 @ 18:08:
Refactoring of simpelweg find/replace doen, is blijkbaar nogal moeilijk.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
mwoah, er is wel mee te werken hoor, maar ideaal is het zeker niet.Verwijderd schreef op woensdag 28 juli 2010 @ 17:58:
Smarty...Daar heb ik nou nooit het nut van in gezien.
Jeprutgerw schreef op woensdag 28 juli 2010 @ 19:16:
Heeft dat project met scheepvaart te maken? Waarom 'mooring'? Afmeren?
Ik denk niet dat een PHP website zo veel problemen kunnen leverenSebazzz schreef op woensdag 28 juli 2010 @ 20:23:
[...]
Dat kan tegenvallen afhankelijk van de manier waarop geprogrammeerd is. De meeste refactor tools nemen geen reflection en dergelijke mee.
Ja of dat de caps niet kloppen, bv:418O2 schreef op woensdag 28 juli 2010 @ 21:14:
Ik HAAT het trouwens als er spelfouten in class/attribuutnamen zitten. Verbeter het dan even, aargh
1
| public string ikDoeNietAanBeginHoofdletterVoorProperties; |
Blijkbaar ook niet aan propertieskipusoep schreef op woensdag 28 juli 2010 @ 21:20:
[...]
Ja of dat de caps niet kloppen, bv:
C#:
1 public string ikDoeNietAanBeginHoofdletterVoorProperties;
If money talks then I'm a mime
If time is money then I'm out of time
het is dat dit binnen java weer wel gebruikelijk iskipusoep schreef op woensdag 28 juli 2010 @ 21:20:
[...]
Ja of dat de caps niet kloppen, bv:
C#:
1 public string ikDoeNietAanBeginHoofdletterVoorProperties;
Ik kwam paar maanden geleden ook een vreselijks tegen in mn eigen code (code heb ik niet meer maar dit is ter illustratie):
1
2
3
4
5
6
7
8
9
10
11
12
| String code = ""; if(type.equals("a")){ code = object.getLetter() + object2.getCode(); }else if(type.equals("b")){ code = object.getLetter() + object2.getCode(); }else if(type.equals("c")){ code = object.getLetter() + object2.getCode(); }else if(type.equals("d")){ code = object.getLetter() + object2.getCode(); }else if(type.equals("e")){ code = object.getLetter() + object2.getCode() + object3.doeNogWat(); } |
Dat werd uiteraard vervangen door:
1
2
3
4
| String code = object.getLetter() + object2.getCode(); if(type.equals("e")){ code += object3.doeNogWat(); } |
Ter info: er werd ten alle tijde 1 van de 5 if statements uitgevoerd. Oftewel het was allemaal heel erg dubbelop. Ik merkte het toen ik meer types ging toevoegen. Dat zag er wel effe smerig uit
Ruisende versterker: schakel je subwoofer in.
1
2
3
4
5
6
| private string m_achternaam; public string Achternaam { get { return m_achternaam; } set { m_achternaam = value; } } |
Als ik dat soort dingen tegenkom, doe ik heel vaak met ReSharper de optie "Replace with automatic property". Het is slechts syntactic sugar, maar het maakt de code meteen een stuk prettiger te lezen, vind ik.
Sowieso: Hungarian, meh. En prefixes als m_, c_, enzovoorts.
[ Voor 8% gewijzigd door Alex) op 28-07-2010 21:42 ]
We are shaping the future
Ach, dat ben ik al meer tegen gekomen hoorkipusoep schreef op woensdag 28 juli 2010 @ 21:20:
[...]
Ja of dat de caps niet kloppen, bv:
C#:
1 public string ikDoeNietAanBeginHoofdletterVoorProperties;

Ik zie soms code van een half jaar oud wat ik toch even móet herschrijven omdat ik het nu anders/beter doe. Hou je toch.
Dat geef je nooit zelf op maar zoekt JavaDoc voor je uit. Daarom kan 't onmogelijk iets zinnigs doen bij een private method.Caelorum schreef op zondag 25 juli 2010 @ 09:29:
[...]
Met dank daarvoor ^^
Ook al twijfelde ik aan dat commentaar, want zo'n woordje "inherit" staat er natuurlijk niet zomaar en als je dan nergens opgeeft wat die moet overnemen..
Overigens vind ik /** @inheritDoc */ in geval van een override toch al een zwaktebod. JavaDoc doet dat overnemen nl. automatisch al (ook in een IDE als Eclipse). Dus eigenlijk vertel je alleen de medelezers van de code dat je een override doet. Gebruik dan @Override, dan vertel je het gelijk ook de compiler en de syntax checker in je IDE
ReSharper is inderdaad een must have, jammer dat het Visual Studio echt behoorlijk traag maakt.Alex) schreef op woensdag 28 juli 2010 @ 21:42:
C#:
1 2 3 4 5 6 private string m_achternaam; public string Achternaam { get { return m_achternaam; } set { m_achternaam = value; } }
Als ik dat soort dingen tegenkom, doe ik heel vaak met ReSharper de optie "Replace with automatic property". Het is slechts syntactic sugar, maar het maakt de code meteen een stuk prettiger te lezen, vind ik.
Sowieso: Hungarian, meh. En prefixes als m_, c_, enzovoorts.
'You like a gay cowboy and you look like a gay terrorist.' - James May
Bijna net zo erg om dan twee aparte methodes te schrijven voor get en set.Phyxion schreef op woensdag 28 juli 2010 @ 22:13:
[...]
ReSharper is inderdaad een must have, jammer dat het Visual Studio echt behoorlijk traag maakt.
Ik gebruik properties vaak voor Forms met een tekstveld.
1
2
3
4
5
| public string Name { get { return this.textBoxName.Text; } set { this.textBoxName.Text = value; } } |
Verwijderd
Ach ja, je moet gewoon denken: iedereen heeft zo z'n stijl en niemands stijl is perfect.Alex) schreef op woensdag 28 juli 2010 @ 21:42:
C#:
1 2 3 4 5 6 private string m_achternaam; public string Achternaam { get { return m_achternaam; } set { m_achternaam = value; } }
Als ik dat soort dingen tegenkom, doe ik heel vaak met ReSharper de optie "Replace with automatic property". Het is slechts syntactic sugar, maar het maakt de code meteen een stuk prettiger te lezen, vind ik.
Sowieso: Hungarian, meh. En prefixes als m_, c_, enzovoorts.
Trouwens zijn die Automatic properties wel handig. Ik was ze nog niet eerder tegengekomen (maar het schijnt iets nieuws uit C# 3.0 te zijn, waar ik direct van 2.0 naar 4.0 ging)
1
2
3
4
5
6
7
8
9
10
11
| var cookieJar = new List<Cookie>(); var mijnObject = new Cookie() { Flavor = Flavors.ChocolateChip, CookieNommed += (s, e) => { Debug.WriteLine(string.Format("Cookie {0} was eaten!", ((Cookie)s).Flavor)); } } cookieJar.Add(mijnObject); var notEatenCookies = cookieJar.Where(c => c.Status == CookieStatus.NotEaten); notEatenCookies.Select(cookie => cookie.Eat()); |
Mooi hea?
Dat kun je ook zo schrijven:
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
| List<Cookie> cookieJar = new List<Cookie>(); Cookie mijnObject = new Cookie(); mijnObject.Flavor = Flavors.ChocolateChip; mijnObject.CookieNommed += mijnObject_CookieNommed; cookieJar.Add(mijnObject); List<Cookie> notEatenCookies = new List<Cookie>(); foreach(Cookie c in cookieJar) { if(c.Status == CookieStatus.NotEaten) { notEatenCookies.Add(c); } } foreach(Cookie c2 in notEatenCookies) { c2.Eat(); } void mijnObject_CookieNommed(object sender, CookieEatenEventArgs e) { Debug.WriteLine(string.Format("Cookie {0} was eaten!", ((Cookie)s).Flavor)); } |
[ Voor 43% gewijzigd door Alex) op 26-06-2011 23:05 . Reden: typo gefixt. ]
We are shaping the future
Verwijderd
Niets mis met Hungarian, probleem is alleen dat veel mensen het niet vatten.Alex) schreef op woensdag 28 juli 2010 @ 21:42:
Sowieso: Hungarian, meh. En prefixes als m_, c_, enzovoorts.
http://www.joelonsoftware.com/articles/Wrong.html
Gaan we weer...Verwijderd schreef op donderdag 29 juli 2010 @ 01:59:
[...]
Niets mis met Hungarian, probleem is alleen dat veel mensen het niet vatten.
http://www.joelonsoftware.com/articles/Wrong.html

... en etcetera en zo
Automatic implemented properties was 1 van de dingen die (omdat ze pure syntactic sugar zijn) die ook in .Net 2.0 projecten werkten mits VS2008:Verwijderd schreef op woensdag 28 juli 2010 @ 23:12:
Trouwens zijn die Automatic properties wel handig. Ik was ze nog niet eerder tegengekomen (maar het schijnt iets nieuws uit C# 3.0 te zijn, waar ik direct van 2.0 naar 4.0 ging)
Using C# 3 in .NET 2.0 and 3.0
Some C# 3 features can be used freely in .NET 2.0...<snip>
Fully available features:
Automatically implemented properties...<snip>
[ Voor 5% gewijzigd door RobIII op 29-07-2010 03:16 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Lijkt me toch wel handig om zo veel mogelijk aan de stijl en conventies te houden van de taal of framework waarmee je werkt .Verwijderd schreef op woensdag 28 juli 2010 @ 23:12:
[...]
Ach ja, je moet gewoon denken: iedereen heeft zo z'n stijl en niemands stijl is perfect.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Verwijderd
Ja die trucage ken ik al, alleen vind ik het niet beter leesbaarAlex) schreef op woensdag 28 juli 2010 @ 23:32:
Er zijn zoveel handige nieuwe dingen sinds .NET 3.0. Lambda expressions, LINQ, automatic properties, extension methods, implicit operators, enzovoorts.
C#:
1 2 3 4 5 6 7 8 9 10 11 var cookieJar = new List<Cookie>(); var mijnObject = new Cookie() { Flavor = Flavors.ChocolateChip, CookieNommed += (s, e) => { Debug.WriteLine(string.Format("Cookie {0} was eaten!", ((Cookie)s).Flavor)); } } cookieJar.Add(mijnObject); var eatenCookies = cookieJar.Where(c => c.Status == CookieStatus.NotEaten); eatenCookies.Select(cookie => cookie.Eat());
Mooi hea?(Even uit de losse pols geschud)
Dat kun je ook zo schrijven:
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 List<Cookie> cookieJar = new List<Cookie>(); Cookie mijnObject = new Cookie(); mijnObject.Flavor = Flavors.ChocolateChip; mijnObject.CookieNommed += mijnObject_CookieNommed; cookieJar.Add(mijnObject); List<Cookie> eatenCookies = new List<Cookie>(); foreach(Cookie c in cookieJar) { if(c.Status == CookieStatus.NotEaten) { eatenCookies.Add(c); } } foreach(Cookie c2 in eatenCookies) { c2.Eat(); } void mijnObject_CookieNommed(object sender, CookieEatenEventArgs e) { Debug.WriteLine(string.Format("Cookie {0} was eaten!", ((Cookie)s).Flavor)); }
Dat moet je ook wel even wetenRobIII schreef op donderdag 29 juli 2010 @ 03:15:
[...]
Automatic implemented properties was 1 van de dingen die (omdat ze pure syntactic sugar zijn) die ook in .Net 2.0 projecten werkten mits VS2008:
[...]
Ja, d'r is zo'n kreet "Don't fight the IDE" wat hier ongeveer wel op slaat.Sebazzz schreef op donderdag 29 juli 2010 @ 08:54:
[...]
Lijkt me toch wel handig om zo veel mogelijk aan de stijl en conventies te houden van de taal of framework waarmee je werkt .
Als ik een klasse schrijf, probeer ik dat soms te doen alsof Microsoft het zelf heeft geschreven.
En Hungarian is niet per definitie slecht als je weet dat het gebruikt moet worden om onderscheid te maken tussen objecten van hetzelfde type die iets anders bevatten dan tussen objecten van verschillende types.
Zo gaf de bedenker volgens mij een voorbeeld van 2 strings waarvan er één escaped (safe) was en een ander niet.
Het is met moderne IDEs echter geen probleem om hele namen te gebruiken omdat je die niet elke keer opnieuw hoeft te typen. En het maakt het een stuk duidelijker voor derden.
Dat lijkt me meer een kwestie van het leren lezen van deze "vorm" van code. Lijkt een beetje op het leren lezen van een (andere) muzieknotatie (dan je gewend bent)Verwijderd schreef op donderdag 29 juli 2010 @ 09:02:
[...]
Ja die trucage ken ik al, alleen vind ik het niet beter leesbaar
Ik vind het juist een stuk beter leesbaar, nu zie je in één oogopslag wat er gebeurd zonder dat je eerst moet kijken wat er nog in de for en foreach gedaan wordt.Verwijderd schreef op donderdag 29 juli 2010 @ 09:02:
Ja die trucage ken ik al, alleen vind ik het niet beter leesbaar
'You like a gay cowboy and you look like a gay terrorist.' - James May
Kater? Eerst water, de rest komt later
Het debuggen is pas lastig, dat vind ik echt een enorm nadeel van die anderszins mooie techniek.Haan schreef op donderdag 29 juli 2010 @ 10:06:
Ik vind het lezen van lambdas in C# nog altijd wel lastig.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| $bloks_allowed("categories_main","categories","also_purchased"); /** * Nog meer rommel... */ if (USE_CACHE == 'true' && $bloks_allowed[$blok]) { switch($blok) { case "categories_main": tep_reset_cache_block('categories_main'); break; case "categories": tep_reset_cache_block('categories'); break; case "also_purchased": tep_reset_cache_block('also_purchased'); break; default: die(); } } |
[ Voor 8% gewijzigd door basvd op 29-07-2010 12:10 ]
In eerste instantie dacht ik ' he daar is toch niet zo heel veel geks aan de hand ' tot ik die switch zag...basvd schreef op donderdag 29 juli 2010 @ 12:04:
Rommel2
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $bloks_allowed("categories_main","categories","also_purchased"); /** * Nog meer rommel... */ if (USE_CACHE == 'true' && $bloks_allowed[$blok]) { switch($blok) { case "categories_main": tep_reset_cache_block('categories_main'); break; case "categories": tep_reset_cache_block('categories'); break; case "also_purchased": tep_reset_cache_block('also_purchased'); break; default: die(); } }
Hoezo? Het is gewoon een anonieme methode.Haan schreef op donderdag 29 juli 2010 @ 10:06:
Ik vind het lezen van lambdas in C# nog altijd wel lastig.
(argumenten) => methode-body
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Bedoel je zoiets als de @@identity (als je deze tijdens je insert laat zetten, weet je gelijk wat het identity van de row is) van SQL Server !?Stephan4kant schreef op donderdag 29 juli 2010 @ 12:25:
Ik zal jullie de code besparen (heb ik ook niet meer), maar ik heb ook een functie geschreven die met een tweede SQL-query de laatst ingevoegde entry ophaalt. Totdat ik mysql_insert_id() leerde kennen.
Eerst het probleem, dan de oplossing
Deze stond er trouwens ook nog in:Webgnome schreef op donderdag 29 juli 2010 @ 12:26:
[...]
In eerste instantie dacht ik ' he daar is toch niet zo heel veel geks aan de hand ' tot ik die switch zag...
1
2
3
| DEFINE('USE_CACHE',true); if (USE_CACHE == 'true' && $bloks_allowed[$blok]) { |
*zucht*, lang leven het type juggling van PHP
Jep, het zijn dezelfde principes.lier schreef op donderdag 29 juli 2010 @ 12:34:
[...]
Bedoel je zoiets als de @@identity (als je deze tijdens je insert laat zetten, weet je gelijk wat het identity van de row is) van SQL Server !?
There's no place like 127.0.0.1
Pfft, I eat lambdas for breakfastHaan schreef op donderdag 29 juli 2010 @ 10:06:
Ik vind het lezen van lambdas in C# nog altijd wel lastig.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Program { static void Main(string[] args) { Func<dynamic, dynamic, Func<Func<dynamic, dynamic, dynamic>, dynamic>> pair = (x, y) => f => f(x, y); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> fst = p => p((x, y) => x); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> snd = p => p((x, y) => y); { // nieuwe scope, omdat anders de C# compiler gaat zeuren over 'p' 8)7 dynamic p = pair(1, 2); Console.WriteLine(fst(p)); Console.WriteLine(snd(p)); Console.ReadKey(); } } } |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Mja, ik weet het omdat het destijds (bij introductie van het .Net framework of VS2008, ik weet even niet meer welke van de twee) er in een video ergens op Channel9 geloof ik wat over gezegd werd en die Automatic implemented properties werden werkelijk overal opgehemeld (terecht overigens) en dus ook icm. 2.0 projecten. Je moet haast onder een steen geleefd hebben om dat niet meegekregen te hebben. Then again kijk ik misschien teveel video's
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
RayNbow schreef op donderdag 29 juli 2010 @ 14:46:
C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Program { static void Main(string[] args) { Func<dynamic, dynamic, Func<Func<dynamic, dynamic, dynamic>, dynamic>> pair = (x, y) => f => f(x, y); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> fst = p => p((x, y) => x); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> snd = p => p((x, y) => y); { // nieuwe scope, omdat anders de C# compiler gaat zeuren over 'p' 8)7 dynamic p = pair(1, 2); Console.WriteLine(fst(p)); Console.WriteLine(snd(p)); Console.ReadKey(); } } }
16:56 <@RayNbow> valhallasw: bonuspunten als jij of valhallasw_ een Python
versie in het topic post
1
2
3
4
5
6
7
8
| >>> pair = lambda x,y: lambda f: f(x,y) >>> fst = lambda p: p(lambda x,y: x) >>> snd = lambda p: p(lambda x,y: y) >>> p = pair(1,2) >>> fst(p) 1 >>> snd(p) 2 |
Stuk leesbaarder dan de C#-versie, moet ik zeggen
en voor de mensen die niet snappen wat er staat:
1
2
3
4
5
6
7
8
9
10
11
12
| >>> def pair(x,y): ... def tmp(f): ... return f(x,y) ... return tmp ... >>> def fst(p): ... def tmp(x,y): ... return x ... return p(tmp) ... >>> fst(pair(1,2)) 1 |
[ Voor 10% gewijzigd door ValHallASW op 29-07-2010 17:07 ]
Die heeft iedereen toch wel eens gedaan? Werkt prima in de meeste gevallenStephan4kant schreef op donderdag 29 juli 2010 @ 12:25:
Ik zal jullie de code besparen (heb ik ook niet meer), maar ik heb ook een functie geschreven die met een tweede SQL-query de laatst ingevoegde entry ophaalt. Totdat ik mysql_insert_id() leerde kennen.

[ Voor 34% gewijzigd door MBV op 29-07-2010 19:56 ]
Verwijderd
Ik vind videos over programmeertalen nogal saaiRobIII schreef op donderdag 29 juli 2010 @ 16:38:
[...]
Mja, ik weet het omdat het destijds (bij introductie van het .Net framework of VS2008, ik weet even niet meer welke van de twee) er in een video ergens op Channel9 geloof ik wat over gezegd werd en die Automatic implemented properties werden werkelijk overal opgehemeld (terecht overigens) en dus ook icm. 2.0 projecten. Je moet haast onder een steen geleefd hebben om dat niet meegekregen te hebben. Then again kijk ik misschien teveel video's
Maar ik heb me vandaag over dat hele lambda gebeuren even ingelezen. En ook al wat ervan in m'n framework verwerkt. Dus je kan binnenkort enkele Updates op mn blog verwachten
[ Voor 12% gewijzigd door Verwijderd op 29-07-2010 22:14 ]
Stephan4kant schreef op donderdag 29 juli 2010 @ 12:25:
Ik zal jullie de code besparen (heb ik ook niet meer), maar ik heb ook een functie geschreven die met een tweede SQL-query de laatst ingevoegde entry ophaalt. Totdat ik mysql_insert_id() leerde kennen.

Alternatief met een type inference trick:RayNbow schreef op donderdag 29 juli 2010 @ 14:46:
[...]
Pfft, I eat lambdas for breakfast
C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Program { static void Main(string[] args) { Func<dynamic, dynamic, Func<Func<dynamic, dynamic, dynamic>, dynamic>> pair = (x, y) => f => f(x, y); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> fst = p => p((x, y) => x); Func<Func<Func<dynamic, dynamic, dynamic>, dynamic>, dynamic> snd = p => p((x, y) => y); { // nieuwe scope, omdat anders de C# compiler gaat zeuren over 'p' 8)7 dynamic p = pair(1, 2); Console.WriteLine(fst(p)); Console.WriteLine(snd(p)); Console.ReadKey(); } } }
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
| class Program { static Func<A, R> Lambda<A, R>(Func<A, R> f) { return f; } static Func<A, B, R> Lambda<A, B, R>(Func<A, B, R> f) { return f; } static void Main(string[] args) { var pair = Lambda((dynamic x, dynamic y) => Lambda((dynamic f) => f(x, y))); var fst = Lambda((dynamic p) => p(Lambda((dynamic x, dynamic y) => x))); var snd = Lambda((dynamic p) => p(Lambda((dynamic x, dynamic y) => y))); { dynamic p = pair(1, 2); Console.WriteLine(fst(p)); Console.WriteLine(snd(p)); Console.ReadKey(); } } } |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Oef, dat was best een zwaar ontbijt. Al die type-annotaties...Pfft, I eat lambdas for breakfast
Pas nadat ik het even had omgeschreven in F# had ik door wat het eigenlijk deed:
1
2
3
4
| let pair (x,y) f = f (x,y) let first p = p (fun (x,y) -> x) let second p = p (fun (x,y) -> y) |
Even met de cursor boven 'pair' zweven en laat de compiler zelf maar types afleiden:
1
| val pair: 'a * 'b -> ('a * 'b -> 'c) -> 'c |
Misschien maar eens even proberen die C# versie op het werk een projectje in te smokkelen. Eens even kijken hoe lang het duurt voordat ik door het raam naar buiten getieft word. Gelukkig hebben we gras buiten, dus misschien overleef ik het wel.
[ Voor 6% gewijzigd door cfern op 30-07-2010 10:37 ]
"I'd rather have a full bottle in front of me, than a full frontal lobotomy." (Tom Waits) | PoE
Een leuk voorbeeld was het volgende.
Interface C
Class A : C
Class B : C
Class B was gelijk aan class A op een paar kleine dingetjes in een van de methoden na, toch was er voor gekozen om een interface te gebruiken zodat ze gelijk aangesproken konden worden, ipv gewoon B van A te laten overerven en die methode in A wat uit elkaar te trekken zodat je met een of 2 method overrides klaar was geweest.
Het leuke is trouwens dat er tegelijkertijd voor PC als XBOX wordt ontwikkeld, maar dat de XBOX versie eigenlijk constant in een broken state is (File IO oplossingen die helemaal niet kunnen op de Xbox) en dat beide projecten vol staan met #IF XBOX
Refactoring was bijna niet te doen om dat de architectuur gewoon slecht in elkaar zit. Daarom maar van scratch begonnen en nu probeer ik telkens een component in het nieuwe project te transplanteren zodat ik niet alles opnieuw moet schrijven. Achja ik wist het voordat ik begon
Zoek in een xml naar een bepaalde node, als de gevonden is return je de node.InnerText en als je niets vind return je "-1"
En ik maar zoeken waar die -1 vandaan getovert wordt terwijl ik niets voor die waarde in de xml gestopt had

/edit
Is het al weekend?
string Locked = "false";
Hij kan ergens op "true" gezet worden en er staat ergens een if (Locked == "true")
Gelijk maar eens vervangen voor een boolean.
[ Voor 23% gewijzigd door PiepPiep op 30-07-2010 12:33 ]
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Zolang het gedocumenteerd is, is het niet zo erg. Neemt niet wel dat String.Empty of (beter) null beter was geweest.PiepPiep schreef op vrijdag 30 juli 2010 @ 11:26:
Ik kom nu een functie tegen die ik hier niet mag plaatsen, maar wel beschrijven.
Zoek in een xml naar een bepaalde node, als de gevonden is return je de node.InnerText en als je niets vind return je "-1"
En ik maar zoeken waar die -1 vandaan getovert wordt terwijl ik niets voor die waarde in de xml gestopt had
Als dat C# en XNA is, dan is het vreemd dat er van File gebruik gemaakt wordt omdat XNA zelf een content provider voor dat soort dingen heeft.Het leuke is trouwens dat er tegelijkertijd voor PC als XBOX wordt ontwikkeld, maar dat de XBOX versie eigenlijk constant in een broken state is (File IO oplossingen die helemaal niet kunnen op de Xbox) en dat beide projecten vol staan met #IF XBOX.
[ Voor 27% gewijzigd door Sebazzz op 30-07-2010 12:55 ]
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Waarom maak je er geen tryparse-achtige functie van met een out dan?PiepPiep schreef op vrijdag 30 juli 2010 @ 11:26:
Ik kom nu een functie tegen die ik hier niet mag plaatsen, maar wel beschrijven.
Zoek in een xml naar een bepaalde node, als de gevonden is return je de node.InnerText en als je niets vind return je "-1"
En ik maar zoeken waar die -1 vandaan getovert wordt terwijl ik niets voor die waarde in de xml gestopt had
/edit
Is het al weekend?![]()
string Locked = "false";
Hij kan ergens op "true" gezet worden en er staat ergens een if (Locked == "true")
Gelijk maar eens vervangen voor een boolean.
Je returnt gewoon een boolean of de node bestaat en zo ja, prop je de innerText in de out string.
==> private boolean findNode(string name, out string value)
Iemand anders heeft dit gemaakt en de functie wordt uit veel plaatsen aangeroepen zonder dat er iets gedocumenteerd is. Als er maar 1 keer vanuit gegaan wordt dat "-1" betekend dat iets er niet is gaat het al mis.
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
Ja, maar nu kunnen elementen geen echte waarde van -1 hebben.PiepPiep schreef op vrijdag 30 juli 2010 @ 13:35:
Ik vind beide oplossingen mooi, maar durf het nu nog niet aan om aan te passen.
Iemand anders heeft dit gemaakt en de functie wordt uit veel plaatsen aangeroepen zonder dat er iets gedocumenteerd is. Als er maar 1 keer vanuit gegaan wordt dat "-1" betekend dat iets er niet is gaat het al mis.
Ik snap het wel, omdat standaardfuncties die een int returnen van een index ook altijd -1 geven als het item niet wordt gevonden, maar het is wel gevaarlijk zo.
1
2
3
| Do While instr(prod_img, "/") > 0 prod_img = right( prod_img, Len(prod_img) - InStr(prod_img,"/") ) Loop |
Heb het zelf maar vervangen door
1
| prod_img = Right(prod_img, Len(prod_img) - InStrRev(prod_img, "/")) |
AMD Phenom II X2 555@ X4 B55, 4GB DDR3-1333 OCZ Gold, MSI 870A-G54, Radeon HD 7770 512 MB
1
| prod_img.Substring(prod_img.LastIndexOf('/')) |
Of nog mooier:
1
| new Uri(prod_img).Segments.Last() |
[ Voor 27% gewijzigd door creator1988 op 30-07-2010 15:52 ]
1
| CurIPAddressBin.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[0]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[1]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[2]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[3]), 2).PadLeft(8, '0')); |
Dat moet volgens mij wel makkelijker kunnen.
Maar hey het werkt

We are shaping the future
We have a winner! Helaas ier ook Texture2D.FromFile(..) (Windows only).Sebazzz schreef op vrijdag 30 juli 2010 @ 12:53:
Als dat C# en XNA is, dan is het vreemd dat er van File gebruik gemaakt wordt omdat XNA zelf een content provider voor dat soort dingen heeft.
Dus dan krijg je in je loadcontent metoden iets als:
1
2
3
4
5
6
| Texture2D tex; #if XBOX360 tex = Content.Load<Texture2D>(@"MyTexture"); #elseif tex = Texture2D.FromFile(MyRootPath + "\MyTexture.jpg"); #endif |
Terwijl de eerste code op beide platformen werkt (en een stuk beter is!)
Helaas, niet mogelijk.... Is een nogal grote (qua lijnen code) website, waar geen tijd en geld meer aan besteed mag worden dan nodig, i.v.m. overstap op "korte termijn" naar nieuwe applicatie (ook weer third-party).....creator1988 schreef op vrijdag 30 juli 2010 @ 15:49:
Hou toch eens op met dat ASP
C#:
1 prod_img.Substring(prod_img.LastIndexOf('/'))
Of nog mooier:
C#:
1 new Uri(prod_img).Segments.Last()
AMD Phenom II X2 555@ X4 B55, 4GB DDR3-1333 OCZ Gold, MSI 870A-G54, Radeon HD 7770 512 MB
Euh nee een IPv4 adres bestaat al uit decimalenAlex) schreef op vrijdag 30 juli 2010 @ 16:25:
JemigWat probeer je te bereiken dan? Een IP-adres omzetten in decimalen ofzo?
Verderop in het programma wordt hetzelfde gedaan met een netwerkadres + beide afgekapt op de lengte van de subnetmask om ze vervolgens te vergelijken en er zo achter te komen in welk netwerk een client zit
Het programmatje had een update nodig omdat het niet meer samenwerkt met Windows 7 / 2008 aangezien 'ie daar een IPv6 adres teruggeeft
[ Voor 15% gewijzigd door Noxious op 30-07-2010 16:45 ]
Gebruik de methode GetAddressBytes() op een IPAddress object en je krijgt een byte array.Noxious schreef op vrijdag 30 juli 2010 @ 16:44:
[...]
Euh nee een IPv4 adres bestaat al uit decimalenik zet 'm om naar binair en plaats de nodige voorloopnullen.
Verderop in het programma wordt hetzelfde gedaan met een netwerkadres + beide afgekapt op de lengte van de subnetmask om ze vervolgens te vergelijken en er zo achter te komen in welk netwerk een client zit
Het programmatje had een update nodig omdat het niet meer samenwerkt met Windows 7 / 2008 aangezien 'ie daar een IPv6 adres teruggeeftdus dan kom je wel eens wat oude code tegen
Daar kan je dan makkelijk een binaire string van maken met String.Join.
Eigenlijk dubbel fail omdat er niet van Path.Combine gebruik gemaakt wordt
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Hmm ik wil dus van de string '192.168.178.44' naar de string '11000000101010001011001000101100' toe.Davio schreef op vrijdag 30 juli 2010 @ 18:50:
[...]
Gebruik de methode GetAddressBytes() op een IPAddress object en je krijgt een byte array.
Daar kan je dan makkelijk een binaire string van maken met String.Join.
Ik heb wat gegoogled en gelezen, maar hoe zet ik nu die byte array om naar een string met 0'en en 1'tjes (behalve met een lelijk for loopje)? De meeste voorbeelden die ik tegenkom vertalen het weer terug naar decimale tekens.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Mja ik vergelijk een IP met een netwerkadres (bijv. 192.168.0.0). Deze komt als string uit een XML file, ik kan die natuurlijk inlezen als IP (met IPAddress.TryParse), moet ik alleen testen of 'ie die wel valid vind gezien het natuurlijk geen geldig IP adres is...Janoz schreef op maandag 02 augustus 2010 @ 16:12:
Waarom doe je dat uberhaupt met strings? Het vergelijken en afkappen kun je veel efficienter en beter doen door het gewoon in die bytearray te houden.
Overigens moet ik ook aangeven dat ik behoorlijk nieuw ben met C#
[ Voor 12% gewijzigd door Noxious op 02-08-2010 16:20 ]
[na edit]
Maar dat heb je toch sowieso nodig? Anders valt het überhaupt niet om te zetten naar 4 bytes (of 16 in het geval van ipv6)
[/na edit]
Daarnaast, mijn opmerking ging vooral over het omzetten naar een binaire representatie in een string.
[ Voor 35% gewijzigd door Janoz op 02-08-2010 16:26 . Reden: nav edit hierboven ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ik zal even uitleggen wat het programmatje doet:Janoz schreef op maandag 02 augustus 2010 @ 16:22:
Euhm, zou je die laatste op 1 na laatste zin iets kunnen verduidelijken?
Daarnaast, mijn opmerking ging vooral over het omzetten naar een binaire representatie in een string.
Leest een XML file in met daarin namen van locaties en hun iprange, bijv:
1
2
3
4
5
6
7
8
9
10
11
| <?xml version="1.0" encoding="UTF-8" ?> <root> <site> <description>NLVUN</description> <range>10.166.64.0/22</range> </site> <site> <description>NLKOS</description> <range>10.166.124.0/22</range> </site> </root> |
En dan dus een stuk of 100 onder elkaar zo. Deze gooit ie in een array (System.Collections.ArrayList).
Daarnaast vraagt 'ie de huidige IPadressen van de machine op en gooit deze ook in een ArrayList.
Voordat 'ie ze in die array gooit zet ik ze om naar een string met 0'en en 1'en als platte text. Bij het vergelijken daarna (ik loop door array x heen en daarin loop ik door array y heen) kap ik deze strings af op de lengte van de subnet (bijv. dus de /22 (255.255.252.0) /24 (255.255.255.0) /16 (255.255.0.0) enz) en vergelijk ik de twee. Bij een match return ik de naam van de locatie.
Dit tooltje wordt vooral gebruikt in batchfiles, logonscripts, enz hier en daar in het netwerk en doet het al wat jaren prima, totdat Windows 7 dus het IPv6 adres returnde ipv het IPv4 adres als default
Edit-na-jou-edit:
Noxious schreef op vrijdag 30 juli 2010 @ 16:23:
C#:
1 CurIPAddressBin.Add(Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[0]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[1]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[2]), 2).PadLeft(8, '0') + Convert.ToString(Convert.ToInt32(IP.ToString().Split('.')[3]), 2).PadLeft(8, '0'));
Dat moet volgens mij wel makkelijker kunnen.![]()
![]()
Maar hey het werkt
[ Voor 17% gewijzigd door Noxious op 02-08-2010 16:33 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Een andere mogelijkheid is om het in te lezen als IPadres met IPAddress.TryParse en die weer uit te lezen met .GetAddressBytes() en daarop vergelijken. Echter weet ik (nog) niet (nog niet getest) of 'ie 192.168.0.0 bijv als een geldig IPadres ziet (volgens de RFC's zou ie dat namelijk niet valid moeten vinden daar het een netwerkadres is ipv een IPadres).
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ja, al werkt TryParse ongetwijfeld ook voor IPv6-adressen die doorgaans getoond worden in de vorm van 00-ff en gescheiden door dubbele punten in plaats van punten.Janoz schreef op maandag 02 augustus 2010 @ 16:52:
Wanneer je elk deel omzet naar een byte dan heb je niks met voorloopnullen te maken. Gewoon elk deel omzetten in een byte. Daarnaast lijkt het me niet dat in de context van het parsen van een ipadres bepaald kan worden of een ip adres in die mate valid is. Dergelijke validiteit is pas van toepassing wanneer je het ipadres in een bepaalde context gebruikt. Het lijkt mij dat tijdens het parsen alleen gekeken wordt of er vier delen zijn en dat ze elk een byte representeren (dus 0<=x<256)
Je maakt echter een kapitale fout in denkwijze als je met strings gaat werken; je neemt namelijk aan dat een object als een IP-adres altijd inherent hetzelfde blijft en dat je er daarom gewoonweg strings van kunt maken en die kunt vergelijken.
Een IP-adres is geen primair datatype als een integer. Als je van het getal 3 een string maakt, is het altijd "3" (of 3,000 of 3.000, jullie snappen de bedoeling), maar nooit "4". Voor klassen en objecten geldt dat niet.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Oh uiteraard, maar die filter ik er al uit, aan IPv6 heb ik geen boodschap.Davio schreef op maandag 02 augustus 2010 @ 20:26:
[...]
Ja, al werkt TryParse ongetwijfeld ook voor IPv6-adressen die doorgaans getoond worden in de vorm van 00-ff en gescheiden door dubbele punten in plaats van punten.
Euh? Die snap ik niet of het kwartje valt niet, natuurlijk ga ik er niet vanuit dat het IP van client/netwerk/whatever altijd hetzelfde is. Ook al is mijn string-methode sofar niet de beste oplossing (en heb ik dat dus ook aangepast), het werkte wel perfect. Ik zie niet in waarom het niet zou werken.Je maakt echter een kapitale fout in denkwijze als je met strings gaat werken; je neemt namelijk aan dat een object als een IP-adres altijd inherent hetzelfde blijft en dat je er daarom gewoonweg strings van kunt maken en die kunt vergelijken.
Een IP-adres is geen primair datatype als een integer. Als je van het getal 3 een string maakt, is het altijd "3" (of 3,000 of 3.000, jullie snappen de bedoeling), maar nooit "4". Voor klassen en objecten geldt dat niet.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Dat geldt voor veel van de stukken code die hier gepost worden hèNoxious schreef op dinsdag 03 augustus 2010 @ 10:03:
Jawel, dat snap ik helemaal. Maar ik zie niet in hoe het mis zou kunnen gaan. Het werkte namelijk prima
Kater? Eerst water, de rest komt later
Volgens mij is er eigenlijk maar 1 datatype wat niet uit te drukken is als een string: een afbeelding (discutabel trouwens).Davio schreef op maandag 02 augustus 2010 @ 20:26:
[...]
Je maakt echter een kapitale fout in denkwijze als je met strings gaat werken; je neemt namelijk aan dat een object als een IP-adres altijd inherent hetzelfde blijft en dat je er daarom gewoonweg strings van kunt maken en die kunt vergelijken.
Een IP-adres is geen primair datatype als een integer. Als je van het getal 3 een string maakt, is het altijd "3" (of 3,000 of 3.000, jullie snappen de bedoeling), maar nooit "4". Voor klassen en objecten geldt dat niet.
Natuurlijk kun jij een ip adres op meerdere manieren afbeelden (vriendelijke punt notatie, of als byte[] of...). Maar als je eenmaal één formaat hebt afgesproken en dit consistent doet zal het ip adres "192.168.0.1" toch prima op die manier voor te stellen zijn als een string?
Gaan we noch een stapje verder: alle primaire datatypes zijn af te beelden als een string: Objecten (classen) zijn gemaakt van een set primaire datatypen -> alle objecten zijn af te beelden als een string.
Daar gaat bijvoorbeeld XMLSerialization wel van uit.
Ik snap je voorbeeld dan ook niet. Een class die mij als persoon voorstelt (naam en geboortedatum) zal altijd voor te stellen zijn als "Roy, 1988" of "1988, Roy" of "1988Nchr: Roy" (je snapt het idee) net zoals je een getal ook kan voorstellen als "4", "4.000" "4,00" "4*10^0". Etc... Jouw voorbeeld geld in beide getallen. Je moet altijd afspreken hoe je string representatie er uit ziet.
Dus mis ik nu compleet je punt, of?
Mijn punt is dus dat je moet oppassen met het vergelijken van strings die een bepaald object voor moeten stellen en het is natuurlijk altijd beter om objecten direct te vergelijken (bijvoorbeeld door de interface iEquatable te implementeren en een eigen Equals methode te schrijven.
In jouw geval zou het dan zijn:
1
2
3
4
| public boolean Equals(Person other) { return (this.Naam == other.Naam && this.Geboortedatum.Equals(other.Geboortedatum)); // Weet even niet zeker of datum compare ook met == mag } |
Het komt er dus op neer dat je er niet zomaar van uit mag gaan dat een willekeurige string-representatie van een object hetzelfde voorstelt als het hele object.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
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.