Tag Archive | technology

iPad App of the Week: Adobe Ideas

The app I decided to review this week is Adobe Ideas and it’s for both the iPhone as well as the iPad and it’s free.

Adobe® Ideas is your digital sketchbook, letting you capture and explore ideas anywhere you go. Adobe Ideas is an ideal companion for the professional design applications from Adobe, including Adobe Illustrator® and Adobe Photoshop®. Now with a new in-app purchase option, you can get up to 10 drawing layers plus a photo layer for each sketch as well as layer transformations – move, rotate and scale each layer.
Sketch design concepts while sitting in a cafe, capture and store color themes while browsing through the photos on your phone, or jot down notes on a photo. Any time you need to explore creative ideas, Adobe Ideas is there with you.

Here’s a short demo:

Got a cool app you want reviewed or one you really like you want to share – let us know!

 

iPad App of the Week: Air Sketch

I figured if Apple can do their “App of the Week” then so can one of the eGeeks and since Ed is such a big fan of the iPad I figured I’d jump in and start sharing out of my 332 apps so far which I think are really cool. So to quick it off I decided to go with one of the newest ones that has a practical purpose as well (not just fun).

The app is called Air Sketch, the free version and I’m debating the paid version for $7.99.

Turn your iPad into a wireless whiteboard! Project live sketches to a local computer.

Just fire up Air Sketch on the iPad and open the specified URL from any HTML5 compatible browser on another computer on the local network to see your sketches in real-time as you draw. There’s no additional client software to install. Use Air Sketch at home, the office, or even with a friend’s laptop.

Tip: You can also find the link in Desktop Safari’s Bonjour bookmarks: Show All Bookmarks menu ? Bonjour.

Connect your laptop to a projector to sketch wirelessly to a big screen, even while walking around the room.

Incorporate the iPad into your desktop-based workflow: Record videos of your live Air Sketch drawings, or share them live with remote colleagues via any online meeting or desktop sharing software (such as iChat or WebEx).

Air Sketch supports any HTML5-compatible browser, including Safari, Firefox, Google Chrome, and even another iPad, iPhone, or iPod Touch!

You can even use Air Sketch peer-to-peer with a computer via an ad-hoc network when a WiFi hotspot is unavailable (see our blog for the quick how-to).

Note: Air Sketch is designed to work with a computer connected to the same local network as your iPad.

The app is from a company called Qrayon.

I captured a small video of me using the app, have a look.

I really think the app has a lot of potential at events and classroom settings and as such could find it’s way into a corporate boardroom or conference room as a useful tool what do you think?

 

 

 

Nanomonk #1 & #2

Nanomonk was a RedMonk event hosted by Adobe and SAP. It took place back in July in London and was a simple one day event.

Small and intimate group of experts, customers, partners, analysts and consultants the day was a bit unplanned and certainly not rehearsed and the result was an amazing conversation around the world of the enterprise, RIA and community.

I recorded the entire day and you can check out the video replays here and here. Each video is about an hour (and some change) long but the content has gotten great feedback and I certainly think it’s worth the watch if you are interesting in the various technologies between Adobe and SAP.

RedMonk has said they plan to make these Nanomonk events a regular (3 to 4 times a year) so very much looking forward to that!

2007 was the year of the Widget, 2008?

Om Malik once stated (back in 2006/2007) that 2007 would be the year of the widget,

“Of course with Leopard and Vista almost around the corner, it is hard not to get enthusiastic about the future of widgets. Gabe Dorfman, a Microsoft product manager is predicting a widget boom. Yahoo, MySpace, AOL, and scores of others are part of this ‘atomization of web’ movement. ‘The Google personal homepage is the fastest-growing Google product,’ Marissa Mayer tells Newsweek, ‘This market is going to be very large.’”

Now midway through 2008 I’ve been sitting back and reflecting was 2007 really the year? Did things like the iPhone, AIR and Silverlight alter that path? At the end of 2007 SAP and SDN hosted a “Widget Contest” and we were blown away by the shear number of participants and activity around Widgets in the Enterprise. Last year during the SAP TechEd event Widgets even took center stage winning at the Demo Jam!

So was 2007 it or does 2008 and 2009 look interesting for widget technologies? I think so!

