This plugin will add a context menu for IE9, Chrome and Firefox menus. When you select a text and right-click a text, you want to know not only how that word is spelled, but how it is pronounced. I elected HowJSay.com as the perfect venue for launching a new browser window for learning how to pronounce things proper. As I have always said, proper pronunciation is next to godliness.
Instructions: Simply highlight the word you want to have pronounced for you. Right-click on selected text to bring up the context menu. Simply click on 'Pronounce with Howjsay' (Under 'All Accelerators' in IE8) and a new window or tab will be opened to the appropriate page for that word on howjsay.com. Make sure your volume is not muted or too low. If you missed the pronounciation, you can mouse-over the word on howjsay to have it pronounced again.
Simply find your browser below:
Google chrome users
Instructions: If you can download the .crx, Google should automatically prompt you to install the plugin. If it does not, you download the .zip file and once downloaded, extract into a folder. Go into Google chrome's settings (the wrench icon), then click on 'extensions' in the left pane. In the right pane at the top, make sure the 'Developer mode' box is checked. Click on the 'Load unpacked extension...' button and select the folder that you extracted the .zip into. Click okay and Google will install the extension.
Installation links: Click here for a .crx file. Click here if you want to download as a .zip file.
Internet explorer users
Instructions: If you are using IE to browse this page, you should see a button below. Click on it to install the accelerator.
Firefox users
Instructions: It is easiest to install the FireFox extension through the secure add-on page hosted by addons.mozilla.org
Installation link: Click here for our secure add-on page hosted by addons.mozilla.org
Tags
C#
Math
Algorithm
Data
Error handling
Statistics
Cryptography
hack
Best practices
Architecture
CSV
DataTable
Encryption
SQL
Database
Humor
snippets
Entropy
ORM
Design Pattern
Dictionary
Jokes
Prime
Pseudorandom
Serialization
Code Generation
Compression
Coprime
Exception
Object Relational Mapping
Raspberry Pi
Reflection
Winform
Attributes
CodeDOM
Console
DataGrid
DataGridView
DataSet
Drawing
GCD
List
Mono
PropertyInfo
Sort
Static Analysis
Validation
XML
Benchmarking
Bugs
Bézier
Cellular automata
Chrome
Clipboard
Data Mapper
Designer
EULA
Extension Methods
Firefox
Games
Generics
GraphicsPath
HoneyPot
HowJSay
IComparer
IE
KeyedCollection
Luhn Algorithm
Parameter Sanitization
Query
Rogue-like
SortedDictionary
UnhandledExceptionHandler
Usercontrol
WIN32API
Wednesday, August 21, 2013
Wednesday, August 7, 2013
Pseudo 'random' even distribution table
In my last post, I discussed what a co-prime is and showed you to find them.
So, what's so special about relatively prime numbers? Well, then can be used to create an one-for-one distribution table that is seemingly random, but is deterministically calculated (created).
To understand what I mean, picture the face of a clock...
It has the hours 1 through 12, and if you and an hour to 12, you get 1. This can also be thought of as a single digit in a base 12 number system. Now we need a co-prime to 12. 7 is relatively prime to 12, so lets choose 7.
Starting at hour 1, if we add 7 hours, it will be 8. If we add 7 more hours, we will get 3. 7 more, 10. If we keep adding 7 hours to our clock, the hour hand will land on each of the different numbers exactly once before repeating itself, 12 steps later. Intrigued yet?
If, say, we find a co-prime to the largest number that can be represented by a byte (8-bits, 256 [also expressed as 2^8=256 or 8=Log2(256)]), we can create an array of bytes with a length of 256, containing each of the 256 different possible bytes, distributed in a seemingly random order. The discrete order, or sequence, in which each each number is visited it completely dependent on the value of the co-prime that was selected.
This table is now essentially a one-to-one, bijective mapping of one byte to another. To express this mapping to another party, say to map a stream of bytes back to their original values (decrypt), the entire table need not be exchanged, only the co-prime.
This provides a foundation for an encryption scheme who's technical requirements are similar to handling a cipher-block-chain (CBC) and its changing IV (initialization vector).
Now, it it easy to jump to the conclusion that such an encryption scheme is less secure than a CBC, but this is not necessarily the case. While this approach may be conceptually more simple, the difficulty of discovering the sequence can be made arbitrarily hard.
First of all, the number of relatively prime numbers to 256 is probably infinite. A co-prime to 256 does not have to be less than 256. Indeed, it may be several thousand time greater than 256. Additionally, any prime greater than 256 is, by definition, co-prime to 256, and likely will have a seemingly more 'random' distribution/appearance.
There is, however, a limit here. It does not have to do with the number of co-primes, but is instead limited by the number of possible sequences that can be represented by our array of 256 bytes; eventually, two different co-primes are going to map to the same unique sequence. The order matters, and we don't allow repetition to exist in our sequence. This is called a permutation without repetition, and can be expressed as 256! or 256 factorial and is instructing one to calculate the product of 256 * 255 * 254 * 253 * [...] * 6 * 5 * 4 * 3 * 2 * 1, which equals exactly this number:
857817775342842654119082271681232625157781520279485619859655650377269452553147589377440291360451408450375885342336584306157196834693696475322289288497426025679637332563368786442675207626794560187968867971521143307702077526646451464709187326100832876325702818980773671781454170250523018608495319068138257481070252817559459476987034665712738139286205234756808218860701203611083152093501947437109101726968262861606263662435022840944191408424615936000000000000000000000000000000000000000000000000000000000000000
Yeah, that's right, that number has exactly 63 zeros on the end and is 507 digits long. (As an aside, the reason there is so many zeros on the end of this number is, well for one it is highly composite, but more specifically, its prime factorization includes 2^255 and 5^63 and so 63 fives multiply with 63 of those twos to make 63 tens, and hence that many zeros.)
Above I said arbitrarily hard. So far we have only considered one table, but try and fathom the complexity of many tables. I present three different ways to use multiple tables; Nested, sequentially, and mangled.
Furthermore, the distribution tables can be discarded and replaced.
I will explain what those mean and finish this post tomorrow.
Labels:
.net,
Algorithm,
C#,
Coprime,
Cryptography,
csharp,
Data,
Distributed Table,
Encryption,
Entropy,
GCD,
Math,
Pseudorandom,
Random,
security,
Statistics
Sunday, August 4, 2013
Topmost window always on top
This project was inspired by PowerMenu 1.51 by Thong Nyguyen. I wrote a small C# system tray application that provides some of the same functionality as PowerMenu. It can set/unset any application window as always on top or topmost. This is useful if you want to compare or edit two documents at once and you want to make a window float, sticky, or pin a window on top. I wrote this tool in C# and am giving you the source code here so you can see how it works. Since .NET does not support such level of control over other applications, our code must call the native WIN32 APIs SetWindowPos and FindWindow to accomplish this.
Besides being a system tray application (NotifyIcon), the application essentially has two main functions: GetWindowTitles(), which uses the Process class to return a list of windows' titles as an array of strings, and AssignTopmostWindow() which takes a windows title as a parameter.
But first, we must define our WIN32 API imports:
#region WIN32API
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
const UInt32 SWP_SHOWWINDOW = 0x0040;
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left, Top, Right, Bottom;
public RECT(int left,int top,int right,int bottom) {
Left=left; Top=top; Right=right; Bottom=bottom; }
public RECT(System.Drawing.Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom) { }
public int X { get { return Left; } set { Right -= (Left - value); Left = value; } }
public int Y { get { return Top; } set { Bottom -= (Top - value); Top = value; } }
public int Height { get { return Bottom - Top; } set { Bottom = value + Top; } }
public int Width { get { return Right - Left; } set { Right = value + Left; } }
public static implicit operator System.Drawing.Rectangle(RECT r) {
return new System.Drawing.Rectangle(r.Left, r.Top, r.Width, r.Height); }
public static implicit operator RECT(System.Drawing.Rectangle r) { return new RECT(r); }
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, uint uFlags );
#endregion
Notice the RECT structure. The WIN32 RECT struct is different than the .NET version, and we need it to store and pass the window position during our call to SetWindowPos() or the window will likely disappear during resizing.
Here you can see in our implementation of AssignTopmostWindow, we get the window rectangle with GetWindowRect() and pass it straight to our call to SetWindowPos():
bool AssignTopmostWindow(string windowTitle,bool makeTopmost)
{
IntPtr hWnd = FindWindow((string)null,windowTitle);
RECT rect = new RECT();
GetWindowRect(new HandleRef(this,hWnd),out rect);
return SetWindowPos(hWnd,
makeTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
rect.X, rect.Y, rect.Width, rect.Height,
SWP_SHOWWINDOW);
}
So your application is first going to want to get the titles of all the forms and windows:
string[] GetWindowTitles()
{
List<string> winList = new List<string>();
Process[] procArray = Process.GetProcesses();
foreach(Process proc in procArray)
{
if(!string.IsNullOrWhiteSpace(proc.MainWindowTitle))
{
winList.Add(proc.MainWindowTitle);
}
}
return winList.ToArray();
}
Then your application must then fill a listbox or somehow display this data to the user for selection. I choose to populate a dynamic context menu for my NotifyIcon application:
private MenuItem[] DynamicMenu()
{
string[] titleArray = GetWindowTitles();
List<MenuItem> menuList = new List<MenuItem>();
foreach(string title in titleArray)
{
if(changeLog.ContainsKey(title))
{
if(changeLog[title])
{
menuList.Add(new MenuItem("* " + title, menuWinClick));
}
else
{
menuList.Add(new MenuItem(title, menuWinClick));
}
}
else
{
menuList.Add(new MenuItem(title, menuWinClick));
}
}
menuList.Add(new MenuItem("_____________"));
menuList.Add(new MenuItem("About", menuAboutClick));
menuList.Add(new MenuItem("Exit", menuExitClick));
return menuList.ToArray();
}
Once the user has made a selection, a call to AssignTopmostWindow is made.If your application should happen to exit without another call to AssignTopmostWindow(selectedTitle,false) to undo the topmost property, the window will remain topmost until reboot. As this is likely undesirable behavior, . My solution was to create a dictionary to keep track of the windows whose topmost property was modified, and 'roll back' those changes when your program/form is ending/closing:
private Dictionary<string,bool> changeLog = new Dictionary<string, bool>();
private void menuExitClick(object sender, EventArgs e)
{
// Roll-back changes by
// unsetting every topmost window
foreach(KeyValuePair<string,bool> entry in changeLog)
{
if(entry.Value) // If topmost
{
AssignTopmostWindow(entry.Key,false);
}
}
Application.Exit();
}
Here is the full code.
Labels:
.net,
Aways on top,
C#,
Class,
csharp,
Powermenu,
SetWindowPos,
Topmost,
WIN32API,
Z-Index
Thursday, August 1, 2013
Greatest common divisor & Co-primeness
Below are three different methods for finding the greatest common divisor of a number. I provide a method using modulus, one using Euclid's method, and one that uses the Stein method.
Believe it or not, the modulus method has the best performance. I would have guessed the Stein method. Credit goes to blackwasp for the stein method.
public static uint FindGCDModulus(uint value1, uint value2)
{
while(value1 != 0 && value2 != 0)
{
if (value1 > value2)
{
value1 %= value2;
}
else
{
value2 %= value1;
}
}
return Math.Max(value1, value2);
}
public static uint FindGCDEuclid(uint value1, uint value2)
{
while(value1 != 0 && value2 != 0)
{
if (value1 > value2)
{
value1 -= value2;
}
else
{
value2 -= value1;
}
}
return Math.Max(value1, value2);
}
public static uint FindGCDStein(uint value1, uint value2)
{
if (value1 == 0) return value2;
if (value2 == 0) return value1;
if (value1 == value2) return value1;
bool value1IsEven = (value1 & 1u) == 0;
bool value2IsEven = (value2 & 1u) == 0;
if (value1IsEven && value2IsEven)
{
return FindGCDStein(value1 >> 1, value2 >> 1) << 1;
}
else if (value1IsEven && !value2IsEven)
{
return FindGCDStein(value1 >> 1, value2);
}
else if (value2IsEven)
{
return FindGCDStein(value1, value2 >> 1);
}
else if (value1 > value2)
{
return FindGCDStein((value1 - value2) >> 1, value2);
}
else
{
return FindGCDStein(value1, (value2 - value1) >> 1);
}
}
Here are the results of my benchmark tests:
Stein: 36.4657 milliseconds.
Euclid: 31.2369 milliseconds.
Modulus: 7.5199 milliseconds.
Yeah, I couldn't believe it either, the modulus approach is the fastest!
Here is the benchmark code that I created:
public class CodeStopwatch
{
//int m_pointer;
Stopwatch m_elapsed;
public CodeStopwatch()
{
Reset();
}
public double Stop()
{
m_elapsed.Stop();
return m_elapsed.Elapsed.TotalMilliseconds;
}
public void Reset()
{
GC.Collect(GC.MaxGeneration);
m_elapsed = new Stopwatch();
m_elapsed.Start();
}
}
public class CoprimeBenchmark
{
public delegate bool IsCoprimeDelegate(uint value1, uint value2);
public List<uint> FindCoprimesDelegate(uint quantity,IsCoprimeDelegate isCoprime)
{
List<uint> results = new List<uint>();
if(quantity<2) {
return results;
}
for (uint count = 2; count < quantity; count++)
{
if(isCoprime(count,quantity))
{
results.Add(count);
}
}
return results;
}
public static bool IsCoprimeModulus(uint value1, uint value2)
{
return FindGCDModulus(value1, value2) == 1;
}
public static bool IsCoprimeEuclid(uint value1, uint value2)
{
return FindGCDEuclid(value1, value2) == 1;
}
public static bool IsCoprimeStein(uint value1, uint value2)
{
return FindGCDStein(value1, value2) == 1;
}
// [ Please refer to methods above. Ommited for brevity. ]
public static uint FindGCDModulus(uint value1, uint value2) { ... }
public static uint FindGCDEuclid(uint value1, uint value2) { ... }
public static uint FindGCDStein(uint value1, uint value2) { ... }
}
Usage of above classes:
// Button OnClick event
void ButtonBenchmarkClick(object sender, EventArgs e)
{
uint number = 50000;
List<uint> resultsStein = new List<uint>();
List<uint> resultsEuclid = new List<uint>();
List<uint> resultsModulus = new List<uint>();
CoprimeBenchmark cop = new CoprimeBenchmark();
CodeStopwatch time = new CodeStopwatch();
resultsStein = cop.FindCoprimesDelegate(number,CoprimeBenchmark.IsCoprimeStein);
string stein = time.Stop().ToString();
time = new CodeStopwatch();
resultsEuclid = cop.FindCoprimesDelegate(number,CoprimeBenchmark.IsCoprimeEuclid);
string euclid = time.Stop().ToString();
time = new CodeStopwatch();
resultsModulus = cop.FindCoprimesDelegate(number,CoprimeBenchmark.IsCoprimeModulus);
string modulus = time.Stop().ToString();
textBoxOutput.Text = "Stein:\t" + stein + " milliseconds." + Environment.NewLine;
textBoxOutput.Text += "Euclid:\t" + euclid + " milliseconds." + Environment.NewLine;
textBoxOutput.Text += "Modulus:\t" + modulus + " milliseconds." + Environment.NewLine;
textBoxOutput.Text += Environment.NewLine + Environment.NewLine;
foreach(uint a in resultsStein)
{
textBoxOutput.Text += a.ToString() + Environment.NewLine;
}
textBoxOutput.Text += Environment.NewLine + Environment.NewLine;
foreach(uint b in resultsEuclid)
{
textBoxOutput.Text += b.ToString() + Environment.NewLine;
}
textBoxOutput.Text += Environment.NewLine + Environment.NewLine;
foreach(uint c in resultsModulus)
{
textBoxOutput.Text += c.ToString() + Environment.NewLine;
}
}
--
Now, I will take the fastest algorithm and show you the code for finding co-primness and a list of co-primes for a given number.
Finding co-primness is simple; Two numbers are relatively prime to each other if their greatest common divisor is equal to one.
My function FindCoprimes returns a List<uint> of co-primes given a number and a range
public static class Coprimes { public static List<uint> FindCoprimes(uint number,uint min,uint max) { if(max<2 || min<2 || max<=min || number<1) { return null; } List<uint> results = new List<uint>(); for(uint counter = min; counter<max; counter++) { if(IsCoprime(number,counter)) { results.Add(counter); } } return results; } public static bool IsCoprime(uint value1, uint value2) { return
FindGCDModulus
(value1, value2) == 1; } }
Pretty easy!
What is so special about co-primes? Well, one thing I use co-primes for is for making an evenly distributed table. For an explanation and the code, see my post on Evenly Distributed Tables.
Labels:
.net,
Algorithm,
Benchmarking,
C#,
Coprime,
Cryptography,
csharp,
GCD,
Greatest Common Divisor,
Math,
performance,
Prime,
Relative Prime,
Statistics
Captcha: Drawing Text along a Bézier Spline
The following post/code will achieve something to the effect of:
All this code, and this article was inspired by planetclegg.com/projects/WarpingTextToSplines.html.
Explanation of the math and why it works will come shortly. In the meantime, please see the above link for a detailed explanation.
This code assumes you have already drawn some text on your GraphicsPath. Here is the code to transform your GraphicsPath text to follow a cubic Bézier Spline:
GraphicsPath BezierWarp(GraphicsPath text,Size size)
{
// Control points for a cubic Bézier spline
PointF P0 = new PointF();
PointF P1 = new PointF();
PointF P2 = new PointF();
PointF P3 = new PointF();
float shrink = 20;
float shift = 0;
P0.X = shrink;
P0.Y = shrink+shift;
P1.X = size.Width-shrink;
P1.Y = shrink;
P2.X = shrink;
P2.Y = size.Height-shrink;
P3.X = size.Width-shrink;
P3.Y = size.Height-shrink-shift;
// Calculate coefficients A thru H from the control points
float A = P3.X - 3 * P2.X + 3 * P1.X - P0.X;
float B = 3 * P2.X - 6 * P1.X + 3 * P0.X;
float C = 3 * P1.X - 3 * P0.X;
float D = P0.X;
float E = P3.Y - 3 * P2.Y + 3 * P1.Y - P0.Y;
float F = 3 * P2.Y - 6 * P1.Y + 3 * P0.Y;
float G = 3 * P1.Y - 3 * P0.Y;
float H = P0.Y;
PointF[] pathPoints = text.PathPoints;
RectangleF textBounds = text.GetBounds();
for (int i =0; i < pathPoints.Length; i++)
{
PointF pt = pathPoints[i];
float textX = pt.X;
float textY = pt.Y;
// Normalize the x coordinate into the parameterized
// value with a domain between 0 and 1.
float t = textX / textBounds.Width;
float t2 = (t * t);
float t3 = (t * t * t);
// Calculate spline point for parameter t
float Sx = A * t3 + B * t2 + C * t + D;
float Sy = E * t3 + F * t2 + G * t + H;
// Calculate the tangent vector for the point
float Tx = 3 * A * t2 + 2 * B * t + C;
float Ty = 3 * E * t2 + 2 * F * t + G;
// Rotate 90 or 270 degrees to make it a perpendicular
float Px = - Ty;
float Py = Tx;
// Normalize the perpendicular into a unit vector
float magnitude = (float)Math.Sqrt((Px*Px) + (Py*Py));
Px /= magnitude;
Py /= magnitude;
// Assume that input text point y coord is the "height" or
// distance from the spline. Multiply the perpendicular
// vector with y. it becomes the new magnitude of the vector
Px *= textY;
Py *= textY;
// Translate the spline point using the resultant vector
float finalX = Px + Sx;
float finalY = Py + Sy;
pathPoints[i] = new PointF(finalX, finalY);
}
return new GraphicsPath(pathPoints,text.PathTypes);
}
Subscribe to:
Posts (Atom)