Node js Windows Error Enoent Stat C/users/XX/appdata/roaming/npm Hatası

Nodejs kurulum da npm ile paket yüklemek istediğinizde Error: Enoent, Stat ‘C:\Users\XX\AppData\Romaing\npm’ hatası ile karşılaşıyor iseniz sebebi belirtilen dizin yolunda npm klasörünü bulamadığındandır. “npm” klasörünü bu yolda manuel olarak oluşturarak sorunu çözmüş olacağız.

Resimde görüldüğü üzere npm kullanmaya çalıştığımız da hata alıyoruz. (Kırmızı işaretli alan)

npm sorunu

npm sorunu

Daha sonra belirtilen yolda

C:\Users\KullaniciAdiniz\AppData\Romaing\ yolunda npm adlı klasörü oluşturun.

Tekrar npm komutları denediğinizde sorunsuz çalıştığını göreceksiniz. (Yeşil işaretli alan)

Ubuntu Network Device Not Managed Sorunu

Her şey güllük günüstanlık iken bir gün Ubuntu nuzu açtığınız da ağa bağlanamadığınızı görürseniz bu çözüm işinize yarayabilir.

İştim sisteminizde (burada ubuntu diğer linux türevi işletim sistemlerinde de benzerlik göseterecektir) ağa bağlanma simgesine geldiğinizde açılan menüde ilk sırada “Device Not Managed” böyle bir ifade ile karşılaşırsınız. Ve bağlantı seçenekleriniz listelenmiyordur.

ubuntu ethernet network device not managed

ubuntu ethernet network device not managed

 

Bu problemin çözümü için aşağıdaki yöntemleri uygulayın.

Terminale girerek, bir text editör ile NetworkManager.conf dosyasını düzenleyelim.

sudo nano /etc/NetworkManager/NetworkManager.conf

Bu dosyayı açtığımız da “managed=false” yazan satırı bulup true değeri atayarak kaydedeeceğiz.

Vim ile açılmış örnek NetworkManager.conf dosyası

 

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

Değişikliği gerçekleştirdikten sonra kaydediyoruz ve terminalden Network yöneticisini yeniden başlatıyoruz.

sudo service network-manager restart

Uygulayıp yeniden başlattıktan sonra sorunun çözülmüş olması gerekiyor, geçmiş olsun.

 

Artık bağlantınızı test edebilirsiniz.

 

Laravel Helper Class Ekleme

Freamwork kullanırken var olmayan bir özellik için veya kendi işlermizi yapan yeni yapılar sınıflar geliştirmek ve kullanmak isteyebiliriz. Böylece freamwork ü genişletme işlemi yapmış oluruz. Kısaca hemen Laravel de kendi helper sınıflarımızı oluşturmayı göreceğiz.

Laravel de bunu sağlayan standart bir yapı yoktur. Bunun için kütüphane dosyalarınızın nerede olacağı belirleyip bunların bulunacağı bir dizin açmamız gerekiyor. Bu dizine helper class larımızı ekliyor olacağız.

1) Yeni dizin ekleme

Örneğin “app” dizini altına bir “library” adında dizin açalım.

laravel helper directory

helper directory

2) laravel in başlangıç dosyası/işlemlerini bulunduran “app/start” dizinine geçiyoruz. Burada “global.php” dosyasında yer alan class loader sınıfına eklemiş olduğumuz dizinimizi belirtmemiz gerekiyor. Dosyayı görüntülediğimiz de controllers, models gibi dizinlerin tanımlandığını göreceksiniz. Bizde ClassLoader::addDirectories methoduna gönderilen dizin yollarına kendi dizinimizi ekliyoruz.

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',

app_path().'/library',

));

3) Bu adımda ise composer.json dosyamızda autoload dizisi içine eklediğimiz “app/library” yolunu bildiriyoruz.

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"laravel/framework": "4.2.*"
},
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/library"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
},
"minimum-stability": "stable"
}

4) Composer.json dosyamızı düzenledikten sonra terminal den “composer dumpautoload” komutu ile işlemlerimizi tamamlıyoruz.

Artık ekleyeceğimiz helper class larını kullanabiliriz. Controllers,models, routes gibi yapılarımızda da erişebiliyoruz.

Dikkat edilmesi gereken bir husus static methodlara erişim sağlayabiliyoruz.

Örnek: Message adında helper sınıf yazdık. İçeriği:

class Message
{
public function test(){
 return "test içeriği";
 }

 public static function testStatic(){
 return "test static içeriği";
 }
 }
}

olsun. Controller dosyamızda da bu yardımcı sınıfı kullanalım.

class MainController extends BaseController{

 public function show()
 {
// static method kullanalim
return HashOne::testStatic();

// static olmayan method kullanalim
 $test = new HashOne();
 return $test->test();
 }
}

Gördüğünüz gibi artık helper class ımızı yazdık ve controller içeriğimizde kullandık.

 

Composer Versiyon Güncelleme Uyarısı

Composer ile çalışırken şu şekilde bir uyarı alabilirsiniz;

“Warning: This development build of composer is over 30 days old. It is recommended to update it by running “/usr/local/bin/composer self-update” to get the latest version. ”

composer versiyon update uyarısı

composer versiyon update uyarısı

Bu yüklü olan ve bir süre geçmiş olan composer için güncelleme isteniyor demektir. Basit bir komutla güncellemeyi uygulayıp sorunu çözüyoruz.

Not: Composer uygulamanızın ismi sizde farklı olabilir. Yüklü olduğu ismine göre uygulayın. composer.phar veya composer olabilir.

Compser yüklü olduğu dizinde çalıştırılır.

Komut: /usr/local/bin/composer self-update

Bu komut ile gerçekleştiriyoruz. Tüm composer komutlarını görmek için composer uygulamanızı terminalden çağırmanız yeterli olacaktır.

composer (veya composer.phar sizde yüklü olduğu şekilde) tüm komutlar listeleyecektir.

 

