Arkadaşlar bundan sonra her ayın son günü bir sonraki ay sitemde yayınlanacak olan makalelerin, kod parçacıkların, programların kısacası bir sonraki ay ne bulacağınızın özetini yazacağım(Tabi ekstralar olursa onlarda süpriz olur). Bunu yapmamdaki amaç burada duyurduktan sonra artık bu görevleri kendime bir zorunluluk olarak görmek ve yazmak. Umarım bunda başarılı olurum. İşte önümüzdeki ay sitemdeki makalelerin başlıkları;
– Programımız Için ‘Live Update’ Programı!
– ‘C# ile Windows Formuna Login Girişi!’ Makalesinin Programı
– C# ile Toplu Mail Gönderme Programı ve Anlatımı.
– Sürükle-Bırak özelliği.
– Programımıza çoklu dil desteği nasıl yapabiliriz.
– AES Şifreleme algoritması ile veri şifreleme, çözümleme.
Arkadaşlar yeni arayüz ile sizlere yazmaya devam edeceğim. Bütün bir pazar günümü ayıraraktan sonunda bu siteyi yapabildim. Her ne kadar wordpress kolay denilsede ben baya zorlandım, web sitesi yapma işine hiç bulaşmamıştım, birkez daha ne kadar doğru bir karar verdiğimi anladım :), bana göre değilmiş. Bu işi yapan arkadaşların Allah yardımcısı olsun. Bu pazar günümde bana destek olan Erkan abi’ye teşekkür ederim (birde yardım mı aldın demeyin 🙂 ). Host aktarma vs. işlerinde bana baya bir yardımı dokundu. Artık ‘Download’ bölümümüz de olduğuna göre sizlere buradan kod parçacıkları, projeler, programlar vb. ekleyebileceğim. Yeni sitemin ilk yazısını da böylelikle bitirmiş olayım..
Programı çalıştırdığınızda karşınıza şöyle bir hata çıkıyorsa; ‘The ‘Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine.’ yapmanız gereken çok basit bir işlem. Projenize sağ tıklayıp ‘Properties->Build->Platform Targer->x86’ olarak derleyip tekrar çalıştırdığınızda probleminiz çözülmüş olacaktır. Sorunun çözümünden sonra nedeninide açıklayalım, projenizde Access veya Excel kullanıyorsanız 64bit işletim sistemlerinde karşınıza bu hata çıkacaktır şayet makinede Office uygulaması yüklü değilse. Jet Oledb uygulaması sistemde yüklü değilse, uygulama 64-Bit işletim sistemini desteklemiyorsa veya Access yada Excel uygulamamıza 64bit işletim sistemlerinde erişemiyorsak bu hata ile karşılaşabiliriz.
Uygulamanızda teknik destek için, dosya gönderimi vb. ihtiyaçlar için mail gönderimi gerekebilir. Ben Gmail ile nasıl bu işlemi yapılacağını anlatacağım ama hangi mail servisiniz kullanıyorsanız onun port numarasını ve smtp adresini alarak gönderbilirsiniz, gmail olmak gibi bir zorunluluğu yok.
Burada kendi kendimize bir mail göndermiş oluyoruz. Textbox ile kullanıcının mail adresini alıp geri dönüş yapabiliriz. ‘Yolla_SendCompleted’ bu fonksiyonun altında başarılı ise kullanıcıya otomatik bir mesaj yollayabiliriz. Kod kısmını inceleyecek olursak, MailMessage türünden MailYolla sınıfı oluşturuyoruz, burada Mail’i kime göndereceğimizi, mesajımızı, eklenecek dosya varsa eklenecek dosyaları bu sınıfın özelliklerinden faydalanarak yapıyoruz. Ardından SMTP türünden Yolla adında bir sınıf değişkeni oluşturuyoruz. Bu sınıfın özelliklerine de port, mail adresi, mail şifresi vb. özellikleri giriyoruz ve en son olarak Yolla.SendAsync(…) fonksiyonu ile maili gönderiyoruz. ‘Yolla_SendCompleted’ isimli fonksiyon mail gönderme işlemi başlayınca tetiklenir ve işlemler yapılır. Umarı faydalı olur sizlere…
Filmlerden gördüğümüz kadarıyla Amerikada hemen her evin bir garajı var. Ilk bakışda bir garajın sadece araba park etmek için kullanıldığını ve Amerikan halkının çok fazla lüksüne düşkün olduğunu ve bu yüzden de yerleşim birimlerini öyle dizayn ettiklerini düşünmüştüm. Ama sonraları büyük firmaların kuruluş hikayelerini okuduğumda bu garaj’ların ne kadar önemli olduğunu, insanların akıllarına geldikleri şeyleri denemek için mükemmel bir yer olduğunu anlamaya başladım. Microsoft’un sahibi Bill Gates’in bir garaj’da yazılım sektörüne ayak bastığı söylenir. Yine Apple’in kurucularından Steve Jobs’da Apple’in temellerini bir garaj’da atmışdır. Bu örnekleri daha da çoğaltmak mümkün. Benim merak ettiğim ise, acaba Türkiyedeki evlerde de garaj olsaydı ülkemizden bir dünya markası çıkarmıydı? Kim bilir…. 🙂
Yaptığımız uygulamalarınçalışması için önceden bir ‘Kullanıcı Adı’ ve ‘Şifre’ sorarak çalışmasını isteyebiliriz. Bunun için bir çok algoritma geliştirilebilir. Bu makalede benim izleyeceğim yol, ‘Kullanıcı Adı’ ve ‘Şifre’ bilgilerini bir veritabanında tutmak olacak, hatta kullanıcının ‘Yetki’lerini de veritabanında tutarak uygulamamızda kullanıcıya özel yetkiler verebiliriz. Aşağıdaki resimde kullanıcı ve yetki bilgilerinin veritabanı tasarımı SQL Server 2005’de yapılmış olarak gösterilmektedir.
Tasarımı incelersek; ‘Yetki’ tablosu bizim uygulamamıza özel yetkileri içeriyor. Mesela bir ürün takip otomasyon’u yapıyorsak, ‘Stok Gir’, ‘Stok Çık’ bunlar yetki olabilir ve depo bölümünü ilgilendiren yetkilerdir, aynı şekilde ‘Cihaz Üretime Hazırla’ gibi bir yetki’de üretim bölümünü ilgilendiren bir yetkidir. Uygulamamızda birde ‘Admin’ yetkisi olur bu yetki de yeni kullanıcı ekleyebilir, yetkileri değiştirebilir. Bunu yapması için de Yetkilerin adlarını da tutmamız Admin için daha anlaşılır yapar. ‘Kullanicilar’ tablosuda ‘KullaniciNo’, ‘KullaniciSifre’ ve ‘KullaniciAdi’ tutar bu tablo da ‘Kullanıcı Adı’ ve ‘Şifre’ bilgileri tutulur. ‘Kullanıcı No’ tek bir ‘Kullanıcı Adı’ ve ‘Şifre’ olacağı için primary key olarak tanımlanmışdır. Son olarak ‘Izin’ tablosu da ‘Kullanıcı No’, ‘Yetki No’ ve ‘ErisebilirMi’ sütunlarından oluşuyor. Bu tabloyu incelersek, Kullanıcı No’yu primary key yapamayız çünkü bir kullanıcınınbirden fazla yetki’si olabilir, yetki’yide primary key yapamayız çünkü bir yetki birden fazla kullanıcı için kullanılabilir, ‘ErisebilirMi’ sütunuda zaten primary key olması söz konusu değil, bu tablo KullanıcıNo ve Yetki tablosunun birbirine bağlayan bir tablodur. Veritabanı kısmı tasarımımız bittikden sonra şimdi uygulamamızı tasarlayalım.
‘Kullanıcı Adı’ ve ‘Şifre’ soran basit bir form tasarımı hazırladık. Tüm menüler deaktif, kullanıcı şifre girmeye başladığı zaman ‘Tamam’ butonuda aktif olacak şekilde hazırladık. Şimdi veritabanına birkaç kullanıcı, yetki ve izin ekleyelim.
Yukarıda bazı yetki’ler, kullanıcılar ve izin’ler belirledik, kullanıcıya göre yetki verdik. Şimdi farklı kullanıcılarla giriş yapalım ve bakalım uygulamamızda doğru yerler aktif oluyor mu. Murat kullanıcısının sadece ‘Stok Gir’ ve ‘Stok Çık’ yetkisi verdik, Burak kullanıcısına bu yetkileri vermedik, sadece ‘Admin’ ve ‘Ürün Hazırlama’ yetkisi verdik.
Formumuzdan ‘Murat Özkan’ kullanıcı adı ile giriş yapıldığında;
‘Burak Özkan’ kullanıcı adı ile giriş yaptığında;
Farklı kullanıcı girişlerinde farklı yerler aktif oldu, peki bunu nasıl yaptık? İşin kod kısmını biraz inceleyelim. Önce ‘Tamam’ butonunun ‘Click’ eventinde olanları yazalım;
Kod’u incelediğimizde veritabanı’nın ‘Kullanıcı’ tablosundan ‘Kullanıcı Adı’na göre şifresini alıyoruz ve girilen şifreyle karşılaştırıyoruz. Eğer şifre doğruysa yetkilerini yüklüyoruz aksi durumda hata verip hiçbir menüyü aktif etmeden fonksiyonu bitiriyoruz.Şimdi ‘YetkileriniYukle()’ fonksiyonunu inceleyelim;
private bool YetkileriniYukle()
{
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString; cnn.Open();
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter("select YetkiNo, ErisebilirMi from Izin where KullaniciNo = '" + KullaniciNo + "'", cnn);
sda.Fill(ds);
if ((ds.Tables.Count == 0))
{
MessageBox.Show("Yetkiler Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
for (int i = 0; i < ds.Tables[0].Rows.Count; ++i)
{
int yetkiIndis = (int)ds.Tables[0].Rows[i][0];
YetkiDizisi[yetkiIndis] = (bool)ds.Tables[0].Rows[i][1];
}
return true;
}
Bu fonksiyonda da KullaniciNo’ya göre Izin tablosundan yetkileri aldık, bir tane global YetkiDizi’miz var, veritabanından verdiğimiz yetkilere göre YetkiDizi’si dolduruluyor, yetkiIndis’de sıralı olmayacağı için Izın tablosundanki YetkiNo’ya göre dolduruluyor böylece programda ki indis’le veritabanında ki YetkiNo aynı olmuş oluyor.Son olarakda kullanıcı ekleme, silme, şifre değiştirme ve kullanıcının yetkilerini belirleme kısmını yapalım;
Yukarıdaki şekilde form’larımızı tasarladık, bu işlemleri yapmak için ‘Stored Procedure’ kullanacağız. Ilk olarak Kullanıcı Sil formunu inceleyelim;
Form’un Load kısmı ve button1_Click event’i şöyle;
Form ilk açıldığında Kullanıcılar veritabanından yükleniyor, ‘Kullanıcı Sil’ butonunda SQL Serverda hazırladığımız ‘@KullanıcıNo’ parametresi alan stored procedure çağırıyoruz;
Stored Procedure;
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciSil]@KullaniciNo intasbeginbegin tran
begin try delete from Izin where KullaniciNo = @KullaniciNo end try begin catch rollback tran return end catch
begin try delete from Kullanicilar where KullaniciNo = @KullaniciNo end try begin catch rollback tran return end catch
commit tran end
Yetkilendirme ayarları formunu belirlediğimiz yetkilerin isimlerine sahip olan checkBox ekliyoruz. FormLoad kısmında yine kullanıcıları yüklüyoruz, seçilen kullanıcıların yetkileri seçilmiş oluyor.FormLoad ve ‘UYGULA’ butonun kod kısmı aşağıdaki gibi;
private static CheckBox[] cbDizi = new CheckBox[7];
public string KullaniciAdi;
public int KullaniciNo;
private DataSet dsKullanicilar;
private void YetkilendirmeAyarlari_Load(object sender, EventArgs e)
{
cbDizi[0] = Yetki0;
cbDizi[1] = Yetki1;
cbDizi[2] = Yetki2;
cbDizi[3] = Yetki3;
cbDizi[4] = Yetki5;
cbDizi[5] = Yetki6;
cbDizi[6] = Yetki13;
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
cnn.Open();
dsKullanicilar = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter("select * from Kullanicilar", cnn);
sda.Fill(dsKullanicilar);
if (dsKullanicilar.Tables.Count == 0)
{
MessageBox.Show("Kullanıcılar Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
for (int i = 0; i < dsKullanicilar.Tables[0].Rows.Count; ++i)
{ comboBox1.Items.Add(dsKullanicilar.Tables[0].Rows[i][2].ToString()); }
}
private void button1_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Yetkileri Değiştirmek İstediğinize Eminmisiniz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
{ return; }
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "up_KullaniciYetkiDegistir";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@KullaniciNo", KullaniciNo);
cmd.Parameters.AddWithValue("@Yetki0", Yetki0.Checked);
cmd.Parameters.AddWithValue("@Yetki1", Yetki1.Checked);
cmd.Parameters.AddWithValue("@Yetki2", Yetki2.Checked);
cmd.Parameters.AddWithValue("@Yetki3", Yetki3.Checked);
cmd.Parameters.AddWithValue("@Yetki5", Yetki5.Checked);
cmd.Parameters.AddWithValue("@Yetki6", Yetki6.Checked);
cmd.Parameters.AddWithValue("@Yetki13", Yetki13.Checked);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
MessageBox.Show("Yetkiler Başarıyla Değiştirildi.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
cnn.Open();
for (int i = 0; i < dsKullanicilar.Tables[0].Rows.Count; ++i)
{
if ((string)dsKullanicilar.Tables[0].Rows[i][2] == comboBox1.Text)
{ KullaniciNo = (int)dsKullanicilar.Tables[0].Rows[i][0]; }
}
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter("select YetkiNo, ErisebilirMi from Izin where KullaniciNo = '" + KullaniciNo + "'", cnn);
sda.Fill(ds);
if ((ds.Tables.Count == 0))
{
MessageBox.Show("Yetkiler Yüklenemiyor.", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
for (int i = 0; i < ds.Tables[0].Rows.Count; ++i)
{
int yetkiIndis = (int)ds.Tables[0].Rows[i][0];
cbDizi[yetkiIndis].Checked = (bool)ds.Tables[0].Rows[i][1];
}
}
Her kullanıcı için cbDizi setleniyor. cbDizi, chechBox’lardan oluşan bir dizi ve veritabanımızdaki YetkiNo ile aynı indis’e sahip.
Stored Procedure;
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciYetkiDegistir]
@KullaniciNo int,
@Yetki0 int,
@Yetki1 int,
@Yetki2 int,
@Yetki3 int,
@Yetki4 int,
@Yetki5 int,
@Yetki6 int,
as begin
update Izin set ErisebilirMi = @Yetki0 where KullaniciNo = @KullaniciNo and YetkiNo = 0
update Izin set ErisebilirMi = @Yetki1 where KullaniciNo = @KullaniciNo and YetkiNo = 1
update Izin set ErisebilirMi = @Yetki2 where KullaniciNo = @KullaniciNo and YetkiNo = 2
update Izin set ErisebilirMi = @Yetki3 where KullaniciNo = @KullaniciNo and YetkiNo = 3
update Izin set ErisebilirMi = @Yetki4 where KullaniciNo = @KullaniciNo and YetkiNo = 4
update Izin set ErisebilirMi = @Yetki5 where KullaniciNo = @KullaniciNo and YetkiNo = 5
update Izin set ErisebilirMi = @Yetki6 where KullaniciNo = @KullaniciNo and YetkiNo = 6
end
Kullanıcı şifresini değiştirmek isteyebilir, bunun için ana form’dan giriş yaptıkdan sonra aşağıdaki işlemle kendi şifresini değiştirebilir. ‘DEĞİŞTİR’ butonuna basıldıkdan sonra yapılan işlemler aşağıdaki gibi;
private void button1_Click(object sender, EventArgs e)
{
if ((eskiSifre_tb.Text == "") || (yeniSifre_tb.Text == ""))
{
MessageBox.Show("Lütfen Eski ve Yeni Şifrenizi Giriniz", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (eskiSifre_tb.Text != KullaniciSifre)
{
MessageBox.Show("Eski Şifrenizi Lütfen Doğru Giriniz", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (MessageBox.Show("Şifre Değişikliğini Onaylıyormusunuz?", "Otomasyon", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
{ return; }
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = Properties.Settings.Default.ConnectionString;
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "up_KullaniciSifreDegistir";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@KullaniciAdi", KullaniciAdi);
cmd.Parameters.AddWithValue("@KullaniciSifre", yeniSifre_tb.Text);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ MessageBox.Show(ex.Message); return; }
MessageBox.Show("Şifre Başarıyla Değiştirildi", "Otomasyon", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Burada eski şifreyi nasıl karşılaştırdığımızı sorabilirsiniz, bu form’da bir tane string türünden public ‘KullaniciAdi’ ve ‘KullaniciSifre’ tanımlıyoruz. Bu form’u ilk ana form’da çağırdığımız için kullanıcının adını ve şifresini zaten biliyoruz.
Stored Procedure;
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
ALTER proc [dbo].[up_KullaniciSifreDegistir]
@KullaniciAdi varchar(50),
@KullaniciSifre varchar(50)
as begin
update Kullanicilar set KullaniciSifre = @KullaniciSifre where KullaniciAdi = @KullaniciAdi
end
Son olarak admin yetkisine sahip olan kişinin kullanıcı ekleme işlemine geldi. Ben burada yeni kullanıcılar için şifreyi sabit ‘otomasyon’ olarak belirledim. Yeni kullanıcı ilk kez girdikden sonra şifresini değiştirebilir, admin de kullanıcının yetkilerini sonradan belirler.’Kullanıcı Ekle’ butonuna basılınca yapılan işlem;
Yine SQL Server’da tanımlamış olduğumuz bir stored procedure çağırarak kullanıcı ekliyoruz.
Stored Procedure;
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[up_KullaniciEkle]
@KullaniciAdi varchar(50),
@KullaniciSifre varchar(50)
as begin
declare @KullaniciNo varchar(30);
set @KullaniciNo = ((select Count(*) from Kullanicilar) + 1)
insert into Kullanicilar values(@KullaniciNo, @KullaniciSifre, @KullaniciAdi)
end
Genel olarak Login form tasarımı bu şekilde elbette üstüne birkaç özellik daha koyarak geliştirilebilir. Umarım sizlere faydalı olur. Başka bir makalede görüşmek üzere.
Arkadaşlar merhaba, ilk yazımda düzenli olarak yazmaya çalışağım dedim ama malesef bunu tam manasıyla başaramadım, başarmam içinde 6ayda bir yazmam gerekiyor ki düzenli olsun :). Bu makalede SQL Server 2005’e aynı ağda bulunmadan internet üzerinden nasıl erişebileceğimizi anlatacağım.
Bu sistem aslında otobüs şirketlerin, büyük mağazaların vb. firmaların ürün takibini tüm şubelerinde güncel olarak görebildiği, bilet satışını yapabildiği uygulamaların temelidir. Ana bi server olacak, tüm şubeler yaptıklarını bu server’a yollayacak, güncel durumu bu server’dan okuyacak. Şimdi bu işlemi nasıl gerçekleştirdiğimizi anlatalım.
Ilk olarak SQL Server’ın ‘Sql Server and Windows Authentication’ mod’da olması gerekiyor. Bu ayarı SQL Server Management Studio’da Veritabanına sağ tıklayıp Özellikler dedikden sonra ‘Security’ sekmesinin altından seçebiliriz. Bu işlemin ardından, ‘Sql Server Configuration’dan ‘Sql Server(MSSQLSERVER)’a sağ tıklayıp Özellikler dedikden sonra karşımıza ‘Built-in account’ kısmını ‘Network Service’ olarak seçiyoruz.
Ardından Denetim Masası -> Windows Güvenlik Duvarı -> Özel Durumlar -> Bağlantı Noktası Ekle çıkan pencerede ‘Ad: SQL Server, Bağ. Nok No: 1433, TCP’ seçip ekliyoruz. Aynı yerden ‘Ad: SQL Server, Bağ. Nok No: 1434, UDP’ yazıp tekrar ekliyoruz.
Son işlem olarak modem’imizden bu portları açıp yerel ip adresimize yönlendirme işlemini yapıyoruz. Artık server’ımıza internet üzerinden erişebiliriz. Bunun için Connection String şu şekilde olmak zorunda.
Data Source=[Server IP],1433;Network Library=DBMSSOCN;Initial Catalog=[Veritabanımızın Ismi];User ID=[Kullanıcı Adı];Password=[Sifre];
Okul, İş, Kurs derken sitemi çok boşladım. Şu anda C ve Sistem Programcıları derneğinde ‘MS-Sql Server ve Oracle’ Programlama dersi alıyorum. O kursla beraber güzel bir otomasyon programı çalışmalarımda sürüyor. Sizinlerinde işinize yarayacağını düşündüğüm ufak bir kod parcası vermek istedim. Aşağıdaki kod Ms-Sql Server’da yaptığım bir Stored Procedure çalıştırıyor. Stored Procedure nedir? diye soranlaırnız mutlaka vardır. Bu sorunun cevabını burada vermeyeceğim. Çok kısa bir zaman sonra Ms-Sql Server ile ilgili daha çok makale bulabileceksiniz.
Kod parçasını kısaca açıklamak gerekirse, SqlCommand’ın CommandText’ine yazdığımız stored procedure’un ismini cmd.Parameters.AddWithValue ile yazdığınız procedure’un adını ve ona verdiğiniz değeri giriyorsunuz. Son olarak da cmd.ExecuteNonQuery diyerek stored procedure çalıştırıyorsunuz.
5 Aralık Cuma günü A.R.O.G’a ve 6 Aralık Cumartesi günü de ‘Muro’ filmine gittim. Komedi film’ine gideceksem bu kesinlikle türk film’i olur. Bence komedi filmlerinde çok başarılıyız, onun için komedi film’i seyredeceksem kesinlikle tercihim türk filmleri olur. A.R.O.G film’inde ben G.O.R.A’daki tadı alamadım, film gerek efekler’i olsun, gerek kalitesiyle 10numara bir film. Herşey’den önce ‘Cem Yılmaz’ ismi taşıyan bir film. Belgesel çekse gidilir :), fakat film bende beklenenenin aksine G.O.R.A tadını vermedi. Ama bayram eğlencesi için gidilebilicek bir film. Muro’da Kurtlar Vadisi’ndeki Muro ile pek bir fark göremedim. Sonuç olarak her iki yapımcıda bayramda bizlere eğlence için 2 güzel film sunmuşlar. Vakit geçirmek için hoş film’ler…
Not: Şimdi yazarken aklıma geldi, yabancı filmlerde komedi olarak ‘Müzede Bir Gece’ film’i favorimdir. Bu film’in 2.’si çıkacakmış ona bir aksilik olmazsa kesin gideceğim :)…
Burak ÖZKAN; 2008 yılı, İstanbul Üniversitesi End. Otomasyon bölümü ve 2012 Kadir Has Üniversitesi Bilgisayar Müh. bölümü mezunu, iyi bir yazılımcı olmak için çok çalışıyor ve çalışmaya devam edecek.
Son Yorumlar