Thursday, May 05, 2011

Sutter's Interview on C++0x

Here's an interview with Herb Sutter about ISO C++0x, C++’s place in the modern world, goals of C++0x, etc.
See below for the specific questions that were asked.

1:37 -> What were the goals of the C++0x standard, at a high level?
2:40 -> Language and Library abstractions and performance (how high can you go and still be fast as possible?)…
5:23 -> C++ as an application development language (in addition to the traditional C++ is a systems programming language meme)…
07:17 -> C++0x or can we now call it C++11?
09:21 -> Standards committees and real world user representation…
10:39 -> Who comes up with the new features that get standardized (or not…)?
13:01 -> What were the goals of the C++0x standard (non-canned answer)?
14:21 -> What does Bjarne mean by C++0x being a better C++ for novice programmers?
15:51 -> Why can’t C++ look more like C#?
18:50 -> At the end of the day, everything(in terms of programmer-controlled computing) boils down to memory, right?
25:05 -> What can VC++ developers expect to see in terms of C++0x implementation in Visual C++ next?
27:09 -> C++ and type safety…
29:05 -> C++0x and backwards compatibility: any big breaking changes?
34:16 -> C++0x in the Standard Library…
37:01 -> Any thinking in the Committee about doing more frequent experimental releases C++?
39:04 -> Are their features that didn’t make it into the standard that you really wanted to be standardized?
41:45 -> Are you comfortable with C++’s current state? Is it modern enough?
43:22 -> Conclusion (or Charles doesn’t end the conversation when his farewell begins – where does it go from there? )

Friday, April 29, 2011

Facts to keep in mind before taking a loan

1. % of EMI to your "take home" salary:
Should not be more than 25-30% e.g. Your gross salary is Rs. 60k/month and take home (after PF and tax) is 50k/month, EMI shouldn't be more than appx. 12.5 to 13k/month.
Reason: You have/will have other liabilities like other premiums like insurance, investments, retirement planning, children's education, medical emergency, job loss (recession), etc.

2. Tenure:
Don't go for too long tenure such as 25 years. Especially if you are in the 40's. Plus, in low tenure loans, you will end up paying more EMI but less interest. However, balance this with point (1). above

3. Penalty for not paying EMI for some duration:
Check the interest rate type - floating/fixed. Check the grace period. If EMI is insured, still it normally is for around 2-3 months. So, ultimately you will have to make arrangements for paying subsequent EMI.

4. Does it build your assets or is just for luxury?
It is not a good idea to take loan for improving your lifestyle. However, either if it builds your property/assets (e.g: home) or it is a requirement (e.g. bike) then you can definitely consider it.

5. Do you have any mortgage if you are not able to pay the loan?
If no, then lender has the authority to seize your property for which loan was taken (of course as per the loan agreement). Plus, it hurts your reputation.

6. Is the asset value going to appreciate or depreciate?
It is observed that value of home always appreciates over a period of time. However, value of car/bike depreciates. So, you should consider this.

Wednesday, April 27, 2011

10 Golden Rules of Investment


1. Start early - even with small amount
2. Don't try to mimic others. Apply your own brain
3. Don't purchase and sell in a hurry. Give your investment some time to mature.
4. Diversify your investments.
5. Invest continuously even though it might be small. Don't wait for money to accumulate for investment. SIP is a good option.
6. Don't be greedy. Plan your investment and expected returns, esp. for share market.
7. Don't take loan for investment
8. Make yourself knowledgeable.
9. Don't love a single share.
10. Don't either love or hate share market.

Tuesday, April 26, 2011

Short Term Investments



Short term investment is investment for a term for around 1 - 1.5 years. Here are a few options that can/should be considered: 

1. FD - Fixed deposit
- Amount is deposited for a fixed term
- Amount can be withdrawn before the term (however, with some penalty)
- Minimum term - 30 days
- Advisable to make FD for max of 1 Lac even if you want to make FD for amount more than that. Since FD till 1 Lac is insured. On the other hand, if FD is for > 1 Lac, amount insured is only till 1 lac
- Joint FD is useful for safety wherein other nominee can be withdrawn.

2. SIP (Systematic Investment Plan):
- It is invested in MF(mutual fund)
- You can invest starting from Rs 500/month
- Long term investment in SIP is known to give one of the best yield

3. Initial Public Offering
- Invest in company with high issue size, well known company
- Tax of 15% if you sell the shares purchased.

4. Direct Market Trading
- If you don't have capacity to withhold and sesitive to ups and downs of the market, DON'T invest directly in market

