Visual Studio 2019 Presentation Mode Nasıl Kullanılır?

Herkese Selamlar! Visual Studio 2019 üzerinde güzel bir eklenti ile beraber kullanabileceğimiz presentation mode var artık! Eklentinin ismi Tweaks. Visual Studio marketplace üzerinden kolayca buraya tıklayarak indirebilirsiniz. Nasıl kullanacağınız ise aşağıda yer alan videoda yer almakta. İzlediğiniz için şimdiden çok teşekkürler. Başka videolarda ve yazılarda görüşmek üzere hoşça kalın.

0  

IEEE Ege Computer Society Web Development Webinar

Herkese Selamlar, 11.01.2021 tarihinde saat 21:00′ de IEEE Ege Computer Society’nin duzenledigi Webinar’ da konusmaciyim. Web Development hakkinda bilmedikleriniz, merak ettikleriniz varsa sizleri de beklerim. Yayin Google Meets uzerinden gerceklestirlecek ve baglanti linki saat 20.30 da “ieeecsege” instagram sayfasinda bioda paylasilacak. Katiliminiz icin simdiden tesekkurler…

0  

Microservice Mimarinin Dezavantajları

Herkese Selamlar! 2021 yılının ilk yazısına başladık. Bu sene blog yazılarına çok daha fazla önem vermeye çalışacağım. Bundan yaklaşık 6 hafta kadar önce microservice mimari nedir ve neden önemlidir diye bir yazı kaleme almıştım. Yazıyı paylaştıktan sonra şöyle bir yorum geldi.

Ben bu yorumun çok mantıklı olduğunu düşünerek, microservice mimarinin dezavantajlarına değinmeye karar verdim. Okuyucumuz yapıcı eleştirisi ve önerisi sayesinde sizlerle beraber bir bakalım ne gibi dezavantajları var microservice mimarinin.

1.Microserviceler Karmaşık Yapıdadır

Microservice mimarinin yapısı gereği monolitik mimariye göre zaten daha karışık bir yapısı vardır. Teorik olarak monolitik mimaride tek bir yapı üzerinde çalışırız. Microservice üzerinde ise içerisinde yer alan ayrı servislerin sayısı arttıkça karmaşıklık daha da artar. Farklı hizmetler üzerinde kullanılmış olan programlama dillerini ve frameworklerini birbirleri ile problem çıkarmadan çalışmasını sağlamak ciddi anlamda zordur. Projeniz içerisinde kullanılan her bir servis yine o servise özgü olan test ve izleme ortamına ihtiyaç duyacaktır bu da sizin projenize ya da firmanıza ek kaynak oluşturmanız anlamına gelir ve maliyetiniz artar ki bu problem iş verenlerin gerçekten hoşlanmadığı durumlardan bir tanesidir.
Peki şimdi sizden küçük bir hayal kurmanızı istiyorum. Gerçekten projenizde microservice yapısını gayet güzel kurguladığınızı varsayalım ama bazı servisler farklı işletim sistemi üzerine koşmakta ya da farklı veri tabanı üzerinden veriler çekmektesiniz. Buraya kadar gayet güzel problem şu veri tutarlılığından %100 emin olabilecek misiniz? Genelde microservice mimari üzerinde çalışan kişiler ile konuştuğumda bunu genelde takip etmeye çalıştıklarını bir problem çıkmaması için fazladan çaba sarf ettikleri dönemler ile karşılaştıklarını dile getirdiler. Karmaşık yapı başlığı altında toplayabileceğimiz alt başlıklardan bir taneside yazılımcıların korkulu rüyası dökümantasyon. Sürekli farklı hizmetlerin çalışması çalışan üzerinde ki dökümantasyon yükünü arttıracaktır.

2.Alışkanlıkların Dışına Çıkmak/Kültürel Değişiklik

Gerçekten kızdığım bir konu var en başta onu söylemek istiyorum. Sırf populer diye bu servise geçmek isteyen firmalar tanıyorum. Bu servise geçiş yapabilmek ve layığıyla kullanabilmek için firmanız içerisinde olgunlaşmış bir agile ve DevOps kültürünüzün olması gerekmekte. Bunlar yoksa ciddi anlamda problem yaşarsınız ki, microservice mimari ile başlayıp projeyi bir yere kadar getirdikten sonra “İşler çok karıştı keşke monolitik üzerinden gitseymişiz” diyenleri gerçekten çok gördüm. Her bir microservice yapısı bağımsız olarak çalışır. Bu mimari üzerinde ki esas fikir zaten ekiplerin küçük, bağımsız olarak çalışmasını sağlamaktır. Tabi bu bağımsızlık aynı zamanda fazladan bir kontrol de gerektirir. Şahsen microservice mimari yapısı üzerinde en önemli dezavantaj yetkinliklerin ve karar alma gücünün yöneticilerden, yazılım mimarlarından alır ve küçük ekiplere kaydırılmasını içerir. Geleneksel yöntemler ile yönetilen 25-49 kişilik firmalarda bunu üst düzey yöneticilere kabul ettirmek ciddi bir problemdir.

3.Maliyetler

