Benim için 2018 nasıl geçti?

Her sene bu yazıyı yazarken gerçekten koca bir yılı sorguluyorum, bazen sonuç çok mutluluk verici oluyor bazense tam bir hayal kırıklığı. Peki ya bu yıl nasıl bir sonuç doğurdu? Başlayalım..

Ben genelde yıl değerlendirmesi yaparken önce sosyal medya hesaplarımı kontrol ediyorum. Ocak ayından aralığa doğru kısa bir gezintiye çıkıp hafızamı tazeliyorum. Ancak yıllardır kullandığım facebook hesabım kapandığı için ne yazık ki facebook tarafında bunu yapamadım ama sanırım çok kaybım olmadı. Bu yıl fazla meşguldüm çok fazla facebook paylaşımı yapmadım diye hatırlıyorum 🙂

2018’in ilk aylarında 2017’den kalma sıkıntıları toplamaya başladım. Udemy’de çıkardığım PHP Eğitim Seti, bu yılın iyi geçmesini sağlayacak özgüveni verdi bana. Yıllarca kendime paranın bir önemi yok desemde, yaş ilerledikçe anlıyorum ki, paranın hala bir önemi yok ama parasız insanında başkaları için pek bir önemi yok 🙂 Kısaca ne böyle senle, nede sensiz modundayız.

Öncelikle bu yıl hiç yapmadığım bir şey var ki, o da kitap okumak. Bu yüzden 2019’da ki ilk hedefim en az 20 kitap bitirmek. Bu sene hiç bir şeyi doğru düzgün yapamadım çünkü tam bir freelance yılı oldu benim için. Yeterli özveri ile çalışıldığında sadece evde bilgisayar başında istediğiniz saatte rahatça boxer’ınız altınızda kolanız ve nargileniz yanınızda bir CEO’nun ya da bir doktorun kazandığı parayı kazanabiliyorsunuz.

Eğer olaya tamamen para kazanmak olarak bakarsanız, başarılı olabilirsiniz. Bende bu şekilde baksaydım bu yıl sadece freelance çalışmalarından 200-250 bin ₺ kazanmış birisi olarak kendimi başarılı sayardım. Ancak ben ve benim gibi çoğu insan biliyorum ki paranın ötesinde başka arzulara sahipler. Örneğin üretmek gibi. Üretmeden durabilen insanları hayal edebiliyor musunuz?

Uzunca bir süre düşündüm, insan nasıl üretmeden durur diye. Öyle büyük ya da anlamlı şeyler değil her zaman, sıradan basit şeyler bile olsa üretmeli insan. Mesleğini seçip, seçtiği mesleği en iyi şekilde geliştirmeli, üretmeli, daha çok üretmeli.. Ben bugüne kadar üretebildiğim kadar ürettim, hiçbir zaman heyecanımdan vazgeçmedim. Hiçbir zaman ya bunu daha önce yaptılar zaten, ben yapmayayım demedim. Elbette çok zor süreçlerden de geçtim ama bir şeyleri başarabildiğim için mutluyum.

Ofis mi açtım?

Tam olarak ofis diyemeyiz. Ben normalde babamla birlikte yaşıyorum, ancak zaman zaman yanından ayrılıp bazen şehir dışına çıkıyorum bazende kendi evime çıkıyorum. Bu yılda sanırım mart ayıydı, home office tarzında bir yere çıktım. Şöylede güzel bir ortamım vardı.

YouTube kanalı ne durumda?

Bu sene, uzun zaman sonra sanırım en aktif yılımdı. Prototürk youtube kanalında bir çok farklı konu anlattım, şöyle bir istatistiklere bakarsak;

Videolarım 1 milyon dakika‘dan fazla izlenmiş

Ortalama 300 bin görüntülenme olmuş.

Gelir olarakta koca 1 yılda toplam 266$ gelir elde etmişim 🙂

Ayrıca bu sene videolarıma 5541 beğeni169 beğenmeme1808 yorum1712 paylaşım almışım ve kanala 2473 yeni kişi daha takip etmeye başlamış. Şu an için toplam takipçim 14.713 kişi.

Ben bu istatistikleri çok değerli buluyorum çünkü, yoğunluğumdan dolayı sadece yılın son aylarında ağırlık verebildim derslere. Zaten grafiklere bakarsanız çoğunun sonlara doğru arttığını görüyorsunuz 🙂

