25 November 2014

Linux Kernel Internship


Last month I've applied Gnome Outreach Program for Women and sent patches for Linux Kernel. I've applied it because wanted to learn low level things. I also really like computer design and architecture topics. Actually, I have not enough knowledge about them but like to learn them.

Linux Kernel Community accepted to me as an intern. I'll study on Khugepaged swap readahead project. Working with Linux Kernel team will be great experience for me. They really want to help kernel newbies :).

Actually, studying on Linux Kernel needs a lot reading. Just for writing a few code lines needs to read one chapter from one book, a few blog posts about topic and ask something to developers :).

Nowadays, I've started to read about memory management issues like TLB, Huge Pages, Page Fault from one operating system book and also examine do_page_fault() function.

22 November 2014

Bazı Temel Terimler


Bu yazımda, veritabanı yönetim sistemleri dersinde yapacağımız proje ödevi için sıkça kullandığımız, kullanacağımız temel kavramladan bahsedeceğim.

URI(uniform resource identifier): Yani nizami kaynak belirteci, bir kaynağı ya da veriyi isimlendirmek için kullanılan bir standarttır. Aynı zamanda kaynağı nitelendirir.  Kısaca "adres" veya "link" olarak adlanadırabileceğimiz her türlü gösterimin mutlak syntax'ında neler olabilir, olamaz bunu belirleyen karakter düzeyindeki standartın adıdır.

URL(Uniform Resource Locator): İnternet'te bir kaynağa (belge veya resim gibi) rastgelen, standart bir formata uygun bir karakter dizgisidir.

HTML5: HTML(Hyper Text Markup Language)'nin 5. sürümüdür. HTML4 her ne kadar yeterli gibi gözükse de CSS ile yazılan fazladan kodlar hatalara sebep oluyordu ve bunu önlemek için HTML5 geliştirildi. CSS ile olan uyum sorunu düzeltildi ve beraberinde getirdiği yeni etiketler ile hem içerik ve görsele hem de arama motorlarına büyük kolaylıklar sağladı.

CSS (Cascading Style Sheets): HTML'e ek olarak metin ve format biçimlendirme alanında fazladan olanaklar sunan bir Web teknolojisidir. İnternet sayfaları için genelgeçer şablonlar hazırlama olanağı verdiği gibi, bağımsız olarak harflerin stilini, yani renk, yazı tipi, büyüklük gibi özelliklerini değiştirmek için de kullanılabilir. Bu tekniğin en önemli özelliği kullanımındaki esnekliktir.

JS: JavaScript, Brendan Eich tarafından geliştirilen (önceleri Mocha daha sonra LiveScript olarak adlandırılan) başlangıçta sadece istemci taraflı (client-side) yorumlanan bir betik dilidir C dilinin tarayıcılara uyarlanmış hâli diyebiliriz. Web sayfalarında dinamik içerik sağlamak ya da kullanıcıyla iletişim kurmak için kullanılmaktadır.

Web Server: Hosting işlemini İnternet protokolü üzerinden sunan bir sunucudur. Hosting, Web sayfalarını İnternet'te yayınlamak için gerekli alanın kiralanmasıdır. Diğer bir ifade ile hosting, bir Web sitesinde yayınlanmak istenen sayfaların, resimlerin veya dokümanların İnternet kullanıcıları tarafından erişebileceği bir bilgisayarda tutulmasıdır.

ODBC(Open Database Connectivity): Birbirinden farklı veritabanlarına standart metotlarla bağlantı yapmanızı sağlar. Bir nevi veritabanları ve uygulamalar arasında bir köprü görevi görürler.

JDBC(Java Database Connectivity): Java ile ilişkisel bir veritabanına erişmek ve verisel işlemler yapmak için program-veritabanı arasında köprü işini yapar.

ADO.NET(ActiveX Data Objects.NET): Microsoft tarafından sunulan, veritabanı ile uygulamalarımız arasında köprü görevini görmektedir. ADO.NET ile uygulama tarafımızda veritabanımıza bağlanabilir, verilerimizi buradan listeleyebilir, güncelleyebilir, veri ekleyebilir veya silebiliriz. ADO.NET ile SQL sorguları, komutlarını uygulama tarafımızda kullanabiliriz.

ORM(Object Relational Mapping): İlişkisel veritabanı (RDBMS) ile nesneye yönelik programlamanın (OOP) arasındaki ilişkiyi kuran ve ilişkisel veritabanındaki bilgileri yönetmek için, nesne modellerini kullanan bir tekniktirBasit bir ifadeyle kullanılan nesneleri(object) veritabanındaki tabloya bağlayıp veritabanı bağlantılarını(alışveriş) yapar. ORM tekniği belli bir programlama diline bağlı değildir ve her OOP dilinde yazılabilir/kullanılabilir.

Entity Framework: .NET platformu için geliştirilmiş olan ORM frameworklerinden biridir.

Hibernate: Java platformunda yazılmış bir ORM (Object/Relational Mapping) aracıdır.

Biz projemizde Django çatısını ve ide olarak PyCharm kullanıyoruz. 

Django python dilini kullanarak web siteleri geliştirebileceğiniz bir web frameworkudur. Python ile web sitesi yazmak için birden fazla web frameworku mevcutt, en yaygın olanı djangodur. 

Django  MVC yapısını kullanır. MVC yapısından bahsedecek olursak , django'da çoğu zaman MVT yapısı olarak da geçer. 

M(Model) bizi karışık sql komutlarından kurtaran ORM yapısını kullanan kısım burasıdır. Kendine has basit bir class yapısı ile veritabanı tablolarımızı oluşturmamızı sağlar. 

V(View), aslında veritabanından hangi verileri çekmek istediğimizi belirlediğimiz alan. Tamamen python kodları kullanılır.

T(Template) ise view dan alınan verileri verdiğimiz html alanıdır. Django'da templates diye bir klasör gelmez bunu kendimiz oluşturmalıyız. Sonra settings.py dosyasında template'lerin hangi klasörün altında tuttulduğunu göstermeliyiz. Böylece viewdan sadece html dosyasının adını yazdığımızda direk bu klasörün altında arama gerçekleşir. 





Google Hiring Process


This story started 4 months ago. I've got an email from a Google recruiter. She wanted to do a phone conversation with me. I was very happy to hear this and accepted the conversation immediately.

First phone conversation was initial phone interview, she asked me basic questions about data structures, bitwise operations, linux commands etc. But I think the questions were not basic :p I passed initial phone interview and preferred Site Reliability System Engineer position for myself. I took first round telephone interview with an Google engineer and used Google Doc for coding questions.

Before the first round to prepare myself I was studying algorithms, data structures, network, linux commands, troubleshooting. Following links were really helpful for me:

Geeks For GeeksGlassadorCareerupCracking Code InterviewsSystem DesignDevops Interview Questions.

I passed first round, the engineer said to me you did great most of this interview! I was really happy to hear this and couldn't believe what I heard :) The whole process was very excited, funny and nice for me.

We moved the process for second phone interview. Again I studied for same things and used Google Doc for coding questions. My second interview has only one question, when I replied the question, interviewer generated new questions which was derived from same question. Second round interview was not very good but my recruiter called me and said you passed it, we would like to invite you for onsite interview at one Google office, Google will pay your all expenses. I preferred Dublin office of Google which is headquarters for the Europe offices.

I prepared to practising English myself, and whole summer went English speaking courses, because in my country have no other chance to practising English unfortunately :(

Actually, my English is not very good and when talked with employees of Google I feel really excited so I couldn't talk much so many times :) however during the onsite interviews I discussed a lot on questions because it is my job, but for usual questions how are you?, are you excited?, do you have question? etc. this kind of questions I could talk less :) Engineers of Google are very understanding people to my English. Also in Google Dublin office, people coming from 65 different countries and there are 45 different languages.

Onsite interview have 5 different steps. For SRE (Site Reliability Engineer) position, I've got following steps and each step has 45 minutes with 5 different interviewers. Onsite interview is last round for Google hiring process.

1) ​​Non Abstract Large System Design
2) Troubleshooting / Problem Solving
3) ​Practical Coding - ​Ruby​
4) ​Design/Coding
5) Unix/ Linux ​Systems​

Onsite interview questions were not expected things for me :(. I read a lot of blog posts, they say the questions are very expected, but I think some of them really expected things however most of them were not. I also solved a lot of onsite interview questions before mine.

I couldn't pass the onsite interview however this was really great experience for me. The whole process was very exciting, every steps made me very happy and excited :).  I also met a few Google engineers and my recruiters. They are really helpful and friendly people.

Dublin is not big city so there is no a lot of people, it is not crowded. It was very rainy on my interview day. I stayed two nights in Dublin. After my interview I had time to discover the city. There is river which called as River Liffey in Dublin. It is like a map to find your road :p You can follow along the river so can find your hotel very quickly :).

I'm very happy to met with Google engineers. This was very good experience for me. I'm only 22 years old I can retry it, thanks a lot to Google.

