Leoman’s blog

bi blög

Archive for the ‘Programlama’ Category

WordPress open_basedir içerisinde nasıl?

leave a comment

Nedendir bilinmez WordPress upload vb. işlemler için kullandığı ön tanımlı dizin /tmp şeklindedir.

Peki ya bir paylaşımlı hosting içerisinde WordPress kullanıyor, upload_tmp_dir lokasyonunuz /tmp’den farklı ve /tmp dizinine erişiminiz yoksa?

Muhtemelen eklenti ve WordPress güncellemelerinde;

Warning: file_exists(): open_basedir restriction in effect. File(/tmp//1245078931) is not within the allowed path(s): (/path/path/path/path) in /path/path/path/path/wp-includes/functions.php on line 1924

Warning: touch(): open_basedir restriction in effect. File(/tmp/1245078931) is not within the allowed path(s): (/path/path/path/path) in /path/path/path/path/wp-admin/includes/file.php on line 174

benzeri hatalar dizisi ile karşılaşırız.

WordPress geliştiricileri wp-config.php dosyası içerisine bu opsiyonu öntanımlı olarak koymadıkları ve not olarak eklemedikleri için neleri değiştirmeniz gerektiği hakkında da fikir sahibi olmanız da güç olacaktır.

Bu problemi gidermek için aşağıdaki satırları wp-config.php dosyasının içerisine eklemeniz yeterli olacaktır.

/**
*
*
*
**/
define('WP_TEMP_DIR', ini_get('upload_tmp_dir'));
putenv('TMPDIR=' . ini_get('upload_tmp_dir'));
/**
*
*
*
**/

Written by leoman

June 15th, 2009 at 5:31 pm

Mikrotik’te uzak noktaya otomatik yedek nasıl alınır?

leave a comment

Bir çok uzak noktada Mikrotik cihaz/PC’ye sahip olduğumuzu düşünelim. Bunları belirli periyotlarla elle yedeklemek unutulma, dosya isimlerinde çıkacak karışıklık vb. türlü türlü problem yüzüden pek mümkün olmayacak, ayrıca bu her noktaya bağlanarak tek tek yedek almak ta ciddi bir zaman kaydı olacaktır.

Bunun yerine otomatik olarak Mikrotik’lere “Şu kadar günde bir yedek al! Aldığın yedekleri bana mail at!” diyebilme seçeneğiniz mevcut.

Bu işlem için öncelikle bir SMTP sunucuya sahip olmalı, Mikrotik cihazlarının bu SMTP server’a erişebilmesi, SMTP server’ın da Mikrotik için kullanıcı doğrulaması gerektirmeden mailleri kabul edebilmesi gerekmektedir.

Tüm bu şartların sağlanmış olduğunu düşünürsek, Mikrotik üzerinden yapılacak iş iki adımdan oluşmakta. Birinci adım olarak kayıtlı bir script yaratma, ikinci adım olarak kayıtlı olan bu script’i belirli zaman aralıklarında çalıştırmak.


/system script add name="Oto-Yedek" \
policy=ftp, read, write, policy, test \
source="/system backup save=oto_yedek \
/tool e-mail send body=\"yedek\" to=\"alici@domain.com\" file=\"oto_yedek\" \
server=\"xxx.xxx.xxx.xxx\" from=\"gonderen@domain.com\" \
subject=\"XXX Mikrotik Yedegi\""

İle yeni Oto-Yedek adından bir yedekleme script’i oluşturduk ve;


/system scheduler add comment="Otomatik yedekleme scriptini zamanlar"\
name="Oto-Yedek-Zamanla" on-event=Oto-Yedek \
start-date="Jun/11/2009" start-time="01:00:00" interval="1d" \
disabled=no

zamanlaması ile hergün saat gece 1’de yedekleme scriptinin çalışmasını sağlayabiliriz. Bu işlem sonucunda artık Mikrotik’e login olmaya gerek kalmadan otomatik olarak yedekler belirttiğiniz e-mail adresine gelecek ve yedek alma zamanını sıfıra indirecektir.

Written by leoman

June 11th, 2009 at 9:51 am

MySQL’de karakter seti problemi yoktur!

one comment

Bir çok insan tarafından şu sözleri duyuyorum;  “MySQL’de veritabanı aktarınca karakter problemi çıkıyor.”, “MySQL’de karakter seti problemi var.”

Hayır efendim MySQL’de karakter seti problemi yoktur, MySQL’in huyunu suyunu bilmeyen insan vardır.

MySQL veritabanı çalışmasında iki tane farklı karakter seti kullanır. Bunlardan birincisi veritabanı motoruna (database engine; MyISAM, InnoDB) verilir. İkincil olarak bağlantı karakter setidir ve MySQL Client’a verilir.

Öntanımlı MySQL kurulumlarında (Örneğin; Distro repolarından, cPanel, Plesk, vb. hosting otomasyon yazılımları ile)  bağlantı ve veritabanı karakter seti latin1 olarak gelmektedir.

En sık yapılan hatayı şöyle basit bir hatadır. Kişi gider veritabanını UTF-8 olarak yaratır. Sonra PHP ile sadece bağlanır ve sürekli veri yazar fakat bu veriyi yazdıran zat-ı muhterem bu sunucuya bağlantı sırasında MySQL Client’ın kullandığı karakter seti merak etmez. Bunu irdelemediği için de UTF-8 veritabanına Latin1 ile bağlanır ve verileri böyle yazar. Sonuç! absürt karakterlere sahip bir veritabanı.

Ne yapıyormuşuz demek ki, veritabanını istediğimiz karakter seti ile yaratıyormuşuz, daha sonra bağlanırken de veritabanının sahip olduğu karakter seti ile bağlanıyormuşuz. Evet tam olarak böyle.

Mesela UTF-8 bir veritabanı yarattığımızı varsayalım. Buna bağlanırken kesinlikle şunu yapmıyoruz;

mysql_connect("server","kullanici","sifre");
mysql_select_db("veritabani");
mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");

Bunun yerine; bağlantıdan hemen sonra bir seferlik;

mysql_connect("server","kullanici","sifre");
mysql_select_db("veritabani");
mysql_query("SET NAMES UTF8");
mysql_query("SET CHARACTER SET UTF8");

mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");

durumu MySQL’e bildiriyoruz.

Tabi ki bir projede 50 yerde bağlantı kuranlar bu noktada OOP’nin neden varolduğunu anlayabilirler.

– “Ee bilmem ne SQL Server bunu otomatik seçiyormuş”.

– Peki multi collation olan bu sistemde farklı farklı tablolar için ne yapmayı düşünüyorsun? diye sormazlar mı kişiye.

Önemli olan nasıl yediğin değil, o yoğurdu yemek!

Written by leoman

June 10th, 2009 at 6:44 pm

Mikrotik betiklerinde döngüler ve koşullar

leave a comment

Belli bir öğe dizisi için bir özelliği belli koşullara göre ayarlamamız gerekiyorsa bunu winbox üzerinden defalarca tıklayarak yapmak bir çözüm olabileceği gibi aynı işi bir betik aracılığı ile de yapmak mümkün olacaktır.

Kabuk üzerinde koşul dizilimi şu şekildedir.


[admin@Mikrotik] > :global deger1 "degerli"
[admin@Mikrotik] > :global deger2 "degersiz"
[admin@Mikrotik] > :if ($deger1 = $deger2) do={:put "Eslesiyor"}\
[admin@Mikrotik] > else={:put "Eslesmiyor"}

Bu şekilde şartlara göre seçimimizi yapabilir ve işlemlerimizi gerçekleştirebiliriz.

Döngüler; belirtmiş olduğumuz durum sağlanıncaya kadar işlem tekrarıdır.
Kabuk içerisindeki söz dizimi ise şu şekildedir;


[admin@Mikrotik] > :for i from=1 to=10 do={:put $i}

ile 1’den 10’a kadar sayıları ekrana bastırabiliriz.

Daha reel bir uygulama yapacak olursak kuyruk listemizde ekli olan tüm kuralların maksimum download ve upload’ını 1Mb ile limitlendirelim;


[admin@Mikrotik] > :local queueLen [ :len [ /queue simple find ]]; \
:for i from=0 to=$queueLen do={ /queue simple set $i max-limit=1000000/1000000}

Bu örnekte öncelikle :len ile tüm kuyrukta yer alan kuralların sayısı aldık. Bu değeri daha sonra kullanabilmek için lokal bir değişken olan queueLen’e atadık. Bir sonraki komut dizesinde ise tüm kuyruk boyunca max-limit değerini 1Mb olarak atamış olduk.

Yine diğer programlama dillerinden aşina olduğumuz diziler üzerinde çalışabilmeyi mümkün kılan foreach döngüsünü de kabuk üzerinde kullanabilmekteyiz.

[admin@Mikrotik] > :local toplamIP [/ip address find interface="ether1"];\
:foreach idIP in=$toplamIP do={\
:local durum [/ip address get $idIP disabled];\
:local IPadresi [/ip address get $idIP address];\
:if ($durum="false") do={:put ($IPadresi . " Kapali\n")}\
else={:put ($IPadresi . " Acik\n")}}

Burdaki örnekle beraber ether1 üzerindeki IP adreslerinin Kapalı ya da Açık olması durumuna dair bir listesi alınabilir.

Sadece belli sayıdaki işlemler için değil belirli bir koşula göre işleyebilecek bir döngümüz de var. Bu döngümüz do..while ya da while…do döngüsü. Bu döngüye ait söz dizilimi de şu şekildedir.

[admin@Mikrotik] > :global ethernetCount [:len [/interface find type=ether]]; :global $i 0;
[admin@Mikrotik] > :while ($i < $ethernetCount) do={\ :put [/interface ethernet $i name]; :set i ($i+1);}


[admin@Mikrotik] > :global i 11;
[admin@Mikrotik] > :do {:put $i; :set i ($i - 1);} while=($i > 0)
[admin@Mikrotik] > :unset i;

Written by leoman

January 20th, 2009 at 8:34 am

Mikrotik betik programcılığı – Değişkenler

leave a comment

Mikrotik betik dili üzerinde iki tip değişken bulunmaktadır.

  • global – Tüm aktif kullanıcılar ve betikler tarafından erişilebilen değişken tipidir. global deyimi ile tanımlanır.
  • local – Sadece tanımlandığı blok içerisinden erişilebilen değişken tipidir, yine local deyimi ile tanımlanır.


[admin@Mikrotik] > :local testDegiskeni; :set testDegiskeni "Test ediyoruz"; :put $testDegiskeni

Aynı kod bloğu içerisinde öncelikle local bir testDegiskeni adında bir değişken oluşturduk, değerini Test ediyoruz olarak atadık, daha sonrada değişkenimizin değerini ekrana bastırdık.

Peki bu değişkeni daha birden fazla satırı ve/veya kod bloğu olan bir betik içerisinde kullanma ihtiyacımız olsa idi?

[admin@Mikrotik] > :global testDegiskeni
[admin@Mikrotik] > :set testDegiskeni "Mikrotik dunyasina hosgeldin\n"
[admin@Mikrotik] > :for i from=1 to=3 do={:put $testDegiskeni}

Bu örnekte de görülebileceği gibi testDegiskeni adında bir global değişken tanımladık ve daha sonraki kod bloklarımızdan değişkenimize ulaşarak gerekli işlemleri yaptık.

Written by leoman

January 20th, 2009 at 6:08 am

Mikrotik üzerinde betik programcılığı

leave a comment

Mikrotik bildiğiniz üzre kolay kullanımı için güzel bir görsel kullanıcı arayüzüne sahiptir.  Bu arayüz sayesinde çok kolay ayarlanabilen, takip edilebilen, kullanıcı dostu bir işletim sistmidir.

Bu kadar kolaylık arasında ya kendimize/duruma özel işlemler yapmak istersek? Ya aynı işlemi defalarca yapmak zorunda isek? Ya da bir işlemi sayısız kere belirli aralıklarla yapmak zorunda isek?

Bu kadar esnek bir sistem tabi ki de buna da imkan tanıyacaktır. Mikrotik güçlü kabuğu sayesinde tüm işlerinizi otomatik hale getirmenize ya da durumlara özel çareler üretmenize yardımcı olacaktır.  Kabuk üzerinden (Telnet/SSH/Winbox/Serial) işinize uygun bir betik yazarak dilediğiniz gibi tüm işlemlerinizi gerçekleştirebilirsiniz.

Genel anlamda kullanacağımız kabuk *nix üzerinde yer alan kabuklardan pek te farklı değildir. Bash ya da sh’ta kullanmış olduğumuz “\”, “;” ,”#”,”{}”,”[]”  sınırlayıcılar pek fark olmadan yine bu kabuk üzerinde kullanılabilir.

Veri tipleri

Betik yazımı sırasında sık sık kullanacağımız değişkenler için önceden belirlenmiş tipler mevcuttur. Bunlar;

  • number – 64 bitlik Integer tipi değişken türü (işaretli +/-), aynı zamanda hexadecimal veri girişi de mümkündür.
  • boolean – doğru/yanlış veri tipi, true ya da false değerlerini alabilmektedir.
  • string – karakter dizisidir. “test verisi” gibi bir değer alabilir.
  • IP – IP adresi barındırabilen veri tipidir.
  • time – tarih ve zaman tutan veri tipidir.
  • array – dizi verileri tutabilen veri tipidir.
  • nil – öntanımlı veri tipidir, değişken değer verilmediği sürece değeri nil’dir.

Ayrımlama işaretleri

  • \”       –  çift tırnak
  • \\     – ters bölü
  • \n     – yeni satır
  • \r     – satır başı
  • \t     – yatay sekme
  • \$
  • \?
  • \_     – boşluk
  • \a     – zil
  • \b     – gerisilme
  • \f     – sayfa ileri
  • \v     – yatay sekme
  • \xx     – onaltılık düzende değer

Operatörler

Aritmetiksel Operatörler

  • +  toplama
  • –   çıkarna
  • /  bölme
  • *  çarpma
  • –  negatif

Karşılaştırma Operatörleri

  • < küçükse
  • > büyükse
  • <= küçük ve eşitse
  • >= büyük ve eşitse
  • = eşitse
  • != eşit değilse

Mantıksal Operatörler

  • “!” / “not”  değilse
  • “&&” / “and” ve
  • “||” / “or” veya

Bitsel Operatörler

Bitsel operatörler yanlızca number ve IP veritiplerindeki değişkenler/değerler için kullanılabilmektedir.

  • “~”  değil, bitin tersini alma
  • “&” ve (1 ve işleminde etkisiz, 0 biti ise yutan elemandır)
  • “|” veya (0 ve işleminde etkisiz, 1 biti ise yutan elemandır)
  • “^” özel veya (aynı bitler için 0, farklı bitler için 1 elde eder)
  • “<<” sola kaydırma  (belirtilen değer kadar bitleri sola kaydırır)
  • “>>” sağa kaydırma (belirtilen değer kadar bitleri sağa kaydırır)

Birleştirme operatörleri

  • “.” İki karakter dizisini birbirine bağlar.
  • “,” Dizi elemanlarını birbiri ardına sıralar/Diziye yeni değer ekler.

Written by leoman

January 20th, 2009 at 6:05 am

SEO, .htaccess ve klasör değişiklikleri

one comment

Blog’umu kaybettiğimi çok geç farkettikten sonra haliyle arama motorlarının da artık blog’umu yanlış içerikleri ve yanlış linkleri ile gösterir durum olduğunu anladım. Arama motorlarının, tarama sırasında defalarca 404 hatası ile karşılaşmaktan hoşlanmayacağı için buna SEO dostu bir çözüm bulmak gerekmek idi.

Gidişata göre şanslı olduğum noktalar sırası ile Apache gibi kolay esneyebilen yapıda bir web sunucu kullanmam, eski blogumun ana dizinde değil de bir alt dizinde (/blg alt dizininde) olması idi.

Bildiğiniz üzre Apache web sunucusu .htaccess adlı bir dosya ile şahsa ve isteklere münhasır hale getirilebilmekte ve mod_rewrite modülü ile de URL‘ler üzerinde dilediğiniz gibi değişiklik yapma imkanı sunmaktadır. Bu imkanlar dahilinde ben de arama motorlarınca eski blogumdaki işaretlenen linkleri, gelen ziyaretçilere (özellikle arama motoru robotlarına {örneğin: Google bot} ) buradan taşındığını belirtmeyi seçtim. Böylece arama motorları bu sayfaları bir daha blog’um üzerinde aramayacaktı ve arama sonuçlarından kısa sürede kalkacaktır.

Bunun nasıl yaptım!

Blog’umun hali hazırda kullanmış olduğu .htaccess dosyası içerisine yalnızca bir satır eklemek bunun için yeterli oldu.


RewriteEngine On
RewriteBase /
RedirectMatch 301 /blg(.*) /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Burada birinci satırla beraber rewrite modülü aktif hale getirip ikinci satır ile birlikte kök ve tüm alt dizinleri  için geçerli olduğunu belirttik. Asıl olayımız ise üçüncü satırda, kök dizin içerisinde blg ile başlayan herhangi bir URL olduğunda HTTP 301 hata kodu, yani kalıcı olarak buradan taşındı yönlendirme direktifi oluşturarak tekrar kök dizine yönlendirmesi ile tamamlanmış oldu. Böylece artık arama motorları, dışarıdan gelen linkler http://leoman.gen.tr/blg/eski-bir-post sayfasına ulaşamadıklarında “404 – sayfa bulunamadı” hatası almak yerine bu sayfanın burda olmadığına dair bir yönlendirme alacaklar ve http://leoman.gen.tr/ adresine yönlenecekler. Böylece kimse tarafından kötü çocuk olarak gözükmeyeceğim.

Bu gibi bir değişikliği ise sadece bir alt klasörden kök dizine taşımak için yapacaksanız şu direktifi de kullanabilirsiniz.

RedirectMatch 301 /blg(.*) /$1

Örneğe göre; http://leoman.gen.tr/blg/eski-bir-post adresine gelen istekler http://leoman.gen.tr/eski-bir-post adresine yönlenecekler.

Bol SEO’lu 404’süz günler efendim.

Written by leoman

December 16th, 2008 at 3:22 am