Amazon and the digital age

Amazon sells games. That’s hardly news, isn’t it? However, there is one item that they should fix: some of their download-only items cost much more than the shrink-wrapped counterparts.
One example: “Age of Empires III: Complete Collection” costs 18.15 USD, while the download-only costs 39.99 USD. And they keep pushing e-mails in my inbox about their sale.
(As a side note, I wrote this post only because they managed to make me really angry, since they’ve been sending the “It’s on sale!” e-mails for about two months, and every time I check the download-only price, it’s actually rising. I no longer want a CD or a DVD, I like the fact that I can download my game and I do not have to care for yet another disc.

Leave a Comment

Another joke I heard …

A Smart crashes into a Maybach. The Maybach console reported “New device detected” :-D

Leave a Comment

Simulating mouse events from C#

using System;
using System.Runtime.InteropServices;

namespace UseSendInput
{
    class Program
    {
        static void Main(string[] args)
        {
            SimulateMouseUp();
        }

        /// <summary>
        /// 
        /// </summary>
        private static void SimulateMouseUp()
        {
            var input = new INPUT
                            {
                                type = (uint) InputType.INPUT_MOUSE,
                                U = new InputUnion()
                                        {
                                            mi = new MOUSEINPUT()
                                                     {
                                                         dx = 0,
                                                         dy = 0,
                                                         dwFlags = MOUSEEVENTF.XUP,
                                                         mouseData = 0,
                                                         dwExtraInfo = UIntPtr.Zero,
                                                         time = 0
                                                     }
                                        }
                            };
            var toSend = new INPUT[] {input};
            PInvoke.SendInput(1, toSend, Marshal.SizeOf(input));
        }

    /// <summary>
    /// Code below courtesy of pinvoke.net
    /// </summary>
    public partial class PInvoke
    {
        [DllImport("User32.dll")]
        public static extern uint SendInput(
            uint nInputs,
            [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
            int cbSize);
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        internal uint type;
        internal InputUnion U;
        internal static int Size
        {
            get { return Marshal.SizeOf(typeof(INPUT)); }
        }
    }

    enum InputType : uint
    {
        INPUT_MOUSE = 0,
        INPUT_KEYBOARD = 1,
        INPUT_HARDWARE = 2
    }

    [StructLayout(LayoutKind.Explicit)]
    internal struct InputUnion
    {
        [FieldOffset(0)]
        internal MOUSEINPUT mi;
        [FieldOffset(0)]
        internal KEYBDINPUT ki;
        [FieldOffset(0)]
        internal HARDWAREINPUT hi;
    }


    [StructLayout(LayoutKind.Sequential)]
    internal struct MOUSEINPUT
    {
        internal int dx;
        internal int dy;
        internal MouseEventDataXButtons mouseData;
        internal MOUSEEVENTF dwFlags;
        internal uint time;
        internal UIntPtr dwExtraInfo;
    }

    [Flags]
    internal enum MouseEventDataXButtons : uint
    {
        Nothing = 0x00000000,
        XBUTTON1 = 0x00000001,
        XBUTTON2 = 0x00000002
    }

    [Flags]
    internal enum MOUSEEVENTF : uint
    {
        ABSOLUTE = 0x8000,
        HWHEEL = 0x01000,
        MOVE = 0x0001,
        MOVE_NOCOALESCE = 0x2000,
        LEFTDOWN = 0x0002,
        LEFTUP = 0x0004,
        RIGHTDOWN = 0x0008,
        RIGHTUP = 0x0010,
        MIDDLEDOWN = 0x0020,
        MIDDLEUP = 0x0040,
        VIRTUALDESK = 0x4000,
        WHEEL = 0x0800,
        XDOWN = 0x0080,
        XUP = 0x0100
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct KEYBDINPUT
    {
        internal VirtualKeyShort wVk;
        internal ScanCodeShort wScan;
        internal KEYEVENTF dwFlags;
        internal int time;
        internal UIntPtr dwExtraInfo;
    }

    [Flags]
    internal enum KEYEVENTF : uint
    {
        EXTENDEDKEY = 0x0001,
        KEYUP = 0x0002,
        SCANCODE = 0x0008,
        UNICODE = 0x0004
    }

    internal enum VirtualKeyShort : short
    {
        ///<summary>
        ///Left mouse button
        ///</summary>
        LBUTTON = 0x01,
        ///<summary>
        ///Right mouse button
        ///</summary>
        RBUTTON = 0x02,
        ///<summary>
        ///Control-break processing
        ///</summary>
        CANCEL = 0x03,
        ///<summary>
        ///Middle mouse button (three-button mouse)
        ///</summary>
        MBUTTON = 0x04,
        ///<summary>
        ///Windows 2000/XP: X1 mouse button
        ///</summary>
        XBUTTON1 = 0x05,
        ///<summary>
        ///Windows 2000/XP: X2 mouse button
        ///</summary>
        XBUTTON2 = 0x06,
        ///<summary>
        ///BACKSPACE key
        ///</summary>
        BACK = 0x08,
        ///<summary>
        ///TAB key
        ///</summary>
        TAB = 0x09,
        ///<summary>
        ///CLEAR key
        ///</summary>
        CLEAR = 0x0C,
        ///<summary>
        ///ENTER key
        ///</summary>
        RETURN = 0x0D,
        ///<summary>
        ///SHIFT key
        ///</summary>
        SHIFT = 0x10,
        ///<summary>
        ///CTRL key
        ///</summary>
        CONTROL = 0x11,
        ///<summary>
        ///ALT key
        ///</summary>
        MENU = 0x12,
        ///<summary>
        ///PAUSE key
        ///</summary>
        PAUSE = 0x13,
        ///<summary>
        ///CAPS LOCK key
        ///</summary>
        CAPITAL = 0x14,
        ///<summary>
        ///Input Method Editor (IME) Kana mode
        ///</summary>
        KANA = 0x15,
        ///<summary>
        ///IME Hangul mode
        ///</summary>
        HANGUL = 0x15,
        ///<summary>
        ///IME Junja mode
        ///</summary>
        JUNJA = 0x17,
        ///<summary>
        ///IME final mode
        ///</summary>
        FINAL = 0x18,
        ///<summary>
        ///IME Hanja mode
        ///</summary>
        HANJA = 0x19,
        ///<summary>
        ///IME Kanji mode
        ///</summary>
        KANJI = 0x19,
        ///<summary>
        ///ESC key
        ///</summary>
        ESCAPE = 0x1B,
        ///<summary>
        ///IME convert
        ///</summary>
        CONVERT = 0x1C,
        ///<summary>
        ///IME nonconvert
        ///</summary>
        NONCONVERT = 0x1D,
        ///<summary>
        ///IME accept
        ///</summary>
        ACCEPT = 0x1E,
        ///<summary>
        ///IME mode change request
        ///</summary>
        MODECHANGE = 0x1F,
        ///<summary>
        ///SPACEBAR
        ///</summary>
        SPACE = 0x20,
        ///<summary>
        ///PAGE UP key
        ///</summary>
        PRIOR = 0x21,
        ///<summary>
        ///PAGE DOWN key
        ///</summary>
        NEXT = 0x22,
        ///<summary>
        ///END key
        ///</summary>
        END = 0x23,
        ///<summary>
        ///HOME key
        ///</summary>
        HOME = 0x24,
        ///<summary>
        ///LEFT ARROW key
        ///</summary>
        LEFT = 0x25,
        ///<summary>
        ///UP ARROW key
        ///</summary>
        UP = 0x26,
        ///<summary>
        ///RIGHT ARROW key
        ///</summary>
        RIGHT = 0x27,
        ///<summary>
        ///DOWN ARROW key
        ///</summary>
        DOWN = 0x28,
        ///<summary>
        ///SELECT key
        ///</summary>
        SELECT = 0x29,
        ///<summary>
        ///PRINT key
        ///</summary>
        PRINT = 0x2A,
        ///<summary>
        ///EXECUTE key
        ///</summary>
        EXECUTE = 0x2B,
        ///<summary>
        ///PRINT SCREEN key
        ///</summary>
        SNAPSHOT = 0x2C,
        ///<summary>
        ///INS key
        ///</summary>
        INSERT = 0x2D,
        ///<summary>
        ///DEL key
        ///</summary>
        DELETE = 0x2E,
        ///<summary>
        ///HELP key
        ///</summary>
        HELP = 0x2F,
        ///<summary>
        ///0 key
        ///</summary>
        KEY_0 = 0x30,
        ///<summary>
        ///1 key
        ///</summary>
        KEY_1 = 0x31,
        ///<summary>
        ///2 key
        ///</summary>
        KEY_2 = 0x32,
        ///<summary>
        ///3 key
        ///</summary>
        KEY_3 = 0x33,
        ///<summary>
        ///4 key
        ///</summary>
        KEY_4 = 0x34,
        ///<summary>
        ///5 key
        ///</summary>
        KEY_5 = 0x35,
        ///<summary>
        ///6 key
        ///</summary>
        KEY_6 = 0x36,
        ///<summary>
        ///7 key
        ///</summary>
        KEY_7 = 0x37,
        ///<summary>
        ///8 key
        ///</summary>
        KEY_8 = 0x38,
        ///<summary>
        ///9 key
        ///</summary>
        KEY_9 = 0x39,
        ///<summary>
        ///A key
        ///</summary>
        KEY_A = 0x41,
        ///<summary>
        ///B key
        ///</summary>
        KEY_B = 0x42,
        ///<summary>
        ///C key
        ///</summary>
        KEY_C = 0x43,
        ///<summary>
        ///D key
        ///</summary>
        KEY_D = 0x44,
        ///<summary>
        ///E key
        ///</summary>
        KEY_E = 0x45,
        ///<summary>
        ///F key
        ///</summary>
        KEY_F = 0x46,
        ///<summary>
        ///G key
        ///</summary>
        KEY_G = 0x47,
        ///<summary>
        ///H key
        ///</summary>
        KEY_H = 0x48,
        ///<summary>
        ///I key
        ///</summary>
        KEY_I = 0x49,
        ///<summary>
        ///J key
        ///</summary>
        KEY_J = 0x4A,
        ///<summary>
        ///K key
        ///</summary>
        KEY_K = 0x4B,
        ///<summary>
        ///L key
        ///</summary>
        KEY_L = 0x4C,
        ///<summary>
        ///M key
        ///</summary>
        KEY_M = 0x4D,
        ///<summary>
        ///N key
        ///</summary>
        KEY_N = 0x4E,
        ///<summary>
        ///O key
        ///</summary>
        KEY_O = 0x4F,
        ///<summary>
        ///P key
        ///</summary>
        KEY_P = 0x50,
        ///<summary>
        ///Q key
        ///</summary>
        KEY_Q = 0x51,
        ///<summary>
        ///R key
        ///</summary>
        KEY_R = 0x52,
        ///<summary>
        ///S key
        ///</summary>
        KEY_S = 0x53,
        ///<summary>
        ///T key
        ///</summary>
        KEY_T = 0x54,
        ///<summary>
        ///U key
        ///</summary>
        KEY_U = 0x55,
        ///<summary>
        ///V key
        ///</summary>
        KEY_V = 0x56,
        ///<summary>
        ///W key
        ///</summary>
        KEY_W = 0x57,
        ///<summary>
        ///X key
        ///</summary>
        KEY_X = 0x58,
        ///<summary>
        ///Y key
        ///</summary>
        KEY_Y = 0x59,
        ///<summary>
        ///Z key
        ///</summary>
        KEY_Z = 0x5A,
        ///<summary>
        ///Left Windows key (Microsoft Natural keyboard) 
        ///</summary>
        LWIN = 0x5B,
        ///<summary>
        ///Right Windows key (Natural keyboard)
        ///</summary>
        RWIN = 0x5C,
        ///<summary>
        ///Applications key (Natural keyboard)
        ///</summary>
        APPS = 0x5D,
        ///<summary>
        ///Computer Sleep key
        ///</summary>
        SLEEP = 0x5F,
        ///<summary>
        ///Numeric keypad 0 key
        ///</summary>
        NUMPAD0 = 0x60,
        ///<summary>
        ///Numeric keypad 1 key
        ///</summary>
        NUMPAD1 = 0x61,
        ///<summary>
        ///Numeric keypad 2 key
        ///</summary>
        NUMPAD2 = 0x62,
        ///<summary>
        ///Numeric keypad 3 key
        ///</summary>
        NUMPAD3 = 0x63,
        ///<summary>
        ///Numeric keypad 4 key
        ///</summary>
        NUMPAD4 = 0x64,
        ///<summary>
        ///Numeric keypad 5 key
        ///</summary>
        NUMPAD5 = 0x65,
        ///<summary>
        ///Numeric keypad 6 key
        ///</summary>
        NUMPAD6 = 0x66,
        ///<summary>
        ///Numeric keypad 7 key
        ///</summary>
        NUMPAD7 = 0x67,
        ///<summary>
        ///Numeric keypad 8 key
        ///</summary>
        NUMPAD8 = 0x68,
        ///<summary>
        ///Numeric keypad 9 key
        ///</summary>
        NUMPAD9 = 0x69,
        ///<summary>
        ///Multiply key
        ///</summary>
        MULTIPLY = 0x6A,
        ///<summary>
        ///Add key
        ///</summary>
        ADD = 0x6B,
        ///<summary>
        ///Separator key
        ///</summary>
        SEPARATOR = 0x6C,
        ///<summary>
        ///Subtract key
        ///</summary>
        SUBTRACT = 0x6D,
        ///<summary>
        ///Decimal key
        ///</summary>
        DECIMAL = 0x6E,
        ///<summary>
        ///Divide key
        ///</summary>
        DIVIDE = 0x6F,
        ///<summary>
        ///F1 key
        ///</summary>
        F1 = 0x70,
        ///<summary>
        ///F2 key
        ///</summary>
        F2 = 0x71,
        ///<summary>
        ///F3 key
        ///</summary>
        F3 = 0x72,
        ///<summary>
        ///F4 key
        ///</summary>
        F4 = 0x73,
        ///<summary>
        ///F5 key
        ///</summary>
        F5 = 0x74,
        ///<summary>
        ///F6 key
        ///</summary>
        F6 = 0x75,
        ///<summary>
        ///F7 key
        ///</summary>
        F7 = 0x76,
        ///<summary>
        ///F8 key
        ///</summary>
        F8 = 0x77,
        ///<summary>
        ///F9 key
        ///</summary>
        F9 = 0x78,
        ///<summary>
        ///F10 key
        ///</summary>
        F10 = 0x79,
        ///<summary>
        ///F11 key
        ///</summary>
        F11 = 0x7A,
        ///<summary>
        ///F12 key
        ///</summary>
        F12 = 0x7B,
        ///<summary>
        ///F13 key
        ///</summary>
        F13 = 0x7C,
        ///<summary>
        ///F14 key
        ///</summary>
        F14 = 0x7D,
        ///<summary>
        ///F15 key
        ///</summary>
        F15 = 0x7E,
        ///<summary>
        ///F16 key
        ///</summary>
        F16 = 0x7F,
        ///<summary>
        ///F17 key  
        ///</summary>
        F17 = 0x80,
        ///<summary>
        ///F18 key  
        ///</summary>
        F18 = 0x81,
        ///<summary>
        ///F19 key  
        ///</summary>
        F19 = 0x82,
        ///<summary>
        ///F20 key  
        ///</summary>
        F20 = 0x83,
        ///<summary>
        ///F21 key  
        ///</summary>
        F21 = 0x84,
        ///<summary>
        ///F22 key, (PPC only) Key used to lock device.
        ///</summary>
        F22 = 0x85,
        ///<summary>
        ///F23 key  
        ///</summary>
        F23 = 0x86,
        ///<summary>
        ///F24 key  
        ///</summary>
        F24 = 0x87,
        ///<summary>
        ///NUM LOCK key
        ///</summary>
        NUMLOCK = 0x90,
        ///<summary>
        ///SCROLL LOCK key
        ///</summary>
        SCROLL = 0x91,
        ///<summary>
        ///Left SHIFT key
        ///</summary>
        LSHIFT = 0xA0,
        ///<summary>
        ///Right SHIFT key
        ///</summary>
        RSHIFT = 0xA1,
        ///<summary>
        ///Left CONTROL key
        ///</summary>
        LCONTROL = 0xA2,
        ///<summary>
        ///Right CONTROL key
        ///</summary>
        RCONTROL = 0xA3,
        ///<summary>
        ///Left MENU key
        ///</summary>
        LMENU = 0xA4,
        ///<summary>
        ///Right MENU key
        ///</summary>
        RMENU = 0xA5,
        ///<summary>
        ///Windows 2000/XP: Browser Back key
        ///</summary>
        BROWSER_BACK = 0xA6,
        ///<summary>
        ///Windows 2000/XP: Browser Forward key
        ///</summary>
        BROWSER_FORWARD = 0xA7,
        ///<summary>
        ///Windows 2000/XP: Browser Refresh key
        ///</summary>
        BROWSER_REFRESH = 0xA8,
        ///<summary>
        ///Windows 2000/XP: Browser Stop key
        ///</summary>
        BROWSER_STOP = 0xA9,
        ///<summary>
        ///Windows 2000/XP: Browser Search key 
        ///</summary>
        BROWSER_SEARCH = 0xAA,
        ///<summary>
        ///Windows 2000/XP: Browser Favorites key
        ///</summary>
        BROWSER_FAVORITES = 0xAB,
        ///<summary>
        ///Windows 2000/XP: Browser Start and Home key
        ///</summary>
        BROWSER_HOME = 0xAC,
        ///<summary>
        ///Windows 2000/XP: Volume Mute key
        ///</summary>
        VOLUME_MUTE = 0xAD,
        ///<summary>
        ///Windows 2000/XP: Volume Down key
        ///</summary>
        VOLUME_DOWN = 0xAE,
        ///<summary>
        ///Windows 2000/XP: Volume Up key
        ///</summary>
        VOLUME_UP = 0xAF,
        ///<summary>
        ///Windows 2000/XP: Next Track key
        ///</summary>
        MEDIA_NEXT_TRACK = 0xB0,
        ///<summary>
        ///Windows 2000/XP: Previous Track key
        ///</summary>
        MEDIA_PREV_TRACK = 0xB1,
        ///<summary>
        ///Windows 2000/XP: Stop Media key
        ///</summary>
        MEDIA_STOP = 0xB2,
        ///<summary>
        ///Windows 2000/XP: Play/Pause Media key
        ///</summary>
        MEDIA_PLAY_PAUSE = 0xB3,
        ///<summary>
        ///Windows 2000/XP: Start Mail key
        ///</summary>
        LAUNCH_MAIL = 0xB4,
        ///<summary>
        ///Windows 2000/XP: Select Media key
        ///</summary>
        LAUNCH_MEDIA_SELECT = 0xB5,
        ///<summary>
        ///Windows 2000/XP: Start Application 1 key
        ///</summary>
        LAUNCH_APP1 = 0xB6,
        ///<summary>
        ///Windows 2000/XP: Start Application 2 key
        ///</summary>
        LAUNCH_APP2 = 0xB7,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_1 = 0xBA,
        ///<summary>
        ///Windows 2000/XP: For any country/region, the '+' key
        ///</summary>
        OEM_PLUS = 0xBB,
        ///<summary>
        ///Windows 2000/XP: For any country/region, the ',' key
        ///</summary>
        OEM_COMMA = 0xBC,
        ///<summary>
        ///Windows 2000/XP: For any country/region, the '-' key
        ///</summary>
        OEM_MINUS = 0xBD,
        ///<summary>
        ///Windows 2000/XP: For any country/region, the '.' key
        ///</summary>
        OEM_PERIOD = 0xBE,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_2 = 0xBF,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard. 
        ///</summary>
        OEM_3 = 0xC0,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard. 
        ///</summary>
        OEM_4 = 0xDB,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard. 
        ///</summary>
        OEM_5 = 0xDC,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard. 
        ///</summary>
        OEM_6 = 0xDD,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard. 
        ///</summary>
        OEM_7 = 0xDE,
        ///<summary>
        ///Used for miscellaneous characters; it can vary by keyboard.
        ///</summary>
        OEM_8 = 0xDF,
        ///<summary>
        ///Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
        ///</summary>
        OEM_102 = 0xE2,
        ///<summary>
        ///Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
        ///</summary>
        PROCESSKEY = 0xE5,
        ///<summary>
        ///Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes.
        ///The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information,
        ///see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
        ///</summary>
        PACKET = 0xE7,
        ///<summary>
        ///Attn key
        ///</summary>
        ATTN = 0xF6,
        ///<summary>
        ///CrSel key
        ///</summary>
        CRSEL = 0xF7,
        ///<summary>
        ///ExSel key
        ///</summary>
        EXSEL = 0xF8,
        ///<summary>
        ///Erase EOF key
        ///</summary>
        EREOF = 0xF9,
        ///<summary>
        ///Play key
        ///</summary>
        PLAY = 0xFA,
        ///<summary>
        ///Zoom key
        ///</summary>
        ZOOM = 0xFB,
        ///<summary>
        ///Reserved 
        ///</summary>
        NONAME = 0xFC,
        ///<summary>
        ///PA1 key
        ///</summary>
        PA1 = 0xFD,
        ///<summary>
        ///Clear key
        ///</summary>
        OEM_CLEAR = 0xFE
    }
    internal enum ScanCodeShort : short
    {
        LBUTTON = 0,
        RBUTTON = 0,
        CANCEL = 70,
        MBUTTON = 0,
        XBUTTON1 = 0,
        XBUTTON2 = 0,
        BACK = 14,
        TAB = 15,
        CLEAR = 76,
        RETURN = 28,
        SHIFT = 42,
        CONTROL = 29,
        MENU = 56,
        PAUSE = 0,
        CAPITAL = 58,
        KANA = 0,
        HANGUL = 0,
        JUNJA = 0,
        FINAL = 0,
        HANJA = 0,
        KANJI = 0,
        ESCAPE = 1,
        CONVERT = 0,
        NONCONVERT = 0,
        ACCEPT = 0,
        MODECHANGE = 0,
        SPACE = 57,
        PRIOR = 73,
        NEXT = 81,
        END = 79,
        HOME = 71,
        LEFT = 75,
        UP = 72,
        RIGHT = 77,
        DOWN = 80,
        SELECT = 0,
        PRINT = 0,
        EXECUTE = 0,
        SNAPSHOT = 84,
        INSERT = 82,
        DELETE = 83,
        HELP = 99,
        KEY_0 = 11,
        KEY_1 = 2,
        KEY_2 = 3,
        KEY_3 = 4,
        KEY_4 = 5,
        KEY_5 = 6,
        KEY_6 = 7,
        KEY_7 = 8,
        KEY_8 = 9,
        KEY_9 = 10,
        KEY_A = 30,
        KEY_B = 48,
        KEY_C = 46,
        KEY_D = 32,
        KEY_E = 18,
        KEY_F = 33,
        KEY_G = 34,
        KEY_H = 35,
        KEY_I = 23,
        KEY_J = 36,
        KEY_K = 37,
        KEY_L = 38,
        KEY_M = 50,
        KEY_N = 49,
        KEY_O = 24,
        KEY_P = 25,
        KEY_Q = 16,
        KEY_R = 19,
        KEY_S = 31,
        KEY_T = 20,
        KEY_U = 22,
        KEY_V = 47,
        KEY_W = 17,
        KEY_X = 45,
        KEY_Y = 21,
        KEY_Z = 44,
        LWIN = 91,
        RWIN = 92,
        APPS = 93,
        SLEEP = 95,
        NUMPAD0 = 82,
        NUMPAD1 = 79,
        NUMPAD2 = 80,
        NUMPAD3 = 81,
        NUMPAD4 = 75,
        NUMPAD5 = 76,
        NUMPAD6 = 77,
        NUMPAD7 = 71,
        NUMPAD8 = 72,
        NUMPAD9 = 73,
        MULTIPLY = 55,
        ADD = 78,
        SEPARATOR = 0,
        SUBTRACT = 74,
        DECIMAL = 83,
        DIVIDE = 53,
        F1 = 59,
        F2 = 60,
        F3 = 61,
        F4 = 62,
        F5 = 63,
        F6 = 64,
        F7 = 65,
        F8 = 66,
        F9 = 67,
        F10 = 68,
        F11 = 87,
        F12 = 88,
        F13 = 100,
        F14 = 101,
        F15 = 102,
        F16 = 103,
        F17 = 104,
        F18 = 105,
        F19 = 106,
        F20 = 107,
        F21 = 108,
        F22 = 109,
        F23 = 110,
        F24 = 118,
        NUMLOCK = 69,
        SCROLL = 70,
        LSHIFT = 42,
        RSHIFT = 54,
        LCONTROL = 29,
        RCONTROL = 29,
        LMENU = 56,
        RMENU = 56,
        BROWSER_BACK = 106,
        BROWSER_FORWARD = 105,
        BROWSER_REFRESH = 103,
        BROWSER_STOP = 104,
        BROWSER_SEARCH = 101,
        BROWSER_FAVORITES = 102,
        BROWSER_HOME = 50,
        VOLUME_MUTE = 32,
        VOLUME_DOWN = 46,
        VOLUME_UP = 48,
        MEDIA_NEXT_TRACK = 25,
        MEDIA_PREV_TRACK = 16,
        MEDIA_STOP = 36,
        MEDIA_PLAY_PAUSE = 34,
        LAUNCH_MAIL = 108,
        LAUNCH_MEDIA_SELECT = 109,
        LAUNCH_APP1 = 107,
        LAUNCH_APP2 = 33,
        OEM_1 = 39,
        OEM_PLUS = 13,
        OEM_COMMA = 51,
        OEM_MINUS = 12,
        OEM_PERIOD = 52,
        OEM_2 = 53,
        OEM_3 = 41,
        OEM_4 = 26,
        OEM_5 = 43,
        OEM_6 = 27,
        OEM_7 = 40,
        OEM_8 = 0,
        OEM_102 = 86,
        PROCESSKEY = 0,
        PACKET = 0,
        ATTN = 0,
        CRSEL = 0,
        EXSEL = 0,
        EREOF = 93,
        PLAY = 0,
        ZOOM = 98,
        NONAME = 0,
        PA1 = 0,
        OEM_CLEAR = 0,
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct HARDWAREINPUT
    {
        internal int uMsg;
        internal short wParamL;
        internal short wParamH;
    }

    }
    }
}

Leave a Comment

It’s good to know your math in life …

That’s a joke I heard today. No one can say if this really happened.

There was once a good math teacher with one weakness: he liked to eat a lot. He went into a restaurant and ordered two steaks with fries. When the time to pay came, the waitress asked for $29.95.

The teacher said that’s not the right total price. The waitress tried again and the result was $29.91.

The teacher said again that’s not the right total price. The waitress’s boss came and asked the teacher what would the right price be.

And the teacher said that he doesn’t know, all he knows is the price for two steaks with fries must be an even number :-D

 

And another one: a monk and his disciple talk on the top of a mountain. The monk says to the disciple that he should always remember the following: y equals a multiplied by x squared added with b multiplied by x added with c.

The disciple says he’ll do, but later on he realizes he cannot, so he comes back to the monk, asking what does that mean. And the monk says that that’s a parable :-)

Leave a Comment

Disk cloning tool

A few months ago we’ve received new SSD drives (all developers were crying as hard as possible to get them, as some of them had a really hard time using Visual Studio ReSharper on large solutions; my idea has always been that we could get by with some Cheetah drives or some SCSI drives, but the final democratic decision was to go for SSD-s instead).

Now, some developers decided they’ll use this opportunity to clean up their systems and have some fun installing everything new.

For me, that’s too hard now (fifteen years ago, that was one of my ways of having fun, but not anymore :-) So I’ve looked up a good disk cloning tool.

I’ve settled for the EaseUs tool http://www.easeus.com/disk-copy/home-edition/ and I recommend it for anybody with a similar task. It worked perfectly.

1 Comment

iSamsung

I finally managed to replace my old Philips 768 mobile. It was a good phone, however it got to the point where the screen was unreadable due to the dust entering between the actual LCD panel and the protective screen and one could not type anything on it, as the Backspace key was broken. I’ll probably think the same way about my car, when I’ll finally replace it. Not too soon, I’m afraid, as cars are freaking expensive in Europe, in general, and even more in Romania, where the VAT rate is 24% and the buyer may have to pay some additional fees as well.
I have two mobile numbers, one “business”, paid by the company, and one “family”, that I pay and I’m glad I do: it’s provided by DigiMobil and it offers a huge value for its price (I have three free ZTE mobiles, with free unlimited calls in the DigiMobil and Romtelecom networks, low cost mobile Internet access, video calls and many free-for-subscriber wireless hotspots).
For a good few years I had to carry with me the tiny Philips and the small ZTE in the same jeans pocket, and it was hard. Now, while shopping for the new phone, I decided I wanted a dual SIM with 3G capabilities. I settled for a Samsung Galaxy Pocket Duos and I do not regret my choice.
It took me a few good days to understand how to use it, but now I have a good tool in my hands.
Let’s see the configuration and the use cases:

  • SIM 1: DigiMobil, for family use, voice and Internet access
  • SIM 2: Orange, for business use, voice and secondary Internet network

The only caveat here is you have to select the active SIM before making a call; if you call a person using a shortcut, the call is serviced by the active SIM and you do not have the possibility to choose the mobile network provider.
Also, even in the dialing screen there’s a chance that you won’t have the possibility to select which mobile network provider to use, as the interface gets in your way.
Also, when configuring the phone for mobile Internet access, you may have to disable one SIM altogether, otherwise the phone won’t let you work with the configuration settings for the other SIM (it simply disables the UI). Once the settings are in place and the phone can access the Internet using one SIM, you can activate the other one.
I like the fact I can connect to wireless networks, as I can browse the Internet at high speed and no additional costs while sitting in bed (I connect to my wireless router). I usually do this in the evening, when the TV program is boring; there are so many funny movies on YouTube :-)
Yesterday I understood the power of A-GPS: I was inside a big store and the phone was able to properly pinpoint my location (my GPS device has never been able to work indoors, for example).
Another caveat here, though: keep wireless and GPS usage to a minimum; activate them only when you’ll use them, otherwise your battery will quickly drain.
I’ve tried to play some games on the phone, however the screen is too small for that. I’ve tried MyCountry, Where’s My Water, Angry Birds and Cut the Rope, and they all assume they’ll be played on a larger screen. However, that doesn’t bother me. I have other ways to spend some free time. What bothers me is the fact that I cannot do anything normal from a web page. I can view data, that’s true, but I can’t edit it. When I’ve discussed this with my manager, he laughed and he said he was not able to do anything using his iPhone, either, and, if we want to manage our data while on the road, we’ll probably have to buy tablets. That would be good, but let me make some money first :-)
I can use Skype, and that’s a strong point. One has to run some tests, though, because the call quality may greatly suffer (it happened to me last week, when I’ve called a customer in US: the call was so bad that I had to use text to ask him to wait for me and then I’ve rushed home, to use Skype from my PC).
I like the fact the phone is small and light: it matches my palm and it readily fits into my pocket. The plastic case is of good quality and the screen seems all right as well.
I really like the voice recognition feature (I do not know if it’s available on all Androids or Samsung improved it): it is able to recognize both Romanian and English, and it is very accurate.

