logo Unutmayayım diye yazdıklarım...

C# Refaktoring Ipuçları

25.12.2011 tarihinde yazıldıktan sonra, 4 kişi yorum yazmış.

Yazılım sektöründe ve hatta BT gezgeninde genel olarak söylenen bir söz vardır "Çalışıyorsa Elleme".
Bazı sistemlerde doğru olsada yazılım geliştirme prensipleri çerçevesinde bu çok iyi bir şey değildir. Çünkü çalıştırdığınız sistemi her zaman için daha iyi, daha hızlı ve stabil hale getirme şansınız vardır.
Diğer taraftan bir işi çözmek için ilk geliştirdiğiniz algoritma genelde ileride probleme yol açabilecek (Code Smell) potansiyele sahiptir ki görüp geriye dönüp gereğince düzeltmek gerekir. İşte bu düzeltme, toparlama yaparken geçirdiğiniz zamana ve kodlarda yaptığınız iyileştirmelere, değişikliklere de yazılım aleminde "Code Refactoring" deniyor.

Kavramlar ve işin teorik tarafı ile Yazılım Mühendisleri ve Bilgisayar Bilimcileri uğraşa dursun biz direkt koda'a dalalım;

Not: Daha fazla örnek, teori ve derine inmek isterseniz "anti pattern, code smell, code stink" gibi şeyleri aratabilirsiniz.

 

Örnekleri verirken yukarıdaki mantıkta ilerleyeceğim. Önce şişman, yavaş koda bakacağız, daha sonrada seksi kod'a bakacağız böylece aradaki fark yukarıda olduğu gibi daha çarpıcı görünecek. Tabi seksi kod'a bakıp, yukarıda ki bayana baktığınızdaki etkiyi alıyorsanız da bilgisayarın başından kalkma vaktinizin geldiğini hatırlatmak isterim.

İnceden başlayalım;

Aynı değişken tipleri, aynı değeri alacaksa kullanabileceğimiz bu yazım seçeneği bir kaç değişkende pek kullanışlı olmasada bazı durumlarda onlarca değişken tanımlamanız gerekdiğinde uzun kod yığınlarında sizi kurtaran bir etki yapar. Aklınızda olsun.

Yukarıda ki örnek aslında çok sık karşılaştığımız bir olay. String'in veya objenin belirlie bir değerde olup olmadığını en rahat if ile buluruz ve koşulları işletiriz fakat programcı dostu if her zaman işinizi kolaylaştırmaz bazende uzatır. Özellikle bool tipi dönüşlerinde kodları kısaltmamızı sağlayan bir düşünce tarzı diyebiliriz.

Başka bir örnekde try..catch kullanımı ile ilgili. Herkesin bildiği gibi bu bloğu kullanmak CLR için oldukça maliyetli o nedenle try...catch blog'unu bir koşul olarak kullanan programcıyı dövseniz kimse ses çıkarmaz. .Net zaten try-catch kullanmayalım diye bize bir sürü method sunuyor. Örneğimizde dosyanın var olup, olmadığını kontrol etmek için kolaylıkla File.Exists() methodunu kullanabiliriz. Böylece try..catch kullanmamıza gerek kalmaz ve kodumuz daha hızlı çalışır.

Diğer taraftan FileStream disposable bir class olduğundan using içinde kullanmak daha doğru olacaktır, ki işimiz bittiğinde otomatik olarak GC'nin ellerine emanet edilsin.

 

Ve tabiki string işlemleri. En çok can çekiştiğimiz ve takla attığımız konulardan biride string işlemleri. Neyse ki .Net bize string üzerinde işlemler yapabilmek için bir ton araç sunuyor. Sol tarafta gördüğünüz string birleştirme işlemi (concatanate derler) her ne kadar dil kurallarına uygun olsada çalışması yavaş, yazılması ve okunmasıda zordur. Daha hızlı, okunması ve yazması kolay hali ise sağ tarata string.format kullanılarak gerçekleştirilmiştir. Tabi string birleştirmeden söz ediyorsan StringBuilder'dan da söz etmemiz gerekir ki aşağıda bir örnek mevcuttur.

Başka bir kötü if örneği. Her ne kadar süslü parantezlerle kodu uzun gösterip "oha, arbiden kısalmış" dedirtmeye çalışamda burda şairin demek istediği şey "refaktoring faydalı bir şey" mesajı dır. Yine burda doğru yerde, doğru koşulun kullanımın yapmış olduğu etkiyi görebilirsiniz. Teşekkürler :?

Yine doğru zamanda ve doğru yerde kullanılan bir koşul operatorü "??". Bir class'ın null olup olmadığını kontrol eder ve null ise koşulu işletir. If burda yine yapacağını yapmış ve işleri zorlaştırmış fakat aynı imdadımıza ?? koşarak işleri yoluna sokmuş.

Bu sefer işler biraz değişik gerçek hayata daha yakın bir method ile karşı karşıyayız fakat kod harabe! En baştaki array'ın elemanı olup olmadığı daha sağlıklı bir yolla kontrol edilebilirdi, ek olarak yine string birleştirme işleminde .Net'in nimetleri kullanılmamış.

