Thursday, February 02, 2012

Bu yazımızda SharePoint de kullanmamız için kendi özel alan tipimizi (custom field type) nasıl yaratacağımızı göreceğiz. Yine her zaman olduğu gibi örnek bir senaryo üzerinden, gerçek hayat örnekleriyle geliştirmemizi yapacağız.

Bir SPList üzerinde e-mail bilgisinin tutulması için özel bir alana ihtiyacımız olduğunu ve bu alanın mutlaka e-mail kriterlerine uyması gerektiğini daha önceden analist arkadaşlarımız bize bildirmişler ve bu konuda bizden birşeyler bekliyorlar.

İlk iş olarak Visual Studio 2010 ile boş bir (Blank Solution) SharePoint 2010 projesi açıyoruz. Daha sonra projemize, bu özel alanı tanımlayacağımız bir class ekliyoruz. Ben EmailField.cs dedim siz başka bir isim de verebilirsiniz. Bir class daha ekleyip bu sefer adına da EmailValidationRule.cs dedim, bu sınıf aracılığıyla da e-mail validasyonunu yapacağız.

EmailValidationRule.cs classımızın tek görevi validasyon, bu sınıfımızın görüntüsü şu şekilde oluyor :

Görüldüğü gibi, basit bir regex ile e-mail kontrolü yapılıyor. Sıra EmailField.cs ye geldi, bu class ımız da şu şekilde olacak :

Burada dikkat etmemiz gereken metod GetValidatedString metodu. Override ettiğimiz bu metod ile alanımızın gerçekten bir e-mail olup olmadığına bakıyoruz. Bu kontrolü de az önce yazdığımız EmailValidationRule.cs de bulunan kontrolle yapıyoruz. Eğer girilen değer geçerli bir e-mail adresi değilse, SPFieldValidationException fırlatarak son kullanıcıya bu hata hakkında bilgi veriyoruz. EmailField.cs de 2 adet constructor da kullandığımızı görmüşsünüzdür. Bu sınıf hakkında son olarak da default bir değer atayabilirdik, info@abc.com gibi, bunu da DefaultValue metodunu override ettiğimiz metotda return info@abc.com diyerek yapabilirdik. Ben yapmadım ama eğer size lazım olursa bu şekilde kullanabilirsiniz.

Projede yapmamız gereken son bir adım daha kaldı, o da projeye “mapped folder” eklemek. Bunun için projeye sağ tıklayıp Add -> SharePoint Mapped Folder diyoruz. Karşımıza çıkan ekrandan ise TEMPLATE altındaki XML i seçiyoruz.

Böylece projemize XML folderini maplemiş olduk. Şimdi de bu foldera yeni bir XML dosyası ekliyoruz.

Add -> New Item -> XML File, ben dosyanın adını fldtypes_customemail.xml dedim. Dosyanın adının fldtypes_ ile başlamasına dikkat edelim. XML dosyamızın içeriği de şu şekilde olacak :

Burada özel alan tipimiz hakkında bilgiler veriyoruz servera. Dikkat etmemiz gereken en önemli yer, FieldTypeClass kısmındaki verinin bizim projemizdeki doğru Namespace ve class ismini almış olması.

Artık herşey tamam, projemize sağ tıklayıp “Deploy” diyoruz ve SharePoint sitemizi açıp yeni bir custom list oluşturuyoruz (ya da var olan bir liste üzerinde de deneyebiliriz)

Listemizin ayarlar (settings) kısmından yeni bir kolon eklemeye çalışıyoruz,

Gördüğünüz gibi, az önce XML dosyasından “TypeShortDescription” kısmına yazdığımız değer burada yeni özel tipimizi gösteriyor. Yeni tipimizle yeni bir kolon ekleyip gerçekten de çalıştığını siz de görebilirsiniz.

Umarım işinize yarar bir yazı olmuştur.

