Prof. Walter Lewin’s Video Lectures on Physics

Prof. Walter Lewin is a Professor Emeritus of Physics at the MIT. He is famous for the interesting physics video lectures freely available on the internet. These lectures has been used by more than four million students and teachers all over the world. Walter Lewin Lectures on Physics takes you through classical mechanics, electricity and magnetism and vibration and waves.

Prof. Lewin says:

If the student says I find physics boring and dull it’s simply means one thing that they had a bad teacher. Any good teacher can turn physics into something absolutely spectacular.

Prof. Lewin takes these lectures to a whole new level. He has prepared around 600 physics demonstration for 100 lectures. He presents the concepts along with the its live demonstrations. Demonstrations are very important, students enjoy it and help them to learn easily.

A lot of hard work and preparations goes into delivering the single one hour lecture. For every lecture he gives takes about 40 hours to prepare. He rehearses three times in real-time with an empty class and writes on board whatever he has to write during the the lecture. Giving a dry run of the same lecture three times is really hard. He also has to take all sort of measures to have safe demonstrations. He would try his best to make experiments interesting, he would hang to a pendulum and explain that time period is independent of mass. At times, he would put his life on the line by demonstrating his faith in the Conservation of Mechanical Energy.

I have enjoyed watching these lecture. I first came to know about these in early 2006 during my fourth year at IIT Kanpur. I thank my friend Deepak Sachan for introducing these great lectures to me.

I suggest do watch these lectures if you are a physics enthusiast. These are definitely beneficial for high school and undergraduate students. I definitely recommend these video lectures for IIT-JEE preparation. Every physics teacher should also watch these.

Link to the video lectures on MIT OpenCourseWare:

Here is a short interview with Prof. Lewin:

Logitech Wireless Desktop MK 250 Review

logitech-wireless-desktopIt has been getting difficult to work for long hours on laptop’s keyboard. So I decided to buy a wireless keyboard and mouse for my laptop.

After searching a little over net I found Logitech Wireless Desktop MK250 a very good option. I could easily find it in the market also. It cost me Rs 1150 in Delhi.

I found it very easy to setup. It was literally plug and play. Just hook the USB receiver in laptop and right away start using the keyboard and mouse. No driver installation or any kind of configuration is required. I tried it on Windows XP and Ubuntu.

The package contains:

  • Keyboard
  • Mouse
  • USB receiver
  • 1 AA and 2 AAA batteries (pre-installed in the device)
  • Troubleshooting card

I was surprised to find the batteries also :)

Here is my take on it:

Pros:

  • Very good battery life: 15 months of keyboard and 6 months for mouse
  • Great range, they claim 10 meter and I confirm 5 meter (~15 feet). Therefore it is suitable for HTPC also.
  • Great value for money.
  • No setup or configuration required. Truly plug-n-play!
  • Works with Linux. I tried on Ubuntu.

Cons:

  • The placement of Home and End keys is different from the earlier one I used.
  • No support of Logitech Unifying Receiver.
  • The size of USB receiver is big. If it could have been made like the Logitech Unifying Receiver one could just plug it and forget. With the big size, I have to remove the USB receiver while carrying the laptop in bag.

Rooting Android

Lately, I rooted my Android device. My main purpose was to tether phone-internet to my laptop. All the the tethering Apps required rooted kernel. I had no choice but to root my phone.

A little googling led me to a very nice and step-by-step guide for rooting Samsung Galaxy Spica i5700. Following the same I was able to successfully root my phone without any glitches.

Rooting will not format your phone. Everything will remain intact, your files, Apps installed, Apps data, SD card data etc. The idea behind rooting is that kernel is changed to a modified one. The modified kernel enables to run certain Apps with the root permissions and let your phone do stuff which requires super user permissions.

The image, LK2.08, which I used contains the modified kernel and a couple of Apps, e.g., SuperuserApp and Wireless Tether. LK2.08 is built by LeshaK from the modified kernel sources of Samsung Spica. You can look at the modification in the GitHub repository.

I will try understand the kernel modifications, see the internals and technical details of rooting and post something in future.

How URL Shortening Works

Daily, we come across a number of short URLs while surfing web. A short URL redirects to another URL (usually a long URL). For example, the URL http://manjeetdahiya.com/2010/10/21/introduction-to-app-inventor-for-android/ can be shortened to http://bit.ly/fmUP2Q using bit.ly. The short URL will just redirect to the long one.