Genellikle microservice mimari monolitik yapıya göre daha maliyetlidir. Biraz öncede söylediğimiz gibi farklı ve bağımsız hizmetlerin birbirleri ile problem çıkmadan haberleşmesi gerekir. Zaman zaman network latency yani ağ gecikmesine sebep olabilir. Problemin çözümü tabi ki her zaman bu olmaz ama genelde bu gecikmeleri güçlü ve maliyeti yüksek bir alt yapı ile çözmeye kalkarsak proje bütçesinden fedakarlık yapmak zorunda kalabiliriz.

4.Microservice ve Güvenlik

Monolitik yapıya kıyasla birbiri arasında sürekli haberleşen servisler sebebi ile hem uygulamanın güvenliğini sağlamak hem de servisler arasında yer alan güvenliğide sağlamak zorundayız. Daha detaylı ele alacak olursak birden fazla container ile çalışıyoruz. Uygulama ve iç yapısı içerisinde ki servislerin birbirleri ile veri paylaşması sürekli ağ üzerinde veri trafiğine sebep olacak bu da art niyetli kişileri aklımıza getirdikçe bizi biraz daha tedirgin edebilir.

Yukarıdaki 4 maddede microservice mimarisinin dezavantajlarından bahsetmeye çalıştım. Şunu kesinlikle unutmamalıyız sadece populer diye bu tarz bir mimariye geçmeye çalışmamalıyız. Doğru eğitim ve araçlar olmadan microservice mimari bizi çıkmaza sürükleyebilir. Yazımı okuduğunuz için teşekkür ediyorum. Bu yazıyı post ederken dinlediğim şarkı ise: Adamlar-Sarılırım Birine Sonra ki yazılarda görüşmek üzere hoşçakalın !

0  

IEEE TRSB Computer Society Web Development 101 Canlı Yayını

Herkese Selamlar ! 23.10.2020 tarihinde saat 21:00 de IEEE TRSB Computer Society youtube kanalinda Web Development 101 konusu ile canli yayinda olacagim ! Vaktiniz varsa beklerim, linke tiklayarak erisebilirsiniz. Katılan arkadaşlara şimdiden çok teşekkürler.

0  

Microservice Mimari Nedir ? Neden Önemlidir ?

Herkese Selamlar ! Bugün sizler ile beraber son zamanlarda ciddi anlamda herkes tarafından merak edilen, hatırı sayılır sayıda şirketin şu an aktif olarak kullandığı microservice mimari nedir ? Neden önemlidir ? bir bakalım istedim bu yazı içerisinde. Yavaş yavaş başlayalım o zaman !

Microservice Mimari Nedir ?

Microservice, service oriented architecture (SOA) yapısının bir çeşididir aslında. Bir uygulama içerisinde ki o uygulamanın çalışmasını stabil bir sekilde götürebilen, belirli hizmet, tek bir amaç ve en önemlisi birbirinden bağımsız olarak çalışan alt hizmetlerdir. Aslında ben en çok bunu SOLID principles içerisinde yer alan Single Responsibilitye benzetiyorum. Tek bir sorumluluk alacak kurguladığımız yapı ve tamamen buna dayalı olarak yoluna devam edecek. Normalde kullandığımız yapı ise monolithic. Tam olarak aşağıda ki resimde yer aldığı gibi.

Monolithic yapıyı şu an hali hazırda herkes kullanıyordur zaten. Çok büyük projelerde ise bu yapı sorun olmaya başladı. Mesela Amazon tamamen bu yapı üzerindeydi fakat proje ciddi anlamda çok büyüdü. Amazon mühendisleri ortalama olarak her 11.7 saniyede bir kod gönderirler proje içerisine yani production ortamına kod pushlamaktan ve ardından deploy almaktan bahsediyorum. Büyük bir proje içerisinde çalışıyorsanız ve bu büyük projeyi yönetmek için büyük bir ekibiniz var ise monolithic yapı size uygun değildir. Sebebi ise katmanlar üzerinde birbirine bağımlı çok fazla alt hizmetler vardır. Yapmış olduğunuz basit bir değişiklik diğer katmanları gereksiz yere etkileyebilir ve sürekli birbirini ezmeye çalışan kodlar üzerinde ki problemleri çözmeye harcayabilirsiniz vaktinizi. Şu an ise Amazon, Netflix, Google, PayPal ve Uber bu mimariyi oldukça benimsemiş durumda. Ülkemiz içerisinde de büyük, orta ölçekli ya da küçük geliştirmenlik firmaları projelerinde bu mimariyi uygulamak için ellerinden geleni yapıyorlar.

Microservice mimarisini daha detaylı bir çizim ile gösterecek olursak ise;

Esneklik (Flexibility)
Microserviceler iç yapısında birbirinden bağımsız olduğu için farklı servisler kullanmaya ihtiyaç duyduğumuz da en uygun teknolojinin kullanımına izin verir. Bunu biraz daha detaylı olarak incelemek istersek; belirli bir servisi oluşturan her ekibin bağımsız olarak çalıştıkları için tercih ettikleri programlama diline ve frameworke karar verebileceği anlamına gelir. Bu bağımsızlık kolaylıkla birbirleri arasında iletişimin sağlanmasının yanı sıra servislere kolay bir şekilde bakım yapılmasını da olanak tanır. Aynı zamanda bir web uygulamasının işlevselliğini etkilemeden ona ek bir özellik eklemek ya da artık kullanılmayan bir özelliği ortadan kaldırmak anlamına da gelir.

