### TLE খাওয়া একজন পথিক এর গল্প

Online programming করার জন্য track your progress এ থাকা হয় সবসময়। আমরা কয়েকজন যেমন অনিক শোভন আর আমি chatting করতাম। যাই হোক, ওদিকে যাইয়া লাভ নাই।কিছুদিন Uva onlinejudge তে problem solve করতাম। আমি মাঝখানে বাদ দিয়া দিলাম।কিন্তু ওরা চালাইয়া গেল আর এক এক জন বস হইয়া গেল। আমি টানা ৩-৪ মাস পর ওইদিন আবার Felix Halim ভাইয়ের সাইট টাতে ঢুকে দেখলাম অনিক শোভন কে বলছে, ভাই,১০০৮৩ নাম্বার এর জন্য কোন শর্টকাট নাই।মানুয়ালি করতে হবে। আমি ভাবলাম,অনেকদিন problem solve করা হয় না। এইটা try করি। দেখলাম problem টা Big Number এর। তাই JAVA এর BigInteger এর class ব্যবহার করে solve করে ফেললাম। কিন্তু TLE খাইলাম। এইবার নিজে optimize করার চেষ্টা করলাম।অনেক টাই করলাম।কিন্তু লাভ হল না। পর পর কয়েকবার TLE খাইলাম.এইত গেল প্রথম দিনের ঘটনা। পর দিন অনিক কে বললাম hints দেওয়ার জন্য। ও যা বলল ,তাতে আমি কিছু তা আশা পেলাম। মানে ওর বুদ্ধিতে কিছুটা time কমলো। যাই হক এইবার আর submit করতে পারলাম না।কারন 3rd case এ code টা infinity টে গেল। এইবার শোভন কে বললাম আমার code টা দেখে দিতে। ও কিছু condition add করতে বলল। হা,এইবার আমি খুশি,কারন ওই 3rd case এ এখন আর সমস্যা নেই। কিন্তু আবার TLE.[oh noo!!!] ওইদিন রাতে শোভন কে প্রায় ৪-৫ ঘন্টা খাটাইছি নিজের সার্থ উদ্ধারের জন্য । যাই হোক,শেষ পর্যন্ত divide() function টার কাজ manually করলে টাইম কমবে এই আসায় ওইদিন রাতে কয়েকটা TLE খাওয়ার পর খান্ত দিলাম কারন পরদিন সকালে class আছে। সকালে দেরি করে ঘুম থেকে উঠলাম। মানে class শুরুর আর মাত্র ৫ মিনিট বাকি। আমি dress up করে roommate এর হাতে খাতা টা দিয়ে বললাম class এ চলে যেতে। আমি ব্রাশ নিয়ে দাত মাজতে মাজতে ৩ তালা থেকে নিচে নেমে মুখ ধুয়ে ব্রাশ টা পকেট এ রেখে দৌড় দিয়ে class এ যাই।খুব বেশি দেরী হয় নি। এইবার আসল কথায় আসি, ফেলিক্স হালিম ভাইয়ের ওই সাইট তাতে post দিলাম আমার সমস্যা নিয়ে। nhahtdh আমাকে Reply দিলেন । উনি আমাকে যা করতে বললেন তা আমি আগেই করে রেখেছি। তারপর উনি নিজে solve করে ৩ বার TLE,2 বার WA খাওয়ার পর finally Accepted এর মুখ দেখলেন।দেখা গেল আমি শুধু মাত্র একটা check না করার জন্য TLE খাচ্ছিলাম। ঠিক করলাম। ৩ দিন পর Accepted নামক বাস্তটার মুখ দেখলাম।

মজার ব্যপার যা ঘটল,তা হচ্ছে আমার code টা nhahtdh ভাইয়ের থেকে ৫০% কম সময়ে output দিচ্ছিল। পরে অবশ্য উনি সমস্যা খুজে বের করেচ্ছিলেন উনার code এর।
এই ৩ দিনে আমার অর্জনঃ
2 টা WA ,
3 টা RE,
2 টা CE
9 টা TLE
logarithm ব্যবহার করে division জানতাম না আগে।।এইটা শিখে ফেললাম।
C++ এর String এ যা JAAN ভাইয়ের BigNumber এর যা code ছিল টা জ়াভা টে convert করে ফেললাম।
যদিও এই ২টার কোনটাই এইটায় লাগে নাই।

অবশেষে বাংলা-English এর মিশ্রণ এর জন্য খুবই দুঃখিত।