Refaktoring sonrası String'imizi StringBuilder yaptık ki string birleştirme işlemlerinde maksimum performansı alalım, sonra Array'ın bir elemana sahip olup, olmadığınız Linq'in Any() Extension methodu ile kolay bir şekilde öğrendik, arkasındanda AppendFormat() methodu ile de okunaklı bir şekilde stringimizi oluşturduk.

Bu sefer şişman olan sağ taraf oldu. Neden? çünkü kod'u her inceleyen tarafından ne yaptığının anlaşılması gerekiyor bu nedenle biraz daha pseudo'ya kaçırdık. ExecuteTask() methodundan errorCode'a bir değer atanıyor ve o değere görede methodlar çalışıyor fakat sağdaki kodda bir sıfır değerinin ne olduğunu bilmiyoruz. Halbuki bilmek gerekiyor ki bir şey değiştireceksek ilgili methodda değiştirelim. Bizde gittik class'ın başına bu değişkenleri const tipinden ekledik ve condition'a tekrar verdik. Şimdi neyin ne olduğu dahada anlaşılır oldu.



absmiddle Yorum

.Net ile PowerShell Module Geliştirme

13.12.2011 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Powershell geçtiğimiz yıllarda hayatımıza girdi ve Windows üzerinde scripting'e yeni bir boyut kazandırdı. Arkasındaki güçlü .Net Framework desteği sayesinde de Powershell ile hayal ettiğiniz her hareketi yapar hale geldik. Eskiden Batch Scripting ile 30 satırda yapılabilen işler Powershell kullanılarak tek satırla indirgenebiliyor. Tabi her zaman tam ihtiyacınıza uygun komut bulunmadığından genişletmek veya uygulamanızı command line ile de yönetmek isteyebiliyorsunuz.

(Aga, laga luga yapma hepsini okuyacak vaktim yok, bana kodu ver modundaysan proje dosyasına burdan ulaşabilirsin.)

İşte bunun için PowerShell yazılım geliştiricilere genişletilebilir özellikler sunuyor. Bakalım bu özelliği .Net üzerinde nasıl kullanabiliyormuşuz.

PowerShell Modülümüz Ne Yapacak?

Bir alanadının (domain) bilgilerini alıp ekrana basan basit bir Whois modülü yazacağız. Bunu Powershell üzerinden de yapabilirz tabiki fakat konu PowerShell modülü nasıl yazılır olduğudan .Net tarafına değineceğiz ;)

Neler Lazım

  • Genelde Windows 7 ile birlikte Powershell'in 1.0 sürüm yeterli fakat 2.0 sürümüde yükleyebilirsiniz. Sürümlerle ilgili burdan detaylı bilgi alabilirsiniz
  • Visual Studio 2010'un herhangi bir sürümü.
  • PowerShell modülü geliştirebilmek için Powershell Referansları.
  • .Net Framework 2.0 ve üzeri.

PowerShell Referansları

Genelde;

C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0

dizini altındadır. Burda gerekli olan dosya System.Management.Automation.dll ve Native olarak gelen System.Management referansınıda projenize eklemeniz gerekir.


Başlangıç

Powershell modülü geliştirmek içn ortamı tedarik ettikten sonra Visual Studio üzerinden New > Project > Class Library komutunu veriyoruz. PowerShell modülü için .Net 2.0 CLR versionu gerekli olduğundan .Net Framework 3.5 seçiyoruz.


.Net 4.0 neden seçmedik diyebilirsiniz. Modülü .Net 4.0 ile de geliştirebiliriz fakat bunun için Powershell.exe.config'e bir talimat vermemiz gerekir. Yeri gelmişken verelim.

C:\Windows\system32\WindowsPowerShell\v1.0 dizininde yani $pshome (Bunu powershell içinde çağırırsanız aynı klasörü döndürecektir) powershell.exe.config dosyasını bulun. Yoksa da yaratın. Daha sonra aşağıda ki tanımlamayı gerçekleştirin.


Bundan sonra .Net 4.0 altında PowerShell geliştirebilirsiniz. Fakat bu projede gerek olmadığından ben .Net 2.0 ile idare ediyorum.

Kod

Açıklama

Kod'a baktığımızda ilk dikkatimizi çeken Cmdlet tipinden WhoisCommand classımızı türetiğimiz dir (inheritance olayı).
Standart bir Powershell komutu şeklinde hareket etmesini sağlamak için Cmdlet'den türetiyoruz. Yine Cmdlet sınıfının kurallarından CmdletAttributes'ini deklare etmemiz gerekiyor ki Powershell modülü çalıştırırken hangi maksatla çalıştırıldığını bilsin.

Burda biz veri çağıracağımız için VerbsCommon.Get enum'unu kullandık fakat herhangi bir değer tanımlayacak olsaydık VerbsCommon.Set de diyebilirdik. Bu konu ile ilgili ayrıntılı bilgiyi buradan alabilirsiniz. Uzun uzun hepsini saymak 5 sayfayı alır :)

NounName

