29 Ağustos 2017 Salı

İş Görüşmesi Deneyimlerim

    Herkese selamlar,

    Bu yazımda herkesin çokça sorduğu, stresli geçeceğini düşündüğü, nasıl davrandığımı merak ettikleri ve nasıl davransak dedikleri "iş görüşmeleri" ya da "mülakatlar" siz nasıl adlandırıyor iseniz onlardan bahsedeceğim. 
   
    Hem de ileride dönüp baktığım da anılarımı tazelemiş olacağım. (dönüp bakmadı :p) :)

    Öncelikle daha çok yeni edindiğim deneyimimden yola çıkacak olursam bence başvurduğunuz firmaların kesinlikle sizinle aynı kültürden olmasına dikkat edin. Aynı kültürden olmak ne demek ? Aynı kültürden olmak demek Özgür Yazılımı destekliyor olabilirsiniz, Microsoft camiasından olabilirsiniz ya da Mac delisi olabilirsiniz. İlgi alanınıza göre de yeteneklerinizi geliştiriyor(şekillendiriyor) ve kaynaklarınızı ona göre seçiyorsunuz, bir nevi o kültür ile yoğuruluyorsunuz. Bu yüzden ortak paydalarınız olan insanlarla dialog kurmak ve vakit geçirmek daha eğlenceli olacaktır. 

   Ben iş başvurularımı yaptığım şirketlerde projelerini hangi platformda saklıyorlar, Open Source düşüncesini barındırıyorlar mı, özgür yazılımlar mı kullanıyorlar, hangi dillerde geliştirme yapıyorlar, sürekli aynı dilleri mi kullanıyorlar yoksa gelişime açıklar mı ve en önemlisi ben onlara yardımcı olabilecek miyim diye süzgeçten geçirerek CV'lerimi göndermiştim. :)

    İlk iş görüşmemi  20 Temmuz'da yaptım. Şirket ismi vermicem gerek olmadığını düşünüyorum. :) Bir mobil uygulamaları vardı ve twitter üzerinden görüp "Aaa x dili ile yazıyorlarmış, ben de bunu öğrensem diyordum" diyerek eleman aramadıkları halde CV'mi mail yolu ile kendilerine ilettim. Eleman aramadıkları halde diye belirtiyorum çünkü buna rağmen çok olumlu ve güzel bir geri dönüş yaptılar bana ve görüşmeye çağrıldım. Beni çağırmasalardı bile geri dönüş yapmaları onların insanlara karşı saygısını gösteriyor bence. Çoğu arkadaşım hala başvurdukları yerlerden cevap bekliyorlar.(Olumsuz dahi olsa.) Görüşme hakkında kısaca bilgi verecek olursam öğle yemeğine çıktıkları bir saatte gitmiştim bu yüzden önce ofise yakın bir yerde yemek yedik. Yemek yerken de "Nerelisin? Neden bilgisayar mühendisliği? Neden bu projelerde rol aldın?" tarzı sorularla beraber kendi ofislerinin kültürlerinden bahsettiler. Kahve içerkende neden bana olumlu dönüş yaptıklarından, Github kullanmamın, Pull Requestlerimin olmasının, özgür yazılım kültürüne sahip olmamın onlar için önemli olduğundan bahsettiler. Daha sonra bilirsiniz her güzel işin bir karşılığı vardır diyerek başka yetkili biri ile görüşmek için ofise geçtik. Orada onlara nasıl ulaştığım, neden onlar ve ne kadar istediğim tarzında soruları cevapladım. Sanırım bu ilk iş görüşmemde en stresli geçen kısım bu üç soru ile olan zaman dilimi idi. Görüşmenin genelinde rahattım, yaptığım şeylerden emin olduğum ve karşımda gerçekten anlayışlı kişiler ile sohbet ettiğimin farkında olduğum için gerekli cevapları düzgün bir biçimde verdiğimi düşünüyorum.

    İkinci iş görüşmemi 31 Temmuz'da yaptım. Bu iş görüşmem biraz daha mülakat tarzında alanımla ilgili soru-cevap şeklinde geçti. Öncelikle İK ile bir görüşme gerçekleştirdim. "Nerede ikamet ediyorsun, bütçe beklentin nedir, hangi alanda çalışmak istersin?" tarzında güzel bir sohbet oldu. Bu görüşme şirketten üç kişi vardı ve bir toplantı odasında gerçekleştirdik. Bu görüşmede belirttiğim yetenekler doğrultusunda ve katkı verdiğim projeler hakkında sorular aldım. Kısaca soruları not almıştım :