Eğer hala kanalımı takip etmiyorsanız, 2019’da kendinize bir iyilik yapıp takip etmeye başlayabilirsiniz.

Udemy nasıl gidiyor?

Açıkçası, beklediğim kadar iyi değil. Muhtemelen bunda kursu henüz bitirememiş olmamla alakası var ancak şu ana kadar 33,5 saatlik bir eğitim oldu ve içime çok sindi. Daha da dersleri artırarak 50-60 saate çıkartıyorum. Udemy içinde videoları sonralara doğru daha hızlı yüklemeye başladım.

Yine de 1 sene içerisinde 2500 kişiye ulaştım. Bunların bazıları benim ücretsiz olarak dağıttığım kuponlardan geldi, bazıları sırf bana bunca yıldır ders anlattığım için destek olmak adına geldiler. Buradan 2500 kişiye çok teşekkür ediyorum, desteğinize minnettarım.

Peki ne kadar kazandım Udemy’den? Eminim bir çoğunuz bunu merak ediyor, neden böyle şeyler merak edilir anlamadım ama fikir vermesi adına sizlere ne kadar kazandığımı söyleyeyim. 9145$ / 1 senede. Bunu şuanki kurla çarparsanız ortalama 50 bin ₺ çıkar. Aşağı yukarı bu ortalamada bir kazanç sağladım.

Ve şunu anladım, Udemy’e 5-10 tane eğitim seti çıkartsam, hiçbir kalitesi olmasa ama popüler kesime hitap etse, aylık 10-15 k para kazanmayı garantilerdim. Yinede yapmadım, ben zaten birini bitiremedim o ayrı ama isteseydim birbirinden kalitesiz kurslar çıkarabilirdim. Yinede herkes kendine yakışanı yapar, ben yapmadıysam demek ki bana yakışacağını düşünmedim 🙂 Ama 2019’da yeni kurslar gelecek, özellikle API’ler hakkında kapsamlı bir kurs ve framework’ler hakkında. 2018 o kadar güzel geçti ki, 2019’dan çok umutluyum 🙂

What about my Aşk Status

Aşk durumuma gelecek olursak, ilk defa yıl değerlendirmesinde hayatımda olan bir kadından bahsedeceğim. Daha önce hiçbir ilişkimi alelen paylaşmamıştım. 2017 yılbaşı gecesi yüz yüze ilk kez tanışma fırsatını bulduğum ve 2018 nisan ayında birlikte yaşamaya başladığım ve hala birlikte yaşadığım bu kadın sayesinde sanırım bu yıl mükemmel geçti.

Neden peki? Çünkü bir amaç uğruna bir şeyleri başarmaya çalışmak çok daha farklı bir durum. Ve hayatımda bir amacımın olduğunu hissettiğim zaman, o amaca hizmet edecek davranışlarda bulunuyorum. Buda bende genelde daha çok üretmeyi tetikliyor ve amaçsız olmadığım için daha çok çalışmayı. Bu yüzden amacını kaybetmiş insanlara üzülüyorum, 2017’de kaybettiğim amacımı tekrardan buldum ve bunu bu kadına borçluyum. Hepinizin hayatında çok sevebileceği bir kadın / erkek olur umarım.

Projeler var mı?

Aslında bu yıl kişisel olarak tek yaptığım şey, Uzman Cevap’ı hayata geçirmekti. Evet efendim, sonunda uzman cevap’ı yeniden ayağa kaldırmayı başardım 🙂

Şu an için 700 geliştirici kayıtlı, 700’den fazla soru soruldu ve 1500’den fazla cevap verildi. Ve tüm bunlar sadece 2 ay içerisinde oldu! 2019’u varın siz düşünün 🙂

Ayrıca bu yıl kişisel youtube kanalımda #SenceBen etiketiyle aile bireylerimle yaptığım röportajları yayınladım. Yaptığım işi ne kadar iyi biliyorlar, gerçekte ne yaptığımı düşünüyorlar, ne kadar kazandığımı düşünüyorlar gibi sorular sordum ve güzel bir seri çıktı ortaya 🙂

Bu sene Freelance iş durumu nasıldı?

