A short while ago a paper got published on PRESENT: An Ultra-Lightweight Block Cipher by Andrey Bogdanov et al becoming ISO standard 29192-2:2012.
Is there anyone that has a C#, Delphi or FreePascal implementation with unit tests?
–jeroen
Posted by jpluimers on 2012/03/06
A short while ago a paper got published on PRESENT: An Ultra-Lightweight Block Cipher by Andrey Bogdanov et al becoming ISO standard 29192-2:2012.
Is there anyone that has a C#, Delphi or FreePascal implementation with unit tests?
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, Delphi, Development, Software Development | 13 Comments »
Posted by jpluimers on 2012/02/17
Interesting:
JustDecompile is a new, free developer productivity tool for easy .NET assembly browsing and decompiling.
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development, VB.NET | Leave a Comment »
Posted by jpluimers on 2012/01/26
This is WinForms code from a long time ago, but the concept of using an IDisposable interface to do resource cleanup and restore a temporary setting is very valid.
You use the code below like this:
private void myMethod()
{
// set busy cursor
using (IDisposable waitCursor = new TemporaryCursor(this, System.Windows.Forms.Cursors.WaitCursor))
{
// logic that takes a long while
}
}
The code below implements the TemporaryCursor class; you can assign any System.Windows.Forms.Cursors item you want.
It restores the cursor upon these three “events”:
Most often the IDispose pattern is being used to make sure that resources get cleaned up. If you think of a wait cursor as a temporary resource, this example becomes much easier to remember.
Of course this is not limited to the System.Windows.Forms realm, you can just as well use this for non-visual temporaries, and other kinds of UIs like ASP.NET, WPF or SilverLight.
using System.Windows.Forms;
namespace bo.Windows.Forms
{
public class TemporaryCursor : IDisposable
{
private Control targetControl;
private Cursor savedCursor;
private Cursor temporaryCursor;
private bool disposed = false;
public TemporaryCursor(Control targetControl, Cursor temporaryCursor)
{
if (null == targetControl)
throw new ArgumentNullException("targetControl");
if (null == temporaryCursor)
throw new ArgumentNullException("temporaryCursor");
this.targetControl = targetControl;
this.temporaryCursor = temporaryCursor;
savedCursor = targetControl.Cursor;
targetControl.Cursor = temporaryCursor;
targetControl.HandleDestroyed += new EventHandler(targetControl_HandleDestroyed);
}
void targetControl_HandleDestroyed(object sender, EventArgs e)
{
if (null != targetControl)
if (!targetControl.RecreatingHandle)
targetControl = null;
}
// public so you can call it on the class instance as well as through IDisposable
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (null != targetControl)
{
targetControl.HandleDestroyed -= new EventHandler(targetControl_HandleDestroyed);
if (temporaryCursor == targetControl.Cursor)
targetControl.Cursor = savedCursor;
targetControl = null;
}
disposed = true;
}
}
// Finalizer
~TemporaryCursor()
{
Dispose(false);
}
}
}
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development, Visual Studio 2005, Visual Studio 2008, Visual Studio 2010, Visual Studio and tools, WinForms | 4 Comments »
Posted by jpluimers on 2012/01/25
A while ago, I needed to analyze a bunch of files based on the unique trimmed lines in them.
I based my code on the C# Tee filter and the StackOverflow example of C# deduping based on split.
It is a bit more extensive than strictly needed, as it has a few more commandline arguments that come in handy when processing files on the console:
DeDupe - Dedupes a file into unique lines (only the first occurance of a line is kept) standard output
Lines are terminated by CRLF sequences
C# implementation januari 5th, 2012 by Jeroen Wiert Pluimers (https://wiert.wordpress.com),
DeDupe [-i | --ignore] [-t | --trim] [-f | --flush] [-l | --literal] [-? | --h | --help | /?] [file0] [...]
Example:
DeDupe --trim file0.txt file1.txt
Dedupes the appended content of file0.txt and file1.txt into standard output
-t | --trim Will trim the lines before considering duplicates
-f | --flush Flushes files every CRLF
(setting is per tee instance)
-i | --ignore Ignore cancel Ctrl+C keypress: see UnixUtils tee
-l | --literal Stop recognizing flags, force all following filenames literally
-? | --h | /? | --help Displays this message and immediately quits
Duplicate filenames are quietly ignored.
If no input filenames are specified, then standard input is used
Press Ctrl+Z (End of File character) then Enter to abort.
Here is the source code:
using System;
using System.IO;
using System.Collections.Generic;
namespace DeDupe
{
class Program
{
static void help()
{
Console.Error.WriteLine("DeDupe - Dedupes a file into unique lines (only the first occurance of a line is kept) standard output");
Console.Error.WriteLine("Lines are terminated by CRLF sequences");
Console.Error.WriteLine("C# implementation januari 5th, 2012 by Jeroen Wiert Pluimers (https://wiert.wordpress.com),");
Console.Error.WriteLine("");
Console.Error.WriteLine("DeDupe [-i | --ignore] [-t | --trim] [-f | --flush] [-l | --literal] [-? | --h | --help | /?] [file0] [...]");
Console.Error.WriteLine(" Example:");
Console.Error.WriteLine(" DeDupe --trim file0.txt file1.txt");
Console.Error.WriteLine(" Dedupes the appended content of file0.txt and file1.txt into standard output");
Console.Error.WriteLine("");
Console.Error.WriteLine("-t | --trim Will trim the lines before considering duplicates");
Console.Error.WriteLine("-f | --flush Flushes files every CRLF");
Console.Error.WriteLine(" (setting is per tee instance)");
Console.Error.WriteLine("-i | --ignore Ignore cancel Ctrl+C keypress: see UnixUtils tee");
Console.Error.WriteLine("-l | --literal Stop recognizing flags, force all following filenames literally");
Console.Error.WriteLine("-? | --h | /? | --help Displays this message and immediately quits");
Console.Error.WriteLine("");
Console.Error.WriteLine("Duplicate filenames are quietly ignored.");
Console.Error.WriteLine("If no input filenames are specified, then standard input is used");
Console.Error.WriteLine("Press Ctrl+Z (End of File character) then Enter to abort.");
}
static void OnCancelKeyPressed(Object sender, ConsoleCancelEventArgs args)
{
// Set the Cancel property to true to prevent the process from
// terminating.
args.Cancel = true;
}
static List<String> filenames = new List<String>();
static void addFilename(string value)
{
if (-1 == filenames.IndexOf(value))
filenames.Add(value);
}
static bool trimLines = false;
static bool flushFiles = false;
static bool stopInterpretingFlags = false;
static bool ignoreCtrlC = false;
static int Main(string[] args)
{
try
{
foreach (string arg in args)
{
//Since we're already parsing.... might as well check for flags:
if (stopInterpretingFlags) //Stop interpreting flags, assume is filename
{
addFilename(arg);
}
else if (arg.Equals("/?") || arg.Equals("-?") || arg.Equals("-h") || arg.Equals("--help"))
{
help();
return 1; //Quit immediately
}
else if (arg.Equals("-t") || arg.Equals("--trim"))
{
trimLines = true;
}
else if (arg.Equals("-f") || arg.Equals("--flush"))
{
flushFiles = true;
}
else if (arg.Equals("-i") || arg.Equals("--ignore"))
{
ignoreCtrlC = true;
}
else if (arg.Equals("-l") || arg.Equals("--literal"))
{
stopInterpretingFlags = true;
}
else
{ //If it isn't any of the above, it's a filename
addFilename(arg);
}
//Add more flags as necessary, just remember to SKIP adding them to the file processing stream!
}
if (ignoreCtrlC) //Implement the Ctrl+C fix selectively (mirror UnixUtils tee behavior)
Console.CancelKeyPress += OnCancelKeyPressed;
HashSet<string> keys = new HashSet<string>();
Int64 index = 0;
using (StreamWriter writer = new StreamWriter(Console.OpenStandardOutput()))
{
if (filenames.Count == 0)
using (StreamReader reader = new StreamReader(Console.OpenStandardInput()))
{
processInputFileReader(keys, writer, reader, ref index);
}
else
foreach (String filename in filenames)
{
using (StreamReader reader = new StreamReader(filename))
{
processInputFileReader(keys, writer, reader, ref index);
}
}
writer.Flush();
}
}
catch (Exception ex)
{
Console.Error.WriteLine(String.Concat("DeDupe: ", ex.Message)); // Send error messages to stderr
}
return 0;
}
private static void processInputFileReader(HashSet<string> keys, StreamWriter writer, StreamReader reader, ref Int64 index)
{
string line = readLine(reader);
while (!string.IsNullOrEmpty(line))
{
string candidate = line;
if (keys.Add(candidate))
{
writer.WriteLine(line);
index += line.Length + Environment.NewLine.Length;
if (flushFiles)
writer.Flush();
}
line = readLine(reader);
}
}
private static string readLine(StreamReader reader)
{
string line = reader.ReadLine();
if (null != line)
if (trimLines)
line = line.Trim();
return line;
}
}
}
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development | 4 Comments »
Posted by jpluimers on 2011/11/08
Every once in a a while I do WinForms development. On the .NET platform it still is the best way to create simple business applications that just, well: work.
WinForms apps are not fancy, but the actual users don’t care much, as long as they can their daily work done. They love fanciness of their mobile devices, but for stuff they use 8 hours a day, they just want something that works quickly, well and easily. So WinForms for a baseline is good.
WinForms historically has had two ways of automatically: Anchors and Dock (.NET 2 introduced another way using FlowLayoutPanel and TableLayoutPanel, but often they make things more complicated than needed).
One of the pitfalls of Docking is when you set Dock to Fill. Sometimes the affected control will be too large.
Every time that happens, I am baffled, as .NET is the only platform with that behaviour; I use other platforms too, and they don’t have this docking peculiarity (of course the have others, that’s the fun of using multiple platforms <g>).
–jeroen
Via: c# – Panel.Dock Fill ignoring other Panel.Dock setting – Stack Overflow.
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development, VB.NET, WinForms | 2 Comments »
Posted by jpluimers on 2011/11/03
Sometimes you just want to ask a user for a simple string of input.
The InputBox function is an easy way to do do this. It has a tiny issue with the icon (it uses the one that belongs to the application installation, not the icon in the project properties).
InputBox has been part of Visual Basic since the 90s. And it is very easy to use from C# and other .NET languages:
Microst.VisualBasic.Interaction.InputBox("Did you know your question goes here?","Title","Default Text");Sometimes you have to look a bit further than your regular toolbox for simple solutions.
I should dig up my 2006 session on the My Object in Visual Basic: that is also very easy to use in C#.
–jeroen
via: Input Message Box in C#?.
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development, VB.NET, VBS | Leave a Comment »
Posted by jpluimers on 2011/07/20
This is from a long time ago, but still fun:
Sometimes simple things in life are hard do remember.
For instance, I always forgot if a file extension parameter should have a dot in it or not.
Normally it should!
But for clearing an extension, you should use a blank string.
Be aware though that empty extensions look differently depending where in the process you look at them:
C# example:
using System;
using System.IO;
public class Test
{
public static void Main()
{
string extensionLess = Path.ChangeExtension(@"C:\mydir\myfile.com.extension", "");
Console.WriteLine(extensionLess);
string extension = Path.GetExtension(extensionLess);
Console.WriteLine(extension);
}
}
Outputs:
C:\mydir\myfile.com.
Delphi example:
program Demo;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
extensionLess: string;
extension: string;
begin
extensionLess := ChangeFileExt('C:\mydir\myfile.com.extension', '');
Writeln(extensionLess);
extension := ExtractFileExt(extensionLess);
Writeln(extension);
end.
Outputs:
C:\mydir\myfile.com .com
Don’t you love differences in your platforms :)
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Delphi, Development, Software Development | 4 Comments »
Posted by jpluimers on 2011/06/14
A while ago, I needed some generic way of parsing data that could result instancef of both regular ordinal and nullable ordinal types.
Luckily there was a nice question about this on StackOverflow, of which I liked this answer (source code below) much more than the accepted answer: concise, elegant, period.
public static T? Parse(this string text) where T: struct
{
object o = null;
try
{
var ttype = typeof(T);
if (ttype.IsEnum)
{
T n = default(T);
if (Enum.TryParse(text, true, out n))
return n;
}
else
o = Convert.ChangeType(text, ttype);
}
catch { }
if (o == null)
return new Nullable();
return new Nullable((T)o);
}
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development | 1 Comment »
Posted by jpluimers on 2011/05/19
When you get a C# Warning CS0067, the MSDN documentation tell you to insert a “#pragma warning disable 0067”, but Trevor Robinson has a better solution at C# Warning CS0067: The event ‘event’ is never used – Trevor’s Dev Blog – Site Home – MSDN Blogs:
Since the event is never used, make the event explicit, or even throw an exception in the add clause of the event.
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development | Leave a Comment »
Posted by jpluimers on 2011/04/20
Boy, I love stackoverflow.
Unlike a forum – which is focussed on discussion – stackoverflow is focussed on questions and answers, and they have lots of good answers.
Recently, I had to format numbers in a human readable way.
The formatting – C#: File-size format provider – Stack Overflow question had at least 3 good ways.
I chose the FileSizeFormatProvider answer, as it best fitted my goal and it is easy to extend, but the StrFormatByteSize answer works very well too if you need an ‘out of the box’ solution that works on native Windows.
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, Software Development | Leave a Comment »