TechWire

Tag - Software

යුනිකෝඩ් සහ සිංහල යතුරුලියනය

මෙම ලිපියෙන් මාගේ බලාපොරොත්තුව ප්‍රාදේශීයකරණය හෙවත් සිංහලට පරිවර්තනය සඳහා අවශ්‍ය වන තාක්‍ෂණික පසුබිම ගැන මූලික සටහනක් තැබීමටයි.

Official Unicode Consortium code chart

නිළ යුනිකෝඩ් කේත වගුව – සිංහල කොටස (මූලාශ්‍රය: විකිපීඩියා)

අන්තර්ජාලය තුළ සිංහල අකුරු සුලබව භාවිතාවනු දක්නට ලැබුණේ ‘යුනිකෝඩ්’ නම් කේතන ක්‍රමයේ ආගමනයෙන් පසුවයි. යුනිකෝඩ් ක්‍රමය යටතේ සෑම අක්‍ෂරයකටම, සෑම ඉලක්කමකටම සහ සෑම සංකේතයකටම අදාළ වන සම්මත ආවේණික ඉලක්කමක් ඇත. ක්‍රියාත්මක මෙහෙයුම් පද්ධතිය මත හෝ, ක්‍රියාත්මක පරිගණක වැඩසටහන මත හෝ පවතින භාෂාව මත හෝ මෙම ඉලක්කම රඳා නොපවතී. ඔබ මෙම ලිපිය විවිධ මෙහෙයුම් පද්ධති හරහා කියවුවහොත් විවිධ අකුරු හැඩ යටතේ දර්ශනය වුවද, අක්‍ෂරයන් වෙනස් නොවේ. යුනිකෝඩ් ක්‍රමයේ විස්මය එයයි. ඒ පිළිබඳ වැඩිදුර තොරතුරු යුනිකෝඩ් වෙබ්අඩවියෙන් දැනගත හැක. Read More

2014 with Millennium IT

Founded in 1996 by Tony Weerasinghe, MillenniumIT has established itself as one of the leading software companies in Sri Lanka. Starting off as a systems integrator, the company has specialised in delivering high performance capital market software solutions.

2014 was another great year for MillenniumIT, with several key projects going live, the initiation of new deployments and also bagging several esteemed awards in the industry. It is also great to see them giving back to society through various CSR projects, especially the housing project in the north. As we step into 2015, let’s take a look at the many achievements of MillenniumIT for 2014, through the below infographic.

2014-MIT-Edited

MillenniumIT Rated as the Most Respected Technology Firm in Sri Lanka

LMD’s Most Respected ranking of the Sri Lanka’s top businesses for the year 2014 is just out. Millennium IT is rated as the most respected company in the Technology sector in Sri Lanka this year.

Millennium IT is a technology innovation driven company that powers more than 30 global and national financial institutions around the globe. MillenniumIT’s systems are used by exchange businesses around the world including London Stock Exchange, Borsa Italiana, Oslo Børs, Turquoise, ICAP, the London Metal Exchange, Johannesburg Stock Exchange and a series of emerging market exchanges. Millennium IT has provided technology for London Stock Exchange group and powers one third of the entire European equities market and is one of the fastest trading systems in the world. Founded in 1996, MillenniumIT was acquired by the international diversified exchange business London Stock Exchange Group in October 2009.

This is the 10th issue of the special edition that measures peer perceptions of corporate admiration. LMD has given a give a face-lift to the ranking system this year by adopting the Olympic Ranking System. This year, they are being awarded gold, silver and bronze medals!

Millennium IT has awarded 3 GOLD, 1 SILVER and 3 BRONZE and is ranked at 34th the list across all industries. Virtusa is ranked at 39th with 2 GOLD, 2 SILVER and 5 BRONZE. DMS Software technologies has secured 61st place with 1 GOLD and 1 BRONZE medal. WSO2, MicroImage has ranked 73rd and 92nd respectively. Last year, Virtusa cooperation was the only Sri Lankan software business that got its name in the list appearing in the second fifty of companies.

Most Respected ranking is conceptualized by LMD, and conducted by Nielsen. Rankings are based on survey results on opinions expressed by respondents going in to details of why the companies were perceived as being the ‘most respected.’

We, the TechWire editorial team congratulate Millennium IT and other companies for their achievement. We anticipate information technology companies to show their true colors in the years to come, with far greater contribution to Sri Lanka’s economy in getting its way as “most respected”.

2014-Most-Respected-Entities-1

2014-Most-Respected-Entities-2

2014-Most-Respected-Entities-3

(source: lmd.lk)

What does it take to get a job at Google?

“How many golf balls can fit into a school bus?” is one of the many brain teasers that were famously asked at Google interviews. If by any chance you are aiming for an career at Google, the good news is that such riddles are not interview questions any more. The bad news is that there are various other narrow criteria that you need to fit into. Given below is a small infographic explaining on what it takes to get a job at Google. It might give you insights on what to look in an candidate if you are hiring for your software company. (Infographic credits : staff.com)

What it takes to work at Google

Free Anti Virus Guards. Which one is for you?

If you are wondering about having a good virus guard, well, here are some little details about freely available and most famous virus guards on the internet. If I didn’t mention about a virus guard that means either it is not that good or I haven’t had a chance to use it and experience it.

#1 Bitdefender

BitDefender

My personal favorite! Even though it is not very famous, you simply can’t proceed without talking about the best you can find, can you? This doesn’t have a cool appearance or whatsoever. However it literally does the job. Which is detecting threats. It protects your computer from the all kind of viruses and it automatically keeps the virus database up to date. Mostly it doesn’t interrupt you at all when detecting viruses but of course it gives you a small notification balloon. Simply it diverts the virus to a quarantine folder from where you can easily recover the file, if it is a false action or if it is an important file to you. Only con is that there is no internet security but guess what, if you are using Google Chrome as your default browser, it has a small add-on called; Bitdefender TrafficLight, which will give you an average protection when you browse. This one is super light, fast, and commercial free product.