""- Python mutable, immutable kavramlarını açıklar mısın?
   - cat komutu nasıl çalışır ( donanım kısmını ),
   - Bilgisayar açılırken neler oluyor ? 
   - Ses kartında bir hata olsa hangi komutu çalıştırarak kontrollerini gerçekleştirirsin?
   - Pythonda a = [1,2,3] listeleyecek kodu yazabilir misin?,
   - DHCP ile ilgili birkaç soru.
   - Neden bu projelere katkı verdin?,
   - Django da requirement dosyası hangi komut ile çalıştırılıyor?""
tarzında soruları cevaplandırdım ya da cevaplandıramadım. Mülakata 15:00'da girdim 16:59'da çıkmıştım. Bu görüşmeden çıktığımda gerildiğimi hissettim. Bunun sebebiyse 2 saat boyunca bir odada kalmış ve peşpeşe sorularla karşılaşmıştım, birde bir kişinin sorduğu soruyla alakalı başka bir kişinin kafamı karıştıracak tarza cümleler kullanmasıydı. Ayrılırken bana bir proje göndereceklerini ve buna göre bir değerlendirme yapacaklarını söylediler. Bana bir proje maili gelmedi ve yaklaşık bir hafta sonra olumsuz olduğuna dair İK'dan mail aldım. Bu davranışlarını da onların iş hayatındaki kültürlerine bağlıyorum.

    Üçüncü iş görüşmemi 1 Ağustos'da gerçekleştirdim. Ofiste yaptık yine görüşmeyi. Bu görüşme mülakat tarzında olmadı. Sohbet havası içinde "neler yaptım, neden yaptım? Onlar neler yapıyorlar? Kullanmak istediğim yeni bir programlama dili var mı yok mu?" sorularıyla beraber, "bütçe olarak ne kadar düşündüğüm" sorusu ile görüşmeyi sonlandırdık. :) Ve Perşembe günü ofise gelebileceğim söylendi. Ben bazı kişisel sebeplerden ötürü 7 Ağustos Pazartesi günü başladım ve hala burada çalışmaktayım. 😇

    Benim ilk iş görüşmem aslında Google'dan Stephan ile oldu. Google maceram yarım kaldığı için onu da ayrıntılı olarak başka bir yazımda anlatırım.😉

Benim nacizane tavsiyelerim;
- Başvurduğunuz şirketlerle ilgili ufak bir araştırma yapın. Eminim başvururken bu arkadaşlar ne yapıyor ya diye bir bakmışsınızdır ama ayrıntılı bir araştırma sizin açınızdan güzel olacaktır. Neden biz? ya da Biz neler yapıyoruz? dediklerinde karşılarında kalakalmazsınız, hem de görüşmede daha önce tanıştığınız insanlarla konuşuyor gibi olursunuz ve projelerini gözden geçirmiş olursunuz sonuçta sizde o projelerden birinde yer alacaksınız. :)

- Aynı kültürden insanlar olmalarına özen göstermenizi şiddetle öneriyorum.

- Stresli olmanızı gerektirecek bir şey yok. Tabi bu karakteriniz ve kişiliğiniz ile ilgili bir durum, klasik olacak ama karşınızdaki kişilerde sizin geçtiğiniz bu yollardan geçtiler. ( Baba, amca, dayı torpili yoksa :D )

- Yaptığınız işlerden eminseniz, bilgi birikiminiz doğrultusunda bir CV hazırladı iseniz bilmediğiniz bir yerden soru sormayacaklardır. Soruyorlarsa da sizin nasıl bir mantık yürüteceğinizi merak ettikleri içindir. Bilmediğiniz sorulara "bilmiyorum ama .... şu şekilde olabileceğini düşünüyorum" diyerek mantıklı bir cevap da verebilirsiniz.

- İstediğiniz bütçeyi söylemekten çekinmeyin.

