30 Mart 2020 Pazartesi

Kriptografide Salt Nedir

Salt Rainbow Table Saldırılarına Karşı Kullanılır
Açıklaması şöyle.
A rainbow table attack uses a list of possible passwords hashed with the same algorithm to compare. So you could theoretically compose a list of common passwords, hash them with an algorithm like BCrypt, and compare those hashes to the actual list of password hashes. The solution to this - salts!
Örnek
Elimizde bir şifre ve cryptographic hash'i olsun
şifre : 123 hash : GBIQ
Eğer bu şekilde saklarsak sık kullanılan şifreleri önceden hash'leyen bir saldırgan şifreyi bulabilir. Açıklaması şöyle.
Someone who hasn't stolen your password database can work out ahead-of-time that GBIQ is the hash of password 123, so they can just make a big database with millions of common passwords with their hashes and compare that to any password database they steal. 
Ama hash metoduna salt'u da girdi olarak verirsek bu saldırıyı yapamaz. Şöyle yaparız
Hash (salt + password)
Açıklaması şöyle. Bu durumda hash şöyle saklanır.
Salt : 111| Hash : P2C/
Açıklaması şöyle.
During the brute force attack, words from the dictionary are hashed with the correct hash algorithm and salt, and then compared to the hash in the database dump. So the attacker needs to know not only the hash value itself, but the algorithm and the salt.
Salt Nedir?

Açıklaması şöyle. Yani rastgele üretilen bir veridir.
salt is simply "random data that is used as an additional input to a one-way hash function." Salts add yet another layer of randomness to our already pretty random crypt.
Pepper Nedir?
Salt dışında bir de pepper kavramı var. Açıklaması şöyle.
In cryptography, a pepper is a secret added to an input such as a password prior to being hashed with a cryptographic hash function. 

A pepper performs a comparable role to a salt, but while a salt is not secret (merely unique) and can be stored alongside the hashed output, a pepper is secret and must not be stored with the output. The hash and salt are usually stored in a database, but a pepper must be stored separately (e.g. in a configuration file) to prevent it from being obtained by the attacker in case of a database breach.
Salt Özellikleri
Açıklaması şöyle.
A salt is:
 -Not secret - Salts are stored in plaintext.
 -Secure - They are generated randomly and are long.
 -Unique - Every user's salt is intentionally different.

A password is:
- Secret - Assuming they do not put it on a sticky note.
- Secure - If it's not hunter2.
 -Unique - Or at least difficult to guess. Ideally, it should be unique.
Salt Hash İle Birlikte Saklanır
Açıklaması şöyle. Burada "Not secret" özelliği anlatılıyor.
The salt is stored in plaintext next to the hash and the same salt is used when checking a password.
Veri tabanında şöyle görünür
id : password_hash : salt
1    abcdxqx         mysalt
Salt Sırası
Şu ikisi arasında bir fark yoktur
Hash (salt + password)
ve
Hash (password + salt)
aynı şeydir.

Salt Üretimi
Java'da SecureRandom.getNextBytes() kullanılabilir. Ancak bu işi yapan kütüphaneleri kullanmak daha iyi. Açıklaması şöyle
The fact that you are generating salts on your own is a red flag. The best way to do this, especially if you have little experience with security, is to use an established library for password hashing.

A well designed library will generate and use salts automatically for you, and it will stor
Salt Olarak Şifrenin Kullanılması- Yapmayın
Bunu yapmamak gerekir. Açıklaması şöyle.
The whole point of a salt is to be unique to a set-password operation, so that attackers can't reuse work when they target multiple accounts (multiple users on the same server, multiple servers, or both). Using the password as the salt completely defeats the purpose.

The salt does not need to be unguessable or secret.

29 Mart 2020 Pazar

DNS Record Tipleri

A Record Nedir? - IPv4 İçindir
Açıklaması şöyle.
3.2. Multiple DNS Records
A domain name MUST NOT have multiple records that would cause an authorization check to select more than one record. See Section 4.5 for the selection rules.
Address Record anlamına gelir. IPv4 için kullanılır. Bir alan isminin hangi IP adresinde olduğunu belirtir. Kayıt şuna benzer.
sub1.domain.com A xxx.xxx.xxx.xxx
sub2.domain.com A yyy.yyy.yyy.yyy
Bazen host ismi yerine sadece @işareti konulabilir. Açıklaması şöyle.
@               A free standing @ is used to denote the current origin.
Kendi DNS Sunucuma Başka Bir Adres İçin A Record Koyarsam Ne Olur?
DNS Hiyerarşisi yazısına taşıdım.