5. Gold
- Not an attractive option anymore.

6. Property
- Very hard to get good appreciation on investment for a short term such as 1 year.

Saturday, December 25, 2010

g++ Compiler Options

Always strive to compile code using the highest warning level available for your compiler and eliminate warnings by modifying the code. This really helps avoid all those hours of debugging and frustration - at the end of which you discover that all the mistake you did was a silly function returning no value in some code path or forgot to add default case to switch statement!

In this article, I will present a whole list of options for g++ compiler. I have borrowed the detailed description of these options from gcc/g++ online manual. In case of any doubt, please consult relevant documentation on your system specific to your compiler version.


-D_GLIBCXX_DEBUG -g -Wall -Wextra -pedantic  -Weffc++ -Wold-style-cast -Woverloaded-virtual -Wswitch-default -Wswitch-enum -Wmissing-noreturn -Wunreachable-code –Winline


Description:


-D_GLIBCXX_DEBUG  :
This is the libstdc++ debug mode which replaces unsafe (but efficient) standard containers and iterators with semantically equivalent safe standard containers and iterators to aid in debugging user programs.

-g :
Produce debugging information in the operating system's native format (stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging information.

On most systems that use stabs format, -g enables use of extra debugging information that only GDB can use; this extra information makes debugging work better in GDB but will probably make other debuggers crash or refuse to read the program. If you want to control for certain whether to generate the extra information, use -gstabs+, -gstabs, -gxcoff+, -gxcoff, or -gvms (see below).

Unlike most other C compilers, GCC allows you to use -g with -O. The shortcuts taken by optimized code may occasionally produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values were already at hand; some statements may execute in different places because they were moved out of loops.
Nevertheless it proves possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs. 


-Wall :  Enable all warnings. Consult manual for more details.


-Wextra : Enable some extra warnings in addition to -Wall

-pedantic : Issue all the warnings demanded by strict ISO C and ISO C++

-Weffc++ :
Warn about violations of the following style guidelines from Scott Meyers' Effective C++ book:

    * Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory.
    * Item 12: Prefer initialization to assignment in constructors.
    * Item 14: Make destructors virtual in base classes.
    * Item 15: Have operator= return a reference to *this.
    * Item 23: Don't try to return a reference when you must return an object.

Also warn about violations of the following style guidelines from Scott Meyers' More Effective C++ book:

    * Item 6: Distinguish between prefix and postfix forms of increment and decrement operators.
    * Item 7: Never overload &&, ||, or ,.

When selecting this option, be aware that the standard library headers do not obey all of these guidelines; use grep -v to filter out those warnings.

-Wold-style-cast :
Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts (static_cast, reinterpret_cast, and const_cast) are less vulnerable to unintended effects and much easier to search for.

-Woverloaded-virtual: Warn when a function declaration hides virtual functions from a base class.

-Wswitch-default : Warn whenever a switch statement does not have a default case.

-Wswitch-enum : Warn whenever a switch statement has an index of enumeral type and lacks a case for one or more of the named codes of that enumeration. case labels outside the enumeration range also provoke warnings when this option is used.

-Wmissing-noreturn :
Warn about functions which might be candidates for attribute noreturn. Note these are only possible candidates, not absolute ones. Care should be taken to manually verify functions actually do not ever return before adding the noreturn attribute, otherwise subtle code generation bugs could be introduced. You will not get a warning for main in hosted C environments.

-Wunreachable-code :
Warn if the compiler detects that code will never be executed.

This option is intended to warn when the compiler detects that at least a whole line of source code will never be executed, because some condition is never satisfied or because it is after a procedure that never returns.
It is possible for this option to produce a warning even though there are circumstances under which part of the affected line can be executed, so care should be taken when removing apparently-unreachable code.
For instance, when a function is inlined, a warning may mean that the line is unreachable in only one inlined copy of the function.

–Winline : Warn if a function can not be inlined and it was declared as inline. Even with this option, the compiler will not warn about failures to inline functions declared in system headers

If you have any questions/suggestions do let me know by leaving a comment. Thanks. Enjoy your time with g++!

Wednesday, November 10, 2010

CScope and CTags

CSCOPE:
Cscope can be a particularly useful tool if you need to wade into a large code base. You can save yourself a lot of time by being able to do fast, targeted searches rather than randomly grepping through the source files by hand (especially since grep starts to take a while with a truly large code base).

Steps:
1. Get the source. First get the source code.
2. Figure out where you want to put your Cscope database files.
3. Generate cscope.files with a list of files to be scanned.

   find . -name '*.h' > cscope.files
   find . -name '*.cpp' >> cscope.files