Yeniden Kullanılabilirlik (Reusability)
Bir şirket mikroservice mimarisini bir proje için geliştirip uyguladığında, diğer projeler için genişletilebilir bir referansa yani en azından şematik diyagrama sahip olur. Farklı projelerde programlama dili, geliştirme araçları farklı olsa bile çekirdek mimarinin çoğunu koruyabileceği ve yeniden kullanabileceği anlamına gelir.

Riski Azaltmak (Reduces Risk)
Yazının başından itibaren sürekli bağımsızlık diyorum ya aslında her bir servis microservices içerisinde yer alan ayrı bir servis ayrı bir nesnedir. Bu sebeple birbirinden bağımsız çalışırlar. Bağımsızlık sebebi ile herhangi bir bileşen, diğer bir ismiyle component kendi problemini tüm uygulamaya yayamaz. Diğer componentler başarılı bir şekilde çalışmaya devam ederler. Tabi bu hatayı gidermek ya da yeniden yazmak kolaylaşır. Problemi tüm yapı üzerinde aramak yerine sorumlu olan componente gidersiniz ve çözersiniz. Uygulamanın tamamen durması sorununu ortadan kaldırmış olursunuz.

Ölçeklenebilirlik (Scalability)
Bu madde benim favori maddem diyebiliriz. Monolithic mimari üzerinde ölçeklendirme yapmak isterseniz eğer ihtiyacınız olsa da olmasada istemsizce tüm uygulama üzerinde yapmanız gerekir tabi ona göre bir maliyet çıkar ya da en azından ona göre vakit harcarsınız fakat microservice içerisinde istediğiniz component üzerinde istediğiniz oranda ölçekleme yapabilirisiniz.

Continuous Delivery
Microserviceler, bir uygulamanın tüm yaşam döngüsünü yönetmek için sabit bir delivery model kullanır. Bu cümle kısa olmasına rağmen biraz anlamsız gelebilir ama demek istenilen geliştirmenler ve test ekipleri tek bir servis üzerinde birlikte çalıştığında, test süreci kolay ve hızlı bir şekilde tamamlanır. Üzerinde çalıştığımız mikroservice belirli bir amaca yönelik hizmet verdiği için kolay test edilebilir hale gelir. Bu da genel anlamda süreci hızlandırır.

Çeşitli Veri Depolama (Various Data Storage)
Yukarıda yer alan resimde de görebileceğiniz gibi microservice mimari monolithic mimarinin aksine uygulama içerisinde kullanacağınız verilerin farklı konumlarda depolanmasını sağlar. Bazı durumlarda iş yaptığımız şirketler büyük veri kümeleri ile ilgilenir ve bu verilerin kendine has özellikleri olabilir. Bu nedenle bazı sorunlara ortaya çıkabilir. Buna rağmen microservice mimari her servisin ihtiyaç duyduğu en uygun depolama yöntemini kullanarak bu sorunu da çözebilir.

Ekip İşbirliği (Easy Team Collaboration)
Bir servis üzerinde çalışan ekip üyeleri yeteneklerine göre o servise atanır. Aynı amaca hizmet eden ekip üyeleri odaklanma problemi yaşamaz ve servis kısa sürede tamamlanır. Netflix’in microservice mimarisi kullanmasının ana sebeplerinden bir tanesi budur. 25 mühendisleri aynı proje üzerinde çeşitli sorunlar ile karşılaşırken birlikte ve uyum içerisinde çalışmak zorundaydılar. Tabi bu biraz zor. Microservice mimarisine geçtikten sonra ise bir sürü küçük mühendislik ekibi kurdular ve sorunlarda ekip işbirliğide ekiplere özgü olarak güncellendi.

Çeviklik (Agility)
Yukarıda da söylediğimiz gibi, microservice mimarisinde ki her bir servis sadece bir işlev üzerinde çalışır. Üzerinde değişiklik yapmış olduğunuz kod parçacığını ölçeklendirme yapmak (scalability), test etmek ve release etmek çok daha kolaydır. Amazon sadece bu yüzden monolithic mimarisini microservicelere taşıdı. Karmaşık ekip yapılarının ve kod mimarisinin yerine daha küçük, daha verimli ve yapılar arası işlevliği olan bir mimari yer aldı.

Bildiğim kadarıyla ve elimden geldiğince sizlere microservice mimarinin önemini 8 madde ile açıklamaya çalıştım.Bu yazılıkta bu kadar ! Vakit ayırıp yazımı okuduğunuz için çok teşekkür ederim. Bu yazıyı post ederken dinlediğim şarkı ise: Mike WiLL Made-It, Nas, Rick Ross – Check Sonra ki yazılarda görüşmek üzere hoşçakalın !

0  

Bilişim Sektöründe Sertifikaların Önemi

