28 Ekim 2019 Pazartesi

Masraf Takibi - Gider Yönetimi Android Uygulaması

Merhabalar. Masraf Takibi & Gider Yönetimi uygulaması yayınlandı!
Google Play Store'da şuradan indirebilirsiniz!

https://play.google.com/store/apps/details?id=com.pmobile.expense
Ölçemezseniz, yönetemezsiniz!

Aylık gider kalemlerinizin takibini yapın, hesabınızı bilin!

Alışveriş fişlerinizi çöpe atmadan önce uygulamaya okutun, kategorik olarak masraf takibinizi uygulama yapsın.




Kullanım kılavuzu:

1. Alışveriş fişlerinizi veya faturalarınızı uygulamaya toplam tutarını okutun. Böylece masraf geçmişi veritabanınızı oluşturun.

2. Daha sonra soldaki menüden Rapor tuşu ile rapor ekranına gelerek günlük, haftalık, aylık veya tüm zamanlara ait masraf detaylarınızı görüntüleyin.

Dilediğiniz yeni masraf kategorileri tanımlayabilirsiniz.

Ayrıca, farklı hesapların takibini yapmak için yeni hesap ekleyebilirsiniz.

Apartman gider takibi, dernek gider takibi, site gider takibi, basit muhasebe işleri için de kullanılabilir.

OCR teknolojisini günlük ihtiyaçlara yönelik olarak kullanın.

DEMO VIDEO

21 Ağustos 2019 Çarşamba

Barkodlu Kütüphanem - Kişisel Kütüphane Yönetim Aracı - Android


https://play.google.com/store/apps/details?id=com.pmobile.kitapligim 

Arkadaşlarına ödünç verdiğin kitapları unutmaktan bıktın mı?

Hangi kitabı ve hangi arkadaşından ödünç aldığını hatırlayamıyor musun?

Ya da sadece evinizde düzenli, yönetilebilir ve sürdürülebilir bir kitaplık mı istiyorsunuz?

Bu uygulama tüm kitap yönetimi sorunlarını çözecek!

Kendi kütüphanenizi yönetin! Ödünç alınan ve ödünç verilen kitapları takip edin!

Kitapçı veya kitap satıcı mısın? Taranan kitapların fiyatını görüntülemek için bir qr code (karekod) ve barkod sistemi olarak bu uygulamayı kullanabilirsin!

Nasıl kullanılır?

Bir kitabın barkodunu tarayın, yani ISBN (uluslararası seri barkod numarası) ve aşağıdaki gibi kitap ayrıntılarını kaydedin:
* İsim
* Yazar
* Yayımcı
* Yayın Yılı
* Fiyat
* Not
* Ödünç Alındı
* Ödünç Alınan Tarih
* Ödünç Alınan Kişi
* Ödünç Verildi
* Ödünç Verme Tarihi
* Ödünç Verilen Kişi

Ardından, kitabın barkodunu tarayın.
Daha önce kaydettiğiniz tüm kitap bilgileri açılır!

Güncelleme sayfasında ödünç alınan veya ödünç verilen kitap olarak ayarlayabilirsiniz. Ardından, bu Android uygulamasında ödünç alınmış ve ödünç verilmiş kitaplara farklı özel sayfalarda göz atabilirsiniz.

İsterseniz size özel açılış fotoğrafını kişisel fotoğraflarınızla ayarlar sayfasında kişiselleştirebilirsiniz.

Verilerinizin güvenliği için, yedekleme uygulaması bu uygulamada mevcuttur.

Tüm veritabanınızı bir excel XLS dosyasına kaydederek dışa aktarabilirsiniz.
Ardından, XLS dosyasını içe aktarabilir ve bu şekilde daha önce yedeklediğiniz verileri kurtarabilirsiniz.

7 Ağustos 2019 Çarşamba

Yazılım Performans İyileştirmesi İçin 5 İpucu

Merhabalar. Üzerinde çalıştığımız projede performans iyileştirmesi ihtiyacı doğdu. Bu vesileyle birçok performans iyileştirmesi yöntemini kullanma fırsatı bulduk. Bu yazımda bu yöntemlerden bahsedeceğim.