19 November 2014

Yazılım şirketlerinde ki sorunlar ve çözüm yaklaşımları


Bu bloğu ilk açtığım zamanlarda (26.07.2007) henüz okulumu bitirmemiş, freelance yazılım işleri yapan, bir taraftan henüz debian tabanlı olmayan Pardus ile ilgilenen, destek veren bir yazılım geliştiricisi adayıydım. Staj dışında…

Haydi sifreleyelim girisimi (let's encrypt initiative)


EFF bugun internetin gelecegini degistirme potansiyeli olan let's encrypt adini verdikleri projeyi duyurdu. Mozilla, Cisco, Akamai gibi devlerin yani sira IdenTrust ve Michigan Universitesi arastirmacilarinin da katkilariyla olusturduklari yeni bir sertifika otoritesi olan let's encrypt, web'in http'den https'ye gecisi onunde kalan son engelleri de kaldirmayi amacliyor. Bu yazida https'nin http'ye gore artilarini siralamaktansa let's encrypt otoritesini, girisimin kurmayi planladigi sistemi ve su anda gelistirmekte olduklari ACME protokolunu anlatacagim.

Internet guvenligi arastirma grubu, ISRG, ismiyle yeni olusturulan ve kar amaci gutmeyen bir organizasyon tarafindan isletilecek let's encrypt sertifika otoritesinin hangi problemi cozmeye calistigini aciklayarak baslamak yerinde olacaktir diye dusunuyorum. SSL/TLS'in genis capta uygulanabilmesinin onundeki en buyuk engellerden en onemlileri kurulum karmasikligi, burokrasi ve sertifikalarin yuksek ucretleri olarak goruluyor. 2015 yazindan itibaren ucretsiz olarak sertifika dagitmaya baslayacak olan yeni otoritemiz su siralar tek bir komut calistirilarak, hazirda sunulmakta olan sitelerin alan adi dogrulamasini yaptiktan sonra https'ye gecirilmesi islemini yapacak bir istemci yazilimi ve bu yazilimin insa edilerken temel alindigi protokol uzerinde calisiyor. Let's encrypt bu surecte gozetecegi ana prensipleri ise soyle siraliyor;

Bedelsiz: Alan adi sahipleri kontrol ettikleri alanlar icin hicbir ucret odemeden sertifika sahibi olabilecekler

Otomatik: Sertifika alim sureci ve yenilenmesi ve sunucuda konfigure edilmesi gibi islemler tamamen otomatiklestirilerek minimum operator mudahalesi gerektirecek

Guvenli: Let's encrypt modern guvenlik tekniklerinin ve alandaki en iyi uygulamalarin implemente edilebilecegi bir platform olacak

Seffaf: Verilen ya da gecersiz kilinan tum sertifikalar incelemek isteyen herkese acik olacak

Acik: Gelistirilen protokol herkese acik bir standart olacak, gelistirilen yazilimlar ise elverdigince acik kaynak olarak sunulacak

Katilimci: Tek bir organizasyonun kontrolunde olmaktansa her acik standartta oldugu uzere topluluktan katilimcilarin fayda saglayacagi tumlesik bir girisim olmayi amaclayacak

Gelelim nasil calistigina. Altyapi ve istemci yazilimi tamamlandiginda kendi ifadeleriyle

sudo apt-get install lets-encrypt  
sudo lets-encrypt ornek.com  

komutlarini calistirmak tum ayarlari ve sertifika surecini halletmek icin yeterli olacak. Peki arkaplanda neler oluyor? Aslinda bunun icin istemci yazilimin ne yaptigina bakmadan once ACME protokolune bakmakta fayda var. Taslak halindeki RFC'ye gore genel hatlariyla protokol soyle.

Istemci yazilimi operatore hangi alan adlari icin sertifika istedigini soracak. Bu islemin ardindan sertifika otoritelerinin bir listesi gelecek. Eger secilen otorite ucretsiz sertifika saglayan bir otorite degilse odeme bilgisi bu asamada istenecek. Daha sonra yazilim operatore kisa bir sure icinde sertifikanin verilecegini bildirecek. Arkaplanda sunucu, sertifika otoritesi ile ACME kullanarak operatorun belirttigi alan adlari icin sertifika isteginde bulunacak. Sertifika otoritesinin verilen sertifikanin tipine gore belirledigi gereksinimler yerine getirildiginde verilen sertifika otomatik olarak indirilecek ve web sunucu sertifikayi kullanacak sekilde yapilandirilacak. Tercihen operatore e-posta, sms vb. gibi bir yontemle haber verilecek. Normal web hizmeti surecinde web sunucu sertifika otoritesi ile gerektigi taktirde konusarak OCSP (cevrimici sertifika durum protokolu) cevaplari, sertifika listeleri gibi bilgileri almaya devam ederek sorunsuz bir web sunma isinin yururlugunu saglamaya devam edecek.

Burada araya girip bir iki konuya acikliga kavusturayim. Yukarida web sunucu olarak bahsedilse de e-posta, xmpp vs. gibi sertifika kullanabileceginiz her hizmette ACME protokolunu ve bu protokol uzerinden calisan istemciyi kullanabileceksiniz. Su asamada organizasyon dogrulamasi(organization validation) ya da kapsamli dogrulama(extended validation) surecleri nasil isleyecek cok net olmasa da alan adi dogrulama icin(domain validation) bir sorun yok gibi gozukuyor. Protokole doneyim.

Standardimizda uc adet anahtar/anahtar cifti tanimi bulunuyor.

Ozne acik anahtari (subject public key): Sertifikaya konu olan alanlar icin dahil edilecek acik anahtar

Yetkilendirilmis anahtar cifti (authorized key pair): Sertifika otoritesinin herhangi bir kimligin yonettigi/yonetebilecegi sertifikalar icin iletisimde kullanacagi anahtar cifti. Bu cift birden fazla kimlik icin kullanilabiliyor.

Sifirlama anahtari (recovery token): Diger anahtarlarin ya da anahtar ciftlerinin kaybedilmesi durumunda sertifika otoritesine kimlik kanitlamak icin kullanilabilecek gizli anahtar

Butun iletisim https uzerinden json ile saglaniyor. Kimlikler ACME'de anahtar ciftleri ile ifade ediliyor. Bir alan adi icin istek yapilmadan once gecerli bir anahtar ciftinin ozel anahtarinin o alan adini kontrol eden tarafindan sahipliginin gosterilmesi gerekiyor. Bu kisim bildigimiz acik anahtarli sifrelemenin aynisi oldugundan uzerinde cok durmaya gerek yok. Alan adinin ya bir DNS kaydi ile ya da sunulan bir dosya ile bir ozel anahtar tarafindan kontrol edildigi kanitlaniyor. Sertifika otoritesi bu kanitlama basarili olursa basarili mesaji ve sifirlama anahtari donuyor istemciye.

Kimlik kanitlama isleminin ardindan istemci, belirtilen alan icin bir sertifika imzalama istegi olusturuyor(CSR) ve bu istegi ozel anahtari ile imzalayip sunucuya gonderiyor. Sunucu gelen istegin daha once dogruladigi anahtar ciftine ait olduguna emin olduktan sonra sertifikayi olusturuyor ve istemciye gonderiyor. Bu cevapta sertifika yenilemenin tekrar bir dogrulama gerektirmedigi durumlarda, istemci tarafindan yenileme icin kullanilabilecek adres de gonderilebiliyor. Sertifikanin iptali icin istemci basitce, ozel anahtariyla imzaladigi iptal istemini sunucuya gonderiyor ve sunucu bu istegi aldiginda sertifikayi iptal ediyor. Istemci ya da sunucu yazacaklar icin taslak standardin burada atladigim teknik detaylarina yukarida paylastigim protokol adresinden ulasmak mumkun.

Sistem 100 metre yukaridan bakildiginda aciklamaya calistigim sekilde isliyor. Ucretsiz sertifikalarin edinilebilmesine olanak taniyacagi ve TLS implementasyonu onundeki teknik engelleri kaldirma potansiyeli oldugu icin interneti degistirebilecek bir proje olarak goruyor ve heyecanlaniyorum. Umarim Postfix, Nginx, ejabberd gibi projeler de ACME'yi ve dolayisiyla let's encrypt sertifika otoritesini otomatik olarak kullanabilmek ve yapilandirabilmek icin gereken adimlari en kisa surede atarlar. Bu sayede gorece daha guvenli bir internet deneyimi icin gereken en temel adimlardan birini atmis oluruz.



13 November 2014

Doctrine 2 ile Optimistic Locking


Yoğun editör işlemlerinin olduğu projelerde aynı yazıyı içeriği güncelleme problemleri ile sıkça karşılaşılır.

Örnek senaryo;

  • 1. editör 1. yazıyı güncellemek için açtı.
  • 2. editör 1. yazıyı güncellemek için açtı.
  • 1. editör 1. yazıyı güncelledi.
  • 2. editör 1. yazıyı güncelledi(!).

Son değişikliği 2. editör yaptığı için 1. editörün yaptığı değişiklikler silindi. Bunu önlemek için 2. editöre “Senden önce 1. editör bu yazıyı düzenledi. Önce onun değişikliklerine bakmalısın.” demek gerek.

Peki bu uyarı sistemini ne ile kuracağız?
Optimistic Locking yöntemi ile.

Kısaca bu yöntemi şu şekilde çalışır:

Tablo ismimiz Post olsun. Post tablosuna “version” isminde bir sütun daha ekleyeceğiz. İlk insert işleminde version sütununa 1 yazılır. Her yazı güncellemesinde version sütunundaki sayı 1 arttırılır.

Kullanıcı içeriği güncellediğinde versiyon sayısı güncellemeden önceki sayı ile aynı değilse içerik daha önce birileri tarafından güncellenmiştir.

PHP’de bu işlemleri araya herhangi bir ORM koymadan halledebilirsiniz. Ancak sizin yerinize Doctrine 2 versiyonlama işlemini destekliyor.

Yapmanız gereken Post entity’nize bir @Version annotation’ı eklemeniz.

Örnek olarak hazırladığım Post ismindeki entity’e buraya tıklayarak ulaşabilirsiniz.

Entity sınıfında gerekli versiyonlama için düzenlemeyi yaptık.

Bu Post entity sınıfını kullanarak yazdığım örnek bir Symfony 2 controller’ı da şu şekilde:

namespace Acme\BlogBundle\Controller;

use Acme\BlogBundle\Entity\Post;
use Acme\BlogBundle\Form\PostType;
use Doctrine\DBAL\LockMode;
use Doctrine\ORM\OptimisticLockException;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    /**
     * @Route("/post/{id}")
     * @Template()
     */
    public function showAction($id)
    {
        $em = $this->get('doctrine')->getManager();
        $entity = $em->find('Acme\BlogBundle\Entity\Post', $id, LockMode::OPTIMISTIC);
        $form = $this->createForm(new PostType(), $entity, ['action' => $this->generateUrl('update_action')]);
        return $this->render('AcmeBlogBundle:Default:show.html.twig', ['form' => $form->createView()]);

    }

    /**
     * @Route("/update", name="update_action")
     * @Method({"POST"})
     */
    public function updateAction(Request $request) {

        $post = new Post();

        $form = $this->createForm(new PostType(), $post);

        $form->handleRequest($request);

        if($form->isValid()) {
            $formData = $form->getData();
            $post->setId($formData->getId());
            $post->setTitle($formData->getTitle());
            $post->setContent($formData->getContent());
            $post->setVersion($formData->getVersion());

            try {
                $em = $this->getDoctrine()->getManager();
                $em->merge($post);
                $em->flush();
            } catch(OptimisticLockException $e) {
                return $this->render('AcmeBlogBundle:Default:locking.html.twig');
            }

            return $this->render('AcmeBlogBundle:Default:success.html.twig');

        }
            return $this->render('AcmeBlogBundle:Default:error.html.twig');

    }
}

