31 Ağustos 2015 Pazartesi

TCP istemci Soketi

C
socket ,connect, recv ve send metodları çağrılır.

struct sockaddr_in remote_addr;
char buf[BUFSIZ];
memset(&remote_addr, 0, sizeof(remote_addr));

remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr("192.168.103.128");
remote_addr.sin_port = htons(8000);

int s = socket(AF_INET, SOCK_STREAM, 0);


connect(s, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));

int len = recv(s, buf, BUFSIZ, 0);
send(s,buf,SIZE,0);
close(s);
connect
Bu metod sadece Linux'ta eğer dinleyen socket kuyruğu (backlog) doluysa EAGAIN döner. Diğer işletim sistemleri ECONNREFUSED dönerler.

send
Metodun imzası şöyle
int send(int sockfd, const void *msg, int len, int flags); 

QT
QTcpSocket ve connectToHost metodları kullanılabilir. Örnek:
QTcpSocket socket;
socket.connectToHost(QHostAddress("172.0.0.1", 8080);
if (!socket.waitForConnected(5000)) {
    emit connectionFailed();
}

Java

İstemci socket açmak için :

C#
İstemci socket için TcpClient veya direkt Socket sınıfı kullanılabilir. 
Socket sınıfı
Asenkron bağlanma örneği
// Create a TCP/IP socket.
Socket client = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

// Connect to the remote endpoint.
client.BeginConnect(remoteEP,
                new AsyncCallback(ConnectCallback), client);
Bağlanınca şu metod çağrılır
void ConnectCallback(IAsyncResult ar)
{
  // Retrieve the socket from the state object.
  Socket client = (Socket)ar.AsyncState;

  // Complete the connection.
  client.EndConnect(ar);
  
}

TcpClient sınıfı
TcpClient genelde GetStream()'in döndürdüğü akım ile kullanılıyor.

Connect Metodu
Bu metod IP adresi olarak bir string ve port numarası alır.
TcpClient c = new TcpClient();
c.Connect("10.0.0.4", 10);
GetStream metodu

C# ile Socket arayüzünü Stream olarak kullanabilmek te mümkün. Bu iş için NetworkStream sınıfı kullanılıyor. Bu sınıf Socket sınıfını stream'e çeviren bir adaptör.

Bağlandıktan sonra NetworkStream şöyle kullanılır.
NetworkStream ns = c.GetStream();
Stream üzerinden string göndermek için bir encoder aracılığıyla string byte[] haline çevrilir.
Stream ns = c.GetStream();

ASCIIEncoding transEncoded = new ASCIIEncoding();
byte[] bytes = transEncoded.GetBytes("Are You Kazaa?");
ns.Write(bytes, 0, bytes.Length);

byte[] byte2 = new byte[100];
int k = ns.Read(byte2, 0, 100);

c.Close();
Bu örnekte ASCII yerine UTF-8 kullanılıyor.
NetworkStream ns = c.GetStream();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("first");
ns.Write(buffer, 0, buffer.Length);


30 Ağustos 2015 Pazar

Özel Dizin İşlemleri

Özel Dizinler
Özel dizinler özellikle Windows'ta çok fazla. Myxxx (örneğin MyDocuments) şeklinde başlayana kullanıcıya ait bir çok dizin var.

MyDocuments
C#
Kullanıcıya ait ortam değişkenini kullanarak dizin alınır.
Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments)

Kullanıcının Dizinini Alma - Home Directory
C
Linux'ta şöyle yapıyoruz. Örnek:
static std::string getHomeDir()
{
    struct passwd *pw = getpwuid(getuid());
    std::string res( pw->pw_dir);
    endpwent();
    return res;
}
QT
QDir::homePath() ile yapılıyor

25 Ağustos 2015 Salı

STL Stream Iteratorleri

Giriş
Iteratorler veriyapıları üzerinde yürümek için kullanılırlar. Ancak STL stream (akım) ile iteratorleri birleştirmemizi sağlayan adaptor şeklinde iteratorler de sağlıyor.