Performansını arttırmak istediğiniz yazılımın niteliği, uygulayabileceğiniz yöntemleri de etkileyebilmektedir. Öneğin, bir web uygulamasını, çalışan sunucu sayısını arttırıp yük dengelemesi (load balance) yöntemiyle optimize edebilirsiniz. Fakat, bir masaüstü uygulamasında tek bir makineyle sınırlısınızdır. Aynı şekilde, masaüstü uygulamalarında tüm hafızayı tek bir kullanıcıya tahsis edilmiş gibi geliştirme yapabilirken, web uygulamarında aynı anda birden fazla kullanıcının isteklerine cevap bekleyeceğini göz önüne alarak hafızayı tutumlu kullanmanız gerekmektedir. İşler mobil uygulamaya geldiğinde ise, uygulamanın yiyeceği internet miktarı, kısıtlı fiziksel hafıza, güvenlik gibi bambaşka parametreleri göz önüne almalısınız. 

Burada listelenecek ipuçlarının, bu parametrelerin akılda tutularak değerlendirilmesini tavsiye ederim.
 
  1. Doğru Thread Yönetimi

    Yeni thread başlattığınız noktaları mercek altına alın. Bu alanlar O(n) bir algoritma içinde mi başlatılıyor? Yani başlatılan yeni thread sayısı n ile doğru orantılıysa, küçük sayılarda mesele olmaz iken, n sayısı arttıkça, thread içinde yapılan iş çok küçük bir iş olmasına rağmen, aşırı thread başlatılmasından dolayı işlemcinin kitlenmesine sebep olabilmektedir. 100 bin threadin bir anda başlatıldığını bir hayal edin... Böyle bir durum söz konusuysa algoritmayı her n için 1 adet thread oluşturacak şekilde güncellemeye çalışın.
  2. Veritabanı Katmanı İyileştirmesi

    İşlemci, veri kendisine ne kadar yakınsa bir işi o kadar hızlı bitirecektir. Sırasıyla önbellek, RAM, ve harici disk olmak üzere veri gittikçe işlemciden uzaklaşmaktadır. Bu nedenle performans iyileştirmesi istiyorsak verileri olabildiğince işlemciye yaklaştırmalıyız. Veritabanı işlemleri de bu bakımdan mercek altına alınması gereken yerlerin başında geliyor. Hibernate dünyasında second level cache (örn Ehcache) , daha genelde ise in memory database cache ürünleri (örn. Redis) kullanarak veriler işlemciye bir katman daha yaklaştırılabilir. Hatta uygulamanıza biraz uzaktan bakıp bir veritabanına ihtiyaç duyup duymadığını da sorgulayabilirsiniz. Aynı işlevi in-memory veri yapıları kullanarak gerçekleştirebilecekseniz komple veritabanı katmanını aradan çıkarmak büyük avantaj sağlayacaktır.
  3. Masraflı Hesaplama İşlerini Tekrarlamaktan Sakınma 

    Kodunuzun zaman yiyen hesaplama kod parçacıklarını belirleyin. Örneğin, ağır grafiksel işlemler, dosyadan veri okuma, ağır matematiksel hesaplamalar vb. Bu hesaplamaların sonucunu in-memory şekilde bir yerlerde örneğin sınıfın global bir alan değişkeninde, singleton bir cache sınıfında vb tutun. Hesaplamaların sonucu değişmediği sürece bu hesaplanmış bulunan sonucu hesaplama koduna hiç bulaşmadan dönün. Hesaplamaların sonucunun değişeceğini bildiren bir olay gerçekleştiğinde bu cache'deki değeri geçersiz kılın ve bu değer bir sonraki istendiği vakit tekrar hesaplama kodlarının çalışmasını sağlayın.

  4. Doğru Veri Yapılarını Kullanma 

    Kullandığınız dilin veri yapılarını arka planda nasıl çalıştığını akılda tutarak kullanın. Örneğin bir LinkedList üzerinde for ile gezerken her seferinde get(index) metoduyla veriyi çağırırsanız, her item getirme O(n) maliyetinde olacaktır. Çünkü LinkedList üzerinde n. item'a kadar tek tek gezmesi gerekecektir. Başka bir örnek de, bir hesaplama sonucu itemlerı bir koleksiyonda toplayıp sonra bu koleksiyon üzerinde dolaşılacaksa, koleksiyonda itemların tekrarlanmasını engellemek, en fazla bir kez yer almasını sağlamak için Set türünden bir koleksiyon kullanılması faydalı olacaktır.

  5. Masraflı İşleri Başka Thread'lere Atama

    Buna tembel hesaplama yöntemi diyebiliriz. Program akışımızda bizi yavaşlatan bir işlem var ise, bu işlem olabildiğince akış threadinden kaldırılıp başka threadlerin sorunu haline getirilmelidir. Örneğin, bir veri yapısından bir itemın silinmesi işlemi pahalı ise, item'ı "silindi" şeklinde işaretleyip yola devam etmeli, başka bir threadin de asenkron olarak "silindi" işaretli itemları gerçekten veri yapısından silmesi sağlanmalıdır.

    Sizlerin de performans iyileştirmesi için kullandığınız yöntemler var ise yorum olarak eklerseniz çok sevinirim.