22. satırda Optimistic Locking kullanarak find işlemini yapıyoruz. 51. satırda OptimisticLockException ismindeki Exception için bir kural yazılı. Doctrine 2 bizim yerimize version sütununu kontrol ediyor, eğer değer aynı değilse OptimisticLockException isminde bir Exception fırlatıyor.

Örneğin; /post/5 yolunu iki ayrı browser tabında açıp, ikisinde de güncelleme yapılsın. İlk güncelleme çalışacaktır ve 5 numaralı satırın version sütununu 2‘ye yükselecektir. İkinci tabdan güncelleme yapıldığında orada version bilgisi 1 olarak kaldığı için OptimisticLockException‘ı fırlayacaktır.

Bazı kaynaklarda versiyonlama sütunlarını date time veya timestamp olarak da tutulmasından bahsedilebilir. Ancak olası zaman kaymaları için bu yöntem önerilmez.

Ayrıca Bkz.: Dirty read

Not: Symfony 2’de Doctrine 2 varsayılan olarak geldiği için Symfony 2 controller örneği verdim. Doctrine 2’yi başka frameworklerde de kullanabilirsiniz.



Outreach Program for Women 2015


Gnome Vakfının yılda iki defa düzenlediği Outreach Program for Women etkinliğinin Aralık 2014 - Mart 2015 dönemine kabul edilenler bugün açıklandı. 16 ayrı organizasyonun toplamda 44 kişi kabul ettiği bu etkinliğe başvurular önceki yıllarda olduğu gibi yoğundu ama Türkiyeden katılım yine maalesef oldukça az oldu. Bu yıl mezun olan +Ebru Akagunduz Linux çekirdeği için kabul edilen beş kişiden biri oldu. Ebru uzun süreli ve azimli çalışmanın mutlaka sonuç vereceğini göstermesi açısından çok iyi bir örnek. Onun gayretli çalışması kendinden sonrakilere de bir motivasyon kaynağı olacaktır diye umuyorum.

Birlikte çalışmış olmaktan gurur duyduğum Ebru'nun bu süreci çekirdek geliştiriciliğine taşımasını diliyorum. 

Meraklısı için: 2013, 2014

09 November 2014

PHP – Identity Map Pattern


$user1 = User::find(1);
$user  = new User();
$user1 = $user->find(1);

Bunlar ve buna benzer kullanımlar PHP içerisinde sıkça görebileceğiniz kullanıcı çekme yöntemleridir. User sınıfındaki find() metotu size bir UserRepository (ismi salladım) nesnesi döndürür oradan işlem yaparsınız.

Örneğin; Runtime’da iki alakasız yerde 1 numaralı kullanıcının veritabanındaki bilgilerine ihtiyacınız var.

Birinci yerde User::find(1) yaptınız ve SELECT sorgusu çalıştırdınız. Kodun farklı bir noktasında tekrar User::find(1) yaptınız ve tekrar SELECT sorgusu işlendi.

Ama daha önce 1 numaralı kullanıcı veritabanından çekilmişti. Tekrar SELECT yapmaya gerek var mı?

veya…

X metotu içinde User::find(1) yaptınız kullanıcıyı çektiniz ve kullanıcı adı Ali.

Sonra Y metotunda tekrar User::find(1) yaptınız. Ama Y metotunun içinde şöyle bir if koşulu var: “Eğer id 1 ise kullanıcı adını Veli yap”.

Y metotundaki kullanıcı adı Veli oldu. Ama geri X metotuna döndüğümde kullanıcı adı hâlen Ali kaldı.

Böyle birçok farklı senaryo düşünülebilir.

Buradaki temel problem her find yapıldığında yeni bir UserRepository objesinin geriye dönmesinden kaynaklanıyor.

Sistem geneli 1 numaralı kullanıcı için hep aynı nesneyi kullansa tekrar SELECT‘e gerek kalmayacak ve bir metotta kullanıcı adı setlendiğinde başka metotta da bu görülebilecek.

Peki bu nasıl sağlanacak? Identity Map Pattern ile.

Runtime’da objeleri cacheleyeceğiz.

User::find(1) işlemi için metotu hazırlayalım.

User.php

class User {
    public static function find($id) {
        return (new UserMapper)->init($id);
    }
}

Kullanıcı bilgilerinin bulunduğu UserRepository ile User sınıfının arasındaki bağlantıyı sağlayacak Mapper.

UserMapper.php

class UserMapper {
    
    private static $object;
    
    public function init($id) {
        if( ! isset(self::$object[$id])) {
            self::$object[$id] = (new UserRepository)->fetch($id);
        }

        return self::$object[$id];
        
    }
    
}

Son olarak da kullanıcı bilgilerini barındıran UserRepository sınıfı

UserRepository.php

class UserRepository {

    public $users = [['name' => 'Ali'], ['name' => 'Veli']];

    private $name;

    public function fetch($id) {
        if( ! isset($this->users[$id])) {
            throw new InvalidArgumentException;
        }

        $userRepository = new self; 
        $userRepository->setName($this->users[$id]['name']);

        return $userRepository;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }
}

Burada bir de DAO işlemleri için ekstra sınıflar gerekiyor. Ancak örnek olması için veritabanı olarak bir basit array kullandım.

Örnek işleme bakalım:

test.php


$user1 = User::find(1);
$user2 = User::find(1);

$user1->setName('Emre');
echo $user2->getName(); // $user2 objesi de Emre oldu

UserMapper sınıfında nesneler cachelenmeseydi ve her defasında return (new UserRepository)->fetch($id); yapılmış olsaydı $user2 nesnesinin getName metotu Veli sonucunu döndürecekti.

Ayrıca cachelendiği için UserRepository sınıfındaki fetch metotu da 1 defa çalıştı. Buradaki isset işlemini SELECT sorgusu olarak düşünebilirsiniz.

