RSS
 

Kuantum Programlama

17 Sep

Merhaba,

Yine uzun bir aradan sonra bir şeyler yazabiliyorum. :) Son zamanlarda iyice kafa yorduğum Quantum programlama üzerine bilgilerimi paylaşacağım. Tahmin ettiğiniz gibi programlama kısmına hepiniz yakınsınız ama quantum kısmı fizik ile ilgili ve pek sevdiğiniz bir konu olmayabilir. ;) Aslında Quantum fiziği diye bir bölümde var ama blogumun amacı fizik ile ilgili bilgi vermek olmadığından ve bende fizikçi olmadığımdan bu konuda paylaşım yapmam pek doğru olmaz. Fakat konumuzla alakalı olduğundan dolayı bilmeniz gereken fizikle ilgili bazı temel terimler var. Şimdi bunları burada açıklamak uzun ve sıkıcı olabilir. Siz zaman bulduğunuzda aşağıdaki kaynaklardan temel quantum fiziği bilgilerini inceleyebilirsiniz.

Kaynaklar;

Quantum programlama için, developer’lara pek fazla araç sunulmamaktadır. Şuan ki araçlar daha çok akademik araştırmacılar ve Ar&Ge çalışanları içindir. Kuantum programlamada şuan için 2 tip yaklaşım vardır. Bunlar imperative (Emir bazlı) ve functional (Fonksiyonel) programlama türleridir. Aslında şuan bildiğimiz yapıdan çokta farklı değildirler. Imperative dillere örnek vermek gerekirse; Java, C/C++ verebiliriz. Bir çok dilin fonksiyonel olarakta yazılabildiğini biliyorsunuzdur. Fakat piyasada sınırlı bulunan Quantum Computer’lar kendi compiler’ları üzerinde çalıştıklarından, kullandığınız sistem hangisi ise destekleyen bir dilde yazıp QC(Quantum Computer)’a göndermeniz gerekmektedir. Biz D-Wave System’in BlackBox’ı üzerinden gideceğiz. Aşağıda gördüğünüz resim BlackBox-One’ın 128-qubit’lik işlemcisidir. Henüz Qubit size yabancı geliyorsa, ve 128-Qubit’in ne kadar güclü bir yapı olduğunu öğrenmek istiyorsanız, şöyle bir karşılaştırma verebilirim; Bundan yıllar önce IBM ve MIT’in ortak geliştirdiği 7-Qubit’lik bir QC’nin gücü 128 paralel işlemcili bir super computer’dan daha yüksektir! Bu da demek oluyorsa RSA ile şifrelediğiniz ve güvenlidir dediğiniz yapılar çok kısa sürede kırılabilir. :) Sizi paranoyaklaştırmak istemem ama D-Wave’in BlackBox-Two ürünü 512-Qubit gücünde.

DWave_128chip

Şimdi Quantum programming üzerine biraz araştırma yaptıysanız QCL  ve LanQ terimlerini atlamadığınızdan emin olun. Çünkü örneklerimizin bir kısmını BlackBox için C ile vereceksekte genel olarak LanQ üzerinde Java ile duracağız.

Bu kadar çok Qubit’lerden bahsettikten sonra biraz da Qubit’ler ilgili bilgi verelim. Normal Pc’lerde bildiğiniz yapı 0 ve 1′ler üzerine kuruludur. QC’lar da ise 0,1 veya 0 ile 1 arasındaki bir değerini alabilir. Buna Quantum çakışması da diyebiliriz. Eğer daha önce verdiğim referanslara biraz göz gezdirdiyseniz QC’lardan elde edeceğiniz sonucun normal PC’lerde ki gibi tek olmayacağını anlamışsınızdır. Yani x64 veya x32 bir CPU üzerinde programlama yaparken bir karar kontrol mekanizması size sonuç olarak 0 veya 1 döner. QC’lar ise size O’a olan ihtimalleri ve 1′e olan ihtimalleri matris’ini döner. Şuan için kafa karıştırıcı ve/veya mantıksız gelebilir. Madem net bir sonuç dönmüyor o zaman nasıl programlama yapacağız? diyebilirsiniz. İlerleyen yazılarda hepsi kafanızda oturmuş olacağını umut ediyorum.

Basit bir tablo ile Qubit çakışmasını açıklayacak olursak;

1 Qubit Çifti => 4 Quantum çakışması durumunun her hangi birinde

3 Qubit         => 8 Quantum çakışması durumunun her hangi birinde olabilir.

D-wave system’in 512-Qubit BlackBox-Two ürünü için konuşacak olursak 2512 çakışmanın her hangi birinde olabilir. Normal PC’ler 2n durumunun sadece birinde olurken QC’lar hepsinde veya sadece bir kısmında olabilirler.

