Tags: , | Categories: SSS (FAQ), Tip, Web Uygulaması Posted by okutbay on 11.10.2018 18:56 | Yorumlar (0)

Selamlar herkese,

Sanırım bir başlığı açmam gerekecek. ASP.NET Core MVC ile geliştirdiğim web uygulamasını nasıl güncelleyiyorum? Size bu yazımda biraz bundan bahsetmek istiyorum.

Geliştirme ortamı olarak Visual Studio 2017 kullanıyorum ancak Visual Interdev'den bu yana çok uzun yıllardır burada pek bir değişiklik olmadı. O yüzden gelecekte de köklü bir değişiklik beklemiyorum.

Öncelikli olarak kendi geliştirme ortamınızda değişikliklerinizi yaptınız. Varsa testlerinizi çalıştırdınız, yoksa kodunuzun işlevlerini fonksiyonel olarak test ettiniz, her şeyin olması gibi çalıştığına kanaat getirip canlı ortamdaki uygulamanızı güncellemeye karar verdiniz.

Şimdi size adım adım izlediğim yolu ve püf noktalarını vermeye çalışacağım.

Sahnenin Kurulması

Daha önce bir ya da bir kaç release çıktığım bir projeyi güncelleyeceğim. O yüzden sistemde hazırlanmış release dosyaları olması muhtemel. Hatta başka projeler de olabilir. O nedenle ben şöyle bir klasör yapısı kullanmayı uygun görüyorum: "C:\Projeler\Release\ProjeAdi\UygulamaAdi"

Örnek ile açıklamam gerekirsetüm kaynak kodları C:\Projeler altında dururken tüm çıktığım paketleri C:\Projeler\Release klasörü altında topluyorum. Ancak bunu yaparken de bir proje altında birden fazla deploy edilmesi gereken web uygulaması, API vb. olabileceği için proje adıyla açtığım klasörün altında da ürün ya da uygulama adıyla açılmış bir klasör içine publish ediyorum. Mesela bugün URLSohertener adlı projenin URLShortener.Web uygulamasını güncelleyeceğim için bu uygulamaya publish çıkacağız.

Publish edilecek folder ve üst folder içinde şu an bulunan dosyalar şunlar:

 

Görüldüğü üzere uygulama adının yanında tarihler yazan bazı rar dosyalar var. Bunlar önceki çıkılan publishlerin sıkıştırılmış yedekleri. Ben yöntem olarak çıktığım her release paketini sıkıştırılmış ve tarihlenmiş olarak saklıyorum. Tarihler neden önemli birazdan göreceğiz.

Not: Tabi ki CI/CD ile yapmak çok şık olur ama bireysel olarak bir şeyler yapmaya çalışırken her şeyi dört dörtlük yapmaktan önce ortaya birşeyler (MVP - Minimum Viable Product) çıkartıp insanların kullanımına sunmak daha öncelikli bir hal alıyor.

 

Publish (Release) Çıkılması

Visiual Studio ile açık olan solution üzerinde publish yapılacak projeadı üzerine faremizle ters tıklayarak combo menünün açılmasını sağlarız.

 
Açılan kombo menü üzerinde "Publish" seçeneğine tıklayarak projeye ait daha oluşturulmuş publish profil detaylarının görüntülendiği ekran çıkacaktır.
 
 
 
Ekran görüntüsünde görüleceği üzere burada publish profil adı ve publish butonun dışında nereye publish yapılacağı, mevcut dosyaların silinip silinmeyeceği, yapılacak publish için debug/release konfigurasyonu bulunmakta.
Her zaman bu ekran üzerinde yeni bir profil tanımlayabileceğiniz gibi actions altından profil adını değiştirme ve profil silme işlemini yapabilirsiniz. Mevcut profil ayarlarını değiştirmek isterseniz "Configure..." bağlantısına tıklamanız yeterli olacaktır. Bu ekranda target locatio'a gitmek isterseniz tıklanabilir bir link konulmamış ama yolu clipboarda kopyalayabilmeniz için ufak bir buton eklenmiş.
 
Daha önce publish yapmadıysanız ilk seferde buradaki detayları ayarlamanız gerekebilir. O yüzden "Configure..." bağlantısına tıklayarak nasıl bir şeyle karşılacağınızı biraz anlatmak istiyorum.
 
 
Bağlantıya tıkladığınızda açılan popup ekranda sizi "Connection" ayarları karşılar.Bu ayarlar Publish Method ve Target Location ayarlarıdır.
 
