Edit password protected MS Word document

Some Microsoft Word document has editing restrictions, which is protected by password. If you want to edit the content of the document, you need the password.

Protect Word document
Protect Word document
Password protected
Password protected

What you need to do is to save the document as html format

Save as html
Save as html

 

Open html by using Notepad and delete the password inside of <w:UnprotectPassword> section.

Remove password protection
Remove password protection

Re-open the document by using MS Word. You can freely edit the Word document without inputting any password.

 

2011 Australasian Gaming Expo (AGE) at Darling Harbour

Australasian Gaming Expo (AGE) is one of the largest gaming exhibitions in the world. This year it’s from 21 August to 23 August at Sydney Convention and Exhibition Centre.
AGE entrance

AGE extrance
AGE extrance

Aristocrat show stand

Aristocrat show stand
Aristocrat show stand
Aristocrat poker machine
Aristocrat poker machine

IGT new game theme – Sex and the City

IGT new game theme
IGT new game theme

Konami show stand

Konami show stand
Konami show stand

Shuffle Master show stand

Shuffle Master show stand
Shuffle Master show stand

AGT show stand

AGT show stand
AGT show stand

Cyclic Redundancy Check (CRC) in C#

Microsoft .Net Framework is so powerful, and it provides so many common libraries to use. However, recently I am working on a legacy project to work out CRC32, and I can find no where. OK, I have to DIY. If you need it by chance, here are the source code.

/// 
/// Calculates a 32bit Cyclic Redundancy Checksum (CRC) using the
/// same polynomial used by Zip.
/// 
public class CRC32 : HashAlgorithm
{

    private static readonly UInt32[] crc32Table =
    {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
	0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
	0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
	0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
	0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
	0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
	0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
	0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
	0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
	0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
	0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
	0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
	0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
	0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
	0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
	0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
	0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
	0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
	0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
	0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
	0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
	0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
	0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
	0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
	0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
	0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
	0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
	0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
	0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
	0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
	0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
	0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
	0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
	0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
	0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
	0x2d02ef8d
    };

    private UInt32 hash;
    private UInt32 seed;
    private const UInt32 DefaultSeed = 0xffffffff;

    /// 
    /// Construct an instance of the CRC32 class, pre-initialising the table
    /// for speed of lookup.
    /// 
    public CRC32()
    {
        this.seed = DefaultSeed;
        Initialize();
    }

    public override int HashSize
    {
        get
        {
            return 32;
        }
    }

    public CRC32(UInt32 seed)
    {
        this.seed = seed;
        Initialize();
    }

    protected override byte[] HashFinal()
    {
        hash = ~hash;
        this.HashValue = new byte[] {
						(byte)((hash>>24) & 0xff),
						(byte)((hash>>16) & 0xff),
						(byte)((hash>>8) & 0xff),
						(byte)(hash & 0xff)
						};
        return HashValue;
    }

    protected override void HashCore(byte[] buffer, int start, int length)
    {
        for (int i = start; i>8) 
                          ^ crc32Table[(buffer[i]) ^ ((hash) & 0x000000FF)];
            }
        }
    }

    public override void Initialize()
    {
        hash = seed;
    }
}

Let’s go skiing this snow season!

Last weekend, we drove almost 500km from Sydney to Thredbo.

Sydney to Snowy Montain
Sydney to Snowy Montain

Friday night, it was freezing and the temperature drops to -5°. We left few bottles outside. Saturday morning, they all iced up. Saturday was sunny but cold. The cold weather still can not stop our passion.

From top of the mountain

Ski is fun but dangerous. I saw at least two people was sent to the hospital by ambulance. My ski pole was also broken.

Domino’s Pizza $5.95 mobile ordering site exploit

Domino’s Pizza has new mobile ordering site, and any value or traditional pizza only $5.95 each pick up.
This deal is for mobile user only. It will re-direct non-mobile user to normal online ordering site, and the price jumps up to $7.95.

From technical perceptive, how does Domino’s server determine a mobile user? Normally a web request contains “User-Agent” to help web server tell who is visiting. This is a typical example of web request. If we change the “User-Agent” content, we can cheat domino’s web server and order $5.95 pizza.