### Bellman-Ford Algorithm

The Bellman-Ford algorithm solves the single-source shortest-paths problem in the general case in which edge weights may be negative. Given a weighted, directed graph G = (V, E) with source s and weight function w : E → R, the Bellman-Ford algorithm returns a Boolean value indicating whether or not there is a negative-weight cycle that is reachable from the source. If there is such a cycle, the algorithm indicates that no solution exists. If there is no such cycle, the algorithm produces the shortest paths and their weights. The algorithm uses relaxation, progressively decreasing an estimate d[v] on the weight of a shortest path from the source s to each vertex v ∈ V until it achieves the actual shortest-path weight δ(s, v). The algorithm returns TRUE if and only if the graph contains no negative-weight cycles that are reachable from the source.

To understand this algorithm, we must know about the storing technique of graph.

The Algorithm
The Bellman-Ford algorithm is one of the classic solutions to this problem. It calculates the shortest path to all nodes in the graph from a single source.

The basic idea is simple:
Step 1: Start by considering that the shortest path to all nodes, less the source, is infinity. Mark the length of the path to the source as 0:

Step 2: Take every edge and try to relax it:

Relaxing an edge means checking to see if the path to the node the edge is pointing to can’t be shortened, and if so, doing it.
Now, we apply the previous step n – 1 times, where n is the number of nodes in the graph.

Here is the condensed form of the algorithm :
[code]
void bellman_ford(int s) {
int i, j;

for (i = 0; i < n; ++i)
d[i] = INFINITY;

d[s] = 0;

for (i = 0; i < n – 1; ++i)
for (j = 0; j < e; ++j)
if (d[edges[j].u] + edges[j].w < d[edges[j].v])
d[edges[j].v] = d[edges[j].u] + edges[j].w;
}
[/code]

***the structure is
[code]
typedef struct{
int u,v,w;
}Edge;
Edge edges;
[/code]

It is seen that the working principle of Bellman-Ford algorithm is exactly same as another single source shortest path Dijkstra’s algorithm. Then what is the difference between them?

Yes, their working principle is same but Dijkstra’s algorithm fails if there exists any negative valued weight or negative cycle. But Bellman-Ford algorithm is capable to determine the negative cycle in the graph and finds the shortest path even with negative valued weights.

Here is an real life example of bellman-Ford example . UVA 558

[code]
//warmholes 558
#include <stdio.h>

typedef struct {
int u, v, w;
} Edge;

int n; /* the number of nodes */
int e; /* the number of edges */
Edge edges; /* large enough for n <= 2^5=32 */
int d; /* d[i] is the minimum distance from node s to node i */

#define INFINITY 1000000

void printDist() {
int i;
printf("Distances:n");
for (i = 0; i < n; ++i)
printf("to %dt", i );
printf("n");

for (i = 0; i < n; ++i)
printf("%dt", d[i]);

printf("nn");
}

void bellman_ford(int s){
int i, j;

for (i = 0; i < n; ++i)
d[i] = INFINITY;

d[s] = 0;

for (i = 0; i < n-1; ++i)
for (j = 0; j <e; ++j){
if (d[edges[j].u] + edges[j].w < d[edges[j].v])
d[edges[j].v] = d[edges[j].u] + edges[j].w;
}

////these 3 lines for the 558////////////////
int f=0;
for (int j = 0; j < e; j++)
if (d[edges[j].v] > d[edges[j].u] + edges[j].w) {
f=1;break;
}

if(f==1)
printf("possiblen");
else
printf("not possiblen");

}

int main() {
int i,p,j,k,c,l,m,kase;
int w;

scanf("%d",&kase);
for(c=0;c<kase;c++){

scanf("%d %d",&n,&e);
p=0;

for(i=0;i<e;i++){
scanf("%d %d %d",&j,&k,&l);
edges[i].u=j;
edges[i].v=k;
edges[i].w=l;
}
bellman_ford(0);
//printDist();
}
return 0;
}

[/code]

References:
“Introduction to algorithms ” by Coreman
http://compprog.wordpress.com/2007/11/29/one-source-shortest-path-the-bellman-ford-algorithm/

### অ্যাসেম্বলি ল্যাঙ্গুয়েজ় প্যানর প্যানর।

