Heroku’da asp.net core uygulaması yayınlamak

Yaptığımız projeleri başka insanlara, ekiplere, müşterilere gösterme ihtiyacı hissederiz. Neden ?

  • Fikrinizi olgunlaştırmak için baştan sona bir uygulama yazmak yerine onun sadece önyüzlerini hazırlayıp başka insalara gösterebilirsiniz (protatip) ve onların yorumlarına göre projeye devam edebilirsiniz,
  • Müşterinize bu projeyi yapabileceğinizi göstermek için POC (Proof Of Concept) hazırlayabilirsiniz
  • Kendi kişisel uygulamalarınızı bir portfolio haline getirmek için vb. bir çok sebep sayılabilir.

Heroku özellikle kişisel projelerinizde kullanabileceğiniz çok güzel bir platform. Her hesap için 5 uygulama oluşturma hakkınız var. Ben asp.net core mvc,  web api, react, node.js gibi uygulamaları oluşturup heroku da yayınlayabildim.

Hemen sizde başlayın !

Ben visual studio code kullanıyorum, siz isterseniz command line ve visual studio ile de anlatacağım aşamaları gerçekleştirebilirsiniz.

  • İlk olarak heroku, git ve dotnet cli larını kurmanız gerekiyor , kurduktan sonra aşağıdaki şekilde cmd de –version yazarak kontrol etmeniz önemli. Benim kurduğum versiyonlarını aşağıda görebilirsiniz.

  • Kurulum aşamalarını atlattıktan sonra yine cmd ile projemiz için bir dizin yaratıyorum. Eğer vs code editörü sizde kurulu ise code . komutu ile o dizini vscode ile açacaktır.

  • Vs code açıldıktan sonra CTRL+” ile terminali açıyorum. dotnet –help veya dotnet new –help yaparak oluşturmak istediğiniz proje template lerine ait komutları kolaylıkla bulabilirsiniz. Ben dotnet new mvc ile proje oluşturdum ve ardından dotnet build ve dotnet run ile uygulamanın çalışıp çalışmadığını kontrol ettim.

  • Daha sonra heroku login komutu ile heroku hesabımın email adresi ve şifresini girdim. Tabi bunu yapabilmek için heroku hesabınızın olması gerekiyor 😀 sizi şuraya alalım.
  • Ben uygulamayı bu hali ile yayınlamak istiyorum o yüzden artık source control e kodlarımızı commit edebiliriz. Aşağıdaki listedeki komutları sırasıyla uyguluyorum.
    • git init
    • git add .
    • git commit -m Initial
  • Şmdi geldi heroku üzerinde uygulamamızı yaratmaya heroku create app-name komutu ile uygulamanızı oluşturabilirsiniz. Benim uygulamamın adı ticketnow. Fakat kullanıldığından dolayı bende ticketrightnow olarak bir uygulama oluşturdum.
  • Heroku platformu .net uygulamalarına destek vermiyor, heroku da .net core ait dll leri yüklenmesi ve uygulamanın build olabilmesi için buildpack eklememiz gerekiyor
    • heroku buildpacks:set jincod/dotnetcore komutu ile buildpack i ekliyorum
  • Daha sonra uygulamayı heroku ya göndermek için git push heroku master ile uygulamam hatasız bir şekilde deploy olması gerekiyor. Eğer aşağıdaki görüntüye benzer bir output aldıysanız hemen heroku open komutu ile uygulamanızın linkine gidebilirsiniz.

Benim yayınladığım uygulamaya https://ticketrightnow.herokuapp.com buradan erişebilirsiniz. Faydası olabileceğini düşündüğüm bazı linkleri aşağıya bırakıyorum.

Görüşemek üzere,

Linkler

Dapper

905bb8f6-e568-4eda-a2a1-7e6b0b95420e

Herkese merhaba,

Bu makalede sizlere stackoverflow tarafından geliştirilen micro orm kütüphanesi olan Dapper dan bahsediyor olacağım.Dapper Entity Framework gibi tam bir ORM (Object Relation Mapper) kütüphanesi değildir. Diğer ORM kütüphaneleri ile karşılaştırıldığında en dikkat çekici özelliği performansıdır. Neredeyse ADO.NET kadar hızlıdır. Büyük ölçekli .NET projelerinde veri erişimi için ado.net yerine tercih edilebilecek en iyi alternatif diyebiliriz.

Dapper tek bir DLL den oluştur. Projenize nuget aracılığıyla aşağıdaki satırları yazarak dapper kütüphanesini ekleyebilirsiniz.

