Bugün google wave hesabım aktifleşti. Bir yandan mutluluk, bir yandan korku endişe... Sonra "yahu nereye gidiyor bu web" diye geçirdim aklımdan. Adamlar öyle birşey iddaa ettiki mail denen olay ortadan kalkacakmış. Google dediyse yapar abi. Eğer mail şimdi icat edilseydi wave ortaya çıkarmış. E tabi wave dediğimiz olay sadece bu değil. Küçük bir twitter, küçük bir friendfeed, küçük bir facebook, küçük bir blogger, küçük bir, küçük bir, küçük bir... şeklinde devam eden bir silsile. İçerisinde yer alan gadget'lar sayesinde wave gerçekten tüm interneti tek bir noktada toplayabiliyor. Hatta anlık çeviri olayı var bu wave'de. Mesela Çin'den bi adamla konuşuyorusunuz. Adam size oradan çince yazıyor, ve bu anlık ileti size, sizin istediğiniz dilde iletiliyor.
Bu arada projeye değinmek gerekirse açık kaynak(open source) bir proje. Gadget'lar yazabiliyosunuz ve aynı facebook uygulamaları gibi bunları sisteme entegre ediyorsunuz. Ha bir de şu var; asla ama asla facebook uygulamaları ile wave gadget'larını karşılaştırmayın. Çünkü wave'deki eklentiler karşılaştırılamayacak kadar esnek, hızlı ve kullanıcı dostu.
Gözlerimizi yarına diktiğimizde ne yazık ki sadece wave eklentileri yazacakmışız gibime geliyor. İster istemez "yani bu kadar proje yapıyoruz hepsi wave'e eklenti olmak içinmiydi" diyorsun kendi kendine. O zaman Google'ın Go dilini öğrenelimde işi birazda o tarafa yıkalım :P Şaka şaka :) Siz siz olun yolunuzdan ayrılmayın projelerinizi geliştirmeye devam edin. Hiçbir zaman en iyi diye bişey yoktur. Sadece içinde olduğunuz an için tek bir iyi vardır ;)
Görelim bakalım. Şu wave bizi daha neler yapıp etkileyecek!
Ben de Wave'lendim
at 19:20 1 comments Links to this post Labels: Kişisel
Callisto Project :1.2 Beta
Arkadaşlar uzun bir aradan sonra tekrar sizlerleyim. Size bir iyi bir kötü haberim var. İyi haberim Açık Kaynak (Open Source) bir projeye başladım. Başlama nedenim ise şuan ki projemde yabancı maddelere olabildiğince az yer vermeye çalışmak. Daha doğrusu ben bazen kullandığım herşeyi kendim yazmak istiyorum. Biliyorum kötü bir alışkanlık hatta saçma bir alışkanlık ama bu böyle :) Web 2.0'ın anlam kazandığı bu günlerde, MVC ile attığımız sağlam adımları biraz daha ilerletmek için Bağımlılık Iletimi (Dependency Injection) için Callisto adında bir projeye başladım. Tabi şuan bu bileşeni sadece Asp.NET MVC de kullabiliyoruz. İlerleyen günlerde bu ufak Framework'ün kullanımını sizlere örneklerle izah etmeye çalışacağım.
Asp.Net MVC ile Kendi Doğrulama Niteliğimizi Yazalım
Uzun bir aradan sonra herkese merhaba. Daha öncede belirttiğim gibi üzerinde çalıştığım bir proje var. Bu yüzden makalelerime ara vermek zorunda kaldım.
Bugün sizlerle birlikte Asp.Net Web Formlar için denediğimiz özel Membership’imizi yani kullanıcı denetleme sistemimizi Asp.Net MVC için yazmaya çalışacağız. Önceki yazımızda Web Form için bu olayı Üst/Taban(Base) bir sınıftan türeterek yaparken, MVC’de sadece doğrulama işleminin gerçekleşmesini istediğimiz sınıfı, Niteliğimizle(Attribute) imzalayarak yapacağız.
namespace MvcCustomMembership.Helper
{
public class MemberInfo
{
public string User { get; set; }
public MemberTicket Ticket { get; set; }
public bool IsAuthenticate { get; set; }
}
public class MemberTicket
{
public Guid Guid { get; set; }
public int UserId { get; set; }
public string User { get; set; }
public DateTime IssueDate { get; set; }
public DateTime Expiration { get; set; }
}
}
public class AuthenticationAttribute : ActionFilterAttribute
{
private HttpContextBase _context;
public Role Roles { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller is ControllerBase)
{
var baseControllar = filterContext.Controller as ControllerBase;
if (baseControllar != null)
{
_context = baseControllar.ControllerContext.HttpContext;
var memberInfo = (MemberInfo)_context.Session["MemberInfo"] ?? new MemberInfo();
Helper.CookieLogin(memberInfo);
if (!memberInfo.IsAuthenticate && _context.Request.Path != null)
{
string loginUrl = "~/Account/Login?returnUrl=" + _context.Request.Path;
filterContext.HttpContext.Response.Redirect(loginUrl);
}
}
}
}
}
[HandleError]
public class AccountController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Login");
}
public ActionResult Login()
{
ViewData["Title"] = "Login Page";
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string username, string password, string rememberMe)
{
//Kullanıcı adı ve şifre kontrollerinide veritabanına bağlanıp yapmalıyız
if (username == "test" && password == "test")
{
string requestUrl = Request.QueryString.Count > 0 ? Request.QueryString["returnUrl"] : null;
//Bu kısımı database'den gelen veriye göre set etmemiz gerekiyor
var memberInfo = new MemberInfo { IsAuthenticate = true, User = "Gokay" };
Session["MemberInfo"] = memberInfo;
memberInfo.Ticket = new MemberTicket()
{
User = memberInfo.User,
Expiration = DateTime.Now.AddMinutes(2),
IssueDate = DateTime.Now,
UserId = 1,
Guid = Guid.NewGuid()
};
if (rememberMe == "on")
AddCookie(memberInfo);
if (requestUrl != null)
return Redirect(requestUrl);
return RedirectToAction("Index", "Home");
}
else
return View();
}
private void AddCookie(MemberInfo memberInfo)
{
var myCookie = new HttpCookie("myCookie");
myCookie.Values.Add("userName", memberInfo.User);
myCookie.Values.Add("userIssueDate", memberInfo.Ticket.IssueDate.ToString());
myCookie.Values.Add("userId", memberInfo.Ticket.UserId.ToString());
myCookie.Values.Add("userGuid", memberInfo.Ticket.Guid.ToString());
myCookie.Values.Add("userExpiration", memberInfo.Ticket.Expiration.ToString());
myCookie.Expires = memberInfo.Ticket.Expiration;
Response.Cookies.Add(myCookie);
}
public ActionResult Logout()
{
Session["MemberInfo"] = null;
if (Request.Cookies["myCookie"] != null)
{
RemoveCookie();
}
return RedirectToAction("Index", "Home");
}
private void RemoveCookie()
{
var myCookie = new HttpCookie("myCookie") { Expires = DateTime.Now.AddYears(-1) };
Response.Cookies.Set(myCookie);
}
}
En üsteki Index isimki ActionResult metodumuz tarayıcıdan http://localhost/Account biçminde bir istek gelirse Login ActionResult’una yönlendirme yapıyor. Login metodu içerisinde ise doğrulama işlemlerini ele alıyoruz. Bunun için bir de Login isimli bir View oluşturmamız gerekiyor. Burada kullanıcı arabirimimizi tasarlayacağız.
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm())
{ %>
<table>
<tr>
<td>
Username :
</td>
<td>
<%= Html.TextBox("username")%>
</td>
</tr>
<tr>
<td>
Password :
</td>
<td>
<%= Html.Password("password")%>
</td>
</tr>
<tr>
<td colspan="2">
<input id="rememberMe" name="rememberMe" type="checkbox"/><label for="rememberMe">Beni Hatırla</label>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="login" id="login" value="Login" />
</td>
</tr>
</table>
<%} %>
</asp:Content>
<%
MemberInfo memberInfo = Helper.GetMemberInfo();
if (memberInfo.IsAuthenticate)
{
%>
<span>Hoş Geldiniz
<%= Html.Encode(memberInfo.User) %></span>
<%
}
else
{
using (Html.BeginForm("login", "account", FormMethod.Post))
{
%>
<table>
<tr>
<td>
Kullanıcı Adı
</td>
<td>
<input id="username" name="username" type="text" maxlength="20" size="20" />
</td>
</tr>
<tr>
<td>
Şifre
</td>
<td>
<input id="password" name="password" type="password" maxlength="20" size="20" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="checkbox" id="rememberMe" name="rememberMe" /><label for="rememberMe">Remember
Me</label>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="login" id="login" value="Login" />
</td>
</tr>
</table>
<%
}
}
%>
En üst satırda memberInfo sınıfımızı Helper metodu içerisindeki GetMemberInfo metodu ile set ediyorum
public static class Helper
{
public static MemberInfo GetMemberInfo()
{
var memberInfo = new MemberInfo();
if (HttpContext.Current.Session["MemberInfo"] != null)
memberInfo = (MemberInfo)HttpContext.Current.Session["MemberInfo"];
else
CookieLogin(memberInfo);
return memberInfo;
}
public static void CookieLogin(MemberInfo memberInfo)
{
var myCookie = HttpContext.Current.Request.Cookies["myCookie"];
if (myCookie != null)
{
int userExpration = Convert.ToDateTime(myCookie.Values["userExpiration"]).Year;
int userIssueDate = Convert.ToDateTime(myCookie.Values["userIssueDate"]).Year;
if (myCookie["userName"] != null && !memberInfo.IsAuthenticate && userExpration >= userIssueDate)
{
memberInfo.User = myCookie["userName"];
memberInfo.Ticket = new MemberTicket()
{
User = myCookie["userName"],
Guid = new Guid(myCookie["userGuid"]),
UserId = Convert.ToInt32(myCookie["userId"])
};
//Eğer belirtilen guid database'de bulunuyorsa isAuthenticate property'sini true yapalım
memberInfo.IsAuthenticate = true;
}
}
}
}
[Authentication(Roles = Role.User)]
public ActionResult About()
{
return View();
}
at 11:57 0 comments Links to this post Labels: Asp.Net MVC, Geliştirme, MVC, Üyelik Sistemi
Ege Üniversitesi Deri Mühendisliğini Kazandım
Bu sene şansımı denemek istedim ve tekrar üniversiteye girdim. Aslında açık öğretim seçeneği bana pek cazip gelmedi. "Ben okursam örgün okurum arkadaş!" dedim ve böyle bir karar aldım. Neyse belki yatay geçiş ya da çift anadal olanağı vardır. Ben de bunlardan birini değerlendiririm. Hayırlısı olsun diyorum.
Uzun süredir yazmıyorum bu yüzden gerçekten özür dilerim. Yetiştirilmesi gereken bir proje var ve bunun üzerinde çalışıyorum. Ama bahsettim konular hakkında yazılar yazmaya devam edeceğim. Belki sadece java'ya geçiş olayı çok sonra olabilir. Bunların dışında Mvc ve JQuery entegrasyonu ile ilgili pek çok yazı göreceksiniz. Gerçekleştirdiğim projede bir çok şey yaptım ve bunlar eminim çok hoşunuza gidecektir. Bu ay içinde güzel bir yazı geliyor. Görüşmek üzere...
at 13:37 2 comments Links to this post Labels: Kişisel
Oracle Sun'ı Satın Almış. Peh!
Yahu tam Java'ya geçiş süreci içindeyken yapılır mı bu? Belki sevinen insanlar vardır ama Adobe Macromedia'yı alıncada pek bir yenilik olduğu söylenemez. Yani satın alınan büyük firmalarda rekabetin azalmasından dolayı ne yazıkki büyük yenilikler göremiyoruz.
Peki ne olacak? Büyük bir veritabanı sistemi üreticisi olan Oracle artık Java ile yazılım tarafınada kaymaya başlayacak. Java için pek hayırlı bir olay gözükmüyor. Belki IBM alsa herşey daha güzel olurdu. Ama veritabancıların tek umudu herhalde MySQL'in geliştirilmesi olacaktır.
O zaman şu iki dili paralel yürütme hayalime devam edeyim ben en iyisi...
at 18:26 0 comments Links to this post Labels: Geliştirme
Üniversiteye Hazırlık Süreci
Herkese merhaba...
Bu aralar üniversiteye hazırlanmaya çalışıyorum. O yüzden bloğuma bişeyler yazamıyorum ve sizlerden özür diliyorum.
Yalnız takip eden arkadaşlar için şöyle bir ToDo yaptım (14 Hazirandan sonra bu yazıları bloğumda görebileceksiniz) :
- Asp.Net MVC ile Kendi Doğrulama Niteliğimizi Yazalım
- Java'ya Başlarken
- JQuery ile Özel DataPicker
- JavaScript MVC
Uzun süredir aklımda olan fikirler bunlar.
Sağlıcakla kalın...
at 16:30 0 comments Links to this post Labels: Kişisel
21 Mart Fırat Üniversitesi Yazılım Mimarisi Tasarım Günü
Geçtiğimiz Cumartesi Fırat Üniversitesinde yapılan seminere konuşmacı olarak katıldım. Seminerde Asp.Net MVC 1.0'a değindim. Aslında yeni özelliklerine pek değinemedim ama yeni yazılarımda bu konulara yer vermeye çalışıcam.
Bu arada üniversitedeki hocalarımız bizlerle çok çok ilgilendiler. Onlara teşekkürlerimi tekrar iletiyorum. Ama öğrencileride unutmamak gerek. Sunuma gösterilen katılım ve ilgi gerçekten güzeldi.
Yolculuktan bahsetmek gerekirse; Mehmet Aca, Özcan Acar ve Cihat Altuntaş ile çok keyifli bir yolculuk oldu. Hem biraz teknik konulardan konuştuk, hem de havadan sudan. Umarım yine bir araya geliriz...
at 19:16 2 comments Links to this post Labels: Seminer