অ্যাসেম্বলি ল্যাঙ্গুয়েজ় একটা ভয়াবহ ল্যাঙ্গুয়েজ ,এইটার বই পরতে গিয়ে অনেকে এখনো শহীদ হয়েছে বলে লোকমুখে অনেক জনশ্রুতি আছে , সেই অজস্র বিদেহী আত্মার একজন হয়ে,অজস্র জীবিত আত্মাকে বাঁচানোর এক ক্ষুদ্র প্রয়াস আমার এই প্যানর প্যানর।
বাঙ্গালি নারীদের পরপুরুষে আসক্তি আছে কিনা,আমার বোঝার বয়স হই নাই ,তবে বাচ্চাকালে পরেছি ,ভারতের টোডা উপজাতির নারীদের একাধিক বর থাকে ,আমাদের সবার প্রেয়সী কম্পুবিবির ও আছে । ভারতের টোডা উপজাতির নারীদের শৌর্য-বীর্য প্রকাশ পায় একাধিক পুরুষ এর সাথে সাথে চলা ফেরায় ,কথা বার্তায় আর “হালুম-এ” । আমাদের কম্পুবিবিকে ও অনেকের সাথে অনেক ঢঙ্গে অনেক কথা বলতে হয়,অনেকের অনেক নীরব আকুতি সরবভাবে মেটাতে হয়।( প্যানর প্যানর বাদ দিয়ে আসল কথায় আসি ) কম্পুবিবি অজস্র আকুতি পূরণ করে একটা বিশেষ উপায়ে ।
তিনি কিছু সংখ্যা ছাড়া কিছুই বুঝেন না , তাহলে এত প্রেমিক পুরুষ কীভাবে ম্যানেজ করেন ,আর কীভাবে প্রেমের জোয়ারে বন্যা হয়ে যায় ? নারীশাসিত এই আধুনিক সমাজে পুরুষরা নারীর মন জুগিয়ে চলে (কারন পুরুষরা মহান!!) ,আর তাই নারীর যে ভাষা বুঝে ,তাদের কে পুরুষরা সে ভাষায় কবিতা শোনায় ,আর সে কবিতা পরে সংখ্যার মাধ্যমেই আদান প্রদান হয় ।
একটা উদাহারণ দেই তাহলে বুঝতে সুবিধা হবে । কেউ যদি কম্পিউটার কে কোন ভাবে বলে ১৪৩(বাইনারী তে বলতে হবে I LOVE YOU) তাহলে সে বুঝে নিবে যে তাকে যে কেউ ভালোবাসে । মানে কেউ বললো I LOVE YOU তখন সেইটা কে তো ১৪৩(বাইনারী) তে কনভার্ট করতে হবে ? এই কাজ করে “অ্যাসেম্বলার” । এর কাজ হচ্ছে যে কোন কিছুকে machine code এ রূপান্তর করা আর কম্পিউটার machine code অনুযায়ী কাজ করে । তাহলে আমরা যদি কম্পিউটার কে কোন কিছু করতে বলি আমাদের জানতে হবে অ্যাসেম্বলি ল্যাঙ্গুয়েজ় । অ্যাসেম্বলার নামের একটা সফটওয়ার এই ভাষাকে রূপান্তর করবে machine code এ ,কম্পিউটার সেই machine code পরে পরে কাজ করবে । আমরা যারা সি এর প্রোগ্রাম করি ,তখন আমরা যা লিখি সেইটা কম্পাইলার প্রথমে অ্যাসেম্বলি ল্যাঙ্গুয়েজ় এ রূপান্তর করে তারপর machine code এ রূপান্তর করে ,সেইটা দিয়ে আমাদের কোডের কাজগুলো কম্পিউটার করে । আমার লেখার স্পীড অনেক কম , আস্তে আস্তে বাকীটা লিখবো ,আজ কে এতটুকুই ।

শহীদ শাকিল নিহন
বিশিষ্ট কমপু প্রেমিক
————

### Starting TOPCODER

To start contest you must Register to open an account in topcoder.

After completing download you are ready to start participating on contests. You have to register for any contest before 5 minutes of starting of the contest. You have to login on topcoder by this applet.

Before starting contest we must learn enough. Tutorials is the best tutorial I have seen.

To know about contest Rules HELP

Remarks:
1. You have not to submit your main(). you have to submit just the header files and the class part.

example:
[code]
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<cstring>
using namespace std;

class ToastXRaspberry{

public:
int apply(int upper_limit, int layer_count){

if(upper_limit>=layer_count)
return 1;

int x=layer_count/upper_limit;

if(layer_count%upper_limit>0)
x+=1;

return (x);
}
};