Ayrıca Bkz.: Optimistic Offline Lock



06 November 2014

Şifreli e-posta neden yaygınlaşmıyor?


encrypted-emailSayısal iletişimde e-posta önemli servislerden birisi. Şifreleme kullanılmadan yapılan e-posta trafiği, olası kritik verinin açık ve erişilebilir olarak İnternet ortamından geçmesi anlamına geliyor.

Günümüzde e-posta şifreleme yöntemleri karmaşık yapıya sahip ve tek taraflı e-posta şifreleme yöntemi bulunmuyor. Sayısal kimlik tabanlı şifreleme (IBE – Identity Based Encryption) günümüzde ideale en yakın çözümlerden. Şifreleme, e-postayı yazan ve okuyan taraflara en yakın seviyede başlatılır ve bitirilir. Yasal düzenlemeler ile nitelikli sayısal kimliklere, veri bütünlüğünü kanıtlama, kimlik doğrulama ve inkar edilemezlik özellikleri kazandırılmıştır.

E-posta şifreleme yöntemlerinin tamamı PKI (public key infrastructure) altyapısına dayanmaktadır. Tam bir PKI uygulaması, dijital sertifikaların dağıtılması ve yönetilmesini gerektirir. PKI masraflı ve bilgi birikimi gerektiren bir uygulamadır. PKI altyapısı kullanılarak yapılan e-posta şifrelemede açık anahtarların (public key) güvenli şekilde dağıtılması yapının problemlerindendir. Şifreli e-posta gönderilmek istendiğinde, karşı tarafın açık anahtarının güvenli şekilde önceden temin edilmiş olması gerekliliği, yapının en zayıf noktasıdır. Sayısal kimlik tabanlı e-posta şifreleme bu nedenlerden dolayı yaygınlaşamamaktadır.

Uygulanabilirliği yüksek ve son kullanıcı bilinci gerektirmeyen şifreleme alternatifi, e-posta sunucuları arasında TLS kullanılmasına dayanır. Fakat RFC 2487e göre, İnternet’e açık sunucular sadece TLS bağlantıları kabul edilecek şekilde ayarlanmamalıdır.



04 November 2014

Teknolojinin Kadınları Etkinliği Sunumum


Geçtiğimiz günlerde Kadın Yazılımcı topluluğu ile birlikte İstanbul Hackerspace'de Ada Lovelace Day ve Grace Hopper Celebration'ı Türkiye'de de kutlamak için bir etkinlik düzenledik, bu etkinlik için ben de bir sunum hazırladım.

Etkinlik ile ilgili Cansu Uludağ'ın değerlendirme yazısı hayli kapsamlı olmuş, okumanızı tavsiye ederim. Hem vesileyle benim bu blog yazısında (zaman sıkıntısından) bahsedemediğim diğer arkadaşlarımın şahane sunumlarını da okumuş olursunuz.

Bu blog yazısında, yoğunluktan ertelediğim bir işi yapmaya hazırlanıyorum. Etkinlikte yaptığım, hazırladığım sunumu paylaşıyorum. 

 Dünyada yazılım, bilişim ve teknoloji alanında kadınları teşvik etme amacıyla düzenlenen etkinlikler, programlar ve bu konuda kadınlara fon ayıran vakıflar hakkında bilgi verdiğim sunumuma buradan ulaşabilirsiniz.

Çoğunlukla kadınların yer aldığı özgür yazılım, açık kaynak projeleri, organizasyonlarının yer aldığı (içerisinde yer almamla bildiğim, takip ettiklerim nedeniyle) bu sunumu peyderpey de olsa güncellemek yapılacaklar listeme girdi bile! :)
                    



02 November 2014

PisiLinux


Pardus projesinin 2012 Ocak ayında sonlandırılmasından sonra yaşanan belirsizliğin ardından projenin teknik altyapı değişikliğiyle yoluna devam etmesine karar verildi. Normal şartlarda tamamladığım bu cümlenin ardından bir bağlantıya atıfta bulunurdum ama inanın İnternet’in derinliklerinde Pardus ile ilgili bu konudaki  bağlantıları aramak bile istemiyorum. Çünkü ben ve benim gibi pek çok kişi o süreçte çok üzüldü , kırıldı ve Pardus adını bile duymak istemedi ki hâlâ böyle hissedenlerin olduğunu biliyorum.

2012 Yılı bu belirsizlikle geçerken bazı Pardus severler başka dağıtımlara, bazıları da “yeni” Pardus’a geçiş yaptı geriye kalan kitle ise işimi göremeyecek duruma gelen kadar Pardus’ kullanmaya devam edeceğim derken çok az sayıdaki Pardus sever ise bir iddia ile ortaya çıktı “paketleri güncel tutacağız” Paketleri güncel tutma çalışmaları 2013 başlarında  Pardus’a özgü PİSİ , COMAR, YALI, KAPTAN gibi  teknolojileri kullanacak yeni bir Dağıtım oluşturmaya evrildi.

Tıpkı Pardus’un yıllar önce Gentoo’yu kuluçka dağıtım olarak kullanması gibi Özgün Pardus’un ardılı olan  bu yeni dağıtım da Pardus 2011.2 sürümünü kuluçka dağıtım olarak kullandı ve tıpkı ana rahmindeki bir cenin gibi bir süre sonra kalp atışları duyulmaya başlandı.

PisiLinux

PisiLinux

Yeni Dağıtımın Adı PisiLinux

Bir GNU/Linux dağıtımını diğerlerinden ayıran en önemli özelliği kuşkusuz kullandığı paket yönetim sistemidir.  Özgün Pardus’un en önemli özelliği de elbette diğer dağıtımlardan farklı olarak kendi paket yönetim sistemi olan PİSİ idi bundan dolayı yeni dağıtımın adı Pisi Linux oldu.

Çalışmalar sınırlı sayıda paketçinin çabalarıyla github üzerinde  sürdürüldü.  Paketler gözden geçirildi sürümleri güncel’e çıkarıldı, Pardus hata sistemine girilen yeni paket istekleri baz alınarak yeni paketler eklendi, Yalı içeriği güncellendi, Pisi’ye ihtiyaçlar gözönüne alınarak eklemeler yapıldı. Zahmetli ve uzun bir çalışmanın ardından geçtiğimiz Ağustos ayında ilk kararlı sürümü olan PisiLinux 1.0 yayınlandı.

29 Ekim 2014 günü yani Cumhuriyetimiz’in 91. Yıldönümünde ise güncellenen paketler 300 Mb geçtiği için ilk ara sürüm Pisilinux 1.1  sessiz sedasız yayınlandı. PisiLinux!u meydana getiren bu fedakâr ekip tıpkı iki yıldır yaptıkları gibi çalışmalarına sessiz sedasız devam ediyor…

Geçen iki yılda;

1- Kaderine terk edilen Pisi paketleri güncellediler.

2- Yeni paketleri depoya aldılar.

3- Yeni bir dağıtımı meydana getirdiler.

4- Pisi’ye yeni özellikler eklediler.

5- PisiLinux Topluluğunun temellerini attılar. Bu amaçla proje sayfası, Web Sitesi,  Forum, Hata Takip Sistemi,Yardım Kanalları‘nı hayata geçirdiler.

Bu tip blog yazıları genelde “etkin” destek çağrısı amacıyla yazılır ki ben de daha önce böyle birkaç yazı yazmıştım. Ancak bu sefer öyle değil.

Bu sefer sadece bir son kullanıcı olarak size PisiLinux’u sadece deneme amaçlı da olsa kurun kullanın demek için yazıyorum. PisiLinux 1.1 sürümünü indirin ve  önyargılarınızı bir kenara bırakarak kullanın. Bir bakın eğer işlerinizi yapamayacağınızı düşünürseniz de  kaldırın.  Bu seviyeye gelmiş olan Pisilinux artık sizden sadece kullanılmayı ve hak ettiği değeri görmeyi bekliyor.

Daha önce defalarca Linux dağıtımları kurdunuz kaldırdınız bir kez daha yapabilirsiniz haydi!

Sürüm Çıkış Târihi İndirme Bağlantısı
Pisi Linux 1.1 KDE  29.10.2014
Pisi Linux 1.0 KDE  14.08.2014
Pisi Linux 1.0 LXDE 14.08.2014
Pisi Linux 1.0 XFCE 14.08.2014
Pisi Linux 1.0 Minimal 14.08.2014



29 October 2014

Portspoof ile Network Scanner’ları Yanıtlamak


Portspoof, bir network scanner uygulaması kullanarak sunucular üzerinde çalışan servisleri tespit etmek isteyen saldırganların işlerini zorlaştırmak ve tarama sonucunu manupule etmek sureti onları yanıltmak üzere geliştirilmiş enteresan bir uygulamadır.

