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.

 

IOT kartlarında multiprocessing ‘in yan etkileri

Kategori: Arduino, IOT, OrangePI, RaspberryPI
Tarih: 10th Haziran 2018

Merhaba! eğer hala bu bloğu takip eden bir okuyucu var ise ona; değilse, dağda bayırda ekolanmış ve kimsenin çekiç, örs yada üzengi kemiğine dokunamadan sıfıra yakınsamış, gitmiş bir nara gibi.

 

Bu yazıda; sosyal/toplumsal neredeyse hiçbir konuya dokunmadan; 24 hazirana çok yaklaşmış olmamız hasebiyle, şu aralar canını çıkartırcasına üzerine çullanılan siyaset konu başlığını hiç rahatsız etmeden, şuan uyur isem muhtemelen uyanamayıp üzüleceğim, sahur yemeğine kadar, yaklaşık bir buçuk saat teknik bir konu üzerine yazıp; defolup gideceğim. Her ne kadar, uzun süredir sosyal ve manevi konularda, geçmiş ve geleceğe dair içimde uzun uzun serzenme isteği olsa da. Ah ah nerede o eski sahur tebrikleri. “Vay anasını! Bu tebriği paylaşalı bile 3 sene olmuş” demekten kendini alamıyor insan. Ki o zamanlar da “Vay anasını 8 sene olmuş Kütahya ‘ya geleli, neredeyse askere gidiyorum” diye geçen zamanın hızına şahitlik ettiğimi hatırlıyorum. Ahir zamanda, zamanın bereketsizliğine her an şahidiz demek ki. Sarı ışıkla aydınlanan, anti-hijyenik ama samimi; izmarit dağlarının kokusunda sabahlara kadar muhabbet çevrilen; zaman zaman konusu, zaman zaman kendisi yüksek rakımlı; -dolu dizgin- öğrenci günleriydi. Çok sevgili Ali amcanın da dediği gibi; öğrenci pisikolojisinden çıkamamış olmamdan mütevellit…

 

Geçen hafta içerisinde, geliştirmiş olduğumuz bir cihazda buzzer ile birkaç uyarı tonu çalma ihtiyacı hasıl oldu. Önce bu ihtiyaç doğrultusunda internette yazılmış mesajlara ve örnek kodlara göz attık. Devreye bağlantı şekli -bir led gibi- gayet basit. Birçoğu mantık olarak otursa da pratikte tam istediğimizi alamadık. Tekrar tekrar test ettik. Hatta acaba bizim kartlarımızda işlemcilerimiz de mi bir sorun var diye düşünüp; bu duruma biraz kafa patlattıktan sonra fark ettik ki bu; pratik ve teori uyuşmazlığının sebebi gözden kaçırılmış olan multiprocessing meseles imiş. Hemen herkesin bu konuda şu cümle kulağındadır “Bir bilgisayar, aslında bir anda sadece bir işlem yapabilir. Ama bilgisayarlar o kadar hızlıdır ki, işlemleri arkası arkasına o kadar hızlı çalıştırır ki: biz, müzik çalma, internette gezme ve dosya indirme… hepsi aynı anda oluyor gibi görürüz.” Bu cümlede bahsedilen iş tam olarak budur. Çok işlem yapabilme kabiliyeti.

 

Arduino, NodeMCU gibi üzerinde bir işletim sistemi çalışmayan kartlar multiprocessing değildir (özel olarak bir framework yazılır ise yapılabilir). Ama RaspberryPi, OrangePi gibi daha hızlı ve üzerinde işletim sistemi koşturduğumuz kartlar aynı anda çok işlem çalıştırabilir(Bu aslında işletim sisteminin maharetidir). Şimdilik burada kalalım.

 

Önce internete önerilen şekilde geliştirdiğimiz kodu paylaşmak istiyorum.

 


import time

from pyA20.gpio import gpio

from pyA20.gpio import port

buzzer = port.PA1

gpio.init()

