5 Mayıs 2015 Salı

Sinema - "Yes Man - Bay Evet"

Gidilesi filmlerden bir tanesi. İnsanların eğlenmek için o kadar çok fırsatı var ancak her şeye çekingen, isteksiz yaklaşarak ne kadar çok fırsatı harcadığımızı anlatan güzel bir film. Filmden çıktıktan sonra her şeye evet desem acaba hayatım daha mı güzel olur diye düşünüyor insan. Biraz daha hareketli, biraz daha hayata olumlu yaklaşmanızı sağlıyor. Ben oldukça eğlendim, çok gülmemiş olsamda filmden mutlu ayrıldım. Eleştirilecek fazla bir şey yok aklımda, çünkü beklentilerim fazla değildi. Filmdeki karakter herkesin yapmak istediği ancak yapamadığı şeyleri YES diyerek yapabiliyorsa, bazı yaptıkları hariç :), denemekten zarar gelmez gibi...

GSM - Convergent Billing

Based on a true story...
Aşağıda anlatınlar hayal ürünü değil tamamı ile gerçektir :) Yanlışım, hatam var ise, düzeltebilirseniz şimdiden teşekkürler.

Convergent Billing Nedir?
Türkçeye "Birleşik Faturalama Sistemi" olarak çevirebiliriz. GSM sektöründe sunulan bütün servislerin aynı sistem tarafından faturalandırabilmesidir.

Neden Convergent Billing?
Kabaca, müşteriye sunulabilecek onlarca servis var ancak bunu sağlayabilmek için sunulan servislerin ücretlendirilebilmesi lazım. Sunulan servisleri sınırlandırmak istemiyorsak arka planda çalışan ücretlendirme sistemimizin sınırlarının daha geniş olması gerekiyor. Bu da convergent billing sistemini işaret ediyor. Müşteri memnuniyeti servis zenginliği gerektiriyor. GSM operatörlerinin vazgeçilmez hedefi haline gelmiş durumdadır. Mesela bir müşteri isteği olarak şöyle bir şey gelebilir, benim şirket hattım gün içinde faturalı olarak çalışsın ama akşam olunca çalışanımın kontörlü hattı devreye girsin ve benim şirket hattıma akşamki konuşmaların ücretleri yansımasın. Faturalandırma sisteminiz bunun gibi istekleri karşılayabilmeli. Tabi böyle istekleri dinamik bir şekilde karşılaması gerekiyor.

Gaz ve Toz Bulutu:
Faturalandırma sistemleri Call Detail Record(CDR) ile başlar dersek yanlış olmaz herhalde. Peki bu CDR nedir, nereden gelir, içeriği nasıldır, biraz bunun üzerinden geçelim.

GSM sistemini oluşturan temel taşları şu şekilde sayabiliriz; Mobile Stations (Ms - Cep Telefonları), Base Stations (BS - Baz İstasyonları), Mobile Services Switching Centers (MSC - Santraller). Baz istasyonu sistemini de biraz açarsak, içerisinide Base Station Controller (BSC) ve Base Transceiver Stations (BTS) birimlerini barındırır. BTS’ler BSC'ler tarafından kontrol edilirler. BSC’ler bağlı bulundukları MSC’ler tarafından kontrol edilirler. BSC, radyo dalgaları ile ilgili tüm fonksiyonlara kumanda eder. BSC'lerin MS handover, radyo kanalı tahsis etme ve hücre data bilgilerini toplama görevleri vardır. BTS, radyo arabirimini kontrol eder, MS'lere konuşma kanalları ayarlar. Dönelim MSC'ye, MSC; networkteki bağlantının, konuşma ve data haberleşmesinin yapıldığı birimidir, buna interconnect diyoruz. Bu noktada Home Location Register (HLR) ve Visitor’s Location Register (VLR) kavramları devreye girer. HLR; Cep telefonunun nerede olduğu bilgisi ve abonenin kimlik bilgilerine dair her türlü veriyi tutan bilgi bankasıdır, abonenin şebeke genelinde nerede olduğu bilgisine sahiptir. VLR; sadece içinde bulunduğu MSC bölgesi sınırları içerisinde bulunan abonelerin bilgilerini geçici olarak içerir.

