SQL Server 2012 ile Otomatik Yedek Alma

Okuma Süresi: 2 dakika

SQL Server üzerinde bulunan birçok veritabanımızın otomatik olarak yedeğini almak isteyebiliriz. Bu işlem için SQL Server kurulumu ile gelen SQL Server Agent’tan yararlanabiliriz.

İlk önce SQL Server Management Studio’yu çalıştırıyoruz ve veritabanı sunucumuza ait bilgilerle login oluyoruz. Daha sonra Management menüsünün altında bulunan Maintenance Plans‘a sağ tıklıyoruz ve New Maintenance Plan‘a tıklıyoruz.

Eğer New Maintenance Plan’a tıkladıktan sonra “‘Agent XP’s component turned off as part of the securityconfiguration for this server.’” diye bir hata alıyorsanız SQL Server Agent servisinin kapalı olduğundan dolayı almaktasınızdır. Bu sorunun çözümü için SQL Server Configuration Manager uygulamasını çalıştırın ve sol taraftan SQL Server Services‘a tıklayın. Sağ bölmeden SQL Server Agent’a sağ tıklayın ve açılan menüden Özellikler‘e tıklayın.

Gelen ekranın Log On sekmesinde en altta bulunan Start‘a basın ve SQL Server Agent servisinin çalışmasını sağlayın.

Daha sonra Service sekmesine geçin ve Start Mode özelliğini Automatic yapın. Bu sayede bilgisayarınız her başladığında otomatik olarak SQL Server Agent servisi de başlamış olacaktır.

Şimdi SQL Server Management Studio’ya geri dönelim ve New Maintenance Plan işlemini tekrar yapalım. Gelen ekranda plana bir isim verelim OK tuşuna basalım.

Bu işlemi yaptıktan sonra Plan ekranımız geldi. Sol tarafta Toolbox alanıdan Back Up Database Task‘ı sürükleyip sağ tarafa bırakalım.

Eklediğimiz task’a iki kere tıklayarak özelliklerine ulaşalım. Aşağıdaki gibi bir ekran gelecektir.

Connection bölümünden hangi veritabanı sunucusu üzerinde işlem yapmak istediğimizi seçiyoruz. Biz bağlantı kurduğumuz veritabanı sunucusu üzerinde bu işlemleri gerçekleştireceğimizden dolayı Local Server Connection‘ı seçili bırakıyoruz.

Backup Type ise Full, Differencial ve Transactional Log olmak üzere 3 tipten oluşmaktadır. Tam veritabanı yedeği alacağımızdan dolayı Full’u seçili bırakıyoruz.

Databases bölümüne tıklayınca aşağıdaki gibi bir ekran gelmektedir.

Bu ekranda hangi türde veritabanlarının yedekleneceğini seçebiliyoruz. Tüm veritabanlarını yedeklemek için All databases, sistem veritabanlarını yedeklemek için System databases, tüm kullanıcı veritabanlarını yedeklemek için All user databases veya sadece belirli veritabanlarını yedeklemek için These databases‘a tıklayarak yedeklenecek veritabanlarını seçebiliyoruz.

Create backup file for every database‘i işaretliyoruz. Bu sayede veritabanı sunucusunda bulunan tüm veritabanları ayrı ayrı dosyalar halinde Folder bölümünde belirttiğimiz yerde yedeklenecektir. İsterseniz Backup file extension bölümünden yedek dosyalarının uzantılarını da değiştirebilirsiniz. Varsayılan olarak bak olarak gelmektedir. OK düğmesine basarak değişikleri kaydedelim.

Şimdi ise oluşturduğumuz task’ın otomatik olarak belirli saatte çalışmasını sağlamaya geldi. Plan bölümünde bulunan takvim ikonuna tıklıyoruz ve New Job Schedule ekranının açılması sağlıyoruz. Aşağıdaki gibi bir ekran gelecektir.

Name alanına schedule ismi verebiliriz.

Schedule type‘ı Recurring yaparak belirli bir döngü şeklinde çalışacağını belirttik.

Frequency bölümünde bulunan Occurs, Daily, Weekly ve Monthly olmak üzere üç seçenek almaktadır. Bu zamanlamanın hangi aralıklarla çalışması gerektiğini belirtir. Her gün yedek almak istediğimizden bu seçeneği Daily yapıyoruz ve Recurse every değerini ise 1 yapıyoruz. Bu sayede hergün yedek alınacaktır.

