Entwickeln fürs iPhone

31. Dec 2008 13:19 (bearbeiten)


Mike Ash hat einen sehr interessanten Artikel über seine Erfahrungen, ein Programm für das iPhone zu entwicklen und von Apple genehmigen zu lassen, geschrieben.

Ebenfalls lehrreich sind hierbei auch ausnahmsweise mal die Kommentare, die man sich nach dem Lesen des eigentlichen Artikels nicht entgehen lassen sollte.

Für Leute, die sich also überlegen, Programme für das iPhone zu schreiben, auf jeden Fall aufschlussreich.

Tags ¦ , und

VB .NET - Mit Lotus Notes E-Mails und Dateianhängen arbeiten

29. Dec 2008 12:05 (bearbeiten)


Mit den folgenden Klassen ist es möglich, aus einer Domäne heraus, eine beliebige Lotus Notes-Datenbank zu öffnen und alle E-Mails darin aufzulisten. Es werden dabei alle Dateianhänge aus den E-Mails in eine Liste gefügt.

Ein Beispielaufruf findet sich am Ende dieses Artikels.

  1. Public Class NotesMail
  2.  
  3. Public Subject As String
  4. Public From As String
  5. Public Body As String
  6. Public AttachmentFilenames As New List(Of Domino.NotesEmbeddedObject)
  7.  
  8. End Class
  9.  
  10. Public Class NotesMailCollection
  11. Inherits List(Of NotesMail)
  12. End Class
  13.  
  14. Public Class MailAccount
  15. Public Host As String
  16. Public DatabaseFilename As String
  17. Public Password As String
  18. End Class
  19.  
  20. Public Class NotesTools
  21.  
  22. Public Shared Function GetMails(ByVal aMailAccount As MailAccount, ByVal MoveMails As Boolean) As NotesMailCollection
  23. Try
  24. Return _GetMails(aMailAccount, MoveMails)
  25. Catch ex As Exception
  26. MsgBox(ex.Message, MsgBoxStyle.Critical)
  27. Return Nothing
  28. End Try
  29. End Function
  30.  
  31. Private Shared Function _GetMails(ByVal aMailAccount As MailAccount, ByVal MoveMails As Boolean) As NotesMailCollection
  32.  
  33. ' Die Session starten
  34. Dim Session As New Domino.NotesSession
  35. Session.Initialize(aMailAccount.Password)
  36.  
  37. ' Datenbank öffnen
  38. Dim MailDB As Domino.NotesDatabase
  39. Dim MailServer As String = Session.GetEnvironmentString("MailServer", True)
  40. ' Dim DatabaseFilename As String = Session.GetEnvironmentString("MailFile", True)
  41.  
  42. MailDB = Session.GetDatabase(MailServer, aMailAccount.DatabaseFilename)
  43.  
  44. If Not MailDB.IsOpen Then
  45. MailDB.Open()
  46. End If
  47.  
  48. Dim result As New NotesMailCollection
  49.  
  50. Dim n_View As Domino.NotesView
  51. Dim n_ViewNav As Domino.NotesViewNavigator
  52. Dim n_ViewEntry As Domino.NotesViewEntry
  53. Dim n_Document As Domino.NotesDocument
  54.  
  55. n_View = MailDB.GetView("($Inbox)")
  56. n_ViewNav = n_View.CreateViewNav
  57. n_ViewEntry = n_ViewNav.GetFirstDocument
  58.  
  59. ' For all mails
  60. Do While Not (n_ViewEntry Is Nothing)
  61.  
  62. n_Document = n_ViewEntry.Document
  63. Dim oAttachment As Domino.NotesEmbeddedObject
  64.  
  65. If n_Document.HasEmbedded Then
  66.  
  67. ' Add data to our object
  68. Dim nm As New NotesMail
  69. With nm
  70. .Body = n_Document.GetItemValue("Body")(0).ToString
  71. .Subject = n_Document.GetItemValue("Subject")(0).ToString
  72. .From = n_Document.GetItemValue("From")(0).ToString
  73. End With
  74.  
  75. Dim fileNames As Object() = Session.Evaluate("@AttachmentNames", n_Document)
  76. For Each fileName As String In fileNames
  77. oAttachment = n_Document.GetAttachment(fileName)
  78. nm.AttachmentFilenames.Add(oAttachment)
  79. Next
  80.  
  81. ' Add object to our list
  82. result.Add(nm)
  83.  
  84. ' Remove from list
  85. If MoveMails Then
  86. ' n_Document.PutInFolder("Importiert " & Now.ToShortDateString, True)
  87. ' n_Document.RemoveFromFolder("($Inbox)")
  88. End If
  89.  
  90. End If
  91.  
  92. ' Next Mail
  93. n_ViewEntry = n_ViewNav.GetNextDocument(n_ViewEntry)
  94. Loop
  95.  
  96. Return result
  97.  
  98. End Function
  99.  
  100. End Class
  1. public Sub Test
  2.  
  3. ' Account Einstellungen
  4. Dim acc As New MailAccount
  5. With acc
  6. .Host = "DominoServer"
  7. .DatabaseFilename = "mail\postfach.nsf"
  8. .Password = "meingeheimespasswort"
  9. End With
  10.  
  11. ' GO! GO! GO! Alle Mails auflisten
  12. Dim lstMails As NotesMailCollection = NotesTools.GetMails(acc, False)
  13.  
  14. For Each itm As NotesMail In lstMails
  15. ' Alle Anhänge in Verzeichnis abspeichern
  16. For Each att As Domino.NotesEmbeddedObject In itm.AttachmentFilenames
  17. strFilename = att.Name
  18. strDirectory = "C:\tmp"
  19. My.Computer.FileSystem.CreateDirectory(strDirectory)
  20. strFullFilename = strDirectory & "\" & strFilename
  21. att.ExtractFile(strFullFilename)
  22. Next
  23.  
  24. Next
  25. end sub

