Thursday, January 5, 2012

Android: Creating Multi-Column Layout with ArrayAdapter

Android provides ListView for creating list with single column where as there is GridView which is used to create the grid view. However there cases when you would want to create tabular format data view e.g. list view with multiple columns. In order to display a list of data in a multi-column layout spreadsheet style, you could follow some examples on stackoverflow.com. I have gone through most of them and used the simple and easy to use format for my app and thought to share for my viewers.

here are the steps:

Step 1. insert a simple list view which you would turn it to multi column.


file: main.xml

[xml]
<ListView android:id="@+id/mylist" android:layout_width="wrap_content" android:layout_height="wrap_content">
</ListView>
[/xml]

Step 2. create a row format which will be shown for each row in the list. (multi column view).


file: mylistrow.xml

[xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="4dip"
android:paddingBottom="6dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView android:id="@+id/column1"
android:gravity=”left”
android:layout_width="50dip"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/column2"
android:gravity=”center”
android:layout_width="70dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView android:id="@+id/column3"
android:gravity=”right”
android:layout_width="60dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
[/xml]

notice the gravity field, which means how you would like to change the orientation of the text. The last two columns have layout weight 1 which means the extra space in the row will be evenly distributed to these columns in order to fill the space. you can read more about weight here.

Step 3. using SimpleAdapter to configure the data binding to these columns


[java]
ListView list = (ListView) findViewById(R.id.mylist);
ArrayList<HashMap<String, String>> mylistData =
new ArrayList<HashMap<String, String>>();

String[] columnTags = new String[] {"col1", "col2", "col3"};

int[] columnIds = new int[] {R.id.column1, R.id.column2, R.id.column3};
for(int i=0; i<3; i++)
{
HashMap<String,String> map = new HashMap<String, String>();
//initialize row data
for(int j=0; j<3; j++)
{
map.put(columnTags[j], "row”+i+”col"+j);
}
mylistData.add(map);
}
SimpleAdapter arrayAdapter =
new SimpleAdapter(this, mylistData, R.layout.mylistrow,
columnTags , columnIds);
list.setAdapter(arrayAdapter);
[/java]

Here is how the list will look like:


















row0col0row0col1row0col2
row1col0row1col1row1col2
row2col0row2col1row2col2


for more details on how to use advanced features of the listview, refer here.

Sunday, January 1, 2012

Wordpress: how to generate DocBook style posts

I'm regular follower of http://www.vogella.de site. What I liked most about the site is its presentation and a way to show users how up to date the articles are. Users like to know how fresh the content is and how frequently they are updated. I would also don't like to read the technical articles which are pretty old and may not be up to how technology is changing.

The site uses "DocBook XSL Stylesheets" tool to generate the contents and manage the revisions. As we all know that most of the blogging sites are based on WordPress. I have done my homework on how easy it is to convert the wordpress posts into revision based article.

sample screenshot:



Here is the code base which you can try out.


Note that all these code changes have to happen in your theme code.

1. functions.php


add below function to functions.php file.

[php]

<?php

function get_post_revision_info($postId) {
global $wpdb;

$sql = "("
. " SELECT ID, post_author, post_name, post_modified, post_parent, post_type"
. " FROM wp_posts"
. " WHERE post_parent =".$postId.""
. " AND post_type = \"revision\""
. " )"
. " UNION"
. " ("
. " SELECT ID, post_author, post_name, post_modified, post_parent, post_type"
. " FROM wp_posts"
. " WHERE id =".$postId.""
. " AND post_type = \"post\""
. " ) ORDER BY `ID` ASC";

$posts=$wpdb->get_results($sql);
$header="";
$lastrevision = "1";
$output="";
$postYear = date('Y'); ;

if ($posts)
{
$cnt = 1;

$output .= "<h3>Revision History</h3>";
$output .="<table>";

foreach ($posts as $post)
{
$lastrevision = $cnt;

$author = get_the_author_meta( 'display_name', $post->post_author);
$datetime = strtotime($post->post_modified);
$modified = date( 'm.d.Y', $datetime);

$rev = "Revision ".$cnt.".0";
$updated = "updated";
if($post->post_type == "post")
{
$updated = "created";
$postYear = date( 'Y', $post->post_modified ); //post created date
}

$output .="<tr>";
$output .="<td>".$rev."<td>"."<td>&nbsp;</td>";
$output .="<td>".$updated."<td>"."<td>&nbsp;</td>";
$output .="<td>".$modified."<td>"."<td>&nbsp;</td>";
$output .="<td>".$author."<td>"."<td>&nbsp;</td>";
$output .="</tr>";

$cnt++;
}
$output .="</table>";
}
else
{
$output .= "no revision history found.<br />";
$output = $sql;
}

$curYear = date('Y'); ;
$copyright = "Copyright &copy; ".$postYear . (($postYear != $curYear) ? '-' . $curYear : ''). " ".get_the_author();

$header .= "Author ".get_the_author()."<br>";
$header .= "Current Version ".$lastrevision.".0"."<br>"; //1.0, 2.0...
$header .= $copyright."<br>";
$header .= date("m.d.Y")."<br>";

$footer = "<h3>Excerpts:</h3>";
$footer .= "<i>".get_the_excerpt()."</i><br/><br/>";
$footer .= "<h2>Article Details</h2>";

return "<h2>".$header."</h2><br/>".$output."<br/><br/>".$footer."<br/>";
}

[/php]

2. single.php


add below code (a call to post_revision_info) in single.php

[php]

<div class="entry-content">
<?php print get_post_revision_info(get_the_ID()); ?>

[/php]

This is my first version of the code. it may not generate the well-formed HTML code or may not suit to your theme.
so please change the code according to your need.

your comments will encourage me to come up with more articles on the related topic.

Thursday, December 29, 2011

Bonus on How To: Building Android Application - Part 3


After going through the Part 1 and Part 2 of “How To: Building Android Application”, we will go explore more on the android sample and some tips to improve the performance of the emulator.

Playing with Android Sample Application


In this tutorial, we will setup the Android sample application which will help you play with most of the android components.

Step1: click on File->New->Other and then select Android->Android Sample Project

click Next and Finish.

in case you see “ This target has no samples. Please select another target.” message, you should click Windows->Android SDK Manager and select the sample and other versions (if needed) and Install the packages. This step will take a while. After that is done, retry Step 1.

useful emulator Shortcuts:


Alt+Enter maximizes the emulator. Nice for demos.

Ctrl+F11 changes the orientation of the emulator.

F8 turns network on / off.

F6 to turn on / off the trackball

Performance Considerations


Try to use a smaller resolution for your emulator as for example HVGA. The emulator gets slower the more pixels its needs to render as it is using software rendering.
While creating device (e.g. myDevice), set the flag "Enabled" for Snapshots. This will save the state of the emulator and let it start much faster.

Sunday, December 18, 2011

Transactional Memory in GCC

Transactional memory is intended to make programming with threads simpler, in particular synchronizing access to data shared between several threads using transactions. As with databases, a transaction is a unit of work that either completes in its entirety or has no effect at all (i.e., transactions execute atomically). Further, transactions are isolated from each other such that each transaction sees a consistent view of memory.

 

Two operations conflict if one of them modifies a memory location and the other one
accesses or modifies the same memory location. The execution of a program contains a data race if it
contains two conflicting operations in different threads, at least one of which is not an atomic operation,
and neither happens before the other. Any such data race results in undefined behavior. A program is race free if none of its executions contain a data race. In a race-free program each read from a memory location
sees the value written by the last write ordered before it by the “happens-before” relationship.

 

Outermost transactions (that is, transactions that are not dynamically nested within other
transactions) appear to execute sequentially in some total global order that contributes to the
“synchronizes with” relationship. Conceptually, every outermost transaction is associated with
StartTransaction and EndTransaction operations, which mark the beginning and end of the
transaction.2 A StartTransaction operation is sequenced before all other operations of its
transaction. All operations of a transaction are sequenced before its EndTransaction operation.

 

A shared memory access can form a data race even if it is performed in a transaction
statement. In the following example, a write by thread T2 forms a data race with both read and
write to x by Thread T1 because it is not ordered with the operations of Thread T1 by the
“happens-before” relationship. To avoid a data race in this example, a programmer should
enclose the write to x in Thread T2 in a transaction statement.

Thread T1

__transaction {
t = x;
x = t+1;
}

Thread T2

x = 1;

Atomic transactions:
A transaction statement without an attribute or annotated with the atomic attribute defines an
atomic transaction. We call such a statement an atomic transaction statement:

__transaction compound-statement
__transaction [[ atomic ]]compound-statement

Safety attributes on functions and function pointers:

To ensure that atomic transactions can be executed atomically, certain statements must not be
executed within atomic transactions; we call such statements unsafe.

In order to specify whether a function is safe, the function declaration may specify transaction_safe or transaction_unsafe attribute.

Memory model;
The memory model rules for transactions (Section 2.1) are sufficient to guarantee that in race
free programs, atomic transactions appear to execute as single indivisible operations. Atomic
transactions cannot contain other forms of synchronization (such as operations on locks or C++0x
atomic operations).

In the following example, both a and b will be read and the difference will be written to c, all atomically and isolated from other transactions:

__transaction_atomic { c = a - b; }
Therefore, another thread can use the following code to concurrently update b without ever causing c to hold a negative value (and without having to use other synchronization constructs such as locks or C++11 atomics): __transaction_atomic { if (a > b) b++; }

 

refer: C++-transactional-constructs-1.0.pdf

 

Saturday, December 17, 2011

How To: Building Android Application with easy steps–Part 2

This is in the continuation of my previous post “How To: Building Android Application with easy steps–Part 1”. In this tutorial, we will go over creating the sample application using the environment we have already setup.

Here is the details of the application we will build:
Number Counting: providing the buttons to increment/decrement the number present in the text box

 

Step 1: create Android project


Select File → New → Other → Android → Android Project and create the Android project named

com.hashfold.android.numbercounting

image

click Next and select the Android SDK version on which your application will be build and compiled.

image

note: selecting the Android 2.1 is the best options as 90% of Android devices till date are based on this version.

Click next and make sure the information filled is matching with below:

image

and then click Finish

note: numbercountingActivity is the name of the activity which will get started when the application starts

here is the final project view after above steps:

image

 

image

 

Step 2: writing application code


so far we have completed creating the project space. Now its time to do some coding and creating the GUI components.

2.1 AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hashfold.android.numbercounting"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="7" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name="com.hashfold.android.numbercountingActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

2.2 strings.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="details">number counting application</string>
<string name="hello">Hello! number counting!</string>
<string name="app_name">NumberCounting</string>
<color name="bgcolor">#000000</color>
</resources>

2.3 main.xml layout – the GUI component


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@color/bgcolor">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_height="wrap_content" android:layout_width="fill_parent">
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:text="+" android:id="@+id/Plus"></Button>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:id="@+id/Minus" android:text="-"></Button>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:id="@+id/Value" android:text="value"></TextView>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:text="Ok" android:id="@+id/Ok"></Button>
</LinearLayout>

</LinearLayout>

2.4 numbercountingActivity.java


package com.hashfold.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.hashfold.android.numbercounting.R;

public class numbercountingActivity extends Activity implements OnClickListener
{
Button Plus, Minus, Ok;
TextView Value;
int score = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Plus = (Button) findViewById(R.id.Plus);
Minus = (Button) findViewById(R.id.Minus);
Ok = (Button) findViewById(R.id.Ok);
Value = (TextView) findViewById(R.id.Value);

Plus.setOnClickListener(this);
Minus.setOnClickListener(this);
Ok.setOnClickListener(this);

}

public void onClick(View v)
{
boolean showText = false;

switch(v.getId())
{
case R.id.Plus: score++; showText = true; break;
case R.id.Minus: score--; showText = true; break;
case R.id.Ok: showText = true; break;
}
if(showText)
Value.setText(String.valueOf(score));
}
}