Peki bu kadar belirsizliğin olduğu bir ortamda nasıl sınırlı sonuç kümelerine erişeceğiz? Bunun için; QLG(Quantum Logic Gates) dediğimiz mantık kapıları ile yapacağız. Bu kapılara Quantum algoritması da denir. QLG ile ilgili ileride programlama kısmına geçtiğimizde daha somut örnekler vereceğiz fakat hemen bir şeyler öğrenmek isteyenler aşağıdaki dökümanı inceleyebilirler.

Kaynak 1: http://www.optics.rochester.edu/~stroud/presentations/muthukrishnan991/LogicGates.pdf

Ayrıca ilk implemente edilmiş dil olan QCL(Quantum Computation Language)’i incelemek isterseniz aşağıdaki kaynaktan faydalanabilirsiniz.

Kaynak 1: http://tph.tuwien.ac.at/~oemer/qcl.html (Yapısı C’ye benzemektedir)

QCL için biraz daha bilgi verecek olursak;

Aşağıdaki örnek qureg dedikleri Quantum Register’a bir örnektir.

qureg h1[3]  // h1, 3-qubit’lik bir register’dır.

qureg tr[2] // tr, 2-qubit’lik bir register’dır.

H(h1) // Matematikten bildiğimiz hadamard operasyonunu h1 için gerçekleştirir.

H(tr[1]) // Hadamard operasyonunu tr qubit register’ın daki 2. eleman için gerçekleştirir.

 

Yukarıda açıkladığımız gibi farklı dillerde mevcuttur fakat mantık olarak hepsi bir birine yakındır. Evet, tahmin ettiğiniz gibi şimdilik Quantum programlama dilleri ile Web Development yapamazsınız veya oyun geliştiremezsiniz. :) Web geliştirmek combo yapmanız gerekmektedir. :) Hem bir Interpreter ile dil’i işliyceksiniz hemde Interpreter, arkada kendi bir compiler yardımı ile QC üzerinde process’leri manage edecek. Şimdilik zor iş gibi geliyor bana ama olursa da en yakın Java’dan gelir gibi duruyor bu gelişmeler.

Ayrıca, Quantum Computer’lar şuan için çok astronomik rakamlara satıldığından eğer NASA, Pentagon veya Google’da çalışmıyorsanız bir QC görme ihtimaliniz çok düşüktür. Tahmin ettiğiniz gibi QC olmadan simulatör’ler üzerinden çalışacaksınız. D-Wave system Developer Portal için register işlemini durdurdu. Tekrar açtıklarında register olup daha geniş kaynaklara erişebilirsiniz fakat asla normal server mantığı ile düşünmeyin. Bana SSH v.s. verecekler kodu makine üzerine compile edicem falan hep hayal. :D Blacbox’a hiç bir şekilde erişme şansınız yok. Size sundukları tool’lar ile geliştirip compiler’dan geçiriyorsunuz. Daha sonra size sundukları program aracılığı ile kodlarınız gidip BlacBox üzerinde çalışıp size result set dönüyor.

LanQ üzerinde rastgele sayı üreten örnek bir kod örneği;

 /******************************************************************************
  A random number generator
 ******************************************************************************/

 /******************************************************************************
  Main method. From this method the program is run. A qubit is allocated (in
  maximally mixed state) and then measured in standard basis. The outcome is
  0 or 1 with 50/50 probability.
 ******************************************************************************/
int main() {
	qbit q;
	q = new qbit();
	return measure(StdBasis,q);
}

 

Bir sonraki yazıda BlackBox üzerinden örnekler ile ilerleyeceğiz.

Umarım, Quantum Computing adına Türkiye’de de bir şeyler yapabiliriz. En basitinden 2-Qubit’lik bir prototype bile yapsak mükemmel olur. ;)

Saygılar, Sevgiler…

Hakan

 

 

PHP – JQuery Tips&Tricks – JSON Parse İşlemindeki problem

29 May

Merhaba,

Eğer PHP ile gönderdiğiniz data’lar üzerinde JQuery ile çalışıyorsanız mutlaka JSON kullanmışsınızdır veya kullanacaksınızdır :) JQuery’nin $.parseJSON(); metodu bu iş için güzel bir çözüm. Size verdiğiniz JSON data’yı JS Object haline getirerek direkt property’lerine erişmenize olanak sağlıyor. Fakat PHP’nin json_encode() metodu Array’i encode ederken başına ve sonuna lanet iki tane char ekliyor.

Örn;