Bildiğiniz gibi network scanner uygulamalarının uzaktaki bir sistemde çalışan servisleri tespit etmeleri için kullandıkları bir takım teknikler vardır. Bu tekniklerden en tipik olanı ise TCP’nin üçlü el sıkışma prensibinden hareketle uzak sunucunun tüm portlarına (ya da ilgilenilen portlarına) birer SYN paketi göndermek ve alınacak cevaba göre ilgili servisin mevcudiyeti ya da durumu ile ilgili karara varmaktır. Örnek olarak üzerinde bir web sunucusu çalıştığını bildiğiniz uzaktaki bir sistemin 80. portuna bir SYN paketi gönderirseniz ve uzak sunucudaki bu servis çalışır durumdaysa -ayrıca herhangi bir engelleme yoksa- cevap olarak SYN+ACK paketi alırsınız. Bu şekilde ilgili servisin çalışır vaziyette olduğu uzaktan tespit edilir ve örneğin nmap ilgili port’u OPEN olarak bildirir. Aynı şekilde gönderilen SYN paketine RST paketi dönerse, uzak sunucuda ilgili portu dinleyen bir servis olmadığı anlaşılır ve scanner uygulaması durumu CLOSED olarak değerlendirir. Eğer uzak sunucu bir firewall üzerinden korunuyorsa ve SYN paketini gönderdiğiniz porta erişim izniniz yoksa ilgili paket -genel olarak- drop edilir bu nedenle de geriye herhangi bir paket döndürülmez. Bu durumda da network scanner uygulaması durumu FILTERED olarak bildirir, bu şekilde de uzaktaki sistemin bir firewall’a sahip olduğunu tespit edebilirsiniz.


Devamini okuyun: Portspoof ile Network Scanner’ları Yanıtlamak


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: ,



Fotoğraflarımıza Geotag Ekliyoruz (ExifTool)


geotagTek seferde fotoğraflarımıza GeoTag (konum etiketi) ekliyoruz. ExifTool, GeoTag işlemlerinde kullanabileceğiniz güçlü bir komut satırı uygulaması. Paket yöneticimizle ExifTool‘u yükledikten sonra, fotoğraflarımıza ekleyeceğimiz konum etiketinin enlem ve boylam bilgisini DD (decimal degrees) olarak belirliyoruz. Aşağıdaki komut ile imaj dosyalarımıza koordinat bilgisini ekleyelim;

exiftool -GPSLatitudeRef=N -GPSLatitude=39.925716 -GPSLongitudeRef=E -GPSLongitude=32.838016  *.jpg

Windows işletim sistemlerinde de fotoğraflara ExifTool ile GeoTag eklemek mümkün. Çalıştırılabilir win32 dosyayı indirip aşağıdaki gibi isimlendirdikten sonra dosyalarınızı bu exe dosyası üzerine sürükleyip bırakmanız yeterli.

exiftool (-GPSLatitudeRef=N -GPSLatitude=39.925716 -GPSLongitudeRef=E -GPSLongitude=32.838016).exe


27 October 2014

apt-get Komutunun Güzellikleri – 2


Birkaç ay önce aynı adı paylaşan bir başka yazıda yazdıklarıma benzer şekilde bugün yine apt-get ile yapılabilecek bir başka numara öğrendim, geç öğrenmişsem affola :) Problemimiz şu olsun: sistemde var olan bir paketi kaldırırken aynı zamanda başka bir paketin de yüklenmesini sağlamak. Normal şartlar altında sistemden bir paketi kaldırırken remove/purge parametresini, sisteme yeni bir paketi kurarken de install paremetresini kullanırız:

# apt-get install libreoffice-kde
# apt-get remove libreoffice-gtk

Yukarıda örnek verdiğim iki komutu aslında bir arada kullanmak mümkünmüş:

# apt-get install libreoffice-kde libreoffice-gtk-

Veya;

# apt-get remove libreoffice-gtk libreoffice-kde+

Aslında yukarıdaki her iki komutun da yarattığı sonuç aynı fakat yaptıkları işler farklı: ilk komut libreoffice-kde paketini kurarken sonuna ‘-‘ işareti koyduğumuz libreoffice-gtk paketini sistemden kaldırıyor, ikinci komut ise libreoffice-gtk paketini sistemden kaldırırken sonuna ‘+’ eklediğimiz libreoffice-kde paketini sisteme kuruyor.



25 October 2014

Bonding Network Interface Kullanımı


RedHat tabanlı  işletim sistemlerinde iki veya daha fazla ethernet interface olması durumunda bonding network interface kullanarak, ethernetlerin load balance bond, round-robin bond ya da  fault tolerant bond şeklinde çalışması sağlanabilmektedir. Bu sayede bir interface down olması durumunda sunucuya erişim ikinci interface üzerinden devam edecektir.

Sunucumuzun bond interface ayarlarını aşağıdaki ip adresine göre yapacağız.

Bond Interface Oluşturma

# vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
 IPADDR=172.16.41.10
 NETMASK=255.255.255.0
 GATEWAY=172.16.41.1
 ONBOOT=yes
 BOOTPROTO=none
 USERCTL=no

 Eth0 ve Eth1 Interfacelerin Düzenlenmesi

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
 ONBOOT=yes
 BOOTPROTO=none
 HWADDR=00:1F:29:E6:EB:2A
 USERCTL=no
 MASTER=bond0
 SLAVE=yes

#vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
 ONBOOT=yes
 BOOTPROTO=none
 HWADDR=00:26:55:35:24:FF
 USERCTL=no
 MASTER=bond0
 SLAVE=yes

Fault Tolerant ( Aktif/Pasif Mod )

Ben bond çalışma modunu aktif/pasif moda göre düzenleyeceğim. Diğer mod ayarlarını linkten bulabilirsiniz.

# vi /etc/modprobe.d/bonding.conf

alias bond0 bonding
      options bond0 miimon=80 mode=1

Yukardaki şekilde düzenlemelerimizi yaptıktan sonra network servisini  yeniden başlatıyoruz.

# service network restart

# ifconfig
bond0     Link encap:Ethernet
          inet addr:172.16.41.10 Bcast:172.16.41.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  
          inet addr:172.16.41.10  Bcast:172.16.41.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

eth1      Link encap:Ethernet  
          inet addr:172.16.41.10  Bcast:172.16.41.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

Ayrıntılı bilgi edinmek isteyenler için link1, link2



17 October 2014

Kitap Tanıtımı: İlizarov Günlüğü


Dostum Sezai Yeniay ilk kitabını ‘İlizarov Günlüğü’nü geçtiğimiz hafta Google Play Kitaplar’da yayımladı. Zor bir zamanında yazdığı ve el birliği ile hazırladığımız bu kitabın burada tanıtımını yapmaktan da kıvanç duymaktayım.

İlizarov Günlüğü

İlizarov Günlüğü

“Sanıldığının aksine doğa en mükemmele evrilmiyor, en kolaya evriliyor…” – Sezai Yeniay, İlizarov Günlüğü