[/code]
Class name and method name will be given in the problem description.

### Object Oriented programming

আমরা জীবজগতের শ্রেণীবিন্যাস জানি। যেমন : মানুষের বৈজ্ঞানিক নাম Homo sapiensMammalia বা স্তন্নপায়ী শ্রেণীর একটি প্রাণী মানুষ। এ শ্রেণীতে রয়েছে বানর ও শিমপান্জী সহ আরও অনেক। তাহলে,Mammalia class টির সকল বৈশিষ্ট্য মানুষ,বানর ও শিমপান্জীর রয়েছে। অর্থাৎ Mammalia Class এর Object হল মানুষ/বানর/শিমপান্জী কারন এরা প্রত্যেকে Mammalia Class টির Representative । এটাই OOP এর মৌলিক ধারনা।

C ও C++ এর মধ্যে পার্থক্য হল C++ এ OOP(Object Oriented programming) এর সুবিধা রয়েছে যা JAVA তে পূর্ণতা পেয়েছে ।
Object Oriented programming আমাদের যে সুফলগুলো দিয়েছে সেগুলো হলঃ
01. Data Encapsulation
02. Data Hiding
03. Polymorphism
এই তিনটি সম্পর্কে পরবর্তীতে বিস্তারিত বলব।

প্রোগ্রামিং করার সময় আমরা যখন কোন Class এর Declaration দিব তখন ঐ Class এর বস্তু বা Object এর কি কি বৈশিষ্ট্য থাকবে তা নির্ধারণ করে দেব। দুই ধরণের বৈশিষ্ট্য থাকতে পারে, ১। Attribute ২। Member function

উদাহরন:
[code]
Class Car{ // Car is the user defined classname
//these three are attribue of the class Car
Char carname;
int wheel;
char color;

//these are the member functions
void getnameofcar(){
cin>>carname;
}
void getnumberofwheel(){
cin>>wheel;
}
}; //a semicolon must be placed after the declarationof that class
[/code]
তাহলে দেখা যাচ্ছে যে Car শ্রেণীর সকল Object এর তিনটি Attribute থাকবে যথাঃ carname,wheel এবং color । এবং ২ টি function আছে। এই বৈশিষ্ট্যগুলো তিন ধরনের হতে পারে যথাঃ public, private and protected.

An example :
[code]
#include<stdio.h>
#include <iostream>
using namespace std;

Class Car{ // Car is the user defined classname
//these three are attribue of the class Car
Char carname;
int wheel;
char color;

//these are the member functions
void getnameofcar(){
cin>>carname;
}
void getnumberofwheel(){
cin>>wheel;
}
}; //a semicolon must be placed after the declarationof that class

int main(){

Car obj1,obj2; // declaring of an object of Class Car

obj1.getnameofcar(); // calling the function for obj1
obj1.getnumberofwheel();

obj2.getnameofcar(); // calling the function for obj2
obj2.getnumberofwheel();

cout<<ob1.carname<<endl;
cout<<ob1.wheel<<endl;

cout<<ob2.carname<<endl;
cout<<ob2.wheel<<endl;

return 0;
}[/code]
/////////////////////////////////////////

Definitions:
A class is a template for multiple objects with similar features. Classes embody all the
features of a particular set of objects.

An instance of a class is another word for an actual object. If classes are an abstract
representation of an object, an instance is its concrete representation.

Object is the more general term, but both instances and objects are the concrete representation of a class.
In fact, the terms instance and object are often used interchangeably in OOP language. An instance of a Car and a Car object are both the same thing.

### NEXT PERMUTATION

In the way of programming there is some problems on thye basis of finding the permutation. Today I am giving a sample to create all permutations of an string.

``` // next_permutation #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm>```

``` using namespace std; int main () { int n,i,l; char myints; gets(myints); l=strlen(myints); sort (myints,myints+l); do { cout << myints<< endl; } while ( next_permutation (myints,myints+l) ); ```

``` return 0; } ```

### A brief collection of STL

STL stands for STANDARD TEMPLATE LIBRARY in C++ which makes the programmer’s job too easier. STL decreases the coding size as well as the coding time. In programming , using STL is preferred by an C programmer.
Here I am giving a description of STL frequently used by us.

Frequently used container classes of STL :
1. vector
2. queue
3. string
4. stack
5. map
6. list
7. set
8. pair