Ülkede bulunan krize rağmen, bu sene freelance olarak iyi bir yıldı. Genelde bu tür krizlerden biz etkilenmiyoruz zaten, ama yinede elektrik faturası kullanım bedelinin 2 katı gelince insan sinirleniyor. Soğan pazarda lüks olunca, herşeyin fiyatı iki ile çarpılınca, kazanılan paranındda çok bir önemi kalmıyor. O yüzden bu konuda çok fazla şey söyleyemem, demokrasi diye bir şey vardır illaki 🙂

Senenin başından sonuna kadar, hatta şu anda bile yoğun şekilde freelance çalışmalara devam ediyorum. 2019’un ilk 3 ayını şimdiden doldurdum diyebilirim. Böyle zamanlarda aklıma eski zamanlar geliyor, inanır mısınız öyle zamanlar oldu ki erbilen.net’in süresini uzatacak parayı bulamadım babamdan aldım utana sıkıla. Yıllar önce bu işlere başladığımda 50₺’ye front-end yapardım sırf referans olsun, işi daha iyi öğrenebileyim diye.

Yıllar sonra bugüne geldiğimde, artık sektörde hemen hemen herkesin sevdiği, en azından ismen duyduğu, yardım sever bir insan olarak tanınıyorum. Beni takip eden kişilerle yüz yüze görüştüğümde, onların bana karşı samimiyetini gördüğümde anladım nasıl içlerine girdiğimi. Buda çok güzel bir duygu, benim içinde hayatımın başarısı. Hayatımda her şey bu mesleği seçtiğimde anlamlaşmaya başladı, eğitimlere başladığımda ise doğru yolu bulduğumdan emindim. Beni en çok heyecanlandıran şey, kendi fikir ve düşüncelerimi bir başkasına anlatarak onlara bir şeyler katabilmekti. Bunu bugün yapabildim diyorsam sizlerin sayesindedir. Dahada uzun uzun birlikte devam edeceğimize eminim 🙂

Ya arkadaşlıklar?

Ben çok sık arkadaş edinip samimi olan birisi değilim. Bu yıl hayatıma girip arkadaş olarak gördüğüm çok az kişi vardır. Ama sanırım bu yıl tanışıpta kanımın kaynadığı tek insan youtube’da kablosuzkedi olarak bildiğiniz (bilmiyorsanız lütfen bakın) Gökhan Kandemir oldu. Kaliteli insanları hep sevmişimdir, bir kezde buradan dile getirmiş olayım dedim 🙂

Son olarak…

Bu yıl güzelliklerin dışında anlatabileceğim çok bir şey yok. 2017 Macbook Pro’mu satıp mid 2015 bir macbook pro aldım. Ve şunu anladım ki, yeni teknolojilere hemen ayak uydurmak doğru bir yaklaşım değil. Ama yinede apple’ın çıkardığı siyah klavye ve fareyi almamaya engel olamadım kendimde 😀 Ayrıca 6 ay telefonsuz yaşadığımı biliyor muydunuz? Sonunda müşterilerin direktifleri doğrultusunda mecburen tekrar kullanmaya başladım. Size delice bir istatistik daha vereyim, ben bu sene 1 tondan daha fazla kola tükettim, 800’den fazla nargile içtim. Ayrıca takdir edersiniz ki hayvan gibi kilo aldım, 96 kiloyum.

Ve şunu anladım ki, iyi bir amacın varsa, yaşamakta çalışmakta, paylaşmakta çok keyifli. Aynı keyfi sizlerinde yaşadığını umuyor, hepinize sevgili dolu bir yıl diliyorum.

Her yıl değerlendirmesi yazısında yaptığım gibi, sizi 2012’de yapmış olduğum yeni yıl şarkısıyla baş başa bırakıyorum. Ben yenisini yapana kadar buna hep maruz kalacaksınız evet 😀

Ayrıca bkz:
Benim için 2017 nasıl geçti?
Benim için 2016 nasıl geçti?
Benim için 2015 nasıl geçti?
Benim için 2014 nasıl geçti?
Benim için 2013 nasıl geçti?
Benim için 2012 nasıl geçti?

Youtube’da Videolarınıza Gelen Tüm Yorumlara Otomatik Kalp Atın

