29 Aralık 2009

Mutlu Yıllar !

Merhaba,

Acısıyla, tatlısıyla, teknolojik gelişmeleriyle yorucu bir yılı geride bırakıyoruz. Umarım 2010 yılı sağlık, mutluluk ve başarı bakımından hepiniz için mükemmel bir yıl olur ! 2010' da görüşmek dileğiyle !


Devamını Oku...

18 Kasım 2009

Microsoft Office Mobile 2010 Beta !

Muhteşem bir haberi sizlerle paylaşmak istiyorum. PDC 2009' da Microsoft Office 2010' un Beta' sının anons edilmesinden sonra e-posta kutuma çok güzel bir haber düştü. Microsoft Office Mobile 2010 Beta !

Şu an sadece Windows Marketplace For Mobile üzerinden indirilebilen yeni mobil ofis paket çözümü gerçekten heyecan verici.

http://www.microsoft.com/office/2010/en/mobile/default.aspx adresi üzerinden yeni mobil ofis paketinin ekran görüntülerine ulaşabilirsiniz.



Uygulamayı daha deneme imkanım olmadı, biran önce Marketplace üzerinden indirip izlenimlerimi aktaracağım. Görünen o ki Microsoft Office Mobile 2010 ile ofisimiz artık daha fazla yanımızda. Örneğin Sharepoint 2010 üzerindeki dökümanlarımıza artık mobil cihazımız üzerinden de erişebileceğiz ; direk e-posta olarak gönderebileceğiz. Alttaki ekran görüntüsünün Windows Mobile 7.0' dan alındığını dikkatinizi çekerim ! Bu güzel haber.



Uygulama detayını
http://marketplace.windowsphone.com/details.aspx?appSKU=a226f64c-d514-4d91-85df-a512bc37c1cd&retURL=/search.aspx%3Fkeywords%3D2010 adresinden de inceleyebilirsiniz.

Devamını Oku...

23 Ekim 2009

Visual Studio 2010 - Mobile Development ?!

Merhaba,

Bilindiği üzere geçtiğimiz günlerde Visual Studio 2010 'un Beta 2 sürümü yayınlandı. Fakat, uzun bir indirme süreci ve ardından heyecanlı bir kurulumun ardından mobil uygulama geliştiricileri kötü bir süpriz beklemekteydi : Visual Studio 2010 Beta 2 üzerinde mobil uygulama geliştirebilmek için gereken tüm araçlar kaldırılmış !

Bu konu ile ilgili gelen heyecanlı ve korku dolu sorular ardından minik bir araştırma yaptım ve mobil uygulama geliştiricilerin içini rahatlatacak o güzel haberi sizlerle paylaşmak istiyorum ;

Visual Studio 2010 Beta 2 does not support Smart Device Development.

Microsoft is committed to making Visual Studio a great development tool for the mobile device developer, and will deliver mobile device tools for Visual Studio 2010, but cannot share details now. For existing Visual Studio 2008 mobile developers, Microsoft released the Windows Mobile 6.5 Developer Tool Kit that works with the Windows Mobile 6 SDK.

Because Visual Studio 2010 Beta 2 does not support Smart Device Development, you cannot use the following features: .NET Compact Framework projects, Visual C++ device projects, smart device CAB projects, Device Emulator and Device Emulator Manager, testing tools for device projects, and Device Security Manager.

Smart device development is still supported in earlier versions of Visual Studio, such as Visual Studio 2008. For the more information about smart device projects, see Windows Mobile Developer Center and Smart Device Development in Visual Studio 2008.

Yukarıdaki paragraf MSDN üzerinden alınmıştır.

Kısaca "değişik birşeyler üzerinde çalışıyoruz, daha yetiştiremedik ama az kaldı" demişler. Yani çıkartılan birşey yok. Rahat olun :)

Devamını Oku...

04 Ekim 2009

GPS Framework for .NET ! Ücretsiz !

Merhaba,

Geçen hafta beni hem sevindiren hem de global krizin boyutunun ne derece devam ettiğinin resmini çok açık bir şekilde gösteren bir mail aldım. Device Application Development MVP Mail Grubu üzerinden gelen bir haberden öğrendiğim üzere, uzun zamandır GPS sektöründe şahsımca takip ettiğim ve inanılmaz başarılı bileşenler geliştiren ve binlerce dolara satmasına rağmen bu noktada ihtiyaç duyan birçok firma tarafından bileşenleri satın alınan GeoFrameworks firması Global Kriz' in etkilerine dayanamamış ki kapılarını artık kapatmaya karar vermiş.