http://www.bitdefender.com/solutions/free.html

http://www.bitdefender.com/solutions/trafficlight.html

#2 Avast

Avast

This one was my #1 before I got to know about Bitdefender. However unlike Bitdefender, it covers some extent in internet security in the free version. It has a nice, gadgetmatic, windows 8 like appearance. High download rate in www.download.cnet.com and high popularity in this industry. So many options are available to change and customize its behavior. It has an option called “Sandbox”, where you can run an application in a secure environment so that it won’t harm your computer if it has a threat. According to VB100, latest comparative statistics ( http://www.virusbtn.com/vb100/latest_comparative/index / Oct-2013), when you compare Avast against Bitdefender, its proavitive and reactive detection levels are lower.

http://www.avast.com/index

#3 Avira

Avira

This one is quite famous and has a competition in the free virus guard market with AVG. Avira could be pretty annoying if you are a person that should not to be interrupted while you are working. It always pop ups notifications, update details, and all sort of stuff using the system speakers. Detection wise, it’s nearly in Avast detection range.

http://www.avira.com/en/avira-free-antivirus

#4 AVG

AVG

Name by itself says it all. Anti-Virus Guard or AVG is the most used virus guard of all time. It gives you enormous features even in the free application; automatically scanning removable devices, schedule scans, and much more. AVG can secure your browsing up to a certain extent. But these extra features can consume a lot of memory from your RAM and it may slow down your PC or laptop. Sometimes you may have difficulties in the uninstallation process too.

http://www.avg.com/ww-en/free-antivirus-download

Conclusion

            I have used many virus guards personally and have experienced all most everything on the free market and some of the paid products. By in my experience, I advise you to consider following points when you are going to use a free virus guard.

If you are looking for a hustle free, smooth running, let him do the job type product, go for Bitdefender.

If your want some advance options that you need to take authority and take care of your own protection, you can use either Avast or Avira.

I personally don’t advise you to use AVG, unless or otherwise you know how to manage advance options that are available in AVG. This product can be quite useful if you know how to use it very well.

At last, final decision is yours. If this article somehow helped you to get an idea on famous free virus guards, that would be enough for me.

Wish you everyone a threatless PC! 😉

2013 with WSO2 – Infographic

WSO2 founded by Dr Sanjeewa Weerawaran in 2005, has progressed in leaps and bounds in the past 8 years. Providing clients with an open source middleware platform, WSO2 has attracted some big clients such as eBay, and has won several awards as well.

2013 has been quite a year for WSO2, from providing services to Boeing and Deutsche Telekom, to extending its footprint to the mobile domain. As we have embarked on the new year, lets take a look at the impressive achievements of WSO2 in 2013 through the below infographic.

2013 with WSO2---infographic

A Logic that Urinates (Part II)

Note from the editor: This is the last of the two-part article series on how real world problems can be solved using fuzzy logic. Part I of this article can be found here.

Fuzzy logic brings in a solution

The brilliant intellectual Lotfi Zadeh introduced Fuzzy Logic in 1973, which constitutes a beautiful solution to problems like the one articulated above. Fuzzy Logic, in its core, builds a sophisticated mathematical framework that can translate semantics expressed in vague human terms into crisp numeric form. This enables us, humans, to express our knowledge in a particular domain using a language familiar to us, but still make that knowledge solve concrete numeric problems. For example, our knowledge can be expressed like the following rules that are used to determine whether a candidate should be chosen for a job depending on his experience, education and salary expectation levels.

  • If Experience is High, Education level is Medium and Salary expectation is Low, then hire the guy.
  • If Experience is Medium, Education level is High and Salary expectation is High then do not hire the guy.
  • If Experience is High, Education level is Somewhat High and Salary Expectation is Very High then do not hire the guy.

Rules like above can be formed using our knowledge, experience, gut feeling, etc about the domain. The collection of rules is typically termed Fuzzy Rulebase. We feed the rulebase into a Fuzzy Logic System (FLS), which aggregates and stores this knowledge. Most notably, the FLS stores the knowledge in a numerical logic that can be processed by a computer. After that FLS is capable of answering questions like the following.

If the Experience level is 4 (out of 5), Education level is 3 and Salary Expectation is 4, should we hire the guy?

No need to mention that, the richer the rulebase is, the more accurate is the outcome.

Lotfi Zadeh

A Little further insight into Fuzzy Logic

How does Zadeh’s new logic perform its wonders under the hood? If fuzzy logic is a complex and amazing structure, the magic brick it is built by is the concept termed possibility. Zadeh’s genius is to identify that, in human discourse, likeliness does not refer to likelihood, but to membership. Let me exercise my teaching guts to describe this in a more digestible form. When we humans are confronted with a question like “How hot is 25oC?” we do not think it like “What is the likelihood that 25oC can be considered hot?” (Do we?). We rather think it like “Up to which degree does 25oC belong to the notion ‘hot’?”. To put the same thing in different terms, it’s about “the degree of belongingness to something” but not ”the probability of being something”. You might now be thinking of giving up the idea of becoming Zadeh’s follower, but I suggest you to hold on and give it a second thought.

I believe that Zadeh touches the real nerve in the problem when he makes this distinction between likelihood and membership. After understanding this by heart it’s an easy ride into the rest of the theory. As the next step we can introduce a term for concepts like ‘hot’, ‘beautiful’ or ‘high’. Fuzzy logic calls them fuzzy sets. A fuzzy set is an association between a number and a possibility value (Possibility is a number between 0 and 1 – just like probability, but at the same time radically deviating from it conceptually).

fuzzy2_3

Following figures provide examples. First one defines the fuzzy set “LOW” when input values are given from 1 to 5. For instance, if an examiner evaluates a student’s proficiency in a subject with a number between 1 and 5, how much will each mark mean to be ‘LOW’? We know that 1 is absolutely low. Therefore we consider the possibility of mark 1 being in the fuzzy set ‘LOW’ as 1.0 (maximum possibility). Also we can agree that mark 5 cannot be considered ‘LOW’ at all. So its possibility of being ‘LOW’ is zero. Marks between these two have varying degrees of membership in the fuzzy set ‘LOW’. For example, if the examiner gives mark 4 we consider student’s proficiency to be ‘LOW’ only with a degree of 0.25.