gpio.setcfg(buzzer, gpio.OUTPUT)

def ses_cal(f, s):

st = int((f/2) * s)

for x in range(0, st):

time.sleep(1.0 / f)

gpio.output(buzzer, 1)

time.sleep(1.0 / f)

gpio.output(buzzer, 0)

ses_cal(400, 0.5)

 

Bu kod parçacığını incelersek görürüz ki 400Hz frekansında 0.5 sn bir ton çalınmak isteniyor. Yani yarım saniye boyunca Do notası çalmak planlanmış. Multiprocessing olmayan bir sitemde düşünülür ise bir problem yok. İşlemciler çok hızlı. Buzzera tam olması gerektiği zamanlarda 1 yada 0 lar gönderilir. Peki ama multiprocessing için ne değişiyor? Onun için işin matematiğini inceleyelim.

 

400 Hz bir ton çalmak için buzzera bir saniyede 400 adet 1 ve 0 sıfır sinyali göndermek gerekir. Bu da her 1 ve 0 sinyalinin arasında 0.00125 sn olacak demek olur. En düşük hızdaki işlemciler için bile bu yakalanabilir bir aralıktır. Buzzera tam 0.00125 sn de gerekli sinyalleri gönderebilir. Eğer tek işi sadece bu ise.

 

İşte çadır tam bu noktada karışıyor. Multiprocessing bir sistemde işlemci buzzera bir sinyal gönderiyor sonra biraz da diğer işlemleri yapıyım diyor geri döndüğünde bir bakıyor eyvah 0.002 sn geçmiş. Bu da tam sizin istediğiniz tonu üretmenizi engelliyor. Daha detaya inmek gerekirse; time.sleep fonksiyonu iki sinyal arasında tam sizin istediğiniz kadar süre bırakmaz. O satır sadece “burada 0.00125 sn bekle” demektir. Sizin multiprocessing den dolayı biraz o satırdan önce biraz da sonra kaybınız olabilir. Olmayadabilir. Hatta yeteri kadar hızlı olan işlemcilerimiz time.sleep esnasında bile birkaç sefer sizin işleminize gelmiş ve biraz daha zaman var gidiyim başka işlemleri yapıp geliyim demiş olabilir. Olmayadabilir.

 

Çözüm de işte burada çıkıyor. Buzzer sizin multiprocessing den, sleep ‘den falan anlamaz. Bana hangi aralıklarla sinyal gönderirsen ben ona göre bi ton çalarım der. Siz işi time.sleep e bırakmamalı kontrollerinizi kendiniz yapmalısınız. Datetime kütüphanenizin microsecond özelliği var iki sinyal arasındaki süreyi kendiniz hesaplayıp bir sonsuz döngü icerisinde kalıp yeterli süre geçtiği anda döngüden çıkıp yeni sinyali göndermelisiniz. Bu söylediğim esaslara göre yazılmış olan kod bloğu da aşağıdadır.

 


import time

import datetime

from pyA20.gpio import gpio

from pyA20.gpio import port

buzzer = port.PA1

gpio.init()

gpio.setcfg(buzzer, gpio.OUTPUT)

def ses_cal(f, s):

st = int(f * s)

za = int((1.0 / f) * 1000000)

t = datetime.datetime.now().microsecond

s = False

for x in range(0, st):

temp = datetime.datetime.now().microsecond - t

if temp < 0:

temp += 1000000

while temp < za:

i = 0

temp = datetime.datetime.now().microsecond - t

if temp < 0:

temp += 1000000

gpio.output(buzzer, s)

s = not s

t = datetime.datetime.now().microsecond

ses_cal(400, 1)

 

Bu kod bile; kartı eğer yoğun bir işlem yükünde kullanıyorsanız tam istediğiniz sonucu veremeyebilir. Bunun için de önerim: buzzer ile kartımız arasına arduino micro gibi düşük maliyetli bir kart daha takılıp buzzer o kart ile sürülebilir.

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?