Bu ayarlar içinde Publish method ile 4 farklı metoddan birini seçebilirsiniz.
 
 
Hepsinin detaylarına giremeyiz ama isimleri aslında ne olduklarını anlatıyor.
 
Biz "File System" seçiyoruz. Dosyaları harddiskimizde belirlediğimiz yere (Target Location) bırakmasını isteyeceğiz. Target Location ayarında yukarıda ayarladığımız klasörlerin seçili olduğunu göreceksiniz. 
 
Next butonuna tıklayarak sonraki ayar ekranına geçebiliriz. Bu ekranda bizi karşılayan ayarlar Configuration, Target Framewok, Deployment Mode, Target Runtime, File Publish Options, Database ayarları bulunmakta
 
 
 
Burada işler biraz karışıyor. Bu ekran gerçekten ne yaptığınızı bilmenizi gerektiren bir ekran. Bu nedenle bu ayarlara biraz daha detaylı bakalım.
Configuration (Debug/Release): Burada Release/Debug seçimi yaparak derlenecek dosyalaradebug yapmanızı kolaylaştıran ilavelerin yapılıp yapılmayacağına karar verirsiniz. Test ortamları dışında canlı ortamlara yapılacak publishler için kesinlikle "Release"seçilmelidir. Çünkü debug yapılacak şekilde derlenen kodların performansı daha düşük olacak ve canlı ortamda gereksiz performans kayıplarına neden olacaktır.
Target Framewok: Açıkçası burada sadece sistemde yüklü olan frameworkler listeleniyor mu yoksa sadece uygulamanın frameworkü mü listeleniyor bilmiyorum. Yani uygulamayı desteklenen farklı frameworkler release edebiliyor muyum fikrim yok. Muhtemelen sadece uyumlu olanı listeliyor. Çünkü sistemimde .NET Framework 4.7.2 olduğu biliyorum ama burada çıkmıyor.
Deployment Mode (Framework-dependent/Self-Contained): Bunu incelemedim ama isimlerinden anladığım kadarıyla self-contained seçildiği zaman gerekli framework dosyalarını da içerecek şekilde pakete ekliyor ve paketi şişiriyor diye tahmin ediyorum. O yüzden kurulum yapacağım sunucuda framework olduğu için ben Framework-dependent olarak ayarlıyorum.
Target Runtime (Portable/win-x86/win-x64/osx-x64/linux-x64): Burada kurulum yapılacak sunucun işletim sistemi ve işlemci mimarisine göre karar verebilirsiniz ya da benim gibi portable seçerek herhangi bir işletim sisteminde çalışacak şekilde paketinizi oluşturabilirsiniz. Paketiniz şimesin benim tek platform ile işim olur diyorsanız portable yerine onu seçmeniz önerilir.
File Publish Options: İşaretleyerek önceki publishe ait dosyaları silerek temiz bir klasör içine publish çıkılmasını sağlayabilirsiniz. Ben genelde bunu işaretliyorum. Değişen giden bir kütüphane, dosya vb. var ise paketin içinde kalmaya devam ederek şişkinlik yapsın istemiyorum.
Database: Eğer projenizde SQL server vb. ayarlanmış bir database var ise onunla ilgili bir bilgi veriyor. Ben MongoDB kullandığım için ne işe yarar, ne çıkar burada bir fikrim yok.
 
Temel konulara değindiğimize göre atrık publish butonuna tıklayabilir ve publish işleminin tamamlanmasını bekleyebiliriz. İlerlemeyi Web Publish Activity ekranında takip edebilirken, olup biteni detaylı olarak görmek için "Output" ekranına göz atabiliriz.
 
 
 
 
Evet publish'i çıktık ve deploymen aşamasına geçebilir dosyaları sunucuya atarak canlı ortamdaki yazılımın güncellenmesini sağlayabiliriz.
 
 
 

 

Deployment: Tam (Full) veya kısmi (parital)?

Publish sonunda projenin çalışması için gerekli tüm dosyaları dosya sisteminde oluşturduk.Bunların hepsini sunucuya kopyalabileceğiniz gibi sadece son deploymenttan sonra değişen dosyaların kopyalanmasını (partial deployment) terich edebilirsiniz.
 
Eğer partial deployment yapmaya karar verirseniz işte bu noktada hatırlarsanız yukarıda "Ben yöntem olarak çıktığım her release paketini sıkıştırılmış ve tarihlenmiş olarak saklıyorum. Tarihler neden önemli birazdan göreceğiz. " demiştim. Daha önce yapılmış olan deployment paketlerini sakladığım için son deployment tarihini hatırlamak gibi bir dertten kurtulmuş oluyorum.
 