Thursday, February 02, 2012 2:33:01 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Thursday, June 30, 2011

SharePoint i hayatımızı daha fazla kolaylaştırmak için kullanmaya bir örnek yapacağız. Senaryomuz ise çoğumuzun şirketlerde yaşadığı tatil organizasyonu hakkında. Yaz aylarının gelmesi ile personelimiz sırayla tatile gidecek ama kalabalık bir ekibin tatil organizasyonunu yapmak bazen sıkıntılı süreçlere sebep olabilir. Tam bu sırada devreye SharePoint Calendar (Takvim) giriyor. 10 kişilik bir IT ekibinizin tatil haftalarını kolayca SharePoint Calendar ile organize ederek hem işinizi kolaylaştırmış hem de bütün ekibin tek bir noktadan görebileceği bir alan yaratmış olacağız. Böylece yaşanabilecek olası organizasyonel sorunları da minimuma indirmiş olacağız. Kişilerin birbiri ile beraber çalıştığı projelerde hayati önem taşıyabilen durumlarda, kim, kimin ne zaman şirket dışında olduğunu görebilecek ve kendi proje planlarını bu takvime bakarak revize edebilecek. Zaten SharePoint in ana görevlerinden biri de bu ortak çalışmaları sağlıklı bir şekilde yönetebilmek(Collaboration).

Böyle kalabalık bir IT ekibinin proje yöneticisi olduğunuzu düşünün ve hemen SharePoint Team Site ımızı açalım. Burada hazır gelen Calendar ı da kullanabiliriz veya sadece tatil zamanlarını yönetmek için yeni bir calendar oluşturabiliriz. Ben yeni bir calendar oluşturuyorum ve bu calendara da “IT_Holiday” ismini veriyorum. (Sol menüden Lists e tıklayıp gelen sayfada Create -> List tabından Calendar seçiyoruz)

Calendar ımız hazır. Şimdi nasıl kullanacağımızı görelim.
Tatile gidecek ilk 3 kişi tatil planlarını şu tarihlerde yapmışlar :

  • Can : 4 Temmuz 2011 – 11 Temmuz 2011
  • Berk : 25 Temmuz 2011- 3 Ağustos 2011
  • Ayşe : 1 Ağustos 2011 – 15 Ağustos 2011

Daha önceden bu tarihleri ekibinizden almış olduğunuzu varsayıyoruz. Can ın tatil planını calendara girmek için 4 Temmuz 2011 tarihinin üzerine mouse u getirdiğimizde

“+Add” linkinin çıktığını göreceğiz. Bu linke tıklayınca açılan pop-up menüden Can ın tatil tarihlerini aşağıdaki gibi gireceğiz ve Save diyerek kaydedeceğiz.

Calendar ımızın Temmuz ayına gittiğimizde net bir şekilde Can ın olmadığı tarihleri herkes tek bir noktadan görebilecek.

Diğer ekip üyelerini de buradan girerek olayımızı tamamlayacağız. Gördüğünüz gibi birkaç adımda, karmaşalara neden olabilecek bir vakayı engellemiş olduk. Umarım işinize yarar bir makale olmuştur.

Thursday, June 30, 2011 7:52:31 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Friday, April 22, 2011

Bu makalede SharePoint in önemli parçalarından olan WebPart ların birbiri ile nasıl konuşabileceğine dair bir örnek geliştireceğiz.

Öncelikle örneğimizde kullanmak için bir custom SPList oluşturalım. Site Actions > More Options > List > Custom List. Custom Listemize ben “Dersler” dedim. Siz istediğiniz gibi isimlendirebilirsiniz. Bu listeye elemanlar ekleyeceğim.(Matematik, Fizik, Geometri, Kimya...)

Listemi oluşturduktan sonra Visual Studio 2010 da yeni bir Empty SharePoint projesi oluşturuyorum ve proje ismini de “ConnectedWP” olarak belirliyorum.