The fuzzy set ‘HIGH’ (last plot) is defined in a similar way. What about the middle one though? It’s not a fuzzy set that stands for a brand new concept, but one that stands for a modification of a previously defined concept. The modifier ‘VERY’ is applied to the concept ‘LOW’. Noting that the modifier is an intensifying modifier (one that further strengthens the concept) we square each possibility in ‘LOW’ to get possibilities in ‘VERY LOW’. Gut feeling says that membership of mark 4 in fuzzy set ‘VERY LOW’ should be less than its membership in ‘LOW’. And the numbers resemble that notion.

  • Possibility [4 is VERY LOW] = 0.25 * 0.25 = 0.0625

graph_low

graph_verylow

graph_high

It’s not difficult to grasp the idea of fuzzy variables. They are fundamentally measurements or entities that can take fuzzy sets as their values. Example fuzzy variables can be temperature, student’s proficiency, candidate’s experience and so on. After that we can combine a fuzzy variable with a fuzzy set to construct a meaningful statement like “temperature is LOW”. These can be termed atomic statements. To express it formally, an atomic statement is of the form:

  • <fuzzy variable> is <fuzzy set>

Now we walk the next step by combining several atomic statements into a compound statement. A compound statement would look something like “Student’s math proficiency is LOW, English proficiency is HIGH and music proficiency is MEDIUM”. These types of statements are useful when making judgments based on a combination of factors. For instance, a judge panel might want to make a final decision on whether to pass a student from the exam by looking at all his subject level proficiencies. Suppose that the judge panel decides this: “If there is a student whose math proficiency is MEDIUM, english proficiency is MORE OR LESS LOW and music proficiency is HIGH we will pass him”. This is termed a fuzzy rule. More appropriately, a fuzzy rule is a compound statement followed by an action. Another rule can be: “If the student’s math proficiency is VERY LOW, English proficiency is high and music proficiency is LOW we will fail him”.

If the judge panel can compile a bunch of rules of this form it can be considered to be the policy when evaluating students. In fuzzy logic vocabulary we call it a fuzzy rulebase. It is important to note that a fuzzy rulebase need not be exhaustive (meaning that it does not have to cover all possible combinations of scenarios). It is sufficient to come up with a rulebase that covers the problem domain to a satisfactory level. Once the rulebase is fed to a fuzzy logic system it is capable of answering questions such as “If the student’s math grade is 3 (in a scale of 1 to 5), English grade is 2 and music grade is 3, should we pass him?”. This is all one needs to understand to use a fuzzy logic library. Inner workings of the theory on how it really derives the answer based on rulebase are beyond the scope of a blog post. Also I think that 90% of readers would be happy to learn that the math bullshit is going to end from here.

Application of fuzzy logic into our location detection problem

Let me repeat our problem; we receive location coordinates in iPad with varying frequencies and tolerance levels. By looking at tolerance values and location coordinate frequency, we need to determine whether the device is in high accuracy or low accuracy location detection mode at a given time. We decided to determine the location detection mode every 30 seconds. At each 30 second boundary we used location coordinate values received within the last 30 seconds to determine the mode. All location related processing for the next 30 seconds are performed with respect to this newly figured out mode. For instance, if we decide that the device is operating in high accuracy location detection mode, we assume that the device operates in the same mode until we perform the evaluation after another 30 seconds. For this, we used following two parameters as inputs in the problem.

  • Tolerance values for best two location coordinates (coordinates with lowest tolerance values) within past 30 seconds
  • Number of location coordinate values received within past 30 seconds (highest possible value is 30 as we configure the device to receive location coordinates every second. However, when in low accuracy mode, number of coordinates received within 30 seconds is way less than 30).

We defined each of the 3 inputs to take values within a universe with 5 fuzzy sets: VERY LOW (VL), LOW (L), MEDIUM (M), HIGH (H) & VERY HIGH (VH). Then we worked out a bunch of fuzzy rules using these inputs and fuzzy sets. Rules are derived using gut feeling decisions on the domain. Following figure shows a part of the rulebase we constructed.

rulebase

We defined each of the 3 inputs to take values within a universe with 5 fuzzy sets: VERY LOW (VL), LOW (L), MEDIUM (M), HIGH (H) & VERY HIGH (VH). Then we worked out a bunch of fuzzy rules using these inputs and fuzzy sets. Rules are derived using gut feeling decisions on the domain. Following figure shows a part of the rulebase we constructed.

At run time we determine numerical values of our 3 input parameters. An example input set can be:

  • tolerence1 = 10 meters, tolerence2 = 25 meters, reading count = 20

Using the rulebase, fuzzy logic system is capable of deriving an answer to the question “Which location detection mode the device is currently operating in?”. Our experimental results were exciting. With the aid of fuzzy logic we arrived at a sensible solution that provides accurate results to a problem that is almost unsolvable using conventional crisp logic. Our app is now in AppStore as the most popular navigation app in Norwegian market.

Image sources: 1, 2, 3

A Logic that Urinates (Part I)

It is said, in North Korea, children are taught that their loving ex-leader Kim Jong Il did not even have to urinate because he was so pure. No excrement generated in his body due to his super-human purity. As a software engineer I think that most of our code behaves also like Kim Jong Il. Our code is ultra pure so that it surpasses every contingency in general human discourse occurring due to imprecision and vagueness. For instance, the statement start_time = 3 in a computer program literally means it while in human conversation “The event starts at 3” does not imply a rigid spontaneity. In a statement like the latter, we humans implicitly agree that the start time can fall within an acceptable time window centered around 3. In any society, a deviation of few seconds will be accepted. However, the program would not accept 3.0001 or 2.998.