CmdletAttribute'nin diğer bir parametreside NounName. NounName Powershell ortamında komutun isminin ne olacağını belirler burda "Whois" dedik fakat Verbs'lerden Get'i seçtiğimiz için Powershell ortamında komutu çağırmak için "Get-Whois" şeklinde kullanmamız gerekiyor.

Parametereler

Bu ortamda parametere oluşturmak için basitçe ilgili class'da property oluşturup ParameterAttribute vermeniz yeterli. Burda dikkatinizi çekmiştir, Parameter özelliğinin Mandatory parametresi true. Bu demektir ki, parametre Powershell ortamında zorludur. Bizim senaryomuzda da zaten girilmezse Whois çalışmayacağından bunu "true" olarak verdik. ParameterAttribute'sinin full referansı için buradan kastırabilirsiniz.

Tanımlaraları yaptıktan sonra hemen ProcessRecord() methodnu override edip içini dolduruyoruz. Bu method Powershell'in giriş methodu olduğundan herşey burda çalışıyor dolayısıyla bizim methodlar çalışıyor ve whois bilgisini, whois serverdan talep ediyor. Herşey yolunda gidersede aldığımız string değeriniz WriteObject(); methodu ile ekrana basıtırıyoruz.

Import-Module

Geliştirdiğimiz modülü PowerShell ortamında kullanabilmek için Import-Module komutunu kullanıyoruz. Şöyle ki;


Modülümüzü kontrol etmek istersek de Get-Module komutu işimizi görüyor.

 

Yukarıda gördüğünüz gibi Name Projemizin ismi, ExportedCommands ise Get-Whois olarak PowerShell ortamına yansımış durumda.

Bundan sonra "Get-Whois domain.com" komutu vererek istediğimiz alanadının whois bilgilerine ulaşabiliriz.


Hepsi bu kadar. Umarım yardımcı olmuştur.

Vs.Net 2010 Proje Dosyası : PoshWhois.zip



absmiddle Yorum

Windows Azure'u Yönetmek

30.11.2011 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

MaestroPanel'in Azure'da çalışacak olan versionunu düzenlerken düzgün çalışması için bir kaç özel ayar yapmak gerekti. Fakat Azure kontrol panelinde IIS ile ilgili ayar yapılabilecek arayüz bulunmuyordu.

Biraz araştırdıktan sonra Windows Azure için "Startup-Task" konfigurasyonunun olduğunu öğrendim.

Projenizde ki ServiceDefinition.csdef dosyası web uygulamanızı Azure'a yüklendikten sonra nasıl hareket edeceğini hangi portu ve hangi protokolü dinleyeceğini belirleyen tanımlalar için vardır.

Bu dosyanın içinde ki konfigurasyon node'larından bir taneside projemiz çalıştırılırken işletilecek komutları tanımlamamızı sağlayan "Startup" node'u.

Bu node'un içine tanımladığınız Windows Command dosyası yani batch dosyasını aynı Command Prompt gibi düşünün. Girdiğiniz komutlar windows'da çalışıyormuş gibi Azure tarafından işletilecektir.
Daha sonra projenize bu dosyayı dahil ediyorsunuz tanımlıyorsunuz ve Startup nodunu düzenliyorsunuz.

Ayarla.cmd
REM queueLength arrtır
%windir%\system32\inetsrv\appcmd set config  -section:system.applicationHost/applicationPools /applicationPoolDefaults.queueLength:"5000"  /commit:apphost

REM Timeout'u düşür.
%windir%\system32\inetsrv\appcmd set config  -section:system.applicationHost/webLimits /connectionTimeout:"00:01:00"  /commit:apphost

REM Process'i arttır
%windir%\system32\inetsrv\appcmd set config  -section:system.applicationHost/applicationPools /applicationPoolDefaults.processModel.maxProcesses:"4"  /commit:apphost

REM 64bit uygulamalara izin ver.
%windir%\system32\inetsrv\appcmd set config  -section:system.applicationHost/applicationPools /applicationPoolDefaults.enable32BitAppOnWin64:"False"  /commit:apphost
Ayarla.cmd dosyasını ben şu şekilde projeme ekledim.

Bundan sonra ServiceDefinition.csdef dosyamızıda aşağıdaki gibi düzenliyoruz.



Kaynaklar:


absmiddle Yorum

Microsoft FTP 7.5 için İpucu (useDomainNameAsHostName)

29.11.2011 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

MaestroPanel için Windows Server 2008 R2 ile birlikte gelen Microsoft FTP 7.5 desteği verdik fakat Hoster'ların çok alışık olmadığı bir authentication yöntemi var.

Microsoft FTP 7.5 ile birlikte Vhost desteği gelmiş yani FTP alanları birbirinden tamamen izole olacak şeklide çalışması sağlanmış. Bu Ms FTP'nin hem daha güvenli, hemde daha yönetilebilir olmasını sağlamış.

Bununla beraber IIS 6.0'da alışık olduğumuz kullanıcı adı ve şifre ile giriş yaptığımız kimlik doğrulaması yerine Domain|Kullanıcı adı ve Şifre şeklinde bir kimlik doğrulama mekanizması konulmuş.

