Wahl der Qual

29. Apr 2009 20:52 (bearbeiten)


Wer die Qual einsetzt, hat die Wahl... Ist aber wohl nur eine Frage der Zeit, bis sich das Ding von alleine ungefragt installiert.

Weiterlesen »

Tags ¦ , , , , und

Tipp: Eigene Webseite in Google gaaaanz weit oben platzieren

27. Apr 2009 10:20 (bearbeiten)


Heutzutage gibt es tausende Webseiten, die sich mit nur einem einzigen Thema, dem SEO (Search Engine Optimization) oder übersetzt: der Suchmaschinenoptimierung beschäftigen.

Es gibt zwar einige grundlegende Tipps an denen man sich als "Netzmeister" orientieren kann, aber keine Allzweckwaffe für eine bessere Platzierung bei allen Suchmaschinen Betreibern.

Beim größten und beliebtesten Betreiber Google gibt es allerdings einen kleinen Trick, um die eigene Seite weiter oben in den Ergebnislisten auftauchen zu lassen. Der einzige Nachteil: man muss Googles eigenen Browser Chrome dazu installieren.

Wie das ganze funktioniert, hier als Schritt für Schritt Anleitung:

  • Google Chrome Browser installieren
  • In der Adressleiste des Chrome Browsers (die auch für Suchanfragen zuständig ist) den zu optimierenden Suchbegriff eingeben
  • In der Google Suchergebnisliste den Eintrag der eigenen Seite suchen (das kann unter Umständen leider etwas mühselig sein) und anschließend den Link in einem neuen Tab öffnen
  • Das ganze möglichst oft wiederholen um die Platzierung zu verbessern

Achja, wie man den Browser Chrome nach getaner Arbeit wieder los wird, steht hier geschrieben.

Tags ¦ , , , und

HowTo: VB .NET Barcodes und Reports

27. Apr 2009 9:54 (bearbeiten)


Wir haben in den letzten Tagen nach einer Möglichkeit gesucht, in Crystal Reports Barcodes anzuzeigen, und zwar so, dass man sie nachher mit einem Barcode Scanner auch wieder einlesen kann.

Um dies zu tun habe ich nach einer kostenlosen Open-Source Variante gesucht.

Nach unzähligen Versuchen fand ich dann endlich das Barcode Rendering Framework ZEN auf Codeplex.com.

Das Framework kann über Verwendung der drei DLLs als Verweis recht simpel eingebunden werden. Es beherrscht folgende Varianten:

  • Code 11 (mit oder ohne Prüfsumme)
  • Code 25 standard/interleaved (mit oder ohne Prüfsumme)
  • Code 39 (mit oder ohne Prüfsumme)
  • Code 93 (nur mit Prüfsumme)
  • Code 128 (nur mit Prüfsumme)
  • Code EAN 13 (nur mit Prüfsumme)
  • Code EAN 8 (nur mit Prüfsumme)
  • Code PDF417 2D (mit Prüfsumme)

Im Prinzip wird im Code unten folgendes gemacht:

  • Barcode Bild erstellen und als temporäre Datei abspeichern
  • Das abgespeicherte Bild in ein Dataset laden, damit wir es im Report anzeigen können

