Wednesday, 27 April 2011

Asus Eee Pad Transformer sells out online on day one

iPhone iPad pictureYou know how I have been writing about the EEE Pad Transformer the last couple of weeks. And I have been looking forward to getting my hands on the first Android Honeycomb 3.0 tablet for $399. Well... the EEE pad came out yesterday and is already sold out. :(



Asus Eee Pad Transformer sells out online on day one - Yahoo! News



I guess I should not be surprised. Although it is not on the radar of much of the tech media, Engadget alone has probably built up enough buzz to sell it out. Also, it is my understanding they are shipping pretty low quantities to the US as the device was launched in other countries first.



One other fact learned in the last week. The keyboard that makes the transformer tranform, is not free. It costs an additional $150. So really the device has a price of $549 as opposed to $399 when all is included.

Update GPS TAG, using ExifInterface.setAttribute() and exifInterface.saveAttributes()

Update GPS TAG, using ExifInterface.setAttribute() and exifInterface.saveAttributes()

Last exercise show how to "Read EXIF of JPG file", new member method UpdateGeoTag() will be implemented to update GPS TAG of the file with dummy data.

exifInterface.setAttribute(ExifInterface.TAG_GPS_LATITUDE, DUMMY_GPS_LATITUDE);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, DUMMY_GPS_LATITUDE_REF);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, DUMMY_GPS_LONGITUDE);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, DUMMY_GPS_LONGITUDE_REF);

Once all attributes set, you can call exifInterface.saveAttributes() method to update the file.

with updated GPS TAG

In order to write-back data to file in SD Card, you have to modify AndroidManifest.xml grant permission of "android.permission.WRITE_EXTERNAL_STORAGE".

Related post
- "Convert Exif GPS info to Degree format".

In my exercise, the update Geo location can be recognized automatically by Picasa, Flickr and Nikon ViewNX.

MyExif.java
package com.exercise.AndroidSelectImage;

import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.database.Cursor;
import android.media.ExifInterface;
import android.net.Uri;
import android.provider.MediaStore;

