prime ng - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

PrimeNG hiç duymadınız mı? Hadi o zaman içeri.


Medium hesabında da paylaştığım bu makale sizlerle.


Eğer eski bir Angular geliştiricisi iseniz çok büyük ihtimalle görmüş, duymuş, hatta işitmişsinizdir.

PrimeNG o kadar hızla büyüdü ki artık Vue ve React framework içerisinde dahil kullanabiliyoruz. Öncelikle bu harika ekibe böylesine framework geliştirdikleri için çok teşekkür ederim.

PrimeNG aslında bir front-end geliştiricisinin İngiliz anahtarı gibi bir şeyi. En azından böyle bir iddiam var. Ben bir front-end geliştiricisi değil, back-end geliştirici pozisyonundayım; bazı zamanlarda da full stack pozisyonda da çalıştığım oldu. Fakat bu güzel componenti sizlere bahsetmeden geçemeyeceğim.

Kim kullanıyor derseniz, kendi sitesinde bunun için referanslar niteliğinde bir açıklama koymuş. Lufthansa, BMW, Nvidia, Ford, Turkcell, Volvo gibi pek çok büyük marka bu bileşeni tercih etmiş.

Bu bir component. İçerisinde ihtiyacınız olabilecek form, button, tablo, Captcha, validasyon kısacası yeme de yanında yat diyebileceğim bir bileşen. Bu yazımızda Angular 9 ile bu geliştirmeleri yapacağız.

Kendi sitesini de paylaşmadan olmaz. PrimeNG Official


Hadi PrimeNG bileşenini deneyelim!

Öncelikle ben bu geliştirmemi Angular 9 versiyonu ile yapacağım. Boş bir klasör açıyorum, PowerShell veya komut istemi üzerinden yeni bir angular projesi tanımlıyorum.

ng new cepveresiyecom --routing=true --style=css
1*MQicQw7E7poTD7T ujTLcQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

İlgili klasörü Visual Studio Code gibi bir editörde açıyorum.

1*1XCxAEEs0S8kK1JsaFJwZQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
Klasörün Visual Studio Code üzerinde gösterimi

Yukarıdaki görselde belirttiğim kırmızı alandaki gibi kısa yolları kullanarak, Visual Studio code içerisinde terminal kısmını açıyoruz. PrimeNG paketlerini projemize yavaştan eklemeye başlayacağız.

npm install primeng --save 
npm install primeicons --save
npm install @angular/cdk --save
--Windows/Linux kullanıyor ve kurulum esnasında hata yaşarsanız, yönetici hakları/sudo ile VSCode açınız.

Şimdi paketlerimizi indirdik, hatta öyle ki package.json dosyamıza bile eklendi. Gelelim stil dosyalarını angular.json içerisinde tanımlamaya.

1*RAMF7IW81gYT8D RneJhBQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
"node_modules/primeicons/primeicons.css",
"node_modules/primeng/resources/themes/nova-light/theme.css",
"node_modules/primeng/resources/primeng.min.css",

Virgül ve tırnak kısımlarını sizler için düzenledim. Direkt yapıştırabilirsiniz. Eğer tasarımı beğenmez iseniz nova-light kısmını PrimeNG sitesinde yer alan ücretsiz temalar ile değiştirebilirsiniz.

Şuana kadar PrimeNG paketini kurduk ve stil dosyalarını projemize swtamamladık. Biraz şimdi kurcalamaya başlayalım

MenuBar — PrimeNG

PrimeNG içerisinde gelen bir menubar bileşeni var. Bu menü yapısını kendi projemize hızlıca ekleyelim.

Öncesinde PrimeNG haricinde kendi menü bileşenimizi kullanmak için bunu component şeklinde değilde, shared module haline getirelim. Böylece bunu her yerde rahatça kullanabilelim. Siz bu adımı dilerseniz atlayarak component oluşturarak devam edebilirsiniz.

ng g m nav-menu
1*WEpa9Ey90KvGqE0GTqWObw - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

nav-menu isminde modül oluşturduk, ancak PrimeNG menüsü için kullanacağımız gerekli modülleri henüz tanıtmadık. Bir de oluşturduğumuz nav-menu modülüne bir component eklemek gerekiyor.

ng g c nav-menu
1*4gXIDWTXXYnqxGJRE4xPpA - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

PrimeNG içerisinde yer alan MenuBar bileşeni ile önce bir menü yapısı oluşturacağız. Bir nav-menu modülü oluşturmuştuk, bu modül içerisine kullanacağımız MenuBar (PrimeNG) ve oluşturduğumuz nav-menu componenti için gerekli tanımları yapalım.

Menubar ve component için tanımı modül içerisinde yaptık, sıra geldi component.html içerisinde gözükmesini istediğimiz menü yapısını göstermeye.

Dikkatinizi çekti ise items: MenuItem[]; tanımı yaparak, menü içeriğini belli ediyoruz. Üstelik alt menüler bile ekledik.

Sıra geldi yaptığımız menüyü ana uygulamamıza tanıtmak, yani oluşturduğumuz shared module’u app.module.ts içerisinde tanıtmaya ve app.component.html içerisinde de önceden oluşturduğumuz componenti çağırmaya.

Geriye ne kaldı? Projemizi ayağa kaldırmaya. Önce bir build alacağız ardından açıl susam açıl diyeceğiz.

ng build
ng serve --open
1*YGfTuba k7JvCGOkqFZuZQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
Menülerimiz geldi.

Menüleri başarışı şekilde yaptığımıza göre hadi bir de veri tabloları yapalım.

Buna bayılacaksınız!

Table-PrimeNG

Bu tablo bileşenini kullanarak, tek bir kalemde listeleme, düzenleme hatta kaydetme işlemi yapacağız.

Nasıl mı?

Hemen önce bir shared module ve bunun için bir component daha ekleyelim

ng g m client
ng g c client

Tanımlarımızı yaptıktan sonra önce client-works mesajını gördüğümüzden emin olmak için, client.module.ts, app.component.html ve app.module.ts dosyalarımızı güncelliyoruz.

Projemizi çalıştırdığımızda client-works mesajını görmek gerekiyor.

1*dwLelDAJ AQRHv8YIiculQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

Şimdi Table-PrimeNG kullanalım.

Öncesinde ihtiyacımız olan veri kütüğünü hazırlayalım. Bir Client isminde interface tanımlayalım. Ardından aynı dosya içerisinde class tanımını da yapalım.

ng g i client/client
1*zyvVL93fqotAdi1NXRj3zw - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

Interface ve class tanımını yaptık. client.component.ts içerisinde örnek verilerimizi dolduralım.

1*mrWIzdT J4SPn9E1NMekrQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.

clientCardList diye bir Array belirledik Client cinsinden. Şimdi PrimeNG içerisinde tablo bileşenini kullanmak için <p- table> taglarını kullanarak yapacağız. Hatta öyle ki tablo başlıklarını da tanımlayacağız. Dosyalarmızı güncelleyelim.

1*PEzBhzPrCDDzi8svhffhLw - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
Tablolu hali

Şu an tablolarımız geldi, peki ama bütün makale bunun için miydi?

Tabii ki de hayır 🙂

Daha arama özelliği, sayfalandırma, ekleme ve kaydetme yapacağız. Neyse ki <p-table> tagına attribute ekleyerek aramayı, sayfalandırma, hatta çoklu değil tekli seçsin diyeceğiz.

Açıklamalar öncesi son kez daha client.component.html ve client.component.ts dosyalarımızı güncelleyeceğiz.

1*yNEExsdL0vN4Iz4gaMUo4w - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
Listeleme
1* FBJk96W5Zae1ZNOfj0ZCQ - PrimeNG hiç duymadınız mı? Hadi o zaman içeri.
Kayıt Güncelleme

Ekleme, düzenleme ve silme işlemimiz de tamam.

Kişisel Blog Adresim: eniskurtayyilmaz.com

Twitter Adresim: ekurtayyilmaz

Kaynak Kodlar: https://github.com/eniskurtayyilmaz/primeng-example

1 CbcvbbY09 ebtFei6gnLvw - C# Örneğiyle: Katmanlı Mimari de Ne?

C# Örneğiyle: Katmanlı Mimari de Ne?

Her projemizde veya her fikrimizde ilk bu canlanıyor, “Nasıl yapsak?”, Veri buradan gelir, bunu da buradan set ederim, diğer tarafa implement etmen kolay ama sanki şurada bir sorun var..”.

Günün sonunda bir şekilde kod yazmaya başlıyoruz, uygulamamız için bir başlangıcı öyle ya da böyle yapıyoruz. Fakat herkesin bir şekilde kullandığı, özellikle hiç bilgisi olmadıklarını gözlemlediğim genç arkadaşlara katmanlı mimariyi dilim döndükçe anlatmak istiyorum.

Sürç-i lisans edersem, affola.

Hangi makarnayı seversin? Spagetti mi, Lazanya mı?

1*CbcvbbY09 ebtFei6gnLvw - C# Örneğiyle: Katmanlı Mimari de Ne?
Spagetti vs Lazanya

Öğrenci olanların hemen zihninde canlanmıştır. Kettle’a sıcak su koy, hemen spagetti makarnaları at içerisine 15–20 dk sonra hazır. Fakat yedikçe makarnalar iç içe geçer. Lazanya da ne ki? Çok uğraştırır. Kat kat yapacaksın, Unu ayrı, kıyması ayrı, fırını ayrı, gırla mevzu var ama çok lezzetlidir değil mi?

Bunlar çipetpet ama lezzetli çipetpet değil..

İşte bizim aradığımız koddaki lezzette bu olmalı, Lazanya gibi kat kat yapacağız. Katmanlı mimari yaklaşımı ile unu ayrı, kıymayı ayrı, fırını ayrı hazırlayacağız ve lezzetli bir ürün çıkaracağız.

Katmanlı mimari için çokça yaklaşım var. Orion Architecture, N Tier Architecture aslında hepsinin çıktığı daha doğrusu anlatmak istediği nokta ortak. Yapıları ayır, SOLID prensiplerini uygula, uygulama içerisinde kafasına göre erişilmesini engelle, herkes kendisine ait işi yapsın (single responsibility principle) ve alt-üst ilişkilerini koru. Aslında mevzu bu kadar basitken nasıl uygulayacağız?

(SOLID için ayrı bir makale yazacağım)

Mahşerin üç atlısı: Presentation, Business, Data

Bir uygulamada aşağı yukarı talep edilen şeyler bellidir. Hemen hemen her projede ilgili işin kapsamına bağlı olacak şekilde; belirli bir iş kuralı olur. Bu iş kuralına göre belki veri(leri) sisteme kayıt edilir ve belki kullanıcı(lara) verileri gösterilir.

Kodları indirmek için: https://github.com/eniskurtayyilmaz/TeacherManagement

Hatta şöyle örneklendirelim: Bir web sitemiz var, içerisinde öğretmenleri kayıt ediyoruz ve öğretmenlere ait dersleri de yöneten bir öğretmen-ders sistemimiz olsun. Buna Öğretmen Bilgi Sistemi (ÖBS) diyelim.

Konuyu anlamak için bazı noktalar Best Practice değildir. Örneğin katmanlar arası model dönüşüm-geçişler, web request modellerinin yaklaşımı, Dependency Injection göz ardı edilmesi.

  1. E tabii yöneten bir şey derken, demek ki uygulamayı kullanacak kişilere bir şeyler göstermeliyiz. (Sunum Katmanı — Presentation Layer)
  2. Biz bu verileri kafamıza göre gelişi güzel koymayacağız ya, bir kontrol etmek gerekir. (İş Katmanı — Business Layer)
  3. Veriyi nerede tutacağız? (Veri Katmanı — Data Layer)

Kafadan yapıyı ayırmaya başladık bile. Ancak buradaki en önemli şey var. Bir kod bloku içerisine spagetti tarzında upuzun kod yazmamamız gerektiği. Yani web sayfasını göstereceğimiz ilgili controller içerisinde aşağıdaki örnekteki gibi DbContext’i çağırarak, hem validation, hem de CRUD işlemlerini yapmayacağız.

1*6XqbeB4oGYuvIkFeWpdPaA - C# Örneğiyle: Katmanlı Mimari de Ne?
Asla Böyle Spagetti Kod Yazmıyoruz — Single Responsibility Prensibine Aykırı

Sakın yukarıdaki resmi dikkate alıp, bu şekilde geliştirme yapmayınız 🙂

Bizim asıl öncelikli amacımız yapıları ayırmak. Görsel de göreceğiniz gibi önce yapılarımızı ayıracağız

1*6Hj1QG5FjbYEHbTF7Whwig - C# Örneğiyle: Katmanlı Mimari de Ne?
Mahşerin Üç Atlısı: Sunum, İş, Veri katmanı

ÖBS’de bizim yapımız bu görselde gibi olacak, yapılar ayrı, herkes kendi alanından sorumlu hale getireceğiz. Burada belirli kriterimiz olacak:

  1. İlgili işleme ait web sayfasına gelen istek parametreleri var ise (Adı, Soyadı veya Pagination’a ait aktif kayıt numarası vb.), bunu bir model olarak geliştirmeli ve Presentation katmanında tanımlanmalı (Örn. TeacherWebInsertRequestModel, CourseWebUpdateRequestModel, TeacherWebViewResponseModel) — TeacherManagement.Presentation
1*FchX2EOaF mqfxiszDfx3g - C# Örneğiyle: Katmanlı Mimari de Ne?

2. Gelen isteğe ait modeli belirli bir iş kuralına göre hesaplayacak, kontrol edecek veya veri tabanına kayıt edilmesini isteyecek isek, o zaman bunu Business katmanında yapmamız gerekiyor. Örneğin bir veri tabanına kayıt için önce bizim bir validation yapmamız gerekiyor.

Presentation tarafındaki modeli, Business katmanına gönderebilmek için, Business katmanına özgü RequestDTO ve ResponseDTO nesneleri de oluşturmalıyız. Tabii bunlar ilgili işleme ait ilgili metot(lar) için olmalı ve bu metot(lar) ilgili sınıfta tutulmalı, Presentation katmanı sadece Interface üzerinden erişmeli.

1*NYeNbYvl1 qjDUrXM9sr6Q - C# Örneğiyle: Katmanlı Mimari de Ne?
Business katmanındaki kod bloğu
1*Nv96pNyBWnMSwQlH2W1 1A - C# Örneğiyle: Katmanlı Mimari de Ne?
Presentation Katmanından Business Katmanına Transfer (Automapper daha iyi çözüm olabilir sizin için)

3. Verileri bir veri tabanına veya bir web servis üzerinden bir yerlere kayıt edeceksek, bunu Data katmanında yapmamız gerekir. Tabii buna özgü de modellerimiz olmalı. Eğer bir web servisi web reference olarak eklediyse, bu iş çok kolay. Ama veri tabanındaki bir tablo ise, o zaman bunu tabloya özgü hale getirmemiz lazım. Unutmayın, yapacağımız Data katmanı, Business katmanı tarafından sadece Interface üzerinden erişmeli. Yalnız buradaki modellerimiz genelde yapımızın son noktası olduğu için, metot içerisine her metoda özgü bir model yapmamıza gerek kalmayabilir.

1*nd5gy 49wxahk8fGXtEmAA - C# Örneğiyle: Katmanlı Mimari de Ne?
Data katmanındaki Teacher nesnesi, veri tabanında tutulan tablomuzun bir modeli aslında
1*9HMqjSnyQoCBWbBUub hMg - C# Örneğiyle: Katmanlı Mimari de Ne?
Data katmanına erişecek kişinin kullanacağı metotlar.

Eğer repository kısmını bile GenericRepository yaklaşımında bir şeyler yaparsanız; bugün X veri tabanından, yarın Y veri tabanına geçişinizi bile rahatça yönetebilirsiniz. Hatta Generic Class yaklaşımı sayesinde BaseEntity’den türeyenleri sadece dikkate al bile diyebilirsiniz (10 puanlık bir yaklaşım, araştırınız lütfen)

1*NERM2wxVXmQZa4FRzY9mPw - C# Örneğiyle: Katmanlı Mimari de Ne?
Business katmanından Data katmanına geçişin son durumu.

Yukarıdaki görselde gördüğünüz gibi Business katmanından, Data katmanına geçişimiz ve ilgili modelimizin veri tabanına aktarımını gerçekleştirdik.

Buradaki asıl mesele, katmanlara arasında ilgili üst katmana ait veri modelinin alt katmana göre hazırlanması ve veri modellerinin dönüşümü.

“İyi de biz neden modeller yaratıyoruz ki, direk veri tabanına veya web servise gitsek olmaz mı?” dediğiniz duyar gibiyim.

Olmaz.

Çünkü biz katmanları ayırtmakla mükellefiz. Ayrıca bunun yönetimi daha kolay oluyor.

Diyelim ki bu projemize öğretmene ait dersleri de tutmak istiyoruz. Bakalım faydasını görebilecek miyiz?

  1. Data katmanında Course diye bir model oluşturalım ve CourseRepository’de CRUD işlemlerini yapalım.
1*ftvvV WpXxJUOfrJsJiHiA - C# Örneğiyle: Katmanlı Mimari de Ne?
Course modelinin içeriği
1*SszHJmi4Pu9SDaqNSEkfAA - C# Örneğiyle: Katmanlı Mimari de Ne?
Data katmanında yer alan Course nesnesinin veri tabanına CRUD işlemleri

2. Business katmanında iş kuralımızı yönetelim. Fakat iş kuralımız ne olacak? Mesela her dersin bir öğretmeni olur, değil mi? O zaman dersi sisteme kayıt ederken önce Business katmanında öğretmenin varlığını kontrol etmek lazım?

1*L1nnuhoDLTb7YJRHBuxO2w - C# Örneğiyle: Katmanlı Mimari de Ne?
Course için hazırlanan Business katmanında, Teacher Business nesnesini kullandık ve kontrollerimizi yaptık.

3. Business katmanındaki derse ait veri dönüş nesnemize eklenen öğretmen bilgisini dönmek istersek? O da kolay..

1*SjNHi751MLTTzuC7JYe mg - C# Örneğiyle: Katmanlı Mimari de Ne?
Course için hazırlanan Business katmanında, Teacher Business katmanından dönen ResponseDTO modelimizi kullandık.

4. Presentation katmanında dersi kaydettikten sonra, kursa ait öğretmenin sistemdeki Id bilgisi vermek zorunda mıyız, sadece full ismini gösterse diyebilirsiniz. Hani belki “….. derse ait ….. öğretmene kaydınız yapılmıştır” gibi bir mesaj çıkarmak için yeterli olabilir. İşte Presentation katmanındaki response modelimiz bu günler için var 🙂