- Onlar nasıl açıkça sizden beklentilerini sıralıyorlar ise sizde onlardan beklentilerinizi çekinmeden söyleyin.

    Unutmayın ne siz onlara muhtaçsınız ne de onlar size. O şirketle anlaşamamış olmanız dünyanın sonu değil, asıl yeni adım atacağınız yolun başlangıcıdır. Benim inancıma göre "Allah bekletiyorsa, güzelleştiriyordur." 😊

    Bu yazımı aynı üniversiteden mezun olduğum canım arkadaşıma hitaben yazıyorum. İsim vermeyeceğim çok stresli biri :) Ama bayramdan sonraki iş görüşmenin çok güzel geçeceğinden gönülden inanıyorum, "kendin ol ve karşındakilerin de senin gibi insanlar olduğunu unutma, bırak onlar seninle görüşecekleri için heyecanlansınlar :)" 

İş görüşmelerinizin çok güzel geçmesi ümidiyle, hep güzel kalpli insanlarla karşılaşın inşallah 😉😇

24 Ağustos 2017 Perşembe

REST API Laravel 5.4 with Token Authentication

ADIM 1:
Önce RestAPILaravel isminde bir Laravel projesi oluşturuyoruz.
$ composer create-project laravel/laravel RestAPILaravel
$ cd RestAPILaravel
ADIM 1.1: 
api isminde bir veritabanı oluşturuyoruz.
$ mysql -u [username] -p
mysql> create database api;
mysql> exit 
ADIM 1.2:
Projemizin .env dosyasına giderek veritabanı bilgilerimizi dolduruyoruz.

DB_CONNECTION=mysql
DB_HOST=replace with your IP
DB_PORT=3306
DB_DATABASE=api
DB_USERNAME=[username]
DB_PASSWORD=[password]
ADIM 2:
Users migration tablomuza giderek aşağıdaki şekilde dosyayı güncelliyoruz. [2014_10_12_000000_create_users_table.php]
public function up()
{
  Schema::create('users', function (Blueprint $table) {
  $table->increments('id');
  $table->string('name');
  $table->string('email')->unique();
  $table->string('password');
  $table->string('api_token', 60)->unique();
  $table->rememberToken();
  $table->timestamps();
  });
}
User modelimize giderek aşağıdaki şekilde güncelliyoruz.[User.php]
protected $fillable = [
        'name', 'email', 'password', **'api_token'**,
];
ADIM 2.2:
Şimdi Post modelimizi ve migrations'ımızı oluşturmak için aşağıdaki komutu çalıştırıyoruz.
$  php artisan make:model Post -m 
 
Post modelimize giderek aşağıdaki şekilde Foreign key olarak User modeli ile olan ilişkisini yazıyoruz.[Post.php]
public function user() {
   return $this->belongsTo(User::class);
} 
User modelimize giderek aşağıdaki ilişkiyi yazıyoruz.
public function posts() {
   return $this->hasMany(Post::class);
} 
Posts migration tablomuza giderek aşağıdaki şekilde dosyayı güncelliyoruz.[2017_08_23_194621_create_posts_table.php]
public function up()
{
  Schema::create('posts', function (Blueprint $table) {
  $table->increments('id');
  $table->string('title');
  $table->text('body');
  $table->integer('user_id');
  $table->timestamps();
  });
}
Post modelimize giderek aşağıdaki şekilde güncelliyoruz.[Post.php]
protected $fillable = [
  'title', 'body', 'user_id',
];
Aşağıdaki komut ile veritabanını güncelliyoruz. 
$ php artisan migrate:refresh 
ADIM 3:
Şimdi bir APIController oluşturacağız.
$ php artisan make:controller APIController --resource 
APIController'ımızı aşağıdaki şekilde güncelleyelim.[APIController.php]
public function index()
{
  $posts = Post::all();
  return response()->json($posts);
}
!!Dosyamızın en üst kısmına bunu yazmayı unutmuyoruz:
use App\Post; 
ADIM 4:
$ php artisan tinker 'komutunu çalıştırıyoruz.
User eklemek için:

Post eklemek için:

ADIM 5:
Router'ı düzenleceğiz şimdi. [api.php]
Route::group(['middleware' => 'auth:api'], function () {
    Route::resource('post', 'APIController');
}); 
ADIM 6: Authentication'ı etkinleştiriyoruz.
$ php artisan make:auth 
ADIM 7:
$ php artisan serve Şimdi browserımızı açıp URL'a api_token'ımızı yazacağız.
localhost:8000/api/post?api_token=uOunEWjLCl0qhhMYR6lI1j8qY3aYfbc3pQa48Bq1KOrNaH2NXjw12VHtdg3d 

Ve mutlu son :tada: :tada: :tada:

9 Ağustos 2017 Çarşamba

Laravel5.4 Sosyal Hesaplar ile Kimlik Doğrulaması

Herkese selamlar, yeni yeni öğrenmeye başladığım Laravel Framework hakkında güzel şeyler öğrendikçe sizlerle paylaşmak istiyorum. Hem de her şey ingiliççe diyenler için belki güzel bir Türkçe kaynak oluşturmuş olurum.

Bu blogumda Sosyal Hesaplar(Facebook, Twitter vs.) ile Kimlik Doğrulaması yaparak nasıl bir Laravel Projesi oluştururuz onu anlatacağım. Laravel tüm hesapları desteklemiyor. Desteklediği hesaplar için dökümana bakalım :

 "Socialite currently supports authentication with Facebook, Twitter, Google, GitHub and Bitbucket." diyor. Bende bugün sizlere GitHub hesabı için nasıl yapıyoruz onu anlatayım diyorum.

Öncelikle bir proje oluşturuyoruz.
$ composer create-project laravel/laravel PROJECT_NAME

Login sayfasını otomatik oluşturmak için aşağıdaki komutu yazıyoruz. 
$ php artisan make:auth


Projemiz için bir veritabanı oluşturmamız gerekiyor. Veritabanını oluşturduktan sonra .env dosyasına giderek veritabanı bilgilerini dolduruyoruz.

DB_HOST=localhost
DB_DATABASE=databasename
DB_USERNAME=username
DB_PASSWORD=**pasw**

Şimdi database -> migrations klasörüne giderek
database/migrations/{titmestamp}_create_users_table.php dosyasını açarak aşağıdaki veritabanı bilgilerini kayıt edelim. Ben birkaç tane sosyal medya hesabından girişi olacak şekilde projeyi geliştirdiğim için genel bir isim olarak provider ve provider_id verdim. Siz oralara github ve github_id şeklinde sadece Github hesabınızdan girecek şekilde ayarlayabilirsiniz.

public function up()
    {
       Schema::create('users', function (Blueprint $table) {
           $table->increments('id');
           $table->string('name');
           $table->string('email')->unique();
           $table->string('password', 60)->nullable();
           $table->string('provider');
           $table->string('provider_id');
           $table->rememberToken();
           $table->timestamps();
       });
    }

$ php artisan migrate komutu belirlediğimiz veritabanında gerekli tabloları oluşturur.

NOT : Bunu yaptıktan sonra MySQL'de "Specified key was too long error"
hatası alabilirsiniz. Çözümü buraya bırakıyorum.


app/User.php dosyasına giderek aşağıdaki bilgileri yazalım.


protected $fillable = [
       'name', 'email', 'password', 'provider', 'provider_id',
    ];


$ composer require laravel/socialite bu komutu çalıştırarak socialite'yi etkinleştiriyoruz.

config/app.php dosyasına giderek aşağıdaki providers'i ekliyoruz.

'providers' => [
   // Other service providers...

   Laravel\Socialite\SocialiteServiceProvider::class,
],

config/app.php dosyasına giderek aşağıdaki aliases'i ekliyoruz.

'aliases' => [
   // Other aliases...

   'Socialite' => Laravel\Socialite\Facades\Socialite::class,
],

Şimdi de config/services.php aşağıdaki bilgileri ekliyoruz.