One of my customers is calling me a lot today, I have to stop writing this post and move to other tasks …

, , ,

Leave a Comment

Grüsse aus der Schweiz (part III)

And now, we can show the customer how good developers we are!
It works!
The software worked all right, one of the doctors in charge in the lab congratulated us and told lady M. they’ll buy one Sakura printer and they’ll also purchase the slides and the other accessories from Sysmex Switzerland.
Lady M. was happy: she has finally closed the deal, getting a beach head both in that particular lab and in the Sakura business.
Unfortunately the head of the lab had a few questions and a few ideas and we left that lab too late to be able to visit another customer, with a similar project. So we’ve returned to Zürich, now knowing I’d be able to visit the town and enjoy all good aspects of the trip.
I’ve checked in again at the Best Western hotel and got another room, again small but lovely. I really liked the the windows: two walls were fully windowed from around 1.2 m to the ceiling, giving an extremely good view.
So I snacked something, I’ve made myself some good chamomile tea and worked on some project I had waiting in the line.
Around 6 PM lady M. got me by car and we drove downtown. Funny thing, we got stuck in traffic, even there are some really wide highways. There was no rush and lady M’s car is on automatic, so we actually took the time to discuss some other stuff. She told me a few things about Zürich history and buildings and in the end we’ve arrived to a good parking spot.
I wanted to do some shopping first. Funny: all clothes stores offer only clothes made in Turkey! So I’ve tried as hard as possible to lookup something really good and nice and in the end got two tops for my significant other, that were on sale.
Zürich downtown is nice and cozy and one can take a good stroll visiting the old buildings, the queues of the river Limmat and the lake Zürich.
The town hosts the clock with the largest face in Europe: it’s 8.7 m in diameter! At that moment it didn’t look that large, I thought it should be around 1.7 m…
We’ve closed the evening by having good dinner in a restaurant with indians waiters speaking bad English (go figure!), a few glasses of wine and talking about cats (lady M. had a few lovely cats, too bad they died).
And back to the hotel, getting ready to come home! Well, my health estate kicked in: I’ve got a terrible headache and I was not able to sleep. The movies over the Internet and the movies on TV kept me busy for a while, but not too much. Boy, was I happy when the time to leave for the airport came!
I made sure I’ve packed everything, including all receipts and jumped in the hotel shuttle. It was cold and I was feeling really sick, without energy and unable to control my body’s temperature. As a side note, that’s why I avoid traveling and that’s why I miss a certain set of business opportunities. Maybe one day …
In the airport all my smartness systems shut down: I had to ask a lady to help me with the check in at one of the self check-in machines.
Then a long wait came until the passengers started to embark in the aircraft. My smartness systems were still down: somewhere in my mind I was thinking I have to go to gate E96, while the actual gate was E97. So when people started to embark for my flight, I was still in hibernate mode. As usual, somewhere in my mind a good thought kicked in, I’ve checked my ticket, I’ve checked the screens at the gate, I’ve jumped through the gate and here I am: at the tail of the plane!
The lady helping me with the check-in had a really good idea: she got me a window seat, and there was an empty seat between myself and the other passenger on that seats row. So I’ve wrapped myself in my winter coat and curled as much as possible, trying to get some sleep.
Boy, was I not expecting what was to come for me!
The aircraft took off nicely and we’ve moved over the Alps. And here comes my biggest surprise ever: I’m not immune to airplane sickness! The aircraft met turbulence and it started to shake like it was about to go down any minute, and the content of my stomach (thank goodness, only a coffee and a cereal bar) decided to knock at the wrong door of my stomach. I’ve kept the sickness bag in one hand for about 20 minutes, until everything settled down. Good, my stomach decided it was able to keep everything inside, so the bag was not needed, but I was feeling really sick nonetheless.
Things improved a bit once we’ve arrived in Vienna, but my smartness systems were still down! The ticket said my connection was at 10:30, my mobile was showing 09:10 and the computer in my mind kept transforming the Zürich time into EET and reporting “you have 20 minutes to get into that flight!”. So I’ve rushed through the airport, through the security checks, only to stare at an oddly empty boarding area … with a watch saying “09:20″ (if you do not know already, Zürich and Vienna are both CET; myself, I’ve learned that information the hard way :-) .
I didn’t want to go through the security checks again, so I’ve looked up a spot where I could plug in my unfaithful, batteryless laptop.
Go figure, Vienna airport has the power sockets in such locations that people have to step over your power cable. If I were in a Romanian train station, that cable would have been broken to pieces in 5 minutes by the passengers, but luckily I was in an airport in Austria, so people kept jumping over that cable without any wise cracks. I was able to do some easy work that morning until we’ve finally embarked for Iasi.
The flight was an usual one, only this time it was my head that was hurting a lot and not my ears.
In Iasi I’ve quickly passed through papers control, jumped into the first taxi and got home, where my dog was impatiently waiting for me. I heard it barking the moment I’ve got off the taxi :-D
So, finally at home, tired and with a terrible headache. I’ve announced my boss I’m not able to come at work and then took a really good shower and took a really good nap.
And that’s it. I’d like to be able to put all that information in a good and amusing traveling book, where each aspect of the travel would be separately described: travel, hotels, food, people in general, infrastructure, prices, shopping, women, business … Maybe some day.

,

1 Comment

Follow

Get every new post delivered to your Inbox.