Ben kalp atmayı çok seviyorum, birine değer verdiğini gösteriyor. Ama ne yalan söyleyeyim tek tek atmasıda çok zahmetli. Tabi birde bu özelliğin yeni geldiğini kabul edersek bundan 5-6 sene önceki insanların yorumlarını kalplemeyi isterdim. Ama bunu elle yapmak mantıklı değil, öyle console’dan bir deneyim çalışır mı dedim çalıştı, normalde bu denli büyük siteler buna engel olurlardı ama youtube canım sağolsun kafasına takmamış. Henüz studio’ya geçmediği için olsa gerek, bu yüzden videolarınıza gelen yorumlara kalp atmak isterseniz dashboard’da yorumlar sayfasına gidin. Chrome’da developer tools’u açın ve şu kodları yapıştırıp çalıştırın ve bekleyin. Taki bitene kadar 😀

function autoHeart(){
var buttons = document.querySelectorAll('.yt-uix-creator-heart-button');
[].forEach.call(buttons, function(button) {
button.click();
});
}
autoHeart();
setInterval(function(){
document.getElementById('yt-comments-paginator').click();
autoHeart();
}, 1500);

Bilmiyorum ne işinize yarar ama benim takipçilerimle etkileşime girmemi sağladı tekrardan. Çünkü takip edenlere bildirim gittiği için, mutlu olduk hep birlikte 😀

Gulp’ta Yavaş Çalışan Uglify Derlemesi Nasıl Düzeltilir?

Merhaba arkadaşlar, sizlere gulp’ın kullanımını anlatmıştım. Ancak zamanla kullandıktan sonra yaşadığım bir sorununda çözümünü paylaşmak istiyorum. Büyük front-end projelerinde, javascript tarafındaki kodlar çoğaldıkça fark ettim ki, kullandığım uglify paketi çok yavaş şekide build etmeye başladı dosyaları. Yani öyleki bir js değişikliğinden sonra 8-10 sn arası bekliyordum build etsin diye. Bunun böyle olmayacağını düşünüp araştırmaya başladım ve gulp-fs-cache paketini buldum.

İlgili paketin linki; 
https://www.npmjs.com/package/gulp-fs-cache

Kurulumu ise;

npm install gulp-fs-cache

Kullanım

Benim eski kodlarım şu şekildeydi;

gulp.task('js', () => {
return gulp.src('scripts/*.js')
.pipe(uglify())
.pipe(concat('app.min.js'))
.pipe(gulp.dest('dist/js'));
});

Bu şekilde kodlar çoğaldıkça derleme süresi 8-9 saniyeyi bulmaya başladı. Gif’e gözatın!

Ve bu paketi kullanarak şu hale dönüştürdüm;

gulp.task('js', () => {
let jsFsCache = fsCache('tmp/jscache');
return gulp.src('scripts/*.js')
.pipe(jsFsCache)
.pipe(uglify())
.pipe(jsFsCache.restore)
.pipe(concat('app.min.js'))
.pipe(gulp.dest('dist/js'));
});

Sonuç ise mükemmel 🙂

Kolaylıklar dilerim 🙂

CSS ile Mobilde Kaydırma Hassaslığı

Bildiğiniz gibi mobil için ayrı ayrı css kodları yazmak durumundayız, çünkü mobil tarayıcılar henüz her özelliği desteklemediği gibi, sadece mobil tarayıcılar için özelliklerde mevcut. Hal böyle olunca, yazarken dikkat edilmesi gereken bazı durumlar oluyor. Bu makalede en temel problem olan kaydırma problemini ele alacağız.

Nedir bu problem dersenizde, aşağıdaki gif’e gözatalım;

Şimdi bunun html ve css kodları şu şekilde;

<div class="content">
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
    Erbilen.net <br>
........
</div>
<style type="text/css">
.content {
    height: 300px;
    overflow: auto;
}
</style>

Hal böyle olunca kayma hassaslığı yok, ios cihazlarda boncuk boncuk kayar normalde. İşte kaymaya bu ivmeyi kazandırmak için css’de ufak bir kod eklemek gerekiyor. Yani kısaca;

<style type="text/css">
.content {
    height: 300px;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}
</style>

Ve sonuç ise;

İyi kodlamalar <3

.htaccess ile HTTPS’ten HTTP’ye Otomatik Yönlendirme

