Pazartesi, Kasım 10, 2008

Yeni işim: AvukatPro —> Proje Yöneticiliği

Geçen hafta itibari ile Yazılım Mühendisi olarak çalıştığım Filika Bilişim Hizmetleri şirketinden ayrılarak AvukatPro şirketin geçmiş bulunuyorum. Yeni işimde proje yöneticisi ünvanı ile çalışma yaşamıma devam ediyor olacağım. Artık kullanıdığım şirket mailim: turhal.temizer@avukatpro.com ‘dur. Benimle temasa geçmek isteyen arkadaşlar bu mailim üzerinden de ulaşabilirler.

Herkeslere kendi iş yaşamlarında başarılar dilerim.

CLIP - Caption Language Interface Pack

Visual Studio 2008 menülerinin Türkçeleştirilmesi için CLIP aracı Web üzerinden yayınlandı. CLIP, Visual Studio 2008'deki görsel arayüz maddelerinin yerel dildeki çevirilerini bir araç çubuğu yardımcı balonu (tooltip) veya diyalog kutusu içerisinde gösteren bir araç. Kullanıcılar görsel arayüz elemanlarının üzerinden fare ile geçerek çeviriyi anında görebiliyorlar. Ürünün 1.0 versiyonu Visual Studio IDE'sinin çoğu görsel elemanını çeviriyor. Ürün hakkında daha fazla bilgiyi buradan alabilirsiniz. 

CLIP aracının Türkçesini aşağıdaki adresten indirip kurabilirsiniz. Araç kurulduktan sonra Windows'un Sistem Çubuğu'nda (System Tray) yer alacak ve araçla ilgili seçeneklere buradaki ikondan ulaşabileceksiniz.

http://www.microsoft.com/downloads/details.aspx?FamilyID=4e5258d2-52f4-46b8-8b74-da2dbec7c2f7&displaylang=tr

Perşembe, Kasım 06, 2008

Windows Azure SDK

Windows Azure ‘nin SDK ve Tools aşağıdaki linklerden erişebilir ve yeni teknolojileri kullanarak uygulama geliştirebilirsiniz.

Windows® Azure™ Software Development Kit (October 2008 CTP)

Windows Azure Tools for Microsoft Visual Studio October 2008 CTP

Enterprise Library 4.1

Yazılım geliştiricilere yardımcı olmak için geliştirilmiş kütüphanelerden Enterprise Library'nin 4.1  versiyonu yayınladı. Aşağıdaki linki kullanarak enterprise library'yi indirebilirsiniz.

http://www.microsoft.com/downloads/details.aspx?FamilyId=1643758B-2986-47F7-B529-3E41584B6CE5&displaylang=en

Visual Studio 2010 Download

Download link: Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 Community Technology Preview (CTP) –> 7286.0 MB

System Requirements
  • Supported Operating Systems: Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP
  • Minimum 75 GB available HDD space
  • The host computer must have a minimum of 2 GB RAM, with 1 GB allocated to the host operating system and 1 GB allocated to the VPC.
  • We recommend that the host computer CPU be at least a Core Duo 2 GHz processor.
  • Service Pack 1 of Microsoft Virtual PC 2007 is required to access the VPC.

To upgrade Microsoft Virtual PC 2007 to Service Pack 1, download and install the update from: http://www.microsoft.com/downloads/details.aspx?FamilyID=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5&DisplayLang=en
If the host computer has more than 2 GB RAM, you can increase performance of your VPC by allocating more memory to the VPC. After that change to the VM settings, you will need to update the page file inside the guest OS to be 1.5 times the amount of RAM you’ve allocated.
Instructions

To install, follow these instructions in the exact order shown.

  1. Download and install Virtual PC 2007 and then upgrade to Virtual PC 2007 Service Pack 1.
  2. Click the Download buttons on this page to download all parts of the Visual Studio 2010 and .NET Framework 4.0 CTP. The first part is a self-extracting EXE and will prompt for the other parts.
  3. VisualStudio2010CTP_11PartsTotal.part01.exe extracts two files (VisualStudio2010CTP.vhd and VisualStudio2010CTP.vmc). You will need to read and accept the License Terms before extraction proceeds.
  4. Launch the Virtual PC Console.
  5. Click the New button to launch the “New Virtual Machine Wizard”.
  6. Navigate to the Options page and select "Add An existing Virtual Machine" radio button.
  7. Click the Browse button and navigate to the location you extracted the files to and select the VisualStudio2010CTP.vmc image.
  8. Select the “When I click Finish, Open Settings” checkbox and click Finish.
  9. On the left pane for the dialog "Settings for VisualStudio2010CTP", select Hard Disk 1. Then on the righ pane, select the button "Virtual hard disk file", and navigate to the location of VisualStudio2010CTP.vhd that you downloaded during Step 3 above. Click ok to close the dialog.
  10. Select the new image entry, VisualStudio2010CTP, and click Start.
  11. To logon to the machine, click on Action Menu (Shortcut: Right Alt+Del) on the VPC console and use the following credentials:
    To run the walkthroughs you must logon using the TFSSETUP account with password of 1Setuptfs.
    The following logon accounts and passwords have been preconfigured on the VPC:
    • Administrator: TFSSETUP, password: 1Setuptfs (use this account to explore the CTP)
    • Administrator: Administrator,password: P2ssw0rd
    • User: TFSREPORTS, password: 1Reports
    • User: TFSSERVICE, password: 1Service

Good coding.

Source: Microsoft :)

How to install Windows Live Writer on Windows Server 2008 Setup

I was not able to install Windows Live Writer 2008 on my server workstation, it would give the error:

Sorry, Windows Live programs cannot be installed on Windows Server, Windows XP Professional x64 Edition, or Windows operating systems earlier than Windows XP Service Pack 2.

BUT you CAN install the Technical Preview version on Windows Server 2008 !!!

Need a good book on Windows Server 2008, see Windows Server 2008 Unleashed

Salı, Ekim 14, 2008

eclipse4SL – Eclipse for SilverLight

An Open Source, feature-rich and professional RIA application development environment for Microsoft Silverlight in Eclipse. Detail for click

Pazartesi, Ekim 13, 2008

How to convert string to byte[]

Here is a litle function to convert string to byte array.

public static byte[] StringToByteArray(string inputString)
{
  System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding();
  return encoding.GetBytes(inputString);
}

Cuma, Eylül 19, 2008

When a method calls itself

This you can't do in RPG - have a method call itself. Sounds like something you would never use? Think again.

See this small console program that recurses through directories to get a list of folders and files. When the method finds a directory, it calls itself with the sub folder as a parameter whereupon the File part of the IF statement is executed.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Recurse(@"c:\temp");
}

public static void Recurse(string directory)
{
DirectoryInfo path = new DirectoryInfo(directory);
FileSystemInfo[] files = path.GetFileSystemInfos( );
foreach (FileSystemInfo file in files)
{
if (file is DirectoryInfo)
{
Console.WriteLine("Folder-> " + ((DirectoryInfo)file).FullName);


// Now the method calls itself passing in the subfolder name. When the method is called
all the files in the subfolder are listed
Recurse(((DirectoryInfo)file).FullName);
}
if (file is FileInfo)
{
Console.WriteLine("File-> " + ((FileInfo)file).FullName);
}

}



}

}
}

Read, write and delete files in windows

Sooner or later you'll need to access files from the Window's file system. You'll need to check if a file exists, delete it, move it , you'll need to read and write to it and upload data from it to an iSeries table etc.

To illustrate how easy this is, I've included a full C# project.

This program cleans up a desktop. It moves unwanted items automatically to a 'clean up' folder automatically. Items you don't want to remove are maintained in a text file manually. This file is in 'CleanUp' on your desktop after you run it the first time.
Set it up to run in 'scheduled tasks' to run daily. My desktop gets absolutely splattered with downloads, images, files etc. etc. Now it gets cleaned automatically and the stuff I want to keep is always there. Files are moved but not folders.

The app demonstrates two things.

  1. How to access the windows file system
  2. How to write a RPG-like app in C#. i.e. in a procedural way There is a 'main', an init etc. There are no class objects created, everything runs from the class. Methods are just like subroutines. Variables are defined that are needed throughout the application as public at the top of the class. (If you define a variable in a method - it is only available within that method.)
using System;
using System.Collections.Generic;

using System.Text;
using System.IO;

using System.Security.Principal;


//Lists each object on the desktop
//Checks if the object is in the list.
//If not, moves it to cleanup.

namespace ClearDesktop
{
class Program
{

// Declare class level variables that are accessible from all methods
public static string cleanUpFolder = @"Cleanup\";
public static string desktopPathAllUsers = @"C:\Documents and Settings\All Users\Desktop\";
public static string desktopPath = "";
public static string cleanUpPath = "";
public static string cleanUpFile = "";
public static string allowedOnDesktop = "";



// Main Routine
static void Main(string[] args)
{
initializationRoutine(); // Set paths needed

RemoveFilesFromDesktop(desktopPath); // remove unwanted files
RemoveFilesFromDesktop(desktopPathAllUsers); // some file paths are in 'all users'
// Console.ReadLine();
}




public static void RemoveFilesFromDesktop(string dir)
{
// First create directory object from the desktop path
DirectoryInfo mainDir = new DirectoryInfo(dir);


// This single line fills an array called 'items' of everything on the desktop

// The items in the array are not strings but FileSystemInfo objects.


// What's cool here is each item has a ton of methods and properties


// available directly from it.



            FileSystemInfo[] items = mainDir.GetFileSystemInfos();



// Now go through each item in the array and check if it is allowed
foreach (FileSystemInfo item in items)
{
// Check if the file on the desktop is in the 'allowed' file
bool allowedyn = allowedOnDesktop.Contains(item.Name.ToString());

if (item is FileInfo && !allowedyn)
{
// If it is to be moved any existing same name file has to be deleted
String alreadyExists = cleanUpPath + item;

if (File.Exists(alreadyExists))
{
try
{
// Delete the file with the same name
File.Delete(alreadyExists);
}
catch (Exception)
{


}

}

// Move the file on the desktop to the clean up folder
((FileInfo)item).MoveTo(cleanUpPath + item);

}

}
}




// Get a list of all the files allowed on the desktop
public static string WhatsAllowedOnTheDesktop(string logFileName)
{

string contents = "";

using (FileStream fileStream = new FileStream(logFileName,
FileMode.Open,
FileAccess.Read,
FileShare.None))
{
using (StreamReader Reader = new StreamReader(fileStream))
{
contents = Reader.ReadToEnd(); // Reads the entire file in one statement
Reader.Close();
fileStream.Close();
}


}
return contents;
}

// Write to the 'Allowed files' directory those files you don't want to move
public static void WriteToLog(string logFileName, string data)
{
using (FileStream fileStream = new FileStream(logFileName,
FileMode.Append,
FileAccess.Write,
FileShare.None))
{
using (StreamWriter streamWriter = new StreamWriter(fileStream))
{
streamWriter.WriteLine(data);
}
}
}

// Do basic setup - path names etc.
public static void initializationRoutine() {
string username = getUserName();

desktopPath = @"C:\Documents and Settings\" + username + @"\Desktop\";
cleanUpPath = desktopPath + cleanUpFolder;
cleanUpFile = cleanUpPath + @"CleanUpFile.txt";

// If the cleanup directory does not exist, create it
if (!Directory.Exists(cleanUpPath))
{
Directory.CreateDirectory(cleanUpPath);
}

// Create the log file of items you want to keep on the desktop

if (!File.Exists(cleanUpFile))
{
File.Create(cleanUpFile);
}

allowedOnDesktop = WhatsAllowedOnTheDesktop(cleanUpFile);
}

// Get the log on name of the user who started the app in order
// to know the path of their desktop
public static string getUserName()
{
WindowsIdentity ident = WindowsIdentity.GetCurrent();

string userid = ident.Name;
string username = "";
int pos = userid.IndexOf("\\");
if (pos > -1)
{

username = userid.Substring(pos + 1);
}
else
{
username = userid;
}


return username;

}

}



}