Php Dependecy İnjection Örnek Uygulama

Bir önceki yazımızda dependency injection hakkında temel bilgiler edinerek giriş yapmıştık. Burada ise php ile uygulamalı dependency injection kullanıyor olacağız.

Örneğimizde; bizim bir haber sitemiz var veya bir platformda haber içerikleri yayınlıyor olalım. Uygulamamıza haberleri ise anlaşmalı olduğumuz AA(Anadolu Ajansı) kurumundan aldığımızı varsayalım. İki çeşit veri alabilelim.

1) İstediğimiz adet kadar manşet haberleri alalım. getTopNews($top) methodu

2) Verdiğimiz haber id sinden haberin detaylarını alabilelim. getNewsDetail($newsId) methodu

 

Class AnadoluHaber
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "AA haber ajansından gelen manşet haberler.";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "AA {$newsId} nolu haber detayı";
 }
}

// anasayfamizi temsil eden class
class MainPage
{
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $haberAjans = new AnadoluHaber();
 $haberAjans->getTopNews();
 }
}

Çıktı: “AA haber ajansından gelen manşet haberler.” olacaktır. Yani AA haber ajansından gelen manşet haberleri listeliyor olacağız.

 

Birde haber detay göstereceğimiz sayfamızda yan tarafında manşetleri listeliyor olalım.

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct()
 {
// haber ajans class ini yukleyelim
$this->haberAjans = new AnadoluHaber();
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

$detail = new NewsDetail();
// detay
$detail->getNewsDetail(1);
// Çıktı: "Anadolu H.A 1 nolu haber detayı"

// mansetler
$detail->showTopNews();Çıktı: "AA haber ajansından gelen manşet haberler."

Buraya kadar güzel anlaştığımız ajansa ait verileri uygulamamızda alıp gösterebiliyor işlerimizi görüyoruz. Yarın patron geldi artık CHA (Cihan Haber Ajansı) ile çalışmaya başlayacağız gerekli düzenleme ve çalışmalar yapılsın dedi. Evet bu demek oluyor AA ajansına ait yaptığımız çalışmalar geçersiz olacak. Buda demek oluyor ki AA class ını kullandığım her yerde bu değişiklik gerçekleşecek. İyi ama peki nerelerde kullanmıştık? Biz kocaman bir haber portalıyız hemen hemen her yer de kullanılıyor ama bu.Bunu kullanan tüm class ve alt class larda bu değişikliği nasıl yapacağız.Peki ne kadar vaktimiz var? Bu class ı geçen sene çalışan Ali abi yapmıştı ben içeriğini ve detay inceliklerini bilmiyorum ki nasıl çıkıcam bu işten? Gibi gibi bir ton sorular ve sorunlar oluşmaya başlayacaktır. Proje büyüdükçe bunların üstesinden gelmek zorlaşır ve hata yapmaya açıktır.

Diyelim ki yeni ajans yapısını da iyi kötü oluşturduk.

Class CihanHaber
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

Peki nerelerde değişiklik yapacağız şimdi? AA class ının olduğu her yerde. Yani ana sayfamızda ve haber detay sayfamızda tek tek bulup yeni class ımızla değiştireceğiz.

// anasayfamizi temsil eden class
class MainPage
{
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
// $haberAjans = new AnadoluHaber();
 $haberAjans = new CihanHaber();
 $haberAjans->getTopNews();
 }
}
// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct()
 {
// $this->haberAjans = new AnadoluHaber();
 $this->haberAjans = new CihanHaber();
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

Projenizde bu sınıfı kullanan her yerde değişiklikleri yapmanız gerekir. Güzel değişiklikleri gerçekleştirdik oh be tamamdır diyoruz. Eskilerini açıklama satırı haline getirip kurtulduk. Peki ya yarın yine başka bir ajans ile anlaşılmak istenirse? Yine aynılarını yaparım vakitte alsa diyorsunuz. Bu böyle gider. Peki ya kurumunuz uygulamanızda köklü bir değişikliğe giderse. AB testleri gibi bir kısım kullanıcılara AA bir diğer kısım kullanıcılara CHA haberlerini göstermek durumları incelemek isterse. Nasıl hem AA hem CHA haberlerini gösterebilirim düşünmeye başlarsınız. Sonra yine pratik şekilde yol bulursunuz. Projeyi tekrar açarak 2 class ıda aynı şekilde farklı farklı çalıştırırım, her eklendiğinde aynı şekilde projeyi açar yeni kodları ekler çalıştırırım dersiniz.

$ajansAA = new AnadoluHaber();

$ajansCHA = new CihanHaber();

Her yeni eklendiğinde böyle uzar gider en son bir yerde daha çıkılmaz hal alabilir. İçlerinde geliştirmeler düzenlemeler yeni özellikler istenildikçe. Bu kaçınılmazdır. Kod tekrarları fazla yazılmış kodlar, geçen zamanlar, uygulama pratikliği, dinamikliği. OOP gücünden faydalanmayı bilmeliyiz. Bunun hem bize katkısı hemde işlerimize katkısı olacaktır.

Peki çözüm ? Dependency İnjection Nerede Ne Sağlar ?

İşte burada her özellik için(ajanslar) ayrı class lar yazılır. Ama bütünlüğü bozmamak için bu class lara kurallar getiririz. Yani bu class ta bu methodlar mutlaka olacak bunlarla çalışacağız ve çalıştıracağız. Buda eşittir İnterface demek. Her bir özellik sınıfımızda(Ajans) diğer sınıflar tarafından kullanılan çalıştırılacak ortak methodlar belirliyoruz. Sonra uygulamamız yükleme (veya ilgili yerde) aşamasında config (ayarlar) verinizden hangi özelliğin(ajansın) yüklenmesi gerektiğini görür ve ona göre uygulamaya o özelliği – yapıyı ekler. Böylece bu sınıfı kullanan her yerde isteğe göre seçilmiş olan yapının içeriği kullandırılmış olur. Yani ana sayfamızın class ı hangi haber ajansının yüklendiğini bilmez ilgilenmez sadece belirtilmiş methodu çağırır. Çağırdığı method yüklenen ilgili ajansa ait haberleri getirir. Böylece her sınıf sadece kendisi ile ilgilenmiş olup diğer sınıflara doğrudan bağlılığı kalmaz.

Uygulamamızı Dependency İnjection Şeklinde Yenileyelim

1) Öncelikle tüm özellik – yapılarımızda(Burada Ajans Class ları) ortak kulları belirleyelim. Yani interface arayüz tanımlayalım.