Örnek vermek gerekirse. oguzhan.info MS FTP 7.5 üzerinde çalışıyor diyelim ve FTP kullanıcı adımda ogzftp olsun, şifremde p@sssw0rd olsun. Login olabilmem için
Kullanıcı adı: oguzhan.info|ogzftp
Şifre: p@ssw0rd
girmem gerekiyor. | pipe karakterini domain ile kullanıcı adınız arasına koymalısınız. Bunu kaldırabilirmiyiz diye biraz araştırırken, kaldırılamdığını öğrendim fakat biraz daha son kullanıcıya yakın hale getirebilmemiz mümkün. Aşağıdaki script ile | pipe karakteri yerine "@" veya "\" karakteride kullanabilmeniz mümkün.
appcmd.exe set config  -section:system.ftpServer/serverRuntime /hostNameSupport.useDomainNameAsHostName:"True"  /commit:apphost

C# Kodunu vermek gerekirse.

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

    private static void Main() {
        
        using(ServerManager serverManager = new ServerManager()) { 
            Configuration config = serverManager.GetApplicationHostConfiguration();
            
            ConfigurationSection serverRuntimeSection = config.GetSection("system.ftpServer/serverRuntime");
            
            ConfigurationElement hostNameSupportElement = serverRuntimeSection.GetChildElement("hostNameSupport");
            hostNameSupportElement["useDomainNameAsHostName"] = true;
            
            serverManager.CommitChanges();
        }
    }
}

Bu işelmlerden sonra son kullanıcıya domain.com@username veya domain.com\username şeklinde kullanıcı adı verebilirsiniz.

Bu şık olmayan kullanıcı adından tamamen kurtulmak için FTP 7.5 için geliştirme yapabileceğiniz programlama arayüzleri mevcut. Örneğin FtpAuthenticationProvider kullanarak ayrıca kendiniz bir kimlik doğrulama yazabilirsiniz veya IIS 7.5 üzerinde yine IIS 6.0'ın FTP serverını kullanabilirsiniz.



absmiddle Yorum

IIS 8

16.09.2011 tarihinde yazıldıktan sonra, 2 kişi yorum yazmış.

Microsoft'un Build konferansı ile birlikte ortalık bir hayli hareketlendi ve her zaman olduğu gibi hayatımıza yeni kavramlar girdi.

Bunlardan en önemlisi sanırım Windows 8'de görmeye alışacağımız Metro UI. Bu yeni nesil Windows'unun masaüstü temelini oluşturuyor ve developer'a çok esnek bir yapı sunuyor. Konumuz bu değil ama şunu önemle vurgulamak isterimki HTML + JavaScript ile Metro UI uygulaması yazabiliyorsunuz! Ayrıca MetroUI'nin altında çalışması için eski Win32 benzeri bir API sisteminde WinRT (Windows Runtime) olacağını belirteyim.

IIS 8

MaestroPanel projesine başladığımdam beri IIS ile çok içli dışlıyım. Windows 8'in Developer sürümünde ilk baktığım şey IIS versionu oldu ve direkt IIS 8 olarak geldiğini gördüm.

İlk dikkatimi çeken IIS isminde yeni bir Management Console'un geldiği (mmc) klasik InetMgr.exe var fakat IIS.mmc ile açarsanız bunu sarmalayıp açılışta Web Platform Installer'la beraber ek özelliklerde geliyor.

Şimdilik arayüzde çok büyük değişiklikler görmeyi beklemedim çünkü IIS 7.0 ile beraber zaten arayüz radikal biçimde değişmişti. IIS 8 sürümü, 7.0 ile gelen konseptin daha oturmuş hali, yani yeni özelliklerden ziyade iyileştirmeleri ve düzeltmeleri içeren bir sürüm olacağa benziyor.

Neler Yeni?

Tabi arayüzde gözle görülür bir şey olmadığından UI tarafında herşey aynı diyebilirim. Fakat yenilik olarak şu maddeleri sıralayabiliriz.

  • Şu andaki sisteme göre SSL sertifikalarını Windows yönetiyordu ve site ile ilişkilendirme içini IIS yapıyordu. IIS 8 ile beraber SSL yönetimide IIS'e verildi ve böylece Windows'un SSL sınırlamalarından kurtulmuş olduk. Bu hoster'ların seveceği bir özellik lakin Windows 500 sertifika ile sınırlıydı.
  • IIS8 ile gelen diğer bir iyileştirme ise NUMA (Non Uniform Memory Access) bu iyileştirme hafıza kullanımını daha performanslı hale getiriyor dolayısıyla IIS daha verimli çalışıyor.
  • Sonunda derdirtecek bir özellkle CPU limitlemesi ile ilgili. IIS'in en başından beri CPU limitleme özelliği mevcuttu fakat bir türlü düzgün çalışmıyordu ve bizde çeşitli mekanizmalarla limitlemeler yapma gereği duyuyorduk. IIS 8 ile birlikte bu özellik gerçekten sağlanmaya başlanacakmış. Özellikle cloud sistemlerde çok işe yarayacak bir özellik diyebilirim.
  • Güvenlik alanında Dynamic Access Control diye yeni bir yaklaşım geliyormuş. Bu özellik sayesinde kullanıcılar dosya sistemine aldıkları etiketlere göre erişebileceklermiş henüz denemedim ama ilgi çekici bir özellik.

