Technik, Gothic und Anderes

Technik ist Spiel, Gothic ist ernst und Zeit hat man zuviel

  • Kategorien

  • Tags

  • Archiv

  • Links

    zu Bee5

    blog.oncode.info läuft bei Cyon und ich bin sehr glücklich damit.

Archiv

15 Sekunden Ruhm; Moodle, e-Learning und die Berufsfachschule BBB im Fernsehen

Geschrieben von skaldrom am 9. May 2008

TrophiesDie Berufsfachschule BBB ist wirklich ziemlich an vorderster Front was die Umsetzung von e-Learning im Präsenzunterricht angeht. Zum Einen wurde sie von IBM zur besten e-Schule in der Sekundarstufe II ausgezeichnet, zum Andern hat das Magazin Einstein des Schweizer Fernsehens einen kleinen, aber feinen Bericht darüber gedreht, der (oder direkt bei SF DRS) angesehen werden kann

Wer in den verschiedenen Beiträgen meine Fresse erkennt, kriegt drei Vaterunser und Eiswürfel, um sie auf die Augen zu legen :-D .

Aja, den Juniorwebaward 2008 haben wir in unserer Altersklasse auch noch gewonnen…

Eingeordnet in eLearning | 2 Komentare »

PHP-UWA Widget Library

Geschrieben von skaldrom am 26. November 2007

Widgets and Web 2.0

Universal Widget ArchitectureWidgets are little miniapplications which show data in a clearly arranged way or perform a more or less simple task for the user. Widgets are present on Windows Vista, Mac, iPhone and also in a webbased form for iGoogle, Yahoo!, Netvibes and many other portals. To give a boost to widget development, Netvibes presented a new framework which shall facilate the coding of widgets. The child is called Universal Widget Architecture. Widgets coded with the help of this framework should work on all the mentioned plattforms.

UWA Standard

A widged, coded with UWA is basically a XML-Dokument. It contains metadata, settings and the active part, written in Javascript. Especially the Preferences are of interest, because they are dynamic and allow widgetspecific settings. There are also some convenience-functions in the UWA-library.

The UWA specification has its own homepage and is very well documented. There are examples, a code-skeleton with explanations, a step-by-step tutorial, a forum and even a cheat-sheet. The start is very easy with such a lot of documentation.

Widget Repository

Finished and released widgets can be made available for the public and published in the Widget Repository (Ecosystem). Widgets ion this website can be added to the different platforms with a single (or double) click). There are some widgets in the repository which are coded in the deprecated Mini-API standard, but these will dissappear soon (hopefully).

Implementations

That sounded fascinating and must have a use somewhere… I will implement some widgets later, I needed to make these widgets usable in our own projects first. So I wrote a little PHP-class which I called pretentious PHP-UWA Widget Library.Handling widged should be easy, using this class. A little bit more ambitious is the handling of widget dependend preferences.

A minimal example is included in the download-package and can also be checked online.

PHP-UWA Widget Library Example

Displaying a widget should be straight forward:

<?php
require_once('uwawidget.php');
$uwawidget=new uwawidget('http://www.netvibes.com/api/uwa/examples/digg.xhtml');
echo $uwawidget->getWidgetHTML();
?>

There are two classmembers which can give more information about the widget:

getMetaData()
Metadaten like author, keywörds, description, … See the docu.
getAdditionalData()
Additional info like icons, stylesheets, …

Basically, there are the following sections for settings:

general
The widgets URL.
configuration
Displayparameters, which described in the docs.
preferences
Widget dependent preferences, also mentioned in the docs

For all these settings, there are the following classmembers:

Setters and Getters
setModuleUrl(), setConfiguration(), setPreferences()

getModuleUrl(), getConfiguration(), getPreferences()
getSettingsFormData($section)
Returns the settings in a friendly array, from which a form can be generated. $section can be "general", "configuration" or "preferences"
getSettingsHTML($section)
Returns the settings in an array with the format "Label" => "HTML". $section can be "general", "configuration" or "preferences"

For a test, I coded a Moodle block, which allows to use UWA Widgets inside the LMS. Heyo, Wordpress, Xoops, etc-Coderz, how about an integration of the Widgets in your system???

Examples from the Moodle block:

Moodle UWA Calculator Moodle UWA Converter Moodle UWA Translator
Moodle UWA Google Notes Moodle UWA Spider Moodle UWA ToDo
The configuration in Moodle:
Widget settings in Moodle

Uh, almost…

…I was almost faster than the german computer magazine c’t which has a short bit good introduction into UWA-Widgets.

Eingeordnet in Learninmanagement Systeme (lms), Web | 6 Komentare »

Moodle Block Resource-Download

Geschrieben von skaldrom am 22. October 2007

Der Moodle Resource Download Block

