http://www.jensgram.dk/

Nyheder på sitet

- Her vises de seneste nyheder


Periode: (seneste 10 nyheder)

 jfmamjjasond
'01  5610  4911106
'021025693 52545
'0386453523 233
'0431  11225324
'051422211  111
'06  13 11221 1
'073 3  11 1 12
'08 11   1 1   
'092 1   1     
'10         122
'111           

Nyhedsoversigten på www.jensgram.dk informerer efterhånden lige så meget om mig selv som om nye tiltag på sitet. For overskuelighedens skyld er navigationen opdelt i perioder, og de enkelte nyheder kan kommenteres.

Til højre kan du vælge mellem de seneste 10 indlæg, et helt årstal eller en enkelt måned. Tallene angiver, hvor mange nyheder der er i hver periode.

Søgning i TYPO3's Element Browser 18:51:33 @ 04-01-2011
Det har i lang tid irriteret mig, at man i TYPO3 — når man vil indsætte et billede i et indholdselement, e.g., "Text w/image" — ikke har mulighed for at søge efter filer i /fileadmin! Jeg har uden held ledt efter diverse extensions1, ligesom jeg længe håbede, at denne — synes jeg — essentielle funktionalitet endelig ville være tilgængelig i TYPO v. 4.4.x. Det viste sig imidlertid ikke at være tilfældet.

Problemet illustreres herunder, hvor jeg ønsker at indsætte ét eller flere billeder via "TYPO Element Browser". Efter et klik på "Browse for files" tilbyder TYPO3 (ihvertfald t.o.m. v. 4.4.4) blot en Element Browser med et directory tree og filer i den valgte mappe.
Indholdslement "Text w/image" i TYPO3 v. 4.4.4

Løsningen er at redigere en smule i typo3_src-4.x.x/typo3/class.browse_links.php. Det er ikke kønt og performer sikkert elendigt … men det virker!
Tilføjelse af filsøgning i TYPO Element Browser
Resultat af søgningen "arkitektur" i TYPO Element Browser

For at tilføje søgefunktionaliteten skal du i class.browse_links.php finde funktionen fileList(). Den er defineret laaangt nede i filen; se funktionsindekset øverst i filen for den eksakte placering. Mellem linierne if (is_array($files)) { og // Create headline (showing number of files): (funktionens øverste linier) indsættes følgende klump:
/**
 * Jens Gram: Adding search field
 * Nothing touched above this line!
 */
$jgSearch = array();
$jgFolderName = $folderName;
if (isset($_GET['search']) && strlen(trim($_GET['search'])) > 0) {
        // Replace multiple spaces, then trim
	$jgSearch = explode(' ', trim(preg_replace('/ +/', ' ', $_GET['search'])));
	
	$jgFiles = array();
	$jgRecFiles = array();
	$jgPArr = explode('|',$this->bparams);
	t3lib_div::getAllFilesAndFoldersInPath(&$jgRecFiles, $folderName, $jgPArr[3]);
	foreach ($jgRecFiles as $filepath) {
		$match = true;
		foreach ($jgSearch as $needle) {
                        // Require all needles to be found
			$match = $match && stristr($filepath, $needle);
		}
		if ($match) {
			$jgFiles[] = $filepath;
		}
	}
	$files = $jgFiles;
	$folderName = null; // Unset to prevent icon + folder name
}
$out .= $this->barheader(sprintf('Search in "%s" and subfolders:',
         htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($jgFolderName),$titleLen))));
$out .= sprintf('<form style="padding: 3px 0 8px;" method="get" action="%s">
         <input type="hidden" name="act" value="%s" />
         <input type="hidden" name="mode" value="%s" />
         <input type="hidden" name="expandFolder" value="%s" />
         <input type="hidden" name="bparams" value="%s" />
         <input type="text" name="search" value="%s" />
         <input type="submit" value="Search" /></form>',
         $this->thisScript, $this->act, $this->mode, $this->expandFolder, $this->bparams,
         htmlspecialchars(implode(' ', $jgSearch)));
/**
 * Nothing touched below this line!
 */

Kompatibilitet
Løsningen er testet i TYPO3 v. 4.2.8 og 4.4.4. At dømme efter kildekoden er der dog ikke grund til at tro, at ovenstående hack ikke også skulle fungere i tidligere versioner. Jeg har endnu ikke haft v. 4.5.x installeret og tør således ikke udtale mig om denne.