iPhone Spiel Crayon Physics

25. Dec 2008 12:11 (bearbeiten)


Crayon Physics ist ein Puzzelspiel von Petri Purho, in welchem man Objekte von A nach B bringen muss. Ok, hört sich nicht sonderlich spektakulär an, aber ich habe auch noch nichts von dem Wachsmalstift erzählt, mit dem man Objekte in den Level malen kann um die Objekte anzuschubsen.

Weiterlesen »

Tags ¦ , , und

Frohe Weihnachten

24. Dec 2008 0:00 (bearbeiten)


Ich wünsche allen Lesern dieses Blogs ein schönes Weihnachtsfest und schon einmal einen guten Rutsch ins neue Jahr 2009!

Tags ¦ und

VB .NET - DataSets und DataTables aus einer XML-Datei in eine SQL Datenbank schreiben

22. Dec 2008 17:01 (bearbeiten)


Ich habe heute nach einer Möglichkeit gesucht, Daten, die ich aus einer SQL Tabelle eines Servers "A" in ein XML-Dataset geschrieben habe, wieder aus diesem XML Dataset zurück in die SQL Tabelle auf dem Server "B" zu schreiben.

Aufgabe war, vier Tabellen von unserem Firmenserver auf die Server draußen bei unseren Mitarbeiter per Programm zu übertragen.

Mein Hauptproblem bei solchen Aufgaben ist eigentlich immer das Erstellen der SQL-Befehle fürs Updaten oder Inserten. Wobei, Problem ist eventuell zu viel gesagt, viel eher nervt es, manuell diese Statements zusammenbauen zu müssen.

Da .NET ja intern über die TableAdapter und DataProvider die Funktion besitzt, eben diese SQL Befehle automatisch zu generieren, dachte ich mir, warum nicht diese Fähigkeit nutzen und mir damit das Getippe und das Prüfen der selbst erstellten SQL Statements zu ersparen.

Die Hauptarbeit in der wichtigsten Funktion ImportTableToSQL übernimmt dabei die Klasse SQLCommandBuilder, die einen DataAdapter mit dem einzutragenden DataSet übergeben bekommt. Anschließend weisen wir dem SQLCommandBuilder für alle Parameter einfach die Werte zu, die in unserem DataSet bereits drin stehen.

Zu guter letzt führen wir den automatisch generierten Insert-Befehl des SQLCommandBuilders aus, et voila, die Tabellen sind aktuell.