public class MyExif {

private File exifFile; //It's the file passed from constructor
private String exifFilePath; //file in Real Path format
private Activity parentActivity; //Parent Activity

private String exifFilePath_withoutext;
private String ext;

private ExifInterface exifInterface;
private Boolean exifValid = false;;

//Exif TAG
//for API Level 8, Android 2.2
private String exif_DATETIME = "";
private String exif_FLASH = "";
private String exif_FOCAL_LENGTH = "";
private String exif_GPS_DATESTAMP = "";
private String exif_GPS_LATITUDE = "";
private String exif_GPS_LATITUDE_REF = "";
private String exif_GPS_LONGITUDE = "";
private String exif_GPS_LONGITUDE_REF = "";
private String exif_GPS_PROCESSING_METHOD = "";
private String exif_GPS_TIMESTAMP = "";
private String exif_IMAGE_LENGTH = "";
private String exif_IMAGE_WIDTH = "";
private String exif_MAKE = "";
private String exif_MODEL = "";
private String exif_ORIENTATION = "";
private String exif_WHITE_BALANCE = "";

//Constructor from path
MyExif(String fileString, Activity parent){
exifFile = new File(fileString);
parentActivity = parent;
exifFilePath = fileString;
PrepareExif();
}

//Constructor from URI
MyExif(Uri fileUri, Activity parent){
exifFile = new File(fileUri.toString());
parentActivity = parent;
exifFilePath = getRealPathFromURI(fileUri);
PrepareExif();
}

private void PrepareExif(){

int dotposition= exifFilePath.lastIndexOf(".");
exifFilePath_withoutext = exifFilePath.substring(0,dotposition);
ext = exifFilePath.substring(dotposition + 1, exifFilePath.length());

if (ext.equalsIgnoreCase("jpg")){
try {
exifInterface = new ExifInterface(exifFilePath);
ReadExifTag();
exifValid = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private void ReadExifTag(){

exif_DATETIME = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
exif_FLASH = exifInterface.getAttribute(ExifInterface.TAG_FLASH);
exif_FOCAL_LENGTH = exifInterface.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
exif_GPS_DATESTAMP = exifInterface.getAttribute(ExifInterface.TAG_GPS_DATESTAMP);
exif_GPS_LATITUDE = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
exif_GPS_LATITUDE_REF = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
exif_GPS_LONGITUDE = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
exif_GPS_LONGITUDE_REF = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
exif_GPS_PROCESSING_METHOD = exifInterface.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD);
exif_GPS_TIMESTAMP = exifInterface.getAttribute(ExifInterface.TAG_GPS_TIMESTAMP);
exif_IMAGE_LENGTH = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
exif_IMAGE_WIDTH = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
exif_MAKE = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
exif_MODEL = exifInterface.getAttribute(ExifInterface.TAG_MODEL);
exif_ORIENTATION = exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
exif_WHITE_BALANCE = exifInterface.getAttribute(ExifInterface.TAG_WHITE_BALANCE);

}

private String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = parentActivity.managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

public String getSummary(){
if(!exifValid){
return ("Invalide EXIF!");
}else{
return( exifFilePath + " : \n" +

"Name without extension: " + exifFilePath_withoutext + "\n" +
"with extension: " + ext + "\n" +

//"Date Time: " + exif_DATETIME + "\n" +
//"Flash: " + exif_FLASH + "\n" +
//"Focal Length: " + exif_FOCAL_LENGTH + "\n" +
//"GPS Date Stamp: " + exif_GPS_DATESTAMP + "\n" +
"GPS Latitude: " + exif_GPS_LATITUDE + "\n" +
"GPS Latitute Ref: " + exif_GPS_LATITUDE_REF + "\n" +
"GPS Longitude: " + exif_GPS_LONGITUDE + "\n" +
"GPS Longitude Ref: " + exif_GPS_LONGITUDE_REF);
//"Processing Method: " + exif_GPS_PROCESSING_METHOD + "\n" +
//"GPS Time Stamp: " + exif_GPS_TIMESTAMP + "\n" +
//"Image Length: " + exif_IMAGE_LENGTH + "\n" +
//"Image Width: " + exif_IMAGE_WIDTH + "\n" +
//"Make: " + exif_MAKE + "\n" +
//"Model: " + exif_MODEL + "\n" +
//"Orientation: " + exif_ORIENTATION + "\n" +
//"White Balance: " + exif_WHITE_BALANCE + "\n");
}
}

public void UpdateGeoTag(){
//with dummy data
final String DUMMY_GPS_LATITUDE = "22/1,21/1,299295/32768";
final String DUMMY_GPS_LATITUDE_REF = "N";
final String DUMMY_GPS_LONGITUDE = "114/1,3/1,207045/4096";
final String DUMMY_GPS_LONGITUDE_REF = "E";

exifInterface.setAttribute(ExifInterface.TAG_GPS_LATITUDE, DUMMY_GPS_LATITUDE);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, DUMMY_GPS_LATITUDE_REF);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, DUMMY_GPS_LONGITUDE);
exifInterface.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, DUMMY_GPS_LONGITUDE_REF);
try {
exifInterface.saveAttributes();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}


AndroidSelectImage.java
package com.exercise.AndroidSelectImage;

import java.io.File;
import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class AndroidSelectImage extends Activity {

TextView textTargetUri;
ImageView targetImage;
Button buttonSaveImage;

File targetFile;
String exifAttribute;

MyExif myExif;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonLoadImage = (Button)findViewById(R.id.loadimage);
buttonSaveImage = (Button)findViewById(R.id.saveimage);
textTargetUri = (TextView)findViewById(R.id.targeturi);
targetImage = (ImageView)findViewById(R.id.targetimage);

buttonLoadImage.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
buttonSaveImage.setEnabled(false);
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 0);
}});

buttonSaveImage.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
myExif.UpdateGeoTag(); //with dummy data
}});
}

@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK){
Uri targetUri = data.getData();

Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(targetUri));
targetImage.setImageBitmap(bitmap);
buttonSaveImage.setEnabled(true);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

myExif = new MyExif(targetUri, this);
textTargetUri.setText(myExif.getSummary());
}
}

}


main.xml
<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/loadimage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Load Image"
/>
<Button
android:id="@+id/saveimage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Update Geo Tag (with DUMMY data)"
android:enabled="false"
/>
<TextView
android:id="@+id/targeturi"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/targetimage"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>


Download the files.

Tuesday, 26 April 2011