GET / HTTP/1.1
Host: www.dominos.com.au
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive

OK, let’s do it!

  1. Download user agent switcher for your Firefox and install.
  2. Change user agent to iPhone
  3. Star ordering from http://dominos.com.au/mobile.aspx and enjoy $5.95 pizza

 

Lane Cove National Park

After three weeks continuous raining, finally it’s a sunny weekend. We can step outdoors for a small winter trip to enjoy the long waiting sun shine.

We are begin with Riverside walking track for a short bush walk.

Few weeks raining makes Lane Cove river overflow.

Ducks like swimming.

Zipping the download files on the fly ASP.Net (real-time zip and download file from server)

I am currently working on an ASP.Net web project, which allows client to download a well structured submission package. Due to security reason, web server can not create folder and write file on client side. Web server can generate a well structured zipped file and push to the client.

There could be two ways to achieve that;

Fist way:

  1. Create folders and copy files into each folder
  2. Use 3rd party tool, eg winrar, 7zip to zip the whole folder to one zipped file
  3. Send back download web address, and let client download the zipped file

If the zipped file is small and web server is powerful enough, client won’t feel any delay. However if the file is big, client side will get no any response until zip file is ready. We can put similar message, eg “Please wait… ”. But client side still don’t know how long would take. If zip file is not ready within time out period, server will get reset. This is a really awful user experience.

Second way:

  1. Create folder and zip the files on the fly (on web server’s memory)
  2. Send back zipped stream to client through Response
  3. Client download  zipping file one by one

Client can clearly feel the progress of downloading.

Here is the code for 2nd solution:

//prepare response header
Response.Clear();
//set Response Content Type
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment; filename=Download.zip");
ZipOutputStream zipOutput = new ZipOutputStream(Response.OutputStream);
try
{
            zipOutput.IsStreamOwner = false;
            //set compress level
            zipOutput.SetLevel(9);

            ArrayList fileList = functions.GetFileList();
            foreach (string fileName in fileList)
            {
                string folderName = "folder1" + @"";

                zipEntry = new ZipEntry(folderName + fileName);
                zipOutput.PutNextEntry(zipEntry);
                            
                byte[] file = functions.GetFile(fileName);
                //zip file
                zipOutput.Write(file, 0, file.Length);
                 //send to client for downloading
                Response.Flush();
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
        finally
        {
            zipOutput.Finish();
            zipOutput.Close();
            Response.End();
        }

CeBIT Australia at Sydney Darling Harbour

CeBIT is the world’s largest and most international computer expo, and is a traditional computer show held every year. As it grows quickly, CeBIT Australia becomes bigger and bigger. Lots of IT equipment suppliers join this trade show, eg DELL, Samsung, Hitachi, D-Link, etc. This year, CeBIT 2011 starts yesterday and is held for 3 days.

Samsung huge LCD display and show stand

D-Link and its Ethernet router

NEC and DELL

Motorola

Pronto software

CSRIO is displaying their 3D detect system

Waterproof LCD monitor

Other stands

 

 

The only disappointing is  no world-wide largest IT manufacture, eg IBM, Intel, NVidia. I didn’t see many emerging technologies.

Woolworth Everyday Reward promotion activation link

If  you have registered Woolworth Everyday Rewards Card, sometimes it will send you their weekly promotion email. If you active the offer, it will credit you either fuel saving offer or Qantas bonus points when your shopping spend is over certain amount.

My friend is always receiving such email but I didn’t. Are they randomly picking up some valued customer or targeting someone? I don’t know, but I just want to be treated fairly same as others. Let’s make my own promotion offer.

Here is a example of activation link in their recent promotion email:

http://everydaypromos.com.au/wowactivation/23625.do?email=[email protected]&everyDayRewardsNo=9344435941223&formForward=LOAD

  • The first 23625 is event ID, and it increment for each promotion event by one.
  • 9344435941223 is your Everyday Reward Card number

If you can replace the above parameters with your own one, and copy&paste into your web browser, you also can enjoy Woolworth’s promotion.

I also wrote a small tool and you can download here. Please ensure .Net Framework is installed on your computer.