5 Ağustos 2019 Pazartesi

Karekodlu Müşteri Takip Programı Uygulaması Yayınlandı

https://play.google.com/store/apps/details?id=com.pmobile.musteritakip


Müşterileriniz için qr kod veya barkodlarını kaydedin ve tarayın.
Tüm müşterilerinizi cep telefonunuzdan yönetin.
İhtiyacınız olan tüm müşteri bilgilerini (ad soyad, telefon, adres, ücret, serbest not alanı) kaydedin.
Veritabanınızı XLS excel dosyalarına dışa / dışa aktarın. Bu sayede yedekleme yapın!

Eğer bir barkod veya karekod etiket yazıcınız var ise bu uygulamayı seveceksiniz.
Müşterileriniz için etiket yazıcınız aracılığıyla birer barkod veya karekod etiket yazdırın.
Tüm müşterilerinizin verilerini cebinizden yönetin.

Mobil Android müşteri takip uygulamasını Google Play Store'dan indirebilirsiniz.

4 Aralık 2018 Salı

Komut Satırından Google'lamak



googler isimli komut satırı aracı ile terminalden google aramaları yapabilir, sonuçlar üzerinde dolaşabilirsiniz. Ubuntu makinenize kurmak için github'daki kodunu klonlamak ve

sudo make install 

komutunu çalıştırmanız yeterli.

Kurulumu oldukça basit olan aracın bir çok parametre seçeneği bulunuyor. Dokümanda bahsedilen özelliklerden bazıları:
  • Google Arama
  • Google anahtar kelime tabanlı site içi araması
  • Google Haberler içinde arama
  • Sonuçları reklamsız dönme
  • Sonuç sayfalarını tarayıcıda açma, tekli veya toplu olarak 
  • Sonuç sayfaları arasında dolaşma
  • Otomatik yazım düzeltmeyi devre dışı bırakma ve tam olarak anahtar kelimeleri arama
  • Google anahtar kelimelerini kullanma (ör. filetype: mime, site:somesite.com) desteği
  • İlk sonucu doğrudan tarayıcıda açma (şanslı hissediyorum özelliği)
  • Kullanışlı kullanım örnekleri ile kapsamlı dokümantasyon
  • Minimum bağımlılık

Geliştiricisi ayrıca eğlenceli örnekler de paylaşmış. Örneğin, yazılım hatalarını terminalden StackOverflow üzerinde aratan komut geliştirmiş.

Ayrıca, geliştiricilere ufak birkaç ipucu. --json parametresiyle sonuçlar JSON formatında alınabiliyor. googler, sonuçları Google API'leri kullanmadan, standart HTML çıktıyı parse ederek üretiyor. Bu nedenle, API token sahibi olmaya gerek kalmadan belli sayıda istek sınırına takılmadan kullanılabiliyor. Gerisi hayal gücüne kalmış.

Site içi arama örneği:

googler -w n11.com raspberry pi



PDF türünde kitap arama örneği:








27 Haziran 2018 Çarşamba

SSHJ ile Raspberry'de Uzaktan Python Çalıştırmak