Dosyaları publish ettim klasördeyken arama kutusuna şunu yazıyorum "datemodified:<={son-paket-tarihi}". Eğer yedekler içindeki en günce paket tarihi 31 Ağustos 2018 ise şu şekilde yazıyorum "datemodified:‎<=31.‎08.‎201".Böylece dosya sistemim benim için bu tarih dahil olacak şekilde eski dosyaları göstermiş oluyor. Tek yapmanız gereken listelenmiş dosyaları seçerek silmek ve sadece son deploymenttan bu yana değişmiş olan dosyaların kalmasını sağlamak
 
 
 
BONUS: Aynı günde yapılan farklı deployment durumlarında tarih yanına saat de yazabilirsiniz. Örnek: datemodified:‎<11.‎10.‎2018 13:00
 
Artık son adım olarak bu pakete dahil olan dosyaları klasörü ile sıkıştırıp, dosya adına tarih ekleyerek yedek olarak bir kenarda durmasını sağlarız.
 
Bu dosyayı aynı zamanda sunucumuza dosyaları kopyalamak için de kullanacağız.
 

Son Adım

Oluşturduğumuz publish dosyasını sunucumuza taşırız. Burada ister FTP yap, ister RDP o dosya sunucuna kopyalansın yeterki :D
Sonrasında ben şu adımları izliyorum. Bir tane deployment klasörüm var. Sıkıştırılmış dosya içeriklerini buraya açıyorum.
Publish yapılacak web uygulamasının bulunduğu klasörü her ihtimale karşı sıkıştırıp, tarih vererek yedekliyorum.
IIS kullanıyorsanız uygulamayı ve application poou durdururak kilitli dosyalar varsa bırakılmasını sağlıyoruz ki kopyalamada sorun çıkmasın.
Sonrasında deployment klasörüne açtığımız dosyaları uygulama klasöründeki dosyaları ezerek kopyalıyoruz.
Bu noktada en önemli konu eğer development için ayrı ayrı config dosyasınız yoksa ise canlı ortamdaki config dosyasınızı ezmeden varsa yeni eklenen ayarları bu dosyaya manuel olarak eklemektir.
Artık uygulamayı güncellediğimize göre tekrar IISde application pool ve uygulamayı start ediyoruz. Uygulama adresine gittiğimizde açılıyorsa ne mutlu bize. Haydi geçmiş olsun.
 
Bir başka yazımızda buluşmak üzere. Klavyeleriniz şen ola.
 
Ozan Kutlu Bayram
 
 

 
 
 
 
 
 

 
 

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , , , | Categories: Hata, Web Uygulaması Posted by okutbay on 28.02.2014 08:46 | Yorumlar (0)

Nowadays, i'm working on my CMS project called Weblebici CMS. I aimed to create very simple and lightweight CMS web application. But this is not the subject of this article.

Last night i created a simple default template but later i began to see some weird exception on my log. It was weird because there was not any detailed information about the problem.

It was a "System.Web.HttpException" and message says. "File does not exist". But there is no info which file exists. First i thought i used a file type which static file handler cannot access. I checked the extensions and nothing seemed wrong to me. Later i decided to check html output of the page. I checked line by line, file by file... I found nothing on the first pass. In the second pass i noticed the error.

 There was a relative url like "~/a/b.ext" and i forget to use this value as a paramter for @Url.Content() method. It was easy to fix but hard to find :D

 

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , | Categories: Fun, Programlama, Security, Tip, Web Uygulaması Posted by okutbay on 24.07.2013 21:26 | Yorumlar (0)

İlk web sayfalarımı yaparken içerik kopyalanmasını önlemek için çeşitli numaralar yapar kopyalayanın işini zorlaştırmaya çalışırdım. Sonraları bunun gereksizliğine inandım. Çünkü içeriğin kopyalanması engellemezdi ve ayrıca ziyaretçiler için sinir bozucu olabiliyordu. Ben de bu uygulamadan vazgeçtim. Ama görüyorum ki bazı sitelerin yöneticileri hala yazılımcılarından böyle önlemleri almalarını istemekte ve arkadaşlarımızın değerli zamanlarını ve emeklerini gereksiz konulara yönlendirmekteler. Yapmayın etmeyin. Boşverin isteyen istediğini kopyalasın. Unutmayın kilit dost içindir. Hırsız niyet ettiyse kilit falan dinlemez.