Projeme bir Interface ekliyorum. IDers.cs (Add > New Item, Visual C# altından Code sekmesinden Interface seçiyorum)

namespace ConnectedWP { public interface IDers { int Id { get; } string Name { get; } } }

Daha sonra projemize, Provider WebPart ımızı ekliyoruz. (Add > New Item > WebPart), ismini ProviderWebPart olarak belirliyorum.

public class ProviderWebPart : WebPart kısmını, yeni interface imi kullanacak şekilde değiştiriyorum, yani şöyle oluyor : public class ProviderWebPart : Microsoft.SharePoint.WebPartPages.WebPart, IDers

Daha sonra, sınıfımızın içerisini şu şekilde dolduruyoruz :
DropDownList _projectPicker = null; int IDers.Id { get { return int.Parse(_projectPicker.SelectedValue); } } string IDers.Name { get { return _projectPicker.SelectedItem.ToString(); } }

Ardından da CreateChildControls metodunun içini şu şekilde değiştiriyoruz.

base.CreateChildControls(); try { _projectPicker = new DropDownList(); using (SPSite spSite = new SPSite(SPContext.Current.Web.Url)) using (SPWeb spWeb = spSite.OpenWeb()) { SPList projectsList = spWeb.Lists["Dersler"]; foreach (SPListItem project in projectsList.Items) { _projectPicker.Items.Add(new ListItem(project.Name, project.ID.ToString())); } } _projectPicker.AutoPostBack = true; this.Controls.Add(_projectPicker); } catch (Exception ex) { this.Controls.Clear(); this.Controls.Add(new LiteralControl(ex.Message)); }

Son olarak da WebPartlarımız arası bağlantı noktasını oluşturacak kodumuzu ekliyoruz,
[ConnectionProvider("Ders Adi ve ID")] public IDers HerhangiBisey() { return this; }

Sıra şimdi Consumer WebPartımıza geldi, ilk WebPartımızı eklediğimiz gibi bunu da aynı şekilde ekliyor ve adını “ConsumerWebPart” koyuyorum. WebPart ın kod kısmına geçip class tanımının hemen altına şunları ekliyorum (Dikkat ederseniz burada, WebPartımızın türediği kısma dokunmadık)

IDers _provider = null; Label _lbl = null;

Yine CreateChildControls metoduna gidip şu şekilde değiştiriyoruz :

base.CreateChildControls(); try { _lbl = new Label(); if (_provider != null) { if (_provider.Id > 0) { _lbl.Text = _provider.Name + " seçildi."; } else { _lbl.Text = "Henüz hiçbirşey seçilmedi."; } } else { _lbl.Text = "Provider WebPart bağlantısı yok."; } this.Controls.Add(_lbl); } catch (Exception ex) { this.Controls.Clear(); this.Controls.Add(new LiteralControl(ex.Message)); }

Ve yine son olarak WebPart lar arası bağlantıyı kuracak kod bloğumuzu da ekliyoruz :
[ConnectionConsumer("Ders Adi ve ID")] public void BurasininIsmıFarkEtmez(IDers providerInterface) { _provider = providerInterface; }

Artık WebPartlarımızı deploy edebiliriz. Deploy ettikten sonra bir WebPartPage oluşturup (SiteActions > More Options > Page > WebPartPage), bu sayfada , deploy ettiğimiz WebPartları kullanıp test edebiliriz. Ben sayfama “ConnectedWPTest” adını verdim ve SitePages in altına koydum. Daha sonra WebPart larımı bu sayfaya eklemek için herhangi bir yerden “Add a Web Part” seçtim ve Custom kategorisi altında bulunan ConsumerWebPartımı sayfaya yerleştirdim.

Aynı şekilde Provider WebPartımı da ekliyorum. En son adım olarak da, WebPartları birbirine bağlama işlemi için, ProviderWebPart ın “Connections” kısmına gidip, “Send Ders Adi ve ID to Consumer Web Part” ı seçiyorum.

İşlem tamam, sayfama gidip test ediyorum, DropDownList de bulunan dersler (ilk adımda yarattığımız SP Custom List den doluyor) den birini seçtiğimde, ConsumerWebPart ımda bulunan Label değişiyor.


Umarım işinize yarar bir makale olmuştur.
Friday, April 22, 2011 11:05:11 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Tuesday, October 19, 2010

c# 4.0 la beraber gelen yeni tiplerden biri de Tuples.
Yapı olarak Anonymous typelara benzese de, kullanırken dikkatli olmak gerek. Gereksiz kullanımlarda kodun karmaşık bir görünüm almasına neden olabilir.
Tuples özetle N adet eleman saklayabilen objelerdir. .NET framework 1 den 8 e kadar eleman saklama desteğini veriyor fakat iç içe Tuple lar kullanarak N adet eleman saklayabiliriz.

Anonymous tipleri üzerinden örnek vererek gidecek olursak,

var anyobject={ name="michale", id=7, birthDate=DateTime.Now()} ;

gibi tanımladığımız nesnelerdi. Ayrıca anonymous type ların Read Only olduklarını ve anonymous tipleri metodlara parametre olarak gönderemeyeceğimizi, aynı şekilde metod geri dönüş değeri olarak kullanamayacağımızı da unutmayalım.
Programın fonksiyonel olarak kullanımını kolaylaştıran bu anonymous tipler varken neden Tuples kullanıyoruz peki ? Şu yüzden diyebiliriz mesela; Tuples i metodlardan geri dönüş değeri olarak kullanabiliyoruz, ancak burada şöyle bir trade off var, Tuples, yazılım geliştiriciler pek anlamlı isimler taşımaz. Tuple property leri Item1 Item2 gibi isimler alırlar genelde. Tuples, ne barındırdığı hakkında bilgi içermez.
Eğer iki tuple aynı veri tipinden değerler saklıyorsa, bu Tuple lar birbirine eşittir diyebiliriz. Örneğin, bir noktanın koordinatlarını tutan bir Tuple ile bir popülasyondaki kadın-erkek oranını tutan ik tuple. Bunları Tuple objesinde saklayabiliriz.
Anonymous type larla kıyaslarsak, Tuple yerine Anonymous type kullanmak daha mantıklı olabilir, tabi eğer işimizi görüyorsa, çünlü anonymous typelarla veri hakkında daha çok bilgi tutabiliyoruz. Anonymous type larda bulunan propertyler bize az da olsa bir fikir verebilir. Metoda parametre göndermek ve geri dönüş değeri almam gerekmiyorsa kullanmamam daha faydalı olacaktır.

var testTuple = Tuple.Create(1, 4, 9, 16, 25, 36, 49, Tuple.Create(64, 81, 100, 121, 144));

iç içe geçmiş bir Tuple örneği

Anonymous typeların aksine, Tuples sealed değildir, yani gelişime ve kalıtıma açıktır. Tuples aynı zamanda .NET 4.0 la gelen iki yeni interface i destekler :IStructuralComparable and IStructuralEquatable. IStructuralEquatable Equal() adlı bir metodu işaret eder, bu sayede IEqualityComparer kullanarak tuple daki bütün elemanlar eşit mi kontrolü yapabiliriz. StructuralComparable ve StructuralEquatable ise sıralama ve eşitlik kıyaslama kontrollerinde kullanılır.Aynen bir LINQ sorgusu gibi "orderby ıtem1,Item1" şeklinde kullanıma müsaittir.

Sonlandırırken şunu söyleyebiliriz, Anonymous Types, Tuples a göre daha anlamlı bilgiler taşır ancak metodlara parametre değeri olarak gidemez ve return değeri olarak kullanılamaz da.



Kaynak : MSDN

Tuesday, October 19, 2010 12:46:09 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Tuesday, June 29, 2010

Yazdığımız kodların analizini yapması için bir tool a ihtiyacımız var diyenlere FxCop iyi bir alternatif olabilir. Tesadüfen karşıma çıktı ansızın, denedim sevdim, özellikle .net dünyasına yeni girişmiş arkadaşlarımızın çok işine yarayabilir...

Daha fazlası için tıklayalım

Tuesday, June 29, 2010 10:27:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Saturday, April 24, 2010

Birçoğumuz stored procedure yaratırken, stored procedure isimlerinin önüne  sp_ ön ekini koyarız. Tabi farklı isimlendirmeler tercih edenlerimiz de olabilir, ancak sp_ ön ekini kullandığımız zaman SQL server bu stored procedure ü, her ne kadar siz sp nin yerini ve ismini tam olarak belirtmiş olsanız da sistem stored procedure ü olarak algılar ve çağrıldığı zaman da master database de arar. Bu da açıkçası ciddi performans kayıplarına neden olur. Bu sebeple sp_ yerine usp_ kullanırsak SQL server bunun kullanıcı tarafından oluşturulmuş bir sp olduğunu anlar...

Saturday, April 24, 2010 5:58:21 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Saturday, April 17, 2010

Compile zamanında hata vermeyen ama eğer yanlış ya da mantıksız kullanılırsa run-time da hata veren yepyeni bir tipimiz var artık.
Örneğin;

dynamic x= 7;
x.SayHello(); // gibi bir durumda run-time hatası alırız...

ama mesela şöyle aritmetik ortalama yapan bir program parçası için düşündüğümüzde ise gayet kullanışlı olabilir;

static dynamic ortalama(dynamic x, dynamic y)
{
return (x + y) / 2;
}
static void Main()
{
int x = 3, y = 4;
Console.WriteLine (ortalama(x, y));
}

burada kazancımız nedir ? açıkça görebiliriz ki er sayı tipi için ayrı bir metot yazmamıza gerek kalmıyor...

dynamic ve object tipleri aslında birbirlerine çok çok benzerler, öyle ki run-time da
typeof(dynamic)== typeof(object) size true değerini verir, hata almazsınız. Aynı şekilde

typeof (List<dynamic>) == typeof (List<object>)
typeof (dynamic[]) == typeof (object[])

ifadeleri için de geçerlidir...

Object referansında olduğu gibi, dynamic tipini de herhangi bir object tipine refere edebiliriz;

dynamic x = "selam";
Console.WriteLine (x.GetType().Name); // String
x = 123; // hata vermez !
Console.WriteLine (x.GetType().Name); // Int32

Gördüğünüz gibi yapısal olarak object referanslamadan hiçbir farkı yok... Bu şekilde dinamik operasyonlara müsade eden yapılar kurabiliriz ;

object o = new System.Text.StringBuilder();
dynamic d = o;
d.Append ("selam");
Console.WriteLine (o); // selam !

Bir diğer konu da,

public class Test
{
public dynamic Foo;
}

metodunun aşağıdaki metotla aynı olması,

public class Test
{
[System.Runtime.CompilerServices.DynamicAttribute]
public object Foo;
}

Buradaki avantajımız, dynamic tipini desteklemeyen dillerde, kullanıcılar/developerlar object nesnesi kullanarak yollarına devam edebilirler...

Peki bizim var diye bir tipimiz de var, onunla arası nasıl bu dynamic in diye bakacak olursak;

• var şöyle der, “tipin değerlendirmesini derleyiciye(compiler) bırakalım”
• dynamic de şöyle der, “yokabi gerek yok,tipin değerlendirmesini biz çalışma zamanına bırakalım(run-time)”

dynamic x = "selam"; // Static tip dynamic, runtime tipi ise string
var y = "aleykum selam"; // Static tip  string, runtime tipi de string
int i = x; // run-time hatası
int j = y; // compile-time hatası alırız...

Saturday, April 17, 2010 4:51:40 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Thursday, December 24, 2009

Geçenlerde bir arkadaşımdan duydum, yurt dışında iken almış hediye olarak. Bizim eski Furby' nin biraz daha gelişmişi. Dinozor yavrumuz oldukça gelişmiş yazılımı ile yapay zekanın sınırlarında geziyor. İlgimi çekti, belki de gerçekten iyi bir hediye olabilir ama belirtmeden de geçmeyeyim gerçek bir evcil hayvan gibi ilgi gösterip sevebileceğiniz bu yavrucak aynen gerçek bir evcil hayvan gibi günün birinde ölüyor. Merak edenler için ...

 | 
Thursday, December 24, 2009 9:15:29 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Friday, November 13, 2009


Microsoft yakın zaman önce bir oyun çıkardı. Server Quest 2

Tatilden dönen zavallı bir IT profesyonelinin durumunu, madalyonun diğer tarafından görmek için buradan  buyurun ...

 | 
Friday, November 13, 2009 10:29:52 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Friday, October 30, 2009
Friday, October 30, 2009 3:04:25 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 
Tuesday, June 30, 2009

geçenlerde bişeyler ararken aniden karşıma SIP Server diye birşey çıktı.
ilk başta çok da umursamadım ama madem karşımıza çıktı bunu da bilelim dedim
ve az biraz araştırdım (ulu bilge kişilik olarak ben :))
aslında türkiyede nereler kimler kullanır bilmiyorum ama duyduğuma göre
askeriyede bazı yerlerde mevcutmuş.