1*TR8njSg3XIZOIBum4LfVZQ - C# Örneğiyle: Katmanlı Mimari de Ne?
Presentation katmanındaki InsertCourse metoduna özgü bir response model yazdık.

Kişisel Blog Adresim: eniskurtayyilmaz.com

Twitter Adresim: ekurtayyilmaz

Kaynak Kodlar: https://github.com/eniskurtayyilmaz/TeacherManagement

as licence screenshot 1 - [How To] - Open Source Licence System using C#

[How To] – Open Source Licence System using C#

Hi people,

I decided that I want to contribution in open source world. So, I created a new project that includes the licence system for your applications.

The called name AS_Licence is an open-source licence system. At below, you can see which using the technologies or the methods in this project.

  • ASP.NET Core 2.2
  • .NET Standart 2.0
  • N Tier Architecture
  • Unit of Work Design Pattern
  • Repository Pattern
  • Dependency Injection

Youtube Video:

Architecture

as licence screenshot - [How To] - Open Source Licence System using C#

You can get download on Github

If you want to donate: https://www.bynogame.com/destekle/codeappcompany

image1 1 - [Nasıl Yapılır] C# ile NTier Mimari Örneği - Unit Of Work - Repository Pattern - Validation - Testing

[Nasıl Yapılır] C# ile NTier Mimari Örneği – Unit Of Work – Repository Pattern – Validation – Testing

Merhaba hanımefendiler, beyefendiler.

Uzun zamandır bu video serisini çekmek istiyordum ve sonunda bitirdim, Youtube sayfasında yayına aldım.

Dilim döndüğünce, N Katmanlı Mimaride bir uygulama geliştirmeyi basit düzeyde anlatmaya çalıştım. Bu süreçte iş katmanı, Unit Of Work tasarım deseni, Repository tasarım deseni geliştirdim ve bol örnekli test yazdım. Testler özellikle çok iyi oldu.

Sürç-ü lisan ettiysek şimdiden affola.

Youtube Link: https://www.youtube.com/playlist?list=PLojQVfYvlEpec2hnuVZEe84I7ijBolYVU

Github Link: https://github.com/eniskurtayyilmaz/NTier

image1 - [Nasıl Yapılır] C# ile NTier Mimari Örneği - Unit Of Work - Repository Pattern - Validation - Testing
image 5 1 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor

Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor

Bir .NET Core Web API projesi geliştiriyorum. (Dotnet Version: 2.2.401)

Karar verdim. Eğer Web API içerisinde bir sorun olursa, ziyaretçilere “Web Api’de ne oldu” diye gösterecektim ve bunu Response Body içerisinde yapacaktım. Ama önce, genel bir Global Exception middleware’ini yazmam gerekecekti.

Tamam, bunu yaptım ve onlara response body içerisinde gösterdim.

Fakat bazen bu doğru yol değildir eğer bir Web API projesi geliştiriyorsanız. Response Headers içerisine de ekleyebilirsiniz. (Bence yapmalısınız)

Aynı mesajı, response headers içerisine de customize edecek şekilde yaptım ve ne oldu dersiniz? Crash!!!

Neden oldu dersiniz? Headers içerisinde ASCII olmayan karakter kabûl etmiyormuş. (Teşekkürler stackflowover.com)

Mesajım “Login olamıyor mk.” idi 🙂

image - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[Web API]
image 1 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[Global Exception için Middleware- Startup.cs]
image 4 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[Global Exception için customize headers tanımları- HttpResponse_AddApplicationError_Extensions.cs]

Postman uygulaması ile (Postman çok önemli bir tool) denediğimde, body ve headers kısımları boş geliyordu.

image 2 1024x631 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[WEB API’den gelen Response Body Bilgisi – Postman]
image 3 1024x599 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[WEB API’den gelen Response Headers Bilgisi – Postman]

Sonunda çözümü buldum. Body kısmı çalışıyordu, headers kısmı çalışmıyordu çünkü ASCII karakter olmayanları kabul etmiyordu. Ben de headers kısmını base64’e çevirmeye karar verdim.

Çalışıyor.

image 5 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[Converting to base64 – Extensions.cs]
image 6 1024x531 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[WEB API’den gelen Response Body Bilgisi – Postman]
image 7 1024x531 - Çözüldü: .NET Core Response Headers İçerisinde ASCII Olmayan Karakterlere İzin Vermiyor
[WEB API’den gelen Response Headers Bilgisi – Postman]

Tamamdır çalışıyor ve biraz kod yazmam lazım! Görüşürüz.

image 5 1 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers

Solved: .NET Core Doesn’t Pass Non ASCII Characters In Response Headers

I’m coding a new project in .NET Core Web API. (Dotnet Version: 2.2.401)

I decided that If there is something wrong in the Web API, I can show them (the visitors) “What happened in Web API” in response body. But first, I have to set up global exception things in my project.

Ok.. I did it! I gave them a message in response body.

In sometimes this is not good way If you creating a web api project. You can add to response headers. (I think you must do it)

So, I tried to add same message in response headers and It happened.. Crash..

Because, my error message was containing non ascii characters. (Thanks stackflowover.com)

My message was “Login olamıyor mk.”

image - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Code Snippet from Web API]
image 1 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Middleware for Global Exception- Startup.cs]
image 4 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Customize Headers for global exception – HttpResponse_AddApplicationError_Extensions.cs]

When I using Postman app (Postman is a tool used to send requests), It seems like there is an issue. Because body and header is empty.

image 2 1024x631 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Response Body from WEB API – Postman]
image 3 1024x599 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Response Headers form WEB API – Postman]

Finally, I found the solution. The response body was working, headers not working because of non ascii characters issue. I decided that the message of customize header must be base64 in response header.

It works!

image 5 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Converting to base64 – Extensions.cs]
image 6 1024x531 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Response Headers from WEB API – Postman]
image 7 1024x531 - Solved: .NET Core Doesn't Pass Non ASCII Characters In Response Headers
[Response Body from WEB API – Postman]

Ok guys, It’s working and I have to write some code!

Image 006 1 - Çözüldü: VS 2017'de Test Debug Modunda Çalışmıyor

Çözüldü: VS 2017’de Test Debug Modunda Çalışmıyor

VS 2017’de Debug modunda testler çalışmıyor.

Dün gece bir proje üzerinde çalıştım. Bazı görevleri, bazı testleri bitirdim ve GitLab’a bütün kodları Git aracılığı ile gönderdim.

Bugün ofise gittim. GitLab’tan bütün projeyi çektim. VS Solution Explorer üzerinde sağ tıkladım, Restored NuGet Packages seçtim. Fakat bütün testleri çalıştıramadım. Ne yeşil tamam, ne de kırmızı hata vardı. Seçilmemiş gibi gözüküyordu. Debug mod çalıştırmayı denedim ama çalışmadı, aşağıdaki hataları aldım

Image 005 1024x785 - Çözüldü: VS 2017'de Test Debug Modunda Çalışmıyor
VS2017 running debug selected tests does not open the debugger

'testhost.x86.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\testhost.x86.exe'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CoreUtilities.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.PlatformAbstractions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CrossPlatEngine.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CommunicationUtilities.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.VisualStudio.TestPlatform.Common.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Newtonsoft.Json.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Serialization\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Extensions\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.CppUnitTestExtension.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Extensions\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.ComInterfaces.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.ComponentModel.Composition\v4.0_4.0.0.0__b77a5c561934e089\System.ComponentModel.Composition.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\System.Reflection.Metadata.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\System.Collections.Immutable.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Reflection\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Reflection.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.FileSystem\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.FileSystem.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.MemoryMappedFiles\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.MemoryMappedFiles.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Handles\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Handles.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Reflection.Extensions\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Reflection.Extensions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Threading\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Threading.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Text.Encoding\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Text.Encoding.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Extensions\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Extensions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
The thread 0x3ca0 has exited with code 0 (0x0).
The program '[13572] testhost.x86.exe: Program Trace' has exited with code 0 (0x0).
The program '[13572] testhost.x86.exe' has exited with code 0 (0x0).

Belki “VS 2017 Çöktü” diye düşündüm. VS 2017’yi tekrardan başlattım ve yine aynı hatayı aldım.

Sonunda, sağ tıklayıp “Clean Solution” demek aklıma geldi ve çalıştı!

Image 006 1024x720 - Çözüldü: VS 2017'de Test Debug Modunda Çalışmıyor
Image 006 1 - Solved: VS2017 Running Debug Selected Tests Does Not Open The Debugger

Solved: VS2017 Running Debug Selected Tests Does Not Open The Debugger

I had an issue that VS2017 Running Debug Selected Tests Does Not Open The Debugger.

Last night, I was working on a project. I finished the some tasks, the some tests and I pushed to GitLab all of the projects, using GIT.

Today, I went to office. I pulled all of the projects from source control to my computer. I clicked Restored NuGet Packages on VS Solution Explorer, But I didn’t run all of the tests. I didn’t get neither green check or red error, and It seems like unselected. I tried to debug but It didn’t work! I was getting the following errors:

Image 005 1024x785 - Solved: VS2017 Running Debug Selected Tests Does Not Open The Debugger
VS2017 running debug selected tests does not open the debugger