Personel Takip Uygulaması

Kategori: Referanslar
Tarih: 22nd Nisan 2017

İşletme yada kurumlar için geliştirdiğim personel takip uygulaması. Sahada görevlendirilmiş personeli mobil telefonlarını kullanarak harita üzerinde izleyebilmenizi, görev yönetimini yapabilmenizi, personeller arası iletişimi, zaman takibini vs… Yani sahadaki personel ve görevler hakkındaki tüm işlemlerinizi halletmenizi sağlayan uygulama.

Yorumlar: 0 » tags:

Ben ve hepimiz hakkında bir bayram tebriği

Kategori: Genel
Tarih: 23rd Eylül 2015

Elbiseler şeffaf, insanlar kesif artık. Cesurca cesetlerini gösteriyor herkes. Birbirimizi ezbere biliyoruz. Ruhlar tesettürde.

İçtenlik namına bütün kaygılardan kurtulunmuş, tüm tabular yıkılmış. Eğleniyormuş gibi görünmek için çekinmeler, beğenilmek için fikretmeler ve sınır tanımamak. Mukaddesleri bile feda ederken çekinmiyor insan; nefretten, kinden gözü dönmüş bir beğenilme, alt etme güdüsüyle. Evet o ayetler siz eski sevgilinize laf sokun diye indirildi(!)

Herkes olmak istediği gibi asosyal dünyada. Olduğu gibi olanımız, yok değil az. Instagramda herkes güzel, twitterda herkes komik, idealist… Ama genelde mutsuz insanlar. Kontrolsüzce yükseldi mutluluk eşiğimiz. O an nerede değilsek orası daha güzelmiş gibi geliyor artık. Canavarlaştırılmış egolarımız. Memnuniyetsizsiniz!

Ruhlarımız gasp edildi. Birbirimize yaptık bunu. Fikrimizi gösteremeyince cesedimizi gösterir olduk bizde. Uzun soluklu hiçbir sınavda başırılı olamayan boş bir kalabalığız şimdi.

Aslında bu bir kurban bayramı tebriği olacaktı, olmalıydı, olsun. Allah bayram ruhunu hissedebilmeyi hepimize nasip etsin, bayramınız mübarek olsun -kendi ruhlarımızın hasretinde-.

 

***iç ses: şimdi ben bu yazıyı niye paylaştım? beğenilmek için mi? bilmiyorum. belki.

Yorumlar: 1 »

Sahurunuz Hayrolsun

Kategori: Genel
Tarih: 23rd Eylül 2015

Bakıyorsun; en sosyal gördüğün en kalabalık insanların hatta en güzel kızların bile -ki bu kızların etrafı her daim zibilton tane abaza doludur (yazar burada zibilyonu kalabalık bir ölçü birimi manasında kullanmaktadır)- profillerinde “üff sıkıldım”, “püff bunaldım” tarzı paylaşımlar. Anla ki 1500 arkadaş yahut 2500 takipçi bile yetmiyor insanın içindeki manevi boşluğu doldurmaya.  Çok sevgili -yada belkide o kadar değil şuan tam karar veremedim- Süleyman Demirel’in de dediği gibi “Binaen aleyh” huzur islamda dostlar. Hayırlı sahurlar.

Yorumlar: 1 »

11. koğuştan bir özür

Kategori: Genel
Tarih: 23rd Eylül 2015

İnciciler içi özet:

7 uyurların da dediği gibi “Ne uyudum be bilader”

 

Kendimi bildim bileli bir uyku sorunum var. Daha doğrusu bir uyku sorunum yok. Uykuya dair hiçbir sorun yaşamıyorum. Bu bir sorun mu bilmiyorum. Yere paralel durmama bile gerek kalmıyor bazen. Yastığa beş kala uyuyakalıyorum.

Bu askerlik süreci de gösterdi ki; asit denilebilecek yoğunlukta ayak ve ter kokusunda hatta yüksek desibel kahkaha sesinde bile uyuma güçlüğü çekmiyorum.