Herkese Selamlar ! Bugün sizler ile beraber tarafıma abartmıyorum yüzlerce kez sorulmuş bir soruyu cevaplamak istiyorum. Aranızda özel ya da devlet, mühendislik ya da ilgili benzer bölümlerden mezun olmuş ama sertifikası olmayan yüzlerce kişi var ve özellikle şu sıralar pandemi dönemindeyiz ve evde vakit geçiren kişi sayısı arttığı için herkes sertifika almaya başladı. Bu yüzden olduğunu düşünüyorum ki sosyal medya hesaplarımdan tarafıma çok fazla bunun üzerine soru geldi. Sizinle çeşitli amaçla alabileceğiniz ya da almayı planladığınız sertifikaları ayrı başlıklar altında inceleyelim şimdi.

  1. Katılım Sertifikaları
    Yeni mezunsanız ve cvnizde aslında gerçekten de ben ilgilendiğim bu meslek adına bir şeyler yapıyorum ya da yenilikçiyim, sürekli bir öğrenme durumu söz konusu diyorsanız katılım sertifikaları sizin için işe yarayabilir. Şunu unutmayınız yalnız. Katılım sertifikalarının somut tek faydası budur. Teknik anlamda donanımlı olduğunuzu göstermez. Katıldığınız bir eğitim ya da konferansta bulunduğunuza dair belge, bir nevi yoklama diyebiliriz aslında peki katıldığınız o eğitim size ne kadar faydalı oldu ? İşte bu gerçekten tam bir muamma o yüzden katılım sertifikalarınızı yeni mezunsanız cvnize ekleyiniz onun haricinde pek tavsiye etmiyorum açıkçası.
  2. Özel Bir Kurum Tarafından Verilmiş Başarı Sertifikaları
    Aslında bu nokta cidden çok önemli. Herkes herhangi bir kurumua gidip onun maddi karşılığını ödedikten sonra eğitimi alabilir. Başarı kısmında ise o alan özgü kuruma ait sertifika bulunduğunuz şehirde ya da çalışmayı planladığınız şehirde ne kadar biliniyor. Çok biliniyorsa ve gerçekten az kişide varsa her şey çok güzel demektir. Peki aksi senaryoyu düşünecek olursak yani sertifika bilinmek ile beraber herkeste varsa ? İşte bu gerçekten iyi bir durum olmaz sizin açınızdan. Sebebi ise o kurum sertifikaları kolay veriyor demektir. Bu sizin cvnizde yer alsada kendinizi ispatlamak için çaba sarfetmenize sebep olablir. İspatlamaktan kasıt ise herhangi bir iş görüşmesine gittiğinizde o sertifikayı gerçekten hak ederek aldığınıza dair eğitim süreniz boyunca yaptığınız ciddi çalışmaları gösterebilirsiniz. Mülakatı yapan kişi açısından etkileyici olacaktır.
  3. Uluslararası Firmalardan Alınan Sertifikalar & Ünvanlar
    Daha önce yurtdışında bir firmada yazılım geliştirmeni pozisyonunda çalışmış biri olarak şunu söyleyebilirim ki herhangi bir ülkede almış olduğunuz eğitim ya da eğitim sonunda almış olduğunuz diploma (bir üniversite eğitiminden bahsediyorum) başka bir ülkede geçerli olmayabilir. Mesela ben Ege Üniversitesi mezunuyum eğer ki değişmediyse America’da bulunduğum dönemlerde bazı eyaletlerde diplomam geçerli iken bazılarında kabul edilmiyordu. İşte tam olarak bu noktada uluslararası çapta bir sertifikanınızın olması sizi kurtaracaktır. Çünkü o tarz bir belgenin elinizin altında olması sizin mülakata davet edilmenizi sağlayabilir. Bu tarz sertifikalar almanın bir diğer avantajı ise çalışmak istediğiniz firma ile sertifikasına sahip olduğunuz firma arasında ortaklık ( partnerlik ) sözleşmesi olabilir. O tarz durumlarda bazı firmaların belirli sayılarda sertifikalı personel çalıştırması gerekmekte ve sizde eğer ki o sertifikaya sahipseniz biraz değerli olabilirsiniz.
  4. Çok Fazla ve Farklı Alanlarda Sertifikalar Almayın !
    Çok samimi bir şekilde söylüyorum ki bu yazının en can alıcı noktası burası diyebilirim. Neden derseniz sertifika almak iş görüşmelerinde etkiler karşı tarafı fakat şunu unutmayınız ki çok fazla ve farklı alanlarda sertifika almanın gerçekten somut bir zararı vardır. Bu tarz sertifikaları almak zordur ve vakit ayırıp çalışmanız gerekir. Eğer ki çok fazla varsa bu sertifikalardan mülakatı yapan kişi muhtemelen “Bu aday ne zaman proje geliştirdi acaba ?” diye bir düşünecektir.

    Farklı alanlarda sertifika almak ise sizin uzmanlaşmak için kararsız kaldığınızı bir uzmanlığınız olmadığı için kariyerinizde ilerleme konusunda problem yaşayacağınızı gösterir ki bu tarz bir şey yaşamanızı hiç istemeyiz.

  5. Bonus !
    Diploma ya da sertifika neye sahip olursanız olun. Bunlar sadece sizi mülakat masasına kadar götürecektir. İçeriye esas girmenizi sağlayacak olan bilginiz, proje tecribeniz kısacası iş hayatında tam olarak neler yaptıklarınızdır. Daha önce de dediğim gibi eğer ki iş tecrübeniz yoksa karar verdiğiniz bir uzmanlık alanınıza yönelik sertifikaları alarak cvnizde yer almasını sağlayabilirsiniz. Vermiş olduğum her seminerde, webinerde ya da eğitimde sürekli dile getirdiğim bir söz var ve burada bir kez daha söylemek istiyorum. İş, işte, iş yaparak öğrenilir.  Siz kariyeriniz için elinizden geleni yapın gerisi kendiiliğinden gelecektir. Bu yazılıkta bu kadar ! Vakit ayırıp yazımı okuduğunuz için çok teşekkür ederim. Bu yazıyı post ederken dinlediğim şarkı ise: Michael Kiwanuka Love & Hate Sonra ki yazılarda görüşmek üzere hoşçakalın !