'testhost.x86.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: DefaultDomain): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\testhost.x86.exe'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CoreUtilities.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.PlatformAbstractions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CrossPlatEngine.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.TestPlatform.CommunicationUtilities.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Microsoft.VisualStudio.TestPlatform.Common.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Newtonsoft.Json.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Serialization\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Extensions\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.CppUnitTestExtension.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\Extensions\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.ComInterfaces.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.ComponentModel.Composition\v4.0_4.0.0.0__b77a5c561934e089\System.ComponentModel.Composition.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\System.Reflection.Metadata.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2017\ENTERPRISE\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\System.Collections.Immutable.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Reflection\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Reflection.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.FileSystem\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.FileSystem.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.MemoryMappedFiles\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.IO.MemoryMappedFiles.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Handles\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Handles.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Reflection.Extensions\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Reflection.Extensions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Threading\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Threading.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Text.Encoding\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Text.Encoding.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'testhost.x86.exe' (CLR v4.0.30319: testhost.x86.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Extensions\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Extensions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
The thread 0x3ca0 has exited with code 0 (0x0).
The program '[13572] testhost.x86.exe: Program Trace' has exited with code 0 (0x0).
The program '[13572] testhost.x86.exe' has exited with code 0 (0x0).

So, I thought that “Maybe VS 2017 crashed”. I restarted VS 2017, I tried again and failed again.

At least, I decided that “Clean Solution” and It worked!

Image 006 1024x720 - Solved: VS2017 Running Debug Selected Tests Does Not Open The Debugger

fs Programming 2018.xl  - Python Ödevleri ve Python Dersleri hakkında bilgilendirme

Python Ödevleri ve Python Dersleri hakkında bilgilendirme

Merhaba dostlar.

Şu yazıda bildiğiniz üzere Python ödevleri ve Python dersleri hakkında yardımcı olacağımı belirttim. Gecenin bir yarısı WhatsApp’tan ulaşan ve nezaketen bile saygılı şekilde iletişime geçen herkese öncelikle teşekkür ederim. Geçtiğimiz haftalarda bir tane mesaj vardı, ekran görüntüsü göndermiş ve ilk giriş cümlesi “Bu ödevi yapsana” şeklinde. Yaptığım şey direkt engellemek oluyor, üzgünüm 🙂

Yazıda bildiğiniz üzere Python ödevlerinizi kendim yapacaksam kedi tarifesinde çalışmaktayım. Eğer sadece fikir almak içinse zaten ücretsiz şekilde Python ödevlerinize yardımcı oluyorum. Bu konuda bir güncelleme belirtmek durumundayım, bunu da örnekler ile açıklayayım.

Geçtiğimiz aylarda bir uçak mühendisliği okuyan arkadaşımız ödevini yaptırmak istedi. İngilizce yer alan ödev içeriğinde, AirFoil dedikleri kanat ölçümlerin hesaplamasını Python kullanarak yapmak istiyorlar. Tamam, yapabilirim ancak uçak kanatları hakkında en ufak fikrim yok? AirFoil’i nasıl hesaplamam konusunda bir bilgi sahibi olmam gerekir. İşte bu noktada öğrenci arkadaşların bana sorularını gönderdiklerinde; bu soruların açıklamalarını, beklentilerini, varsa bir ipuçlarını veya örneklerini benimle paylaşmalarını rica etmekteyim. Bu, ödevlerinizi daha hızlı şekilde tamamlamamızı sağlayacaktır.

Python ödevlerini şimdilik burada referans göstermek için paylaşamıyorum ancak ileride paylaşacağım. Çünkü ödevini teslim etmiş olduğum kişileri zor duruma düşürmek istemem. Ödevlerin içeriğine gelecek olursa her tipte ödev olabiliyor. AirFoil şu ana kadar gelen en ilginç ödevdi itiraf etmek gerekirse. Tekrar eden sayılar, bir sınavda cevap anahtarına göre öğrencilerin notlarının hesaplanması, küme matris hesaplaması aklıma gelenler. Burada bahsi geçen örnekleri de paylaşmam doğru olmaz çünkü yıllar içerisinde aynı öğretmen, aynı soruyu sorabilir. Bu riski almamız doğru olmaz.

Her ödev sonrasında ücretli veya ücretsiz mutlaka cevaplandırır, öğretici bilgiler vermeye çalışırım. Buradaki ücretli olması tamamen kedilerimizin yararına olduğunu yazıda görmüşsünüzdür.

Python dersleri konusunda da bir bilgilendirmede bulunayım. Çok uzun zamandır video çekemiyorum, firmamızda işlerimiz oldukça yoğun. İki büyük proje içerisindeyiz ve deadline durumları mevcut. En yakın sürede Python dersleri videoları çekmeye devam edeceğim. Youtube kanalımda takipte kalmayı unutmayınız! Şimdiden ilginize teşekkürler.

bagis genel 150x150 - Python Ödevleri ve Python Dersleri hakkında bilgilendirme

 

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Tebrik cevabı

Tebrik cevabı

Herkese merhaba,

İlk defa bu derece uzun zamandır makale yazamadım veya eğitim videoları çekemedim. İlk yazamadığım zamanlar işlerin yoğunluğundan ötürüydü. Sonrasında evlilik sürecinden dolayı yazamadım. WhatsApp üzerinden elimden geldiğince cevaplasam da, gelen e-postalardaki evlilik tebrikleri über katsayıda olduğu için çoğunu cevaplayamadım. O yüzden e-postalara tek tek cevap yazmak hayli zorlayıcı oldu. Cevap atmadıklarım için çok özür dilerim. Bu mutlu günümüzde yanımızda olan veya mesaj atıp tebriklerini ileten herkese şükranlarımı borçluyum. Çok teşekkür ederiz.

Not: En yakın zamanda yeni makalelerde ve videolarda görüşmek dileğiyle!

fs Programming 2018.xl  - Android Programlama Dersleri

Android Programlama Dersleri

Merhaba dostlar,

Aslında başlık “Android Geliştirme Dersleri” olmalıydı ancak herkes bu şekilde aratıp, bulduğundan, ben de bu şekilde yapmaya karar verdim.

Artık Android Studio ile Android uygulamaları geliştireceğiz. Şimdilik çekilen videolar başlıkları ile şu şekildedir:

  1. [Ders 1] – Android Programlama Dersleri – Giriş
  2. [Ders 1.1] – Android Programlama Dersleri – Kurulum
  3. [Ders 2] – Android Programlama Dersleri – Android Studio, Activity, Breakpoint ve Google Play

 

bagis genel 150x150 - Android Programlama Dersleri

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Python Dersleri

Python Dersleri

Merhaba dostlar,

Şu yazımda Python programlama diline ait ders vereceğimden bahsetmiştim. Ders içeriklerini paylaştıkça, bu yazıyı da güncelleyeceğim.

Geri bildirimlere göre ders içeriğini değiştirecek veya güncelleyeceğim,
Şimdiden iyi seyirler!

  1. [Ders 1] – Python Programlama Dersleri – Kurulum
  2. [Ders 2] – Python Programlama Dersleri – Hızlıca Python Programlama Dili Temelleri

bagis genel 150x150 - Python Dersleri

 

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Python Ödevleri, Dersleri, Kod örnekleri hakkında

Python Ödevleri, Dersleri, Kod örnekleri hakkında

Eğer bu yazıyı ilk defa okuyorsanız, şu da ilginiz çekebilir [Tıkla]

Merhaba dostlar,

Bu yazıyı okuyorsanız muhtemelen Google’da Python Kod Örnekleri yazarak beni buldunuz.

İletişim sayfasından beni arıyorsunuz, mesaj atıyorsunuz, WhatsApp uygulamasından yazıyorsunuz, farkındayım.

Kimisi sınav esnasında arıyor veya mesaj atıyor,
Kimisi ödev teslim tarihi yaklaşınca arıyor veya mesaj atıyor,
Kimisi ise gerçekten Python programlama dilini merak etmiş, bu yüzden arıyor veya mesaj atıyor.

Takdir edeceğiniz üzere, benim de bir iş hayatım ve özel hayatım var.
Yazdığınız zaman, sorunlarınıza veya isteklerinize hemen cevap veremiyorum, bunu her zaman anlayışla karşıladığınız için teşekkür ederim.

Bu konuya istinaden iki(2) yeni haberim var.

  1. Bundan sonra sitede python kod örnekleri ile python programlama dersleri yayınlayacağım. Duruma göre belki Django ile web site nasıl yapılır, ilerleyen derslerde bunu da ele alacağım. Artık dersler başladı. Şu linkten takip edebilirsiniz.
  2. Ödevlerinizde veya projelerinizde iki farklı şekilde yardımcı olacağım (Ödevlerinizde teslim süresinden en az 2-3 gün önce veya kurumsal projelerinizde büyüklüğüne göre tahmini bitme süresinden önce haberleşme şartı ile):  
    1. Ücretli
    2. Ücretsiz

 

Neye göre ücretli, neye göre ücretsiz diye soruyor olabilirsiniz kendi kendinize.

  • Eğer ödeviniz veya projeniz tüm kodları teslim etmeye yönelik ise, elbette ücretli olacaktır.
    • Ödev, kurumsal projelere göre daha hızlı yapılabileceğinden ve öğrenci olduğunuzdan dolayı kedi tarifesinde olacaktır. Kedi tarifesi derken, sizden  elde edeceğim ücret, Kadıköy’deki ofisin bahçesinde gönül vermiş olduğumuz 19 kedinin günlük yemek ihtiyacını karşılayacaktır. Ödev büyüklüğüne göre iki(2), üç(3) günlük yemek tarifesi talep edebilirim. Kedi tarifesi en az 50 TL’dir, tarife değişiklik gösterebilir. Tamamlanması yirmi-dört (24) saatten az olan bütün ödevler bir(1) günlük sayılır. Bunun sebebi, sizin yapmanız gereken ödevi sizin yapmamanız ve mevcut vaktimi size ayırmam sebebim iledir. Ayrıca şunu da belirtmek isterim, madem öğrenci arkadaşlar görüyor, bilinçlensin isterim. Programlama derslerinin eğitimi ve sınavı, kağıt üstünde olmamalıdır. Gerekirse dilekçe yazın, uygulamalı ders olarak isteyin dersi ve sınavı. Çünkü bu yöntem ile sağlık bir eğitim almanız neredeyse imkansızdır. (Yakında bununla ilgili bir makale paylaşacağım).
    • Kurumsal Projeler, içeriği farklı, planlı ve daha çok vakit aldığından dolayı ücret tarifesi daha farklı olacaktır. Onu da karşılıklı istişare ile belirleyeceğiz.
  • Eğer ödeviniz veya projeniz bilgi almaya yönelik ise, elbette ücretsiz olacaktır.
    1. Ödev veya kurumsal proje içeriğinden bahsediniz, varsa örnekleri de gönderiniz.
    2. Hangi metotları kullanmalısınız, nasıl bir algoritma izlemelisiniz, varsa alternatifleri veya önceden yapılmışları vb. konuları tarafınıza söylerim. Kısacası şirket içerisinde kahve almaya giderken, kahve makinesi önünde karşılaşmış, “Geçen söyle bir sorun oldu.. şöyle yaptım, çözüldü..” kafasında iki yazılımcı gibi karşılıklı konuşuruz. Ödev veya projenizde bu konuşulanları uygular veya uygulamazsınız. (Amerika’dayken çok derlerdi, It’s up to you).

 

Şimdiden anlayışınız için teşekkür ederim.

bagis genel 150x150 - Python Ödevleri, Dersleri, Kod örnekleri hakkında

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Baş ucumda ne var? – Haziran 2017

Baş ucumda ne var? – Haziran 2017

Şimdi diyeceksiniz ki, “Haziran bitti hacı ağabey, ne alaka?”
Proje yoğunluğundan dolayı siteyi güncel tutamıyorum.

* * *

Bu ay sizlere tek bir kitap önereceğim.

Bir hafta kadar önce (talibi olduğum hanım efendi ile beraber) Haydarpaşa garında gerçekleşen kitap etkinliğinde idim. O kadar güzel kitaplar vardı ki, kütüphanemi tekrardan düzenlemek içimden geçmedi değil.

Etkinlik çok güzel ve çok kalabalıktı. Programlama kitaplarının basımını gerçekleştiren kitap evlerinin bile standı vardı, gerisini siz düşünün.

Neyse..

* * *

960 Sayfalık tarihimizi anlatan ve çok titiz şekilde yazılmış, boğucu olmayan, resimli örnekleri içeren bir kitap dikkatimi çekti.

Kitabın ismi: Osmanlı’dan Günümüze Türkiye’de Siyasal Hayat
Kitapları yazanlar ise Ankara Üniversitesi, İstanbul Üniversitesi ve Binghamton Üniversitesi’nin öğretim görevlileri.

Osmanlı tarihinin kuruluşundan itibaren 62. Hükümete kadar tarihte yaşanan olayları (özellikle ekonomik, psikolojik vb konuları), kronolojik biçimde ele almış bir kitap.

Eğer tarihe ilgi duyuyorsanız, kaçırmayın derim.

Şiddetle tavsiye ederim

fs Programming 2018.xl  - Baş ucumda ne var? - Mayıs 2017

Baş ucumda ne var? – Mayıs 2017

Bu aralar baş ucumda Mayıs ayı için birkaç kitap mevcut. Eğer yeni kitap alacak olursam bu ay içerisinde bu listeyi güncelleme yaparım.

Başlayalım..

Eğer işletme dünyasına ait bilgi edinmek isterseniz, üniversitedeki favori kitabım olan, pazarlamanın babası kabul görülmüş Philip Kotler‘in, A’dan Z’ye Pazarlama kitabıdır. Tekrar okumaya karar verdim hedeflerimden sapmamak adına. Günümüzdeki şirketlerin örneklerini vererek pazarlama konusunda bilgilendirici ve eğitici rol oynuyor. Şiddetle tavsiye ederim.

Üniversitedeki arkadaşımın tavsiyesi üzerine Hayvanlardan Tanrılara – Sapiens kitabının devamı niteliğinde olan Homo Deus: Yarının Kısa Tarihi (Yuval Noah Harari) kitabı listenin ikinci sırasında yer almakta. Gelecekte insanlık tarihine değinmekte. Birkaç bölüm okudum, ilgi çekici ve merak uyandırıcı.

Sıradaki ise son günlerde de popüler dizi olan Fi dizisinin kitap serisidir. Diziyi izlerken aldığım keyif haliyle merak uyandırdı. Dayanamadım, tüm seriyi dün satın aldım (Azra Kohen – Fi, Çi, Pi). Dün almama rağmen Fi kitabını az evvel bitirdim. Gayet şahane diyebilirim. Çi’ye başlamak için sabırsız olduğumu söyleyebilirim.

Şimdilik bu kadar.

20170129 153421 1 scaled - Gaziantep Günlükleri

Gaziantep Günlükleri

Uzun bir zamandan sonra tekrardan merhaba. Bu makalemde sizlere, Gaziantep’te gözlemlediklerimi bir şekilde aktarmaya çalışacağım. Elimden geldiğince yemeklerinden, gezilecek yerlerinden, şehrin temposundan, insanlarından bahsetmeye çalışacağım.

Başlıyoruz..

* * *

2015’in sonlarında r10.net internet sitesi aldığım freelancer iş neticesinde, tanışıklığımızın başladığı X abimizin, Ekim 2016’da yapmış olduğu davetiye ile başladı her şey. Planımız, Gaziantep’e gelecektim. Bir yazılım projemiz vardı, kalacağım süre tahminen aşağı yukarı 15 gün olacaktı ancak meğerse küçük bir proje değilmiş, ben yanlış anlamışım, bu tabii ayrı bir hikaye..

Kadıköy’ün sabaha karşı hali bir başkadır. Koca şehir bilmem kaçıncı rüyasındayken siz tıraşınızı olmuş, duşunuzu almış ve tam takım hazırsınızdır. İçinizde bir heyecan, bir enerji patlaması vardır. Tek endişe belkide sabah olmasına rağmen trafikten ötürü uçağa yetişme durumudur..
20170123 073732 225x300 - Gaziantep Günlükleri
Uçağım sabah 06:30’te Sabiha Gökçen’den kalkacaktı. Biletim neyse ki Türk Hava Yollarından alınmıştı, yoksa hiç çekilmezdi uçak açıkça söylemek gerekirse, neyse..

Havada iken elimden geldiğince dinlenmeye çalıştım. O günü bağlayan gece uyumadığım düşünülürse sabah dörde kadar, siz de benim az biraz şekerleme yapmak isteyebilirsiniz.

Uyandığımda THY’nin servisi başlamıştı ve yanımdaki şahsın, masayı açmasından dolayı uyandığımı fark ettim. Camdan dışarı baktığımda böyle bir şey olamazdı. Günün ilk ışıklarını gökyüzünde iken yakaladım, bu fırsatı kaçıramazdım değil mi?

20170123 085414 150x150 - Gaziantep Günlükleriİndiğimde X abi karşıladı beni. Dürüstçe konuşmak gerekirse kendisine bir buçuk (1.5) senedir uzaktan yazılım hizmeti veriyorum. Tam istediğim müşteri cinsi, gerçi ben de onun tam istediği yazılımcı kafası. Kaç defa yüz yüze görüştünüz diye sorarsanız, bir İstanbul’a taşındığımda ve bir de uçaktan indiğimde derdim 🙂

Fabrikaya gittiğimizde ben de sanıyorum ki, benim yazdığım muhasebe programını az biraz geliştireceğiz. Birkaç ekleme-çıkarma yaparak bu projeyi teslim edeceğim, evime döneceğim, kedimi seveceğim, ağabeyimle görüşeceğim falan filan. Meğerse ben bir ERP yazacakmışım da haberim yokmuş. Üstelik bu proje üç aşamadan oluşuyordu. Masaüstü, web ve el terminali. Tahmin edeceğiniz üzere; bir fabrikaya mal girişinden itibaren, maliyetlerin ve diğer finansal hesaplamaların yapılması, sipariş verme, üretim sürecini takip etme, üretim çıktıları, kullanıcıları veya müşterileri bilgilendirme ve en önemlisi, internet varlığının olduğu her yerden verilere erişilebilmesi.. On-beş (15) günde mi.. On-beş günde sadece büyük kısımları bitirebildim onlar da stok, mamul, yarı mamul, tam mamül, paketleme ve yükleme..

Bu bahsi geçen gün içerisinde peki neler oldu, beş aylık bir stüdyo daire kiralandı..20170123 131851 150x150 - Gaziantep Günlükleri Kendi işlerime daha çok önem vermem gerektiğini 2198371923712 kere fark ettim. Resimde belki göreceğiniz üzere paketlerce sigara var. Bu, sigarayı bırakmadan önceki halimdi..

Gelelim Gaziantep’in meşhur şeylerine. Hangi birinden başlasam, bilemiyorum. Gaziantep’e geliyorsanız, gezmeyeceksin sadece yemek yiyeceksin felsefesindeyim. Çünkü bu şehir ciddi manada mutfağı ile bir başka. İstanbul’da yemek yok, hizmet var; Gaziantep’te ise yemek var hizmet yok 🙂 Ama bunu şu şekilde izah edeyim. Mesela sadece bir çorba söyledi iseniz Antep’te, yanına ikramları fazla fazla gelir. Fakat garson sizinle ilgilenmek zorunda değildir, yani bir ıslak mendil isteğiniz belki beşinci kez söyledikten sonra gerçekleşir.

Neyse.. Paça, beyran, beyin kavurma, küşleme, katmer, antep fıstığı, kavurma, baklava, çıtır lahmacun vs.. her biri birbirinden güzel ama nerede yenildiğine göre de değişir. Mesela canınız paça çekti ise kesinlikle Yesemek‘te yenmelidir, tabii damak tadınıza göre değişir ama kesinlikle denenmelidir kanısındayım. Hem beyin kavurması da şahane.  Ancak sabahın ilk gün ışığında taze çorba içme gibi alışkanlığınız var ise sabah 05:30’ta, 150 tabağı ile müşterilerini bekleyen Metanet Lokantasına gidebilirsiniz. Sabah içeceğiniz beyran, sizi kendinizden alacaktır lezzeti ile.

Küşleme dedikleri şey bilmeyenler için yazayım aslında koyundan az miktar çıkan, özel ve yumuşak ettir. Fiyatları da zaten bundan dolayı pahalıdır. Tavsiye edebileceğim yer ise İbrahimli Kebap. Temiz ve lezzetli, şiddetle tavsiye edilir. Çok şahane bir şey.

Canınız kavurma çekti ise, size önerebileceğim tek adres şehrin merkezindeki kalenin olduğu yere yakın,  Köşk Kebap. Yalnız dikkat etmeniz gereken bir konu var, iki tane Köşk Kebap var ve yanyana. Siz, en çok insanın olduğu yere girin 😉

20170319 144624 300x227 - Gaziantep Günlükleri20170129 110714 300x225 - Gaziantep GünlükleriBir pazar sabahı kahvaltısı ve bir yandan da katmer denemek istiyorsanız, evimin yakınlarındaki, üniversite bulvarının orada yer alan Bulgurpark‘a davetlisiniz o zaman. Hem yemeği, hem lezzeti ve hem de fiyatları gayet uygun olduğu düşüncesindeyim. Serpme kahvaltının yanında bir katmer derseniz, bu efsane lezzete siz de ortak olabilirsiniz. Baştan söylüyorum, şahane bir şey. Zaten bu memleketteki yemeklerin hepsi şahane bir şey.

Olur ya, akşam vaktinde canınız lahmacun çekmiştir. Onun için de adresiniz bence Çıtır Lahmacun olmalıdır. Lezzeti güzel ama garson yaklaşımını hiç beğenmediğim bu mekanda, kesinlikle, iddia ediyorum bir lahmacunu yedikten sonra, ikincisini isteyeceksiniz. Hayatımda böyle lezzetli bir lahmacun yediğim bir anı hatırlamıyorum.

Baklava ve fıstıklar kısmına gelecek olursak (kulağa şahane geliyor değil mi?) aslında çok tartışmalı bir konuya gelmişsinizdir. Burada önemli olan damak tadınız ve sizin damak tadınıza yakın olan baklava veya fıstığın seçimidir. Yaşamı İstanbul’da geçmiş birinin baklava deneyimi, tabiiki de Karaköy’deki Güllüoğlu‘dur. Ancak üzülerek belirtiyorum ki (bunu kötülemek amacı ile söylemiyorum, yanlış anlaşılmasın, diğer baklavacılara saygım sonsuz hala da yerim) biz aslında baklava yemiyor(muş)uz. Gaziantep’te bence baklava yiyeceğiniz ve efsane olan iki yer var. Biri Ayıntap Baklava, diğeri de İmam Çağdaş.

Fıstık deyince dilerseniz tarihi Zincirli Bedesten’den de fıstık alabilirsiniz. Ama şiddetle tavsiye ettiğim bir yer var, lütfen Cumba Kuruyemiş‘te satılan fıstıklardan alınız. Çerez yemeyen annem bile, kendisine aldığım fıstıkları bitirdi. Kime fıstık getirdiysem de aşık oldu.

Yemekler konusunda son sözüm ise, eğer şehrin yemeklerinden sıkıldıysanız (ki imkansız) veya ara vermek istiyorsanız, hayatınızdaki belki de en lezzetli pizzayı; Locca’da yiyebilirsiniz.

* * *

20170129 152328 281x300 - Gaziantep GünlükleriŞehrin genel dokusundan bahsedecek olursak, burası tam bir mozaikler kenti ve Mezopotamya bölgesi. Merkezde yer alan Zeugma Müzesini gezme fırsatınız varsa, mutlaka gidin. Asır yıllar öncesindeki uygarlıkların tarihi izlerini böylesine ziyaretçilerine dikkatlice sergileyen ve koruyan böyle bir yer, sanırım Türkiye’de yer alan Topkapı sarayında bile yok. Yapılan kazılarda bulunan mozaiklere baktığınızda aslında asırlar öncesinde nasıl bir uygarlık burada yaşıyormuş, anlayabiliyorsunuz. Bildiğiniz üzere eğer İş Bankası Maximum Kart kullanıyorsanız, müze kart niyetine kullanabiliyorsunuz. Eğer kartınız yoksa üzülmeyin, fiyat gayet makul ve pişman olmayacağınızı garanti ederim. 20170129 153421 300x204 - Gaziantep Günlükleri

Sağ tarafta görmüş olduğunuz mozaik halk arasında Çingene Kız diye isimlendirilmiş ve özel bir odada muhafaza edilerek ziyaretçilerine sergileniyor Zeugma müzesinde.

20170129 155941 300x222 - Gaziantep GünlükleriŞehrine merkezi noktalarında ise tarihi kale var. Roma döneminde gözlem amaçlı inşa edildiğine dair düşünceler ve bilgiler var. Kalenin merkez kaç kuvvetinde bulunduğu bir kaç önemli nokta var. Ayrıca kalenin etrafındaki esnaf için ayrılmış yerler, tarihi dokuya ayak uydurabilecek şekilde dizayn edilmiş ve buna göre işletmelerine devam edilmesi adeta bir zorunluluk hale gelmiş. Bu çok güzel bir şey çünkü tarihi dokuyu koruyabiliyorsunuz.


20170129 160710 300x225 - Gaziantep Günlükleri
Zincirli Bedesten demişken, Zincirli bedestende sevdiklerinize özel hediye almak için gayet uygun bir yer. Neyse.. Onun haricinde kalenin ara sokağında yer alan bir yer var, Tarihi Kır Kahvesi. Eğer canınız türk kahvesi çekmiş ise, tam yeri. Böylesine lezzetli bir türk kahvesi içmiş olabilir misiniz hayatınızda? Sanmıyorum..  Benim için efsane bir tat idi.

20170129 162029 1024x754 - Gaziantep Günlükleri
20170129 162328 768x1024 - Gaziantep Günlükleri

Şehrin güzelliklerinden bahsettikten sonra yemek ve gezi haricindeki gözlemlerimi de aktarayım.

20170314 050912 150x150 - Gaziantep GünlükleriÖncelikle hayatımda böylesine küçük bir havalimanını sanırım en son Ağrı’da gördüm. Küçük desek yine iyi, bildiğin küçücük. Merak ediyorum, turistler geldiğinde (ki kaç tane geliyor tam emin değilim, genellikle turist burada maalesef çoğunlukla suriyeli. Tabii, var bir iki fransız veya hindistanlı şehirde görebileceğiniz) bavullarını rahatlıkla alıp, şehrin merkezine rahatça gelebiliyorlar mı?

Bir de iç hatlar gidiş yönündeki normal çalışan özel güvenlik görevlileri, sanırsın polis, özel harekatçı veya oranın idari amiri. Bir havalar, bir tavırlar. İstanbul için dönüş uçağıma giderken, ikinci kontrol noktasında önümde iki turist vardı. Dayanamadı bu hanımefendilerin çantasını açtırdı. “Open, open” diye. Ufak, serçe parmağı kadar bir diş macunu elleriyle koymuş gibi buldu. Türkçe olarak “Bu nedir?” dedi. Hanımlar şaşırdı, durumu anlamaya çalışıyorlar. Güvenlik görevlisi baktı olmuyor, “What is this?” dedi. Kadıncağız ne yapsın, eliyle diş fırçaladığını ima eden hareketi yaptı. Adam türkçe “Geç geç” dedi. Ben de bu hanımefendiye seslenerek, ingilizce özür diledim bu güvenlik görevlisi adına. Birkaç zaman önce maalesef burada terör faaliyetleri gerçekleştiğini ve bu yüzden işlerini doğru yaptıklarından emin olmak istediklerini dile getirdim. O da çok minnettar bir şekilde anlıyorum dedi, teşekkür etti ve uçağı bekleme alanına geçti. O sırada geldi döndü bana “Ne konuştunuz” dedi, ben de ne dediğimi ve hanımefendinin ne dediğini söyledim. Dayanamadı el bagajınızı açar mısınız dedi.

Beni bilen bilir, benim normal günlük sırt çantamda kit olarak; bile diş fırçası, yara bandı, ağrı kesici, diş macunu, tırnak makası, gillette bıçak, kulak çöpü vardır. El bagajımda ise bir boy üstleri olur, örneğin parfüm, tıraş köpüğü gibi şeyler. Adam bu tıraş köpüğüne ve parfüme takıldı haklı olarak. Uçak sınırının az biraz üstünde idi ikisi. Bunları uçak altına vermeniz gerekir dedi. Ben de hak verdim, “doğrudur, eğer sizin için sorun teşkil edecekse atabilirsin veya sizin olabilir” cevabını verdim. Gıcıklık ya, laptop’u da açtırdı, çalıştırmamı istedi. Ben de çalıştırırken, “Amerika uçuşumda bile böyle şeyler yaşamadım, hadi ben tamam, az evvel ki turistlerde hiçbir şey yoktu. Buna ne diyeceksiniz?” dedim. “Eee burası Türkiye kardeşim!” dedi. Ben yine dayanamadım, “Çokta s*kimde…(biraz sessizlik). beyefendi(!)” dedim. Kardeşim nasıl bir kelime? Normalde böyle şeyleri söylemem ama işini düzgün yaptığını iddia edip, aslında bir b*k yapmayan insanlara benim tepkim genelde bu şekilde olur. Yıl olmuş 2017.. havalimanında çalışıyorsun ve ingilizce bilgin sadece basit cümlelerden ibaret.. ve hala şov peşindesin! Bak bu İstanbul’un kilit noktalarında da var. Mesela Sultanahmet’in olduğu tramway hattında çalışan, geçişleri kontrol eden özel güvenlik görevlileri de dahil. Kardeşim orası turistin gittiği yerlerden biri. En azından, havalimanına gidecek güzergahı tarif edebilecek ingilizce olması yaklaşımındayım.

Bu da böyle bir olaydı başımdan geçen.
Şehrin kendi has insanı aslında bir başka. Çok misafirperver. Böylesine misafir edildiğiniz bir yerde sanki kendi evinizde gibi oluveriyorsunuz. Sokaktaki insanların yaklaşımı iyi, sorduğunuz sorulara temiz ve güzel cevaplar alabiliyorsunuz. Yani İstanbul’da “Selamunaleyküm ağabey, burada böyle bir yer varmış, biliyor musunuz?” sorunuzdaki, “Nerden bileyim a*ına koyim?” şeklindeki cevapları almazsınız. Şehrin insanından bahsetmişken, şu çektiğim komik resmi de paylaşayım.

20170219 100120 300x182 - Gaziantep Günlükleri

Bu resmi de otogarda bir arkadaşımı beklerken çekmiştim.
Çok güldürmüştü. “Kusur arıyorsan, bütün aynalar senin” 😀

 

Gaziantep’te bildiğiniz üzere bir hayvanat bahçesi var. “Türkiye’nin ve Ortadoğu’nun birinci, Avrupa’nın ikinci, Dünya’nın üçüncü en büyük hayvanat bahçesidir” diyor Wikipedia‘da. Bunu çok söyleyen olmuştu. Ancak bir gerçek var ki, gezerken insana şu yankıyı uyandırabiliyor,

“Eğer burası, dünyanın en büyük üçüncü hayvanat bahçesi ise birincisi kim bilir nasıl haldedir?

Bence İzmir’deki hayvanat bahçesi bu konuda fazlasıyla başarılı Gaziantep’tekine göre. En azından hayvanların sosyal ortamları daha çok geliştirilmiş, daha fazla büyük, bakımlarına da çok önem verilmiş dersiniz.

* * *

Eğer bu anlattıklarımdan yemek olan kısmı çıkarır ve video olarak izlemek isterseniz.. Buyurunuz.. Yakında tekrar görüşmek dileğiyle.

Enis Kurtay YILMAZ

 

5364131781789005.png?0=41bdabb92358c1192e14f59c025beb08&1=downloaded&2=http%3A%2F%2Fwww.eniskurtayyilmaz.com%2Fwp admin%2Fpost - Gaziantep Günlükleri

5364131781789005 - Gaziantep Günlükleri5364131781789005 - Gaziantep Günlükleri

fs Programming 2018.xl  - What is JSON And How To Using It In C#

What is JSON And How To Using It In C#

Merhabalar.

Geçen hafta C# Corner adresinde yayınlanmış olan İngilizce makalemin orijinal kopyasını kendi web adresimde de paylaşmaya karar verdim. 11.04.2016 10:47 itibari ile 2.9k okunmasıyla beraber, aldığım geri bildirimler ve gelen mesajlar ile “Bir sonraki makale ne olsun?” sorusuna da cevap arıyorum. Herkese iyi kodlamalar.

Working with JSON in C#
(What is JSON And How to Using It In C#)

This article will cover the following:

  • What is JSON
  • How to create JSON string in C#
  • How to read JSON string in C#

 

What is JSON

JSON (JavaScript Object Notation) is standard designed for human-readable data interchange. I think the thing of ‘human-readable’ for developers. JSON works with a tree structure and it looks like a XML. It’s shorter and It’s very easy for using. If you have already experience with XML, you will certainly learn easily.

JSON vs. XML

Let’s examine this expression { “name”: “Stephen Cousins” }

  1. If you’re using JSON, you must put your expression in “{ }”
  2. “name” is the key.
  3. “Stephen Cousins” is a value of “name” key

 

JSON has the logic like { “key”: “value” } statement.
And also JSON has the array.

Let’s take another expression and examine that:

"students": [
{ "name": "Stephen Cousins" },
{ "name": "Austin A. Newton" },
{ "name": "Adam Wilhite" },
{ "name": "Enis Kurtay YILMAZ" }
]
  1. “students” is the key.
  2. “[“ and “]” square brackets are array statement. It means there is the array between “[“ and “]” in brackets.
  3. All of statements in square brackets are value of “students” key.
  4. As you see there are four arrays in square brackets and it represents four student names.

 

How to create JSON string in C#

Please create your new console project from Visual Studio

File -> New-> Project->Console Application (.NET Framework 3.5)

If you want to create or read a JSON string, you need a JSON Serialize or Deserialize.

So, please open your Solution Explorer in Visual Studio, right click on References, click “Manage NuGet Packages”

Please search “Newtonsoft.JSON” on Nuget Package Manager and install it.

Please add “using Newtonsoft.Json;” statement. If you forget to add this statement, you can’t serialize any JSON strings.

Example JSON:

{
 "universities": {
 "university": "South Carolina State University",
 "students": [
 { "name": "Stephen Cousins" },
 { "name": "Austin A. Newton" },
 { "name": "Adam Wilhite" },
 { "name": "Enis Kurtay YILMAZ"}
 ]
 }
}

Now, you need to create class for example JSON. If you want to create easily, you can use that web site -> www.jsonutils.com

Creating JSON string in C#:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace EKY.CSharpCornerJSONArticle
{
 public class Student
 {
 public string name { get; set; }
 }
 public class Universities
 {
 public string university { get; set; }
 public IList<Student> students { get; set; }
 }
 public class ClassUniversities
 {
 public Universities universities { get; set; }
 }
 class Program
 {
 static void Main(string[] args)
 {
 ClassUniversities university1 = new ClassUniversities();

 university1.universities = new Universities();
 university1.universities.university = "South Carolina State University";

 List<Student> listStudent = new List<Student>();
 Student student1 = new Student { name = "Stephen Cousins"};
 Student student2 = new Student { name = "Austin A. Newton" };
 Student student3 = new Student { name = "Adam Wilhite" };
 Student student4 = new Student { name = "Enis Kurtay YILMAZ" };

 listStudent.Add(student1);
 listStudent.Add(student2);
 listStudent.Add(student3);
 listStudent.Add(student4);

 university1.universities.students = listStudent;
 string json = JsonConvert.SerializeObject(university1);

 Console.WriteLine(json);
 Console.ReadLine();
 }
 }
}

Result.

 

How to read JSON string in C#

I think this part will be very easy for you. Just you need an example JSON string and JSON class of your example. You can use www.jsonutils.com again, if you want to create a class for your example JSON.

I will JSON strings from my website -> https://www.eniskurtayyilmaz.com/api/get_posts/

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Net;
using System.IO;

namespace EKY.CSharpCornerJSONArticle
{
 public class Category
 {
 public int id { get; set; }
 public string slug { get; set; }
 public string title { get; set; }
 public string description { get; set; }
 public int parent { get; set; }
 public int post_count { get; set; }
 }
 public class Tag
 {
 public int id { get; set; }
 public string slug { get; set; }
 public string title { get; set; }
 public string description { get; set; }
 public int post_count { get; set; }
 }
 public class Author
 {
 public int id { get; set; }
 public string slug { get; set; }
 public string name { get; set; }
 public string first_name { get; set; }
 public string last_name { get; set; }
 public string nickname { get; set; }
 public string url { get; set; }
 public string description { get; set; }
 }
 public class CustomFields
 {
 }
 public class Post
 {
 public int id { get; set; }
 public string type { get; set; }
 public string slug { get; set; }
 public string url { get; set; }
 public string status { get; set; }
 public string title { get; set; }
 public string title_plain { get; set; }
 public string content { get; set; }
 public string excerpt { get; set; }
 public string date { get; set; }
 public string modified { get; set; }
 public IList<Category> categories { get; set; }
 public IList<Tag> tags { get; set; }
 public Author author { get; set; }
 public IList<object> comments { get; set; }
 public IList<object> attachments { get; set; }
 public int comment_count { get; set; }
 public string comment_status { get; set; }
 public CustomFields custom_fields { get; set; }
 }
 public class Query
 {
 public bool ignore_sticky_posts { get; set; }
 }
 public class ClassWebsiteposts
 {
 public string status { get; set; }
 public int count { get; set; }
 public int count_total { get; set; }
 public int pages { get; set; }
 public IList<Post> posts { get; set; }
 public Query query { get; set; }
 } 
 class Program
 {
 static void Main(string[] args)
 {
 string url = "https://www.eniskurtayyilmaz.com/api/get_posts/";

 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
 string jsonValue = "";
 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
 {
 StreamReader reader = new StreamReader(response.GetResponseStream());
 jsonValue = reader.ReadToEnd();
 }

 ClassWebsiteposts websitePosts = JsonConvert.DeserializeObject<ClassWebsiteposts>(jsonValue); 
 }
 }
}

Result.

All of source code for downloading  http://download.eniskurtayyilmaz.com/csharpcornerarticle.rar

bagis genel 150x150 - What is JSON And How To Using It In C#
Enis Kurtay YILMAZ

fs Programming 2018.xl  - Bir yazılım geliştiricinin donanımı

Bir yazılım geliştiricinin donanımı

2013 yıllarının ortalarında şimdiki kullanmış olduğum dizüstü bilgisayarı aldım (Asus K55VM).

O zamanlar özelliği Intel i5 2.60 Ghz, 8 GB RAM DDR3, 2 GB ekran kartı ve 750 GB HDD idi..

Bu süreçte yazdığım uygulamalar ilk zamanlarda çok hızlı çalışıyordu ve zamanla derleme esnasında, uygulama çalıştırma durumlarında veya SQL Management Studio üzerinden yaptığım sorgunun geri gelme süreleri zamanla gecikmeye veya uzamaya başladı.

Herkes gibi düzenli olarak yeniden işletim sistemi dönemlerim başladı.
Beş (5) ay geçiyor, bir yavaşlama var..

Evet! Format zamanın geldi senin!

* * *

Elimde bir proje var ve gerçekten çok sıkıcı. Zamanında bir yazılımcı ilgili müşterime uygulamayı yazmış, kaynak kodlarını da teslim etmiş ve projeyi iki etaptan oluşturulmuş. Masaüstü ve web uygulaması. Web ve masaüstü uygulamasında birkaç değişiklik ve beş(5) adet raporlama istiyor, üstelik fiyat uçuk seviyede..

(Bu arada en nefret ettiğim iş türlerinden biridir başkasının yazdığı bir uygulamayı tekrar düzenlemek. Yazılımcının “yazdığı kafayı” anlamak, gerektiğinde onu tebrik etmek ve gerektiğinde de küfür etmek bunun içerisindedir bu süreçte)

Proje başarılı.
Bunu yazan kişi evet programlamayı yalayıp yutmuş, modellemeyi de üstelik çok iyi biliyor. Yazdığı sınıflardaki mantık bir o kadar güzel..

Fakat(!),
İçine etmiş her şeyin. Çok saçma sapan yerlerde, çok alakasız bir ilişki kurmuş.. Veritabanı öyle bir tasarlanmış ki “Neden müşterim benden önce bir yazılımcı bulamamış ve bütçe bu kadar uçuk?” sorusunun cevabını veriyor.

Uygulama resmen sadece bitirilmek için yazılmış. Yaparken modelleme başarılı ama alakasız şekilde olanlar o kadar çok fazla ki.. Yazılım resmen Tanrıya emanet çalışmış bunca zaman..

Hayatımda bu kadar berbat ve alakasız veritabanı tasarımı görmedim. [1]

Derle, 30 saniye bekle..
Uygulamanın veritabanına bağlanmasını bekle, sorgu çeksin, 10 saniye..
Web tarafını kodluyorsan, açılması için en az 20 saniye bekle..

Bir yanda ikinci bir kişinin yazdığı yazılımsal sorunlardan kaynaklanan yavaşlama, diğer yanda da benim cihazımın zamanla yıpranan donanımsal durumu..

* * *

(Önceki yazılım şirketinde sunucumuz için SSD almıştık ve performansın büyük işlemlerde ne kadar önemli olduğunu kanıtlamıştık. Kendi bilgisayarıma da bir SSD almak için hiçbir çaba da sarf etmemiştim o zamanlar)

* * *

Geçen hafta bu bahsetmiş olduğum müşterim bana SSD ve RAM almaya karar verdi. Çok sevdiğim ve gerçekten uzun bir süre ona yazılımlar yazacağım, saygımı kazanmış bir insan. Hiçbir dediğimi de iki etmemiştir. Ödeme konusunda ben bir şey demeden direk kendisi hallediyor, varın gerisini siz düşünün.

Sipariş verirken bilhassa Samsung EVO 850 serisi seçmeye özen gösterdim önceki tecrübemden dolayı. 540Mb Read/520 Write şeklinde 250 GB’lik bir SSD aldık ve 8GB RAM. Şu an toplamda 12 GB RAM takılı bu bilgisayara.

Dün bilgisayarıma yeniden işletim sistemi kurdum.
Yazılımları kur, konfigre et, yedekten geri dön falan bunları saymıyorum bile altı(6) saatimi yedi nerdeyse ve hala eski HDD’mdeki verileri sunucuya gönderiyorum şu an bu yazıyı yazarken.

* * *

Altı buçuk(6.5) – Yedi (7) saat sonra..

Kurtay deli küfür etmeye başladı
Hem de nasıl..

Seni zeki! Önceden neden böyle bir şey yapmadın!

Oha Windows 10 Enterprise beş(5) saniyede açılıyor, projeyi Visual Studio 2015 Enterprise’da açmak üç(3) saniye; debug edilip veritabanına bağlanması, sorgunun cevaplanması sayfanın yüklenmesi nerdeyse iki buçuk (2.5) saniye! Yuh ….. …….! Yok artık!

Sen nasıl bir SSD çıktın lan!

HDD’nin canı cehenneme!

* * *

SSD’lerinde belirli bir ömrü olduğunu hatırlatırım.

* * *

Şimdi gidip deli gibi kod yazacağım.

Enis Kurtay YILMAZ

fs Programming 2018.xl  - [Nasıl Yapılır] C# ve Xamarin ile Android üzerinde Keylogger çalışması (Gelen & Giden Çağrılar, Gelen Mesajlar)

[Nasıl Yapılır] C# ve Xamarin ile Android üzerinde Keylogger çalışması (Gelen & Giden Çağrılar, Gelen Mesajlar)

Herkese tekrardan merhaba.

Bu aralar Android’e merak salmış vaziyetteyim.

Üniversite yıllarında yazdığım masaüstü uygulaması olan Muhbir – Informant için, gelen fazlaca talepler doğrultusunda mobil platforma entegre etmeye karar verdim. Prototip halini yazdım ve hatta geçen hafta Makros Bilgisayar adlı bilişim firması ile kurumsal anlamda satışı için anlaşma sağladım. Projeme destek oldular ve daha geniş kapsamlı ele aldık yazılımı. Önümüzdeki aylarda yeni ismiyle beraber ve daha kurumsal bir yapıda; yazılımın yeni özellikleriyle karşınıza çıkacak.

Aldığımız kararlar doğrultusunda hukuki anlamda ne kullanıcılarımızın ne de firmamızın sıkıntı yaşanmaması adına bireysel müşterilere değil, kurumsal firmalara satışını gerçekleştirmeye karar verdik. Çünkü bireysel kullanıcılar; kişisel bilgisayarlarına kuracaklarını iddia etseler de üçüncü bir kişinin bilgisayarına gizli kurduğu takdirde yasal sorumluluk tamamen kendisine aittir. Kaldı ki hiçbir şekilde yazılımı yazan sorumlu tutulamadığı gibi sadece şahitlik bakımından davaya müdahil olmaktadır. Çünkü yazdığım yazılımda sözleşmede tüm sorumluluk belirtilerek kullanıcı onaylayarak kurulum işlemini tamamlayabilmekteydi.

* * *

Bildiğiniz üzere Microsoft’un yaklaşık bir hafta kadar önce Xamarin’i satın alarak, daha iyi geliştirmeler yapacağını umduğum bu teknoloji sayesinde; Java öğrenmeden .Net ortamında kodlarınızı mobil platforma entegre edebilme imkanına sahipsiniz.

Xamarin’den bahsetmek gerekirse aslında bir bileşendir. Mono ile gelen bir teknoloji olmasına rağmen, adı günümüzde çok sık duyulmaya başlandı. Microsoft 2011 yılından beri bu teknolojiyi yakından izliyor ve şu ana kadar yapılan resmi açıklamalara göre 82 milyon dolar kadar bir yatırım yaptı. VS 2015 (Visual Studio) kullananlar bilirler ki Xamarin’i yeni projeler geliştirdiğimizde sol framede görebiliyorduk. Team Service veya Azure entegrasyonuyla da inceleme fırsatımız vardı. Gün geldi çattı ve Microsoft mobil platformda başarılı olmak için kendi renklerine katmak istedi, geçen hafta resmi olarak satın aldı.

.Net ortamında hep uygulama geliştirenler için oldukça ideal ve mobil platformlar için başlangıç seviyesi olabilir; ancak bir Java kadar rahat değil, bunu baştan söylemem gerekir. Çünkü optimize ve performans bakımından oldukça başarı geliyor bana Java. Yani Java, Android’te başarılı uygulama geliştirmek isteyenler için birebir.

“Ben .Net kullanırım, başka bir şey kullanmam” diyenleri de anlamam. Yenilik istiyorsak, algıyı açmak istiyorsak ve yeni diğer teknolojileri değerlendirme ihtiyacı doğurur, ki hangisi daha iyi hangisi kötü ayırt edebilelim. “.NET’ten şaşmam!” diyorsan, şuraya alalım sizi [1].

Microsoft’un Xamarin başarısını ise ileri zamanlarda göreceğiz. Yapılan resmi açıklamalara göre Nisan aylarında gelecek yeniliklerle performans bakımından oldukça daha ileri seviyeye çekileceğini belirtti. Merakla bekliyoruz efendim.

Şimdi gelelim bizim konuya..

* * *

Sizlere bu makaleyi video şeklinde çekip, en baştan nasıl yaptığımı göstermek isterdim ancak bu işlem için çok geç. Xamarin nasıl kurulur, nasıl debug modda telefon çalıştırılır, driverların kurulumu falan filan hiç Amerika’yı yeniden keşfetmeye gerek yok. Yeniden Windows kurulum ihtiyacım olduğunda elbet çeker, bu makalenin ilgili yerinde paylaşırım; sizlerde görmüş olursunuz.

Ben doğrudan kaynak kodlara, Xamarin’in genel yapısını ve bu işin püf noktasını göstermeye çalışacağım. Çünkü Xamarin ile alakalı araştırmalar yaptığımda, evet benden önce birileri “Gelen & Giden çağrıları” gösteren uygulamalar yazmışlar, hatta “Anında gelen & giden mesajları göstermeyi” bile yapmışlar 🙂

Ama bir kişi de, “Mevcut olan mesajları bulmayı” yazmamış, işte burada ben devreye giriyorum.

Hadi başlayalım.

* * *

Sisteminizde kurulu olması gerekenler:

  1. Visual Studio 2015, 2017 (Bu proje 2015 Enterprise içerisinde gerçekleştirildi)
  2. Xamarin Studio
  3. Kendi Android telefonunuzda denemeyi düşünüyorsanız, ilgili telefonun driverlarının yüklü olması.

İlk yapmanız gereken VS 2015’te yeni bir proje oluşturmak, ilgili adımlar New Project ->Visual C# -> Android -> Blank App (Android)

Resim 1

Yeni proje ekledikten sonra, Resim 1’de görüldüğü gibi Solution Explorer’da ilgili alanlar gözükecektir.

Şimdi Xamarin’de uygulama geliştirmenin esas noktasına gelelim.
Layout ve Class’lardan bahsedelim.

Layout, aslında uygulamamızdaki tasarımıdır, katmanıdır. Yani uygulamaya eklemek istediğimiz nesneleri, araçları, resimleri veya yazıları burada yaparız. Default olarak “Main.axml” gelecektir. İçerisini açtığınızda varsayılan olarak eklendiğini göreceksiniz. Layout -> Main.axml yönergelerini takip ederek, ilgili axml dosyasına çift tıklamanız yeterlidir Solution Explorer üzerinden.

Resim 2

Resim 2’de gördüğünüz ve bir bakışta anlayacağınız üzere, bu bir basit “Kaç defa tıklandığını” gösteren bir uygulama. Klasik Hello World işte 😉

Peki bu tasarımı oluşturan asıl kodlara nerede?
İşte burada devreye XAML devreye giriyor. XML yapısına benzer, WPF ile tanıdığımız özellik var. Resim 2’in sol alt köşesinde bulunan Desing | Source kısmı dikkatinizi çekmiştir. Source’a tıklayalım ve görelim bu tasarımı oluşturan ilgili kodlara.

Resim 3

Resim 3’te görüldüğü üzere bir XML yapısından esinlenmiş ve ilgili butona ait nitelikler tanımlanmış. Yükseklik boyutu, içerisindeki metin, name (id) gibi alanlar tanımlı.

Burada dikkatinizi çekmesini istediğim şey, id alanı. Birazdan göreceğimiz Resim 4’te, bu buton nesnesine id üzerinden erişeceğiz. Burada Id yani Name kısmı MyButton diye geçmekte. Bir nesneye ID tanımlamak için @+id/Nesneİsmi mantığı kullanılmış.

Şimdi Solution Explorer’da yer alan MainActivity.cs dosyasına çift tıklayalım. Bu formun kullanıcıya gösterilmesi ve butona tıklandığında ne yapması gerektiğini ifade eden alanları inceleyelim.

Resim 4

Resim 4’te görüldüğü üzere kodlar gene hazır default olarak gelmiş ve Main.axml içerisinde yer alan butona tıklandığında yapılacak işlemler tanımlanmış.

Uygulamadaki MainActivity aslında bizim kod alanımızdır. Yani classlar üzerinden formdaki nesneye erişeceğiz, ilgili eventları, tanımlamaları burada yaparak çalışmasını istediğimiz şeyleri burada yapacağız.

Dikkatinizi çekerse Override edilmiş bir void içerisinde base’in altına yazılmış asıl kodlar.

SetContentView(Resource.Layout.Main): Uygulamamızın ilk çalıştırıldığında hangi formun ekrana geleceğini ifade eder. Masaüstünde formlarla uygulama yazan arkadaşlar Application.Run() özelliğini hatırlayacaktır. Mantık aynıdır.

Formdaki nesneye ise FindViewById ile ulaşmaktayız ve değişken olarak tanımladığımız bir buton nesnesine atanmış Resim 4’te.

Button button = FindViewById<Button>(Resource.Id.MyButton);

Yukarıdaki kod ile button adlı oluşturduğumuz Button değişkenine, Layout içerisinde yer alan buton nesnesine ulaştık. Buradaki en önemli etken ID’ye ulaşmaktır ve axml içerisinde tanımlı ilgili butonun ID’sinin MyButton olmasıdır.

button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };

Buradaki kodlarda ise layout içerisinde yer alan butona tıklandığında, hangi işlemi gerçekleştireceğini delegate ile tanımlamıştır. Yani bu kodlar derlenecek ve butonun Click event’ı çalıştığında ilgili delegate arasında yazdığımız kodlar aktif olarak, ilgili işlemi gerçekleştirecektir.

* * *

Mesajları okumak için örnek teşkil etmesi adına prototip yapabileceğimiz uygulama yazacağım. Yeni bir proje oluşturdum ve adını EKY.Mobile koydum.

Resim 5’teki gibi EKY.axml Layout’u oluşturdum olacaktır (Layout klasörüne sağ tıklayıp -> Add -> New Item dedikten sonra adını EKY.axml diye değiştirmeniz yeterli). XAML kodlarını Source alanına geçerek, kopyala/yapıştır şeklinde de otomatik gerçekleştirebilirsiniz:

Resim 5

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:layout_height="198.0dp"
        android:textAlignment="viewStart" />
    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/buttonEKY" />
</LinearLayout>

Buraya kadar işlemimiz form ekranımızın tasarımıydı.

Xamarin’de eğer Android’in bazı özelliklerinden yararlanmak adına API’lerini kullanarak çalışmak istiyorsanız, yetkilendirme tanımlamanız gerekmektedir. Örneğin şimdi biz bu uygulamamızda mesajları okumak, telefona gelen kayıtları görüntülemek istiyorsak; bunun için özel izinleri uygulamamızda tanımlamamız gerekmektedir.

Bu işlemi Solution Explorer üzerinden, ilgili projemizin Properties kısmından yapıyoruz.
Android Manifest sekmesinde, Required permissions alanlarından Resim 6’te yer alan alanlar seçilmelidir.

Resim 6

Şimdi gelelim kodlara.

Direk doğrudan kodları, MainActivity.cs içerisinde yer alan alana yapıştırmanız veya kendinize göre düzenlemeniz yeterlidir.

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Webkit;
using Android.Provider;
using System.Collections.Generic;
using Java.Text;
 
namespace EKY.Mobile
{
    [Activity(Label = "EKY.Mobile", MainLauncher = true, Icon = "@drawable/icon")]
    [IntentFilter(new string[] { "android.provider.Telephony.READ_SMS" }, Priority = (int)IntentFilterPriority.HighPriority)]
    public class MainActivity : Activity
    {
 
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
 
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.EKY);
 
            // Get our button from the layout resource,
            // and attach an event to it
 
            Button button = FindViewById<Button>(Resource.Id.buttonEKY);
 
            button.Text = "GİT!";
            button.Click += delegate
            {
                //Gelen son 10 çağrıyı bulur. 
                //Değiştirmek için querySorter değişkeninde yer alan limit 10 kısmını değiştirmek yeterli
                var editText = FindViewById<EditText>(Resource.Id.editText);
                editText.Text = "http://eniskurtayyilmaz.com";
                editText.Text = "Gelen çağrılar:" + "\n";
                string queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Incoming);
                string querySorter = String.Format("{0} desc limit 10", CallLog.Calls.Date);
                Android.Database.ICursor queryData = ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter, null, querySorter);
                while (queryData.MoveToNext())
                {
                    editText.Text += queryData.GetString(queryData.GetColumnIndex(CallLog.Calls.Number)) + "\n";
                }
 
                //Giden son 10 çağrıyı bulur
                editText.Text += "Giden Çağrılar:" + "\n";
                queryFilter = String.Format("{0}={1}", CallLog.Calls.Type, (int)CallType.Outgoing);
                querySorter = String.Format("{0} desc limit 10", CallLog.Calls.Date);
                queryData = ContentResolver.Query(CallLog.Calls.ContentUri, null, queryFilter, null, querySorter);
                while (queryData.MoveToNext())
                {
                    editText.Text += queryData.GetString(queryData.GetColumnIndex(CallLog.Calls.Number)) + "\n";
 
                }
 
                /* 
                    Gelen SMS'leri bulmak için gerekli alan.
                    Giden smsler için Query içerisine "Telephony.Sms.Outbox.ContentUri" yazmak yeterlidir.
                */
                editText.Text += "-------------" + "\n";
                Android.Database.ICursor c = ContentResolver.Query(Telephony.Sms.Inbox.ContentUri, new String[] { "address", "body", "date" }, null, null, null);
                while (c.MoveToNext())
                {
                    long unixDate = long.Parse(c.GetString(c.GetColumnIndex("date")));
                    DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                    DateTime date = start.AddMilliseconds(unixDate).ToLocalTime();
                    editText.Text += "Gönderen:" + c.GetString(c.GetColumnIndex("address")) + "\n";
                    editText.Text += "Mesaj:" + c.GetString(c.GetColumnIndex("body")) + "\n";
                    editText.Text += "Tarih:" + date.ToString() + "\n";
                    editText.Text += "-------------" + "\n";
                }
            };
        }
    }
}
 