Uzman cevap’ın ssl’ini iptal edip normala döndürmek istedim ancak araştırmalarım ve bilgilerim doğrultusunda PHP ile bunu sağlıklı şekilde yapmak mümkün olmadı. Eğer ihtiyacınız olduğunda araştırdığınızda görmüşsünüzdür, eğer $_SERVER[‘HTTPS’] değeri on ise yönlendirme işlemi yaptırıyorlar. Ancak ne yazık ki ben bu değerin on olduğunu hiç görmedim 😀 Bunun sebebide sanıyorum ssl’i cloudflare’dan kullandığımız için. Ama sonunda .htaccess ile yönlendirme yapmanın bir yolunu buldum. İşte size o güzel kodlar;

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Keyifli kodlamalar.

PHP ile MySQL ve Klasör Yedeği Almak

Merhaba arkadaşlar, 2 bölümlük bir video serisi hazırladım. Sırasıyla önce mysql’in sonrada klasör’ün yedeğini PHP kullanarak nasıl alıyoruz bunu gösterdim. Bu yazıda da ufaktan mantığını açıklamaya çalışacağım.

MySQL Yedeğini Almak

Şimdi ilk olarak Mysql’in yedeğini almak için türlü türlü yol var, ancak çoğu konfigürasyon gerektiriyor. Yani özel ayar yapmak gerekiyor, fakat paylaşımlı hostinglerde bunlara müdahale edilmediği için bu backup işlemini mümkün olduğunca php tarafında çözmeye karar verdim.

Bundan dolayı, php tarafında sırasıyla şu değerleri almam gerekiyordu;

  • Tabloların Listesi
  • Tablonun Oluşturulma Değerleri
  • Tablonun Kolon Değerleri
  • Tablonun Satırları (Verileri)
  • Trigger’lar
  • Function’lar
  • Precodure’ler

Tabl0ların Listesini Almak

Veritabanımızda mevcut tabloları listelemek için şu komutu kullanıyoruz;

SHOW TABLES;

Bu komut bize tüm tablolarımızın isimlerini veriyor.

Tablonun Oluşturulma Değerleri

Mevcut tablonun oluşturulma değerlerini almak için şu komutu kullanıyoruz;

SHOW CREATE TABLE tablo_adi

Bu komutu çalıştırdıktan sonra bize CREATE TABLE tablo_adi …. şeklinde oluşturma kodlarını verecek. Böylece bizim yazmamıza ve düşünmemize gerek yok.

Tablonun Kolon Değerlerini Almak

Tablodaki oluşturduğumuz kolonların değerlerini almak için şu komutu kullanıyoruz.

SHOW COLUMNS FROM tablo_adi

Bu komutu çalıştırınca bize tabloya ait kolonların değerleri dönüyor.

Tablonun Satırlarını (Verilerini) Almak

Bu klasik select işlemi ama yinede gösterelim;

SELECT * FROM tablo_adi

Trigger’ları Almak

Zaman zaman crud işlemleri harici bu tarz yapılara ihtiyaç duyuyoruz. Ve eğer çalıştığımız veritabanı üzerinde oluşturduğumuz trigger, function, procedure gibi yapılar var ise bunlarıda alacağımız yedek dosyasına dahil etmemiz gerek. Ama korkmayın, mysql bizi düşünmüş ve kolay yollarını vermiş. Şimdi mevcut triggerları listelemek için şu komutu kullanıyoruz;

SHOW TRIGGERS

Ve bir trigger’ın oluşturma değerini almak için ise şu komutu kullanıyoruz;

SHOW CREATE TRIGGER trigger_adi

Zaten bu iki sorgu ile gerekli değerleri alıyoruz. Ancak videoda vurguladığım bir olay vardı. DELIMITER muhabbeti, onu videoya gözatarak anlayabilirsiniz.

Function’ları Almak

Aynı şekilde mysql function’ları almak içinde kolaylık sağlıyor. Function’ları listelemek için şu komutu kullanıyoruz;

SHOW FUNCTION STATUS WHERE Db = 'db_adi'

Burada diğerinden farklı olarak db adını belirttik. Çünkü diğer türlü diğer veritabanlarında olan functionlarda listelenebiliyor. Ve function oluşturma değerini almak için ise şu komutu kullanıyoruz;

SHOW CREATE FUNCTION function_adi

Procedure’leri Almak