İlk duyduklarımız ve gördüklerimiz bunlar. Windows 8'in Server sürümünü test etme fırsatı bulursam daha detaylı inceleyip yeni IIS'in neler yapabileceini göreceğiz bakalım.



absmiddle Yorum

MaestroPanel Screencast Serisi

16.08.2011 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

MaestroPanel'in özelliklerini anlatan screencast serisine başladım. Hedefim haftada bir video yayınlamak. Bunlardan ilk ikisini geçen hafta ve bu hafta yayınladım. Ekstradan duymayanlar içinde buraya yazıyorum. ;)

MaestroPanel Screencast #1 - Sunucu Yönetimi http://bit.ly/ru1SYv
Panel'de sunucular nasıl yönetiliyor, ne şekilde ekleniyor gibi sorulara cevap bulabileceğiniz video.

MaestroPanel Screencast #2 - Plan Yönetimi http://bit.ly/nHXuMS
Panel'de dağıtık yapıdaki modulleri nasıl yönetebileceğiniz, bayi ve domain planları nasıl oluşturabileceğinizi ve limitlemeyi nasıl gerçekleştirebileceğiniz anlatan videomuz.

Proje ile ilgili son durumu belirtmek gerekirse,
MaestroPanel RC seviyesine geldi, hosting firmaları ile kapalı beta testlerimiz devam ediyor. Penetration testlerinden sonra Release etmeyi düşünüyoruz.

Yakın zamanda bir Sistem Yöneticisi, Bir Front-End developer ve birde Back-End developer olmak üzere ufak bir ekip kurmayı planlıyoruz. Bu geniş kapsamlı proje ile ilgilenen arkadaşlar ping @ maestropanel.com adresine e-mail gönderirlerse şimdiden adayları belirleyebiliriz.

Projeye destek veren herkese burdan teşekkürlerimi sunarım.

Takipte kalmak için:


absmiddle Yorum

Razor Ninja'sının El Kitabı

09.07.2011 tarihinde yazıldıktan sonra, 5 kişi yorum yazmış.

MVC3 ile birlikte Razor ViewEngine geldiğinde tamda yeni bir projeye başlıyordum fakat Spark ile devam etmeyi düşünüyordum. Spark ile Razor arasında ufak bir kararsızlıktan sonra hem ekosistemi hemde devamlılığı olacağını düşündüğümdem Razor'u seçtim. Alışana kadar biraz sıkıntılıydı çünkü bazı temel işlemleri yapmak için ufak tefek ipuçlarını bilmek gerekiyordu araştırırken öğrendiğim bu ipuçlarını derleyip böyle bir Tutorial hazırladım. Okuyun ;)

String atraksiyonlarında <text/>

Razor direkt HTML ile iç, içe kullanılabildiğinden bazı durumlarda C#'ın içinden string çıktısı vermek gerekebiliyor. Böyle durumlarda başvurabileceğiniz akıllı bir kaçış tag'ı olarak <text> işe yarıyor

Çıktı:

$('#1').text('Deneme 1');
$('#2').text('Deneme 2');
$('#3').text('Deneme 3');
$('#4').text('Deneme 4');
...

@: Blok'u

Akıcı bir Razor sytax'ı için kullanılabilecek bir özellikte @: işaretlemesi. Bu işaretleme <text> ile eşdeğerdir tek farkı tek satır olarak kullanılmaktadır. <text> ise birden fazla satırda string çıktısı vermek için kullanılır ve bu tagların arasındaki işaretlemeler ViewEngine tarafından render edilmez. @: kullanımına örnek;

Çıktı:

İşlem Gerçekleşti

Comment'ler nasıl olacak peki?

Razor'da da her ViewEngine'de olduğu gibi kod içine açıklama eklemek için kullanabileceğiniz işaretlemeler vardır, tabi klasik olarak bildiğimiz \\ veya ' olarak değil onun yerine @* ... *@ şeklinde. Bu işaretlemeyi kullanılarak sunucu taraflı kod yorumları ekleyebiliryorsunuz.

Tek satır için

gibi. Burda ki güzellik hem tek satır hemde çoklu satırda aynı işaretlemeyi kullanıyor oluşumuz.

Strongly-Typed View

Klasik ASP.NET ViewEngine'inde View'i belirli bir Model ile kullanmak istediğimizde sayfanın en üstünde attributes'lerden oluşan uzunca bir tag eklemek gerekiyordu. Razor'da bu @model işareti ile kolayca gerçekleştirebileceğiniz bir işlem.

Örneğin:

@Html.Raw

HTML'i Encode ederek ekrana veren güzel bir özelliktir. Klasik ASP.NET'de ki Server.HtmEncode() fonksiyonuna benzer. Aynı işi gören diğer bir yardımcı komut ise HtmlString().

Kullanımı basittir:

Çıktısı:

<h1>Deneme</h1>

olacaktır.

Namespace'leri nasıl kullanabiliyoruz?

Örneğin Razor sayfasının içinde System.IO namespace'i altından bir Class kullanmak istiyoruz. Bunun için sayfasnın @model çağrısının altına @using çağrısını yapmanız yeterli.