Şimdik gelelim konuşma senaryosunda bu birimler bize nasıl yardımcı oluyor:
A numarası B numarasını aramaya çalışıyor diyelim,
- A numarası bir BS servis alanı içerisinde olmalıdır,
- BS sağladığı arama bilgisiyle beraber MSC'ye gerekli bilgileri yollar,
- MSC konuşma talebinde bulunulan B numarası için öncelikle VLR'a başvurar,
- VLR kendi alanında B numarasını bulamaz ise MSC HLR'a B'nin yerini sorar,
- O arada MSC güvenlik katmanlarında A'nın ve B'nin durumunu sorgular,
- Kontrollerden geçen MSISDN bilgileri için OK alınır ve arama devam ettirilir,
- MSC kendi aralığında B numarasına ulaşırsa kendi içinde B'nin durumunu inceler, eğer kendi aralığında B yok ise B'ye bakan MSC ile irtibata geçer ve B'nin durumu hakkında bilgi alır,
- Kontroller sonucunda A ile B arasında Traffic Channel (TCH - Konuşma Kanalı) açılır ve konuşma başlar.

Tabi bu aşamalarda çok daha fazla işlemler yapılıyor, örneğin VLR ve HLR bilgi güncellemeleleri, ancak bizim için önemli olan konuşmanın sonlandığı esnada olanlar:
- Konuşma sonunda MSC bir Call Detail Record (CDR - Konuşma Bilgileri Kaydı) üretir,
- MSC’de üretilen bu kayıtlar bir file içinde toplanır,
- Bu dosya ya her saat veya dolup belirli bir büyüklüğe erişince Billing Gateway’e (BGW - Faturalandırma Servisine) yollanır,
- BGW gelen kayıtları standart bir formata dönüştürdükten sonra bunları rating modülüne yollar.
Ve sonunda indiragandi...


Convergent Billing Bileşenleri Nelerdir, Neler Olabilir?
Service Control Platform (SCP),

Spring MailPreparator

Application Context XML Content:
-beans-
    
    -bean id="propertyConfigurerFW" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"-
        -property name="locations"-
            -list-
                -value-classpath:comrepkinresourcesapplicationContextFW.properties-value-
                -value-classpath:comrepkinresourcesldap.properties-value-
            -list-
Application Context X
        -property-       
        -property name="placeholderPrefix" value="["-        
        -property name="placeholderSuffix" value="]"-     
    -bean-


    -bean id="javaMailSenderImpl" scope="singleton" class="org.springframework.mail.javamail.JavaMailSenderImpl"-
        -property name="host" value="[smtp.host]"-
        -property name="port" value="[smtp.port]"-
          -property name="protocol" value="smtp"-        
        -property name="username" value="[smtp.username]"-
        -property name="password" value="[smtp.password]"-
    -bean-
    
    -bean id="mailPreparator" scope="singleton" class="com.repkin.mail.MailPreparator"-
        -property name="from" value="[smtp.from]" -
        -property name="charSet" value="[charSet]" -
    -bean-
    
    -context:component-scan base-package="com.repkin.mail"-

    -aop:aspectj-autoproxy proxy-target-class="true"-
        
-beans-

Mail Class Content:

package com.repkin.mail;
import java.util.ArrayList;
import java.util.List;
public class Mail {

   private    String                from;
   private    String                to;
   private    String                subject;
   private    String                text;
   private    List    attachments;

   public Attachment getNewAttachment(){
       return new Attachment();
   }

   public Mail() {
       attachments = new ArrayList();
   }
  
   public class Attachment {
       private    String fileName;
       private    String attachmentName;
   
       /*GETTERS AND SETTERS*/   
   }

   /*GETTERS AND SETTERS*/   
}


MailPreparator Class Content:

package com.repkin.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Multipart;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.springframework.mail.javamail.MimeMessagePreparator;

import com.repkin.StringUtil;
import com.repkin.mail.Mail.Attachment;

public class MailPreparator implements MimeMessagePreparator {


private Mail  mail;
private String  from;
private String  charSet;

public void prepare(MimeMessage mimeMessage) throws Exception {
 mimeMessage.addFrom(InternetAddress.parse(getFrom()));
 mimeMessage.addRecipients(RecipientType.TO, mail.getTo());
 mimeMessage.setSubject(mail.getSubject(),getCharSet());
 mimeMessage.setText(mail.getText(),getCharSet());
 if(mail.getAttachments() != null && mail.getAttachments().size() > 0) {
  Multipart multipart = new MimeMultipart();
  MimeBodyPart messageText = new MimeBodyPart();
  messageText.setText(mail.getText(),getCharSet());
  multipart.addBodyPart(messageText);
  for (int i = 0; i < attachment =" mail.getAttachments().get(i);" mimebodypart =" new" filedatasource =" new">= 0) {
  return StringUtil.asNotNullString(attachment).substring(StringUtil.asNotNullString(attachment).lastIndexOf("/")+1);
 }
 return StringUtil.asNotNullString(attachment);
}

/*GETTERS AND SETTERS*/
}

MailServiceImpl Class Content:

package com.repkin.mail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Service;

@Service("mailService")
@Scope("singleton")
public class MailServiceImpl implements MailService {
    private    JavaMailSenderImpl javaMailSenderImpl;
    private    MailPreparator mailPreparator;
 