Sezai’nin kitabı bir günlük… Çocukluğunda geçirdiği bir trafik kazası neticesinde yaşadığı onca ameliyattan sonra bir son ameliyatın hikayesi. İlizarov tekniği ile kemik uzatımı sürecinde yaşadıklarını teşvikimizle, başkalarına da faydalı olsun diye, bir internet günlüğünden (http://ilizarovgunlugu.wordpress.com/) yazmaya başlamıştı. Bittiğinde bunu kitaplaştırmak için kendisine söz vermiştim. Geç de olsa eşimin yardımı ve özgür yazılım araçlarıyla bunu başardık.

Kitabı değerlendirmek gerekirse, İlizarov Günlüğü ameliyatı ve teknik-tıbbi yaşananları anlatan bir kitap değil. Kitabı okuduğunuzda kader, talih ve hayatın ne kadar çileli olabileceği ve insanın bir şekilde bu zorlu engeller karşısında kendine bir yol çizebileceğini ve başarabileceğine dair inancınız pekişecektir.

İki gün önce hayatta ortalama bir insanın sahip olabileceği birçok şeye sahip bir insan olan Mehmet Pişkin’in intiharı üzerine hayatı sorgulamış olabilirsiniz… Benzer bir çok örnek gibi, İlizarov Günlüğü ve Sezai’nin hayatını önümüze koyduğumuzda, insanın en temel içgüdüsü olan yaşama güdüsünün ne kadar doğal ve doğru olduğunun görüleceğini düşünüyorum. Mutlak içgüdümüz olan yaşamın asla bize mutlu tarafını garanti etmediğini ve hayat oyununda kuralları biz belirlemesek bile mücadele gücümüzün tahminimizden de üstün olması sayesinde kazanacağımızı düşünüyorum. Galiptir bu yolda mağlup da diyebiliriz. Türümüz böyle… Yoksa alçılanmış kırık ayağı ile kağıt toplamaya çalışan çocuğun yaşam mücadelesini nasıl açıklayabiliriz ki?

En zor en umutsuz anlarda bile zaman içerisinde -bazen ‘o zaman’ durmuş ve geçmiyorcasına can yaksa bile- bir çıkış muhakkak vardır.

Bu nedenle İlizarov Günlüğü’nü okumanızı öneririm.

Kitabın hazırlanışı ile ilgili teknik kısma gelelim. İlizarov Günlüğü tamamen özgür yazılım kullanılarak yazılmış ve e-kitap biçimine dönüştürüldü; GNU/Linux tabanlı özgür işletim sistemleri üzerinde LibreOffice Writer ile yazıldı, LibreOffice için Writer2epub eklentisi ile e-kitap biçimine dönüştürüldü ve e-kitap yönetim yazımları Calibre ve Sigil ile son şekli verildi. Lisans olarak ise özgür bir lisans olan CC BY-SA 4.0 ile lisanslandı.

Eşim ve benim için bu ilk editörlük ve e-kitap oluşturma deneyimimiz oldu.

İlizarov Günlüğü’nü serbest şekilde dağıtmanın yanı sıra, bir sayısal yayıncılık platformunda yayımlamak kitabı daha bir kitap havasında görmemizi sağladı. (Eh biraz eski kafa bizde de var, kitaplar sanal da olsa bir raf üzerinde görülmeyi hakediyor diye düşünüyoruz…)

Nihayet Sezai kitabı Google Play Kitaplar‘da da yayımlamayı başardı.

lİlizarov Günlüğü Google Play'de

İlizarov Günlüğü Google Play’de

Kitabı Google Play Kitaplar‘dan ücretsiz indirebilirsiniz, Google Books uygulaması ile cep telefonunuzda ve tabletinizde veya web okuyucusu ile masaüstü bilgisayarınızda okuyabilirsiniz. Kitabı okuduktan sonra yorum ve değerlendirmenizi kitabın sayfasından yapmanız güzel olacaktır.

Kitabın epub, mobi ve PDF biçimleri de dilerseniz şurada mevcut.

Neyse çok uzatmadan, kitabı indirebileceğiniz bağlantıları paylaşarak yazıyı sonlandırayım.

Son olarak, birçok kişinin faydalanacağı bir birikimi sunduğu için Sezai’yi tekrar kutluyorum. Kitabın editörlüğünü devralarak sürüncemeden kurtaran eşime buradan bir kez daha teşekkür ediyorum.

İyi okumalar.



Açık Kaynak Sistemlerle Siber Saldırı Gözlemleme Sistemi


IstSec 2014 kapsamında yaptığımız, Ossec, Snort, Elasticsearch, Logstash, Kibana kullanarak “Açık Kaynak Sistemlerle Siber Saldırı Gözlemleme Sistemi” kurgulama konusuna değinen konuşmama aitait sunum dosyasını Linux Akademi Slideshare adresine eklendi; ilgilenenler için şöyle:

 


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: ,



11 October 2014

Kitap Yayıncılığı İş Akış Uygulaması Kodlarım GitHub’a Taşındı


2010 yılında bir yayınevi için kitapların yayına hazırlanması sırasında oluşacak hatalara karşı bir kontrol listesi geliştirmiş ve döküman üzerinden de bir uygulama geliştirmiştik.

2014 yılı ortasında yayınevi, web sitesiyle birlikte uygulamayı da kullanımdan kaldırdı.

Ekran görüntülerine şuradan ulaşabileceğiniz uygulamayı GPL Lisansı V3 ile lisanslayıp GitHub üzerinden paylaşıma açtım.

Buyrunuz.

https://github.com/yakusha/dusyayincilik.com



09 October 2014

GitHub veya BitBucket Projesi Nasıl Oluşturulur – Güncellendi


Sizde benim gibi projelerinizi hala Git’e taşımadıysanız, bu döküman tam sizin için hazırlandı.

———| STEP 0 | ———————

Öncelikle projemizin kaynak kodları kamuya açık mı olacak, yoksa sadece
kendimize mi saklayacağız’a karar veriyoruz.

Kapalı kaynak kodlu ise BitBucket >> bitbucket.org
Özgür bir proje olacak ise GitHub >> github.com

sitesinden üyelik oluşturuyoruz.

———| STEP 1 | ———————

BitBucket için >> bitbucket.org/repo/create
GitHub için >> github.com/new

sayfasına gelip projemizi oluşturuyoruz.

BitBucket için

Kapalı kaynak kodlu bir proje olacağına göre

  • Name” kısmında “BenimYeniProjem” olarak dolduruyoruz
  • Access level” kısmında “This is a private repository” seçeneğini seçiyoruz
  • Forking” kısmını No Fork olarak seçiyoruz
  • Repository type” kısmını “git” olarak aktif ediyoruz
  • Create Repository” butonuna tıklıyoruz

GitHub için

Açık kaynak kodlu bir proje olacağına göre

  • Repository name” kısmını “BenimYeniProjem” olarak dolduruyoruz
  • Public/Private seçeneklerinde “Public” seçeneğini işaretliyoruz
  • Initialize this repository with a README” seçeneğini aktif ediyoruz
  • Create Repository” butonuna tıklıyoruz

———| STEP 2 | ———————

Terminalimizden repo arşivimize geliyoruz

cd /benim/repo/arsivim/

Sonrasında Repository sayfamızdaki HTTPS Clone linkini kopyalıyoruz ve git clone komutunu veriyoruz

BitBucket için

git clone https://BenimAdim@bitbucket.org/BenimAdim/BenimYeniProjem.git

GitHub için

git clone https://github.com/BenimAdim/BenimYeniProjem.git

———| STEP 3 | ———————

Önceden hazırlanmış bir projemiz varsa şuraya kopyalıyoruz.

/benim/repo/arsivim/BenimYeniProjem/

Dikkat edilecek noktalar

  • Şifrelerimizi, veritabanı bilgilerimizi, api anahtarlarımızı silmeyi unutmuyoruz
  • Git boş klasörleri arşivlemiyor; boş klasörlerin içine “.gitkeep” isminde boş bir dosya oluşturuyoruz
  • Üstünde değişiklik yapmayacağımız dosya ve klasörleri yoksaymak için projemizin ana dizininde “.gitignore” isminde bir dosya oluşturup dosya ve klasörleri şu mantıkta belirtiyoruz
		dosyaadı.php
		/dizin/*.uzantı
		/dizin/

———| STEP 4 | ———————

Artık projemizi BitBucket veya HitHub arşivine göndermeye “commit” hazırız.

Terminalden projemizin ana dizinine geliyoruz

cd /benim/repo/arsivim/BenimYeniProjem

Önce ne değişiklikler yapmışız görelim

git status

burada değişen dosyaların bilgisini göreceksiniz.

git add . 

(Noktaya Dikkat) bu basit komut “tüm dosyaları” git listesine ekleyecektir.

Lakin git add *.* demiş olsaydık .htaccess dosyaları bu listeye dahil edilmeyecekti.

Yine git add /dizin/* demiş olsaydık, sadece ilgili dizini git listesine ekleyecektik.

git commit -m "bir mesaj"

Twit tadındaki bir kısalıkta değişikliği özetliyoruz

git push -u origin master

İşte şimdi yaptığımız değişikliği sunucuya gönderiyoruz.

Bizden kullanıcı adı ve parola isteyecektir ve işlem hızlıca bitecektir.

İşlem bittiğinden emin olmak için git status komutunu tekrar kullanıyoruz.

git status

“nothing to commit, working directory clean” diyorsa yaptığımız değişiklikler GitHub veya BitBucket arşivine gönderilmiş demektir.

Git bir sürüm takibi sistemi olması sebebiyle doğal olarak çok kullanıcılı ve diğer kullanıcılar tarafından yapılmış değişiklikler olabiliyor. Sunucuya bir değişiklik göndermeden önce

git pull

komutu ile sunucuya gönderilmiş diğer değişiklikleri yerelimize almak doğru bir tercih olacaktır.

———| STEP 5 | ———————

Home dizinimizdeki gizli .bashrc dosyamızın sonuna küçük bir fonksiyon ekleyerek bu işlemleri otomatikleştirebiliriz. Komut adının biraz Cem Yılmazvari olmasında bir sakınca yoktur umarım.

basgit() { 
	git add . && 
	git status && 
	git commit -m "$1" && 
	git push -u origin master; 
}

BitBucket’in Issue Tracker ve Wiki araçları olduğunu da unutmadan; phpBB3’ün Git sayfasını (https://wiki.phpbb.com/Git#phpBB3) ziyaret etmenizi öneririm.

———| DİPNOT && KAYNAKÇA | ———————

Bu anlatımı hazırlarken BitBucket dökümanlarından faydalandım: 1

Atladığım adımlar şunlar

* Git Kurulumu.

* Linux kullandığınızı varsayarsak her dağıtım için farklı komut olabilir.
Ubuntu/Debian ailesi için

sudo apt-get install git

Basit bir arayüz de olsun isterseniz “gitg” paketini kurmanızı öneririm.
Ubuntu/Debian ailesi için

sudo apt-get install gitg

* Windows için şu dökümana bakabilirsiniz: 2

* Git’e kendimizi tanıtmak veya kullanıcı adı ve eposta tanımlamak

Şu dökümanda anlatıldığı gibi: 3
Şu komutlardan ibaret!

git config --global user.name "FIRST_NAME LAST_NAME"
git config --global user.email "MY_NAME@example.com"

* Git’de dallar “branch” üstünde çalışmak ve dalları birleştirmek

Şu dökümanda anlatıldığı gibi: 4

* GitHub’da özgür bir proje başlatmak.

Ben iki özgür projemi GitHub’a aktardım.

>> https://github.com/yakusha/linuxhaber.com
>> https://github.com/yakusha/acikkaynaktv.com



05 October 2014

Linux Kullanıcılarının sahip olduğu 5 Süper “Windows 10″ özelliği!


Merhaba, Ömrünüzün 3 yılını daha sizden alacak Windows 10 işletim sisteminin ilk ön-gösterim sürümü yayınlandı. 5 Süper “Windows 10″ özelliğinin Linux kullanıcıları tarafından yıllardır kullanıldığını biliyor muydunuz?

Bilgisayarlarla tanışmam Amiga 500 ile olsa da (Teşekkürler Sait Ergören) ilk bilgisayar eğitimimi Ms DOS üstünde aldım. Sonrasında Windows 95/98 üstünden Microsoft Office programlarının eğitimini aldım ve bilgisayar donanımları üstüne ilave eğitim aldım (1993-1999). Kişisel olarak uzun yıllar Windows 98, Windows XP, Windows 7 kullandım. Çalıştığım firmalarda Microsoft Server 2003 ve Microsoft Server 2007 kullandım. 2001 yılında F klavye kullanmaya başladım ve asla bırakmadım. 2003 yılında Linux ile tanıştım ama kalıcı bir kullanıcı olmam 2010 yılında oldu. 2010 yılında Windows tarafından kullanılmayı bıraktım.

Windows ile olan ilişkim hep nefret üstüne kuruluydu. Nefterime bir akçe daha dün eklendi. NTFS formatlı Terebayt Harici Diskim kardeşimin Windows 8.1 sürümü yüklü bilgisayarına takıldıktan sonra virüslerin istilasına uğramıştı. Klasör adlarıyla aynı exe dosyalarını sildiğimde ise 100GB data duman olup gitmişti. Teşekkürler Windows 3.1, seninle hiç virüs sorunu yaşamamıştık!

Bu acı olayın ardından, itsFoss.com sitesindeki şu yazıdan (http://itsfoss.com/windows-10-inspired-linux/) özet geçerek konuya dönersek; Windows 10 ile duyurulan veya gözlemlenen 5 yeniliğin yıllardır Linux kullanıcıları tarafından kullanıldığını görürsünüz.

“Multiple desktops aka workspaces” Çoklu Masaüstü veya Çalışma Alanları

Windows 10 ile duyurulan en sansasyonel özellik Çoklu Sanal Masaüstü özelliği. Bu özelliği biz Linux ortamında Çoklu Masaüstü veya Çalışma Alanları olarak biliyoruz ve kullanıyoruz. Çalışan uygulamaları farklı Çalışma Alanlarına bölebiliyorsunuz.

Bu özellik kimilerinin hayatına 2015 yılında, “Windows 10″ ile girecek olsa da Linux ortamında bu özelliğin tarihi 1998 yılında KDE 1.0 sürümünün yayınlanmasına kadar dayanmaktadır.

Popüler Linux dağıtımı Ubuntu 14.04’de bu özellik şöyle görünmektedir.

Gnome Masaüstü ortamının 3.0 sürümünde şöyle görünmektedir.

Video Hali:

“Task view aka window spread” Görev Görünümü veya Sıralı Pencere Listesi

“Window Spread” özelliği de Linux kullanıcılarının hayatına Unity ve Gnome 3 ile girmiş gözelliklerden.

/*Lakin ben Compiz Cube ile bu özelliği kullandığımızı zannediyorum.*/

“Desktop plus online search” Masaüstünde ve İnternette birlikte arama

Windows 10 ile birlikte, arama yaptığınızda sonuçlar arasında internet sonuçları da görüntülenecek. Muhtemelen bing arama motorunu kullanarak getirilecek bu sonuçlar ile 2015 yılınan itibaren Microsft, Arama Motoru pazarından daha pay almaya başlayacak.

Ubuntu bu özelliği Unity ve Unity Lensleri ile tamamlamıştı. Ubuntu 12.04 sürümü ile yayınlanan bu özellik 2012 yılından beri Ubuntu Linux kullanıcıları tarafından kullanılmakta. Bu özellik sayesinde aradığınız kelimeyle ilgili yerel dosyalarınız, yerel uygulamalarınız, ubuntu yazılım merkezindeki uygulama sonuçları, amazon arama sonuçları ve sosyal medya, Wikipedia, Youtube sonuçları ayrı ayrı listelenebiliyor.

Konuyla ilgili Video:

Borderless windows and flat icons: Az kenarlı Pencereler ve Geniş İkonlar

“Windows 10″ ile gelecek olan bu tasarım öğesini Ubuntu 14.04 ile Ubuntu kullanıcıları kullanmaya başladı bile.

Convergence of mobile and desktop OS: Mobil ve Masaüstü Ortamının Birleşmesi

Windows 10 ile gelecek olan bir diğer özellik ise Windows 10 işletim sisteminin Mobil ve Masaüstü ortamında birlikte kullanılması olacak.

Bu özellik Linux dünyasına Meizu telefonların Ubuntu 14.10 yüklü olarak gelmesiyle birkaç ay içinde gelecek.

Daha önce de belirttiğim gibi, bu yazının kaynağı biraz da şu yazıdır: http://itsfoss.com/windows-10-inspired-linux/

Windows 10 büyüdüğünde ise bir Linux olmayı istemektedir :)