@using System.IO

gibi.

Sayfa içinde @function

Kullanışlı özelliklerden bir taneside Razor sayfası içinde sadece o sayfaya özel fonksiyonlar üretip, kolaylıkla kullanabilmemiz. Örneğin: Verdiğiniz string'i ekrana kırmızı yazan bir sayfa içi function yazmak istersek.

şeklinde yazabiliriz. IHtmlString döndürdüğüne dikkat etmişsinizdir Razor bunu render edilecek html string'i olarak algılayacak ve browser'a yorumlaması için gönderecektir.

Koşullar (Conditions) nasıl yazılyor?

Razor içinde ?:, switch, if.. koşulları yazmak doğal olarak mümkün bunun için @() işaretlemesi kullanılıyor.

Örneğin ?: condition'ına örnek vermek gerekirse.

Model.Status değeri true olduğu için ekrana direkt Tamam yazılacaktır.

If konuşulu için ise;

Burda dikkat edilmesi gereken nokta @: kullanıldığı için satır atlamalarının zorunlu olduğu. Diğer bir If koşulu örneği ise;

Burda HTML tag'ı ile string'i yazıdıryoruz fakat bu her zaman istenen bir durum değil o nedenle <text> ile'de kullanılması mümkün.

text ile kullandığınızda sadece "Tamam" string'i ekrana basılır.

Razor Delegate

Razor Delegate'leri kullanarak daha temiz, okunaklı kodlama yapılması mümkün. Bazı durumlarda ise karmaşıklığı ve işleri oldukça kolaylaştırıyor. Hemen örnek vereyim;

İhtiyacınıza göre genişletmeniz mümkün, parametre dynamic olduğu için kendi tipleriniz içinde çeşitli fonksiyonlar geliştirip daha kullanışlı fonksiyonlar üretebilirsiniz tabi.

@Helper

Razor bünyesinde bir çok yardımcı method barındırmasına rağmen ihtiyacınıza uygun Helper methodları yazmanız kaçınılmazdır. Bu methodlarıda sadece Razor sayfas içerisinde oluşturup, diğer sayfalarda da kullanabilmek isteyebilirsiniz işte bunun için @Helper işaretlemesi ile oluşturacağınız method'ları kullanabilirsiniz. Şöyle ki;

Çıktısı:

118,00 TL

Burdaki trick ise KdvDahil fonksiyonunu yazdığınız Razor sayfasını Projenizde ki App_Code sayfasının altına gönderdiğinizde KdvDahil fonksiyonuna her Razor sayfasından ulaşabiliyor olmanızdır. Örneğin KdvDahil fonksiyonunun yazılı olduğu Razor dosyasının ismi Fiyatlar.cshtml olsun. KdvDahil fonksiyonuna diğer Razor sayfalarından ulaşmak için Fiyatlar.KdvDahil() şeklinde kullanabilmeniz mümkün.

HTML data-* ve Class Attributes

@Html.ActionLink methodu içinde HTML5 ile birlikte gelen data-* attributes'ini kullanmak isteyebilirsiniz MVC3 bunun için Anonymous Type'lerden yararlanıyor fakat HTML'e göndereceğiniz attributes syntax'ı Anonymous Type'larda kullanılan cinsten değil. Örnekle açıklayalım.

<a href="/Home/Delete" data-id="45">Database</div>

çıktısını ActionLink kullanabilmek için aşağıdaki şekilde yazmalısınız.

dikkat ederseniz data_id olarak yazdık fakat HTML'e data-id olarak yansıdı buda ActionLink methodunun akıllı özelliklerinden bir tanesi.

ActionLink için verebileceğimiz diğer bir ipucuda class kullanımı. class .Net'de bir özel bir kelime olduğundan, herhangi bir değişkene'de class ismini verirken bunun değişken olduğunu belirtmelisiniz;

<a href="/Home/Delete" data-id="45" class="shadow-text">Database</div>

çıktısını alabilmeniz için ActionLink aşağıdaki şekilde olmalıdır.

@ burda bir çeşit escape karakter olarak kullanılabiliyor.

@section

Section'lar genel şablonlar oluşturulmasında kullanılan son derece yararlı bir Razor fonksiyonudur. MasterPage'de belirleyeceğiniz ve isimlendirdiğiniz section'ı herhangi bir Razor sayfasında özel olarak kullanabilirsiniz.

Önce _Layout.cshtml içinde bir section tanımlamalısınız.

Daha sorna Layout eklenmiş bir sayfada bu section'ı çağırabilirsiniz.

@section jquery{
    $('#body').append('Section Çağırıldı');
}

gibi. Burdaki örneğimizde Razor sayfamıza jquery'i tekrar initialize etmeden _Layout üzerinden çalıştıdık.

@Html.RenderPartial

Kendi oluşturduğunuz kontrolleri veya PartialView'leri Razor içinden çağırmanız mümkün. Aşağıdaki şekilde;