Now I won’t just leave it at that, let me at least say why I think it looks interesting. The simple fact that we are gaining ground in small, usable and portable devices in an “always on” mode the idea of small consumable apps (widgets) becomes more and more appealing – perhaps it’s not just a Yahoo, Vista, Google or Dashboard thing but still the idea of a small consumable app giving you what you need, how you need it and when you need it, well frankly the appeal is growing and growing.

SAP Business User Summit ’08

 

Today I had the chance to attend the SAP Business User Summit, a second in a growing series focusing on the real values, ideas and concepts behind the term “Enterprise 2.0”. During the event I held a session on “Enterprise 2.0 and Innovation”, my session focused on what is “Enterprise 2.0” and I tried to convey the key underlying theme that unlike the consumer space the enterprise space needs to provide tools that allow each user to control the flow of information themselves. In the consumer space we can already do this by simply choosing one of the massive amounts of tools available that we are comfortable with but within the enterprise there won’t be so many tools and therefore those we have need to give the ability to control the volume of information that is flowing. This video is a short video with Michael Altendorf from SAP in Walldorf, Germany and describes the reasoning and ideas behind this event series.

AJAX Agent, SAPRFC and SU01

It’s not a new topic but it is one that has not been covered very much, at least not together with SAP. Which do I mean? AJAX, one of the buzz words out there right now, so what is it, how do I get it into my application and why would I?

Well I decided the best way for me to describe it was to build on the work of others on SDN.

What I am going to do is take a simple ABAP FM, my trusty PHP connector for SAP and the RFC library and a very basic login.


<?php

// Inlcude Cmehil Functions
include "lib/sap.php";

// Include AJAX Agent
include_once ("lib/agent.php");

// Initialize AJAX Agent
$agent->init();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>AJAX Agent connection to SAPRFC</title>
</head>

<body>

<script type="text/javascript">
function hide_uservalid(uid) {
document.getElementById(uid).style.display = "none";
}

function call_uservalid(uid) {
document.getElementById(uid).style.display = "block";
agent.call('','GetValid','callback_uservalid', uid);
}

function callback_uservalid(str) {
uid = str.substring(0,str.indexOf(':'));
str = str.substr(str.indexOf(':')+1,str.length);
document.getElementById(uid).innerHTML = str;
}

function call_usersearch() {
str = document.getElementById('q').value;
agent.call('','UserList','callback_usersearch', str);
}

function callback_usersearch(str) {
document.getElementById('div_user').innerHTML = str;
}
</script>

<form onsubmit="call_usersearch();return false;" method="post">
<b><span>Query</span>:</b> <input type="text" name="q" id="q" size="10">
</form>
<hr>
<div id="div_user"></div>

</body>
</html>

As you can see my initial, or “index.php” page is nothing special just a little JavaScript and some HTML and a tiny splash of PHP through in at the top.

Then I have two subfolders, one is “images” the other is “lib”, the “images” subfolder contains two images I snagged from my NetWeaver system:

image image

The “lib” subfolder contains my “saprfc.php” file which comes with the SAPRFC for PHP download along with “agent.php” which comes with AJAX Agent which I decided to use to make life a bit easier for myself. You could also make the connections yourself, like in how Dan describes here in his blog.

The last item under “lib” is my own small collection of PHP functions.


<?php
// saprfc-class-library and custom library su01
require_once ("saprfc.php");

function login($user,$pwd,$host,$sn,$clnt) {
// Create saprfc-instance
$sap = new saprfc(array(
"logindata"=>array(
"ASHOST"=>$host // application server
,"SYSNR"=>$sn // system number
,"CLIENT"=>$clnt // client
,"USER"=>$user // user
,"PASSWD"=>$pwd // password
)
,"show_errors"=>false // let class printout errors
,"debug"=>false)) ; // detailed debugging information
return $sap;
}

function logoff($sap) {
// Logoff/Close saprfc-connection LL/2001-08
$sap->logoff();
}