Bu konuyu henüz sizlere anlatmasamda, eminim mysql tarafında procedure oluşturup kullananlarınız vardır. Bunlarında listesini almak için şu komutu kullanıyoruz;

SHOW PROCEDURE STATUS WHERE Db = 'db_adi'

Mevcut procedure’ün oluşturma değerini almak için ise şu komutu kullanıyoruz;

SHOW CREATE PROCEDURE procedure_adi

Evet bu komutları kullanarak bir mysql backup’ı almak çok kolay. Videoyu izleyip detaylarına ulaşabilirsiniz.

Klasör Yedeğini Almak

PHP tarafında belirttiğimiz dizinin alt dizinleri ve dosyalarıyla birlikte yedeğini alıp ZipArchive sınıfını kullanarak sıkıştırıp bir zip dosyasına getirme işleminde ilk olarak bir dizin listeleme fonksiyonu oluşturmalıyız. Buda recursive fonksiyon olmalı ki alt dizinleri ve onların dosyalarınıda alabilelim. Örnek bir recursive dizin listeleme fonksiyonu şöyle olabilir;

private function getDirectory($dir)
{
    static $files = [];
    foreach (glob($dir . '/*') as $file) {
        $notInclude = !in_array(str_replace($this->config['folder']['dir'] . '/', null, $file), $this->config['folder']['exclude']);
        if (
            is_dir($file) &&
            $notInclude
        ) {
            call_user_func([$this, 'getDirectory'], $file);
        } else {
            if ($notInclude)
                $files[] = $file;
        }
    }
    return $files;
}

Tabi biz bunu derste bir sınıf halinde yazdığımız için metod olarak tanımladık. Ve ek olarak listelemek istemediğimiz dosya ya da dizin varsa bunu exclude değerinde belirttik. Dosyaları listeleyip zip’e ekleme kısmı ise şöyleydi;

$files = $this->getDirectory($this->config['folder']['dir']);
$zip = new ZipArchive();
$zip->open($this->config['folder']['file'], ZipArchive::CREATE);
foreach ($files as $file) {
    $zip->addFile($file);
}
$zip->close();

Şimdi hepsini toparlayıp anlamak için videolara bakmanızı şiddetle tavsiye ediyorum. Ayrıca videoda hazırladığım sınıfı github’da paylaştım ki alıp geliştirebilin 🙂

Github Sayfası

Adını Backuphp olarak belirledim. P’leri birleştirdim 😀 Daha yaratıcı isimlere açığım. Olası hataları github üzerinden belirtirseniz geliştirmeye açığım. Sizde fork edip kendiniz geliştirebilirsiniz.

Github Linki: https://github.com/tayfunerbilen/backuphp

Github’ı kullanmıyorsanız hemen bir hesap açıp kullanmaya başlayın. Geliştirici olarak burayı ve buradaki gelişmeleri takip etmeniz sizin gelişiminiz açısından çok önemli arkadaşlar.

Yazımı burada sonlandırıyorum, sevgiyle kalın.

Composer Kurulumu ve Kullanımı (macOS & Windows)

PHP’de bağımlılıkları yüklemek için kullandığımız Bağımlılık ya da Paket Yöneticisi olarak adlandırdığımız Composer nasıl kurulur, nasıl kullanılır bunları öğreneceğiz.

macOS için Kurulumu

Terminalinizi açıp aşağıdaki kodları sırasıyla çalıştırın;

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

Bu kodla composer-setup.php dosyasını indirdik. Şimdi çalıştıralım;

php composer-setup.php

Composer kurulumu tamamlandı, indirdiğimiz php dosyasını silelim.

php -r "unlink('composer-setup.php');"

Şimdi yüklenip yüklenmediğini test etmek için;

php composer.phar --version

Burada eğer versiyon değeri dönüyorsa, bu iş tamamdır. Yalnız biz bunu global olarak kurup composer şeklinde kullanmak istiyoruz. Bunun için şu komutu çalıştıralım;

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

Evet, artık şu şekilde kullanmaya hazırız;

composer --version

macOS için kurulum bu kadardı.

Windows için Kurulum

Windows’ta kurulumu exe dosyası indirerek yapıyoruz. Şu adrese girdikten sonra Composer-Setup.exe dosyasını indirin. Klasik next->next->next kurulumu. Sadece 2. aşamada php.exe yolunuzu belirtmeniz gerek. Hangi local programı kullanıyorsanız ona göre php’yi bulup php.exe’yi seçmeyi unutmayın.