Vector class:
A vector models a dynamic array. Thus, it is an abstraction that manages its elements with a dynamic array.However, note that the standard does not specify that the implementation use a dynamic array. Rather, it follows from the constraints and specification of the complexity of its operation.

To use a vector we must include
[code]
#include <vector>
Using namespace std;[/code]

Declaration :
[code]Vector<datatype> c;[/code]
//Elem refers to all kind of data types like int,float,char,double,string,struct,class,pair etc.

All functions of vector class :
*vector c // Creates an empty vector without any elements
*vector c1(c2) // Creates a copy of another vector of the same type (all elements are copied)
*vector c(n) // Creates a vector with n elements that are created by the default constructor
*vector c(n,elem) //Creates a vector initialized with n copies of element elem
*vector c(beg,end) //Creates a vector initialized with the elements of the range [beg,end)
*c.~vector() //Destroys all elements and frees the memory
*c.size() //Returns the actual number of elements
*c.max_size() //Returns the maximum number of elements possible
*capacity() //Returns the maximum possible number of elements without reallocation
*reserve() //Enlarges capacity, if not enough yet
*c1 == c2 //Returns whether c1 is equal to c2
*c1 = c2 //Assigns all elements of c2 to c1
*c.assign(beg,end) //Assigns the elements of the range [beg,end)
*c1.swap(c2) //Swaps the data of c1 and c2
*swap(c1,c2) // Same (as global function)
*c.at(idx) //Returns the element with index idx (throws range error exception if idx is out of range)
*c[idx] //Returns the element with index idx (no range checking)
*c.front() //Returns the first element (no check whether a first element exists)
*c.back() //Returns the last element (no check whether a last element exists)
*c.insert(pos,elem) /*Inserts at iterator position pos a copy of elem and returns the position of the new element*/
*c.insert(pos,n,elem) //Inserts at iterator position pos n copies of elem (returns nothing)
*c.insert(pos,beg,end) /*Inserts at iterator position pos a copy of all elements of the range [beg,end) (returns nothing)*/
*c.insert(pos,beg,end) /*Inserts at iterator position pos a copy of all elements of the range [beg,end) (returns nothing)*/
*c.push_back(elem) //Appends a copy of elem at the end
*c.pop_back() //Removes the last element (does not return it)
*c.resize(num) /*Changes the number of elements to num (if size() grows, new elements are created by their default constructor)*/
*c.resize(num,elem) // Changes the number of elements to num (if size() grows, new elements are copies of elem)
*c.clear() //Removes all elements (makes the container empty)

An example:
[code]
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{

//create empty vector for strings
vector<string> sentence;

//reserve memory for five elements to avoid reallocation
sentence.reserve(5);

//append some elements
sentence.push_back("Hello,");
sentence.push_back("how");
sentence.push_back("are");
sentence.push_back("you");
sentence.push_back("?");

//print elements separated with spaces
copy (sentence.begin(), sentence.end(),
ostream_iterator<string>(cout," "));
cout << endl;

//print ”technical data”
cout << " max_size(): " << sentence.max_size() << endl;
cout << " size(): " << sentence.size() << endl;
cout << " capacity(): " << sentence.capacity() << endl;

//swap second and fourth element
swap (sentence, sentence );

//insert element "always" before element "?"
sentence.insert (find(sentence.begin(),sentence.end(),"?"),
"always");

//assign "!" to the last element
sentence.back() = "!";

//print elements separated with spaces
copy (sentence.begin(), sentence.end(),
ostream_iterator<string>(cout," "));
cout << endl;

//print "technical data" again
cout << " max_size(): " << sentence.max_size() << endl;
cout << " size(): " << sentence.size() << endl;
cout << " capacity(): " << sentence.capacity() << endl;

}
/*The output of the program might look like this:
Hello, how are you ?
max_size(): 268435455
size(): 5
capacity(): 5
Hello, you are how always !
max_size(): 268435455
size(): 6
capacity(): 10
*/[/code]

queue Class :
queue is one of the data structures that is also called First-in-First-out [FIFO]. In STL there are also some built in functions for implementing queue.

To use queue we must include
[code]#include<queue>
using namespace std;[/code]

Declaration
[code]queue<datatype>name;[/code]

Frequently used functions:
push(value);
front();
pop();
empty();

[The functions defined in Vector class can be used in queue also,check for further]

An example of queue and dequeUva 10935
[code]
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<deque>
using namespace std;