Fakat kapılarını kapatırken hatırı
"ciddi" anlamda sayılır bir iz bırakarak ticaret hayatını noktalamış ; bu zamana kadar binlerce dolara satılan GPS üzerine geliştirdiği GPS Framework for .Net paketinin şu ana kadar geliştirilen tüm sürümlerini CodePlex üzerinden "ücretsiz" olarak uygulama geliştiricilerin kullanımına bırakmış ! Süper !

Belki aylarca uğraşılarak hazırlanmış bir paketin ücretsiz olarak uygulama geliştiricilerin kullanımına ve geliştirilmeye bırakmak şahsımca saygı duyulacak bir davranış.

Masaüstü ve mobil cihazlar üzerinde GPS tabanlı uygulamalar geliştiriyor ve hazır bir kütüphaneye ihtiyaç duyuyorsanız kaçırmamanızı tavsiye ederim.

Detayları ;



http://gps3.codeplex.com

adresi üzerinden takip edebilir, paketin tamamını "ücretsiz" olarak bu adres üzerinden indirebilirsiniz.

Devamını Oku...

Windows Mobile Widget Emulator

Merhaba,

Windows Mobile 6.5' un tam olarak piyasaya çıkmamış olması ve bu konu hakkındaki dökümantasyonun çok sınırlı olması sebebiyle muhtemelen Türkiye' de Windows Mobile Widget' ları ile ilgili birtek ben belirli bir efor sarfediyorum. :)

Yakın zamanda ne kadar önemli olduğunu anlayacağımız bu konu ile ilgili yazmaya, türkçe kaynak oluşturmaya devam edeceğim. Ve yine çok yakın zamanda bu konu ile ilgili süpriz bir aktiviteyide buradan bildireceğim.

Yazımızın içeriğine gelirsek bilindiği üzere geliştirilen widget' ları şu aşamada yanlızca Windows Mobile 6.5 emulatörleri üzerinde test edebilmekteyiz. (Eğer Internet üzerinden desteklenmeyen ortamlardan kullanıcıların hazırladığı bir ROM' a sahip değilseniz :) ) Bu test süreci birkaç aşamadan oluşmaktadır. Öncelikle widget için hazırladığınız dosyaları *.zip haline getirmeniz gerekmekte. Bir sonraki aşamada bu *.zip uzantısını *.wgt ya da *.widget olarak değiştirmeniz gerekmekte ve bu dosyayı emulatör üzerinde kopyalayıp (bu kopyalama işleminide emulatör ile paylaşımlı bir klasör üzerinden gerçekleştirebilirsiniz) gerekli kurumları yapmanız gerekmekte. Ayrıca bir önce test' ten kalan kurulumunuzu kaldırmanız ve yeni halini kurmanız test' i daha stabil kılmaktadır.

Her seferinde bu süreç can sıkıcı olabildiğinden geçen hafta tam ihtiyaç duyulan bir çalışmaya CodePlex üzerinde rastladım ; Windows Mobile Widget Emulator !

CodePlex üzerinde açık kaynaklı olarak gelişimine devam eden çalışma, kullanıcılara geliştirdikleri Windows Mobile Widget' ları Emülatör' e kurmaya gerek kalmadan "sanki mobil cihaz üzerinde çalıştırılıyormuş gibi" test imkanı sağlamaktadır.



Örneğin CodePlex üzerinden alınan yukarıdaki ekran görüntüsün, geliştirilen bir widget' ın masaüstü ortamında Windows Mobile Widget Emulator ile çalıştırıldığı görülmektedir. Süper !

Peki Nasıl Kullanacağız ?

http://widgetemulator.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31211 adresinden gerekli paketi indirdiğimizde aşağıdaki ekran görüntüsündeki dosyalar paketin içinden çıkmaktadır.



  • assests klasörü uygulamanın çalıştırılabilmesi için gereken sistemsel dosyaları içermektedir.
  • widgets klasörü "geliştirdiğimiz widget' ı paketlemeden yerleştireceğimiz" bölgedir.
  • index.htm ise widget' ımızı test edeceğimiz standart bir HTML dosyasıdır.
Yukarıda da belirttiğimiz üzere geliştirdiğimiz widget' ı "paketlemeden" widgets klasörü içerisine yerleştirmemiz gerekmektedir. Sadece bu kadar !

Javascript Widget API ?

Widget' ın masaüstü tarayıcısı içerisinde çalıştırılması sonucunda maalesef Javascript Widget API standart olarak desteklenmemektedir. Javascript Widget API' nin kullanılması durumunda ise yapmanız gereken tek şey Widget' ınızı içerisinde kullanıyor olduğunuz HTML Dosyası içerisinde "assets" klasörü içerisinde bulunan "widget.js" ' ye referans vermeniz olacaktır.