Ve bu gece. Bu bol yıldızlı ve ferah; hatta sırf güzel şeyler konuşulsun, bişeyler paylaşılsın da buralar daha yaşanabilir olsun diye planlanmış bu gecede, dayanamadım. Yine uyudum.

Not: Bu koğuş arkadaşlarımdan bir özür yazısıdır.

Yorumlar: 0 »

CodeIgniter3++

Kategori: Codeigniter, Php, Referanslar
Tarih: 16th Mart 2015

Codeigniter framework geliştiricileri 2.2. versiyondan sonra artık geliştirme yapmayacaklarını duyurmuşlardı. 2015 Ocak itibariyle bu karar değiştirilmiş. CI3 versiyonu RC sürümleriyle yayınlanmaya başladı. Şuan RC3 yayında. Bende şimdiye kadar yaptığım çekirdek geliştirmelerini ve bazı kütüphaneleri ekleyerek bir temel proje oluşturmaya karar verdim. Bu proje aşağıdaki ekleri ve geliştirmeleri içermektedir. Projeyi buradan indirebilirisiniz.

 

 

1- Serbest Kütüphane

Çeşitli işlermler için yazılmış fonksiyonlar bu kütüphaneye eklendi. Bu kütüphane CI yüklenmeden önce yüklenir ve CI’dan bağımsız olarak uygulamanın istenilen yerinde kullanılabilir. Akla hemen neden helper geliştirilmedi de böyle bağımsız bir kütüphane geliştirildi sorusu gelecektir. Bunun kütüphanedeki bir çok fonksiyon için farklı cevapları var. Bir örnek verelim. Flood kontrol fonksiyonu. Bu, sisteminizi flood saldırılarına karşı korumak için yazılmış bir fonksiyondur. Bu fonksiyon helper içinde tanımlansa idi bir saldırı bile olsa bu fonksiyonu kullanmak için CI’ ın yüklenmesi gerekecekti. Yani saldırılarda bile CI yüklenecekti. Zaman kaybını öncelemek için flood_kontrol fonksiyonu CI yüklenmesinin önüne alınmıştır.

 

2- Güvenlik Geliştirmeleri

  • İlk güvenlik geliştirmesi flood kontrolüdür. Sistem flood saldırılanı tespit ederek uygulamanızın yüklenmesini durdurur. Bu konu ile ilgili ayarı “./kutuphane.php:157” dosyası içinden yapabilirsiniz.
  • Oku fonksiyonu. Serbest kütüphane içinde bulunan bu fonksiyon istenilen modda okuma yapıp okuduğu veriyi “sql enjeksiyon”, “xss saldırısı” gibi güvenlik açıklarından temizler. Bunun yanı sıra faklı kaynaklardan istediğiniz veriyi okumanıza yardımcı olur. Ek olarak Yaz fonksiyonunuda bununlar birlikte inceleyebilirsiniz.
  • Captcha yani resimdeki karakterler koruması. CI’ın mevcut fonksiyonlarının üzerine geliştirilen bu koruma ile sayfanız içersinde herhangi bir yere “<div id=’captcha-alan’ w=’300′ h=’35’></div>” kodu ile istediğiniz boyutta bir captcha oluşturabilirsiniz. Cache kullansanız bile uygulama bu alana dinamik olarak captcha resmini yerleştirip kullanıcıya “captcha” anahtar kelimesi ile resimdeki karakterleri içeren stringi session olarak atayacaktır.
  • Form ID. Bu koruma ile uygulama tarafından form_open() fonksiyonu ile oluşturduğunz her form içine, o form için özel oluşturulmuş bir ID eklenir. Bu şekilde form kopyalanması, formların offline olarak doldurulması, farklı sitelere sizin formunuzun gömülmesi gibi işlemlerin önüne geçmiş olursunuz. Çekirdek geliştirmesi ile “$this->form_validation->run()” kodunu çalıştırırken Form ID’niz de otomatik olarak kontrol edilecektir. ID doğrulanamaz ise kullanıcıya hata sayfası gösterilecek ve log dosyasına hata yazılacak.

 