There are many URL Shortening services available, e.g., bit.ly, tinyurl and the latest one goo.gl by Google. Have you ever wondered how the URL shortening works? This article will take you through the concepts behind URL shortening. I will touch upon only the high level details and will not discuss any of the implementation stuff.

Understanding Short URL

If you look at a short URL, it consists of a domain and a key:

http://bit.ly/fmUP2Q
Domain =
bit.ly
Key =
fmUP2Q

The key is different for each long URL. Based on the key the server redirects to the respective long URL.

How does it really works?

Let us take example.com as the domain of the service provider for explaining purpose. Here example.com is equivalent of tinyurl.com, bit.ly, goo.gl etc.

The service provider, example.com, maintains a map of keys and URLs in the database. Where key is a positive integer and URL is just a string. The map looks like:

  • [0, url0]
  • [1, url1]
  • [2, url2]

Where url0, url1, url2… are the long URLs. The integer is unique and always incremented when a new short URL is created. It can be made sure before creating a new short URL, if a long URL already exists in the database then don’t add it again and use the same short key.

On opening the short URL=http://example.com/key in the browser, the request goes to the server example.com with the key. The server checks the key in the map and redirects to respective long URL. For example:

  • example.com/0 -> url0
  • example.com/1 -> url1
  • example.com/2 -> url2

This is one of the techniques which can be used to implement a simple URL Shortening service.

I don’t see keys as alpha-numeric

Usually, we don’t see integers as the keys. All the services use alpha-numeric string as the key. The reason behind this is that on can accommodate more keys without increasing the length of key.

base10
[01234567890]
base62
[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]

For a key length of 6: base10 can have 10^6 keys and base 62 can have 62^6 keys.

Using base62 in the above mentioned technique is not difficult to implement. Keep the same database. Store integers itself in the database. The server will get requests as key in base62 and you will have to convert base62 key to base10 before finding the corresponding long URL in the database and then redirect to the long URL.

Introduction to App Inventor for Android

App Inventor for Android is a tool for creating applications for Android platform. But it is different. It doesn’t require you to write code to develop an application.

Usually, application development involves programming and in case of Android one has to program in Java. This tool, App Inventor, on the other hand doesn’t require you to program. Using this tool you can create applications for Android without writing a line of code!

How can an app be created without writing the code? The answer lies in another question: What does the code do in an app?

The code does two things:

  1. Defining components i.e. defining things like widget, Button, Label, TinyDB, screen arrangement, notifications etc. Components can also be called objects or instances.
  2. Defining and controlling the behavior of these defined components.

App Inventor achieves the above two objectives without any programming. In App Inventor you can define the components and their behavior visually through a user interface.

App Inventor has a Designer and a Blocks Editor. The Designer defines all sorts of components and the Blocks Editor defines the behavior of these components.

Let me quickly take you through the Setup Process and the Development Environment of App Inventor.

Setup Process

The App Inventor is a web-based tool and works on all major browsers. Therefore the setup is very minimal. Following are the basic requirements for running App Inventor:

  • Contemporary operating systems and browsers.
  • Java Run Time Environment 1.6 (i.e. Java 6).
  • App Inventor Extras Software: Installer/Package is available on the home page of App Inventor. One can easily download and install it.
  • USB Connectivity with USB Debugging enabled: The setup requires you to have USB Debugging enabled in your phone and a working USB connectivity. To achieve the same you need to install drivers for your phone. The Extras Software package includes drivers of a few common Android devices and after installing the same you might not need to install the drivers manually. If this doesn’t work, you can manually install the drivers by using the CD you got along with your phone.

I found the setup pretty easy. I was able to get App Inventor working very quickly.

After completing the setup you can quickly test your setup. Create an empty project and then clicking the Connect to Phone from the Blocks Editor should launch the stub application on your phone.

Development Environment

It has two parts Designer and Blocks Editor. Designer defines the look and feel of your application. You can drag and drop the objects (buttons, textBox, media, sensors etc) from the palette to the screen and arrange them as desired. All this is done visually.

App Inventor Designer Window

 

After completing the design you can open the Blocks Editor from the Designer. In the Blocks Editor window you can define the behavior of the components which you added previously. In this window, you will have various types of Blocks associated with the components e.g. OrientationChanged-block of OrientationSensor-component, the block where you can do call your other blocks to get the notification when the orientation changes.

