RSS
 

Author Archive

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.

 
1 Comment

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

 

Debian BackUP Sistemi Kurma

12 Jan

Merhaba,

Her ne kadar bir sistem uzmanı olmasamda zaman, zaman network ile uğraşmam gerekebiliyor. :) Şimdi biraz Bash Script birazda Duplicity ile nasıl server’larınızın backup’nı uzaktaki bir server’a şifreleyerek FTP üzerinden backup alabileceğinizi, anlatmaya çalışacağım.

Örnek bir senaryo üzerinden gidecek olursak;

3 tane application server’nız ve 1 tanede backup server’nız olsun. Önce backup için kullanacağımız debian yüklü server’a root hakkı olan bir hesap ile ssh’dan bağlanarak aşağıdaki komutları çalıştıralım. Backup server’a ProFTPd gibi bir FTP server kurmayı unutmayınız.

apt-get install duplicity

Yukarıdaki kod Debian Server’nız üzerine duplicity kurar. FTP üzerinden işlem yapacağımzıdan NcFTP’ye de ihtiyacımız vardır. Onuda hemen aşağıdaki komut ile yükleyebilirsiniz.

apt-get install ncftp

Bu işlemlerin ardından /root veya /home altında mkdir komutu ile backup klasörü oluşturalım ve chmod 777 backup/ ile okuma+yazma+çalıştırma hakkı verelim.

Duplicity ve NcFTP’yi diğer makinelerimizede kuralım ve ardından aşağıda kodlarını verdiğim Bash Script’i backuper.sh adında backup klasörünün içinde oluşturalım.

#!/bin/bash
clear
echo
echo “Backuper v0.7 | Auto Backup Systems”
echo

echo “Merhaba, $USER”
echo

echo “Yedekleme işlemi başlatıldı…”
echo

FTP_PASSWORD=****** duplicity full /var/www ftp://[email protected]

echo “Yedekleme işleminiz başarıyla tamamlanmıştır.”
echo

echo “Yedeklendigi yer: 10.10.10.10 IP’li sunucunun /root/backup/2011 dizinidir.”
echo

echo “Powered by INTER Network Corporation”

Şimdi bu kodu direkt copy-paste ile doğru bir şekilde çalıştıramazsınız. Düzenlememiz gereken alanlar aşağıdaki gibidir.

****** alanı yerine Backup Server’daki backup ftp kullanıcısının şifresi.

backuper yazan yer yerine backup server’daki backup ftp kullanıcısının adı ve @’den sonrada sunucu IP’si gelmesi gerekmektedir.

Örneğin:

Kullanıcı Adı: backuper

Şifre: @bR@0934097sadL

IP: 10.20.30.40 olan bir yapıda duplicity string’niz aşağıdaki şekilde olması gerekmektedir.

FTP_PASSWORD=@bR@0934097sadL duplicity full /var/www ftp://[email protected]

Dikkat ettiyseniz /var/www gibi bir path tanımlaması var ve bu kısımda tahmin ettiğiniz gibi backup almak istediğiniz dizini belirtmeniz gereken kısımdır.

Şimdi bu aşamadan sonra backup alanacak olan server’dan birine login olup /root/backup veya hangi dizini ayarladıysanız o dizine girerek.

sh ./backuper.sh demeniz yeterli olacaktır. Script çalıştığında size şifreleme ve senkronizasyon kontrolü için bir şifre soracaktır. Daha doğrusu ayrıştırma bilgisi. Gireceğiniz bu datanın her backup alacağınız makine için farklı olmasına dikkat edin ve eğer uzun ve karmaşık ise lütfen not ediniz.

İleride geri backup dönmek istediğiniz zaman şifreli datayı açmak için veya bir sonraki gün yeni backup’ı alırken senkronize edip yeni gelen dataları alabilmesi için bu şifreye ihtiyaç duyacaksınız.

Başta söylediğim 3 makine içinde bu script’i koplayalıp aynı şekilde çalıştırınız. Ben backup klasöründe 2011 – 2012 – 2013 diye klasörleme yaptım. Eğer sizin backup alacağınız makine sayısı fazla değilse sadece backup klasörünü kullanabilirsiniz.

Eğer tüm adımları başarılı bir şekilde tamamladıysanız, backup işlemi sonrasında backup server’ın /root/backup klasöründe aşağıdaki gibi encrypt edilmiş dosyalar görmeniz gerekmektedir.

