runemartin.com

Kodesnutter

HTML5

<!DOCTYPE html>
<html lang="nb" xml:lang="nb">
  <head>
    <title></title>
    <meta charset="UTF-8" />
    <link rel="shortcut icon" href="/favicon.png" />
    <meta name="author" content="Rune M. Andersen" />
    <meta name="description" content="" />
    <meta name="keywords" content="" />
  </head>
  <body>
  </body>
</html>

XHTML 1.0 Strict

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html lang="nb-NO" xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title></title>
 		<meta name="author" content="Rune M. Andersen" />
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<link rel="stylesheet" type="text/css" href="style.css" media="all" />
		<link rel="stylesheet" type="text/css" href="print.css" media="print" />
	</head>
	<body>
	
	</body>
</html>

Hash med "salting"

define('SALT_LENGTH', 9);

function generateHash($plainText, $salt = null){
  if ($salt === null) {
    $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
  } else {
    $salt = substr($salt, 0, SALT_LENGTH);
  }
  return $salt . sha1($salt . $plainText);
}

Sesjonsstart


session_save_path("/www/path/to/save/session/files");
session_set_cookie_params(3600, '/url/to/app', '.domain.com', 1);
session_name("AppName");
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
// Hindre bruk av delt cache hvis siden er ment til bare én bruker
header("Cache-control: private");
//Starter sesjonen
session_start();

Hindre caching

En eller flere av linjene under:

header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

Korrekt caching med headere

header('Last-Modified: '.gmdate("D, d M Y H:i:s", $updatedTimestamp) . " GMT");
header('Expires: '.gmdate("D, d M Y H:i:s", $expireTimestamp) . " GMT");

Tegnsett

Tving webserveren til å sende riktig innholdstype.

header("Content-Type: text/html; charset=UTF-8");

Unngå dobbelkonvertering av UTF-8 fra databasen.

mysql_set_charset("utf8", $db);

Overføre UTF-8 i MySQL Front: Bruk latin1 connection, lagre fil som utf-8, og importer som utf-8.

PHP til å tolke særnorske bokstaver korrekt.

setlocale(LC_ALL, array('nb_NO.UTF-8', 'nb_NO', 'no_NO'));

Ta tiden på eksekvering

// ved start
$timeparts = explode(" ",microtime());
$starttime = $timeparts[1].substr($timeparts[0],1);

// ved stopp
$timeparts = explode(" ",microtime());
$endtime = $timeparts[1].substr($timeparts[0],1);
echo "<span style=\"color: #888\">Lasting tok: ". bcsub($endtime,$starttime,6)." sekunder.</span> ";

WordPress

Beregn når 1. påskedag inntreffer

function spencerJones($y = NULL){
  // $y representerer året 1. påskedag skal beregnes for. 
  $y = !($y) ? date('Y') : $y;
  $a = $y % 19;
  $b = floor($y/100);
  $c = $y % 100;
  $d = floor($b/4);
  $e = $b % 4;
  $f = floor($b + 8)/25;
  $g = floor($b - $f + 1)/3;
  $h = (19*$a + $b - $d - $g + 15) % 30;
  $i = floor($c/4);
  $k = $c % 4;
  $l = (32 + 2*$e + 2*$i - $h - $k) % 7;
  $m = floor(($a + 11*$h + 22*$l)/451);
  
  // Sluttresultatet
  $paskemnd = floor(($h + $l - 7*$m + 114)/31);
  $paskedag = ($h + $l - 7*$m + 114) % 31 + 1;
  $paskedato = mktime(0, 0, 0, $paskemnd, $paskedag, $y);
  return $paskedato;
}

		var $paskerelatert = array(
			array(-7, 'Palmesøndag'),
			array(-3, 'Skjærtorsdag'),
			array(-2, 'Langfredag'),
			array(0, '1. påskedag'),
			array(1, '2. påskedag'),
			array(39, 'Kristi himmelfartsdag'),
			array(49, '1. pinsedag'),
			array(50, '2. pinsedag')
		);

Tilpass til iPhone/iPod Touch

<!-- Zoomnivå og standardstørrelse -->
<meta content="minimum-scale=1, width=device-width, maximum-scale=0.6667, user-scalable=yes" name="viewport" />
<!-- Åpne i fullskjerm, uten toolbars -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- Sette stil på statuslinja (default/black/black-translucent) -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- Skru av detektering av tall som kan være telefonnumre -->
<meta name="format-detection" content="telephone=no">
<!-- Pent ikon på desktop -->
<link href="http://link-to-your.com/app-icon.png" rel="apple-touch-icon" />

Smartere spørringer (group_concat)

Eksempel på hvordan man kan slippe å først spørre etter brukere, deretter rettigheter og til slutt variable, ved å spørre etter lister med tilsvarende informasjon.

select b.*,
  group_concat(distinct t.applikasjonsID order by t.applikasjonsID separator '|') as tilganger,
  group_concat(distinct concat(v.applikasjonsID, '='), concat(v.navn, '='), v.verdi separator '|') as variabler
from bruker as b
left outer join tilgang as t on b.brukernavn=t.brukernavn
left join variabel as v on b.brukernavn=v.brukernavn
group by b.alias
order by b.alias, b.etternavn, b.fornavn

QR-koder vha Google Charts API

http://chart.apis.google.com/chart?cht=qr&chs=100x100&chl=http://m.layar.com/open/ntnuorg

Forhinder "POSTDATA has expired"

header("Cache-control: private");
Koden overstyrer PHP-defaulten «private,nocache», og gjør at browseren tør lagre og presentere en mellomlagret versjon av siden heller enn å poste den på nytt.

Automagisk oversetting med gettext

Bruk gettext på alle teksttrenger i koden:

<?= _('Tekst som skal oversettes') ?>

Lag en katalog med Poedit, og legg den genererte fila messages.mo i mappa ./locale/en_US/LC_MESSAGES. Inkludér i toppen av kildekoden:

$directory = dirname(__FILE__).'/locale';
$domain = 'messages';
$locale = (isset($_GET['locale'])) ? $_GET['locale'] : 'nb_NO.utf8';
setlocale(LC_MESSAGES, $locale);
bindtextdomain($domain, $directory);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

Besøk ?locale=en_US.utf8 og se oversatt versjon.

Dynamisk oppdatering av størrelse ved skjermsnuing på iOS-dingser

    var changeViewport = function () {
        if (window.orientation == 90 || window.orientation == -90)
            $('meta[name="viewport"]').attr('content', 'height=device-width,width=device-height,initial-scale=1.0,maximum-scale=1.0');
        else
            $('meta[name="viewport"]').attr('content', 'height=device-height,width=device-width,initial-scale=1.0,maximum-scale=1.0');
    }
    window.addEventListener('orientationchange', changeViewport, true);
    try { changeViewport(); } catch (err) { }

Velge innhold i inputfelt, uten å miste valget ved klikk nr 2

$('input').focus(function(){ 
  $(this).select(); 
}).click(function(){ 
  $(this).select(); 
}).mouseup(function(e){
  e.preventDefault(); 
});

Auto-select input field with jQuery, without having a deselect on clicking

Vise alle feilmeldinger i PHP

error_reporting(E_ALL);
ini_set('display_errors', '1');