AAAA Record Nedir? - IPv6 İçindir
A Record ile aynı işlevi görür. IPv6 için kullanılır. A kaydının 4 katı olmasının açıklaması şöyle.
the name AAAA for IPv6 address records is in reference to an IPv6 address (128 bits) being four times the size of an IPv4 address (32 bits).
CAA Record Nedir?
Açıklaması şöyle.
A CAA record is an optional DNS record that restricts which certificate providers are allowed to issue certificates for a domain.
Açıklaması şöyle.
You can't use a TXT record in place of a CAA record to limit which CAs are allowed to issue certs for your domain.
CName Nedir?
Bir başka record'a alias olarak tanımlanır. Açıklaması şöyle.
A CNAME record is like leaving a recording on an answering machine that tells you to call a different number. For example, you call 555-1111 and the message says, "Call 555-2222." In the same way, a CNAME record for www.example.com can point to www.yourdomain.com. When the DNS client looks up www.example.com and encounters the CNAME record, it restarts the DNS lookup process for www.yourdomain.com...as if it had been trying to look up www.yourdomain.com in the first place.
Örnek
Şu satır doğru. foo.example.com bir alias.
foo.example.com.        3600   IN      CNAME   bar.example.com.
bar.example.com.        3600   IN      A       192.0.2.1
Ancak şöyle olsaydı yanlış olurdu. foo.example.com bir alias ancak A record belli değil.
foo.example.com.        3600   IN      CNAME   bar.example.com.
foo.example.com.        3600   IN      A       192.0.2.1
Örnek
Şu satır yanlış. Çünkü CNAME DNS ismin yerine IP adresi kullanılıyor.
exodus.babeldat.com.    41  IN  CNAME   104.248.81.197.
Açıklaması şöyle
A CNAME must point to an entry that appears on the left: a name, not an IP address
MX Record Nedir?
DNS kayıtlarından bazıları MX ile belirtilir. Bu kayıtlar domain için e-posta sunucusunu verir. MX kayıtlarında sunucular için öncelik tanınabilir. Ancak bu tavsiye edilmiyor. Bir sunucu cevap verinceye kadar önceliği en küçük olan MX sunucusu denenir. Açıklaması şöyle
MX records are used according to priority value in the records.

The record with the lowest priority is used first, then the higher ones until one responds. If there are multiple records with the same priority, one is randomly selected (this is how you generally do load balancing if you have multiple mail servers accepting incoming connections).
...
So a sending server will only use secondary records if the primary server doesn't respond to its connection attempts, not if the primary server rejects the message.
Açıklaması şöyle
An MX record, which defines your mail host, specifies a named server as the destination for mail. The name in turn is resolved by an A or AAAA record. If you change the A record that the MX record refers to, that will change your mail server. If your MX record points to some mail server outside your domain, such as Microsoft's mail servers (as seems to be the case, per your question), then changing your A records will have no effect on it. Note that if you're using Wix's mail servers, closing your account with them will likely lose your email unless you manage to get it hosted somewhere else.
Backup MX Record
Açıklaması şöyle
Please also take a look at how Wikipedia explains the MX record and the backup MX record.

