.net

2007
23
feb

Fejlesztések a láthatáron


Kisebb mozgolódás van folyamatban korábbi projectjeimmel kapcsolatban.

Annó említést tettem a SynCE.NET-ről, amely egy .NET-es unmanaged wrapper a SynCE-re, melynek segítségével C#-os – vagy mostmár akár VB-s – kódból is lehet kapcsolatot teremteni PocketPC-vel, Linuxot használva. Ezt a wrappert elsősorban saját célokra fejlesztettem, mert bosszantott, hogy az új PDA-mat nem tudom szinkronizálni az Evolution-nel (WM5), de nem volt kedvem c-ben kódolni. Így a SynCE.NET felhasználásával írtam magamnak egy kliens-szerver alkalmazást, amely a szükséges szinkronizációt elvégezte. Ezt a programcsomagot – melynek SyncSheriff volt a neve :D – nem tettem publikussá, mert sosem érett meg arra. A SynCE.NET-et viszont úgy láttam, hogy más is örömmel tudná használni és nem szerettem volna, hogy a forrás eltűnjön a /dev/null-ban így feltöltöttem a SourceForge-ra.

A minap jelentkezett egy cseh illetőségű fejlesztő, aki jelezte, hogy fejlesztgetne egy kicsit a SynCE.NET-en, majd commit-olta is az első változtatásokat, immáron 0.2-es verzióra upgradelve azt. Szép munkát végzett az Evolution-nel való szinkronizáláshoz szükséges osztályok (appointments, tasks, contacts és categories) implementálása terén. Örömmel tölt el, hogy a wrapper fejlesztése folytatódik és úgy tűnik, hogy további fejlesztések is várhatóak!

A másik project a cdw. Jeleztem már, hogy a cdw-t nem fejlesztem tovább. Most azonban jelentkezett egy lengyel srác, hogy szívesen foglalkozna vele és átvenné a projectet. Remélem lesz valami a dologból és itt is várhatóak fejlemények, mert a cdw a szívemhez leginkább közelebb álló fejlesztésem, még akkor is, ha olyan, amilyen!

Sajnos a jelenlegi elfoglaltságaim miatt nem tudok aktívan részt venni ezekben a fejlesztésekben, de nyitva tartom a szemem és beszámolok róla, ha történt valami említésre méltó változás.

2007
04
feb

Firebug AJAX-os nyomkövetésre


Most jöttem csak rá, hogy a Firebug mennyire jól használható AJAX-os alkalmazások debuggolására is. Persze mára már minden webes fejlesztésem nélkülözhetetlen eszközévé lépett elő, a programozástól kezdve – legyen az ASP.NET, PHP vagy JavaScript – a designig, a CSS elemek és a pure HTML kód ellenőrzésén át mindenre a DOM böngészéséről nem is beszélve. És ez a felsorolás most kiegészült az AJAX-os kérések debuggolásával.

A Firebuggal egyszerűen tudom az AJAX-os kérésekben és válaszokban utazó adatokat ellenőrizni így megkímél az alert()-ek kényelmetlen használatától, az Ethereal-t pedig egy kicsit erősnek érzem ilyen feladatok alkalmazására, bár igaz, hogy nem is erre találták ki:

A fenti képen is látszik amint a kliens meghív egy AJAX-os GetServerTime metódust (senkit ne zavarjon meg a függvény neve, annak ugyanis semmi köze sincs a kérésben szereplő adatokhoz a data1-hez és data2-höz, a képek csupán egy teszt alkalmazásról készültek: AjaxProTest), a Post-ban és a Response-ban pedig szépen nyomon lehet követni a kérésben szereplő változók értékét:

Persze az egyes változók értékét a Script fülön lévő “Watch expression”-nel is nyomon követhetjük valamint itt akkár töréspontokat is illeszthetünk a kódba. Elmondhatatlan, hogy mekkora segítséget tud nyújtani ez a fajta nyomkövetés egy fejlesztés során. És ez csupán egy töredéke mindannak amire a Firebug használható.

2007
23
jan

MySQL Connector/Net 1.0.8 Vista bug


