Zeige die 20 größten Dateien auf der Festplatte
Get-ChildItem c:\ -recurse | Sort-Object length -descending | Select-Object -first 20 | Write-Output
Get-ChildItem c:\ -recurse | Sort-Object length -descending | Select-Object -first 20 | Write-Output
Es wird eine Lösung benötigt, um einen Arduino Microcontroller als USB Host zu betreiben, welcher selber die Stromversorgung der angeschlossenen USB-Geräte übernimmt. Für die einfache Erweiterung des Bausatzes existieren sogenannte „Shields“, welche eine preiswerte Lösung ohne die Notwendigkeit eines eigenen Platinenentwurfs zur Verfügung stellen.
Durch die Verwendung des USB Host Shields von DFRobot.com lässt sich über eine Aufsteckvariante über die SPI Schnittstelle und existierender, fertiger Bibliotheken eine solche Konfiguration schnell umsetzen.
Im Nachfolgebeispiel wird der bereits existierende Roboter (siehe Kategorie Mikrocontroller) mit einem Arduino Duemilanove (Arduino UNO kombatibel) und dem USB Host Shield ausgestattet. Dieser wird über eine USB Tastatur gesteuert.
Der Code benutzt die downloadbare Bibliothek des USB Host Shields, welche sich nach dem Kopieren in die Arduino IDE verwenden lässt. Darüber hinaus wird der Pan and Tilt Servo über die Servo-Bibliothek gesteuert.
#include <avr/pgmspace.h>
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
#include <hidboot.h>
#include <printhex.h>
#include <message.h>
#include <hexdump.h>
#include <parsetools.h>
#include <Servo.h>
int E1 = 6; //M1 Speed Control
int E2 = 5; //M2 Speed Control
int M1 = 8; //M1 Direction Control
int M2 = 7; //M2 Direction Control
Servo myservo; // create servo object to control a servo
Servo myservo2; // create servo object to control a servo
int horizontal=64;
int vertical=64;
boolean servoLeft = false;
boolean servoRight = false;
boolean servoUp = false;
boolean servoDown = false;
class KbdRptParser : public KeyboardReportParser
{
void PrintKey(uint8_t mod, uint8_t key);
protected:
virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyUp (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
MODIFIERKEYS mod;
*((uint8_t*)&mod) = m;
Serial.print((mod.bmLeftCtrl == 1) ? "C" : " ");
Serial.print((mod.bmLeftShift == 1) ? "S" : " ");
Serial.print((mod.bmLeftAlt == 1) ? "A" : " ");
Serial.print((mod.bmLeftGUI == 1) ? "G" : " ");
Serial.print(" >");
PrintHex<uint8_t>(key);
Serial.print("< ");
Serial.print((mod.bmRightCtrl == 1) ? "C" : " ");
Serial.print((mod.bmRightShift == 1) ? "S" : " ");
Serial.print((mod.bmRightAlt == 1) ? "A" : " ");
Serial.println((mod.bmRightGUI == 1) ? "G" : " ");
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
Serial.print("DN ");
PrintKey(mod, key);
uint8_t c = OemToAscii(mod, key);
int leftspeed = 255; //255 is maximum speed
int rightspeed = 255;
switch(key)
{
case 0x50:
{
horizontal-=10;
}
break;
case 0x4F:
{
horizontal+=10;
}
break;
case 0x52:
{
vertical-=10;
}
break;
case 0x51:
{
vertical+=10;
}
break;
case 0x5C:
{
left (leftspeed,rightspeed);
}
break;
case 0x5E:
{
right (leftspeed,rightspeed);
}
break;
case 0x60:
{
forward (leftspeed,rightspeed);
}
break;
case 0x5A:
{
reverse (leftspeed,rightspeed);
}
break;
case 0x5D:
{
stop();
}
break;
}
if (horizontal <= 1 || horizontal >=128) horizontal=64;
if (vertical <= 1 || vertical >=128) vertical=64;
if (c)
OnKeyPressed(c);
}
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
Serial.print("UP ");
PrintKey(mod, key);
}
void KbdRptParser::OnKeyPressed(uint8_t key)
{
Serial.print("ASCII: ");
Serial.println((char)key);
};
USB Usb;
//USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard(&Usb);
uint32_t next_time;
KbdRptParser Prs;
void setup()
{
// attaches the servo on pin 2 to the servo object
myservo.attach(2);
// attaches the servo on pin 3 to the servo object
myservo2.attach(3);
Serial.begin( 9600 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
next_time = millis() + 5000;
Keyboard.SetReportParser(0, (HIDReportParser*)&Prs);
}
void loop()
{
/*
if(servoLeft) horizontal-=10;
if(servoRight) horizontal+=10;
if(servoUp) vertical-=10;
if(servoDown) vertical+=10;
*/
// sets the servo position according to the scaled value
myservo.write(horizontal);
// sets the servo position according to the scaled value
myservo2.write(vertical);
Serial.println("Horizontal: "+horizontal );
Serial.println("Vertical: "+vertical );
Usb.Task();
}
void stop(void) //Stop
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void forward(char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void reverse (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
void left (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,HIGH);
analogWrite (E2,b);
digitalWrite(M2,LOW);
}
void right (char a,char b)
{
analogWrite (E1,a);
digitalWrite(M1,LOW);
analogWrite (E2,b);
digitalWrite(M2,HIGH);
}
Der Cube aus dem unterem Beispiel auf einem Android Handy:

Auf der Basis einer Datenbank-Abfrage werden Balkendiagramme, Tortendiagramme und Liniendiagramme mit Flex 3 und der Middleware FluorineFX, die auf einem Microsoft IIS Server läuft, erstellt.
FluorineFX lässt sich über die Webseite http://www.fluorinefx.com/download.html herunterladen und installieren.
Es handelt sich hierbei lediglich um eine Web-Anwendung, die auf dem Microsoft IIS Server mit dem Enterprise Manager eingebunden werden muss.
Der folgende Code wird in Visual Studion (Express) als Projekttyp Klassenbibliothek (oder FluorineFX Service Projekt) mit der Sprache C# genutzt. Die C# Klassenbibliothek wird im kompilierten Zustand (dll-Datei) in den Order „bin“ im FluorineFX-Verzeichnis (welches als Website in IIS eingebunden wurde) kopiert.
Die SQL-Anweisung sollte aus Performance-Gründen möglichst stark aggregiert werden. Das Beispiel benutzt eine zweispaltige Struktur (ReportVO) und kann beliebig angepasst werden.
C# Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data.SqlClient;
using FluorineFx; // Wichtig! FluorineFx.dll Verweis einbinden
namespace ITReportingServices
{
[RemotingService("ReportingService")]
public class ReportingService
{
public ArrayList getReport()
{
ArrayList reports = new ArrayList();
SqlConnection conn =
new SqlConnection(MyConfigurationManager.msSqlServerString);
try
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "SELECT MONTH(buchdatum) As Monat, "+
"sum(wert) AS Summe FROM costcenteraccounting "+
"WHERE (YEAR(buchdatum)) = 2011 "+
"AND costcenter='101008960' "+
"GROUP BY (MONTH(buchdatum)), (YEAR(buchdatum)) ";
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
ReportVO vo = new ReportVO();
vo.monat = reader.GetValue(0).ToString();
vo.summe = reader.GetValue(1).ToString().Replace(",",".");
reports.Add(vo);
}
}
catch (Exception e)
{
reports = new ArrayList();
ReportVO vo = new ReportVO();
vo.monat = e.Message;
vo.summe = e.Message;
reports.Add(vo);
return reports;
}
finally
{
conn.Close();
}
return reports;
}
}
public class ReportVO
{
public string monat;
public string summe;
}
}
Das Model wird auf den .NET-Namespace gemappt.
Model:
package models
{
[RemoteClass(alias="ITReportingServices.ReportVO")]
public class ReportVO
{
public var monat:String;
public var summe:String;
public function ReportVO()
{
}
}
}
Service in Flex-Code aufrufen:
<!-- unter den Script-Teil in MXML schreiben -->
<mx:RemoteObject id="reportingService"
destination="GenericDestination"
source="ITReportingServices.ReportingService"
showBusyCursor="true"
fault="faultHandler(event)" >
<mx:method name="getReport" result="getReportHandler(event)"/>
</mx:RemoteObject>
...
// Das hier in mx:Script Teil
[Bindable] public var reports:ArrayCollection=new ArrayCollection();
public function creationComplete():void
{
reportingService.getReport();
}
public function getReportHandler(event:ResultEvent):void
{
reports = event.result as ArrayCollection;
}
public function faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString());
}
Balkendiagramm:
<mx:ColumnChart dataProvider="{reports}"
height="100%" width="100%" id="columnchart1">
<mx:horizontalAxis>
<mx:CategoryAxis id="ca" categoryField="monat" title="Market sizes" />
</mx:horizontalAxis>
<!-- horizontal axis renderer -->
<mx:horizontalAxisRenderers>
<mx:AxisRenderer axis="{ca}" canDropLabels="false" />
</mx:horizontalAxisRenderers>
<mx:series>
<mx:ColumnSeries displayName="Amount"
xField="monat"
yField="summe"/>
</mx:series>
</mx:ColumnChart>
<mx:Legend visible="false" dataProvider="{columnchart1}"/>
Tortendiagramm:
<mx:Label text="Linke Seite" />
<mx:PieChart id="pie2"
width="100%" height="100%"
dataaProvider="{reports}" showDataTips="true">
<mx:series>
<!--Apply the Array of radii to the PieSeries.-->
<mx:PieSeries field="summe"
nameField="monat"
labelPosition="callout"/>
</mx:series>
</mx:PieChart>
<mx:Legend dataProvider="{pie2}"/>
Liniendiagramm:
<mx:LineChart width="100%" height="100%"
id="myChart"
dataProvider="{reports}"
showDataTips="true">
<mx:horizontalAxis>
<mx:CategoryAxis dataProvider="{reports}"
categoryField="month"/>
</mx:horizontalAxis>
<mx:series>
<mx:LineSeries yField="summe"
displayName="Summe"/>
</mx:series>
</mx:LineChart>
Mehrere SQL Statements sollen atomar (ACID) ausgeführt werden.
Beispiel:
Ein Datenimport mit mehreren INSERT Statements und vorherigen DELETE auf eine existierende Tabelle: Während ein anderer Benutzer auf die Tabelle zugreift, sieht er nur die Daten die bereits importiert wurden. Dies kann über eine Transaktion atomar (wie das umlegen eines Schalters mit COMMIT) ausgeführt werden.
Manipulationen (z.B. auf ein Konto) mit mehreren Zugriffen unterschiedlicher User (konkurrierende Zugriffe) können zu falschen Beträgen auf dem Konto führen (Nebenläufigkeitsprobleme):
Bei mehreren SQL Kommandos, die sequenziell/hintereinander ausgeführt werden, soll sichergestellt werden das andere Benutzer keine Werte manipulieren, die zu einer falschen Weiterberechnung führen (siehe auch: Lost update und Dirty Read bei Datenbanken).
Es existiert eine Klasse SqlTransaction, deren Instanz über die FactoryMethode .BeginTransaction(„SampleTransaction“); zugewiesen werden kann. Die Instanz kann anschließend einem Command zugwiesen werden, welches bis zum COMMIT (Schalter umlegen/alles übernehmen) Befehle an den SQL Server sendet.
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) "+
"VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) "+
"VALUES (101, 'Description')";
command.ExecuteNonQuery();
// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);
// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
Der Inhalt eines mx:DataGrid soll in die Zwischenablage kopiert werden, um ihn z.B. in Excel einzufügen.
Anmerkung: Für AdvancedDataGrid mit Baum siehe auch
Verwendung von System.setClipboard(…); und Iteration über den DataProvider.
public function clipData( dg:DataGrid ):void
{
var totalExport:String = new String();
var colList:Array = new Array();
for(var i:int = 0; i < dg.columnCount; i++)
{
colList.push(dg.columns[i].dataField);
totalExport += dg.columns[i].headerText + "\t";
}
totalExport += "\r";
for(var yp:int = 0; yp < dg.dataProvider.length; yp++)
{
for(var xp:int = 0; xp < colList.length; xp++)
{
totalExport += dg.dataProvider[yp][colList[xp]] + "\t";
}
totalExport += "\r";
}
System.setClipboard(totalExport);
Alert.show('Copied to clipboard, you can paste it now to excel...');
}
[/javascript]
Eine Datei wird geöffnet und mit einem Dateizeiger über diese iteriert. Das Einlesen von Strukturdateien (z.B. CSV-Dateien) soll somit ermöglicht werden.
Verwendung der Klasse StreamReader zum Öffnen der Datei und der Methoden ReadLine() um Zeile-für-Zeile einen String zu erhalten.
// Pfad muss backslashes maskieren (doppelt)
string pfadZurDatei=
"C:\\meinOrdner\\datei.txt";
if (!File.Exists(pfadZurDatei))
{
// Alternativ Console.Write() nutzen
MessageBox.Show(
"Die Datei existiert nicht! Bitte Datei wählen!",
"Wots lous?");
}
else
{
StreamReader sr = new StreamReader(pfadZurDatei);
string inputLine = "";
// Zeilenzahl (um beim Einlesen z.B. Zeilen zu skippen)
int i=0;
while ((inputLine = sr.ReadLine()) != null)
{
i++;
// Zeile steht in inputLine...
// Es handelt sich um eine CSV Datei
values = inputLine.Split(new Char[] { ';' });
// Iteriere über jede Zelle der Zeile
for(int j = 0; j < values.length; j++)
{
string eineZelle=values[j];
}
}
}
Es wird eine perfomante (ohne Cursor-Iterationen) Möglichkeit gesucht um Textdateien per C#.NET in den Microsoft SQL Server zu importieren.
C# bietet eine Klassenbibliothek mit den Klassen SqlBulkCopy und SqlBulkCopyOptions, die bereits im SAP Stammdaten Importer Tool vorgestellt wurde, und dessen Quellcode im unteren Abschnitt des Artikel als Visual Studio 2005 Projekt zum download angeboten wird. Dieses Tool ermöglicht das einlesen von SE16-Downloaddateien mit ein paar Millionen Datensätzen in weniger als 2 Sekunden. Bei der herkömmlichen Methode, einer Cursor-Iteration, wird je INSERT-Statement ein Datenbankaufruf/Netzwerkzugriff durchgeführt. Dies ist nur nicht mehr notwendig.
...
DataTable dataTable = new DataTable();
...
// Spaltenüberschriften zum Table hinzufügen (in einer Schleife befüllbar)
for (/*Schleife um die Spaltennamen einzulesen*/)
{
// Die Anzahl der Columns muss = objects array sein
dataTable.Columns.Add("SPALTENNAME");
}
...
// Definition des Zeilenarrays
ArrayList objects = new ArrayList();
...
while(/*Schleife um zeilenweise über Datei zu iterieren*/)
{
...
for (/*Schleife um über Zellen der Zeile zu iterieren*/)
{
...
objects.Add(aktuellesZellenElementString);
...
}
...
// Hinzufügen des Datenelements, das die Zeilendaten hat
dataTable.Rows.Add(objects.ToArray());
}
...
private void WriteToDatabase()
{
// get your connection string
string connString = msSqlServerString;
// connect to SQL
using (SqlConnection connection = new SqlConnection(connString))
{
// make sure to enable triggers
// more on triggers in next post
SqlBulkCopy bulkCopy = new SqlBulkCopy
(
connection,
SqlBulkCopyOptions.TableLock |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.UseInternalTransaction,
null
);
// set the destination table name
bulkCopy.DestinationTableName = txtImportTable.Text;
connection.Open();
// write the data in the "dataTable"
try
{
bulkCopy.WriteToServer(dataTable);
}
catch (Exception e)
{
MessageBox.Show("Es ist ein Fehler aufgetreten. "+
"Stellen Sie sicher dass der Timeout im SQL Server "+
"auf unendlich steht und AutoClose für die Verbindung "+
"nicht aktiviert wurde. " + e.Message, "Fehler!");
}
connection.Close();
}
// reset
this.dataTable.Clear();
}
Ein komplettes Beispiel lässt sich hier downloaden:
Quellcode SAP Stammdaten Importer (VS 2005 Projekt)
In größeren Firmen kann über das LDAP-Protkoll auf Personendaten und -informationen zugegriffen werden. Die kann z.B. für eine Authentifizierung per Singlesignon genutzt werden.
Möchte man diesen Dienst nutzen, muss man zunächst wissen auf welchem Server im Unternehmen ein solcher Dienst angeboten wird. Dies könnte z.B. ein Active Directory Server (Windows Server) oder ein Lotus Notes Server (notesldap) sein.
Zunächst benötigt man den Import:
using System.DirectoryServices;
private void button1_Click(object sender, EventArgs e)
{
DirectoryEntry DirEntry = new DirectoryEntry();
{
DirEntry.Path = "LDAP://notesldap.it.company.com";
DirEntry.AuthenticationType = AuthenticationTypes.ServerBind;
}
Console.WriteLine(DirEntry.Name);
DirectorySearcher search = new DirectorySearcher(DirEntry);
{
// Tweak this to refine your search
search.Filter = "(sn=Karpenstein)";
// I limit my results while I tweak
search.SearchScope = SearchScope.Subtree;
}
try
{
foreach (SearchResult result in search.FindAll())
{
if (result != null)
{
DirectoryEntry de = result.GetDirectoryEntry();
textBox1.Text += "===================================="+br();
textBox1.Text +=
"User: \t\t" + de.Properties["uid"].Value.ToString() + br() +
"objectclass:\t\t" + de.Properties["objectclass"].Value.ToString();
IDictionaryEnumerator ide = de.Properties.GetEnumerator();
ide.Reset();
try
{
while (ide.MoveNext())
{
PropertyValueCollection pvc = ide.Entry.Value as
PropertyValueCollection;
textBox1.Text += ide.Entry.Key.ToString();
textBox1.Text += pvc.Value;
}
}
catch (Exception sdf)
{
textBox1.Text += sdf.Message;
}
//textBox1.Text += "location:\t\t" + de.Properties["location"].
Value.ToString() + br();
//textBox1.Text += "maildomain:\t\t" + de.Properties["maildomain"].
Value.ToString() + br();
textBox1.Text += "sn:\t\t" + de.Properties["sn"].
Value.ToString() + br();
//textBox1.Text += "dominocertificate:\t\t" +
de.Properties["dominocertificate"].
Value.ToString() + br();
textBox1.Text += "mail:\t\t" + de.Properties["mail"].
Value.ToString() + br();
textBox1.Text += "l:\t\t" + de.Properties["l"].
Value.ToString() + br();
textBox1.Text += "displayname:\t\t" + de.Properties["displayname"].
Value.ToString() + br();
textBox1.Text += "givenname:\t\t" + de.Properties["givenname"].
Value.ToString() + br();
//textBox1.Text += "dc:\t\t" + de.Properties["dc"].
Value.ToString() + br();
//textBox1.Text += "dn:\t\t" + de.Properties["dn"].
Value.ToString() + br();
textBox1.Text += "cn:\t\t" + de.Properties["cn"].
Value.ToString() + br();
textBox1.Text += "====================================";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
search.Dispose();
DirEntry.Close();
}
}
Möchte man eine Seite mit einem iView aufrufen, ist es meistens nötig die komplette Navigation bis zu diesem durchzuklicken. Das Portal besteht bei der Verwendung von iViews aus Frames.
Möchte man das SAP Enterprise Portal anweisen ein spezielles iView/eine spezielle Seite über einen Deeplink in den Frame zu laden, kann der folgende Trick genutzt werden.
iView-Entwickler können den folgenden Code benutzen um Parameter über diesen Deeplink zu übergeben:
URL: http://firmenportalrechner.com:50000/irj/portal?NavigationTarget=navurl://885a76f8628af28c18d76773f98eaaaf&materialId=9380027
…
Java (z.B. iView): String materialId = (String) getPortalRequest().getServletRequest().getParameter(„materialId“);