The R.java is the resource file which is auto generated based on strings.xml and other related resource changes.

Step 3: running the application


setup the run configuration: click on Run->Run configurations

image

and then click on ‘New launch configuration’ and then fill in the information needed as below:

image

image

now click on Apply button and then Run button to run the application.

It will take a while in starting up the Android device emulator with the device select in above step “myDevice”.

Once the device is started, it will look like below:

image

now click on the plus “+” button and see how the application performs

image

If you wish you could start device in full screen mode by pressing Alt+Enter.

image

This helps in having full view of the application.

Having a different orientation view (click Ctrl+F11)

image

turn off the internet (click F8)

image

toggle the internet (click F8)

image

Monday, December 12, 2011

How To: Building Android Application with easy steps–Part 1

What is Android?





Android is a software stack for mobile devices that includes an operating system, middleware and key applications. The Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.

Below are the steps to prepare the Android environment before really getting into the development:



Step 1. Download Eclipse


1.1 click Eclipse Classic


1.2 save the .zip file and extract it to your preferred location


image

Step 2. Installing Android SDK


2.1 start eclipse by clicking on the eclipse application extracted as shown in the above image.


2.2 now click on Help->Install New Software… option which will launch the below window:


image

2.3 now put https://dl-ssl.google.com/android/eclipse/ under “Work with” option and click on Add button.


