Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…
İnsanoğlunun zaman ilerledikçe bazı aksiyonları almakta ve değişikliklere adapte olmakta zorlanması gibi, “yaşlanmak” dediğimiz gerçekler, yazılım uygulamaları ve çözümleri içinde geçerli. Yazılım çözümlerinin çok yaygın olduğu bir çağda yaşadığımız ve etrafımızın yazılımlar ile çevrili olmasından dolayı bu “yaşlanan” yazılım çözümleri ile daha sık karşılaşıyoruz.

Yaşlanan yazılım uygulamaları için genellikle yazılım dünyası insanları olarak “Legacy” tabirini kullanırız bildiğiniz gibi. Biraz daha net anlamı anlamak için; “Günün şartlarına uymayan uygulamalar ve çözümlere “Legacy” uygulamalar diyoruz” diyebilirim. 10 yıl önce, hatta daha da önce geliştirilen ve hala kullanılan, ama artık negatif yönlerinin ağır bastığı, belli ihtiyaçları karşılamasının zor olduğu “Legacy” uygulamalar eminim bir çok kişinin karşısına çıkıyordur.

“Legacy” uygulamalar günün şartlarına uymamaları, adaptasyon güçlükleri yaşatmalarından dolayı oldukça zorlayıcı uygulamalar olabilir. Günün şartlarına uymamaları derken, atıl kalan donanımlar, desteklenmeyen işletim sistemleri, veri saklama sistemleri, değişim ihtiyaçları, performans durumları, kullanım şekillerinin çeşitliliği vs. bir çok başlık sayabilirim ama şimdi bunlara girmiyoruz.

Windows NT’den nerelere geldik 🙂

Windows NT üzerinde çalışan, PHP 3.0 ile geliştirilmiş, WEB bileşenleri sadece Internet Explorer’da düzgün çalışan, RDBMS olarak SQL Server 7.0 kullanan bir uygulamanın günümüzde hala yoğun bir şekilde kullanıldığını düşünün…Günümüze gelene kadar alt yapı olarak geliştirmelerin ve upgrade’lerin riskleri, iş ihtiyaçlarının en önemli olduğu algısı ve en önemlisi de insan faktörü yüzünden uygulama bu zamanın şartlarına uymayan bir çözüm olarak karşımızda…

Çok uç bileşenler ile bir örnekleri oldu ama benzer senaryolar var.

Bu tarz uygulamalar ne kadar zorlayıcı da olsa, günün IT çalışanları tarafından “offf poff” şeklinde yaklaşılıp, ne kadar çok negatif şey söylense de (bu arada hepsi genelde doğrudur), unutulmaması gereken çok önemli bir nokta var; “Değer”.

“Legacy” dediğimiz uygulamalar, sistemler öyle önemli bir değer yaratmışlar ki hala günümüze denk yaşayabilmişlerdir demek ki. 10, 15, 20 yıldır ayakta olan uygulamaları düşünün; ilk kullanıldıkları dönemlerden beri insanlara ve belli iş modellerine o kadar çok değer katıyorlar ki, hala o değeri koruma mücadelesinde içindeler… Biraz daha toparlamak gerekirse “Legacy” diye adlandırdığımız uygulamalar, ne kadar çok negatif bileşenle günümüze gelse de sahip oldukları “değer” çok önemlidir… Ve bu değer uygulamaların en güçlü özelliğidir.

Bir uygulamanın “Legacy” olarak adlandırılmaması, 10 yıl sonra da günün ihtiyaçlarını kolaylıkla karşılayabilmesi, bir 10 yıl sonra kattığı değerin üstüne yeni değerleri koyabilmesi için neler yapılması lazım, nasıl geliştirilmesi lazım falan filan bunlardan şimdi bahsetmeyeceğim… Derya deniz konular çünkü…15-20 yıl önce bir uygulamayı değişime hazır bir şekilde geliştirmek, bulunduğu zamanın ihtiyaçlarına uygun geliştirmek pek mümkün değildi belki, ama günümüzdeki yaklaşımlar yazılımların ömürlerini biraz daha kaliteli kılmayı sağlıyor. Arada karalarım ama bir şeyler.

Read More