Ve Son Olarak...

Widget' ımızı test etmeye geçmeden son olarak kök klasör içerisinde bulunan Index.htm dosyası içerisinde bulunan IFRAME' in src attribute' unu widget'ımızın kaynak HTML dosyasına işaret edecek şekilde değiştirmemiz gerekmektedir.



Peki bu uygulama vasıtasıyla başka nelere sahip olmaktayız ? Normal şartlarda emülatörler tek çözünürlüğe sahip cihazları simule etmektedir. Windows Mobile Widget Emulator sayesinde widget' larınızı farklı çözünürlüklerde test edebilmektesiniz ! Ayrıca yatay / dikey görünümlerde de test edebilmektesiniz !



İşte Bu Kadar !


Devamını Oku...

28 Eylül 2009

*.widget Uzantısının Tanıtılması

Hali hazırda geliştiriyor olduğumuz widget' ları *.widget uzantılı kaydedip emulatör dışında gerçek bir cihazda test etmeye çalıştığımızda *.widget uzantısının sistem tarafından tanınmadığını, widgetinstaller tarafından çalıştırılmadığını görmekteyiz.

Windows Mobile 6.5 emulatörlerinde bu tanımlama yapılmış olmasına rağmen şu aşamada kurulan ROM' lar üzerinde yapılan denemelerde *.widget uzantısının tanınmadığı görülmektedir.

Bunun önüne geçebilmek için Visual Studio Remote Tools içerisinde bulunan Remote Registry Editor aracı ile takılı olan cihazımıza bağlanmak ve registry' si içerisine aşağıda tanımlı olan key' leri yazmamız gerekmektedir.

[HKEY_CLASSES_ROOT\riapp]
"EditFlags"=dword:00010000
[HKEY_CLASSES_ROOT\riapp\Shell\Open\Command]
@="wmwidgetinstaller.exe %1"