This behavior with programs generally works. If you are developing accounting software, you probably don’t want to jeopardize your program logic with vagueness in human thinking. In fact lot of practices are involved in software delivery (such as manual testing, unit testing and code quality analysis) to cut the crap introduced by humanness and make the software as pure as Kim Jong Il. However, there are cases that a programmer is left with no other option but to stretch boundaries of his thinking a little further than the psychotic notion of purity and to get along with the real world while encountering its inevitable vagueness. Following is an example from a recent programming experience of mine.

tw_ipadmaps
Recently we implemented an iPad navigation app for a leading Norwegian GIS (Geographic Information Systems) company. The app is intended to help people when going on boat rides by providing specialized maps. In addition to this main purpose it is bundled with lot of other useful features such as path tracking, geo-fencing, geo-coding, social media sharing, etc.

Not surprisingly the app needs to determine user’s current location to enable most of its features. For this, we employed location services API that ships with iOS. It uses various sources such as GPS, access tower data and crowd-sourced location data when determining the geo-coordinates of the device location. Each of these location sources has different implications on accuracy and battery consumption. For instance, GPS is by far the most accurate method, but drains the battery faster. On the other hand, wifi iPads that amount to a significant fraction of the iPads that are currently in use, do not have GPS receivers. The only accessible location information for them comes from crowd sourced location data from wifi hot spots that agree to share their location. Inevitably these location coordinates are less reliable. One nice thing with iOS location API is that, along with every location coordinate it also provides information on how accurate (or how inaccurate) the reading can be. This is called the tolerance value. For example, when we see a location coordinate (in the form latitude – longitude) 35.45o, 4.87o with tolerance 20 meters, we know that the user’s actual location can be anywhere inside a circle of radius 20 meters centered at the point (35.45o, 4.87o). With our experiments we figured out that when GPS is used to determine the location, tolerance level is as low as 5 meters. However, with wifi iPads, the best we observed was 65 meters. To make things more complicated, even the iPads with GPS receivers, at times, can go low down in accuracy (with tolerance levels as high as several hundreds of meters). This particularly happens when the device is in the vicinity of objects like huge concrete structures or large trees that effectively blocks GPS signals.

Need to determine location accuracy mode

Experimentation clearly suggested that there are two disparate modes that an iPad can be operating at a given moment with respect to location detection; high accuracy mode and low accuracy mode. These two modes are characterized by the following behaviors.

High Accuracy Mode (HAM) Low Accuracy Mode (LAM)
Tolerance value is low for most location readings Tolerance value is high for most readings
Location readings are received in regular intervals (can be as frequent as once in a second) Location readings are received less frequently (usually only few times in a minute)

When in high accuracy mode we can treat received location coordinates as the actual location. In addition we can happily ignore intermittent low accuracy readings (readings with high tolerance values – these can occur even in high accuracy mode occasionally). In contrast, the programmer has to make every attempt to use all acceptable readings (readings without crazily high tolerance, such as more than 1 km) when in low accuracy mode since only few location readings are typically received during 1 minute. Also, corrections may need to be applied (depending on the purpose) since the accuracy level is low. Because the developer has to apply two kinds of logics depending on the accuracy mode, it’s necessary to determine the mode that the device is operating at a given moment. One should also note that the mode could change with time; for instance, when a person is moving with a GPS iPad, the device can be operating in high accuracy mode mostly, but can also switch to low accuracy mode when it is close to a big building.

Difficulty in drawing the line between two modes

The first (and probably the toughest) challenge is to correctly figure out whether the device is operating in HAM or LAM. It doesn’t take much thinking to identify that one can use both tolerance value and location reading frequency to determine the mode. If most tolerance values are low and the device is receiving location readings in regular intervals, it should be in high accuracy mode. However, formulating the logic is not as simple as it sounds because it needs explicit manifestation of numeric boundaries between the two modes. For example, let’s say that we decide to conclude the operating mode as HAM when the best tolerance is less than 20 meters and 15 readings or more are received within a period of 30 seconds. It’s not difficult to illustrate the problem associated with this approach. Consider the following 3 cases.

Case 1: Best tolerance is 18 meters and 15 readings are received within 30 seconds.
Case 2: Best tolerance is 21 meters and 15 readings are received within 30 seconds.
Case 3: Best tolerance is 18 meters and 13 readings are received within 30 seconds.

Intuition suggests that most probably the device should have been operating in the same mode in all 3 cases. However, our previous logic with stubborn numeric boundaries results in case 1 being identified as high accuracy mode, while the other two being recognized as low accuracy. Can you see the problem here? The problem is not about using numeric boundaries (we have to do that as long as we program for a Von Neumann computer). However, the problem lies in selection of the numeric boundary. What justifies selection of 20 meters as the tolerance boundary? Similarly, how confident are we, that the frequency boundary should be 15? A sufficient probe into the problem would reveal that it’s almost impossible to develop a sound heuristic that determines these boundary values “accurately”.

Where exactly is the problem?

tw_fuzzy3
The problem really lies on the discrepancy between skills of humans and computers. Humans are clever in dealing with concepts than with numbers while computers are better in handling numbers. This is evident in that we could distinguish between the two modes easily when we were talking in terms of concepts (to reiterate our previous statement -> ‘If most tolerance values are low and the device is receiving location readings in regular intervals, it should be in high accuracy mode’). The moment we try to put this logic in terms of numbers, we run into chaos. This is a clear case where ‘pure logic’ leaves us in a desperate abyss.

Await Part 2…
Await Part 2 of this article where we explore how fuzzy logic brings in the solution to this problem.

Image sources: 1, 2, 3, 4

The perfect swap in C++

So you are coding this cool app and you need to swap two variables. How does a good programmer do that in C++? The STL (Standard Templates Library) provides the std::swap function which does exactly what we want.

[code language=”cpp”]int a = 10;
int b = 12;
std::swap(a, b);[/code]

That’s easy. But hey, why don’t we go ahead and see actually what std::swap does behind the scenes? A grep in the Apache STL implementation gives us:

[code language=”cpp”]template <class _TypeT>
inline void swap (_TypeT& __a, _TypeT& __b)
{
   _TypeT __tmp = __a;
   __a = __b;
  __b = __tmp;
}[/code]

Woah, all the underscores! But don’t panic just yet. All it does is the grade-school swapping:

[code language=”cpp”]T tmp = a;
a = b;
b = tmp;[/code]

Hmm. That is perhaps the most straight-forward swap implementation. But how does it perform? Look again.

[code language=”cpp”]T tmp = a; // a copy of ‘a’ is created
a = b;  // a copy of ‘b’ is created
b = tmp;  // a copy of ‘tmp’ is created[/code]

That’s a lot of copies for a simple function! What if we could just ‘swap’ the two values without copying?

We google around a bit and find out that the above std::swap implementation is actually the old way of doing things. The new C++11 implementations does this differently. So we check the C++11 include files.

[code language=”cpp”]template<typename _Tp>
  inline void
swap(_Tp& __a, _Tp& __b)
   {
   _Tp __tmp = _GLIBCXX_MOVE(__a);
  __a = _GLIBCXX_MOVE(__b);
   __b = _GLIBCXX_MOVE(__tmp);
  }[/code]

That’s more confusing than the previous one. Again, don’t panic. We can simplify the things. _GLIBCXX_MOVE is defined to be std::move. Let’s just call it ‘move’. So the above function is roughly similar to:

[code language=”cpp”]T tmp = move(a);
a = move(b);
b = move(tmp);[/code]

Now we are scratching our chins. At first glance, the implementation looks much similar to the grade-school swap. And then, there’s this move-thingy. Okay, looking back, we remember that the elements were ‘copied’ in the grade-school algorithm. Instead, it looks like the variables are ‘moved’ here.

And we are right! In the first line, tmp is set to the value of a, while the variable a is (temporarily) invalidated. No copying is done. The previous memory location of a is now the territory of tmp. In the next line, a is set to the value of b, while b is invalidated. Finally, b is set to the value of tmp, and tmp itself is invalidated, which we don’t need again anyway. And the result? The two values are swapped without any copy operations!

How does this moving really work? C++11 introduces the so called “rvalue references”. The ‘move’ function returns the rvalue of the input parameter without triggering a copy construction.

[code language=”cpp”]T &a = x; // normal (lvalue) reference
T &&b = y; // rvalue reference [/code]

A full description will not fit in this post, but you can go through this nice little introduction on rvalue references. You might also want to refresh your memory about lvalues and rvalues.

And let’s call it a day and meet again with another little C++ adventure.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html

ලොව ජයගත හැකි සාර්ථක මෘදුකාංග ඉංජිනේරුවෙකු විය හැක්කේ කෙසේද?

දැනට වසර දෙක තුනක සිට පවතින ලෝක ආර්ථිකයේ පසුගාමී ස්වභාවය හමුවේ පවා “මෘදුකාංග ඉංජිනේරු” (Software Engineering) වෘත්තියෙහි රැකියා අවස්ථාවන් මේ ගෙවීයන දශකය (2011 – 2020) තුළදී 30% කින් වර්ධනය වනු ඇති බව එක්සත් ජනපදයේ කම්කරු සංඛ්‍යාලේඛන කාර්යාංශය පවසයි [1]. මෙය එරට සමස්ත රැකියා වර්ධනය පිළිබඳ බලාපොරොත්තු වන අගය (14%) මෙන් දෙගුණයකටත් වැඩිය. තවද Wall Street Journal පුවත්පත පළ කර ඇති සංගණනයක් මගින් එක්සත් ජනපදයේ වෘත්තීන් 200 ක් අතුරින් හොඳම වෘත්තිය ලෙස මෘදුකාංග ඉංජිනේරු වෘත්තිය නම් කර ඇත [2]. ලෝක ආර්ථිකයේ වත්මන් මන්දගාමී තත්ත්වය යටතේ පරිගණක මෘදුකාංග පද්ධති සහ සේවා සඳහා ඇති වෙළඳපොල තව තවත් වර්ධනය වනු ඇති බව ද වාර්තා වී තිබේ. වෘත්තියක් ලෙස මෘදුකාංග ඉංජිනේරු ශිල්පය සඳහා ඇති ඉල්ලුම පසුගිය දශක දෙක පමණ ඔස්සේ අඛණ්ඩ වර්ධනයක් ලැබූ අතර එය ඉදිරියටත් තව තවත් වර්ධනය වන බව ඉහත තොරතුරු මගින් මනාව සනාථ වේ. එම ශිල්පය මැනවින් අධ්‍යයනය කිරීමට සහ වෘත්තීය (professional) මෘදුකාංග ඉංජිනේරුවෙකු වශයෙන් සාර්ථකත්වයට පත්වීමට අවශ්‍ය කරන කුසලතා ගැන යම්කිසි මග පෙන්වීමක් ලබා දීම මෙම ලිපියේ අරමුණයි.