Kısa olsun… Uzun uzun yazmaya hiç gerek yok bu sefer. Geçenlerde yoğun bir “stored procedure(SP)” kullanımı olan sistemde, geliştirilen SP‘lerde hangi tabloların kullanıldığını öğrenme ihtiyacım oldu. Yoğun iş kuralları içeren, büyük sayıdaki SP’lerde nerelere dokunulmuş öğrenmek için güzel bir yaklaşım olabilir. Kenarda, köşede dursun diye hemen yazasım geldi…Buyrun kullanın, istediğiniz gibi de geliştirin benim bu Gist’i… 🙂

Microsoft’un resmi olarak paylaşmadığı ve kullanmayı tavsiye etmediği ama zaman zaman çok yardımcı olan bazı veri tabanı nesneleri; saklı yordamlar(stored procedure,SP) SQL Server bünyesinde bizlere çaktırılmadan sunuluyor. Benim zamanında çok faydalandığım bu SP’ler ile yakın zamanda tekrardan haşır neşir olma durumum oldu. Hemen kısaca paylaşacak birşeyler de çıkmış oldu böylece 🙂 Dokümante edilmeyen bu SP’ler daha çok Microsoft’un kendi iç uygulamalarında ya da kendi ihtiyaçları doğrultusunda geliştirilmiş SP’ler. SP’lerin çoğunun içeriğini göremiyoruz ve bu SP’ler herhangi bir güncelleme ya da versiyon değişikliğinde değişmiş olabilir. Microsoft’un hizmet olarak sunmadığı ve desteklemediği bu SP’leri bu bilinç ile kullanabiliyoruz. Ama üretim ortamlarında kullanılması Microsoft’un desteklemediği bir durum.

Bahsetmiş olduğum bu dokümante edilmeyen SP’ler, bir çoğumuzun sistem nesneleri diye bildiği sys. şeması altında. sp_MS% ile başlayan bu SP’ler isimlerinden kısmen yaptıklarını anlatır durumda. Tüm SQL Server seviyesinde gerçekleştirmek istediğiniz bir çok operasyonu bu SP’ler sayesinde yapabiliyorsunuz. Mesela SQL Server’daki tüm veri tabanlarında bazı değişiklikler yapmak, bir veri tabanındaki tüm tablodaki INDEX’leri tekrardan oluşturmak, veri tabanındaki tüm tabloların isimlerini değiştirmek ya da spesifik kolon eklemek gibi gibi işlemleri bu SP’ler sayesinde yapabiliyoruz.

Mesela veri tabanındaki tüm tablolara standart bir kolon eklemeniz gerekecek. Veri tabanındaki tablo sayınız 200 civarında diyelim. Örnek senaryoda 200 adet olan tablo içeren veri tabanımızdaki tüm tablolara FirstName ve LastName diye 2 kolon ekleyelim. Bu işlemi tek bir SP yardımı ile çok kolay bir şekilde yapabiliyoruz. Bu senaryo için kullanacağımız SP, sp_MSforeachtable olsun…

  EXEC sp_MSforeachtable N'ALTER TABLE ? 
                                ADD [FirstName] VARCHAR(100),
                                    [LastName] VARCHAR(100)';

Mesela tüm tablolardaki son 5 kaydı görmek istediğimizde de aşağıdaki gibi bir SP kullanabiliriz. Dikkat ederseniz SP’ye parametre olarak isteğimiz her türlü SQL sorgusunu şablon olarak verebiliyoruz. ? anahtar simgesini kullanarak SP’nin tüm tablolar için çalıştığında ? yerine tablo isminin geldiğini söyleyebilirim. Aşağıda da tüm tablolar için çalışacak bir SELECT sorgusu örneğine bakalım…

  EXEC sp_MSforeachtable N'SELECT TOP 5 * FROM ? with (nolock) ORDER BY ID desc'

Örnek olması için sadece tablo seviyesindeki  işlemleri yapabilmek için SP’yi paylaştım ancak bir çok farklı SP mevcut. Dediğim gibi bazı SP’lerin içeriğini görebiliyoruz ama bazıları açılmıyor. SP parametreleri ile SP’lerin nasıl çalıştığını deneyerek biraz debelenmek gerekiyor.

