Categories: Genel Posted by Admin on 9/19/2011 12:55 AM | Comments (0)

Yeni bir domaine taşınmanın vakti geldimi diye düşünürken kendimi blog için uygun bir domain almış olarak buldum. zor.lu adresi üzerinden subdomain tanımlamasıyla yayına devam edesim var ama henüz karar veremiyorum. Google app engine ile bir süpriz yapabilirim. Belkide biyografi sitesi yapıp tüm aile bireylerini soy ağacı uygulamasıyla yayınlayabilir her birey için de blog uygulaması imkanı sağlayabilirim.

Arama motoru oranları ya da ziyaretci sayıları konusunda herhangi bir endişem yok. Acıkcası bu oranlardaki değişimler umrumda değil ancak ölü linklerin peydahlanmasını da istemiyorum. Yeni numaram şu, buradan ulaşın gibi de olmuyor.

Blogengine hakkında da düşünüyorum, taşınmamla birlikte blog uygulamasını da değiştirmem pek bir şeyi etkilemeyecek gibi görünüyor. Umbraco fena gitmez diye düşüünyorum.

İşte böyle günlük. Karar verdiğimde bu yazı artık senin olmayabilir :)

Tags: , , , , | Categories: asp.net, c#, english, Genel Posted by Admin on 6/1/2011 11:45 AM | Comments (2)

This add-in project converts c# and vb.net codes in visual studio. Sometimes we need to convert code between c# and vb.net but convertion progress is very boring. Open the web browser, google it(c# to vb.net) and using some online code convertion service and oh, code is converted. Thats really boring and difficult way.

What does CodeCopy do?

CodeCopy is simple way to code convertion between c# and vb.net languages. You can copy any c# or vb.net code and paste visual studio whit Paste with CodeCopy. Thats detect your project language and converts code to target language(c# or vb.net). It's simple!

Works on Visual Studio 2005, 2008 and 2010.

Feature plan

  • Partial code converting: Converter runs on code blocks and covert code and comment code block when it is non convertable block. Notice convertable code blocks will be recover.
  • Smart error fixer: We work on generic errors because some error messages fixed programmaticaly. Eg: if error is "',' expected." then we fix this problem when inserted ',' character on required line and column.
  •  More effective code convertion

More...

Tags: , , , , | Categories: asp.net, c#, Genel Posted by Admin on 5/31/2011 2:02 PM | Comments (0)

Merhabalar, bir önceki yazımda da belirttiğim gibi c# ve vb.net arası otomatik kod dönüşümü sağlayacak bir eklenti geliştirdik. Talep yönünde geliştirme işlemine devam edeceğiz. Özetle eklenti kopyala yapıştır gibi basit bir işlemle     proje diline dönüştürülüyor ve kullanıma hazır olmuş oluyor. Şimdilik bu kadar bilgi vermekle yetiniyorum. Projeyi codecopy.codeplex.com adresinden takip edebilir yada indirip deneyebilirsiniz.

Kaynak kodları indirin

Eklentiyi indirin(Kurulum dosyası)

Tags: , , , , , , , | Categories: Genel Posted by Admin on 5/29/2011 12:43 PM | Comments (2)

Merhabalar, bu biraz tanıtım biraz da yorum alabilmek adına yazdığım ender bir yazıdır. Online bağlantı gereksinimi olmaksızın visual studio içerisinden c# veya vb.net kodunu otomatik birbirine dönüştüren bir eklenti geliştiriyoruz. Özetle kopyalanan bir vb.net okdunu yapıştırdığınızda projeniz c# ise yapışan kodun c# a dönüştürülmüş vb.net kodu olması ilk hedefimiz. Basit bir eklenti kabul ediyorum ancak faydalı olacağını düşünüyorum. Bu nedenle bu yazıyı okurken aklınızdan geçen (bu da olsun, şöyle olsun) fikirleri iletişim sayfasından göndermenizi rica ediyorum. 

Herkese faydalı olması dileğiyle...

Tags: , | Categories: Genel Posted by Admin on 3/17/2011 7:17 PM | Comments (0)

