Betül SARAL

Bilgisayar Mühendisi

Node.js - Streams

| Comments

Streams, kaynaktan sürekli veri okuyan ve hedef veriye kolayca aktarım yapılan nesnelerdir. Node.js 4 farklı streams çeşidi kullanır. Ben bunların üçünden bahsedeceğim.

  • Readable Stream , kaynaktan veriyi okuyan akıştır
  • Writable Stream , hedefe veriyi gönderen akıştır
  • Duplex Stream , hem okuma hemde yazma işlemi yapan akıştır.

  • Basit bir Node uygulamasında kullandığımız http server da request aslında bizim için readable stream, response writable stream ve fs modülü ise dublex stream olarak kullanılabilmektedir.

    Streams nesnelerini kullanırken EventEmitter yapısını da kullanarak farklı zamanlarda oluşan olayları rahat bir şekilde takip edebiliriz. Bu yapıda kullanılan bazı eventler aşağıdaki gibidir.

  • data, veri okunurken bu event tetiklenir.
  • end , kaynaktan okunacak data kalmadığında bu kısma düşer.
  • error , veriyi okuma veya yazmada herhangi bir problem olursa bu kısma düşer.

  • Şimdi birkaç örnek üzerinden konuyu açıklayalım. İlk önce readable stream örneğine bakalım.

    app.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    	var fs = require('fs');
    	var readableStream = fs.createReadStream('file.txt');
    
    	var data = '';
    
    	readableStream.on('data', function(chunk) {
    	    data+=chunk;
    	});
    
    	readableStream.on('end', function() {
    	    console.log(data);
    	});
    

    file.txt adında bir dosyamız var ve fs.createReadStream yaparak bu dosyayı stream olarak okumamızı sağlıyoruz. readableStream.on diyerek EventEmitter yapısındaki fonksiyonları çağırıyoruz. Kaynaktan okuma yaparken yukarıda bahsettiğim gibi data event yapısına düşer. readableStream’den gelen her bir parçayı dataya ekliyoruz. Okunacak veri bittiğinde ise end event yapısına gidiyor ve datayı bastırıyor.

    Pipe yapısını inceleyelim.

    app.js
    1
    2
    3
    4
    5
    
    	var fs = require('fs');
    	var readableStream = fs.createReadStream('file1.txt');
    	var writableStream = fs.createWriteStream('file2.txt');
    
    	readableStream.pipe(writableStream);
    

    Pipe yapısı streams okumak ve yazmak için kullanılabilecek en iyi yöntemdir. Çünkü akışı size bırakmaz kontrolü kendindedir. Datayı okuma veya yazma hızını yönetme işini kendi yapar. Bu örnekte file1.txt içerisindeki veriyi pipe yaparak yani bir boru hattı oluşturup veriyi bu yapı içerisinden file2.txt aktardığını hayal edebilirsiniz. Pipe ile zincirleme bir yapısı kurarak birden fazla streams nesnesini kullanabilirsiniz.

    app.js
    1
    2
    3
    4
    5
    6
    
    	var fs = require('fs');
    	var zlib = require('zlib');
    
    	fs.createReadStream('input.txt.gz')
    	  .pipe(zlib.createGunzip())
    	  .pipe(fs.createWriteStream('output.txt'));
    

    Bu örnekte ilk önce input.txt.gz adında okunabilir bir streams yapısı oluşturuyoruz. zlib.createGunzip() ile unzip işlemi yaparak içeriği okunup output.txt’e yazılabilir bir stream oluşturup veriyi aktarıyoruz.

    Şimdi basit bir streams yazma örneği yapalım. Gerekli açıklamaları kod içerisinde yaptım.

    app.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    	var fs = require("fs");
    	var data = 'test123';
    
    	//streams yazmak için output.txt adında dosya oluşturuyoruz
    	var writerStream = fs.createWriteStream('output.txt');
    
    	// streams yazmak için write fonksiyonu kullanılır. datayı UTF8 cinsinsen txt dosyamıza yazıyoruz.
    	writerStream.write(data,'UTF8');
    
    	// streams yazma işlemini bitiriyoruz
    	writerStream.end();
    
    	// herhangi bir problem sonucu bu kısma düşer
    	writerStream.on('error', function(err){
    	   console.log(err.stack);
    	});
    

    Streams konusu özetle şimdilik bu kadar. Bu konuda araştırma yaptıkça buraya da aktaracağım.

    Node.js - Promises

    | Comments

    Promises, Node.js gibi asenkron çalışma mantığını kullanan programlamalar için önemli bir yöntemdir. Pyramid of Doom olarak nitelendirilen iç içe geçmiş karmaşık ve uzun kodların daha düzenli ve daha sade hale gelmesini sağlar. Bu yöntem belki tek başına kullanılan asenkron bir fonksiyon için çok etkili değil ama birden fazla fonksiyon olma durumunda kullanılması gereken bir yöntemdir.

    Promises için birçok kütüphane bulunur. Bunlardan en çok bilineni Blubird ve Q kütüphanesidir. Node.js kullanan birçok framework de aslında promises yapısını kullanılan kütüphaneler eklidir. Mesela benim şu an kullandığım Sails.js veritabanı sorguları için promise yapısı olarak bluebird ile çalışabilmektedir.

    Şimdi promise yapısı kullanmadan iç içe geçmiş küçük bir programlama yapalım. setTimeout olarak farklı milisaniyelerde çalışan 4 adet fonksiyon tanımlıyoruz.

    Pyramid of Doom
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    function testFunc1(name,callback) {
        setTimeout(function () {
            callback(null,name);
        }, 500);
    }
    
    function testFunc2(name,callback) {
        setTimeout(function () {
            callback(null,name)
        }, 100);
    }
    
    function testFunc3(name,callback) {
        setTimeout(function () {
            callback(null,name)
        }, 900);
    }
    
    function testFunc4(name,callback) {
        setTimeout(function () {
            callback(null,name)
        }, 3000);
    }
    
    testFunc1("Betül",function(err,result1){
        if(err){
            console.log(err);
        }
        else{
            console.log("testFunc1 sonucu : "+result1);
            testFunc2("Hande",function(err,result2){
                if(err){
                    console.log(err);
                }
                else{
                    console.log("testFunc2 sonucu : "+result2);
                    testFunc3("Tuğba",function(err,result3){
                        if(err){
                            console.log(err);
                        }
                        else{
                            console.log("testFunc3 sonucu : "+result3);
                            testFunc4("Yasemin",function(err,result4){
                                if(err){
                                    console.log(err);
                                }
                                else{
                                    console.log("testFunc4 sonucu : "+result4);
                                }
                            });
                        }
                    });
                }
            });
        }
    });
    

    Bu şekilde 10 tane daha fonksiyon çalıştırdığınızı düşünün. Hepsi iç içe. Ne kadar kötü gözüküyor değil mi ? Ama promises ile çalıştığımız zaman bu problemi ortadan kaldırıyoruz.

    Ben Q kütüphanesini kullandım. Siz isterseniz blubird kullanabilirsiniz. Çalışma mantıkları aynı ama söz dizimleri birbirine benzemiyor. Q kütüphanesini npm ile burdan yükleyebilirsiniz.

    promise.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    
    var Q = require('q');
    
    function testFunc1(name) {
    	var deferred = Q.defer();
    	setTimeout(function () {
    	    deferred.resolve("test1 fonksiyonu : "+name);
    	}, 500);
    
    	return deferred.promise;
    }
    
    function testFunc2(name) {
        var deferred = Q.defer();
    
        setTimeout(function () {
            deferred.resolve("test2 fonksiyonu : "+ name);
        }, 100);
    
        return deferred.promise;
    }
    
    function testFunc3(name) {
     	var deferred = Q.defer();
    
        setTimeout(function () {
            deferred.resolve("test3 fonksiyonu : "+name);
        }, 900);
    
        return deferred.promise;
    }
    
    function testFunc4(name) {
     	var deferred = Q.defer();
    
        setTimeout(function () {
            deferred.resolve("test4 fonksiyonu : "+name);
        }, 300);
    
        return deferred.promise;
    }
    
    testFunc1("Betül")
        .then(function (result) {
            console.log(result);
            // testFunc2 fonksiyonunu çağırıyoruz
            return testFunc2("Hande");
        })
        .then(function (result) {
    
           console.log(result);
    
            // testFunc3 fonksiyonunu çağırıyoruz
            return testFunc3("Tuğba");
        })
        .then(function (result) {
            console.log(result);
    
            // testFunc4 fonksiyonunu çağırıyoruz
            return testFunc4("Yasemin");
        })
        .then(function (result) {
        	//testFunc4 fonksiyonunu sonucu
            console.log(result);
        })
        .catch(function (error) {
            console.log("Hata : "+error);
        });
    

    deferred ile promises nesnemizi tanımlıyoruz. then ve catch ile fonksiyon sonucunda oluşan nesnemizi döndürüyoruz. Promises yapısında callback kullanılmaz. Bunun yerine fonksiyon sonuçları senkron bir şekilde then , catch yapısına gider. Eğer fonksiyon sonucu bir hata oluşmuyorsa then fonksiyonuna, eğer bu fonksiyonlardan herhangi birinden hata alıyorsak ise catch fonksiyonuna gider. Böylece her bir fonksiyon için hata kontrolü yapmak yerine catch kullanarak hata kontrolünü tüm fonksiyonlar için tek bir satırda yapıyoruz.

    Şimdilik bu kadar. Promises ile ilgili araştırmalarım devam ediyor. Yeni şeyler öğrendikçe burayı da güncellemeye çalışacağım.

    Node.js - Async

    | Comments

    Async, asenkron işlemler için kullanılan bir javascript kütüphanesidir. Bu kütüphanede önemli olan asenkron işlemlerinin yönetimini kolaylaştıracak control flow fonksiyonlarıdır. Async ile işlem yapabilmek için önce npm ile modülü yüklemek gerekir.

    İlk olarak async.parallel fonksiyonuna bakalım. Bu kullanım, fonksiyonların birbirlerini bekletmeden çalışmasını sağlar. Yani 3 fonksiyonunuzda aynı anda çalışmaya başlar ve işlem bittiğinde size sonuç döner. Aşağıda örnek kullanımı bulunmaktadır.

    async2.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    	var async = require('async')
    	var fs = require('fs');
    	var date = new Date();
    	console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
    
    	async.parallel({
            one: function(callback){
               for(var j=0; j<= 3000000000; j++){
                    if(j === 3000000000){
                        callback(null,"one")
                    }
                }
            },
            two: function(callback){
                for(var k=0; k<= 6000000000; k++){
                    if(k === 6000000000){
                        callback(null,"two")
                    }
                }
            },
            three: function(callback){
                for(var i=0; i<= 100; i++){
                    if(i === 100){
                        callback(null,"three")
                    }
                }
            },
        },
        function(err, results) {
            var date = new Date();
            console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
            console.log(results);
        });
    

    Fonksiyonun ne kadar süre çalıştığını göstermek için zamanı da ekledim. Sonuç aşağıdaki gibidir

    İkinci olarak ise async.series fonksiyonuna bakalım. Bu kullanımda ise fonksiyonlar sıraya dizilir ve birbirlerini bekleyip callback döndürürler. Örnek olarak aşağıdaki gibidir.

    async2.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    	var async = require('async')
    	var fs = require('fs');
    	var date = new Date();
    	console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
    	async.series({
            one: function(callback){
               for(var j=0; j<= 3000000000; j++){
                    if(j === 3000000000){
                        callback(null,"one")
                    }
                }
            },
            two: function(callback){
                for(var k=0; k<= 6000000000; k++){
                    if(k === 6000000000){
                        callback(null,"two")
                    }
                }
            },
            three: function(callback){
                for(var i=0; i<= 100; i++){
                    if(i === 100){
                        callback(null,"three")
                    }
                }
            },
        },
        function(err, results) {
            var date = new Date();
            console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
            console.log(results);
        });
    

    Sonuç aşağıdaki gibidir.

    Son olarak async.waterfall modeline bakalım. Bu kullanım yönteminde ise fonksiyonlar sırasıyla çalışır ve bir fonksiyonun çalışması kendinden önce gelen fonksiyonun döndürdüğü sonuç ile sağlanır.

    async2.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    	var async = require('async')
    	var fs = require('fs');
    	var date = new Date();
    	console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
    
    	async.waterfall([
    	    function(callback){
    	        for(var j=0; j<= 3000000000; j++){
    	            if(j === 3000000000){
    	                callback(null,"bitti1")
    	            }
    	        }
    	    },
    	    function(val1,callback){
    	        callback(null,"bitti2")
    	    },
    	    function(val2,callback){
    	        callback(null,"bitti3")
    	    },
    	], function (err, result) {
    	    var date = new Date();
    	    console.log(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
    	    console.log(result);
    	});
    

    Sonucumuz :

    Rails - Ajax Datatables

    | Comments

    Datatables, JavaScript ve jQuery ile yapılan sıralama,sayfalama yada arama işlemlerini düz bir html tablosu üzerinde kullanılmasını sağlar. Daha iyi bir kullanıcı arayüzü vardır ve kullanıcıya birçok seçenek sunar. Bu yazıda Rails’e nasıl entegre edileceği gösterilmektedir.

    İlk olarak Gemfile içerisine aşağıdaki gemlerin yüklenip bundle edilmesi gerekmektedir.

    Gemfile
    1
    2
    3
    4
    5
    6
    
    group :assets do
      gem 'jquery-datatables-rails', github: 'rweng/jquery-datatables-rails'
      gem 'jquery-ui-rails'
    end
    
    gem 'kaminari'
    

    Ben sayfalama işlemi için kaminari gemini kullandım. Bu işlem için benzer gemlerde kullanılabilir. Ama datatables ayarlaması yapılırken birkaç yerin değiştirilmesi gerekir.

    Sistemi bundle ettikten sonra layouts içerisinde application.html.erb dosyasınıza yada datatables hangi view sayfasında oluşacaksa o sayfanının içerisinde gerekli kütüphaneleri eklemeliyiz.

    index.html.slim
    1
    2
    3
    
    = stylesheet_link_tag '//cdn.datatables.net/1.10.0/css/jquery.dataTables.css'
    = javascript_include_tag "//code.jquery.com/jquery-1.10.2.min.js"
    = javascript_include_tag "//cdn.datatables.net/1.10.0/js/jquery.dataTables.js
    

    Şimdi tablomuzun olduğu sayfa içerisine gidelim ve gerekli düzenlemeleri yapalım.

    index.html.slim
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    table#attendant_list data-source=(admin_attendants_url(format: "json"))
      thead
        tr
          th Ad
          th Soyad
          th TC
          th IBAN
          th Telefon
          th Ünvan
          th İşlemler
    
    /datatables ayarlamaları
    
    javascript:
      $(document).ready(function() {
        $('#attendant_list').dataTable({
          language: { 'url': 'http://cdn.datatables.net/plug-ins/28e7751dbec/i18n/Turkish.json' },
          "bPaginate": true,
          "bProcessing": true,
          "bServerSide": true,
          "ajax": $('#attendant_list').data('source'),
        });
      });
    

    app dizini altında datatables adında bir dizin oluşturalım ve ajax server side işlemlerini için gerçekleştirdiğimiz yapılandırmaları attendants_datatable.rb içerisine yerleştirelim. Burada önemli olan kısım parametrelerdir. Rails sürümünde dolayı internette çoğu yerde parametreler farklı isimlerde geçmektedir. Parametre isimlerinizi rails uygulaması çalışırken loglardan takip ederek bulabilirsiniz. Örnek olarak benim uygulamamdaki parametreler;

    Eski parametreler ise ;

    Bunları karşılaştıracak olursak;

  • params[:iDisplayLength] = params[:length]
  • params[:iDisplayStart] = params[:start]
  • params[:iSortCol_0] = params[:column]
  • params[:sSortDir_0] = params[:dir]
  • params[:sSearch] = params[:search][:value]

  • Sonuç olarak dosyamızın içeriği şu şekilde oluyor:

    attendants_datatable.rb
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    # encoding: UTF-8
    class AttendantsDatatable
      delegate :params, :h, :link_to, :number_to_currency, to: :@view
    
      def initialize(view)
        @view = view
      end
    
      def as_json(options = {})
        {
          sEcho: params[:sEcho].to_i,
          iTotalRecords: Attendant.count,
          iTotalDisplayRecords: attendants.total_count, #kaminari gemine göre düzenlendi.
          aaData: data
        }
      end
    
    private
    
      def data
        attendants.map do |attendant|
          [
            h(attendant.first_name),
            h(attendant.last_name),
            h(attendant.title_name),
            link_to("Görüntüle", attendant) + " | "+link_to("Düzenle", "#") + " | " +link_to("Sil", attendant, method: :delete)
          ]
        end
      end
    
      def attendants
        @attendants ||= fetch_attendants
      end
    
      def fetch_attendants
        attendants = Attendant.order("#{sort_column} #{sort_direction}").page(page).per(per_page)
        if params[:search].present?
          attendants = attendants.where("first_name like :s or last_name like :s ", s: "%#{params[:search][:value]}%")
        end
        attendants
      end
    
      def page
        params[:start].to_i/per_page + 1
      end
    
      def per_page
        params[:length].to_i > 0 ? params[:length].to_i : 10
      end
    
      def sort_column
        columns = %w[first_name last_name]
        columns[params[:column].to_i]
      end
    
      def sort_direction
        params[:dir] == "desc" ? "desc" : "asc"
      end
    end
    

    Son olarak Controller’da json kısmına küçük bir eklenti yapıyoruz.

    attendants_controller.rb
    1
    2
    3
    4
    5
    6
    
    def index
        respond_to do |format|
          format.html
          format.json {render json: AttendantsDatatable.new(view_context) }
        end
    end
    

    ORACLE- SYSTEM Hesabının Parolasını Değiştirmek

    | Comments

    Oracle XE, SYSTEM/SYS parolasını unuttuysanız veya değiştirmek istiyorsanız aşağıdaki adımları takip edebilirsiniz.

  • Oracle kurulumunda sisteminize, veritabanını komutlarla çalıştırabileceğiniz sistem menüsü programları eklenir. Bunlardan “Start Database” olanını çalıştırın.
  • Açılan ekrana sqlplus "/ as sysdba" komutunu girin. Bu komut OS kimlik ataması yaparak Oracle’a yetkili giriş için izin verir ve sistem kullanıcıları üzerinde çalışmamıza olanak sağlar.

  • Son olarak aşağıdaki komutları da girip veritabanını yeniden başlattığımızda SYSTEM hesap parolası değişmiş olur.

  • SQL
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    SQL> show user
    
    USER is "SYS"
    
    SQL> passw system
    Changing password for system
    New password:
    Retype new password:
    Password changed
    
    SQL> quit
    

    ORACLE - DDL,DCL,DML Ve TCL İşlemleri

    | Comments

    Data Definition Language (DDL)

    Veritabanı yapısı ve şema tanımlamak için kullanılan komutlardır. Bunlardan bazıları;

  • CREATE, veritabanında objeleri oluşturur.
  • DROP, objelerin veritabanından silinmesini sağlar.
  • ALTER, veritabanı nesnelerinin yapısını değiştirmek için kullanılır.
  • TRUNCATE, bir tablo içerisindeki tüm kayıtları silmek için kullanılır.
  • RENAME, veritabanı nesnesinin adını değiştirir.
  • COMMENT, veri sözlüğüne yorum ekler.

  • Data Manipulation Language (DML)

    Veritabanı objelerinin içerisindeki verileri yönetmeye yarayan komutlardır. Bunlardan bazıları;

  • SELECT, veritabanından veri çekmek, listelemek, göstermek için kullanılır.
  • INSERT, tablo içerisine veri eklemek için kullanılır.
  • UPDATE, tablo içerisindeki verilerin güncellenmesinde kullanılır. ALTER komutundan farkı ise; ALTER tablonun yapısı ile ilgili güncelleme yaparken UPDATE ise veri içeriğinden güncelleme yapar.
  • DELETE, tablodaki kayıtları silmek için kullanılır. TRUNCATE komutundan en önemli farkı ise, DELETE komutu ile belli bir aralığı silebilirken, TRUNCATE ile tablonun tamamını silebiliyoruz. TRUNCATE komutu parçalı silme yapmaz ama DELETE, WHERE kullanıldığında parçalı silme yapabilir
  • MERGE - UPSERT, operasyonunun yapılması (insert etmek, eğer insert hata alırsa update etmek işlemi)
  • CALL, bir PL/SQL yada JAVA alt programı çağırmak için kullanılır.
  • LOCK TABLE, kontrol altında tutma işlemleri.

  • Data Control Language (DCL)

    Veritabanında erişim izinlerinin verilmesi veya verilen izinlerin iptal edilmesini sağlayan,yetki tanımlama kontrol unsurlarını içeren komutlardır. Bunlardan bazıları;

  • GRANT, kullanıcıya veritabanı üzerinde yetki tanımlamak için kullanılır.
  • REVOKE, yetkilerin iptal edilmesi için kullanılır.

  • Transaction Control (TCL)

    DML ile yapılan işlemlerin yönetilmesini ve kontrol edilmesini sağlayan komutlardır. Bunlardan bazıları;

  • COMMIT, yapılanları kayıt eder.
  • SAVEPOINT, daha sonra rollback yapılmak üzere bir nokta belirler.
  • ROLLBACK, veritabanında son COMMIT’e kadar olan yere geri alır.
  • SET TRANSACTION, işlemlerin izolasyon seviyesini modifiye etmek veya mevcut işlemin özelliklerini değiştirmek için kullanılabilir.

  • ORACLE Kurulum Problemi

    | Comments

    Oracle kurulumunu tamamladıktan sonra, dizin altında bulunan “Get Started” çalıştırınca aşağıdaki gibi bir hata alıyorsanız;

    şu adımları izleyerek sorununuzu çözebilirsiniz.

  • “Get Started” ikonuna sağ tıklayıp özellikler kısmını açın.

  • Burda birlikte aç kısmından Google Chrome,Mozilla Firefox yada kullandığınız tarayıcınızı seçin.
  • Şimdi tekrar “Get Started” çalıştırmayı deneyin. URL’ yi http://127.0.0.1:8080/apex/f?p=4950 tarayıcınıza yazdığınızda karşınıza aşağıdaki gibi giriş ekranı çıkması gerekir. Kullanıcı adınızı “SYSTEM” ve parolanızı da girdikten sonra Oracle kurulumu tamamlanmış olur.

  • MySQL - Büyük Boyutlu Veritabanlarını İçe Aktarma Problemi

    | Comments

    PhpMyAdmin aracılığı ile büyük boyutlu veritabanlarını import ederken

    Muhtemelen çok büyük dosya göndermeyi denediniz. Lütfen bu sınıra çözüm yolu bulmak için belgeden yararlanın.

    şeklinde bir hata alabiliriz. Bu hatanın çözüm yolu şöyledir : İlk olarak /php5/apache/php.ini dosyasını açalım. Bu dosya içerisinde bazı değişiklikler yapmamız gerekiyor. Bunlar :

  • post_max_size = 750M
  • upload_max_filesize = 750M
  • max_execution_time = 5000
  • max_input_time = 5000
  • memory_limit = 1000M

  • Karşılık gelen değerleri değiştirdikten sonra Windows da Wamp , Ubuntu da ise sudo /etc/init.d/apache2 restart diyerek servisleri yeniden başlattığınız da sorununuzun çözüldüğünü görebilirsiniz.

    Matlab - STPRTool Kurulum Ve Kullanım

    | Comments

    STPRTool Nedir ?

    STPRTool (Statistical Pattern Recognition Toolbox for Matlab ), matlab içerisinde istatiksel örüntü tanıma için kullanılan bir toolbox olarak tanımlanır. Bu araç içerisinde kNN, SVM gibi örüntü tanıma yöntemleri bulunur. İçerisinde farklı algoritma yöntemleri barındırdığı için sonuçlarımızı gerçeğe yakın bulmamıza yardımcı olur.

    Kurulum

  • İlk olarak STPRTool indirelim.
  • Dizini zip içerisinden C sürücüsü hariç herhangi bir yere çıkartın. Eğer STPRTool C sürücüsünde olursa derlenme sırasında problemler yaşanabilir.
  • Matlab içerisinde Open diyerek STPRTool içerisindeki stprpath.m dosyasını çalıştırın.
  • Daha sonra compilemex.m dosyasını çalıştırın. Eğer derlenme sırasında sorun çıkmamışsa STPRTool içerisinde olan tüm algoritmalar kullanılabilir hale gelmiştir.

  • Çıkabilecek Sorunlar

    STPRTool kurulumu sırasında biraz sorun çıkartabilir. Şimdi o sorunların çözümlerine bakalım.

    Terminal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    >> compilemex
    Compiling MEX files of STPRtool...
    mex -O -IC:\Program Files\MATLAB\R2013a\toolbox\stprtool\kernels -outdir C:\Program Files\MATLAB\R2013a\toolbox\stprtool\kernels C:\Program Files\MATLAB\R2013a\toolbox\stprtool\kernels\kernel.c C:\Program Files\MATLAB\R2013a\toolbox\stprtool\kernels\kernel_fun.c
    Error using mex (line 206)
    The destination directory "C:\Program" cannot be found.
    
    Error in compilemex (line 113)
      eval(mexstr);
    
    Error in compilemex (line 113)
      eval(mexstr);
    

    Eğer yukarıdaki gibi bir hata alıyorsunuz compilemex.m içerisinde 102.satırda aşağıdaki değişikliği yapmanız gerekir.

    compilemex.m
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    % -- Compile functions -----------------------------
    for i=1:length(fun),
       mexstr = ['mex -O -I''' translate(fun(i).include,root) ...
                 ''' -outdir ''' translate(fun(i).outdir, root) ''' '];
    
      for j=1:length(fun(i).source),
        mexstr = [mexstr '''' translate(char(fun(i).source(j)),root) ''' '];
      end
    
      fprintf('%s\n',mexstr);
    
      eval(mexstr);
    end
    

    Diğeri ise compilemex.m derlenme sırasında mex ile ilgili aşağıdaki gibi hata alınıyorsa;

    SDK kurmanız gerekmektedir. Bunu şu siteden indirebilirsiniz. SDK kurulum sırasında da hata alabilirsiniz. Ben kurulum yaparken aşağıdaki gibi bir hata aldım.

    Bu hatayı yok etmek için kayıt defterini çalıştırın. Kayır defteri sistemde düzgün kurulmamış veya kaldırılamamış programları belirler ve gerekeni yapar. Kayıt defterini çalıştırdığımız zaman SDK kurulumunun yapabilmemiz için Uninstall VC++ 2010 (x86 and x64) kaldırılması gerekir. Böylece SDK kurulur ve derleme başarılı bir şekilde gerçekleşir.

    Matlab - Video İşlemede FFMPEG Kullanımı

    | Comments

    KURULUM

    Elimizde bir videomuz var ve framelere ayırmamız gerekiyor. Bunun en iyi yolu ffmpeg ‘dir. FFmpeg kullanmak için önce sistemimize kurup tanıtmamız gerekir. Ben Windows üzerinden gideceğim. İlk önce bu adresten sisteminize uygun olanı indirin.

  • İndirdiğiniz sürümü zip içerisinden çıkartın. C sürücüsü altına ffmpeg adında bir dizin oluşturun ve buraya aktarın.

  • Sistemde ffmpeg yolunu tanımlamamız gerekir. Bilgisayarıma sağa tıklayıp “Özellikler” kısmından “Gelişmiş Sistem Ayarlarını” seçin

  • User Variables kısmından yeni yol tanımlamayı seçin. Variable kısmına “PATH” , Value kısmına ise ffmpeg yolunu yani “C:\ffmpeg\bin” tanımlayın

  • Ayarlamaları yapıp tamam dedikten sonra komut istemini açın ve ffmpeg -version yazın. Sonuç olarak aşağıdaki çıktıyı alıyorsanız kurulum tamamlanmış demektir.

  • KULLANIM

    Kurulumu halletik peki bunu Matlab içerisinde nasıl kullanacağız. Elimizde bulunan videoyu framelere ayırmak istiyoruz o zaman

    Terminal
    1
    2
    3
    4
    
    % wave1.mp4 adındaki videomun tüm framelerini
    %images dizini altında image1.jpg,image2.jpg .. şeklinde oluşmasını istedim.
    
    system('ffmpeg -i wave1.mp4 images/image%d.jpg')
    

    Resimlerden video oluşturmak ise

    Terminal
    1
    2
    3
    4
    5
    
    % wave1.mp4 images altına çıkardığım frameleri
    % birleştirerek test.avi isminde yeni bir video oluşturdum.
    % burdaki -r saniyede geçen kare sayısıdır
    
    system('ffmpeg -r 10 -i images/image%d.jpg -vcodec mpeg4 test.avi')
    

    Örnek Bir Kodlama