Dokümante edilmeyen bu SP’lerin varlığından haberdar olmak bazı operasyonlar için uğraşmayı kolaylaştırıyor. Fikir vermesi adına umarım faydalı olmuştur… Şimdilik bu kadar.

Not: Bu arada bu yazıyı yazarken MS SQL Server 2017‘yi macOS üzerinde Docker üstünde çalıştırdım. Ayrıca SQL Operations Studio ile SQL sorgularını çalıştırdım.

Machine Learning” nedir sorusuna verilebilecek bir çok cevap var aslında. Günümüzdeki popülerliğinden dolayı dışarı çıkıp sorsak eminim herkesin söyleyecek bir şeyi olacaktır. Yapay zeka, robotlar, otomasyon, tahmin etme gibi gibi günümüzün bir çok konseptiyle ilişkili olduğundan hepimizin bir fikri olacaktır. Ve bu söylenen şeylerin büyük bir kısmı da doğru(?) olarak nitelendirilebilir. Açıkcası profesyonel olarak uğraştığım bir konu değil; araştırma-öğrenme şeklinde takip ettiğim, belli PoC(Proof of Concept) çalışmaları yaptığım bir konu. Dolayısıyla “dışarı çıkıp sorsak” kısmında, benim de söyleyecek bazı şeylerim oluştu ve ben de kendimce paylaşmak istedim, buyrun efenim… 🙂

Peki gerçekten nedir bu “Machine Learning”?

Çok basit ve yalın olması için, “Machine Learning” ’in bilgisayar sistemlerinin bir öğrenme süreci olduğunu söyleyebilirim. Verilerin, bilgiye dönüşmesi için bilgisayar sistemlerinin gücünün kullanıldığı teknik bir süreç… Açıkcası ne olduğu sorusundan çok, nasıl olduğu sorusunun, “Machine Learning” ‘in anlaşılması ve öğrenilmesi için daha önemli olduğunu düşünüyorum. “Nasıl?” sorusunun cevabı tabi ki çok geniş ve ayrıntılı. Ben sadece giriş tadında olması için bazı fikirlerimi paylaşmaya çalışacağım.

Peki nasıl öğreniyor bu sistemler?

Verilerdeki belli kalıpların bulunması, “Machine Learning” sürecinin temeli. Verilerdeki kalıpların bulunması ve bunların üzerinde çeşitli algoritmalar çalıştırılması ile sistemler öğrenebilir hale gelmeye başlıyor. Bu süreç aslına bakarsanız iteratif yani kendini tekrarlayan bir süreç. Sistemlerin öğrenebildiğinin doğrulanması ve geçerli olduğunun kabul edilmesi gerekiyor. Bu sayede öğrenme hızı ve şeklide gelişiyor doğal olarak. Bu doğrulamayı ve kabulu de, aslında biz ya da bizim oluşturduğumuz sistematik süreçler yapıyor. Bilgisayar sistemlerinin öğrenme yaklaşımı çeşitli “tahmin etme” yaklaşımları ile somutlaşıyor. Bizim için en önemli çıktı bu şekilde oluşuyor aslında. Bu tahminlere göre, belli durumlarda da tanımlı aksiyonlar gerçekleştiriliyor. Bu sayede bir çok kolaylık insanoğlu için sağlanıyor. (Yapay zekanın temeli de bu aslında.)

Biraz daha anlaşılır olması için hepimizin geçtiği bir süreçten bir örnek verebilirim. Açıkcası okuma-yazma öğrenme süreci bütün bu “Machine Learning” konseptinin anlaşılması için güzel bir giriş noktası bence. Hepimiz okuma yazmayı; hatırlarsınız belli çizgiler çizerek harfleri öğrenerek başladık. Daha sonra harflerin bir araya geldiği kalıpları bulup, bu kalıpların tekrarlanmasını çıkartıp kelimeleri tanımlayabilir hale gelmiştik. Kelimelerin anlamlarını da çıkartıp, benzer kelimelerin anlamlarının ne olabileceğini tahmin edip, yeni kelimelerin anlamını çıkarmıştık. Bu sürecin sürekli tekrarlanması ile kelime dağarcığımız gelişmiş ve okumayı da böyle böyle çözmüştük. Çok geçmiş zaman kullandım ama temel olarak öğrenme süreci hala böyle aslında. 🙂