0  

Asp .Net Core MVC üzerinde Tekli ve Çoklu Resim Yükleme

Herkese Selamlar ! Bugün sizler ile beraber asp.net core mvc üzerinde tekli ve çoklu resim yükleme işlemlerine bakacağız. Web uygulamalarında artık dosya yükleme işlemi olmazsa olmaz duruma geldi. Herhangi bir web uygulamasına girdiğinizde kariyer sitesi, sosyal medya, kamu işlemleriniz için kullanabileceğiniz ya da günlük hayatta girdiğimiz sıradan web uygulamasında bile resim yükleyebileceğimiz bir alan ciddi bir ihtiyaç haline geldi. Bugün ise sizler ile beraber Core MVC üzerinde bu işlemi tam olarak nasıl gerçekleştiriyoruz bir ona bakacağız. İlk aşamada uygulamamız bir core mvc uygulaması olduğu için Startup.cs sınıfımızı aşağıda ki gibi düzenliyoruz.

 

    public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                services.AddMvc();
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvcWithDefaultRoute();
        }
     }

Uygulamamızı tam olarak açıklamaya başlamadan önce daha önce bahsetmiştim ama bir kez daha kısa bir şekilde açıklamakta fayda var ViewImports. Birden fazla view içerisinde ortak olarak kullanılmasını beklediğimiz directiveleri topladığımız bir yer var orası da ViewImport . Ayrı ayrı eklemek zorunda kaldığımız bir takım directivelari sadece bir adet ViewImport içerisine ekleyerek tüm viewlar tarafından kullanılmasını sağlayabiliriz. _ViewImports.cshtml dosyamızın gövdesine ise aşağıda ki tek satırı ekliyoruz.

 

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

@addTagHelper sayesinde eklediğimiz viewlar üzerinde ihtiyaç duyduğumuz helperlara rahatlıkla erişip kullanabileceğiz. Şimdi ise tek bir görsel nasıl upload edilir buna giriş yapabiliriz. Uygulamamızın Controllers klasörüne bir adet “HomeController” isminde controller ekliyoruz ardından ise aşağıda yer alan tanımlamalarımızı yapıyoruz.

 

IHostingEnvironment _env;
Random rnd = new Random();
string directory;

Bu yazıyı okuyanlar arasında klasik asp.net ya da asp.net mvc üzerinde çalışmış olanlar vardır diye düşünüyorum. Bu tarz eski platformlar arasında sunucu ile ilgili bir işimiz olduğunda “Server” propertysi ile işlermizi yürütüyorduk. Özellikle söz konusu resim ya da bir dosya yükleme işlemi olduğunda Server.MapPath her zaman bize yardımcı olmuştur. .Net Core mimarisi geldikten sonra ise sunucu ortamı ile ilgili işlemlerimizi yürütebilmemiz için IHostingEnvironment geldi. IhostingEnvironment üzerinde çalıştığı sunucu hakkında bize ortamsal bilgileri getiren bir interfacedir. Sunucu üzerinde resimlerimizin kayıt altında tutulması için ihtiyacımız olan dizini bu interface sayesinde gerçekleştiriyor olacağız.
String tipinde olan directory ise yolun kendisini , random nesnemiz ise resmimize rastgele bir isim vermemizi sağlayacaktır.

 

        public HomeController(IHostingEnvironment env)
        {
            _env = env;
            directory = _env.ContentRootPath + "/Images/";
        }

Yukarıda yer alan kod bloğumuzda ise bir adet yapıcı method içerisinde değerlerin doğrudan atanmasını sağladık. _env.ContentRootPath kendi uygulamamızın dizinini verir bize. Ben ise doğrudan dizin içerisinde değil “Images” klasörü altında toplanmasını istediğim için uygulamamıza bir adet “Images” isminde klasör açıyorum. Ardından sayfamızı göstereceğimiz sıradan bir IActionResult tipinde Index isminde bir methodumuz var.

 

        public IActionResult SingleFile(IFormFile file)
        {
          
            using (var fileStream = new FileStream(Path.Combine(directory,rnd.Next(0,99999).ToString()+".png"),FileMode.Create,FileAccess.Write))
            {
                file.CopyTo(fileStream);
            }
                return RedirectToAction("Index");
        }

Resim yükleme işlemlerimizi gerçekleştirecek olan esas methodumuz ise ;

 

        public IActionResult SingleFile(IFormFile file)
        {
          
            using (var fileStream = new FileStream(Path.Combine(directory,rnd.Next(0,99999).ToString()+".png"),FileMode.Create,FileAccess.Write))
            {
                file.CopyTo(fileStream);
            }
                return RedirectToAction("Index");
        }