4. Generate the Cscope database.
   cscope -b -q

The -b flag tells Cscope to just build the database, and not launch the Cscope GUI. The -q causes an additional, 'inverted index' file to be created, which makes searches run much faster for large databases.

5. Using the database
Append following line to your ~/.bashrc:
alias csd='cscope -d'

This tells Cscope not to regenerate the database. Otherwise you'll have to wait while Cscope checks for modified files, which can take a while for large projects, even when no files have changed. If you accidentally run 'cscope', without any flags, you will also cause the database to be recreated from scratch without the fast index or kernel modes being used, so you'll probably need to rerun your original cscope command above to correctly recreate the database.


Now, use command: csd


6. Regenerating the database when the source code changes.
If there are new files in your project, rerun your 'find' command to update cscope.files if you're using it.

Then simply invoke cscope the same way (and in the same directory) as you did to generate the database initially (i.e. cscope -b -q)


CTAGS:
Here are few useful tips. Refer to the manual page for more details using "man 1 ctags"

1. Build tags database:
ctags -R *
It creates a tags file

Create a tags file for Perl
ctags --languages=Perl -R

2. Add it to your editor (in ~/.vimrc file in my case):
set tags={Path to your view (since you might want to have separate tags file for each view)}/tags

3. Other options:
--exclude=[pattern] 
Add pattern to a list of excluded files and directories. This is used to avoid creating tags on specified files or files under directories.

Friday, October 22, 2010

Goal Setting


There is a difference between dream and goal.

Benefits of setting an achievable goal:
1. Guiding decisions
2. Monitor progress
3. Communicating growth

                                                 Goal
                                               /        \
           Professional            Personal

Types of Goals
  1. Performance – Raise your aim and take advantage of current abilities
  2. Development – Expand abilities

Setting Goals

Objective component – eg: conduct interviews, submit a plan, write a report

Standards component – measures whether an objective has been met. eg: within 6 weeks, by 30%, less than 5 times

Conditions component – clarifies the objective. Limitation on how to achieve the goal


Strategic Thinking
1. Win collaboration
2. Assess the risk
3. Reduce wasted effort – Productivity


Assessing Risk

Risk -> Time/Effort

-          Classify goals in low risk and high risk
Type of change associated with high risk goals
-          Create a new condition
-          Eliminate an existing condition

Type of change associated with low risk goals
-          Preserve an existing condition
-          Avoid an unwanted condition

Beware of unstated goals

Collaborating on Goals
- Define the conflict
- Propose a collaboration
- Define roles for participants


Prioritizing Goals
Advantages:
  1. You achieve your goals more quickly
  2. You take action on imp and urgent goals first
  3. you are better able to recognize when it’s time to let or choose an alternative goal.

- Personal importance
- Professional importance
- Resource availability
- Resource urgency

Plot a graph of importance vs availability


Setting Alternative Goals
Strategies:
  1. Breaking out smaller objectives
  2. Reassessing priorities
  3. Seeking a different path to dest

Don’ts:
  1. Relaxing standards
  2. Extend deadline
















Thursday, October 21, 2010

Static Code Analysis

Static code analysis is the process of examining  and evaluating software without actually executing the code. Analyzing software when executing software is known as dynamic analysis. Static code analysis is all about moving the detection of critical security and quality problems upstream, ensuring they’re identified and fixed early in the development process.

This approach yields significant productivity gains across the entire process and leads to cleaner, more stable builds, more efficient testing, and of course, a higher quality product. Besides helping us find bugs that we’ve missed in unit testing, static code analysis has made all our engineers aware of security issues and helped us teach junior staff better coding techniques.


What’s Involved?
Static source code analysis tools are almost entirely automated. They’re like compilers, but instead of generating machine-executable code, they simply find bugs and issue warnings about security vulnerabilities, logic errors, implementation defects, concurrency violations, boundary conditions, and other glitches in the code. The tools provide a list of problems, each tied to a specific location in the source code. Detailed context is usually provided to explain how the tool arrived at the conclusion.

Static analysis tools use very sophisticated process flow and data flow analysis. The quality and security issues they identify are often complex and involve obscure logic problems, which is why these tools can be so valuable.

Static source code analysis tools analyze 100% of the source code, far more than any external test tools. For organizations that must comply with the Payment Card Industry Data Security Standard (PCI DSS) or Payment Application Data Security Standard (PCI PADSS), these tools fulfill code review requirement. They also produce valuable metrics, including kilo-lines of code (KLoCs), file counts, and “churn” — that is, the number of files that have changed between two regular builds.