03 October 2014

Pebble Uygulamam: Magic Button


Pebble maceram geçen dönem başlamıştı. +Gülşah Köse  ile bir watchface üzerine çalışmıştık. (Textwatch-tr) Bu konu hakkında da kısa bir yazı yazmıştım.

Pebble'ı kurcaladıkça ve kullandıkça, birçok telefon uygulaması için "Bunun da bi pebble uygulaması olsa, bildirimleri gelse iyi olur." diye düşünülüyor. 

Necdet hocanın önerisi ile bu sitenin bir pebble uygulamasını yazmaya başladım. Android ve İOS için de çok çeşitli uygulamaları yazılmış. Başlangıçta ilgimi çok çekmeyen ama öğrenmek için yapacağım bir iş gibi gelmişti. Ama ortaya birşeyler çıktıkça daha bir hevesle çalıştım.

Uygulamayı tanıtacak olursam, adı üstünde çok sihirli bir buton :) Ne kadar ters giden durum varsa saniyeler içinde düzeltebilir. Sınav notunuz kötü geldiyse, trafikte mahsur kaldıysanız, sevgiliniz ile kavga ettiyseniz, elektriğe yine zam geldiyse ve daha birçok kötü sorunun çözümü için bir tuş uzağınızda bir uygulama var artık. Daha güzel haberler vermek dileğiyle :)

(uygulama linki)
(kaynak kod)




IstSec ’14 Istanbul Bilgi Güvenliği Konferansı / 15 Ekim 2014


Her yıl düzenlenen IstSec konferansı bu sene 15 Ekim 2014’de düzenleniyor. Benim de Linux Akademi adına “Açık Kaynak Sistemlerle Siber Saldırı Gözlemleme Sistemi Kurulumu ve Yönetimi” isimli bir konuşma yapacağım konferansa ait program ve diğer tüm bilgilern açıklandığı duyuru şöyle:

Ülkemizde eksikliği her geçen gün daha fazla hissedilen ürün/teknoloji bağımsız, çözüm odaklı güvenlik anlayışına katkı sağlamak amacıyla, her yıl düzenli olarak gerçekleştirilen İstanbul’a özel Bilgi Güvenliği Konferansı olan İstSec, bu yıl 15 Ekim 2014 Tarihinde Bahçeşehir Üniversitesi Beşiktaş Kampüsünde gerçekleştirilecektir.

Türkiye’den ve çeşitli ülkelerden konusunda söz sahibi bilgi güvenliği uzmanlarını ve BT güvenliği meraklılarını buluşturacak olan İstSec 2014’ün bu yılki ana teması “Siber Güvenlikte Ortak Vizyon: Yetişmiş İnsan Kaynağı” olarak belirlenmiştir

Konferans Programı:

İstSec 2014’de farklı konularda 12 farklı uzman yer alacaktır. Konferans boyunca sanallaştırma güvenliği, bulut bilişim güvenliği, siber istihbarat toplama yöntemleri, adli bilişim analizi, mobil telefon güvenliği, yeni nesil tehditler ve çözüm önerileri, yeni nesil hacking yöntemleri, siber tehditler ve Türkiye’nin siber güvenlik yol haritası ve APT(Advanced Persistent Threat) gibi konular detaylıca irdelenerek katılımcıların bilgi sahibi olması sağlanacaktır.