3- Çoklu ve Dinamik Dil Desteği

Bu destek sayesinde veritabanınızdan dinamik yüklediğiniz dil bilgileriyle uygulanızı istediğiniz her dilde sunabilirsiniz. Sistem dil bilgisini url ‘in ilk segmentinden tespit eder. Bu dil bilgisi iki harfli olmalıdır. “http://siteniz/tr/” yada “http://siteniz/en/” gibi. Desteklediğiniz dilleri veritabanında dil tablosuna eklemelisiniz. Ayrıca dil klasöründe “<modül ismi>_lang.php” dosyası içine dil verilerinizi eklerseniz, sistem dili tespit ettikten sonra lang dosyasını otomatik yükleyecektir. Mesela “http://siteniz/tr/panel/sinif/method” adresine gitmek istediğinizde sistem turkce klasöründeki panel_lang.php dosyasını yükleyecektir. Siz view içerisinden yeni bir yükleme işlemi yapmaya gerek olmadan istediğiniz dili kullanabilirsiniz.

 

4- Modüler Yapı

CI üzerinde modüler olarak sisteminizi geliştrimenizede izin verilmiştir. Uygulama kullanıcının geldiği url den hangi modüle gitmek istediğiniz tespit eder ve ilgili yüklemeleri ona göre yapar. Örneğin “http://siteniz/tr/panel/sinif/method” adresine gitmek istediğinizde sistem “./tema/panel/” adresindeki temayı dikkate alacak ve dil olarak da türkçe dilini yükleyecektir. Site ve Panel isminde iki adet modül olduğu varsayılmıştır.  Bu konu ile ilgili ayarı “./kutuphane.php:123” dosyası içinden yapabilirsiniz.

 

5- Tema Motoru

CI yapılan geliştirmelerle kullanıcının farklı modüller ve diller için farklı temlar kullanmasına ve her modül için birden fazla tema yükleyebilmesine izin vermektedir. Şöyle ki CI bir temanın seçilebilmesi için sistem ikiparametreyi dikkate almaktadır. İlki modül ismi. “./tema” klasöründe modül isimleriyle aynı isimde ve sayıda klasör bulunmalıdır. “./tema/panel” ve “./tema/site” gibi. Sistem gelen url’e bakarak tema klasörü içerisinde hangi klasörü dikkate alacağını otomatik seçecektir.  “http://siteniz/tr/panel/sinif/method” adresi için “./tema/panel/” i tema klasörü olarak kabul etmek gibi. İkinci parametre ise veritabanında yüklenecek tema ayarının tutulduğu kayıt. Veri tabanında ayar tablosu altında ilgili modül  için hangi temanın yükleneceği ayarı tutulur. Bu kayıda erişmek için anahtar kelime “<modül ismi>_tema” şeklindeki kayıt adıdır (panel_tema yada site_tema gibi). Karmaşık görünse de değil. Hemen bir örnekle anlatalım.

 

Tema klasörünün ağaç yapısının aşağıdaki gibi olduğunu kabul ediyorum.

/tema

—–/panel
———-/varsayilan
———-/panel_icin_yeni_tema

—–/site
———-/varsayilan
———-/site_temasi2

 

Veri tabanındaki ayar tablosunda da aşağıdaki veriler vardır.

id dil ad veri aktif
1 0 site_tema varsayilan t
2 0 panel_tema site_temasi2 t

 

“http://siteniz/tr/panel/sinif/method” adresine gitmek isteyen bir kullanıcıya “./tema/panel/varsayilan/views” klasörü view klasörü olarak gösterilecektir. Bir başka deyişle $this->load->view(‘deneme’); komutunu yazdığımız bir sayfada yukarıdaki adres için gelen kullancıya “./tema/panel/varsayilan/views/deneme.php” sayfası view olarak yüklenecektir.

 