Hier der Code, um Daten aus dem SQL-Server in ein XML Dataset zu schreiben. Die wichtigste Stelle hierbei ist Dataset.WriteXML().

  1.  
  2. ''' <summary>
  3. ''' Exports a Table from a SQL Database to a XML file
  4. ''' </summary>
  5. ''' <param name="aSelectStatement">Select Statement for the data which should be exported</param>
  6. ''' <param name="aTableName">Name of the Table (needed for creating the filename)</param>
  7. ''' <param name="aOutputXMLDirectory">Ausgabe-Verzeichnis</param>
  8. ''' <param name="aOutputXMLFilename">Ausgabe-Dateiname ohne Dateiendung und ohne Pfadangabe</param>
  9. ''' <param name="aDatasetName"></param>
  10. ''' <param name="Append">An bestehende XML-Datei anhängen (INFER-Modus)</param>
  11. ''' <remarks></remarks>
  12. Public Shared Sub ExportTable(ByVal strCon As String, _
  13. ByVal aSelectStatement As String, _
  14. ByVal aTableName As String, _
  15. ByVal aOutputXMLDirectory As String, _
  16. Optional ByVal aOutputXMLFilename As String = "", _
  17. Optional ByVal aDatasetName As String = "NewDataSet", _
  18. Optional ByVal CreateSchemaFiles As Boolean = False, _
  19. Optional ByVal Append As Boolean = False)
  20.  
  21. Using con As SqlClient.SqlConnection = New SqlClient.SqlConnection(strCon)
  22.  
  23. Try
  24. con.Open()
  25. Dim ds As New DataSet(aDatasetName)
  26. Dim da As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(aSelectStatement, con)
  27.  
  28. da.FillSchema(ds, SchemaType.Source, aTableName)
  29. da.Fill(ds, aTableName)
  30.  
  31. ' Create Filename
  32. Dim strFullFilename As String
  33.  
  34. ' Trailing backslash?
  35. If Not aOutputXMLDirectory.EndsWith("\") Then aOutputXMLDirectory += "\"
  36.  
  37. ' Create dir
  38. If Not System.IO.Directory.Exists(aOutputXMLDirectory) Then
  39. System.IO.Directory.CreateDirectory(aOutputXMLDirectory)
  40. End If
  41.  
  42. ' Filename given?
  43. If aOutputXMLFilename = "" Then
  44. If aTableName = "" Then
  45. aTableName = My.Computer.FileSystem.GetTempFileName
  46. End If
  47. aOutputXMLFilename = aTableName
  48. End If
  49.  
  50. ' Create filename
  51. strFullFilename = aOutputXMLDirectory & aOutputXMLFilename
  52.  
  53. ' If XML-File already exists use it and add information to it
  54. If Append Then
  55. If System.IO.File.Exists(strFullFilename & ".XML") Then
  56. ds.ReadXml(strFullFilename & ".XML", XmlReadMode.InferSchema)
  57. End If
  58. End If
  59.  
  60. ' Write XML
  61. ds.WriteXml(strFullFilename & ".XML")
  62.  
  63. ' Write Schema?
  64. If CreateSchemaFiles Then ds.WriteXmlSchema(strFullFilename & ".XSD")
  65.  
  66. ' Done
  67. Catch ex As Exception
  68. Debug.Print(ex.message)
  69. End Try
  70.  
  71. End Using
  72. End Sub
  73.  

Die folgende Funktion durchsucht ein Verzeichnis nach XML- und XSD-Dateien. Aus den gefundenen Dateien wird ein Dataset erstellt und dies weiter an die Prozedur ImportDatasetToSQL gegeben.

  1.  
  2. ''' <summary>
  3. ''' Importiert Daten aus XML Dateien in eine SQL Server Tabelle
  4. ''' </summary>
  5. ''' <param name="aXMLSourceDirectory">Quellverzeichnis der XML-Dateien, die importiert werden sollen</param>
  6. ''' <param name="aSQLConnectionString">SQL Verbindungsstring</param>
  7. ''' <remarks></remarks>
  8. Public Shared Sub ImportTablesToSQL(ByVal aXMLSourceDirectory As String, ByVal aSQLConnectionString As String)
  9.  
  10. Dim filters As String() = {"*.XML"}
  11.  
  12. Dim lstFiles As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = _
  13. My.Computer.FileSystem.GetFiles(aXMLSourceDirectory, FileIO.SearchOption.SearchAllSubDirectories, filters)
  14.  
  15. For Each fn As String In lstFiles
  16.  
  17. Dim ds As New DataSet
  18.  
  19. Try
  20.  
  21. ' Read the schema
  22. ' Filename is the same as the xml file except its extension
  23. ds.ReadXmlSchema(fn.Replace(".XML", ".XSD"))
  24.  
  25. ' Read the XML File
  26. ds.ReadXml(fn)
  27.  
  28. 'For Each tbl As DataTable In ds.Tables
  29. ' Debug.Print("Table: " & tbl.TableName)
  30. ' For Each cc As System.Data.Constraint In tbl.Constraints
  31. ' Debug.Print("Constraint: " & cc.ConstraintName)
  32. ' Next
  33. ' For Each pkcol As DataColumn In tbl.PrimaryKey
  34. ' Debug.Print("Primary Key: " & pkcol.ColumnName)
  35. ' Next
  36. 'Next
  37.  
  38. ImportDatasetToSQL(ds, aSQLConnectionString)
  39.  
  40. Catch ex As Exception
  41. Debug.Print(ex.Message)
  42. Continue For
  43. End Try
  44.  
  45. Next
  46.  
  47. End Sub
  48.  

Diese Funktion importiert jede Tabelle des Datasets in die SQL-Tabelle mit dem selben Namen.

  1.  
  2. Private Shared Sub ImportDatasetToSQL(ByRef aDataset As DataSet, ByVal aSQLConnectionString As String)
  3.  
  4. Using con As New SqlClient.SqlConnection(aSQLConnectionString)
  5.  
  6. Try
  7. con.Open()
  8. Catch ex As Exception
  9. Debug.Print(ex.Message)
  10. Exit Sub
  11. End Try
  12.  
  13. Try
  14.  
  15. For Each tbl As DataTable In aDataset.Tables
  16. ImportTableToSQL(tbl, con)
  17. Next
  18.  
  19. Catch ex As Exception
  20. Debug.Print(ex.Message)
  21. End Try
  22.  
  23. con.Close()
  24. End Using
  25.  
  26. End Sub
  27.  

Hier nun die eigentliche Import-Funktion.

Wir übergeben hier ein DataTable und einen SQL Connectionstring. Im DataTable sind die Werte drin, die in die SQL Datenbank geschrieben werden sollen.

  1.  
  2. Private Shared Sub ImportTableToSQL(ByRef aDataTable As DataTable, ByRef aConnection As SqlClient.SqlConnection)
  3.  
  4. ' Create a command for the DataAdapter
  5. Dim cmd As New SqlClient.SqlCommand("Select * From " & aDataTable.TableName, aConnection)
  6.  
  7. ' Create the DataAdapter (needed for creating the sql-statement)
  8. Dim da As New SqlClient.SqlDataAdapter(cmd)
  9.  
  10. ' Fill our DataAdapter with Data from our DataTable
  11. da.FillSchema(aDataTable, SchemaType.Source)
  12. da.Fill(aDataTable.DataSet, aDataTable.TableName)
  13.  
  14. ' Create the SQL Command Builder
  15. Dim cb As New SqlClient.SqlCommandBuilder(da)
  16. cb.SetAllValues = False
  17.  
  18. ' Go thru all rows and insert the data
  19. For Each r As DataRow In aDataTable.Rows
  20.  
  21. ' Create the Insert-Command
  22. Dim cmdResult As New SqlClient.SqlCommand(cb.GetInsertCommand.CommandText, aConnection)
  23. cmdResult.Parameters.Clear()
  24.  
  25. Dim i As Integer = 0
  26.  
  27. ' Go thru all columns in our DataTable and create a SQLParameter for our Statement with the value
  28. ' from our DataTable.
  29. For Each col As DataColumn In aDataTable.Columns
  30. i += 1
  31. ' cmdResult.Parameters.Add("@p" & i, col.DataType).Value = r.Item(col.ColumnName)
  32. cmdResult.Parameters.AddWithValue("@p" & i, r.Item(col.ColumnName))
  33. Next
  34.  
  35. Debug.Print("ImportTableToSQL: " & cmdResult.CommandText)
  36.  
  37. Dim iAffectedRecords As Integer = cmdResult.ExecuteNonQuery()
  38. Debug.Print("Records Affected: " & iAffectedRecords)
  39.  
  40. Next
  41.  
  42. End Sub
  43.  

Achja, wie immer gilt, gerne darf man mir Verbesserungen, Anregungen und natürlich auch Kritik zukommen lassen.

Countdown Programm aktualisiert

20. Dec 2008 18:00 (bearbeiten)


Ich habe heute das Countdown Programm aktualisiert und einige neue Funktionen eingebaut. So kann man nun beispielsweise die Hintergrundfarbe, die Schrift und den Countdown selbst über das Kontextmenü einstellen.

Alle Informationen und die Download Links finden sich auf der Countdown Seite.

Hier ein Beispiel Screenshot von Countdown:

VirtualBox 2.1 mit 3D Unterstützung veröffentlicht

17. Dec 2008 19:46 (bearbeiten)


Wie ich heute auf heise gelesen habe, hat Sun die Version 2.1 des kostenlosen open-source Virtualisierungsprogramms VirtualBox veröffentlicht.

In der neuen Version gibt es nun endlich eine 3D Unterstützung für OpenGL. Das ganze ist zwar noch experimentell, aber immerhin ein Anfang. Was das ganze taugt werde ich am Wochenende testen und den Artikel hier dementsprechend aktualisieren.

Ebenfalls nennenswert ist die Unterstützung der Disk-Image Formate VMDK (VMware) und VHD (Microsoft).

Alle weiteren Änderungen kann man hier im offiziellen Changelog nachlesen.