[{"name":"Zakan"}] gibi çıktı oluşturuyor. Sizde $.post() işleminden sonra geri dönen fonksiyonda JSON data’sını $.parseJSON()’na veriyorsunuz. O da null dönüyor veya undefined olarak property’lere erişemiyorsunuz. Jquery’nin sayfasında gayet güzel bir çözüm önermişler; http://api.jquery.com/jQuery.parseJSON/ buradan erişebilirsiniz. Türkçesi şöyle; Eğer parseJSON() metodu null, mal dönerse git kendin native olarak elle json.org’dan indir json2.js dosyasını uğraş.

Lafı fazla uzatmadan, Çözüm;

1. Tavsiyem PHP tarafında aşağıdaki şekilde convert edip JQuery’ye göndermeniz.

<?php
   $json_convert = substr(json_encode($sqlRST), 1, -1);
   print($json_convert);
?>

2. Ben native JS veya JQuery ile halletmek istiyorum diyorsanız text().substring(); metodunu kullanabilirsiniz.

Önümüzde ay yoğunluğum azalırsa daha sık bir şeyler karalamaya çalışacağım. Whatever! :)

İyi Çalışmalar.

 
1 Comment

Posted in AJAX, PHP

 

PHP Tips&Tricks – 2 dizideki ortak elemanları silme

07 Feb

Merhaba,

Kusura bakmayın daha önce belirttiğim nedenlerden dolayı şuan çok yoğunum ama zaman buldukça sorularınızı yanıtlayacağım. Bazı cevapları direkt buradan yazıyorum ki herkese faydalı olsun hemde Tips-Tricks arşivimiz olsun diye :)

 

Elimizde 2 tane dizi var diyelim X ve Y diye.  Yapmak istediğimiz; X’teki diziden Y’de olan elemanlar varsa silmek.

$X = array(1,2,3,4,5,6,7,8,9);

$Y = array(1,3,5,7,9);

Kullanabileceğiniz methodlar; array_search() / array_diff() / array_intersect()’dir.

Kısaca açıklayayım;

-> array_diff($X, $Y) derseniz size 2,4,6,8 döner.

-> array_intersect($X, $Y) derseniz de 1,3,5,7,9 döner.

Bunlar işimi görmedi derseniz bizim kullanacağımız method array_search() olacaktır.


<?php
$X = array(1,2,3,4,5,6,7,8,9);
$Y = array(1,3,5,7,9);

if(is_array($X)){
   foreach($X as $k => $v){
    // X'in içinteki item'ları git tek tek Y dizinin içinde ara diyoruz.
    $existItem = array_search($v, $Y);
    
    // Eğer bulursan o elemanı sil diyoruz
    if($existItem !== FALSE){
      unset($Y[$existItem]);
    } 
  }
  print_r($Y); # 2,4,6,8 dönmesi gerek
}
?>

array_search() metodunda extra dikkat etmeniz gereken nokta != veya == kullanmayın! Dizi index’i 0 veya 1 dönebilir. Bildiğiniz gibi IF kontrolü default olarak bool kontrol yapmaktadır ve IF için 0 => FALSE, 1+ => TRUE demek oluyor :) Bu nedenle algoritmanız yanlış çalışır.

Hala bitiremedim Android makalelerini, biliyorum bıktınız artık beklemekten ama :) en kısa sürede yayınlıycam.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

LiteSpeed Web Server – SSS(FQA)

30 Jan

Merhaba,

Elimdeki projeyi release etme sürecinde olduğumdan, ekip olarak yoğun bir zamandayız. Bu nedenle pek yazamıyorum. Internette çok aranan ve basit olmasına rağmen can sıkan soruların cevaplarını paylaşacağım.

LiteSpeed Web Server’ı biliyorsunuzdur. Apache’den 2 kat hızlı bir yapıya sahip, ücretli bir web sunucusudur. Şimdi gelelim sorulara;

  •   LiteSpeed ile hangi caching mekanizmasını kullanmam gerekiyor.

LiteSpeed entegre caching mekanizması ile geldiğinden extra bir caching sistemi kullanmanıza gerek yoktur. Eğer session clustering v.s. tarzı bir senoryonuz varsa LiteSpeed Load Balancer’ı kullanabilir yada DB üzerinde tutarak, DB’yi cluster yapıda çalıştırabilirsiniz. İllede kullanıcam diyosanız memcache’i derleyebilirsiniz.

  • Apache’de /var/www/ path’in den ulaşıyoduk. Nerede bu root www path’i ?

Apache’de ki config bilgilerinizi LiteSpeed’e import etme şansınız varsada path’i default olarak /usr/local/lsws/DEFAULT/html şeklinde gelmektedir. Ne alaka değil mi /usr/local path’i? :)

  • Nasıl restart edicem?