Corona SDK Approved for Nook Color App Development

iPhone iPad pictureRead Write Web has this great write up on Corona SDK. Basically, it a mobile development environment and simulator that uses the LUA programming language. (LUA has a lot of similarities to JavaScript.)



Corona SDK Approved for Nook Color App Development



The tool allows you to write cross platform applications for the iPhone, iPad, Android or Nook. If you go to the article you will some really well done You Tube videos on the tool. It looks like an amazingly easy way to develop applications, especially compared to objective C.



You can download the Corona SDK and use it all you want for free. Once you have an application developed, you have to pay a $199 per year subscription fee to distribute the app to one platform of your choice (iOS or Android). To distribute to both it costs $349 a year. For the Apple side you also have to spend $99 to join the developer program. Probably a pretty good price if your app is at all successful.



Corona SDK is definitely worth a look.

Webkit without a Browser? PhantomJS

Webkit icon
Why would I want to run a Webkit browser without a graphical user interface? Well there are a lot of good reasons actually. You want to search a page for something in an automated way. Or you may want to test a page from a script. Anyway, that is what PhantomJS allows you to do.



The story is a little old as I have been meaning to write this up for some time. However, the tool is pretty cool and worth a look.



From ReadWriteWeb: PhantomJS The Power of WebKit but Without the Broswer

PhantomJS: Headless WebKit with JavaScript API

New Gigabyte T1125N-CF2 Convertible Laptop Review

New Gigabyte T1125N-CF2 Convertible Laptop Review
New Gigabyte T1125N-CF2 Convertible Laptop: The The Gigabyte T1125N-CF2 is a good convertible laptop, which has an Intel dual core processor, a 11.6-inch HD multitouch display with resolution of 1366�768 pixel and 180 degree rotatable, NVIDIA GeForce GT330 Graphics with Optimus Technology, 4GB DDR3 memory, 500GB hard drive and supports a 1.3 megapixel webcam, a full size keyboard, Gigabit Ethernet, WiFi 802.11 b/g/n, Bluetooth 2.1, HDMI output, USB 3.0 and USB 2.0 ports, HSDPA (3.5G) compatibility, a 6-cell battery and pre-installed with Windows 7 OS. The Gigabyte T1125N-CF2 convertible laptop also has a docking station with a DVD Supermulti drive, USB3.0 port, VGA, Audio and HDMI output.
New Gigabyte T1125N-CF2 Convertible Laptop Review