මෘදුකාංග ඉංජිනේරු වෘත්තිය යනු තොරතුරු තාක්ෂණ (IT) ක්ෂේත්‍රයේ ඇති විවිධ වූ වෘත්තීන් අතරින් එකකි. දෘඩාංග (hardware), පරිගණක ජාලකරණ (networking), දත්ත-ගබඩා (databases), පරිගණක පද්ධති (systems engineering) ආදී විවිධ අනු ක්ෂේත්‍ර රැසක විහිදී ඇති ඉංජිනේරු වෘත්තීන් රැසක් අතර මෘදුකාංග ඉංජිනේරු ශිල්පය ද එක් විශේෂිත (specialized) වෘත්තියකි. මේ එක් එක් අනු ක්ෂේත්‍රයක් සැලකුවද ඒවායේ අතිමහත් දැනුම් සම්භාරයක් දැනමටත් ගොඩ නැගී ඇත. එසේම තොරතුරු තාක්ෂණට අයත් වන ඉංජිනේරු හා තාක්ෂණ විෂයයන් අතිමහත් වේගයකින් වර්ධනය වන බැවින් නව දැනුම් හා ක්‍රමවේදයන් එක් වීමත් පවතින ක්‍රමවේදයන් භාවිතයෙන් ඉවත් වීමත් ඉතා ඉක්මනින් සිදුවේ. තත්ත්වය මෙසේ හෙයින් එක් පුද්ගලයෙකුට මේ සියළුම ක්ෂේත්‍රයන්හි පරතෙරට පැමිණීම ට නොහැකි බව ඉතා පැහැදිලිය. මේ සියළුම විෂයයන් සඳහා පොදු වන යම් දැනුම් ප්‍රමාණයක් ඇති නමුත් එක් එක් විෂයයෙහි ගැඹුරට යන විට එම විෂය සඳහාම සීමිත වන විශේෂිත දැනුම් සහ කුසලතාවන් අවශ්‍ය වේ. එසේම එක් විෂයයක විශේෂඥ වෘත්තිකයකු (expert professional) වීම සඳහා සෑම ක්ෂේත්‍රයකම ප්‍රවීණයෙකු වීම අවශ්‍ය නොවන බවත් මෙහිදී සඳහන් කල යුතුය. ඔබත් අනාගතයේ තොරතුරු තාක්ෂණ වෘත්තිකයකු වීමට බලාපොරත්තුවන අයෙකු නම් මෙහි දැක්වූ විවිධ අනු-ක්ෂේත්‍ර පිළිබඳ දැනුවත් විය යුතු අතර තම වාත්තීය අධ්‍යාපනයේ යම් අවස්ථාවක (උදාහරණයක් ලෙස, තොරතුරු තාක්ෂණ උපාධියක් හදාරණ සිසුවෙකු අවසන් වසරේ අධ්‍යයන කටයුතු ආරම්භ කරන කාලය වන විට) මේ එක් විශේෂිත ක්ෂේත්‍රයක් තමන් විසින් තෝරා ගැනීම යෝග්‍ය බවත් ප්‍රථමයෙන් ම ලබා දිය යුතු වෘත්තීය මාර්ගෝපදේශනය බව කිව හැකිය.

ඉහත සඳහන් විවිධ ක්ෂේත්‍ර අතරින් මෘදුකාංග ඉංජිනේරු ශිල්පය නම් විශේෂිත වූ ක්ෂේත්‍රය දෙස දැන් අපගේ අවධානය යොමු කරමු. ප්‍රථමයෙන්ම මෘදුකාංග ඉංජිනේරුවෙකුට දෘඩාංග සම්බන්ධයෙන් අවශ්‍ය වන දැනුම හා අවබෝධය කෙබඳු දැයි සලකා බලමු.

Software Engineering

රූපයේ දක්වා ඇති පරිදි පරිගණකයක් සම්බන්ධයෙන් දෘඩාංග (hardware) හා මෘදුකාංග (software) යනුවෙන් ප්‍රධාන අංග දෙකක් අපට හඳුනාගත හැකිය. මෘදුකාංගයක් යනු ගොඩනැගිල්ලක් නම්, CPU චිපය, මතකය (memory), දෘඩ තැටිය (hard disk) යනාදී උපාංග සියල්ලේ සංකලනය එම ගොඩනැගිල්ලේ අඩිතාලම (platform) ලෙස සැලකිය හැකිය. සාර්ථක මෘදුකාංග ඉංජිනේරුවෙකු වීම සඳහා දෘඩාංග නිර්මාණය (design) හා නිපදවීමට (construction) හැකි තරමි දැනුමක් අවශ්‍ය නොවේ. එවැනි දැනුමක් අවශ්‍ය වන්නේ දෘඩාංග ඉංජිනේරුවෙකු වීම සඳහායි. (පරිගණකයක උපාංග එකලස් කිරීම, අළුත් මතක පතක් සවිකිරීම වැනි ක්‍රියා hardware engineering නොවන බවත් ඒවා සරල නඩත්තු ක්‍රියා බවත් මෙහිදී විශේෂයෙන් සඳහන් කල යුතුය). දක්ෂ මෘදුකාංග ඉංජිනේරු‍වෙකුට අවශ්‍ය වන්නේ දෘඩාංග මගින් මෘදුකාංග වල නිවැරදි හා ඉක්මන් ක්‍රියාකාරීත්වය සඳහා සපයන සේවා හා යටිතල පහසුකම් පිළිබඳ නිරවුල් අවබෝධය යි. උදාහරණයක් ලෙස, මතක පද්ධතියේ වේගය හා විශාලත්වය අනුව ඇති වන ධූරාවලිය  (memory hierarchy) සහ ක්‍රියාත්මක වන මෘදුකාංගයක් මගින් එම ධූරාවලියේ විවිධ ස්ථර වල ඇති දත්ත කියවන/ලියන වේගයන් (read/write speeds) පිළිබඳ දැනුම දැක්විය හැක. විවිධ මතක චිපයන් හි දත්ත ගබඩා කෙරෙන තාක්ෂණය හා එක් එක් ස්ථරයේ මතක ගබඩා වල පිරිවැය (cost) පිළිබඳ දැනුවත් වීමද වැදගත් වේ. පිරිවැය පිළිබඳ දැනුවත්කම මගින් තමන් විසින් නිර්මාණය කරන මෘදුකාංගයක  ඉක්මන් හා සුමට ක්‍රියාකාරීත්වය සඳහා අධිබල CPU චිපයක් හෝ විශාල RAM චිපයක් මත පමණක්ම යැපීමේ අවධානම වැටහෙයි. බාල ගණයේ මෘදුකාංගයක් නිපදවා එහි ක්‍රියාකාරීත්වය වැඩිදියුණු කිරීම සඳහා මිළ වැඩි දෘඩාංග යොදා ගන්නට යැයි සේවාදායකයන්ට පවසන්නේ නම් එවැනි අයෙක් දක්ෂ මෘදුකාංග ඉංජිනේරුවෙකු වශයෙන් සැලකිය නොහැකිය. පරිගණක මතකය ගැන ගත් උදාහරණයට සමාන උදාහරණ අනෙකුත් දෘඩාංග සම්බන්ධයෙනුත් අදාළ වේ. රූප සටහනේ පහතින්ම දක්වා ඇත්තේ මෘදුකාංගයක ක්‍රියාකාරීත්වය සඳහා ඉතාම වැදගත් වන දෘඩාංග කුලකයන් ය. ඒ එක එකක් ගැන විස්තර වශයෙන් සඳහන් කිරීමට මෙම ලිපියේ ඉඩ නැති නමුත් මෘදුකාංග ඉංජිනේරුවකුට දෘඩාංග ගැන අවශ්‍ය වන දැනුම ගැන යම් වැටහීමක් දැන් තිබිය යුතුය.