Introducing static code analysis and the requisite tools into the development process isn’t always painless, however. For instance, static code analysis tools usually require careful integration into the project build process. For large software products, these builds are often somewhat of a black art,  involving the use of Make and Ant. There are many options and dependencies. All static code analysis tools offer powerful utilities to analyze the build process and insert themselves into the right places, but some manual tuning is usually required.

These tools also must be integrated into developers’ daily work. Again, tool makers offer both command-line versions of the tools as well as plugins for many of the popular integrated development environments such as Eclipse and Visual Studio.

The tools require that the code base have a subject matter expert (SME) who can also provide the same service for the tools. That person will answer questions not just about how the tool operates but also about the issues that the tool is finding — including identifying when the tool is generating a false positive. The SME will provide training and support to other developers, a fairly heavy workload for the first few weeks, until everyone is familiar with the  static analysis tool. After that, that part of the workload should settle down to several hours a week.


Initial Analysis
The biggest challenges with static code analysis tools are problems in existing code. There’s an old programmer’s joke that says “God made the world in six days because he had no installed base.” This is certainly not the case for most businesses, which often have millions of lines of code.

The first time an existing codebase is analyzed, tens of thousands of issues will be found. Don’t panic. Remember, these issues have been there for awhile, and the software continues to function and provide users with what they need. At ACI Worldwide, all the issues from an initial build on existing code are immediately deferred and hidden from sight. That way developers don’t get overwhelmed and can stay focused on ensuring that new problems aren’t introduced into the code. At some point in the future, product planners and the senior development staff review the deferred issues, prioritize and group them, and decide when remediation can be factored into the planning for a future release. There’s no perfect approach, and businesses must always make hard decisions
about whether to counter a vulnerability or assume the risk.



Tips For Success
• Define an initial issue policy. You may decide to only deal with the most severe issues for the first project cycle.
• Get the global mechanics working. Many of the tools require license managers and centralized result servers.
• Attack one product at a time. Get it working with one group and then move on to the next.
• Identify SMEs. Every product needs at least one subject matter expert. Large products that are broken into major components will naturally need an SME for each one.
• Train SMEs. Make them designated experts.
• Work with SMEs. Help them to do build and tool integration for their product or component.
• Train developers. The SME should guide how the tool is integrated into the team’s development process.
• Perform initial analysis on existing code and defer all issues. Don’t discuss the large quantity of issues with the developers. If any ask, explain to them that they’ve been set aside and will be considered in a future product cycle.
• Deliver help from SMEs to developers as required. During the first days of the roll-out, the SME should monitor the developers’ work. Developers should be analyzing the code often, at least before they submit a completed unit of work into the product build. Just as a developer wouldn’t check in a unit of code that doesn’t compile, they won’t want to check in a unit that still has static code analysis issues.
• Run the build analysis often. If the developers are doing their job and addressing issues as they come up, then no issues should be found at this stage.
• Review deferred issues. After the process is running smoothly and the tool is a routine part of work, review deferred issues and plan whatever remediation is needed for future releases.

 

The Right Tool For You
There are numerous open source and commercially available static code analysis tools on the market. When choosing one, the place to start is with language support. Some tools support a single language. Other static code analysis tools support multiple languages.



Final Analysis
Overall, static code analysis has proven to be a valuable tool. For a reasonable cost per developer, we can find serious bugs more comprehensively and earlier in the development process.

The tools include extensive help files that refer developers having difficulty with an issue to a more experienced developer to get advice — always a valuable interaction.

Bottom line: Static code analysis tools help incorporate security and quality awareness into the fabric of the entire development organization. Finding bugs earlier and avoiding security breaches
is invaluable to any software development effort.









 
5 Queries for Choosing the Right Code Analysis Tool
1. Do you need a static or dynamic analysis tool?
2. What languages and platforms does it support?
3. How flexible is the reporting component?
4. How easy is it to add or update rules?
5. Does it integrate with your IDE?

Time Management


Areas:
A.      Environment
B.      Technology
C.      Time stealers


A. Controlling Environment:
1.      Paperwork
2.      Physical organization
3.      Meeting

A Technique for Managing Paperwork
Pass on – to be read by someone else, pass on to only one person avoid passing on multiple copies.
Read – read short docs immediately, long docs later
File – needed in future
Throw away – irrelevant doc

Physical organization
Comfort,
Structure,
Tidiness

Preparing to save time
  1. Ask the right questions – necessity, contribution, action