Interface IHaberAjans
{
 public function getTopNews($top);
 
 public function getNewsDetail($newsId);
}

Bu interface tüm haber ajanslarında implement olacak, böylece her ajansın yapısında getTopNews($top) şeklinde manşet haberlerini getiren ve getNewsDetail($newsId) şeklinde haber detaylarının getirildiği methodları barındırması zorunda olacak.

2) Yapılarımızı bu arayüzle güncelleyelim.

Class AnadoluHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "Anadolu haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "Anadolu H.A {$newsId} nolu haber detayı";
 }
}

Class CihanHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

3) Sınıfımızı kullanan diğer sınıflara yer verelim.

// anasayfamizi temsil eden class
class MainPage
{
 private $haberAjans;
 
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $this->haberAjans->getTopNews();
 }
}

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

 

4) Config de hangi haber ajansını kullanacağımızı bildirelim.

$config = "AnadoluHaber";

Bu değer database den xml den veya projenizde bir değişkeniniz den sağlayabilirsiniz. Biz direk config deki isimden class türeteceğiz.

5) Ana sayfamız ve haber detay sayfamızdan bağımsız olarak config deki seçilen ajansa göre instance alacağız.

// Congig degiskeninde "AnadoluHaber" değeri vardı. Bu yüzden Anadolu Haber sınıfı yuklenecek
// Eger CihanHaber degeri verseydik CihanHaber class ı yuklenecekti
$haberAjans = new $config();

şimdi kullanan class lara enjekte edebiliriz.

// anasayfada gosterilecek manset haberleri haberAjansi degiskeninden alacak. Yani AnadoluHaber classı
$mainPage = new MainPage($haberAjans);
$mainPage->showTopNews();

Aynı şekilde bu classı kulanan haber detay sayfasına da enjekte edelim.

$detail = new NewsDetail($haberAjans);
$detail->getNewsDetail(1);
$detail->showTopNews();

Böylece anasayfa ve haber detay sayfası haber ajansı sınıfından bağımsız olarak çalışmaktadır. haber ajansı ayarlardan okunarak ilgili ajansı dahil eder ve gerekli yerlere enjekte eder. Bu sayede hangi ajans yüklenirse yüklensin bağımsız olarak methodlarımız çalışacaktır. AA ajansıda CHA ajansıda olsa manşet haberler çağrılacaktır.

Yani config değişkenini bu şekilde değiştirirseniz artık CHA ajansını kullanacaktır.

$config = "CihanHaber";

Peki ya eklenen ajans sınıfında bu method yoksa ne olacak?

İşte bu yüzden interface kullandık. Bu methodlar barındırılmasını zorunlu kıldık.

Dependency İnjection Sonuç: Dependency İnjection sayesinde artık her ajans değiştirdiğimizde uygulama kodlarını açıp eski methodları açıklama satırı haline getirmeyeceğiz veya kodlarda düzenelemeler yapıp tekrar uygulamayı hazır hale getirmeyeceğiz. Yapmamız gereken tek şey ayarlarımız da hangi ajansın çalışacağını seçmekten ibaret.

Uygulama çalışmaya devam ederken değişik yapabilme imkanı.

Bu sayede artık testler gerçekleştirebileceğiz çünkü sınıfların birbirleri ile arasında sıkı bir bağ yok hepsini bağımsız olarak çalıştırabiliyor olacağız. Testler yazılabilir.

Bu sayede modülerlik, yeni düzenlemeler hata yakalama, yeni yöntemlere geçişler, başka yerlerde kullanabilme gibi özellikler kazandırırız.

Dahası zaman, ve boşa gitmeyen emekler…

Kodların son hali ise:

<?php

Class AnadoluHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // anadolu haber ajansından manset haberleri getir
 echo "Anadolu haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // anadolu haber ajansında yer alan haber detayını getirir
 echo "Anadolu H.A {$newsId} nolu haber detayı";
 }
}

Class CihanHaber implements IHaberAjans
{
 public function getTopNews($top = 5)
 {
 // cihan haber ajansından manset haberleri getir
 echo "Cihan haber ajansından gelen manşet haberler";
 }
 
 public function getNewsDetail($newsId)
 {
 // Cihan haber ajansında yer alan haber detayını getirir
 echo "Cihan H.A {$newsId} nolu haber detayı";
 }
}

Interface IHaberAjans
{
 public function getTopNews($top);
 
 public function getNewsDetail($newsId);
}

// anasayfamizi temsil eden class
class MainPage
{
 private $haberAjans;
 
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function showTopNews()
 {
 // anasayfamizda ust slider kisminda mansetleri gosterelim
 $this->haberAjans->getTopNews();
 }
}

// haber detay sayfamizi temsil eden class
class NewsDetail
{
 private $haberAjans;
 public function __construct($_newsAgency)
 {
 $this->haberAjans = $_newsAgency;
 }
 
 public function getNewsDetail($newsId)
 {
 // haber detayini ajanstan alalim
 $this->haberAjans->getNewsDetail($newsId);
 }
 
 public function showTopNews()
 {
 // haber detay sayfamizin yan kisminda mansetleri gosterelim 
 $this->haberAjans->getTopNews();
 }
}

$config = 'AnadoluHaber';
$config = 'CihanHaber';
$haberAjans = new $config();

$mainPage = new MainPage($haberAjans);
$mainPage->showTopNews();