Moodle Resource Download Block Auf vielfachen Schülerwunsch hin habe ich einen Block für unser Learning Management System Moodle codiert: Den Resource Download Block. Er erlaubt den Download aller Kursdateien und Verzeichnisse in einem ZIP-Archiv. Dieses Zip-Archiv wird wie im Beitrag Zipdateien on-the-fly erstellen mit PHP dynamisch erstellt, da (in der Theorie) jeder Lernende eine andere Kursansicht haben kann.

Einen Block erstellen ist relativ einfach, wenn man dem Block Howto folgt, aber der Teufel liegt wie immer im Detail.

Configwerte

Jeder Block kann verschiedene Konfigurationswerte erfragen und erhalten. Diese unterscheiden sich aber, ob der Block global (pinned, sticky) ist, in welchem er nur von einem Ort aus konfiguruiert wird oder ob er den individuellen Kursen hinzugefügt wurde, wobei dann jede Instanz ihre eigene Konfiguration hat. Ich habe mich für den zweiten Weg entschieden.

Um die Konfigurationsvariablen mit einem Defaultwert zu versehen, muss man sich in der instance_config_print() Methode darum kümmern:

if (!isset ($this->config)) {
    // ... teacher has not yet configured the block, let's put some default values here to explain things
    $this->config->exclusionregexp= block_downloader_default_exclusionregexp();
    $this->config->compression= block_downloader_default_compression();
    $this->config->maxsize= block_downloader_default_maxsize();
}

Die Datei, die das Zip zusammenstellt ist mehr oder weniger ausserhalb von Moodle, da sie nicht “als Block” erscheinen kann. Um da an die Konfigurationsdaten zu kommen, muss man etwas mehr Aufwand treiben. Sie befinden sich base64 codiert in den Tabellen block_instance respektive blocks_pinned für globale Blocks. courseid und instanceid werden dabei vom Link im Block übergeben.

<?php

/**
 * Create the zip on the fly and push it to the browser.
 */


require_once ('../../config.php');
require_once ($CFG->dirroot . '/blocks/downloader/lib/archive.php');
require_once ($CFG->dirroot . '/blocks/downloader/lib/downloadlib.php');
require_once ($CFG->dirroot . '/lib/filelib.php');
require_once ($CFG->dirroot . '/lib/moodlelib.php');
require_once ($CFG->dirroot . '/blocks/downloader/lib/downloadlib.php');

$courseid= required_param('courseid', PARAM_INT); // Course identification
$instanceid= required_param('instanceid', PARAM_INT); // Instance of the block

// Securitycheck
[SNIP]

// Get Config Data
$where= "pagetype = 'course-view' AND visible = 1 AND id=" . addslashes($instanceid);

// Instance?
$blockarr= get_records_select('block_instance', $where . " AND pageid=" . addslashes($courseid));

// Maybe pinned? In this case we have no courseid
if (!$blockarr) {
    $blockarr= get_records_select('block_pinned', $where);
}

if (!$blockarr) {
    error("cannot find block with: " . $where . " AND pageid=" . addslashes($courseid));
    exit ();
}

// Take the first result
$block= array_pop($blockarr);

$configdata= unserialize(base64_decode($block->configdata));

print_r($configdata);

[...]

Dateien pro Kurs abholen

Das Zusammenstellen aller Pfade für Dateien, die ein Benutzer sieht und auf die er Zugriff hat ist echt mühsam. Ich wünsche mir hier ein Bisschen den Servicegedanken: Beispielsweise würde man viel Zeit sparen, wenn der Entwickler mit dem entsprechenden Wissen Funktionen wie can_read($userid, $resourceid) implementieren würde. Zusätzlich wäre man unabhängig vom verwendeten Absicherungsschema. Ich werde das zukünftig in meinen Programmen berücksichtigen.

Reaktionen

Die Community hat – wie meistens bei Moodle – sehr nett auf die Veröffentlichung reagiert. Zwei Tage nach Version 1.0.0 habe ich schon eine Slovakische Übersetzung und diverse Hinweise auf Bugs erhalten.

Eingeordnet in Theorie und Schnipsel, Web | Keine Kommentare »

Unicodehölle die 2.

Geschrieben von skaldrom am 31. July 2007

Wir binden bei uns SVN-Verzeichnisse direkt ins LMS (Learning Management System) Moodle ein. Einige Verzeichnisse haben mit Umlauten funktioniert, andere wiederum nicht. Ich bin tief eingetaucht in die Materie und habe 2, 3 kleine Erleuchtungen gehabt. Vielleicht bringt der folgende Bericht irgendjemandem was: Encodings im LMS der Berufsfachschule BBB

Schei? Encoding

Eingeordnet in Webapplikationen | Keine Kommentare »