“Machine Learning” de direkt olarak böyle aslında. Verilerdeki kalıpları bulup, bu kalıplara anlam yüklememiz ve bu anlamları, artan verilerde yine bulup bilgisayar sistemlerinin belli tahminler yaparak veri kalıplarını öğrenme süreci ve bilgi üretme de direkt böyle oluyor.

Read More

ASP.NET Core uygulamaları, cross-platform uygulamalar olduğu için, bildiğiniz üzere geliştirdiğimiz web uygulamalar için artık IIS gereksinimi zorunlu değil. ASP.NET Core tarafında geliştirilen yeni “host” modeli sayesinde, uygulamaların nasıl host edileceği, kod seviyesinden yönetilip, geliştirilebiliyor. Bu ASP.NET Core’un ilk versiyonundan beri olan oldukça güzel, kolay ve yeni kapılar açan bir özellik bildiğiniz üzere.

Kod seviyesinde, bu host özellikleri ASP.NET Core’un IWebHost ve IWebHostBuilder arayüzlerinden yaratılan sınıflar ile gerçekleşiyor. ASP.NET Core uygulamalarının ilk giriş noktası olan kodlarda, WebHost.CreateDefaultBuilder() eminim dikkatinizi çekmiştir.

Bu method varsayılan host modelini oluşturmak için ve arka tarafta bazı standart işlemleri yapıp, geliştiricilerin işini kolaylaştırmak için sunulmaktadır. Özetle WebHost.CreateDefaultBuilder() ile web uygulamamızın, varsayılan bazı özellikleri kendiliğinden tanımlanmaktadır.

GitHub’dan da bakarsanız, varsayılan bazı özellikleri zaten görebilirsiniz. Açık kaynak geliştirmeyi bu yüzden çok seviyorum 🙂

Loglama, konfigürasyon, uygulama root dizini, Kestrel kullanımı, IIS entegrasyonu ve “dependency-injection” gibi temel şeyler bu şekilde biz direkt çok kafa yormadan mümkün oluyor ve Web uygulamasının çalışması sağlanıyor. Daha basitçe özetlemek için; basit bir konsol uygulaması ile bir web uygulamasını ayağa kaldırmak ve çalıştırmak bu sayede mümkün olabiliyor. ASP.NET Core’un en büyük artı noktalarından biri de bu. Az önce dediğim temel şeyler aslında “cross-cutting concerns” olarak adlandırdığımız tüm yazılım sistemlerinde olabilecek konular.

Farklı tipteki uygulamalar için nasıl oluyor?

WebHost, doğal olarak sadece web uygulamaları için olan özellikler de içerdiğinden farklı tipte uygulamalarda bu tarz şeyleri kullanmak çok mümkün değildi. WebHost sınıfında olduğu için, HTTP dışında,herhangi farklı bir tipte protokolü host eden bir uygulama; mesela konsol, için bu şekilde “cross-cutting concerns” leri eklemek uğraştırıcı ya da mevcut şekilde pek mümkün değildi .NET Core’un mevcut versiyonlarında. .NET Core 2.1 ile beraber farklı uygulama tiplerinde de “host” yaklaşımı ile “cross-cutting” konularını kolayca geliştirmek mümkün oluyor.

Şu an Preview aşamasında olan, ama önümüzdeki günlerde RTM olacak .NET Core 2.1 ile hayatımıza yeni bir “host” modeli geliyor. HostBuilder, IHostedService, IHostBuilder gibi, arayüz ve sınıflar ile farklı uygulama tiplerini de geliştirmek ya da arka planda sürekli çalışan operasyonları servis olarak geliştirmek mümkün. Sadece “Web Uygulaması” yaklaşımı değil de biraz daha genel kullanıma imkanlar sunan bir servis yaklaşımı, .NET Core 2.1 ile geliştirici hayatımıza girecek.