A senders mail server will deliver to a backup MX whenever a primary MX can't be reached. The backup MX will accept the mail and hold it in the their queue until the messages either expire or until they can be delivered the primary MX.
This removes the burden of queueing undelivered messages away from the sender and makes the queue managed by the recipient.
Nowadays backup MX records are most likely only necessary for planned maintenance and outages, but in the past it was much more common for systems to be online only intermittently. Domains would often make an agreement with the operators of a mail server with much better connectivity to use their server as the backup (when they couldn't operate their own) or their ISP would provide that as a service. Mail would be queued on the backup MX server (for much longer than most senders did) and whenever the primary MX server came online, delivery of all queued messages would be triggered (with the ETRN command). That would allow sites to run their own on-premise mail server, without being online 24x7 (on an expensive dial up connection).
Örnek
Şöyle yaparız
MX 10 serverA
MX 20 serverB
Örnek
Eğer domain için e-posta sunucusu yoksa kayıt şöyledir.
nomail.example.com. 86400 IN MX 0 "."
E-posta gönderirken kendi MX sunucumuza göndermemiz gerekir. MX olmayan bir sunucu röle yapmayı kabul etmez.

Örnek
E-posta almamak için şöyle yaparız
domain.example. IN MX 0 .
domain.example. IN TXT "v=spf1 -all"
_dmarc.domain.example. IN TXT "v=DMARC1; p=reject; aspf=s; adkim=s;"
Açıklaması şöyle
This indicates that inbound mail is not accepted (null MX), and that any mail sent from the domain should be rejected (SPF policy that lists no allowed senders + DMARC policy enforces From-header alignment).

Not : Bilgisayar isimleri artık rakam ile başlayabiliyor. Hatta sadece rakamlardan bile oluşabilir. Mesela http://9292.nl/ geçerli bir bilgisayar adıdır.

TXT Record Nedir?
TXT Record ile Sender Policy Framework gerçekleştirilir

Sender Policy Framework (SPF) Kavramı
Açıklaması şöyle
- SPF checks the mail arrived at your server directly from particular agreed authorised mail server(s) or mail relays.
Sender Policy Framework (SPF Record) - Türkçesi Gönderen Politika Çerçevesi imiş - TXT türünden bir kayıt (record) sayılıyor. Kendi e-posta sunucumuzdan bir e-posta gönderince, alan sunucu önce bu postanın spam olup olmadığını kontrol eder. Bu iş için bizim IP adresimizin ve e-posta sunucumuzun DNS'te SPF kaydı olup olmadığını kontrol eder. Eğer kayıt yoksa, e-posta reddedilir

Örnek
Kendi sunucumuz ve bizim adımıza e-posta göndermesini istediğimiz 3. ortaklar için SPF kaydı şöyle oluşturulur. Domain adımız contoso.com olsun. Burada txt kaydından sonra 'v=spf1 ..' şeklinde bir metin daha var.
thirdparty1.spf.contoso.com txt 'v=spf1 ... -all' # list their mail senders
thirdparty2.spf.contoso.com txt 'v=spf1 ... -all' # list their mail senders
spf.contoso.com txt 'v=spf1 ... -all'             # list your mail senders
contoso.com txt 'v=spf1 include:spf.contoso.com 
 include:thirdpart1.spf.contoso.com include:thirdparty2.spf.contoso.com -all'
Örnek
Bazen bu metin şöyle yazılıyor. Yani hem +a hem de +mx belirtiliyor. +a kısmının fazla olup olmadığı tartışılıyor
@              10800 IN TXT     "v=spf1 +a +mx -all"
DomainKeys Identified Mail (DKIM) Kavramı
Açıklaması şöyle
- DKIM checks that the mail was initially sent from a server with the correct key at some point and nobody played with the message body.. 
Açıklaması şöyle
DKIM protects the integrity and authenticity of email headers and body. Furthermore, DKIM can only validate an existing signature, but does not have a method to tell whether a message without a signature should be accepted or not.

27 Mart 2020 Cuma

DNS Hiyerarşisi

Giriş
DNS 1983 yılında tasarlanmış. Açıklaması şöyle.
Ultimately, the DNS system we still use today would be proposed in 1983.
Bu sistemde Parent DNS ve Root DNS kavramları var. Açıklaması şöyle.
DNS is a hierachy. DNS servers know either how to find a parent DNS server or how to find a list of the "root" servers.

If they find a parent DNS server they just ask it, and it asks its parent until it gets an authorative answer.

In most cases however, nameservers know the root nameservers, which in turn point them to the appropriate servers for the domain. (Or in some cases the appropriate server for the first part of the domain. This process is repeated until the domain name is resolved).
Root DNS Sunucuları
Bunlardan 13 tane var. Açıklaması şöyle
When we say DNS is hierarchical, what we mean is there is a set of root DNS servers which are responsible for, for example, turning .com into the .com nameservers, who will in turn answer how to get to google.com. The root DNS zone of the internet is composed of thirteen DNS server clusters. There are only 13 server clusters, because that’s all we can fit in a single UDP packet. Historically, DNS has operated through UDP packets, meaning the response to a request can never be more than 512 bytes.
Root DNS sunucularına fiziksel erişim kısıtlı. Açıklaması şöyle.
Root DNS servers operate in safes, inside locked cages. A clock sits on the safe to ensure the camera feed hasn’t been looped. Particularly given how slow DNSSEC implementation has been, an attack on one of those servers could allow an attacker to redirect all of the Internet traffic for a portion of Internet users. This, of course, makes for the most fantastic heist movie to have never been made.

Unsurprisingly, the nameservers for top-level TLDs don’t actually change all that often. 98% of the requests root DNS servers receive are in error, most often because of broken and toy clients which don’t properly cache their results. This became such a problem that several root DNS operators had to spin up special servers just to return ‘go away’ to all the people asking for reverse DNS lookups on their local IP addresses.

The TLD nameservers are administered by different companies and governments all around the world (Verisign manages .com). When you purchase a .com domain, about $0.18 goes to the ICANN, and $7.85 goes to Verisign.
DNS ve Cache'leme
Açıklaması şöyle
In reality a nameserver won't generally make all of these queries, because it will remember parts of it. IE the first time someone looks up any .com domain name, the DNS server they are using it will remember the nameservers (for 172800 seconds in this case), so it won't need to do another lookup. Similarly for all the more specific parts of the lookup.
Name Server'a Yeni Kayıt Ekleme
Açıklaması şöyle. Bir API aracılığıyla oluyor.
So if someone is registering example.com via Godaddy (or any registrar), Godaddy needs to (programmatically) get the nameservers for example.com entered into the ".com" nameserver. Similarly, if they are in AU, they need to enter the information into the ".com.au" space if they want to register "example.com.au" - and this would require an agreement with the people controlling the nameservers for ".com.au" space - which is why not all registrars can register all domains, and why getting new top level domains is such a process - they need to pay big money to register the TLD with the root nameservers.
Kendi DNS Sunucuma Başka Bir Adres İçin A Record Koyarsam Ne Olur?
Hiçbir şey olmaz. Çünkü kendi telefon rehberimi düzenlemekle aynı şeydir. Kimse benim DNS sunucumu sorgulamadığı için her şey normal çalışmaya devam eder. Sorgulama için izlenen adımlar şöyle. Benim sunucum recursive resolver veya root name server veya authoritative server olmadığı için kimse benim sunucuma soru sormaz.
1. You as the DNS client (or stub resolver) query your recursive resolver for www.example.com.
2. Your recursive resolver queries the </blockquote> for www.example.com.
3. The root name server refers your recursive resolver to the .com Top-Level Domain (TLD) authoritative server.
4. Your recursive resolver queries the .com TLD authoritative server for www.example.com.
5. The .com TLD authoritative server refers your recursive server to the authoritative servers for example.com.
6. Your recursive resolver queries the authoritative servers for www.example.com, and receives 1.2.3.4 as the answer.
6. Your recursive resolver caches the answer for the duration of the time-to-live (TTL) specified on the record, and returns it to you.
ISP Tarafından DNS Sorgusu Yönlendirme
Açıklaması şöyle. Burada biz bir başka DNS sunucusunu kullandığımızı sansak bile ISP'nin DNS'ine gideriz.
It is still possible and not uncommon though that your DNS query does not actually end at the DNS server you want to use but will still be handled by the ISP's DNS server. This can be done with a cheap redirection of all packets destined for port 53 to the ISP's DNS server. Enforcing the use of the ISP's DNS server is usually done if the ISP is ordered to block access to specific domains. But even without redirecting the ISP might be able to see what domains you query: DNS queries are by default not encrypted and thus visible to Deep Packet Inspection. When using DNS over HTTPS (DoH) or DNS over TLS (DoT) the ISP will no longer be able to intercept these DNS requests though, nor will it be able to see the content of the DNS queries. It can still determine the domains you visit from DPI on the web traffic itself though in most cases.
Deep Packet Inspection
Açıklaması şöyle.
Some ISP might also snoop at the traffic with Deep Packet Inspection (DPI) and might also block or delay traffic based on this. Some might also enforce an implicit proxy to modify the traffic. This is especially true in countries where the ISP is ordered to block specific sites. It happened also in the past that ISP injected their own advertisements in the traffic. Or mobile ISP where found to "enrich" the traffic to provide information about the client (like the phone number) to the final server in order to provide more targeted advertisements. Traffic modification is mostly impossible when HTTPS is used though, but blocking traffic will even work with HTTPS.
Domain name system security extensions - DNSSEC
Açıklaması şöyle
DNSSEC creates a secure domain name system by adding cryptographic signatures to existing DNS records. These digital signatures are stored in DNS name servers alongside common record types like A, AAAA, MX, CNAME, etc. By checking its associated signature, you can verify that a requested DNS record comes from its authoritative name server and wasn’t altered en-route, opposed to a fake record injected in a man-in-the-middle attack.

To facilitate signature validation, DNSSEC adds a few new DNS record types:

- RRSIG - Contains a cryptographic signature
- DNSKEY - Contains a public signing key
- DS - Contains the hash of a DNSKEY record
- NSEC and NSEC3 - For explicit denial-of-existence of a DNS record
- CDNSKEY and CDS - For a child zone requesting updates to DS record(s) in the parent zone.
Gerçek DNS sunucusu ile delegate eden DNS sunucusu aynı şifreleme algoritmasını kullanmalıdır.

Eğer sorgulayan DNSSEC seçeneğini kullanmazsa normal bir cevap alır. Açıklaması şöyle
DNSSEC is an extension of DNS in the sense that for a non validating resolver, answers are not different, even if the domain is DNSSEC enabled. So all return codes work in the same way.
Örnek
Şöyle yaparız. icann.org aslında DNSSEC kullanır ancak dig komutunda DNSSEC cevap istenmediği için NXDOMAIN cevabı veriyor. Eğer dig ile DNSSEC sonuçlarını da görmek istersek +dnssec seçeneği kullanılır
$ dig NS icann.org +short
b.icann-servers.net.
c.icann-servers.net.
ns.icann.org.
a.icann-servers.net.

$ dig @a.icann-servers.net does-not-exist-foobar.icann.org

; <<>> DiG 9.18.4 <<>> @a.icann-servers.net does-not-exist-foobar.icann.org
; (1 server found)
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38891
;; flags: rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 98228e9e0c5ef4e6
;; QUESTION SECTION:
;does-not-exist-foobar.icann.org. IN A

;; QUERY SIZE: 72

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 38891
                                       ^^^^^^^^




26 Mart 2020 Perşembe

Accessibility - Daha Fazla Kullanıcıya Erişim İmkanı Tanımak

Giriş
Bu kavram ilk çıktığında özürlü kullanıcılarında düşünülerek yazılıma kolaylıklar eklenmesi şeklinde anlaşılıyordu. Açıklaması şöyle.
... whether the application is user-friendly to the physically disabled user.
Ancak daha sonra kavrama ilaveler yapılarak farklı ortamlardaki kullanıcılara da erişim imkanı sağlamak haline geldi. Açıklaması şöyle.
So what is accessibility?

Accessibility is the practice of making your websites usable by as many people as possible. We traditionally think of this as being about people with disabilities, but the practice of making sites accessible also benefits other groups such as those using mobile devices, or those with slow network connections.

You might also think of accessibility as treating everyone the same, and giving them equal opportunities, no matter what their ability or circumstances. Just as it is wrong to exclude someone from a physical building because they are in a wheelchair (modern public buildings generally have wheelchair ramps or elevators), it is also not right to exclude someone from a website because they have a visual impairment. We are all different, but we are all human, and therefore have the same human rights.

Accessibility is the right thing to do. Providing accessible sites is part of the law in some countries, which can open up some significant markets that otherwise would not be able to use your services or buy your products.

24 Mart 2020 Salı

Internet Group Management Protocol - IGMP

IGMP - Internet Group Management Protocol
IGMP bilgisayarın bir çoklu dağıtım  (multicast) grubuna üye olması için kullanılır. Böylece Switch/Router kendisine gelen multicast paketleri hangi bilgisayarlar göndereceğini bilir.

IGMP IP üzerinden çalışır. TTL = 1 değerini kullandığı için internet üzerinde kullanılamaz. Herkesin aynı subnet üzerinde olması gerekir.

Kullandığı header ICMP'ye çok benzer. Açıklaması şöyle
IGMP is a protocol that has messages that are the payload of a layer-3 IPv4 packet, that is in turn the payload of an ethernet frame.
Internete multicast için tünel açmak gerekir.

İşletim Sistemi ve IGMP
Linux'ta en fazla 20 tane multicast adresine katılmak mümkün. Bu değiştirilebilir. Değeri görmek için şuraya bakarız.
/proc/sys/net/ipv4/igmp_max_memberships

IGMP Snooping
Hangi portta multicast olduğunu öğrenmek amacıyla, IGMP mesajlarının dinlenmesidir. Açıklaması şöyle
Multicast is a version of broadcast, which sends the frames to all switch interfaces.

Having said that, there is something called IGMP snooping that allows switches that support this to listen in on the IGMP conversations between hosts and a multicast router to see which switch interfaces want traffic from specific multicast groups. Switches that support this will only send traffic destined for a multicast group to those interfaces that have a destination interested in the traffic destined to that multicast group.

Not all switches support IGMP snooping. It is not something that is required, and pure layer-2 switches will send multicast frames to all switch interfaces.
Açıklaması şöyle
Multicast, at layer-2, where switches operate, is a form of broadcast, and multicast frames are treated like broadcasts. This has been mitigated by IGMP snooping in many new switches. This allows a switch to snoop on the IGMP requests by hosts to a multicast router. A switch with IGMP snooping enabled will learn and build a table of which interfaces have requested to join which IGMP groups, and it will only send traffic to those interfaces for that multicast group.
IGMP V2
Max Response Time
Açıklaması şöyle. Genellikle en fazla 10 saniyedir.
In IGMPv2, the Max response time is an 8-bit value each unit encoding 0.1 seconds. The typical max response time is 100 resulting in a 10 second max response time.

IGMP V3
IGMPV3 isteği 244.0.0.22 adresine gönderilir.

Multicast için 226.x ile başlayan IP numarasını seçmek doğru değildir çünkü bu adres rezerve edilmiştir.

20 Mart 2020 Cuma

Genetik Algoritma

Genetik Algoritma Optimizasyon Problemlerinde Kullanılır
Açıklaması şöyle.
In computer science and operations research, a genetic algorithm (GA) is a metaheuristic inspired by the process of natural selection that belongs to the larger class of evolutionary algorithms (EA). Genetic algorithms are commonly used to generate high-quality solutions to optimization and search problems by relying on biologically inspired operators such as mutation, crossover and selection.John Holland introduced genetic algorithms in 1960 based on the concept of Darwin’s theory of evolution; his student David E. Goldberg further extended GA in 1989.
Aday Çözümler
Açıklaması şöyle.
In a genetic algorithm, a population of candidate solutions (called individuals, creatures, or phenotypes) to an optimization problem is evolved toward better solutions. Each candidate solution has a set of properties (its chromosomes or genotype) which can be mutated and altered; traditionally, solutions are represented in binary as strings of 0s and 1s, but other encodings are also possible.

The evolution usually starts from a population of randomly generated individuals, and is an iterative process, with the population in each iteration called a generation. In each generation, the fitness of every individual in the population is evaluated; the fitness is usually the value of the objective function in the optimization problem being solved. The more fit individuals are stochastically selected from the current population, and each individual's genome is modified (recombined and possibly randomly mutated) to form a new generation. The new generation of candidate solutions is then used in the next iteration of the algorithm. Commonly, the algorithm terminates when either a maximum number of generations has been produced, or a satisfactory fitness level has been reached for the population.

A typical genetic algorithm requires:

- a genetic representation of the solution domain,
- a fitness function to evaluate the solution domain.
Genetik Algoritma İle Tüm Olasılıkların Değerlendirildiği Algoritma Arasındaki Fark Nedir?
Genetik Algoritma (Genetic Algorithm) deneme yanılma üzerine kuruludur. Bir fitness (uygunluk) metodu kullanılarak daha optimal sonuç elde edilmeye çalışılır. Bu yüzden daha kısa sürede sonuç bulabilme ihtimali vardır. Exhaustive arama ise tüm ihtimalleri denediği için çok daha uzun sürebilir.

Genetik Algoritma ve Evrimsel Algoritma Arasındaki Fark Nedir?
Açıklaması şöyle
1. An evolutionary algorithm (AE) is an algorithm that has a (set of) solution(s) and by mutating them somehow (crossover is here also seen as "mutating"), you eventually end up with better solution(s).
2. A genetic algorithm (GA) supports the concept of a crossover where two or more "solutions" produce new solutions.

16 Mart 2020 Pazartesi

Linux Sinyalleri

Not : Bu konu ile ilgili olarak POSIX Sinyalleri başlıklı yazıya göz atabilirsiniz.

Pending Signal Nedir ?
Eğer bir signal handler çalıştırılıyorsa aynı sinyalden 1 veya daha fazla gelse bile signal handler bir nevi bloke olduğu için tekrar çalıştırılmaz.

Yeni sinyaller için pending bayrağı kaldırılır. Bayrak bir sayaç değildir, yalnızca pending signal olduğunu belirtir. Çalışan signal handler bitince, pending bayrağı havadaysa signal handler bir kere daha çağırılır.


SIGILL (4)
Açıklaması şöyle
SIGILL is the signal for an illegal instruction at the processor, which happens very rarely. The default action after receiving SIGILL is terminating the program and writing a core dump. The signal ID of SIGILL is 4. You encounter SIGILL very rarely, and I have absolutely no idea how to generate it in your code except via sudo kill -s 4 <pid>.
C ile bu sinyali oluşturmak için şöyle yaparız.
main=6;
veya şöyle yaparız.
const main=6;
SIGBUS (7)
Bu sinyalin SIGSEGV'den farkı biraz anlamını kaybetmiş. Bence şöyle aklımda tutmayı daha uygun buldum. Eğer bir sanal adres varsa ve bu sanal adres izin verilen adres alanı dışındaysa bu hatayı alırız. Aşağıdaki örnek bu durumu gösteriyor. Dokunulmaması gereken bir alana dokunduğu için SIGBUS hatası veriyor.
void test(void *a)
{
    asm("mov %0, %%rbp\n\t"
        "mov 0(%%rbp), %%rdx\n\t"
        : : "r"(a) : "rbp", "rdx");
}

int main()
{
    test((void *)0x706a2e3630332d69);
    return 0;
}

SIGPIPE (13)
Kapatılmış olan pipe veya sockete veri yazmaya çalışınca gönderilen sinyal. Karşıdaki uygulamanın haber vermeden kapandığını anlamamızı sağlar.

SIGTERM (15)
SIGTERM uygulamaya nazikçe artık kapanması gerektiğini söylemektir. Java - Process.destroy() source code for Linux sorusunda da anlatıldığı gibi Process.destroy() metodu çağırılınca kapatılmak istenen uygulamaya bu sinyali gönderir. Aslında Java dokümanında "The subprocess represented by this Process object is forcibly terminated." denmesine rağmen benim anladığım kadarıyla bu sinyal göz ardı edilebilir.

SIGCHLD (17)
Bir uygulama kapanırken kendisini yaratan uygulamaya SIGCHLD sinyalini de gönderir. Aşağıda bunu gösteren bir şekil var.

Buradaki soruya verilen cevapta fork/exec ile çalıştırılan bir uygulamayı beklemek için örnek kod verilmiş.
Gerçi bence bu sinyalin esas kullanım alanı yukarıdaki örnekteki gibi child uygulamanın bitmesini beklemek değil de burada söylendiği gibi arka planda çalıştırılan bir uygulamanın bittiğinin algılanması olmalı.
Burada ise aynı bir kabukta olduğu gibi arka planda çalışan uygulama bitince zombie olmaması için waitpid() metodu ile bitiş sonucunun alınması örneği var.
Eğer bir üst uygulama çalıştırdığı alt uygulamanın sonucunu beklemeden kapanırsa, alt uygulama Linux'ta init tarafından sahiplenilir.

Bir başka açıklama ise burada.

SIGSTOP ve SIGCONT (18-19)
SIGSTOP bir uygulamayı duraklatmak için SIGCONT ise devam ettirmek için kullanılır. Bu sinyaller durdurulamazlar.
The SIGSTOP signal instructs the operating system to stop a process for later resumption.
Örnek:
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`

SIGTTIN (21)
Controlling terminalden farklı bir gruptaki uygulama terminale okuma/yazma işlemi başlatırsa bu sinyali alır ve suspend edilir.
SIGSYS (31)
Bad system call anlamına gelir.
Sinyaller ve Stack
Burada yazdığına göre sinyaller uygulamanın stack'i içinde çalıştırılıyor. Ancak arzu edilirse ayrı bir stack tanımlamak ta mümkün. Aslında cümlede küçük bir yanlışlık var. Process'ler stack sahibi değildirler. Thread'ler bir stack'e sahiptir. Cümleyi thread stack diye okursak sorun kalmıyor.
By default, the signal handler is invoked on the normal process stack.
It is possible to arrange that the signal handler uses an alternate stack;
see sigaltstack(2) for a discussion of how to do this and when it might
be useful.

Sinyal Set Metodları
Sinyal setini sıfırlayan ve değer atayan sigemptyset,sigfillset metodlarıdır.

sigemptyset
Bu metod verilen seti sıfırlar. Aynı memset gibi çalışır.Metodun imzası aşağıdaki gibidir.
int sigemptyset(sigset_t *set);  
Örnek:
sigset_t ss;
sigemptyset(&ss);

sigfillset


sigaddset
sigdelset
sigismember

Sinyal Yakalamak için Kullanılabilecek Metodlar
signal
Sinyali default handler'ına atamak için örnek:
signal(SIGINT, SIG_DFL);
SIG_DFL default handling demek.

sigaction
sigaction yazısına taşıdım.

sa_handler alanının kullanımı

sa_handler alanına SIG_IGN değerini atayarak sinyalin dikkate alınmaması sağlanabilir. Örnek:
//set struct action to ignore signal
struct sigaction action;    
action.sa_handler=SIG_IGN;//handler set to ignore the signal
action.sa_flags=0;
//registeration 
sigaction(SIGINT,&action,0);

sa_handler alanına SIG_DFL değerini atayarak sinyalin default handler'ının çağırılması sağlanabilir.

Bu kullanım şeklinde signal handler metoduna sinyalin numarası gelir.
Örnek:

void h(int sig)
{
}

struct sigaction s;
s.sa_handler = h;
sigemptyset (&s.sa_mask);
s.sa_flags = SA_RESTART; //ve diğer seçenekler
int r = sigaction (SIGUSR1, &s, NULL);
sa_sigaction alanının kullanımı
sigaction yazısına taşıdım.

Örnek:

void handler (int sig, siginfo_t * info, void * a)
{
    //Kullanıcı tarafından gönderilen sinyal
    if (info->si_code == SI_USER) {
    }
}

struct sigaction s;
s.sa_sigsion = handler;
s.sa_flags = SA_SIGINFO;
sigemptyset (&s.sa_mask);
sigaction (SIGRTMIN, &s, NULL);

sa_mask alanının kullanımı
sigaction yazısına taşıdım.

sig_atomic_t
Aşağıda shared bir sig_atomic_t kodu örneği var.
volatile sig_atomic_t interrupted=false; 
...
void signal_handler(int s)
{
   // ...
   interrupted=true;
}
...
while (!converged && !interrupted)
{
     // Perform computations
}
// Save file properly

Sinyalleri Bloke Etmek
SIG_SETMASK ilk listedeki sinyalleri bloke eder, ikinci listedekileri ise bloke edilmekten çıkarır. Eğer ikinci liste NULL verilirse önceden bloke edilmiş sinyalleri temizler ve sadece ilk listedekileri bloke eder.
Örnek:
sigset_t allSigs;
sigfillset(&allSigs);
sigprocmask(SIG_SETMASK, &allSigs, NULL);