Das Dataset, das der Report verwendet, besitzt nur zwei Spalten. Eine namens ImageFilename (vom Typ String) welche den Dateinamen des temporären Barcode Bildes enthält, und eine namens Image (vom Typ base64Binary bzw. System.Byte()), die das Bild selbst enthält.

  1. Public Sub ShowRepDemo()
  2.  
  3. ' Barcode-Bild erstellen und als temporäre Datei abspeichern
  4. Dim tmpfile As String
  5. tmpfile = My.Computer.FileSystem.GetTempFileName & ".bmp"
  6. Zen.Barcode.BarcodeDrawFactory.Code128WithChecksum.Draw("Dies ist ein Barcode 128 Test", 30).Save(tmpfile)
  7.  
  8. Dim ds As New dsMain
  9.  
  10. ' Barcode Bild in Datatable schreiben
  11. ds.dtImage.AdddtImageRow(tmpfile, Nothing)
  12.  
  13. ' Image binär in Datatable schreiben
  14. For index As Integer = 0 To ds.Tables(0).Rows.Count - 1
  15. If Not String.IsNullOrEmpty(ds.Tables(0).Rows(index).Item("ImagePath").ToString) Then
  16. LoadImage(ds.Tables(0).Rows(index), "Image", ds.Tables(0).Rows(index).Item("ImagePath").ToString)
  17. End If
  18. Next
  19.  
  20. ' Report öffnen
  21. Dim rptdoc As New repDemo
  22. rptdoc.SetDataSource(ds.Tables(0))
  23.  
  24. Dim rv As New CrystalDecisions.Windows.Forms.CrystalReportViewer
  25. rv.Dock = DockStyle.Fill
  26. Me.Controls.Add(rv)
  27. rv.ReportSource = rptdoc
  28.  
  29. End Sub
  30.  
  31. ' Bild in DataTable schreiben
  32. Private Sub LoadImage(ByVal objDataRow As DataRow, ByVal strImageField As String, ByVal FilePath As String)
  33. Try
  34. Dim fs As System.IO.FileStream = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
  35. Dim Image() As Byte = New Byte(fs.Length) {}
  36. fs.Read(Image, 0, CType(fs.Length, Integer))
  37. fs.Close()
  38. objDataRow(strImageField) = Image
  39. Catch ex As Exception
  40. Throw New Exception(ex.Message)
  41. End Try
  42.  
  43. end Sub

Tags ¦ , , , und

Fahrrad Tricks

27. Apr 2009 6:49 (bearbeiten)


Tags ¦ , , , und

Grillen und Zitroneneis

26. Apr 2009 17:54 (bearbeiten)


Wir waren dieses Jahr endlich mal wieder grillen. Der Anlass war der Geburtstag meines jüngsten Bruders Mitte der Woche.

Die erste Vorstufe der Glut ist hier zu begutachten:

Als Hinweis möchte ich hinzufügen, dass das große Holzstück nur da drin liegt, da eine Axt nicht greifbar und alle kleineren Hölzer bereits verbrannt waren.

Ein sehr leckeres Dessert gab es anschließend übrigens auch:

Das Eis, das man hier sieht gibt es wohl gerade im Aldi (so wurde mir berichtet) und die Schale ist eine echte Zitrone. Im Inneren befindet sich sehr leckeres Zitroneneis. Wirklich empfehlenswert.

It's my iPhone

26. Apr 2009 15:50 (bearbeiten)


Tags ¦ , , und

VB .NET - E-Mails mit Indy empfangen und Anhänge abspeichern

21. Apr 2009 19:50 (bearbeiten)


Um in VB .NET E-Mails zu versenden, verwendet man am besten den Namespace Net.Mail.

Leider gibt es in VB .NET allerdings noch keine Möglichkeit, E-Mails zu empfangen um beispielsweise die Dateianhänge abzuspeichern.

Um dieses Problem zu beseitigen, zeige ich im Folgenden, wie man mit Hilfe von Indy eine E-Mail von einem POP3 Postfach herunterlädt und eventuelle Anhänge der E-Mails auf dem Dateisystem abspeichert.

Wichtig, zur Verwendung von Indy muss als Referenz die Indy.Sockets und Mono.Security DLL in das Projekt eingebunden werden.

Zu erst einmal eine kleine Hilfsklasse, in der wir die Konten-Informationen unseres POP3 Kontos ablegen:

  1. Public Class MailAccount
  2.  
  3. ''' <summary>
  4. ''' Hostname des E-Mail Servers
  5. ''' </summary>
  6. ''' <remarks></remarks>
  7. Public Host As String
  8.  
  9. ''' <summary>
  10. ''' Benutzername des E-Mail Kontos
  11. ''' </summary>
  12. ''' <remarks></remarks>
  13. Public Username As String
  14.  
  15. ''' <summary>
  16. ''' Benutzer-Passwort des E-Mail Kontos
  17. ''' </summary>
  18. ''' <remarks></remarks>
  19. Public Password As String
  20.  
  21. End Class

