Kategori Programmering

Min guide till Whilenium

I en projektkurs den här perioden ”Operativsystem” har vi skapat ett ganska grundläggande operativsystem vid namn ”Whilenium”, vi har kört det genom Simics med emulering av MIPS. Simics beskrivs så här av Wikipedia:

Simics is a full-system simulator used to run unchanged production binaries of the target hardware at high-performance speeds. Simics was originally developed by the Swedish Institute of Computer Science (SICS), and then spun off to Virtutech for commercial development in 1998.

Vårt operativsystem har i korta drag följande funktioner:

  • Skapa flera processer
  • Köra processerna samtidigt
  • Skicka och ta emot I/O

Däremellan är det väldigt mycket saker varje process ska kunna göra (och inte göra), exempelvis ska processerna kunna avsluta varandra, inte dela minne med varandra etc.

Det har varit en väldigt intressant kurs som byggde på en tidigare väldigt teoretisk kurs med mycket praktiskt arbete. Det som var svårast var nog att förstå kopplingen mellan C och Assembler. Därefter stötte vi på en del problem vad gäller schemaläggningen av processer samt få till systemanropen för att hoppa mellan ”User-space” och ”Kernel-space”

För de som är intresserade kan ni ladda ner källkoden och se (den väldigt korta) dokumentationen här. Ni kan även besöka vårt projekt på Google Code.

Källkoden har en del struktureringsbrister och är inte helt komplett dokumenterad, det hann vi inte med i slutspurten av projektet.


Tack till Jesper Friberg, Oskar Wirén och Daniel Lervik för ett bra arbete!

”They want users on modern browsers”

Rubriken är en del av ett twitter-inlägg postat av Rey Bango och handlar om Internet Explorer 9 som släpptes som en preview idag.

Istället för att jag ska skriva om denna händelse så tänkte jag länka till några andra läsvärda inlägg om detta:

Trevlig läsning! Jag säger som min gode vän Pär Häggström sa: ”Om Microsoft inte gjort rätt den här gången kommer jag aldrig förlåta dem!”

Enkelt shell skrivet i C

Tänkte snabbt lägga upp koden som vi gjorde i en skoluppgift. Uppgiften gick ut på att skapa en del i ett shell-script, närmare bestämt den delen där kommandon som skrivs i shellet ”pipas”.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
 
#include <sys/types.h>
#include <sys/wait.h>
 
/* The array below will hold the arguments: args[0] is the command. */
static char* args[512];
pid_t pid;
int command_pipe[2];
 
#define READ  0
#define WRITE 1
 
/*
 * Handle commands separatly
 * input: return value from previous command (useful for pipe file descriptor)
 * first: 1 if first command in pipe-sequence (no input from previous pipe)
 * last: 1 if last command in pipe-sequence (no input from previous pipe)
 *
 * EXAMPLE: If you type "ls | grep shell | wc" in your shell:
 *    fd1 = command(0, 1, 0), with args[0] = "ls"
 *    fd2 = command(fd1, 0, 0), with args[0] = "grep" and args[1] = "shell"
 *    fd3 = command(fd2, 0, 1), with args[0] = "wc"
 *
 * So if 'command' returns a file descriptor, the next 'command' has this
 * descriptor as its 'input'.
 */
static int command(int input, int first, int last)
{
	int pipettes[2];
 
	/* Invoke pipe */
	pipe( pipettes );	
	pid = fork();
 
	/*
	 SCHEME:
	 	STDIN --> O --> O --> O --> STDOUT
	*/
 
	if (pid == 0) {
		if (first == 1 && last == 0 && input == 0) {
			// First command
			dup2( pipettes[WRITE], STDOUT_FILENO );
		} else if (first == 0 && last == 0 && input != 0) {
			// Middle command
			dup2(input, STDIN_FILENO);
			dup2(pipettes[WRITE], STDOUT_FILENO);
		} else {
			// Last command
			dup2( input, STDIN_FILENO );
		}
 
		if (execvp( args[0], args) == -1)
			_exit(EXIT_FAILURE); // If child fails
	}
 
	if (input != 0) 
		close(input);
 
	// Nothing more needs to be written
	close(pipettes[WRITE]);
 
	// If it's the last command, nothing more needs to be read
	if (last == 1)
		close(pipettes[READ]);
 
	return pipettes[READ];
}
 