Burda dikkat etmeniz gereken ";" noktalı virgül. Çünkü {..} parantezleri açtığnızda C# moduna girmiş oluyorsunuz. Menu.cshtml, PartialView'imiz ~/Views/Shared/ dizini altında olmak zorunda çünkü Razor ViewEngine'inde bu path'ler default olarak aranıyor. Fakat bu Path'lerin dışında da PartialView'lerinizi Render etmeniz mümkün,

PartialView'inizi herhangi bir Model ile kullanacaksanız bu Model'i parametre geçmek için aşağıdaki syntax'ı kullanabilirsiniz.

İki @@, Bir @ eder

Bazı durumlarda Razor'dan string geriye döndürürken @ işareti geçen string'ler döndürmeniz olası bu durumda @@ olarak verirseniz Razor bunu algılayıp normal string gibi işleyecektir.

Normal string olarak algılanır.

@Deneme String@

Razor Syntax'ı olarak algılanır.

Ek olarak e-posta adreslerini Razor otomatik algılar ve ona göre davranır yani email adreslerinde böyle bir harekete gerek yok, direkt yazabilirsiniz.

@Url.Action

Url.Action, Controller'de oluşturduğunuz Action'ların sadece adresini verir. Ben genelde JavaScript'in içinde ajax çağrılarında kullanıyorum.

Burda çıktı /Home/Index/1 şeklinde geliyor.

Razor içinden SQL

Şimdiye kadar hiç kullanmadım fakat aklımızda bulunsun. Razor'da @{..} blogu içinde C# moduna geçtiğimizi daha önce söylemiştik, e madem C# moduna geçiyoruz o halde class içinde kullandığımız tüm atraksiyonlarıda kullanabilmemiz normal. Aşağıda Razor sayfasından sql sorgusunun çalıştırılmasına dair bir örnek var.

bildiğimiz PHP gibi...

Şimdilik bu kadar, yeni fonksiyonlar tecrübe ettikçe buraya ekliyor olacağım...

Kolay Gelsin ;)



absmiddle Yorum

MaestroEx - Hosted Exchange Control Panel

17.05.2011 tarihinde yazıldıktan sonra, 2 kişi yorum yazmış.

Herkese Selamlar,

Heyecanla belirtmek isterim ki, MaestroPanel'in Beta 1 sürümünün çıkmasına çok az kaldı! Yoğun bir şekilde takvimimizi tutturmaya çalışıyoruz ve heyecanla geliştirmeye devam ediyoruz ancak şimdi size başka bir haberimiz var.

Bilindiği üzere MaestroPanel moduler yapısı sayesinde ihtiyacınıza uygun modulleri zahmetsizce kullanabileceğiniz bir platform haline getirmeye çalışıyoruz. Bu bağlamda da hoster’ların sık kullandığı ve servis verdiği yazılımların modüllerini MaestroPanel'e kendimiz eklemeye öncelik veriyoruz.

Bulardan bir taneside Microsoft Exchange Server 2010.

Microsoft radikal bir kararla Exchange 2010 yönetimi için grafiksel arayüzler yerine Powershell scripting mantığını getirdi. Bu bir çok windows sistem yöneticisi için büyük bir sıkıntı yarattı çünkü bir çok komut seti öğrenip Exchange 2010'u o komut setleri ile yönetmek gerekecekti, tabi bunun esaslı bir öğrenme süreci olduğu açık ve büyük sunucu farm'larında da tekrar eden işleri sunuculara girerek teker teker yapmanızda işleri çok zorlaştıracaktı.

Sistem yöneticilerinin bu ızdırabını gidermek, Exchange 2010 üzerinden hosted hizmetler verebilmek, bunları etkili bir biçimde yönetebilmenizi sağlamak için MaestroPanel Exchange modülümüzü ayrı bir ürün haline getirdik.

Ürünümüzün adı MaestroEx ve sadece Exchange 2010 üzerinden hosted exchange hizmeti vermenize yardımcı oluyor. Lafı fazla uzatmadan erişim bilgileri ve ilgili sayfaların adreslerini aşağıda veriyorum. Umarım Beğenirsiniz.

MaestroEx'e ulaşmak için ex1.maestropanel.com (user: admin/pass: password) adresini ziyaret edebilirsiniz. Biz demo için bir exchange sunucusu kurduk fakat kendi exchange sunucunuz varsa maestropanel.com/hostedexchange adresinden MaestroEx Agent’ı çekip kurmanız yeterlidir.

Umarım Beğenirsiniz…



absmiddle Yorum

Hosting Zirvesi 2011 Ardından

05.05.2011 tarihinde yazıldıktan sonra, 2 kişi yorum yazmış.

Geçen sene katılamadığım Hosting Zirvesi etkinliğine bu sene hem konuşmacı hemde ziyaretçi olarak katılma fırsatı elde ettim. Etkinlik gerçek anlamda sönük geçti fakat benim için iyiydi. Hosting sektöründen yeni kişilerle tanışma fırsatım oldu, yeni fikirler ve projelere vesile oldu, en önemlisi üzerinde çalıştığım MaestroPanel projesini sektöre tanıtma imkanım oldu. Üzerine bayağı konuşuldu tavsiyeler, destekler geldi. Tabi bu iyi niyetlerinde yanında, haksız yere eleştirilerde olmadı değil, fakat onlarda olmasa çekilmez olurdu zaten :)