Tavsiyem WMC’den restart etmeniz. (Web Manageement Console) LiteSpeed kurulduğunda size yönetimi ve istatistik gibi bilgileri sunan bir web paneli ile gelmektedir.

  • LiteSpeed WMC default portu nedir?

Default WMC portu 7080′dir. Fakat değiştirmenizi tavsiye ediyorum. Güvenlik için önemli. Hatta bir adım ileri gidip WMC’nin çalıştığı path’e IP sınırı koyarsanız çok daha iyi olur.

  • LiteSpeed ne zaman işime yarar?

Bu sorunun tek bir doğru cevabı yok ama genel olarak Enterprise level web applications için uygundur. Para kazanmıyorsan veya kazanma ihtimalin düşük ise neden her ay veya yıllık lisans ücreti ödeyesin?

  • Kendi web server’ımı kendim yaptım, tek başıma kendim kullandım demek istiyorum?

O zaman Python ve C/C++ öğrenmenin vakti gelmiştir. Kolay gelsin :)

Şimdilik aktaracaklarım bu kadar, iyi çalışmalar.

 
No Comments

Posted in Sistem

 

LUG Türkiye 2012 Tanışma Toplantısı

10 Jan

Linux Foundation

 

 

 

 

 

Merhaba,

Linux User Group(LUG) tanışma toplantısına katılmak isteyen kimler var? Türkiye’deki Açık Kaynak topluluğunu bir araya getirmek istediğimden söz etmiştim. Avrupa’da ve Amerika’da artık oturmuş olan Linux ve Open Source grupları, Türkiye’de malesef henüz bir araya gelememiştir.

Toplantının Amacı; Türkiye’deki Linux kullanıcılarını ve Open Source uygulama geliştiren kişileri bir araya toplamak. Eğitim ve Destek, Proje gibi grupları oluşturmak.
Toplantı Tarihi: 15/01/2012 – Pazar / Saat: 14:00 – 18:00 arası.
Yer: Istanbul, Beşiktaş / Starbucks (Tanışma toplantısı olduğundan, sıcak geçmesi ve kaynaşmamız için Starbucks’ı seçtim.)

Bir sonraki toplantı için eğer yeterli katılım sayısına ulaşabilirsek, güzel bir seminer solununda yapmayı planlıyorum.

Genel Konular;

* Tanışma, kaynaşma
* Linux
** Linux Dağıtımları
—> Pardus, Ubuntu, Fedora, Mint
—> Debian, RedHat, FreeBSD
** Linus Torvalds kimdir?
** Linux Türkiye ve Open Source Faaliyetleri/Grupları (LKD, Mozilla, Ubuntu, TBD v.b. gibi…)

* Web/DB Programlama Genel
* Cloud Nedir?
* Clustering ve Fail Over senoryaları nedir?
* GPU nedir? CPU’dan farkı nedir? Uygulama alanları nelerdir?
* Türkiye’de Open Source ve IT üzerine kariyer.
* Yeni başlayacaklara ve mezunlara öneriler.

Elimden geldiğinde teknik konulara derinlemesine girmeyeceğim, çünkü yukarıdaki konuların her biri, bir seminer konusu olabilecek düzeydedir. 

Bu toplantı kimlere uygun?
Herkesin katılımına açıktır fakat faydalı ve eğlenceli bir toplantı olmasını istediğimizden sektördeki veya sektöre girmek isteyen kişiler, IT alanındaki öğrenciler tercihimizdir.

Neden gelmeliyim? Evde oturup TV izlesem veya PC’de oyun oynasam daha iyi olmaz mı?
=> Eğer IT alanı ile ilgili değilsen daha iyi olur, ne kendini ne de bizi yor. 
Gelirsen, kendini geliştirmiş ve belkide işine/projene yarayacak bağlantılar kurabilirsin. Gelmezsen, Modern Warfare 3′de 1 level daha geçebilirsin, tabi sektördeki rakiplerinde senden 1 level yukarı olacaklar. 

O gün Maya takvimine göre lanetli bir gün veya o gün sevgilimden ayrılıcam başka gün yapsanız?
=> Malesef, programım çok yoğun olduğundan bir sonraki toplantı büyük ihtimalle en erken 1 ay sonra olabilir.  exit;

