Çok güzel bir haber çünkü .Net MF in Microsoft'ta Developer Division a taşındıktan sonraki ilk versiyonu. Çok değişiklik var. Hem vizyonu degişmiş hemde içerigi geliştirilmiş. Lafı uzatmadan yeniliklerden bahsedeyim, işte gelenler:

 

  •         HTTP ve HTTPs: HTTP client ve server uygulamalarına tam destek. (System.Net.HttpWebRequest, System.Net.HttpWebResponse, System.Net.HttpListener)
  •         Çoklu Dokunma ( Multi-touch ) : Giriş seviye çoklu dokunma destegi, mesela ekran üzerinde 2 parmağın hareketini algılama (emulatorde destegi). Gesture desteği yeniden daha hızlı ve yetenekli hale getirilmiş.
  •         Versiyonlama: Built ile Versioning ayrımı yapabilme, aynı kütüphanenin farklı versiyonları bind edebilme.
  •         SSL ve HTTPS için emulatör desteği: Artık emulator de SSL ve HTTPs emulasyonu.
  •         Native XML Parser: Daha iyi performan için XML parser, native code kısmına taşınmış.
  •         Native collections: Collection sınıfları yine performans için native koda taşımış. Queue ve Stack tipleri zenginleştirilmiş.
  •         Time sync: Cihazlardaki zaman olayı için Time Sync API ile ister manuel veya otomatik olarak istenilen serverdan sync yapılabilecek.
  •         Ayarlanabilir ekran boyutu: 760KB dan buyuk resimler için memory destegi.
  •         Büyük bufferlar: Microsoft.SPOT.Hardware.LargeBuffer adında yeni bir tip ile 760KBden buyuk buffer imkanı. Ve artık Microsoft.SPOT.Hardware sınıfının içinde.
  •         Watchdog ve Güç Seviye kontrolü: Güç seviyesi ve watchdog'u managed kod ile kontrol edebilme Microsoft.SPOT.Hardware. PowerState  ve Microsoft.SPOT.Hardware.Watchdog sınıfları.
  •         Geniş kalemler (pens) ve gradient dolgular: Geliştirilmiş grafik modelleme (widgets ve WPF kontroller için).
  •         TinyCore performans geliştirmesi: Olay güncelleme ve layout performansı TinyCore için geliştirilmiş.

Vizyondaki degişik ise lisanslamada, artıkın .NET her şeyi ile FREE. Yarın detaylandıracagım şimdi çıkmam lazım. Geç oldu  :)

Merhabalar, alpha kardeş yeni bir mail atıp sorunu giderdigini anlatmış, sizde adım adım uygularsanız blogengine altyapısı kullanan blogunuza yorum ekleme kısmında captcha ( resim dogrulama) ile spam yorumlardan kurtula bilirsiniz.

Ben ciddi anlamda comment (yorum) kirliligi yaşıyorum.
Aşagıdaki adımları eksiksiz yaparsanız, bendeki gibi çalışan bir yapınız olur :

 1. Web.config den ajaz destegini açıyoruz

<pages enableSessionState="true" enableViewStateMac="true" enableEventValidation="true">

 2. Kök dizinde Image.aspx diye bir dosya oluşturuyoruz, içisi bu şekil :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Image.aspx.cs" Inherits="Image" %>
     Kök dizinde yine Image.aspx.cs diye bir dosya yaratıyoruz, içisi :
using System;using System.Data;using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Drawing;using System.Drawing.Drawing2D;

public partial class Image : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

CreateCheckCodeImage(GenCode(4));

}

private string GenCode(int num)

{

string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E",

"F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

string code = "";

Random rd = new Random();

int i;for (i = 0; i < num; i++)

{

code += source[rd.Next(0, source.Length)];

}

return code;

}

private void CreateCheckCodeImage(string checkCode)

{

if (checkCode.Trim() == "" || checkCode == null)return;

Session["AlphaCaptchaCode"] = checkCode;System.Drawing.Bitmap image =

new System.Drawing.Bitmap((int)(checkCode.Length * 19), 22);Graphics g = Graphics.FromImage(image);

try{Random random = new Random();

g.Clear(Color.White);

int i;

for (i = 0; i < 25; i++)

{

int x1 = random.Next(image.Width);

int x2 = random.Next(image.Width);

int y1 = random.Next(image.Height);

int y2 = random.Next(image.Height);

g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);

}

Font font = new System.Drawing.Font("Arial", 14, (System.Drawing.FontStyle.Bold));

System.Drawing.Drawing2D.LinearGradientBrush brush =

new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);