    public void sendMail(Mail mail) {
        try {
            validateMail(mail);
            mailPreparator.setMail(mail);
            javaMailSenderImpl.setDefaultEncoding("UTF-8");
            javaMailSenderImpl.send(mailPreparator);
        } catch (Exception e) {
        }
    }

    public void validateMail(Mail mail){

    }

    @Autowired
    public void setJavaMailSenderImpl(JavaMailSenderImpl javaMailSenderImpl) {
        this.javaMailSenderImpl = javaMailSenderImpl;
    }

    @Autowired
    public void setMailPreparator(MailPreparator mailPreparator) {
        this.mailPreparator = mailPreparator;
    }
}

6 Temmuz 2014 Pazar

toptenfor.me

Geliştirmekte olduğum internet sitesi: www.toptenfor.me

15 Ocak 2014 Çarşamba

Tem Hospital'a bir daha gitmek niyetinde değilim...

Belki doğru yerlere ulaşır diyerek yolladığım mail aşağıda:

Genel yaşam anlaşmalı olduğu için ikinci defa sizin hastanenizi seçtim, birinci gelişimde memnun kaldığım için ikinci defa geldim bu sefer. Ama gördümki ssk dan en ufak farkınız yok.

Midemden rahatsızlandım, terlemeye başladım, iş yerinde duramadım, çıktım gittim hastaneye. Zaten bulantı bir taraftan, ayakta zor duruyorum. Derken girişte kaydım alındı çıktım doktorun yanına. Doktor güzelce yaptı muayenesini, şu şu tahlilleri yaptır gel dedi. Yine bildik bir şekilde özel sağlık sigortalı gelmiş, yaptıralım yaptırabildiğimiz kadar tahlil, alırız özel sağlıktan parasını mantığı. Derken indim 2 kat aşağı laboratuara, bekliyorumki tabelalarda adım yazacak. Zaten midem bulanıyor, dedim oturayım bekleyeyim adım yazar elbet. Baktım olan bir şey yok, elimdeki kağıtları laboratuar görevlisine gösterdim ne yapmam lazım acaba diye sordum.

Laboratuardaki hemşire ne diye bekliyorsunuz elinizde o kağıtlarla deyip kağıtları aldı elimden, sonra baktı kağıtlara dedi şeker tahlili istenmiş sen aç değilsin git bunu doktora doğrulattır gel, dedim bu halimle ben ne diye yukarıya çıkıp geleyim, telefonla arayıp sorabilirsiniz, yok çık sor gel dedi. Doktorun yanına değil bir kat yukarıdaki danışmaya çıktım, dedim hastaneniz batsın ben gidiyorum. Ne oldu felan derken aşağıdaki hemşirenin yapmadığını danışmadaki bayan yaparak doktoru aradı ve işin doğrusunu yani tok karına yapılan şeker tahlili istendiğini öğrendi. Dedi ben labarotuarı arayacam siz tekrar aşağıya ininiz. Benim midem bulandı gittim çıkarttım bu arada. İndim laboratuara, danışmadaki bayan daha aramamış yine aşağıdaki hemşire tersledi felan. Sonra telefon ile arayıp doktoru bu sefer kendisi işin doğrusunu öğrendi. Sonra aldılar kan örneği, dediler 4 saat sonra gel sonuçları alırsın. Bende o halimle çıktım geldim eve. Uyudum kalktım gittim tekrar hastaneye, sonuçları aldım doktorun yanına çıktım bana ilaçları yazdı, sonrasında döndüm eve. Sonuç, 47 tl ücret. Bu %20 si, yani ücretin tamamı 235 tl. Ne için, ihsal olmuşum, onu söyleyebilmek için. Tuvalete girince bunu bende söyleyebiliyorum, bunun için o rezilliği çekmeye hiç ihtiyacım yoktu. Gitsem çok daha kaliteli bir hastaneye vereceğim ücret max 100 tl olurdu, ki bu kadar olacağına inanmıyorum, ve adam gibi bir hizmet alırdım.

Vesselam, bir daha sizin hastanenize kesinlikle gelmem onu belirteyim.

Ramazan Pekin
Atos Origin Türkiye
Yazılım Mühendisi

CV

Example Usage of Common VFS

package com.repkin.ftp;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.vfs.CacheStrategy;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemOptions;
import org.apache.commons.vfs.Selectors;
import org.apache.commons.vfs.VFS;
import org.apache.commons.vfs.impl.DefaultFileSystemManager;
import org.apache.commons.vfs.provider.ftp.FtpFileSystemConfigBuilder;
import org.apache.commons.vfs.provider.sftp.SftpFileSystemConfigBuilder;

public class FtpManagerImpl {
 
