Bulut Bilgi Sistemi ve Özel İdare Uygulaması

Merhaba çok uzun süredir kurum olarak yazılım ve donanım geliştirmemize rağmen gerek yoğunluk gerekse alışkanlık sahibi olmadığımız için bir yazılım yada donanım hakkında oturup da döküman hazırlamış değiliz. Bu konuyu stajer arkadaşlar üzerinden çözmeyi planladık ama fiile dökemedik. Biz de en azından sistemin mimarisi ve kullandığımız teknolojiler hakkında bilgi vermesi amacıyla genel bir pano hazırlamıştık. Aşağıdaki resmi büyütüp uygulamakta olduğumuz sistem hakkında bilgi sahibi olunabilir. Şema hazırladıktan sonra yaptığımız güncellemeleri de yakın zamanda ekleyeceğim. Yani inşallah eklerim.

Bulut bilgi sistemindeki tüm uygulamalar ve bazı donanımlar tarafımızdan geliştirilmiştir. Hiç bir modül/lisans satın alınmamıştır. Umarız bir kurumun işine yarar. Sağlıcakla.

 

NetCAD to GIS //Netcad `den CBS `ye

Kategori: CBS - GIS, Genel Programlama, NetCAD, Php, Referanslar
Tarih: 29th Nisan 2018

NetCAD de çizilmiş olan projelerimizi online Coğrafi Bilgi Sistemi `mize aktarmak icin yapmış oldugumuz veri aktarma modüllerimizi canlıya gecirdik! Bir nevi online veri güncelleme araci.

 

*Bu bir NetCAD hacking/cracking degildir. Proje dosyası sunucu tarafından tamamen EULA `ya uygun olarak dönüştürülmektedir.

Gömülü sistemler ve hafıza kısıtı

Kategori: Arduino, Genel Programlama
Tarih: 12th Şubat 2018

Merhaba uzun süredir bir sürü konuda yazmak istememe rağmen yoğunluktan bir fırsat bulup da yazamadım. Gerçi “youtuber” lık bu kadar popülerken bu yazıyı okuyan olacak mı? O da muamma. Ama ben sanırım bir süre daha buradan sosyal ve teknik konularda yazmaya devam edeceğim. Hatta sonraki senelerde ilgili bir stajer arkadaş gelir ise onlarca projeyi/çözümü yazıya döktürmek gibi bir planım var.

 

Neyse; her eve bilgisayar her eve internet falan derken olay döndü dolaştı her şeye internete kadar geldi. Özetle IOT demek bu demek. Kombilerin, kumandaların, termometrelerin bile interneti var. Bizim herşeyden anında haberdar olma isteğimizle birlikte bu gömülü sistemler olayı da yürüdü gitti. Önceleri akıllı cihazlar geliştirmek bu kadar kolay değildi. Hatta cihazı internete bağlamak hayal bile değildi; yoktu! Sizin internete bağlı bir şeyiniz var ise bunun adı bilgisayardı. Bir şeyi internete bağlama fikri kimsenin aklına gelmemişti. Belkide ihtiyaç da değildi. Sonra teknolojinin x küp eğrisi şeklinde gelişiyor olması kısa zamanda mikroişlemcileri hızlandırdı, iletişim standartlarını geliştirdi, Çin ‘in de sahaya inmesi ile donanım ucuzladı ve biz nihayet lehim makinesinden bile internete bağlanabiliyor hale geldik.  İşin trajikomik tarafı, bu son verilen örnek tamamen gerçektir.

 

Artık neredeyse sadece yazılım bilerek bile birşeyler tasarlayabiliyorsunuz. 16F877 de ki iskele vs. … mantığını kavramak zorunda olduğunuz yapılar, günlerin ayların sınıflarına karıştı gitti. Her şeyin kartı çıktı. Çarli ‘nin melekleri! Yani I2C, SPI ve Seri iletişim ne demek öğrenin kullanamayacağınız teknoloji neredeyse kalmadı. Üzerinde işletim sistemi bile çalıştırabileceğiniz kartlar çıktı.

 

Sonuç olarak sıkıntılı kısma gelirsek. Daha doğrusu benim bu yazıda deyinmek istediğim sıkıntıya: hala bazı kartlarda hafıza kısıtınız var. Özellikle arduino nano, mikro gibi çok çok küçük boyutlu kartlarda. (Yazar aslında burada bu kartın kullanmış olduğu işlemcinin hafızasından bahsetmektedir.)

 