Her bir tema klasöründe css, js, less ve view klasörleri varsayılan olarak olmalıdır. Daha fazla gerekirse resim, dosya gibi klasörler de ihtiyaca göre temayı kodlayan tasarımcı tarafından eklenebilir. Ayrıca views içindede varsayilan adında bir klasör olmalıdır. Bu klasör bir sonraki paragrafta anlatılacak olan js, css ve less dosyaları içinde php kodu yazabilmemiz için gereklidir. Saydığımız dosyalar direk statik bir dosya olarak eklenmez. Bunun yerine CI üzerinden yüklenir. Bu klasör eski bir temadan direk kopyalanabilir. Peki ama neden js dosyasında php kodu yazmak isteyelim? En basitinden dil desteği için. Js dosyasındaki string ifadeleri CI dil fonksiyonu aracılığıyla yazdırırsak sistem dili otomatik yüklediği için bizim istediğimiz dildeki js dosyasınıda otomatik olarak oluşturacaktır. Standart bir tema dosyasında olması gereken yapı aşağıdadır.

 

tema_adi
—–/css
—–/js
—–/less
—–/views
———-/varsayilan
—————/css.php
—————/degiskenler.php
—————/dosya.php
—————/javascript.php
—————/less.php
Bu yapıyı oluşturduktan sonra istediğimiz dosyamızı istediğimiz isim ile ekleyebiliriz. Herşey artık bizde. Mesela css içerisine sitil.css js icerisinede kutuphane.js, less içerisinede sitil.less dosyasını oluşturduğumuzu düşünelim. Bu dosyalarımızı view sayfamıza aşağıdaki gibi ekleme yapabiliriz.

 

<!– Tema css kütüphanesi –>
<?=css(‘sitil.css’) ?>

<!– Tema less kütüphanesi –>
<?=less_file(‘sitil.less’) ?>
<!– .less dosyalarını çalıştıracak js kütüphanesi –>
<?=less() ?>

<!– Tema js kütüphanesi –>
<?=javascript(‘kutuphane.js’) ?>

 

Son olarak bu dosyaların içerisinde php kodu kullanmayı örnekleyelim:


function facebook_giris()
{
var on = $( "#beni_hatirla:checked").length == 1 ? 'on' : '';
alert("<?=lang('hatirla_mesaj') ?>");
window.location = "<?=url('panel')?>anasayfa/facebook?beni_hatirla="+on;
}

CI less ile uyumludur.

 

6-Form elemanları

Form elemanları için yine önemli geliştirmeler yapılmıştır. Buradan bu konu hakkındaki yazıya ulaşabilirisiniz. Bunların yanı sıra çoklu dosya yükleme ve zengin metin editörüde kullanabilirsiniz. Örnek kod aşağıdadır.


<?php angular_editor('aciklama', '<b>html</b> Test') ?>

<?php coklu_dosya_yukleme('resimler', '', dosya_turu('site', 'id')) ?>

“dosya_turu(‘site’, ‘id’)” bu fonksiyon bir numara geri döndürür. coklu_dosya_yukleme(,,) fonksiyonunun 3. parametsi olarak fonksiyona gönderilir. Bu parametre ile çoklu dosya yükleme aracı dosyaları hangi dizine yükleyeceğini belirler.  Örnekteki dosyalar “./dosya/site/” klasörü altına yıl/ay/gün dizini takip olarak yüklenecektir. Dosya türleri hakkındaki ayarlamaları “./kutuphane.php:992” dosyasından yapabilirsiniz.

 

7- Kullanıcı girişi