2.4 type name ‘android’ in the new popup window and click OK


image

2.5 select All components and click Next


image

2.6 Click next in the next screen and then select “I Accept the terms…” and click Finish


image

the new window will popup to start downloading of the SDK ad shown below:

image

2.7 click OK on any warning message window


image

2.8 restart the eclipse


image

2.9. eclipse restart done and a new window shown to select where to install the SDK


image
select the location and click Finish

2.10 have patience, the installation step will take a while to download Android SDK as well as Google APIs.


Eclipse will now look like this…

image

2.11 make sure things are installed correctly.


click on Window->Preferences->Android

the details should show what you have just downloaded

image

Step 3. creating Android device


Android emulator runs on a specific device type. There are lots of android devices available on market.
The AVD Manager (AVD – android virtual device) have almost all of them configured. What you need to do is to create one of them in AVD Manager for your testing purposes. You can always create different device types and test the application before publishing to the android market.

Click on Windows->AVD Manager

image

Now click on New and fill the device information and click Create Device

image

image

At this moment, the eclipse is setup with the Android SDK and it is ready to be used.

Add-On: how to download and install


different version of the Android SDK?


So far we know that SDK version is used in creating the virtual device (using AVD Manager mentioned in Step 3 above). If there is a requirement to test the application on different device, then you need to make sure you have that version of the SDK available in your system. In order to download the new version, do below:

