Familien Schøler’s blog

Lidt af hvert fra hverdagen hos Michael, Kamilla, Marie og Katrine Schøler

Wulffmorgenthaler Facebook applikation

Hinnerup Net ApS har idag lagt sidste hånd på en Facebook applikation som vi har lavet for Wullfmorgenthaler ApS. Og den må du vist liiiiiige se at få tilføjet til din Facebook profil i en fart, der er tale om welt-klasse her jo! Get going, installer applikationen med det samme!

Undgå Fullrate frustrationer over at have egen server

Nu er jeg ved at være igennem alle de “problemer” som der umiddelbart er med at konfigurere og opsætte egen server på Fullrate‘s netværk (håber jeg). Som sådanne kan Fullrate ikke klandres for noget, måske lige undtaget at de kunne have leveret ZyXEL routerne med en anden standardopsætning. Nuvel, det er fabriksindstillingerne de leverer, og man kan pille i alt, så det er faktisk slet ikke så skidt igen – bare man lige ved hvad man gør, eller kan få lidt hjælp til det, hvilket jeg håber dette indlæg på min blog vil kunne yde dig.

Det vigtigste punkt for at have egen server er at man kan kan se at det virker, også lokalt. Og det kan man ikke med standardopsætningen af routeren fordi loopback her er deaktiveret. Det skal derfor sættes op som noget af det første:

Start en kommandoprompt og skriv “telnet 192.168.1.1″ herefter anmodes du om dit Fullrate login-kodeord. For Fullrate kunder kan det oplyses at der ligger et ganske glimrende og meget mere detaljeret skriv om hele opsætningsproceduren i Fullrate forummet.

Skriv følgende når kodeordet er indtastet:

Fullrate> ip nat loopback on
Fullrate> sys edit autoexec.net

Nu skal autoexec.net filen redigeres med routerens indbyggede udgave af teksteditoren vi du netop har startet, dette gøres således:

Tast i for at indsætte en ny linie og derefter skrives nedenstående kommando
ip nat loopback on
Tast x for at gemme og afslutte editoren
Efter genstart af routeren vil NAT LOOPBACK være aktiveret.

Ovenstående er skrevet af Søren, Fullrate Support

Skriv så exit (og tryk enter) for at logge af routeren igen.

Således vil det fremstå i kommandoprompt-vinduet:

C:\>telnet 192.168.1.1
Password: **************
Copyright (c) 1994 – 2006 ZyXEL Communications Corp.
Fullrate> ip nat loopback on
Fullrate> sys edit autoexec.net
EDIT cmd: q(uit) x(save & exit) i(nsert after) d(elete) r(eplace) n(ext)
: ip nat loopback on
Fullrate> exit

Herefter kan kommandoprompt-vinduet lukkes.

Din router er nu opsat til at anvende loopback, og at genindføre loopback når routeren genstartes. Når der senere foretages et fysisk router reset eller en firmware-opgradering skal man muligvis igennem hele møllen en gang til.

Routeren er efter ovenstående procedure opsat med denne autoexec.net fil:

ip nat loopback on
sys errctl 0
sys trcl level 5
sys trcl type 1180
sys trcp cr 64 96
sys trcl sw off
sys trcp sw off
ip tcp mss 512
ip tcp limit 2
ip tcp irtt 65000
ip tcp window 2
ip tcp ceiling 6000
ip rip activate
ip rip merge on
ppp ipcp compress off
sys wdog sw on
ip icmp discovery enif0 off
bridge mode 1
sys quick enable
ether driver qroute 2

Næst herefter skal du port-forwarde alle de tjenester du ønsker din server skal varetage, f.eks. FTP, HTTP, remote desktop og lignende. Dette gøres nemt ved hjælp af det grafiske web-interface i routeren. En grundig vejledning findes på Fullrate’s support hjemmeside.

Det er ydermere essentielt at du har opsat et evt. domæne til at pege på din globale IP-adresse. Du kan se din globale IP adresse ved at tilgå f.eks. http://www.myip.dk.

Du skal nu konfigurere dit domænes ANAME record således det peger på denne IP adresse.

A record indstillinger:

Host: Angiv dit.domænenavn.dk
IP: Angiv din globale ip adresse
TTL: Sæt lavt indledningsvist så rettelser slår hurtigt igennem f.eks. til 3600 (1 time).

Når disse ændringer er trådt i kraft på DNS systemerne skal opslag med nslookup for dit domæne returnere din globale IP adresse:

C:\>nslookup dit.domænenavn.dk
Server: dns3.fullrate.dk
Address: 89.150.129.4

Non-authoritative answer:
Name: dit.domænenavn.dk
Address: din globale IP adresse

Det skulle vist være det.

Server up and running again – så kører serveren igen!

After changing our Internet provider from Cybercity to Fullrate the server has been without an Internet connection for about 48 hours :-S First and foremost, Cybercity cut the connection 1 day ahead of schedule, and second there were some minor DNS configuration issues after the Fullrate connection was established I had to take care of. Nearly everything runs again now, perhaps besides the www.schøler.net domain which is currently unavailable from Fullrate’s DNS server. If you experience access problems use www.famschoeler.dk or michael.hinnerup.net instead. We have been happy with Cybercity, but their prices are just not competitive anymore. Fullrate’s 20 Mbit/s down and 1 Mbit/s up plus an ip-telephone subscription costs far less than the 8 mbit / 768 kbit (with no ip-telephone subscription) we had before at Cybercity.