Úgy tűnik, hogy az 1.0.8-as MySQL Connector/Net nem működik megfelelően Windows Vista alatt. Futtatáskor a következő kivétel generálódik:

An address incompatible with the requested protocol was used.

A MySQL fórumán azt írták, hogy az 5.0.2-es és 5.0.3-as verziók kifogástalanul futnak. Ez valóban így van, az 5.0.3 telepítését követően és a referenciák módosítása után sikerült futásra bírni a kódomat. Ezzel a verzióval azonban Linuxon vannak gondok, mert a Monoval nem működik együtt rendesen. Állítólag az 1.0.9-es verzióban már javítva lesz a Vistán jelentkező bug, csak győzzem kivárni. Addig is két release-t kell gyártanom Vistára és egyéb Windows/Linux-ra és imádkozni, hogy a két kód ugyanúgy viselkedik.

2006
13
aug

XML serialization


A .NET keretrendszer egyik általam rendkívül kedvelt szolgáltatása az XML szerializáció. Mostanában az adatszerkezeteket úgy tervezem meg, hogy előtte egy XML file-ban jelenítem meg az elérni kívánt adatstruktúrát, majd ehhez igazítom az adatokat kezelő osztályt. Egy egyszerű példával élve a Pocket Revelation-ből, ahol az XML állomány formátuma eleve adott:

<?xml version="1.0" encoding="utf-8" ?>
<revelationdata version="0.4.7" dataversion="1">
 
	<entry type="folder">
		<name>Folder</name>
		<description>Description of the folder</description>
		<updated>1153820841</updated>
 
		<entry type="folder">
			<name>Subfolder</name>
			<description>Description of the subfolder</description>
			<updated>1153904513</updated>
 
			<entry type="creditcard">
				<name>CreditCard name</name>
				<description>CreditCard description</description>
				<updated>1153820891</updated>
				<field id="creditcard-cardtype">Card type</field>
				<field id="creditcard-cardnumber">Card number</field>
				<field id="creditcard-expirydate">Expirity date</field>
				<field id="creditcard-ccv">CCV number</field>
				<field id="generic-pin">PIN</field>
			</entry>
		</entry>
 
		<entry type="email">
			<name>Email name</name>
			<description>Email description</description>
			<updated>1153821003</updated>
			<field id="generic-email">Email</field>
			<field id="generic-hostname">hostname</field>
			<field id="generic-username">username</field>
			<field id="generic-password">password</field>
		</entry>
 
	</entry>
</revelationdata>

Az XML állomány kezeléséhez kapcsolódó C# osztály kódja:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections;
using System.IO;
using System.Text;
 
namespace PocketRevelation
{
	[XmlRoot ("revelationdata")]
	public class RevelationData
	{
		[XmlElement ("entry", Type = typeof (Entry))]
		public ArrayList  Entries;
		[XmlAttribute ("version")]
		public string     Version;
		[XmlAttribute ("dataversion")]
		public int        DataVersion;
 
		public RevelationData ()
		{
			Entries = new ArrayList ();
		}
 
		public byte[] Serialize ()
		{
			XmlSerializer xmlSerializer = new XmlSerializer (typeof (RevelationData));
			MemoryStream memoryStream = new MemoryStream ();
			xmlSerializer.Serialize (memoryStream, this);
			byte[] serializedXml = memoryStream.GetBuffer ();
			memoryStream.Close ();
			return serializedXml;
		}
 
		public static RevelationData Deserialize (string xmlFileName)
		{
			byte[] buffer = new byte[1024];
			FileStream fileStream;
			try {
				fileStream = File.OpenRead (xmlFileName);
			}
			catch (Exception e) {
				throw new FileNotFoundException(e.Message);
			}
			MemoryStream memoryStream = new MemoryStream ();
			while (true)
			{
				int cbRead = fileStream.Read (buffer, 0, buffer.Length);
				if (cbRead <= 0)
					break;
				memoryStream.Write (buffer, 0, cbRead);
			}
			memoryStream.Position = 0;
 
			XmlSerializer xmlSerializer = new XmlSerializer (typeof (RevelationData));
			RevelationData revelationData = (RevelationData) xmlSerializer.Deserialize (memoryStream);
			memoryStream.Close ();
			fileStream.Close ();
			return revelationData;
		}
	}
 