Merhabalar, bugün yaşadığım bir probleme yönelik bulduğum çözümü hemen payaşmak istiyorum. Basit bir uygulama geliştirdim, uygulamanın bir kaç tane dll dosyasına ihtiyacı vardı. Benimde sadece tek bir exe ile uygulamayı çalıştırabiliyor olmam gerekiyordu. Normal olarak uygulamanın referans dosyaları(dll) uygulama(exe) ile yan yana duracak şekilde derlenir. Eğer dll dosyalarını exe nin içine gömmek istiyorsanız ihtiyacınız olan şey ILMerge aracı.

Bu toolu şu linkten indirebilirsiniz. Kurulum işleminden sonra komut satırı üzerinden aşağıdaki gibi kullanılabilir.

      ilmerge /out:Olusacak.exe Program.exe Referans1.dll Referans2.dll

Bu şekilde referans kütüphaneleri uygulamaya gömdük fakat yeni bir referans eklersem komutun sonuna eklemem gerekecektir ve her seferinde bu komutu çalıştırmam gerekecektir. Buna çözüm olarak bazıları bu komutu bir .bat dosyasına yazıp derleme işleminden sonra bat dosyasını çalıştırıyor. Pek hoşuma gitmediği için örnek göstermeyeceğim. Bat dosyası da olsa en azından otomatik çalıştırılması gerekiyor.

ilmerge işleminin otomatize edilmesi için MSBuildTask işlevinden faydalanıp aşağıdaki xml kodunu proje dosyama ekledim.

 

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
  
  <Target Name="AfterBuild">    
    <CreateItem Include="@(ReferencePath)" Condition="'%(CopyLocal)'=='true' and '%(ReferencePath.IlMerge)'=='true'"> 
	<Output TaskParameter="Include" ItemName="IlmergeAssemblies"/>    
    </CreateItem>    
    <Message Text="MERGING: @(IlmergeAssemblies->'%(Filename)')" Importance="High" />     
    <Exec Command="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot; /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" />     
  </Target>

  <Target Name="_CopyFilesMarkedCopyLocal"/>

</Project>

 

Bu işlemin ardından projeyi derlediğimde eğer derleme işlemi başarılı ise ilmerge otomatik olarak tetikleniyor ve tüm referanslar ile birlikte tek bir exe dosyası oluşturulmuş oluyor.

Faydalı olması dileğiyle

Tags: , | Categories: asp.net, c#, Genel Posted by Admin on 12/8/2010 5:00 PM | Comments (0)

Kolaylaştırıcı sınıflardan bir diğeride MediaConverter. Bu sınıfla FFMpeg projesi kullanılarak video dosyalarını flv formatına dönüştürmeniz ve ekran görüntüsü almanız çok kolay. FFMpeg ve FlvTools2 uygulamalırını projenizde uygun konumlara yerleştirdikten sonra çalıştırma izini vermeyi unutmayın. İlgili sınıf:


namespace MuzoBlog.Core.Tools.MediaConverters
{
    using System;
    using System.Web;
    using MuzoBlog.Core.BussinessLogic.Medias;
    /// <summary>
    /// Ömer Faruk ZORLU
    /// 2010-12-08
    /// </summary>
    public abstract class MediaConverter    {
        private static string ffMpegPath = HttpContext.Current.Server.MapPath("~/files/exe/ffmpeg.exe");
        private static string flvToolPath = HttpContext.Current.Server.MapPath("~/files/exe/flvtool2.exe");
 
        public static bool Convert(string rawPath, string targetPath)
        {
            // Encoding process
            ConvertToFlv(rawPath, targetPath);
 
            if (System.IO.File.Exists(targetPath))
            {
                System.Threading.Thread.Sleep(250); // Wait for converters to release file
 
                EnsureBuffered(targetPath); // Fix buffer problem
 
                System.IO.File.Delete(rawPath);
 
                return true;
            }
 
            return false;
        }
 
