Wep Api ile RequestHeader okuma

Requestler header, method, content  vs birden çok bilgi içeriyorlar (Http Request).

Peki headerdaki bir değere, Web api metodunda nasıl kullanışlı bir biçimde erişebiliriz.

İlk akla gelen Request objesi üzerinden headers a ulaşmak , şöyle ki :

her erişmek istediğimizde bu kodu yazmak yerine ihtiyaç olan yerlere HttpParameterBinding kullanarak erişmek, parametre için type  (int, string vs) casting işlemlerini merkezi bir şekilde yönetmek için web api nin nimetlerinden yararlanırsak:

 

Parametrelerde binding yapabilmek için ParameterBindingAttribue kullanırız.

Bu attribute kullanırken constructor da belirtildiği gibi requestHeader da hangi isimde parametre geleceğini söylememiz gerekiyor.

Örnek :

Eğer sıkça kullanmamız gereken ya da string olarak header name belirttiğimiz için yanlış yazma durumu oluşmamasını istediğimizde ise FromHeaderAttribute’den miras alarak özelleşmiş tipleri yapabiliriz.

Örnek :

Yukardaki LanguageHeaderAttribute sınıfı “Language” isminde request header değeri arayacak ve onun ilk değerini (string listesi olarak geldiği için ilkini almıştık) metod parametrelerinden belirtilene binding yapacaktır.

Örnek :

Metod içerisinde lang değerinin headerdan okunup getirildiğini uygulamanızda görebilirsiniz.

 

 

Asp.Net 400 Hata Koduyla Json Mesaj Dönme

Aşağıdaki kod parçasını 400 (Bad Request) le beraber Json mesaj dönmek için kullanıyoruz.

 

Localhost için gayet güzel çalışırken Azure ya da sunucu üzerine deploy ettiğinizde sürekli “Bad Request” hatası alıp içeriğinde ise yazdığımız Json bilgisi olmayabilirBunun başlıca sebebi IIS in belirttiğiniz hata kodu (burdaki 400) için sizin response değerini eziyor olmasıdır.

Çözüm:

  1. Web.config içerisine aşağıdaki satırları eklemek
  2. Kod içerisinde Response.TrySkipIisCustomErrors = true; set etmek.

Daha fazlası için:

http://msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx

PyCharm ve Spark Geliştirme Ortamı

Çok uzun bir aradan sonra ilk yazımı yazıyorum. Bu arada birçok kez yazı yazmak istemiştim ama nasip olmadı.

Bilgiyi, yazı ile pekiştirin.

Düsturu ile umarım arkası gelir.

 

Yazıda big data nedir?, spark nedir? , hadoop nedir ? vs bahsetmeyeceğim. Bunlar zaten herkesin az çok bilgi sahibi olduğu benim ise çok az bilgi sahibi olduğum geliştirmeye çalıştığım alanlar. Bu konularla ilgili yeni şeyler öğrendikçe ve tecrübe ettikçe pekiştirmek ve paylaşmak adına buradan yazıyor olacağım..

Spark ile geliştirme yapmak için bir çok dil kullanılabiliyor. Bu dillerden biri de Python. Python geliştirme ortamı için de seçenekler oldukça fazla bunlardan benim tercih ettiğim ise PyCharm.

