Blog

Accessing the Line Scanner in IBM Anyplace Kiosk

29.12.2006 at 16:06

The last week I was busy searching a way to access the integrated Line Scanner as found in the IBM Anyplace Kiosks. The biggest hurdle was actually to get the damn thing to work, after reading through various documentation (JavaPOS, OPOS, UnifiedPOS), installing different devices drivers, I finally succeeded with a OPOS based Windows solution. I still try to convince management to deploy a Linux based solution, but do not yet know if there are the needed device drivers available. IBM seems to support it with IRES, we will see.

So the next step was to actually program the scanner in order to receive data. Since our "application" runs within a browser I had to use ActiveX and JScript to access the scanner. During coding this I learned that in order to capture ActiveX Events one has to use a slightly different event handling technique. I eventually got it to work with the code below.

<html>
<head>
<title>Scanner</title>
</head>
<body>
<object classid="clsid:CCB90182-B81E-11D2-AB74-0040054C3719" id="Scanner" width="39" 

height="38">
</object>
<script type="text/jscript" language="JScript">

onload = function(){
	MyScanner = function(){

		var scanner = Scanner;
		var dc = ec = function(){};

		/* see the following msdn-link for further 
		 * information on why this strange syntax actually works.
                 *
		 * http://msdn2.microsoft.com/en-us/library/ms974564.aspx
		 */

		function Scanner::DataEvent(){
			dc(scanner.ScanDataLabel);
			scanner.DataEventEnabled = true;
		}

		function Scanner::ErrorEvent(ResultCode, ResultCodeExtended, 

ErrorLocus, ErrorResponse){
			ec(ResultCode, ResultCodeExtended, ErrorLocus, 

ErrorResponse);
		}

		var open = function(devname){
			if(scanner.Open(devname))
				return false;
			return true;
		}

		var enable = function(devname){
			if(!open(devname))
				return false;
			if(scanner.Claim(1000))
				return false;
		
			scanner.DeviceEnabled = true;
			scanner.DataEventEnabled = true;
			scanner.DecodeData = true;
			return true;
		}

		return {
			init : function(devname,datacb,errorcb){
				if(!enable(devname))
					return false;
				if(typeof datacb == "function")
					dc = datacb;
				if(typeof errorcb == "function")
					ec = datacb;
				return true;
			},
	
			close : function(){
				return !scanner.Close();
			}
		};

	}();


	var status = MyScanner.init("LineScanner",function(v){ 
			alert("scanner " + v) 
		},
		
		function(){
			alert("error");
		}
	);

	if(!status)
		MyScanner.close();
	else
		alert("could init");
}

onunload = function(){
	MyScanner.close();
}

</script>
</body>
</html>

An important point I would like to note is that only one application can access the scanner at the same time. Which means we must always call close to release the internal handle.

Hope this is useful for somebody.

Marc

read more comments

Debian Developer Database Statistics

03.12.2006 at 13:02

I am currently writing a paper for school with the title "Free and OpenSource Software in Switzerland", therefore I am interested in the FOSS community here in Switzerland. So I decided to make some statistic out of the Debian Developer Database, below is my ruby script for that purpose. It basically just queries the web interface, parses the results and makes some statistics. I plan to set this number in relation to the population of the corresponding countries.

#!/usr/bin/env ruby

# requires libopenssl-ruby1.8
require 'net/https'

class DDDB #Debian Developer Database

private_class_method :new

public
	def self.get_developer_count(country = 'any')
		html = get_html_for_country(country)
		if html =~ /Number of entries matched: <b>([0-9]+)</b>/
			return $1.to_i
		end
		return 0;
	end

	def self.get_developers(country = 'any')
		q = '<font size=+1>(?:<a href="(.*?)">)?(.*?)?(?:</a>)?'
		q+= '</font> (uid=.*?login:</b></td><td> '
		q+= '<a href="mailto:([a-z0-9.@]+)"'
		html = get_html_for_country(country)
		html.scan /#{q}/m
	end
	
	def self.get_countries
		http = Net::HTTP.new("db.debian.org", 443)
		http.use_ssl = true
		http.start { |http|
			res = http.get('/') 
			res.body.scan /<option value="([a-z]{2})">(.*$)/
		}
	end

private
	@@data = {}

	def self.get_html_for_country(country)
		if !@@data.has_key? country 
			@@data[country] = get_html_for_query(
				"country=#{country == 'any' ? '' : country}"
			)
		end
		@@data[country];
	end

	def self.get_html_for_query(query)
		http = Net::HTTP.new("db.debian.org", 443)
		http.use_ssl = true
		http.start { |http|
			res = http.post(
				'/search.cgi', 
				"#{query}&dosearch=Search..."
			)
			return res.body
		}
	end
end

total = 0
data = {}

DDDB.get_countries().each do |code,country|
	count = DDDB.get_developer_count(code)
	if count > 0
		data[code] = { 'country' => country, 'count' => count }
		total += count
	end
end

print "Total Debian developers: ", DDDB.get_developer_count(), "n"
print "Total Debian developers with country specified: ", total, "n"

data.each_value do |entry|
	print entry['country'].ljust(35), entry['count'].to_s.rjust(5),' ',
		"%02.2f%" % (entry['count'].to_f*100/total), "n"
end

exit 0

DDDB.get_developers('ch').each { |www,name,mail|
	print name.ljust(35),(" <"+mail+"> ").ljust(35)
	print www if !www.nil?
	print "n"
}

Oh well after having written the above script, I actually found out that I simply could have queried the LDAP directory directly. Sigh.

read more comments

Thanks Sun for Open Sourcing Java

13.11.2006 at 22:24

It would like to thank everyone who was involved in open sourcing Java, by choosing the GNU GPLv2 you made the right decision. Thanks to all the Classpath and Kaffe hackers for their effort in building a free Java. Hopefully you will join the Sun engineers and create a whole new community.

Here is a quote from RMS which summarizes it quite nicely.

I think Sun has well, with this contribution have contributed more than any other company to the free software community in the form of software. It shows leadership. It's an example I hope others will follow.

This is a great day for the free and open source software community.

Marc

read more comments

Evaluating Free Software wxWidgets GUI Designers

10.08.2006 at 16:04

I am currently trying to write a cross platform GUI frontend for qemu. I have chosen to use the C++ toolkit wxWidgets, mostly because it is written in C++ and therefore object oriented, other advantages are that on Linux it uses gtk+ and it has good Windows support.

Since I don't want to mess around with basic things like the placement of the various GUI elements, I looked around for a wxWidgets capable RAD tool. Below is a list with what I found so far.

After a short evaluation my first impression is that wxglade is not quite there yet feature wise. wxDev-C++ is impressive but depends on Dev-C++ and is therefore only available on Windows. wxFormBuilder seems to be cross platform can generate both XML resource files and C++ source code which satisfies my needs.

So right now I think wxFormBuilder is my favorite but that could change once I start using it for a longer time.

Update

I found wxGuiBuilder which is quite neat, the main idea is to represent the GUI with a few simple relatively easy recognizable ASCII symbols. The advantage is that there is no XML and no IDE needed in order to build a good GUI.

Marc

read more comments

Mixing C and C++ Code in the Same Program

26.07.2006 at 10:06

I am currently trying to reuse an existing C-library from C++, since I am quite a newbie on these things I found the following article from the Sun Developer Network Mixing C and C++ Code in the Same Program quite interesting.

Marc

read more comments

<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 >>