Converting RPG code to C# automatically?

What if you could take your RPG programs and hey presto! have them converted into .NET and instantly sell your product to the rest of the world. This would be a boon to AS/400 vendors locked into the small(ish) AS/400 market. The advantage is that the original product is likely a mature business proven system which can provide a critical edge against the deluge of competition once in the new windows space. While webfacing does provide a web front end to applications and is great for hosted models it does not help customers who are windows only and want windows only software.
Granted companies need to migrate on the competition level . However, all the supposed advantages such as performance, cost savings, availability of talent etc sounds hollow to long time AS/400 owners. Anecdotally we know that the uptime for the AS/400 is absolutely stunning compared to windows. It's super stable and extremely reliable. At windows only shops instead of maintaining one iSeries server and a handful of windows server you end up maintaining 20-30 windows servers for a small organization. But like I said, it's about getting your product out to a bigger market.
A big issue with migration products is that often your migrated solution will not be able to operate without them. Yikes!

I'll be doing a review of these migration products once I get my hands on them but in the meantime here's an overview. Click the title to go to the product website.

TranSoft ML-Impact
Well, the boys and girls at TranSoft claim that they can convert your old F-specs, c-specs to .NET . I would love to see the code generated (post a sample in comments pleez). They claim that CL and RPG will be converted to C#. Not only that they can take the DB2 tables and migrate them to SQL server. Not everything can be converted directly of course and the end result looks much like a 5250 application.
Without having the product available to me I can't give it the thumbs up or down but if you have any experience with this tool, please drop a comment.

ADC Austin
Remember Synon? The hot product of 20 years ago is now trying to be cool. They have jiggered a way to migrate from CA2E (Synon) to Plex which uses .NET. Sounds complicated. If you've tried it, drop me a line.

ASNA Monarch and AVR for .NET
ASNA monarch is a code converter that creates RPG for .NET while AVR is a Visual Studio add-in that allows RPG for .NET (an ASNA creation) development and compiles as a .net app. Seems like these two products have the same product base. The only feedback I've seen on this product is that there is no code completion, no automatic layout and ctl-z doesn't work. Your comments pls.

Lansa Ramp and the rest
There are a bunch of other sticky migration tools out there that are designed to keep you using their applications. While the products above are somewhat sticky you can still migrate off them. Products like the Lansa Ramp platform is a staged migration solution that requires you to develop a an application framework using their tools, prototype it, then recreate your screens in that framework. However the end product is a Lansa architecture that you have to stick with for the rest of eternity.

Typing the RenderView method in ASP.Net MVC

Since the first minutes I started playing around with the MVC framework something has bothered me about the use of magic strings in regards to the RendorView methods.

With the current implementation of RendorView there is NO compile time type checking to ensure that view even exists (evil magic strings). Also, there is no way to find all usages of a view without doing a 'global find' on the project.

If you can strongly type the view to be used you will benefit from compile time type checking, you can use ReSharpers 'Find Usages' and it is just less evil.

Here are 2 ways to do this:

1 - Generics
public virtual void RenderView<T>( object viewData )
{
RenderView(typeof(T).Name, string.Empty, viewData);
}

2 - Type provided
public virtual void RenderView(Type viewType, object viewData)
{
RenderView(viewType.Name, string.Empty, viewData);
}
Here are a few examples of code calling the new RendorView methods

1 - Generics

RenderView<SportsListing>(sports);

2 - Type provided

RenderView(typeof(SportsEdit), new SportsEditViewModel(sports));
Now if I change the name of my views, I will get a compile time error letting me know ALL the places the view was being used.

This is a GOOD thing.

Salı, Eylül 02, 2008

SQL Server 2008

Şuanda üzerinde çalışmakta olduğumuz proje sebebiyle SQL Server 2008 Enterprise sürümü veritabanı işlemlerini gerçekleştireceğiz. Bu kapsamla bu uygulamayı kurmam gerekti. Bir önceki sürümüne oranla kurulumu daha basit ve anlaşılır. Ayrıca da bellek/performans faktörlerini düşünürsek bir önceki sürümüne göre çok daha optime ve hızlı olduğunu görebiliriz. İlerleyen zamanlarda sql server 2008 ile ilgili yenilikleri(benim gözüme çarpan) sizlerle paylaşmaya çalışacağım. Alt tarafta sizler için SQL Server 'in olmazsa olmazlarından Management Studio 'unun başlangıç ekranını sunuyorum.

sql server 2008enterprise

Umarım kullanım olanağınız olur...

Pazar, Ağustos 31, 2008

Microsoft'tan çevre dostu uygulama

Microsoft, Windows Vista ve Windows XP kullanıcılarının masaüstü enerji yönetimlerini geliştirerek daha fazla enerji tasarrufu yapmalarını sağlayan bir uygulama başlattı.

Microsoft’tan yapılan yazılı açıklamada, ücretsiz olarak indirilebilen Verdiem’s Edison uygulamasının, işletim sisteminin mevcut güç ayarlarını daha fazla enerji tasarrufu yapabilecek şekilde geliştirdiği, tüketici dostu, kullanması ve yönetmesi kolay bir kullanıcı arayüzü sağladığı kaydedildi.

Açıklamada, bilgisayarın enerji tüketiminin çok daha etkin olarak denetlenmesine imkan vererek karbon salınımını azaltan Verdiem’s Edison’un, Microsoft ile çevreye duyarlı teknoloji ve süreçler konusunda farkındalığı artıran uluslararası organizasyon Climate Savers (İklim Kurtarıcılar) tarafından desteklendiği ifade edildi.

Söz konusu uygulamanın, http://www.microsoft.com/environment/campaign_edison.aspx adresinden ücretsiz olarak indirilebileceği bildirildi.

Cumartesi, Ağustos 30, 2008

Teşekkürler Google...

Herkese merhabalar,

Google America bana çok büyük bir kıyak yapmış. Arama esnasında kelimeleri yazarken alt tarafta çıkan önerme sözcüklerinde birden kendimi buluverdim. Sonrasında ise merak ettim ki diğer Türk yazılımcılara ve paylaşımcı insanlara ilişkin ad ve soyadları girdiğimde çıkmadığını gördüm ki şaşırmadım desem yalan olmaz:) Sonrasında ise Google America bana çok bir destek sağlamış diye düşündüm. Bu güzel olaydan sonra iki yıl sonraki yurtdışı çalışma maceramı planlarken neden seçeneklerin arasına google 'da düşünmüyorsun diye bir de soru takıldı. Microsoft ve Apple 'dan sonra Google 'ı da çalışmak isteyeceğim şirketler arasında yer alacak.

Google 'in bu güzel iyiliğini aşağıdaki resimde sizlerle sunuyorum. Sizinde böyle güzel sonuçlarınız olması dileğiyle...

google

Pazar, Ağustos 24, 2008

Windows Vista - ip ucu

Sizlere Windows Vista ile ilgili bir ip ucu paylaşacağım. İp ucu sayesinden dosya taşıma ve açma işlemlerinden sağlanacak kolaylık çok daha fazla olacaktır. İşletim sistemini kullanırken karmaşık dosyaları seçerken en sık kullandığımız yöntem ctrl tuşuna basılı iken istediğimiz dosyaları seçer ve yapacağımız işlemleri yapmaya çalışırdık. Fakat bu işlem esnasında ctrl tuşuna basan parmağımız ağrır ve kaldırıp tekrar koyduğumuzda seçtiklerimizin hepsinin silinebilmesi ile de karşılabiliriz. Bu sorundan ötürü Windows Vista yı geliştirenler çok güzel bir özellik düşünmüşler ve bu dosya seçim işleminde Checkbox kontrolü ekleyerek yapacağımız işlemleri sadece fare ile yapılmasına indirgemişlerdir. Bu özelliği nasıl açacağız diyorsanız aşağıdaki adımları takip edip daha sonrasında sizlede bu kolaylıktan yararlanabilirsiniz.

Bilgisayarınızda herhangi bir dosya açtıktan sonra klasör özelliklerine girerek resimde ki gibi checked özelliğini aktif duruma getiriniz.

folderOptions

Daha sonrasında ise yaptığınız işlemi onayladığınızda aşağıdaki gibi bir dosya gösterimi ile karşılaşırız ve istediklerimizi seçerek işlemlerimizi yapabilme olanağı kılarız.

folderCheckboxView

Bu güzel özelliği kullanarak kendinize kolaylık sağlamanız dileğiyle...

Not: Windows Vista 'nın Checked özelliği hakkında beni bilgilendiren stajerim (gördüğüm en azimli insan) Sermin Yağcı 'ya teşekkür ederim...

Cumartesi, Ağustos 09, 2008

Windows 7 - Video

Windows 7 'nin ne olduğu ne olacağı ile ilgili çok sayıda mail aldım. Bu sebepten ötürüde sizlere Windows 7 ile ilgili Microsoft tarafından yayınlanmış olan videoyu paylaşmak istedim.

Dokunmatik dünyaya çok az kaldı. Hazırlanın...


Windows 7: Arka plan slayt gösterisi sunacak

Vienna

Microsoft'un bir sonraki işletim sistemi Windows 7 duvar kâğıtlarını slayt gösterisi şeklinde göstermeyi destekleyecek. Kaynak ise Windows tema-dosyalarını oluşturmak için kullanılan resmi bir Microsoft yardım-dokümanı.

Aslında güncel Windows sistemleriiçin hazırlanmış makalenin bazı yerlerinde Windows 7'ye atıf yapılıyor. Windows 7 kullanıcıları arka plan resmi için tek bir konum seçmek yerine tam bir klasörü veyadaha fazlasını noktalı virgülle ayırarak resim konumu olarak gösterebilecekler.

Microsoft şu sıralar, bahsi geçen yardım dokümanda Windows 7 ile ilgili pasajları kaldırdı. Google tarafından önbelleğe alınan sürümise halen kullanıma hazır. Bu özelliği şimdi kullanmak isteyen XP ve Vista kullanıcıları ücretsiz Johns Background Switcher yazılımını kullanabilirler.

Download: Johns Background Switcher

Microsoft: SQL Server 2008 kullanıma hazır

20080808122146Microsoft, SQL Server 2008'i yayımladı. Veri yönetimi platformuşubat ayında duyurulmuştu fakat şimdi ilk kez MSDN aboneleri için indirilmeye sunuldu. Microsoft her şeyden önce raporlama ve analiz fonksiyonları üzerinde geliştirmeler yaptı.

SQL Server 2008 büyük tablolar ve Data-Warehouse ortamlarındayüksek bir sorgulama hızı sunacak. Ayrıca Microsoft ilke temelli yönetim, veri denetleme ve standart olarak atfedilmiş uygulamalar için yeni uzamsal veri tipleri gibi yeni fonksiyonlar ekledi.


