24 Ocak 2014 Cuma

Javascript replaceAll() metodunun yazılması

JavaScript'te kullandığımız replace methodu bir string'de sadece bulduğu ilk eşleşmeyi değiştiriyor. Yani string içerisindeki tüm eşleşen kayıtlar üzerinde bir değişiklik yapmıyor. Tüm string içerisinde değiştirme yapmak için iki method önerilmektedir.
 
Birincisi aramayı Regex kullanarak yapıp, Regex'in ikinci parametresi olarak g (Global) geçmek. Böylece tüm string dizisi içerisinde aradığından bu sorun ortadan kalkıyor. 
Örnek method:
 
function replaceAll(txt, replace, with_this) {
  return txt.replace(new RegExp(replace, 'g'),with_this);

}
 
 
İkincisi ise JavaScript'in string kütüphanesi içerisine kendi replaceAll methodumuzu eklememiz. 
Örnek method:
 
// Replaces all instances of the given substring.
String.prototype.replaceAll = function(

    strTarget,        // The substring you want to replace

    strSubString    // The string you want to replace in.

  ){
 
    var strText = this;
    var intIndexOfMatch = strText.indexOf( strTarget );

 

    // Keep looping while an instance of the target string

    // still exists in the string.

    while (intIndexOfMatch != -1){

        // Relace out the current instance.

        strText = strText.replace( strTarget, strSubString )

         

        // Get the index of any next matching substring.

        intIndexOfMatch = strText.indexOf( strTarget );

    }

     

    // Return the updated string with ALL the target strings

    // replaced out with the new substring.

    return( strText );

}
 
Benim fikrime göre ikincisi kullanmak daha mantıklı çünkü Regex ile yapılacak aramalarda ilk göndereceğimiz parametreyi Regex'in anlayacağı şekilde yollamamız gerektiği için (örneğin "." yollamak için "\." yollamamız gerekli gibi) hem gözden kaçabilir, hem de zorlayıcı olabilir.
 
Kaynaklar:

operation not valid due to the current state of the object hatası ve çözümü

Problem: Sayfadaki html input sayısı 1000 sayısını geçtiğinde HttpValueCollection metodu ThrowIfMaxHttpCollectionKeysExceeded() hata fırlatıyor.

Çözüm olarak :
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="<new value>" /> 
</appSettings>

Bu hatadan kurtulmak için <new value>  1000 den büyük olmalıdır.

Ancak siz bu sayıyı artırmak yerine sayfadaki html input sayısını küçültmeye çalışın.

ASCII Table - C# Konsol Uygulaması

static void Main(string[] args)
{
    Console.WriteLine(GetAsciiTable(128));
    Console.ReadLine();
}
 
public static string GetAsciiTable(int totalChar)
{
    return GetAsciiTable(totalChar, 0, totalChar, " ");
}
 
public static string GetAsciiTable(int totalChar, int startChar)
{
    return GetAsciiTable(totalChar, startChar, totalChar, " ");
}
 
public static string GetAsciiTable(int totalChar, int startChar, int charCountPerRow)
{
    return GetAsciiTable(totalChar, startChar, charCountPerRow, " ");
}
 
public static string GetAsciiTable(int totalChar, int startChar, int charCountPerRow, string seperator)
{
    StringBuilder sb = new StringBuilder();
 
    for (int i = 0; i < totalChar; i++)
    {
        sb.AppendFormat("{0}{1}", (char)(i + startChar), ((i + 1) % charCountPerRow == 0 && i > 0) ? "\r\n" : seperator);
    }
 
    return sb.ToString();
}

ASP.NET Page & Control Life Cycle



Time sync olmayan VirtualPC yaratmak

Elimizde varolan bir image dosyasını, sistem saatiyle sync olmadan çalıştırmak için aşağıdaki adımların izlenmesi gerekmektedir.
 
1.  Image dosyasını C:\Users\<User>\Virtual Machines içerisine kendi ismiyle bir klasör yaratarak kopyalayın. (Bu örnekte image ismimiz XYZ olsun)
2.  C:\Users\<User>\Virtual Machines\XYZ klasöründeki XYZ.vmc dosyasına çift tıklayarak imajınızı çalıştırın.
3.  Image’ınız çalıştıktan sonra sistemi kapatın. Bu işlem sayesinde C:\Users\<User>\Virtual Machines\XYZ.vmcx dosyası oluşmuş olacak.
4.  C:\Users\<User>\Virtual Machines\XYZ klasöründeki dosyaları silip kaynağından tekrar kopyalayın.
5.  C:\Users\<User>\Virtual Machines\XYZ\XYZ.vmc dosyasını notepad ile açıp aşağıdaki satırları ekleyin
 
<bios>
      <time_sync_at_boot type="boolean">false</time_sync_at_boot>
</bios>
 
<integration>
      <microsoft>
            <components>
                  <host_time_sync>
                        <enabled type="boolean">false</enabled>
                        <frequency type="integer">15</frequency>
                        <threshold type="integer">10</threshold>
                  </host_time_sync>
            </components>
      </microsoft>
</integration>
 
6.  Aşağıdaki scripti script.vbs olarak kaydedin ve komut satırından cscript script.vbs "XYZ" komutuyla çalıştırın.
 
'Title: Script to disable timesync for a VM.
 
'Usage: cscript ScriptName <vmname>
Set objVPC = CreateObject("VirtualPC.Application")
 
'Get virtual machine name from command-line parameter
Set objVM = objVPC.FindVirtualMachine(WScript.Arguments(0))
 
