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.

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.

 

KnockoutJS Nedir?

KnockoutJSSteven Sanderson  tarafından geliştirilmiş bir JavaScript kütüphanesidir. Bu kütüphane ile kullanıcı etkileşimini artırmak amaçlanmıştır. Knockout Modelleri kullanılarak oluşturulan Dinamik (özellikleri değişebilen) elemanlar gelişmiş bir etkileşim desteği sunuyorlar. Kütüphane MVVM kalıbını(pattern) uygulamaktadır.

MVVM(Model View ViewModel):

MVVM, Model, View ve ViewModel adında 3 yapıdan oluşmaktadır.  Amaçları arasında arayüz yapan kişinin arka tarafta nasıl bir iş geliştirildiğini bilmeden işini yapabiliyor olması, daha çabuk genişlemeye müsait bir yapıyı ortaya çıkarması sayılabilir. Model, verileri temsil etmektedir. View kullanıcıya sunulan görüntü, ViewModel ise asıl işin geliştirildiği yapıdır. View’ın Model i bilmesine gerek yoktur. ViewModel aracılık yapmaktadır.

knockoutjs.com adresinden .js dosyasını indirebileceğiniz gibi cdn’leri de kullanabilirsiniz. Enson sürüm olan knockout-3.0.0.js ‘i Asp.net MVC projesinde kullanımını bakacak olursak.

Öncelikle boş bir MVC projesi açıyoruz. 

 

Daha sonra “KnockoutJSController” adında bir controller ekliyoruz ve Index view’ini oluşturuyoruz. “RouteConfig”  sınıfından Default olarak tanımladığımız “KnockoutJSController” controllerini ve “Index” view adını veriyoruz ki controller adı ve view adı verilmezse buralara yönlendirsin.

Projede knockout.js kullanabilmek için doğrudan indirilen dosya kullanılabileceği gibi “Nuget Package Manger” sayesinde de projeye eklenebilmektedir. “Install-Package knockoutjs” komutu ile projeye KnockoutJS i ekliyoruz.

 

Boş proje açtığımız için bundles ile ilgili bir ayar sınıfı gelmemiş fakat istenirse ayrıyeten de yazılabilir. Knockoutjs, <script> etiketleri kullanılarak da eklenebilir.

 Örnek ViewModel:

Örnek ViewModel yukardaki gibi tanımlanıp “ornek1Model.js” adında oluşturuldu.  Bu bildiğimiz JavaScript fonksiyonu şeklindedir.

Bunu View’e aşağıdaki şekilde eklersek.

Yukarıda görüldüğü üzere KnockoutJS ve ViewModel scriptleri harici olarak dahil edilmektedir. “<span>” elemanlarında ise “data-bind=” ve bunun eşitliğindeki “text:”  dikkati çekmektedir. Bunlar knockout ‘un yönettiği parametler olarak karşımıza çıkıyor. Yani “data-bind” gördüğü zaman o elemanı viewmodel ile ilişkilendirmesi gerektiğini anlıyor. Eşitliğinde bulunan özellikleri ViewModel’a uygun şekilde isteneni gerçekleştiriyor.

Kısaca yukarda “text:isim” ile “data-bind” niteliği verilmiş elemanın “text” özelliğini ViewModel’de bulunan “isim” değişkeniyle oluşturmasını istiyoruz. Bunun sonucunda da aşağıdaki görüntüyü elde ederiz. 

İsim ve soyisim değerini “input” elemanında göstermek istersek de “text” yerine “value” kullanılır.

Eğer değişkenleri “Observable” olarak tanımlarsak knockout bizim için bu değişkenleri izler ve değişiklik olduğunda aynen yansıtır. Bunu aşağıdaki örnekte görebiliriz.

ViewModel’i şu şekilde güncellersek:

View’ı da şu şekilde güncellersek:

Farklılık olarak “valueUpdate: ‘afterkeydown’ “ ve “computed” göze çarpanlar olarak karşımıza çıkıyor. “valueUpdate: ‘afterkeydown’” bizlere adında da anlaşılacağı üzere tuşa basıldıktan sonra ViewModel’a git ve ilgili değişkeni yeni değeriyle güncelle demektedir. Bu sayede aynı anda diğer ilişkili yerler de güncelleme gerçekleştirilecektir.

“computed” bir fonksiyon olarak karşımıza çıkmaktadır. Bu sayede ViewModel’da bulunan değişkenlerle ilgili işlemler gerçekleştirebiliriz. Üretilen bir değer olduğu için kullandığı değerler değiştiğinde otomatik olarak ilgili yeri güncellemektedir.

 

Uygulama görüntüsü: 

Görüldüğü gibi aynı anda güncelleme gerçekleştirilebilmektedir. 

Proje Dosyası: KnockoutJS-OrnekProje.rar (1,29 mb)

HashSet<T> Koleksiyonu

Bu yapı System.Collection.Generic isim alanı içerinde bulunan List<T> ‘e alternatif olabilecek bir koleksiyon özelliği taşımaktadır.

HashSet verilere erişimde oldukca hızlı olmakla beraber List<T> den farklı olarak aynı veriyi bir dahaki sefere koleksiyon içine koymama özelliğine sahip bir koleksiyon olarak geliştirilmiş.

Örneğin basit bir ekleme işlemi yapacak olursak;

 

 

Her iki mesajda da “3” gösterilecektir.
Başka bir fark olarak Add metodu bool türünden veri döndürüyor.
HashSet ile ilgili başka bir örnek;

Burda ise string dizisiyle kurulan HashSet in aynı elemanları eklemeyip sadece “Kitap,Kalem,Araba,Kitaplık” mesaj olarak gösterilecektir.

Kök Hesaplayan Program

Klasik Math.Sqrt fonksiyonuyla değil de kendi yöntemlerimizle kök içini verecek şekilde örneğin 2√2 gibi gösteren bir program geliştiriyor olacağız. Bunun için aşağıdakine benzer bir tasarım kullanacağım

Burda 45 için yapılmış bir örnek mevcut zaten.

 

 

 

 

Peki nasıl kodlarız ?

Kopyala – Yapıştır Yardımcısı / Copy – Paste Manager

Bir metnin hepsini değil de orasından burasından önemli kısımları kopyalayıp bunları bir not defterinde toparladığım çok olmuştur ya da el alışkanlığıyla bir önceki kopyaladığımız yazıların gittiği olmuştur. Ben de kendim için bir program geliştirdim.

Ekran Görüntüsü : 

Böyle bir monitör ekrana sahip program. Birçok win32 apileri kullanıyor

 ctrl + num0 ile 0. kolon a yani en sol üsttekinin indeksi 0 olmakta oraya o yazıyı alıyor benzer şekilde ctrl + num1 gibi de diğerlerini yerleştiriyor program daha geliştirilebilir beni şuan idare ediyor.

ayrıca kopyalayınca sol altta şuna benzer bir pencere çıkıyor 

Yapıştırmak için ctrl + shift + num0 gibi çok denesem de olmadı 🙂 onun yerine ctrl + shift + ” -> 0 için 

1 için ctrl + shift + 1 kısayolları kullanılıyor.

İndirmek için Tıklayın.

Proje için admin@saidaydogan.com