Unutmamanız gereken bir diğer önemli konu ise ilgili yazılıma bulunduğu kod bloğunun, class başlangıcında yetki tanımlanmasıdır. Bu olmadan mesajları okumayı aklınızdan bile geçirmeyin 🙂 (Tecrübeyle sabittir)

[IntentFilter(new string[] { "android.provider.Telephony.READ_SMS" }, Priority = (int)IntentFilterPriority.HighPriority)]

Uygulamayı cep telefonunda çalıştırdıktan sonra, bendeki Screenshot’larını da sizlerle paylaşayım Resim 7-8-9):

Resim 7

Resim 8

Resim 9

Bu makalede geçen bütün kodları github adresimde bulabilirsiniz:
https://github.com/eniskurtayyilmaz/EKY.Mobile-Android-Keylogger–Prototype-

Bu makale yazılırken kullanılan yardımcı şarkılar [2]

Bir sonraki makalede görüşmek üzere.

bagis genel 150x150 - [Nasıl Yapılır] C# ve Xamarin ile Android üzerinde Keylogger çalışması (Gelen & Giden Çağrılar, Gelen Mesajlar)

Enis Kurtay YILMAZ

windows mac or linux 1 - Microsoft mu yoksa Linux mu; PHP mi ya da ASP.Net mi; yoksa Elma veya Armut mu?