        /// <summary>
        /// Converts FFMPeg supported media files to flv file.
        /// </summary>
        /// <param name="rawPath"></param>
        /// <param name="targetPath"></param>
        private static void ConvertToFlv(string rawPath, string targetPath)
        {
            System.Diagnostics.Process FFMpeg = new System.Diagnostics.Process();
            FFMpeg.StartInfo.FileName = ffMpegPath;
            FFMpeg.StartInfo.Arguments = "-y -i \"" + rawPath + "\" -f flv -ab 128 -ar 44100 -ac 1 -b 1000 -r 29.97 " +
                                            "-g 12 -qmin 3 -qmax 13 -sameq -s 320x240 \"" + targetPath + "\" ";
            FFMpeg.StartInfo.UseShellExecute = false;
            FFMpeg.StartInfo.CreateNoWindow = true;
            FFMpeg.StartInfo.RedirectStandardOutput = false;
            FFMpeg.Start();
 
            FFMpeg.WaitForExit();
        }
 
        /// <summary>
        /// Flv player buffer problem fixer. Use this method after flv convertion complated.
        /// </summary>
        /// <param name="targetPath"></param>
        public static void EnsureBuffered(string targetPath)
        {
            System.Diagnostics.Process FlvTool2 = new System.Diagnostics.Process();
            FlvTool2.StartInfo.FileName = flvToolPath;
            FlvTool2.StartInfo.Arguments = "-U " + targetPath;
            FlvTool2.StartInfo.UseShellExecute = false;
            FlvTool2.StartInfo.CreateNoWindow = true;
            FlvTool2.StartInfo.RedirectStandardOutput = false;
            FlvTool2.Start();
 
            FlvTool2.WaitForExit();
        }
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="videoPath">Video path</param>
        /// <param name="targetPath">Screen shot path</param>
        /// <param name="duration">00:00:10</param>
        public static void TakeScreenShoot(string videoPath, string targetPath, string duration)
        {
            System.Diagnostics.Process FFMpegResim = new System.Diagnostics.Process();
            FFMpegResim.StartInfo.FileName = ffMpegPath;
            FFMpegResim.StartInfo.Arguments = "-i " + videoPath + " -an -ss " + duration + " -r 1 -vframes 1 -s 320x240 -f mjpeg -y " + targetPath.Replace(".flv", "_k.jpg");
            FFMpegResim.StartInfo.UseShellExecute = false;
            FFMpegResim.StartInfo.CreateNoWindow = true;
            FFMpegResim.StartInfo.RedirectStandardOutput = false;
            FFMpegResim.Start();
            FFMpegResim.WaitForExit();
        }
    }
}
 
 
 

Tags: , | Categories: asp.net, c#, Genel Posted by Admin on 12/3/2010 10:20 PM | Comments (0)

Merhabalar, son günlerde kafamı oldukça meşgul eden bir konu hakkında bulduğum çözümü paylaşmak istiyorum. Senaryom şöyleydi: Halihazırda varolan bir kayıtın kopyasını alıp üzerinde bir kaç değiklik yapıp yeni kayıt olarak tekrar veritabanına kayetmem gerekiyordu. Bu işlemi yapmam gereken sınıf aşağıdaki gibidir:

Yine senaryoya göre bir arıza kaydı ilgili teknik personel tarafından sevk edilebilir işlevselliğini sağlamalıydı. Ancak sevk işlemi yapılırken ilgili kayıt kapatılmalı ve sevk edilen teknik personel'e yeni arıza kaydı olarak düşmeliydi. Bu durum için akla gelecek basit durumları açıklığa kavuşturmakta fayda var. İlk etapda bir akla gelebilecek çözümlerden bahsedelim.

1- Veritabanından ilgili kayıtın çekilmesinin ardından gerekli alanlar değiştirilir, yeni bir ArizaID verilir ve linq to sql'e al bunu ekle(InsertOnSubmit) denebilir ancak böyle bir işlevsellik malesef mevcut değil ve bu kayıt zaten var diye bir hata döndermesi çok olası oluyor.

2- Diğer bir yöntem de bir method oluşturup ariza sınıfının örneğini göndermemiz ve ilgili kayıttaki her bir alanı tek tek yeni arıza örneğine atamamız olabilir. Bu az önceki sorunu çözecektir ancak bir programcı böyle bir çözüm üretmemelidir diyerekten bunu es geçiyoruz. Çünkü tablo yapısında gerçekleşecek değişiklikler sonucunda devasa bug potansiyeli yüksek kod bloğumuz patlamaya hazır hale getirilmiş bomba gibi olacaktır.