Kurulum bitince cmd’yi çalıştırdığınızda ve şu komutu yazdığınızda versiyon değerini göreceksiniz;

composer --version

sonuç;

Composer Kullanımı

Bağımlılıkları yüklemek için şu komutu kullanıyoruz;

composer require paket_adi

Örnğein;

composer require phpmailer/phpmailer

Bu bize phpmailer paketini kuracaktır. Paket kurduğunuzda vendor adında bir klasör ve composer.json adında bir dosya göreceksiniz. vendor klasöründe kurduğunuz paketler yer alıyor. İçerisindeki autoload.phpdosyasını projenize dahil etmeniz paketleri kullanmanız için yeterli olacaktır.

composer.json dosyası ile hangi bağımlılıkları kuracağımızı belirtebiliriz. Örneğin;

{
    "name": "tayfunerbilen/test3",
    "description": "test",
    "require": {
        "phpmailer/phpmailer": "^6.0",
        "mgp25/instagram-php": "^5.0",
        "tayfunerbilen/basicdb": "dev-master"
    },
    "authors": [
        {
            "name": "tayfunerbilen",
            "email": "[email protected]"
        }
    ]
}

Ve composer.json dosyamız var ise, şu komut ile mevcut paketleri kurabiliriz.

composer install

ayrıca paketlerde yeni bir versiyon çıktığında güncellemek için şu komutu kullanabilirsiniz;

composer update

Not: Composer kullanımı için php.ini’de allow_url_fopen özelliğinin On değerinde olması gerekiyor.

Composer

Hepsi bu kadar, kullanmanız dileğiyle 🙂

Google PHP API ile Real Time Analytics Bilgilerini Almak

Merhaba arkadaşlar, Google’ın bize sunmuş olduğu beta olarak kullandığımız PHP API’yi kullanarak real time analytics bilgilerini nasıl alacağımızı öğreneceğiz. Hadi başlayalım.

1. Adım (Proje oluşturmak)

Öncelikle https://console.cloud.google.com adresine giriyoruz ve yeni proje oluştur diyerek bir isim belirleyip projemizi oluşturuyoruz.

Daha sonra sol menüden Kitaplık bölümüne giriyoruz. İlgili link: https://console.cloud.google.com/apis/library

Analytics diye aratıp Analytics API’yı buluyoruz ve içine girip aktif et diyoruz.

Aktif ettikten sonra yine sol menüden tekrardan Kimlik bilgileri kısmına giriyoruz. İlgili link: https://console.cloud.google.com/apis/credentials

Burada bir tane “Hizmet hesabı anahtarı” oluşturuyoruz.

Açılan sayfada yeni hizmet hesabı deyip bir hesap adı belirleyin. Ve alttaki anahtar türünün json olduğundan emin olun. Diğerlerine dokunmanıza gerek yok. Oluştur deyin, çıkan uyarıda da yine rolsüz oluştur deyin. Oluşturma işlemi bittiğinde bir json dosyası indirilecek otomatik olarak. Onu saklayın, çünkü google’ın cloud servislerine bağlanmak için onu kullanacaksınız.

Şimdi sol menüden IAM ve yönetici > Hizmet hesapları kısmına girin. Orada bir e-posta adresi göreceksiniz. Bu az önce hizmet hesabı oluştururken oluşan e-posta adresimiz. Onu kopyalayın ve bir sonraki adıma geçin.

2. Adım (Analytics Ayarları)

Şimdi Google Analytics’e girelim. Sol altta Admin ya da ayarlar simgesi var ona tıklayalım. Burada bir önceki adımda kopyaladığımız e-posta adresini üyeler kısmından eklememiz gerekiyor. Ayarlara girdiğinizde, view altındaki “User Management” kısmına tıklayın.

Ve buradan sağ üstteki + butonuna basıp add new user diyoruz. açılan sayfada kopyaladığımız e-posta adresini girip add diyoruz hepsi bu.

Son olarak hangi analytics hesabını kullanacaksanız, yine ayarlar bölümünde view altındaki “View Settings’e girin ve oradaki View ID’nizi kopyalayın, lazım olacak 🙂

3. Adım (Google PHP API Kurulumu & Kullanımı)