Konferans programına ekteki pdften ve http://www.istsec.org/program/ adresinden ulaşılabilir.

Katılım & Kayıt:

Konferansa katılım ücretsiz olup kayıt yaptırılması gerekmektedir. http://istsec.eventbrite.com/ adresinden kayıt işlemi tamamlanabilir.

İletişim:

Konferansla ilgili tüm geri bildirimler için info@istsec.org adresine e-posta gönderebilirsiniz.

Ulaşım:

Bahçeşehir Üniversitesi Beşiktaş Kampüsü
Çırağan Caddesi Osmanpaşa Mektebi Sokak No: 4 – 6
34353 Beşiktaş, İSTANBUL / TÜRKİYE

İstSec ‘14 Bilgi Güvenliği Konferansı’nda görüşmek üzere!


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: ,



28 September 2014

sysdig: Sistem Seviyesi Analiz ve Sorun Giderme Aracı


Genelde IT altyapılarında meydana gelen problemleri gidermek ve bir daha tekrarlanmayacak şekilde proaktif bir yaklaşımla probleme neden ana faktörleri ortadan kaldırmak  için yapılması gereken ilk şey problemi doğru analiz etmektir. Zira doğru olarak analiz edilen bir problem için üretilen çözümler doğru orantılı olarak kalıcı ve ilgili problemin ya da varyasyonlarının tekrar yaşanmasını engelleyici nitelikte olacaklardır. Hal böyle olunca yani iş, problem analizine geldiğinde bu konudaki başarıyı belirleyici en önemli faktör ise yaklaşımlarınız ve kullandığınız araçlardır.

Bu noktada doğru yaklaşım herzaman için problemin nedenlerini tam olarak anlamaktır. Yani eğer ortada neden kaynaklandığını bilemediğiniz ancak geçici çözümler üretebildiğiniz – ki gerçek hayatta en çok problemli servisi / sunucuyu restart etmeye tekabül eden – bir problem varsa önceliği problemi geçici olarak çözmek yerine nedenlerini anlamaya çalışmak üzere konunun derinlerine inmek ve altyapıyı enine boyuna analiz etmeye vermek en doğru yaklaşım olacaktır.  Problem çözmede en belirleyici ikinci faktör ise, analiz sırasında kullandığınız araçların derine inmek ve inceleme konusundaki ihtiyaçlarınıza cevap verecek şekilde gelişmiş olması gerekliliğidir. İşte bu yazının konusunu oluşturan sysdig de tarif ettiğimiz bu ihtiyaçlara harika bir şekilde yanıt veren çok güzel bir uygulamadır.

Sysdig Nedir ?

Temel olarak hemen tüm majör Linux dağıtımında çalışan ve doğrudan linux kernel’ine dahil olarak tüm sistem çağrılarını ve OS ile ilgili diğer olayları en alt düzeyde yakalayıp analiz edilmesine olanak sağlayan sysdig, bu işi yapan strace gibi klasik araçlardan farklı olarak bir çok güzel özellik barındırmaktadır.

Öncelikli olarak kernel seviyesinde processing, network, storage ve memory alt sistemlerinde cereyan eden olayların anlaşılır şekilde ve bütünleşik olarak görüntülenmesine olanak sağlar. Bu, incelemekte olduğunuz platform üzerinde çalışmakta olan uygulamaların sistem seviyesinde ne gibi işlemler yaptığını görüntüleyebilmenize olanak sağlamaktadır ki , sysdig üzerinden elde edilen veri, problem çözmede kullanılabilecek ve genelde log dosyalarından ya da uygulama bağımlı debugging araçlarından elde edilemeyecek türden alt seviye kıymetli bilgi içerir.


Devamini okuyun: sysdig: Sistem Seviyesi Analiz ve Sorun Giderme Aracı


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: ,



26 September 2014

Fedora 20 Adım Adım Laravel Kurulumu


Hepinizin malumu Laravel şu an en popüler php frameworklerinden biri. İnternette Ubuntu için oldukça fazla anlatım mevcut olmasına rağmen Fedora'da oldukça kısıtlı ve eksik. Böyle olunca lamp kurulumundan başlayarak adım adım anlatalım dedik. Hadi başlayalım.

1.LAMP KURULUMU

   1.1 Apache Kurulumu

      Paket Yöneticisi Güncellenir

      #sudo yum update

      Apache web sunucusu kurulur

      #sudo yum install httpd

      Web sunucusu çalıştırılıp kontrol edilir

      #sudo service httpd start

      Tarayıcı'ya http://localhost yazılırsa şöyle bir şey çıkması lazım


     1.2 Mysql Kurulumu

       Mysql Kurulur ve başlatılır

       #sudo yum install mysql mysql-server       #sudo service mysqld start       


       Mysql Güvenli Kurulum betiği çalıştırılır

      #sudo /usr/bin/mysql_secure_installation
     
      Aşağıdaki gibi sorulara cevap verilir.


/usr/bin/mysql_secure_installation: line 379: find_mysql_client: komut yok

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): Burada enter'a basıyoruz
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n
 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

     1.3 PHP Kurulumu

       Php ve gerekli modülleri yüklenir

       #sudo yum install php php-mysql php-mcrypt 
         (mcrypt paketi kurulmazsa laravel kurulumunda hata verebilir)    

     1.4 Sistem Açılış Ayarları

       Aşağıdaki komutları yazarak http ve mysql servislerinin sistem açıldığında otomatik açılmasını sağlıyoruz
        #sudo chkconfig httpd on
        #sudo chkconfig mariadb on



     1.5 Php Testi

       Nano Editörü yüklenir

       #sudo yum install nano
       #sudo nano /var/www/html/info.php

       Açılan editöre aşağıdaki kod kopyalanır

     
             <?php 
             phpinfo(); 
            ?>

        Kaydedilip çıkılır. Apache yeniden başlatılır

         #sudo service httpd restart

        Tarayıcı'ya http://localhost/info.php yazılırsa şöyle bir şey çıkması lazım



2.LARAVEL KURULUMU

  Terminalde şu komutu yazıyoruz

   #sudo curl -sS https://getcomposer.org/installer | php
  

  Composer.phar dosyasını çalıştırılabilir dosyalar klasörüne atıyoruz.

   #mv composer.phar /usr/local/bin/composer

  Html Klasörümüze gidiyoruz

   #cd /var/www/html
   #composer create-project laravel/laravel proje-isminiz
   #cd proje-isminiz
   #composer install
   #cd ..
   #sudo chmod -R 777 proje-isminiz
   
   Tarayıcı'ya http://localhost/deneme/public/ yazdığınızda aşağıdaki ekran gelmesi lazım. Gelmiyorsa SElinux engelliyordur. Kaldırmak için
    #nano /etc/selinux/config 
    Bu dosya içerisinde yer alan SELINUX=enforcing yazan satırı SELINUX=disabled veya permassive olarak değiştiriyoruz  ve dosyamızı kaydediyoruz.


   


23 September 2014

CentOS 7.0 Üzerinde Zimbra Server 8.0 Kurulumu


Bir eposta sunucusuna ihtiyaç duyduğunuzda seçebileceğiniz bir çok alternatif bulunuyor; bunlardan en iyilerinden birisi ise gerek kolay yapılandırması ve gerekse görsel olarak güzel bir yönetim arabirimi sunması, ve son kullanıcıya modern ve mobil uyumlu arayüz sunması nedeniyle Zimbra Collaboration Suit’dir. Özellikle alternatif posta sunucularından farklı olarak takvim, dosya paylaşımı, görev listesi, görsel konferans ve sunduğu bir çok yan uygulamayla birlikte firmaların iş yapış şekillerine ve koordinasyonlarına da son derece olumlu katkılar yapan Zimbra’nın GPL lisanslı Open Source sürümü tekbaşına hemen bir çok firmanın temel ihtiyaçlarını fazlasıyla karşılayacak şekilde bir çok özellik barındırıyor.

Yakın zamanda, Telligent Systems tarafından VMWare’den alınan Zimbra’nın Network Edition isimli bazı ek özellikler sunan bir de ücretli sürümü bulunuyor. Ama yukarıda da bahsettiğim gibi genel anlamda Open Source Edition temel ihtiyaçları karşılamak açısından son derece yeterli. Zimbra her ne kadar cloud-based bir e-mail platform çözümü olsa ve bu nedenle aynen Google Apps’de olduğu gibi web üzerinden istemci erişimine yoğunlaşmış olsa da Zimbra Desktop adında bir mail istemcisi de bulunuyor.


Devamini okuyun: CentOS 7.0 Üzerinde Zimbra Server 8.0 Kurulumu


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: , ,