(@ İşareti Default Key olarak isimlendirilen key' i temsil etmektedir)



(EditFlags dword Değeri)



riapp altında sırasıyla Shell -> Open -> Command key' i altında tanımlı olan Default Key değeri.


Devamını Oku...

Windows Mobile 6.5 – Widget System State

Windows Mobile 6.5 üzerinde geliştirilen widget’ larda yararlanılabilecek bir başka nokta ise bir önceki yazımızda ifade ettiğimiz “widget” javascript objesi üzerinden oluşturulabilecek SystemState objesidir. SystemState objesi vasıtasıyla geliştirdiğiniz widget’ lar içerisinden “bazı belirli” sistemsel özelliklerin değerlerine ulaşabilir, bu değerlerin değiştiğini algılayabilir ve istenilen kod bloklarını çalıştırabilmektesiniz. Aşağıdaki listede SystemState objesi üzerinden ulaşılabilecek değerlerin bir listesi listelenmiştir.

CradlePresent – Cihazın “cradle” (cihazın bilgisayarınız ile olan fiziksel bağlantısı) üzerine takılıp takılmadığının değerini döndürür.

DisplayRotation – Ekranın anlık görüntüsünün kaç derecelik bir açıyla gösterildiğinin değerini döndürür. (0 – 360 Derece Arası)

PhoneHomeService – Cihazın anlık network ile kayıtlı olup olmadığının değerini döndürür.

PhoneOperatorName – Cihazın anlık network (operatör) isim değerini döndürür.

PhoneRomaing – Cihazın anlık olarak “Roaming (Yurtdışında farklı bir operatör üzerinden bağlantı)” içerisinde olup olmadığının değerini döndürür.

PhoneSignalStrength – Cihazın operatör ile arasındaki bağlantı kalitesinin değerini yüzdelik olarak döndürür.

PowerBatteryState – Cihazın anlık batarya güç değerini düşük, güçlü, orta şeklinde tanımlı değerlerinin numerik karşılıklarını döndürür.

PowerBatteryStrength – Cihazın anlık batarya güç değerini yüzdelik değer olarak döndürür.

Sıra geldi widget’ ı çalıştıracak olduğumuz fiziksel mobil cihazımız üzerinde widget üzerinden bu değerlerin alınmasına. Konfigurasyon dosyamız daha önceki yazımızda olduğu gibi aşağıdaki şekilde tanımlanmış, config.xml isim ve dosya uzantısıyla kaydedilmiştir. Konfigürasyon (manifest) dosyasının dışında, bu dosya içerisinde belirlenen ikon (*.png uzantılı) ve kaynak HTML dosyası da konfigürasyon dosyası ile birlikte aynı lokasyona yerleştirilmiştir.

(Resimlerin büyük halleri için üzerilerine tıklayınız)



Hiç vakit kaybetmeden kaynak olarak kullanılacak olan HTML dosyasının içeriğini hazırlıyoruz. Yukarıda bahsedildiği üzere amacımız geliştirdiğimiz widget içerisinden bize izin verilen ölçüde bazı sistemsel değerleri çekmek ve widget içerisinde uygun yerlerde görüntülemektir. Bu noktada bu değerlere ulaşabileceğimiz SystemState objesini widget javascript objesinin createObject fonksiyonuna “SystemState” değerini gönderek oluşturuyor ve ss isminde bir değişkende tutuyoruz. Bir sonraki aşamada ise ss isimli SystemState değişkeni üzerinden yukarıdaki tabloda isimleri verilen özelliklere ulaşıyor ve bu özelliklerin değerlerini aşağıdaki ekran görüntüsünde gösterildiği üzere bir div içerisinde görüntüleyecek javascript fonksiyonunu oluşturuyoruz.

Bu fonksiyonu ise HTML dosyamız içerisinde oluşturduğumuz button kontrolünün client side click event’i (onlick) tetiklendiğinde çağırıyoruz. İşte bu kadar !

Widget’ ımızı paketlemeye geçmeden önce ihtiyaç duyabileceğimiz önemli bir konuya daha dikkat çekmemiz gerekiyor. Değişikliklerin algılanması. Ya biz yukarıda listelenen sistemsel değerlerin herhangi birinde bir değişiklik olduğunda bu değişiklikten haberdar olmak ve bir javascript fonksiyonunu çalıştırmak istiyorsak ?

Bu ihtiyacın çözümü için yukarıda listelenen SystemState değerleri içerisinde çok basit bir yöntem bulunmaktadır. Değişikliğini algılamak istediğiniz SystemState değerinin üzerinden Javascript addEventListener fonksiyonu ile “changed” olayını yakalayan kod bloğunu aşağıdaki ekran görüntüsündeki gibi ekliyoruz. “changed” yani değişiklik durumu söz konusu olduğunda ise addEventListener fonksiyonunun ikinci parametresinde verilen fonksiyon olan “Degisti” fonksiyonu otomatik olarak çağırılacaktır. Örneğimizde telefonun güç değeri değiştiğinde ekrana mesaj kutusu getiren bir kod bloğunu ekliyoruz.

Daha önce yazdığımız SistemOzellikleriniYukle fonksiyonu içerisine EventHandler’ ımızı ekliyoruz. Ardından bu EventHandler içesinde işaret edilen “Degisti” isimli Javascript fonksiyonumuzu yazıyoruz.

Sıra geldi widget’ ımızı paketlemeye. Tüm gerekli dosyaları seçip zipledikten sonra uzantısını *.widget ya da *.wgt olarak değiştiriyoruz.

Widget’ a mobil cihaz emulatörümüz üzerinden erişip kurulum işlemlerine başlıyoruz.

Widget’ ın başarılı bir şekilde kurulmasından sonra çalıştırıp sayfa içerisindeki button kontrolüne tıklıyoruz ! Hepsi bu kadar !



Emulatör ayarlarından batarya gücünü azaltıyoruz.



OK’ e tıkladığımızda değişikliğin algılandığını ve mesaj kutusunun ekrana geldiğini görüyoruz ! İşte bu kadar !



Hazırladığımız örnek widget’ ı ve diğer dosyaları buradan indirebilirsiniz. Bir başka yazıda daha görüşmek üzere.

Devamını Oku...

23 Eylül 2009

Windows Mobile 6.5 - Widget Javascript Object

Daha önce de konuştuğumuz üzere Windows Mobile 6.5 (WM 6.5) üzerinde uygulama geliştiriciler için gelen en büyük yeniliklerden bir tanesi hiç şüphesiz Widget olarak isimlendirilen, ilk olarak Windows Vista üzerinde Gadget olarak karşımıza çıkan ve standart bildiğimiz web teknolojilerini (HTML, Javascript, CSS) kullanarak geliştirebileceğimiz uygulama parçacıklarıdır. Geliştirdiğimiz Widget’ ların, dinamik bir yapıya sahip olmasını istediğimizde ise elimizdeki tek olanak Widget içerisinde yazabilecek olduğumuz Javascript kod bloklarıdır.

Windows Mobile 6.5 üzerindeki Widget geliştirirken, Javascript kod bloğu içerisinden erişebileceğimiz, widget metadata' ’ına ulaşabileceğimiz, widget menülerini belirleyebileceğimiz ve widget ikon özelliklerine ulaşabileceğimiz bir Javascript objesi bulunmaktadır ; widget !

Widget Javascript objesine widget içerisinde kullanıyor olduğumuz HTML dosyasının içerisinden Javascript kod blokları arasında ulaşabilmekteyiz. Bu obje vasıtası ile widget hakkında birçok bilgiye sahip olabilmekteyiz. Bu yazımızda ise, widget javascript objesini kullanarak widget metadatasına ulaşabilmemiz noktasında bir örnek üzerinde çalışacağız.

Bilindiği üzere Widget’ lar xml içerikli manifest olarak isimlendirilen “konfigurasyon” dosyalarına sahiplerdir. Bu dosyalar vasıtası ile widget içerisindeki gereken tüm bilgilere işletim sistemi tarafından ulaşılır ve widget gerektiği şekilde gerektiği kaynaklar kullanılarak çalıştırılır. XML içerikli bu manifest dosyasının içerisine nelerin yazılabileceğini daha önceki yazılarımızda detaylıca incelemiştik.

Örneğimizde aşağıdaki manifest dosyasını kullanan bir widget üzerinde çalışıyor olacağız.

Yukarıdaki konfigurasyon dosyasında, widget root elementi içerisinde widget ile ilgili gerekecek tüm konfigurasyon değerleri tanımlanmıştır. Widget çalışma zamanında bu değerlere Javascript ile ulaşabilmek için, “sadece wm 6.5 widget’ lar içerisinden kullanılabilecek bir javascript objesi olan widget objesinin kullanılması gerekmektedir. Aşağıdaki örnekte, yukarıdaki konfigurasyon dosyası içerisinde content olarak belirlenen WidgetContent.html dosyası içerisinde bir javascript kod bloğu tanımlanmış, kod bloğu içerisinde ise sayfa üzerine yerleştirilmiş bir div’ in içeriği widget objesi kullanılarak widget bilgileri ile değiştirilmektedir.



Yukarıdaki javascript kod bloğu, sayfa içerisine yerleştirilen bir button’ a tıklandığında client side olarak çalıştırılmaktadır. Kod bloğu içerisinde anlaşılabileceği üzere widget olarak isimlendirilen objeye direk olarak ulaşılabilmekte, widget manifest dosyası içerisindeki tüm bilgilere bu obje üzerinden ulaşılabilmektedir. Ayrıca bu yazımız içerisinde incelemediğimiz menu ve currentIcon özellikleri bir başka yazıda incelenecektir.



(Resmin Büyük Hali İçin Üzerine Tıklayınız)

Widget’ ı hızlıca paketliyoruz (Gerekli dosyaları seçip zip dosyası haline getiriyoruz, daha sonra uzantısını *.wgt ya da *.widget olarak değiştiriyoruz) ;



Widget’ ı Windows Mobile 6.5 emulatör’ ü üzerinden cihaza yüklüyoruz ve çalıştırıyoruz ;



Widget’ ı yüklüyoruz ;



Ve widget’ ı çalıştırıyoruz ;

Ve sonuç ! Uygulama çalıştırıldığında tüm bilgilere widget objesi üzerinden ulaşabilmekteyiz. Bir başka yazıda daha görüşmek dileğiyle.

Örnek uygulamayı buradan indirebilirsiniz !

Devamını Oku...

02 Eylül 2009

.Net Compact Framework 3.5 – System.IO.Compression

Bu makalemizde .Net Compact Framework 3.5 ile mobil cihaz uygulama geliştiricilerin kullanımına sunulan ve mobil cihaz uygulamalarında sıkıştırma işlemlerine olanak sağlayan System.IO.Compression namespace’ i içerisindeki sınıfları inceleyecek, örnek bir uygulama geliştiriceğiz.

Bilgisayarların tüm gelişim tarihi boyunca farklı ihtiyaçlar üzerinde birçok metodoloji geliştirilmiş ve tüm bu metodolojiler zamanla standart bilgisayar hayatımıza girmiş bulunmaktadır. İnsanoğlunun bu gelişim sürecinde üzerinde çalıştığı en önemli nokta ise temel olarak byte dizileri olarak adlandırılan veri kümelerini bilgisayar ortamında daha efektif ve daha iyi nasıl depolanacağıdır. Bu noktada araştırıldığında ise zaman içerisinde bu veri kümelerinin taşınılabilirlilik ve depolama noktasında hayatımızı kolaylaştırabilmesi açısından birçok çalışma gerçekleştirilmiş ve bugün birçoğumuzun günlük hayatında farkında olmadan yüzlerce kez kullandığımız yöntemlere dönüşmüştür.

Bu metodolojilerin en başında hepinizin tahmin edebileceği üzere sıkıştırma (zip / unzip) işlemleri gelmektedir. Sıkıştırma mantığına temel olarak bakıldığında böyle bir işlemin gerçekleştirilebilmesi için gereken yazılım kodlanabilmesi için çok yüksek bir matematik bilgisine ve bu matematik bilgisini yazılımsal olarak destekleyebilecek programlama bilgisine sahip olunması gerektiği kolay bir şekilde anlaşılabilmektedir. Sıkıştırma işlemleri tüm gelişim tarihi boyunca çok önemli bir yer kaplamış, farklı algoritmalar üzerinden bugünkü standart olarak kabul edilebilecek ve günlük hayatta yüzlerce kez kullandığımız / kullanıyor olduğumuz halini almıştır. Bugün araştırıldığında en meşhur ve en çok kullanılan sıkıştırma uygulamalarının arka tarafında tarihteki en meşhur sıkıştırma algoritmalarından Deflate Algoritması kullanılmaktadır. Deflate algoritması ile ilgili ayrıntılı bilgiye http://en.wikipedia.org/wiki/DEFLATE_(algorithm) adresinden ulaşabilir, bu algoritmanın arka tarafındaki matematiksel altyapıyı öğrenebilirsiniz.

Bu makalemizde ise bu algoritmaları kullanan sınıfların hazır olarak tanımlandığı System.IO.Compression namespace’ i içerisindeki sınıfları kullanarak mobil cihaz uygulamalarında sıkıştırma işlemlerinin nasıl gerçekleştirilebileceği ile ilgili konuyu ifade edecek ve örnek bir uygulama geliştirilecektir.

Hızlı bir şekilde .Net Compact Framework 3.5 ile mobil cihaz uygulamalarında hayatımıza giren sınıfları tanımaya geçelim.

Öncelikle belirtmemiz gerekirki bu sınıfları masaüstü .net Framework uygulama geliştiricileri .net Framework 2.0 sürümünden beri kullanmakta, kendi uygulamalarında Deflate algoritması üzerinden sıkıştırma işlemleri gerçekleştirebilmektedirler. Biz ise bugün .net Compact Framework 3.5 ile mobil cihaz uygulama geliştiricilerinde hayatına giren bu sınıflarla mobil cihaz üzerinde çalışan ve zip / unzip işlemleri gerçekleştirebileceğimiz bir uygulama geliştireceğiz.



Üstteki resimden de anlaşılabileceği üzere System.IO.Compression içerisinde aslında birbiriyle küçük bir fark dışında tamamen aynı iki adet sınıf bulunmaktadır.

DeflateStream adından da anlaşılabileceği üzere Deflate algoritmasını kullanarak sıkıştırma ve açma işlemi gerçekleştirmeye yarayan altyapıyı içerisinde barındırmaktadır. GzipStream ise yine Deflate algoritmasını kullanmaktadır, fakat içerisine Gzip dosya formatına uygun bazı başlık bilgileri eklemekte, dolayısıyla gzip uzantısına sahip dosyaları açabilecek tüm uygulamalarda açabilecek hale getirmektedir.

Hiç vakit kaybetmeden Visual Studio 2008 üzerinde bir mobil cihaz uygulaması açarak işe başlayalım. Bu noktada belirtmemiz gerekise geliştirilecek olan uygulamanın hedef platformu Windows Mobile 6.0 yüklü dokunmatik özelliğe sahip (Windows Mobile 6.0 Professional) cihazlar olduğundan dolayı ilgili SDK’ yı sisteminize kurmanız gerekmektedir. İlgili SDK ‘ yı http://www.microsoft.com/downloads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en adresinden indirebilirsiniz. Visual Studio üzerinde bir mobil cihaz uygulaması oluşturarak hızlı bir şekilde örnek projemizi geliştirmeye başlayalım.



Projemizin adı MobiZip.



Hedef platformumuz ise Windows Mobile Professional 6 SDK üzerinde .Net Compact Framework 3.5 sürümü olacaktır.

Uygulama ekranını tasarlamaya geçmeden önce hızlı bir şekilde uygulamamızın senaryosunu ifade edelim.

Uygulamanın temel amacı mobil cihaz üzerinde konumlandırılmış bir dosyayı sıkıştırmak ya da belirli koşullar sağlandığı taktirde bu sıkıştırılan dosyayı açıp tekrardan eski haline getirmektir. Bu noktada bu koşulları ifade etmemiz gerekirse ;

Uygulamamızın kullanacak olduğu dosya uzantısı DosyaAdi.mobizip olacaktır. DeflateStream yapısı gereği dosyanın sıkıştırılmadan önceki adı ve boyut bilgisini tutmadığından ve dosyanın eski haline getirilmesi noktasında bu bilgilere ihtiyaç duyulacağından sıkıştırılmış dosyanın yanına uzantısı DosyaAdi.mobizip.info olan bir bilgi dosyası daha oluşturulacaktır. Bu dosya içerisinde arasında | işareti koyularak dosyanın orjinal adı ve sıkıştırılmadan önceki boyutu kaydedilecektir.

Hızlı bir şekilde uygulama ekranını tasarlayalım.



Uygulama ekranına baktığımızda çokta karmaşık bir arayüz olmadığını, ihtiyaçlar noktasında sıkıştırma yada açma işlemi gerçekleştirilecek olan dosyanın seçilebilmesi için gereken 3-4 adet kontrol yerleştirilmiştir. Ayrıca ekran üzerinde görünmeyen ve dosya seçme diyaloğunu temsil eden OpenFileDialog kontrolüde arayüz üzerine yerleştirilmitir. (OfdSelectFile)

Hızlı bir şekilde kod altyapısını oluşturmamız gerekirse ;

Senaryo gereği kullanıcı OpenFileDialog vasıtasıyla sıkıştırılacak yada açma işlemi gerçekleştirilecek dosyayı seçecektir.

... yazan button’ a tıkladığımızda aşağıdaki kod bloğu çalıştırılacaktır.



Yukarıdaki kod bloğundan anlaşılabileceği üzer dosya seçme ekranı üzerinden herhangi bir dosya seçildiğinde bu dosya bilgisi metin kutusu içerisine yazdırılmaktadır.

Bir sonraki aşamada sıkıştırma işlemlerinde kullanacak olduğumuz 3 adet stream obje referansını global’ e yerleştiriyoruz.



Bu noktada açıklamamız gerekirse ; DeflateStream adından da anlaşılabileceği üzere sıkıştırma ya da açma işlemlerini gerçekleştirecek olan Stream objesini temsil etmektedir. FsSource senaryoya göre o an işleme sokulan dosyanın stream’ i FsTarget ise o an senaryoya göre işlem görecek olan dosyanın stream’ ini temsil etmektedir.

Sıra geldi sıkıştırma / açma işlemlerini gerçekleştirecek olan Operate button’ una tıklandığında çalıştırılacak olan kod bloğunu hazırlamaya geldi.

Uygulamamız hangi işlemin yapılacağına (sıkıştırma / açma) seçilen dosyanın türüne bakarak karar verecektir. Eğer seçilen dosyanın uzantısı *.mobizip ise açma, değilse sıkıştırma işlemi gerçekleştirecektir. Aynı zamanda *.mobizip uzantısına sahip olsa bile dosyanın eski haline getirilebilmesi için gereken *.mobizip.info dosyasınıda sıkıştırılmış dosyanın yanında arayacak şayet bulabilirse hata vermeden işlemi tamamlayacaktır.

Operate tuşuna basıldığında ilk olarak dosyanın türünü inceliyoruz ;

Büyük Halini Görmek İçin Tıklayınız

Bu if koşulunun else ayağında ise sıkıştırma işlemi gerçekleştirilmektedir.

Büyük Halini Görmek İçin Tıklayınız

Hızlı bir şekilde uygulamamıza devam edelim. Eğer seçilen dosya mobizip uzantısına sahip ise açma işleminin yapılacağı ile ilgili kod bloğu çalıştırılmaktadır. Bu kod bloğunda ise ilk olarak ilgili dosyanın bilgilerinin bulunduğu info dosyası aranmaktadır.

Büyük Halini Görmek İçin Tıklayınız

Dosya eğer başarılı bir şekilde bulunabilmiş ise dosya içeriği | işaretine göre split edilmekte ve bir diziye aktarılmaktadır.

Bir sonraki aşamada açma işlemi için gereken kodlar yazılmaktadır.

Büyük Halini Görmek İçin Tıklayınız

Yazılan kodları sırasıyla incelediğimizde ilk olarak global’ de tanımlanan Stream objelerinin instance’ ları oluşturulmakta ; FsSource açılacak olan dosyayı temsil etmekte, FsTarget ise açıldıktan sonra oluşturulacak olan eski dosyayı temsil etmektedir.

DeflateStream objesinin instance’ ının oluşturulduğu satırda ise ilk parametresinde açılacak olan stream’ a referans, ikinci parametresinde ise gerçekleştirilecek olan işlem seçilmiştir.

Bir sonraki satırda info dosyasının yardımıyla dosyanın açıldıktan sonraki halinin byte dizisini depolayabilecek bir buffer oluşturulmuş, boyut olarakta yine info dosyasının yardımıyla eski dosyanın (sıkıştırılmadan önceki) boyutu atanmıştır.

ds.Read ile başlayan satırda sıkıştırılmış dosyanın tekrardan açılmış hali buffer ‘ a kopyalanmakta,bir sonraki satırda ise buffer içerisindeki açılmış hali FsTarget stream’ i üzerinden yeni oluşturulmuş ve açılmış olan dosyaya yazılmaktadır. İşte bu kadar ! Bu noktadaki en önemli uyarı ise stream’ leri kullandıktan sonra kesin olarak kapatmanızdır. Aksi taktirde dosyalara erişim kısıtlanacak ve hata alınacaktır.

Bir diğer çalıştırılacak olan kod bloğu ise sıkıştırma işlemi için gereken kod bloğudur. Uygulama uzantının *.mobizip olmadığı durumlarda sıkıştırma işlemi gerçekleştirmekte ; bununla birlikte bir info dosyası oluşturmaktadır.

Büyük Halini Görmek İçin Tıklayınız

Yukarıdaki kod bloğu incelendiğinde ise aslında bir önceki işlemle karşılaştırıldığında tam ters hareket uygulanmaktadır.

İlk iki satırda sıkıştırılmış ve sıkıştırılacak olan dosyalar ilgili stream’ lere yüklenmekte, bir sonraki aşamada ise dosya bilgilerinin tutulduğu FileInfo değişkeni oluşturulmaktadır.

Daha sonra sıkıştırılacak olan dosyanın verileri Buffer’ a yüklenmekte, ve DeflateStream üzerinden FsTarget isimli stream’ e bu veriler sıkıştırılarak gönderilmektedir.

Bu işlemden sonra *.mobizip.info uzantılı dosya da kaydedilmekte ve işlem tamamlanmaktadır. İsterseniz hiç vakit kaybetmeden uygulamamızı Emulator üzerinde deneyelim.

Uygulamamızı çalıştırdığımızda aşağıdaki görüntüyü elde etmemiz gerekmektedir.

Büyük Halini Görmek İçin Tıklayınız

Dosya seçme ekranını açarak daha önceden cihaza kopyaladığımız ve sıkıştırılmaya çok müsait olan bir BMP dosyasını seçiyoruz.

Büyük Halini Görmek İçin Tıklayınız

Ve son görünüm,

Büyük Halini Görmek İçin Tıklayınız

Operate tuşuna tıkladığımızda uygulama dosyanın uzantısına bakacak ve sıkıştırma işlemi gerçekleştirecektir.

Büyük Halini Görmek İçin Tıklayınız

Dosyanın bulunduğu yere gidip baktığımızda dosyanın yanında 2 adet daha dosya görmekteyiz. Bunlardan biri sıkıştırılmış olan dosya (*.mobizip) ve sıkıştırılan dosyanın eski boyut bilgisi ve isim bilgisini tutan *.mobizip.info dosyası.

Büyük Halini Görmek İçin Tıklayınız

Dikkat edilecek olursa dosya boyutu neredeyse 20 kat küçülmüştür.

Bir sonraki aşamada OrnekBMP isimli bmp dosyasını siliyoruz.

Büyük Halini Görmek İçin Tıklayınız

Ve bu dosyayı sıkıştırıldığı halinden tekrar oluşturuyoruz.

Öncelikle uygulamamızdan mobizip uzantılı sıkıştırılmış dosyayı seçiyoruz.

Büyük Halini Görmek İçin Tıklayınız

Operate tuşuna bastığımda ise açma işlemi başarıyla gerçekleştirilmektedir ;

Büyük Halini Görmek İçin Tıklayınız

Dosyanın bulunduğu yere tekrar gidip baktığımızda ;

Büyük Halini Görmek İçin Tıklayınız

Dosyanın tekrar oluşturulmuş olduğunu görmekteyiz.

İşte bu kadar !

Bu makalede .net Compact Framework 3.5 ile birlikte gelen System.IO.Compression sınıflarını kullanarak bir sıkıştırma / açma işleminin nasıl gerçekleştirilebileceği ile ilgili örnek bir uygulama geliştirdik.

Başka bir makalede daha görüşmek dileğiyle.

Devamını Oku...