Efter at have skiftet fra Cybercity til Fullrate har vores Internetforbindelse været nede i snart 48 timer :-S Det gik først og fremmest galt med at forbindelsen blev lukket 1 dag for tidligt af Cybercity, og der har været knas med DNS-opsætningen i en kort periode efterfølgende vi fik Fullrate forbindelsen igang som jeg dog har fået styr på. Nu lader alt til næsten at være på plads igen, dog måske pånær www.schøler.net der fortsat er ude af drift fra Fullrate’s DNS servere. Har du problemer med at tilgå siden, benyt da istedet www.famschoeler.dk eller michael.hinnerup.net. Vi har været glade nok for Cybercity, men deres priser er simpelthen ikke længere konkurrencedygtige. Den 20 mbit/s ned og 1 mbit/s op forbindelse samt ip-telefoni vi har hos Fullrate nu er langt billigere end den tidligere 8 mbit / 768 kbit forbindelse (uden ip-telefoni) hos Cybercity.

Update / opdatering (12-01-2008 12:40):
The domain www.schøler.net should work again now.
Så virker www.schøler.net vist igen.

JSON merging

Today Jakob Kruse and I devised a simple javascript function to merge two JSON object structures. Say for instance you have two JSON structures, json1 and json2. The object json1 holds an original set of data, whereas json2 holds updated and added values/objects to json1 and you need to programatically merge the two.

Updated: I have now created a JSON diff method also. Check it out.

Updated: The code has been updated on the 14th of January 2008 to allow merging cyclic structures without requiring an infinite amount of CPU cycles… And here I thought that was a reasonable demand on system ressources. This update requires the Array.indexOf method from the prototype framework.

Well, here you go (JSLint even likes it!):

  1. var jsonDataHandler = {
  2.   merge: function(j1, j2) {
  3.     if (typeof this.merging === "undefined" || this.merging === 0) {
  4.       this.cyclicCheck = [];
  5.       this.merging = 0;
  6.     }
  7.     this.merging += 1;
  8.     if (typeof j1 === "undefined") {
  9.       j1 = {};
  10.     }
  11.     if (typeof j2 === "undefined") {
  12.       j2 = {};
  13.     }
  14.     if (typeof this.cyclicCheck === "undefined") {
  15.       this.cyclicCheck = [];
  16.     }
  17.     var key;
  18.     for (key in j2) {
  19.       if (typeof j1[key] === "undefined") {
  20.         j1[key] = j2[key];
  21.       }
  22.       else {
  23.         if (typeof j2[key] === "object") {
  24.           if (this.cyclicCheck.indexOf(j1[key]) >= 0) {
  25.             break;
  26.           }
  27.           this.merge(j1[key], j2[key]);
  28.           this.cyclicCheck.push(j1[key]);
  29.         }
  30.         else {
  31.           j1[key] = j2[key];
  32.         }
  33.       }
  34.     }
  35.     this.merging -= 1;
  36.   }
  37. };

Released under LGPL license.

If you run jsonDataHandler.merge on these JSON objects – note the added cyclic references:

  1. var json1 = {
  2.   foo: 42,
  3.   obj: {
  4.     hello: "world",
  5.     earth: {
  6.       type: "planet"
  7.     }
  8.   },
  9.   bar: 41,
  10.   child: {
  11.     parent: null
  12.   }
  13. };
  14. json1.child.parent = json1;
  1. var json2 = {
  2.   foo: 43,
  3.   obj: {
  4.     earth: {
  5.       type: "habitable planet",
  6.       classification: "mostly harmless"
  7.     }
  8.   },
  9.   newObj: {
  10.     very: "nice"
  11.   },
  12.   worked: true,
  13.   children: {
  14.     parents: null
  15.   }
  16. };
  17. json2.children.parents = json2;

you end up with the following value in the json1 object (which is nice):

  1. jsonDataHandler.merge(json1, json2);
  2.  
  3. /*
  4. The value of json1 is now:
  5.  
  6. {
  7.   foo: 43,
  8.   obj: {
  9.     hello: "world",
  10.     earth: {
  11.       type: "habitable planet",
  12.       classification: "mostly harmless"
  13.     }
  14.   },
  15.   bar: 41,
  16.   child: {
  17.     parent: json1
  18.   },
  19.   newObj: {
  20.     very: "nice"
  21.   },
  22.   worked: true,
  23.   children: {
  24.     parents: json1
  25.   }
  26. }
  27. */

A demonstration of the merge function in action on cyclic structures can be found here.

Work still to be done:

Schema support would be neat as all values from json2 are currently copied into json1 without any structural integrity checking being carried out.

Also, a jsonDiff method should be made – which I’ll most likely do when the need arise. It’s done! See link at the top of this article.

And oh, erhm… Don’t use jsonMerge on cyclic structures just yet, it’s currently not supported. It is supported now, enjoy.