$detail = new NewsDetail($haberAjans);
$detail->getNewsDetail(1);

 

Dependency İnjection Nedir? Php Örnek Kullanım

Yazılım geliştirme sürecinde en önemli konulardan biri şüphesiz yazılımın iyi tasarlanmış olmasıdır. Bu projenin geliştirilmesi yönetilmesi ve devamlılığı için çok önemlidir. Proje büyümeye başladıkça yeni ihtiyaçlar, yeni geliştirmeler, ekstra özellikler kazanarak devleşmeye başlar.

Büyük şirketler dahil çoğunlukla önce projenin hayata geçirilmesini isterler; şimdilik bu şekilde yapalım ilk versiyonu çıkartalım biraz ilerleyelim, ileride bunları raylara oturturuz gibi düşünceler yer almaktadır. Ancak iyi hazırlanmamış bir zemine sürekli yeni şeyler inşa etmek sallantılı bir süreç getirir. İlk zamanlarda problem yaşanmasa da ileride proje geliştikçe büyüdükçe ortaya çıkması kaçınılmaz olabiliyor. Ve ileride ya toparlanma zamanı hiç gelmez yada toparlamaya kalktığınızda işin içinden çıkamaz hale gelinebiliyor. Bazen yeni bir özellik eklemek projeyi yeniden yazmaktan daha zor olabiliyor bu sebeple. Bunların bir çok sebebi olmasına karşın bugün bizim konumuz olan çözüm dependency injection.

Dependency injection: bağımlılıkların dışarıdan enjecte edilmesi anlamına gelir.

Yani nedir; yazılımı oluşturan yapıların birbirleri ile olan bağı en aza indirmek. Buna loosely coupled-Gevşek bağlılık denir.

Dependency İnjection Ne Sağlar

Yazılımı oluşturan yapıların birbirleri ile olan sıkı bağ azaldığı için, uygulamaya yeni özellikler eklenip çıkartılabilmesi kolay hale gelir.

Uygulama içerisinde değiştirilmesi müdahale edilmesi gereken yerler minumuma iner.

Test edilebilir yapılar ortaya çıkar.

Özellikler bir yerde

Örnek Seneryolar

Bir çok örnek durum gösterilebilir şuan aklıma gelen bir kaç tanesini paylaşmak istedim. Örneğin birden çok ödeme sistemi var, ileride bunlardan bir tanesini daha projenize dahil edeceksiniz. Müşteriniz bugün mail yoluyla çalışan bildirim sistemini  yarın sms olarak kullanmak istiyor. Bugün a sistemine göre uygulamanızı tasarladınız yarın yeni versiyon veya b ye geçilmek istendi, bugün google dan verileri alıyorsunuz yarın bir müşteriniz yandex tercih edebilir. Yeni bir özellik eklenti geliştirdiniz test etmek istiyorsuuz. Gibi durumlar çoğalabilir.

Uygulamanızı bugün x şirketinin talepleri doğrultusunda google dan verileri alıyor şekilde tasarladınız. Yarın başka bir kurum – müşteri ile daha anlaştınız. Ama bu müşteri benim yandex ile anlaşmam var verileri oradan almamız gerekiyor dedi. Tamam dediniz iyi kötü if ler havada uçuşarak entegre ettiniz. Yarın müşteri dedi ki bizim anlaşmamız bitti artık yahoo ile çalışıyoruz. Ne oldu tekrar baştan aşağı uygulamayı ele alıp kodlarda bir çok değişiklik gerçekleştireceksiniz. Sonra başka müşteri tekrar google verileri ile çalışmak istedi. Ne ya yapacaksınız, tamam bunu daha önce yapmıştık der değişikliğe gidersiniz.

Fonksiyonel veya oop yaptınız. Güzel. Diğerlerini o yüzden commentleyip geçerim

google(); // sen calis

// yandex(); // sen calisma iptal

// yahoo(); // sen calisma iptal

Böyle durumlarda her yeni özellik eklenmek değiştirilmek istendiğinde uygulamanın kodları açılır ve her ilgili methodu,sınıfı içeren yerlerde tek tek değişiklik gerçekleştirilir veya commentlenir. Proje tekrar derlenir veya hazırlanır teslim edilir. Her yeni özellik veya geliştirmede bu işlemler tekrarlanır. Bu istenen bir durum değildir. Zaman ve yoğun emek gerektirebiliyor.

Oysa birbirinden bağımsız şekilde tasarlanan class yapılar ile bunu gerçekleştirmek çok daha kolay ve modülerdir. Burada önemli olan yazılımı oluşturan her bir yapının sadece kendisine ait işlemleri gerçekleştiriyor olması ve diğer bileşenlerle ilgilenmemesi yani bağımlı olmamasıdır. Her bir yeni geliştirme veya özellikte ona ait bir yapı(class) oluşturulur. Çalışma esnasında ise seçime bağlı olarak ilgili özelliğe ait olan yapı uygulamaya dahil edilir ve kullanılır.

Yani config de bakılır google mı yandex mi yahoo mu ne kullanılıyor ise ona ait class uygulamada ilgili yerlere enjecte edilir. Böylece enjekte edilen class lar gelen google mı, yandex mi yahoo mu bilmeden hangisi gelirse gelsin ilgili methodu (örneğin getData) işler.

En Basit Anlamıyla Dependency Örneği

Örneğin bir user class ımız var. Burada kullanıcı ile ilgili işlemler yapıyoruz. Ekle, sil, detay vs. Ve bu işlemler için log tutmak istiyoruz. Hemen user class ımız içinde log class ı ile bağlantı kurarız dimi ?

Örnek:

Class User
{
 public function add()
 {
 ...
 // iste burada Log class ına cok bagimli olduk
 $log = new Log();
 $log->add($userData);
 }
}

İşte user sınıfımızda log class ına bağlı kaldık. Burada Log sınıfı olmazsa User sınıfı çalışamıyor yani log sınıfına bağlı. Bu bağlılığı nasıl azaltabiliriz.