Microsoft mu yoksa Linux mu; PHP mi ya da ASP.Net mi; yoksa Elma veya Armut mu?

windows mac or linux 300x184 - Microsoft mu yoksa Linux mu; PHP mi ya da ASP.Net mi; yoksa Elma veya Armut mu?

Herkese tekrardan merhaba.

Çok tartışmalı ve her seferinde aldığım geri bildirimler doğrultusunda yazılımcı arkadaşların bana gerek forumlarda, sosyal medyada veya attıkları e-postalarda bahsettikleri bir konuyu biraz karışık ve biraz da basit manada ele almak istiyorum.

Başlık, evet biraz tuhaf.

* * *

Kendimden ve sektörden örnekler vererek bu konuyu açıklığa kavuşturma hedefindeyim.

Aldığım freelancer işlerde, çalıştığım şimdiki veya önceki şirketlerde yaptığım projelerde; yapısı gereği yazdığım uygulamalar veya bileşenler çoğunlukla son kullanıcıya hitap eder.

Biz yazılımcılar uygulama geliştirirken yaptığımız ilk şey analizdir. Bu yadsınamaz bir gerçektir. Yani bir müşteri bizden bir X yazılımı / Y websitesi / Z bileşeni yaratmamızı istediğinde; önce onu anlamak isteriz. Bu müşteri ne istediğini biliyor mu?

(Bu soru, yüzlerce proje geliştirdikten sonra ortaya çıkan bir sorudur tabi. Çünkü müşteri çoğu zaman ne istediğini bilmez veya yapmak istediği şey hakkında bilgi eksikliğinden tarif edemez. O yüzden bu soruyu gerekirse defalarca kendimize ve onlara sorarak teyit almaya çalışırız, “Kullanıcı buraya tıkladığında yapılmasını istediğiniz şey nedir?, bu alan neyi ifade eder?, neyi tetiklemeli?, istediğiniz sonuç nedir?” vb. gibi sorular sorarız. Önce müşteriyi ve müşterinin istek/ihtiyaçlarını anlamak gerekir. Emin olun, müşterinin her zaman danışacağı veya fikir alacağı; bilgili veya çok az bilgili insanlar etrafında vardır. Fakat size değer katacağı yeni bilgiler veya yeni teknolojileri bile keşfetmenize olanak sağlayabilir. Tek yapmanız gereken Google amcaya sormaktır.) 

Eğer müşteri ne istediğini biliyorsa veya siz bu sorunu çözüme kavuşturmayı başarmışsanız; geriye hangi yöntemler, hangi teknolojiler, hangi bileşenler kullanılmalı şeklinde; kısacası “Hangi X kullanılacak” denklemleri kafanızda belirmeye başlar.

Bu süreçte vereceğiniz cevaplar çoğunluk kişisel olmakla beraber geleceğe bakış açınızla alakalıdır. Örneğin,

  • Desteği bitmiş bir teknolojiyi/bir bileşeni kullanıp, bir an önce işi çözüp zamanı nakit durumuna çevirmek ama gelecekte aynı müşteri size “Yeni özellikler eklenmeli isteğiyle” geldiğinde sıfırdan yazmak zorunda kalmak mı?
  • Performans bakımından şahane hızlı ama hiç bilmediğiniz bir teknolojiyi öğrenmek mi?
  • “Ya ben yazayım, nasıl çalışıyorsa çalışsın, zaten bir daha böyle iş ne zaman gelir?” mantığıyla işe tamamlamak mı?

Acemisinden profesyoneline; çakalından işin ehlisine kadar pek çok kişinin takıldığı yerlerdendir bu.

Profesyonel yazılım şirketleri veya geliştiriciler ise “Gelecek vaat eder mi?”, “İlerde bize ihtiyaç duyarlar mı? Duymazlarsa ne yap(ıl)malı?” sorusunun cevabını öngörür.

* * *

Bu yazıyı yazarken aklıma üniversite yıllarından Microsoft sevdalısı; hayranı ve bağımlısı bir arkadaşım geldi. Varsa yoksa “.Net” derdi. Biraz da egoistti. Microsoft tarafından aldığı MCPD sertifikalı bir arkadaşımızdı. Mesleki bakımından gerçekten başarılı bulduğum bir arkadaş olsa da bakış açılarımız tamamen çok farklıydı bu sektör ile alakalı. Çünkü gerektiğinde takım oyununu oynaman gerektirir bu sektör. Bu yüzden yenilikçi bakış açısına sahip olman gerekir.

Bir keresinde üniversite içerisindeki Teknopark gezimizde gerçekten profesyonel bakış açısına sahip, senelerini yazılıma vermiş; lise mezunu ve 4 milyon dolar üzerinde ciroya sahip olduğu yazılım şirketinin sahibine saçma sapan bir soru sorup, beş-on dakika sorular havada uçuşturarak “.Net” i kendince savunmuştu (Bana sorarsanız daha temkinli yaklaşabilir veya daha somut konuşarak işi çözümleyebilirdi. Bu şirket sahibi ağabeyimiz, %100 Pure Java takılırmış zamanında ama sırası geldiğinde başka teknolojileri de kullanmaktan çekinmezmiş). Bu deneyimli ve başarılı yazılımcı ağabeyimizin de cevabı yerindeydi, “Gözlerini biraz aç, yazılım sadece Microsoft’tan ibaret değil.”

Tabi bu bahsi geçen arkadaşım, üniversite sonrasında edindiği sektörel tecrübelerden artık şimdi Linux ortamında da uygulama geliştirmeye başlamış. Üstelik script bile yazıyormuş, laf aramızda kalsın ama arada bloğuna bakıp inceleme fırsatı buluyorum. Başarılı buluyorum. .Net’ten de biraz uzaklaşmış sanki. Ağabeyin verdiği tavsiyeye de uymuş.

* * *

Microsoft ile Linux’un bile yıldızları barıştı, siz neyden bahsediyorsunuz?

* * *