Unutmayın: Her makine için farklı şifre (passphrase) girmeyi unutmayın. Her server’da aynı passphrase kullanırsanız script’i en son çalıştırdığınız server’ın backup’ı bir öncekinin üzerine yazar. Böylece siz bir sürü backup dosyası beklerlerken 1 tane görürsünüz ve data kayıpları ile karşılaşabilirsiniz.

İyi Çalışmalar.

 
No Comments

Posted in Sistem

 

Java Programlama Diline Giriş

27 Nov

Merhaba,

Bu makalede güçlü programlama dillerinden Java’ya giriş yapacağız. (Aynı zamanda bence en iyi OOP ve AOP programlama dilidir.)  Tabii ki Java dili ile uğraşmaya başlamadan, bu alana özgü bazı terimler var. Bunları öğrenerek ilerlersek ileride mantık kurmada zorlanmayız. Nedir bu terimler?

  • JDK (Java Development Kit / Java Geliştirme Kiti)
  • JRE (Java Runtime Environment / Java Çalışma Ortamı)
  • JVM (Java Virtual Machine / Java Sanal Makinesi)
  • J2SE, J2ME, J2EE

JDK Nedir?

Yazdığımız kodların derleyip, çalıştırmaya yarayan ve bir takım kütüphaneleri içeren bir program paketidir. 2002 yılında Java2′nin çıkması ile Sun Microsystems Java’yı farklı alt gruplara ayırarak dahada güçlendirmeye ve her alanda uzmanlaşarak büyümeyi hedefledi ve bunuda başardı. Bu gruplama aşağıdaki şekilde oldu;

  • J2SE (Standart Edition): Desktop, Network ve temel düzeyde Database işlemlerimizi yapmamızı sağlayan sınıfların bulunduğu sürümüdür.
  • J2ME (Mobile Edition): Bu sürüm cep telefonları ve kısıtlı kaynaklara sahip mikro mimariler üzerinde uygulama geliştirmemize yardımcı olan sınıfları içeren sürümüdür.
  • J2EE (Enterprise Edition): Multi-Layer Commercial Web Server Application geliştirmemiz için olan sürümüdür.

JRE Nedir?

Daha önce Microsoft teknolojilerini kullanarak uygulama geliştirdiyseniz JRE’yi .NET Framework gibi düşünebilirsiniz. Örneğin: .NET FW 4 ile geliştirdiğiniz bir C# uygulamasının çalışabilmesi için PC’nizde .NET FW 4.0′ın yüklü olması gerektiği gibi Java içinde JRE’nin yüklü olması gerekmektedir. JRE ana görevi olarak Java programlarını çalıştırmakla görevlidir. JRE, JDK gibi kod derleyemez veya debug yapamaz. JRE’nin tek görevi kodları çalıştırır ve runtime’da uygulamanın ihtiyaç duyduğu java class’larını sağlar. JRE ve JDK ikileminde dikkat edilmesi gereken nokta; JDK 1.4 ile geliştirilmiş bir program JRE 1.3 ile çalışmayacak ama JDK 1.5 ile yazdığınız bir program JRE 1.6 ile çalışacaktır. Buradan anlaşıldığı üzere JRE’nin geriye yönelik desteğini vardır fakat JDK’nın geriye dönük desteği bulunmamaktadır. Eğer makinenizde JDK yüklü ise ekstradan bir de JRE yüklemenize gerek yoktur. JDK tam bir kit olduğundan içerisinde uygun JRE(ler)’i barındırır.

JVM Nedir?

Java’nın en güçlü yanlarından birini JVM oluşturur. Belki internette araştırma yaparken karşılaşmışsınızdır. Java kodu 1 kez yazılır ve her ortamda çalışır. İşte Java’daki bu esnek kod taşınabilirliği sağlayan JVM’dir. JVM’in görevi Java App.’larınızı derledikten(Compile) sonra bytecode’ları yorumlayıp(Interpretation) binary code’a çevirilmesini sağlayan bileşendir. Sizinde tahmin ettiğiniz gibi gibi tabii ki bu işlemi yaparken üzerinde çalıştığı CPU mimarisine uygun şekilde dönüştürmektedir. Daha öncede bahsettiğim gibi JDK tam bir kittir bu nedenle JVM’de içerisinde gelmektedir.