Class User
{
 public Log;
 
 public function __construct($log)
 {
 $this->Log = $log;
 }
 
 public function add()
 {
 ...
 // artık log disaridan enjecte ediliyor, bagimlilik azaldi
 $this->Log->add($userData);
 }
}

$log = new Log();
// user class ına disaridan enjekte ediyoruz
$user = new User($log);

Görüldüğü üzere User class ı başlamadan önce oluşturulan log classı user class ına dışarıdan veriliyor. Böylece user sınıfı log sınıfını bilmek zorunda değil. LogSms, logMail,logFile gibi yeni class lar da oluşturulup verilebilir. Ama user sınıfı hep aynı işlemi yapar, gelen log sınıfının türünü bilmez sadece add methodunu çağırır. Yani tek config de işi bitiriyor oluyoruz.  Oysa biz dependency injection kullanmasaydık ve log sınıfını bir müşterimize göre sms olarak çalıştırmak iseteseydik, log sınıfını kullanan tüm sınıflarda tek tek bulup yerine new LogSms() yazacaktık.

Umarım giriş anlamında bir şeyler şekillenmiştir. Şuan karmaşık gelebilir örneğimizde detaylı uygulamalı göreceğiz

Php ile Dependency İnjection Örnek Uygulama

Php base_convert Fonksiyonu

Php base_convert Fonksiyonu

Php nin en güzel yanlarından biri neredeyse her konuda bulabileceğiniz fonksiyonlar barındırması. Şüphesiz bir çok işimize yarayacak fonksiyon ile bize hem kolaylık hem vakit kazanımı sağlar. Geçenlerde bir iş geliştirirken karşıma çıkan az bilinen base_convert fonksiyonuna yer vermeyi düşündüm.

Nedir base_convert Fonksiyonu

Bu fonksiyon matematiksel olarak verilen sayıyı sayı tabanlarına çevirme işlemleri yapar. Yani taban çevirme işlemlerini kolayca yapabiliriz. 2 ile 36 arasında sayı tabanları ile çalışır. base_convert Php

Kullanımı base_convert Fonksiyonu

string base_convert ( string $numberint $frombaseint $tobase)

1.parametre: çevrilmesi istenen sayı

2.parametre: sayının hangi tabanda olduğu

3.parametre: sayının çevrilmesi istenen sayı tabanı

string base_convert ($cevrilcekSayi, $bulunanTaban, $cevrilecekTaban)

Örnek Kullanım

Örneğin 10 luk tabanda olan 5 sayısını 2 lik sayı tabanına çevirelim.

<?php

$sayi = 5;

echo base_convert ($sayi, 10, 2);

// çıktı: 101

?>

Aynı şekilde tam tersini yapalım sağlayalım:

<?php

$sayi = 101;

echo base_convert ($sayi, 2, 10);

// çıktı: 5

?>

Nerelerde Kullanabiliriz

Taban çevirme ihtiyacı dışında örneğin database de tablonuzda ki bir sayısal ID alnına ait mini şifrelenmiş bir generete kod oluşturmuş olursunuz. Veya kendi şifreleme işlemlerinizde bir alt parçası olabilir. Gibi hayal gücüne kalmış ihtiyaca göre modifiye edilebilir. Benim ilk söylediğime yakın bir örnekte ihtiyacım olup kullanmıştım. Faydası olması dileği ile

MongoDB Error Couldn’t Connect To Server Hatası

MongoDB Error: couldn’t connect to server 127.0.0.1 shell/mongo.js:XX Hatası ve Çözümü

Mongodb sunucusuna bağlanmaya çalıştığımızda karşılaştığımız hata. Bunun  sebebi mongod.lock dosyasıdır. Genellikle sistemde bir sorun olduğunda, mongodb veya sistem gerektiği gibi kapanmadığı zamanlar yaşanır.

Mongodb servisinin çalışıp çalışmadığını kontrol edebiliriz. Bu sorun yaşandığında genellikle mongodb servisi kapalı olmaktadır yani çalışmıyordur. Eğer açık ise servisimizi durduruyoruz.

sudo service mongodb stop

Mongodb veri tabanı dökümanlarının bulunduğu yere mongod.lock dosyasını oluşturur. Bu yol bilgisini(path) mongodb config dosyasından elde edebiliriz. Varsayılan olarak config yolu linux için: “/etc/mongodb.conf” dizinidir. Bu ayar dosyasında tüm bilgilere erişebiliriz.

dbpath alanında veri tabanı dökümanlarının saklandığı adres bilgisini görürüz. Varsayılan olarak “/var/lib/mongodb” dir.

Buraya erişerek oluşan mongod.lock dosyasının oluştuğunu görebiliriz.

cd /var/lib/mongodb
ls -l

Terminalden girdiğimiz bu komutlar sonucunda mongod.lock dosyasının var olduğunu tespit ettik. Şimdi bu dosyayı sileceğiz.

sudo rm mongod.lock

Sildikten sonra sorun çözülmüş olacaktır. Artık mongodb servisimizi yeniden başlatabiliriz.

sudo service mongodb start

Bazen dosyalarımız zarar görmüş olabilir onarmak isteyebiliriz. Bu durumda ise yukarıda ki adımlar tekrar edilir, mongodb servisi başlatmadan önce (service mongodb start) repair komutları çalıştırılır.

sudo -u mongodb mongod -f /etc/mongodb.conf --repair

ve tekrar mongodb servisimizi başlatabiliriz.

sudo service mongodb start

 

Web Uygulamalarında Güvenlik Önlemleri

Geçenlerde bir hizmet almak için girdiğim kurumun web uygulamasında dolaşırken şüphelendiğim ve gözüme çarpan detaylardan dolayı biraz kurcalamam ile bulduğum güvenlik açıklarından grurla değil, malesef böyle şeylerin göz ardı edilmesinden kaynaklı şaşkınlıkla hayal kırıklıklarıyla ilgili konulardan bahsedeceğim. Kurumları ve açıkları deşifre etmemek adına bilgileri gizli tutarak işleyeceğiz.