/* Final cleanup, 'wait' for processes to terminate.
 *  n : Number of times 'command' was invoked.
 */
static void cleanup(int n)
{
	int i;
	for (i = 0; i < n; ++i) 
		wait(NULL); 
}
 
static int run(char* cmd, int input, int first, int last);
static char line[1024];
static int n = 0; /* number of calls to 'command' */
 
int main()
{
	printf("SIMPLE SHELL: Type 'exit' or send EOF to exit.\n");
	while (1) {
		/* Print the command prompt */
		printf("$> ");
		fflush(NULL);
 
		/* Read a command line */
		if (!fgets(line, 1024, stdin)) 
			return 0;
 
		int input = 0;
		int first = 1;
 
		char* cmd = line;
		char* next = strchr(cmd, '|'); /* Find first '|' */
 
		while (next != NULL) {
			/* 'next' points to '|' */
			*next = '\0';
			input = run(cmd, input, first, 0);
 
			cmd = next + 1;
			next = strchr(cmd, '|'); /* Find next '|' */
			first = 0;
		}
		input = run(cmd, input, first, 1);
		cleanup(n);
		n = 0;
	}
	return 0;
}
 
static void split(char* cmd);
 
static int run(char* cmd, int input, int first, int last)
{
	split(cmd);
	if (args[0] != NULL) {
		if (strcmp(args[0], "exit") == 0) 
			exit(0);
		n += 1;
		return command(input, first, last);
	}
	return 0;
}
 
static char* skipwhite(char* s)
{
	while (isspace(*s)) ++s;
	return s;
}
 
static void split(char* cmd)
{
	cmd = skipwhite(cmd);
	char* next = strchr(cmd, ' ');
	int i = 0;
 
	while(next != NULL) {
		next[0] = '\0';
		args[i] = cmd;
		++i;
		cmd = skipwhite(next + 1);
		next = strchr(cmd, ' ');
	}
 
	if (cmd[0] != '\0') {
		args[i] = cmd;
		next = strchr(cmd, '\n');
		next[0] = '\0';
		++i; 
	}
 
	args[i] = NULL;
}

Blandad information om Shopp

Jag får ganska mycket frågor om WordPress-tillägget Shopp som jag är inblandad i, så jag tänkte ta tillfället i akt och skriva om det.

Payson-betalningsmodul

Det finns en betalningsmodul för Payson att köpa som tillägg i Shopp. Jag är inte ansvarig för utvecklingen av den, det sköter Ingenesis Ltd (företaget bakom Shopp), däremot så har jag hjälpt till i utvecklingen.

Det har även kommit till min kännedom att det finns ex. rabatter inte fungerar fullt ut, vi får se ifall Ingenesis Ltd väljer att åtgärda dessa innan 1.1 (se mer nedan).

Svenska översättningen

Jag underhåller och uppdaterar för närvarande den svenska översättningen av Shopp. Hittar ni någon översättning som inte stämmer eller någon som saknas någonstans i systemet, kontakta mig så ska jag försöka ordna det.

Shopp 1.1

Jag är med i beta-teamet för Shopp, det innebär att jag hjälper till att hitta buggar och kan lägga in förslag på nya funktioner. Det var tänkt att det skulle bli en 1.0.18 av Shopp,  men den idén har slopats och de kommer att satsa på 1.1 Jag vet inte när 1.0.18 kommer. Förhoppningsvis dyker en alpha-version upp ganska kort (~1 vecka).