Genelde iki yaklaşım oluyor birincisi "Süper. Türkiyeden böyle bir proje çıkabildiğine şaşırdım nasıl destek olabiliriz" şeklinde, İkinciside "cPanel, Plesk varken ne gerek var. Zamanını başka şeyler için değerlendir" şeklinde. Sanırım ikisininde dengeli olması gerek ki MestroPanel Projesinde böyledi.

Zirveye dönersek;

Öncelike Türkiye'de ilk ve tek olduğunu hatırlatmak isterim ve gördüğüm kadarıyla ekip olarak değil amatör bir ruhla Emre'nin mücadelesi ile gerçekleşen bir etkinlik. (Buarada Emre Bilgisayar Mühendisliğinde okuyan bir öğrenci). Burdaki garip olay DorukNet dışında hiç bir hosting firmasının katılım göstermediği (Duyduğuma göre Karegen ziyaretçi olarak katılım göstermiş). Hosting firmaları sektörden bir haber. Bir haber olduğu gibi her gelişmeye ve oluşuma burun kıvırıyor. Buda sektörün hangi aşamalarda olduğunun bir götergesi.

Asıl demek istediğim Hoster'ların kendi firmalarını tanıtabileceği, neler yapabildiklerini göstereceği bu gibi fırsatları değerlendiremiyor olması! Acaba yaptıkları bir şeyler yok mu? Deli gibi donanım alıp üzerine İşletim sistemi, onun üzerine Panellerini kurup satıyorlarmı hala? Onun için mi böyle etkinliklere katılmıyorlar? soruları aklıma takılıyor hep.

Konu hakkında konuşulacak çok şey daha var fakat uzatma gibi bir niyetim yok. Umarım önümüzdeki sene Hosting Zirvesi hak ettiği ilgiyi Hosting firmalarından görür.



Sunumdan bir kaç kare;

 



absmiddle Yorum

Bir başka Açık Kaynak proje MultiPosTR

16.03.2011 tarihinde yazıldıktan sonra, 6 kişi yorum yazmış.

Her e-ticaret sitensinin böyle bir componenti vardır, tüm bankaları destekleyebilen, reusability'si yüksek, generic bir yapıda, her programa implemente edilen süper bir class library. Bunu herkes yazmıştır ama piyasada hiç görünmez böyle kodlar, gizlidir elletilmez kimseye. Birincisi buna tav olduğum için, ikincisi belki birileride diğer provider'ların ucundan tutarda güzel ve yararlı bir proje ortaya çıkar diye ücüncüsüde bankaların dökümanlarının berbat olmasından mütevellit başladım ufaktan yazamaya.
Ha sende sanalPOS api'lerine hakimsen aha bu provider'ı ben yazarım diyorsan da haberim olsun ki github'dan write permission vereyim.

Şimdilik yeni Garanti sanalPos API'si mevcut, EST'yide yakın zamanda ekleyeceğim. Aşağıdakilerde eklenmeyi bekleyenler.

  • Bank Asya
  • Vakıf Bank
  • Yapı Kredi
  • Türkiye Finans

MutliPosTR
https://github.com/c1982/MultiPosTR

Ek olarak aynı işi yapan ve Php projelerinizde kullanabileceğiniz Hasan Özgan'ın yazdığı vpos4php adında güzel bir araçın var olduğunuda belirtmeden geçmeyelim.



absmiddle Yorum

Sosyal Ağ Antenleri
Blog RSSLinkedinFacebookFlickrTwitterFriendfeedGoogle ReaderYoutubegit
  • Açılış
  • Projelerim
  • Arşiv
  • İletişim

  • En çok ilgi görenler...

    HP IPAQ 914c
    Mikrotik
    NETSH'dan faydalanmak
    Togi Twitter Client
    Mikrotik ADSL Bridge.
    Netsis SQL Raporları.
    SQL Server Optimizasyonu.
    VBScript.Encode - Encode
    C# ile DataGridView den Excel 'e
    C# ile mail gönder
    Netsis SQL Server Değişikliği.
    Windows Sunucularda SYN Atakları.

    Rastgele birşeyler...

    Regex Master...
    google beni sever....
    Radyom - DJ Oğuzhan...
    Türktelekom 25. port...
    Windows Dışı C# DotG...
    C# 2.0 Application S...
    Regular Expressions ...
    PostgreSQL 8.0...
    Sevdiğim bir teknik...
    Perl...
    Efendi Manitu'm...
    Programlama Yarışmas...
    DJ VADER MOLA...
    LOG :) Scabies...
    Dictionary<TKey, TVa...
    ISS ve Hosting Şirke...

    Şebeke

    WHT, Fıroİş, Denizİş, Serkan, Semih, Sewgi, Beşir, İzgençvos, Erkan, Mumin, Aliİş, Lütfü, Alper, Yusuf, doğukan, muammer, maestropanel, fatih

    [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

    2003 - Oğuzhan YILMAZ
    Bir şey alıntıladığınız zaman kaynak göstermeniz yeterli.



    Web Hosting Sponsor Vargonen Technologies