Genellikle std::copy veya std::transform algoritmaları ile kullanılırlar

istream_iterator sınıfı
istream_iterator yazısına taşıdım.

ostream_iterator
Akıma yazma yapmayı sağlar.

C array'ini yazma örneği
std::copy(std::begin(a), std::end(a),
    std::ostream_iterator<int>(std::cout, " "));
STL Veriyapısına yazma örneği
std::copy(a.begin(), a.end(),
    std::ostream_iterator<int>(std::cout, " "));
Cout'a yazmak örneği
std::ostream_iterator<int, char> out_iter2(std::cout, " " );
std::transform(osd.begin(), 
               osd.end(), 
               out_iter2, 
               [] (int* x) { return *x; }
              );




24 Ağustos 2015 Pazartesi

Software Configuration Management Süreci

Software Configuration Management (SCM) CMMI, MILSTD 498 gibi yazılım süreçlerinde bulunan bir süreç. SCM genellikle şu alt süreçlerden oluşur

Initialization
Projenin başlangıcında SCM altyapısının planlanması ve kurulması. Örneğin SVN ağacının aşağıdaki gibi standart yapılması
project
 - trunk
 - branches
 - tags
Dokümanların nereye konulacağı her zaman sorun olur. Bazı projelerde trunk altına konulur.
trunk > Development > code
                                                > Lib1
                                                > Lib2
                                                > App1
                                                > App2

                                   > contint
                                                > Jenkins
                                                > scripts
                                    > Documents (Tüm süreç dokümanları)
                                    > Models
                                    > Test
                                    > Tools
Branch'e Ne Zaman Çıkılır
Bu konuda yazılı bir politika görmedim. Ama bence yazılı olması lazım. Genelde müşteriye verilen sürüm için bir branch açılıyor.

Release Management and Delivery

Configuration Index (CI) listesine dahil edilecek yazılım parçalarının ve üretilen belgelerin tanımlanması, baseline alınıp yayınlanması (release)

Üretilen belgelere hangi revizyonda olduklarını ve değişiklik tarihçesini gösteren kapak sayfası eklenir.

Yazılım İçin Versiyon Numarası
Kod için hangi versiyonlama sisteminin kullanıldığının tanımlı olması gerekir. Bu sistem için evrensel kabul gören bir şey yok. Herkes kendine göre bir sistem uydurmuş.

Ben semantic versioning sistemini seviyorum. Bu sistem 3 haneden oluşuyor.

Semantic Versioning
Semantic Versioning yazısına taşıdım

Microsoft Versioning
.Net versiyonlama sistemi ise 4 haneden oluşuyor.
Major.Minor.Revision. Build

Change Management
SCM ile takip edilen veriye gelen değişiklik isteği ve değişikliklerin kontrollü olması gerekir. Gelen istekler bir Değişikli Takip Aracı (Change Tracking Tool) ile kayıt altına alınır. İstekler çözülür, doğrulanır  ve onaylanır. Tüm bu faaliyetler SCM planında tarif edilir.

Backup and Recovery
Yedeklenecek verilerin tanımlanması ve listening IT'ye iletilmesi. Yedekten geri dönüşün mümkün olduğunun doğrulanması.

Reports and Reviews
İstek veya süreçte tanımlı peryodlarda rapor ve sunumların hazırlanması.

CM istenildiği zaman aşağıdakine benzer bir Konfigürasyon Durum Listesi verebilmeli.

No                              SVIL No   Revizyon  Son Yayın Tarihi   Son Durum
XX-XXX-X-S            9                 -(P2)       19.04.2011          20.04.2011 tarihinde onaylandı

Configuration Audits
Konfigürasyon kayıtlarının, doğru veriyi tuttuğunun kontrol edilmesi. Configuration Management System'ın (örneğin SVN) yapısal bütünlüğünün doğrulanması. CMS'teki verinin tam ve doğru olduğunun kontrolü.

Interface Control
Altyükleniciler ile arayüzü için gerekli faaliyetler

Archiving
Proje bitiminde CI listesindeki verinin arşivlenmesi.