Nasıl katılacağım peki? Kayıt gerekiyor mu ?
=> Evet, bir ön kayıt gerekmektedir. Nedeni; Sturbucks ile ona göre görüşeceğim, kimsenin ayakta veya dışarıda kalmasını istemem. Tanışma toplantısı olduğundan Linux üzerinden bir davetiye oluşturup oradan kayıtlarınızı almadım. Bir sonraki toplantıda umarım yeterli sayıya ulaşırız ve güzel bir seminer düzenleriz.
Kayıt için; Ad&Soyad – Cep Telefonunuzu [email protected] adresine göndermeniz yeterlidir.
Örn: Adriana Lima – 001 425 555 55 55 gibi 

En geç Cumartesi gününe kadar bilgi verirseniz ona göre bende organizasyonu ayarlayacağım.

Görüşmek üzere,

Hakan Damar – LUG Manager

 
No Comments

Posted in Genel

 

CodeIgniter Cookie Delete Problemi – Tips&Tricks

10 Jan

CodeIgniter Framework

 

 

 

Merhaba,

Proje döneminde olduğumuzdan uzun süredir üzerinde çalıştığım Android makalelerimi bitiremedim hala :) En kısa sürede tamamlıycam. Şimdi konumuza dönersek, CodeIgniter üzerinde Cookie’ler çalışmıyor v.s. gibi emailler alıyorum.

Dikkat etmeniz gerekenler;

  • Secure Cookie’mi oluşturdunuz? (secure = TRUE)
  • Path’ini farklı mı verdiniz? ( / şeklinde mi?)
  • domain’in başına nokta koydunuz mu? (Örn: .hakandamar.com) şeklinde.
  • expire değerini mutlaka integer(INT) vermelisiniz. (Örn: 86400 * 4 // 2 Haftalık Cookie)
  • prefix vermişseniz direkt verdiğiniz name değeri ile değil prefix+name değeri ile handle etmeniz gerekiyor.
  • delete_cookie() methodu ile silemiyorsanız diğer parametrelerinide vermeyi deneyiniz. (Örn: delete_cookie(“ck_fooBar”, “.hakandamar.com”, “/”) şeklinde)

Son olarak CI document’te pek detaylı açıklamadığından $this->input->delete_cookie() şeklinde kodlar geliyor. INPUT modelinde delete_cookie() methodu yok. Direkt delete_cookie() şeklinde kullanmanız gerekmektedir.

Nedir şu CodeIgniter’dan çektiğimiz? :)

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

PHP & MySQL Tek Alanda Çoklu Veri Tutma – Tips&Tricks

06 Dec

Merhaba,

Başlıktanda anlayacağınız üzere bir data’nın birden çok özelliği olabilir ve bazı ID’ler ile eşizleştirilmeside gerekebilir. Nasıl yani?

Örneğin; Bir e-ticaret sistemi geliştirdiğinizi düşünün bir ürünün renk, boyut gibi özellikleri var ve bu özellikler her ürün için birden fazla olabilir. Örneğin;

* Product 1 -> Red,Blue,Green – XL,L,M,S (Tabii bu değerler sınırlı değil yarın bir gün Yellow ve XXL gibi yeni değerlerde gelebilir.)

Şimdi yukarıdaki Red,Blue,Green ve XL,L,M,S’i MySQL’deki tek bir row’da tutmak istersek bunları aralarına virgül koyup, REGEX gibi yollarla parçalayarak işlemek hataya açık şekilde tutmaktır. Her özellik için bir alan oluşturup bunlara 0 ve 1 gibi değerler ile tutmakta mantıklı değil. Çünkü yukarıda parantez içinde belirttiğim gibi yeni özellikler geldiğinde tabloyu düzenlemeniz gerekmektedir ve bir sınırıda yoktur. Yani 50 tane de olabilir bu özellikler.

Biz ise, PHP’de serialize edip bu şekilde tutacağız. Hatta bir adım ileri gidip sadece Key’leri değil bu Key’lere Value’lar verip ikisini birden işleyeceğiz.

Elimizdeki değerler;

* Product 1 Properties;

  • Red -> 20
  • Green -> 62
  • Blue -> 14
  • XL  -> 52
  • L -> 75
  • M -> 318
  • S -> 98
Şimdi bu özellikleri ve değerlerini; Özellik -> Adet şeklinde düşünelim. Hemen PHP tarafına geçiyoruz.
$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

Şimdi array haline getirdiğimiz değerlerimizi serialize edip bir de bu haldeki çıktılarına bakalım.

  // Yukarıdaki kodların altına ekliyoruz
print(serialize($productColorArr)); 
# a:3:{s:3:"Red";i:20;s:5:"Green";i:62;s:4:"Blue";i:14;}
print("\n\r");
print(serialize($productSizeArr)); 
# a:4:{s:2:"XL";i:52;s:1:"L";i:75;s:1:"M";i:318;s:1:"S";i:98;}