Daily Frequency altında bulunan Occurs once at ise yedeğin hangi saat, dakika ve saniye alınacağını belirtir. Buraya sunucunuzun en az kullanıldığı saati girebilirsiniz.

Duration bölümünde bulunan End date‘e bir tarih seçerseniz oluşturulan zamanlama o tarihi geçtikten sonra çalışmayacaktır. No end date‘i seçerseniz zamanlama hergün çalışacaktır.

Ayarlamaları yaptıktan sonra OK düğmesine basıp ayarları kaydedelim. Bunu yaptıktan sonra artık sunucumuz hergün otomatik olarak belirlediğimiz yere yedekleri alacaktır.

Ubuntu 12.04’te root şifresini değiştirme

Okuma Süresi: 1 dakika

DigitalOcean üzerinden VPN Server kurmak amaçlı bir VPS server almıştım ancak oluşturulan VPS’in root şifresi haliyle karmaşıktı. Bunun için Terminal’e girip su komutuyla root yetkisini aldıktan sonra aşağıdaki komutu yazıyoruz:

sudo -i

Komutu yazıp Enter tuşuna bastıktan sonra aşağıdaki komutu yazalım:

passwd

Komutu yazdıktan sonra şifreyi iki kere girerek yeni root şifremiz tanımlanmış olacaktır.

Ayrıca normal yetkideki kullanıcıların şifresini değiştirmek için aşağıdaki komut kullanılır:

sudo passwd kullaniciadi

C# ile SVG’den PDF’e Dönüştürme

Okuma Süresi: 1 dakika

C# ile SVG ile oluşturulan grafikleri PDF çevirmek için internette pek çok 3. parti kütüphaneler bulunmaktadır. Ancak bu kütüphanelerin çoğu ücretlidir.

Inkscape ücretsiz bir vektörel grafik yazılımıdır. Inkscape’i komut satırından çalıştırarak çeşitli işlemleri yaptırabiliyoruz. Bizde uygulamamız içerisinden Inkscape’i çalıştırarak SVG formatındaki dosyalarımızı PDF formatına çevirebiliriz.

İlk önce buraya tıklayarak Inkscape’i bilgisayarımıza indiriyoruz. Daha sonra Visual Studio üzerinde bir Windows Form projesi açalım ve projemizin ana dizinine Inkscape klasörünü kopyalayalım. Aşağıdaki şekilde formumuzu tasarlayalım.

Formu bu şekilde tasarladıktan sonra aşağıdaki şekilde kodlarımızı yazalım.

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace SVGtoPDF
{
    public partial class Form1 : Form
    {
        string SVGFile = String.Empty;
        string PDFFile = String.Empty;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnSVGSec_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog dialog = new OpenFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    SVGFile = dialog.FileName;
                    txtSVG.Text = SVGFile;
                }
            }
        }

        private void btnPDF_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    PDFFile = dialog.FileName;
                    txtPDF.Text = PDFFile;
                }
            }
        }

        private void btnDonustur_Click(object sender, EventArgs e)
        {
            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.FileName = Environment.CurrentDirectory + "\\Inkscape\\inkscape.exe";
            processInfo.Arguments = String.Format("--without-gui --export-pdf=\"{0}\" \"{1}\"", txtPDF.Text, txtSVG.Text);
            processInfo.WindowStyle = ProcessWindowStyle.Hidden;

            Process process = Process.Start(processInfo);
            process.WaitForExit();

            MessageBox.Show("Dönüşüm tamamlanmıştır.");
        }
    }
}

Yazdığımız kodda Inkscape’i çalıştırdığımız argümanlar önemlidir. –without-gui Inkscape’in GUI modunda açılmamasını belirttik. –export-pdf parametresi ise PDF dosyanın nereye kaydedileceğini belirtir. Son parametre ise dönüştürülecek SVG dosyasını gösterir.

Uygulamanın kaynak kodlarını indirmek için tıklayınız.

T-SQL’de Case Insensitive Sorunu

Okuma Süresi: 1 dakika