Örnek veri modelimizi aşağıda görebilirsiniz.

Company modeli için temel işlemlerimizi(CRUD) gerçekleştirmek istiyoruz.Bunu Dapper kullanarak yapacağız. Bunun için bir repository sınıfı yazdık.Temel işlemler bu sınıfın içerisinde yer alacak. Methodları incelediğinizde kodların içerisinde T-SQL sorgularını yazdığımızı da göreceksiniz. Dapper EF gibi otomatik sorguları oluşturmuyor. Tabi ki bunu sağlayacak Dapper-Extention kütüphanesi var. Buradan inceleyebilirsiniz.

Dapper Connection nesnesi üzerinden işlemleri gerçekleştiriyor.

Ayrıca kodun içerisine t-sql kodları yazmak istemiyorsanız bunların daha yönetilebilir olmasını istiyorsanız Stored Procedure leride kullanabilirsiniz. Aynı Repository sınıfın Stored Procedure kullanan şeklini de aşağıda görebilirsiniz.

Ayrıca dapper asenkron yapıyı  ve QueryMultiple() methodu ile de çoklu sorgu çekmemizi sağlar. Eğer dapper kullanıyorsanız projenize Dapper extention ı da ekleyerek dapper ı daha otomatik ve kullanışlı hale getirebilirsiniz. Temelini dapper oluşturan kendi projenize özgü veri erişim kütüphanesi oluşturabilirsiniz.

Aşağıda örnek proje dosyasını ve bağlantıları bulabilirsiniz.

İyi Çalışmalar

Proje Dosyaları ;

Teknik mülakatlar

Herkese merhaba diyerek başlamak istiyorum öncelikle. Uzun zamandır bloguma gereken özeni göstermediğimin farkındayım tabi ki bir sürü şey okuyup teknik şeyler deneyimliyoruz iş hayatında fakat bunlardan çok azını yazıyorum, işin korkunç olan kısmı bu yazım bile 2017’nin ilk yazısı. Neyse artık daha çok yazı yazmaya özen göstereceğim kendime buradan söz vermiş olayım.

Bu yazımda teknik mülakatlar üzerine deneyimlerimi aktarmaya çalışacağım.Yazılımcı olarak belirli dönemler de iş değişikliği veya yeni fırsatları değerlendirme anlamında bir dizi iş görüşmesinde katılıyoruz.Bu iş görüşmelerinin ilk olarak insan kaynakları ile görüşürsünüz.eğitim ve kariyer sürecinizden bahsedip genel bir tanışma havasında geçer bu görüşme. Daha sonra eğer olumlu bir izlenim bırakırsanız teknik insanlarla mülakat sürecine girersiniz.Bu aşamada teknik bilginizi ve analitik düşünme, problem çözme becerinizi ölçmeye yönelik sorular sorulur.

Bu görüşmeler yüz yüze olabileceği gibi skype üzerinden uzaktan bağlantı şeklinde de olabiliyor ve hatta teknik görümeler adayı daha iyi tanımak ve ölçmek için iki adet teknik görüşme isteyebilirler.

Yaklaşık 4.5 senedir profesyonel olarak yazılım geliştirici olarak çalışıyorum.Özellikle .NET teknolojilerinde uzman arkadaşlar için bu teknik mülakatlarda ne gibi sorular sorulduğuna dair bir liste paylaşacağım sizlerle.

  • String ve StringBuilder arasındaki fark nedir ?
  • Access Modifiers nelerdir ? Internal ?
  • Sealed nedir ?
  • Pattern ve Anti-Pattern kavramlarını açıklar mısınız ?
  • Reference-Type ve Value-Type nedir ? String ne tipindedir ?
  • OOP temelleri açıklayabilir misin ?
  • ORM nedir ? Hangilerini kullandın ?
  • Reflection nedir ?
  • Aspect Oriented Programming nadir ?
  • Interface ve Abtract Class arasındaki fark nedir ?
  • Process ve Thread ilişkisini söyler misiniz ? Multi-Thread nedir ?
  • Tek Process li bir CPU da birden fazla Thread oluşturabilir misin ?
  • Thread-Safe nasıl sağlanır ? Thread statusları nelerdir ?
  • Virtual – Override nedir ?
  • Dapper ı diğer ORM kütüphanelerinden ayıran nedir ?
  • WebStorage nedir ?
  • Micro servis nedir ?
  • Stored Procedure ve Function arasındaki farklar nedir ?
  • MVC nedir ? MVC life-cycle ı açıklayabilir misin ?
  • Sistemde bir sayfa çok geç yükleniyor, ilk önce bakacağın şey ne olur ?
  • Post-back ve call-back arasındaki fark nedir ?
  • Linq nedir ? ne işe yarar ?
  • Normalizasyon nedir ?
  • Asp.net MVC de HtmlHelper nedir ? TextBox ve TextBoxFor arasında ne fark var ?
  • RazorEngine nedir ?
  • SOLID prensipleri nedir ? bir kaçını açıklar mısınız ?
  • Tasarım desenleri daha önce hangilerini kullandın ? Bir kaçını açıklayabilir misin ?
  • Singleton ve Static sınıflar arasında ne fark var ?
  • Jquery de == ve === arasındaki fark nedir ?
  • Bir tabloda A.B ve C kolonlarına index tanımladım.Daha sonra tablodan sorgu çekerken where ifadesine sadece A ve B için kriter ekledim. Bu durumda Index çalışır mı ?
  • Index nedir ne işe yarar ? clustered Index nedir ?
  • Rest API nedir ?