Bu method aslında gayet kolay. Arayüz üzerinden gelecek olan resmi yakalayan IFormFile tipinde file isminde bir parametremiz var. Using içerisinde ise resmin kayıt altına alacağı directory dizini ona verdiğimiz rastgele bir isim (dosya altında isimler çakışmasın diye ) ve bir adette dosyamızın uzantısı yer almakta. Dosya modumuzun create ve bir adette yazma iznini vermemiz gerekmekte. Takiben fileStream sayesinde kişisel bilgisayar içerisinde bir dizinde yer alan resmi kendi sunucumuz içerisinde kopyalıyor ve yine kendi viewimiz üzerine yönlendiriyoruz. Bu işin back-end kısmıydı. Front-end tarafında ise ;

 

<div>
    <h4>Single file Upload</h4>
    <form asp-controller="Home" asp-action="SingleFile" enctype="multipart/form-data" method="post">
        <input type="file" name="file" value="" />
        <button type="submit">Submit</button>
    </form>
</div>

Hangi controller üzerinde ve hangi action sayesinde bu form koşacak onu belirtiyoruz. Tabi ki de söz konusu bir dosya olduğu için encryption type ve methodun post zamanında tetikleneceğinide söylememiz gerekmekte. Uygulamamızı çalıştırınca karşımıza gelecek olan ekran gayet sade.

Çalıştırıp denediğimizde ise “Images” klasörümüz altında bu resimlerin yüklendiğini görebiliriz.

Tekli dosya yükleme işlemi bu kadar kolay. Sıra geldi çoklu dosya işlemine aslında o da bir öncekine ciddi anlamda benzer. Sadece ufak tefek farklılıklar söz konusu. “MultipleFiles” isminde ayrı bir IActionResult daha ekliyoruz.

 

        public IActionResult MultipleFiles(IEnumerable<IFormFile> files)
        {
            foreach (var file in files)
            {
                using (var fileStream = new FileStream(Path.Combine(directory, rnd.Next(0, 99999).ToString() + ".png"), FileMode.Create, FileAccess.Write))
                {
                    file.CopyTo(fileStream);
                }
            }
            return RedirectToAction("Index");
        }

Bu sefer ise parametre olarak IEnumerable tipinde parametremizi hazırlıyoruz. Sebebi ise belli birden fazla resim gelecek çünkü. Aynı tekli dosya içerisinde kurguladığımız yapıyı ise foreach döngüsü ile tekrarlanmasını sağlıyoruz. Bu sayede her bir resim için aynı işlem tekrarlanmış oluyor.

Front-End tarafında da tahmin edeceğiniz gibi sadece küçük bir detay söz konusu.

 

<div>
    <h4>Multiple file Upload</h4>
    <form asp-controller="Home" asp-action="MultipleFiles" enctype="multipart/form-data" method="post">
        <input type="file" multiple name="files" value="" />
        <button type="submit">Submit</button>
    </form>
</div>

Bu detay ise file tipindeki input parametremizın multiple olduğunu belirtiyoruz. İşte bu kadar. Artık sizlerde ihtiyacınız olması durumunda core mvc web uygulamalarınıza resim yükleme işleminizi kolayca gerçekleştirebileceksiniz. Örneği ise github hesabımdan tam olarak görebilirsiniz. Bu yazıyı post ederken dinlediğim şarkı ise: Metallica – Sad But True
Yazımı okuduğunuz için teşekkür ederim. Sonra ki yazılarımızda görüşmek üzere !

0  

Asp .Net Core MVC üzerinde Sayfalama (Pagination) Nasıl Yapılır ?

Herkese Selamlar ! Bugün sizler ile beraber sayfalama yani pagination nasıl yapılır ona bir bakacağız . Özellikle bir sayfa üzerinde çok satırlı veri göstermek durumunda kaldığımız da bazen hem kullanıcı taraflı hem de yazılım geliştirmeni taraflı problemler ortaya çıkabiliyor. Bir sürü veriyi tek bir sayfa üzerinde göstermek demek aslında kullanıcının aramak istediği veriyi bulması için sayfa üzerinde dakikalarca aşağı inmek zorunda kalması anlamına gelebilir. Yazılım geliştirmeni tarafından baktığımız da ise çok satırlı verileri veri tabanı üzerinden çektikten sonra tek bir sayfa üzerinde göstermeye çalışmak ciddi performans sorunlarına sebep olabilir. Bu tarz durumlarda sayfalama kullanmak gerçekten başarılı bir çözüm yolu olacaktır. Yazımız içerisinde .net core mvc ve entity framework core kullanarak hazırladığım örnek üzerinden ilerleyeceğiz.

İlk olarak PaginationDB isminde bir veritabanı , içerisine ise Product isimli bir tablo yaratıyorum. Tablonun sütunları ise ProductID, ProductName , ve Discontinued isimli. ProductID tipi int , primary key ve otomatik artan . ProductName nvarchar(50) ve son olarak Discontinued ise bool tipinde . Bu aşamayı geçtikten sonra ise bir .net core mvc projesi başlatıyoruz. StartUp.cs in içerisnde ConfigureServices methodunun gövdesine ise 2 farklı kod satırı ekliyoruz. Bunlarda ilki ;

Services.AddMvc( ) methodu . Bu method aracılığı ile projemizi tam olarak bir MVC seklinde kullanmak ya da bir diğer şekli ile mvc hizmetini kullanmak istiyorsanız bu methodu ConfigureServices isimli methodun gövdesine ekliyoruz.

