Git Tutorial : Starting with git using just 10 commands August 13, 2008
Posted by xk0der (aka Amit Singh) in : Programming and software development, Tips and tricks , 12commentsGit is marvelous piece of tool every programmer must have. Git is a distributed version control system developed by Linus and others. Yes you guessed it, it is used heavily by the Linux (kernel) developers apart from many other projects.
How will Git help you and what this post covers.
Scope of this post : This post will deal with the usage of Git by an individual developer only.
Why use version control : Version control gives you a great deal of flexibility while coding. You can make changes without having to worry about breaking things, as you can always move back to previous version(s) of your code. Version control also allows you to compare changes as you move ahead, helping in bug-fixing apart from other benefits.
Why use Git : There are a number of other version control systems available, some centralized systems some distributed systems. Amongst them, Git is one of the fastest version control system, very simple and easy to use, and has lot of helpful features packed in very a small package. Check my other post to know more reasons.
Prerequisite
1) You need a computer
with preferably Linux (any flavor) installed on it. (This post does not deal with Windows, though you may use the commands given here without any modifications (probably!)).
2) You need Git.
on Fedora distribution, you may install git using the following command
$ sudo yum install git
On Ubuntu distribution, you may install git using the following command
$ sudo apt-get install git
$ sudo apt-get install git-core
(Edit: 21/Oct/2008 - Thanks to robo47 for pointing out the mistake)
For other methods and building from source check out this page.
3) You need some project which you are developing (or would be developing)
. The project’s language could be anything .. C, C++, D, Python, Perl, HTML, JavaScript, plain text files … you got the idea right?
Let the show begin
Command 1 : Initializing an empty git repository.
Befor you can start using the power of git you need to create an empty repository and tell git which files to track. The first command that I’m presenting initializes an empty git repository.
Before executing the command you need to be at base folder of you project. For example if you have all the source code for you project stored here /home/xk0der/SourceCode/myProject, (We’ll call this folder as the base folder for ease of discussion), move there first. Now execute the following command once you are in the base folder.
$ git init
This will create an empty repository in the current directory (the base folder).
For every project that you want to track using git, go to its base folder and issue this command first and then the next 2 commands presented below.
Command 2 : Adding files to git repository.
The next step is to add files to your git repository, essentially telling git that these are the files we want to keep track of. Execute the following command from the base folder.
$ git add .
This will add all the files from the current folder and sub-folders recursively to the git repository.
Command 3 : The commit command.
This is one command you’ll be using quite often.
the above command adds the files but does not commit the changes to the git repository. So you need to issue the following command to make the changes final.
$ git commit -a
This will open a text editor (probably vi) where you can add some comments about this commit. If you prefer not to use the text editor, you can specify the commit message from the command line it self, just use the following format instead of the above one.
$ git commit -a -m "Initial import"
The -m switch is used to specify the commit message. In our case the commit message is “Initial import”. You can put anything between the quotes for your message.
You are ‘all’ ready!
Now open your favorite text editor and start coding. When you feel you have accomplished something or you just want to save the current state of your source code issue the git-commit command as described above. The commit command will create a new checkpoint and save the current status of your source code.
Git (like any other version control system) saves all the commits you have done to your source code repository. This enables you to go back and forth between commits and inspect the changes.
Now let’s move forward and learn a few more commands.
Command 4 : Viewing the commit log.
You can view all the commits you have done till now using the following command
$ git log
This command shows the commit history with the
1) Unique commit hash
2) Name and email of the person who performed the commit
3) Date and time of commit
4) The commit message
Of all these, the first item, the unique commit identifier, the SHA1 hash is of importance to us. This hash will be used with some of the commands listed next, and is used with a plethora of other git commands, not listed here
Command 5 : Checking the current status.
While coding, you may want to see what all files have changed, before you do a commit to store them in the git repository. This command helps you achieve that.
$ git status
The above command will list all files that have changed since your last commit.
Command 6 : Finding the difference between commits.
Apart from just viewing files that have changed, you may be interested in viewing the actual differences in the source code.
$ git diff
The above command will show a difference ( a diff ) with respect to your last commit and current changes.
The diff command can actually be used to compare difference between any commits
To view difference between a previous commit and current changes.
$ git diff commit_hash
here the commit_hash is the first eight characters (hex digits) of commit hash as shown in the commit log by the git-log command. Yes! you need not specify the full hash, just the first eight digits are good enough.
To view differences between two previous commits.
$ git diff commit_hash_1 commit_hash_2
This command will display differences between the two commits identified by the commit_hash_1 and commit_hash_2.
Command 7 : Creating branches!
Don’t be scared by the word “branching”, specially if you never dealt with them. Branches are easy to play with and are very useful.
Before I show you the command a bit more discussion about branches.
- You can view branches as being diversion from the main linear commit tree.
- All branches stem out from the master branch, the name given to the main trunk.
- Every branch has it’s own commit log.
- You can have different code in same files across difference branches. (This is the main feature of branching). Actually git goes even further and allows you to have not only different content in files across branches but even different sets of files across different branches.
- At one point of time, you can be sitting only on one branch. What this means is that, the source code from the current branch will be the effective one, the one to which you would be making changes.
Why use branches?
Suppose you have an almost stable source code and you are to release the product in a month or in a week or two. You also have plans to include another great feature into your code, but are afraid it might break your code and your release plans may go hay-wire.
This is where branches come into picture. Just create an experimental branch from you main stable trunk ( the one you’ve been working on up till now is the main trunk, the master branch). After you have created the experimental branch, you can continue fixing bugs and polishing the code on the main, i.e. the master branch. Meanwhile you can also continue working on the experimental branch without affecting a line of code on the master branch.
In the end, if you find that the experimental feature is working good enough, merge it into the master branch and release your product. If the experimental feature didn’t quite work out, you can still release the product from the master branch. The experimental branch is still there so you can continue working on it till it gets stable.
This is one scenario (and the most often reason, though not the only one), to create branches.
Okay now, back to commands . Issue the following command when you want to create a branch.
Creating a branch
$ git branch branch_name
branch_name could be anything that you wish, for example:
$ git branch experimental_feature
Branching a branch or “I want more branches”.
You can create as many branches from inside any branch you want, creating a very dense tree if you like.
Just move inside (check-out that branch, see command 8 below) and issue the branch creation command.
Command 8 : Moving to a branch and listing all branches
Once you have created the branch move to it by issuing the command listed below. Always Make sure you do a commit before you issue this command or else changes will move across branches. Make this a habit! (OR have a look at git-stash command, not discussed in this post)
$ git checkout branch_name
Here the branch name is the branch where you want to move. Once checked-out, you can view staus, log, diff etc, using the commands presented earlier.
To go back to the master branch (the main trunk) issue the following command. (Again make sure you had issued the commit command)
$ git checkout master
Listing all branches
Issue the following command to see all available branches in the current repository.
$ git branch
Command 9 : Merging two branches
Move to (checkout) the branch with which you want the merge to happen and issue the following command.
$ git merge branch_name
This will merge the branch branch_name with the current branch.
For example if you want to merger the “experimental_feature” branch with the master branch, issue the following commands
$ git checkout master $ git merge experimental_feature
Git will notify you with any conflicts it cannot resolve automatically (if any). You can then resolve the conflicts manually.
Deleting a branch
After the merge is done you can delete the experimental branch if you wish by issuing the command
$ git branch -d experimental_branch
The above command will only delete the branch if it is fully merged with the current branch’s HEAD. HEAD is the current position in your branch, the latest commit.
Command 10 : Deleting stuff from the repository.
Issue the following command if you do not want git to keep track of a file or folder (this is the opposite of the git-add command)
$ git rm path/to/the/folder_or_file
That’s it, you’re done!
Before I leave you
a few more command/features that may interest you, but are not totally necessary as of now.
A graphical repository viewer
To invoke a graphical repository viewer, invoke the following command
$ gitk
Git - Graphical user interface
For those who prefer GUI, you can install a graphical front end to git.
On Fedora
$ yum install git-gui
On Ubuntu
$ apt-get install git-gui
Run the gui by issuing the following command
$ git-gui
Yup, totally done now!
That’s all folks.
I hope this post will help you in getting started with one of the most powerful version control system available around.
JavaScript Associative Arrays Demystified July 10, 2008
Posted by xk0der (aka Amit Singh) in : Programming and software development, Tips and tricks , 4commentsJavascript hides a lot of arsenal beneath its simplicity. In this post I’ve tried to explain normal javascript arrays and associative arrays starting with absolute basics and then presenting the advance concepts that are often overlooked but are simple to understand and are very handy. I’m not a Javascript guru
. This post is more about what I’ve discovered overtime while coding in Javascript. Hope it helps and saves your time.
Please Note: A single line in the code snippet may wrap or may have been split to fit it into the blog’s page layout. All code snippets are provided for illustration purpose. Though they should work (execute) fine without any modification, I’ve not tested all the snippets presented here.
Normal indexed arrays
I’ll start the discussion with normal indexed arrays. Most of the text in this section would be known to many, but might be useful for Javascript newbies.
In Javascript you can create and use normal arrays as follows:
var myArray = new Array();
Normal arrays uses positive integers numbers (including zero) as index. To store elements to this array. you can use the following syntax.
myArray[0] = 200; myArray[1] = 300;
Where 200 and 300 are the values stored at the first and the second location in the array, respectively ( index 0 is the first location).
Another way to assign elements is to use the array constructor as follows.
var myArray = new Array(200, 300);
The above code has the same effect as the previous one, storing 200 at the first location (index 0) and 300 at the second location (index 1)
Tip 1 : The array.length property
If you want to add an element at the end of a normal, number indexed array (the one we used above). use the following code.
myArray[myArray.length] = someValue;
For example:
var myArray = new Array(); myArray[myArray.length] = 200; myArray[myArray.length] = 300;
For the first assignment, myArray.length would be 0, so 200 is stored at the first location (index 0). after the assignment the array length becomes 1 hence 300 is stored at the second location (index 1). At the end if you try to check the length property of myArray, it will contain the value 2. As you would have guessed, you can always find the number of elements in an array by using it length property, as follows
arrayObject.length
Tip 2 : Quick array creation.
You can use the square bracket operator to quickly create an array. This is specially useful when you need to pass array arguments to functions. An example follows.
var myArray = [200, 300]; alert(myArray); // outputs: 200,300 alert(myArray.length); // outputs: 2
The first line in the code, is equivalen to:
var myArray = new Array(200, 300);
Here’s how you can use this trick while passing argument to functions:
function sumAll( arrayArg )
{
var sum = 0;
for ( i = 0 ; i < arrayArg.length; i++)
{
sum = sum + arrayArg[i];
}
alert("Sum is:" + sum);
}
sumAll([100,200,300,400]);
// the alert in sumAll() function should
// display - Sum is: 1000
Tip 3 : Javascript array elements can be heterogeneous
I’m only storing numbers in all the above examples but Javascript arrays can store a string, an object and for that matter another array itself (as an array is nothing but an object). And one important thing to remember is that unlike many other programming language, all elements need not be of the same type. You can store numbers and strings in an array at the same time as illustrated below.
var mixArray = new Array();
mixArray[0] = "Hello World";
mixArray[1] = 100;
var anotherMixArray = new Array(200,
300,
"Hello Again",
500);
var moreMixArray = new Array();
moreMixArray[0] = 600;
moreMixArray[1] = mixArray;
moreMixArray[2] = new Array(700,
anotherMixArray);
moreMixArray[3] = "Incredible!";
The above code may look like madness at first glance, but is perfectly valid and provides a great bit of flexibility to the programmer. if you cannot figure out what’s going in that piece of code, draw it out and things will make sense, look at the figure below. ![]()
Sparsely populated Array
In Javascript arrays can be sparsely populated, that is, you need not fill-up each and every location in an array. Consider the following example.
var myArray = new Array(); myArray[0] = 200; myArray[5] = 300; alert(myArray); // the alert dialog box shows 200. alert(myArray[0]); // 300 will be shown in the alert box. alert(myArray[5]); // this shows 'undefined' alert(myArray[2]); // this will show '6' in the alert box. alert(myArray.length);
The above code creates a sparsely populated array, courtesy the statement myArray[5] = 300; All intermediate locations from index 1 to index 2 are created but nothing is stored there, essentially they are not-defined. Note that though the number of elements stored is two the array length is shown as 6. This is because, though the elements may be empty (technically undefined) they are part of the array.
An examples that uses the techniques shown above.
// Store Fibonacci series in an array // Disclaimer: the code snippet here // just serves the purpose of // illustrating usage of array and by // no means is an efficient or // elegant solution (even if it is one) // to calculate or find Fibonacci series/numbers. var myArray = new Array; var maxNum = 100; var a = 0; var b = 0; var c = 1; while(c < maxNum) { myArray[myArray.length] = c; a = b; b = c; c = a + b; } // displays // Fibonacci Series : 1,1,2,3,5,8,13,21,34,55,89 alert("Fibonacci Series :" + myArray); // display - Array Length : 11 alert("Array Length :" + myArray.length);
Associative Arrays or something else!
Before we explain the “something else!” part in the heading, some definitions and examples.
Associative Array: In simple words associative arrays use Strings instead of Integer numbers as index. So we can have something like,
new myArray = new Array(); myArray["abc"] = 200; myArray["xyz"] = 300;
Here the indexes “abc” and “xyz” are called keys and these keys are mapped to the values 200 and 300. So we say that the key “abc” maps to ‘200′ and similarly the key “xyz” maps to ‘200′. It’s that simple!
Where to use associative arrays?
I’m presenting few example here, where associative arrays may be helpful.
Databases: Consider a table with following columns and types, in the format COLUMN_NAME as TYPE
NAME as TEXT, MARKS as NUMBER, DOB as DATE.
In your code if you were to find the type of a column, you can create an associative array as follows:
var studentTypes = new Array();
studentTypes["NAME"] = "TEXT";
studentTypes["MARKS"] = "NUMBER";
studentTypes["DOB"] = "DATE";
alert("Type of MARKS is :" +
studentTypes["MARKS"] );
As with normal arrays we need not remember the index number. Using the column names as keys we can directly get the types from the mapping.
This is a very trivial example, but the associative array concept can greatly simply coding for similar scenarios.
“But what about the ’something else!’ part”, I hear you saying
read ahead to know the truth about Javascript associative arrays.
Magic and mystery continued…
Try the following code snippet.
var myArray = new Array(); myArray["a"] = 100; myArray["c"] = 200; // the alert box will contain nothing, // it'll be empty!! alert(myArray);
“What happened here? why did the alert box print nothing? why didn’t it output 100,200?”, don’t be too startled, more mysterious things are about to happen…
Try another piece of code.
var myArray = new Array(); myArray["a"] = 100; myArray["c"] = 200; alert(myArray.length); // output: 0
“What? ZERO!” … yes zero, because my friend there is NO such things as associative arrays in Javascript. “WHAT!”, you say, but you read it correct. Read ahead to know what these “key” to “value” mappings are.
Object and Properties and Not Associative Arrays
Javascript allows you to add properties to objects by using the following syntax:
Object.yourProperty = value;
An alternate syntax for the same is:
Object["yourProperty"] = value;
Shoosh!… If you are not getting what’s going on, you may skip to the next section, and I promise, it won’t hurt your usage of the so called associative arrays in Javascript.
Well, back to the discussion. In the code where we say myArray["a"] = 100; What we really are doing is creating a property named “a” for the “myArray” object and storing the value 100 in the property.
try the following code, to make things clearer,
var myArray = new Array(); myArray["a"] = 100; myArray.b = 200; alert(myArray.a); alert(myArray["b"]);
Remember: These are not alternate ways to assign values to an associative arrays, these are alternate ways to assign properties to an object.
The object “myArray” is of the type Array() in our example, courtesy the statement “var myArray = new Array();”. But in theory and in practice you can use any Class’s object to simulate the associative array. Try the following code and you’ll get what I mean by using any Class’s object.
var myArray = new Date(); myArray["a"] = 100; myArray["b"] = 200; alert(myArray["b"]); // output: 200.
Got the point? Good! :), but I suggest you use the Array class (for simulating the associative array behavior), as it makes the code more obvious (when read).
Now that the mystery is solved, just to avoid confusion, let’s use the term “associative arrays” for the Object-Property assignment behavior.
Tip 4 - Quick associative array creation
We cannot use the Array() constructor to assign elements to associative arrays as we did with normal (proper) arrays. But we can use the Javascript’s object notation to simulate the square bracket effect. (see tip 2).
Check out the code first:
var myArray = { "abc":200, "xyz": 300};
alert(myArray["abc"]); // output: 200
The curly braces is a quick way to define an object, specifically and unnamed object or an object with no class. Normally we have been creating objects using the new operator, which expects a class name to be present.
The colon separates the property name and the value associated with it. The property name goes to the left of the colon and the value goes to the right. Multiple properties are separated using a comma.
The quotation marks enclosing the property names is optional, but is required if you are going to use property names with spaces.
In the associative array terminology, just replace the term property from the above paragraph with key.
Tip 5 - using for(in) to iterate through an Associative array
You can iterate through an associative array using the for..in loop construct as follows.
var myArray = {abc: 200, "x y z": 300};
for(key in myArray)
{
alert("key " + key
+ " has value "
+ myArray[key]);
}
The above code snippet will display two alert boxes with the following text “key abc has value 200″ and “key x y z has value 300″ respectively.
Some explanation:
The for loop here iterates through all the properties of the object “myArray”. The variable “key” will contain the property name inside the for block, which can be used with the object to retrieve the property’s value.
In terms of associative array, you can think of the for..in construct to be iterating through all the “keys” in the array one by one, assigning the key’s name to the variable “key”.
Epilogue
I’ve not gone into much details about the Javascript object notation and neither have I dealt too extensively with the associative array concept, but nevertheless I’ve tried to present the concept of associative arrays in as simple a manner possible. I hope the post will help the newcomers to Javascript and experienced programmers alike.
Thank you for reading. ![]()
Setting up Linksys WiFi router with Airtel Broadband June 4, 2008
Posted by xk0der (aka Amit Singh) in : Tips and tricks , 10commentsI bought a Linksys WiFi router last weekend. I had a little bit of trouble configuring it, although the problem was trivial, it took me some time to figure it out. I’m jotting down some notes here about what I did to resolve the problem. ( I’ve have some tips at the end of this post which you may find usefull for use with linksys (and probably other) routers and with most DSL modems.)
The Problem
The beetel DSL modem installed by Airtel has the IP address set to 192.168.1.1. The Linksys router (and probably other routers as well) use the same IP address (192.168.1.1) as their default IP address for accessing their configuration page. This causes an IP address conflict and hence the router wouldn’t be able to forward IP packets to the modem.
The Solution
1) Insert the installation CD/DVD provided with the wifi router and follow the instruction for installing the router. During the installation (Probably at the final step) the router will fail to detect Internet connectivity. That’s fine, as this is the problem we are resolving. Leave the setup window open and proceed to next step.
2) Open your favourite web-browser and enter the following address in the URL bar : 192.168.1.1
3) The above step should open the Linksys configuration page. If you are prompted for a username and password, enter admin for both the fields. If you had set a router password in step 1 enter username as admin and the password you had set in step 1. Before the username and password is asked you might be displayed a page with 3~4 icons, labeled WAN, LAN etc. select the WAN Icon, enter the username and password as described above, if prompted for.
4) On the page displayed select Setup tab (most likely the first tab) and under that select Basic setup (The exact name/text might vary but would most probably be something similar). Scroll down and locate the field Local IP address. The default value for this field would be 192.168.1.1, change it to 192.168.0.1.
5) Scroll further down the page and click on Save Settings. Reset your router and DSL modem (Power them OFF, wait for 10~15 seconds and power back ON). Wait for around 1~2 minutes (So that the Router and DSL modem have properly rebooted).
6) Complete Installation of the router (Click ‘Try Again/Re-try’ in the setup window we left open in step 1)
You should now be able to browser Internet properly on the wired (directly connected) computer. Setup your Laptop and Desktops with WiFi Ethernet card/adaptors to connect to the WiFi router. After that you should be able to access Internet through them.
Tips
- Always setup a WPA/WEP key (pass-phrase) for your WiFi router for thwarting unauthorized WiFi piggybacking.
- For most users WPA Personal (with default settings) should work good enough. You can set/change the pass-key for WPA Personal by logging to the web-based router configuration pages. Select Wireless tab in the configuration page and under that select Wireless security. Select WPA Personal for security Mode field and Change the field labeled WPA Shared Key. This is the key you will enter when connecting to your WiFi router form you laptop or other computers with Wireless Ethernet cards.
- Do not buy the WiFi router provided by Airtel
, it is expensive (around Rs.500~Rs.1000 more than other similar quality routers) and from their own company Beetel (Yup, Beetel is owned by Bharati group). And I haven’t heard/read good reviews about Beetel WiFi routers. - Remember: to access the Router configuration pages you need to enter the IP address you entered in step 4 (192.168.0.1), the address 192.168.1.1 will take you to DSL modem’s configuration page.
- Default username and password for DSL modem is admin and password respectively.
- You may remove the directly connected computer after your WiFi router is setup properly. You need a directly connected computer for fist time installation and configuration of the WiFi router.
I hope this post was of some help to all the Bharti-Airtel broadband users. Thanks for reading. ![]()
VMWare - Simple communication between Host and Guest January 2, 2008
Posted by xk0der (aka Amit Singh) in : Tips and tricks , 1 comment so farRecently I’ve been working on a project which required VMWare as one of the component. As part of this project some sort of communication, albeit simple in nature,was required between the host and the guest machine.
Here are two simple commands, one to be run on host and one on the guest, using which you can pass simple information between the host and the guest virtual machine.
(single line command may wrap to next line … please note this)
Host machine commands:
Syntax:
$ vmware-cmd <path-to-machine.vmx> getguestinfo <variable>
$ vmware-cmd <path-to-machine.vmx> setguestinfo <variable> <value>
Example:
$ vmware-cmd /vmware-stuff/Ubuntu.vmx setguestinfo some_counter 12
$ vmware-cmd /vmware-stuff/Ubuntu.vmx getguestinfo some_counter
The first command, above, will set variable ’some_counter’ to value ‘12′ and the second one will fetch the value of ’some_counter’ on/from the virtual machine specified by /vmware-stuff/Ubuntu.vmx
VMWare typically identifies different virtual machines by their configuration files (.vmx)
To set/get info from other machine use the configuration file path of that virtual machine.
The above variables may be accessed on the guest (Virtual machine), in our case Ubuntu.vmx using the commands shown below (see example).
And yes! make sure the Virtual machine is powered on ![]()
Guest machine commands:
Syntax:
$ vmware-guestd --cmd 'info-set guestinfo.<variable> <value>'
$ vmware-guestd --cmd 'info-get guestinfo.<variable>'
Example:
$ vmware-guestd --cmd 'info-set guestinfo.some_counter 35'
$ vmware-guestd --cmd 'info-get guestinfo.some_counter'
Variables set in Virtual Machine (Guest) may be accessed on Host and vice-versa.
I tested this on VMWare-Server as it is free
… hopefully and very likely the same is applicable for VMWare-Workstation.
For more hardcore scripting, you may Use Perl-SDK provided by VMWare (On windows you may use COM-SDK).
Please leave comments if you found this info helpful (or even otherwise).
- xk0der
Like this post?Apache 2 on Fedora Core 4 May 11, 2007
Posted by xk0der (aka Amit Singh) in : Tips and tricks , add a commentRecently while installing Apache 2 web server on a Fedora Core 4 machine, I ran into some very peculiar problems.
Apache would compile cleanly, install perfectly but when I would start the web server it would fail complaing about, failed to load shared library (some ldap and others).
After much hunting and googling, i found that it’s this SELinux (Security Enhance Linux) stuff that’s creating problems.
If you too have faced a similar problem, just switch off SELinux by modifying the file /etc/selinux/config (file path might be specific to FC4), and changing the line SELINUX=encforcing to SELINUX=disabled
Current URL in FireFox November 30, 2006
Posted by xk0der (aka Amit Singh) in : Programming and software development, Tips and tricks , 1 comment so farI required this while creating an extension for Firefox that bookmarked the current URL at some site.
After some hacking I found that the Address bar object that displays the current tab’s URL has the id set to ‘urlbar’
Following simple Javascript code accomplishes the task
var obj = document.getElementById("urlbar");
returns the reference of the address bar. Now you may use obj.value to get the URL text in the address bar.
There is a function implemented by FireFox named handleURLBarCommand(); that opens the current URL in the address bar in the current tab.
So the following code will open http://ensparc.com in the current tab.
var ub = getElementById("urlbar");
ub.value = "http://ensparc.com";
handleURLBarCommand();
Using handleURLBarCommand() function may not be the standard function to open URLs but Mozilla developer probably won’t rename it to anything else in the near future.
if you want to safeguard yourself from probable future modifications use the following method
var myHandleURL = handleURLBarCommand
// Now use myhandleURL wherever you
// were to use handleURLBarCommand
myHandleURL();
If they change the name, all you have to change is the first line, that’s it!
Hope this was helpful !
Like this post?