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();
     }
  }
}

14 Ocak 2014 Salı

Bitcoin Nasıl Çalışır

Criptografi üzerine kurulmuş bir yapı aslında. Verinin gizliliğini sağlamak için kullanılan criptografi üzerine geliştirilmiş bir yazılım da diyebiliriz.

Bize sağladığı avantajlar;
- Arada bir banka vs. ye ihtiyaç duymaması.
- Yapılan işlemin kimin tarafından yapıldığı takip edilemez durumda.

Nasıl çalışır;
- P2P mantığı ile çalışmakta diyebiliriz, torrent mantığına benziyor diyebilirz.
- Açıklarını kapatmak için "Block" denilen "Coin" üzerinde çeşitli alanlar taşımakta.
- Özellikle block header üzerinde taşıdığı alanlar ile sistemin güvenilirliği sağlanmakta.
- Tekrar harcanmasını önlemek açısından block header içerisinde timestamp - zaman damgası değeri taşıyor.
- Zaman damgası değeri (Şimdiki An, Şimdiki Zaman - 00:00:00 01.01.1970) formülü ile hesap ediliyor.
- Temel encryption algoritmaları ECDSA(Elliptic Curve Digital Signature Algorithm) bulunmakta. (http://en.wikipedia.org/wiki/Elliptic_Curve_DSA)
- Bu algoritmanın temeli matematiksel hesaplamalar esasında.
- Senin bir private key yani sadece senin bildiğin bir özel anahtarın vardır. Sen bu private key ile veriyi hash lersin, hashing ne demektir detaylarına buradan ulaşılabilir (http://en.wikipedia.org/wiki/Cryptographic_hash_function)
- Hash function olarak SHA256 kullanılmakta.
- Hashlenmiş veri gönderdiğin alıcı tarafından senin public key yani herkes tarafından bilinen anahtarın tarafından çözülebilmekte.
- Adına transaction diyelim mesajın, transaction bilgisi senin private key in ile hashlenir (ECDSA kullanılarak), ortada artık signature denilen yani imza denilen senin tarafından encrypt edilmiş veri oluşur. Sonrasında bu veriyi istediğin yere gittiğinde public key in ile açılabilmekte.
- Senin hesabında ne kadar paran (burada para denilen şey artık devlet para birimleri değil sanal para birimleridir) olduğu bilgisi sisteme dahil olmuş miner(madenci) lar tarafında tutulmakta. Ledger denilen bu dosya bütün miner larda yer almakta. Ancak bu bu bilgiler herkese ulaşamayabilir. Broadcasting mantığı ile bilgi ulaşabilen herkese iletilmekte.
- Bir miktar parayı gönderdiğinde miner lar tarafından bu gönderdiğin bilgiler doğrulanmakta, böylece sistemin güvenliği miner denilen yapılar tarafından sağlanmış oluyor. Eğer sistemi "hacklemek" istiyorsan dünyadaki miner ların %50 sinden fazlasını hacklemen gerekiyor. Ki şu an dünyadaki bu ağa katılmış bilgisayar sayısı herhalde insanlık tarihinin gördüğü en güçlü hesaplama gücüne sahiptir, her 3 haftada bir sisteme katılan işlemci sayısının 2 katına çıktığı kabul edilmekte.
- Vesselam, sistemdeki imzalar bitcoin cinsinden paranın güvenliğini sağlar, transaction zinciri bitcoin cinsinden paranın sahipliğinin tarihçesinin güvenliğini sağlar, block zinciri transaciton sırasının bilgisini tutar diyebiliriz.
- Bitcoin blockları "Block hashing algorithm" ile çalışmakta.

Block Başlığı (Block Header);
AlanAmacıNe zaman değişirBüyüklük (Bytes)
versionBlock versiyon numarasıUygulama versiyonu değiştirildiğinde4
hashPrevBlockBir evvelki block u işaret eder, bir evvelki block un 256-bit hash li halidir.Yeni block geldiğinde32
hashMerkleRootBlock içindeki bütün transaction kayıtlarının 256-bit hash lenmiş haliİşlem kabul gördüğünde (havuz sunucu tarafından)32
TimeZaman Damgası, 1970 tarihinden beri saniye şeklindeBir kaç saniyede bir4
Bitsalgoritmanın kabul edilebilir değer sınırıZorluk derecesi değiştirildiğinde4
Noncesıra numarası 32-bit numara (0 dan başlar)sonrakinde4

Block Gövdesi (Body):

İçeriğinde transaction(hareket) bilgilerini içerir. Tabi bunlar da hashlenmiş durumdadır.

Örnek Block;

Block 125552?

Transactions

Transaction?Fee?Size (kB)?From (amount)?To (amount)?
51d37bdd87...00.135
  • Generation: 50 + 0.01 total fees
60c25dda8d...00.259
01f314cdd8...0.010.617
b519286a10...00.404

İleride ne olur;
- Öncelikle devlet para birimi cinsinden düşünülmesinin bırakılması gerekmekte. Yani bir bitcoin kaç dolar kaç tl eder gibi soruların anlamsız olması gerekmekte. Yani satılan alınan her şeyin bitcoin gibi bir sanal para cinsine dönmesi gerekmekte. Hatta bizim aldığımız maaşların bile bitcoin olduğunu düşünün.
- Şu an için sistem kara para aklayıcıları ve yaptığı alışverişte kimliğinin ortaya çıkmasının istenmediği yerlerde kullanılmakta, özellikle pornografik içeriklerde.
- Kötü amaçlı kullanımlardan dolayı şu an için "saygınlığı" konusunda soru işaretleri oluşmakta, o sebepten legal sistemler bu ortama entegre olmak konusunda çekinceler yaşamakta.
- Devletler para basma vs. gibi oyuncaklarının ellerinden alınabilecek olmasından dolayı bu tarz bir yapıyı kolay kolay kabul etmezler, ancak kullanıcı sayısının arttığı bir sistem ne kadar göz ardı edilebilecek göreceğiz.
- Şu an için bitcoin i devlet para birimlerine dönüştüren internet siteleri ve bazı ülkelerde bankamatikler yer almakta. Bir tanesi de Türkiye de Atatürk Havalimanında.
- Şu anki öncelikli amacı parayı transfer etme aracı olarak gözüküyor ancak bu amaç zaman içinde asıl para birimi olma şeklinde ilerleyebilir. Düşünsenize maaşınızın bitcoin olarak yattığını...