Kategorien
Allgemein

Aliasing in Perl

Da nutzt man seit Jahren Perl, und dann so was…

In Perl werden Schleifenvariablen über Arrays (und Hashes) als Aliase genutzt. Verändert man diese, so verändert man die Inhalt in den Arrays.

#!/usr/bin/perl
use warnings;
use strict;

use Test::More qw(no_plan);

my @names = qw( Felix Urte Sven );
for my $name (@names) {
    $name =~ s/e//;
}

my @new_names = qw( Flix Urt Svn );
is_deeply( @names, @new_names );

Bisher ist mir das nie aufgefallen. Hoffentlich habe ich tatsächlich nirgendwo solche Nebeneffekte produziert.

Oioioioi…

Kategorien
Allgemein

Warum ist immer alles so — dokumentiert

Da will man gerade eben mal ein SSO im Tomcat einbinden.

Und stellt dann fest, dass das SSO von Tomcat auf der Seite selber so gut wie gar nicht beschrieben ist. Nunja, im Netz findet man sehr schnell viele Referenzen auf CAS. Das soll auch einem Servlet Container wie Tomcat in Bezug auf SSO auf die Beine helfen.

Und für Zope soll es auch ein Produkt geben und für Perl und PHP…

Aber wenn es dann um eine einfache Anleitung geht, eine simple Webanwendung mittels einer Realm mit LDAP und dem CAS Server zu verknüpfen, sieht die Welt nicht mehr ganz so rosig aus.

Die Doku ist in einem Wiki und anscheinend vor allem in Google, oder einfach so lang, dass ich die entscheidenden Passagen beim Überfliegen nicht mehr gefunden habe.

Nun haben wir eine CAS ähnliche Lösung selber gestrickt. Aber hoffentlich finde ich doch noch DIE einfache Anleitung.

Kategorien
Allgemein

Berechtigungen in Zope

Was passieren kann, wenn man sich das Leben einfacher machen will.

Da wollte ich nur einen Account in Plone mit meinem Namen haben, hatte aber schon einen Account gleichen Namens im übergeordneten Zope. Daher habe ich einfach einen neuen Zope Benutzer für mich angelegt und den alten gelöscht. … Mit dem tollen Ergebnis, dass die Kino Seiten plötzlich nicht mehr richtig funktionierten.

Alles öffentliche an den Seiten war kein Problem, aber alle Seiten, bei denen man angemeldet sein musste, meldeten die seltsamsten Berechtigungsprobleme.

Nachdem ich für den Ordner dann die Ownership übernommen hatte, ging es dann wieder.

Aber wer kommt schon auf so was?

Kategorien
Allgemein

Kartenspiel

Kartenspiel, aber was macht das?

#!/usr/bin/perl
for (
    $C = 3636, $c = 0, $i = 0 $t = 0;
    $i < 1000 ;
    $i++, $n = int( rand(6) )*2
  )
{
    next if ( ( ( $C >> $n ) & 2 ) == 0 );
    ++$t;
    ++$c if ( ( ( $C >> $n ) & 3 ) == 3 );
}
print $c / ( 0.01 * $t ) . "%n";

oder auch:

@t=grep{++$n;$_&1}grep$_&2,map 111>>(2*int rand 6),(0..999);$p=100*$#t/$n;print"$p%n";
Kategorien
Allgemein

Dekoratoren in Python

In Java ein alter Hut. In Python ebenso.

In TurboGears bin ich über die folgende Syntax gestolpert:

@exposes('template.html')
def f(): pass

In der Doku steht dann, das @exposes die Methode f() dekoriert. Diese Art der Dekorierung ist mit Python 2.4 neu dazu gekommen und ermöglicht es eine Methode um weitere Funktionalität zu erweitern. Es ist sehr einfach möglich selber solche Dekorierer zu erstellen.

Dazu muss nur eine Funktion mit dem Namen des Dekorators (in unserem Falle exposes) erstellt werden. Diese Funktion erhält ein Argument, die zu dekorierende Funktion. Diese Funktion kann dann nach belieben weiterverarbeitet werden und wird zum Schluss zurückgegeben. Ein einfaches Beispiel wäre also:

>>> def exposes(func):
...	func.decorated=True
...	return func
...
>>> @exposes
... def f(): pass
...
>>> print f.decorated
True

Im Beispiel aus TurboGears erhält der Dekorator allerdings noch einen Parameter. Dekoratoren mit Parametern müssen einen Dekorator zurückliefern, der nur die zu dekorierende Funktion annimmt. Alles klar? Also zum Beispiel:

>>> def exposes(template='default.html'):
...	def newDeco(func):
...		func.template=template
...		return func
...	return newDeco
...
>>> @exposes()
... def f(): pass
...
>>> print f.template
'default.html'

Bei TurboGears passiert bei den Dekoratoren noch eine Menge mehr, so wird die dekorierte Funktion wirklich eingepackt, aber zum Verständnis von Dekoratoren sollte das obige erstmal ausreichen.

Kategorien
Allgemein

Java Vortrag 1.Teil

Im ersten Teil von Immo’s Vortrag ging es um die einfachsten Sprachkonstrukte in Java.

Immo hat uns ein wenig über Java erzählt. Zuerst nur die rudimentären Programmsteuerungs Konstrukte.

Simplestes Java-Programm. Ein Objekt mit einer statischen Start Routine:

public class Test {
  public static void main(String[] args) {
       /*Startroutine*/
  }
}

Methoden, Instanz und Klassenvariablen:

class Person {
  //Klassenvariable
  private static int anzahlPersonen = 0;
  //Instanzvariable
  private String name;

  public getName() {
    //Methodenvariable
    String defaultName = "niemand";
    return this.name!=NULL?this.name:defaultName;
  }
}

Schleifen:

int i=10;

while (i>0) {
  System.out.println(i);
  i=i-1;
}

for (i=0; i<10; i++) {
  System.out.println(i);
}

Bedingungen:

if (1==1) {
  /* wahr */
} else {
 /* falsch */
}
Kategorien
Allgemein

Spiegeln von PostScript Seiten

Wenn man mal wieder eine Seite gespiegelt ausdrucken will und der Druckertreiber dafür kein Knopf bereitstellt… Dann kann man ja ein wenig PostScript benutzen.

Heute hatte ich mal wieder das Problem, dass ich eine Datei spiegelverkehrt ausdrucken wollte. Manche Druckertreiber bieten dazu eine Option an. Andere nicht.

Die Datei habe ich erstmal in eine PostScript Datei gedruckt. Dann habe ich kurz hinter dem PageSetup Eine Zeile eingefügt, die bedeutet: Beweg deinen Seitenrand und denk ab dann spiegelverkehrt. In PostScript kann man das so ausdrücken:

6500 0 translate

-1 1 scale

Das muss auf jeder Seite eingestellt werden und sieht in meinem Beispiel dann in etwa so aus:

...

%%Page: 2 2

%%PageBoundingBox: 18 14 577 828

%%BeginPageSetup

%

%%EndPageSetup

gsave

[ 0 0.12 0.12 0 18 14] concat

gsave

6500 0 translate

-1 1 scale

-21 1461 moveto

0 setgray

(MinyaNouvelleBoldFID143HGSet1) cvn findfont 1250 -1250 matrix scale makefont setfont

...