Google’ın beta olarak yayınladığı PHP API linki aşağıdadır.
https://github.com/googleapis/google-api-php-client

Şimdi zaten github sayfasında da anlatılıyor. Ya Composer ile kurun ya da son release edilen versiyonunu indirin diyor. Buna göre istediğiniz şekilde indirebilirsiniz. Her iki yoldada bir adet vendor klasörünüz olacak ve bunun içindeki autoload.php’yi sayfamıza dahil edeceğiz. Ayrıca json dosyası olarak indirdiğimiz dosyayıda projenize dahil edin. Şimdi gelelim asıl işi yapan kodlarımıza;

require __DIR__ . '/vendor/autoload.php';

$viewId = 'XXXX'; // sizin kopyaladığınız analytics id'niz

$client = new Google_Client();
$client->setAuthConfig(__DIR__ . '/sizindosyaniz.json');
$client->setScopes([
    'https://www.googleapis.com/auth/analytics.readonly'
]);

$analytics = new Google_Service_Analytics($client);

$result = $analytics->data_realtime->get(
    'ga:' . $viewId,
    'rt:activeVisitors',
    [
        'dimensions' => 'rt:pagePath,rt:country,rt:city,rt:longitude,rt:latitude'
    ]
);

$arr = [
    'online' => $result->getTotalResults(),
    'data' => $result->getRows()
];

echo json_encode($arr);

Bunun sonucunda aşağıdaki gibi bir sonuç elde edeceksiniz.

Artık istek attığınız zaman, anlık olarak o zamana ait güncel bilgileri çekebilirsiniz. Tabi PHP kullandığımız için sayfa yenilemeden anlık bilgileri güncelleme vs. yapamıyoruz. Ama en basit yöntem olan polling ajax yöntemini kullanabiliriz. Yani her 2-3 sn’de bir istek yapıp yeni bilgileri ekrana yazdırabiliriz. Bunun için şu şekilde bir kod yeterli;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script>
        function getRealtimeData() {
            $.post('realtime-analytics.php', {}, function (response) {
                $('#online-users').text(response.online);
                $('#online-users-data').html('');
                $.each(response.data, function (key, val) {
                    $('#online-users-data').append('<li>' +
                        'Sayfa: ' + (val[0]) + ' <br> ' +
                        'Lokasyon: ' + (val[1] + '/' + val[2]) + '<br>' +
                        'Kaç Kişi: ' + (val[5]) +
                        '</li>');
                });
                console.log('çalıştı!');
            }, 'json');
        }

        getRealtimeData();
        setInterval(getRealtimeData, 1000);
    </script>
</head>
<body>

<div id="realtime-data">
    <h3>
        Online <span id="online-users"></span> kişi var
    </h3>
    <ul id="online-users-data"></ul>
</div>

</body>
</html>

Burada ben php işlemi yaptığım dosyamın adını realtime-analytics.phpolarak belirledim, siz kendinize göre düzeltirsiniz.

Hepsi bu kadar, umarım açıklayıcı olmuştur 🙂

PHP ile T.C. Kimlik No Doğrulama

Devletin bize verdiği SOAP servisi sayesinde, T.C. Kimlik Numarasının gerçekten doğru olup olmadığını kontrol edebiliyoruz. Bunuda PHP’de aşağıdaki şekilde kullanıyoruz. Burada dikkat edilmesi gereken gönderilen ad ve soyad’ın büyük harflerle yazılmasıdır. Aksi taktirde doğrulama işlemi çalışmamaktadır. Eğer bu TCKimlikNoDogrula metodu nereden çıktı, TCKimlikNoDogrulaResult property’sini nasıl elde ettik derseniz SoapClientile bağlandığımız yerden aldık bu bilgileri. Yani kafadan oluşturmadık 🙂

$client = new SoapClient("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL");
try {
    $result = $client->TCKimlikNoDogrula([
        'TCKimlikNo' => '5555555555',
        'Ad' => 'TAYFUN',
        'Soyad' => 'ERBİLEN',
        'DogumYili' => '1993'
    ]);
    if ($result->TCKimlikNoDogrulaResult) {
        echo 'T.C. Kimlik No Doğru';
    } else {
        echo 'T.C. Kimlik No Hatalı';
    }
} catch (Exception $e) {
    echo $e->faultstring;
}