B. Time and technology:
Benefits:
  1. Communicate info very quickly over any distance.
  2. Enables you to store and retrieve info extremely easily

Controlling emails
Strategy (In order):
  1. Allocate specific time for addressing emails.
  2. Minimize the no. of emails to be read
  3. Prioritize actions as a result of email.
  4. Minimize the time that each necessary reply requires.

-         Deactivate desktop alerts

Electronic organization systems
  1. PC based system – large amt of data that doesn’t need to be shared
  2. telephone based – small amount of data which is very portable
  3. networked  - very large amount of data, shared access





C. Time stealers

Dealing with demands
  1. Inner directed – minimizes time given to other person
  2. Other directed – Gives much time to other person
  3. Autonomous – focuses on own goals and that of other person simultaneously.

Avoiding reverse delegation:
  1. Set boundaries
  2. Offer information
  3. Refuse extra work.

Beating Procrastination
- Results into fatigue and waste of time
Excuses:
  1. I have lack of info – get relevant info from concerned ppl ASAP
  2. I have plenty of time – identify exact amt of time required for the task and schedule each action
  3. I don’t have any time – reprioritize

Underlying reasons:
  1. anxious
  2. low motivation

How to beat?
  1. confront excuses
  2. break the habit
  3. identify the outcome
  4. take the first step
  5. learn from the past

Handling Interruptions
1.      Don’t either welcome or refuse an interruption
2.      Aim to use your time as well as possible
3.      Control what happens when you are interrupted.
  1. Allocate time – Be specific on amt of time. Say : “I have X mins”
  2. Control content
  3. Control end – Say: “Unfortunately, I have another commitment now”
  4. Learn to say NO










Tuesday, October 05, 2010

GDB Essential commands


Command Abbr Description
set args
set command args. Also can do: gdb --args command arg1 ...
break b set breakpoint (at function, line number, ...)
run r (re)start execution
continue c Continue execution
step s Next line
next n next line without recursing into functions
finish fin next line after this function returns
list l show source (for line, function, offset, ...)
backtrace bt Show the stack of functions. Add "full" to include local variables
up, down, frame up, down, f Move between current stack frames
watch wa break when variable changes value
display

disp display expression each time program stops

info locals i loc display local variables
info threads i thr Display all threads
thread thr Switch to thread #
info breakpoints i b Display all breakpoints
Delete, enable, disable d, en, dis Delete, enable, disable breakpoint
help h display online help
focus next fs n switch window (allows cursor keys in CMD window for e.g.)
Ctrl-x a
Display code in another window
Ctrl-L
redraw the display (if program outputs for example)
print p Print value of expression
set variable set v Evaluate expression EXP and assign result to variable VAR
x/FMT x/FMT Examine memory


Sample .gdbinit file: 

# Set verbose printing of informational messages.
set verbose on
# Set printing of addresses
set print address on
# Set printing of object's derived type based on vtable info
set print object on
set print sym on
# Set prettyprinting of structures
#set print pretty off
# Set printing of C++ static members
set print static-members on
# Set demangling of encoded C++/ObjC names when displaying symbols
set print demangle on
# Unset printing of 8-bit characters in strings as \nnn
set print sevenbit-strings off
# Set prettyprinting of arrays
set print array on
# Set printing of array indexes
set print array-indexes
# Set printing of char arrays to stop at first null char
set print null-stop on
# Set printing of unions interior to structures
set print union on
# Set printing of C++ virtual function tables
set print vtbl on
# Set saving of the history record on exit
set history save on
# Set history expansion on command input
set history expansion on
# Set gdb's prompt
set prompt (onkar)

handle SIGCONT nostop

#### OTHER OPTIONAL SETTINGS ####
# Set a limit on how many elements of an array GDB will print. If GDB is printing a large array, it stops printing after it has printed the number of elements
# set by the set print elements command. This limit also applies to the display of strings. When GDB starts, this limit is set to 200. Setting number-of-elements
# to zero means that the printing is unlimited.
#set print elements number-of-elements


#source ~/stl-views-1.0.3.gdb

#set history filename     # TODO: enable this if reqd. Set the filename in which to record the command history

#catch throw

Useful commands:

Conditional breakpoint:

break main.cc:100 if i == 10
 

Repetitive commands:

b main()
(gdb) command 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>print i
>print j
>print k
>end

The directory command and setting source directory:

(gdb) directory ~/src/somepackage/src
Source directories searched: /home/nelhage/src/coreutils-7.4:$cdir:$cwd 
 
This requests gdb to search for source files in the given dir in addition to 
the existing directories.