Neden yazdım bu kadar yazı. Çünkü sinirlendim. Okuduğum bir Yılmaz Özdil yazısını facebookda paylaşmak istedim. Açıklama kısmına yazıdan bir bölümü kopyalayıp yapıştırmak istediğimde başarısız oldum. Hemen bir word belgesi açtım. Seçili bölümü sürükleyip belgeye bıraktım. Ve işte metin buradaydı. Orada durmadım düz metine çevirmek için bir ne notepad açıp wordden oraya yapıştırdım. Oradan da facebook a.

Sonuç sadece insanları sinir ediyorsunuz...  

2 kişi tarafından 4.5 olarak değerlendirildi

  • Currently 4,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , | Categories: IDE, SSS (FAQ), Tip, UI, Web Uygulaması Posted by okutbay on 01.10.2011 02:16 | Yorumlar (0)

Geliştirdiğimiz web uygulamasını belirli aralıklarla düzenli olarak bir sunucuya göndermemiz gerekiyorsa her seferinde tüm dosyaları sunucuya yüklemeye çalışmak zaman kaybettirebilir...

Son güncelleme zamanından önce değiştirilmiş dosyaları bulmak için dosya arama fonksiyonunu kullanabilirsiniz. Bulunan dosyaları seçil sildiğinizde elinizde sadece son guncelleme zamanindan bu yana degisen dosyalar kalacaktır.

Windows 7 de arama bir miktar farklı olduğundan belirli bir tarihten onceki dosyalari bulmak için arama kutucuğunua "datemodified:<‎18.‎05.‎2011" yazabilirsiniz.

 

 

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , , , | Categories: Tip, UI, Web Uygulaması Posted by okutbay on 20.09.2011 20:53 | Yorumlar (0)

İDOnun hizmetlerini beğenerek kullanıyoruz. Daha önce dikkatimi çekmemişti ama bu sefer bilet alırken bir miktar zorlandım.

İlk zorlandığım nokta bileti al butonu ile kredi kartı bilgilerinin girileceği yerin birbirine olan uzaklığıydı. Butona odaklandığım için kredi kartı bilgilerini gireceğim yeri görmekte kısa da olsa bir süre zorlandım. Bence yolcu bilgileri ile kredi kartı bilgileri yer değiştirse daha iyi olur.

Diğer bir nokta ise kullanıcının bilet alma işini sonlandırabilmesi için şartları kabul etmesi gerekiyor. Burada bir sorun yok. Ama şartları kabul etmeninizin gerektiğini anlamanın tek yolu kredi bilgilerini girdikten sonra bir kısım checkbox ın altında yer alan ayrı bir checkboxı işaretlemeniz gerektiğini söyleyen bir notu okumak...

Bu notu okumayı atlarsanız benim gibi "yahu bu bilet al butonu niye pasif, neyi eksik yaptım" diye söylenerek aranırsınız.

Oysa "bilet al" butonunu da bu bilgiyi vermek için kullansa, mesela pasif yapmasa tıklayınca uyarı mesajı verse, ya da onun sağına soluna bi yere de not yazsa kullanılabilirlik adına daha yüksek bir kaliteye ulaşılır. Çünkü kişiler bir an önce bileti almaya odaklandıkları için diğer bölümleri hızlı hızlı geçip o butona tıklama eğilimindedir. Ve siz butona tıklama eğiliminde olan kullanıcının bu işlevi kullanmasını engelleyerek sadece onlar için hayatı zorlaştırırsınız.

 

 

 

 

 

 

2 kişi tarafından 3.5 olarak değerlendirildi

  • Currently 3,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories: Script, SSS (FAQ), Tip, Web Uygulaması Posted by okutbay on 22.02.2011 21:01 | Yorumlar (0)

Selamlar, javascript i çok çirkin bulmama ve sevmememe rağmen bir web uygulama geliştiricisinin hayatını nasıl kurtara bileceğinin farkındayım... Tabi yazılan javascript deneyimsiz ellerden çıkmışsa bir o kadar da ölümcül olabilir...