g.DrawString(checkCode, font, brush, 4, 1);

g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

System.IO.MemoryStream ms = new System.IO.MemoryStream();

image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

Response.ClearContent();Response.ContentType = "image/jpg";

Response.BinaryWrite(ms.ToArray());

}

catch

{

g.Dispose();

image.Dispose();

}

}

}

   3.1. Kök dizindeki /Users Control/ klasöründe bulunan CommenView.ascx i açıp, '<span class="bbcode" title="BBCode tags"><%=BBCodes() %></span>' yazan satırın üstüne aşagıdaki kodu ekleyip kaydedip geri yolluyoruz :

 <label for="<%=txtCaptcha.ClientID %>">Güvenlik *</label>

<img src="/Image.aspx" alt="Degistirmek için tıklayın" style="width: 82px; height: 23px" onclick="this.src=RefreshCaptcha(this.src)" />
<asp:TextBox runat="Server" ID="txtCaptcha" TabIndex="4" MaxLength="4" Width="60px" onblur="DoCheckCaptcha()"/><span id="CaptchaMsg"></span><asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtCaptcha" ErrorMessage="<%$Resources:labels, required %>" Display="dynamic" ValidationGroup="AddComment" /><br />

 

3.2. Birde sayfada ki 'Save' butonunu aşagıdaki kodla degiştiriyoruz :

<input type="button" id="btnSaveAjax" value="<%=Resources.labels.saveComment %>" onclick="if(Page_ClientValidate('AddComment')&&checkCaptchaResult){AddComment()}" tabindex="7" />

 