'github' => [
       'client_id'     => env('GITHUB_ID'),
       'client_secret' => env('
GITHUB_SECRET'),
       'redirect'      => env('
GITHUB_URL'),
   ],

Şimdi sırada GitHub'dan API key ve API secret alacağız. Bunun için 

  1. GitHub hesabımıza giriş yapıyoruz.
  2.  Ayarlara (Settings) gidiyoruz.
  3.  OAuth applications menüsüne gidiyoruz.(Sol altta olması lazım)
  4. Developer applications geliyor.
  5. Register new application'ı seçiyoruz.
  6. Benim yerelimde projem oyüzden localhost:8000: yazıyoruz.                                                                             Home page : http://localhost:8000/
          Authorization callback URL : http://localhost:8000/auth/github/callback
  7. Register application diyerek kayıt ediyoruz.
 














.env dosyasına giderek Github'dan aldığımız Client_ID ve Client_Secret ve kayıt ettiğimiz callbackurl'i yazıyoruz.

GITHUB_ID=Client Key
GITHUB_SECRET=Client Secret
GITHUB_URL=callbackurl
 
routes/web.php dosyasına giriş için atılacak isteği, istekten gelen verileri almak için callback metodlarını yazıyoruz.

// OAuth Routes
Route::get('auth/{provider}', 'Auth\AuthController@redirectToProvider');
Route::get('auth/{provider}/callback', 'Auth\AuthController@handleProviderCallback');


app/Http/Controllers/Auth/AuthController.php dosyasına giderek aşağıdakileri yazıyoruz.
 
<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

use App\User;
use Auth;
use Socialite; /*for Socialite */

class AuthController extends Controller
{
    /**
     * Kullanıcıyı OAuth Providera yönlendiriyoruz.
     * @return Response
     */

    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    /**
     * Kullanıcı bilgilerini sağlayıcıdan(provider) ediniyoruz. Kullanıcının zaten var olup olmadığını kontrol ediyoruz.
     * Veritabanında provider_id var mı bakıyoruz.
     * Kullanıcı mevcutsa, mevcut olan kaydı döndürüyoruz. Aksi halde, yeni bir kullanıcı oluşturtup daha sonra bu kullanıcı ile giriş yaptırıyoruz. Bundan sonra
     * Kimliği doğrulanmış kullanıcının ana sayfasına yönlendiriyoruz.
     * @return Response
     */

    public function handleProviderCallback($provider)
    {
        $user = Socialite::driver($provider)->user();

        $authUser = $this->findOrCreateUser($user, $provider);
        Auth::login($authUser, true);
        return redirect('/home');
    }

    /**
     *Eğer bu üye daha önce sosyal medya hesaplarından biri ile giriş               
     *yapmamışsa yeni bir üye oluşturuyoruz, eğer kaydı varsa ilgili kaydı bulup
     *kullanıcıyı login ediyoruz
     * @param  $user Socialite kullanıcısı nesnesi
     * @param $provider Social kimlik doğrulama sağlayıcısı
     * @return  User
     */
    public function findOrCreateUser($user, $provider)
    {
        $authUser = User::where('provider_id', $user->id)->first();

        if ($authUser) {
            return $authUser;
        }

        $newUser = User::create([
            'name'     => $user->name,
            'email'    => $user->email,
            'provider' => $provider,
            'provider_id' => $user->id
        ]);
        return $newUser;
    }
}

Resources/Views/Auth/register.blade.php dosyasına giderek kayıt için Github girişini ekliyoruz.

<form class="form-horizontal" role="form" method="POST" action="{{ url('/register') }}">
<!--Other form fields above the button-->
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <button type="submit" class="btn btn-primary">
           <i class="fa fa-btn fa-user"></i> Register
           </button>
       </div>
   </div>
   <hr>
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <a href="{{ url('/auth/github') }}" class="btn btn-github"><i class="fa fa-github"></i> Github</a>
       </div>
   </div>
</form>


Resources/Views/Auth/login.blade.php
dosyasına giderek login için Github girişini ekliyoruz.

<form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
<!--Other form fields above the button-->
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <button type="submit" class="btn btn-primary">
           <i class="fa fa-btn fa-sign-in"></i> Login
           </button>
       </div>
   </div>
   <hr>
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <a href="{{ url('/auth/github') }}" class="btn btn-github"><i class="fa fa-github"></i> Github</a>
       </div>
   </div>
</form>

Projemizin Sosyal Hesaplar ile kimlik doğrulama kısmı hazır :) İyi Günlerde Kullanın :)
Şimdiden Kolay Gelsin 😺