Genelde uygulama geliştirilirken güvenlik göz ardı edilir, ileride üstünden geçilecek yapılacaklar listesinde kalır. Veya çok basit klasik önlemler alınır şimdilik yeterli idare eder diyip geçilir. En iyi ihtimal bariz belli yerlerde bir kaç test yapılır iyi sonuçlar alınır ama diğer tüm proje ve kapsam düşünülmez pas geçilir.

Bugün aslında baktığımızda hep en bilindik en basit gördüğümüz şeylerden dolayı beklemediğimiz durumlarda kalabiliyoruz. Buradan da zarar gelmez, buradaki kullanıcılar sadece şirket içerisin de yer alan kişiler, bu ayarlara gerek yok, sistemi ağırlaştırmanın ek maliyet getirmenin anlamı yok gibi kurulan cümleler ileride gerek baş ağrısı gerek maliyet türünden yüklü bir götürüsüyle karşılaşma riskini doğurur. Güvenlik göreceli ve kapsamlı bir konudur.

Canlı bir örnek olarak; daha yakın zamanda bir kuruma ait web uygulamasında güvenlik açıkları tespit ederek çalışmalar gerçekleştirdim. Biz sektörde yer alan kişiler işimizi severek ilgiyle yapmalıyız. İnternette gezdiğimiz kullandığımız bir uygulamayı sadece kullanıp geçmemeli, arkasında çalışan sistemi düşünmeli, tasarımı incelemeli, kullandığı teknolojileri yakalayabilmeli, eleştiri ve incelemeler yapmalıyız.

“Yazılımı geliştirici olarak nasıl kendi uygulamamızı geliştirirken son kullanıcı gözünden bakıyorsak, var olan bir uygulamayı incelerken de yazılımcı gözüyle bakmalıyız.” Tahsin Yüksel :)

Yine bir uygulamada içime sinmeyen tasarımlar içinde dolaşırken bazı sıkıntılı durumlar fark ettim. Uygulamanın geçici olarak veya bir şekilde yetiştirilmek idare edilmek üzerine yapıldığını düşündüm. Sayfalarda dolaşırken basit hatalardan kaynaklanan error sayfalarına da rastladım. Biraz daha huysuzlandım ve ilgimi çekti kurcalamaya başladım.

Açıkların doğruluğu ve kanıtlaması adına testler denemeler gerçekleştirmem gerekti. Tabi bu test ve çalışmaları yaparken iyi niyetli bile olsanız verebileceğiniz zararı düşünerek bilinçli hareket edilmeli. Database havaya uçurmanın bilgilere zarar vermenin anlamı yok.Kaş derken göz çıkarmamak gerekir.

Uygulamada yetkili erişimlerini de elde ederek bir yetkili kişinin sistemde görebileceği bilgilere erişmiş olmuştum. Bu bilgiler arasında kullanıcı bilgilerinin olduğunu söyleyebilirim.

Bir kurumsunuz belki milyonlarca kullanıcınız var ve en önemli data olarak bilinen kullanıcı bilgilerinin sizin uygulamanız yüzünden açığa çıktığını düşünün.Buna Sony ‘in zamanında plastasion da yaşadığı durumu örnek verebilirim.

Yaptıkları bir başka hata için de veri tabanı hakkında bazı bilgiler edinmiştim. Daha fazla ilerlemeyerek yarıda bıraktım. Ertesi gün yine merakım sonucunda yeni çalışma ve araştırmalar yaparak aslında durumun çok daha dramatik olduğunu fark ettim. Artık bir çok kamuya bağlı kurum daha halk dilinde çoğumuzun bildiği şekilde hack – hacklendi. (Güvenlik açıkları bulundu)

Ve başka bir devlete bağlı önemli bir projenin de güvenlik açıklarından içeri girmiş olmuştum.

Çok zorlanmadan sorun yaşamadan bunları görmüş oldum. Çok fazla ileri gitmek ve kurcalamakta açıkcası istemedim ve yapmadım, zamanımda yoktu. İnanıyorum ki derine gidilse veya uğraşılsa çok şeyler açığa çıkarılabilir başka şeyler öğrenilebilirdi. Herkesin niyeti bizim gibi iyi olmayabilir bu yüzden elinizden geldiğince tüm tedbirleri almaya özen göstermeliyiz.

Vakitten dolayı yazıyı da uzun tutmamak adına uyarı ve bilgi verici bir yazı olsun diyip toparlayacağım, güvenlikle ilgili ayrı yazılarımıza yer vereceğiz zaten. Şimdi aşağıda belli başlı konulardan bahsedelim:

Güvenli Uygulama Geliştirme

Uygulamanın ne derece güvenli olması gerektiği ne bilgiler içerdiği ne için nasıl kullanılacağı incelenmeli gerekli önlemler alınmalıdır.

Güvenlik önlemi olarak sadece firewall, ips gibi çok uzaklarda değil en başta yazılımda düşünmeli uygulamalıyız.

Her şey uygulamayı hızlıca yetiştirip hayata geçirelim olmamalı. Yazılımcı ve ilgili kişilerin üzerinden zaman baskısı atılmalıdır.

Her programlama dili için güvenlik açıkları söz konusu olmaktadır. Php güvensizdir .Net daha güvenli uygulama geliştirilir gibi felsefelerden vazgeçilmeli, programlama dili uygulamayı güvensiz yapmaz dili nasıl ne kadar kullandığınız durumu değiştirir.

Programlamada kullanılan dil, kütüphaneler, 3.parti araçlar, veri tabanları gibi uygulamayı meydana getiren tüm bileşenler her zaman takip edilmeli. Güncellemeler, güvenlik açıkları yeni geliştirmeler yakından izlenmeli. Unutmamak gerekir ki başta güvenlik açıkları olmak üzere bir çok konuda eksiklik giderildiği için güncellemeler çıkmaktadır.