1) Det har sidenhen vist sig, at kildekoden, der er ansvarlig for TYPO3 Element Browser ikke tilbyder "hooks", hvor en eventuel extension ville kunne byde ind med søgefunktionalitet. Retrospektivt er det således åbenlyst, at jeg aldrig ville have fundet en extension, der udvider det indbyggede Element Browser.

Undgå pauseskærm og låsning med AutoHotkey (Windows) 09:10:54 @ 29-12-2010
Benytter du også en "corporate" computer, hvor man fra it-afdelingens side har valgt, at brugere ikke må deaktivere pauseskærm (og efterfølgende låsning)? Det er relativt irriterende, hvis man vil se film ... eller skal lave en præsentation, hvor der kan risikere at gå mere end ti minutter mellem slide-skift.

mousey.ahk i aktion. Programmet AutoHotkey (hent blot "basic"-udgaven) kan dog hjælpe. Via et simpelt script — mousey.ahk — kan AutoHotkey nemlig simulere en én-pixel-flytning af musen. Intervallet og flytningens udstrækning kan reguleres, men standardværdierne (ét minut, én pixel) fungerer fint.

Essensen af scriptet gengives herunder:
; AutoHotkey script: http://www.autohotkey.com/
; Prevent the Screen Saver from engaging by
; periodically moving the mouse up and down by one pixel.

pixelDelta := 1
intervalMinutes := 1
intervalMilli := intervalMinutes * 60 * 1000

Menu TRAY, Tip, Mouse nudger (%intervalMinutes% min interval)

Loop:
Sleep %intervalMilli%

MouseGetPos x, y
y := y + pixelDelta
MouseMove %x%, %y%

pixelDelta := -pixelDelta

Goto Loop


Videre med Gammu SMSD: MySQL som back-end 18:22:41 @ 06-12-2010
For en lille måneds tid siden skrev jeg — i nyheden "Modtagelse af SMS'er til PC via Gammu SMSD" — om, hvordan jeg havde kastet mig over Gammu SMSD mhp. at modtage SMS'er direkte på min (Ubuntu Linux) PC.

Jeg er efterfølgende gået lidt videre, idet jeg har eksperimenteret med at sætte de modtagne SMS'er direkte ind i en MySQL-database. Takket være Gammus udvalg af back-ends er det endog meget simpelt: min nye konfigurationsfil (~/.gammurc-w200i) ser ud som følger...
[gammu]
port = /dev/ttyACM0
model =
connection = at115200
synchronizetime = no
logfile = /home/jensgram/mobiletest/w200i.log
logformat = text
use_locking =
gammuloc =

[smsd]
Service = MYSQL
LogFile = /home/jensgram/w200i.log
DebugLevel = 1
User = ********
Password = ********
PC = db.jensgram.dk
Database = ********
Herefter startes Gammu SMSD og loggen følges:
~$ gammu-smsd -c ~/.gammurc-w200i &
~$ tail -f w200i.log

Versionsnoter
Bemærk: Jeg benytter Gammu version 1.27. Fra version 1.28 er der et par konfigurationsparametre, der har skiftet navne:
  • Service = MYSQLService = SQL og Driver = native_mysql
  • PC = <DB-host>Host = <DB-host>

Tabeldefinitioner
... Kan findes i share/doc/gammu/examples/sql/mysql.sql eller lige her (kondenseret).

Web 7.0!? 16:23:26 @ 16-11-2010
Når jeg ser Yvette's Wedding Dresses Panama City Florida Yvette's Yvette's (ja, det er tilsyneladende det man har valgt at døbe sitet) kan jeg ikke andet end håbe, at det er Yvette selv, hendes mand eller hendes teenagesøn, der står bag ... det hele. Oh my! Eneste dækkende kommentar, der popper op i mit hoved:

Holy God on a pogo stick ... That's ... Wow. I've flushed things that were prettier and more usable. John Rudy @ SO



Modtagelse af SMS'er til PC via Gammu SMSD 12:43:03 @ 12-11-2010
For at modtage SMS'er direkte til PC'en via en mobiltelefon har jeg taget et kig på de forskellige muligheder. I det følgende gennemgår jeg mine krav, samt hvordan Gammus SMS Daemon viste sig at imødekomme disse på en simpel måde.

Krav
Mine krav var relativt beskedne, da jeg blot ønskede et program, der kunne kommunikere direkte med en telefon (hér: en Sony Ericsson W200i eller en Nokia E52, da det var de to modeller jeg havde let adgang til) via USB-tilslutning og hente indkomne SMS'er. Disse SMS'er skulle skrives til en fil eller database således at de let kunne viderebehandles. Alternativt skulle programmet muliggøre at der kunne laves et HTTP-kald med data for hver SMS.