SVN und Moodleintegration: Einen Schritt weiter

Geschrieben von skaldrom am 16. May 2007

In einem älteren Posting habe ich schon beschrieben, dass wir das LMS Moodle mit SVN integrieren. Um die Integration voranzutreiben habe ich einen Block gecoded, von welchem aus man direkt die Dateien aktualisieren kann:

Moodle SVN Block

Den Code zu posten macht nicht viel Sinn, da es sehr installationsabhängig ist. Auf Anfrage hin rücke ich aber gerne was raus :) ….

Eingeordnet in Learninmanagement Systeme (lms) | Keine Kommentare »

SVN mit Moodle integrieren

Geschrieben von skaldrom am 21. September 2006

Moodle eignet sich sehr gut um Dokumente für Lernende bereitzuhalten und zu publizieren. SVN eignet sich, um Dokumente abzulegen wenn mehrere Leute zusammenarbeiten. Was liegt also näher als die beiden Dinge zu kombinieren?

Vorteile:

  • Es sind immer aktuelle Dokumente auf dem Moodle
  • Das lästige Hochladen entfällt
  • Es ist mächtig 1337!

Soweit die Theorie, doch wie läuft das in der Praxis?

Grundsätzlich werden auf dem Moodleserver die SVN-Verzeichnisse ausgecheckt. Jede Nacht läuft ein Cronjob, der diese Arbeitsverzeichnisse aktualisiert und noch nicht vorhandene an diesen Ort auscheckt. Im Moodle “data” Verzeichnis werden in den Kursen symbolische Links auf diese Arbeitsverzeichnisse gesetzt, die dann in Moodle selber wie normale Verzeichnisse behandelt werden können.

Um diese Arbeitsverzeichnisse auszuchecken habe ich ein Bash-Script geschrieben, für das Setzen der Links gibt es ein ganz hässliches Webinterface. Beide Quellcodes stelle ich gerne zur Verfügung, hierhin passense nicht….