3- 2. Akıla gelen method'tan yola çıkarak arıza sınıfını dinamik bir şekilde kopyalayıp ekleme yöntemine gidebiliriz. Bunun için izlenebilecek çeşitli yöntemler de mevcut ancak linqtosql ile çalıştığımızı unutmamakta da fayda var.

Kopayala işlemini yapacak aşağıdaki metottan bahsediyor olacağım. Methodlar alıntı olmakla beraber dayanıklı olduğunu ifade edebilirim. Metot parametre olarak altığı source değişkenini DataContractSerializer sınıfı yardımıyla memory'den okuyup yeni değişkenin memory adresine yazıyor. Böylece yeni bir nesne değeri hafızadakini yerini alıyor ve sonuç olarak bize yeni değişkeni dönderiyor. Böylece nesnenin birebir kopyasını elde etmiş oluyoruz. Kodlama dilinde vb.net de kullanmaya başladığımdan ötürü kodların vb.net karşılıklarını okuyor olacaksınız.

    <Extension()> _
Public Function CloneEntity(Of T)(ByVal source As T) As T
Dim dcs = New System.Runtime.Serialization.DataContractSerializer(GetType(T))
Using ms = New System.IO.MemoryStream()
dcs.WriteObject(ms, source)
ms.Seek(
0, System.IO.SeekOrigin.Begin)
Return DirectCast(dcs.ReadObject(ms), T)
End Using
End Function

 

İlgili metot elimizde olduğuna göre şöyle küçük bir kod örneğiyle neler olduğuna bakalım.

 

Dim db As New DBDataContext()
Dim oldArz As Ariza = (From p In db.Arizas
Where p.ArizaID
= arizaID
Select p).FirstOrDefault()

If oldArz Is Nothing Then
Throw New InvalidOperationException("Arıza kaydı bulunamadı")
End If

Dim newArz As Ariza = oldArz.CloneEntity() ' Arızanın kopyası oluşturuluyor

oldArz.ArizaDurum
= ArizaDurum.SevkEdildi

newArz.ArizaID
= Guid.NewGuid()
newArz.ArizaDurum
= ArizaDurum.IslemBekliyor

db.Arizas.InsertOnSubmit(newArz)
' Yeni arıza kaydı ekleniyor
db.SubmitChanges() 'Eski arıza kaydı gerekli düzenlemeler sonrasında yenisiyle birlikte kaydediliyor

 

Bu kod parçasını yazdıktan sonra da çalıştırdığımızda tam da CopyEntity methodu çağırıldığı sırada aşağıdaki hatayı alıyor olacağız.

"Object graph for type 'Ariza' contains cycles and cannot be serialized if reference tracking is disabled."

Bu hatayı almamızın asıl sebebi Ariza sınıfının temsil ettiği tablo ile ilişkilendirilmiş diğer tabloların varlığıdır. LinqToSql tablo sınıflarını oluşturuken her bir ilişki için ilgili sınıfa ilişkili tablo sınıfının koleksiyon karşılığını ekler. Bu nedenle de DataContractSerializer bu sınıfı memory'den okuyup serileştirmek istediğinde yukarıdaki hatayı fırlatır. Yapılması gereken şey linq to sql nesnesinin serileştirme modunun none olan değerinin Unidirectional(tek yönlü) olarak değiştirilmesidir. Bu işleminde ardından artık yazdığımız kod sorunsuz çalışmaya başlayacaktır.


Bazıları 2. yöntemi tercih edebilir ancak sağlıksız kod yazılmış olacaktır ayrıca benzer şekilde farklı tablolarında bu tarz bir işleme maruz kalması gerekirse hepsi için benzer kodun yazılması gerekecektir. Bu da daha kötü kodların ortalıkta gezmesine sebep olacaktır. Özetle, ikinci methodu yazmamak için 3 gün bekledim ve istediğim sonuca ulaştım. Umarım beklemek için vaktiniz ve bunu anlayışla karşılayabilecek yöneticileriniz vardır. Çünkü bu süre boyunca kodlamanın bu kısımı felç oldu diyebilirim :) Sonuç olarak gayet mutluyuz. Yaşasın güzel kod :)

Kayifli kodlamalar diliyorum.

Ömer Faruk ZORLU