Software and Hardware

දෘඩාංග විසින් සැපයෙන අත්තිවාරම උඩ ක්‍රියාත්මක වන මෘදුකාංග ද විවිධ ස්ථර කිහිපයක ට වෙන් කර හඳුනාගත හැකිය. භාවිත මෘදුකාංග (application software) හා පද්ධති මෘදුකාංග (system software) යන ප්‍රධාන කුලක දෙකකට මේවා වර්ගීකරණය වේ. මෘදුකාංග ඉංජිනේරුවෙකුට මේ කාණ්ඩ දෙකටම අයත් ස්ථර වල නිර්මෘණකරණයේ යෙදිය හැකි මුත් සාමාන්‍යයෙන් මෙම ක්ෂේත්‍රයේ රැකියා ඇත්තේ ඒවායින් එක කාණ්ඩයකට සීමා වන ලෙසයි. මේ විවිධ ස්ථර මෘදුකාංග ශිල්පයේ උප විශේෂිකරණයන් (sub specialization) ලෙස හැඳින්විය හැකිය.

පරිගණකයක පරිශීලකයා (user) හට අවසන් වශයෙන් අවශ්‍ය වන්නේ විවිධ කාර්යයන් ඉටු කර දෙන මෘදුකාංග (application software) ය. සිලිකන් පරිපථ හා චුම්භක කොටස් යනාදිය එකතු කොට නිපදවා ඇති උපාංග හරහා විදුලි ධාරාවන් ගමන් කරන විට ක්‍රියාත්මක වන දෘඩාංග සමූහයක් මත ධාවනය වන මෙහෙයුම් පද්ධතියක් (operating system) සහ තවත් විශේෂිත මෘදුකාංග සැකිලි (software frameworks) මත දිවෙන මෘදුකාංගයක් තමන් භාවිතා කරන බව පරිශීලිකයා හට දෘෂ්‍යමාන නොවේ. නවීන වාහනයකට නැග බොත්තමක් ඔබා එය පණ ගන්වා, ස්වයංක්‍රීය ගියරය දමා, වාහනය අභ්‍යන්තරයේ සිදුවන දහසකුත් එකක් ක්‍රියා ගැන කිසිදු අවබෝධයක් නැතිව ‍ එය ධාවනය කරවන රියදුරෙකුත් සාමාන්‍ය පරිගණක භාවිතා කරන්නෙකුත් අතර එතරම් වෙනසක් නැත. ඒ එසේ නමුත්, මෘදුකාංග නිර්මාණකරුවෙකුට තම වෘත්තියේ විශේෂඥයකු වීම සඳහා මේ විවිධ අන්තර් ස්ථර පිළිබඳ ඉතා නිරවුල්, ගැඹුරු අවබෝධයක් තිබීම අත්‍යවශ සාධකයක් වේ. සෑම අවස්ථාවක ම බිම් මට්ටමේ සිට සියළුම මෘදුකාංග තමන් විසින් ම නිර්මාණය කර ගත යුතු බවක් මින් අදහස් නොකෙරේ. යම් යම් අය විසින් පෙර නිමවා ඇති යටිතල මෘදුකාංග හා මෘදුකාංග සැකිලි යොදා ගනිමින් භාවිත මෘදුකාංග නිර්මාණය කිරීමෙහි කිසිම වරදක් නැත. ඵලදායි මෘදුකාංග නිර්මාණකරණයක් සඳහා එසේ යොදා ගැනීමත් අත්‍යවශ්‍ය කාරණයකි. අප විසින් නොකල යුත්තේ එම පහත ස්ථරයන් ගැන අනවබෝධයෙන්, උඩින් පල්ලෙන් අතගාමින් මෘදුකාංග නිර්මාණකරනයේ යෙදීම යි. තමන් නිපදවූ මෘදුකාංගය නිසි පරිදි ක්‍රියාත්මක නොවන මොහොතක ඒ ඇයිදැයි සොයා බැලීමට බිමි මට්ටමට එබී බලා ඒ නිවැරදි කිරීමේ හැකියාව හා අවබෝධය (ability to look under the hood) ඇතිව ඒවා යොදා ගැනීම දක්ෂ මෘදුකාංග ශිල්පියෙකුගේ ලක්ෂණය යි. එසේ නොමැතිව, යම් මෙහෙයුම් පද්ධතියක් මත දුවන අතථ්‍ය යන්ත්‍රයක (virtual machine) සේවා යොදා ගනිමින් ලියා ඇති මෘදුකාංග සැකිල්ලක ආධාරයෙන් යම් භාවිත මෘදුකාංගයක් නිපදවූ පමණින් තමන් මෘදුකාංග ඉංජිනේරුකරණයේ යෙදුනු බව සිතා නොගත යුතුය. සැබැවින්ම එය සරල වූ වැඩසටහන්කරණයක් (a mere programming job) පමණි.

SW_languages