Probleme:

  • Die Berechtigungen der Arbeitsverzeichnisse müssen so gesetzt werden, dass normale Benutzer über Moodle keine Dateien verändern oder löschen können.
  • Da es ein Link ist und kein echtes Verzeichnis, lässt Moodle keine “Verzeichnis Ressourcentypen” zu. Korrigiert werden kann dies in lib/moodlelib.php, Funktion get_directory_list:
    if (!is_dir($rootdir)  && !is_link($rootdir)) {          // Must be a directory

    und:

    if (filetype($fullfile) == 'dir'  || filetype($fullfile) == "link") {
  • Die SVN-Arbeitsverzeichnisse sollen ja nicht migebackupt werden, da man gescheiter die Repositories sichert. Darum in backup/backuplib.php, Funktion backup_copy_course_files anpassen:
    if ($dir !== $name_moddata and $dir !== $name_backupdata and !is_link($rootdir."/".$dir)) {

Eingeordnet in Learninmanagement Systeme (lms) | 1 Kommentar »

LAMS und Moodle, schön wärs gewesen…

Geschrieben von skaldrom am 10. September 2006

Tja, wer kommt nicht ins Träumen beim Gedanken einer engen Integration von LAMS in Moodle? Und wie wenn es die Götter der LMS (Learning Management Systeme) gehört hätten, wurde auch daran gearbeitet. Von der schönen Oberfläche geblendet habe ich kurzerhand alle meine Abneigungen über Bord geworfen und mich daran gemacht, es zu installieren, wohlbewusst dass es eine Wanderung durch das Tal der Tränen sein wird, wie immer wenn mein alter Kollege Tomcat mitreist.

Das wichtigste zu Beginn: Es war ernüchternd. Die Integration ist noch nirgends. Das kann ich so selbstbewusst sagen, weil es tatsächlich noch HTML-Syntaxfehler drin hatte, die korrigiert werden mussten um den Firefox zu einer Mitarbeit zu überreden.

Es soll sich aber jeder selbst ein Urteil bilden. Hier eine Kurzanleitung, wies unter Linux gelaufen ist.

Zuerst die Doku:

Wir betreiben Moodle mit https (Secure HTTP) um ein Absniffen der Passworte durch die Lernenden zu verhindern. LAMS kann damit nicht umgehen. Man muss also einen HTTPS-HTTP Gateway dazeischenschalten. Dafür habe ich einen eigene Site in Apache konfiguriert, welche mittels url-rewriting transparent die https seiten für den localhost als http serviert:

<virtualhost *:3333>
  ServerName moodle.yourhost.ch
  ServerAdmin admin@server.ch
  DocumentRoot /data/www/httpsgateway/htdocs
  ErrorLog /data/www/httpsgateway/logs/error.log
 
  LogLevel debug
  CustomLog /data/www/httpsgateway/logs/access.log combined

  <location>
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
  </location>

  RewriteEngine On
  RewriteCond %{REQUEST_URI} !^/index.php(.*)$
  RewriteRule ^/(.*) http://moodle.yourhost.ch:3333/index.php?url=%{REQUEST_URI}&amp;%{QUERY_STRING} [R]
</virtualhost>

Und die index.php im Webroot:

< ?
$params=$_REQUEST;
unset($params["url"]);
$paramsstr="";

foreach($params as $key=>$val) {
        $paramsstr.="&".$key."=".urlencode($val);
}

$url="https://moodle.yourhost.ch".$_REQUEST["url"]."?".$paramsstr;

$sessions = curl_init();
curl_setopt($sessions, CURLOPT_URL,$url);
curl_setopt($sessions, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($sessions, CURLOPT_SSL_VERIFYPEER, 0);

#print "[$url]";die();

$my_load_page = curl_exec($sessions);

if (curl_errno($sessions)) {
        print curl_error($sessions);
        print "URL:".$url."
n"
;
} else {
        curl_close($sessions);
        echo $my_load_page;
}
?>

mod_jk

Damit Tomcat über Apache angesteuert werden kann braucht es mod_jk und die Datei /etc/libapache2-mod-jk/workers.properties sollte folgendermassen aussehen:

# workers.properties -
#
# This file is a simplified version of the workers.properties supplied
# with the upstream sources. The jni inprocess worker (not build in the
# debian package) section and the ajp12 (deprecated) section are removed.
#
# As a general note, the characters $( and ) are used internally to define
# macros. Do not use them in your own configuration!!!
#
# Whenever you see a set of lines such as:
# x=value
# y=$(x)something
#
# the final value for y will be valuesomething
#
# Normaly all you will need to do is un-comment and modify the first three
# properties, i.e. workers.tomcat_home, workers.java_home and ps.
# Most of the configuration is derived from these.
#
# When you are done updating workers.tomcat_home, workers.java_home and ps
# you should have 3 workers configured:
#
# - An ajp13 worker that connects to localhost:8009
# - A load balancer worker
#
#

# OPTIONS ( very important for jni mode )

#
# workers.tomcat_home should point to the location where you
# installed tomcat. This is where you have your conf, webapps and lib
# directories.
#
workers.tomcat_home=/opt/lams/jboss/tomcat-4.1.x

#
# workers.java_home should point to your Java installation. Normally
# you should have a bin and lib directories beneath it.
#
workers.java_home=/opt/java

#
# You should configure your environment slash... ps= on NT and / on UNIX
# and maybe something different elsewhere.
#
ps=/

#
#------ ADVANCED MODE ------------------------------------------------
#---------------------------------------------------------------------
#
#

#
#------ worker list ------------------------------------------
#---------------------------------------------------------------------
#
#
# The workers that your plugins should create and work with
#
worker.list=ajp13_worker

#
#------ ajp13_worker WORKER DEFINITION ------------------------------
#---------------------------------------------------------------------
#

#
# Defining a worker named ajp13_worker and of type ajp13
# Note that the name and the type do not have to match.
#
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
#  ----&gt; lbfactor must be &gt; 0
#  ----&gt; Low lbfactor means less work done by the worker.
worker.ajp13_worker.lbfactor=1

#
# Specify the size of the open connection cache.
#worker.ajp13_worker.cachesize

#
#------ DEFAULT LOAD BALANCER WORKER DEFINITION ----------------------
#---------------------------------------------------------------------
#

#
# The loadbalancer (type lb) workers perform wighted round-robin
# load balancing with sticky sessions.
# Note:
#  ----&gt; If a worker dies, the load balancer will check its state
#        once in a while. Until then all work is redirected to peer
#        workers.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp13_worker

In der site-conf für Apache2: /etc/apache2/sites-available/moodle.yourhost.ch

# LAMS
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkWorkersFile   /etc/libapache2-mod-jk/workers.properties
JkLogLevel debug
JkLogFile  /data/www/moodle.yourhost.ch/logs/mod_jk.log
JkMount /lams/* ajp13
JkMount /lams   ajp13
JkMount /lams/images/* ajp13
JkMount /lams/images   ajp13

Zum Schluss muss nur noch Moodle konfiguriert werden:

Administration, Module, LAMS, EInstellungen:

server_url: https://moodle.yourhost.ch/lams
server_id:  lamsserver01
server_key: sErVeRKeY

Dann aufrufen und Accounts nach Anleitung erstellen: https://moodle.yourhost.ch/lams/login.jsp.

Brauchbar ist es noch nicht :( …. Die Integration vergisst beim Bearbeiten die Namen des LAMS-Kurses etc… Vielleicht in ein paar Monaten…

Eingeordnet in Linux | 2 Komentare »