Umiddelbare muligheder
En indledende undersøgelse indikerede, at følgende programmer / libraries var værd at afprøve: Da gnokii ikke virkede out-of-the-box blev jeg utålmodig og kastede mig i stedet over Gammu SMSD:

Installation af Gammu SMSD på Ubuntu
Testmaskinen var en Asus Eee 901 med Ubuntu 10.10. Via Ubuntu Software Center installerede jeg gammu-smsd. Alternativt kan du gøre det via:
~$ sudo apt-get install gammu-smsd
Herefter skal Gammu SMSD konfigureres. Jeg startede med den ældste telefon (Sony Ericsson W200i) da det var den jeg helst ville benytte.

Konfiguration af Gammu SMSD: Modtagne SMS'er til filer
Først oprettes de nødvendige filer (konfiguration og logging) og bibliotek til indkomne beskeder:
~$ touch .gammurc-w200i
~$ touch w200i.log
~$ mkdir inbox-w200i
Som udgangspunkt benyttes konfigurationsfilen /etc/gammu-smsdrc, hvis ikke andet angives. Jeg valgte at benytte en lokal: ~/.gammurc-w200i. Med følgende indhold lykkedes det at kunne læse modtagne SMS'er og skrive hver enkelt til en fil i ~/inbox-w200i/: Først en generel sektion til Gammu:
[gammu]
port = /dev/ttyACM0
model = 
connection = at19200
synchronizetime = no
logfile = /home/jensgram/w200i.log
logformat = text
use_locking =
gammuloc = 
Dernæst en SMSD-specifik sektion:
[smsd]
Service = files
LogFile = /home/jensgram/w200i.log
DebugLevel = 1
InboxPath = /home/jensgram/inbox-w200i/

Modtagelse af SMS'er
Dernæst er det bare at tilslutte telefonen via USB og starte gammu-smsd med den rigtige konfigurationsfil:
~$ gammu-smsd -c ~/.gammurc-w200i &
Den løbende kommunikation kan nu overvåges via gammu-smsd-monitor eller ved at følge log-filen:
~$ gammu-smsd-monitor -c ~/.gammurc-w200i
~$ tail -f w200i.log
I biblioteket inbox-w200i vil der herefter være en fil for hver modtagen SMS. Filens indhold er selve SMS'en, mens filnavnet indeholder relevant metainformation: IN<date>_<time>_<serialNo>_<phoneNo>_<sequence>.<ext>, e.g. IN20101108_171220_00_+4530228820_00.txt. serialNo er en fortløbende nummerering for SMS'er modtaget i samme sekund, mens sequence er rækkefølgen for sammenkædede beskeder.

Videre med Gammu SMSD
Gammu kan som nævnt skrive til flere back-ends. Jeg er ikke nået videre da jeg endnu ikke har fået armene ned over, hvor let det hele var :)

Nokia E52?
Nej, jeg kunne ikke umiddelbart få den til at virke. Så vidt jeg kan læse mig til skulle Gammu ikke have problemer med ældre Nokia-telefoner, men S60'erne volder vist problemer. Whatever, jeg bruger bare min W200i.



Cut'n'paste configuration
~$ touch w200i.log && mkdir inbox-w200i && echo "[gammu]
port = /dev/ttyACM0
model = 
connection = at19200
synchronizetime = no
logfile = /home/jensgram/w200i.log
logformat = text
use_locking =
gammuloc = 

[smsd]
Service = files
LogFile = /home/jensgram/w200i.log
DebugLevel = 1
InboxPath = /home/jensgram/inbox-w200i/" > .gammurc-w200i


Speciale ved IMV: ZoomZone 19:46:18 @ 19-10-2010
Nu har jeg endeligt fået snøvlet mig sammen til at publicere mit speciale: "ZoomZone: En karakteristik af en præcis, håndethedsneutral interaktionsteknik til mobile, enhåndsbetjente touchscreen-enheder". Det sker via en dedikeret side, modsat mine hidtidige skriverier.

Den samlede PDF vejer ind på 34MB og du er meget velkommen til at hente den.

(Det er desuden mere end et år siden jeg sidst skrev en "nyhed" ... hmm!)

CONTENT-elementet i TYPO3: Logostyring 10:02:36 @ 21-07-2009