Bir T-SQL Like sorgusu yazarken gönderdiğim anahtar kelimenin karşılığını sorgu sonucunda göremiyordum. Problemin nedeni ise sorgumun case sensitive (büyük-küçük harf duyarlı) uyumuna göre sorgulamasından kaynaklanmaktaydı. Örnek olarak aşağıdaki gibi bir sorgu yazmıştım:

SELECT * FROM urun WHERE urunadi LIKE '%ice%'

Normalde Ice ve ice kelimeleri içinde geçen kayıtları döndürmesi gerekirken sadece ice içeren kayıtlar sorgu sonucu olarak dönüyordu. Sorunun çözümü için sorgumun sonuna karakter setinin case insensitive versiyonunu belirtmem yeterlidir. Sorgum aşağıdaki şekilde olmuştur:

SELECT * FROM urun WHERE urunadi LIKE '%ice%' COLLATE sql_latin1_general_cp1_ci_as

Sizde sorgunun sonuna gelecek karakter setleri listelemek için aşağıdaki sorguyu kullanabilirsiniz.

SELECT * FROM fn_helpcollations() WHERE name LIKE 'Turkish%' AND name LIKE '%CI%'

CI yerine CS yazarsanız Case Sensitive (büyük-küçük harf duyarlı) karakter setlerini listelemiş olursunuz. CI ise Case Insensitive (büyük-küçük harf duyarsız) olmaktadır.

Repository Pattern

Okuma Süresi: 1 dakika

Büyük projeler geliştirirken yaşadığımız en büyük sıkıntı kod tekrarlarıdır. Özellikle iş katmanımızda veritabanına insert, update, delete yaparken birçok tekrar yapmaktayız. Repository pattern bizi bu dertten kurtarmaktadır. Bu yazımızda Entity Framework ile repository pattern’ın nasıl kullanılacağını öğreneceğiz.

İlk önce NuGet Package Manager kullanarak Entity Framework kütüphanesini projemize ekliyoruz.

Entity Framework'ü projeye ekliyoruz.

Daha sonra projemize bir interface ekliyoruz ve aşağıdaki kodları yazıyoruz.

using System;
using System.Linq;
using System.Linq.Expressions;

namespace RepositoryPattern
{
    interface IRepository<T>
    {
        void Insert(T entity);
        void Delete(T entity);
        IQueryable Search(Expression<Func<T, bool>> predicate);
        IQueryable GetAll();
        T GetById(int id);
    }
}

Bu yazdığımız interface yazacağımız repository sınıfımız için bir şablon olacaktır. Oluşturduğumuz interface T tipinde generic nesne tipi almaktadır. Projemize repository kodlarımızı yazacağımız sınıfımız ekleyelim.

using System;
using System.Data.Entity;
using System.Linq;

namespace RepositoryPattern
{
    public class Repository<T> : IRepository<T> where T : class
    {
        DbSet set;

        public Repository(DbContext context)
        {
            set = context.Set<T>();
        }

        public void Insert(T entity)
        {
            set.Add(entity);
        }

        public void Delete(T entity)
        {
            set.Remove(entity);
        }

        public IQueryable Search(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return set.Where(predicate);
        }

        public IQueryable GetAll()
        {
            return set;
        }

        public T GetById(int id)
        {
            return set.Find(id);
        }
    }
}

Repository sınıfımızı IRepository sınıfından türettik ve interface üyelerini implement ettik. Metot gövdelerini de Entity Framework metotlarıyla yazdık. Kodumuzdaki T tipi bir entity tipi temsil etmektedir. Şimdi yazdığımız kodun nasıl kullanıldığını örnek olarak görelim.

using System;

namespace RepositoryPattern
{
 class Program
 {
 static void Main(string[] args)
 {
 Repository<Categories> categories = new Repository<Categories>(new NorthwindEntities());

foreach (Categories item in categories.GetAll())
 {
 Console.WriteLine(item.CategoryName);
 }
 }
 }
}

Kodda gördüğünüz gibi T tipi olarak NortwindEntities altında bulunan Categories tipi verilmiştir. Artık repository nesnemiz Categories tipini kullanarak çalışacaktır. Kodu derleyip çalıştırdığımızda aşağıdaki ekran görüntüsü gelecektir.

SignalR ile Gerçek Zamanlı Web Uygulamaları

Okuma Süresi: 1 dakika

SignalR, WebSocket protokolünü kullanarak gerçek zamanlı uygulamalar geliştirebileceğimiz bir kütüphanedir. Bugün basit bir sohbet uygulaması yapacağız.

Şimdi bir tane ASP.NET projesi açıp Package Manager Console’dan aşağıdaki komutu girerek SignalR için gerekli dosyaları projemize ekleyelim. (Package Manager Console’a ulaşmak için View->Other Windows -> Package Manager Console menüsünü kullanabilirsiniz.)

Install-Package Microsoft.AspNet.SignalR

Projemize bir sınıf ekleyelim ve aşağıdaki kodları yazalım.

public class ChatHub : Hub
    {
        public void SendMessage(string message)
        {
            Clients.All.sendMessage(message);
        }
    }

Burada yazdığımız kodda sisteme bağlı tüm kullanıcılara yazılan mesajı iletiyoruz. Sunucu tarafındaki kodlama bu kadardır. Şimdi istemci tarafında kodlamaya başlıyoruz.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SignalRExample.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="Scripts/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="Scripts/jquery.signalR-2.0.2.min.js"></script>
    <script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>
    <script type="text/ecmascript">
        $(function () {
            var chatHub = $.connection.chatHub;

            chatHub.client.receiveMessage = function (message) {
                $(".message").append(message + "<br>");
            };

            function SendMessage() {
                var message = $(".messageText").val();

                if (message != "" && message != null) {
                    chatHub.server.sendMessage(message);
                }
            }

            $(".send").click(function (e) {
                SendMessage();
            });

            $.connection.hub.start();
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <input type="text" class="messageText" /><input type="button" class="send" value="Gönder" />
        <div class="message">
        </div>
    </form>
</body>
</html>

Javascript’te yazdığımız kodları tek tek açıklyalım:

  • var chatHub = $.connection.chatHub; satırı ile Hub sınımıfımızın JavaScript kısmında erişebilmek için yazdık. Sınıfımızın ismi Javascript tarafında camel case olarak yazılmıştır. Eğer pascal case veya başka bir adlandırma istersen sınıfımıza [HubName(“ChatHub”)] şeklinde yazabilirsiniz.
  • chatHub.client.receiveMessage satırı ile sunucu tarafında hub tetiklendiğinde çalışacak olan metotdur. Biz burada tetiklendiğinde div içerisine mesajı yazmaktayız.
  • chatHub.server.sendMessage(message); satırı ile sunucu tarafında bulunan SendMessage metodunu çağırıyoruz.
  • $.connection.hub.start(); satırı ile sayfamız yüklendiğinde hub’ın çalışmasını sağlıyoruz.

Kodumuzu derleyip iki farklı tarayıcı ekranında test edince aşağıdaki gibi bir ekran görüntüsü çıkmaktadır:

SignalR ile gerçek zamanlı web uygulamaları

Örnek projenin kodlarını indirmek için tıklayınız.

Trafi: Gerçek zamanlı toplu taşıma uygulaması

Okuma Süresi: 1 dakika

Trafi, destek verdiği şehirdeki toplu taşıma araçlarını gerçek zamanlı olarak analiz edip rota alternatiflerini sunan bir uygulamadır. Şu an destek verdiği ülkeler arasında Türkiye, Litvanya, Letonya ve Estonya bulunmaktadır. Türkiye’de İstanbul, Ankara ve İzmir şehirlerinde bulunan toplu taşıma sistemini kullanmaktadır.

Uygulama başlangıç, bitiş noktalarını sizden istemekte ve buna uygun rota alternatiflerini ekrana getirmektedir. Ekrana gelen rotaların yolculuk sürelerini ve ödeyeceğiniz ücreti de hesaplamaktadır. Ayrıca  zaman bilgisini de vererek rotaları filtreleyebiliyorsunuz.

Herhangi bir rota seçildiğinde gelen ekranda rotanın haritası, altında ise bineceğiniz toplu taşıma araçlarının kodları ve hangi duraklarda iniş-biniş yapacağınız zaman bilgisiyle beraber yazmakta.

iOS kullanıcıları buradan, Android kullanıcıları ise uygulamayı buradan  cihazlarına kurabilirler.

Uygulamanın web sitesine ise buradan ulaşabilirsiniz.