İlk Spark uygulamasını Windows ortamında geliştirmek için aşağıdaki adımları takip edebilirsiniz :

  1. Anaconda kurulumu
    • Anaconda, python derken kral kobra ! 
    • Anaconda, özellikle işi veri ile olanlar için matematik ve mühendislik ile ilgili gelişmiş paketler sunar. Daha detaylı bilgiye sayfasından ulaşabilirsiniz.
    • Installer’ı olduğu için detaylandırmaya gerek yok https://www.continuum.io/downloads adresinden indirip kurulum yapılabilir.
  2. Spark kurulumu 
    • Kurulum oldukça basit, sadece indirmek yeterli 🙂
    • http://spark.apache.org/downloads.html adresinden  (şu anki sürüm: 1.6.1 ) kurulum yapabilirsiniz. Benim seçimim aşağıdaki:
    • spark1
    • Windows üzerinde geliştirme yaptığımız için winutils e gerek olacaktır.
      • https://osdn.jp/projects/win-hadoop/downloads/62852/hadoop-winutils-2.6.0.zip/ adresinden indirdiğimiz zip i çıkaracağımız yer önemli. Çünkü spark shell başlağında buna ulaşıyor olması gerekiyor.
      • Spark için HADOOP_HOME adında sistem değişkeni eklememiz gerekiyor. Buraya da çıkartılan yeri göstereceğiz.spark2
      • Hazır yeri gelmişken JAVA_HOME u da eklerseniz daha güzel olur.
    • Aşağıda kaldığı için görünmüyor yukardaki ekran görüntüsünde fakat, sistem değişkenlerine ayrıca SPARK_HOME u da eklemeniz gerekecektir. Bu değişkenin değeri ise sizin Spark ın sayfasından indirdiğiniz arşivi çıkardığınız yer olmalıdır.
      spark3
    • Test edersek
      spark4
      INFO mesajlarını kapatmak istiyorsanız. Spark dizini altında conf klasöründe log4j için template görebilirsiniz. INFO mesajlarını göstermeyip sadece WARN mesajlarını göstermesini isteyebilirsiniz. Conf içerisinde daha bir çok ayarlamalar yapmanızı sağlayacak templateler bulunuyor ayrıca incelenmesi gerekir.
  3. PyCharm entegrasyonu
    spark5
    Settings ‘ e tıklanıp. Create Conda Environment seçilir.
    spark6 

    spark7spark8spark9Yukardaki işlemleri gerçekleştirdiğimizde ve PyCharm ile yeni bir python-spark projesi açtığımızda

    spark10
    spark11

    kodu derleyici için de anlamlı bir hal alacaktır.

  4. Test

    Dizinin elemanlarını toplayan yukarıdaki Python kodunu çalıştırdığımızda ekran görüntüsünün aşağıdaki gibi olduğunu görüyoruz.
    spark12

 

PyCharm ve Spark kullanarak artık geliştirme yapmaya hazırız!

Google PDF İndirme

Google Docs, Google’un epey çokca bulunan bulut hizmetlerinden sadece biri. Burda bildiğiniz üzere envai çeşit dökümanları düzenleme ve paylaşma imkanına sahibiz.

Paylaşım yaparken güvenlik de önemli bir etken tabiki. Eğer görüntüleme yetkisi vermediğimiz birisi bizim dökümana erişmeye çalışırsa aşağıdakine benzer bir ekran görecektir.

izin

Peki görüntüleme iznimiz varsa fakat indirme engellendiyse.

izin3

İşte bu durumda ilgili dökümanı görüntüleme izni olan biri açtığında NŞA’da indirme yapamayacaktır.

Bu kadar Google Docs eğitiminden sonra olayımıza dönersek  😉

Bu PDF bana lazım! Nasıl indireceğim ?  sorularının cevabına gelelim.

1- Olay Yeri İnceleme

  • Bu PDF browserda nasıl görüntüleniyor ki acaba?
    • Indirme linkini Google belki sayfada unutmuştur  ordan bulur bir şeyler serviste de kontrol yoksa indiririz 😛
    • Muhtemelen JavaScript’ler akıyordur  :mrgreen:  (Ya obfuscated ise ? )
    • Resim olabilir.
    • vs

Tüm bu akıldakı sorulara yardım yine geliştiri araçlarından geliyor.

Sayfayı aşağıya doğru scroll ettikçe belgenin yüklendiğini görüyoruz.  Ayrıca JavaScriptlerin içerisinden çıkmak oldukça zor o yüzden fazla kasmadan “Networks” tabına geçiş yaparak bu scroll edince acaba ne oluyor ki diye bakıyoruz.

izin4

O da ne 🙄 ?

İncelemeye devam…

izin5

 

Anlaşıldığı üzere bayağı GET request ile ilgili sayfamızın resmini Google abi bize dönüyor 🙂

 

Bu request URLsi ise : https://drive.google.com/viewerng/img?id=ACFrOgDZ24CTOuTnAmnLTf-P_pQhCycVfMBU-_yS-pM5hEMa2mnOmHJcM3os-dRJiP5tyVLAiDgFwsG4sqeyMhQ-N0n9GzKV9Rl2oLMz0Sty8kYlyK9Eag4C2lYwOg0=&u=0&w=800&webp=true&page=10

bayağı karmaşık Id değerleri vs olsa da page ile oynayınca o sayfanın geldiğini görüyoruz  :mrgreen:  O kadar Id koymuşsun page’i de Hash yapsana ! (iyi ki yapmamış 🙂 )