Uygulama geliştirirken, körü körüne bakmayı sevmem; kaldı ki şirketler de böyle yapmaz. Elindeki yeteneği ve bilgiyi dikkate alır çoğunlukla, alsalar da asıl olay; yazının başında belirttiğim gibi gelecek, zaman maliyeti ve bakış açısı ile ilgilidir.

Örneğin, ben web servislerle iletişim halinde olacak paket gönderen/alan bir web uygulaması yazacağım ve frameworklere ihtiyacım var. Hadi hep bildiğimiz teknolojiyi kullanalım, ASP.Net’te ilgili web servisini referans olarak gösterip, projeme dahil etmem sadece dört-beş tıklama. Hadi diyelim paket alıp gönderen kodu da yazdım.. Peki, ilgili paketi gönderip, cevabı response ederken bu arada geçen süre ne kadar verimli? Daha aza indirgeyen başka bir şey var mıdır?

Araştırmaya başlarım.
Benim gözümde bir şeyi araştırırken üç temel kavram vardır;

  1. Sizden önce Amerikayı keşfeden mutlaka biri vardır.
  2. Yanlış şekilde araştırıyor olabilir misin?
  3. İlk keşfeden sen olabilir misin?

Dileyim ki, bulduğum sonuçlar arasında yaptığıma benzer ama farklı içerikler kullanan biri “PHP ile birlikte Laravel kullanarak daha hızlı verim elde ettiğini” iddia etmiş.

Denerim, acımam..

Denemek için aldığım kodu komple indirdim, kendime göre düzenledim ve çalıştırdım (diyelim)..

İncelemeler sonucu, verimlilik ve performans bakımından, ASP.Net’ten daha etkin ve başarılı bir şey olduğuna kanaat kıldım. “Evet bu sefer oldu, şahane çalışıyor!”. 

Hiç vakit kaybetmeden bu projeyi kendime göre yeniden yapmaya karar veriyorum. Laravel’in son versiyonunu indiriyorum, önceden bulduğum kodları kendime göre entegre etmeye çalışıyorum.. Bir de ne göreyim, önceki indirdiğim kodlar Laravel’in eski versiyonu içinmiş.. Hayde..

Dur bakayım eski versiyonuna ait dökümantasyon var mı?

beş-on dakika sonra..
E, o da yok; ne yapacağız şimdi?

İşte burada bir çıkmaza girdik. Eski versiyona artık destek kalkmış.
Biraz daha araştırıyorum ve araştırmalarımın sonucunda CodeIgniter ile bu işi başaranları keşfediyorum. Ama ben hiç CodeIgniter kullanmamış biriyim.. Birkaç deneme yapıp, makale okuduktan sonra bakıyorum ki Laravel’e göre kapsam daha basit ve CodeIngiter framework’un dokümantasyonu şahane olmakla beraber, desteği hep verilecekmiş.. falan filan..

Hadi CodeIgniter öğrenelim,

bir-iki gün sonra..
aaa şahane bir şey lan bu!

* * *

Yukarıdakine benzer bir senaryoyu bir ay kadar önce bir projede yaşadık.
Neyse ki şirketteki deneyimli ağabeylerim sayesinde sorunu kısa sürede çözümledik.
Şimdilerde ise çatır çutur yazıyorum kodları acımadan.

* * *

Bu ana kadar anlattıklarımı gelişi güzel yazdım.
Yani akademik dilden çok, daha samimi şekilde ifade etmek istedim ama bazı detayları atlayarak 🙂

Daha fazla bilgi ve bakış açısı için; yazılım geliştirme süreci ile alakalı bu tezi incelemenizi isterim.

Bir sonraki makalede görüşmek üzere.

Enis Kurtay YILMAZ

fs Programming 2018.xl  - JSON nedir ve C# ile JSON kullanımı

JSON nedir ve C# ile JSON kullanımı

Merhaba dostlar.

Aslında sizlere türkçe kaynaklarda yarım yamalak anlatılan Django makalelerini, birebir çeviri yaparak seslenecektim. Ancak şimdilik mevcut projelerimizden dolayı bunu başka bir bahara bırakarak, sizlere “JSON nedir ve C# ile JSON kullanımı” makalesi ile sesleniyorum.

Bu makalede neleri öğreneceksiniz?

  1. JSON Nedir?
  2. C# ile JSON Verileri Oluşturmak
  3. C# ile JSON Verilerini Okumak

Hadi başlayalım!

 

1. JSON Nedir?

Aslında JSON (Javascript Object Notation), JavaScript tarafından bize sunulmuş bir nimettir. Türkçesi ise “Javascript Nesne Gösterimi”dir. Wikipedia‘ya göre “insanlar tarafından okunabilen bir veri değişimi biçimidir” denilse de, insanlar dediği kısım bence yazılım geliştiriciler içindir.

JSON bir ağaç yapısıyla çalışır ve XML mantığına benzerdir (kısmende benzer değildir). Ağaç yapısından ve kendisinin sunduğu özellikten dolayı, XML’den daha kolay ve daha hızlı işleyebilmekteyiz. Bağımsızdır, kısadır ve anlaşılabilir bir yapıdadır. XML ile karşılaştıracak olursak, benzerliğini göreceksiniz (Şekil 1).

sekil1 - JSON nedir ve C# ile JSON kullanımı
Şekil 1

Yukarıda örnek göstermek amacıyla, “Mersin Üniversitesine” ait üç öğrencinin JSON ve XML türlerine göre bir örneği mevcuttur. Dikkatinizi çekerse JSON daha kısa ve daha anlamlıdır. Köşe parantezlerin [] birer dizi olduğunu, süslü parantezlerin {} ise {“anahtar”:”değer”} mantığı taşıdığını görebilirsiniz.

Peki JSON bize nerede işe yarayacak? Eğer sizin tarafınızdan oluşturulmamış ikinci bir kaynaktan veri alışverişinde bulunmak isterseniz, JSON hayat kurtarır nitelikte olacaktır. Örneğin Twitter API’si kullanarak bir geliştirmek isterseniz karşınıza JSON çıkacaktır. Hatta pek çok sistem JSON veri paylaşımında bulunmaya başlamıştır. Google’da Free Json API yazarsanız, istemediğiniz kadar JSON ile karşılaşabilirsiniz.

Eğer XML ile uğraştıysanız, JSON’ın Key ve Value mantığı gibi bir durumunun olduğunu göreceksiniz. Nedir bu Key’leri ve Value’ları, yukarıdaki örnekten yola çıkalım ve örnek JSON kodumuzu Şekil 2’de verelim.

sekil2 - JSON nedir ve C# ile JSON kullanımı
Şekil 2

“universite” bir anahtardır (Key), “Mersin” ise değeridir (yani Value).
“ogrenciler” bir anahtardır ve değeri aslında bir dizidir. Çünkü değer içerisinde birden çok veri vardır. İnceleyecek olursak bu diziyi, içerisinde üç adet “isim” diye anahtarlar vardır. Bu anahtarların da aldığı değerler (Kurtay, Serdar, Şafak) vardır.

{“nekadar”:”100 Lira”} örneği de bir JSON’dur. “nekadar” ifadesi anahtar iken “100 Lira” ise değeridir. Yani JSON’un temel kalıbı {“key”:”value”} şeklindedir.

Temel bilgileri öğrendiğimize göre, gelelim en baba soru veya sorulara..
Bu JSON’ı nasıl oluşturacağız? Bunları tek tek Şekil 2’deki gibi mi elimizle biz mi yazacağız?

El-cevap çok sevdiğim dostumun deyişi ile “amelelik yapmaya gerek yok, vardır bir yolu”..

 

2. C# ile JSON Verileri Oluşturmak

Öncelikle Visual Studio’da bir Console uygulaması açalım. Solution Explorer üzerinden References kısmına sağ tıklayarak, JSON için ilgili kütüphaneyi kuralım (Şekil 3 ve Şekil 4).

sekil3 - JSON nedir ve C# ile JSON kullanımı
Şekil 3

sekil4 - JSON nedir ve C# ile JSON kullanımı
Şekil 4 – “JSON” diye arayınız, Newtonsoft.Json seçiniz, Install ile kütüphaneyi kurunuz.

Şu ana kadar yaptıklarımızı toparlayacak olursak, JSON için temel bilgilerini öğrendik ve bunu kendi C# uygulamamız için temel kütüphanesi kurmayı gerçekleştirdik. Gelelim uygulama yazılımına. Her şeyden önce tabii ki kütüphanemizi kurduysak, JSON için gerekli using tanımını yapmak lazım. Kod bloğumuzun en üst kısmına gerekli tanımı yapıyoruz.

using Newtonsoft.Json;

Şekil 2’deki JSON kod örneğini bizim yazılımımıza entegre etmek için öncelikle sınıflar ve Generic sınıflarla çalışacağız. Eğer hakkında bilgi sahibi değilseniz, Google amca buyurunuz.

Eğer C# uygulaması için yukarıdaki JSON örneğinin anahtarlarından (yani Key) bir class oluşturmakta zorlanıyorsanız, şu sitede otomatik class oluşturabilirsiniz C# için, buyurunuz. (Şekil 5 ve Şekil 6)

Örnek JSON Kodu

{
"universite":"Mersin",
"ogrenciler":[
    {"isim":"Kurtay"},
    {"isim":"Serdar"},
    {"isim":"Şafak"}
]}

sekil5 1024x595 - JSON nedir ve C# ile JSON kullanımı
Şekil 5 – JSON Kodunu yapıştırıp SUBMIT edelim.

 

sekil6 1024x301 - JSON nedir ve C# ile JSON kullanımı
Şekil 6 – Sayfanın aşağısındaki oluşturan kodu kopyalayalım ve projemize geçelim.

Kendi kodumuzu kopyalarken kodda yer alan Example olan kısmı, kendi projemizde UniversiteOgrencileri olacak şekilde değişip yapıştırıyorum (Şekil 7).

Kod

public class Ogrenciler
    {
        public string isim { get; set; }
    }
 
    public class UniversiteOgrencileri
    {
        public string universite { get; set; }
        public IList ogrenciler { get; set; }
    }

sekil7 - JSON nedir ve C# ile JSON kullanımı
Şekil 7

Bu arada Şekil 7’deki gibi using kısmını değiştirmeyi unutmayınız..

 

Sıra geldi ilgili Class’ı kullanarak yeni verileri JSON gibi oluşturmaya..

Generic class ile ilgili alanlara atamayı yaptıktan sonra aslında tek yapmamız gereken, JsonConvert.SerializeObject() metodu ile JSON oluşturmaktır. Gelsin kodlar..

            UniversiteOgrencileri universiteOgrencileri = new UniversiteOgrencileri();
            universiteOgrencileri.universite = "Koç";
 
            List p = new List();
            Ogrenciler ogrenci1 = new Ogrenciler{ isim = "Şafak" };
            Ogrenciler ogrenci2 = new Ogrenciler{ isim = "Dilara" };
            Ogrenciler ogrenci3 = new Ogrenciler{ isim = "Can" };
 
            p.Add(ogrenci1);
            p.Add(ogrenci2);
            p.Add(ogrenci3);
            universiteOgrencileri.ogrenciler = p;
 
            string json = JsonConvert.SerializeObject(universiteOgrencileri);
            System.Console.WriteLine(json);

Çıktıyı görelim (Şekil 8).

sekil8 1024x721 - JSON nedir ve C# ile JSON kullanımı
Şekil 8

Oluşturma işlemimiz başarılı! Format biçimini beğenmedi iseniz, Google amca sayesinde bunu biçimsel hale getirebilirsiniz, buyurunuz. (Şekil 9)

sekil9 1024x518 - JSON nedir ve C# ile JSON kullanımı
Şekil 9

3. C# ile JSON Verilerini Okutmak

Bence en basiti burası. Eğer JSON’dan elde ettiğiniz bir veri varsa, bunu aktarmayı tek kod ile gerçekleştirebilirsiniz. Hele Class’ınızda JSON’a uygunsa, tek kodunuz sizi bekliyordur.

İşimizi zorlaştıralım ve bir örnek senaryo düşünelim. Diyelim ki www.xyzuniversitesi.com/ornek.json adresinden bir üniversiteye ait öğrencilerin bilgilerini okumaya yarayan bir uygulama yazacaksınız.

İlgili öğrenci bilgileri de Şekil 9’daki gibi olsun.

sekil9 1024x518 - JSON nedir ve C# ile JSON kullanımı
Şekil 9

İhtiyacımız olan ilk şey JSON’dan gelecek veridir. Çünkü öğrenci verileri burada tutulmaktadır. Bize de veriler lazımdır. Algoritma şeklinde düşünürsek ilk ilgili siteye talep oluşturmamız, ardından talep sonucu elde ettiğimiz değeri bir değişkene aktarmamız gerekmektedir. Aşağıdaki kod ile ilgili siteye JSON verisini elde etmek için talep oluşturalım, ardından elde ettiği verileri jsonVerisi adlı değişkene aktaralım.

            string url = "<a href="https://www.eniskurtayyilmaz.com/ornek.json" target="_blank" rel="noopener noreferrer">www.xyzuniversitesi.com/ornek.json</a>";
 
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            string jsonVerisi = "";
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                //jsonVerisi adlı değişkene elde ettiği veriyi atıyoruz.
                jsonVerisi = reader.ReadToEnd();
            }

Bunu yazdıktan sonra aman ha, using System.IO; ve using System.Net; tanımlarını yapmayı unutmayalım!

Neyse.. İlgili JSON için Class ve Generic class oluşturmayı öğrenmiştik yukarıda bir yerlerde. Dikkat ederseniz aynı anahtar (Key) üzerinden çalışmaktayım, sadece değerler (Value) farklıdır. Bu yüzden ilgili Class’ı silmemize gerek kalmayacak şimdilik bu uygulamada. Eğer siz başka bir çalışma yapıyorsanız, siz kendiniz bayağı yukarıda bahsettiğim gibi otomatik oluşturabilecek sitelerden faydalanarak bu işlemi yapabilirsiniz.

İlgili JSON’daki verileri kendi uygulamamızdaki Class’a aktarıp, bundan sonra istediğimizi yaptırabiliriz. Dedim ya tek kod, buyurunuz.

UniversiteOgrencileri universiteOgrencileri = JsonConvert.DeserializeObject(jsonVerisi);

Yukarıda “universiteOgrencileri” adlı UniversiteOgrencileri türü olan Class’a, DeserializeObject() Metodu ile ederek elde ettiğimiz verilerin hepsini düzenli olarak işledik. Tabi burada önceden bu hiyerarşiye uygun oluşturduğumuz Class önemli olan.

E hadi bir sonraki makalede görüşmek dileğiyle.

Bu makalede yer alan tüm kodlar için : https://github.com/eniskurtayyilmaz/csJsonKullanimi

bagis genel 150x150 - JSON nedir ve C# ile JSON kullanımı

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Python ile Anagram oluşturma

Python ile Anagram oluşturma

Merhaba dostlar.

Bugün, akşamüstü vakitlerinde Google’da “Python örnek kodlar” ve “Python örnekleri” diye arattırdım. Sonuçlar içerisinde bir web sitesine denk geldim ve Python ile Anagram (Bkz. Anagram Nedir?) oluşturduğunu iddia eden bir makale okudum. Mantık olarak çok az doğru gidilse de istenilen sonuca ulaşması imkansızdı iddia edilen makalede. Çünkü pek çok detay atlanmış ve düzensiz bir değer ortaya çıkıyordu. Bende emin olmak için kendim yapmaya karar verdim.

Yazının sonlarına doğru, Anagram tekniğinin doğru algoritmasını ve bunun kodlarını göreceksiniz. Ama “Ben hepsini okuyamam, kodu görsem anlarım arkadaş! Sen sadece kodları ver” diyorsan, tıkla bakalım.

Şimdi bahsettiğim web sitesini ve yukarıda yazdıklarımı bir kenara bırakıp; TÜBİTAK’ın yayınlamış olduğu aşağıdaki soruları nasıl cevaplarız, buna odaklanalım.

Görüntü 011 - Python ile Anagram oluşturma
(Kaynak: TÜBİTAK UEKAE)

 

Önce algoritmayı ele alalım ve neyin ne ifade ettiğini bir kavrayalım.

Anagram tekniğinde; belirtilen cümle veya kelime içerisinde kaç adet harf olduğu tespit edilir ve ardından boşluk karakterler dikkate alınmaksızın, bulunan sonuç alfabetik sıraya alınarak yazılır. Örneğin “merhaba” kelimesini ele alalım. Kelime içerisindeki harfleri, adetleri ile beraber vermiş olduğumuz kelime bazında sıralayacak olursak şu sonuçları elde ederiz (Tablo 1).

Görüntü 012 - Python ile Anagram oluşturma
Tablo 1

Yukarıda Anagram için bulunan harf ve adetlerde alfabetik sıralama yaptığından da bahsetmiştik. Tablo 1’deki verileri alfabetik sıralamaya alacak olursak şöyle bir sonuç alacağız, “2a1b1e1h1m1r”.

Peki bu sonuç yeterli mi? Cevap kesinlikle hayır! Çünkü Anagram tekniğinde kodlanacak olan kelime veya cümle içerisindeki harflerden sadece bir tane varsa, sayısal değeri yazılmaz. Haliyle sonucumuz “2abehmr” şeklinde olmalıdır.

Bu nereden anlıyoruz?
TÜBİTAK’ın vermiş olduğu örneği tekrar inceleyelim. “Dünya güneşin etrafında döner” cümlesini ele alalım. İçerisindeki harfleri alfabetik bazında sıralayacak olursak, sonuç aşağıdaki gibi olacaktır (Tablo 2).

Görüntü 0131 - Python ile Anagram oluşturma
Tablo 2

Tablo 2’yi tek satırlık bir düzene sokacak olursak bizim bulduğumuz sonuç “3a3D3e1f1g1ı1i5n1ö2r1ş1t2ü1y” şeklinde olacaktır. Peki TÜBİTAK’ın bu soruya vermiş olduğu cevap neydi? Sayfanın en başına gelerek bakıyoruz, bize verdiği cevap, “3a3d3efgıi5nö2rşt2üy” olarak belirtilmiş. Buradan iki sonuç çıkar:

  1. Dikkat ederseniz kelime içerisindeki f,g,ı,i,ş,y harflerinin başında 1 yazmamaktadır, yani sayısal değerini belirtmemiştir. Bu demek oluyor ki, kelime veya cümle içerisindeki tek harfler için sayısal değerini yazmamalıyız.
  2. Bulduğumuz sonuç ile TÜBİTAK’ın bulduğu sonuç arasında bir harf farkı vardır. “Dünya güneşin etrafında döner” cümlesindeki “D” harfi büyüktür. Bulduğumuz sonuç içerisinde “D” büyük iken, TÜBİTAK’ın verdiği sonuç içerisindeki “d” harfi küçüktür. Bu demek oluyor ki, kelime veya cümle içerisindeki harflerin hepsini küçük harf olarak dikkate almalıyız.

 