App Inventor Blocks Editor

This was a quick introduction of App Inventor. And in the next part of this post I will explain how to create a simple application for Android using the App Inventor.

Debugging Console for GuiClient/QXmpp

QXmpp repository contains many examples. One of them, GuiClient, is a full-fledged graphical XMPP client. I developed it for testing out the functionality and usability of the QXmpp API. This example supports most of the XEPs (XMPP Extension Protocols) supported by QXmpp.

To ease up the debugging, I have added a console dialog to display all the sent/received stanzas. Have a look at the Debugging Console.

 

qxmpp-debugging-console

Debugging Console

 

  • Settings button can be used to launch this dialog.
  • User can control the logging by using the Enable Check Box.
  • Sent and Received messages are color coded to differentiate between these.
  • The Clear button clears the text area.

Got Invitation of App Inventor for Android

Yesterday, I got the invitation to try the pre-release of App Inventor for Android. App Inventor is a tool which allows users without any programming skills to create applications for Android platform. Instead of writing the code, one has to visually design the user interface and create blocks to control the behavior of the application.

I will try it out and create something using the App Inventor. Wait for my next post for the review or may be a tutorial.

More about App Inventor from the team:

Welcome to App Inventor!

About App Inventor:
App Inventor for Android allows people with minimal programming experience to create simple, personal apps for Android devices. It has a number of features which ease app development. App Inventor is best suited for people who are eager to learn the basics of programming and are interested in making basic apps for their personal use.
Remember the Beta Tag:
App Inventor is currently available as an invitation-based beta product. We are limiting access in order to ensure that our systems can handle the load. As a beta product App Inventor still has rough edges and missing features. In some cases the rough edges include un-pleasantries such as: installing Windows device drivers, installing Java on your computer, and fiddling with settings on your phone. We are working hard to smooth out the rough edges and we appreciate your use of App Inventor while we are in this beta state. It may sound a bit cliche but it really is true, your use of App Inventor today will help us make it better for the future! Now on to the good stuff.
Getting Started with App Inventor:

Complete these 3 steps to start using App Inventor:
  1. Set up your phone and computer.
  2. Connect your phone to your computer.
  3. Complete the basic tutorials.
Take your App Inventor knowledge to the next level by:
Happy Inventing!
Google’s App Inventor Team

Implementing XOR Encryption

At times, you need a simple encryption and decryption functionality to secure sensitive information. In my case, I needed to store passwords on disk to implement the “Remember Password” functionality of the GuiClient example of QXmpp.

Instead of going for a 3rd party library where you just need a very basic crypto functionality I will suggest using XOR encryption. XOR encryption is pretty easy to implement. I will also present my implementation of this algorithm using Qt C++.

XOR (Exclusive OR) Encryption or XOR Cipher is a simple symmetric encryption algorithm. It operates according the principle that XORing a data twice with the same key results in the same data.

The first XOR of the data and key gives the encrypted data. Then the decryption involves XORing the encrypted data with the same key.

EncryptedData  = Data ^ Key
Data =  EncryptedData ^ Key

Data: data to be encrypted
Key: secret key or password
EncryptedData: data after encryption
^ represents Exclusive-OR (XOR) operation

Example:

Let us use two binary numbers for Data and Key. The 

Data  = 01101
Key   = 10101

Encrypt:

EncryptedData = Data ^ Key
EncryptedData = 01101 ^ 10101
EncryptedData = 11000

Decrypt:

Data = EncryptedData ^ Key
Data = 11000 ^ 10101
Data = 01101

Implementation of XOR Encryption in Qt C++:

QByteArray calculateXor(const QByteArray& data, const QByteArray& key)
{
 if(key.isEmpty())
   return data;

 QByteArray result;
 for(int i = 0 , j = 0; i < data.length(); ++i , ++j)
 {
   if(j == key.length())
     j = 0;// repeat the key if key.length() < data.length()
   result.append(data.at(i) ^ key.at(j));
 }
 return result;
}

Queen's Baton Relay in CWG 2010

Queen's Baton and Penguins

