Freitag, 15. Juni 2012

Mit QEMU für Windows einen ARM Prozessor emulieren

Um das System für meinen RaspPi schon mal im Voraus konfigurieren zu können, habe ich das "raspberrypi-fedora-remix-14-r1.img" mal unter Windows emuliert.

Benutzt habe ich
Außerdem benötigt man natürlich das Raspberry Pi Fedora Remix image, welches hier: http://downloads.raspberrypi.org/download.php?file=/images/fedora/14/r1-06-03-2012/raspberrypi-fedora-remix-14-r1.img.gz herunter zu laden ist.

Ich habe eine QEMU-Version mit diversem Zubehör wie keymaps, netzwerktreiber, zImage 3.0.4 Kernel und dergleichen zusammengestellt, der hier (http://www.mediafire.com/?7q9j133nkeux32k) herunter zu laden ist. Das Archiv muss einfach nur entpackt werden. Zum Verzeichnis braucht man lediglich die "fedora.ext3"-Datei bzw. das "raspberrypi-fedora-remix-14-r1.img"-Image hinzu zu fügen und die enthaltende "run.bat" entsprechend anzupassen:
REM Start qemu on windows.
@ECHO OFF
SET SDL_VIDEODRIVER=windib
SET SDL_AUDIODRIVER=dsound
SET QEMU_AUDIO_DRV=dsound
SET QEMU_AUDIO_LOG_TO_MONITOR=0
qemu-system-arm -m 256 ^
 -hda fedora.ext3 ^
 -M versatilepb ^
 -kernel zImage ^
 -cpu arm1176 ^
 -append "root=/dev/sda" ^
 -serial stdio ^
 -redir tcp:2222::22 ^
 -net nic,model=ne2k_pci,vlan=0,name=eth0 ^
 -net user,vlan=0,net=192.168.16.233/24 ^
 -rtc base=2012-06-15 ^
 -k de 

Das Vergrößern bzw. Umwandeln des SD-Card-Images habe ich mittels Ubuntu in einer VirtualBox durchgeführt, da mir derzeit keine Windows mittel bekannt sind die so etwas adäquat durchführen. Dazu habe ich zunächst Ubuntu gebootet, und dann ein 3G großes file namens "fedora.ext3" aus /dev/zero erzeugt.

Anschließend das Filesystem erzeugt:


nun brauchen wir das fedora-SDCard Image, dazu den Ubuntu Filebrowser öffnen und "smb://{Host-System-Name}/d$/pfad" öffnen. Danach wird man aufgefordert sich am Host-System zu authentifizieren:
So angemeldet kann die datei nach Ubuntu kopiert werden und anschließend mittels "file" die Dateieigenschaften abgerufen werden um den Mountpoint zu berechnen:
Bildunterschrift hinzufügen
Der Startsektor der Partition 2 ist wie oben zu lesen 206848


im nächsten Schritt erzeugen wir zwei Verzeichnisse, z.B. "mnt" und "mnt2" und mounten das Image sowie die oben erstellte fedora.ext3 Partition auf die Folder um die Dateien aus dem Img in das ext3 fs zu kopieren:

  sudo mount -o loop,offset=$[206848*512] raspberrypi-fedora-remix-14-r1.img mnt
   sudo mount -o loop rootfs3G.ext3 mnt2
   sudo cp mnt/* mnt2 -a



dann noch fedora.ext3 auf's Windows Filesystem kopieren. Fertig


viel Spaß bei emulieren! :)






Donnerstag, 10. Mai 2012

26 und der Rest von heute

Verzweifelte Problemsuche in einer unserer Webanwendungen... Der Sessiontimeout ist auf 120 Minuten eingestellt. Selbiges gilt für das Authentication-Ticket. Ist nun der Benutzer zum Beispiel mit der Dateneingabe in einem Dialog eine Zeit lang beschäftigt, gehen die Session Objekte irgendwie verloren. Nach einiger Zeit der Recherche wurde hier ein Zeitraum von ca. 30 Minuten inaktivität ausgemacht.
Der Fehler kann reproduziert werden, allerdings ist nicht ersichtlich warum die Objekte in der Session plötzlich "verschwinden"...

Nobody knows...

Donnerstag, 3. Mai 2012

Alles neu macht der Mai

Es gibt Neuigkeiten.
Ich habe es trotz Umzugs-Stress, diverser Maler-, Tischler und Elektroarbeiten geschafft, einen für mich adäquaten, neuen Job zu finden. Meine bisherige Stelle ist gekündigt und ich werde ab dem 01.Juli meinen Dienst beim Hauptverband des DJH antreten.

Bis dahin habe ich noch viel zu tun um meinen Arbeitsplatz bei LCT ordentlich zu hinterlassen. Das aktuelle Projekt ist glücklicherweise fast abgeschlossen, aber es liegen dennoch diverse Kundenanforderungen "auf Halde", die erledgigt werden wollen.

In diesem Sinne wird in der nächsten Zeit nicht sonderlich viel von mir zu hören sein.

CYA!!!

Montag, 16. April 2012

Umzug...

Habe lange nichts geschrieben, da ich derzeit zu Hause umbaue und in Kürze mit meiner Familie die frisch renovierte Wohnung beziehen werde. Voraussichtlich irgendwann mitte Mai.


Donnerstag, 5. April 2012

Der sagenumwobene Viewstate

Seit ich mich im .Net Umfeld bewege, konnte ich die Sache mit diesem "Viewstate" nicht wirklich nachvollziehen. Seit vor einiger zeit das Problem aufkam, dass in einem unserer Produkte ein speichervorgang einer Seite mehrere Minuten dauern konnte, bin ich dem Problem auf den Grund gegangen und habe festgestellt, dass der Viewstate auf über 6MiB angewachsen war.
Die Seite als solches ist dabei aber recht einfach gestrickt und besteht im Grunde aus einer Tabelle mit 5 Spalten von Dropdownboxen, aus der eine Auswahl getroffen werden kann. Klar kommt da schnell eine Menge an Daten zusammen, zumal eine der Auswahlmöglichkeiten mehr als 100 Textbausteine enthalten kann.

Die Große Frage aber, die sich mir stellt: Warum so ein riesiger Viewstate für ein paar Dropdownboxen? Dieses nachverfolgt, stellt sich heraus, dass X-Mal der identische Inhalt der Textbausteine im Viewstate vorgehalten wird.
Zur Lösung des Problems habe ich ein Control in der Form einer Textbox erstellt, die beim "Lostippen" vorschläge zur Auswahl stellt, in denen der gesuchte Begriff vorkommt. Anschließend habe ich den ViewState für den Dialog abgeschaltet und der Performance-Gewinn war unbestreitbar.

ViewState? Wozu?

Hilfreich zu diesem Thema ist auch der folgende Artikel aus dem MSDN: "Ein mundgerechtes Stück ASP.NET ViewState"

ViewState die Zweite...

Man nehme ein Grid und deaktiviere den ViewState für dieses, da das bekannte Anwachsen des Selbigen immer wieder zu Performance-Problemem führt, insbesondere wenn die Anwendung über eine schwachbrüstige Internetleitung aufgerufen wird.
Führt man nun über ein weiteres Steuerelement der Seite eine Aktion aus, die einen Postback mit sich bringt, wird das Grid neu an die Datenquelle gebunden und zuvor gemachte Eingaben sind verloren. Also doch der ViewState? Nein, lieber nicht. Um dieses Problem (was eigentlich keines ist) zu umschiffen habe ich folgende Klasse erstellt, welche vorhandene, aber nicht gespeicherte Angaben des Grids in der entsprechenden Datenquelle, dem DataView vornimmt, ganz ohne Viewstate.

Public Class UpdateView
        Private _grid As RadGrid
        Private _assignments As SortedDictionary(Of String, String) = New SortedDictionary(Of String, String)
        Public Property Assignments As SortedDictionary(Of String, String)
            Get
                Return _assignments
            End Get
            Set(value As SortedDictionary(Of String, String))
                _assignments = value
            End Set
        End Property

        Public ReadOnly Property Grid As RadGrid
            Get
                Return _grid
            End Get
        End Property

        Public Sub New(ByVal grid As RadGrid)
            Me._grid = grid
        End Sub

        Public Sub Update(ByRef dataView As DataView)
            Dim oldCulture As System.Globalization.CultureInfo = dataView.Table.Locale
            dataView.Table.Locale = New System.Globalization.CultureInfo("en-US")
            'sonstige Änderungen übernehmen ohne MegaByte Weise Viewstate für's RadGrid
            For Each p As String In HttpContext.Current.Request.Params                                               'Request Parameter itereieren
                If p.Contains(_grid.UniqueID) Then                                                                   'prüfen ob der der aktuelle Eintrag zum RadGrid gehört
                    Dim a = _grid.FindControl(p.Replace(_grid.UniqueID & "$", ""))                                   'das entsprechende Steuerelement finden
                    If a IsNot Nothing Then
                        If Assignments.Keys.Contains(a.ID) Then                                                      'prüfen ob das Steuerelement zu aktualisieren ist
                            Dim row = CType(a.Parent.NamingContainer, GridDataItem).ItemIndex                        'entsprechende Row des RadGrids ermitteln
                            dataView.Table.Rows(row).Item(Assignments(a.ID)) = HttpContext.Current.Request.Params(p) 'DataView-Feld mit dem entsprechenden Datum aktualisieren
                        End If
                    End If
                End If
            Next
            'Ende
            dataView.Table.Locale = oldCulture
        End Sub
    End Class

Anschließend kann man je nach Belieben bestimmte Werte im Grid, bzw. der dazugehörigen DataView aktualisieren, sodass beim Laden die Datenbindung an eine aktualisierte View erfolgt.
Warum ich in obigem Beispiel die Culture der DataView auf "en-US" setze und später wieder auf die eigentliche Kultur, erklärt sich im Artikel "CultureInfo: Chaos im .Net"

Beispiel:
Dim updateView As LCT.Tools.UpdateView = New LCT.Tools.UpdateView(RadGrid)
        updateView.Assignments.Add("GridEditItemID1", "DataViewColumnName1")
        updateView.Assignments.Add("GridEditItemID2", "DataViewColumnName2")
        updateView.Update(DataView)
So far...

Mittwoch, 4. April 2012

Raspberry Pi

Habe soeben bei Farnell einen Raspberry Pi bestellt! Freue mich auf das tolle Spielzeug!


Sobald es da ist, werde ich mal schauen ob ich es als PDC für's Heimnetzwerk konfiguriert bekomme und teste was sonst noch mit der Kiste möglich ist.

Weitere Info über den Mini-Computer: http://www.raspberrypi.org/

Dienstag, 3. April 2012

CultureInfo: Chaos im .Net

eine Dataview in einer ASP-Seite, die mit der Culture-Info "de-DE" initialisiert wird, verhält sich äußerst eigenartig, wenn man hier versucht einen "Double" wert in der View abzulegen, der beispielsweise über Post-Parameter (demzufolge als String) an das Script übergeben wird.

VB Beispiel:
            dataView.Table.Columns(x).DataType = GetType(Double)
            dataView.Table.Rows(n).Item(x) = "45.2"

            Console.WriteLine(dataView.Table.Rows(n).Item(x))
 // Ausgabe: 452.0

Ebenso wird ein Cast von String nach Double in der Kultur "de-DE" m.E. falsch übersetzt, aus:

            CDbl("41.5")

wird 415.0

Wow! Das klappt ja prima! Da bekommt man ein Double im String Format und wegen einer Culture-Einstellung wird diese missinterpretiert. Also wirklich, meine lieben Damen und Herren von Microsoft. Der Datentyp der Spalte ist Double und nur weil die CultureInfo auf "de-DE" steht wird ein ","(Komma) als Dezimaltrennzeichen angenommen. Solche formate grundsätzlich auf die angegebene Kultur anzuwenden ist zwar konsequent, allerdings aus meiner Sicht nicht praktikabel, da man als Entwickler von mehrsprachigen Anwendungen hier zusätlich noch beim Konvertieren von Werten auf die Ländereinstellung achten muss.

Seit ich programmiere sind double Werte mit einem .(Punkt) als Dezimaltrennzeichen versehen, warum wird im .Net davon abgewichen? Damit die Fehleranfälligkeit erhöht wird?

Eine ganz ähnliche Problematik ergibt sich zum Beispiel bei Datumswerten unter anderem im SQL-Server. Ich frage mich wirklich, warum sowas sein muss? Reicht es nicht sich programmatisch auf EIN EINZIGES Format (zum Beispiel das US-englische) zu beschränken und lediglich bei der Ausgabe/Anzeige der Werte in der Oberfläche eine entsprechende Konvertierung vorzunehmen?