Buraya kadar Anagram tekniğinin inceliklerini fark etmişsinizdir.

Şimdi, Python’da yazdığım kodları ve bulduğu sonuçları paylaşıyorum. Detaylı anlatım devam edecektir..

Python ile TÜBİTAK sorusunun cevabını bulan kod.

# -*- coding: cp1254 -*-
__author__ = 'EnisKurtay'
import locale
locale.setlocale(locale.LC_ALL, "Turkish_Turkey.1254")
 
def anagram(cumle):
    cumle = cumle.lower()
    liste = []
    for s in set(cumle):
        if (str(s).isspace() == False) and (str(s).isalpha() == True):
            liste.append(s)
    liste.sort(key = locale.strxfrm)
 
    if (liste.__contains__("ı") == True) and (liste.__contains__("i") == True):
        liste.remove("i")
        liste.insert(liste.index("ı") + 1,"i")
 
    sonuc = ""
    for d in liste:
        if cumle.count(d) == 1:
            sonuc = sonuc + "{0}".format(d)
        else:
            sonuc = sonuc + "{0}{1}".format(cumle.count(d), d)
    return sonuc
 
#Birinci sorunun cevabı
print "TÜBİTAK Cevapları..\n(i) : {0}".format(anagram("Dünya güneşin etrafında döner"))
 
#Ikinci sorunun cevabı
tubitakCumleler = ["Su molekülünde üç atom vardır", "Yanma oksijen gerektirir", "Elmas karbondan oluşur"]
for s in tubitakCumleler:
    if anagram(s) == "2a3eg3ij2km2no3rsty":
        print "(ii): {0}".format(s)

Bulduğumuz cevabı da kanıtlayalım.

Görüntü 015 - Python ile Anagram oluşturma


Detaylı Anlatım

Öncelikle anagram adında bir parametrik fonksiyon tanımladım:

def anagram(cumle):

Ardından “cumle” parametresine gelecek değeri, içerisinde bulunan harfleri tekrarlamayacak şekilde döngüye alıp bir listeye aktarıyorum. Fakat listeye aktarmadan önce, gelen değerin harf mi yoksa boşluk karakteri mi olduğuna dikkat ederek listeye aktarıyorum. Hemen bunun sonrasında bu listeyi alfabetik olarak sıralıyorum.

    cumle = cumle.lower()
    liste = []
    for s in set(cumle):
        if (str(s).isspace() == False) and (str(s).isalpha() == True):
            liste.append(s)
 
    #Aşağıdaki sort() fonksiyonun içerisindeki parametreyi birazdan açıklayacağım
    liste.sort(key = locale.strxfrm)

Ancak burada bir şey dikkatimi çekmişti, sizlerle paylaşmak isterim. Python ile Türkçe’de bulunan tüm harfleri içeren bir diziyi sıralamaya doğrudan aldığımda, Türkçe’de bulunan işaretli (ç, ö, ü, ş gibi) karakterlerin sıralamada en sonlarda belirdiğini gözlemledim. İnternette locale kullanarak türkçe karakterli işlemlerde setlocale yapmamız gerektiğini belirten bir yazıyla karşılaştım. Bu yüzden önce locale tanımlarımı yaptım ve ardından sort() fonksiyonun içerisinde böyle bir parametre yazdım.

locale ettikkten sonra herşeyin düzenli ancak “i” harfinin, “ı” harfinden önce geldiğini gördüm. İnternette bu sefer tam bir derinlemesine araştırma yaptım ve bunun çözümü ile alakalı pek çok şey okudum. Hiçbiri istediğim sonucu vermedi. UTF-8, Unicode yöntemleriyle çözmeye çalışıyorlardı fakat bana Windows – 1254 gerekiyordu. Düşünsenize bir kelime içerisindeki harfleri alfabetik sıraya soktunuz ve “cç”, “gğ”, “oö”, “sş”, “uü” harfleri düzenli & doğru gelirken, “iı” düzensiz geliyor(!) Tam bir saçmalık ve kabul edilemez bir durum!

Bende daha fazla vakit harcamamak ve bunun önüne geçmek için kısa bir çözüm buldum. Eğer bulduğum kelimelerin içerisinde “ı” ve “i” harfleri varsa, yerlerini değiştirmem benim için yeterliydi. Çünkü “ı” harfi yoksa, mantıklı olarak “i” harfi aslında olması gereken yerdedir alfabetik sıralamada. 🙂

if (liste.__contains__("ı") == True) and (liste.__contains__("i") == True):
        liste.remove("i")
        liste.insert(liste.index("ı") + 1,"i")

Ardından fonksiyonumuzun geri kalanını yazdım. Aşağıdaki kodlarda her harfin, kaç adet olduğunun bilgisini değişkene ekleyerek, fonksiyon içerisinde bulduğum sonucu “return” deyimi döndürdük.

sonuc = ""
    for d in liste:
        if cumle.count(d) == 1:
            sonuc = sonuc + "{0}".format(d)
        else:
            sonuc = sonuc + "{0}{1}".format(cumle.count(d), d)
    return sonuc

Geriye artık fonksiyonumuzu çağırmak kaldı. Tek yapmamız gereken fonksiyonu çağırırken içine parametre vermektir. Bende TÜBİTAK’ın verdiği soruları çözen kodları yazdım. Eğer siz sadece Anagram’daki değeri görmek istiyorsanız ‘print anagram(“cümle veya kelimenizi buraya yazın”)‘ demeniz yeterlidir.

#Birinci sorunun cevabı
print "TÜBİTAK Cevapları..\n(i) : {0}".format(anagram("Dünya güneşin etrafında döner"))
 
#Ikinci sorunun cevabı
tubitakCumleler = ["Su molekülünde üç atom vardır", "Yanma oksijen gerektirir", "Elmas karbondan oluşur"]
for s in tubitakCumleler:
    if anagram(s) == "2a3eg3ij2km2no3rsty":
        print "(ii): {0}".format(s)

Bir sonraki makalede görüşmek üzere.

Bu makalede geçen kodlar için : https://github.com/eniskurtayyilmaz/Python27/blob/master/anagram.py

bagis genel 150x150 - Python ile Anagram oluşturma
Enis Kurtay YILMAZ

fs Programming 2018.xl  - Python ile temel dosya işlemleri

Python ile temel dosya işlemleri

Merhaba dostlar.
Bugünkü makalede Python programlama dili ile temel dosya işlemlerini, yeni öğrenenler açısından basit düzeyde gerçekleştireceğiz.

Programlama ile uğraşıyorsanız, er yada geç uğraşacağınız şeyden biri de dosyalardır. Dosyalar içerisinde yapmak isteyeceğiniz işlemlerdir. Bir dosya içerisine veri yazmak veya okumak olabilir bunlar. Bunun için “IO” (input and output) bileşenini kullanmanız gerekmektedir. Bir dosya ile bağlantı kurmak için önce open() fonksiyonunu kullanacağız. Python ile hadi kodlayalım!

dosya = open("yazi.txt", "w")

Yukarıdaki örnekte çalıştığınız dizin üzerinde “yazi.txt” dosyası ile bağlantıyı dosya değişkenine aktararak bağlantısını gerçekleştiriyoruz. Eğer çalıştığınız dizin üzerinde “yazi.txt” diye bir dosya yoksa yeni bir tane oluşturacaktır. Bunun sebebi ise IO bileşeni içerisindeki tanımlanmış mode’tur. Yukarıda “w” yazdığımız yer, aslında bizim tanımladığımız bir mode. Dosya içerisine yazı yazabileceğimizi belirtir.

Modlardan genel olarak bahsedelim biraz. Aslında mode, bir dosya ile yapacağımız işlemden önce erişim tanımlamaktır. Örneğin bir dosyayı sadece okuma işlemleri için modunu “r” yapmamız (read/okuma) yeterlidir. Bu sayede ilgili dosya ile sadece okuma işlemi yapacağımızı belirtmiş oluruz. Doğal olarak okuma modunda açtığımız için, üzerine yazma gibi bir durumumuz söz konusu değildir. Biraz onlardan ve özelliklerinden bahsedelim bahsedelim bu esnada.

Mode Tanım & Açıklama
“r” Read/Okumak anlamına gelir. Bu Mode ile sadece okuma işlemleri yapılır. Eğer böyle bir mode tanımlamış ve ileriki kodunuzda yazma işlemi yapmaya çalıştığınızda hata alırsınız.

Eğer belirttiğiniz dizinde dosya yok ise, hata alırsınız.

“w” Write/Yazmak anlamına gelir. Bu mode ile yazma işlemi yapılır. Eğer belirttiğiniz dizinde dosya yok ise, yeni dosya yaratır.

Eğer belirttiğiniz dizinde dosya var ise önce içindekini siler, ardından tekrardan yeni dosya yaratır.

Örneğin a.txt dosyası içerisinde “Merhaba” yazıyor olsun. Yeni bir “Naber” satırı yazma işlemi gerçekleştirdiğinizde, dosyanız aşağıdaki gibi gözükür.

Naber

“a” Append/Eklemek anlamına gelir. Bu Mode ile mevcut olanın üzerine eklemeler yapar. Eğer belirttiğiniz dizinde dosya yok ise, yeni dosya yaratır.

Eğer belirttiğiniz dizinde dosya var ise dosya içerisindeki yazanlara bir hamlede bulunmaz, yazacağınız yeni içeriği dosyaya ilave eder.

Örneğin a.txt isminde bir dosyanız olsun içerisinde “Merhaba” yazıyor olsun. Siz “a” modunda bağlanıyorsanız ve dosya içerisine yeni bir “Naber” satırı yazma işlemi gerçekleştirdiğinizde, dosyanız aşağıdaki gibi gözükür.

Merhaba
Naber

Bu modlara ek olarak, “w+”, “a+” gibi tanımlarda vardır. Temel anlamda gittiğimiz için başka bir makalede bunlardan bahsedeceğim.

Şimdi Python ile yazi.txt diye bir dosya oluşturalım ve ardından “merhaba\nnaber” yazdıralım. Bildiğiniz üzere “\n” kaçış dizisi ile “naber” yazısının bir alt satıra inmesini sağlayacağız.

dosya = open("yazi.txt","w")
dosya.write("merhaba\nnaber")
dosya.close()

Yukarıdaki kod ile yazi.txt adında bir dosya oluşturuyoruz, tanımladığımız “w” mode ile. Ardından write() fonksiyonunu alt alta gelecek şekilde yazımızı yazdırıyoruz. Dosyaya girip, baktığınızda aşağıdaki gibi gözükecektir.

merhaba
naber

En sondaki close() fonksiyonu ise bu dosya ile işimizin bittiğini, mevcut bağlantının ise sonlandırılmasını belirtiyoruz.

Peki mevcut olan bu dosyayı nasıl okutturabiliriz?

dosya = open("yazi.txt","r")
icerik = dosya.read()
dosya.close()
print satir

Yukarıda fark ettiyseniz, “r” yani okuma modunda dosyaya bağlandım. Ardından icerik adındaki değişkene, read() fonksiyonunu kullanarak dosya içerisindeki tüm verileri aktardım, dosya bağlantısını sonlandırdım. Son satırda da icerik adındaki değişkenin içerisindekini ekrana yazdırdım. Karşınıza aşağıdaki sonuç çıkacaktır.

merhaba
naber

Son bir örnek daha yapalım, bu sefer “a” modunda olsun yani mevcut olanın üzerine eklemeler yapalım “Append” ile.

dosya = open("yazi.txt","a")
dosya.write("iyi senden naber?")
dosya.close()

Bu sefer modu “a” yaptık ve dosya içerisine “iyi senden naber?” yazdık. Ardından mevcut bağlantıyı sonlandırdık.

Peki dosya içerisine girdiğimizde ne görmüş olacağız, ona da bakalım dilerseniz. Aşağıdaki gibi veriler gösterilecektir.

merhaba
naberiyi senden naber?

“naber” ve “iyi senden naber?” neden yanyana oldu? Çünkü kaçış dizisi veya boşluk kullanmadığımız için böyle bir şey gerçekleşti. Yukarıda kaçış dizisini hatırlamışsınızdır “\n” şeklindeydi.

Burası önemli! Çünkü buradan bir sonuç daha çıkarabiliriz. Demek ki write() fonksiyonu satır satır yazmıyor. İmlecin son durduğu yerden yazmaya başlıyor demektir. İpucu isterseniz, alt satıra geçmek için “\n” kaçış dizilerini kullanabiliriz.

Bir sonraki makalede görüşmek dileğiyle.

bagis genel 150x150 - Python ile temel dosya işlemleri

K. YILMAZ

fs Programming 2018.xl  - Python ile girilen tek ve çift sayıların toplamı

Python ile girilen tek ve çift sayıların toplamı

Uzun bir süreden sonra tekrardan merhabalar..
Hayatımda son gelişmeleri kısaca özetlemek gerekirse, yaklaşık yedi gün önce(12/06/2015) üniversiteyi bitirdim ve bitirdiğimin ertesi haftasında İzmir’de yazılım geliştirme uzmanı olarak işe başladım..

Bu aralar yeni bir programlama dili öğreniyorum (Python) ve başlangıç seviyesindeki (beginner) arkadaşlar için örnek kod teşkil etmek adına bu yazıyı yazıyorum.

Şimdi dilerseniz şöyle bir senaryo düşünelim..
Bir kullanıcı, altı (6) tane sayıyı girerek, bu sayıların tek/çift durumlarına göre toplamlarını öğrenmek istiyor olsun. Başka bir kullanıcı da oniki (12) sayıyı girmek istiyor olsun.

Yazılımcı ve matematikçi gözden bakacak olursak, bir sayının tek veya çift durumu anlamak için “Sayı 2’ye tam bölündüğünde kalan veriyor mu, vermiyor mu?” durumuna bakmak yeterlidir.

Örneğin 4 sayısını ele alalım. 4 sayısını 2’e böldüğünüzde, kalan sıfırdır. Bildiğiniz üzere programlamada bir sayının modunu almak % işareti ile tanımlanmıştır.

Yukarıdaki senaryoyu dikkate alırsak aslında kullanıcının gireceği sayıların farklı ve değişken olma söz konusu vardır. Örneğin bir kullanıcı altı adet sayıyı hesaplamak istiyor, diğer kullanıcı ise oniki sayıyı..
Haliyle ilk olarak yapacağımız şey, kullanıcının kaç sayıyı hesaplamak istediğini bilmemizdir. Hem bu sayede döngüyü kullanarak girilen sayıların, tek mi çift mi olduğunu anlayabiliriz öyle değil mi?

Şimdi size bu senaryoya göre Python dilinde yazdığım kodları paylaşıyorum.
İyi kodlamalar.

# -*- coding: cp1254 -*-
__author__ = 'EnisKurtay'
 
kac_sayigirilecek = raw_input("Kaç sayı gireceksiniz? : ")
sayilar = []
toplam_teksayilar = 0
toplam_ciftsayilar = 0
 
for sayi in range(0,int(kac_sayigirilecek)):
        sayilar.append(int(raw_input("{0}. sayıyı giriniz : ".format(sayi + 1))))
        if sayilar[sayi] % 2 == 0:
            toplam_ciftsayilar = toplam_ciftsayilar + sayilar[sayi]
        else:
            toplam_teksayilar = toplam_teksayilar + sayilar[sayi]
 
print "Tek sayıların toplamı : {0}\n" \
      "Çift sayıların toplamı : {1}\n" \
      "Toplamda {2} sayı girildi.".format(toplam_teksayilar,toplam_ciftsayilar,kac_sayigirilecek)

bagis genel 150x150 - Python ile girilen tek ve çift sayıların toplamı

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Dört senelik bir süreç, Mersin..

Dört senelik bir süreç, Mersin..

Dört senelik bir süreç olan üniversite hayatım dün bitti. Okulu bitirdikten sonraki hafta hemen işe başlamam ve İzmir gibi bir yerde kendi sevdiğim işi bulmam, sanırım tanrının bana verdiği en güzel hediyeydi Amerika’dan döndükten sonra. Bu konuda patronum, ev arkadaşım, iş ortağım ve 2008’de tanıştığım kişiye teşekkürlerim ayrıdır..

Her şeyin başında gelen, yaşattıklarını sıralasam bitmeyecek, hakkını ödemeyeceğim, diğer bir yarım olan “Annem”in emeği sonsuzdur. Her şeye rağmen benimle beraber üç şehir eskiten, en zor şartlarda bile bana yardımcı olan o müstahdem hanım olan anneme çok ama çok teşekkür ederim. O şimdi Mersin’de bir süre deniz, kum ve güneşin tadını çıkaracak ben İzmir’deyken. Annemin arkadaşları olan diğer müstahdem hanımlara ve eşlerine ayrı ayrı teşekkür ediyorum. Üniversite hayatımda onları tanıdığım ve yardımları için, annemle olan sıkı dostluklarına hayran kaldığım için ayrı ayrı teşekkür ediyorum.

Üniversite hayatım boyunca, 2011-2015 yıllarında bir şekilde tanıştığım ve bana değer katan o kadar çok insan var ki hangisine teşekkür yazacağımı bilemiyorum..

Başta hocalarımın bana öğrettiklerine, konular üzerindeki bana aktardıkları bakış açılarına ve deneyimlerine sonsuz teşekkür etmem gerektiğini düşünüyorum. Ne zaman odalarına gitsem veya ne zaman telefon ile kendileriyle iletişim kurduğumda, asla “Hayır” demeyen ve son üç gündür bil hassa vedalaşmaya gittiğim hocalarım için tekrardan sonsuz teşekkür ederim.

Ardından sıkı dostluklar kurduğum Oktay, Tuna, Koray ve Uğur arkadaşlarıma apayrı teşekkür ediyorum. “Vefalı dost” kavramını ne olursa olsun silmedikleri ve yaşattıkları için. Onlara hikâyemizin daha bitmediğini, ilerde görüşeceğimizi ve “dağıtmadan asla toparlayamazsın” sözünü bir kez daha hatırlatmak istiyorum. Hayatlarındaki her şeyin gönüllerince olmasını ve mutlu olmalarını diliyorum.