3.3. Ve  'lbCommentsDisabled' labelini buluyorsunuz sayfada, onun hemen üst satırına aşagıdaki kodu ekliyorsunuz :

 <script type="text/javascript">    

        function DoCheckCaptcha() {

            var code = document.getElementById("<%=txtCaptcha.ClientID %>").value;

            checkCaptcha(code);

        }

        var checkCaptchaResult=false;

        function ReceiveServerData(CheckResult) {

            document.getElementById("CaptchaMsg").innerHTML = "";

            if (CheckResult == 1) {

                checkCaptchaResult = true;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=green>Captcha OK</font>";

            }

            else if (CheckResult == -1) {

                checkCaptchaResult = false;

                //document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

            else {

                checkCaptchaResult = false;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

        }

        function RefreshCaptcha(url) {

            if (url.toString().indexOf("?",0) > 0) {

                url = url.toString().substring(0, url.toString().indexOf("?", 0)) + "?" + new Date().toUTCString();

            }

            else{

                url = url.toString() + "?" + new Date().toUTCString();

            }

            return url;            

        }

    </script>

4.1.  Neredeyse bitti, son olarak CommentView.ascx.cs de RaiseCallbackEvent, foksiyonunu buluyorsunuz o fonksiyonun en üstüne aşagıdaki kodu ekliyorsunuz :

 if (eventArgument.Length < 1)

  {

      _Callback = "-1";

      return;

  }

  if (eventArgument.LastIndexOf("-|-") < 0)

  {

      string img = Session["AlphaCaptchaCode"].ToString().ToLower(); ;

      if (eventArgument.ToLower().Equals(img))

      {

          _Callback = "1";

      }

      else

      {

          _Callback = "0";

      }            

      return;

  }

4.2. Sayfadaki Page_Load, methodunu buluyorsunuz '//InititializeCaptcha();' satırını hemen altına :

string cbReference = Page.ClientScript.GetCallbackEventReference(this, "CheckResult", "ReceiveServerData", "");
string callbackScript = "function checkCaptcha(CheckResult){" + cbReference + ";}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "checkCaptcha", callbackScript, true);
 

 

İşte bu kadar arkadaşlar, hepinize kolay gelsin, alpha ya teşekkürler.

 

Visual Studio 2008 için bir ipucusu

10 Kas 2009 In: .net, ipucu

Code sectionda, kod yazarken methodlarımızı, regionlarımınız veya scopelarımızı Visual Studio sağ olsun daha kolay okuna bilsin diye bize yardımcı olur ve onları agaç yapısı şeklinde kümeler, tıpkı aşagıdaki gibi :

 

böyle düzenli iken çok güzelde çalışmaya başlayınca, gitgite kodlar arasında kaybolunmaya başlanılıyor. Bir düzene sokmak için tek tek kapatmanız (collapse) yapmanız gerekebilir. Bendede sebebini bilinmez bir hepsini tek tek kapatma istegi var. Bu 5000 satırlı bir cs dosyasında epey vakit alabileceginden bunun ipucunu sizinle paylaşmak istedim.

Efendim tek yapmanız gereken, kapatmak istediginiz region veya scope a geliyorsunuz ve CTRL+M CTRL+M (iki kere)
ve ilgili scope kapandı tekrar CTRL+M CTRL+M deyincede yeniden açıldı.

Ha eğer tümünü açmak isterseniz CTRL+M CTRL+L diyoruz tümüsü açılır (Open All olayı).

Tümünü hızlıca kapatmak içinse CTRL+M CTRL+O (Yani Collapse All olayı).

Çeşitli web kontrollerinde (örn. Datagrid ve DataListl), bazı resimlerin bind edilen veriye göre resim kaynaklarını kullanmasını isteriz. Resimlerin url'lerini dinamik belirlerken dogal olarak tooltipleride güncellemek istersiniz. Aşagıdaki örnekdeki gibi IMAGE kontrollerinin URL ve ALT html taglarını databound anında belirlenmiştir :

 




Template fieldaki imagelerin dinamik baglanması konusu şu şekil sizinde bildigi üzere :

            //prod. with camp.
            string k = ortak.LOGO.UrununKampanyasi(((DataRowView)e.Row.DataItem).Row["LOGICALREF"].ToString());
            if (k != "")
            {
                ((Image)e.Row.FindControl("img_kampanyali")).Visible = true;
                ((Image)e.Row.FindControl("img_kampanyali")).AlternateText ="Kampanya Koşulu : " + k;
                
            } 

Burada ben sürekli resimlerde tooltip olarak ALT html tagını kullanırdım <img src="var.gif" Alt="Stokda"/> gibi


Lakin Firefox ve Chrome bunları görüntülememekte, biraz araştırınca sorunu fark ettim efendim, sizinlede paylaşayım dedim. 

Resimler deki ALT (AlternativeText) tagı, yanlızca resimin browser tarafından gösterilemedigi durumlarda görüntülenmek üzere oldugu için, FF ve chrome tooltip olarak göstermez. Halbuki IE bunu tooltip gibi sürekli göstermekte, IE 6 dan IE 8 kadar bu böyle.

Lakin FF ve Chrome buna bozulur, kardeşim W3C bu iş için aslan gibi TITLE tagını yapmış nüçun onu kullanmazsın der ve ALT ları tooltip olarak göstermez. Ama Visual Studio 2005 ve 2008 de code sectionda 

((Image)e.Row.FindControl("img_kampanyali")).Title="Kampanyalı ürün";

derseniz VS size kızar ve derlemez. O ne olaki der ! Smile

Hal böyle olunca iş yine JS e düşer ve şu method hayatınızı kurtarır:

<script language="javascript" type="text/javascript">
window.onload=function() 
{
   for (var i = 0; i < document.images.length; i++) 
   {
      if (document.images[i].title == "") 
         document.images[i].title = document.images[i].alt; 
   }
};
</script>


Siz yine bildiginiz yöntemle yaparsınız (ALT tagı ile), bu JS sayfaki bütün imageleri tek tek dolaşır TITLE ı olmayan resimlere ALT tagında yazanı atar. Sizinde sorun çözülür.

O zman ne diyoruz hep birlikte "yaşasın JS !..."


Yeni notebook

1 Eki 2009 In: hoş

2006 nın ilk çeyreginden beri kulladıgın emektar HP DV4289EA makinamı sonunda degiştirdim. RAM i 2 Gb olmasına ragmen 2 x Visual Studio 2008, SQL Server Management, Macromedia Flash, Photoshop ve Dreamviever uygulamaları birde üstüne 10 dan fazla Chrome penceresi aynı anda açıkken, makinayıda 1 haftadan fazla kapatmayınca, bayılmaya başlıyordu artık. Tongue out 

Bu sebepler birde üstüne KDV indiriminin son günü eklenince, çok gönüllü olmasamda (bütün uygulamaların yeni PC ye yeniden kurulması eziyeti yüzünden) sonun bir makina aldım. Makina ACER ASPIRE 4937G-664G32MN GEMSTONE BLUE. İşte özellikleri :

Makina şirin ve şık. Ekran 14" ama çözünürlük 1366x768. 14 olunca boyut olarak küçük ve ağırlıgı az oldu. 2,32 KG 
Detaylar düşünülmüş, şimdilik gördügüm bir eksiklik yok...

 

Kıvanç beyin fotografları

15 Eyl 2009 In: hoş
Buyrun, sonunda siteyi atabildim ftp ye, Kıvanç Bahçeci nin fotografları...

kıvanç bahçeci  kivanc bahceci  kivanc bahceci




.LDF dosyasını temizlemek

8 Eyl 2009 In: .net
Bildiginiz üzere .LDF dosyaları veritabanına ait kayıt loglarını tutar ve veritabanının çalışması için gerekli değildir. Ancak herhangi bir felaket anında geri dönmeyi kolaylaştırır. Yapılan değişiklikleri not eder. Bu yüzden çoğu zaman veritabanından daha büyük olur.

LDF dosyanızı silecekseniz öncelikle veritabanınızın yedeği alın. Bunun ardından SQL server management da veritabanınızın üzerinde sağ tıklayın ve veritabanınızı "detach" edin.

Şimdi veritabanınızın ldf ve mdf dosyalarının oldugu klasörde log dosyasını ( *.ldf ) silin yada adını degiştirin. Bunun ardından Management Studio da "Databases" agacına sag tıklayıp Attach deyip veritabanınızın *.mdf dosyasını attach edin. Yalnız bu noktada LDF dosyası silmelisiniz. Bu yüzden OK demeden önce LDF yazan satırı seçin ve remove a tıklayın. Bundan sonra OK derseniz başarılı sonuç alırsız ve MS SQL yepyeni ve sıfır bir LOG (.ldf )dosyası üretir.

LDF dosyalarından tamamen kurtulabilmek mümkün değil. Ama bundan sonrası için boyutu daha küçük olsun istiyorsanız yapabileceğiniz şeyler var. Veritabanınız üzerinde sağ tıklayın ve properties > "options" dan  "recovery model" i "simple" seçin. Bu LDF dosyanızın bundan sonrası için çok daha küçük olmasını sağlar ve herşey LDF ye not edilmediğinden veritabanı çalışma performansı da artabilir. Ancak bu durumda felaketlerden geri dönüşler için daha sık veritabanı yedeği almanız gerekeceğini unutmayın. Karar sizin elbette.

Kolay gelsin. 

ContextSwitchDeadlock was detected durumu

22 Ağu 2009 In: .net, ipucu
Eger Visual Studio ile debug yaparken aşagı daki hatayı alıyorsanız :

ContextSwitchDeadlock was detected
" CLR, 60 saniye içinde 0x46fae0 COM içeriğinden 0x46fc50 COM içeriğine geçemedi. Hedef içeriğe/gruba sahip olan iş parçacığı büyük olasılıkla pompalamayan bekleme yapıyor veya Windows iletileri pompalamadan çok uzun süreyle çalışan bir işlemi işliyor. Bu durum performansı genellikle kötü etkiler ve uygulamanın yanıt vermemesine veya bellek kullanımının zaman içinde sürekli artmasına neden olabilir. Bu sorunu önlemek için, tüm tek iş parçacıklı (STA) grup iş parçacıklarının bekleme komutları (örn. CoWaitForMultipleHandles) pompalaması ve uzun süre çalışan işlemler sırasında da düzenli olarak ileti pompalaması gerekir. "

Çözüm oldukca basit tek yapmanız gereken :

Debug -> Exceptions -> Managed Debug Assistants

altındaki ContextSwitchDeadlock check ini kaldırmak. CLR den kaynaklanan bu durum Release aşamasında tabii ki oluşmuyor.

Ben Kimim ?

Celiker BahceciMerhabalar, ben Çeliker BAHÇECİ. 2004 den beri özel sektörde bilgisayar mühendisligi ve egitmenlik yapıyorum. Yine aynı yılın Ekim ayından beri sitemde .Net ile programlama ve hayat görüşüm ile ilgili makalelerimi yayınlıyorum. Blogum dışında Yazgelistir.com, mobilnedir.com gibi ineta kapsamındaki bir çok siteye Microsoft teknolojileri ile ilgili yazılar yazmaktayım.
Bu site ile sizinde hayatınızı anlamlandırmanızda bir parça katkımın olması dilegiyle...


Arşiv