Geliştiriciler SQL Server'ı Enterprise, Standart, Workgroup, Web ve Developer isminde farklı sürümlerde sunacaklar. Bahsi geçen sürümlerin dışında bu ayın sonunda www.microsoft.com/sqlserver adresinde Express ve Compact adında iki ücretsiz sürüm daha indirilmeye sunulacak.

Sharepoint için Silverlight --> Blueprint

Çalıştığım şirketteki pozisyonum gereği belli bir süredir Sharepoint, WSS, MOSS gibi teknloljileri inceliyorum ve uygulama geliştiriyorum. Bu araştırmalarım esnasında Silverlight ile Sharepoint 'in entegreli olarak çalışabildiğine ve buna da Blueprint dendiğini gördüm.
Silverlight uygulamalarını sharepoint üzerinde çalıştırmak istediğimizde bizden hangi versiyon ile çalışmak istediğimiz hangi kod dosyası ile geliştirme yapmak istediğimiz gibi işlemleri yapmamızı istemektedir.
Kullanmak isteyenler ilk olarak bir Virtual PC indirmelidir. Daha sonra Microsoft tarafında 30 günlük deneme sürümü olarak hazırlanan ve içerisinde MOSS ve WSS kurulu olan Windows Server 2003 'ü indirmeleri gerekmektedir. Daha sonrasında ise yapacağınız uygulamalar geliştirmek olacaktır.
İyi çalışmalar...
Not: Blueprint ile ilgili daha ayrıntılı bilgi için İngilizce olarak yazılmış olan yazıda yer alan linklerden yararlanabilirsiniz...

Silverlight Blueprint for Sharepoint

Did you ever want to integrated Silverlight with SharePoint? Check out the brand new Silverlight Blueprint for SharePoint site:http://www.ssblueprints.net/sharepoint/ !

At U2U we've created the six samples of the Blueprint that illustrate the integration options. You can read more details on Patrick's blog and Karine's blog (she posted some screenshots). The Blueprint will also be announced by Bill Gates during the SharePoint Conference keynote later today, the SharePoint team blogged

Pazar, Ağustos 03, 2008

Microsoft 600 Dolarlık programı hediye ediyor

trueSpace

Microsoft şu andan itibaren kapsamlı 3D-modelleme yazılımı "trueSpace"i ücretsiz olarak indirmeye sunuyor. Google'ın SketchUp yazılımına benzer olarak trueSpace ile istenilen nesnelerin 3D-modellerioluşturulabiliyor.
trueSpace öncelikle profesyonel tasarımcılara hitap ediyor, zira fonksiyonlar standardın fazlasıyla üstünde ve kullanım zor. Program ile içinden geçilebilir, hatta iç döşemeye sahip modeller bile oluşturabilirsiniz.
Microsoft tarafından satın alındığından bu yana Caligari, trueSpace'i ücretsiz olarak indirmeye sunuyor. Program sanal yerküre özelliği sunuyor ki, bu sayede 3D-evinizi harita hizmeti ile birleştirebiliyorsunuz.
CHIP Online Yorumu:
Önceden 600 Dolara satılan yazılım Microsoft sayesinde ücretsiz ve sınırlandırma olmaksızın sunuluyor. Böylece yüksek fonksiyonelliğe sahip 3D-modelleri cebinizden para çıkmadan hazırlayabilirsiniz.
Download: trueSpace
Not: Download linkine tıladıktan sonra çıkan sayfada "Sign Up Now" butonuna basın ve siteye kaydolun. İndirme linki e-mail adresinize gönderilecektir.

Kaynak:Chip TR

Cumartesi, Ağustos 02, 2008

Adam Fawer - Empati ==> Kitap Yorum

empati

Duygusal sınırlarda bir yolculuk: Empati
“Yaşamınızın kontrolü sizde değil.
Öyle olduğunu düşünebilirsiniz, ama yanılıyorsunuz.
Elbette ki kendi kararlarınızı kendiniz vermekte özgürsünüz.
Bu kitabı kapatabilirsiniz.
O sandalyede oturmaya devam edebilirsiniz.
Ya da gözlerinizi oymak gibi çılgınca bir şey yapablirsiniz.
Ne isterseniz yapabilirsiniz.
Ama sorun şurada: Ne isteyeceğinizi kontrol edemezsiniz.
Kitabevine girdiğimde yeni çıkanlar bölümüne göz atarken karşılaştım bu kitapla. Olasılıksız adlı büyük yankı uyandıran kitabın yazarı Adam Fawer’ın 2. kitabı Empati. Olasılıksız’dan sonra Adam Fawer’ın yazma yeteneğine hayran olmuştum zaten. Kitabın arka kapağına baktığımda bu sözler karşıladı beni ve karmaşık düşünceler denizinde sürüklenmeye başladım. Kitabı edinip okuduğumda ise şunu gördüm ki Empati hem içerdiği heyecanla hem de yazarın zaman zaman başvurduğu geriye dönüşlerle okuyucuyu her daim tetikte tutabilen, okuyucunun ilgisini dağılmadan muhafaza edebilen bir kitap. Yazar kitap sayfaları arasında okuyucuyla bir kedinin fare ile oynaması gibi oynuyor. İşin güzel tarafı ise bu oyun sırasında okuyucu kendini bir dedektif gibi hissediyor ve en önemli ipucunun kitabın sonunda elde ediyor.
Konusunu kısaca anlatmak gerekirse kitapta beyin yapısında farklılıklar olan birkaç çocuğun devletin gizli amaçları uğruna empati yeteneklerinin sömürülmesi işleniyor. Daha sonra bu çocuklar içinde bulundukları durumdan kurtarılıp yeteneklerini kullanmalarını engelleyecek bir işlene tabi tutuluyorlar. Kitap da bu yeteneklerine yeniden kabuşmalarını anlatarak başlıyor.
Genel olarak dini sömürüden güç hırsına, cinsel tercihlerden insan ilişkilerine kadar pek çok konuda bir şeyler söyleyen bu kitaba kitaplığınızda bir yer açmanızı tavsiye ederim. Felsefeyi, bilimi, gizemi yaşamak için güzel bir yol, kaçırmayın derim…

Olasılıksız kitabının yorumu için bu linki kullanabilirsiniz...

Links to LINQ

I was looking for a LINQ provider for LDAP this morning and ran across Charlie Calvert’s blog that had a great list of Hyperlinks to other LINQ Providers. I will list them below, to save you one click, but you should look at Charlie’s blog, it’s pretty good (I have subscribed to his feed).


Here’s the list:

Index

Core Microsoft LINQ Sites

Official Microsoft Flavors of LINQ

LINQ Providers

LINQ and Other Languages

Blogs and More LINQ Links

Third Party LINQ Books and Documents

Salı, Temmuz 29, 2008

Oracle 10g Kurulum Hatası - ORA-12560

Çözümü gayet basit.

Denetim Masasından bölgesel dil ayarlarının tamamını ingilizce(ABD) yapmanız ve bilgisayarı yeniden başlatmanız gerekiyor. Kuruluma bu şekilde devam edip, kurulum bittikten sonra bilgisayarınızın dil ayarını tekrar Türkçe yapabilirsiniz.

Pazar, Temmuz 27, 2008

WPF Designer: Changes and Fixes in VS2008 SP1 Beta

Here's the definitive list:

List of changes and fixed issues for Visual Studio 2008 Service Pack 1 Beta for Windows Presentation Foundation Designer

New features

  • The Properties window now contains the Events tab. The Events tab lets you create events, assign events, and review events.
  • The Properties window now includes a category sort option and an alphabetical sort option to allow for faster property location.
  • Code changes have been made to the XAML Refactor/Rename definition and to the Go to definition. These changes allow XAML rename operations to occur automatically. Additionally, you can navigate the XAML definition by pressing F12.
  • You can now drag controls or create controls from the toolbox in XAML view or in Design view. You can do this even if you use a split view configuration.
  • Snaplines are now implemented for control margins. This lets the designer control a fixed distance from other controls, from container edges, or from gridlines.
  • Tab controls now support TabItem activation and TabItem design. To do this, click the tab that you want to design.
  • The Expander control now expands conditionally based on what is selected. You can design the contents of the Expander control at design time with affecting the IsExpanded attribute of the runtime.
  • Many stability improvements have been added to Visual Studio 2008 SP1. These include improvements to document loading in the designer and to error reporting. Because of these improvements, you will be able to load more documents in the designer.

Microsoft Student Partners Programı Başvuruları

2008-2009 döneminde görev alacak MSP lerin belirlenmesi için başvurular başladı.

MSP ne yapar?

Microsoft'un akademik dünyaya yönelik yürüttüğü çalışmaların öğrencilere akatarılabilmesine katkıda bulunmak; MSP olarak kendisine yöneltilen yazılı ve sözlü soruları, gerekiyorsa araştırma yaparak, doğru ve etkin şekilde yanıtlamak; Microsoft teknolojilerinin ve akademik programların bilinirliğinin artmasına yönelik seminer, eğitim, çalıştay vb. etkinlikler düzenleyerek öğrencilerin aktif katılımının sağlanması için gerekli alt çalışmaları planlamak, organize etmek ve gerçekleştirmek; bölüm derslerinde Microsoft ve akademisyenlerle ilgili olası işbirliği çalışmalarına yardımcı/yönlendirici olmak; öğrenci kulüpleriyle iletişim halinde olarak çift taraflı koordinasyona katkıda bulunmak;www.msakademik.net Akademik Yazılım Geliştiriciler topluluk sitesine makale, içerik sağlamak ve/veya sağlayabilecek kişileri belirleyerek gerekli yönlendirmeyi yapmak; katıldığı etkinliklerde video röportajlar vs hazırlayıp, işleyebilmek ve paylaşabilmek; kişisel websitesi/blog tutarak bilgi paylaşımına aktif katkı sağlamak; bu ve benzeri çalışmalar için belirli bir zamanını gönüllü olarak ayırmak.

MSPlerin çalışmaları yukardakilerle sınırlı olmayıp, programın içerik ve gereklerine yönelik kişisel ve takım olarak yaratıcı çalışmalara da yer verilebilmesine olanak verilmektedir.

MSPlere neler sağlanmaktadır?

Programa seçilen öğrencilere, programda kendilerini geliştirebilmeleri ve bu deneyimlerini akademik topluluklarda paylaşabilmeleri için birçok destek sağlanmaktadır. Ayrıca, bu öğrencilerin yeni teknolojileri öğrenerek paylaşabilmelerine olanak sağlamak içim teknik eğitim ve toplantılara katılımları teşvik edilmektedir.

  • MSP programına başlangıç seti
  • Programa katılım belgesi
  • MSDN üyeliği
  • MSP kartvizit kullanım hakkı
  • Microsoft teknolojileriyle ilgili gelişmeleri yakın takip için yazılım
  • Microsoft Student Partners topluluk portaline erişim
  • Bilgisayar teknolojileri ile ilgili bölümlerden mezun olacak program üyesi öğrencilere, Microsoft Corp. (Redmond, ABD) bünyesinde açık olan teknik pozisyonlar için telefonla iş görüşmesi fırsatı
  • Türkiye MSP Toplantısı
  • Microsoft Türkiye etkinliklerinden, duyurulardan öncelikli haberdar olma
  • Teknik yeterliliğin geliştirilebilmesi için Microsoft Türkiye etkinliklerine davet
  • Microsoft çalışanları ile tanışma, tecrübelerinden yararlanabilme fırsatı
  • Microsoft Press yayınlarından yararlanabilme
  • Microsoft MVPleriyle tanışma ve yakın çalışma fırsatı (Mentorship)
  • Ünvanın gerektirdiği teknik ve/veya soft skill eğitimlerine katılım olanağı