Özet geçmek gerekir ise arduino, temel olarak 2 program hafızasına sahiptir. Birincisi ve büyük olan, program kodlarının yüklendiği kısım. Yazdığınız kodlar makine koduna dönüştürülür ve buraya yüklenir. Programın çalışması demek de bu kodların satır satır, işlemcinin ALU devresine gönderilmesi/sonucun yorumlanması demektir. İkinci hafıza ise Arduino IDE ‘nin de -derleme bilgi ekranında- bahsettiği -kabaca- global değişkenlerin tutulduğu hafızadır. Bu çok daha küçüktür. ATmega328P işlemcisi için -ki arduino nano bunu kullanır- bu hafızalar 32KB ve 2KB dır. Yine bu işlemci üzerinden konuşmaya devam edersek; aynı anda Ethernet kartı ve Sd kart kullanarak bir geliştirme yapmak istiyorsanız muhtemelen size bu 2KB SRAM yetmeyecektir.

 

İşte tam da bu noktada, yani “acaba mega ile mi geliştirmeye devam etsem, o da çok büyük be bilader” dediğiniz; umutsuzluğun kapısında. Yürümekten çok, geri dönmenin sıcak geldiği bu anda; bu yazının hedef kitlesi olmuş durumdasınız. Bence aşağıdaki kodu inceleyin. Dizileri ve değişkenleri SRAM den kullanmadan tanımlayabilirsiniz. Umarım işinize yarar.

 

const char me0[] PROGMEM = "me0";
const char me1[] PROGMEM = "me1";
const char* const mDizi[] PROGMEM = {me0, me1};

const char me[] PROGMEM = "me";

const PROGMEM uint16_t sDizi[] = {1, 2};

const PROGMEM uint16_t se = 3;

char bufferStr[30];
int bufferInt;

void bufferStrDoldur(int a)
{
    strcpy_P(bufferStr, (char*)pgm_read_word(a));
}

void bufferIntDoldur(int a)
{
    bufferInt = pgm_read_word_near(a);
}

void setup()
{
    Serial.begin(9600);
    Serial.println(F("Basliyor..."));

    bufferStrDoldur(&mDizi[1]);
    Serial.println(bufferStr);

    strcpy_P(bufferStr, me);
    Serial.println(bufferStr);

    bufferIntDoldur(&sDizi[1]);
    Serial.println(bufferInt);

    bufferIntDoldur(&se);
    Serial.println(bufferInt);
}

void loop() { }

 

Not: bu yazıda paylaşılan kodlar ve çözümleme taa m.ö. yapılmış ancak bir türlü oturulup da bir yazı haline getirilememiştir. Bir başka deyişle; bugün IOT konusunda burun farkıyla önde görülen NetCAD, daha Netigma 2.0 ‘ı baştan mı yazsak yoksa 1. versiyonun üzerine mi geliştirsek diye tartışırken; biz IOT argeleri yapıyor, bu kodu projelerimizde kullanıyorduk. Saygılarımla…

Hibrit mi? Native mi?

Kategori: C#, Genel, Genel Programlama, Referanslar
Tarih: 2nd Ekim 2017

Bir platformda, bir arkadaşın başlıktaki sorusu üzerine yazmış olduğum yorumdur. Yeni başlayan arkadaşlar için bir fikir verebilir.

 

Merhaba. Yukarıda bazı arkadaşlar biraz değinmişler. Bu soruyu biraz “Java mı yoksa C# mı?” sorusuna; biraz da “C# mı yoksa C++ mı?” sorusuna benzettim. Ben cevap olarak direk hibrit yada native demeyi doğru bulmuyorum. Bir parantez olarak şunu söyleyeyim; eğer vaktin var ise Javayı ve Swifti öğrenmeni tavsiye ederim. Dil seçiminde kıyaslama yapabilmen için o dili biliyor olman büyük fayda sağlayacaktır.

Hibrit frameworkler aslında uygulamanızın altında yine native kütüphaneleri kullanırlar. Siz bu native kütüphaneleri frameworkün izin verdiği dilde yönetirsiniz/kullanırsınız. Arada bir katman daha olması sebebiyle hibrit uyglamalar biraz daha yavaştır denilebilir. Bir örnek vermek gerekirse; mesela bir hibrit frameworkün bazı kütüphanelerinde IOS için çalışmaz yada desteklenmez yazar. Bu demek oluyor ki bu kütüphane içerisinde ios için native dosyayı barındırmıyor. Bu farklı sebeplerden olabilir. IOS gerçekten o işe izin vermiyor olabilir, geliştirici daha IOS için kütüphane yazmamış olabilir vs. vs.