Ardından eklememiz gereken method ise Services.AddSingleton() fakat bu method tam olarak giriş yapmadan önce IActionContextAccessor tam olarak ne işe yarıyor bir onu açıklayalım sizlere. Bu görmüş olduğumuz nesne Context bilgilerimizin Controller tarafında tam olarak kullanılmasını sağlar Services. AddSingleton methodu sayesinde ise kullanacağımız nesneye her ihtiyac duyduğumuzda değil sadece bir sefer instance alınarak kullanılmasını sağlar.

 

public void ConfigureServices(IServiceCollection services)
{
            services.AddSingleton<IActionContextAccessor,ActionContextAccessor>();
            services.AddMvc();
}

Takiben ise Configure methodunun içerisine uygulamamızın standart routin kısmını ayarlıyoruz ve Startup.cs içerisinde işimiz bitiyor.

 

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Product}/{action=Index}/{id?}");
            });

Projemize appsettings.json dosyasını ekleyerek yolumuza devam ediyoruz. Dosyamız içerisinde veri tabanına bağlanmamızı sağlayacak olan bağlantı ifademizi yazıyoruz.

 

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=PaginationDB;user id=sa;Password=YourPasswordMustBeHere"
  }
}


Yavaş yavaş uygulamamız şekilleniyor. Models klasörünün içerisine Product isimli bir sınıf ekliyoruz ve gövdesini veri çekeceğimiz tabloya göre oluşturuyoruz.

 

[Table("Product")]

    public class Product
    {
        public int ProductID { get; set; }

        public string ProductName { get; set; }

        public bool Discontinued { get; set; }
    }

Sınfın üzerinde görmüş olduğunuz [Table(“Product”)] veri tabanı içerisinde özellikle belirtilmiş olan bir tabloya map edilecek ise yani eşitlenecek ise kullanıyoruz . Bu sınıfı da tamamladıktan sonra DataContext isimli ayrı bir sınıf daha ekliyoruz. DataContext sınıfımıza DbContext sınıfımızdan kalıtım alıyoruz ki problemsiz bir şekilde Entity Framework Core yapısını kullanabilelim . DataContext sınıfımızın esas amacı ise daha önceden uygulamamıza eklemiş olduğumuz appsettings.json dosyamızda yer alan connection strings yani bağlandı ifadesini okumak ve doğru bir şekilde veri tabanı ile haberleşebilmektir. DataContext sınıfımızın gövdesini ise aşağıda ki gibi doldurabiliriz.

 

public class DataContext:DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var builder = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json");

            var configuration = builder.Build();

            optionsBuilder.UseSqlServer(configuration["ConnectionStrings:DefaultConnection"]);
        }

        public DbSet<Product> Product { get; set; }

    }

Controller tarafına tam olarak geçmeden önce sayfalama işlemini kolay bir şekilde yapmamızı sağlayan 3. Parti bir araç olan “PagedList.Core.Mvc” aracını Manage Nuget Packages üzerinden kuruyoruz projemize.

Uygulamamızda ihtiyaç duyduğumuz altyapıyı neredeyse tamamladık. Bir adet Product isminde controller ekliyorum ve gövdesini aşağıda ki gibi kodluyorum.

 

using Microsoft.AspNetCore.Mvc;

using PagedList.Core;

using PaginationWithASPNETCoreWithEF.Models;

namespace PaginationWithASPNETCoreWithEF.Controllers
{
    [Route("Product")]
    public class ProductController : Controller
    {
        private DataContext _db = new DataContext();

        [Route("index")]
        [Route("")]
        [Route("~/")]
        public IActionResult Index(int page = 1, int pageSize = 3)
        {
            PagedList<Product> model = new PagedList<Product>(_db.Product,page,pageSize);

            return View("Index",model);
        }
    }
}

IActionResult içerisinde sayfalama içerisinde ihtiyaç duyacağımız 1 sayfa içerisinde kaç adet satır bulunacak kısmını ise Index methodunun içerisinde parametre olarak barındırıyoruz . Methodun gövdesinde ise PagedList üzerinden instance alıyoruz ve hangi nesne üzerinde çalışması gerektiğini 1 sayfa üzerinde kaç satır veri gözükmesi gerekiyor pagedlist nesnesi içerisine bunları parametre olarak giriyoruz.Methodun dönüş tarafında ise View kısmına yönlendirirken model ile beraber gönderiyoruz ki sayfalama yaptığımız her veriyi taşıyabilelim. Tüm bu aşamaları geçtikten sonra bir adet view eklememiz gerekmekte fakat View eklemeden önce son bir kısım daha var o da ViewImport . Uygulama içerisinde aslında uygulama yerine birden fazla view içerisinde ortak olarak kullanılmasını beklediğimiz directiveleri topladığımız bir yer var orası da ViewImport . Ayrı ayrı eklemek zorunda kaldığımız bir takım directivelari sadece bir adet ViewImport içerisine ekleyerek tüm viewlar tarafından kullanılmasını sağlayabiliriz. Şu an pek ihtiyacımız yok ama yine de bu yazı içerisinde bahsetmek istedim. Proje içerisine bir adet Razor View Import ekliyoruz ve gövdesini ise aşağıda ki gibi düzenliyoruz .

 

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *,PagedList.Core.Mvc