Merhabalar, Bu yazımızda, Java ile uzaktaki bir makineye programatik olarak SSH ile bağlanıp Python kod çalıştırmayı göreceğiz. Örnek olarak Raspberry 3 makinesi kullanacağız.
SSH işlemleri için SSHJ kütüphanesini kullanacağız. Bu kütüphane ile lokal makinenizde bulunan önceden bağlandığınız makinelerin ssh keylerini kullanarak bağlantı kurulabildiği gibi, kullanıcı adı - şifre bilgilerini kullanarak da bağlantı kurulabilmektedir. Kullanıcı adı - şifre yöntemini kullanarak bağlantı kuracağız.

Öncelikle basit bir komut çalıştırıp çıktısını konsola basalım.
Kısaca örnek kodumuzu anlatalım. IP, port, kullanıcı adı ve şifre bilgilerini kullanarak bir bağlantı açılıyor. SSH client nesnesi ile bir session açılıp komut çalıştırılıyor. Komutun bitmesini beklemek için 5 sn bekletiliyor. Daha sonra komut çıktısı okunarak konsola basılıyor.

Şimdi de SSH client ile session açıp, shell arayüzü ile komutları inputstream şeklinde shell'in standart input'una gönderelim. Örnek basit bir Python kodunu String içerisinde ByteArrayInputStream'e çevirerek gönderiyoruz. Çıktıyı da standart output'dan okuyup konsola basalım.


 Programın çıktısı örnek kodun aşağısında yorum içerisinde bulunmaktadır.

Özetle, programatik olarak SSH ile makineye bağlantı sağlayıp uzak makinanın komut satırını elimizin altına alabiliyoruz.

12 Mayıs 2018 Cumartesi

Spring Boot ile Veri Tabanına İlk Verileri Ekleme

Önceki yazımızda oluşturduğumuz örnek projede

spring.jpa.hibernate.ddl-auto = update

özelliği ile veritabanı şemasının Hibernate tarafından otomatik oluşturulmasını sağlamıştık. Fakat, çoğu zaman veri tabanı şemasının oluşturulması yeterli olmayıp, uygulamanın kullanılabilmesi için bazı ilk verilerin de eklenmiş olması gerekmektedir. Bu yazımızda uygulama ayağa kalkarken uygulama içinden ilk verilerimizi nasıl kaydedeceğimizi göreceğiz.

Veri tabanımıza veri kaydetmenin çeşitli yöntemleri vardır. SQL script dosyaları hazırlayıp, bu scriptleri çalıştırarak da veri tabanımızı doldurabiliriz. Fakat kullandığımız veri tabanına göre değişik scriptler hazırlamamız gerekebilir. Örneğin, MySQL ile çalışırken hazırladığımız scriptleri, Oracle veya başka bir veri tabanı kullanmaya karar verdiğimizde tekrar yazmamız gerekebilir. Hibernate teknolojisi bizi kullandığımız veri tabanı teknolojisinden soyutluyorken neden bunu ilk veri kaydederken de kullanmayalım?

Spring Boot Data JPA teknolojisini kullanarak oluşturduğumuz Repository'leri kullanarak, ApplicationReadyEvent'i dinleyen ApplicationListener beanlerimiz ile uygulama ayağa kalktığında veri atacağımız tabloyu kontrol edeceğiz. Eğer boşsa, eklemek istediğimiz entityleri oluşturup kaydedeceğiz.

Bu sınıflarımıza Data Populating Unit (Dpu) diyebiliriz. Uygulamamız ayağa kalktığında dog, bird, cat tipleri hâl-i hazırda eklenmiş olsun istiyoruz. 

Birden fazla Dpu çalıştırmak istediğimizde dpu'ların çalışma sırası önem kazanıyor. Örneğin, dog tipinde Pet kaydedeceğimiz PetDpu çalıştırmak istiyorsak, öncelikle dog PetType nesnesinin veri tabanında kayıtlı olduğundan emin olmalıyız. Bu nedenle PetTypeDpu sınıfımızın, yazacağımız PetDpu'dan önce çalışması için @Order anotasyonu ile sıra belirliyoruz.


Tüm örnek proje kodunu Github'da şuradan indirebilirsiniz.

Masraf Takibi - Gider Yönetimi Android Uygulaması

Merhabalar. Masraf Takibi & Gider Yönetimi uygulaması yayınlandı! Google Play Store'da şuradan indirebilirsiniz! Ölçemezseniz, ...