Bugün sizlerle çok ufak ama hayat kurtaracak bir script parçası paylaşacağım... 90lı yılların sonunda ASP ile uygulama geliştirirken sık sık frame ve iframe yapılarını kullanmak zorunda kalırdır. Daha sonra ASP.NET le beraber kendi adıma bunları hiç kullanmadım desem yeridir. Eğer uygulamanızda forms authentication (ya da benzeri bir yapı) kullanıyorsanız frame içinde gösterilen sayfanın login gerektirecek bir durumla karşılaşması halinde frame içinde login sayfasına gidecek ve login olduğunuzda eğer return url bilinmiyorsa ana sayfaya gitmesi halinde hoş olmayan bir görüntü ile karşılaşabilirsiniz. Bu sorunu aşmanın bir kaç farklı yolu olsa da bana en pratik geleni sizinle paylaşmak istiyorum. Bu ufak script ilgili sayfada çalışarak en üst framede yüklenmesini garanti edecektir...

Klavyeleriniz şen ola.

<script type="text/javascript" language="javascript">
    if(top.frames.length>0){
        top.location = 'hede.aspx';
    }
</script>  

1 kişi tarafından 4.0 olarak değerlendirildi

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , , , | Categories: Tip, UI, Web Uygulaması Posted by okutbay on 21.01.2011 20:02 | Yorumlar (0)

Her ne kadar ülkemizde de yavaş yavaş arayüz geliştirme ve yazılım geliştirme farklı uzmalıklar olarak algılanmaya başlasa da hala katedilmesi gereken çok mesafe var.

Kullanılabilirlik konusu alt yapının yetenekleriyle sınırlıdır. Alt yapının size izin vermediği özelliklerin müşteriler tarafından istenmesi elbette geliştiren için çok büyük acıdır. Ama öte yandan alt yapının yeteneklerini bilmek ve arayüzde mümkün olan en iyi kullanılabilirliği sunmamız oluşturmaya çalıştığımız ürünün kalite algısını üst düzeylere çıkartacaktır.

Elbette bu yeteneklerin yanlış kullanılması da ters bir etkiyi doğrucaktır. Örnek vermek gerekirse bir arama kutucuklarına yazmak için geldiğiniz de önceki yazılmış metnin silinmesi çok yaygın bir uygulama. Bir çok sitede görülebilir. Ama yaygın olması doğru olduğu anlamına gelmiyor. Mantık olarak kullanıcının yazdığı bir metni yine kullanıcının silmesi doğrudur. Burada bahsettiğim arama kutucuğunda bulunan "Type to search" initial textin silinmesi değil. "abc xyz" şeklinde yaptığım ve arama sonuçlarından memnun olmayarak arama metnini değiştirmek istediğimde "abc xyz" metninin temizlenmesi. Arayüz geliştiren arkadaşlara önerim bu metni silmek yerine, seçili duruma getirebilirler. En doğru uygulama bu olacaktır.

Ne kadar can sıkıcı olabileceğine örnek vermek gerekirse yazdığım durak adını her seferinde tekrar yazmak zorunda kaldığım şu sayfaya bakabilirsiniz...

image

http://harita.iett.gov.tr/

Aynı mantık sayfa üstünde bulunan hat arama ve adres arama kutuları için de uygulanmış ve kanımca hoş bir kullanılabilirlik örneği değil... Geliştirmeyi yapan arkadaşın kodunu sadece initial texti temizleyecek ve diğer metinleri seçecek şekilde değiştirmesi yeterli olacaktır.

Tabi ki bu haliyle de çok faydalı. Kullanışlı ama çok ufak dokunuşlarla kullanılabilirlik ve kalite algısını üst düzeye çıkarmak mümkün.

Klavyeleriniz şen ola...

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , , | Categories: Web Uygulaması Posted by okutbay on 13.05.2010 12:02 | Yorumlar (0)

You can replace all commas with this little script by the aid of regular expressions

<script>
    var s = '133,123,123.00';
    var replacedText = s.replace(/,/g,'_');
    document.write(replacedText);
</script>

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: , | Categories: Tip, SSS (FAQ), Web Uygulaması, Browsers Posted by okutbay on 18.02.2010 13:12 | Yorumlar (0)

If you hava a javascript like this:

    1 <script language="javascript" type="text/javascript">

    2 window.status ='some text';

    3 </script>

You will see firefox is not showing "some text" in the status bar. Too see your text you must enable it from "Advanced Javascript Settings" window.

Enable status bar with FF

 

Happy coding...

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Tags: | Categories: Web Uygulaması, News Posted by okutbay on 27.01.2010 19:31 | Yorumlar (0)

My popular framework’s version 2 release candidate released.

More about:
http://weblogs.asp.net/scottgu/archive/2010/01/10/asp-net-mvc-2.aspx
http://haacked.com/archive/2009/12/16/aspnetmvc-2-rc.aspx

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5