1. click Windows->Android SDK Manager
2. select required packages and then click “Install *** packages…”
3. in the next window, click on “Accept all” and click Install button
it will take a while to download and setup new SDK

In our next tutorial, we will go through the steps and create a sample application from scratch.

put your comments in case you have any questions for me to answer about these steps.

 

reference: http://developer.android.com/index.html

Saturday, December 10, 2011

Getting a job in software development

 

There are lots of question-answer websites where people discuss their problems and try to find the possible solutions using the crowd (well known as crowdsourcing). Some of these sites are quora.com, chacha.com, stackoverflow.com, stackexchange.com and experts-exchange.com. Searching these sites for a specific topic, will bring you a lots of links which may not be relevant to your topic or questions you are looking for. Sometimes you may need to prepare the good list of articles related to a given topic using the best answered/discussed materials on these sites.

StackOverflow.com has done a really great job to prepare and present them in a good format. One of them is about Scala. You may check it out at: http://stackoverflow.com/tags/scala/info

 

While browsing through the HN, I encountered a post by WalterGR who have done a similar job for helping others.

This is a re-post of a reddit post for my users which was collected by WalterGR user.  While the job hunt, Walter had collected the reddit posts which he thought may be useful for others.

 

 

references:

http://hashfold.com/techfold/scala-the-programming-language-2/

http://www.reddit.com/r/cscareerquestions/comments/n5spv/getting_a_job_in_software_development_a_reddit/