(Session Initiation Protocol - Oturum Başlatma Protokolü) Server
özetle şöyle ;

İnternet merkezli çoğul ortam iletişim mimarisinin temelini oluşturmaktadır. SIP, haberleşmek isteyen kişiler için IP ağları üzerinden oturumlar açar. Bu kapsamda, bir oturum, IP ağı üzerinden iki veya daha fazla kişi arasındaki etkileşimli bir iletişimdir. Bu basit bir iki yönlü telefon çağrısı, anında mesaj alışverişi veya işbirliği yapılan çoğul ortam konferans oturumu olabilir. SIP IETF (Internet Engineering Task Force - İnternet Mühendislik Görev Gücü) tarafından standartlaştırılan bir Web değerler dizisi protokolüdür. İki büyük İnternet protokolü olan HTTP (World Wide Web) ve SMTP (e-posta) ile benzerlikler taşımaktadır, zira haberleşmek isteyen kişileri temsil etmek için simgesel adresler kullanmaktadır.

SIP; ses ile zenginleştirilmiş e-ticaret, Web sayfası tıkla-çevir, arkadaş listeleri ile anında mesajlaşma ve çok daha fazla özellik ile tümleşik ses ve çoğul ortam servislerini desteklemektedir. SIP oturum yönetimi cihazlar arasında değil, kişiler arasında IP temelli doğal iletişimin desteklenmesinin anahtarıdır. SIP kullanarak, ayrı bilgisayarlar, telefonlar, televizyonlar ve el cihazları vasıtası ile medya içeriği ve katılımcı sayısından bağımsız olarak kullanıcılar birbirlerini bulabilir ve temasa geçebilirler.

SIP çok değişken tipte oturumları açmak üzere bir mekanizma olarak geliştirildi. Bu yüzden SIP, oturum içerisindeki ayrıntıları dikte etmez, ama katılımcıların kapasitelerine dayalı olarak etkileşimi yürütür. Bu basit özellik SIP'ın ölçeklendirilebilir, genişleyebilir ve değişik mimari ve kurulum senaryosuna rahatça uyabilir olması anlamına gelmektedir.

kaynak: www.telepati.com


 

Tuesday, June 30, 2009 11:17:46 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]  | 

© Copyright 2009, Süleyman PETEK