Bu kodun çıktıları yanlarına eklediğim gibi olması gerekiyor. Bu işlemden sonra DB’ye insert edebiliriz. SELECT ettiğimizde UNSERIALIZE etmemiz gerekmektedir. Nasıl?


$productColorArr = array(
 "Red" => 20,
 "Green" => 62,
 "Blue" => 14
 );

$productSizeArr = array(
 "XL" => 52,
 "L" => 75,
 "M" => 318,
 "S" => 98
 );

 $srz_ProductColorArr = serialize($productColorArr);
 $srz_ProductSizeArr = serialize($productSizeArr);

 print_r(unserialize($srz_ProductColorArr));
 print("\n\r");

print_r(unserialize($srz_ProductSizeArr));

Buraya kadar güzel, peki bunları veri tabanında ne şekilde tutucaz? Bu değerleri tutacağımız color ve size adında 2 tane alanımız olsun bunların veri türü TEXT olsun. Bunların INSERT ve SELECT ettirme kısmını zaten biliyorsunuz. Peki, içlerinden bazı değerleri çıkartma veya bir key’in value’nu nasıl değiştireceğiz? İçinden çıkartmak istedikleriniz varsa aşağıdaki şekilde filtreleyebilirsiniz.


/* unserialize ettiğimiz data bize Array döndüğünden bu noktadan sonra

Array'ler üzerinde execute edebildiğimiz tüm kodları çalıştırabiliriz.

*/
<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);
		
$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);
		
$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);
		
$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
# Dizi içinde Red ve Blue olan key'leri filtreledik.
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

print_r($filteredColor); # Green yazması gerek sadece. 
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Bir diğer senaryo; $productSizeArr ‘deki M key’nin değerini 18 eksiltmek istersek.

<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);
		
$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);
		
$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);
		
$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
		
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));
		
if(array_key_exists("M", $usrz_ProductSizeArr)){
	$usrz_ProductSizeArr["M"] -= 18;
	array_values($usrz_ProductSizeArr);
}
		
print_r($filteredColor);
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Kodumuzun son hali yukarıdaki şekildedir. Böylece, unserialize edilmiş data üzerinde nasıl işlem yapabileceğimizide gördük.

Son bir trick olarak array_merge() methoduna bakmanızı öneririm. İki array’i birleştirerek tek bir dizi haline getirmektedir. İşinize yarabilir.

print(“İyi Çalışmalar”);

:)

 
1 Comment

Posted in MySQL, PHP

 

WP Auto Update Tips&Tricks

31 Oct

Merhaba,

Bu bölümde IT alanındaki kısa ip uçları ve hileleri paylaşacağım :)

Yaygın olarak kullanılan WordPress’te bir çok kişinin başına gelen otomatik güncelleme sorununa değineceğiz.

   Sorun: WP’i veya plugin’lerini güncellerken sizi FTP ile manuel güncelleme ekranına yönlendirmesi.

  Çözüm:  Web sitenizin bulunduğu dizine “chown -R www-data ./siteadi.com” şeklinde haklarını değiştirin ve “chmod 777 ./wp-content” ile okuma-yazma-çalışma hakkı verin.

Daha sonra tüm güncelleme işlemlerinizi tek tıklama ile yapabilirsiniz.

İyi Çalışmalar.

 
No Comments

Posted in Sistem

 

CodeIgniter – Memcache Object

28 Oct

Merhaba,

Memcache hakkında çok fazla detaya inmeyeceğim, zaten konumuzda direkt olarak Memcache Server değil. Özetle Memcache server, web uygulamalarında minimum seviyede I/O’ya touch etmek için, key:value şeklinde dictionary tarzın da çalışan bir caching server’dır. I/O’dan kastım HDD’dir. Peki I/O’ya touch etmiyorsa nereye yazıyor? Tahmin ettiğiniz gibi memory’ye yazmaktadır. Kurulum, konfigürasyon ve detaylı bilgi için biraz arama motorlarını kullanmanız gerekecek.

Araştırmaya buradan başlayabilirsiniz.

CodeIgniter üzerinde eğer sizde Memcached driver’nı kullanıp sinir olanlardansanız. Memcache kurup ekteki dosyayı application/libraries altına atarak kullanabilirsiniz. :)

Class’ın yapısı driver interface’i ile uyumludur, ilk driver olarak geliştirdim fakat sonra load problemi çıkarttığını gördüğümden library olarak ekledim. Siz “extends CI_Driver” diyerek Driver olarakta kullanabilirsiniz.

   Dosya yapısı: application/libraries/MEMCACHE

   Dosya adı: cacheserver.php

   Methodları ve açıklamaları;