Bu geniş fırsatların sunulduğu programa katılmak için başvuru formunu doldurabilirsiniz : http://www.msakademik.net/msp_basvuru_formu2008.aspx

Perşembe, Temmuz 24, 2008

Feature.xml Dosyası

Sharepoint Services 3.0 ile WWF entagrasyonu ile çalışmak isteyenlerin ilk karşısına çıkan kod bloğudur feature.xml. Bo kod dosyasının içeriğini aşağıda veriyorum. Değişiklik yapılmış olan kısmına da koyu tarafta görebilirsiniz.

<Feature
Id="11111111-1111-1111-1111-11111111111"
Title="Location Services"
Description="This Feature contains lists and parts that let you link location data to your customer lists."
Scope="Web">
<ActivationDependencies>
<ActivationDependency
FeatureId="11111111-1111-1111-1111-111111111111" />
</ActivationDependencies>
<ElementManifests>
<ElementManifest
Location="Location\LocationPart.xml"/>
<ElementManifest
Location="CustomerLocation\CustomerLocationList.xml"/>
<ElementFile
Location="test.aspx"/>
</ElementManifests>
<Properties>
<Property
Key="Color"
Value="Blue"/>
<Property
Key="Shape"
Value="Triangle"/>
</Properties> </Feature>

Pazar, Temmuz 20, 2008

Encarta Botmetro

Microsoft 'un bootlarından biri de Encarta 'dır. Encarta çok geniş içerikli bir sözlük olarak karşımıza çıkıyor ve bir çok dilde kullanımı mümkündür. Sorularınızı genel olarak ingilizce yöneltiyorsunuz. Fakat Türkçe 'sinin geliştirildiği söyleniyordu. Bende denemek için biraz önce encarta ya sorular soruyordum. Türkçe konuştukça birden "Türkçe seviyorum." diye yanıt verdi. Doğal olarak bende şaşırdım ve bu durumu sizlerle paylaşayım dedim. Doğruyu söylemek gerekirse Encarta 'nın yalaka olmadığını içimden geçirmedim desem yalan olurdu.:)

İşin şakası bir yana dünya ve diğer bir çok konu ile ilgili kafanıza takılan sorular için encartaya danışabilirsiniz. Messenger listenize aşağıdaki resimde gördüğünüz adresi ekleyerek Encarta 'ya soru sormaya başlayabilirsiniz...

Untitled

Silverlight 2.0 - DeepZoom Teknolojisi

Windows Presentation Foundation ile yapılmış ilk örnekleri incelerken kütüphaneler için yapılmış uygulamalar ve kullanılan teknikler bizleri oldukça şaşırtmıştı. Kütüphanelerde yer alan kitaplar çok yüksek çözünürlüklerle tarandıktan sonra kitap haline getirilerek kullanıma sunuluyordu. Fakat ufak bir detay dikkatimizi çekmekteydi. Bu da gözükecek olan resimlerin tamamı net değildi. Yalnızca yakınlaştırılan nokta netleşiyor, diğer noktalar ise bulanık kalmaya devam ediyordu. Bu yöntem sayesinde o çok büyük boyutlu resmin tamamının gösterilmesi için gerekli zaman beklenilmesi yerine kullanıcının istediği nokta netleştirilerek daha hızlı işlem yapılması sağlanmaktaydı.

Zaman ilerledikçe bu tür uygulamaları Silverlight ile de yapıldığını gördük. Fakat 1.x sürümü ile yapılan uygulamalarda çok uzun satırlarca JavaScript kodu yazılması gerektiği için geliştiricilerin tercih sıralamasında geride kalıyordu. Silverlight ‘ın 2.0 sürümüne ilişkin çalışmalarda bu güzel özelliğin kullanıcılar ve geliştiriciler tarafında çok beğenildiğinin fakat geliştirme kısmına gelindiğinde zorluklarından ötürü kaçınıldığının farkına varılmıştır. Bu düşünce sonucunda ise ek yazılımlar yardımı ile geliştiricilere yardım edilmesine olanak tanınmak istenmiştir.

Bu yazımızda Silverlight 2.0 ile gelen yeni özelliklerden birisi olan DeepZoom ‘u inceliyor olacağız. DeepZoom teknolojisi internet üzerinde gösterilmesi zor olabilecek çok büyük çözünürlükteki resimleri alıp o anda ekranda görebileceğiniz kadarını netleştirerek gösteriyor, teknik olarak bunu da resimleri parçalara ayırarak ve farklı çözünürlüklerde kaydederek yapıyor, böylelikle bir son kullanıcı rahatlıkla 2-3 GB’lık resimleri bile tek bir ekranda görüntüleyebiliyor. Özellikle HD Fotoğraflar ile birlikte bu teknolojinin daha fazla artacaktır.

DeepZoom fikrinin ortaya atılmasını sağlayan proje SeaDragon projesidir. Bu proje esnasında kullanılan tekniklerin tamamına yakını DeepZoom uygulamasında da kullanılmaktadır. Peki, DeepZoom ‘u nasıl elde edebiliriz. Microsoft ‘un web sayfası yardımı ile
bu linkten
indirilmesi mümkündür. 4.4 mb ‘lik bir kurulum dosyası indikten sonra bilgisayarımıza kurulum yapıyoruz. Kurulumdan sonraki ilk ekranda karşımıza aşağıdaki gibi bir ekran gelmektedir.



Kullanım ekranı Expression Blend ‘e oldukça fazla benzemektedir. Uygulamamızı oluşturmaya yeni bir proje oluştur seçeneğine tıkladıktan sonra karşımıza çıkacak olan ekrana tamam diyerek başlıyoruz.

Uygulamamızı nasıl oluşturacağımıza değinmeden önce DeepZoom ‘un kullandığı mantığı birde görüntüsel olarak incelersek daha mantıklı olacaktır. DeepZoom büyük bir resmin küçük bir parçasını net olarak kullanıcıya sunarken diğer kısımları sistemi yavaşlatmamak için net olarak göstermemektedir.


Resimden de dikkat edeceğiniz üzere büyük boyutlu bir tamamı ama daha küçük bir biçimde gösterilmektedir. Kullanıcı resmi kendisine yaklaştırdıkça odak noktası dışındaki noktalarda netleşerek büyük boyuttaki resmin netliğine kavuşacaktır.

DeepZoom ‘un çalışma mantığı ile ilgili bu ufak bilgiyi de edindikten sonra uygulama geliştirmeye devam edebiliriz. Şimdi yapmamız gereken yakınlaştırıp uzaklaştıracak olduğumuz resimleri uygulamamıza eklemek olacaktır.



Resimleri çalışmamıza ekledikten sonraki görüntü aşağıdaki gibi olacaktır.



Şimdi yapacağımız işlem ise arka plan olarak bir resmi seçtikten sonra onun üzerine diğer resimleri eklemek olacaktır. Bu işlem için Compose menüsünün kullanılması gerekmektedir.



Ekranımızda Layer View yazan bölümde ekranda yer alan resimlerimizin görünüp görünmemesini gibi özelliklerini ayarlayabiliyoruz.

Bunda sonra yapacağımız işlem ise uygulamanın yayınlanabilir duruma getirilmesi olacaktır. Export menüsüne tıkladıktan sonra karşımıza çıkan ekranda gerekli olan özellikler yer almaktadır.



Export butonuna tıkladığımız zaman ise uygulamamız hazır duruma gelmiş olacaktır. Uygulamayı kullanabileceğimiz seçenekler yayınlama işleminin hemen sonrasında bizlere sunulmaktadır.



Web uygulaması ile göster dediğimizde ise karşımıza oldukça iyi bir uygulama çıkacaktır.












Eğer ki Flash animasyon tamamlanmışsa üzerinde sağa tıkladıktan sonra play seçeneğini seçtiğiniz zaman yeniden görüntüleyebilmeniz mümkündür.

Uygulamamızın çalışması tam istediğimiz gibi görünüyor. Ama kafamıza takılan birkaç soru var. “Uygulamanın çalışmasını sağlayan dosyanın içerisinde neler var?” , ”Hangi kodlar arka planda oluşmuş?” Bu soruların cevapları için ilk olarak uygulanın oluşturulduğu klasöre gitmemiz gerekmektedir. DeepZoom uygulamalarını
C:\Users\Turhal\Documents\Expression\Deep Zoom Composer Projects yolundaki klâsöre oluşturmaktadır. Biz uygulamamızı bulabilmek için bu dizin içerisinden kendi projemizi bularak sonrasında
source images isimli klasörün içerisine bakarak oluşturulan proje dosyalarını ve resimleri bulabilmemiz mümkündür.



Eğer ki uygulamamızın kod tarafında bir değişiklik yapmak istersek DeepZoomProject klasörünü kullanabilir. Web tarafında kullanmamız gereken dosyalar için ise
DeepZoomProjectWeb klasörü isteklerimizi karşılamaya yetecektir.

Kod tarafında nelerin oluşturulduğuna göz atalım şimdide. İlk olarak projemizde resimleri görüntüleyebildiğimiz
Page.XAML dosyasının içerisindeki kodlara göz atıyoruz.

Açtığımız anda dikkatimizi çeken şey Silverlight 2.0 ile gelen MultiScaleImage nesnesinin kullanıldığına ve çağırılan resimlerin bu nesne ile oluşturulan alanın içerisinde gözükmesi sağlandığını görürüz.


Uygulamamızda gösterilen ekranın kod tarafında oluşturulan C# kodlarına göz atarsak…

C#


using System;
using System.Collections.Generic;
using
System.Linq;
using System.Net;
using System.Windows;
using
System.Windows.Controls;
using System.Windows.Documents;
using
System.Windows.Input;
using System.Windows.Media;
using
System.Windows.Media.Animation;
using System.Windows.Shapes;


namespace DeepZoomProject
{
    public partial class Page : UserControl

   
{

        Point lastMousePos = new Point();

        double _zoom = 1;
        bool
mouseButtonPressed = false;
        bool mouseIsDragging = false;
        Point
dragOffset;
        Point currentPosition;

        public double ZoomFactor
        {

           
get { return _zoom; }
            set { _zoom = value; }
        }