Bir Developer İle Configuration Manager Hangi Ortak Araçları Kullanır?
Developer'lar genellikle Configuration Manager'ın ne yaptığını anlamazlar. Kullandıkları araçlar da ortak olmadıkları için CM'in yaptıkları başka bir dünyadadır. Developer ile CM en fazla Issue Tracker (örneğin Jira) ve Revision Control (örneğin SVN) araçlarını ortak kullanırlar.



22 Ağustos 2015 Cumartesi

E-Posta Gönderme

RFC 822 Nedir?
Bu ilk e-posta standardında, bir mesaj header ve body olarak ikiye ayrılmıştır. Header'ın şekli belirlenmiş ancak Body'nin şekli belirsiz bırakılmış. Sadece 7 bit ASCII olmasına karar verilmiş.




Ancak daha sonra RFC822'ye eklentiler yapılmış ve MIME ile body kısmının şekli belirlenmiş.
Yani MIME içeriğin şeklini tanımlar.

multipart/mixed nedir
Farklı tiplerde nesnelerin - mesela text + eklenti - gönderildiği anlamına gelir.

multipart/alternative nedir
Aynı bilginin farklı gösterim şeklidir. Örneğin text olarak gönderilen metnin alternatifi html de olabilir. Bu durumda şöyle bir blok içinde göndeririz.
  • mixed
    • alternative
      • text
      • related
        • html
        • inline image
        • inline image
    • attachment
    • attachment
Java Mail Alma
Session
Örnek:
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect("smtp.gmail.com", "myuser", "mypassword");
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
int messageCount = inbox.getMessageCount();
List<Message> messages = getMessages(inbox, messageCount);
inbox.close(true);
Java Mail Gönderme
Session
Message veya ondan türeyen MimeMessage sınıfı constructor metodu içine Session nesnesi alırlar. Bu nesne bağlantı bilgilerini içerir. 
getDefaultInstance

Default doldurulmuş bir session nesnesi döner. Örnek:
import java.util.Properties;
import javax.mail.Session;

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);


getInstance
Session açma örneği:
Properties props = new Properties();
props.put("mail.smtp.auth", true);
props.put("mail.smtp.starttls.enable", true);
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
Message message = new MimeMessage(session); 

InternetAddress
Bu sınıf alıcının adresi temsil ediliyor.
validate
Verilen adresin doğru olup olmadığı kontrol edilir. Örnek:
 
javax.mail.internet.MimeMessage
Bu sınıf bir e-mail'in kimden geldiği, kime gittiği gibi bilgileri içerir. Content olarak sadece metin içerebilir. Bu durumda RFC822'nin ilk halini gerçekleştirimiş olur. Veya content olarak MimeMultipart sınıfını da kullanabilir. MimeMultipart sınıfı ise MimeBodyPart sınıflarını içeren bir yapı.
 
Aşağıda html e-posta gönderme örneği var. Örneği buradan aldım.

MimeMessage msg = new MimeMessage(session);

//Set from
InternetAddress addressFrom = new InternetAddress("myuser@gmail.com");
msg.setFrom(addressFrom);