Några av nyheterna i 1.1

  • Ny hantering av betalningsmoduler/fraktmoduler
    Systemet som finns just nu för att skriva egna betalningslösningar/fraktmoduler är rent ut sagt obegripligt. Det kommer att ändras till det bättre och förhoppningsvis bli riktigt bra!
  • Moms
    Just nu finns det inga möjligheter att sätta specifik moms på vissa produkter, det kommer förhoppningsvis att komma med i 1.1
  • Sessionshantering
    I dagsläget är det ganska rörigt att hålla koll på sessioner som skapas i Shopp och WordPress. Drömmen vore ifall WordPress implementerade ett eget system som andra tillägg kan ”hooka” in sig på, men jag har inte sett något om det på deras tidsplan.

Ni kan läsa tidsplanen i sin helhet på Shopps webbplats: Beta_Team:Roadmap

Vad jag saknar i WordPress

2010-01-08 20:39 – Ändrade rubriken från ”Saker jag ogillar med WordPress” till ”Vad jag saknar i WordPress”

WYSIWYG

Snarare: WYSIWTF (What You See Is WTF). Den ursprungliga idén med editorn var att förhindra att folk la in komplexa HTML-stycken, men just nu begränsar den alldeles för mycket. Den fungerar för den vanliga användaren, men så fort jag försöker göra något utöver det vanliga får jag ta till lite knep och knåp för att få det att fungera.

Standardinstallationen

Då WordPress är en så pass populär mjukvara så gör det att många WordPress-installationer blir mål vid en eventuell säkerhetslucka. Om denna säkerhetslucka utnyttjar något som ingår i standardinstallationen (ex: databasprefix eller administratörskontot) så är många illa ute.

Saker jag gör vid en nyinstallation:

  • Ändrar databasprefixet
  • Byter administratörskontots användarnamn
  • Flyttar ut wp-config.php utanför WordPress-katalogen (oåtkomlig)
  • Ser till att rättigheterna på katalogerna stämmer
  • (Tema) Tar bort WordPress versionsnummer i head-taggen.

Jag skulle även gärna vilja byta ut alla hänvisningar till WordPress-kataloger på webbplatsen (ex: wp-content), just nu är det för mycket meck för att detta ska vara hållbart. Mycket av ovanstående saker borde användaren tvingas göra vid installationen (möjligt att detta försämrar WordPress ”välkänt” korta installationstid).

Sidhantering och menylistning

Just nu är sidhanteringen ohållbar, för att få menyobjekt att hamna i den ordning jag vill utan att hålla koll på prioriteten så krävs ett tillägg som ex. pageMash.

Det finns heller ingen chans att utesluta sidor i administrationen utan det görs manuellt via wp_list_pages() eller ett plugin som Page Lists Plus (där jag även kan vilja vilket namn som ska synas i menyn).

Javascript

Bättre möjligheter för att få kontroll över vilka Javascript och stilmallar som köas. Jag skulle vilja ha möjlighet att bunta ihop dessa till en fil. Mycket av ansvaret för att köa filer ligger på tilläggsutvecklare, många lägger in dessa manuellt utan att köa dem.

Några småsaker

  • Det finns ingen möjlighet till intern länkning. Ex: RB Internal Links
  • ”Custom fields” – bättre möjligheter för att lätt kunna skapa olika typer av mallar där fördefinerade fält enkelt kan fyllas i (dålig förklaring?).
  • Page vs Posts – Blir alldeles för krångligt så fort jag försöker kombinera två loopar, suck…

Sammanfattning

Jag hoppas att många av dessa saker ordnas i WordPress 3.0, det mesta av detta går att lösa genom att använda tredjeparts-tillägg. Jag tror att dessa saker skulle gå att lägga in i kärnan utan att göra den bloatad eller att krångla till det för mycket för slutanvändaren.

Trots ovanstående ”brister” så gillar jag WordPress och projektet utvecklas åt rätt håll känns det som.

(Ovanstående lista är skriven med fokus på WordPress som CMS, inte bloggverktyg)

© Copyright 2002 - 2010 Anders Hassis

Byggt på Notes Blog Core