Following the tradition of Commonwealth Games. The 2010 Queen’s Baton Relay commenced on Oct 29, 2009 at Buckingham Palace. The Baton covered a distance in excess of 190,000 Kms in 340 days. It traveled 70 nations in 240 days and reached India on June 25, 2010 through Wagah Border from Pakistan.

After covering all the states of India in 100 days and traveling 20,000 Kms it finally arrived at its penultimate destination Gurgaon.

I was very excited to know that 2010 Queen’s Baton, after traveling all over the world and bearing a great traditional value also covered the street next to my home. Fortunately, my parents and nephews watched the mega event and became a part of it.

The Baton has now headed for Jawaharlal Nehru Stadium, Delhi to conclude at the opening ceremony on Oct 3, 2010. Where the message contained in the Baton will be read aloud to officially open the 2010 Commonwealth Games.

Facts about the 2010 Queen’s Baton:

  • Inbuilt camera and voice recorder.
  • GPS enabled to track its location.
  • It has LEDs which displays colors of the flag of the current country.
  • SMS capability.
  • It is the longest relay in the history traveling 71 countries, covering 1,90,000 Kms in 340 days.
  • The Queen’s Baton 2010 Delhi is created using processes and technologies existing in India by Michael Foley of National Institute of Design, in partnership with Titan Industries and a technology consortium led by BEL.

Baton Tracks in World Map

71 Nations – 190,000 Kms – 340 days

World Map of Baton Tracks

Baton Tracks in India Map

28 states & 7 UTs – 20,000 Kms – 100 days

India Map of Baton Tracks


Serving HTML Documentation from Google Code / SVN

I found a nice way of hosting documentation on Google Code. Google Code can be easily setup to host HTML Documentation generated from Doxygen, Javadoc, RDoc etc.

It is always good to have an online documentation of a project. Everyone can refer to it on web. Developers can easily direct to any piece (class, function etc) of the documentation by using the respective link in their communication.

The documentation and the project together should be hosted at the same location. Having two piece solution, one for project and other for documentation result in a poor usability experience for developers and users. One URL to the project and everything (Issue tracker, Wiki, Revision control, Downloads and Documentation) lying there sounds great!

Google Code doesn’t provide explicit hosting for the documentation. Using the method described in this article completes the project hosting on Google Code by providing a way to serve HTML from it.

I have been using this method for my project QXmpp since 0.2.0 release. Have a look at the outcome:

The key idea behind this solution is that Subversion (svn) can render the HTML/CSS files if proper mime-type of the files have been set. In Google Code when you view the raw file, SVN will use its mime-type to render it accordingly.

  • URL to view raw files under svn: http://qxmpp.googlecode.com/svn/
  • URL of the documentation: http://qxmpp.googlecode.com/svn/doc/HEAD/html/index.html

The mime-type should be set correctly. In my case, doxygen generates following type of files:

  • *.css  = svn:mime-type=text/css
  • *.html = svn:mime-type=text/html
  • *.js   = svn:mime-type=text/javascript
  • *.gif  = svn:mime-type=image/gif
  • *.png  = svn:mime-type=image/png

The auto-props feature of SVN can be used to set the mime-types automatically. Once auto-props things are defined in the SVN client config file, the client will automatically set the mime-types.

You can see that the documentation files are stored under SVN. Therefore the documentation inherently gets version control. The documentation gets versioned the way source code is tagged/versioned. You can host documentation for all the versions of your project. For example the documentation of 0.2.0 release and the bleeding-edge SVN HEAD QXmpp-0.2.0 and QXmpp-HEAD.

Steps to serve documentation from Google Code Subversion:

  1. Generate the documentation locally.
  2. Assign the correct svn:mime-type as per the file extension. This step is not required if you are using auto-props feature of SVN.
  3. Check in the documentation files at the desired path.
  4. Load the path to documentation in your browser to see the outcome. The path should be like http://[project-name].googlecode.com/svn/[svn-path]
  5. Create a script and add an entry of it in the crontab/scheduler to automate it.

Advice:

  • Use auto-props
  • Choose the path of doc outside of trunk to keep your ohloh stats clean and other developers happy.
  • Update the documentation daily for the HEAD version.

I will conclude and mention that it is good to have a documentation. The documentation should be served from the project hosting site itself to have a one piece solution and better user experience. This method of serving documentation can be used until Google comes up with an explicit solution. The versioning of the documentation is automatically done. You get documentation of all the versions of your software.

References: