Global Game Jam 2017 etkinliği 20 Ocak 2017 - 22 Ocak 2017 tarihleri arasında İstanbul Bahçeşehir Üniversitesi Oyun Laboratuvarında‘nda gerçekleştirildi.
Ben de konuşmacı , mentor ve juri üyesi sıfatları ile etkinliğe katıldım ve açıkçası çok keyifli zaman geçirdim.
Global Game Jam nedir?
Global Game Jam, IGDA (International Game Developers Association - Uluslararası Oyun Geliştiricileri Derneği) Eğitim Odak Grubu‘nun yönlendirmesiyle ortaya çıkan, tüm dünyada eş zamanlı gerçekleştirilen bir oyun geliştirme etkinliğidir.
GGJ dünyada oyun geliştirilmesi amacıyla birçok öğrenciyi, profesyoneli ve akademisyeni bir araya getiren dünya genelindeki en büyük oyun geliştirme organizasyonudur.
GGJ 2017 etkinliğinde, dünya genelinde 78 ülkede 518 etkinlik alanında 28837 katılımcı ile 5438 oynanabilir oyun yalnızca 48 saat içerisinde geliştirilmiştir. GGJ etkinliğine ev sahipliği yapan etkinlik merkezleri yerel oyun sektörünün gelişmesine katkı sağlarken, katılımcılara çeşitli açılardan faydalar sağlamaktadır.
Eğer geliştirdiğiniz .Net Core projelerinde zamanlanmış görevler çalıştırmaya ihtiyaç duyarsanız, Quartz.Net kütüphanesinden faydalanabilirsiniz.
Bu makalede Quartz.Net kütüphanesini .Net Core ile geliştireceğimiz bir Console uygulamasında kullanacağız.
Hemen Visual Studio 2017 açalım ve yeni bir Console App (.Net Core) projesi oluşturalım;
Şimdi projenin Dependencies kısmına sağ tuşla tıklayıp Manage Nuget Packages… menüsünü seçelim, açılan pencerede Quartz paketini aratalım ve projeye ekleyelim. (Ben bu yazıyı yazarken v3.0.0-alpha2 .Net Core destekliyordu)
Program.cs dosyasını açalım ve Main() methodu içerisini aşağıdaki gibi değiştirelim;
InitializeJob() methodu içerisinde öncelikle StdSchedulerFactory sınıfından yeni bir instance çıkartıp, GetScheduler() methodunu çağırıyor, IScheduler interface‘inde yeralan Start() methodu ile başlatıyoruz.
JobBuilder sınıfının önce Create() methodunu, sonra Build() methodunu çağırıyoruz.
TriggerBuilder sınıfının da önce Create() methodunu, sonra StartNow() methodunu çağırarak hemen çalıştırmaya başlayacağımızı, WithCronSchedule() mthodunu çağırarak hangi periyotta çalıştırmak istediğimizi belirtiyoruz, en sonunda Build() methodunu çağırmayı unutmuyoruz.
WithCronSchedule() methoduna parametre verebileceğimiz değerler için CronExpressionGenerator sayfasını kullanabiliriz.
Ben bu makalede * * * ? * * ile her saniye tetiklenecek bir zamanlayıcı görev tanımladım.
IScheduler interface’inin ScheduleJob() methodu ile Job ve Trigger aracılığı ile zamanlanmış görevi başlatıyoruz.
Son olarak projeye aşağıdaki sınıfı da ekleyelim;
Uygulamayı çalıştırdığımızda aşağıdaki gibi bir çıktı almamız lazım;
Bazı durumlarda C# projemizde elimizdeki değişkenin bir kopyasını çıkarmamız gerekir.
Örneğin, ekrandaki fatura‘nın veya müşterinin aynısından oluşturalım ama Adı, Adresi, gibi alanların değerlerini değiştirelim sadece.
Bu tip senaryolarda karşımıza iki seçenek çıkıyor; Basit Kopya (Shallow Copy) ve Derin Kopya (Deep Copy)
Shallow Copy, ilgili değişkenin sadece primitive tiplerdeki özelliklerinin değerlerini kopyalar, custom tiplerdeki özelliklerini kopyalamaz.
Senaryomuzda aşağıdaki sınıflar yer alsın;
Eğer Customer
sınıfından bir değişkenin kopyasını çıkartmak istersek, aynı tipte yeni bir değişken oluşturup özelliklerin değerlerini atayabiliriz;
Bir sınıfın çok fazla özelliği olduğu durumda bu yol pek verimli olmayacaktır. Sınıfa eklenecek yeni özellikler (PhoneNumber, Status, vs) için kopyalama yaptığımız her yerde güncelleme yapmamız da gerekecek.
Shallow Copy ile bu sorunu şöyle aşabiliyoruz;
Gördüğünüz gibi Customer
sınıfına ShallowCopy()
isimli bir method ekledik ve içerisinde this.MemberwiseClon();
methodunu çağırdık, Customer
sınıfına dönüştürüp geri döndürdük.
Kullanımı;
Fakat bu senaryoda sadece primitive tiplerin (string, int, bool, vs) yeni değişkene kopyalanmasını sağlayabildik.
Custom tiplerin (Address, ShoppingCart, vs) yeni değişkende değerleri orjinal değişkendeki değerlerin referansları olacaktır.
Yani, kopyaladığımız değişkende bir değişiklik yaparsak orjinal değişkendeki değerde değişir.
Aslında değişmez, iki değerinde hafızadaki adresi aynı olacağı için (referans) birinde değişiklik yapınca diğeri de aynı hafıza alanından değişen değeri okuyacak
Elimizdeki değişkenin tamamen yepyeni bir kopyasını çıkartmak istiyorsak, Deep Copy yöntemlerini kullanmalıyız.
Örneğin;
Kullanım örneği;
Bu durumda newCustomer değişkeni customer değişkeninin birebir kopyası olacak. Herhangi bir değeri değiştirilecek olursa customer değişkeni bundan etkinlenmeyecek.
Öncelikle MemoryStream
kullanarak kopyalama için hafızada bir alan oluşturuyoruz, BinaryFormatter
ile bu alana elimizdeki değişkeni serilize ediyoruz.
Son olarak aynı alanın başına gidip tekrar Customer
sınıfına dönüştürüp geri döndürüyoruz.
Böylece istediğimiz değişkenlerin kopyalarını oluşturabiliriz.
Bu makalede C# projelerimizde kullandığımız Action<T>
ve Func<TParam, TReturn>
sınıfları ne işe yarar sorusunun cevabını arayacağız.
En basit anlatımı ile Action<T>
ve Func<TParam, TReturn>
sınıfları delegate method
gibi davranır.
Yani Action<T>
veya Func<TParam, TReturn>
sınıfından yeni bir değişken oluşturup, değer olarak bir method’un kendisini atayabiliriz.
Böylece değişkeni her tetiklediğimizde aslında değer olarak atadığımız method‘u tetiklemiş oluruz.
Hatta parametreleri uyduğu sürece değişkene atadığımız methodu başka bir method ile de değiştirebiliriz.
Action<T>
ve Func<TParam, TReturn>
sınıfları parametre alabilirde, almayabilirde. Yani sıfır veya daha fazla parametre alabilirler.
Aralarındaki fark ise, Action<T>
geriye değer döndürmez iken, Func<TParam, TReturn>
geriye değer döndürür.
Örneğin;
Önemli nokta; Action<T>
sınıfından değişkene vereceğiniz method’un aldığı parametreler, Action<T>
sınıfının generic parametreleri ile örtüşmeli.
Örneğin;
Ayrıca, Func<TParam, TReturn>
sınıfından oluşturduğumuz değişkene atadığımız method’un parametreleri TParam
generic parametreleri ile ve dönüş tipi TReturn
generic parametresi ile örtüşmeli.
Örneğin;
24 Aralık 2016 tarihinde DevNot Atölye bünyesinde ITU Ayazağa Kampüsü‘nde Xamarin.Forms ile Cross-Platform Uygulama Geliştirme konusunda bir etkinlik organize ettik.
Etkinliği gerçekleştirmemizi sağlayan sevgili arkadaşım Uğur Umutluoğlu‘na ve etkinliğe katılan tüm arkadaşlara çok teşekkür ederim.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484