2- Kodlama

Birden çok yöntem olabileceği gibi basitçe HttpWebRequest sınıfını kullanarak sayfaya talepte bulunup gelen stream veriyi de Image sınıfı aracılığıyla kayıt edelim. 

Request URL’si karmaşık Id değerleri ile geçici olarak oluşturulduğu için uygulama içerisinden o sayfaya önce giriş yapmanız gerekebilir. Giriş yaptıktan sonra ilk aşamadaki yöntemle tekrar url’inizi öğrenebilirsiniz. Eğer giriş yapmadan .Net uygulama içerisinde istekte bulunmak istiyorsanız Internet Explorer ile PDF ‘in olduğu sayfada request url‘ini öğrenmeniz yeterlidir.

PDF’in 59 sayfa oldugunu varsayalım. Buna göre aşağıdakine benzer basit bir kod ile sayfaları indirelebiliriz.

Örnek çıktı:

izin6

Artık elinizde istediğiniz PDF’in resim hali mevcut, yazı halini ister OCR araçları isterseniz de HAP(Html Agility Pack) ile elde edebilirsiniz.

Resimlerden PDF oluşturmak için de kod yazabilir ya da online siteleri (bkz: https://online2pdf.com/convert-images-to-pdf) kullabilirsiniz.

Visual Studio ile Python

Python programlamak isteyen Visual Studio severler için geliştirilmiş bir eklenti mevcut.

Bu eklenti, Python‘un kendi wiki sitesinde de gösterildiği üzere “Python Tools for Visual Studio“.

Notepad++ ile de bir yere kadar diyenler için güzel bir eklenti olduğunu düşünüyorum. Visual Studio ortamından çıkmadan da geliştirme yapmaya olanak sağlayacaktır.

Gelişmiş kod tamamlama yetenekleriyle:

print

Genelde aşağıdakine benzer açıklamalara alışkın olunsa da yukarıdaki de gayet doyurucu olmuş 😀

consoleWrite

 

Python kurulumunda PATH’e ekleme işlemi yapıldıysa aşağıdaki gibi bir panel görülecektir.

refreshDb

Refresh işlemi yapıldıktan sonra her türlü özellikleri ile kullanılabilir halde olacaktır.

Bu eklentide gelen proje tipleri ise şu şekilde:

pythonProjects

Açıkcası yukardaki proje tiplerinin çoğunu gözüm ısırıyor desem yalan olur deneye deneye bakacağız 🙂

Sadece IronPython’un Python + .Net araçlarını kullanabildiğini hatırlıyorum (ki zaten fotodan da anlaşılacağı üzere WPF vs ve Python nasıl mümkün olsun?)

Hello World!

Projeler içerisinden Python Application’ u seçtiğinizde sizin için konsol uygulamasını oluşturacaktır. Burada Python ile ilgili denemelerinizi rahatlıkla yapabilirsiniz.

firstCode

Türkçe karakter problemi olduğunda (örn: <unicode error> ‘utf-8’ codec can’t decode … ile devam eden hata):

En üst satıra aşağıdaki yorum satırı eklenmesi çözüm olacaktır. (Windows için)

 

 

Maven kurulumu ve Eclipse

Maven aracını, Visual Studio’nun Nuget Packet Manager i olarak tanımlayabiliriz. Bu sayede ihtiyaç duyulan kütüphaneler, eklentiler vs galerisinden indirilerek otomatik buil edilerek projenizde kullanılır hale getirilmektedir.

Maven’i şurdan(tıklayın) indirip dilediğiniz bir yere kurulum yapabilirsiniz. Kurulum denince öyle setup felan değil size verdiği sıkıştırılmış dosyayı çıkarın o kadar 🙂

Windows için;

“Denetim Masası\Sistem ve Güvenlik\Sistem” altında “Gelişmiş sistem ayarları -> Gelişmiş tabı -> Ortam Değişkenleri…” ne tıklayarak “PATH” için kurulum yaptığınız yeri eklemek gerekebilir. Bunu eklediğimizde hali hazırda komut satırından Maven’in kurulu olduğu dizine gitmeye gerek kalmamaktadır. Ayrıca Maven’in sorunsuz çalışabilmesi için “JAVA_HOME” ortam değişkeni(“C:\Program Files\Java\jdk1.7.0_17”) de tanımlı olursa ne âlâ.

Artık konsoldan maven çalıştırılabilir olacaktır.

Aşağıdakine benzer bir sonuç veriyor olması gerek.

HDbCM50

Maven ile eclipse’de örnek bir proje açacak olursak (Eclipse Luna Service Release 1 ile):

New ->  Other -> Maven klasörü altından Maven Project ya da New-> Maven Project  seçilerek devam edilir.

mvn1

Bir sonraki ekranda archetype adı verilen proje şekilleri var.  Burda “quickstart” olanı seçerek ilerleyebiliriz. Burdaki archetype mantığı önceden belirli tipte projeler için belirli bağımlılıklar, eklentiler vs projede hazır olarak gelmesini sağlayıp işleri kolaylaştırır.

 

mvn2

Sıra artık son aşamada burda da yapacağımız işin adını koyup finish diyoruz.

mvn3

Maven bizim için örnek bir hello world oluşturdu ve aşağıdaki şekilde yapıya sahip oldu.

mvn4

Burda dikkat çeken şeyler;

  1. Unit test için de bir şeyler oluşturması iyi mi kötü mü?
  2. Maven dependencies diye bir şey var o da ne ki?
  3. pom.xml neyin nesi?

Bunları sırayla açıklıycak olursak;

  1. Unit test için bir TestSuite oluşturuldu. Kullanan için iyi bir durum tabiki 😉 
  2. Maven dependencies, proje için gerekli kütüphaneler nelerdir, bunlar nerden alınmış vs gibi bilgileri tutar.
  3. pom xml; maven dependencies, plugin vs için konfigürasyon bilgilerini tutar

Örnek bir bağımlılık eklemek için;

mvn5

Mysql JDBC Connector’ü ekleyecek olursak (burdan) öğrenilen değerleri giriyoruz. Aslında girmeden search ederek de yapması gerek ama bende çalışmadı 🙂

mvn6

 

OK diyip pencereyi kapatıyoruz ve büyük ihtimal build automatically seçili olduğu için fazla sürmeden Maven dependencies altına eklendiğini göreceksiniz.

mvn7

 

Bunları sadece Maven’in yaptıklarının birkaçı olarak adlandırabiliriz. Daha fazla inceleme yapılabilir.

 Dip Not: Maven build edememesi durumunda  Eclipse’te “Windows -> Preferences -> Maven -> Installations” altına Maven’i kurduğunuz dizini ekleyip deneyebilirsiniz.

C# ve Native

Native uygulamalar,  makine koduna dönüştürülmüş kodları içermektedir. Örneğin C/C++ ile geliştirilmiş bir programlar nativedir.

.Net tarafında native olarak yazılmış kütüphaneleri kullanabilmek için Windows’un apilerinden yararlanılmaktadır. Native metodların .net tarafında kullanmak için farklı yöntemler mevcut fakat burda anlatılacak olan sarmalama (wrapping) ile kullanımına dairdir.

Örnek olarak aşağıda C ile yazılmış toplama işlemi yapan bir kütüphanenin(.lib) C# tarafından kullanılmasına bakarsak;

Öncelikle kütüphaneyi oluşturuyoruz.

native1

Static library’i seçiyoruz. Burda Shared Library ya da Dynamic Link Library seçerseniz DLL üretebilirsiniz fakat anlatacığım yöntemde biz sarmalama (wrapping) yapacağımız için .lib seçiyoruz.

native2

Proje ismini ve diğer detayları belirliyoruz.

 native3

Yukardaki kod otomatik oluşturulmakta. Mâşallah bunu yazan arkadaş da çok dertliymiş 🙂

Süper metodumuzu zaten kendileri bizim için yazmış “SampleAddInt” adında. Geriye kalan metod ve yorum satırlarını temizliyoruz. Sarmala yapacağımız projede kullanılacak metodların bildirimlerini eklenen header (.h) dosyasında yapıyoruz.

ToplamaLib.h :

__cplusplus ve extern “C” ile link(bağlama) işlemini yapan C++ derleyicisine işlemini C’e göre yapmasını söylüyoruz. Çünkü metod C ile kodlandı.

TOPLAMALIB_H_INCLUDED kullanarak metod prototipin bir kere yazıldıktan sonra bir daha geçmemesi için kullanılıyor. Amacı başka bir yerden çağrıldıysa header dosyası derleme zamanı hata almamak için eklenir burda eklemesek de olur çünkü sadece tek bir .c dosyasında kullanılacak.

ToplamaLib.c :

#include ile başlık/header (.h) dosyasının dahil edilmesini sağlıyoruz ve SampleAddInt metodu tanımlaması yapılıyor.

Projeyi derliyoruz ve derlemenin sonuçlandırıldığı dizinde aşağıdakine benzer bir görünüm elde ediyoruz.

native7

“libToplamaLib.a” dosyasını “libToplamaLib.lib” olarak yeniden adlandırıyoruz. Çünkü Visual Studio .lib dosyası beklemektedir(Windows olduğu için). Derleyici lib dosyasını .a ile oluşturmuş olmasına rağmen .lib ile aynı özelliklere sahip olmakta. Bu uzantıda oluşmasının nedeni Code Blocks varsayılan derleyicisi GCC olduğu için .a olarak oluşturuyor.

Visual studio ile Class Library projesi oluşturuyoruz. Bu proje ile .lib uzantılı kütühanenin metodlarını çağırabilecek ve sarmalama yapabileceğiz.

native4

Projeye sağ tıklayarak “Properties” penceresine ulaşabilirsiniz. Burda aşağıdaki ayarları yaparak “ToplamaLib.h” dosyasını dahil edebilmeyi sağlıyoruz.

native5

 native6

Yukardaki işlemleri yaptıktan sonra #include önişlemci komutu kullanarak artık “ToplamaLib.h” header dosyasını dahil edebiliriz. (Yukardakileri yapmadan da tam yolu vererek yapılabilirdi)

native8

Projenin link aşamasında C ile yazılmış Static Library ‘i yani .lib dosyasını kullanabilmesi için aşağıdaki adımlar takip ediyoruz.

native11

native12

.lib dosyasının tam yolunu veriyoruz.

 

Wrapper’ın header dosyasında Sınıf adını yazıp, metodların bildirimlerini yapıyoruz.

Aşağıda Sınıf adı “Function” ve int dönen, 2 tane int parametre alan “AddInt” metodu bildirimi yapılmış.

native9

Bildirimi yapılan metodu “ToplamaLibWrapper.cpp” dosyasında C++ kodu ile tanımlamasını yapıyoruz. Bu tanımlamada C ile yazılan kütüphane fonksiyonun çağrıldığına dikkat edilmesi gerek. Bu sayede wrapping (sarmalama) işlemi gerçekleştiriliyor.

native10

Projeyi derliyoruz ve derlenen çıktının olduğu yerde .DLL oluşmuş olduğunu görmemiz gerekiyor.

native13

Artık bu DLL’i .Net uygulamalarına referans olarak ekleyerek kullanabiliriz.

Örnek olması maksadıyla bir Windows Form projesi açıyor ve düzenliyoruz.

native14

Üstün tasarım yetenekleriyle aşağıdakine benzer bir tasarım yapabilirsiniz  😀

native15

Kütüphaneyi kullanabilmek için projeye sağ tıklayıp “Add Reference” seçeneğiyle açılan pencereden oluşturduğumuz sarmalayıcı DLL’i ekliyoruz.

native16

DLL’i ekledikten sonra Topla butonuna DLL’deki metodu çağıracak kodu ekliyor ve uygulamayı test ediyoruz.

native17

 

Eğer “BadImageFormatException” , “…dosyasını veya derlemesini ya da bağımlılıklarından birini yükleyemedi. Geçersiz biçimdeki bir program yüklenmek istendi.” gibi aşağıdaki hatanın alınması durumunda (x64 sistemlere alınması daha muhtemel):

native18

Proje özelliklerine sağ tıklayarak Build sekmesi altından Target Platform x86 olarak değiştirildiğinde sorun olmamaktadır.

native19

UI projesinde platform değiştilmek istenmiyorsa Wrapper projesinde ayarlama yapılması gerekir.

 

Karma mod çalışma hatası çözümü

Başka DLL’ler kullanan bir proje derlenip çalıştırıldığında;

Mixed mode assembly is built against version ‘v2.0.50727’ of the runtime and cannot be loaded in  … 

ya da

Karma mod derleme çalışma zamanının ‘v2.0.50727’ sürümü için oluşturuldu ve ek yapılandırma bilgileri olmadan 4.0 çalışma zamanına yüklenemez.

hatası alındığında yapılması gereken yeni bir app.config dosyası eklemek. Bu dosyanın içeriği şuna benzer olmalı :