Bunun yanında, hibrit uygulama geliştirirken işletim sisteminin değil kullandığınız frameworkün sınırları dahilindesiniz. Eğer frameworkün sizin istediğinizi yapan bir kütüphanesi yok ise uygulama geliştirmeye devam edemezsiniz. O özellikten vazgeçmelisiniz. Yada istediğiniz özelliği sağlayan bir kütüphanesi varsa bile kütüphanenin şarj tüketimine etkisi, işlemci kullanımı vs. tamamı sizin kontrolünüz dışında (İstisna: kütüphaneleri açık kaynak olan bir framework kullanıyor iseniz kodun istemediğiniz kısmını düzenleyip yeniden derleyebilirsiniz.)

Bunlar hibrit uygulamaların ilk bakışta göze gelen eksileri. Fakat bunların tamamını silip süpürecek bir artısı var ki; bir sefer yaz her platformda çalışsın özelliği. Eğer projeniz -aşağıda değineceğim gibi- hibrit bir framework ile yazılmaya uygun ise hem geliştirirken hem güncellerken en az yarı süresinde tasarruf edersiniz. Ayrıca yukarıda dezavantaj olan 3. parti kütüphaneler sayesinde herşeyi yeniden yazmayıp bir çok şeyi sadece kullanıp uygulama geliştirme sürecinizi de hızlandıracaksınız. Bu açıdan da avantaj sayılabilir. Ayrıca bu kütüphanelerin çoğu açık kaynak olup; ister istemez onlarca geliştiricinin eleğinden geçiyor. Ki defalarca güncellenenleri mevcut.

Şimdi asıl konuya dönersek, genel olarak hangi dil yada hangi platformu seçmeliyim demek çok sığ. Bence her proje için özel olarak değerlendirilip seçim yapılmak daha doğru. Yazılım yaşam döngüsünün analiz basamağı bunu amaçlar. Mesela bir gömülü sistemler projesi yapıyorsanız ve sadece bazı grafikleri izlemek için bir mobil uygulama tasarlayacak iseniz neden ayrı ayrı her platform için geliştirme yapasınız ki; bazı frameworklerde sadece javascript/typescript kullanarak bile geliştirme yapabiliyorken.

Yada yukarıda hocamın bahsettiği gibi performans gerektiren bir projeniz var ise native kullanmamak demek intihar olur. En iyi dil, en iyi framework yoktur, o proje için en uygunu vardır. Eğer öyle olsaydı whatsapp gibi performans canavarı bir uygulama -sunucu tarafı-herkesin tartıştığı Java yada C# da yazılırdı. Kaç bilgisayar/yazılım mühendisi biliyor ki whatsappın yazıldığı dili?

Karakter deseni tanımlama – Regex

Kategori: Genel Programlama
Tarih: 17th Haziran 2013

Programlama dilinden bağımsız olarak metinler ile işlem yapıyor ve bu metinlerin içinde komplex aramalar yapıyorsanız regex işinizi kolaylaştırabilir. Mesela bir metnin e-mail adresi olup olmadığını, yada bir karakter dizisinin sizin belirlediğiniz standarlarda bir karakter dizisi olup olmadığını karakter katakter arama yapmak yerine regex kullanak tespit edebilirsiniz. Her programlama dilinin regex fonksiyonları var; bir desen oluşturursunuz sonra o fonksiyonları kullanarak metin sizin karakter setinize uygun mu kontrolünü yaparsınız yada metnin istediğiniz alanını alanını alırsınız. Regex ile ilgili bazı notları taranmış hali burada. 2. sayfada “metin web adresimi?” kontrolünü yapan örnek desen var.

Katmanlı Mimari ve Platformlar Arası Haberleşme Üzerine

Kategori: Genel Programlama
Tarih: 3rd Mayıs 2013

Bazen bir projede birden fazla platform ile haberleşmeniz gerekebilir. Bu bazen zorunluluktan bazen de sistemin tasarımından kaynaklanır. Mesela katmanlı mimari kullanarak bir sistem geliştirdiğinizi varsayalım. 1. katman data access layer burada veriyi veritabanından bağımsızlaştırırsınız. 2. katman business Access layer burdada veriyi istediğiniz formatlarda sınırlar ve kullanıcıdan parametre olarak isteğiniz formatlarda alırsınız (sorrugate tipler). 3. Katman ise artık size kalmış burada direk bir Windows form yada wpf ile uygulama geliştirebilirsiniz.

3n.jpg