        public Page()

       
{
            InitializeComponent();

            //
            // Blend yardımcı ile XAML
özellikler oluşturuluyor.
            //
            this.msi.Source = new
DeepZoomImageTileSource(new Uri("GeneratedImages/dzc_output.xml", UriKind.Relative));


            //
            // MultiScaleImage yükleniyor
            //
            this.msi.Loaded += new
RoutedEventHandler(msi_Loaded);

            //
            // MultiScaleImage yüklendikten
sonra diğer bütün resimler yüklenmeye başlıyor
            //
            this.msi.ImageOpenSucceeded
+= new RoutedEventHandler(msi_ImageOpenSucceeded);

            //
            // Klavyeden
basılan tuşları algılıyor.
            //
            this.MouseMove += delegate(object sender,
MouseEventArgs e)
            {
                if (mouseButtonPressed)
                {
                    mouseIsDragging =
true;
                }
                this.lastMousePos = e.GetPosition(this.msi);
            };

            this.MouseLeftButtonDown
+= delegate(object sender, MouseButtonEventArgs e)
            {

               
mouseButtonPressed = true;
                mouseIsDragging = false;
                dragOffset = e.GetPosition(this);

               
currentPosition = msi.ViewportOrigin;
            };

            this.msi.MouseLeave +=
delegate(object sender, MouseEventArgs e)
            {
                mouseIsDragging = false;

           
};

            this.MouseLeftButtonUp += delegate(object sender,
MouseButtonEventArgs e)
            {
                mouseButtonPressed = false;
                if (mouseIsDragging
== false)
                {
                    bool shiftDown = (Keyboard.Modifiers & ModifierKeys.Shift)
== ModifierKeys.Shift;

                    ZoomFactor = 2.0;
                    if (shiftDown) ZoomFactor
= 0.5;
                    Zoom(ZoomFactor, this.lastMousePos);
                }
                mouseIsDragging =
false;
            };

            this.MouseMove += delegate(object sender, MouseEventArgs
e)
            {
                if (mouseIsDragging)
                {
                    Point newOrigin = new Point();

                   
newOrigin.X = currentPosition.X - (((e.GetPosition(msi).X - dragOffset.X) /
msi.ActualWidth) * msi.ViewportWidth);
                    newOrigin.Y = currentPosition.Y -
(((e.GetPosition(msi).Y - dragOffset.Y) / msi.ActualHeight) * msi.ViewportWidth);

                   
msi.ViewportOrigin = newOrigin;
                }
            };

            new MouseWheelHelper(this).Moved
+= delegate(object sender, MouseWheelEventArgs e)
            {
                e.Handled = true;

               
if (e.Delta > 0)
                    ZoomFactor = 1.2;
                else
                    ZoomFactor = .80;


                   
Zoom(ZoomFactor, this.lastMousePos);
            };
        }

        void msi_ImageOpenSucceeded(object
sender, RoutedEventArgs e)
        {
        }

        void msi_Loaded(object sender,
RoutedEventArgs e)
        {
            Zoom(.5, new Point(this.ActualWidth / 2, this.ActualHeight
/ 2));
        }

        public void Zoom(double zoom, Point pointToZoom)
        {

           
Point logicalPoint = this.msi.ElementToLogicalPoint(pointToZoom);
            this.msi.ZoomAboutLogicalPoint(zoom,
logicalPoint.X, logicalPoint.Y);
        }


    }
}



Şeklinde oluşturulduğunu görürüz. Yukarıdaki kod bloğunda bizleri dikkatini çeken bölüm farenin hareketi sonucunda görüntünün nasıl hareket ettiği bloktur
C#



this.MouseMove += delegate(object sender, MouseEventArgs e)
{
   
if (mouseIsDragging)
        {
           
Point newOrigin = new Point();
           
newOrigin.X = currentPosition.X - (((e.GetPosition(msi).X - dragOffset.X) /
msi.ActualWidth) * msi.ViewportWidth);
           
newOrigin.Y = currentPosition.Y - (((e.GetPosition(msi).Y - dragOffset.Y) /
msi.ActualHeight) * msi.ViewportWidth);
           
msi.ViewportOrigin = newOrigin;
       
}
};


Yukarıdaki kod bloğunda ekran üzerindeki son pozisyonu alındıktan sonra fare ile sürüklenen, yakınlaştırılan değerleri alınarak yeni değerlere atanıyor. Sonrasında ise ekran üzerindeki yeni yeri belirlenebiliyor.

Projemizde oluşturulan kod bloklarından biride Farenin sürükleme topu ile yapılmış işlemlerin nasıl algılanacağına ait sınıftır.

C#


using System;
using System.Net;
using System.Windows;

using System.Windows.Controls;
using System.Windows.Documents;
using
System.Windows.Ink;
using System.Windows.Input;
using
System.Windows.Media;
using System.Windows.Media.Animation;
using
System.Windows.Shapes;
using System.Windows.Browser;

namespace
DeepZoomProject
{
    // Courtesy of Pete Blois
    public class
MouseWheelEventArgs : EventArgs
    {
        private double delta;
        private
bool handled = false;

        public MouseWheelEventArgs(double delta)
        {

           
this.delta = delta;
        }

        public double Delta
        {
            get { return
this.delta; }
        }

        // Use handled to prevent the default browser
behavior!
        public bool Handled
        {
            get { return this.handled; }
            set
{ this.handled = value; }
        }
    }

    public class MouseWheelHelper

   
{

        public event EventHandler<MouseWheelEventArgs> Moved;
        private
static Worker worker;
        private bool isMouseOver = false;

        public
MouseWheelHelper(FrameworkElement element)
        {

            if (MouseWheelHelper.worker
== null)
            MouseWheelHelper.worker = new Worker();
            MouseWheelHelper.worker.Moved
+= this.HandleMouseWheel;
            element.MouseEnter += this.HandleMouseEnter;

           
element.MouseLeave += this.HandleMouseLeave;
            element.MouseMove += this.HandleMouseMove;

       
}

        private void HandleMouseWheel(object sender, MouseWheelEventArgs
args)
        {
            if (this.isMouseOver)
            this.Moved(this, args);
        }


       
private void HandleMouseEnter(object sender, EventArgs e)
        {
            this.isMouseOver
= true;
        }

        private void HandleMouseLeave(object sender, EventArgs
e)
        {
            this.isMouseOver = false;
        }

        private void
HandleMouseMove(object sender, EventArgs e)
        {
            this.isMouseOver = true;

       
}

        private class Worker
        {
            public event EventHandler<MouseWheelEventArgs>
Moved;
           

            public Worker()
            {

                if (HtmlPage.IsEnabled)
                {

                   
HtmlPage.Window.AttachEvent("DOMMouseScroll", this.HandleMouseWheel);

                   
HtmlPage.Window.AttachEvent("onmousewheel", this.HandleMouseWheel);

                   
HtmlPage.Document.AttachEvent("onmousewheel", this.HandleMouseWheel);
                }


            }

            private void HandleMouseWheel(object sender, HtmlEventArgs args)

           
{
                double delta = 0;

                ScriptObject eventObj = args.EventObject;


                if (eventObj.GetProperty("wheelDelta") != null)
                {
                    delta = ((double)eventObj.GetProperty("wheelDelta"))
/ 120;

                    if (HtmlPage.Window.GetProperty("opera") != null)
                    delta
= -delta;
                }
                else if (eventObj.GetProperty("detail") != null)
                {

                   
delta = -((double)eventObj.GetProperty("detail")) / 3;

                    if (HtmlPage.BrowserInformation.UserAgent.IndexOf("Macintosh")
!= -1)
                    delta = delta * 3;
                }

                if (delta != 0 && this.Moved !=
null)
                {
                    MouseWheelEventArgs wheelArgs = new MouseWheelEventArgs(delta);

                   
this.Moved(this, wheelArgs);

                    if (wheelArgs.Handled)
                    args.PreventDefault();

               
}
            }
        }
    }
}

Bu sınıfta ise farenin kaydırma topu ile yapılan hareketleri algılayarak uygulamamıza ait sınıfın içerisinde oluşturulan yakınlaştırma ve uzaklaştırma ile ilgili kod bloğunda kullanılmaktadır.

Sonuç olarak Silverlight 2.0 ‘ın yeni özelliklerinden olan DeepZoom ‘u incelemeye çalıştık. Çok büyük boyutlardaki resimleri web uygulamalarında tamamını göstermek yerine yaklaştırdıkça belirli alanlarını göstererek performansı nasıl arttırabileceğimize değinmeye çalıştık.

Bir sonraki Silverlight makalemizde ise MultiScaleImage kontrolü otomatik olarak değilde kendimiz kullanarak uygulama geliştirmek istersek nasıl yapabileceğimize değinmeye çalışacağız.

Umarım yararlı olmuştur.
turhal.temizer@csharpnedir.com

Cumartesi, Temmuz 19, 2008

Silverlight 2.0 - Kontrollerin Özelleştirilmesi, VSM ve Yenilikleri

Microsoft, Silverlight ‘ı gün geçtikçe benzersiz bir yapı haline dönüştürüyor. Günler geçtikçe kontroller, aspx desteği derken Asp.Net ‘te pek alışık olmadığımız bir durum olan kontrollerin özelleştirmesi özelliği Beta2 sürümü ile eklenmiş olduğunu gözlemleyebiliyoruz. Peki, Silverlight bugüne gelene kadar ne tür gelişmeler gösterdi.

Alpha1 sürümünde JavaScript ve HTML ile interaktif web uygulamaları geliştirebiliyorduk.
Alpha2 sürümü ile yukarıdakilere ek olarak XAML ‘de eklendi.
Beta1 sürümünde WPF ‘te kullanılan kütüphane kısmen geçirilmeye başlandı.
Silverlight 1.0 sürümünde yukarıda bahsettiğimiz deneme işlemleri uygulanabilir düzeye getirildi.
Silverlight 1.1 sürümünde buton gibi temel kontroller Silverlight bünyesine eklendi.
Silverlight 2.0 Beta1 ile web servis işlemlerinden veri bağlamaya kadar bir çok özellik eklendi fakat en çok dikkat çekeni kullanılabilir Silverlight kontrolü sayısı arttırıldı.
Silverlight 2.0 Beta2 sürümü ile ise Beta1 sürümünden eklenen bir çok özellik geliştirildi. Asya dilleri eklendi. En çok göze çarpan özelliği ise Expression Blend ürünü ile Silverlight kontrollerinin düzenlenebilmesi olmuştur.

Silverlight ‘ın günümüze kadar geçirmiş olduğu gelişim temel olarak bu şekildedir. Tabii saydığımız özelliklere ek olarak video streaming özelliği en popüler olanıdır. Videoların gösterilme süreleri o kadar iyileşti ki web üzerinden canlı yayınlar yapılabildi ve HD videoların fragmanları sorunsuz bir biçimde kullanıcılara izletilebildi.

Eski sürümlerde neler yapabildiğimiz ile ilgili ayrıntılı bilgilere ulaşmak isterseniz daha önceden yayınlanmış olan makaleleri okumanızı öneririz.

Silverlight 2 Beta2 ile uygulama geliştirebilmeniz için http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=silverlight%202%20beta2&DisplayLang=en adresinden gerekli bileşenleri bilgisayarınıza indirdikten sonra kurarak kullanmaya başlayabilirsiniz. Ayrıca yazımızda kontrollerin özelleştirilmesi işlemleri Expression Blend 2.5 June Preview ile yapacağız. Bu programı kullanabilmeniz için gerekli link ise http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=expression%20blend%202.5%20june%20preview&DisplayLang=en adresinden yararlanabilirsiniz. Gerekli programları edindiğimize göre artık yazımızın içeriğini incelemeye başlayabiliriz.

KULLANICI KONTROLLERİ
Silverlight ilk sürümlerinde WPF ‘e yetişmesi uzun yıllar alacağı konusunda söylentiler varken şu anda WPF ‘te bile olmayan kontrolleri bünyesinde barındırmaktadır. Özellikle DataGrid kontrolü WPF ‘te olmadığı halde Silverlight 2.0 Beta2 ‘de yerini almıştır.



Bu ve diğer kontrollere ek olarak TabPanel kontrolü de Beta2 sürümü ile bizlerin kullanımına sunulmuştur. Şu an itibari ile Silverlight2 Beta2 sürümünde 30 ‘ün üzerinde kontrol bulunmaktadır. Geliştiricileri tarafından yapılan açıklamada ise 2.0 sürümü tamamlandığı zaman 100 ‘ün üzerinde kontrolün bizlere sunulacağı belirtilmiştir.