Çok güzel tüm güvenlik önlemlerini düşünerek uygulama geliştirdiniz testler yaptınız her şey çok iyi ve güvendiniz uygulamanıza. Ama kullandığınız bir editörde veya 3.parti bir araçta açıklanan tespit edilen bir açık sizin o çok güvendiğiniz güvenli uygulamanızın bayrağını indirebilir.

Kullanıcılarınız ne kadar veli nimetiniz ise o kadar da sizin için güvenlik tehditiniz bunu unutmayın. Bu en önemli anahtardır. Gelen kullanıcılardan bu iyi bu kötü kullanıcı diye ayırt etme şansınız yok malesef ki. Biz hepsine ya bu gözü dönmüş tehdit bir kullanıcı ise diye yaklaşarak diğer iyi niyetli kullanıcılarımıza daha iyi bir hizmet sunmuş oluruz.Çünkü yapılan saldırı sizin kadar diğer iyi kullanıcılarınızı da etkileyebilir.

Kullanıcıdan veri girişi aldığınız ve sunduğunuz formlar, url, cookie gibi tüm alanlar aslında sizin kalenizin kapılarını temsil etmektedir. Yani uygulamanızın dışarı açıldığı kapılar. Siz eğer buralara nöbetçiler yerleştirmez önlem almaz iseniz giren çıkan belli olmayacak gelecek tehlikelere açıksınız demektir. Bizde verileri almadan önce mutlaka filtreleme kontrol işlemlerinden geçirmeliyiz.

Her gün yeni bir açık ortaya çıkabilir tıpki yeni bir ürün yöntem güzellik çıktığı gibi.Bunun için kendimizi geliştirmeli takip etmeliyiz. Kurumlar ise mümkün olduğunca çalışanlarını bilinçlendirmeli öğrenmeye eğitmeye teşvik etmelidir

Uygulamayı sık sık test etmeli ama acımasızca test etmeliyiz. Bir iki basit ufak numaralar ile kendimizi kandırmamalıyız. Bazen önlem aldığımız bir durum başka bir yol ile aşılabilinir. Birim testler yapılmalı değişik seneryolar denenmeli.

Uygulamada ne olursa olsun log sistemi olmalı. Kimin ne zaman nerede nasıl ne yaptığını bilmiş olursunuz. Diyelim ki hacklendiniz en azından kimin nasıl ne işlemlerde hangi bilgileri kullanarak yaptığını öğrenmek istemez misiniz. Kullanıcının gerçek bilgilerini alacağınızı düşünmeyin sadece nerede hangi parametrelerle ne zaman veya ne zamandan buyana kırıldığınızı görmek için.Böylece önlem alırsınız iş işten geçtiyse de dersler çıkarırsınız. Gelişmiş sistemler ile anlık bu durumları haber verebilecek sistemler geliştirin veya kullansanız tabi daha bir güzel olur sanki:)

Hataları yönetin. Hatalardan kaçmayın eğer bir hata aldıysanız aldığınız söyleniyorsa peşine düşün derim hatadan kaçmak değil yüzleşmek gerekir.Bazen hata kovalamakta bir zevk:) Ekrana hataları kabak gibi basmayın bu sizin kötü niyetli kişilere verdiğiniz bahşiş olur. Hatalarda yer alan bilgiler çok kritik bilgiler içeriyor olabilir. Veri tabanı tablo bilgilerinden çalıştığınız dosya yollarına kadar.

Yetkilendirme oturum açma gibi alanlar çok daha yakından takip edilip incelenmeli.

Google özel aramalar ile hiç istemediğiniz bilgileriniz gün yüzüne çıkmış olabilir. Bunlar kontrol edilmeli gerekli yerlerde botlar engellenmelidir.

Dizinleri listeleme görüntüleme engellenmeli. Bu gözden kaçırılırsa istenmeyen sonuçlar olması içten bile değil.

Şifre politikanız olmalı ilkeler yöntemler belirlenmelidir.

Bazı veriler database de doğrudan saklanması yerine şifrelenerek saklanmalıdır. Bu ilgili tablo ele geçirilse de veya ilgili kayıt bilgileri ele geçirilse de işine yaramayacak demektir. En azından bir nebze böyle düşünebiliriz.

Açık olan portlar ve diğer erişim methodları dikkat edilmeli önlem alınmalı. Mümkün olduğunca varsayılan değerlerden uzak durulması gerekir. Çünkü tüm varsayılan bilgiler ilk seferde denenecek yoklanacak işlerdir. Varsayılan portlar, varsayılan ayarlar, varsayılan bilgiler, varsayılan erişim yolları vs.

Test dosyalarımızı ortalarda bırakmamalıyız. Evet basit geliyor ama bir çok kişinin göz ardı ettiği konuların başında gelir. phpinfo dosyanızın ortada bırakıldığını düşünün. İntihar sebebi. Bir test fonksiyonu veya dışarıdan parametre alan test methodları da olabilir. Veri tabanı tablolarını listelediğiniz, şema bilgilerini paylaşan fonksiyon yazdınız ve test için lazım olur diye bıraktınız diyelim. Bu uygulamanın intihar sebebi olabilir.

Freamworkler güncel güvenlik açıklarına göre tasarlanırlar ve bu zafiyetlerin bir çoğunu üstlenerek bize kolaylıklar sağlarlar.

Bazı Güvenlik Efsaneleri:

  • Formdaki gizli inputlar(“hidden”) görülemez değiştirilemez .
  • Javascript ile formdaki verileri kontrol ediyorum yanlış güvensiz bir şey olmaz.
  • Seçilebilir kutu ve seçenek (select, radio) elemanlarında belirtilen değerlerden başka değer yer almaz, değiştirilemez.
  • Başka uygulamalardan taklit formlar gönderilemez, benim formum değiştirilemez.
  • Yapılan işlemler sadece uygulama ile borwser arasında. Başkası araya giremez.