I forbindelse med en aktuel freelanceopgave for Folkemusikkens Fælles Sekretariat er det et krav, at redaktører let kan udskifte sitets logo (iht. kampagner etc.). For at imødekomme dette krav oprettede jeg er "sysfolder" med delte elementer - herunder endnu en sysfolder kun med logoer (indholdselementer af typen "Image"):

TYPO3 back-end med sysfolders og indholdselementer (af typen Image).

Det aktuelle logo er det øverste synlige element: i dette tilfælde billedet "Beta" (titlen bruges som alt-tekst). I det følgende tages udgangspunkt i, at jeg i min skabelon har mappet lib.logo som container:

lib.logo = CONTENT
lib.logo {
  table = tt_content
  select {
    pidInList = 326
    selectFields = image,header
    max = 1
    orderBy = sorting
  }
  renderObj = COA
  renderObj {
    5 = IMAGE  
    5 {
      required = 1
      file {
        import = uploads/pics/
        import.field = image
        width = 928
      }
      altText.field = header
      wrap = <a href="/"> | </a>
    }
  }
}

Bemærk, at de markerede værdier (pidInList = 326 og width = 928) er rettet mod den aktuelle opgave. Værdien 326 svarer til ID'et på den sysfolder, der indeholder logoerne, jf. illustrationen ovenfor. 928 er logoets maksimale bredde i pixels (logoet skaleres proportionalt).

Du kan læse mere om CONTENT-elementet på TYPO3 Wizard, samt i dokumentationen.



Sikkerhed og brugerdata 16:02:20 @ 14-03-2009
Med inspiration fra http://guides.ricehigh.dk/?p=1, har jeg i dag revideret brugerhåndteringen på www.jensgram.dk. Det betyder, at passwrods ikke i fremtiden vil opbevares som MD5-hash. I stedet genereres ved oprettelse (og hvert login) et tilfældigt salt, der — sammen med et konstant (og hemmeligt) salt — benyttes til at kreere et salted SHA-256-hash af brugerens password.

Fordelen er, at brugerdatabasen nu ikke er meget værd, hvis den skulle komme i de forkerte hænder. Det er nemlig meget tidskrævende at brute force sig til brugerens "rå" password. Og hvert password skal brute forces individuelt!

Ved samme lejlighed opdagede jeg imidlertid, at der i tabellen var et ødelagt indeks. Det betød desværre, at brugertabellen måtte erstattes med en back-up fra januar i år :(

Pagination i PHP vha. JgPaginator 19:00:29 @ 17-01-2009

Der findes masser af bud på, hvordan man kan lave paging (pagination) i PHP. Nogle løsninger er håbløse, andre er for specifikke - og de sidste er som regel for komplekse! I det følgende præsenteres en simpel OO-tilgang, der kan håndtere de fleste behov.

Sådan begynder min seneste artikel til Eksperten.dk, som har fået titlen "Simpel, alsidig, objekt-orienteret pagination (paging) i PHP". Og det er faktisk lige præcis hvad den handler om!

I artiklen gennemgår jeg, hvordan man kan benytte en klasse til at lave paging på en både simpel og elegant måde. Du kan naturligvis copy-paste koden fra artiklen — som forøvrigt også er tilgængelig her på sitet, sammen med de andre E-artikler — men du kan også finde den blandt mine PHP-klasser (hvor den har fået titlen JgPaginator).

Ønsker du først at inspicere, kan du kigge forbi gæstebogen, hvor JgPaginator er i fuldt sving (se sidens kildekode). (En større revidering af gæstebogens indtastningsformular er påtænkt — og påkrævet, ikke mindst!)



Avanceret nyhedsnavigation 23:11:30 @ 03-01-2009
Jeg faldt i dag over en ret elegant visualisering af indlæg ift. enkelte måneder. (Jeg var i gang med at undersøge, hvordan jeg kunne slette forkerte favicons fra Firefox - de gemmes nu i SQLite, kan jeg berette.)

Det er for så vidt meget simpelt: Måneder ligger på førsteaksen, mens år ligger på andenaksen. De enkelte koordinater indeholder et link til månedens nyheder og viser det aktuelle antal.

Du kan se det i brug på nyhedssiden ved at klikke "avanceret" i den grå periode-boks øverst til højre.

— Godt nytår


© 2001–12 Jens Gram - www.jensgram.dk • Tlf.: 30 22 88 20 • CVR: 31 66 04 32 • 41,3 ms