13 Ekim 2017 Cuma

select örnekleri

Giriş
Açıklaması şöyle
select and poll does a linear search across the sockets, which does not scale very well.
select () ile kullanılan socketler non-blocking olmak zorunda değil. Ancak ben non-blocking olmasını tercih ediyorum. Eğer socket okumak üzere hazır olarak görünse bile, hata olursa sadece EWOULDBLOCK koduna bakarak problemsiz çalışabiliriz. Java'da ise socketin non-blocking olması gerekir.
Seri iletişim için şöyle yaparız.
open  (...,O_RDRW |O_NDELAY |O_NONBLOCK);

fd_set
Önce bir set tanımlanır.
fd_set sockSet;
Aynı zamanda FD_SET olarak ta tanımlanabilir.
FD_SET sockSet;
Bu set sıfırlanır.
FD_ZERO(&sockSet);
Daha sonra set'e izlemek istediğimiz fd'leri atarız. Bu çağrı her bir socket için tekrarlanır
FD_SET(fd1, &sockSet);
select çağrısı sonucunda fd_set değişir. Bu yüzden çağrıdan önce fd_set izlenmek istenen fd'ler için tekrar doldurulur. (rearm) Şöyle yaparız.
int maxfd = server_sock2 + 1;
FD_SET sockSet;
int ret;
while(1) {
  // Setup SD_SET each time calling select
  FD_ZERO(&read_fs);
  FD_SET(server_sock1, &read_fs);
  FD_SET(server_sock2, &read_fs);
  if ((ret = select(maxfd+1,&readfds,NULL,NULL,NULL)) == -1) {
    error("Err in select");
  }
  for(i = 0; i < maxfd && ret; i++, ret--) {
    if(FD_ISSET(i, &readfds) {...}
  }
}
Writable socket
Bir socketin yazılabilir olması sanırım sadece TCP soketi için geçerli. UDP connectionless olduğu için socket her zaman yazılabilir durumda.

FD_ISSET macrosu
Eğer belli bir socketi kontrol etmek istersek şöyle yaparız.
if(FD_ISSET(f1, &sockSet)) {
  recv(f1, ..., ...);
}
FD_SET macrosu
İzlemek istediğimiz fd'yi fd_set yapısına ekler. Şöyle yaparız.
int server_sock = ...;
FD_SET sockSet;
FD_ZERO(&rsockSet);
FD_SET(server_sock, &sockSet);
FD_ZERO macrosu
fd_set yapısını sıfırlar. Şöyle yaparız.
FD_SET sockSet;
FD_ZERO(&sockSet);
select çağrı parametreleri
İlk parametre fd_set'e girilmiş en büyük socket değerinin bir fazlasıdır. İkinci parametre okunacak fd_set'i. Üçüncü parametre yazılacak fd_set'i, Dördüncü parametre exception fd_set'i, altıncı parametre is timeout değeridir.

select - timeout olmadan okuma
Timeout kullanmadan şöyle yaparız.
if(select(maxfd+1, &read_fs, NULL, NULL, NULL))
{...}
select - timeout ile okuma
select çağrısı Linux'ta timeout değerini değiştirir. Bu yüzden her çağrıdan önce timeout değişkenini tekrar doldurmak gerekir. Açıklaması şöyle.
On Linux, select() modifies timeout to reflect the amount of time not slept; most other implementations do not do this. (POSIX.1-2001 permits either behavior.) This causes problems both when Linux code which reads timeout is ported to other operating systems, and when code is ported to Linux that reuses a struct timeval for multiple select()s in a loop without reinitializing it. Consider timeout to be undefined after select() returns.
Yani şöyle yaparız.
while (1)
{
  struct timeval tv = {1, 0};

  int retval=select(maxfd+1,read_fs, NULL, NULL,&tv);
  ...
}
select çağrı sonucu
Çağrı sonucu -1 ise hata olmuştur.
Çağrı sonucu > 0 ise okunacak bir şey vardır.
Çağrı sonucu  0 ise timeout olmuştur.

Örnek
Şöyle yaparız.
if (select(max_fd+1, &socketSet, NULL, NULL, &tv) > 0) {...}
Örnek
Şöyle yaparız.
int result = select(max_fd + 1, &socketSet, NULL, NULL, &tv);

switch (select_result) {
  case -1: //Error
    ...
  case 0: //Timeout
    ...
  default:
    //DATA AVAILABLE
    break;
}

Local Certificate Authority

Giriş
Self signed bir sertifika yaratmak için ilk önce bir Certificate Authority (CA) yaratmak lazım. Certificate Authority sertifika yaratabilen otoriteyi temsil eder.

Normalde CA'lar arasında bir hiyerarşi vardır. Ancak biz bu hiyerarşiyi takip etmeyip kendi CA'mızı yaratıyoruz.

Certificate Authority Ne Yapar
Normal Certificate Authority (CA) public domain için sertifika üretir. Ancak biz intranette https kullanmak istiyorsak örneğin "intranet.local" adresi için sertifika alamayız. Bu durumda kendi Local CA'mızı (Root CA) oluşturmamız gerekir.
Kurulum
Root CA'yı bilgisayarlara kurmak gerekir. Bu sertifikayı mmc programını kullanarak "Trusted Root Certification Authorities" isimli dizinde görebilmek mümkün.

Wildcard Cerificate
Local CA ile yapılacak en tehlikeli şeylerden birisi
*.xyz.abc.com
şeklinde bir sertifika üretmek. Örneğin elimizde intranette çalışan şu uygulamalar olsun
intranet.xyz.abc.com
documents.xyz.abc.com
applications.xyz.abc.com
...
ve hepsine bu wildcard sertifikayı kuralım. Eğer sertifika içeriden birisinin eline geçerse bu kişi kendi uygulamasını kurabilir insanları kendi uygulamasına yönelterek bilgi çalabilir.




12 Ekim 2017 Perşembe

6LowPAN

Giriş
Özellikleri şöyle
6LowPAN Standard: RFC6282 Frequency: (adapted and used over a variety of other networking media including Bluetooth Smart (2.4GHz) or ZigBee or low-power RF (sub-1GHz) Range: N/A Data Rates: N/A
PAN
Kelimenin sonundaki PAN Personal Area Network anlamına gelir ve aslında "kişisel ağ" olarak değil de kişilerin yakınındaki ağ olarak anlaşılırsa bence daha uygun olur.

Gateway
6LowPAN ağındaki cihazların dış dünya ile haberleşebilmesi için bir gateway gerekir. Açıklaması şöyle
In any case, a 6LoWPAN enabled Sensor Network needs a Gateway to interact with an end user who might be using a standard 802.11 WLAN or a 802.3 Ethernet based network.

The Gateway needs to translate the 6LoWPAN enabled IPv6 addresses into addresses that standard networks can understand and communicate. For instance, if a node with 6LoWPAN enabled on it with Header Compression has Address ::1 there needs to be some defined way to know how to access this sensor node over a connected network. For that you need a gateway which does translation for you.



10 Ekim 2017 Salı

İngilizce Yazışma ve Konuşma

Memo
Şöyle yaparız.
Effective from October 01 2016;
X has been assigned to Y project as Software Engineer.

Please be informed and proceed accordingly.
Bilgilendirme için E-Posta
Şöyle yaparız.
Good Afternoon Alice, Bob,
I hope you're both well.
It's come to my attention that there are some further technical documents you need for the current project, which you'll find attached.
If you have any questions please let me know,
Thanks,
Puffafish
Bazen bilgilendirme aslında resmi olarak onay istemek amaçlıdır. Şöyle yaparız.
Dear x,
As per our discussion this morning, I understand that you would like me to do X. Here is how I plan to work on it: Step A, Step B, Step C.

Please confirm if my understanding is correct and if it is okay to proceed in this manner.
Bazen bilgilendirme bekletme amaçlıdır. Şöyle yaparız.
Thanks for the invitation, the workshop sounds excellent. The decision about who to send is up to [manager name], who is away until [date.] What is the deadline for registering?
Bilgilendirmenin sonuna iletişim bilgisi için şöyle yazılabilir.
For any questions, please reply to this email.
Hatırlatma için E-Posta
Şöyle yaparız.
Hi XYZ,
I was wondering if you have had a chance to take a look at the email I sent on Friday. I'm sorry to push, I just need to have confirmation so that I can work with my current manager as soon as possible.
Regards. RodrikTheReader
Sonuç İstemek İçin E-Posta
Şöyle yaparız.
Let me know how that goes.
Kısaltmalar
Mümkünse kaçınmak lazım. Eğer kullanmak gerekiyorsa ilk kullanımda önce açık halini yazmakta fayda var. Şöyle yaparız.
You've encountered a blue screen of death (BSOD) ...
İlerlen bölümlerde kısaltma kullanılabilir. Şöyle yaparız.
To solve your problem with the BSOD ..
Telefon
Karşıdakinin kim olduğun sormak için şöyle deriz.
Who's speaking, please?
Netleştirmek İçin E-Posta
Şöyle yaparız.
Hi Mary,

I was just reading the handbook and I wanted to clarify the lunchtime policy--in order to get in my minimum eight hours, I would need to stay until 6, correct?
Çalışma Saatlerini Sormak
Şöyle deriz
What time do you close today?
Şaşkınlık İçin E-Posta
Şöyle yaparız.
I am very surprised to see that you are casually asking about this again after we discussed this topic in detail during your 90 day review. ...


6 Ekim 2017 Cuma

Hibernate @Formula Anostasyonu

Örnek
Elimizde iki tablo olsun
person:
- person_id
- name

meeting:
- meeting_id
- person_id
- date
Person sınıf şöyle olsın
@Entity
@Table(name = "person")
@Getter
public class Person {

  @Id
  private Integer personId;

  private String name;

  @Formula("SELECT max(m.date) FROM meeting m WHERE m.person_id = person_id")
  private Date lastMeetingDate;alo
  ...
}

Renk Algoritmaları

Giriş
Renk algoritmaları genellikle elimizde bulunan iki renk ile ilgili bir işlemdir
İki Rengin Ortalamasını Bulmak
Ortalamayı bulan bir metod yazalım
byte Average(byte a, byte b)
{
  return (byte)((a + b) / 2);
}
Daha sonra her iki rengin de R,G,B değerlerinin ortalamasını alalım. Şöyle yaparız.
Color myColorMiddle = Color.FromRgb(Average(Color1.R, Color2.R),
 Average(Color1.G, Color2.G),
 Average(Color1.B, Color2.B));

Tablodaki Renge En Yakın Olan Rengi Bulmak
Elimizde sabit bir renk olsun. Mesela bir HTML rengi. Bu girdiye en yakın rengi bulmak için bildiğimi mesafe formülü uygulanabilir. Color Distance formülleri arasında en kolay olanı CIE76

RGB'den Monochrome Renge Çevirmek
Farklı algoritmalar ve sabitler kullanılıyor. Temel olarak sabitler değişebilse de formül şuna benziyor. Aşağıdaki formül CCIR601. Başka formüller de var. Farklarını bilmiyorum.
Y = 0.299 R + 0.587 G + 0.114 B
RGB'den Greyscale Renge Çevirmek
Şu yöntem 3 rengin ortalamasını alıyor ve basit ancak çok iyi değil.
int oldrgb = img.getRGB(x,y);
Color color = new Color(oldrgb);
int gray = (color.getRed() + color.getGreen() + color.getBlue()) / 3;