Geriye sadece tek bir iş kaldı o da View tarafını düzenlemek . View alanında sayfalamayı zaten harici bir araç üzerinden gerçekleştirdiğimiz için sadece veriyi uygun formatta ve bootstrap kullanarak göstermek kalıyor o kadar .

View kısmını ise aşağıda ki gibi düzenliyoruz.

 

@{
    Layout = null;
}

@model  PagedList.Core.IPagedList<PaginationWithASPNETCoreWithEF.Models.Product>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22https%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.11.3%2Fjquery.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22https%3A%2F%2Fmaxcdn.bootstrapcdn.com%2Fbootstrap%2F3.3.5%2Fjs%2Fbootstrap.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
</head>
<body>

    
<table class="table table-hover">

        
<tr>
            
<th>ProductID</th>

            
<th>ProductName</th>

            
<th>Discontinued</th>

        </tr>

        @foreach (var product in Model)
        {
        
<tr>
            
<td>@product.ProductID</td>

            
<td>@product.ProductName</td>

            
<td>@product.Discontinued</td>

        </tr>

        }
        
<tr>
            
<td colspan="3" align="center">
                <pager list="@Model" asp-controller="Product" asp-action="Index"/>
            </td>

        </tr>

    </table>

</body>
</html>

Şu an her şey hazır . Uygulamamızın ekran görüntüsü ise aşağıda ki gibi;

 

Bu yazılıkta bu kadar uygulamayı github adresimden indirebilirsiniz. Yazımı okuduğunuz için teşekkür ederim .Bu yazıyı post ederken dinlediğim şarkı ise: Aerosmith – Crazy Sonra ki yazılar da görüşmek üzere.

0  

17 Nisan 2020 IEEE Yaşar Üniversitesi Discord Oturumu

Herkese Selamlar ! Başlıktan da anlaşılacağı gibi 17/04/2020 tarihinde saat 20:00 de Yaşar Üniversitesi IEEE öğrenci topluluğunun düzenlediği discord oturumunda konuşmacı olacağım. Vaktiniz varsa dinlemenizi tavsiye ederim. Oturuma linke tıklayarak erişebilirsiniz. Şimdiden herkese teşekkür ederim…

0  

Mustafa KEMAL

Herkese Selamlar ! Yakın arkadaşlarım ve sosyal medya üzerinden arkadaş olduğumuz kişiler var ise aranızda elimden geldiğince çok okumaya çalıştığımı hemen hemen herkes bilir . Okumak güzel şey gerçekten . Oturduğunuz koltuktan çok uzaklara gidebiliyorsunuz üstelik sadece sayfaları çevirerek. Bugün sizler ile düşüncelerimi paylaşmak istediğim kitap ise 2018 yılında piyasaya çıkmış olan Mustafa Kemal . Yazarı ise Yılmaz ÖZDİL .

Her ne kadar tasvip etmesem de kitabın farklı versiyonları çok uçuk meblağlara yayın evinin kendi sitesinden satıldı ve her ne kadar herkes tasvip etmediğini söylese de dakikalar içerisinde o uçuk meblağlı kitap tükendi. Ben ise karton kapaklı olanından bir adet edindim . Yukarıda ki cümle de yer alan kısmı bir kenara bırakırsak kitap gerçekten etkileyici şekilde güzel . Ulu Önder Mustafa Kemal ATATÜRK‘ün doğumundan ölümüne kadar her detayı büyük bir tarafsızlıkla okuyorsunuz. Öğrencilik yıllarında ki hedeflerini oluşturması , bulunduğu koşullar dahilinde bahane üretmeden hedeflerine nasıl gittiğini , günümüzde yaşayan bizler için büyük bir ders niteliğinde . O dersi almazsak rakı sofralarında ülkeyi kurtarmaya devam ederiz tabi o konu çok ayrı. Kitabı genç – yaşlı demeden her meslek grubundan herkesin okuması gerekmekte . O devirde ki vizyonerliği , askeri stratejilerinin başka komutanlar tarafından nasıl kullanıldığı okuyarak nerelere gelinebileceğinin somut kanıtı . Kararlı duruşu , insanları kırmadan onlara karşı nasıl tavır takınarak istediklerini yaptırdığı , ileri görüşlülüğü ….. ve daha bir çok kişisel özelliği . Şu tarz bir soru sorabilirsiniz bana bu kitabı diğer Atatürk kitaplarından ayıran fark ne ? Aslında bende o farkı merak edip kitabı alanlardanım. İçerisinde verilen örnekler ve anlatılan tüm anılar belgeler ile ispatlanmış . Kötü özelliklerine de yer verilmiş . Bu da yazarın objektif davrandığını ve kitabın samimiyetini gösteriyor , dili çok yalın. Kadın , erkek yediden yetmişe herkesin sıkılmadan okuyacağı bir kitap . Özellikle eğitiminiz ve kariyeriniz anlamında siz de ne yapacağınızı bilmeyenlerdenseniz size de müthiş bir şekilde bu kitap yardımcı olacaktır . Bu arada daha önce paylaşmıştım ama okuduğum diğer kitaplara ise: goodreads.com üzerinden erişebilirsiniz. Bu yazılıkta bu kadar . Bu yazıyı post ederken dinlediğim müzik ise : Metallica: One Sonra ki yazılarda görüşmek üzere hoşça kalın ….

0  
EnglishGermanTurkish