Kontrollerin Özelleştirilmesi
WPF ve Silverlight ile son kullanıcılar için hazırlanmış olan kontroller Expression Blend yardımı ile özelleştirilebilmektedir. Özelleştirdiğimiz kontrolleri daha sonrasında geliştirmiş olduğumuz uygulamada XAML kod tarafına ekleyerek kullanılabilir düzeye getirilebilmesi mümkündür.

Şimdi Expression Blend yardımı ile kontrolleri nasıl özelleştirebileceğimize göz atalım. Bu işlemi yaparken ilk olarak slider kontrolünden yararlanacağız.

İlk olarak Expression Blend 2.5 June Preview ’den Silverlight 2 projesi oluşturuyoruz. Sonrasında ise uygulama ekranımıza bir tane slider kontrolü ekleyerek işlemlerimize başlıyoruz.



Slider kontrollerini ekledikten sonra şimdi düzenleme işlemini gözlemleyeceğiz. İlk olarak yapmamız gereken kontrolün üzerinde fare ile sağa tıkladıktan sonra çıkan menüden Edit Control Part ‘ı seçeceğiz. Sonrasında çıkan seçenekten Edit a Copy seçeneğine tıklayarak işlemimizi yapmaya devam edeceğiz.



Bu seçeneği seçtiğimizde karşımıza aşağıdaki gibi ekran gelecektir.



Karşımıza çıkan ekranda Name(Key) yazan bölüme istediğimiz ismi verdikten sonra tamam diyerek slider kontrolünü özelleştirebilmemiz mümkündür. Bu verdiğimiz isim app.xaml ‘in içerisinde tutulur ve daha sonradan yapacak olduğumuz işlemleri bu isim altında tutar ve kullanacağımız zaman arka planda bu name ‘i kullanacaktır.

Kontrolü özelleştirebilmemiz için sol tarafta yer alan menüde Template yazan bölümden yararlanacağız. Bu tasarı bölümü bizlere hazırlanan kontrolün hangi nesnelerin toplanması sonucunda oluşturulduğunu göstermektedir. Tasarı bölümünde yer alan ilk dörtgen bölümünde çizginin kalınlığı uzunluğu ve kaydırma butonunun yapısı ile ilgili özellikler tutulmaktadır. Diğerinden ise dikey özellikler yer almaktadır.



Temel olarak bir değişiklik yapmak gerekirse HorizontalThumb ‘ı seçerek uygulamamın çalışma ekranında kaydırma çubuğunun kalınlığını değiştiriyoruz. Sonucunda ise ekranımızda oluşan görüntü aşağıdaki gibi olur.



Gördüğünüz gibi oldukça kolay bir biçimde kontrolleri özelleştirebilmemiz mümkündür. Bu yaptığımız işlemleri uygulayarak diğer bütün kontrolleri de özelleştirebilmemiz mümkündür.

Visual State Manager (VSM) Yapısı
Silverlight ve WPF ‘te hazırlamış olduğumuz kontrollere standart kontrollerden farklı olması için özel işlemler uygulamak isteriz. Örneğin, fare ile kontrolün üzerinde gelindiğinde tıklandığında gibi işlemler sonucunda farklılıkların olmasını isteyebiliriz. Gerçekleştirebilmek için ise yapmamız gereken XAML kod tarafında oldukça fazla kod oluşturan animasyon işlemlerini kullanırız. Arka planda oluşturulan fazla satır kodlar ise kontrol kullanılacağı sırada çağırılacağı için web uygulamalarında yani Silverlight uygulamalarında yavaş çalışmasına sebep olabilir. Web uygulamalarında yaşanabilecek sorunları engellemek için farklı bir çözüm üretilmesi gerekiyordu ve bunun için Visual State Manager (VSM) hazırlanılmış ve biz geliştiricilere sunulmuştur.

VSM, standart olarak hazırlanmış olan kontrolleri özelleştirme işlemimiz ile birlikte fare ile ilgili standart özellikleri de yapılandırabilmemize olanak tanımaktadır. Bizlere kazandırdığı en büyük avantaj ise daha önceden hazırlanmış olan bir animasyon işleminin yeniden düzenlenebilmesi oldukça uğraştırırken VSM kullanarak hazırlanmış olanlar dinamik olarak düzenlenebilmesi mümkündür.

Şimdi VSM ‘i örnek üzerinden incelemeye çalışalım.

Expression Blend ile Silverlight 2 uygulaması açtıktan sonra çalışma ekranımıza bir adet buton sürükleyip bırakıyoruz.



Eklemiş olduğumuz butonun üzerine sağ tıklama yaparak karşımıza çıkan menüden Edit Control Part ‘ı seçiyoruz. Karşımıza çıkan menüden Edit a Copy ‘ı seçerek işlemimizi yapmaya devam ediyoruz.



Edit a Copy seçeneğini tıkladığımız zaman bize aşağıdaki gibi bir ekran çıkmaktadır.



Kontrollerin özelleştirilmesi konusunda da değindiğimiz gibi vermiş olduğumuz name app.xaml içerisinde tutulacak ve kontrol üzerinde yapacak olduğumuz işlemlerin kullanılması için gerekli olan name çağırılması işleminin yapılmasını sağlıyoruz.

Bu işlem sonrasında asıl konumuz olan VSM için gerekli olan state menüsü sol bölümde karşımıza gelmektedir.



State bölümünde Base seçili iken buton kontrolümüzün arka plan ve kenar renklerini değiştireceğiz. Bunun için Template bölümünde Background ve BackgroundGradient özelliklerini değiştireceğiz.



Yaptığımız değişiklik sonucunda butonumuz aşağıdaki gibi olmuştur.



Fare üzerinde gibi özellikleri değiştirmek istediğimizde ise State bölümünde MouseOver seçeneğine ait özelliği değiştirdiğinizde işlemimizi gerçekleştirmiş oluruz.



Temel olarak VSM tasarımcılar ile web geliştiriciler arasındaki uyumu arttıracak ve hazırlanan tasarımların tam anlamında kullanılabilmesine olanak tanıyacak bir özelliktir.

Textbox
Textbox kontrolünde ve genel olarak yazı yazılabilecek bütün kontroller için IME3 adı verilen Asya ve diğer farklı yazım türü olan karakterler eklenmiştir.



Animasyon ve Grafik Sistemi
Silverlight ile hazırlanmış olan animasyon uygulamaları web tarayıcılarda gösterildiğinde çalıştırılan bilgisayarın grafik sisteminde zorlamaya sebep olmaktaydı. Bunun sebebi ise Silverlight, WPF tabanlı olduğu için animasyon uygulamaları çalıştırırken grafik kartının sürücüsünü kullanmak istemektedir. Fakat bu bir web uygulaması için performans yavaşlatıcı bir durumdur. Grafik kartını zorlama oranı beta2 sürümü ile iyileştirilmiş. Tam sürümünde ise zorlama oranının en minimum düzeye getirileceği Silverlight geliştiricileri tarafından açıklanmıştır.

WPF ile uyumu
Silverlight ‘ın gelişimi WPF ‘e oranla daha hızlı olduğu için şu anda aralarında ki uyum azalmış giib gözüküyor. .Net Fw 3.5 Sp1 çıktıktan sonra ise Silverlight ‘ta yapılan değişikler WPF ile uyumlu hala getirilerek XAML kod tarafında yazılan uygulamaların iki platformda da belirli oranda çalışması sağlanacak.

Web Servis
Silverlight ‘ta daha önce SOAP ile web servisi kullanılması mümkündü. Fakat Beta2 sürümü ile WCF servislerinin kullanımı mümkün hal almıştır.

Veri (DATA)

Data Grid
Beta2 sürümünde eklenen bu kontrol de sayfanın boyutuna göre otomatik şekillendirilme, sütunlarda yer alan sonuçların sıralanabilmesi gibi özellikler mümkün kılınmıştır.

NOT: WPF ‘te şu an itibari ile DataGrid kontrolü bulunmamaktadır. .Net Framework 3.5 Sp1 ile ekleneceği düşünülmektedir.

Data Binding
Hataların, zengin içerikli yazıların bağlanabilmesi gibi özellikleri bünyesinde barındırmaktadır.

Silverlight ‘ın gelişimi

Silverlight gün geçtikçe yalnızca animasyon yapabildiğimiz ve video yayınlayabildiğimiz bir yapı olmaktan çıkarak son kullanıcılar için oldukça zevkli uygulamalar geliştirilebilecek, Asp.Net ‘te yapabileceğimiz bir çok işlemi yapabileceğimiz bir yapı olma yolunda ilerlemektedir. Silverlight 2.0 sürümü tamamlandığı zaman web uygulamalarında birçok yazılımcı Asp.Net yerine Silverlight ‘ı deneyecektir. Çünkü kullanıcılara sunduğu zevk ve kolaylık Asp.Net ‘e göre daha fazla olacaktır.

Sonuç olarak yazımızda nelere değindiğimizi hatırlamak gerekirse, Silverlight ‘ın bugüne kadar geçirdiği değişime değindikten sonra kontrollerin özelleştirilmesine, VSM ‘e , Silverlight 2.0 Beta2 ‘de genel özellikler yönünde ne tür değişiklikler yapıldığını ve son olarak da Silverlight ‘ın geleceğe dair gelişiminde ne tür gelişmeler yaşanabileceğine değinmeye çalıştık.

Umarım yararlı olmuştur.

Turhal TEMİZER

Kaynaklar
Silverlight.Net

Doğum Günüm...

19 Temmuz tarihinde 21 yaşıma basmış oluyorum. Doğum günümü kutlayan herkese sonsuz teşekkürlerimi sunuyorum. Bir yaş daha yaşlandım. :)

Cuma, Temmuz 18, 2008

Yeni işim...

Merhabalar,

İki hafta önce yazdığım son yazımda size yeni işimi ve ünvanımı söyleyeceğimi belirtmiştim. Yaklaşık 20 şirketin iş teklifleri sonucunda Filika Bilişim Hizmetlerinde Yazılım Mühendisi olarak Pazartesi günü işime başlıyorum. Daha önceden görev aldığım ve bana iş teklifinde bulunan bütün şirketlere teşekkürlerimi sunar, yeni arkadaşlar ile uyum içerisinde çalışabilmelerini dilerim.

Yeniçalışacağım şirket ile ilgili bilgilere www.filika.com adresinden ulaşabilirsiniz.

XML (Extensible Mark-up Language)

XML’e Giriş

XML (Extensible Markup Language), W3C (Worl Wide Web Consortium) tarafından geliştirilen bir kaynak hazırlama standartıdır.
XML aslında SGML (Standart Generalized Markup Language) adlı daha geniş ve kapsamlı bir standardın alt kümesi sayılabilir. 1980’den beri var olan SGML çok kapsamlı ve karmaşık yapısıyla bazı zorluklar içeriyordu. XML bu karmaşayı mümkün olduğunca azaltmak ve uygulama kolaylığı sağlamak amacıyla geliştirildi.
XML bir dil olmaktan çok bir dil tanımlama aracıdır. Bu standartı kullanarak kendi dilinizi üretebilir, kendi kurallarınızı koyabilirsiniz.
HTML ile XML aynı şey değildir. HTML’in önceden belirlenmiş kuralları vardır ve HTML ile yazılan bir döküman bu kurallara uymak zorundadır. Mesela <BODY> ve <HEAD> gibi imler HTML’de önceden tanımlıdırlar; bunları değiştiremezsiniz. Fakat XML’de imleri siz tanımlarsınız. Bu sayede <BuyukBaslik>, <KucukBaslik>gibi imler tanımlamanız mümkün olabilir.
XML dokümanlarında elemanlar aşağıdaki gibi yazılırlar:

<Paragraf>
Bu ilk paragraf
</Paragraf>

Yukarıdaki eleman iki im’in arasına yazılmıştır. ˙Imler <ve > sembolleri arasında yazılırlar. Bir im’in etki alanını bitirmek, bir başka deyişle bir im’i kapatmak için / sembolü kullanılır.
Elemanlara bazı özellikler atanabilir.

<Para kur="dolar">34.25</Para>

Bu örnekte <Para>adlı imin kuradlı bir özelliği olduğu anlaşılıyor. XML’de boş elemanlar tanımlanabilir. Buna örnek vermek gerekirse;

<Resim kaynak="/home/user/resim.gif"></Resim>

veya

<Resim kaynak="/home/user/resim.gif"/>

XML’in bazı kurallarından bahsedelim:

· Elemanların özellikleri her zaman tırnak işaretleri içerisinde tanımlanmak zorundadır.

        <Yazi tip="italik">Maslak</Yazi>

· Boş elemanlar hariç bütün elemanlar açma ve kapama imleri arasına yazılmak zorundadır. Bu kurala göre aşağıdaki satırlar XML kurallarına uygun değildir.

·         <Paragraf>Ilk paragraf
·         <Paragraf>Ikinci Paragraf
·         Doğrusu şöyle olmak zorundaydı
·         <Paragraf>Ilk paragraf</Paragraf>
·         <Paragraf>Ikinci Paragraf</Paragraf>

· Içiçe geçen imler doğru yapılmalıdır. Bu kurala göre aşağıdaki tanımlama yanlıştır.

·         <Kalin><italik>Bu satır yanlış</Kalin></italik>

Doğrusu şöyle olmalıydı

<Kalin><italik>Bu satır do¸gru</italik></Kalin>

Yukarıdaki 3 kural XML kullanıcılarının en yaygın olarak çiğnedikleri kurallardır.

Bunun kaynağı ise HTML kullanma alışkanlığıdır. Tarayıcı (Browser) üreticilerinin yazım hatalarını mümkün olduğunca tolere edebilme kaygısı yüzünden kurallara uygun olmayan HTML dökümanları sanaldoku üzerinde sorunsuz yayımlanabilmektedir. Ancak bu kaygı, beraberinde karmaşık yazılımları gerektirdiği için tarayıcıların dökümanları işleme hızlarında dikkate değer bir düşüş yaşanmaktadır.

Bir XML dökümanı sözkonusu olduğunda 3 önemli dosya gündeme gelir.

· XML kaynak dökümanı

· stylesheet’ denilen, dökümanın herhangi bir yayım aracında nasıl gör üneceğini belirleyen dosya .

· XML kaynağının kurallarının yazıldığı DTD adlı dosya. DTD (Document Type Definition) dosyası XML dosyası içinde kullandığınız imlerin tanımlarının yapıldığı dosyadır .

örnek

<?xml version="1.0" standalone="no"?>
<!DOCTYPE Dunya:Turkiye SYSTEM "sample.dtd">
<!-- XML dokumani burada basliyor -->
<Dunya:Turkiye xmlns:Dunya='http://www.Dunya.com/'>
<Dunya:Insanlar>Duygu Caglar</Dunya:Insanlar>
<Dunya:Yas>21</Dunya:Yas>
</Dunya:Turkiye>

Ilk satırda <?xml ve ?> arasında kalan kısım temel tanımların yapıldığı yerdir. versionXML dökümanının versiyonunu belirtir. standaloneseçeneği XML dökümanının dışarıdan verilecek bir DTD dosyasına ihtiyacının olup olmadığını belirler. standalone=”no” buyruğu dökümanın kendisini tanımlayabilmesi için bir DTD’ye ihtiyac duyduğunu söyler. Bu örnekte ihtiyaç duyulan dosyanın sample.dtdadlı dosya olduğu ayrıca belirtiliyor. Aslında DTD ve stylesheet dosyalarını XML dökümanının içine gömmek mümkündür. Ama genelde tercih edilen bir yöntem değildir .

<!DOCTYPE Dunya:Turkiye SYSTEM "sample.dtd">

satırı dökümanın kök elemanını ve kök elemanı içerisinde yazılacak bütüm imlerin tanımlarının yer aldığı DTD dosyasını belirler. Bizim örneğimizde dökümanın kök elemanı Dunya:Turkiye adlı elemandır. SYSTEM anahtar sözc üğü ise DTD dosyasının ayrı bir yerel dosya içerisinde bulunduğunu belirtir.

<!-- ve -->sembolleri içerisinde yer alan bütün cümleler yorum olarak algılanır ve XML yorumlayıcıları tarafından ihmal edilir. Son olarak Dunya:Turkiye,Dunya:Insanlarve Dunya:Yas imlerini kullandık. C¸ oğu XML imi gibi bunlar da kendilerini tanımlayan DTD'ler olmadan anlamsızlardır. Bu imler görüldüğü gibi iki parçadan oluşmaktadır.

Parçalar arasında : sembolü kullanılmış. Bunun sebebi im adlarını seçerken alanadı kullanmamızdır: sembolünün sol tarafı alanadı'nı, sağ tarafı ise imin kendisini ifade eder

Alanadı kullanımı XML dünyasında yeni kullanılmaya başlamıştır. Kabaca im tanımlarının karışmaması için tasarlanmıştır. Örnek vermek gerekirse; Dunya:Turkiye yerine Turkiye imini kullansaydık ve başka bir yayıncı da Turkiye imini kullansaydı, iki üreticinin ürettikleri dökümanları ortak olarak 6 kullanmaları mümkün olamazdı. Alanadları xmlnsanahtar sözcüğü ile belirtilir.

Eşsizlik sağlası amacıyla alanadları olarak genellikle sanaldoku yörelerinin adları kullanılır. Bizim verdiğimiz örnekte http://www.Dunya.com alanadı olarak kullanılmış. Alanadı olarak sanaldoku sayfalarını kullanmanın bir diğer faydası ise kullanılan XML dökümanı ile ilgili dosyaların herkes tarafından bilinen bir yere konulabilmesine imkan tanımasıdır. Buraya XML’i tanımlayan DTD dosyaları konulabileceği gibi, bazı stylesheet dosyalarıda konulabilir. Son olarak eklenmesi gereken bir nokta ise şudur; ilerleyen zamanlarda tarayıcıların XML programlarını istenilen ölçüde tanımaları durumunda ilgili dökümanlar on-line olarak işlenebilecektir. Tarayıcı bir XML dökümanı ile karşılaştığında onu tanımlayan DTD’yi ilgili yerden çekecek ve varsa stylesheet dosyasını kullanarak görüntüleyecektir.

DTD (Document TypeDefinition)

Bu bölümde DTD kavramını kabaca bir örnek üzerinden anlatmaya çalışaca ğız. Örnek DTD dosyası aşağıda verilmiştir.