  private   FileObject rootDirFileObject;
  private   FileObject currentDirFileObject;
  public static DefaultFileSystemManager fsManager = null;
 
  static {
     try {
        fsManager = (DefaultFileSystemManager) VFS.getManager();
        fsManager.setCacheStrategy(CacheStrategy.ON_RESOLVE);
     } catch (Exception e) {

     }
  }

  public FtpManagerImpl(String uriString) throws CommonFtpException {
     try {
        FileSystemOptions fileSystemOptions = new FileSystemOptions();
        if(uriString.startsWith("sftp")) {
           SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fileSystemOptions, "no");
           SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(fileSystemOptions, true);
           SftpFileSystemConfigBuilder.getInstance().setTimeout(fileSystemOptions, 180000);
        } else if(uriString.startsWith("ftp")) {
           FtpFileSystemConfigBuilder.getInstance().setPassiveMode(fileSystemOptions, true);
           FtpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(fileSystemOptions, true);
           FtpFileSystemConfigBuilder.getInstance().setDataTimeout(fileSystemOptions, 180000);
        }
        rootDirFileObject = fsManager.resolveFile(uriString, fileSystemOptions);
        if(rootDirFileObject == null || !rootDirFileObject.exists()){
           throw new CommonFtpException("ftp.connection.remote.path.does.not.exist");
        }
     }catch(Exception e){
        throw new CommonFtpException("ftp.connection.undefined.exception"+(e == null ? "" : " ," + e.getMessage()));
     }
  }

  public void closeConnection() throws CommonFtpException {
     if(fsManager != null) {
        try{
           fsManager.freeUnusedResources();
           fsManager.close();
        }catch(Exception e){
           throw new CommonFtpException("ftp.connection.can.not.be.closed",e);
        }
     }
     fsManager = null;
  }
 
  private void goStartDirectory() throws CommonFtpException {
     try {
        fsManager.resolveName(rootDirFileObject.getName(), "");
     } catch (Exception e) {
        throw new CommonFtpException("ftp.connection.cant.back.to.start.directory");
     }
  }
 