public function __construct() - Memcache object’si create ediliyor ve başarılı bir şekilde oluşturulamazsa Exception fırlatıyor :)

public function get($id)Daha önceden cache’lediğiniz datayı geri döner.

public function save($id, $data, $ttl = 90, $flag = MEMCACHE_COMPRESSED)Yeni bir datayı cache’lemenizi sağlar.

public function delete($id)Mevcut bir data’yı cache memory’den silmenizi sağlar.

public function replace($id, $data, $ttl = 90, $flag = MEMCACHE_COMPRESSED)Mevcut bir datayı değiştirmenize yarar.

public function clean()Tüm cache memory’yi boşaltmaya yarar. *Dikkat ediniz!

public function cache_info($type = NULL)Cache’lenen datalar ile ilgili istatikleri ve bilgileri geri döner.

public function get_metadata($id)Bu method henüz kullanmadığından içini doldurmadım. Sürekli FALSE döner. :)

public function is_supported()Sisteminizde Memcache eklentisinin kurulu olup olmadığını check eder ve bool geri döner.

Basit bir örnek;

Kendi Controller’nız içerisinde $this->load->library(“MEMCACHE/CacheServer”, NULL, “CacheServer”); şeklinde object’i call edebilirsiniz.

    $fooString = "Bu cache'lenecek bir veridir!";
    if(!$this->CacheServer->get("c_fooStr")){
       $this->CacheServer->save("c_fooStr", $fooString, 5);
       print("Cache'lendi!");
    }else{
       print($this->CacheServer->get("c_fooStr");
       print("Zaten Cache'teydi!");
    }

Yukarıdaki kod 5 saniye boyunca $fooString değişkenini cache’leyecektir. Diğer methodlarıda siz deneyerek test edebilirsiniz. :)

Download Link: http://www.hakandamar.com/down/CI_MEMCACHE_DRIVER.rar

İyi Çalışmalar.

 
2 Comments

Posted in PHP

 

PHP Printing With LPR

13 Apr

Merhaba,

Son zamanlardaki yoğunluğumdan malesef pek makale yazacak zaman bulamıyorum. :) İnternette çok geyiği dönenen ve olmayacağına dair üzerinde sayfalarca tartışılan bir işlemi gerçekleştiricez şimdi. :)

Normalde sizinde bildiğiniz gibi PHP, ASP, Python v.s. gibi diller server-side çalışan ve bir interpreter’a ve/veya compiler’a bağlı olan dillerdir. Hal böyle oluncada O/S’a müdahelede kısıtlı oluyor. Sanırım PHP’yi geliştiren ekip bunuda düşünerek server üzerinde konsoldan komut çalıştırır gibi komut çalıştırabileceğimiz system(), exec() gibi bazı method’lar hazırlamışlar.

Bu makalenin konusu olan LPR(Line Printer Remote) protokolü de ismi üzerinde Line printing işlemi için hazırlanmış. Yani  komut satırından kod çalıştırarak yazıcılarımızı yönetebiliyoruz.
Madem PHP ile komut satırında kod çalıştırabiliyoruz ve LPR denen bir protokolde bize komut satırından yazıcıları yönetmemize izin veriyor. O zaman PHP ile direkt yazıcıdan çıktı alırız diyebiliriz. Hatta bir adım öteye giderek printer failover senoryalarına karşı object’ler yazıp CRON’lar ile sistemi otomatize edebiliriz, ki bu senoryayu ben daha önce gerçeklemiştim.

Windows tarafında Turn Windows features on or off(Windows Özelliklerini Aç veya Kapat) seçeneklerinden Print and Document Services(Yazdırma ve Döküman Servisleri) kısmından aşağıdaki servislerin yanındaki check işaretini checked yapmanız gerekiyor.

  • LPD Print Service
  • LPR Port Monitor

Linux (Ubuntu, Debian etc.) kısmı içinde aşağıdaki şekilde LPR’ı kurabilirsiniz.

sudo apt-get install lpr

Kurulum yaptıktan sonra ikisininde help dökümantasyonundan basitçe parametre sistemini çözebilirsiniz. Örneğin; Windows tarafı için bakarsak aşağıdaki şekilde bir ekran çıktısı olması gerekmektedir.

Windows 7 LPR CMD

Windows 7 x64 Enterprise Edition ENG kullanıyorum ve problemsiz çalışıyor.

Tabii Windows üzerinde LPR kurduğumuzda direkt çalışmıyor, virtual LPR printer oluşturup eklememiz gerekiyor. Bunun için internette bir sürü kaynak var fakat sizi uğraştırmak istemiyorum. :) Makale bütünlüğünü korumak adına aşağıda stepleri takip ederek kurabilirsiniz. Farklı bir kaynak istersenizde TechNET’teki şu link’e bakabilirsiniz: http://technet.microsoft.com/en-us/library/cc732063.aspx