Microsoft tarafında daha önce geliştirme yaptıysanız bunu C#.NET’ten örnekleyelim; .NET’te nasıl kodlar derlendiğinde bir ara dile yani IL’e çevrilip daha sonra makine diline dönüştürülüyorsa Java’da da bytecode’a dönüştürülür ve bu bytecode JVM içindir. Kısacası Java’daki ByteCode = .NET’teki IL (Intermediate Language)’dir. Bu nedenle .NET dillerinden her hangi biri ile yazılmış bir object diğer bir .NET dilinde de kullanılabilir. Neyse yeterince Microsoft hakkında konuştuk, tekrar Java dünyasına dönelim.  JVM compile edip bytecode haline çevrilmiş kodları, üzerinde çalıştırılacak OS için compile ederken JRE’ye başvurarak gerekli class’ları ister ve bu sayede o işletim sistemine özgün kodu oluşturup programı çalıştırır.

Java programlamaya başlamadan önce bilinmesi gereken en temel kavramları yukarıda öğrendik. Şimdi biraz Java dilinden bahsedelim. Java diğer programlama dilleri gibi sizi sabit 1/2 seçeneğe zorlayarak uygulama geliştirmeye yönlendirmez. Bunun yerine farklı bir çok Framework ve Web Server kullanarak istediğiniz gibi geliştirme özgürlüğü sunar. Örneğin bir .NET programcısı iseniz web programlama yapmak isteseniz PHP veya Python kullanmak yerine ASP.NET’i tercih edeceğinizi biliyorum. :) Bu nedenlede hemen size sadece IIS üzerinde çalışabileceğinizi hatırlatmak isterim. Java’da ise ücretli veya ücretsiz isteğinize ve gerekliliğe göre seçebileceğiniz bir çok web server bulunmaktadır. Bunun yanında yine Microsoft tarafında WPF uygulamaları için mutlaka XAML kullanmanız gerekiyor JSON ile geliştireyim veya daha kolay farklı bir çözümü yok mu? gibi bir soru, eğer uzun süredir Microsoft teknolojileri ile çalışıyorsanız aklınıza gelmemesi büyük ihtimalle normaldir. :)

Hep Microsoft’tan örnek verdim beni MS düşmanı sanmayın sadece bariz gerçekleri yüksek sesle düşündüm. :) Yoksa MS’i seviyoruz tabii, teknolojinin ve bir çok sektörün gelişmesinde varlığı bile yeterli oluyor. :)

Bu aşamadan sonra size JDK kurmayı ve basic ayarları göstermem gerek fakat bunlara internet üzerinde 1001 farklı kaynaktan erişebilirsiniz hemen hemen bir çok kişi zaten giriş ve kurulum ile ilgili bir şeyler yazıyorlar önemli olanın bundan sonrası olduğunu düşünerek bu kısmı internetten farklı kaynaklardan araştırmanızı rica ediyorum. Maximum 15dk’nızı alacak bir konudu ve işlemdir.

Kurulumu yaptığınızı varsayarak devam ediyorum ve bu aşamadan sonra aklınıza gelen ilk soruyu hemen yanıtlayayım.

- Tamam temel bilgiyi öğrendik, JDK’da kurduk. Şimdi nerde yazıcaz Java kodlarını?

Bunun için ücretli ve ücretsiz bir çok seçeneğiniz var fakat piyasada en çok rabet gören ve kaliteli olarak nitelendirilen benimde incelediğim 3 adet IDE var.

  1. Eclipse
  2. JBuilder
  3. Netbeans

Ben  evde Netbeans, işte Eclipse kullanıyorum fakat size hangisi daha uygun gelirse onu tercih edebilirsiniz. Yazdıklarımın hepsi ücretsizdir.

Şimdi hemen bir Hello World uygulaması yazarak ilk programımızı hazırlayalım. IDE’lerinizden File->New Project->Java Application seçeneğini veya benzerini bularak Create derseniz aynı ekrana sizlerde ulaşabilirsiniz.

 public class helloWorld{
  public static void main(Strings[] args){
    System.out.println("Hello Java World");
 }
}

Bu programı run ettiğinizde çıktısı tahmin ettiğiniz gibi “Hello Java World” olacaktır.

Başlangıç konuları az kod çok yazı olduğundan devamını birleştirerek okumadan önce 2 kere düşüneceğiniz uzunlukta makaleler yazarak sizleri sıkmak istemiyorum. Bir sonraki makalede veri türlerinden devam edeceğiz.

System.out.println(” İyi Çalışmalar :) “);

 
1 Comment

Posted in JAVA