<!-- Örnek bir DTD dosyası -->
<!ELEMENT Dunya:Turkiye (Dunya:Insanlar, Dunya:Yas)>
<!ELEMENT Dunya:Insanlar (#PCDATA)>
<!ELEMENT Dunya:Yas (#PCDATA)>

Bu DTD dosyasının amacı bir önceki bölümde yazdığımız XML kaynağını tanımlamaktır. <!ELEMENT buyruğu XML dökümanı içerisinde kullanılan büt ün imleri tanımlamak için kullanılır. Dunya:Insanlar ve Dunya:Yas imleri Dunya:Turkiye iminin içerisinde ve belirlenen sıra ile kullanılmak zorundadır .

Bu iki im’e Dunya:Turkiye iminin çocukları denir.

Dunya:Insanlar ve Dunya:Yas imlerinin tanımlarında ise #PCDATA sözcüğü kullanılmıştır (PCDATA=’Parsed Character Data’). Bunun anlamı Dunya:Insanlar ve Dunya:Yas imleri arasında < ve & hariç bütün karakter veya karakter kümesini kullanabilirsiniz. Mesela <Dunya:Insanlar>Dunya Turkiye</Dunya:Insanlar> satırı doğru bir XML satırıdır .

XSL (Extensible Stylesheet Language)

Yazdığımız DTD ile XML dökümanını tanımlamış olduk. Bu çerçeve içinde elimizdeki dökümana doğru tanımlanmıştır (valid) diyebiliriz. Ancak dök ümanın görüntülenişi hakkında hiçbirşey yapmadık. Bu iş için stylesheet kullanmamız gerekecek. Stylesheet olarak şu an yaygın olarak kullanılan CSS (Cascading Style Sheet) aracını kullanabilirsiniz. CSS daha çok HTML dökümanlarını biçimlendirmek için kullanılmakla birlikte XML’i de desteklemektedir.

Biçimlendirme için kullanılabilecek ikinci bir araç ise XSL (Extensible StyleSheet Language) adı verilen ve kendinize özgü stylesheet kodları oluşturabilmenize olanak sağlayan dildir. XML kullanmamızın sebebi yanlızca sanaldoku olmadığı için biz XSL kullanmayı tercih edeceğiz. Bu bölümde XSL kavramını kabaca bir örnek üzerinden anlatmaya çalışacağız. Örnek XSL dosyası aşağıda verilmiştir.

<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns:fo="http://www.w3.org/TR/WD-xsl/FO">
<xsl:template match="/">
<fo:block font-size="18pt">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
</xsl:stylesheet>

Bu örnekte dikkati çeken ilk şey bir XSL dosyasının aynı zamanda düzgün tanımlı bir XML dökümanı olmasıdır. XML dökümanını biçimlendirecek buyruklar <xsl:stylesheet> ve </xsl:stylesheet> imleri arasında yer alırlar. Genel olarak bakıldığında XML dökümanı içerisinde yer alan imlerin formatları <xsl:template> ve </xsl:template> imleri arasında tanımlanır.

<xsl:template match="/">

Yukarıdaki satır, / ile belirtilen im için bir şekil tanımlar. /sembolü kök elemana karşılık gelir. Bizim örneğimizde kök eleman Dunya:Turkiye idi. Bizim XSL örneğimize göre kök elemanı içerisindeki yazıların font büyüklükleri 18pt olmak zorunda.

Bu XSL dosyasını XSL yorumlayıcılarından birinden geçirirsek XML dosyasının görüntüsünü elde edebiliriz.

Bir XML dökümanının doğru olması için gereken şartlar:

· Bir XML dökümanı ya DTD kullanmalı ya da dökümanın başında <?xml version="1.0" standalone="no"?> deklerasyonu yer almalıdır.

· Elemanların bütün özellikleri çift tırnaklar içinde belirtilmelidir.

· Bütün elemanlar açma ve kapama imleri arasında yazılmalıdırlar.

· Boş bir im kullanılacaksa im’in bitiminden önce \ işareti kullanılmalıdır.

·         <Resim kaynak="duygu.jpg"/>

Bazı XML buyrukları

<?xml...?>
<?xml version="number"
[encoding="encoding"]
[standalone="yes[no]"] ?>

version XML dökümanının versiyonu gösterir ve kesinlikle yazılması gerekir. encoding Kullanılacak karakter kümesini belirtir US-ASCII, iso-8859-1 gibi. standalone Eğer ’no’ ise, dökümanı tanımlayan bir DTD belirtmek zorunludur. Bunun için <!DOCTYPE> buyruğu kullanılır.

<!DOCTYPE>
<!DOCTYPE root-element SYSTEM|PUBLIC
["name"] "URI_of_DTD">

Bu buyruk XML dökümanını tanımlayan DTD kaynağını belirtmek için kullanılır. İki şekilde kullanılılabilir.

<!DOCTYPE root-element SYSTEM "URI_of_DTD">
<!DOCTYPE root-element PUBLIC "name" "URI_of_DTD">

SYSTEM DTD dökümanının yerini belirtir.

<!DOCTYPE <Book>
SYSTEM "http://www.domain.com/dtd/mydoctype.dtd">

PUBLIC Eğer kullanılan DTD çok büyük bir yaygınlık kazandı ise özel bir isimlendirme şeması kullanılır. XML işlemcisi bu tanımı gördüğü zaman ilgili DTD kaynağını sistemde kayıtlı olduğu yerlerden bulmaya çalışacaktır. Eğer ilgili dosyayı bulamaz ise SYSTEM buyruğu ile tanımlanmış DTD’yi kullanacaktır.

<!DOCTYPE <Book> PUBLIC
"-//Dunya/DTD/EN"
"http://www.Dunya.com/dtd/xmlbk.dtd">
<![CDATA[...]]>

XML dilinde özel anlamları bulunan karakterleri özel anlamları haricinde kullanmaya yarar. ’...’ ile belirtilen yere yazılan herşey XML işlemcisi tarafından salt metin olarak algılanacaktır

<![CDATA[
Burada XML dilinde özel anlamları bulunan karakterleri
bir problem olmadan rahatça kullanabiliyorum. Meselâ
<?xml version="3.145678"?> yazmam bir hata mesajı
üretmeyecektir.
]]>
<!--....-->

XML dokümanı içerisine bazı açıklamalar veya yorumlar yazabilmemizi sağlar.

XML’e Has Özelikler

xml:lang
xml:lang="iso_639_identifier>

xml:lang özeliği bütün elemanlar için kullanılabilir. Elemanın hangi dilde yazıldığını belirtmek için kullanılır.

<Paragraf xml:lang="en">Hello</Paragraf>
<Paragraf xml:lang="fr">Bonjour</Paragraf>

xml:space

xml:space="default|preserve"

Elemanın içerisinde yer alan boşluk veya tab karakterlerinin dikkate alınıp alınmamsını belirler. Eğer ’preserve’ seçeneği kullanılırsa boş ve tab karakterleri dikkate alınacaktır.

xml:link
xml:link="link_türü

Elemanın bir link olduğunu belirtmek için kullanılır.

Özel Karakterler

XML’de özel manaları bulunan karakterleri ifade edebilmek için değişik bir metod kullanılır. XML’de yaygın olarak kullanılan 5 özel karakter şöyle gösterilir.

· & &

· < <

· > >

· " "

· ' '

Kolaylıkla görüleceği gibi özel karakterleri ifade etmek için & ve ; işaretleri beraber kullanılır.

DTD ˙Içinde Eleman Tanımları

XML dökümanı içerisinde kullandığınız elemanların tanımlarını DTD dosyaları içerisinde yapmak zorunluluğu vardır. Bunun için şu kalıp kullanılır.

<ELEMENT eleman_ismi kural>

Eleman isminin içerisinde < ve > karakterleri olmamalıdır. Eleman isimleri karakter veya _ sembolü ile başlamalıdır. Ayrıca eleman isimleri xml ile başlamamlıdır. Bu son kurala uyulmaması aslında ciddi bir probleme yol açmayabilir. Ancak xml sözcüğü ile başlayan ve XML yapısı içerisinde özel anlamları olan bir takım imler bulunmaktadır. Bu imlerde çakışma olasılığı bulunduğundan ötürü bu kısıtlamaya uyulması çok yerinde olacaktır.

111 ANY ve PCDATA 222 En basit eleman tanımı ANY buyruğu ile yapılır.

<!ELEMENTkutuphaneANY>

’ANY’ sözcüğü ile <kutuphane> ve </kutuphane> imleri arasında herhangi bir karakterin veya karakter katarının veya başka imlerin bulunabilmesi sağlanır. Eğer iki im arasında sadece özel bir takım karakterlerin tanımlanması isteniyorsa ’PCDATA’ anahtar sözcüğü kullanılır.

<!ELEMENTkutuphane(#PCDATA)>

Bu buyruk ile <kutuphane> ve </kutuphane> imleri arasında eleman isimleri hariç diğer karakterlerin yer alabileceği belirtilir. Bir örnek vermek gerekirse

<kutuphane>KTU Kütüphanesi</kutuphane>
<kutuphane></kutuphane>

kullanımları doğru olduğu halde

<kutuphane>
<universite>KTU</universite>
Kütüuphanesi
</kutuphane>

kullanımı yanlıştır.

Bununla beraber bir elemanın içerisinde başka elemanların bulunma zorunlulu ğu şu şekilde belirtilir.

<!ELEMENT Insan (Baslik>>
<!ELEMENT Baslik (#PCDATA>>
Yukarıdaki örnekte Insan imi içerisinde Baslik imi bulunmak zorundadır.
15
<!ELEMENT Insan (Baslik, Tarih)>
<!ELEMENT Baslik (#Baslik)>
<!ELEMENT Tarih (#Tarih)>

Yukarıdaki örnekte ’Insan’ im’i içerisinde ’Baslik’ ve ’Tarih’ imleri olmak zorundadır ve belirtilen sıraya uymak zorundadır.

<!ELEMENT Insan (Baslik|Tarih)>
<!ELEMENT Baslik (#Baslik)>
<!ELEMENT Tarih (#Tarih)>

Yukarıdaki örnekte ’Insan’ im’i içerisinde ’Baslik’ veya ’Tarih’ imlerinden birisi olmak zorundadır. Ancak ikisi birden bulunamaz.

Gruplama ve Yineleme

Imlerin XML dökümanı içerisinde yer alma sırasını belirlemek mümkündür.

<!ELEMENT Insanlar ((baslik, yazar)| aciklama)>
<!ELEMENT baslik (#PCDATA)>
<!ELEMENT yazar (#PCDATA)>
<!ELEMENT aciklama (#PCDATA)>

Yukarıdaki örnekte ’Insanlar’ im’i içerisinde ya ’aciklama’ im’i olmak zorundadır ya da ’baslik’ ve ’yazar’ im’i ardarda olmak zorundadır. Ayrıca bu imlerin kaçar defa yer alabileceğini belirleyebilirsiniz.

? Ya bir kere, ya hiç
+ En az bir kere
* Bir çok kere veya hiç
<!ELEMENT yazar (yazarismi+)>
<!ELEMENT yazarismi (#PCDATA)>

Yukarıdaki örnekte ’yazar’ im’i içerisinde ’yazarismi’ im’i ya bir kere yer alacaktır veya hiç kullanmayacaktır. Buna benzer fakat daha karmaşık tanımlamalar yapmak mümkündür .

Boş İmler

XML dökümanı içerisinde yer alan boş elemalar ayrıca tanımlanmak zorundadır.

<!ELEMENT elemanismi EMPTY>
Entities

<I>General Entities</I>

Bir karakter kümesi için makro tanımlamak için kullanılır.

<!ENTITY isim "karsilik">

<, >, &, 've " karakterleri i»cin gereken tanımlamalarıkendi DTD dökümanınız içerisinde yapmak zorunda değilsiniz. Bunlar XML işlemcisi tarafından önceden yapılmıştır. Copyright sembolu için bir makro tanımı aşağıdaki gibi yapılabilir. Bu sembolün Unicode karşılığı 169 (Hexadecimal 0xA9) ’dur.

<!ENTITY copyright "&#xA9;">

<I>Parameter Entities</I>

Bir önceki gibi makrolar tanımlamak için kullanılır ancak tanımlanan makrolar sadece DTD içinde kullanılmak içindir. Bu şekilde tanımlanan bütün makro isimlerinin başına % sembolü konulur. Bu sembol makronun sadece DTD içerisinde kullanılabileceğini gösterir.

<!ENTITY % isim "karsilik">

<I>External Entities</I>

Dısarıdan yapılan linkler için kullanılır.

<!ENTITY alinti SYSTEM
"http://www.Dunya.com/stocks/quoates.xml">

Eğer ‘alinti’ adli makro, XML dökümanı içerisinde kullanılacak olursa, işaret edilen URL’den yani http://www.Dunya.com/stocks/quoates.xml adresinden içerik alınacak ve XML dökümanı içerisine gömülecektir.

Örnekler

Örnek 1

<?xml version="1.0" standalone="yes"?>

<!DOCTYPE Insan SYSTEM "file:///bilisim/duygu/doc/xml/prog01.dtd">

<Insan>Beginning XML</Insan>

<!ELEMENT Insan (#PCDATA)>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<xsl:value-of select="."/>

</xsl:template>

</xsl:stylesheet>

Örnek 2

<?xml version="1.0" standalone="no"?>

<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog02.dtd">

<Insan> Insan

<Baslik>Duygu Caglar XML</Baslik>

</Insan>

<!ELEMENT Insan (Baslik)>

<!ELEMENT Baslik (#PCDATA)>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<xsl:value-of select="."/>

</xsl:template>

<xsl:template match="Baslik">

<xsl:value-of select="."/>

</xsl:template>

</xsl:stylesheet>

Örnek 3

<?xml version="1.0" standalone="no"?>

<!DOCTYPE Kisi SYSTEM "file:///bilisim/Duygu/doc/xml/prog03.dtd">

<Kisi> Duygu Caglar </Kisi>

<!ELEMENT Kisi (#PCDATA)>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<HTML>

<xsl:value-of select="."/>

</HTML>

</xsl:template>

</xsl:stylesheet>

Örnek 4

<?xml version="1.0" standalone="no"?>

<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog04.dtd">

<Insan>

<Baslik>System Duygu Caglar</Baslik>

</Insan>

<!ELEMENT Insan (Baslik, Konu)>

<!ELEMENT Baslik (#PCDATA)>

<!ELEMENT Konu (#PCDATA)>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<HTML>

<xsl:value-of select="."/>

</HTML>

</xsl:template>

</xsl:stylesheet>

Örnek 5

<?xml version="1.0" standalone="no"?>

<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog05.dtd">

<Insan>

<Baslik>Duygu Caglar</Baslik>

</Insan>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

20

<xsl:template match="/">

<HTML>

<xsl:apply-templates/>

</HTML>

</xsl:template>

<xsl:template match="Baslik">

<HEAD>

<xsl:value-of select="."/>

</HEAD>

</xsl:template>

</xsl:stylesheet>

Örnek 6

<?xml version="1.0" standalone="no"?>

<!DOCTYPE Insan SYSTEM "file:///bilisim/Duygu/doc/xml/prog06.dtd">

<Insan>

<Baslik>System Duygu Caglar</Baslik>

<Konu>System Yonetici Nitelikleri</Konu>

</Insan>

<!ELEMENT Insan (Baslik, Konu)>

<!ELEMENT Baslik (#PCDATA)>

<!ELEMENT Konu (#PCDATA)>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<HTML>

<xsl:apply-templates/>

</HTML>

</xsl:template>

21

<xsl:template match="Baslik">

<HEAD>

<xsl:value-of select="."/>

</HEAD>

</xsl:template>

<xsl:template match="Konu">

<P>

<xsl:value-of select="."/>

</P>

</xsl:template>

</xsl:stylesheet>