Bu tür soruları ikiye ayırabiliriz. Temel yazılım geliştirme soruları; tasarım desenleri, prensipler nesne yönelimli sorular vs. ve teknoloji odaklı sorular; asp.net mvc, razor engine, jquery vs.

Şirketler özellikle yüz yüze olan mülakatlarda genele 10 soruluk bir sınav da yapabiliyor. Burada bazı kod parçalarını vererek hatayı bulmanızı veya kodun çıktısını yorumlamanızı isteyebilirler.

Örneğin ; Aşağıdaki resimde bunun benzeri bi soru göreceksiniz. Her bir mesaj ayrı bir soru olarak düşünün kalıtım ve type dönüşümlerine ait bir soru. kod parçasınınn hata alıp almayacağını hata alırsa runtime-error mü yoksa compile-error mü olacağını soruyor.

Bazı sorular ise problem çözmeye becerinizi ölçmeye dair sorular. Örneğin ;

  • Bir üçgen düşün. bu üçgenin her köşesinde bir karınca var ve hepside aynı hızda yürüyorlar ve hepside üçgenin çizgileri üzerinde yürüyorlar. Bu karıncaların çarpmama olasılığı kaçtır ?
  • Bir yazılımcınız var ve bu yazılımcıya A/G olarak her gün sonunda bir külçe altın veriyorsunuz. Elinizde de 7 külçeli bütün bir altın var.Tabi ki bu külçeler bölünebiliyor. Elinizdeki bu 7 parçalı altını toplamda iki kere bölerek 7 gün boyunca yazılımcının A/G bedelini ödemeniz gerekiyor nasıl yaparsınız ?
  • Sınırsız bir su kaynağınız var. 3 ve 5 litrelik bir su kabınız var. Bir de 4 litrelik bir su kabı var.Elinizdeki 3 ve 5 litrelik kapları kullanarak 4 litrelik kaba su koymanız gerekiyor. Kaplarda kalan sular dökülmeden bunu nasıl yaparsınız ?

Ekte yazılı bir mülakat sorularını bulacaksınız. Technical_Interview_Questions indirebilirsiniz.

Umarım faydalı olmuştur. Görüşmek üzere

Template Method Tasarım Deseni

Capture

Bu yazımda template method tasarım desenini anlatmaya çalışacağım.Aşağıda bununla ilgili güzel bir örnek de bulacaksınız.

Madde madde anlatalım ;

  • Davranışsal tasarım deseni grubuna girer ve %60 kullanım oranına sahiptir.
  • Bir işlemi gerçekleştirmek için gerekli alt adımları net olarak bilinen (algoritmik akışı olan) ve bu alt adımları temel sınıfta soyut olarak tanımlayarak algoritmanın nasıl işleyeceğini template method belirler.
  • Template method tasarım deseni ; algoritma adımlarını soyut bir sınıfa(abstract) tanımlayarak asıl sınıflar(concrete) tarafından ezilip(override) çalıştırılmasını düzenler.
  • Template method tasarım deseni , bir algoritmanın (algoritma iskeletinin) bir den fazla biçimde veya içerikle çalışmasını sağlar.
  • Eğer algoritma iskeletinde bir değişiklik yapılacaksa bu tek bir yerden yapılır ve böylece kod tekrarı önlenmiş olur.

Desenin UML şeması ;