රූප සටහනේ දක්වා ඇති විවිධ ස්ථර පිළිබඳ නිවැරදි දැනුම ට අමතරව මෘදුකාංග නිර්මාණකරනය ට අදාළ වන විෂයයන් හා මෙවලම් ගැන හොඳ න්‍යායාත්මක හා ප්‍රායෝගික දැනුමක්ද තිබීම අත්‍යවශ වේ. Computer Architecture, Operating Systems, Data Structures and Algorithms, Object Oriented Analysis and Design, Compiler Theory, Programming Theory සහ Database Designing වැනි විෂයයන් ගැන නිවැරදි දැනුම දක්ෂ මෘදුකාංග ඉංජිනේරුවෙකුගේ දැනුම් ගබඩාවේ නිත්‍ය හා ප්‍රමුඛ අංගයන් වේ. එසේම compilers, debuggers සහ test tools වැනි මෙවලම් (මේවාද තවත් විශේෂිත මෘදුකාංගයන් ය) ගැන ප්‍රායෝගික දැනුම ද මෘදුකාංග නිර්මාණ ක්‍රියාවලිය (software development life cycle) ගැන අවබෝධය ද ඉතා වැදගත් වේ.

මේ කරුණු සලකා බලන විට විවිධ කෙටිකාලීන පරිගණක පාඨමාලා හැදෑරීම හරහා මාසිකව ලක්ෂ ගණනින් ආදායම් උපයා ගත හැකි මෘදුකාංග ඉංජිනේරුවන් විය හැකි බව පවසමින් සිසුන් නොමග යවන විවිධ දැන්වීම වර්තමානයේ දැකිය හැකි වීම කණගාටුවට කරුණකි. මෙබඳු වෙළෙන්දන් ගෙන් මුලා නොවීමට සිසුන් හා දෙමව්පියන් වග බලා ගත යුතු අතර එබඳු පාඨමාලා යම් කිසි ප්‍රමිතිකරණයකට හා නියාමනකට ලක් කිරීමට බලධාරීන් ක්‍රියා කල යුතු බව අපගේ අදහසයි.

Facebook, Twitter වැනි සමාජ ජාල වල කරක් ගසමින් හෝ පරිගණක ක්‍රීඩා වල යෙදෙමින් නිකරුණේ තම අගනා කාලය අපතේ යැවීම වත්මන් සිසු පරපුර අගාධයට යවන්නක් බව කිව යුතුය. ඊමේල් යවන්නට දැන ගැනීම, අන්තර්ජාලයේ සැරිසැරීම හෝ MS Office වැනි මෘදුකාංග පැකේජයක් අත පත ගා යමක් කර ගැනීමට හැකි වීම ඉහළ මට්ටමේ තොරතුරු තාක්ෂණ වෘත්තිකයෙකු වන්නට සුදුසුකමක් නොවේ. එම දැනුම මගින් යම් අයෙකුට දත්ත ඇතුළත් කරන්නෙකු (Data Entry Operator) වැනි ආරම්භක ශ්‍රේණියක ලිපිකාර රැකියාවක් ලබා ගත හැකි වනු ඇත. කෙනෙකු ලබන අධ්‍යාපනය හා පුහුණුව අනුව ඕනෑම ක්ෂේත්‍රයක වැඩි හා අඩු වැටුප් තල වල ඇති රැකියාවන් තිබෙන අතර තොරතුරු තාක්ෂණයේදීත් මේ තත්ත්වය එලෙසම පවතී. CPU Chip Designer, Software Architect වැනි වැඩි වැටුප් ඇති වෘත්තීන් හි සිට Computer Assembler, Programmer වැනි ආරම්භක වැටුප් ඇති වෘත්තීන් දක්වා ඇති විශාල පරාසයක මෙම රැකියා විහිදේ.

SW_Programmer

සාරාංශ වශයෙන්, දෘඩාංග මගින් මෘදුකාංග වෙත සැපයෙන් සේවා ගැන පැහැදිලි අවබෝධය, විවිධ මෘදුකාංග ස්ථර සහ ඒවා අතර ඇති අන්තර්ක්‍රියා පිළිබඳ අවබෝධය සහ තම වෘත්තිය දැනුමෙහි අරටුව ලෙස සැලකිය හැකි විෂයයන් හා මෙවලම් ගැන නිවැරදි න්‍යායාත්මක හා ප්‍රායෝගික දැනුම යන කාරණා සාර්ථක මෘදුකාංග ඉංජිනේරුවෙකු වීමට අවශ්‍ය ප්‍රධාන අමුද්‍රව්‍ය ලෙස ඉදිරිපත් කළ හැකිය. මෘදුකාංග ක්ෂේත්‍රයේ දක්ෂ වෘත්තියකුට වීමට ඔබත් බලාපොරොත්තු වන්නේ නම් මෙම කරුණු පිළිබඳ හොඳ අවධානයක් යොමු කල යුතු බව පැවසිය හැකිය. ලොව ජයගන්නා සාර්ථක මෘදුකාංග ඉංජිනේරුවන් අප රටෙන් බිහි කල හැකි බව දැනටමත් සනාථ වී ඇත. ඒ කාර්යය තව තවත් ඔප් නැංවීමට යම් කිසි අත්වැළක් මෙම ලිපියෙන් සැපයෙනු දැකීම අපගේ අවසන් ප්‍රාර්ථනය යි.

 

ඉෂාන් ද සිල්වා

ඉංජිනේරු විද්‍යාවේදී‍ (ගෞරව)

ලේඛකයා මොරටුව විශ්ව විද්‍යාලයේ පරිගණක ඉංජිනේරු උපාධියෙන් ප්‍රථම පන්තියේ සාමාර්ථයක් ලබා ඇත.  ලංකාවේ ප්‍රමුඛතම මෘදුකාංග සමාගමක සේවය කරන හෙතෙම මෘදුකාංග නිපදවිමේ ක්‍රියාවලියේ විවිධ මට්ටම් වල නිරත වෙමින් වසර දහයක පමණ අත්දැකීම් ලබා ඇත්තෙකි.

 

යොමු ලිපි:

[1] http://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm#tab-6

[2] http://online.wsj.com/article/SB10001424052702303772904577336230132805276.html

Title image credits: timeunion.com