Blog

Playing Age of Empires 2 with Wine 0.9.30

14.02.2007 at 12:50

I am absolutely not a gamer, but today i was sick at home and wondered what i could do, so i decided to try if i could run Age of Empires 2 + the Conquerors expansion with Wine.

According to the Wine APP DB [1,2] this should be possible -- and it was. Installation was straight forward and worked perfectly, just mount the cdrom and execute the setup with wine. Because wine doesn't yet support the required copyprotection (safedisc2?) the game needs a no cd crack in order to run. This isn't a problem either since all required information can be found on the APP DB site. At first performance was really bad but then i disabled the sound (via winecfg) set the game resolution to 800x600 and reduced graphic detail. With this configuration the game was playable on my P4 2.8 GHz, however a DIB engine wouldn't hurt either ;)

There is a strange thing which i noticed, if i start the game then switch back to the terminal, kill wineserver and restart the game it is quite a bit faster. Haven't yet investigated further in what's actually going on.

Thanks to all Wine developers for their work, you made my day :)

Marc

read more comments

QEMU 0.9.0 is out and KQEMU is released under the GPL

06.02.2007 at 13:01

QEMU 0.9.0 brings lots of improvements and KQEMU is finally released under the GPL -- thanks Fabrice.

Other interesting things happen in the current KVM development with the recent work from Ingo Molnar on KVM paravirtualization for Linux which gives pretty impressive performance.

Unfortunately i currently don't have time to work on qemu-gui and there doesn't seem to be much interest anyway.

So long, Marc.

read more comments

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 Linuxbased 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 whitin 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 webinterface via https and then 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 the open sourcing of Java, by choosing the GNU GPLv2 you made the right decision. Thanks 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

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