Start->Control Panel->System and Security->Administrative Tools–|>Printer Management ‘a ulaştığımızda, Sol taraftaki menu list’ten Print Servers’ın altında kendi PC-Adınız’ı açın ve Ports kısmına tıklayın. Karşınıza aşağıdaki bir sayfa gelicek burada sağ tıklayıp Add Port demeniz gerekmektedir.

Windows 7 LPR Port

Bu aşamadan sonra karşınıza aşağıdaki gibi bir pencere çıkacak ve LPR Port’u seçip New Port demelisiniz. İlk alana IP’yi ikinci alana yazıcı kuyruk adını girmelisiniz.

Windows 7 LPR New Port

Bu aşamadan sonra Start->Devices and Printers kısmından yazıcılarınıza basit isimler vermelisiniz. Örneğin HP X1230 ML Express gibi bir isim varsa bunun yerine sadece HP veya HP1230 yazmanız komut satırından ulaşırken hata yapma şansınızı azaltacaktır.

Daha sonra yine sol taraftaki menüden Printers’ı seçip açılan sayfada boş bir yere sağ tıklayıp Add Printer dediğimizde karşımıza gelen pencereden Add a new printer using an existing port’u seçip sağ tarafındaki selectbox’tan daha önce oluşturduğumuz 10.70.1.99:queue1 portunu seçip Next diyelim. Daha sonra bu porttan erişeceği printer’ın driver’nı soracaktır. Bir sonraki adımda sizden yazıcı adını soracaktır, bu isme basit bir isim koymanızı öneririm. Çünkü komut satırına bu adı yazacağız.  Next/Next diyerek işlemleri bitirelim.

Şimdi Windows üzerinde Virtual LPR portu üzerinden erişilebilen bir yazıcımız oldu. Şimdi komut satırından LPR ile yazıcıya birşeyler gönderip test edelim. Yeni sanal yazıcı eklersen XEROX yazdığınızı varsayarsak komutunuz aşağıdaki şekilde olması gerekmektedir.

lpr -S 10.70.1.99 -P XEROX -d “Hello World”

Bu komut yazıcıya tahmin ettiğiniz gibi Hello World yazdırtacaktır. Bunun yerine bir hello_world.txt ‘de verebilirdik. O zamanda tahmin ettiğiniz gibi bu dosyanın içeriğini yazardı. Dosya ismi verirken o Path’te olduğunuza veya tam path yazdığınıza dikkat ediniz.

Şimdi sıra geldi sora PHP’den bu işlemi nasıl yapacağımıza;

Örnek senorya için fatura bastırmanız gerektiğini varsayalım. Eğer faturaların file şeklinde kayıtlı durmasını isterseniz ki önermiyorum, o zaman /invoice diye bir dizine pdf etc. tarzında kaydettikten sonra Fatura bastır dendiğinde tahmin ettiğiniz gibi system() veya exec() method’ları ile yukarıdaki LPR komutunu dinamik oluşturup gönderebilirsiniz. Komutun sonunda bulunan “Hello World” yerine $invoicePath gibi içerisinde faturanın full path’nin tutulduğu bir değişken gelmesi gerekmektedir.

Diğer bir durumda temp dizininde oluşturup yazdırma işlemi sonrası silmek en iyisi bence. Bunun içinde PHP’deki tempnam() methodunu kullanmamız gerekmektedir.

 <?php
        $invoice  = "Faturanın bilgileri/full path bu değişkende olacak.";
        $tmpFile = tempnam(sys_get_temp_dir(), "invoice_");
        system("lpr -S 10.70.1.99 -P XEROX -d $invoice", $returnArgs);
        unlink($tmpFile);
 ?>

Eğer HDD’e faturayı bastırmak istiyorsanızda 2. satırdaki $tmpFile’dan sonra fopen(), fwrite() ile dosyayı yazıp daha sonra dosyayı oluşturduğunuz path’ı system’deki LPR string’ne verip işlemi tamamlayabilirsiniz. Fakat bu seçenekte unlink() methodunu yorum satırına almayı veya kaldırmayı unutmayınız.

Çok fazla zamanım olmadığından fazla detaya inemedim bu makalede, ilk zaman bulduğumda güncelleyip. Cluster Printing, Failover etc kısımlarınıda nasıl gerçekleyeceğinizi açıklamaya çalışacağım.

İyi Çalışmalar.

 
1 Comment

Posted in PHP