'Disable TimeSync During Boot Time
errReturn  = objVM.SetConfigurationValue("hardware/bios/time_sync_at_boot",false)
 
'Get object for GuestOS
Set objGuestOS =objVM.GuestOS
 
'Disable TimeSync During VM Execution
objGuestOS. IsHostTimeSyncEnabled = false
 
7.  XYZ.vmcx ile VirtualPC’nizi çalıştırabilirsiniz, artık sistem saati ile senkronize olmayacaktır.

MSSQL Replication

Sql Server aşağıdaki üç tip çoğaltmayı destekliyor:
  • · Transactional replication
  • · Merge replication
  • · Snapshot replication

Ana veritabanına Publisher, dağıtılacak veritabanlarına ise Subscriber diyoruz.

Transactional replication
Bu çoğaltma yöntemi veritabanındaki objelerin ve dataların snapshot’ının (birebir görüntüsünün) alınmasıyla başlıyor. Snapshot alındıktan sonra Publisher veritabanında oluşan data değişiklikleri ya da şema değişiklikleri anında (çok kısa bir gecikmeyle) Subscriber veritabanına dağıtılıyor. Publisher veritabanında oluşan data değişiklikleri Subscriber veritabanına aynı sırayla ve aynı transaction’larla dağıtıldığı için transaction tutarlılığı garanti ediliyor.

Bu replication yöntemini kullanmak aşağıdaki senaryolar için kullanışlı:
. Publisher veritabanında oluşan değişikliklerin yapıldığı haliyle Subscriber veritabanında olmasını istiyorsanız
. Publisher veritabanı ile Subscriber veritabanı arasındaki farkın minimum olmasını istiyorsanız
. Örneğin bir satır beş defa değiştiyse, son halinin değil de tüm 5 değişikliğin de sırasıyla Subscriber veritabanında oluşmasını istiyorsanız
. Publisher veritabanı yüksek insert, update ve delete hareketlerine sahipse
. Publisher ya da Subscriber veritabanı MsSql değilse

Default olarak, Subscriber veritabanı read-only olmalıdır çünkü Subscriber veritabanında yapılan değişiklikler Publisher veritabanına uygulanmaz ama Subscriber veritabanının update edilebilmesini sağlayan bir seçenek de mevcuttur.


Merge replication
Merge replication da transactional replication gibi Publisher veritabanının snapshotını alarak başlar. Daha sonra Publisher ve Subscriber’da oluşan değişiklikler triggerlar yardımıyla takip edilir. Subscriber network’e bağlandığı an Publisher ve Subscriber arasındaki tüm değişiklikler birleştirilir.

Merge replication aşağıdaki durumlar için uygun:
. Bir veyahut daha çok Subscriber aynı datayı değişik zamanlarda değiştirip, Publisher’a ve diğer Subscriber’lara dağıtmasını istiyorsanız
. Subscriberların datayı alıp üzerinde offline olarak çalışıp daha sonra senkronize etmesini istiyorsanız
. Her Subscriber’ın datanın değişik kısımlarına ihtiyacı varsa
. Çakışmalar olabileceği için, bunları farkedip çözebilmelisiniz
. Kullandığınız uygulamalar en son değişikliği istiyorsa, örneğin bir satır beş defa değiştiyse, beş değişikliği değil de en son halini istiyorsa

Merge replication birden çok uygulamanızın birbirinden bağımsız olarak çalışıp daha sonra bu bilgileri birleştirmek için kullanabileceğiniz bir yöntemdir.


Snapshot replication
Bu replication yöntemi güncellemeleri takip etmeden belirtilen zamanda tüm datayı birebir kopyalarak Subscriber veritabanını günceller.

Aşağıdaki durumlar için kullanılabilir:
. Datalar nadir olarak değişiyorsa
. Subscriber veritabanındaki dataların biraz eski olması kabul edilebilirse
. Varolan datanın küçük bir kısmı dağıtılıyorsa
. Varolan datanın büyük bir kısmı kısa bir aralıkta değişiyorsa
Transactional
Merge
Snapshot




TypeScript

Aslında daha çok DART'a benziyor ama arasındaki farkı Anders Hejlsberg şöyle açıklamış:

DART, tamamen Javascript'i yeniliyor. Yeni bir programlama dili ve yeni bir sanal makine. Kodunuzu Javascript'e çevirebiliyorsunuz fakat bunu yaparken yeni bir dilin semantiğini alıp Javascript'e benzetmeye çalışıyor. Script# aynı şeyi C# için, Google Web Toolkit ise JAVA için yapıyor. Bunu yaptıkları için karışıklığa ve maliyete sebep oluyorlar.

TypeScript ise herşeyden önce aslında Javascript, yeni bir dil öğrenmenize gerek yok, sadece parametrelerinize açıklamaları nasıl koyacağınızı öğrenmeniz yeterli ve bu o kadar da zor değil. İkinci ve asıl önemlisi öğrendiğiniz bu yeni şeyler ECMAScript 6 ile uyumlu (Javascript'in bir sonraki sürümü). Yani aslında TypeScript öğrenirken, Javascript öğreniyorsunuz. Ayrıca tüm diğer Javascript frameworklerini bu dille rahatlıkla kullanabilirsiniz.

Bu arada TypeScript açık kaynak kodlu bir proje.
http://typescript.codeplex.com

Açıklamanın tam metni:
http://www.eweek.com/developer/microsoft-delivers-typescript-a-better-javascript-for-big-apps/