function UserList($query) {
$listing = "";

// Login into System
$sap = login("bcuser","minisap","localhost","00","000");

// Call-Function
$result=$sap->callFunction("SO_USER_LIST_READ",
array( array("IMPORT","USER_GENERIC_NAME","*"),
array("TABLE","USER_DISPLAY_TAB",array())
));

// Call successfull?
if ($sap->getStatus() == SAPRFC_OK) {
// Yes, print out the Userlist
$i = 0;
$listing .= "<table cellpadding="4" cellspacing="4">";
foreach ($result["USER_DISPLAY_TAB"] as $user) {
if ($query == "*" || $query == "%" || stristr($user["SAPNAM"], $query)) {
$i++;
$listing .= "<tr><td><a href="#""
. " onmouseout="hide_uservalid('".$user["SAPNAM"]."');return false;""
. " onmouseover="call_uservalid('".$user["SAPNAM"]."');return"
. " false;">".$user["SAPNAM"]."</a></td><td"
. " align="center"><div id="".$user["SAPNAM"]."""
. "></div></td></tr>";
}
}
$listing .= "</table>";
} else {
// No, print long Version of last Error
$listing = $sap->printStatus();
}

// Logoff System
logoff($sap);

// Now return the list
return $listing;
}

function GetValid($uid) {
$value = "";

$result = GetUserLogonDetails($uid);
$input = $result["GLTGB"];

// Yes, then get value
if ( strtotime("now") < strtotime($input) or $input == "00000000" ) {
$value = "<img src="images/s_S_OKAY.gif" border="0" alt="".$input."">";
} else {
$value = "<img src="images/s_S_NONO.gif" border="0" alt="".$input."">";
}

return $uid.":".$value;
}

function GetUserLogonDetails($uid) {
$value = "";

// Login into System
$sap = login("bcuser","minisap","localhost","00","000");

$uid = strtoupper($uid);
$result=$sap->callFunction("BAPI_USER_GET_DETAIL",
array( array("IMPORT","USERNAME",$uid),
array("EXPORT","LOGONDATA",array())
));
// Call successfull?
if ($sap->getStatus() == SAPRFC_OK) {
// Yes, then get value
$value = $result["LOGONDATA"];
} else {
// No, print long Version of last Error
$sap->printStatus();
}

// Logoff System
logoff($sap);

return $value;
}

?>

Really that is all there is two it. All of it together is similar to what Piers Harding created using Ruby. Although this is a strictly “read” only version and not so “flashy” as his.

I recommend you check the forum link (see ABAP FM) for some alternatives to the standard FM from SAP for better performance. I tested against a system with 436 users and the response was fine but the idea of grabbing the entire list of users each time you run the query is a bit much.

Ok now we have it, it’s pretty fast and easy but why do I want it? Well in my test system I pulled 436 users, my biggest query based search was 128 users now if you notice in the code I have it set that when you move your mouse over the User ID (onmouseover) it shows me whether they are valid in the system or not, this happens dynamically each time I move the mouse over the User ID. Now what happens in a traditional manner is that I would click on the name, it would show me the status after reloading the page AND the 128 users again remembering what the query was, where I clicked etc. This approach (granted not the best in terms of performance) does all of this without reloading the page. The other option would be of course to pul the list together with the status and just give me all of it at once, this also goes to show that there are a million and one ways to accomplish something – this way offers you the comfort of not reloading your pages for every action you wish to accomplish.

A nice definition and more information can be found on Wikipedia.

AJAX, shorthand for Asynchronous JavaScript and XML, is a Web development technique for creating interactive web applications. The intent is to make web pages feel more responsive by exchanging small amounts of data with the server behind the scenes, so that the entire web page does not have to be reloaded each time the user makes a change. This is meant to increase the web page’s interactivity, speed, and usability.

The following link is where you can actually download the entire demo and save typing it in.

Remember this is a small snippet to show the potential and in no way should this be taken as a productive example for wide use.

OK now with that all out of the way let’s take a look at what’s actually going on, you see things are triggered via a JavaScript method:


function call_usersearch() {
str = document.getElementById('q').value;
agent.call('','UserList','callback_usersearch', str);
}

function callback_usersearch(str) {
document.getElementById('div_user').innerHTML = str;
}

So we have the intital “call” function which pulls in any values we might want to pass to the PHP function which is done by the call to the AJAX Agent. Here we call the “UserList” PHP function which is known because of the inlcude library files. It also knows to pass in the “return function” as well as the parameter that is needed for the PHP function.

Once the PHP function executes all output is captured and returned to the “return function” which then sets the “content” area of our DIV tag with that very output. Thus we are dynamically changing elements on our page with output generated by the PHP functions.

That is actually a pretty low tech explanation but there is so much information out there on the topic I don’t want to bore you too much, unless you want me to then I promise my next blog will go into more depth than this surface level one.