Nun der interessantere Teil. Die Methode SaveAllAttachments speichert vom übergebenen Mailkonto alle Anhänge aller E-Mails temporär auf der Festplatte lokal ab.

Hierfür verbinden wir uns erst mit dem Mailkonto, ermitteln dann die Menge aller E-Mails auf dem Postfach und iterieren dann durch jede einzelne E-Mail.

Eine E-Mail besteht aus mehreren sogeannten Messageparts. Ist ein Messagepart vom Typ Octet-Stream, handelt es sich um einen Dateianhang, den wir ja abspeichern wollen.

  1. Public Class IndyTools
  2.  
  3. ''' <summary>
  4. ''' Speichert alle Dateianhänge des Postfachs aAccount im Servicevertrags-Verzeichnis des jeweils ermittelten Servicevertrags
  5. ''' </summary>
  6. ''' <param name="aAccount">Postfach Konto</param>
  7. ''' <remarks></remarks>
  8. Public Sub SaveAllAttachments(ByVal aAccount As MailAccount)
  9.  
  10. Dim tempfilename As String
  11. Dim IsAttachment As Boolean
  12.  
  13. Dim o As NewIndy.Sockets.TIdNetNativeComponent
  14. Dim p As NewIndy.Sockets.POP3(o)
  15. Dim att As Indy.Sockets.Attachment
  16.  
  17. ' Verbindungsdaten an Indy übergeben
  18. With p
  19. .Host = aAccount.Host
  20. .Username = aAccount.Username
  21. .Password = aAccount.Password
  22. End With
  23.  
  24. Try
  25.  
  26. Try
  27. ' Verbinden und Mailmenge feststellen
  28. p.Connect()
  29.  
  30. ' Anzahl er Mails auf dem Postfach ermitteln
  31. Dim Amount As Integer = p.CheckMessages
  32.  
  33. ' Für alle Mails
  34. For i As Integer = 1 To Amount
  35.  
  36. ' Mail abholen
  37. Dim msg As New Indy.Sockets.Message
  38. p.Retrieve(i, msg)
  39.  
  40. ' Für jeden Messagepart
  41. For x As Integer = 1 To msg.MessageParts.Count - 1
  42.  
  43. ' Ist dieser Messagepart ein Anhang?
  44. IsAttachment = msg.MessageParts.Items(x).ContentType = "application/octet-stream"
  45.  
  46. If IsAttachment Then
  47.  
  48. Try
  49. ' Anhang holen
  50. att = msg.MessageParts.Items(x)
  51.  
  52. ' Anhang temporär speichern
  53. tempfilename = System.IO.Path.GetTempFileName
  54. att.SaveToFile(tempfilename)
  55.  
  56. Catchex As Exception
  57. MsgBox(ex.Message, MsgBoxStyle.Critical)
  58. End Try
  59.  
  60. End If
  61.  
  62. Next
  63.  
  64. Next
  65.  
  66. Catch ex As Exception
  67. MsgBox(ex.Message, MsgBoxStyle.Critical)
  68. End Try
  69.  
  70. Finally
  71. p.Disconnect()
  72. p.Dispose()
  73. End Try
  74.  
  75. End Sub
  76.  
  77. End Class

Hier noch ein Modul mit einem kleinen Beispielaufruf obiger Klassen:

  1. Module modTest
  2.  
  3. Sub Main()
  4. Dim it As New IndyTools
  5. Dim ac As New MailAccount
  6.  
  7. ac.Username = "frank.miller@gmx.net"
  8. ac.Password = "BestMovie300"
  9. ac.Host = "pop.gmx.de"
  10.  
  11. it.SaveAllAttachments(ac)
  12. End Sub
  13.  
  14. End Module

Tags ¦ , , , , , und