Örnek olarak bir tema ve kullanıcı girişi tasarlanmıştır. Tasarlanan tema tüm mobil cihazlarda da tam uyumlu çalışmaktadır. Ayrıca kullanıcının yetkili olup olmadığı kontrol edilip kullanıcı girişi yapmadan panel klasörü altındaki hiç bir sayfaya giriş yapmasına izin verilmemektedir. Sadece giriş ekranına erişebilmesi için “Anasayfa” controller’ına ve js, css, less dosyalarına erişebilmesi içinde proxy klasörüne izin verilmiştir. Bu konu ile ilgili ayara “.\application\config\config.php:7” dosyasından ulaşabilirsiniz.

 

8- Raporlamalar

Ek kütüphaneler ile CI üzerinden Word, Excel ve Pdf raporlar alabilmeniz sağlanmıştır. Bunlarla ilgili birer örnek “http://siteniz/tr/panel/rapor/excel”, “http://siteniz/tr/panel/rapor/word” ve “http://siteniz/tr/panel/rapor/pdf” adresinde bulabilirsiniz.

 

9- Cache

Cache kütüphaneleri de daha kolay bir cache yönetimi için geliştirilmiştir. Bu şekilde cache yapılan dosya url dizini ile aynı şekilde cache dosyasında tutulmaktadır. Dosya adında da dil bilgisi ayrıca indexlenmiştir.

 

10- Geliştirici ayarlamaları ve Özel ayarlar

Geliştirme esnasında ve sistem kullanıma başladıktan sonra sistemi hızlandırma adına bazı ayarlar size bırakılmıştır. Bu ayarları sabit tanımlamaları ile “./kutuphane.php:32” den itibaren bulabilirsiniz. Örneğin sistem dil bilgisini her seferinde yeniden veri tabanından okumak yerine bir sefere mahsus okuyup sizin “VERI_CACHE” sabiti ile belirlediğiniz veri kaynağına yazar. Sonraki her ziyaretçi için bu kaynaktan okur. Burada buna benzer bir sürü ayar bulabilirsiniz.

 

11- Ek kütüphaneler

CI içerisine sizin kullanımızı kolaylaştıracak bir sürü ek kütüphane konulmuştur. Jquery, JquqryUI, Bootstrap, Bootstrap notify, Openlayers, Less… Bu kütüphaneler view dosyası içerisine aşağıdaki koldlarla eklenebilir.


<?=jquery() ?>

<?=bootstrap() ?>

<?=bootstrap_notify() ?>

<?=openlayers() ?>

<?=ui() ?>

<?=angular() ?>

<!-- Framework varsayılan js kütüphanesi -->
<?=javascript() ?>

<!-- Framework varsayılan css kütüphanesi -->
<?=css() ?>
<!-- Tema css kütüphanesi -->
<?=css('sitil.css') ?>

<!-- Framework varsayılan less kütüphanesi -->
<?=less_file() ?>
<!-- Tema less kütüphanesi -->
<?=less_file('sitil.less') ?>
<!-- .less dosyalarını çalıştıracak js kütüphanesi -->
<?=less() ?>

<?=google_analytics() ?>

 

12- Facebook API

CI içerisine Facebook API v4.4 de eklenmiş ve kullanıcı girişi için örnek bir kütüphane tasarlanmıştır. Paneli inceleyerek detayları görebilirsiniz.

 

Not:

  • SQL dosyası kök dizindedir. Veritabanı olarak Posgresql 9.1.15 kullanılmıştır. Kendi Veri Tabanı Yönetim Sisteminize göre sql kodlarını revize etmeniz gerekebilir. Veritabanı bağlantı ayarlarınada “./kutuphane.php:96” dosyasından erişebilirsiniz.
  • Sistem varsayıla olarak APC cache kullancak şekilde planlanmıştır. APC desteklemeyen sistemler için VERI_CACHE sabitine session değeri verilebilir. “./kutuphane.php:56”
  • APC durumunun incelenmesi için “http://siteniz/apc.php” adresini ziyaret edebilirsiniz.
Yorumlar: 2 » tags: , , , ,
Optimization WordPress Plugins & Solutions by W3 EDGE