Ama fonksiyonel olan 3. Katman olarak bir servis yazmaktır. Daha sonra platformu ne olursa olsun uygulamamızda bu servisi referans ederek yine uygulamamızı geliştiririz. Mesela hem android bir cihazdan hem bir web sitesinden hemde masaüstü uygulamasından aynı servisi kullanırız. 3 platformda da bir butona basınca servisin ilgili methodu çalıştırılır. Bütün bu uygulamalar bizim sistemimizin bir istemcisi olur. Bir hata mesajını bile değiştirmek istesek bütün platformlarla teker teker uğraşmak yerine servisimizdeki method içinden değişlik yaparız ve tüm istemcilere artık o yeni hata mesajı gönderilir.

Aslında bir servis yazmak için hiçbir sınırınız yok. Soket programlama boyutunda verinizi istediğiniz formatta gönderip istediğiniz formatta okursunuz. Hatta gönderilen ve alınan veriyi şifreleyerek güvenliğide sağlayabilirsiniz. Ama yine fonksiyonel olan bir standart kullanmaktır. Wsdl (web service defination language) yani web servis tanımlama dili veri gönderip almanız için bir servis standartıdır. Bu şekilde bundan birkaç sene sonra çıkacak olan bir proglamlama dili yada framework bile olsa servisiniz ona da hizmet verebileceltir.

asd

Wsdl bir servis mimarisi değil mimari içinde kullanılan bir tanımlama dilidir. Mesela SOAP(Simple Object Access Protocol – Basit Nesne Erişim Protokolü) wsdl kullanan bir mimaridir. Biz wsdl ile bu servisin sunduğu fonksiyonları, onların gerek duyduğu parametreleri ve geri döndüreceği verileri belirleriz. Soap için örnek bir wsdl kodu aşağıdadır.


<?xml version='1.0' encoding='iso-8859-9'?>

<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://127.0.0.1/server.php">

<message name="ekle">

<part name="urunAdi"/>

<part name="aciklama"/>

<part name="marka"/>

<part name="fiyat"/>

<part name="taksit"/>

<part name="musterikodu"/>

</message>

<message name="ekleResponse">

<part name="ekleReturn"/>

</message>

<portType name="class.testPortType">

<operation name="ekle">

<input message="typens:ekle"/>

<output message="typens:ekleResponse"/>

</operation>

</portType>

<binding name="class.testBinding" type="typens:class.testPortType">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="ekle">

<soap:operation soapAction="urn:class.testAction"/>

<input>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</operation>

</binding>

<service name="serverService">

<port name="class.testPort" binding="typens:class.testBinding">

<soap:address location="http://localhost/server.php"/>

</port>

</service>

</definitions>

Bu şekilde tanımlanmış bir servise php ile bağlanacağımızı düşünelim. Bağlantı kodu da aşağıdadır.


<?php

  $client = new SoapClient("http://localhost/siparis.wsdl", array('encoding' => 'ISO-8859-9'));
   echo $client->ekle($_POST['urunAdi'], $_POST['aciklama'], $_POST['marka'], $_POST['fiyat'], $_POST['taksit'], MUSTERISIFRE);

?>

İşte bu kadar basit. Ne veritabanı ne soket bağlantısı vs. hiçbirşeyle uğraşmadık. Sadece butona basılınca servise bağlandık ve fonksiyonu kullandık. Üstelik bu tüm platformlarda böyle basit.

Servis wsdl kullanıyorsa sorun yok. Ama wsdl kullanmayan bir servisiniz varsa bazı platformlarda sorun yaşabilirsiniz. Mesela Nufus ve vatandaşlık işleri bazı kurumlara protokol dahilinde bir Wcf açıyor. Üniversiteler, Valilikler gibi. Bu servise php bir projeden bağlanamazınız. Wcf in bi dolu avantajının yanında tek dezavantajı bu heralde. Bu seferde veriyi wcf den çekebilmek için bir ara masaüstü uygulaması yazmanız gerekir. Siz parametrelerinizi bu programa gönderirsinizi bu programda sizin yerinize wcf e bağlanır, verinizi ona gönderir gelen veriyide size iletir. Bu iş için C# ile geliştirilmiş uygulama kodları aşağıdadır.


static void Main(string[] args)

{

try

{

Service1SoapClient client = new Service1SoapClient();

TCDon[] veri = client.TCKimlik(args[0], args[1]);

Console.Write(veri[0]._ailesirano + "|" + Seo(veri[0]._adi) + "|" + Seo(veri[0]._soyadi));

}

catch (Exception ex)

{

Rapor.Yaz(ex);

}

}

Bu programı çalıştırıp veriyi geri okuyacak php kodu da aşağıdadır.


$tc = “..........”;
 $ip = “..........”
 $r = shell_exec('C:\.....\service.exe '.$tc.' ' . $ip);

Bu şekilde bir ara programla tüm platformlarda haberleşme sağlatılarbilir.

Optimization WordPress Plugins & Solutions by W3 EDGE