  public List listFilesInDirectory(String workingDirectory, String fileName, String prefix, Calendar startTime, Calendar endTime) throws CommonFtpException {
     List fileList = new ArrayList();
     if(currentDirFileObject == null) {
        currentDirFileObject = rootDirFileObject;
     }
     try {
        if(workingDirectory != null) {
           if(workingDirectory.startsWith("/")){
              goStartDirectory();
              workingDirectory = workingDirectory.substring(1);
           }
           if( (currentDirFileObject = fsManager.resolveFile(rootDirFileObject, workingDirectory)) == null || !currentDirFileObject.exists()) {
              throw new CommonFtpException("unable.chg.dir");
           }
        }
        FileObject[] ftpFileObjectArray = currentDirFileObject.findFiles(Selectors.SELECT_FILES);
        for(int i=0; i ftpRemoteFileList = listFilesInDirectory(spec.getRemoteDirectory(), spec.getRemoteFile(), null, null, null);
     if(ftpRemoteFileList == null || ftpRemoteFileList.size() == 0) {
        throw new CommonFtpException("specified.remote.file.not.found");
     }
     if(spec.getLocalFile() != null && ftpRemoteFileList.size() != 1) {
        throw new CommonFtpException("more.than.specified.remote.file");
     }
     try {
        for (FileObject remoteFileObject : ftpRemoteFileList) {
           String localFileName;
           if(StringUtil.isLengthful(spec.getLocalFile())) {
              localFileName = StringUtil.asNotNullString(spec.getLocalDirectory()) + StringUtil.asNotNullString(spec.getLocalFile());
           } else {
              localFileName = StringUtil.asNotNullString(spec.getLocalDirectory()) + StringUtil.asNotNullString(remoteFileObject.getName().getBaseName());
           }
           File localFile = new File(localFileName);
           if(localFile.exists()) {
              localFile.delete();
           }
           localFile.createNewFile();
           FileOutputStream fos = new FileOutputStream(localFile);
           BufferedInputStream bis = new BufferedInputStream(remoteFileObject.getContent().getInputStream());
           int content;
           while ((content = bis.read()) != -1) {
                 fos.write(content);
           }
           if(spec.isDeleteFromSource()) {
              remoteFileObject.delete();
           }
           fos.close();
           fos = null;
           bis.close();
           bis = null;
        }
     } catch (Exception e) {
        throw new CommonFtpException("exception.occured.on.retrieve.file",e);
     }
    
  }
 
  public void storeFile(FileTransferSpecification spec) throws CommonFtpException {
     if( spec == null ||  (spec.getLocalDirectory() == null && spec.getLocalFile() == null) ){
        throw new CommonFtpException("file.transfer.specification.not.specified");
     }
     ArrayList ftpSendFileList = new ArrayList();
     if(spec.getLocalDirectory() != null) {
        File[] localFileList = new File(spec.getLocalDirectory()).listFiles();
        if(localFileList != null && localFileList.length>0){
           for(int i=0; i ftpRemoteFileList =  listFilesInDirectory(spec.getRemoteDirectory(), spec.getRemoteFile(), null, null, null);
        for(int i=0; i=0){
              if(localFile.length() == ftpRemoteFileList.get(inServer).getContent().getSize()){
                 localFile = null;
                 continue;
              } else {
                 ftpRemoteFileList.get(inServer).delete();
              }
           }
           FileObject localFileObject = fsManager.resolveFile(localFile, "");
           FileObject remoteFileObject = fsManager.resolveFile(currentDirFileObject,remoteFileName);
           remoteFileObject.copyFrom(localFileObject, Selectors.SELECT_SELF);
        }
        ftpRemoteFileList = null;
     }catch(Exception e){
        e.printStackTrace();
        throw new CommonFtpException("exception.occured.on.file.transfer");
     }finally{
       
     }
  }
 
  public void removeRemoteFile(FileTransferSpecification spec) throws CommonFtpException {
     if( spec == null ||  (spec.getRemoteDirectory() == null && spec.getRemoteFile() == null) ){
        throw new CommonFtpException("file.transfer.specification.not.specified");
     }
     try{
        List ftpRemoteFileList =  listFilesInDirectory(spec.getRemoteDirectory(), spec.getRemoteFile(), null, null, null);
        for (FileObject fileObject : ftpRemoteFileList) {
           if(!fileObject.delete()) {
              throw new CommonFtpException("exception.file.can.not.be.deleted");
           }
          
        }
     }catch(Exception e){
        throw new CommonFtpException("exception.occured.on.file.delete");
     }
  }
    
  public static void main(String[] args) {
     try {
//       ftp://[ username [: password ]@] hostname [: port ][ absolute-path ]
        String userName = "ftp_test_user";
        String pass = "password";
        String serverIP = "127.0.0.1";
        String serverPath = "ftp_test"; //Relative to user root directory
        StringBuffer uri = new StringBuffer();
        //uri.append("sftp://" + userName + ":" + pass + "@" + serverIP + "/" + serverPath);
        uri.append("ftp://" + userName + ":" + pass + "@" + serverIP +":21"+ "/" + serverPath);
        FtpManagerImpl ftpManager = new FtpManagerImpl(uri.toString());
//       ftpManager.retrieveFile(new FileTransferSpecification("/", "Trigonometric_functions.xls", "/home/repkin/ftp_download/", "retrived_file.test", false));
//       ftpManager.retrieveFile(new FileTransferSpecification("/", null, "/home/repkin/ftp_download/", null, false));
//       ftpManager.storeFile(new FileTransferSpecification(null, "ftp_test_4/letter_3_test", null, "/home/repkin/ftp_downloaspec)d/letter_2_test", false));
        ftpManager.removeRemoteFile(new FileTransferSpecification("ftp_test_4", "letter_3_test", null, null, false));
        ftpManager.closeConnection();
     } catch (CommonFtpException e) {
        e.getMessage();
        e.printStackTrace();
     } catch (Exception e) {
        e.getMessage();
        e.printStackTrace();
     }
  }
}