Kısaca ve özetle farklı Network servisleri(TCP,UDP…vs.), Message Queue(MQ) servisleri ya da “arka plan işleri” gibi yapılarda da “cross-cutting” konularını kolayca geliştirmek mümkün olacak .NET Core 2.1 ile.

Read More

İşletim sistemlerinde arka tarafta çalışan, kullanıcı ile etkileşimde olmayan bir çok uygulama olur, bildiğiniz gibi. Bunlara da en temelinde, basitçe “servis” diyoruz. Her işletim sisteminde farklı şekilde yönetilir ve çalışırsa da temel olarak uygulamaların; arka planda çalışıp, kullanıcı ile etkileşim olmadan, belli yönetimsel işlemleri yapmasını sağlarlar. Örnek olması için Windows ortamlarındaki IIS(Internet Information Services)’in üzerinden geçebiliriz. svchost.exe’nin servis olarak çalışır olması sayesinde; IIS’in temel özellikleri aktif olduğu takdirde, işletim sisteminin Web Server özellikleri arka planda çalışır. Bu sayede çeşitli web uygulamaları çalıştırabilir hale geliriz. Uygulamalar da w3wp.exe ile IIS “process”’leri olarak çalışır…Bunların başka çok ayrıntısı var, asıl konumuz bunlar olmadığı için ve taaa buradan “Offf…Kes!!! Bunları biliyoruz.” dediğinizi duyduğum için konuya giriyorum… 🙂

Peki konu ne?

Bu yazıda ASP.NET Core web uygulamaları, Linux tabanlı işletim sistemlerinde, nasıl servis olarak çalıştırılabilir bundan bahsetmeye çalışacağım. Daha çok bazı temel kavramlardan bahsederek, yönelmeniz gereken konulara yöneltici bir yazı olmasını amaçlıyorum. Bir nevi aklınızdaki; “İşletim sisteminin sürekli çalışan bir web uygulaması nasıl olur? Her seferinde konsoldan çalıştırmak yerine otomatik çalışan hale nasıl getiririm?” gibi sorulara cevap olması için, basit bir anlatım yapmaya çalışacağım. Her türlü ayrıntıyı, bilgiyi ve soruyu yorum kısmından paylaşabilirsiniz. Başlıyoruz…
Read More

Son bir kaç zamandır Raspberry Pi üzerinde IoT(Internet of Things) yaklaşımları ile uğraşıyorum. Önceki yazılarımdan hatırlayanlar olacaktır. Son bir kaç zamandır da işin içine LEGO’yu da katarak içimdeki çocuk ile daha farklı şeyler yapmaya başladım. Twitter’dan takip edenler arada görmüştür zaten. LEGO Mindstorms’un sensör ve motorlarını Raspberry Pi üzerinde çalışan uygulamalar ve scriptler ile kontrol edip, basit robotik atraksiyonlar ile oynuyorum, pardon uğraşıyorum 🙂

Açıkcası tamamen hobi ve öğrenme amaçlı, kendi çapımda yaptığım çalışmalar diyebilirim. Bir yazılımcı olarak oldukça keyifli bir öğrenme ve yeni konular keşfetme yöntemi diyebilirim.

Paylaşımlarıma güzel tepkiler ve güzel sorular alıyorum. Bu yüzden gaza gelip, basit bir yazı ile hem bu konulara giriş yapmak, hem de ilgilenen kişilere ön ayak olması için neler yaptığımı anlatmak istedim. Buyrun efenim…

Ne yapıyorum?

Raspberry Pi üzerinde yazdığım bir uygulama ile LEGO parçalarıyla yapmış olduğum hareket eden, kamerası olan, fotoğraf çeken ve çektiği fotoğraflar ile öğrenen, basit bir robot ile uğraşıyorum. “Robot” demek çok doğru olmaz tabi, ama “robotik” bazı hareketleri yaptırabildiğim için ben öyle diyeceğim. Bütün bunları belli teknolojileri öğrenmek için yapıyorum. Dünyayı ele geçirmek ya da bir robot ordusu kurmak gibi bir amacım yok…En azından henüz 😛 hihihihihihihihi

Nasıl yapıyorum?

