Hoşgeldin Misafir
Mesaj atabilmek için forumumuza kayıt olmalısınız.

Kullanıcı Adı
  

Şifre
  





Forumlarda Ara



(Gelişmiş Arama)

Forum İstatistikleri
» Üye Sayısı: 96
» En Son Üyemiz: Magnet
» Konu Sayısı: 56
» Mesaj Sayısı: 245

Tam İstatistik

Çevrimiçi Kullanıcılar
Şu anda 17 çevrimiçi kullanıcı var.
» 0 üye | 17 Misafir

En Son Konular
Herkese Merhabalar
Forum: Yeni Gronialı
Son Mesaj: byfabs
03-01-2019, 11:20 AM
» Cevaplar: 3
» Gösterim: 1,251
[ÇEKİLİŞ] 2 Adet Top Down...
Forum: Yarışma ve Çekilişler
Son Mesaj: bekir
03-01-2019, 11:16 AM
» Cevaplar: 44
» Gösterim: 4,277
FPS Nedir?
Forum: Unity3D
Son Mesaj: Ugly23
02-23-2019, 05:16 PM
» Cevaplar: 0
» Gösterim: 57
Cyberpunk 2023
Forum: Fikir Aşamasındaki Projeler
Son Mesaj: byfabs
01-29-2019, 02:04 PM
» Cevaplar: 3
» Gösterim: 309
Ahi oyun stüdyosunda herk...
Forum: Yeni Gronialı
Son Mesaj: byfabs
01-15-2019, 08:21 PM
» Cevaplar: 1
» Gösterim: 215
Realtime Renderer ile fil...
Forum: Unity3D
Son Mesaj: byfabs
10-24-2018, 06:37 PM
» Cevaplar: 1
» Gösterim: 327
[20 Adet - İNDİRİM KUPONU...
Forum: Yarışma ve Çekilişler
Son Mesaj: nefsinefir
09-19-2018, 04:23 PM
» Cevaplar: 0
» Gösterim: 437
[SORU] Unity 3d Silah Ate...
Forum: Unity3D
Son Mesaj: furkann3142
09-03-2018, 12:05 PM
» Cevaplar: 7
» Gösterim: 1,489
[SORU] Unity C# Nitro Sis...
Forum: Unity3D
Son Mesaj: BugZone344
08-31-2018, 04:27 PM
» Cevaplar: 0
» Gösterim: 216
Kahve ve Çekirdekleri Tes...
Forum: Fikir Aşamasındaki Projeler
Son Mesaj: rijitsu
07-16-2018, 02:49 PM
» Cevaplar: 1
» Gösterim: 825

 
  Erlang Base Converter
Gönderen: byfabs - 06-05-2018, 05:14 PM - Forum: Programlama Dilleri - Cevaplar (1)

Erlang icin base cevirme functionu yazdim. Kullanmak isteyen olursa diye

Kod:
to_base_string(Number, Base, Lookup),
to_base_string(Number, Base) % sadece 64 tabanina kadar calisir, digerlerinde function bulunamadi hatasi alirsiniz %

Örnek kullanım 1
Kod:
to_base_string(123456,16).
Çıktı
Kod:
1e240

Örnek kullanım 2
Kod:
to_base_string(123456,64).
Çıktı
Kod:
u90

Örnek kullanım 3
Kod:
to_base_string(123456,3,["a","b","c"]).
Çıktı
Kod:
caacbbaabba


  Couchdb Custom UUIDs
Gönderen: byfabs - 06-04-2018, 10:18 PM - Forum: Programlama Dilleri - Cevaplar (5)

Selamlar, couchdb kullanan var mi aranizda bilmiyorum ama, yine de ufak bir eklenti yazdim atayim istedim.

Eklentiyi couchdb uzerinden id generate ederken hem sequential hem de customize edebilmek icin yazdim.

https://github.com/Fabsolute/CouchDB-Custom-UUIDs

Ornek ayarlar

[Resim: settings.png]

Sonuc

[Resim: sonuc.png]


  Gronia 1. Geleneksel İzmir İftar Buluşması
Gönderen: byfabs - 05-30-2018, 04:30 PM - Forum: Genel Konular - Cevaplar (9)

Izmirde olan kac kisi var? Ona gore bi aksam toparlanip yemek yiyelim bir yerlerde ?


  Sitenin eski görüntüleri
Gönderen: nefsinefir - 05-28-2018, 06:58 PM - Forum: Forum Hakkında - Cevaplar (5)

[Resim: Ekran_G_r_nt_s_2018_05_28_18_54_40_fullpage.png]
[Resim: image.png]


  Kac yil oldu?
Gönderen: Celep - 05-28-2018, 05:09 PM - Forum: Yeni Gronialı - Cevaplar (1)

Yahu, fabsin mesajiyla hypelandim. Sevindim, kafede bagirindim... Daha neler neler!

Gronia kapali kaldigi surecte yav gronia vardi, su vardi bu vardi gibi yaklasimlarla tonla kisiye laf yaptik. Oyun yapimdan buraya gectigimiz gunu de hatirlar gibi oldum.


Herkese tekrar merhaba. E


  Ahali, beni Tanıdınız mı?
Gönderen: rijitsu - 05-28-2018, 04:19 PM - Forum: Yeni Gronialı - Cevaplar (2)

Merhaba millet, ben eski Gronia'lıyım ve eski lakabım agg1401'dir. Adım: Ayhan ve yaşım 23, Kayseriliyim.


  Merhaba
Gönderen: conisins - 05-26-2018, 08:55 PM - Forum: Yeni Gronialı - Cevaplar (4)

Beni tanıyorsunuz...


Rainbow [ÇEKİLİŞ] 2 Adet Top Down Office Megapack (34$)
Gönderen: Beyyin - 05-25-2018, 07:07 PM - Forum: Yarışma ve Çekilişler - Cevaplar (44)

Asset Store

[Resim: d813dde7-f14c-4b36-8480-ebf6b5ca9d42.jpg]


Çekiliş şartları:
Konuya yorum atmanız yeterlidir.


Randomresult.com üzerinden çekilip şanslı kişiler belirlenecek.


  Tekrarlama
Gönderen: Anpulse - 05-24-2018, 07:27 PM - Forum: Unity3D - Cevaplar (1)

Hocam merhaba obje öne doğru bir hareket yapmıyacak flappy bird gibi arkadaki quad hareket edicek flappy bird gibi derken oyun 2 de olucak peki bunu nasıl yaparız?
https://www.youtube.com/watch?v=stFx_jwm4u0


  Büyük Ölçekli Projelerde Laravel Uygulaması
Gönderen: Eray - 05-24-2018, 06:51 PM - Forum: PHP - Cevaplar (3)

Laravel Framework ile birçok proje geliştiriyoruz. Lakin büyük çaplı yani
kalabalık projelerde Laravel üzerine geliştirmeler yapılması oldukça zor.

Birçok kesimden şu sözü duymuşsunuzdur: "Laravel kendi yapınızı uygulamanıza
imkan vermiyor". Lakin durum o şekilde değil. Tasarım desenleri ile
profesyonel bir sistem geliştirdiğinizde Laravel'in aksine daha büyük
imkan sağladığını görüyorsunuz. Diğer bir şekilde ifade etmek gerekirse,
spagetti kodlamayla zaten tasarım desenlerine sahip bir yapı üzerine
kendi yapınızı inşa etmek mümkün değil.

Lafı daha fazla uzatmadan konuya geçmek istiyorum yalnız şu hatırlatmayı
yapmamda yarar var. Burada bahsedilen büyük ölçek 60-70'ten fazla model 
sınıflarının olması ve yapının bir çok küçük parçadan oluşmasıdır. Yaptığınız
proje eğer küçük veya orta ölçekli ise Laravel'in kendi yapısının
üzerine çıkmanıza gerek yok. Bu sizin üretkenliğinizi oldukça düşürecektir.

Laravel'in Kendi Yapısı

Büyük ölçekli yapıda kullanabileceğimiz desenlere geçmeden önce Laravel'in
kendi yapısını tekrar gözden geçirelim. Aşağıdaki yapı Laravel 5.6
sürümünden. Bu yapı hakkında kafanıza takılan bir kısım yoksa diğer konu
başlığına hızlıca geçiş yapabilirsiniz.

Kod:
.
├── app
│   ├── Broadcasting
│   ├── Console
│   ├── Events
│   ├── Exceptions
│   ├── Http
│   ├── Jobs
│   ├── Listeners
│   ├── Mail
│   ├── Notifications
│   ├── Policies
│   ├── Providers
│   ├── Rules
│   └── User.php
├── bootstrap
│   ├── app.php
│   └── cache
├── config
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── public
├── resources
│   ├── assets
│   ├── lang
│   └── views
├── routes
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage
├── vendor
└── tests
/app Dizini

Burada belirtilen
Kod:
app
klasörü uygulama kodlarımızın bulunduğu dizindir.

/bootstrap Dizini

Çatımızın asıl başlangıç noktasıdır. Laravel Framework'ün kendi yapısını
başlattığı ve cache klasörünü oluşturduğu kısımdır.

/config Dizini

İsminden de anlaşıldığı gibi ayarların tutulduğu dizindir. Ayar bilgileri bu
dizindeki dosyalardan elde edilmektedir. Gizli(Secret) bilgileri de
Kod:
dotenv

aracılığıyla burada sisteme dahil edilmektedir.

/database Dizini

Veritabanı yapısı ile ilgili işlemlerin tutulduğu dizindir. migrations,
factories ve seeds burada bulunmaktadır.

/public Dizini

Dış isteklerin yapıldığı başlangıç noktasıdır. Ek olarak isteklerde servis
edilecek asset dosyaları (hazırlanmış css, js, resim dosyaları gibi)
burada tutuyoruz.

/resources Dizini

resources dizini presentation yani ön tarafta kullanıcıya göstereceğimiz 
verileri hazırladığımız kısımdır. views, derlenecek asset dosyaları ve
dil dosyaları örneğin burada tutulur.

/routes Dizini

Kod:
routes
dizini içerisinde herhangi bir ortamdan gelen isteğin nerede
karşılık bulunduracağını belirtiriz. Burada ortamdan kasıt, web isteği
olabildiği gibi websocket istekleri de olabilir.

/storage Dizini
storage dizini içerisinde isminden de anlaşılabildiği gibi saklamak 
istediğimiz dosyaları tutmaktayız. Bunların içerisinde framework tarafından
hazırlanan dosyalar(örneğin log) olduğu gibi kendimizin de tutmak istediği
dosyalar(örneğin bir müzik sitesi için müzik dosyaları) da olabilir.

/tests Dizini

PHPUnit ile çalıştırmak istediğimiz testleri bu dizin içerisinde oluşturuyoruz.

/vendor Dizini

Composer bağımlılıklarımızın tutulduğu dizin.

/app/Broadcasting Dizini

Örneğin Websocket üzerinden yaptığımız gerçek zamanlı istekler/etkinlikler
burada kontrol altında tutulmaktadır.

/app/Console Dizini

Artisan için oluşturduğunuz komutların tutulduğu dizindir. Bu komutlar tek
seferlik işlemlerde kullanılabileceği gibi schedule hazırladığınız zamanlı
görevler de olabilir.

/app/Events Dizini

Herhangi bir olay durumunda yaptırmak istediğiniz işlemleri tanımladığınız
sınıfları tutan dizindir.

/app/Exceptions Dizini

Uygulamaya özel oluşturduğunuz hata sınıflarını oluşturduğunuz dizindir.

/app/Http Dizini

HTTP istekleriyle ilgili yapılması gerekenleri tutan dizindir. Controller,
Middleware ve Requests burada tutulur.

/app/Jobs Dizini

Senkron veya Asenkron olarak tanımladığımız leri burada tutmaktayız.

/app/Listeners Dizini

Oluşturduğunuz Eventler sonucunda yapılması gereken işlemleri burada
tanımlamaktasınız. Örneğin
Kod:
UserLicenseFinished
etkinliği(event) sonucunda
Kod:
TerminateUser
ve
Kod:
SendTerminatedUserEmail
listenerlarını burada
oluşturabilirsiniz.

/app/Mail Dizini

Uygulama tarafından gönderilecek e-postaları inşa edecek sınıfları bu dizinde
tutmaktayız.

/app/Notifications Dizini

Çeşitli bildirim gönderme ortamları(SMS, E-Posta ve Slack gibi) için
bildirimleri inşa ettiğimiz sınıfları oluşturduğumuz dizindir.

/app/Policies Dizini

Herhangi bir işlem için (Örneğin giriş veya api isteği) izin kontrol
sınıflarını oluşturduğunuz dizindir.

/app/Providers Dizini

ServiceProviderları tanımladığınız dizindir.

/app/Rules Dizini

Validate etmek istediğiniz veriler için oluşturduğunuz sınıfları tutan
dizindir.

Biraz Daha Serbest

Orta ölçekli bir projede bu yapının üzerine ufak değişiklikler elbetteki
yapıyoruz. Örneğin Models isminde bir namespace üzerinde model
sınıfları ayrı bir şekilde tutuyoruz. Ek olarak Repositories ve
Services de ekliyoruz.

Repository Pattern

Repository desenini tek bir makalede incelemek haksızlık olacaktır. Temel
anlamda veri üzerinde işlem yapan kısım ile veriye erişen kısmın
ayrılması diyebiliriz.

Buradaki Services kısmı ise Repository ile haberleşen kısmın da
uygulama katmanından ayıran kısımdır. Bir örnek ile ilerlemek daha iyi
olacaktır.

PHP Kod:
namespace App/Repositories;

interface 
UserInterface {
 
 public function getUserById($userId);

 
 public function getUserByUsername($username);

PHP Kod:
namespace App/Repositories;

class 
UserRepository implements UserInterface {
 
 protected $model;

 
 public function __construct(Model $model) {
 
   $this->model $model;
 
 }

 
 public function getUserById($userId) {
 
   return $this->model->find($userId);
 
 }
 
 
  public 
function getUserByUsername($username) {
 
   return $this->model->where('username'strtolower($username))->first();
 
 }

PHP Kod:
namespace App/Services;

class 
UserService {
 
 protected $repository;

 
 public function __construct(UserInterface $repository){
 
   $this->repository $repository;
 
 }

 
 public function getUser($user) {
 
   if(is_numeric($user))
 
      return $this->repository->getUserById($user);
 
   else
       
return $this->repository->getUserByUsername($user); 
 
 }

Bu örnek yapıda Service ve Repository kullanmış olduk. (Yapının
çalışması için iki yapı için de ServiceProvider sınıflarını hazırlamanız
gerekmektedir.)

Bu yapıda hiçbir sorun yok. Oldukça organize ve güzel bir yapı çıkmış oluyor.
Lakin belirttiğim gibi orta ölçekli proje için uygun olacaktır. Büyük
ölçekli projede bu yapı hayat kurtarmayacaktır.

Örneğin bu yapının sonunda Models dizinimize bakalım:

Kod:
.
├── AklimaBaskaModelGelmedi.php
├── AnotherAnotherModel.php
├── AnotherModel.php
├── Comment.php
├── Gallery.php
├── Like.php
├── Note.php
├── Photo.php
├── Profile.php
├── Transaction.php
└── User.php
Uygulamamız üzerine eklediğimiz modüllerle bu Models dizini oldukça
büyüyecektir. Bir alternatif olarak bu modülleri ayrı namespace üzerinde
tutabilirsiniz. Lakin bir süre sonra bu da kurtarmayacaktır.

Aklıma Bir Şeyler Geliyor Ama?

Bu aşamada aklınıza gelen yol büyük ihtimal, "Hadi o zaman projeyi
microservislere ayıralım" olacaktır. Lakin bu iş o kadar kolay değil.
Oluşturduğumuz büyük ölçekli yapıyı küçük küçük parçalara ayırmak oldukça
zahmetli olacaktır. Temel olarak uygulayacağınız yol şu olur büyük ihtimal;
Bir parçayı al ufak bir mikroservis uygulaması haline getir (apayrı bir proje
olmuş oldu) ve uygulama üzerindeki projede gelen isteği bu mikroservise
yönlendir. Bütün bu uğraş sonucunda da kazandığınız (!) sorunlar:

- Herhangi bir değişiklikte hata yapmanız muhtemel
- Yeni bir geliştirici anlamakta çok fazla zorlanacak ve ayrı ayrı parçalara
bakmak zorunda kalacak.
- Çok fazla dosya
- Yeniden bir çözüm arayışı

Bir Seçenek Daha Var O da "Domain Driven Design" Mı Dersin?

Elbette tek bir çözüm yolu yok. Yukarda bahsettiğim yapıları daha da
geliştirebilir veya HMVC yapısına geçiş yapabilirsiniz. Her desenin
+ ve - leri var.

DDD'yi özetlemek gerekirse:

- Application yani uygulama: Controller, Middleware, Route
- Domain yani ana işi yapan işlev: Model, Repository, Policy vs.
- Infrastructure yani servisler: Email, Notification, Logging vs.
- Interface yani görünüş, gözüken kısım: Views, Lang, Assets nam-ı diğer
Resources

Peki bu yapıda örnek Laravel dizini nasıl olabilir:

Kod:
.
├── app
│   ├── Account (Domain)
│   │   ├── AccessControlLists.php
│   │   ├── Auth.php
│   │   ├── Console
│   │   ├── Jobs
│   │   ├── Listeners
│   │   ├── Repositories
│   │   ├── Models
│   │   └── Validators
│   ├── Http (Application)
│   ├── Infrastructure
│   │   ├── Events
│   │   └── Exceptions
│   ├── Gallery (Domain)
│   └── Post (Domain)
├── bootstrap
│   ├── app.php
│   └── cache
├── config
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── public
├── resources (Interface)
│   ├── assets
│   ├── lang
│   └── views
├── routes
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage
├── vendor
└── tests
Fark edebileceğiniz üzere DDD'de sadece namespace eklemekten başka bir
durum yok.

Sen Pala Vere Bırak Sonuç Göster

Sonuç yapıyı göstermek istersek şöyle bir yapı uygun olacaktır:

Kod:
.
├── app
│   ├── Account
│   │   ├── AccessControlLists.php
│   │   ├── Auth.php
│   │   ├── Console
│   │   ├── Events
│   │   ├── Exceptions
│   │   ├── Jobs
│   │   ├── Listeners
│   │   ├── Models
│   │   ├── Repositories
│   │   └── Validators
│   ├── Gallery
│   ├── Http
│   │   ├── Controllers
│   │   └── Middleware
│   ├── Post
│   └── Providers
├── bootstrap
│   ├── app.php
│   └── cache
├── config
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── public
├── resources
│   ├── assets
│   ├── lang
│   └── views
├── routes
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage
├── vendor
└── tests
Elbette çok büyük ölçekte bir Laravel Uygulamasında bu yapı da yeterli
olmayacaktır.

Şimdi bir senaryo kuralım. Projemizde Authentication kısmı mikroservis 
yapılması gerektiği ile ilgili bir karar alındı. Bu durumda bu yapıdaki bir
projede tek yapılması gereken
Kod:
Account
(domain) dizininin mikroservis olarak
ayrılması. Komple bir değişiklik yapmaya gerek kalmadan sadece o modülü
mikroservis çok rahat yapabiliriz. Çünkü domain dışındaki diğer tüm sınıflar
Kod:
AccessControlLists
ve
Kod:
Auth
sınıflarını biliyor ve kullanıyor. Bunları
tutmak yeterli olacaktır. Mikroservisi hazırladıktan sonra ana projemizdeki
dizin yapısı şu şekilde olacaktır:

Kod:
.
├── app
│   ├── Account
│   │   ├── AccessControlLists.php
│   │   └── Auth.php
│   ├── Gallery
│   ├── Http
│   │   ├── Controllers
│   │   └── Middleware
│   ├── Post
│   └── Providers
├── bootstrap
│   ├── app.php
│   └── cache
├── config
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── public
├── resources
│   ├── assets
│   ├── lang
│   └── views
├── routes
│   ├── api.php
│   ├── channels.php
│   ├── console.php
│   └── web.php
├── storage
├── vendor
└── tests
Gördüğünüz gibi uygulama kodlarımız içerisinde bir değişiklik yapmadan
modül olarak ayırmış ve mikroservis haline getirmiş olduk. Buradaki
Kod:
AccessControlLists
ve
Kod:
Auth
mikroservisimizle haberleşecektir.

Dikkat edilmesi gereken kısım ise, bu gibi senaryolara sahip olabileceğimiz
için Domain içerisindeki haberleşen
Kod:
Service
sınıflarımızın temel veri
türlerini kullanması gerektiğidir. Örneğin,
Kod:
array
,
Kod:
string
,
Kod:
int
ve
Kod:
boolean
gibi. Herhangi bir sınıf belirtmeniz ayırma işlemi sonucunda sorun
çıkartacaktır. Çünkü o sınıfı tanımıyor ve bilmiyor olacaktır.

Bitiş

Yazı içerisinde elbetteki yanlışlarım olmuş olabilir. Yazıyı düzenleyerek
hataları gidererek daha iyi bir makale haline getirebiliriz. Eklenmesini
istediğiniz kısımları da yine aynı şekilde düzenleyerek pull request
atabilirsiniz. (Tabi bunu gronia'dan değil şuradan yapın)

---

Son olarak, yazı içerisindeki saçma sapan komik başlıkları(tümünü) görmezden gelin  E