Source : [http://www.laptopsworld.org/new-gigabyte-t1125n-cf2-convertible-laptop.html]

Dell Precision M4600 / 15.6 inch Mobile Workstations

Dell Precision M4600 / 15.6 inch Mobile Workstations
Dell has just announced an update to the Dell Precision M4600 notebook, a 15.6 inch? mobile workstation designed to deliver a desktop replacement experience that travels wherever you need to go.The Precision M4600 is the entry level Dell mobile workstation, but there�s nothing entry level about the specs and features. The bigger version, with more advanced graphics options is the Dell Precision M6600.

The M4600 makes use of the new Sandy Bridge, 2nd Generation Intel Core i Family of processors. The processor options include Core i5 and Core i7 options, including up to a Quad-Core i7 Extreme processor option. There are also options vPro options to assist with IT management.The Precision mobile workstations can handle up to 32GB of 1333MHz RAM and 16GB 1600MHz RAM. The systems will support 32GB 1600MHz RAM when the larger DIM sizes are available. The 1600MHz memory is something Dell calls out as unique to the Dell Mobile workstations and is available on all Quad-Core processor options.

The new Precision M4600 mobile workstations include NVIDIA QUADRO and AMD FirePro graphics options. The AMD FirePro M5950 has 1GB DDR5 and supports 3 displays with the included ports and can be extended further with a dock. There are also two NVIDIA QUADRO processors, the 1000M and 2000M which have 2GB DDR3 dedicated memory. The NVIDIA options include NVIDIA Optimus to intelligently switch to the integrated Intel 3000 HD graphics.The M4600 has a collection of 15.6? displays which fit various use cases and needs. Included in the options is a Premier Color IPS RGB panel with support of over a billion colors. There is also a multitouch option with four finger touch support and a stylus. The base resolution is 1366 x 768, but you can also get a 15.6? display with a 1920 x 1080 resolution.The RGB screen option includes the ability to customize color settings for different applications.

The M4600 has a collection of storage options including up to 750GB 7200RPM hard drive and an increase in the size of the mini SSD department from 64GB to 128GB. The Mini SSD can be combined with the traditional hard drive or with a second SSD. If you have the same capacity SSD the Precision M4600 will support RAID setups.

If you need to use different hard drives for different clients or projects, the primary hard drive can be removed with a level action. If you keep your OS on the mini SSD, you can leave sensitive data at a client site or secured in a hard drive easily, without losing the ability to use your notebook.The new M4600 has a new unique to the Precision line chassis which Mano Gialusis, Senior Product Manager of Dell Precision Mobile Workstations tells us is �unique from the ground up,� allowing for no compromises on the chassis in regards to thermals, CPUs and expandability that isn�t possible when you need to accommodate other notebook lines.On the outside, the Precision M4600 has an anodized aluminum case and allows users easy access to the internals with a two screw base plate.

The Precision line is designed to deliver a mobile notebook that doesn�t mean users need to give up any performance or rely on uploading data to a remote system. With the system options available Dell is aiming to deliver notebooks that can be used to work in Media or CAD and with Seismic Data to name a few.For users that need to ensure that applications work with the Precision notebooks, the M4600 is ISV certified to work with numerous third-party apps.The Precision mobile workstations are also compatible with the Dell Latitude E Family of docks.On the security side there is a fingerprint reader, TPM, Control Vault and there is the ability for a FIPS certified encrypted hard drive.The Precision M4600 is durable as well as secure. The M4600 isn�t to the Dell XFR level, but it is MILSPEC 810G level.The Dell Precision M4600 will start at $1,678 and will be available on May 10th.


Source : [notebooks.com]



Compaq Presario V3000/14.1-inch Series Notebook PC

Compaq Presario V3000/14.1-inch  Series Notebook PC
Featuring an innovative industrial design, the lightweight Compaq Presario V3000 Series Notebook PC combines must-have mobile technology with the power of a desktop PC resulting in a versatile notebook PC that appeals to consumers with a fast-paced lifestyle.

This sleek Compaq Presario allows consumers to multi-task on the go with the latest dual-core(1) mobile technology from Intel and, the upcoming dual-core(1) processors from AMD. These mobile technologies support the latest wireless connectivity options and extended battery life, enabling users to stay connected longer while on the go. Also new to the Presario line, HP QuickPlay(2) allows users to enjoy their favorite movies, music and photos with a touch of the button without booting up the PC. The notebook features a durable, shiny finish plus touch-sensitive, backlit buttons and volume control. With a 14.1-inch high-definition(3) widescreen display and optional BrightView technology, consumers can enjoy movies and digital photos with great vibrancy and clarity. Available with up to 100GB hard drive and up to 2,048MB of memory, the V3000 allows consumers to take their work on the road with confidence and style.

Key Features and Benefits :
  • The V3000 is cloaked with HP�s Imprint finish which incorporates an advanced molding technique produced using Nissha Film Products. The V3000�s unique high-gloss, brushed steel finish provides greater scratch-resistance than traditional painted surfaces. Brushed gunmetal accents and a roomy keyboard with smooth, rounded keys keep style and comfort at the consumer�s fingertips.
  • Taking the show on the road is better than ever with the choice of Intel� Centrino� Duo mobile technology(1,4) or the upcoming AMD Turion� 64 X2 mobile processors.(1,4,5) With Intel Centrino Duo mobile technology,(1,4) users get dual-core performance and enhanced power-saving features for extended battery life(6) and expanded wireless(4) connectivity features for greater mobility. With the upcoming AMD Turion 64 X2 mobile processors,(1,4,5) consumers get powerful dual-core, future-ready computing and enhanced virus protection.(7)
  • New touch-technology buttons enable users to launch media applications and control volume and mute functions. The latch-free notebook also features colorful LED indicator lights that further enhance the sleek and


One advantage with this deal over the in-store holiday specials is Compaq will let you up the specs on your V3000 for only a few bucks more. $50 will bump your new notebook�s memory up to 1GB or your hard drive to 80 GB. For $40 you can move up to a DVD burner, while $25 will get you a brighter screen.

Price: P$20.00

Source : [notebooks.com]