Bol bol araştırarak ve okuyarak yapıyorum en temelinde. Bolca da kod yazıyorum. Kendi kendime yarattığım sorular, öğrenmem ve yapabilmem için motivasyonum oluyor. “LEGO parçalarını otomatik hareket ettirebilir miyim? Raspberry Pi üzerinden kontrol eder miyim? Raspberry Pi’da uygulama nasıl geliştiririm? Raspberry Pi ile fotoğraf çekip, evdeki kedileri takip eder miyim? Kedilerin maması biterse bana bildirim gelir mi? LEGO ile yaptığım araba düşen kalemi alıp, kaldırır mı? Cloud platformlarındaki servisler ne? Nasıl çalışıyorlar? Öğrenen sistemler geliştirebilir miyim, LEGO kendi başına hareket eder mi?” gibi gibi bir ton gereksiz soru bu çalışmaları yaparken bana destek oluyor.

Teknik alt yapıyı nasıl oluşturdum?

Farklı bir çok teknoloji ile uğraşıyorum. Bu farklılıktan dolayı bir çok yeni teknolojiyi öğrenme şansım oluyor. Zaten yetkin olduğum ve bildiğim yaklaşımların farklı versiyonlarını ve hiç bilmediğim teknolojiler ile oluşturmayı tercih ediyorum. Temel olarak yemek tarifi gibi içindekilerden kısaca bahsedeyim; ilerleyen dönemlerde basit örnekli hallerini yazmaya da çalışacağım.

  • Raspberry Pi: Cihaz olarak Raspberry Pi 2 kullanıyorum. Bilmeyenler için, basit ve küçük bir bilgisayar sistemi diyebilirim. HDMI çıkışı, USB girişleri, çeşitli bileşen entegreleri olan bir bilgisayar kartı diyebilirim.
  • Raspbian: Bu bilgisayar sistemi için, işletim sistemi(OS) olarak bir Linux dağıtımı olan Raspbian kullanıyorum. Debian’dan türetilmiş olan Raspbian, Raspberry Pi’lar için tercih edilen bir işletim sistemi. Linux özelliklerini kullanarak, geliştirdiğim uygulamaları servis yaklaşımı ile Raspbian üzerinde çalıştırıyorum.
  • BrickPi: Dexter Industries firmasının, LEGO motor ve sensörlerini kontrol etmek için geliştirdiği bir devre kartı olarak BrickPi’yi kullanıyorum. Bu devre kartı tamamen Raspberry Pi için üretilmiş olup, Raspberry Pi uygulamalarından LEGO motor ve sensörlerini kontrolü sağlıyor.

  • Python: Raspberry Pi üzerinde temel bazı işler için küçük uygulamalar geliştirmek için python da kullanıyorum. Geniş API desteği ile Raspberry Pi üzerinde çalışan entegreleri yönetmek ve entegreler ile I/O işlemleri için tercih ediyorum.

  • Raspberry Pi Camera Module: Fotoğraf ve video çekmek için Raspberry Pi kartı için oluşturulmuş Camera Module’u kullanıyorum. USB’den takılan web-cam tarzı kameralar ile de başka cihazlar kullanmak mümkün. Ama açıkcası Camera Module’ün boyutlarından dolayı tercih ediyorum.
  • .NET Core: Unix tabanlı işletim sistemlerinde de, .NET Framework bilgimi kullanarak uygulama geliştirmek için, son yılların yeni platformu .NET Core ve ASP.NET Core ile çeşitli uygulamalar geliştirerek, cihaz üzerinde bazı işlemleri gerçekleştirebiliyorum. ASP.NET Core ile geliştirdiğim bir web uygulamasını, tamamen Raspbian üzerinde çalıştırarak, cihazı bir web uygulaması üzerinden yönetebiliyorum. Ayrıca .NET Core sayesinde cihaz üzerinde C# ile aşina olduğum bir çok şeyi yapabiliyor ve geliştirebiliyorum.
  • Vue.js: Malum bir web uygulaması dedim, javascript’siz bir web uygulaması da olmaz. 🙂 Son bir kaç yılın popüler JavaScript Framework’lerinden biri olan Vue.js’yi, öğrenme kolaylığı ve yapılabilecek ihtiyaçları yapmanın daha kolay olduğu bir framework olarak tercih ediyorum.

Read More