Template_method_pattern_class_diagram

Template tasarım deseni için gerçek dünya senaryoları ;

Örnek senaryo ; 

Şirketler için gerekli olan bir çok raporlama şekli ve rapor vardır.Bu raporlarlar bir araç aracılığıyla rapor kaynağını okuyarak excel, word, pdf, txt gibi çıktıları üretir ve önceden tanımlanmış dizinlere belirli aralıklarla(günlük,haftalık,aylık) atar.Bu yazı için kodlayacağımız senaryo da bu rapor üretimi ile ilgilidir.

Örnek senaryomuz (rapor oluşturma adımları) için algoritmik akış adımları ;

  • GetReportDefinitions : rapor için konfigure edilmiş ayarlar alınır.örn; raporun dosya tipi,çıktı dizini,rapor kodu gibi
  • RunReportJob : rapor verisini oluşturacak iş çalıştırılır.
  • ValidateReport :  rapor yer alan içerik tiplerinin valide olup olmadığının kontrolü yapılır
  • CreateReportFile : rapor kaynağına göre fiziksel dosya oluşturulur.
  • ExtractReportFile : dosya belirtilen dizine atılır.

Kod parçası ; 

  • Raporların üretimi için bir (baseprocessor) temel işlemci sınıfı tasarlıyacağız.Bu sınıf her rapor için aynı olan işlemleri, loglama yapısınını ve olay mekanizmasını içeriyor.Her rapor işlemcisi bu temel işlemci sınfını (baseprocessor) kalıtmak zorundadır.
  • Burada konumuzla alakalı olmamasına rağmen (event) olay mekanizması ekledim ve bunun faydalı olacağını düşünüyorum.
  • Burada primitive method lar List olarak bir liste halinde türeyen sınıfdan alınır ve baseprocessor bunu teker teker çalıştırır.Böylece daha dinamik bir template method kullanımı elde etmiş oluyoruz.Eğer istenirse raporların oluşumu için gerekli methodlar belli olduğundan List tipinde tanımlanmayıp doğrudan istenilen method lar (GetReportDefinitions,RunReportJob,ValidateReport,CreateReportFile) eklenebilir ve algoritmik sırasıyla çalıştırılabilirdi.
  • List olarak tanımlanan primitive methodlar SortedList olarak tanımlanarak ve sıralı bir şeklide çalıştırılılması daha mantıklı olur.
  • Burada önemli olan baseprocessor sınıfında bulunan Processor ve SubProcessor sınıfıdır.Aslında bu iki methodu tek method olarak da kabul edebiliriz.Uzun içeriğe sahip bir method olmaması için ikiye bölerek işlemleri gerçekleştirdim.Processor methodu Template Methottur.Bu method içerisinde türemiş sınıfta(reportprocessor) verilen primitive methodlar çalıştırılır.BaseProcessor sınıfı Abstract sınıf ve reportProcessor sınıfı Concrete sınıftır.

Yardımcı tipler

Eventler için EventArg, processor sınıfının durumunu belirtmek için kullanacağımız ProcessorStatus sınıfı ve baseprocessor sınıfı için bir interface yer alıyor.

BaseProcessor sınıfı ;

ReportProcessor sınıfı ;

Kullanımı; burada genel kullanımı gözlemlemek için doğrudan reportprocessor sınıfı yazdım aslında şu şeklide de yapılabilirdi.Her rapor için bir reportProcessor sınıfı yazıp gerekli methodları set edip istenilen istenilen rapor ilgili rapor işlemcisi aracılığıyla çalıştırılarak oluşturulabilir.

Sınıf diagramı ; örnek senaryomuzun kodlarını yazdık ve incelediysek şimdi sınıf diagramı üzerinde de görelim.

Capture_template_method

Yukarıda da bahsettiğim bu örnek uygulamanın desenin kullanımını daha net görebilmeniz için ikinci bir versiyon olarak kodlama yaptım.Burada çok daha net olarak template method tasarım deseninin kullanımını göreceksiniz.Örneğin ikinci versiyonunda algoritmik akış methodları doğrudan baseprocessor sınıfına yazıldı.

Örnek kodlamahttps://gist.github.com/yemrekeskin/8282604

Kodlamanın ikinci versiyonuhttps://gist.github.com/yemrekeskin/8299220

Diğer örnek kodlama için sınıf digaramını aşağıda görebilirsiniz.

Capture_v2_template_method

İlgili linkler

Bu yazımdan da bu kadar umarım yararlı olmuştur.