I stumbled across a piece of code that were acting up, instead of 1048575 possible combinations (0×0 through 0xFFFFF hexadecimal) it varied between 16 distinct combinations … when executed a couple of thousands times in a tight loop.

	public static function generateBase16Code() {
		$chars = "0123456789ABCDEF";
		srand();
		$result = '';
		for ($i = 0; $i < 5; $i++)
			$result .= substr($chars, rand() % strlen($chars), 1);

		return $result;
	}

It produces a string of 5 chars, hexadecimal (0-9 & A-F) in a rather difficult way,

  • Define which characters to use in a string
  • Seed the rand()-function with srand()
  • Prepare a string to store the result in
  • Loop 5 times, where ..
    • A character is chosen from the string, based on "rand() modulo string-length", concatenated to the result-string
  • Return the generated result-string to caller

.. I thought for at few seconds and commented out the above code and replaced it with this;

	public static function generateBase16Code() {
		mt_srand();
		return strtoupper(substr('00000' . dechex(mt_rand(0x0,0xfffff)),-5,5));
	}

.. This could be a one-liner, but I wanted to make sure the random function were seeded properly, therefore two lines of code. The randomness factor is way higher and the function overall is faster, as it doesn’t loop and does string-concatenation only once, instead of at least five times. Also mt_srand() and mt_rand() uses the Mersenne Twister for better randomness, it could be tweaked further with a chosen seed for mt_srand().

Posted in PHP.

Den började för drygt 50 minuter sedan, min semester.

Större delen av söndagen spenderades på soffan, det var varmt, nästan outhärdligt. När det blev svalare framåt kvällen fixade vi lite i trädgården, jag klippte ned lite risiga buskar som skymde smultronen, nu kommer solen åt lite bättre och vi får förhoppningsvis lite fler smultron, sen att buskaget ser lite mindre risigt ut är en bonus.

Roade mig med att göra lite research på IPv6, mera validering av IPv6-adresser .. hittade några lämpliga kandidater och ett lass med testdata, med riktigt formaterade blandat med trasigt och ogiltigt formaterade data.

Candidate: A 448/25 of 473
Candidate: B 473/0 of 473
Candidate: C 437/36 of 473
Candidate: D 450/23 of 473
Candidate: E 317/156 of 473
Candidate: F 448/25 of 473
Candidate: G 450/23 of 473

Det ser ut som candidate ‘B’ vinner för den klarade alla tester efter lite tweakande av regeln;

^(\s{1,})?(?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))(\s{1,})?$

Resultatet av testerna kommer användas i MediaCreeper, då jag sett att fler och fler träffar med IPv6-adresser och i dagens läge klarar MediaCreeper endast av IPv4-adresser. Det känns inte som någon större brådska att implementera IPv6 riktigt än, de IPv6-besökare som förekommer utgör några få träffar om dagen, så de slipper undan en stund till. Vidare har jag även kikat på hur man skall definiera IPv6 ranges på ett fiffigt sätt, MySQL (v5.x) har vad jag förstått inga native funktioner för att konvertera IPv6-adresser till DECIMALs.

Nåja, känns som kvällens övningar vid datorn är färdiga. Nu skall jag nöta lite soffa med Älsket och stirra på dumburken en stund, kanske med en kall öl i näven — för i morrn har jag semester.

Jag var inte riktigt nöjd med hur WordPress fungerade efter jag hade uppdaterat/uppgraderat till WordPress 2.6, så jag kollade hur högt rankade bloggar länkar taggar. Därefter satte jag mig och slängde ihop lite kod för att åstadkomma länkning av taggar. Nedan delar jag med mig av koden, för den som är lite händig med PHP kan själv göra ändringar. Jag lämnar ingen som helst support på koden, you’re on your own lixom. Kommentera gärna om du använder koden, du får länk tillbaka genom CommentLuv! :)

I WordPress admin, gå till Design, vidare till Theme Editor och välj sedan Main Index Template (index.php) och klistra byt ut kodsnutten ..

<?php get_tags(); ?>

… mot …
<?php if(kakhack()) { ?>
<p style="border: 1px solid #ddd;background-color: #eee;padding: 3px;">
<span class="taglinks"><?php echo(makeTagLinks('bloggar.se: ','http://bloggar.se/om/')); ?></span><br />
<span class="taglinks"><?php echo(makeTagLinks('knuff.se: ','http://knuff.se/q/')); ?></span><br />
<span class="taglinks"><?php echo(makeTagLinks('bloggtips.se: ','http://bloggtips.se/kategori/')); ?></span>
<?php } ?>

… sedan sparar du och väljer Theme Functions (functions.php) och klistrar in koden nedan högst upp i koden.

function kakhack() {
  $posttags = get_the_tags();
  if ($posttags) {
    return true;
  } else {
    return false;
  }
}

function makeTagLinks($link_prefix_text,$link_uri_base) {
  $result = "";
  $posttags = get_the_tags();
  if ($posttags) {
    $result = $link_prefix_text;
    foreach($posttags as $tag) {
      $result .= '<a href="' . $link_uri_base;
      $result .= rawurlencode(strtolower($tag->name));
      $result .= '" ';
      $result .= 'title="' . htmlentities($tag->name) . '" ';
      $result .= 'rel="tag"';
      $result .= '>';
      $result .= htmlentities($tag->name);
      $result .= '</a>, ';
    }
    $result = preg_replace('/\x2c\x20$/','',$result);
  }
  return $result;
}

Koden är ganska enkel och behöver inte förklaras i detalj, jag har med flit låtit bli att kommentera koden. Förstår du inte vad den gör, låt bli att använda den.

Posted in PHP.