int main(){

int a,b,n,i,k,c;

while(scanf("%d",&n)&&n){
if(n==1){
cout<<"Remaining card: 1"<<endl;
continue;
}

deque<int>q;
queue<int>q2;

for(i=1;i<=n;i++){
q.push_front(i);
}

do{
k=q.back();
q2.push(k);
q.pop_back();

q.push_front(q.back());
q.pop_back();
}
while(q.size()>1);

c=0;
while(!q2.empty()){
cout<<" "<<q2.front();
if(c<n-2)
cout<<",";
c++;
q2.pop();
}

cout<<endl<<"Remaining card:";
while(!q.empty()){
cout<<" "<<q.front()<<endl;
q.pop_front();
}
}
return 0;
}
[/code]

stack Class :
stack is one of the data structures that is also called Last-in-First-out [LIFO]. In STL

To use stack we must include
[code]#include<stack>
using namespace std;[/code]

Declaration
[code]stack<datatype>name;[/code]

Frequently used functions:
push(value);
top();
pop();
empty();
[The functions defined in Vector class can be used in stack also,check for further]
UVA 10420

### Connecting with MySQL in JAVA

Sometimes we need to use database(MySQL).So,we must connect our interpreter to the existing MySQl.For this we need JDBC driver to install it.In netbeans IDE jdbc driver is built in.But to make this working, we must have a mysql connector,which is a jar file in our system.

C:Program FilesJavajdk1.6.0_01jrelibext

In java programming, before coding we must established a connection between interpreter and MySQL.

at first we must import some built in packages.they are:
[code]
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;

//now finally in our main job i.e establishing the connection

Connection m_Connection = null;
Statement m_Statement = null;
ResultSet m_ResultSet = null;

String m_Driver ="com.mysql.jdbc.Driver";
String m_Url = "jdbc:mysql://localhost:3306/databasename";

try {
Class.forName(m_Driver);
}
catch (ClassNotFoundException ex) {
ex.printStackTrace();
}

String query = "";
try {

//Create connection object

//Create Statement object
m_Statement = m_Connection.createStatement();
query = "SELECT * FROM ";
query+=tablename;

//Execute the query
m_ResultSet = m_Statement.executeQuery(query);
String s,t="";

//Loop through the results
while (m_ResultSet.next()) {

s=m_ResultSet.getString(1); //here 1 means value of first coloumn

}//end for while loop

}
catch (SQLException ex) {
ex.printStackTrace();
System.out.println(query);

}
catch (Exception e) {
System.err.println("Error: " + e.getMessage());

}

finally {

try {
if (m_ResultSet != null)
m_ResultSet.close();
if (m_Statement != null)
m_Statement.close();
if (m_Connection != null)
m_Connection.close();
}
catch (SQLException ex) {
ex.printStackTrace();
}
}
[/code]

### Bookmarks in Browser

বিভিন্ন প্রয়জনে আমাদের পিসিতে একের অধিক ব্রাউজার ব্যবহার করতে হয়। কিন্তু এক ব্রাউজারে কোন পেইজ বুকমার্ক করে রাখলে তা অন্য ব্রাউজারে পাওয়া যায় না। তাই আমাদের অনেক জামেলা করতে হয় একই ব্রাউজারে থেকে অন্য ব্রাউজারের বুকমার্ক দেখতে।

কিন্তু আজকে আমি আপনাদের যে সফটওয়্যারের কথা জানাবো তা দিয়ে খুব সহজেই আপনার ব্রাউজারে বুকমার্ক করা সাইট গুলো এক ব্রাউজার থেকে অন্য ব্রাউজারে কনভার্ট করতে পারবেন। যার কারনে সব ব্রাউজারেই আপনি একরকম বুকমার্ক পাবেন। অর্থাৎ বুকমার্ক এর জন্য বার বার আপনার প্রিয় ব্রাউজারের পিছনে ছুটতে হবে না।

মানে এক কথায় আপনার বুকমার্ক লিস্ট সব ব্রাউজারেই এক থাকবে। এমনকি এই সফটওয়্যারের মাধ্যমে বুকমার্ক গুলো আপনার কম্পিউটারে সেভ করে রাখতে পারবেন। ফলে কম্পিউটার বুট করলেও হারাবেনা আপনার বুকমার্ক। বুট করার পর সহজেই রিস্টোর করতে পারবেম আপনার বুকমার্ক গুলো। ব্যবহার করা খুব সহজ তাই আর বিস্তারিত বললাম না।
যে যে ব্রাউজার সাপোর্ট করেঃ