	public class Entry
	{
		[XmlIgnoreAttribute]
		private static readonly DateTime MinValue = new DateTime(1970, 1, 1);
 
		[XmlElement ("name")]
		public string		Name;
		[XmlElement ("description")]
		public string		Description;
		[XmlIgnoreAttribute]
		public DateTime		Updated;
		[XmlAttribute ("type")]
		public string		Type;
		[XmlElement ("field", Type = typeof (Field))]
		public ArrayList	Fields;
		[XmlElement ("entry", Type = typeof (Entry))]
		public ArrayList	Childs;
 
		[XmlElement ("updated")]
		public long	UpdatedLong {
			get { return (long)(Updated - MinValue).TotalSeconds; }
			set { Updated = MinValue + new TimeSpan (value * TimeSpan.TicksPerSecond); }
		}
 
		public Entry()
		{
			Fields = new ArrayList ();
			Childs = new ArrayList ();
		}
	}
 
	public class Field
	{
	    	[XmlAttribute ("id")]
		public string		Id;
		[XmlTextAttribute]
		public string		Value;
	}
 
	public class RevelationDatabase
	{
		private string            _xmlFileName;
		private RevelationData    _revelationData;
 
		public string filename {
			get { return _xmlFileName; }
			set { _xmlFileName = value; }
		}
 
		public RevelationData revelationData {
			get { return _revelationData; }
		}
 
		public RevelationDatabase (string filename)
		{
			_xmlFileName = filename;
			_revelationData = new RevelationData ();
		}
 
		public void Load ()
		{
			_revelationData = RevelationData.Deserialize (_xmlFileName);
		}
	}
}
2006
02
júl

Kalandozásaim


Nos, hát itt vagyok ismét. Jeleztem korábban, hogy hamarosan “visszatérek”, tele élményekkel és tapasztalatokkal. Elég hosszú ideje nem írtam ezért elnézést kérek azoktól a kitartó olvasóktól, akik várták, hogy következő lebilincselő írásomat megosszam a nagyérdeművel.

Hosszabb kihagyásom oka, hogy a fiókom mélyéről előkerült a rég nem használt iPaq-em, amelyről korábban már írtam. Akkoriban Linuxot varázsoltam a PDA-ra, most egy kicsit más vizekre eveztem. Egyrészt sikerült életre keltenem a SynCE-t és a Multisync-et mint linuxos ActiveSync klienst. Felbuzdulva a sikereken írtam egy .NET wrappert a SynCE-hez, amellyel linux alól C#-ban lehet nyomni a kódot. Írtam továbbá egy CE cab file ki- és becsomagoló libet szintén C#-al megvalósítva. Jól jöhet még valamikor. És amivel talán a legtöbb időt töltöttem, sikerült linux alól .NET-es kódot fordítanom PocketPC-hez a DotGNU cscc fordítójának segítségével. Mono-val sajnos nem jött össze kisebb-nagyobb problémák miatt de cscc-vel minden ment – majdnem – gond nélkül.

Ezek lesznek tehát a témák amelyekről mostanában írkálni fogok. Elnézést kérek azoktól akik esetleg valami mást vártak, jómagam is tudom, hogy ezen témák “szélsőségesek”, de hát ez van. Tehát összefoglalva, hogy mi várható:

  • SynCE és Multisync életrekeltése USB-vel, IrDA-val és Bluetooth-szal
  • Multisync és Evolution szinkronizáció beállítása
  • SynCE.NET ismertetése
  • LibCAB ismertetése
  • Programfejlesztés PocketPC-re DotGNU segítségével

Természetesen a sorrend változhat és a témaváltoztatás jogát is fenntartom :) Ja, és remélem, hogy lesz aki el is olvassa!!! Ízelítőül egy screenshot a PocketTeletext nevű cscc-vel fordított PDA-s progimról.