//Set to
InternetAddress[] addressTo = new InternetAddress[sendTo.length];
for (int i = 0; i < sendTo.length; i++) {
    addressTo[i] = new InternetAddress(sendTo[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);

//Set subject
msg.setSubject(emailSubjectTxt);
MimeMultipart multipart = new MimeMultipart("related");

//first part  (the html) 
BodyPart messageBodyPart = new MimeBodyPart(); 
String htmlText = "<H1>Hello</H1><img src=\"cid:image\">"
messageBodyPart.setContent(htmlText, "text/html"); 

// add it 
multipart.addBodyPart(messageBodyPart);

// put everything together 
msg.setContent(multipart); 
Transport.send(msg);
javax.mail.Multipart
Eklenti parçalarını içeren kısım. Aşağıdaki şekilde görülebilir.
getCount ve getBodyPart
Bu metodlar ile parçalar alınabilir. Her parçanın BodyPart sınıfından türemek zorundadır.

javax.mail.internet.MimeMultiPart
Bu sınıf MIME eklentilerini içerir. Şekilden daha güzel anlaşılıyor.

javax.mail.internet.MimeBodyPart
Bu sınıf gönderilecek MIM eklentisi bilgisini içerir. Gömülü resim göndermek için örnek:
InternetHeaders headers = new InternetHeaders();
headers.addHeader("Content-Type", "image/jpeg");
headers.addHeader("Content-Transfer-Encoding", "base64");

MimeBodyPart messageBodyPart = new MimeBodyPart(headers, base64EncodedImageContentByteArray);
messageBodyPart.setDisposition(Part.INLINE);
messageBodyPart.setContentID("&lt;image&gt;");
messageBodyPart.setFileName("image.jpg"); 
Bir başka örnek:
messageBodyPart.setContent(content, "text/html");
messageBodyPart.setDisposition(Part.INLINE);

veya

messageBodyPart.setContent(content, "text/plain");
messageBodyPart.setDisposition(Part.INLINE);

javax.mail.Store
Bu sınıf ile bağlantı açılır.
connect
Örnek:
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "mail", "pass");
javax.mail.Folder
search
Belli bir tercihe göre arama yapabilmeyi sağlar.

javax.mail.search.ReceivedDateTerm
Örnek:

Apache Commons
IMAPClient
IMAP ile SMTP arasındaki farkı bilmiyorum. Ancak Apache Commons ile bir IMAP sınıfı geilyor. Örnek:

SimpleEmail
addTo
E-postanın kime gideceğini belirtir. Örnek:
 
send
Basit bir e-posta göndermek için SimpleEmail sınıfı kullanılıyor. Örnek:
SimpleEmail mail = new SimpleEmail();
//Sınıfı doldur
//..


//Gönder

email.send();
setAuthenticator
Sunucunun sorduğu şifreyi göndermek için kullanılır. Örnekte şifre ssl ile gönderiliyor.

setBounceAddress
Çok emin olmamakla beraber gönderilemeyen yani geri dönen e-postaların burada belirtilen adrese iletildiklerini düşünüyorum.Konuyla ilgili bir link burada.
 
setMsg
Gönderilecek e-postanın içinin belirtir. Örnek:
 
setSSLOnConnect
Bu metod ile TLS'in farkını bilmiyorum.
setTLS
Bu metod ile SSL'in farkını bilmiyorum.

MultiPartEmail sınıfı
Eklenti içeren e-postalar gönderbilmeyi sağlar. Apache sayfasında güzel bir örnek var.

HtmlEMail sınıfı
embed
Bu metod ile verilen html mesajının içine bir resim konulabiliyor. Örnek:

Daha sonra gömülen nesneye ait id html içinde "cid" olarak kullanılıyor. 

send
Html e-posta göndermek için HtmlEmail sınıfı kullanılıyor. Örneği buradan aldım.
MultiPartEmail email = new HtmlEmail();
//Sınıfı doldur
//..

//Gönder

email.send();
ImageHtmlEmail sınıfı
Bu sınıf ile resimlere url atamak mümkün. E-posta açılırken html içindeki image'lar url'den indiriliyor.
embed
Örnek:


EmailAttachment sınıfı
HtmlEmail sınıfına eklenti eklemek için EmailAttachment sınıfı kullanılıyor.Eklenetiler ATTACHMENT veya INLINE olarak gönderilebiliyor.

// eklenti ekle
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("path/my.pdf");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
email.attach(attachment);

C#
Konuyu E-Posta Gönderme - C# başlıklı yazıya taşıdım.

SMTP Protokolü 
SMTP Protokolü yazısına taşıdım.

E-Posta Adresinin Doğruluğunu Kontrol Etme
Java
En kolay yöntem InternetAddress sınıfını kullanmak. Örnek:

Relay nedir ?
Relay e-posta sunucusunun sadece tanıdığı (authenticate) kişilere ait e-postaları göndermesidir. Şekli buradan aldım.