bunlar en çok bilinen şehir efsaneleri niteliğinde yanlış bilgilerdir.

 

İncelenmesi Gereken Önemli Güvenlik Açıkları

  • XSS: Siteler arası komut çalıştırma
  • CSRF: Form sahteciliği
  • Sql Injection: DB açıkları sql sorgularını değiştirme, müdahaleler
  • RFI, LFI: Dosya çalıştırma
  • Oturum Güvenliği

gibi önde gelenler.

Güvenlik Açığı Tespiti

Güvenlik açığı test etmenin bir çok yolu var. En başta zafiyet testi olarak bilinen “Penetrasyon” testleri yapılır.

Manuel denemeler yapılabileceği gibi çeşitli araçlar ile de gerçekleştirilir. En iyi savunma saldırıdır diye bir söz var bilirsiniz. Bu yüzden hacker ların saldırı yöntemlerini öğrenmeniz bilmeniz demek gelebilecek saldırıları tahmin etmek savunma önlemleri alabilmek demektir.

Uygulamayı en iyi yazanlar bilir. Bu yüzden yazılım sürecinde daha birim testlerde oluşturarak denemeler yapmak sağlıklı bir yöntem olacaktır.Böylece test edebilirsiniz.

Piyasada ki açıkları ve güvenlik haberlerini takip ederek test etmek. Bu konuda başta OWASP olmak üzere web güvenliği toplulukları takip edilmelidir.

Ve bir çok yöntem daha.

 

Güvenlik Açığı Buldum Ne Yapmalıyım

Bulduğunuz güvenlik açıkları hakkında notlar alıp mümkünse döküman hazırlayın. Nasıl bulduğunuzu, nasıl test ettiğinizi, ne sorunlara yol açabileceği neler daha yapılabileceği gibi bilgilere yer verebilirsiniz.

Kendi Uygulamamızda Güvenlik Açığı

Kendinizin bulunduğu bir uygulamanız ise ekibinizle paylaşın sebeplerini sonuçlarını tartışın beyin fırtınası gerçekleştirin.Benzer açıkların uygulamanın başka yerlerinde var olup olmadığını, ne zamandan beri açıkla yaşadığınızı hangi önlemleri alabileceğinizi geçmişe yönelik şüpheler varsa önceki dataların incelemesini yapılır. Gerekli işlemler yapılarak sorun giderilir. Ve ekibe bu sorun anlatılıp sunum yapılarak paylaşılırsa çok faydalı olur.

Başka Bir Uygulamada Güvenlik Açığı

Eğer başka bir kuruma ait uygulama da açık bulduysak; iyi niyetimizi hiç bir zaman kaybetmeden üstümüze düşeni yapmalıyız. Testler yaparken zarar vermemeli, bilgilerden kötü niyetli yararlanmamalıyız. Döküman hazırladıktan sonra iletişim kuracağınız bilgiler edinilip kurum ile iletişime geçilir. Gönül ister ki kurumdan da aynı niyetle takdir edilir bir şekilde geri dönüş almak takdir edilmek. Gel gelelim ki günümüzde bu konuda değer verip beklenen cevapları almak büyük ihtimalle hayal olarak kalabilir. Sizin uyarılarınızı hiç dikkate almayan kurumlar bile olacaktır veya bir teşekkür etmeyi akıl bile edemeyenler olacaktır. Aslında yaptığınız bu uyarıyı dikkate almayarak başlarına gelebilecekleri görmezden gelmiş olabilirler. Google gibi şirketlerin bu konulara nasıl önem verip hangi politikaları izlediklerini kurumların incelemelerini yaklaşımlarını değiştirmelerini öneririm en azından isterim.

Sonuç:

Bulduğumuz ve öğrendiğimiz rastladığımız açıklardan ders almak en önemli konudur. Hata yapabiliriz bir çok soruna sebebiyet vermiş olabiliriz önemli olan ders çıkarmaktır. Aldığımız dersleri de paylaşmaktır. Bilinen bir tartışma da hiç bir zaman bir uygulama yüzde yüz güvenli olamaz tartışmasıdır. En iyi uygulamalar bile sorunlar yaşayabilir. Bu konu tartışıla dursun bize bunlara engel olmak elimizden geldiğince sağlamlaştırmak düşer. Baştan önlemler alarak bunları klavuz ederek, kendimizi de geliştirerek önlemler alarak daha sağlam daha sorunsuz yapılar geliştirmeliyiz.

Edindiğim tecrübe ve bilgilerden aklıma gelenleri aktardım, geldikçe de eklemelere devam ederim.

Bu konu başta da belirttiğimiz gibi çok kapsamlı konudur. Nelere sebebiyet verebileceği, hangi önlemlerin olduğu, hangi tehdit çeşitleri gibi bir çok konu başlığı çıkar uzar gider. Uygulama geliştirirken güvenlik önlemleri ve yöntemleri içeren açıklayıcı örneklerle makalelerde paylaşmış olacağız.

Ubuntu Php Mcrypt Yükleme

Laravel için sistem gereksinimlerinde bahsettiğimiz “Mcrypt”  Php eklentisi kurulu olmadan çalışmayı denediğimizde “Mcrypt PHP extension required.” hatası ile karşılaşırız.

Mcrypt eklentisinin yüklü olmadığı belirtiliyor. Bu eklentinin yüklü olup olmadığını phpinfo sayfamızdan da öğrenebiliriz.

mcrypt eklentisi

mcrypt eklentisi

Ubuntu Mcrypt Yükleme

sudo apt-get install php5-mcrypt

daha sonra web sunucumuzu yeniden başlatıyoruz.

sudo service apache2 restart

Aktifleştirmek için yeniden başlatmamız gerekiyor. Yoksa eklenti kurulu olsa da uygulama da kullanmayacaksınız.

Nginx php-fpm kullananlar için ise php-fpm restart edilmesi gerekiyor.

Nginx php-fpm Mcrypt

sudo service php5-fpm restart