2011-2015 yıllarını kapsadığı için yazmam gerektiğini ve Amerika’da geç tanıştığımı düşündüğüm; sıkı dostluk kurduğum İbrahim, Murat, İbrahim’e de ayrı teşekkür ederim. Miami’de ve özellikle Myrtle Beach’te her şeyin dibini görmeye çalıştığımız günlerin anısına..

Adını sıralamaya başlasam çok uzun olabilecek, bana bir şekilde değer katan diğer arkadaşlarıma da; yaşadığım güzel maceralar ve entrikalar için ayrı ayrı teşekkür ediyorum kendilerine.

Son zamanlarda gördüğünüz veya gözlemlediğiniz bir diğer eski arkadaşım (arkadaş sıfatına bile layık görmeye utandığım kişi) içinse ona sadece güldüğümü ve “adamlık muhabbetlerinde” aklına geleceğime emin olduğumu belirterek, hayatında başarılar diliyorum. Dilerim bir gün uyanır, benim haricimdeki diğer insanlara özür dileme cesaretini toplar.

Son olarak, bunu demenin bir borç olduğunu düşündüğüm, üniversite hayatımda tek bir kişi için sadece özür dilemek ve hayatında mutluluklar dilemekle kalıyorum.

Gelelim son sözlere..
İyi ilişkiler kurduğum ve her seferinde gözümü bir şekilde açtığımı düşündüğüm üniversite hayatım, acısıyla-tatlısıyla bitti. Keşke dediğim hiçbir şeyin olmadığını sevinçle belirterek, mutlu ve huzurlu ayrılıyorum bu şehirden. Her ilçesini karış karış gezerek gördüğüm, yüzmediğim yerin kalmadığı, radyo yayını bile yaptığım.. Adana’ya sırf kebap yemek ve dostum Tuna’yı görmek için gittiğim, tantuninin ve limonun hiç bitmediği Mersin’i çok özleyeceğimi bilmenizi isterim. İstanbul – Bursa – Mersin derken şimdi sıra İzmir’e geldi.

Hey İzmir! Önümüzdeki yıllarda başka bir planın yoksa sana âşık olmaya geliyorum.

Bu arada..
Siz, çekirdeğe çiğdem diyormuşsunuz? 😉

ergenekon2 1 - Ergenekon Çıkmazı

Ergenekon Çıkmazı

Yazsam mı, yazmasam mı diye çok düşündüm ve bir karara vararak bunları yazıyorum.

***

Bildiğiniz üzere ERGENEKON davası hâlâ devam ediyor.
Gerek gazetelerden ve haberlerden, doğru veya yanlış bir şekilde bilginizin olduğu düşünüyorum.

Sizlere “Ergenekon terör örgütüdür” veya “Ergenekon masumdur” demeyeceğim.
Sizlere İddianamede de söz konusu olan bilgisayardaki bir dosyaya ait tarih bilgisinin nasıl değiştirileceğini göstereceğim. Bunu C# programlama dili ile gerçekleştireceğim.

İddianamede, bilgisayardaki bir Word dosyasının 12 Şubat 2003 tarihinde oluşturulduğu bilgisi yer alıyor. Söz konusu olan Word dosyasında Calibri fontu kullanılmış. Halbuki Microsoft bile açıklama yaptı, bu font Office  2007’de ilk kullanılmaya başlandı diye.. [kaynak]

Neyse biz gelelim bir dosyanın tarih bilgisinin nasıl değiştirildiğine.
Bilgisayarımda oluşturduğum Word dosyasının oluşturma tarihini ve diğer tarih bilgilerini nasıl değiştirildiğini görelim.

Masaüstüne sağ tıklıyorum ve yeni bir Word belgesi oluşturuyorum.
İsmine de ERGENEKON diye belirliyorum
ergenekon1 - Ergenekon Çıkmazı

Bu Word belgesine sağ tıklayıp, Özellikler diyoruz. Özellikler kısmında bu dosyanın Oluşturma, Değiştirilme ve Erişim tarihlerinin bilgisini görmekteyiz. Aşağıdaki resimde bu dosyanın tarih bilgilerinin 21 Mayıs 2013 şeklinde olduğunu görüyoruz.
ergenekon2 - Ergenekon Çıkmazı

Şimdi C# Programlama dili ile bu dosyanın tüm tarih bilgilerini, 12 Şubat 2013 şeklinde ayarlayacağım.
Visual Studio 2012’yi açıyorum ve aşağıdaki resimde gördüğünüz gibi kodları yazıyorum ergenekon3 - Ergenekon Çıkmazı
Programımı START edip, çalıştırıyorum. Ekrana “İşlem Başarılı” yazıyor.

ergenekon4 - Ergenekon Çıkmazı

Şimdi tekrar bakalım, dosyamızın tarih bilgileri değişmiş mi?
Word dosyasına tekrar sağ tıklıyoruz ve özellikler diyoruz.
ergenekon5 - Ergenekon Çıkmazı

Gördüğünüz gibi Word dosyamızın tarihini değiştirdim.
Bu okuduğunuz yazıda bir dosyanın tarih bilgisinin nasıl değiştirildiğini öğrendiniz.

Bunu kendi bilgisayarınızda denemeniz adına sizlere tekrardan bir yazılım yazıyorum.
Yazdığım yazılımda tarih/saat bilgilerini ve hangi dosyanın değiştirileceğini siz belirleyin.
İndirmek için : http://www.bilgihirsizligi.org/download/ErgenekonCikmaziApp.rar

Yazılımdan görüntü
ergenekon6 - Ergenekon Çıkmazı

bagis genel 150x150 - Ergenekon Çıkmazı

Enis Kurtay YILMAZ

Settings 1 1 - Visual Studio ile “Settings” Dosyası Kullanımı

Visual Studio ile “Settings” Dosyası Kullanımı

Merhaba dostlar.

Bugün sizlere Visual Studio ile “Settings” Dosyası Kullanımını göstereceğim.

*Not: Facebook üzerinden okuyanlar için: www.eniskurtayyilmaz.com/visual-studio-settings-kullanimi/

Settings”, adından da anlaşılacağı gibi ayarlarla ilgili bir fonksiyon. Bu makalede Settings dosyasını, yazdığımız herhangi bir programdaki ayarları tutmak veya bir takım verileri saklamak için kullanacağız. Bu dosya, ihtiyaç duyulan uygulama bilgilerini yada kullanıcı ayarlarını da temsil edebilir. Örneğin “Settings” ile bir kullanıcı ismini saklayabilirsiniz, bir ConnectionString saklayabilirsiniz veya başka bir türde veri saklayabilirsiniz.

Visual Studio’yu çalıştıralım. Yeni bir proje oluşturarak, C# dilinde bir Console Application tanımlayalım ve projemize isim verelim.Settings 1 - Visual Studio ile “Settings” Dosyası Kullanımı

Yeni proje açtıktan sonra, sağ tarafta bulunan Properties yazan yere çift tıklıyoruz.

Settings 2 - Visual Studio ile “Settings” Dosyası Kullanımı

Açılan yeni pencerede Settings alanını buluyoruz. Aşağıdaki resim gibi bir yazı göreceksiniz. Onun üzerine çift tıklıyoruz.

* Not : “Windows Application” uygulamasıyla başlattığınızda aşağıdaki resim gibi herhangi bir yazı gelmez. Settings 3 - Visual Studio ile “Settings” Dosyası Kullanımı

Evet karşımıza 4 adet alan geliyor. Bu alanlar hakkında açıklama yapalım.

  • İsim: Çalışma zamanında ilgili ayarın değerine erişmek için kullanılan addır.
  • Type: Ayarları temsil eden .Net Framework tipidir.
  • Scope: Çalışma zamanında ayarlara nasıl erişileceğini temsil eden özelliktir.
  • Value: Ayarlara erişildiğinde geriye döndürülecek olan degerdir.

Şimdi resimli örneklerde görülen şekilleri veya yazılan şeyleri sırasıyla yapalım.

  1. Name kısmında yazan “Setting” ifadesini, “Mesaj” olarak değiştiriyoruz
  2. Type kısmını “String” diye seçiyoruz
  3. Value kısmını “Mesaj” içerisindeki değer” diye değiştiriyoruz.

Settings 4 - Visual Studio ile “Settings” Dosyası Kullanımı

Settings 5 - Visual Studio ile “Settings” Dosyası Kullanımı

Settings 6 - Visual Studio ile “Settings” Dosyası Kullanımı

Evet. Sıra geldi şimdi bu yazdığımız “Mesaj” değerini, programda görüntülemeye. Açık olan “Program.cs” dosyamıza geliyoruz. Main kısmına hemen “Console.WriteLine” yazarak, “Properties.Settings.Default.Mesaj” parametresini çağırıyoruz. “Mesaj” değerimizi ve ardından “Console.ReadKey();” diye de yazdıktan sonra çalıştırıyoruz programımızı.

Settings 7 - Visual Studio ile “Settings” Dosyası Kullanımı
Settings 8 - Visual Studio ile “Settings” Dosyası Kullanımı

 

Evet dostlar, aslında Settings konusu bu kadar basit ve kullanımı kolay. Settings dosyası programın bulunduğu klasörde “config” olarak otomatik eklenir. İçinde değiştirmek istediğiniz değerler varsa veya görmek istiyorsanız, not defteri ile açıp uygulayabilirsiniz.

Settings 10 - Visual Studio ile “Settings” Dosyası Kullanımı

Eğer ConnectionString yazmak istiyorsanız, “Type” alanına girip, en altta bulunan “(ConnectionString)” kısmını seçmelisiniz ve ardından Value kısmında çıkan butona tıklamalısınız, sonra da gerekli ayarları tanımlamalısınız.

Settings 9 - Visual Studio ile “Settings” Dosyası Kullanımı

Bu yazıda “Visual Studio ile ‘Settings’ Dosyası Kullanımını” öğrendik. Başka bir makalede görüşmek üzere, sağlıcakla kalın.

bagis genel 150x150 - Visual Studio ile “Settings” Dosyası Kullanımı

Enis Kurtay YILMAZ

fs Programming 2018.xl  - PHP “mysql_fetch_array” Hatası ve Çözümü

PHP “mysql_fetch_array” Hatası ve Çözümü

Merhaba dostlar.

PHP dilini kullanan pek çok arkadaşımızın, günah keçisi olan “mysql_fetch_array” hatası hakkında konuşacağım.

Yazdığımız herhangi bir PHP kodunda aldığımız hata şu şekilde oluyor:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/siteadı/domains/siteadı com/[dosyaadi].php on line [satır sayısı]

Geçenlerde bir web sitesi işi aldım. İlgili sayın müşterim benden; eski web sitesinin verilerini, satın aldıkları yeni bir hostinge taşımamı istedi. Bende ilgili verileri yeni hostinge taşıdım. Gerekli MySQL ayarlarını yaptıktan sonra siteyi görüntüledim, çalışıyor mu diye bakmak istedim. Siteye girdiğimde yukarıdakine benzer bir hata aldım. Birtakım araştırmalardan sonra sunucuların sürümleri farklı olduğundan ve yeni sunucunun sürümü daha güncel olduğundan hata verdiğini öğrendim. Verdiği hata, “Veritabanı bağlantısının gerçekleşmediğinden(miş)”.

Önceden yazdığımız bir PHP dosyasına ihtiyaç duyduğumuzda(Config gibi), “Include” yöntemiyle yazdığımız koda dahil ediyoruz. Ben şöyle bir yöntem buldum. “Include” etmek yerine, doğrudan değeri tanımlayayım, daha kesin çözüm olur. Örnek verelim.

<?PHP

// Eklenenler

$host=”localhost”;
$user = “root”;
$pass = “”;
$db_name = “private_db”;

//YUKARI KISMINI EKLİYORUZ

mysql_connect (“$host”,”$user”,”$pass”);
mysql_select_db(“$db_name”);
mysql_query(“SET NAMES ‘latin5′”);
$oku=mysql_query(“select * from referans order by id”);
while ($row=mysql_fetch_array($oku))
{
echo “<p><img src=images/referans/k_resim/$row[3]></img></p>”;
}

?>

Yaptığım iş basit. Include etmek yerine, doğrudan tanımladım değişkenleri.
Başka bir makalede görüşmek üzere, sağlıcakla kalın.

bagis genel 150x150 - PHP “mysql_fetch_array” Hatası ve Çözümü

 

Enis Kurtay YILMAZ

fs Programming 2018.xl  - C# ile İnternet Kontrol - İnterneti Kontrol Etmek

C# ile İnternet Kontrol – İnterneti Kontrol Etmek

Merhaba dostlar.

Yaptığımız programlarda bazen internet bağlantısına ihtiyaç duymaktayız. Eğer işlemlerde internet fonksiyonlarını veya internet işlemlerine ihtiyaç duyuyorsak ve programın çalıştığı bilgisayarda internet yoksa program hata (Exception) oluşturuyor. Bu yüzden program duruyor, çalışmıyor. Şöyle bir senaryo düşünelim.

Senaryo: Yazdığımız program, sadece e-mail gönderme programıdır. Eğer internet varsa e-mailleri göndersin, yoksa bir işlem yapmasın.

bool InternetVarmi = false;
try
{
System.Net.Sockets.TcpClient kontrol_client = new System.Net.Sockets.TcpClient(“www.google.com”, 80);
kontrol_client.Close();
//Kod bu alana düşerse, internet var anlamına gelir
InternetVarmi = true;
}
catch(Exception hata)
{
//Kod bu alana düşerse, internet yoktur.
InternetVarmi =  false;
}

if(InternetVarmi == true)
{
//İnternet var, E-mail gönder
}
else
{
//İnternet yok, hiçbir şey yapma.
}

Evet arkadaşlar. Yukarıdaki kod Google adresine bağlanıyor. Eğer internet bağlantısı gerçekleşirse InternetVarmi adlı bool tipindeki değişkene true değerini atıyor. Bağlantı gerçekleşmez ise false değerini atıyor. “if” bloğu ile InternetVarmi değişkeninde true-false değerlerinden hangisi atanmış bakıyoruz. Eğer true ise e-mail gönder, false  ise hiçbir şey yapma.

Başka bir makalede görüşmek üzere, sağlıcakla kalın.

bagis genel 150x150 - C# ile İnternet Kontrol - İnterneti Kontrol Etmek

Enis Kurtay YILMAZ

fs Programming 2018.xl  - Java Girilen Sayı Tek mi Çift mi ve Ortalaması

Java Girilen Sayı Tek mi Çift mi ve Ortalaması

Merhaba dostlar.

Geçenlerde bir üniversite öğrencisi bana e-mail atmış, yardımımı rica etmiş. Bende hazır Java programlama diline yeni başladım, yardımcı olmak istedim. İstediği şey oldukça basitti.

Benden istediği şeyi senaryo olarak anlatayım, sizler tarafından daha kolay anlaşılır.
Senaryo: Kullanıcı kaç tane sayının tek veya çift olarak hesaplanacağının bilgisini giriyor (Örneğin 5 tane sayıyı hesaplamak istiyor). Kullanıcı, bu işleminden sonra ekrana 5 tane sayı giriyor (Örneğin 1-3-4-6-7 girmiş olsun). Girilen sayıların, toplamda kaç tanesinin tek veya çift sayı olduğunun ve bunların tek ve çift sayı ortalamasını hesaplayan bir program olsun.

Peki, bu senaryoya göre sonuç kaç çıkmalıdır?

Tek sayıların toplamı : 11 (1+3+7)
Çift sayıları toplamı : 10 (4+6)
Tek sayıların ortalaması : 3,66 (11 / 3)
Çift sayıların ortalaması : 5 (10 / 2) sonucu çıkmalıdır.

Senaryoyu kafamızda canlandırdığımıza göre, gelelim bu işin programlamadaki mantık kısmına.
Matematiksel olarak düşünürsek, matematikte bir sayı çift ise her zaman “2” sayısına tam bölünür ve kalan doğal olarak sıfır olur (Örneğin, 10 / “2” = 5 kalan 0). Tek sayılarda ise her zaman kalan sıfırdan farklı olur. Bir sayının kalanına da MOD denir. Biz de MOD yöntemini kullanacağız.

Aşağıdaki kodların yorum satırlarında açıklamaları göreceksiniz.

package javaapplication3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class JavaApplication3 {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader( System.in );
BufferedReader stdin = new BufferedReader(isr);
System.out.print(“Kaç sayı gireceksiniz: “);
//Aşağıdaki kodda kullanıcının kaç sayı gireceğini tespit ediyoruz
int dongu_sayisi = Integer.parseInt(stdin.readLine());
int tek_sayi_toplami = 0;
int girilen_tek_sayisi = 0;
int cift_sayi_toplami = 0;
int girilen_cift_sayisi = 0;
//Kaç tane sayı girecekse, o kadar defa döngü dönmesi gerekir.
//Örneğin 5 girildiyse, 5 defa kullanıcıdan sayı girmesini istemeliyiz.

for(int i=1; i<=dongu_sayisi; i++)
{
int sayi;
System.out.print(Integer.toString(i) + “. sayıyı giriniz: “);
String deger = stdin.readLine();
sayi = Integer.parseInt(deger);
//Girilen sayının tek mi çift mi olduğuna bakıyoruz.
//Sayı çift ise, 2’te tam bölünür ve kalanı olmaz. Kalanını “%” ifadesiyle buluyoruz.

if( sayi %2 == 0 )
{
cift_sayi_toplami += sayi;
girilen_cift_sayisi = girilen_cift_sayisi + 1;
}
else
{
tek_sayi_toplami += sayi;
girilen_tek_sayisi = girilen_tek_sayisi + 1;
}
}
if(girilen_tek_sayisi != 0)
System.out.println(“Girilen Tek sayiların ortalaması: ” + (tek_sayi_toplami / girilen_tek_sayisi));
else
System.out.println(“Hiç tek sayı girilmedi!”);
if(girilen_cift_sayisi !=0)
System.out.println(“Girilen Çift sayıların ortalaması: “+ (cift_sayi_toplami / girilen_cift_sayisi));
else
System.out.println(“Hiç çift sayı girilmedi!”);
}
}

 

Java Tek 1 - Java Girilen Sayı Tek mi Çift mi ve Ortalaması
Java Tek 2 - Java Girilen Sayı Tek mi Çift mi ve Ortalaması

Başka bir makalede görüşmek üzere, sağlıcakla kalın.

bagis genel 150x150 - Java Girilen Sayı Tek mi Çift mi ve Ortalaması

Enis Kurtay YILMAZ

 

tr_TRTurkish
en_USEnglish tr_TRTurkish